[
  {
    "path": ".cargo/config.toml",
    "content": "[target.x86_64-unknown-linux-musl]\nrustflags = [\"-C\", \"target-feature=-crt-static\"]\n\n[target.aarch64-unknown-linux-musl]\nrustflags = [\"-C\", \"target-feature=-crt-static\"]\n"
  },
  {
    "path": ".envrc",
    "content": "#use flake\n\nPATH=~/.pixi/bin:$PATH\n\nwatch_file pixi.lock\neval \"$(pixi shell-hook)\"\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# Pre-commit updates (#2427)\nfee62922d8857ce93f1d4e90fd7240629d606997\n"
  },
  {
    "path": ".git_archival.txt",
    "content": "ref-names: $Format:%D$\n"
  },
  {
    "path": ".gitattributes",
    "content": ".git_archival.txt  export-subst\ntests/test-data/*.sig  linguist-detectable=false\ntests/test-data/*/*.sig  linguist-detectable=false\ntests/test-data/*/*/*.sig  linguist-detectable=false\ntests/test-data/.sbt.v2/*.sbt  linguist-detectable=false\ninclude/sourmash.h  linguist-language=C\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "Please replace this text with:\n\n* a brief description of your changes in this PR\n* which issues this fixes in the issue tracker, if any (\"Fixes #XXX\")\n* which issues this PR is related to, if any (\"Ref #XXX\")\n\nPlease also be sure to note here if file formats, command-line\ninterface, and/or the top-level sourmash API will change because of\nthis PR.\n\nIf you are a new contributor, please add your name and\n[your ORCID](https://orcid.org) to the `pyproject.toml` author list\n(maintaining alphabetical order by last name).\nIf you don't have an ORCID, please\n[register for one](https://orcid.org/register).\n\nOnce the items above are done, and all checks pass, request a review!\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/\"\n  schedule:\n    interval: weekly\n  open-pull-requests-limit: 10\n  commit-message:\n    prefix: Build(deps-py)\n  groups:\n    dependencies:\n      patterns:\n        - \"*\"\n- package-ecosystem: cargo\n  directory: \"/\"\n  schedule:\n    interval: weekly\n  allow:\n    - dependency-type: \"direct\"\n  open-pull-requests-limit: 10\n  commit-message:\n    prefix: Build(deps-rs)\n  ignore:\n    - dependency-name: \"byteorder\"\n    - dependency-name: \"wasm-bindgen\"\n    - dependency-name: \"once_cell\"\n    - dependency-name: \"chrono\"\n    - dependency-name: \"js-sys\"\n    - dependency-name: \"web-sys\"\n  groups:\n    dependencies:\n      patterns:\n        - \"*\"\n- package-ecosystem: \"github-actions\"\n  directory: \"/\"\n  commit-message:\n    prefix: Build(ci)\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/workflows/asv.yml",
    "content": "name: asv benchmarks\n\npermissions:\n  contents: read\n\non:\n  push:\n    branches: [latest]\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n\n    - name: make latest branch available\n      run: |\n        git checkout latest\n        git checkout -\n\n    - name: Set up Python 3.11\n      uses: actions/setup-python@v6\n      with:\n        python-version: \"3.11\"\n\n    - uses: dtolnay/rust-toolchain@stable\n\n    - uses: Swatinem/rust-cache@v2\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install tox\n\n    - name: Runs benchmarks against latest\n      run: tox -e asv\n"
  },
  {
    "path": ".github/workflows/build_wheel.yml",
    "content": "name: cibuildwheel\npermissions:\n  contents: write\n\non:\n  push:\n    branches: [latest]\n    tags: v*\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\njobs:\n  build_wheels:\n    name: Build wheels for ${{ matrix.os }}-${{ matrix.arch }}\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        build: [\n          linux-x86_64,\n          macos-x86_64,\n          macos-arm64,\n        ]\n        include:\n          - build: linux-x86_64\n            os: ubuntu-latest\n            arch: x86_64\n            macos_target: ''\n          - build: macos-x86_64\n            os: macos-latest\n            arch: x86_64\n            macos_target: 'MACOSX_DEPLOYMENT_TARGET=11.0 CARGO_BUILD_TARGET=x86_64-apple-darwin'\n          - build: macos-arm64\n            os: macos-latest\n            arch: arm64\n            macos_target: 'MACOSX_DEPLOYMENT_TARGET=11.0 CARGO_BUILD_TARGET=aarch64-apple-darwin'\n      fail-fast: false\n\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - uses: actions/setup-python@v6\n        name: Install Python\n        with:\n          python-version: '3.13'\n\n      - name: Build wheels\n        uses: pypa/cibuildwheel@v3.4.1\n        env:\n          CIBW_ENVIRONMENT_MACOS: ${{ matrix.macos_target }}\n          CIBW_ARCHS_LINUX: ${{ matrix.arch }}\n          CIBW_ARCHS_MACOS: ${{ matrix.arch }}\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: wheel-${{ matrix.build }}-${{ matrix.os }}\n          path: './wheelhouse/sourmash*.whl'\n\n  build_wasm:\n    runs-on: ubuntu-latest\n    if: false  # disable for now, need to fix emsdk with Rust: https://github.com/emscripten-core/emscripten/pull/24359\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Build wheels\n        uses: pypa/cibuildwheel@v3.4.1\n        env:\n          CIBW_PLATFORM: pyodide\n          CIBW_BUILD: 'cp313-pyodide_wasm32'\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: wheel-wasm\n          path: './wheelhouse/sourmash*.whl'\n\n  release:\n    name: Publish wheels\n    runs-on: ubuntu-latest\n    if: startsWith(github.ref, 'refs/tags/v')\n#    needs: [build_wheels, build_wasm]\n    needs: [build_wheels]\n\n    steps:\n      - name: Fetch wheels from artifacts\n        id: fetch_artifacts\n        uses: actions/download-artifact@v8\n        with:\n          path: 'wheels/'\n\n      # if it matches a Python release tag, upload to github releases\n      - name: Release\n        uses: softprops/action-gh-release@v3\n        with:\n          files: |\n            ${{steps.fetch_artifacts.outputs.download-path}}/wheel-*/*\n"
  },
  {
    "path": ".github/workflows/build_wheel_all_archs.yml",
    "content": "name: maturin wheels\npermissions:\n  contents: write\n\non:\n  pull_request:        # use for testing modifications to this action\n  merge_group:\n  push:\n    branches: [latest]\n    tags: v*\n  workflow_dispatch:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\njobs:\n\n  linux:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        target: [aarch64]\n        #target: [aarch64, ppc64le]\n        #target: [aarch64, s390x, ppc64le]\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - uses: actions/setup-python@v6\n        with:\n          python-version: '3.12'\n\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.target }}\n          args: --release --out dist --find-interpreter --zig --strip\n          sccache: 'true'\n          manylinux: auto\n          container: 'off'\n\n      - name: Upload wheels\n        uses: actions/upload-artifact@v7\n        with:\n          name: wheel-${{ matrix.target }}\n          path: dist\n\n  windows:\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v6\n\n      - uses: actions/setup-python@v6\n        with:\n          python-version: '3.12'\n          architecture: ${{ matrix.target }}\n\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: x64\n          args: --release --out dist --find-interpreter\n          sccache: 'true'\n\n      - name: Upload wheels\n        uses: actions/upload-artifact@v7\n        with:\n          name: wheel-win64\n          path: dist\n\n  release:\n    name: Publish wheels\n    runs-on: ubuntu-latest\n    if: startsWith(github.ref, 'refs/tags/v')\n    needs: [linux, windows]\n\n    steps:\n      - name: Fetch wheels from artifacts\n        id: fetch_artifacts\n        uses: actions/download-artifact@v8\n        with:\n          path: 'wheels/'\n\n      # if it matches a Python release tag, upload to github releases\n      - name: Release\n        uses: softprops/action-gh-release@v3\n        with:\n          files: |\n            ${{steps.fetch_artifacts.outputs.download-path}}/wheel-*/*\n"
  },
  {
    "path": ".github/workflows/codspeed.yml",
    "content": "name: codspeed-benchmarks\n\npermissions:\n  contents: read\n\non:\n  # Run on pushes to the main branch\n  push:\n    branches:\n      - \"latest\"\n  # Run on pull requests\n  pull_request:\n  # TODO: Disabled temporarily for https://github.com/CodSpeedHQ/runner/issues/55\n  # merge_group:\n  # `workflow_dispatch` allows CodSpeed to trigger backtest\n  # performance analysis in order to generate initial data.\n  workflow_dispatch:\n\njobs:\n  benchmarks-rust:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Setup rust toolchain, cache and cargo-codspeed binary\n        uses: moonrepo/setup-rust@v1\n        with:\n          channel: stable\n          cache-target: release\n          bins: cargo-codspeed\n\n      - name: Build the benchmark target(s)\n        run: cargo codspeed build -p sourmash\n\n      - name: Run the benchmarks\n        uses: CodSpeedHQ/action@v4\n        with:\n          run: \"cd src/core && cargo codspeed run\"\n          token: ${{ secrets.CODSPEED_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/dev_envs.yml",
    "content": "name: \"Dev env instructions\"\non:\n  pull_request:\n  merge_group:\n  push:\n    branches: [latest]\nconcurrency:\n  group: ${{ github.ref }}\n  cancel-in-progress: ${{ github.ref != 'refs/heads/latest' }}\n\npermissions:\n  contents: read\n\nenv:\n  PIXI_VERSION: \"v0.66.0\"\n\njobs:\n  nix:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest]\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n\n    - name: Install Nix\n      uses: samueldr/lix-gha-installer-action@7b7f14d320d6aacfb65bd1ef761566b3b69e474c\n\n    - run: nix run .# -- --version\n\n    - run: nix develop --command bash -c \"tox -e py313\"\n\n  pixi:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-14]\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n\n    - name: set up pixi\n      uses: prefix-dev/setup-pixi@v0.9.5\n      with:\n        pixi-version: ${{ env.PIXI_VERSION }}\n        cache: true\n        frozen: true\n\n    - name: run tests for 3.12\n      shell: pixi run bash {0}\n      run: tox -e py312\n\n  mamba:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-14]\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n\n    - name: cache conda\n      uses: actions/cache@v5\n      env:\n        CACHE_NUMBER: 0\n      with:\n        path: ~/conda_pkgs_dir\n        key:\n          ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-${{ hashFiles('environment.yml') }}\n\n    - name: setup conda\n      uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167\n      with:\n        python-version: \"3.12\"\n        miniforge-version: latest\n        environment-file: dev.yml\n        activate-environment: sourmash_dev\n        auto-activate-base: false\n\n    - name: run tests for 3.12\n      shell: bash -l {0}\n      run: tox -e py312\n"
  },
  {
    "path": ".github/workflows/draft-pdf.yml",
    "content": "on: [push]\n\npermissions:\n  contents: read\n\njobs:\n  paper:\n    runs-on: ubuntu-latest\n    name: Paper Draft\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Build draft PDF\n        uses: openjournals/openjournals-draft-action@master\n        with:\n          journal: joss\n          # This should be the path to the paper within your repo.\n          paper-path: paper.md\n      - name: Upload\n        uses: actions/upload-artifact@v7\n        with:\n          name: paper\n          # This is the output path where Pandoc will write the compiled\n          # PDF. Note, this should be the same directory as the input\n          # paper.md\n          path: paper.pdf\n"
  },
  {
    "path": ".github/workflows/hypothesis.yml",
    "content": "name: Hypothesis tests\n\npermissions:\n  contents: read\n\non:\n  push:\n    branches: [latest]\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Set up Python 3.12\n        uses: actions/setup-python@v6\n        with:\n          python-version: \"3.12\"\n\n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install tox\n\n      - name: Run Hypothesis tests\n        run: tox -e hypothesis,coverage\n\n      - name: Upload Python coverage to codecov\n        uses: codecov/codecov-action@v3\n        with:\n          flags: hypothesis-py\n          fail_ci_if_error: true\n          files: .tox/coverage.xml\n"
  },
  {
    "path": ".github/workflows/metadata.yml",
    "content": "name: Metadata checks \n\npermissions:\n  contents: read\n\non:\n  push:\n    branches: [latest]\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\njobs:\n  archive:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout sources\n        uses: actions/checkout@v6\n\n      - name: Trigger new archival in software heritage on new tags\n        if: startsWith(github.ref, 'refs/tags/')\n        run: curl https://archive.softwareheritage.org/api/1/origin/save/git/url/https://github.com/sourmash-bio/sourmash.git/\n"
  },
  {
    "path": ".github/workflows/python.yml",
    "content": "# note: to invalidate caches, adjust the pip-v? number below.\nname: Python tests\n\non:\n  push:\n    branches: [latest]\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\npermissions:\n  contents: read\n\njobs:\n  test:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest]\n        py: [\"3.12\", \"3.11\", \"3.13\"]\n      fail-fast: false\n\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Set up Python ${{ matrix.py }}\n        uses: actions/setup-python@v6\n        with:\n          python-version: ${{ matrix.py }}\n\n      - name: Get pip cache dir\n        id: pip-cache\n        run: |\n          echo \"::set-output name=dir::$(pip cache dir)\"\n\n      - name: pip cache\n        uses: actions/cache@v5\n        with:\n          path: ${{ steps.pip-cache.outputs.dir }}\n          key: ${{ runner.os }}-pip-v4-${{ hashFiles('**/pyproject.toml') }}\n          restore-keys: |\n            ${{ runner.os }}-pip-v4-\n\n      - uses: dtolnay/rust-toolchain@stable\n      - uses: Swatinem/rust-cache@v2\n\n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install tox tox-gh-actions\n\n      - name: Set up Pandoc\n        uses: r-lib/actions/setup-pandoc@v2\n\n      - name: Set up IPFS\n        if: startsWith(runner.os, 'Linux') && (matrix.py == '3.11')\n        uses: ibnesayeed/setup-ipfs@master\n        with:\n          ipfs_version: 0.6\n          run_daemon: true\n\n      - name: Start Redis\n        if: startsWith(runner.os, 'Linux') && (matrix.py == '3.11')\n        uses: supercharge/redis-github-action@v2\n        with:\n          redis-version: 6\n\n      - name: tox cache\n        uses: actions/cache@v5\n        with:\n          path: .tox/\n          key: ${{ runner.os }}-tox-v4-${{ hashFiles('**/pyproject.toml') }}\n          restore-keys: |\n            ${{ runner.os }}-tox-v4-\n\n      - name: Test with tox\n        run: tox\n        env:\n          PYTHONDEVMODE: 1\n\n      - name: Upload Python coverage to codecov\n        uses: codecov/codecov-action@v3\n        with:\n          flags: python\n          fail_ci_if_error: true\n          files: .tox/coverage.xml\n"
  },
  {
    "path": ".github/workflows/rust.yml",
    "content": "name: Rust checks\n\non:\n  push:\n    branches: [latest]\n    tags:\n      - 'r*'\n  pull_request:\n  merge_group:\n  schedule:\n    - cron: \"0 0 * * *\" # daily\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\nenv:\n  PIXI_VERSION: \"v0.66.0\"\n\njobs:\n  check:\n    name: Check\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout sources\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Run cargo check\n        run: |\n          pixi run cargo check\n\n  test:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        build: [beta, stable, windows, macos]\n        include:\n          - build: macos\n            os: macos-latest\n            rust: stable\n            continue: false\n          - build: windows\n            os: windows-latest\n            rust: stable\n            continue: true\n          - build: beta\n            os: ubuntu-latest\n            rust: beta\n            continue: false\n          - build: stable\n            os: ubuntu-latest\n            rust: stable\n            continue: false\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Run tests\n        if: matrix.os != 'windows-latest'\n        run: |\n          pixi run rust-tests\n\n      - name: Run tests (windows)\n        if: matrix.os == 'windows-latest'\n        run: |\n          # branchwater feature triggers a rocksdb error on windows,\n          # need to debug. For now using just default features\n          pixi run cargo nextest run\n\n  test_all_features:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Run tests for all feature combinations\n        run: pixi run check-features\n\n  coverage:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Collect coverage data\n        run: pixi run coverage-rust\n\n      - name: Upload Rust coverage to codecov\n        uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0\n        with:\n          flags: rust\n          fail_ci_if_error: true\n          files: lcov.info\n\n  lints:\n    name: Lints\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        build: [beta, stable]\n        include:\n          - build: beta\n            rust: beta\n          - build: stable\n            rust: stable\n    steps:\n      - name: Checkout sources\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Run cargo fmt\n        run: |\n          pixi run cargo fmt --all -- --check\n\n      - name: Run cargo clippy\n        run: |\n          pixi run cargo clippy --all -- -D warnings\n\n  wasm-pack:\n    name: Check if wasm-pack builds a valid package for the sourmash crate\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write  # needed to publish to NPM\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: run wasm tests\n        continue-on-error: true  ## TODO: remove this when tests works again...\n        run: pixi run -e wasm test-wasm\n\n      - name: run wasm-pack build\n        run: pixi run -e wasm build-wasm\n\n      - name: Prepare package for NPM publishing\n        run: pixi run -e wasm pack-npm\n\n      - name: Publish to NPM\n        if: startsWith(github.ref, 'refs/tags/r')\n        run: pixi run -e wasm publish-npm\n\n      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          path: 'pkg/sourmash*.tgz'\n\n  publish:\n    name: Publish (on tags, dry-run otherwise)\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write  # needed to publish to crates.io\n    steps:\n      - name: Checkout sources\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: Check semver\n        run: pixi run semver-check\n\n      - name: Make sure we can publish the sourmash crate\n        run: pixi run cargo publish --dry-run --manifest-path src/core/Cargo.toml\n\n      # Publish to crates.io on tags\n      - name: Publish to crates.io\n        if: startsWith(github.ref, 'refs/tags/r')\n        run: pixi run cargo publish --manifest-path src/core/Cargo.toml\n\n  minimum_rust_version:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - name: check if README matches MSRV defined here\n        run: grep '1.85.0' src/core/README.md\n\n      - name: Check if it builds properly\n        run: pixi run check-msrv\n\n  check_cbindgen:\n    name: \"Check if cbindgen runs cleanly for generating the C headers\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: set up pixi\n        uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5\n        with:\n          pixi-version: ${{ env.PIXI_VERSION }}\n          cache: true\n          cache-write: ${{ github.event_name == 'push' && github.ref_name == 'latest' }}\n          frozen: true\n\n      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1\n\n      - run: pixi run cbindgen-generate\n\n      - name: check if headers have the same content\n        run: |\n          git update-index --refresh\n          git diff\n          git diff-index --quiet HEAD -- include/sourmash.h || echo \"::error file=include/sourmash.h::Header doesn't match committed file, did you forget to rerun cbindgen?\"\n"
  },
  {
    "path": ".gitignore",
    "content": "*~\n*.fa\n*.fastq.gz\n*.abundtrim\n*.keep\n*.pyc\n*.sig\n*.png\n*.labels.txt\ndistances\n*.npy\ndist\nbuild\nsourmash.egg-info\n.ipynb_checkpoints\n.cache\n*.so\n.coverage\n.pytest_cache\n**/*.pyc\n.python-version\nsrc/sourmash/version.py\n*.DS_Store\n.tox\nsrc/sourmash/_lowlevel/*\n.env\ntarget/\n.eggs\n.asv\npkg/\nwasm-pack.log\n.hypothesis\n\n# IDEs\n.vscode/\n\n# nix\n.direnv/\nresult\n\n# pixi\n.pixi/\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n      - id: check-ast\n      - id: check-builtin-literals\n      - id: check-docstring-first\n      - id: check-merge-conflict\n      - id: check-yaml\n      - id: check-toml\n      - id: debug-statements\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.15.11\n    hooks:\n      - id: ruff-format\n      - id: ruff\n        args: [\"--fix\", \"--unsafe-fixes\", \"--exit-non-zero-on-fix\"]\n#  - repo: https://github.com/tox-dev/tox-ini-fmt\n#    rev: \"1.3.1\"\n#    hooks:\n#      - id: tox-ini-fmt\n#        args: [\"-p\", \"fix_lint\"]\n  - repo: meta\n    hooks:\n      - id: check-hooks-apply\n      - id: check-useless-excludes\n"
  },
  {
    "path": ".readthedocs.yml",
    "content": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\nversion: 2\n\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.14\"\n    rust: \"1.86\"\n  apt_packages:\n    - llvm-dev\n    - libclang-dev\n    - clang\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: doc/conf.py\n\npython:\n  install:\n    - method: pip\n      path: .\n      extra_requirements:\n        - doc\n"
  },
  {
    "path": ".sonarcloud.properties",
    "content": "\n"
  },
  {
    "path": ".zenodo.json",
    "content": "{\"creators\": [{\"name\": \"Luiz Irber\", \"orcid\": \"0000-0003-4371-9659\"}, {\"name\": \"N. Tessa Pierce-Ward\", \"orcid\": \"0000-0002-2942-5331\"}, {\"name\": \"Mohamed Abuelanin\", \"orcid\": \"0000-0002-3419-4785\"}, {\"name\": \"Harriet Alexander\", \"orcid\": \"0000-0003-1308-8008\"}, {\"name\": \"Abhishek Anant\", \"orcid\": \"0000-0002-5751-2010\"}, {\"name\": \"Keya Barve\", \"orcid\": \"0000-0003-3241-2117\"}, {\"name\": \"Colton Baumler\", \"orcid\": \"0000-0002-5926-7792\"}, {\"name\": \"Olga Botvinnik\", \"orcid\": \"0000-0003-4412-7970\"}, {\"name\": \"Phillip Brooks\", \"orcid\": \"0000-0003-3987-244X\"}, {\"name\": \"Peter Cock\", \"orcid\": \"0000-0001-9513-9993\"}, {\"name\": \"Daniel Dsouza\", \"orcid\": \"0000-0001-7843-8596\"}, {\"name\": \"Jade Gardner\", \"orcid\": \"0009-0005-0787-5752\"}, {\"name\": \"Laurent Gautier\", \"orcid\": \"0000-0003-0638-3391\"}, {\"name\": \"Tim Head\", \"orcid\": \"0000-0003-0931-3698\"}, {\"name\": \"Mahmudur Rahman Hera\", \"orcid\": \"0000-0002-5992-9012\"}, {\"name\": \"Hannah Eve Houts\", \"orcid\": \"0000-0002-7954-4793\"}, {\"name\": \"Lisa K. Johnson\", \"orcid\": \"0000-0002-3600-7218\"}, {\"name\": \"Fabian Kl\\u00f6tzl\", \"orcid\": \"0000-0002-6930-0592\"}, {\"name\": \"David Koslicki\", \"orcid\": \"0000-0002-0640-954X\"}, {\"name\": \"Katrin Leinweber\", \"orcid\": \"0000-0001-5135-5758\"}, {\"name\": \"Marisa Lim\", \"orcid\": \"0000-0003-2097-8818\"}, {\"name\": \"Ricky Lim\", \"orcid\": \"0000-0003-1313-7076\"}, {\"name\": \"Bradley Nelson\", \"orcid\": \"0009-0001-1553-932X\"}, {\"name\": \"Ivan Ogasawara\", \"orcid\": \"0000-0001-5049-4289\"}, {\"name\": \"Taylor Reiter\", \"orcid\": \"0000-0002-7388-421X\"}, {\"name\": \"Camille Scott\", \"orcid\": \"0000-0001-8822-8779\"}, {\"name\": \"Andreas Sj\\u00f6din\", \"orcid\": \"0000-0001-5350-4219\"}, {\"name\": \"Connor T. Skennerton\", \"orcid\": \"0000-0003-1320-4873\"}, {\"name\": \"Jason Stajich\", \"orcid\": \"0000-0002-7591-0020\"}, {\"name\": \"Daniel Standage\", \"orcid\": \"0000-0003-0342-8531\"}, {\"name\": \"S. Joshua Swamidass\", \"orcid\": \"0000-0003-2191-0778\"}, {\"name\": \"Connor Tiffany\", \"orcid\": \"0000-0001-8188-7720\"}, {\"name\": \"Pranathi Vemuri\", \"orcid\": \"0000-0002-5748-9594\"}, {\"name\": \"Erik Young\", \"orcid\": \"0000-0002-9195-9801\"}, {\"name\": \"Nick H\", \"orcid\": \"0000-0002-1685-302X\"}, {\"name\": \"C. Titus Brown\", \"orcid\": \"0000-0001-6001-2677\"}]}"
  },
  {
    "path": "CITATION.cff",
    "content": "cff-version: \"1.2.0\"\nauthors:\n- family-names: Irber\n  given-names: Luiz\n  orcid: \"https://orcid.org/0000-0003-4371-9659\"\n- family-names: Pierce-Ward\n  given-names: N. Tessa\n  orcid: \"https://orcid.org/0000-0002-2942-5331\"\n- family-names: Abuelanin\n  given-names: Mohamed\n  orcid: \"https://orcid.org/0000-0002-3419-4785\"\n- family-names: Alexander\n  given-names: Harriet\n  orcid: \"https://orcid.org/0000-0003-1308-8008\"\n- family-names: Anant\n  given-names: Abhishek\n  orcid: \"https://orcid.org/0000-0002-5751-2010\"\n- family-names: Barve\n  given-names: Keya\n  orcid: \"https://orcid.org/0000-0003-3241-2117\"\n- family-names: Baumler\n  given-names: Colton\n  orcid: \"https://orcid.org/0000-0002-5926-7792\"\n- family-names: Botvinnik\n  given-names: Olga\n  orcid: \"https://orcid.org/0000-0003-4412-7970\"\n- family-names: Brooks\n  given-names: Phillip\n  orcid: \"https://orcid.org/0000-0003-3987-244X\"\n- family-names: Dsouza\n  given-names: Daniel\n  orcid: \"https://orcid.org/0000-0001-7843-8596\"\n- family-names: Gautier\n  given-names: Laurent\n  orcid: \"https://orcid.org/0000-0003-0638-3391\"\n- family-names: Rahman Hera\n  given-names: Mahmudur\n  orcid: \"https://orcid.org/0000-0002-5992-9012\"\n- family-names: Houts\n  given-names: Hannah Eve\n  orcid: \"https://orcid.org/0000-0002-7954-4793\"\n- family-names: Johnson\n  given-names: Lisa K.\n  orcid: \"https://orcid.org/0000-0002-3600-7218\"\n- family-names: Klötzl\n  given-names: Fabian\n  orcid: \"https://orcid.org/0000-0002-6930-0592\"\n- family-names: Koslicki\n  given-names: David\n  orcid: \"https://orcid.org/0000-0002-0640-954X\"\n- family-names: Lim\n  given-names: Marisa\n  orcid: \"https://orcid.org/0000-0003-2097-8818\"\n- family-names: Lim\n  given-names: Ricky\n  orcid: \"https://orcid.org/0000-0003-1313-7076\"\n- family-names: Nelson\n  given-names: Bradley\n  orcid: \"https://orcid.org/0009-0001-1553-932X\"\n- family-names: Ogasawara\n  given-names: Ivan\n  orcid: \"https://orcid.org/0000-0001-5049-4289\"\n- family-names: Reiter\n  given-names: Taylor\n  orcid: \"https://orcid.org/0000-0002-7388-421X\"\n- family-names: Scott\n  given-names: Camille\n  orcid: \"https://orcid.org/0000-0001-8822-8779\"\n- family-names: Sjödin\n  given-names: Andreas\n  orcid: \"https://orcid.org/0000-0001-5350-4219\"\n- family-names: Standage\n  given-names: Daniel\n  orcid: \"https://orcid.org/0000-0003-0342-8531\"\n- family-names: Swamidass\n  given-names: S. Joshua\n  orcid: \"https://orcid.org/0000-0003-2191-0778\"\n- family-names: Tiffany\n  given-names: Connor\n  orcid: \"https://orcid.org/0000-0001-8188-7720\"\n- family-names: Vemuri\n  given-names: Pranathi\n  orcid: \"https://orcid.org/0000-0002-5748-9594\"\n- family-names: Young\n  given-names: Erik\n  orcid: \"https://orcid.org/0000-0002-9195-9801\"\n- family-names: Brown\n  given-names: C. Titus\n  orcid: \"https://orcid.org/0000-0001-6001-2677\"\ncontact:\n- family-names: Brown\n  given-names: C. Titus\n  orcid: \"https://orcid.org/0000-0001-6001-2677\"\ndoi: 10.5281/zenodo.11557883\nmessage: If you use this software, please cite our article in the\n  Journal of Open Source Software.\npreferred-citation:\n  authors:\n  - family-names: Irber\n    given-names: Luiz\n    orcid: \"https://orcid.org/0000-0003-4371-9659\"\n  - family-names: Pierce-Ward\n    given-names: N. Tessa\n    orcid: \"https://orcid.org/0000-0002-2942-5331\"\n  - family-names: Abuelanin\n    given-names: Mohamed\n    orcid: \"https://orcid.org/0000-0002-3419-4785\"\n  - family-names: Alexander\n    given-names: Harriet\n    orcid: \"https://orcid.org/0000-0003-1308-8008\"\n  - family-names: Anant\n    given-names: Abhishek\n    orcid: \"https://orcid.org/0000-0002-5751-2010\"\n  - family-names: Barve\n    given-names: Keya\n    orcid: \"https://orcid.org/0000-0003-3241-2117\"\n  - family-names: Baumler\n    given-names: Colton\n    orcid: \"https://orcid.org/0000-0002-5926-7792\"\n  - family-names: Botvinnik\n    given-names: Olga\n    orcid: \"https://orcid.org/0000-0003-4412-7970\"\n  - family-names: Brooks\n    given-names: Phillip\n    orcid: \"https://orcid.org/0000-0003-3987-244X\"\n  - family-names: Dsouza\n    given-names: Daniel\n    orcid: \"https://orcid.org/0000-0001-7843-8596\"\n  - family-names: Gautier\n    given-names: Laurent\n    orcid: \"https://orcid.org/0000-0003-0638-3391\"\n  - family-names: Hera\n    given-names: Mahmudur Rahman\n    orcid: \"https://orcid.org/0000-0002-5992-9012\"\n  - family-names: Houts\n    given-names: Hannah Eve\n    orcid: \"https://orcid.org/0000-0002-7954-4793\"\n  - family-names: Johnson\n    given-names: Lisa K.\n    orcid: \"https://orcid.org/0000-0002-3600-7218\"\n  - family-names: Klötzl\n    given-names: Fabian\n    orcid: \"https://orcid.org/0000-0002-6930-0592\"\n  - family-names: Koslicki\n    given-names: David\n    orcid: \"https://orcid.org/0000-0002-0640-954X\"\n  - family-names: Lim\n    given-names: Marisa\n    orcid: \"https://orcid.org/0000-0003-2097-8818\"\n  - family-names: Lim\n    given-names: Ricky\n    orcid: \"https://orcid.org/0000-0003-1313-7076\"\n  - family-names: Nelson\n    given-names: Bradley\n    orcid: \"https://orcid.org/0009-0001-1553-932X\"\n  - family-names: Ogasawara\n    given-names: Ivan\n    orcid: \"https://orcid.org/0000-0001-5049-4289\"\n  - family-names: Reiter\n    given-names: Taylor\n    orcid: \"https://orcid.org/0000-0002-7388-421X\"\n  - family-names: Scott\n    given-names: Camille\n    orcid: \"https://orcid.org/0000-0001-8822-8779\"\n  - family-names: Sjödin\n    given-names: Andreas\n    orcid: \"https://orcid.org/0000-0001-5350-4219\"\n  - family-names: Standage\n    given-names: Daniel\n    orcid: \"https://orcid.org/0000-0003-0342-8531\"\n  - family-names: Swamidass\n    given-names: S. Joshua\n    orcid: \"https://orcid.org/0000-0003-2191-0778\"\n  - family-names: Tiffany\n    given-names: Connor\n    orcid: \"https://orcid.org/0000-0001-8188-7720\"\n  - family-names: Vemuri\n    given-names: Pranathi\n    orcid: \"https://orcid.org/0000-0002-5748-9594\"\n  - family-names: Young\n    given-names: Erik\n    orcid: \"https://orcid.org/0000-0002-9195-9801\"\n  - family-names: Brown\n    given-names: C. Titus\n    orcid: \"https://orcid.org/0000-0001-6001-2677\"\n  date-published: 2024-06-28\n  doi: 10.21105/joss.06830\n  issn: 2475-9066\n  issue: 98\n  journal: Journal of Open Source Software\n  publisher:\n    name: Open Journals\n  start: 6830\n  title: \"sourmash v4: A multitool to quickly search, compare, and\n    analyze genomic and metagenomic data sets\"\n  type: article\n  url: \"https://joss.theoj.org/papers/10.21105/joss.06830\"\n  volume: 9\ntitle: \"sourmash v4: A multitool to quickly search, compare, and analyze\n  genomic and metagenomic data sets\"\n"
  },
  {
    "path": "CODE_OF_CONDUCT.rst",
    "content": "Contributor Code of Conduct\n===========================\n\nAs contributors and maintainers of this project, we pledge to respect\nall people who contribute through reporting issues, posting feature\nrequests, updating documentation, submitting pull requests or patches,\nand other activities.\n\nWe are committed to making participation in this project a\nharassment-free experience for everyone, regardless of level of\nexperience, gender, gender identity and expression, sexual orientation,\ndisability, personal appearance, body size, race, age, or religion.\n\nExamples of unacceptable behavior by participants include the use of\nsexual language or imagery, derogatory comments or personal attacks,\ntrolling, public or private harassment, insults, or other unprofessional\nconduct.\n\nProject maintainers have the right and responsibility to remove, edit,\nor reject comments, commits, code, wiki edits, issues, and other\ncontributions that are not aligned to this Code of Conduct. Project\nmaintainers or contributors who do not follow the Code of Conduct may be\nremoved from the project team.\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by emailing `titus@idyll.org <mailto:titus@idyll.org>`__ which only\ngoes to C. Titus Brown.  To report an issue involving Titus please email `Judi\nBrown Clarke, Ph.D. <mailto:jbc@egr.msu.edu>`__ the Diversity Director at the\nBEACON Center for the Study of Evolution in Action, an NSF Center for Science\nand Technology.\n\nThis Code of Conduct is adapted from the `Contributor\nCovenant <http://contributor-covenant.org>`__, version 1.0.0, available at\nhttp://contributor-covenant.org/version/1/0/0/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "We welcome contributions!  We use\n[GitHub Flow style development](https://guides.github.com/introduction/flow/).\nPlease set up a pull request against our `latest` branch with any changes\nyou want us to consider merging.\n\nFor more info, check the [developer information](https://sourmash.readthedocs.io/en/latest/developer.html)\nsection in our docs.\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[workspace]\nmembers = [\n  \"src/core\",\n]\ndefault-members = [\"src/core\"]\nresolver = \"2\"\n\n[profile.test]\nopt-level = 1\n"
  },
  {
    "path": "LICENSE",
    "content": "=======\nLicense\n=======\n\nFiles: *\nCopyright: 2016, The Regents of the University of California.\nLicense: BSD-3-Clause\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n \n     * Redistributions of source code must retain the above copyright\n       notice, this list of conditions and the following disclaimer.\n \n     * Redistributions in binary form must reproduce the above\n       copyright notice, this list of conditions and the following\n       disclaimer in the documentation and/or other materials provided\n       with the distribution.\n \n     * Neither the name of The Regents of the University of\n       California, nor the names of contributors may be used to\n       endorse or promote products derived from this software without\n       specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nFiles: third-party/smhasher/*\nCopyright: none.\nLicense: public-domain\n Quoting from the file header: \"MurmurHash3 was written by Austin Appleby,\n and is placed in the public domain. The author hereby disclaims copyright to\n this source code.\"\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include LICENSE Makefile README.md requirements.txt\ninclude Cargo.toml\ninclude include/sourmash.h\nprune .eggs\nglobal-exclude *.rlib\nglobal-exclude *.orig\nglobal-exclude *.pyc\nglobal-exclude *.so\nprune tests/test-data\nglobal-exclude *.git\n"
  },
  {
    "path": "Makefile",
    "content": "PYTHON ?= python\n\nall: build\n\n.PHONY:\n\nbuild: .PHONY\n\t$(PYTHON) -m pip install -e .\n\nclean:\n\t$(PYTHON) -m pip uninstall -y sourmash\n\trm -rf src/sourmash/_lowlevel\n\tcd doc && make clean\n\ninstall: build\n\noffline:\n\tpip install -e . --no-index --find-links '.' --no-build-isolation\n\ndist: FORCE\n\t$(PYTHON) -m build --sdist\n\nwheel:\n\t$(PYTHON) -m maturin build -r\n\ntest: .PHONY\n\ttox -e py311\n\tcargo nextest run\n\ndoc: .PHONY\n\ttox -e docs\n\ninclude/sourmash.h: src/core/src/lib.rs \\\n                    src/core/src/ffi/mod.rs \\\n                    src/core/src/ffi/hyperloglog.rs \\\n                    src/core/src/ffi/minhash.rs \\\n                    src/core/src/ffi/signature.rs \\\n                    src/core/src/ffi/nodegraph.rs \\\n                    src/core/src/ffi/index/mod.rs \\\n                    src/core/src/ffi/index/revindex.rs \\\n                    src/core/src/ffi/storage.rs \\\n                    src/core/src/ffi/manifest.rs \\\n                    src/core/src/errors.rs \\\n                    src/core/cbindgen.toml\n\tcd src/core && \\\n\tRUSTC_BOOTSTRAP=1 cbindgen -c cbindgen.toml . -o ../../$@ -v && \\\n\ttouch ../../$@\n\ncoverage: all\n\ttox -e coverage\n\nbenchmark:\n\ttox -e asv\n\tcargo bench\n\ncheck:\n\tcargo build\n\tcargo nextest run\n\tcargo bench\n\nlast-tag:\n\tgit fetch -p -q; git tag -l | sort -V | tail -1\n\nwasm:\n\twasm-pack build src/core -d ../../pkg -- --features 'niffler/wasm'\n\nwasm-test:\n\twasm-pack test --node src/core -- --features 'niffler/wasm'\n\nwasi:\n\tcargo wasi build\n\nFORCE:\n"
  },
  {
    "path": "README.md",
    "content": "# sourmash\n\nQuickly search, compare, and analyze genomic and metagenomic data sets.\n\n[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)\n<a href=\"https://github.com/sourmash-bio/sourmash/blob/latest/LICENSE\"><img alt=\"License: 3-Clause BSD\" src=\"https://img.shields.io/badge/License-BSD%203--Clause-blue.svg\"></a>\n[![Documentation](https://readthedocs.org/projects/sourmash/badge/?version=latest)](http://sourmash.readthedocs.io/en/latest/)\n[![Gitter](https://badges.gitter.im/sourmash-bio/community.svg)](https://gitter.im/sourmash-bio/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\n[![DOI](https://joss.theoj.org/papers/10.21105/joss.06830/status.svg)](https://doi.org/10.21105/joss.06830)\n[![pyOpenSci](https://tinyurl.com/y22nb8up)](https://github.com/pyOpenSci/software-submission/issues/129)\n\n[![Bioconda install](https://img.shields.io/conda/dn/bioconda/sourmash.svg?style=flag&label=Bioconda)](https://anaconda.org/bioconda/sourmash)\n<a href=\"https://pypi.org/project/sourmash/\"><img alt=\"PyPI\" src=\"https://badge.fury.io/py/sourmash.svg\"></a>\n[![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/sourmash-minimal.svg)](https://anaconda.org/conda-forge/sourmash-minimal)\n[![Debian Testing](https://badges.debian.net/badges/debian/testing/sourmash/version.svg)](https://packages.debian.org/testing/sourmash) [![Debian Unstable](https://badges.debian.net/badges/debian/unstable/sourmash/version.svg)](https://packages.debian.org/unstable/sourmash)\n\n![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)\n![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)\n![Python 3.13](https://img.shields.io/badge/python-3.13-blue.svg)\n[![Build Status](https://github.com/sourmash-bio/sourmash/workflows/Python%20tests/badge.svg)](https://github.com/sourmash-bio/sourmash/actions/)\n[![codecov](https://codecov.io/gh/sourmash-bio/sourmash/branch/latest/graph/badge.svg)](https://codecov.io/gh/sourmash-bio/sourmash)\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/sourmash-bio/sourmash/latest/doc/_static/logo.png\" height=\"256\" /></p>\n\nUsage:\n\n    sourmash sketch dna *.fq.gz\n    sourmash compare *.sig -o distances.cmp -k 31\n    sourmash plot distances.cmp\n\nsourmash 1.0 is [published on JOSS](https://doi.org/10.21105/joss.06830); please cite that paper if you use sourmash (`doi: 10.21105/joss.06830`):.\n\nThe latest major release is sourmash v4, which has several\ncommand-line and Python incompatibilities with previous\nversions. Please\n[visit our migration guide](https://sourmash.readthedocs.io/en/latest/support.html#migrating-from-sourmash-v3-x-to-sourmash-4-x)\nto upgrade!\n\n----\n\nsourmash is a k-mer analysis multitool, and we aim to provide stable, robust programmatic and command-line APIs for a variety of sequence comparisons. Some of our special sauce includes:\n- `FracMinHash` sketching, which enables accurate comparisons (including ANI) between data sets of different sizes\n- `sourmash gather`, a combinatorial k-mer approach for more accurate metagenomic profiling\n\nPlease see the [sourmash publications](https://sourmash.readthedocs.io/en/latest/publications.html#sourmash-fundamentals) for details.\n\nThe name is a riff off of [Mash](https://github.com/marbl/Mash),\ncombined with @ctb's love of whiskey.\n([Sour mash](https://en.wikipedia.org/wiki/Sour_mash) is used in\nmaking whiskey.)\n\nMaintainers: [C. Titus Brown](mailto:titus@idyll.org) ([@ctb](http://github.com/ctb)), [Luiz C. Irber, Jr](mailto:luiz@sourmash.bio) ([@luizirber](http://github.com/luizirber)), and [N. Tessa Pierce-Ward](mailto:tessa@sourmash.bio) ([@bluegenes](http://github.com/bluegenes)).\n\nsourmash was initially developed by the\n[Lab for Data-Intensive Biology](http://ivory.idyll.org/lab/) at the\n[UC Davis School of Veterinary Medicine](http://www.vetmed.ucdavis.edu),\nand now includes contributions from the global research and developer\ncommunity.\n\n## Installation\n\nWe recommend using conda-forge to install sourmash:\n\n```\nconda install -c conda-forge sourmash-minimal\n```\nThis will install the latest stable version of sourmash 4.\n\nYou can also use pip to install sourmash:\n\n```\npip install sourmash\n```\n\nA quickstart tutorial [is available](https://sourmash.readthedocs.io/en/latest/tutorials.html).\n\n### Requirements\n\nsourmash runs under Python 3.11 and later on Windows, Mac OS X, and\nLinux.  The base requirements are screed, cffi, numpy, matplotlib, and\nscipy.  Conda will install everything necessary, and is\nour recommended installation method (see below).\n\n### Installation with conda\n\nconda-forge is a community maintained channel for the\n[conda](http://conda.pydata.org/docs/intro.html) package manager.\n[installing conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/),\nyou can install sourmash by running:\n\n```bash\n$ conda create -n sourmash_env -c conda-forge sourmash-minimal\n$ conda activate sourmash_env\n$ sourmash --help\n```\n\nwhich will install\n[the latest released version](https://github.com/sourmash-bio/sourmash/releases).\n\n## Support\n\nFor questions, please open an issue [on Github](https://github.com/sourmash-bio/sourmash/issues), or ask in our [chat](https://gitter.im/sourmash-bio/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link).\n\n## Development\n\nDevelopment happens on github at\n[sourmash-bio/sourmash](https://github.com/sourmash-bio/sourmash).\n\nsourmash is developed in Python and Rust, and you will need a Rust\nenvironment to build it; see [the developer notes](doc/developer.md)\nfor our suggested development setup.\n\nAfter installation, `sourmash` is the main command-line entry point;\nrun it with `python -m sourmash`, or do `pip install -e /path/to/repo` to\ndo a developer install in a virtual environment.\n\nThe `sourmash/` directory contains the Python library and command-line interface code.\n\nThe `src/core/` directory contains the Rust library implementing core\nfunctionality.\n\nTests require py.test and can be run with `make test`.\n\nPlease see [the developer notes](doc/developer.md) for more information\non getting set up with a development environment.\n\nCTB\nJan 2024\n"
  },
  {
    "path": "asv.conf.json",
    "content": "{\n    \"version\": 1,\n    \"project\": \"sourmash\",\n    \"project_url\": \"https://github.com/sourmash-bio/sourmash\",\n    \"repo\": \".\",\n    \"branches\": [\"latest\"],\n    \"dvcs\": \"git\",\n    \"environment_type\": \"virtualenv\",\n    \"env_dir\": \".asv/env\",\n    \"results_dir\": \".asv/results\",\n    \"html_dir\": \".asv/html\",\n    \"build_cache_size\": 8,\n    \"build_command\": [\n      \"python -m pip install 'setuptools_scm[toml]>=4,<6' milksnake maturin\",\n      \"PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps --no-index -w {build_cache_dir} {build_dir}\"\n    ]\n}\n"
  },
  {
    "path": "benchmarks/README.md",
    "content": "# benchmarks for asv ([airspeed velocity](https://asv.readthedocs.io/en/stable/index.html))\n\nThe code in here is run by GitHub Actions during continuous integration.\n\nTo test quickly, run:\n\n```\nasv run --show-stderr --quick  \n```\n"
  },
  {
    "path": "benchmarks/__init__.py",
    "content": "\n"
  },
  {
    "path": "benchmarks/benchmarks.py",
    "content": "import random\nfrom tempfile import NamedTemporaryFile\n\nfrom sourmash.sbt_storage import ZipStorage\nfrom sourmash.minhash import MinHash\n\nRANDOM_SEQ_SIZE = 3000\nRANDOM_SEQ_NUMBER = 300\n\nMINHASH_NUM = 500\nMINHASH_K = 21\n\nGET_MINS_RANGE = 500\nADD_HASH_RANGE = 10_000\nADD_MANY_RANGE = 1000\nSIMILARITY_TIMES = 500\nCOUNT_COMMON_TIMES = 500\nMERGE_TIMES = 500\nCOPY_TIMES = 500\nCONCAT_TIMES = 500\nSET_ABUNDANCES_RANGE = 500\nZIP_STORAGE_WRITE = 100_000\nZIP_STORAGE_LOAD = 20\n\n\ndef load_sequences():\n    sequences = []\n    for i in range(10):\n        random_seq = random.sample(\n            \"A,C,G,T\".split(\",\") * RANDOM_SEQ_SIZE, RANDOM_SEQ_NUMBER\n        )\n        sequences.append(\"\".join(random_seq))\n    return sequences\n\n\nclass TimeMinHashSuite:\n    def setup(self):\n        self.mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=False)\n        self.protein_mh = MinHash(\n            MINHASH_NUM, MINHASH_K, is_protein=True, track_abundance=False\n        )\n        self.sequences = load_sequences()\n\n        self.populated_mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=False)\n        for seq in self.sequences:\n            self.populated_mh.add_sequence(seq)\n\n    def time_add_sequence(self):\n        mh = self.mh\n        sequences = self.sequences\n        for seq in sequences:\n            mh.add_sequence(seq)\n\n    def time_add_protein(self):\n        mh = self.protein_mh\n        sequences = self.sequences\n        for seq in sequences:\n            mh.add_protein(seq)\n\n    def time_get_mins(self):\n        mh = self.populated_mh\n        for i in range(GET_MINS_RANGE):\n            mh.get_mins()\n\n    def time_add_hash(self):\n        mh = self.mh\n        for i in range(ADD_HASH_RANGE):\n            mh.add_hash(i)\n\n    def time_add_many(self):\n        mh = self.mh\n        mh.add_many(list(range(ADD_MANY_RANGE)))\n\n    def time_similarity(self):\n        mh = self.mh\n        other_mh = self.populated_mh\n        for i in range(SIMILARITY_TIMES):\n            mh.similarity(other_mh)\n\n    def time_count_common(self):\n        mh = self.mh\n        other_mh = self.populated_mh\n        for i in range(COUNT_COMMON_TIMES):\n            mh.count_common(other_mh)\n\n    def time_merge(self):\n        mh = self.mh\n        other_mh = self.populated_mh\n        for i in range(MERGE_TIMES):\n            mh.merge(other_mh)\n\n    def time_copy(self):\n        mh = self.populated_mh\n        for i in range(COPY_TIMES):\n            mh.__copy__()\n\n    def time_concat(self):\n        mh = self.mh\n        other_mh = self.populated_mh\n        for i in range(CONCAT_TIMES):\n            mh += other_mh\n\n\nclass PeakmemMinHashSuite:\n    def setup(self):\n        self.mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=True)\n        self.protein_mh = MinHash(\n            MINHASH_NUM, MINHASH_K, is_protein=True, track_abundance=True\n        )\n        self.sequences = load_sequences()\n\n    def peakmem_add_sequence(self):\n        mh = self.mh\n        sequences = self.sequences\n        for seq in sequences:\n            mh.add_sequence(seq)\n\n    def peakmem_add_protein(self):\n        mh = self.protein_mh\n        sequences = self.sequences\n        for seq in sequences:\n            mh.add_protein(seq)\n\n    def peakmem_add_hash(self):\n        mh = self.mh\n        for i in range(ADD_HASH_RANGE):\n            mh.add_hash(i)\n\n    def peakmem_add_many(self):\n        mh = self.mh\n        mh.add_many(list(range(ADD_MANY_RANGE)))\n\n\n####################\n\n\nclass TimeMinAbundanceSuite(TimeMinHashSuite):\n    def setup(self):\n        TimeMinHashSuite.setup(self)\n        self.mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=True)\n\n        self.populated_mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=True)\n        for seq in self.sequences:\n            self.populated_mh.add_sequence(seq)\n\n    def time_get_mins_abundance(self):\n        mh = self.populated_mh\n        for i in range(GET_MINS_RANGE):\n            mh.get_mins(with_abundance=True)\n\n    def time_set_abundances(self):\n        mh = self.mh\n        mins = self.populated_mh.get_mins(with_abundance=True)\n        for i in range(SET_ABUNDANCES_RANGE):\n            mh.set_abundances(mins)\n\n    def time_set_abundances_noclear(self):\n        mh = self.mh\n        mins = self.populated_mh.get_mins(with_abundance=True)\n        for i in range(SET_ABUNDANCES_RANGE):\n            mh.set_abundances(mins, clear=False)\n\n\nclass PeakmemMinAbundanceSuite(PeakmemMinHashSuite):\n    def setup(self):\n        PeakmemMinHashSuite.setup(self)\n        self.mh = MinHash(MINHASH_NUM, MINHASH_K, track_abundance=True)\n\n\n####################\n\n\nclass TimeZipStorageSuite:\n    def setup(self):\n        import zipfile\n\n        self.zipfile = NamedTemporaryFile()\n\n        with zipfile.ZipFile(\n            self.zipfile, mode=\"w\", compression=zipfile.ZIP_STORED\n        ) as storage:\n            for i in range(ZIP_STORAGE_WRITE):\n                # just so we have lots of entries\n                storage.writestr(str(i), b\"0\")\n            # one big-ish entry\n            storage.writestr(\"sig1\", b\"9\" * 1_000_000)\n\n    def time_load_from_zipstorage(self):\n        with ZipStorage(self.zipfile.name) as storage:\n            for i in range(ZIP_STORAGE_LOAD):\n                storage.load(\"sig1\")\n\n    def time_load_small_from_zipstorage(self):\n        with ZipStorage(self.zipfile.name) as storage:\n            for i in range(ZIP_STORAGE_LOAD):\n                storage.load(\"99999\")\n\n    def teardown(self):\n        self.zipfile.close()\n\n\nclass PeakmemZipStorageSuite:\n    def setup(self):\n        import zipfile\n\n        self.zipfile = NamedTemporaryFile()\n\n        with zipfile.ZipFile(\n            self.zipfile, mode=\"w\", compression=zipfile.ZIP_STORED\n        ) as storage:\n            for i in range(ZIP_STORAGE_WRITE):\n                # just so we have lots of entries\n                storage.writestr(str(i), b\"0\")\n            # one big-ish entry\n            storage.writestr(\"sig1\", b\"9\" * 1_000_000)\n\n    def peakmem_load_from_zipstorage(self):\n        with ZipStorage(self.zipfile.name) as storage:\n            for i in range(ZIP_STORAGE_LOAD):\n                storage.load(\"sig1\")\n\n    def peakmem_load_small_from_zipstorage(self):\n        with ZipStorage(self.zipfile.name) as storage:\n            for i in range(ZIP_STORAGE_LOAD):\n                storage.load(\"99999\")\n\n    def teardown(self):\n        self.zipfile.close()\n"
  },
  {
    "path": "binder/README.md",
    "content": "# binder directory\n\nConfiguration files for [mybinder](https://mybinder.org).\n"
  },
  {
    "path": "binder/environment.yml",
    "content": "channels:\n  - conda-forge\n  - bioconda\n  - defaults\ndependencies:\n  - python>=3.11\n  - sourmash>=4.8.11\n  - screed\n  - matplotlib\n  - pandas\n  - pip\n  - pip:\n    - matplotlib_venn\n    - mmh3\n"
  },
  {
    "path": "codecov.yml",
    "content": "# config file for codecov, https://app.codecov.io/gh/sourmash-bio/sourmash/\n\n# use path fixing to properly report code coverage on source code\n# per https://docs.codecov.io/docs/fixing-paths\nfixes:\n- \"sourmash::src/sourmash\"\nignores:\n- \"src/core/src/ffi\"\n\ncodecov: \n token: 66273971-681c-44a5-b93a-f60249a2a70c\n"
  },
  {
    "path": "codemeta.json",
    "content": "{\n  \"@context\": \"https://raw.githubusercontent.com/mbjones/codemeta/master/codemeta.jsonld\",\n  \"@type\": \"Code\",\n  \"author\": [\n\n  ],\n  \"identifier\": \"\",\n  \"codeRepository\": \"https://github.com/sourmash-bio/sourmash\",\n  \"datePublished\": \"2016-06-07\",\n  \"dateModified\": \"2016-06-07\",\n  \"dateCreated\": \"2016-06-07\",\n  \"description\": \"Generate, compare, and manipulate MinHash sketches of genomic data\",\n  \"keywords\": \"MinHash, k-mers, Python\",\n  \"license\": \"BSD 3-clause\",\n  \"title\": \"sourmash\",\n  \"version\": \"v1.0.0\"\n}\n"
  },
  {
    "path": "data/README.md",
    "content": "# The data subdir\n\nData files for various and sundry purposes.\n\nThe following files are used by the doctests in doc/ & may also be useful\nfor developers who are benchmarking:\n\n```\nGCF_000005845.2_ASM584v2_genomic.fna.gz\nGCF_000006945.1_ASM694v1_genomic.fna.gz\nGCF_000783305.1_ASM78330v1_genomic.fna.gz\n```\n\nCTB 6/16\n"
  },
  {
    "path": "default.nix",
    "content": "(import\n  (\n    fetchTarball {\n      url = \"https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz\";\n      sha256 = \"0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2\";\n    }\n  )\n  {\n    src = ./.;\n  }).defaultNix\n"
  },
  {
    "path": "deny.toml",
    "content": "all-features = true\nfeature-depth = 1\n\n[advisories]\ndb-path = \"~/.cargo/advisory-db\"\ndb-urls = [\"https://github.com/rustsec/advisory-db\"]\nvulnerability = \"deny\"\nunmaintained = \"warn\"\nyanked = \"warn\"\nnotice = \"warn\"\n# A list of advisory IDs to ignore. Note that ignored advisories will still\n# output a note when they are encountered.\nignore = [\n    #\"RUSTSEC-0000-0000\",\n]\n\n[licenses]\nunlicensed = \"deny\"\nallow = [\n    \"MIT\",\n    \"Apache-2.0\",\n    \"Apache-2.0 WITH LLVM-exception\",\n    \"BSD-3-Clause\",\n    \"Unicode-DFS-2016\",\n]\ncopyleft = \"warn\"\nallow-osi-fsf-free = \"neither\"\ndefault = \"deny\"\nconfidence-threshold = 0.8\nexceptions = [\n    { allow = [\"Zlib\"], name = \"piz\", version = \"*\" },\n    { allow = [\"ISC\"], name = \"libloading\", version = \"*\" },\n]\n\n[bans]\nmultiple-versions = \"deny\"\nwildcards = \"allow\"\nhighlight = \"all\"\nworkspace-default-features = \"allow\"\nexternal-default-features = \"allow\"\n\n[sources]\nunknown-registry = \"warn\"\nunknown-git = \"warn\"\nallow-registry = [\"https://github.com/rust-lang/crates.io-index\"]\n"
  },
  {
    "path": "dev.yml",
    "content": "name: sourmash_dev\nchannels:\n  - conda-forge\ndependencies:\n  - clangdev >=16.0.6,<16.1\n  - cxx-compiler >=1.7.0,<1.8\n  - git 2.41.0.*\n  - libclang >=16.0.6,<16.1\n  - pandoc 3.1.3.*\n  - python 3.12.*\n  - rust >=1.85.0,<1.94\n  - tox >=4.11.0,<5\n"
  },
  {
    "path": "doc/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\nall: html\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\n\n# User-friendly check for sphinx-build\nifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)\n   $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\\'t have Sphinx installed, grab it from http://sphinx-doc.org/)\nendif\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  applehelp  to make an Apple Help Book\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  epub3      to make an epub3\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  latexpdfja to make LaTeX files and run them through platex/dvipdfmx\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  xml        to make Docutils-native XML files\"\n\t@echo \"  pseudoxml  to make pseudoxml-XML files for display purposes\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\t@echo \"  coverage   to run coverage check of the documentation (if enabled)\"\n\t@echo \"  dummy      to check syntax errors of document sources\"\n\n.PHONY: clean\nclean:\n\trm -rf $(BUILDDIR)/*\n\n.PHONY: html\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\n.PHONY: dirhtml\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\n.PHONY: singlehtml\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\n.PHONY: pickle\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\n.PHONY: json\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\n.PHONY: htmlhelp\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\n.PHONY: qthelp\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/sourmash.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/sourmash.qhc\"\n\n.PHONY: applehelp\napplehelp:\n\t$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp\n\t@echo\n\t@echo \"Build finished. The help book is in $(BUILDDIR)/applehelp.\"\n\t@echo \"N.B. You won't be able to view it unless you put it in\" \\\n\t      \"~/Library/Documentation/Help or install it in your application\" \\\n\t      \"bundle.\"\n\n.PHONY: devhelp\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/sourmash\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/sourmash\"\n\t@echo \"# devhelp\"\n\n.PHONY: epub\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\n.PHONY: epub3\nepub3:\n\t$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3\n\t@echo\n\t@echo \"Build finished. The epub3 file is in $(BUILDDIR)/epub3.\"\n\n.PHONY: latex\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\n.PHONY: latexpdf\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\n.PHONY: latexpdfja\nlatexpdfja:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through platex and dvipdfmx...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\n.PHONY: text\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\n.PHONY: man\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\n.PHONY: texinfo\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\n.PHONY: info\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\n.PHONY: gettext\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\n.PHONY: changes\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\n.PHONY: linkcheck\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\n.PHONY: doctest\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n\n.PHONY: coverage\ncoverage:\n\t$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage\n\t@echo \"Testing of coverage in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/coverage/python.txt.\"\n\n.PHONY: xml\nxml:\n\t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml\n\t@echo\n\t@echo \"Build finished. The XML files are in $(BUILDDIR)/xml.\"\n\n.PHONY: pseudoxml\npseudoxml:\n\t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml\n\t@echo\n\t@echo \"Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml.\"\n\n.PHONY: dummy\ndummy:\n\t$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy\n\t@echo\n\t@echo \"Build finished. Dummy builder generates no files.\"\n"
  },
  {
    "path": "doc/README.md",
    "content": "# Documentation on the docs\n\nWe use\n[MyST](https://myst-parser.readthedocs.io/en/latest/sphinx/intro.html)\nto generate Sphinx doc output from Markdown input.\n\n## Useful tips and tricks:\n\n### Linking internally between sections in the docs\n\nFor linking within the sourmash docs, you should use the\n[auto-generated header anchors](https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#auto-generated-header-anchors)\nprovided by MyST.\n\nYou can generate a list of these for a given document with:\n```\nmyst-anchors -l 3 command-line.md\n```\n"
  },
  {
    "path": "doc/_static/custom.css",
    "content": "div.sphinxsidebar ul {\n    list-style-type: disc;\n    list-style: disc;\n    margin-left: 10px;\n}\n\ndiv.sphinxsidebar ul li.toctree-l1 > a {\n    font-size: 100%;\n}\n\n"
  },
  {
    "path": "doc/_static/ecoli-cmp.Rmd",
    "content": "---\ntitle: \"Working with matrix output by sourmash compare\"\noutput: html_document\n---\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n```\n\n### Load a comparison matrix into R\n\n\n```{r chunk1}\n\nsourmash_comp_matrix <- read.csv(\"ecoli.cmp.csv\")\n\n# Label the rows\nrownames(sourmash_comp_matrix) <- colnames(sourmash_comp_matrix)\n\n# Transform for plotting\nsourmash_comp_matrix <- as.matrix(sourmash_comp_matrix)\n\n```\n\n### Make an MDS plot\n\n```{r mds}\nfit <- dist(sourmash_comp_matrix)\nfit <- cmdscale(fit)\nx <- fit[, 1]\ny <- fit[, 2]\nplot(fit[ , 1], fit[ , 2], xlab = \"Dimension 1\", ylab = \"Dimension 2\")\n```\n\n### Make a tSNE plot\n\n```{r tSNE}\nlibrary(Rtsne)\ntsne_model <- Rtsne(sourmash_comp_matrix, check_duplicates=FALSE, pca=TRUE, perplexity=5, theta=0.5, dims=2)\nd_tsne = as.data.frame(tsne_model$Y) \nplot(d_tsne$V1, d_tsne$V2)\n```\n\n### Make an unclustered heatmap\n\n```{r heatmap}\nheatmap(sourmash_comp_matrix, Colv=F, scale='none')\n```\n\n### Make a clustered heatmap\n\n```{r clustered-heatmap}\nhc.rows <- hclust(dist(sourmash_comp_matrix))\nhc.cols <- hclust(dist(t(sourmash_comp_matrix)))\nheatmap(sourmash_comp_matrix[cutree(hc.rows,k=2)==1,], Colv=as.dendrogram(hc.cols), scale='none')\n```\n"
  },
  {
    "path": "doc/_static/ecoli-cmp.html",
    "content": "<!DOCTYPE html>\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n\n\n\n\n<title>Working with matrix output by sourmash compare</title>\n\n<script src=\"data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo=\"></script>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link href=\"data:text/css;charset=utf-8,html%7Bfont%2Dfamily%3Asans%2Dserif%3B%2Dwebkit%2Dtext%2Dsize%2Dadjust%3A100%25%3B%2Dms%2Dtext%2Dsize%2Dadjust%3A100%25%7Dbody%7Bmargin%3A0%7Darticle%2Caside%2Cdetails%2Cfigcaption%2Cfigure%2Cfooter%2Cheader%2Chgroup%2Cmain%2Cmenu%2Cnav%2Csection%2Csummary%7Bdisplay%3Ablock%7Daudio%2Ccanvas%2Cprogress%2Cvideo%7Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Abaseline%7Daudio%3Anot%28%5Bcontrols%5D%29%7Bdisplay%3Anone%3Bheight%3A0%7D%5Bhidden%5D%2Ctemplate%7Bdisplay%3Anone%7Da%7Bbackground%2Dcolor%3Atransparent%7Da%3Aactive%2Ca%3Ahover%7Boutline%3A0%7Dabbr%5Btitle%5D%7Bborder%2Dbottom%3A1px%20dotted%7Db%2Cstrong%7Bfont%2Dweight%3A700%7Ddfn%7Bfont%2Dstyle%3Aitalic%7Dh1%7Bmargin%3A%2E67em%200%3Bfont%2Dsize%3A2em%7Dmark%7Bcolor%3A%23000%3Bbackground%3A%23ff0%7Dsmall%7Bfont%2Dsize%3A80%25%7Dsub%2Csup%7Bposition%3Arelative%3Bfont%2Dsize%3A75%25%3Bline%2Dheight%3A0%3Bvertical%2Dalign%3Abaseline%7Dsup%7Btop%3A%2D%2E5em%7Dsub%7Bbottom%3A%2D%2E25em%7Dimg%7Bborder%3A0%7Dsvg%3Anot%28%3Aroot%29%7Boverflow%3Ahidden%7Dfigure%7Bmargin%3A1em%2040px%7Dhr%7Bheight%3A0%3B%2Dwebkit%2Dbox%2Dsizing%3Acontent%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Acontent%2Dbox%3Bbox%2Dsizing%3Acontent%2Dbox%7Dpre%7Boverflow%3Aauto%7Dcode%2Ckbd%2Cpre%2Csamp%7Bfont%2Dfamily%3Amonospace%2Cmonospace%3Bfont%2Dsize%3A1em%7Dbutton%2Cinput%2Coptgroup%2Cselect%2Ctextarea%7Bmargin%3A0%3Bfont%3Ainherit%3Bcolor%3Ainherit%7Dbutton%7Boverflow%3Avisible%7Dbutton%2Cselect%7Btext%2Dtransform%3Anone%7Dbutton%2Chtml%20input%5Btype%3Dbutton%5D%2Cinput%5Btype%3Dreset%5D%2Cinput%5Btype%3Dsubmit%5D%7B%2Dwebkit%2Dappearance%3Abutton%3Bcursor%3Apointer%7Dbutton%5Bdisabled%5D%2Chtml%20input%5Bdisabled%5D%7Bcursor%3Adefault%7Dbutton%3A%3A%2Dmoz%2Dfocus%2Dinner%2Cinput%3A%3A%2Dmoz%2Dfocus%2Dinner%7Bpadding%3A0%3Bborder%3A0%7Dinput%7Bline%2Dheight%3Anormal%7Dinput%5Btype%3Dcheckbox%5D%2Cinput%5Btype%3Dradio%5D%7B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dsizing%3Aborder%2Dbox%3Bpadding%3A0%7Dinput%5Btype%3Dnumber%5D%3A%3A%2Dwebkit%2Dinner%2Dspin%2Dbutton%2Cinput%5Btype%3Dnumber%5D%3A%3A%2Dwebkit%2Douter%2Dspin%2Dbutton%7Bheight%3Aauto%7Dinput%5Btype%3Dsearch%5D%7B%2Dwebkit%2Dbox%2Dsizing%3Acontent%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Acontent%2Dbox%3Bbox%2Dsizing%3Acontent%2Dbox%3B%2Dwebkit%2Dappearance%3Atextfield%7Dinput%5Btype%3Dsearch%5D%3A%3A%2Dwebkit%2Dsearch%2Dcancel%2Dbutton%2Cinput%5Btype%3Dsearch%5D%3A%3A%2Dwebkit%2Dsearch%2Ddecoration%7B%2Dwebkit%2Dappearance%3Anone%7Dfieldset%7Bpadding%3A%2E35em%20%2E625em%20%2E75em%3Bmargin%3A0%202px%3Bborder%3A1px%20solid%20silver%7Dlegend%7Bpadding%3A0%3Bborder%3A0%7Dtextarea%7Boverflow%3Aauto%7Doptgroup%7Bfont%2Dweight%3A700%7Dtable%7Bborder%2Dspacing%3A0%3Bborder%2Dcollapse%3Acollapse%7Dtd%2Cth%7Bpadding%3A0%7D%40media%20print%7B%2A%2C%3Aafter%2C%3Abefore%7Bcolor%3A%23000%21important%3Btext%2Dshadow%3Anone%21important%3Bbackground%3A0%200%21important%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%21important%3Bbox%2Dshadow%3Anone%21important%7Da%2Ca%3Avisited%7Btext%2Ddecoration%3Aunderline%7Da%5Bhref%5D%3Aafter%7Bcontent%3A%22%20%28%22%20attr%28href%29%20%22%29%22%7Dabbr%5Btitle%5D%3Aafter%7Bcontent%3A%22%20%28%22%20attr%28title%29%20%22%29%22%7Da%5Bhref%5E%3D%22javascript%3A%22%5D%3Aafter%2Ca%5Bhref%5E%3D%22%23%22%5D%3Aafter%7Bcontent%3A%22%22%7Dblockquote%2Cpre%7Bborder%3A1px%20solid%20%23999%3Bpage%2Dbreak%2Dinside%3Aavoid%7Dthead%7Bdisplay%3Atable%2Dheader%2Dgroup%7Dimg%2Ctr%7Bpage%2Dbreak%2Dinside%3Aavoid%7Dimg%7Bmax%2Dwidth%3A100%25%21important%7Dh2%2Ch3%2Cp%7Borphans%3A3%3Bwidows%3A3%7Dh2%2Ch3%7Bpage%2Dbreak%2Dafter%3Aavoid%7D%2Enavbar%7Bdisplay%3Anone%7D%2Ebtn%3E%2Ecaret%2C%2Edropup%3E%2Ebtn%3E%2Ecaret%7Bborder%2Dtop%2Dcolor%3A%23000%21important%7D%2Elabel%7Bborder%3A1px%20solid%20%23000%7D%2Etable%7Bborder%2Dcollapse%3Acollapse%21important%7D%2Etable%20td%2C%2Etable%20th%7Bbackground%2Dcolor%3A%23fff%21important%7D%2Etable%2Dbordered%20td%2C%2Etable%2Dbordered%20th%7Bborder%3A1px%20solid%20%23ddd%21important%7D%7D%40font%2Dface%7Bfont%2Dfamily%3A%27Glyphicons%20Halflings%27%3Bsrc%3Aurl%28data%3Aapplication%2Fvnd%2Ems%2Dfontobject%3Bbase64%2Cn04AAEFNAAACAAIABAAAAAAABQAAAAAAAAABAJABAAAEAExQAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAJxJ%2FLAAAAAAAAAAAAAAAAAAAAAAAACgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzAAAADgBSAGUAZwB1AGwAYQByAAAAeABWAGUAcgBzAGkAbwBuACAAMQAuADAAMAA5ADsAUABTACAAMAAwADEALgAwADAAOQA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOAAzADIAOQAAADgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzACAAUgBlAGcAdQBsAGEAcgAAAAAAQlNHUAAAAAAAAAAAAAAAAAAAAAADAKncAE0TAE0ZAEbuFM3pjM%2FSEdmjKHUbyow8ATBE40IvWA3vTu8LiABDQ%2BpexwUMcm1SMnNryctQSiI1K5ZnbOlXKmnVV5YvRe6RnNMFNCOs1KNVpn6yZhCJkRtVRNzEufeIq7HgSrcx4S8h%2Fv4vnrrKc6oCNxmSk2uKlZQHBii6iKFoH0746ThvkO1kJHlxjrkxs%2BLWORaDQBEtiYJIR5IB9Bi1UyL4Rmr0BNigNkMzlKQmnofBHviqVzUxwdMb3NdCn69hy%2BpRYVKGVS%2F1tnsqv4LL7wCCPZZAZPT4aCShHjHJVNuXbmMrY5LeQaGnvAkXlVrJgKRAUdFjrWEah9XebPeQMj7KS7DIBAFt8ycgC5PLGUOHSE3ErGZCiViNLL5ZARfywnCoZaKQCu6NuFX42AEeKtKUGnr%2FCm2Cy8tpFhBPMW5Fxi4Qm4TkDWh4IWFDClhU2hRWosUWqcKLlgyXB%2BlSHaWaHiWlBAR8SeSgSPCQxdVQgzUixWKSTrIQEbU94viDctkvX%2BVSjJuUmV8L4CXShI11esnp0pjWNZIyxKHS4wVQ2ime1P4RnhvGw0aDN1OLAXGERsB7buFpFGGBAre4QEQR0HOIO5oYH305G%2BKspT%2FFupEGGafCCwxSe6ZUa%2B073rXHnNdVXE6eWvibUS27XtRzkH838mYLMBmYysZTM0EM3A1fbpCBYFccN1B%2FEnCYu%2FTgCGmr7bMh8GfYL%2BBfcLvB0gRagC09w9elfldaIy%2FhNCBLRgBgtCC7jAF63wLSMAfbfAlEggYU0bUA7ACCJmTDpEmJtI78w4%2FBO7dN7JR7J7ZvbYaUbaILSQsRBiF3HGk5fEg6p9unwLvn98r%2BvnsV%2B372uf1xBLq4qU%2F45fTuqaAP%2BpssmCCCTF0mhEow8ZXZOS8D7Q85JsxZ%2BAzok7B7O%2Ff6J8AzYBySZQB%2FQHYUSA%2BEeQhEWiS6AIQzgcsDiER4MjgMBAWDV4AgQ3g1eBgIdweCQmCjJEMkJ%2BPKRWyFHHmg1Wi%2F6xzUgA0LREoKJChwnQa9B%2B5RQZRB3IlBlkAnxyQNaANwHMowzlYSMCBgnbpzvqpl0iTJNCQidDI9ZrSYNIRBhHtUa5YHMHxyGEik9hDE0AKj72AbTCaxtHPUaKZdAZSnQTyjGqGLsmBStCejApUhg4uBMU6mATujEl%2BKdDPbI6Ag4vLr%2BhjY6lbjBeoLKnZl0UZgRX8gTySOeynZVz1wOq7e1hFGYIq%2BMhrGxDLak0PrwYzSXtcuyhXEhwOYofiW%2BEcI%2Fjw8P6IY6ed%2BetAbuqKp5QIapT77LnAe505lMuqL79a0ut4rWexzFttsOsLDy7zvtQzcq3U1qabe7tB0wHWVXji%2BzDbo8x8HyIRUbXnwUcklFv51fvTymiV%2BMXLSmGH9d9%2BaXpD5X6lao41anWGig7IwIdnoBY2ht%2FpO9mClLo4NdXHAsefqWUKlXJkbqPOFhMoR4aiA1BXqhRNbB2Xwi%2B7u%2FjpAoOpKJ0UX24EsrzMfHXViakCNcKjBxuQX8BO0ZqjJ3xXzf%2B61t2VXOSgJ8xu65QKgtN6FibPmPYsXbJRHHqbgATcSZxBqGiDiU4NNNsYBsKD0MIP%2FOfKnlk%2FLkaid%2FO2NbKeuQrwOB2Gq3YHyr6ALgzym5wIBnsdC1ZkoBFZSQXChZvlesPqvK2c5oHHT3Q65jYpNxnQcGF0EHbvYqoFw60WNlXIHQF2HQB7zD6lWjZ9rVqUKBXUT6hrkZOle0RFYII0V5ZYGl1JAP0Ud1fZZMvSomBzJ710j4Me8mjQDwEre5Uv2wQfk1ifDwb5ksuJQQ3xt423lbuQjvoIQByQrNDh1JxGFkOdlJvu%2FgFtuW0wR4cgd%2BZKesSV7QkNE2kw6AV4hoIuC02LGmTomyf8PiO6CZzOTLTPQ%2BHW06H%2Btx%2BbQ8LmDYg1pTFrp2oJXgkZTyeRJZM0C8aE2LpFrNVDuhARsN543%2FFV6klQ6Tv1OoZGXLv0igKrl%2FCmJxRmX7JJbJ998VSIPQRyDBICzl4JJlYHbdql30NvYcOuZ7a10uWRrgoieOdgIm4rlq6vNOQBuqESLbXG5lzdJGHw2m0sDYmODXbYGTfSTGRKpssTO95fothJCjUGQgEL4yKoGAF%2F0SrpUDNn8CBgBcSDQByAeNkCXp4S4Ro2Xh4OeaGRgR66PVOsU8bc6TR5%2FxTcn4IVMLOkXSWiXxkZQCbvKfmoAvQaKjO3EDKwkwqHChCDEM5loQRPd5ACBki1TjF772oaQhQbQ5C0lcWXPFOzrfsDGUXGrpxasbG4iab6eByaQkQfm0VFlP0ZsDkvvqCL6QXMUwCjdMx1ZOyKhTJ7a1GWAdOUcJ8RSejxNVyGs31OKMyRyBVoZFjqIkmKlLQ5eHMeEL4MkUf23cQ%2F1SgRCJ1dk4UdBT7OoyuNgLs0oCd8RnrEIb6QdMxT2QjD4zMrJkfgx5aDMcA4orsTtKCqWb%2FVeyceqa5OGSmB28YwH4rFbkQaLoUN8OQQYnD3w2eXpI4ScQfbCUZiJ4yMOIKLyyTc7BQ4uXUw6Ee6%2FxM%2B4Y67ngNBknxIPwuppgIhFcwJyr6EIj%2BLzNj%2FmfR2vhhRlx0BILZoAYruF0caWQ7YxO66UmeguDREAFHYuC7HJviRgVO6ruJH59h%2FC%2FPkgSle8xNzZJULLWq9JMDTE2fjGE146a1Us6PZDGYle6ldWRqn%2FpdpgHKNGrGIdkRK%2BKPETT9nKT6kLyDI8xd9A1FgWmXWRAIHwZ37WyZHOVyCadJEmMVz0MadMjDrPho%2BEIochkVC2xgGiwwsQ6DMv2P7UXqT4x7CdcYGId2BJQQa85EQKmCmwcRejQ9Bm4oATENFPkxPXILHpMPUyWTI5rjNOsIlmEeMbcOCEqInpXACYQ9DDxmFo9vcmsDblcMtg4tqBerNngkIKaFJmrQAPnq1dEzsMXcwjcHdfdCibcAxxA%2Bq%2Fj9m3LM%2FO7WJka4tSidVCjsvo2lQ%2F2ewyoYyXwAYyr2PlRoR5MpgVmSUIrM3PQxXPbgjBOaDQFIyFMJvx3Pc5RSYj12ySVF9fwFPQu2e2KWVoL9q3Ayv3IzpGHUdvdPdrNUdicjsTQ2ISy7QU3DrEytIjvbzJnAkmANXjAFERA0MUoPF3%2F5KFmW14bBNOhwircYgMqoDpUMcDtCmBE82QM2YtdjVLB4kBuKho%2FbcwQdeboqfQartuU3CsCf%2BcXkgYAqp%2F0Ee3RorAZt0AvvOCSI4JICIlGlsV0bsSid%2FNIEALAAzb6HAgyWHBps6xAOwkJIGcB82CxRQq4sJf3FzA70A%2BTRqcqjEMETCoez3mkPcpnoALs0ugJY8kQwrC%2BJE5ik3w9rzrvDRjAQnqgEVvdGrNwlanR0SOKWzxOJOvLJhcd8Cl4AshACUkv9czdMkJCVQSQhp6kp7StAlpVRpK0t0SW6LHeBJnE2QchB5Ccu8kxRghZXGIgZIiSj7gEKMJDClcnX6hgoqJMwiQDigIXg3ioFLCgDgjPtYHYpsF5EiA4kcnN18MZtOrY866dEQAb0FB34OGKHGZQjwW%2FWDHA60cYFaI%2FPjpzquUqdaYGcIq%2BmLez3WLFFCtNBN2QJcrlcoELgiPku5R5dSlJFaCEqEZle1AQzAKC%2B1SotMcBNyQUFuRHRF6OlimSBgjZeTBCwLyc6A%2BP%2FoFRchXTz5ADknYJHxzrJ5pGuIKRQISU6WyKTBBjD8WozmVYWIsto1AS5rxzKlvJu4E%2FvwOiKxRtCWsDM%2BeTHUrmwrCK5BIfMzGkD%2B0Fk5LzBs0jMYXktNDblB06LMNJ09U8pzSLmo14MS0OMjcdrZ31pyQqxJJpRImlSvfYAK8inkYU52QY2FPEVsjoWewpwhRp5yAuNpkqhdb7ku9Seefl2D0B8SMTFD90xi4CSOwwZy9IKkpMtI3FmFUg3%2FkFutpQGNc3pCR7gvC4sgwbupDu3DyEN%2BW6YGLNM21jpB49irxy9BSlHrVDlnihGKHwPrbVFtc%2Bh1rVQKZduxIyojccZIIcOCmhEnC7UkY68WXKQgLi2JCDQkQWJRQuk60hZp0D3rtCTINSeY9Ej2kIKYfGxwOs4j9qMM7fYZiipzgcf7TamnehqdhsiMiCawXnz4xAbyCkLAx5EGbo3Ax1u3dUIKnTxIaxwQTHehPl3V491H0%2BbC5zgpGz7Io%2BmjdhKlPJ01EeMpM7UsRJMi1nGjmJg35i6bQBAAxjO%2FENJubU2mg3ONySEoWklCwdABETcs7ck3jgiuU9pcKKpbgn%2B3YlzV1FzIkB6pmEDOSSyDfPPlQskznctFji0kpgZjW5RZe6x9kYT4KJcXg0bNiCyif%2BpZACCyRMmYsfiKmN9tSO65F0R2OO6ytlEhY5Sj6uRKfFxw0ijJaAx%2Fk3QgnAFSq27%2F2i4GEBA%2BUvTJKK%2F9eISNvG46Em5RZfjTYLdeD8kdXHyrwId%2FDQZUaMCY4gGbke2C8vfjgV%2FY9kkRQOJIn%2FxM9INZSpiBnqX0Q9GlQPpPKAyO5y%2BW5NMPSRdBCUlmuxl40ZfMCnf2Cp044uI9WLFtCi4YVxKjuRCOBWIb4XbIsGdbo4qtMQnNOQz4XDSui7W%2FN6l54qOynCqD3DpWQ%2BmpD7C40D8BZEWGJX3tlAaZBMj1yjvDYKwCJBa201u6nBKE5UE%2B7QSEhCwrXfbRZylAaAkplhBWX50dumrElePyNMRYUrC99UmcSSNgImhFhDI4BXjMtiqkgizUGCrZ8iwFxU6fQ8GEHCFdLewwxYWxgScAYMdMLmcZR6b7rZl95eQVDGVoUKcRMM1ixXQtXNkBETZkVVPg8LoSrdetHzkuM7DjZRHP02tCxA1fmkXKF3VzfN1pc1cv%2F8lbTIkkYpqKM9VOhp65ktYk%2BQ46myFWBapDfyWUCnsnI00QTBQmuFjMZTcd0V2NQ768Fhpby04k2IzNR1wKabuGJqYWwSly6ocMFGTeeI%2BejsWDYgEvr66QgqdcIbFYDNgsm0x9UHY6SCd5%2B7tpsLpKdvhahIDyYmEJQCqMqtCF6UlrE5GXRmbu%2Bvtm3BFSxI6ND6UxIE7GsGMgWqghXxSnaRJuGFveTcK5ZVSPJyjUxe1dKgI6kNF7EZhIZs8y8FVqwEfbM0Xk2ltORVDKZZM40SD3qQoQe0orJEKwPfZwm3YPqwixhUMOndis6MhbmfvLBKjC8sKKIZKbJk8L11oNkCQzCgvjhyyEiQSuJcgCQSG4Mocfgc0Hkwcjal1UNgP0CBPikYqBIk9tONv4kLtBswH07vUCjEaHiFGlLf8MgXKzSgjp2HolRRccAOh0ILHz9qlGgIFkwAnzHJRjWFhlA7ROwINyB5HFj59PRZHFor6voq7l23EPNRwdWhgawqbivLSjRA4htEYUFkjESu67icTg5S0aW1sOkCiIysfJ9UnIWevOOLGpepcBxy1wEhd2WI3AZg7sr9WBmHWyasxMcvY%2FiOmsLtHSWNUWEGk9hScMPShasUA1AcHOtRZlqMeQ0OzYS9vQvYUjOLrzP07BUAFikcJNMi7gIxEw4pL1G54TcmmmoAQ5s7TGWErJZ2Io4yQ0ljRYhL8H5e62oDtLF8aDpnIvZ5R3GWJyAugdiiJW9hQAVTsnCBHhwu7rkBlBX6r3b7ejEY0k5GGeyKv66v%2B6dg7mcJTrWHbtMywbedYqCQ0FPwoytmSWsL8WTtChZCKKzEF7vP6De4x2BJkkniMgSdWhbeBSLtJZR9CTHetK1xb34AYIJ37OegYIoPVbXgJ%2FqDQK%2BbfCtxQRVKQu77WzOoM6SGL7MaZwCGJVk46aImai9fmam%2BWpHG%2B0BtQPWUgZ7RIAlPq6lkECUhZQ2gqWkMYKcYMYaIc4gYCDFHYa2d1nzp3%2BJ1eCBay8IYZ0wQRKGAqvCuZ%2FUgbQPyllosq%2BXtfKIZOzmeJqRazpmmoP%2F76YfkjzV2NlXTDSBYB04SVlNQsFTbGPk1t%2FI4Jktu0XSgifO2ozFOiwd%2F0SssJDn0dn4xqk4GDTTKX73%2FwQyBLdqgJ%2BWx6AQaba3BA9CKEzjtQYIfAsiYamapq80LAamYjinlKXUkxdpIDk0puXUEYzSalfRibAeDAKpNiqQ0FTwoxuGYzRnisyTotdVTclis1LHRQCy%2FqqL8oUaQzWRxilq5Mi0IJGtMY02cGLD69vGjkj3p6pGePKI8bkBv5evq8SjjyU04vJR2cQXQwSJyoinDsUJHCQ50jrFTT7yRdbdYQMB3MYCb6uBzJ9ewhXYPAIZSXfeEQBZZ3GPN3Nbhh%2FwkvAJLXnQMdi5NYYZ5GHE400GS5rXkOZSQsdZgIbzRnF9ueLnsfQ47wHAsirITnTlkCcuWWIUhJSbpM3wWhXNHvt2xUsKKMpdBSbJnBMcihkoDqAd1Zml%2FR4yrzow1Q2A5G%2Bkzo%2FRhRxQS2lCSDRV8LlYLBOOoo1bF4jwJAwKMK1tWLHlu9i0j4Ig8qVm6wE1DxXwAwQwsaBWUg2pOOol2dHxyt6npwJEdLDDVYyRc2D0HbcbLUJQj8gPevQBUBOUHXPrsAPBERICpnYESeu2OHotpXQxRGlCCtLdIsu23MhZVEoJg8Qumj%2FUMMc34IBqTKLDTp76WzL%2FdMjCxK7MjhiGjeYAC%2Fkj%2FjY%2FRde7hpSM1xChrog6yZ7OWTuD56xBJnGFE%2BpT2ElSyCnJcwVzCjkqeNLfMEJqKW0G7OFIp0G%2B9mh50I9o8k1tpCY0xYqFNIALgIfc2me4n1bmJnRZ89oepgLPT0NTMLNZsvSCZAc3TXaNB07vail36%2FdBySis4m9%2FDR8izaLJW6bWCkVgm5T%2Bius3ZXq4xI%2BGnbveLbdRwF2mNtsrE0JjYc1AXknCOrLSu7Te%2Fr4dPYMCl5qtiHNTn%2BTPbh1jCBHH%2BdMJNhwNgs3nT%2BOhQoQ0vYif56BMG6WowAcHR3DjQolxLzyVekHj00PBAaW7IIAF1EF%2BuRIWyXjQMAs2chdpaKPNaB%2BkSezYt0%2BCA04sOg5vx8Fr7Ofa9sUv87h7SLAUFSzbetCCZ9pmyLt6l6%2FTzoA1%2FZBG9bIUVHLAbi%2FkdBFgYGyGwRQGBpkqCEg2ah9UD6EedEcEL3j4y0BQQCiExEnocA3SZboh%2Bepgd3YsOkHskZwPuQ5OoyA0fTA5AXrHcUOQF%2BzkJHIA7PwCDk1gGVmGUZSSoPhNf%2BTklauz98QofOlCIQ%2FtCD4dosHYPqtPCXB3agggQQIqQJsSkB%2Bqn0rkQ1toJjON%2FOtCIB9RYv3PqRA4C4U68ZMlZn6BdgEvi2ziU%2BTQ6NIw3ej%2BAtDwMGEZk7e2IjxUWKdAxyaw9OCwSmeADTPPleyk6UhGDNXQb%2B%2BW6Uk4q6F7%2Frg6WVTo82IoCxSIsFDrav4EPHphD3u4hR53WKVvYZUwNCCeM4PMBWzK%2BEfIthZOkuAwPo5C5jgoZgn6dUdvx5rIDmd58cXXdKNfw3l%2BwM2UjgrDJeQHhbD7HW2QDoZMCujgIUkk5Fg8VCsdyjOtnGRx8wgKRPZN5dR0zPUyfGZFVihbFRniXZFOZGKPnEQzU3AnD1KfR6weHW2XS6KbPJxUkOTZsAB9vTVp3Le1F8q5l%2BDMcLiIq78jxAImD2pGFw0VHfRatScGlK6SMu8leTmhUSMy8Uhdd6xBiH3Gdman4tjQGLboJfqz6fL2WKHTmrfsKZRYX6BTDjDldKMosaSTLdQS7oDisJNqAUhw1PfTlnacCO8vl8706Km1FROgLDmudzxg%2BEWTiArtHgLsRrAXYWdB0NmToNCJdKm0KWycZQqb%2BMw76Qy29iQ5up%2FX7oyw8QZ75kP5F6iJAJz6KCmqxz8fEa%2FxnsMYcIO%2FvEkGRuMckhr4rIeLrKaXnmIzlNLxbFspOphkcnJdnz%2FChp%2FVlpj2P7jJQmQRwGnltkTV5dbF9fE3%2FfxoSqTROgq9wFUlbuYzYcasE0ouzBo%2BdDCDzxKAfhbAZYxQiHrLzV2iVexnDX%2FQnT1fsT%2Fxuhu1ui5qIytgbGmRoQkeQooO8eJNNZsf0iALur8QxZFH0nCMnjerYQqG1pIfjyVZWxhVRznmmfLG00BcBWJE6hzQWRyFknuJnXuk8A5FRDCulwrWASSNoBtR%2BCtGdkPwYN2o7DOw%2FVGlCZPusRBFXODQdUM5zeHDIVuAJBLqbO%2Ff9Qua%2BpDqEPk230Sob9lEZ8BHiCorjVghuI0lI4JDgHGRDD%2FprQ84B1pVGkIpVUAHCG%2Biz3Bn3qm2AVrYcYWhock4jso5%2BJ7HfHVj4WMIQdGctq3psBCVVzupQOEioBGA2Bk%2BUILT7%2BVoX5mdxxA5fS42gISQVi%2FHTzrgMxu0fY6hE1ocUwwbsbWcezrY2n6S8%2F6cxXkOH4prpmPuFoikTzY7T85C4T2XYlbxLglSv2uLCgFv8Quk%2FwdesUdWPeHYIH0R729JIisN9Apdd4eB10aqwXrPt%2BSu9mA8k8n1sjMwnfsfF2j3jMUzXepSHmZ%2FBfqXvzgUNQQWOXO8YEuFBh4QTYCkOAPxywpYu1VxiDyJmKVcmJPGWk%2Fgc3Pov02StyYDahwmzw3E1gYC9wkupyWfDqDSUMpCTH5e5N8B%2F%2FlHiMuIkTNw4USHrJU67bjXGqNav6PBuQSoqTxc8avHoGmvqNtXzIaoyMIQIiiUHIM64cXieouplhNYln7qgc4wBVAYR104kO%2BCvKqsg4yIUlFNThVUAKZxZt1XA34h3TCUUiXVkZ0w8Hh2R0Z5L0b4LZvPd%2Fp1gi%2F07h8qfwHrByuSxglc9cI4QIg2oqvC%2Fqm0i7tjPLTgDhoWTAKDO2ONW5oe%2B%2FeKB9vZB8K6C25yCZ9RFVMnb6NRdRjyVK57CHHSkJBfnM2%2Fj4ODUwRkqrtBBCrDsDpt8jhZdXoy%2F1BCqw3sSGhgGGy0a5Jw6BP%2FTExoCmNFYjZl248A0osgPyGEmRA%2BfAsqPVaNAfytu0vuQJ7rk3J4kTDTR2AlCHJ5cls26opZM4w3jMULh2YXKpcqGBtuleAlOZnaZGbD6DHzMd6i2oFeJ8z9XYmalg1Szd%2FocZDc1C7Y6vcALJz2lYnTXiWEr2wawtoR4g3jvWUU2Ngjd1cewtFzEvM1NiHZPeLlIXFbBPawxNgMwwAlyNSuGF3zizVeOoC9bag1qRAQKQE%2FEZBWC2J8mnXAN2aTBboZ7HewnObE8CwROudZHmUM5oZ%2FUgd%2FJZQK8lvAm43uDRAbyW8gZ%2BZGq0EVerVGUKUSm%2FIdn8AQHdR4m7bue88WBwft9mSCeMOt1ncBwziOmJYI2ZR7ewNMPiCugmSsE4EyQ%2BQATJG6qORMGd4snEzc6B4shPIo4G1T7PgSm8PY5eUkPdF8JZ0VBtadbHXoJgnEhZQaODPj2gpODKJY5Yp4DOsLBFxWbvXN755KWylJm%2BoOd4zEL9Hpubuy2gyyfxh8oEfFutnYWdfB8PdESLWYvSqbElP9qo3u6KTmkhoacDauMNNjj0oy40DFV7Ql0aZj77xfGl7TJNHnIwgqOkenruYYNo6h724%2BzUQ7%2BvkCpZB%2BpGA562hYQiDxHVWOq0oDQl%2FQsoiY%2BcuI7iWq%2FZIBtHcXJ7kks%2Bh2fCNUPA82BzjnqktNts%2BRLdk1VSu%2BtqEn7QZCCsvEqk6FkfiOYkrsw092J8jsfIuEKypNjLxrKA9kiA19mxBD2suxQKCzwXGws7kEJvlhUiV9tArLIdZW0IORcxEzdzKmjtFhsjKy%2F44XYXdI5noQoRcvjZ1RMPACRqYg2V1%2BOwOepcOknRLLFdYgTkT5UApt%2FJhLM3jeFYprZV%2BZow2g8fP%2BU68hkKFWJj2yBbKqsrp25xkZX1DAjUw52IMYWaOhab8Kp05VrdNftqwRrymWF4OQSjbdfzmRZirK8FMJELEgER2PHjEAN9pGfLhCUiTJFbd5LBkOBMaxLr%2FA1SY9dXFz4RjzoU9ExfJCmx%2FI9FKEGT3n2cmzl2X42L3Jh%2BAbQq6sA%2BSs1kitoa4TAYgKHaoybHUDJ51oETdeI%2F9ThSmjWGkyLi5QAGWhL0BG1UsTyRGRJOldKBrYJeB8ljLJHfATWTEQBXBDnQexOHTB%2BUn44zExFE4vLytcu5NwpWrUxO%2F0ZICUGM7hGABXym0V6ZvDST0E370St9MIWQOTWngeoQHUTdCJUP04spMBMS8LSker9cReVQkULFDIZDFPrhTzBl6sed9wcZQTbL%2BBDqMyaN3RJPh%2Fanbx%2BIv%2BqgQdAa3M9Z5JmvYlh4qop%2BHo1F1W5gbOE9YKLgAnWytXElU4G8GtW47lhgFE6gaSs%2Bgs37sFvi0PPVvA5dnCBgILTwoKd%2F%2BDoL9F6inlM7H4rOTzD79KJgKlZO%2FZgt22UsKhrAaXU5ZcLrAglTVKJEmNJvORGN1vqrcfSMizfpsgbIe9zno%2BgBoKVXgIL%2FVI8dB1O5o%2FR3Suez%2FgD7M781ShjKpIIORM%2FnxG%2BjjhhgPwsn2IoXsPGPqYHXA63zJ07M2GPEykQwJBYLK808qYxuIew4frk52nhCsnCYmXiR6CuapvE1IwRB4%2FQftDbEn%2BAucIr1oxrLabRj9q4ae0%2BfXkHnteAJwXRbVkR0mctVSwEbqhJiMSZUp9DNbEDMmjX22m3ABpkrPQQTP3S1sib5pD2VRKRd%2BeNAjLYyT0hGrdjWJZy24OYXRoWQAIhGBZRxuBFMjjZQhpgrWo8SiFYbojcHO8V5DyscJpLTHyx9Fimassyo5U6WNtquUMYgccaHY5amgR3PQzq3ToNM5ABnoB9kuxsebqmYZm0R9qxJbFXCQ1UPyFIbxoUraTJFDpCk0Wk9GaYJKz%2F6oHwEP0Q14lMtlddQsOAU9zlYdMVHiT7RQP3XCmWYDcHCGbVRHGnHuwzScA0BaSBOGkz3lM8CArjrBsyEoV6Ys4qgDK3ykQQPZ3hCRGNXQTNNXbEb6tDiTDLKOyMzRhCFT%2BmAUmiYbV3YQVqFVp9dorv%2BTsLeCykS2b5yyu8AV7IS9cxcL8z4Kfwp%2BxJyYLv1OsxQCZwTB4a8BZ%2F5EdxTBJthApqyfd9u3ifr%2FWILTqq5VqgwMT9SOxbSGWLQJUUWCVi4k9tho9nEsbUh7U6NUsLmkYFXOhZ0kmamaJLRNJzSj%2Fqn4Mso6zb6iLLBXoaZ6AqeWCjHQm2lztnejYYM2eubnpBdKVLORZhudH3JF1waBJKA9%2BW8EhMj3Kzf0L4vi4k6RoHh3Z5YgmSZmk6ns4fjScjAoL8GoOECgqgYEBYUGFVO4FUv4%2FYtowhEmTs0vrvlD%2FCrisnoBNDAcUi%2FteY7OctFlmARQzjOItrrlKuPO6E2Ox93L4O%2F4DcgV%2FdZ7qR3VBwVQxP1GCieA4RIpweYJ5FoYrHxqRBdJjnqbsikA2Ictbb8vE1GYIo9dacK0REgDX4smy6GAkxlH1yCGGsk%2BtgiDhNKuKu3yNrMdxafmKTF632F8Vx4BNK57GvlFisrkjN9WDAtjsWA0ENT2e2nETUb%2Fn7qwhvGnrHuf5bX6Vh%2Fn3xffU3PeHdR%2BFA92i6ufT3AlyAREoNDh6chiMWTvjKjHDeRhOa9YkOQRq1vQXEMppAQVwHCuIcV2g5rBn6GmZZpTR7vnSD6ZmhdSl176gqKTXu5E%2BYbfL0adwNtHP7dT7t7b46DVZIkzaRJOM%2BS6KcrzYVg%2BT3wSRFRQashjfU18NutrKa%2F7PXbtuJvpIjbgPeqd%2BpjmRw6YKpnANFSQcpzTZgpSNJ6J7uiagAbir%2F8tNXJ%2FOsOnRh6iuIexxrmkIneAgz8QoLmiaJ8sLQrELVK2yn3wOHp57BAZJhDZjTBzyoRAuuZ4eoxHruY1pSb7qq79cIeAdOwin4GdgMeIMHeG%2BFZWYaiUQQyC5b50zKjYw97dFjAeY2I4Bnl105Iku1y0lMA1ZHolLx19uZnRdILcXKlZGQx%2FGdEqSsMRU1BIrFqRcV1qQOOHyxOLXEGcbRtAEsuAC2V4K3p5mFJ22IDWaEkk9ttf5Izb2LkD1MnrSwztXmmD%2FQi%2FEmVEFBfiKGmftsPwVaIoZanlKndMZsIBOskFYpDOq3QUs9aSbAAtL5Dbokus2G4%2FasthNMK5UQKCOhU97oaOYNGsTah%2BjfCKsZnTRn5TbhFX8ghg8CBYt%2FBjeYYYUrtUZ5jVij%2Fop7V5SsbA4mYTOwZ46hqdpbB6Qvq3AS2HHNkC15pTDIcDNGsMPXaBidXYPHc6PJAkRh29Vx8KcgX46LoUQBhRM%2B3SW6Opll%2FwgxxsPgKJKzr5QCmwkUxNbeg6Wj34SUnEzOemSuvS2OetRCO8Tyy%2BQbSKVJcqkia%2BGvDefFwMOmgnD7h81TUtMn%2BmRpyJJ349HhAnoWFTejhpYTL9G8N2nVg1qkXBeoS9Nw2fB27t7trm7d%2FQK7Cr4uoCeOQ7%2F8JfKT77KiDzLImESHw%2F0wf73QeHu74hxv7uihi4fTX%2BXEwAyQG3264dwv17aJ5N335Vt9sdrAXhPOAv8JFvzqyYXwfx8WYJaef1gMl98JRFyl5Mv5Uo%2FoVH5ww5OzLFsiTPDns7fS6EURSSWd%2F92BxMYQ8sBaH%2Bj%2BwthQPdVgDGpTfi%2BJQIWMD8xKqULliRH01rTeyF8x8q%2FGBEEEBrAJMPf25UQwi0b8tmqRXY7kIvNkzrkvRWLnxoGYEJsz8u4oOyMp8cHyaybb1HdMCaLApUE%2B%2F7xLIZGP6H9xuSEXp1zLIdjk5nBaMuV%2FyTDRRP8Y2ww5RO6d2D94o%2B6ucWIqUAvgHIHXhZsmDhjVLczmZ3ca0Cb3PpKwt2UtHVQ0BgFJsqqTsnzZPlKahRUkEu4qmkJt%2Bkqdae76ViWe3STan69yaF9%2BfESD2lcQshLHWVu4ovItXxO69bqC5p1nZLvI8NdQB9s9UNaJGlQ5mG947ipdDA0eTIw%2FA1zEdjWquIsQXXGIVEH0thC5M%2BW9pZe7IhAVnPJkYCCXN5a32HjN6nsvokEqRS44tGIs7s2LVTvcrHAF%2BRVmI8L4HUYk4x%2B67AxSMJKqCg8zrGOgvK9kNMdDrNiUtSWuHFpC8%2Fp5qIQrEo%2FH%2B1l%2F0cAwQ2nKmpWxKcMIuHY44Y6DlkpO48tRuUGBWT0FyHwSKO72Ud%2BtJUfdaZ4CWNijzZtlRa8%2BCkmO%2FEwHYfPZFU%2FhzjFWH7vnzHRMo%2BaF9u8qHSAiEkA2HjoNQPEwHsDKOt6hOoK3Ce%2F%2B%2F9boMWDa44I6FrQhdgS7OnNaSzwxWKZMcyHi6LN4WC6sSj0qm2PSOGBTvDs%2FGWJS6SwEN%2FULwpb4LQo9fYjUfSXRwZkynUazlSpvX9e%2BG2zor8l%2BYaMxSEomDdLHGcD6YVQPegTaA74H8%2BV4WvJkFUrjMLGLlvSZQWvi8%2FQA7yzQ8GPno%2F%2F5SJHRP%2FOqKObPCo81s%2F%2B6WgLqykYpGAgQZhVDEBPXWgU%2FWzFZjKUhSFInufPRiMAUULC6T11yL45ZrRoB4DzOyJShKXaAJIBS9wzLYIoCEcJKQW8GVCx4fihqJ6mshBUXSw3wWVj3grrHQlGNGhIDNNzsxQ3M%2BGWn6ASobIWC%2BLbYOC6UpahVO13Zs2zOzZC8z7FmA05JhUGyBsF4tsG0drcggIFzgg%2Fkpf3%2BCnAXKiMgIE8Jk%2FMhpkc8DUJEUzDSnWlQFme3d0sHZDrg7LavtsEX3cHwjCYA17pMTfx8Ajw9hHscN67hyo%2BRJQ4458RmPywXykkVcW688oVUrQhahpPRvTWPnuI0B%2BSkQu7dCyvLRyFYlC1LG1gRCIvn3rwQeINzZQC2KXq31FaR9UmVV2QeGVqBHjmE%2BVMd3b1fhCynD0pQNhCG6%2FWCDbKPyE7NRQzL3BzQAJ0g09aUzcQA6mUp9iZFK6Sbp%2FYbHjo%2B%2B7%2FWj8S4YNa%2BZdqAw1hDrKWFXv9%2BzaXpf8ZTDSbiqsxnwN%2FCzK5tPkOr4tRh2kY3Bn9JtalbIOI4b3F7F1vPQMfoDcdxMS8CW9m%2FNCW%2FHILTUVWQIPiD0j1A6bo8vsv6P1hCESl2abrSJWDrq5sSzUpwoxaCU9FtJyYH4QFMxDBpkkBR6kn0LMPO%2B5EJ7Z6bCiRoPedRZ%2FP0SSdii7ZnPAtVwwHUidcdyspwncz5uq6vvm4IEDbJVLUFCn%2FLvIHfooUBTkFO130FC7CmmcrKdgDJcid9mvVzsDSibOoXtIf9k6ABle3PmIxejodc4aob0QKS432srrCMndbfD454q52V01G4q913mC5HOsTzWF4h2No1av1VbcUgWAqyoZl%2B11PoFYnNv2HwAODeNRkHj%2B8SF1fcvVBu6MrehHAZK1Gm69ICcTKizykHgGFx7QdowTVAsYEF2tVc0Z6wLryz2FI1sc5By2znJAAmINndoJiB4sfPdPrTC8RnkW7KRCwxC6YvXg5ahMlQuMpoCSXjOlBy0Kij%2BbsCYPbGp8BdCBiLmLSAkEQRaieWo1SYvZIKJGj9Ur%2FeWHjiB7SOVdqMAVmpBvfRiebsFjger7DC%2B8kRFGtNrTrnnGD2GAJb8rQCWkUPYHhwXsjNBSkE6lGWUj5QNhK0DMNM2l%2BkXRZ0KLZaGsFSIdQz%2FHXDxf3%2FTE30%2BDgBKWGWdxElyLccJfEpjsnszECNoDGZpdwdRgCixeg9L4EPhH%2BRptvRMVRaahu4cySjS3P5wxAUCPkmn%2BrhyASpmiTaiDeggaIxYBmtLZDDhiWIJaBgzfCsAGUF1Q1SFZYyXDt9skCaxJsxK2Ms65dmdp5WAZyxik%2FzbrTQk5KmgxCg%2Ff45L0jywebOWUYFJQAJia7XzCV0x89rpp%2Ff3AVWhSPyTanqmik2SkD8A3Ml4NhIGLAjBXtPShwKYfi2eXtrDuKLk4QlSyTw1ftXgwqA2jUuopDl%2B5tfUWZNwBpEPXghzbBggYCw%2Fdhy0ntds2yeHCDKkF%2FYxQjNIL%2FF%2F37jLPHCKBO9ibwYCmuxImIo0ijV2Wbg3kSN2psoe8IsABv3RNFaF9uMyCtCYtqcD%2BqNOhwMlfARQUdJ2tUX%2BMNJqOwIciWalZsmEjt07tfa8ma4cji9sqz%2BQ9hWfmMoKEbIHPOQORbhQRHIsrTYlnVTNvcq1imqmmPDdVDkJgRcTgB8Sb6epCQVmFZe%2BjGDiNJQLWnfx%2BdrTKYjm0G8yH0ZAGMWzEJhUEQ4Maimgf%2Fbkvo8PLVBsZl152y5S8%2BHRDfZIMCbYZ1WDp4yrdchOJw8k6R%2B%2F2pHmydK4NIK2PHdFPHtoLmHxRDwLFb7eB%2BM4zNZcB9NrAgjVyzLM7xyYSY13ykWfIEEd2n5%2FiYp3ZdrCf7fL%2Ben%2BsIJu2W7E30MrAgZBD1rAAbZHPgeAMtKCg3NpSpYQUDWJu9bT3V7tOKv%2BNRiJc8JAKqqgCA%2FPNRBR7ChpiEulyQApMK1AyqcWnpSOmYh6yLiWkGJ2mklCSPIqN7UypWj3dGi5MvsHQ87MrB4VFgypJaFriaHivwcHIpmyi5LhNqtem4q0n8awM19Qk8BOS0EsqGscuuydYsIGsbT5GHnERUiMpKJl4ON7qjB4fEqlGN%2FhCky89232UQCiaeWpDYCJINXjT6xl4Gc7DxRCtgV0i1ma4RgWLsNtnEBRQFqZggCLiuyEydmFd7WlogpkCw5G1x4ft2psm3KAREwVwr1Gzl6RT7FDAqpVal34ewVm3VH4qn5mjGj%2BbYL1NgfLNeXDwtmYSpwzbruDKpTjOdgiIHDVQSb5%2FzBgSMbHLkxWWgghIh9QTFSDILixVwg0Eg1puooBiHAt7DzwJ7m8i8%2Fi%2BjHvKf0QDnnHVkVTIqMvIQImOrzCJwhSR7qYB5gSwL6aWL9hERHCZc4G2%2BJrpgHNB8eCCmcIWIQ6rSdyPCyftXkDlErUkHafHRlkOIjxGbAktz75bnh50dU7YHk%2BMz7wwstg6RFZb%2BTZuSOx1qqP5C66c0mptQmzIC2dlpte7vZrauAMm%2F7RfBYkGtXWGiaWTtwvAQiq2oD4YixPLXE2khB2FRaNRDTk%2B9sZ6K74Ia9VntCpN4BhJGJMT4Z5c5FhSepRCRWmBXqx%2BwhVZC4me4saDs2iNqXMuCl6iAZflH8fscC1sTsy4PHeC%2BXYuqMBMUun5YezKbRKmEPwuK%2BCLzijPEQgfhahQswBBLfg%2FGBgBiI4QwAqzJkkyYAWtjzSg2ILgMAgqxYfwERRo3zruBL9WOryUArSD8sQOcD7fvIODJxKFS615KFPsb68USBEPPj1orNzFY2xoTtNBVTyzBhPbhFH0PI5AtlJBl2aSgNPYzxYLw7XTDBDinmVoENwiGzmngrMo8OmnRP0Z0i0Zrln9DDFcnmOoBZjABaQIbPOJYZGqX%2BRCMlDDbElcjaROLDoualmUIQ88Kekk3iM4OQrADcxi3rJguS4MOIBIgKgXrjd1WkbCdqxJk%2F4efRIFsavZA7KvvJQqp3Iid5Z0NFc5aiMRzGN3vrpBzaMy4JYde3wr96PjN90AYOIbyp6T4zj8LoE66OGcX1Ef4Z3KoWLAUF4BTg7ug%2FAbkG5UNQXAMkQezujSHeir2uTThgd3gpyzDrbnEdDRH2W7U6PeRvBX1ZFMP5RM%2BZu6UUZZD8hDPHldVWntTCNk7To8IeOW9yn2wx0gmurwqC60AOde4r3ETi5pVMSDK8wxhoGAoEX9NLWHIR33VbrbMveii2jAJlrxwytTHbWNu8Y4N8vCCyZjAX%2FpcsfwXbLze2%2BD%2Bu33OGBoJyAAL3jn3RuEcdp5If8O%2Ba4NKWvxOTyDltG0IWoHhwVGe7dKkCWFT%2B%2Btm%2BhaBCikRUUMrMhYKZJKYoVuv%2FbsJzO8DwfVIInQq3g3BYypiz8baogH3r3GwqCwFtZnz4xMjAVOYnyOi5HWbFA8n0qz1OjSpHWFzpQOpvkNETZBGpxN8ybhtqV%2FDMUxd9uFZmBfKXMCn%2FSqkWJyKPnT6lq%2B4zBZni6fYRByJn6OK%2BOgPBGRAJluwGSk4wxjOOzyce%2FPKODwRlsgrVkdcsEiYrqYdXo0Er2GXi2GQZd0tNJT6c9pK1EEJG1zgDJBoTVuCXGAU8BKTvCO%2FcEQ1Wjk3Zzuy90JX4m3O5IlxVFhYkSUwuQB2up7jhvkm%2BbddRQu5F9s0XftGEJ9JSuSk%2BZachCbdU45fEqbugzTIUokwoAKvpUQF%2FCvLbWW5BNQFqFkJg2f30E%2F48StNe5QwBg8zz3YAJ82FZoXBxXSv4QDooDo79NixyglO9AembuBcx5Re3CwOKTHebOPhkmFC7wNaWtoBhFuV4AkEuJ0J%2B1pT0tLkvFVZaNzfhs%2FKd3%2BA9YsImlO4XK4vpCo%2FelHQi%2F9gkFg07xxnuXLt21unCIpDV%2BbbRxb7FC6nWYTsMFF8%2B1LUg4JFjVt3vqbuhHmDKbgQ4e%2BRGizRiO8ky05LQGMdL2IKLSNar0kNG7lHJMaXr5mLdG3nykgj6vB%2FKVijd1ARWkFEf3yiUw1v%2FWaQivVUpIDdSNrrKbjO5NPnxz6qTTGgYg03HgPhDrCFyYZTi3XQw3HXCva39mpLNFtz8AiEhxAJHpWX13gCTAwgm9YTvMeiqetdNQv6IU0hH0G%2BZManTqDLPjyrOse7WiiwOJCG%2BJ0pZYULhN8NILulmYYvmVcV2MjAfA39sGKqGdjpiPo86fecg65UPyXDIAOyOkCx5NQsLeD4gGVjTVDwOHWkbbBW0GeNjDkcSOn2Nq4cEssP54t9D749A7M1AIOBl0Fi0sSO5v3P7LCBrM6ZwFY6kp2FX6AcbGUdybnfChHPyu6WlRZ2Fwv9YM0RMI7kISRgR8HpQSJJOyTfXj%2F6gQKuihPtiUtlCQVPohUgzfezTg8o1b3n9pNZeco1QucaoXe40Fa5JYhqdTspFmxGtW9h5ezLFZs3j%2FN46f%2BS2rjYNC2JySXrnSAFhvAkz9a5L3pza8eYKHNoPrvBRESpxYPJdKVUxBE39nJ1chrAFpy4MMkf0qKgYALctGg1DQI1kIymyeS2AJNT4X240d3IFQb%2F0jQbaHJ2YRK8A%2Bls6WMhWmpCXYG5jqapGs5%2FeOJErxi2%2F2KWVHiPellTgh%2FfNl%2F2KYPKb7DUcAg%2BmCOPQFCiU9Mq%2FWLcU1xxC8aLePFZZlE%2BPCLzf7ey46INWRw2kcXySR9FDgByXzfxiNKwDFbUSMMhALPFSedyjEVM5442GZ4hTrsAEvZxIieSHGSgkwFh%2FnFNdrrFD4tBH4Il7fW6ur4J8Xaz7RW9jgtuPEXQsYk7gcMs2neu3zJwTyUerHKSh1iTBkj2YJh1SSOZL5pLuQbFFAvyO4k1Hxg2h99MTC6cTUkbONQIAnEfGsGkNFWRbuRyyaEZInM5pij73EA9rPIUfU4XoqQpHT9THZkW%2BoKFLvpyvTBMM69tN1Ydwv1LIEhHsC%2BueVG%2Bw%2BkyCPsvV3erRikcscHjZCkccx6VrBkBRusTDDd8847GA7p2Ucy0y0HdSRN6YIBciYa4vuXcAZbQAuSEmzw%2BH%2FAuOx%2BaH%2BtBL88H57D0MsqyiZxhOEQkF%2F8DR1d2hSPMj%2FsNOa5rxcUnBgH8ictv2J%2Bcb4BA4v3MCShdZ2vtK30vAwkobnEWh7rsSyhmos3WC93Gn9C4nnAd%2FPjMMtQfyDNZsOPd6XcAsnBE%2FmRHtHEyJMzJfZFLE9OvQa0i9kUmToJ0ZxknTgdl%2FXPV8xoh0K7wNHHsnBdvFH3sv52lU7UFteseLG%2FVanIvcwycVA7%2BBE1Ulyb20BvwUWZcMTKhaCcmY3ROpvonVMV4N7yBXTL7IDtHzQ4CCcqF66LjF3xUqgErKzolLyCG6Kb7irP%2FMVTCCwGRxfrPGpMMGvPLgJ881PHMNMIO09T5ig7AzZTX%2F5PLlwnJLDAPfuHynSGhV4tPqR3gJ4kg4c06c%2FF1AcjGytKm2Yb5jwMotF7vro4YDLWlnMIpmPg36NgAZsGA0W1spfLSue4xxat0Gdwd0lqDBOgIaMANykwwDKejt5YaNtJYIkrSgu0KjIg0pznY0SCd1qlC6R19g97UrWDoYJGlrvCE05J%2F5wkjpkre727p5PTRX5FGrSBIfJqhJE%2FIS876PaHFkx9pGTH3oaY3jJRvLX9Iy3Edoar7cFvJqyUlOhAEiOSAyYgVEGkzHdug%2BoRHIEOXAExMiTSKU9A6nmRC8mp8iYhwWdP2U%2F5EkFAdPrZw03YA3gSyNUtMZeh7dDCu8pF5x0VORCTgKp07ehy7NZqKTpIC4UJJ89lnboyAfy5OyXzXtuDRbtAFjZRSyGFTpFrXwkpjSLIQIG3N0Vj4BtzK3wdlkBJrO18MNsgseR4BysJilI0wI6ZahLhBFA0XBmV8d4LUzEcNVb0xbLjLTETYN8OEVqNxkt10W614dd1FlFFVTIgB7%2FBQQp1sWlNolpIu4ekxUTBV7NmxOFKEBmmN%2BnA7pvF78%2FRII5ZHA09OAiE%2F66MF6HQ%2BqVEJCHxwymukkNvzqHEh52dULPbVasfQMgTDyBZzx4007YiKdBuUauQOt27Gmy8ISclPmEUCIcuLbkb1mzQSqIa3iE0PJh7UMYQbkpe%2BhXjTJKdldyt2mVPwywoODGJtBV1lJTgMsuSQBlDMwhEKIfrvsxGQjHPCEfNfMAY2oxvyKcKPUbQySkKG6tj9AQyEW3Q5rpaDJ5Sns9ScLKeizPRbvWYAw4bXkrZdmB7CQopCH8NAmqbuciZChHN8lVGaDbCnmddnqO1PQ4ieMYfcSiBE5zzMz%2BJV%2F4eyzrzTEShvqSGzgWimkNxLvUj86iAwcZuIkqdB0VaIB7wncLRmzHkiUQpPBIXbDDLHBlq7vp9xwuC9AiNkIptAYlG7Biyuk8ILdynuUM1cHWJgeB%2BK3wBP%2FineogxkvBNNQ4AkW0hvpBOQGFfeptF2YTR75MexYDUy7Q%2F9uocGsx41O4IZhViw%2F2FvAEuGO5g2kyXBUijAggWM08bRhXg5ijgMwDJy40QeY%2FcQpUDZiIzmvskQpO5G1zyGZA8WByjIQU4jRoFJt56behxtHUUE%2Fom7Rj2psYXGmq3llVOCgGYKNMo4pzwntITtapDqjvQtqpjaJwjHmDzSVGLxMt12gEXAdLi%2FcaHSM3FPRGRf7dB7YC%2BcD2ho6oL2zGDCkjlf%2FDFoQVl8GS%2F56wur3rdV6ggtzZW60MRB3g%2BU1W8o8cvqIpMkctiGVMzXUFI7FacFLrgtdz4mTEr4aRAaQ2AFQaNeG7GX0yOJgMRYFziXdJf24kg%2FgBQIZMG%2FYcPEllRTVNoDYR6oSJ8wQNLuihfw81UpiKPm714bZX1KYjcXJdfclCUOOpvTxr9AAJevTY4HK%2FG7F3mUc3GOAKqh60zM0v34v%2BELyhJZqhkaMA8UMMOU90f8RKEJFj7EqepBVwsRiLbwMo1J2zrE2UYJnsgIAscDmjPjnzI8a719Wxp757wqmSJBjXowhc46QN4RwKIxqEE6E5218OeK7RfcpGjWG1jD7qND%2B%2FGTk6M56Ig4yMsU6LUW1EWE%2BfIYycVV1thldSlbP6ltdC01y3KUfkobkt2q01YYMmxpKRvh1Z48uNKzP%2FIoRIZ%2FF6buOymSnW8gICitpJjKWBscSb9JJKaWkvEkqinAJ2kowKoqkqZftRqfRQlLtKoqvTRDi2vg%2FRrPD%2Fd3a09J8JhGZlEkOM6znTsoMCsuvTmywxTCDhw5dd0GJOHCMPbsj3QLkTE3MInsZsimDQ3HkvthT7U9VA4s6G07sID0FW4SHJmRGwCl%2BMu4xf0ezqeXD2PtPDnwMPo86sbwDV%2B9PWcgFcARUVYm3hrFQrHcgMElFGbSM2A1zUYA3baWfheJp2AINmTJLuoyYD%2FOwA4a6V0ChBN97E8YtDBerUECv0u0TlxR5yhJCXvJxgyM73Bb6pyq0jTFJDZ4p1Am1SA6sh8nADd1hAcGBMfq4d%2FUfwnmBqe0Jun1n1LzrgKuZMAnxA3NtCN7Klf4BH%2B14B7ibBmgt0TGUafVzI4uKlpF7v8NmgNjg90D6QE3tbx8AjSAC%2BOA1YJvclyPKgT27QpIEgVYpbPYGBsnyCNrGz9XUsCHkW1QAHgL2STZk12QGqmvAB0NFteERkvBIH7INDsNW9KKaAYyDMdBEMzJiWaJHZALqDxQDWRntumSDPcplyFiI1oDpT8wbwe01AHhW6%2BvAUUBoGhY3CT2tgwehdPqU%2F4Q7ZLYvhRl%2FogOvR9O2%2BwkkPKW5vCTjD2fHRYXONCoIl4Jh1bZY0ZE1O94mMGn%2FdFSWBWzQ%2FVYk%2BGezi46RgiDv3EshoTmMSlioUK6MQEN8qeyK6FRninyX8ZPeUWjjbMJChn0n%2FyJvrq5bh5UcCAcBYSafTFg7p0jDgrXo2QWLb3WpSOET%2FHh4oSadBTvyDo10IufLzxiMLAnbZ1vcUmj3w7BQuIXjEZXifwukVxrGa9j%2BDXfpi12m1RbzYLg9J2wFergEwOxFyD0%2FJstNK06ZN2XdZSGWxcJODpQHOq4iKqjqkJUmPu1VczL5xTGUfCgLEYyNBCCbMBFT%2FcUP6pE%2FmujnHsSDeWxMbhrNilS5MyYR0nJyzanWXBeVcEQrRIhQeJA6Xt4f2eQESNeLwmC10WJVHqwx8SSyrtAAjpGjidcj1E2FYN0LObUcFQhafUKTiGmHWRHGsFCB%2BHEXgrzJEB5bp0QiF8ZHh11nFX8AboTD0PS4O1LqF8XBks2MpjsQnwKHF6HgaKCVLJtcr0XjqFMRGfKv8tmmykhLRzu%2BvqQ02%2BKpJBjaLt9ye1Ab%2BBbEBhy4EVdIJDrL2naV0o4wU8YZ2Lq04FG1mWCKC%2BUwkXOoAjneU%2FxHplMQo2cXUlrVNqJYczgYlaOEczVCs%2FOCgkyvLmTmdaBJc1iBLuKwmr6qtRnhowngsDxhzKFAi02tf8bmET8BO27ovJKF1plJwm3b0JpMh38%2BxsrXXg7U74QUM8ZCIMOpXujHntKdaRtsgyEZl5MClMVMMMZkZLNxH9%2Bb8fH6%2Bb8Lev30A9TuEVj9CqAdmwAAHBPbfOBFEATAPZ2CS0OH1Pj%2F0Q7PFUcC8hDrxESWdfgFRm%2B7vvWbkEppHB4T%2F1ApWnlTIqQwjcPl0VgS1yHSmD0OdsCVST8CQVwuiew1Y%2Bg3QGFjNMzwRB2DSsAk26cmA8lp2wIU4p93AUBiUHFGOxOajAqD7Gm6NezNDjYzwLOaSXRBYcWipTSONHjUDXCY4mMI8XoVCR%2FRrs%2FJLKXgEx%2BqkmeDlFOD1%2FyTQNDClRuiUyKYCllfMiQiyFkmuTz2vLsBNyRW%2Bxz%2B5FElFxWB28VjYIGZ0Yd%2B5wIjkcoMaggxswbT0pCmckRAErbRlIlcOGdBo4djTNO8FAgQ%2BlT6vPS60BwTRSUAM3ddkEAZiwtEyArrkiDRnS7LJ%2B2hwbzd2YDQagSgACpsovmjil5wfPuXq3GuH0CyE7FK3M4FgRaFoIkaodORrPx1%2BJpI9psyNYIFuJogZa0%2F1AhOWdlHQxdAgbwacsHqPZo8u%2FngAH2GmaTdhYnBfSDbBfh8CHq6Bx5bttP2%2BRdM%2BMAaYaZ0Y%2FADkbNCZuAyAVQa2OcXOeICmDn9Q%2FeFkDeFQg5MgHEDXq%2FtVjj%2Bjtd26nhaaolWxs1ixSUgOBwrDhRIGOLyOVk2%2FBc0UxvseQCO2pQ2i%2BKrfhu%2FWeBovNb5dJxQtJRUDv2mCwYVpNl2efQM9xQHnK0JwLYt%2FU0Wf%2BphiA4uw8G91slC832pmOTCAoZXohg1fewCZqLBhkOUBofBWpMPsqg7XEXgPfAlDo2U5WXjtFdS87PIqClCK5nW6adCeXPkUiTGx0emOIDQqw1yFYGHEVx20xKjJVYe0O8iLmnQr3FA9nSIQilUKtJ4ZAdcTm7%2BExseJauyqo30hs%2B1qSW211A1SFAOUgDlCGq7eTIcMAeyZkV1SQJ4j%2Fe1Smbq4HcjqgFbLAGLyKxlMDMgZavK5NAYH19Olz3la%2FQCTiVelFnU6O%2FGCvykqS%2FwZJDhKN9gBtSOp%2F1SP5VRgJcoVj%2Bkmf2wBgv4gjrgARBWiURYx8xENV3bEVUAAWWD3dYDKAIWk5opaCFCMR5ZjJExiCAw7gYiSZ2rkyTce4eNMY3lfGn%2B8p6%2BvBckGlKEXnA6Eota69OxDO9oOsJoy28BXOR0UoXNRaJD5ceKdlWMJlOFzDdZNpc05tkMGQtqeNF2lttZqNco1VtwXgRstLSQ6tSPChgqtGV5h2DcDReIQadaNRR6AsAYKL5gSFsCJMgfsaZ7DpKh8mg8Wz8V7H%2BgDnLuMxaWEIUPevIbClgap4dqmVWSrPgVYCzAoZHIa5z2Ocx1D%2FGvDOEqMOKLrMefWIbSWHZ6jbgA8qVBhYNHpx0P%2BjAgN5TB3haSifDcApp6yymEi6Ij%2FGsEpDYUgcHATJUYDUAmC1SCkJ4cuZXSAP2DEpQsGUjQmKJfJOvlC2x%2FpChkOyLW7KEoMYc5FDC4v2FGqSoRWiLsbPCiyg1U5yiHZVm1XLkHMMZL11%2Fyxyw0UnGig3MFdZklN5FI%2FqiT65T%2BjOXOdO7XbgWurOAZR6Cv9uu1cm5LjkXX4xi6mWn5r5NjBS0gTliHhMZI2WNqSiSphEtiCAwnafS11JhseDGHYQ5%2BbqWiAYiAv6Jsf79%2FVUs4cIl%2Bn6%2BWOjcgB%2F2l5TreoAV2717JzZbQIR0W1cl%2FdEqCy5kJ3ZSIHuU0vBoHooEpiHeQWVkkkOqRX27eD1FWw4BfO9CJDdKoSogQi3hAAwsPRFrN5RbX7bqLdBJ9JYMohWrgJKHSjVl1sy2xAG0E3sNyO0oCbSGOxCNBRRXTXenYKuwAoDLfnDcQaCwehUOIDiHAu5m5hMpKeKM4sIo3vxACakIxKoH2YWF2QM84e6F5C5hJU4g8uxuFOlAYnqtwxmHyNEawLW%2FPhoawJDrGAP0JYWHgAVUByo%2FbGdiv2T2EMg8gsS14%2FrAdzlOYazFE7w4OzxeKiWdm3nSOnQRRKXSlVo8HEAbBfyJMKqoq%2BSCcTSx5NDtbFwNlh8VhjGGDu7JG5%2FTAGAvniQSSUog0pNzTim8Owc6QTuSKSTXlQqwV3eiEnklS3LeSXYPXGK2VgeZBqNcHG6tZHvA3vTINhV0ELuQdp3t1y9%2BogD8Kk%2FW7QoRN1UWPqM4%2BxdygkFDPLoTaumKReKiLWoPHOfY54m3qPx4c%2B4pgY3MRKKbljG8w4wvz8pxk3AqKsy4GMAkAtmRjRMsCxbb4Q2Ds0Ia9ci8cMT6DmsJG00XaHCIS%2Bo3F8YVVeikw13w%2BOEDaCYYhC0ZE54kA4jpjruBr5STWeqQG6M74HHL6TZ3lXrd99ZX%2B%2B7LhNatQaZosuxEf5yRA15S9gPeHskBIq3Gcw81AGb9%2FO53DYi%2F5CsQ51EmEh8Rkg4vOciClpy4d04eYsfr6fyQkBmtD%2BP8sNh6e%2BXYHJXT%2FlkXxT4KXU5F2sGxYyzfniMMQkb9OjDN2C8tRRgTyL7GwozH14PrEUZc6oz05Emne3Ts5EG7WolDmU8OB1LDG3VrpQxp%2BpT0KYV5dGtknU64JhabdqcVQbGZiAxQAnvN1u70y1AnmvOSPgLI6uB4AuDGhmAu3ATkJSw7OtS%2F2ToPjqkaq62%2F7WFG8advGlRRqxB9diP07JrXowKR9tpRa%2BjGJ91zxNTT1h8I2PcSfoUPtd7NejVoH03EUcqSBuFZPkMZhegHyo2ZAITovmm3zAIdGFWxoNNORiMRShgwdYwFzkPw5PA4a5MIIQpmq%2Bnsp3YMuXt%2FGkXxLx%2FP6%2BZJS0lFyz4MunC3eWSGE8xlCQrKvhKUPXr0hjpAN9ZK4PfEDrPMfMbGNWcHDzjA7ngMxTPnT7GMHar%2BgMQQ3NwHCv4zH4BIMYvzsdiERi6gebRmerTsVwZJTRsL8dkZgxgRxmpbgRcud%2BYlCIRpPwHShlUSwuipZnx9QCsEWziVazdDeKSYU5CF7UVPAhLer3CgJOQXl%2Fzh575R5rsrmRnKAzq4POFdgbYBuEviM4%2BLVC15ssLNFghbTtHWerS1hDt5s4qkLUha%2FqpZXhWh1C6lTQAqCNQnaDjS7UGFBC6wTu8yFnKJnExCnAs3Ok9yj5KpfZESQ4lTy5pTGTnkAUpxI%2ByjEldJfSo4y0QhG4i4IwkRFGcjWY8%2BEzgYYJUK7BXQksLxAww%2FYYWBMhJILB9e8ePEJ4OP7z%2B4%2FwOQDl64iOYDp26DaONPxpKtBxq%2FaTzRGarm3VkPYTLJKx6Z%2FMw2YbBGseJhPMwhhNswrIkyvV2BYzrvZbxLpKwcWJhYmFtVZ%2BlPEq91FzVp1HlQY1bZVLqeNR9SAUn6n0E28k%2FUuGkNpP1DBI5ch%2FEehZfjUQ9aE41NhETExoPT2gGQz0IhWJbEOvTQ4wgcXCHHFBhewYUiFHuhRSAUVmEHeCRQHQkXGFwkAgyzREJCVN7TRnTon36Zw3tPhx4EALwNdwDv%2BJ41YSP4B2CQqz0EFgARZ4ESgBHQgROwAVn9GTI%2BHYexTUevLUeta4%2FDqKrbMVS%2BYqb8hUwYCrlgKtmAq1YCrFgKrd4qpXiqZcKn1oqdWipjYKpWwVPVYqW6xUpVipKqFR3QKjagVEtAqHpxUMTitsnFaJOKx2cVhswq35RVpyiq9lFVNIKnOQVMkgqtYxVNxiqQjFS7GKlSIVIsQqPIhUWwioigFQ%2B%2BKkN8VHr49HDw9Ebo9EDo9DTo9Crg9BDg9%2FWx7gWx7YWwlobYrOGxWPNisAaAHEyALpkAVDIAeWAArsABVXACYuAD5cAF6wAKFQAQqgAbVAAsoAAlQAUaYAfkwAvogBWQACOgAD9AAHSAAKT4GUdMiOvFngBTwCn2AZ7Dv6B6k%2F90B8%2ByRnkV144AIBoAMTQATGgAjNAA4YABgwABZgB%2FmQCwyAVlwCguASlwCEuAQFwB4uAMlwBYuAJlQAUVAAhUD2KgdpUDaJgaRMDFJgX5MC1JgWJEAokQCWRAHxEAWkQBMRADpEAMkQAYROAEecC484DRpwBDTnwNOdw05tjTmiNOYwtswhYFwLA7BYG4LA2BYGOLAwRYFuLAsxYFQJAohIEyJAMwkAwiQC0JAJgkAeiQBkJAFokAPCQA0JABwcD4Dgc4cDdDgaYcDIDgYgUC6CgWgUClCgUYUAVBQBOFAEYMALgwAgDA9QYAdIn8AZzeBB2L5EcWrenUT1KXienEsuJJ7x5U8XlTjc1NVzUyXFTGb1LlpUtWlTDIjqwE4LsagowoCi2gJLKAkpoBgJQNpAIhNqaEoneI6kiiqQ6Go%2Fn6j0cS%2Ba2gEU8gIHJ%2BBwfgZX4GL%2BBd%2FgW34FZ%2BBS%2FgUH4FN6BTegTvoEv6BJegRnYEF2A79gOvYDl2BdEjCkqkGtwXp0LNToIskOTXzh%2FF062yJ7AAAAEDAWAAABWhJ%2BKPEIJgBFxMVP7w2QJBGHASQnOBKXKFIdUK4igKA9IEaYJg%29%3Bsrc%3Aurl%28data%3Aapplication%2Fvnd%2Ems%2Dfontobject%3Bbase64%2Cn04AAEFNAAACAAIABAAAAAAABQAAAAAAAAABAJABAAAEAExQAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAJxJ%2FLAAAAAAAAAAAAAAAAAAAAAAAACgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzAAAADgBSAGUAZwB1AGwAYQByAAAAeABWAGUAcgBzAGkAbwBuACAAMQAuADAAMAA5ADsAUABTACAAMAAwADEALgAwADAAOQA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOAAzADIAOQAAADgARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzACAAUgBlAGcAdQBsAGEAcgAAAAAAQlNHUAAAAAAAAAAAAAAAAAAAAAADAKncAE0TAE0ZAEbuFM3pjM%2FSEdmjKHUbyow8ATBE40IvWA3vTu8LiABDQ%2BpexwUMcm1SMnNryctQSiI1K5ZnbOlXKmnVV5YvRe6RnNMFNCOs1KNVpn6yZhCJkRtVRNzEufeIq7HgSrcx4S8h%2Fv4vnrrKc6oCNxmSk2uKlZQHBii6iKFoH0746ThvkO1kJHlxjrkxs%2BLWORaDQBEtiYJIR5IB9Bi1UyL4Rmr0BNigNkMzlKQmnofBHviqVzUxwdMb3NdCn69hy%2BpRYVKGVS%2F1tnsqv4LL7wCCPZZAZPT4aCShHjHJVNuXbmMrY5LeQaGnvAkXlVrJgKRAUdFjrWEah9XebPeQMj7KS7DIBAFt8ycgC5PLGUOHSE3ErGZCiViNLL5ZARfywnCoZaKQCu6NuFX42AEeKtKUGnr%2FCm2Cy8tpFhBPMW5Fxi4Qm4TkDWh4IWFDClhU2hRWosUWqcKLlgyXB%2BlSHaWaHiWlBAR8SeSgSPCQxdVQgzUixWKSTrIQEbU94viDctkvX%2BVSjJuUmV8L4CXShI11esnp0pjWNZIyxKHS4wVQ2ime1P4RnhvGw0aDN1OLAXGERsB7buFpFGGBAre4QEQR0HOIO5oYH305G%2BKspT%2FFupEGGafCCwxSe6ZUa%2B073rXHnNdVXE6eWvibUS27XtRzkH838mYLMBmYysZTM0EM3A1fbpCBYFccN1B%2FEnCYu%2FTgCGmr7bMh8GfYL%2BBfcLvB0gRagC09w9elfldaIy%2FhNCBLRgBgtCC7jAF63wLSMAfbfAlEggYU0bUA7ACCJmTDpEmJtI78w4%2FBO7dN7JR7J7ZvbYaUbaILSQsRBiF3HGk5fEg6p9unwLvn98r%2BvnsV%2B372uf1xBLq4qU%2F45fTuqaAP%2BpssmCCCTF0mhEow8ZXZOS8D7Q85JsxZ%2BAzok7B7O%2Ff6J8AzYBySZQB%2FQHYUSA%2BEeQhEWiS6AIQzgcsDiER4MjgMBAWDV4AgQ3g1eBgIdweCQmCjJEMkJ%2BPKRWyFHHmg1Wi%2F6xzUgA0LREoKJChwnQa9B%2B5RQZRB3IlBlkAnxyQNaANwHMowzlYSMCBgnbpzvqpl0iTJNCQidDI9ZrSYNIRBhHtUa5YHMHxyGEik9hDE0AKj72AbTCaxtHPUaKZdAZSnQTyjGqGLsmBStCejApUhg4uBMU6mATujEl%2BKdDPbI6Ag4vLr%2BhjY6lbjBeoLKnZl0UZgRX8gTySOeynZVz1wOq7e1hFGYIq%2BMhrGxDLak0PrwYzSXtcuyhXEhwOYofiW%2BEcI%2Fjw8P6IY6ed%2BetAbuqKp5QIapT77LnAe505lMuqL79a0ut4rWexzFttsOsLDy7zvtQzcq3U1qabe7tB0wHWVXji%2BzDbo8x8HyIRUbXnwUcklFv51fvTymiV%2BMXLSmGH9d9%2BaXpD5X6lao41anWGig7IwIdnoBY2ht%2FpO9mClLo4NdXHAsefqWUKlXJkbqPOFhMoR4aiA1BXqhRNbB2Xwi%2B7u%2FjpAoOpKJ0UX24EsrzMfHXViakCNcKjBxuQX8BO0ZqjJ3xXzf%2B61t2VXOSgJ8xu65QKgtN6FibPmPYsXbJRHHqbgATcSZxBqGiDiU4NNNsYBsKD0MIP%2FOfKnlk%2FLkaid%2FO2NbKeuQrwOB2Gq3YHyr6ALgzym5wIBnsdC1ZkoBFZSQXChZvlesPqvK2c5oHHT3Q65jYpNxnQcGF0EHbvYqoFw60WNlXIHQF2HQB7zD6lWjZ9rVqUKBXUT6hrkZOle0RFYII0V5ZYGl1JAP0Ud1fZZMvSomBzJ710j4Me8mjQDwEre5Uv2wQfk1ifDwb5ksuJQQ3xt423lbuQjvoIQByQrNDh1JxGFkOdlJvu%2FgFtuW0wR4cgd%2BZKesSV7QkNE2kw6AV4hoIuC02LGmTomyf8PiO6CZzOTLTPQ%2BHW06H%2Btx%2BbQ8LmDYg1pTFrp2oJXgkZTyeRJZM0C8aE2LpFrNVDuhARsN543%2FFV6klQ6Tv1OoZGXLv0igKrl%2FCmJxRmX7JJbJ998VSIPQRyDBICzl4JJlYHbdql30NvYcOuZ7a10uWRrgoieOdgIm4rlq6vNOQBuqESLbXG5lzdJGHw2m0sDYmODXbYGTfSTGRKpssTO95fothJCjUGQgEL4yKoGAF%2F0SrpUDNn8CBgBcSDQByAeNkCXp4S4Ro2Xh4OeaGRgR66PVOsU8bc6TR5%2FxTcn4IVMLOkXSWiXxkZQCbvKfmoAvQaKjO3EDKwkwqHChCDEM5loQRPd5ACBki1TjF772oaQhQbQ5C0lcWXPFOzrfsDGUXGrpxasbG4iab6eByaQkQfm0VFlP0ZsDkvvqCL6QXMUwCjdMx1ZOyKhTJ7a1GWAdOUcJ8RSejxNVyGs31OKMyRyBVoZFjqIkmKlLQ5eHMeEL4MkUf23cQ%2F1SgRCJ1dk4UdBT7OoyuNgLs0oCd8RnrEIb6QdMxT2QjD4zMrJkfgx5aDMcA4orsTtKCqWb%2FVeyceqa5OGSmB28YwH4rFbkQaLoUN8OQQYnD3w2eXpI4ScQfbCUZiJ4yMOIKLyyTc7BQ4uXUw6Ee6%2FxM%2B4Y67ngNBknxIPwuppgIhFcwJyr6EIj%2BLzNj%2FmfR2vhhRlx0BILZoAYruF0caWQ7YxO66UmeguDREAFHYuC7HJviRgVO6ruJH59h%2FC%2FPkgSle8xNzZJULLWq9JMDTE2fjGE146a1Us6PZDGYle6ldWRqn%2FpdpgHKNGrGIdkRK%2BKPETT9nKT6kLyDI8xd9A1FgWmXWRAIHwZ37WyZHOVyCadJEmMVz0MadMjDrPho%2BEIochkVC2xgGiwwsQ6DMv2P7UXqT4x7CdcYGId2BJQQa85EQKmCmwcRejQ9Bm4oATENFPkxPXILHpMPUyWTI5rjNOsIlmEeMbcOCEqInpXACYQ9DDxmFo9vcmsDblcMtg4tqBerNngkIKaFJmrQAPnq1dEzsMXcwjcHdfdCibcAxxA%2Bq%2Fj9m3LM%2FO7WJka4tSidVCjsvo2lQ%2F2ewyoYyXwAYyr2PlRoR5MpgVmSUIrM3PQxXPbgjBOaDQFIyFMJvx3Pc5RSYj12ySVF9fwFPQu2e2KWVoL9q3Ayv3IzpGHUdvdPdrNUdicjsTQ2ISy7QU3DrEytIjvbzJnAkmANXjAFERA0MUoPF3%2F5KFmW14bBNOhwircYgMqoDpUMcDtCmBE82QM2YtdjVLB4kBuKho%2FbcwQdeboqfQartuU3CsCf%2BcXkgYAqp%2F0Ee3RorAZt0AvvOCSI4JICIlGlsV0bsSid%2FNIEALAAzb6HAgyWHBps6xAOwkJIGcB82CxRQq4sJf3FzA70A%2BTRqcqjEMETCoez3mkPcpnoALs0ugJY8kQwrC%2BJE5ik3w9rzrvDRjAQnqgEVvdGrNwlanR0SOKWzxOJOvLJhcd8Cl4AshACUkv9czdMkJCVQSQhp6kp7StAlpVRpK0t0SW6LHeBJnE2QchB5Ccu8kxRghZXGIgZIiSj7gEKMJDClcnX6hgoqJMwiQDigIXg3ioFLCgDgjPtYHYpsF5EiA4kcnN18MZtOrY866dEQAb0FB34OGKHGZQjwW%2FWDHA60cYFaI%2FPjpzquUqdaYGcIq%2BmLez3WLFFCtNBN2QJcrlcoELgiPku5R5dSlJFaCEqEZle1AQzAKC%2B1SotMcBNyQUFuRHRF6OlimSBgjZeTBCwLyc6A%2BP%2FoFRchXTz5ADknYJHxzrJ5pGuIKRQISU6WyKTBBjD8WozmVYWIsto1AS5rxzKlvJu4E%2FvwOiKxRtCWsDM%2BeTHUrmwrCK5BIfMzGkD%2B0Fk5LzBs0jMYXktNDblB06LMNJ09U8pzSLmo14MS0OMjcdrZ31pyQqxJJpRImlSvfYAK8inkYU52QY2FPEVsjoWewpwhRp5yAuNpkqhdb7ku9Seefl2D0B8SMTFD90xi4CSOwwZy9IKkpMtI3FmFUg3%2FkFutpQGNc3pCR7gvC4sgwbupDu3DyEN%2BW6YGLNM21jpB49irxy9BSlHrVDlnihGKHwPrbVFtc%2Bh1rVQKZduxIyojccZIIcOCmhEnC7UkY68WXKQgLi2JCDQkQWJRQuk60hZp0D3rtCTINSeY9Ej2kIKYfGxwOs4j9qMM7fYZiipzgcf7TamnehqdhsiMiCawXnz4xAbyCkLAx5EGbo3Ax1u3dUIKnTxIaxwQTHehPl3V491H0%2BbC5zgpGz7Io%2BmjdhKlPJ01EeMpM7UsRJMi1nGjmJg35i6bQBAAxjO%2FENJubU2mg3ONySEoWklCwdABETcs7ck3jgiuU9pcKKpbgn%2B3YlzV1FzIkB6pmEDOSSyDfPPlQskznctFji0kpgZjW5RZe6x9kYT4KJcXg0bNiCyif%2BpZACCyRMmYsfiKmN9tSO65F0R2OO6ytlEhY5Sj6uRKfFxw0ijJaAx%2Fk3QgnAFSq27%2F2i4GEBA%2BUvTJKK%2F9eISNvG46Em5RZfjTYLdeD8kdXHyrwId%2FDQZUaMCY4gGbke2C8vfjgV%2FY9kkRQOJIn%2FxM9INZSpiBnqX0Q9GlQPpPKAyO5y%2BW5NMPSRdBCUlmuxl40ZfMCnf2Cp044uI9WLFtCi4YVxKjuRCOBWIb4XbIsGdbo4qtMQnNOQz4XDSui7W%2FN6l54qOynCqD3DpWQ%2BmpD7C40D8BZEWGJX3tlAaZBMj1yjvDYKwCJBa201u6nBKE5UE%2B7QSEhCwrXfbRZylAaAkplhBWX50dumrElePyNMRYUrC99UmcSSNgImhFhDI4BXjMtiqkgizUGCrZ8iwFxU6fQ8GEHCFdLewwxYWxgScAYMdMLmcZR6b7rZl95eQVDGVoUKcRMM1ixXQtXNkBETZkVVPg8LoSrdetHzkuM7DjZRHP02tCxA1fmkXKF3VzfN1pc1cv%2F8lbTIkkYpqKM9VOhp65ktYk%2BQ46myFWBapDfyWUCnsnI00QTBQmuFjMZTcd0V2NQ768Fhpby04k2IzNR1wKabuGJqYWwSly6ocMFGTeeI%2BejsWDYgEvr66QgqdcIbFYDNgsm0x9UHY6SCd5%2B7tpsLpKdvhahIDyYmEJQCqMqtCF6UlrE5GXRmbu%2Bvtm3BFSxI6ND6UxIE7GsGMgWqghXxSnaRJuGFveTcK5ZVSPJyjUxe1dKgI6kNF7EZhIZs8y8FVqwEfbM0Xk2ltORVDKZZM40SD3qQoQe0orJEKwPfZwm3YPqwixhUMOndis6MhbmfvLBKjC8sKKIZKbJk8L11oNkCQzCgvjhyyEiQSuJcgCQSG4Mocfgc0Hkwcjal1UNgP0CBPikYqBIk9tONv4kLtBswH07vUCjEaHiFGlLf8MgXKzSgjp2HolRRccAOh0ILHz9qlGgIFkwAnzHJRjWFhlA7ROwINyB5HFj59PRZHFor6voq7l23EPNRwdWhgawqbivLSjRA4htEYUFkjESu67icTg5S0aW1sOkCiIysfJ9UnIWevOOLGpepcBxy1wEhd2WI3AZg7sr9WBmHWyasxMcvY%2FiOmsLtHSWNUWEGk9hScMPShasUA1AcHOtRZlqMeQ0OzYS9vQvYUjOLrzP07BUAFikcJNMi7gIxEw4pL1G54TcmmmoAQ5s7TGWErJZ2Io4yQ0ljRYhL8H5e62oDtLF8aDpnIvZ5R3GWJyAugdiiJW9hQAVTsnCBHhwu7rkBlBX6r3b7ejEY0k5GGeyKv66v%2B6dg7mcJTrWHbtMywbedYqCQ0FPwoytmSWsL8WTtChZCKKzEF7vP6De4x2BJkkniMgSdWhbeBSLtJZR9CTHetK1xb34AYIJ37OegYIoPVbXgJ%2FqDQK%2BbfCtxQRVKQu77WzOoM6SGL7MaZwCGJVk46aImai9fmam%2BWpHG%2B0BtQPWUgZ7RIAlPq6lkECUhZQ2gqWkMYKcYMYaIc4gYCDFHYa2d1nzp3%2BJ1eCBay8IYZ0wQRKGAqvCuZ%2FUgbQPyllosq%2BXtfKIZOzmeJqRazpmmoP%2F76YfkjzV2NlXTDSBYB04SVlNQsFTbGPk1t%2FI4Jktu0XSgifO2ozFOiwd%2F0SssJDn0dn4xqk4GDTTKX73%2FwQyBLdqgJ%2BWx6AQaba3BA9CKEzjtQYIfAsiYamapq80LAamYjinlKXUkxdpIDk0puXUEYzSalfRibAeDAKpNiqQ0FTwoxuGYzRnisyTotdVTclis1LHRQCy%2FqqL8oUaQzWRxilq5Mi0IJGtMY02cGLD69vGjkj3p6pGePKI8bkBv5evq8SjjyU04vJR2cQXQwSJyoinDsUJHCQ50jrFTT7yRdbdYQMB3MYCb6uBzJ9ewhXYPAIZSXfeEQBZZ3GPN3Nbhh%2FwkvAJLXnQMdi5NYYZ5GHE400GS5rXkOZSQsdZgIbzRnF9ueLnsfQ47wHAsirITnTlkCcuWWIUhJSbpM3wWhXNHvt2xUsKKMpdBSbJnBMcihkoDqAd1Zml%2FR4yrzow1Q2A5G%2Bkzo%2FRhRxQS2lCSDRV8LlYLBOOoo1bF4jwJAwKMK1tWLHlu9i0j4Ig8qVm6wE1DxXwAwQwsaBWUg2pOOol2dHxyt6npwJEdLDDVYyRc2D0HbcbLUJQj8gPevQBUBOUHXPrsAPBERICpnYESeu2OHotpXQxRGlCCtLdIsu23MhZVEoJg8Qumj%2FUMMc34IBqTKLDTp76WzL%2FdMjCxK7MjhiGjeYAC%2Fkj%2FjY%2FRde7hpSM1xChrog6yZ7OWTuD56xBJnGFE%2BpT2ElSyCnJcwVzCjkqeNLfMEJqKW0G7OFIp0G%2B9mh50I9o8k1tpCY0xYqFNIALgIfc2me4n1bmJnRZ89oepgLPT0NTMLNZsvSCZAc3TXaNB07vail36%2FdBySis4m9%2FDR8izaLJW6bWCkVgm5T%2Bius3ZXq4xI%2BGnbveLbdRwF2mNtsrE0JjYc1AXknCOrLSu7Te%2Fr4dPYMCl5qtiHNTn%2BTPbh1jCBHH%2BdMJNhwNgs3nT%2BOhQoQ0vYif56BMG6WowAcHR3DjQolxLzyVekHj00PBAaW7IIAF1EF%2BuRIWyXjQMAs2chdpaKPNaB%2BkSezYt0%2BCA04sOg5vx8Fr7Ofa9sUv87h7SLAUFSzbetCCZ9pmyLt6l6%2FTzoA1%2FZBG9bIUVHLAbi%2FkdBFgYGyGwRQGBpkqCEg2ah9UD6EedEcEL3j4y0BQQCiExEnocA3SZboh%2Bepgd3YsOkHskZwPuQ5OoyA0fTA5AXrHcUOQF%2BzkJHIA7PwCDk1gGVmGUZSSoPhNf%2BTklauz98QofOlCIQ%2FtCD4dosHYPqtPCXB3agggQQIqQJsSkB%2Bqn0rkQ1toJjON%2FOtCIB9RYv3PqRA4C4U68ZMlZn6BdgEvi2ziU%2BTQ6NIw3ej%2BAtDwMGEZk7e2IjxUWKdAxyaw9OCwSmeADTPPleyk6UhGDNXQb%2B%2BW6Uk4q6F7%2Frg6WVTo82IoCxSIsFDrav4EPHphD3u4hR53WKVvYZUwNCCeM4PMBWzK%2BEfIthZOkuAwPo5C5jgoZgn6dUdvx5rIDmd58cXXdKNfw3l%2BwM2UjgrDJeQHhbD7HW2QDoZMCujgIUkk5Fg8VCsdyjOtnGRx8wgKRPZN5dR0zPUyfGZFVihbFRniXZFOZGKPnEQzU3AnD1KfR6weHW2XS6KbPJxUkOTZsAB9vTVp3Le1F8q5l%2BDMcLiIq78jxAImD2pGFw0VHfRatScGlK6SMu8leTmhUSMy8Uhdd6xBiH3Gdman4tjQGLboJfqz6fL2WKHTmrfsKZRYX6BTDjDldKMosaSTLdQS7oDisJNqAUhw1PfTlnacCO8vl8706Km1FROgLDmudzxg%2BEWTiArtHgLsRrAXYWdB0NmToNCJdKm0KWycZQqb%2BMw76Qy29iQ5up%2FX7oyw8QZ75kP5F6iJAJz6KCmqxz8fEa%2FxnsMYcIO%2FvEkGRuMckhr4rIeLrKaXnmIzlNLxbFspOphkcnJdnz%2FChp%2FVlpj2P7jJQmQRwGnltkTV5dbF9fE3%2FfxoSqTROgq9wFUlbuYzYcasE0ouzBo%2BdDCDzxKAfhbAZYxQiHrLzV2iVexnDX%2FQnT1fsT%2Fxuhu1ui5qIytgbGmRoQkeQooO8eJNNZsf0iALur8QxZFH0nCMnjerYQqG1pIfjyVZWxhVRznmmfLG00BcBWJE6hzQWRyFknuJnXuk8A5FRDCulwrWASSNoBtR%2BCtGdkPwYN2o7DOw%2FVGlCZPusRBFXODQdUM5zeHDIVuAJBLqbO%2Ff9Qua%2BpDqEPk230Sob9lEZ8BHiCorjVghuI0lI4JDgHGRDD%2FprQ84B1pVGkIpVUAHCG%2Biz3Bn3qm2AVrYcYWhock4jso5%2BJ7HfHVj4WMIQdGctq3psBCVVzupQOEioBGA2Bk%2BUILT7%2BVoX5mdxxA5fS42gISQVi%2FHTzrgMxu0fY6hE1ocUwwbsbWcezrY2n6S8%2F6cxXkOH4prpmPuFoikTzY7T85C4T2XYlbxLglSv2uLCgFv8Quk%2FwdesUdWPeHYIH0R729JIisN9Apdd4eB10aqwXrPt%2BSu9mA8k8n1sjMwnfsfF2j3jMUzXepSHmZ%2FBfqXvzgUNQQWOXO8YEuFBh4QTYCkOAPxywpYu1VxiDyJmKVcmJPGWk%2Fgc3Pov02StyYDahwmzw3E1gYC9wkupyWfDqDSUMpCTH5e5N8B%2F%2FlHiMuIkTNw4USHrJU67bjXGqNav6PBuQSoqTxc8avHoGmvqNtXzIaoyMIQIiiUHIM64cXieouplhNYln7qgc4wBVAYR104kO%2BCvKqsg4yIUlFNThVUAKZxZt1XA34h3TCUUiXVkZ0w8Hh2R0Z5L0b4LZvPd%2Fp1gi%2F07h8qfwHrByuSxglc9cI4QIg2oqvC%2Fqm0i7tjPLTgDhoWTAKDO2ONW5oe%2B%2FeKB9vZB8K6C25yCZ9RFVMnb6NRdRjyVK57CHHSkJBfnM2%2Fj4ODUwRkqrtBBCrDsDpt8jhZdXoy%2F1BCqw3sSGhgGGy0a5Jw6BP%2FTExoCmNFYjZl248A0osgPyGEmRA%2BfAsqPVaNAfytu0vuQJ7rk3J4kTDTR2AlCHJ5cls26opZM4w3jMULh2YXKpcqGBtuleAlOZnaZGbD6DHzMd6i2oFeJ8z9XYmalg1Szd%2FocZDc1C7Y6vcALJz2lYnTXiWEr2wawtoR4g3jvWUU2Ngjd1cewtFzEvM1NiHZPeLlIXFbBPawxNgMwwAlyNSuGF3zizVeOoC9bag1qRAQKQE%2FEZBWC2J8mnXAN2aTBboZ7HewnObE8CwROudZHmUM5oZ%2FUgd%2FJZQK8lvAm43uDRAbyW8gZ%2BZGq0EVerVGUKUSm%2FIdn8AQHdR4m7bue88WBwft9mSCeMOt1ncBwziOmJYI2ZR7ewNMPiCugmSsE4EyQ%2BQATJG6qORMGd4snEzc6B4shPIo4G1T7PgSm8PY5eUkPdF8JZ0VBtadbHXoJgnEhZQaODPj2gpODKJY5Yp4DOsLBFxWbvXN755KWylJm%2BoOd4zEL9Hpubuy2gyyfxh8oEfFutnYWdfB8PdESLWYvSqbElP9qo3u6KTmkhoacDauMNNjj0oy40DFV7Ql0aZj77xfGl7TJNHnIwgqOkenruYYNo6h724%2BzUQ7%2BvkCpZB%2BpGA562hYQiDxHVWOq0oDQl%2FQsoiY%2BcuI7iWq%2FZIBtHcXJ7kks%2Bh2fCNUPA82BzjnqktNts%2BRLdk1VSu%2BtqEn7QZCCsvEqk6FkfiOYkrsw092J8jsfIuEKypNjLxrKA9kiA19mxBD2suxQKCzwXGws7kEJvlhUiV9tArLIdZW0IORcxEzdzKmjtFhsjKy%2F44XYXdI5noQoRcvjZ1RMPACRqYg2V1%2BOwOepcOknRLLFdYgTkT5UApt%2FJhLM3jeFYprZV%2BZow2g8fP%2BU68hkKFWJj2yBbKqsrp25xkZX1DAjUw52IMYWaOhab8Kp05VrdNftqwRrymWF4OQSjbdfzmRZirK8FMJELEgER2PHjEAN9pGfLhCUiTJFbd5LBkOBMaxLr%2FA1SY9dXFz4RjzoU9ExfJCmx%2FI9FKEGT3n2cmzl2X42L3Jh%2BAbQq6sA%2BSs1kitoa4TAYgKHaoybHUDJ51oETdeI%2F9ThSmjWGkyLi5QAGWhL0BG1UsTyRGRJOldKBrYJeB8ljLJHfATWTEQBXBDnQexOHTB%2BUn44zExFE4vLytcu5NwpWrUxO%2F0ZICUGM7hGABXym0V6ZvDST0E370St9MIWQOTWngeoQHUTdCJUP04spMBMS8LSker9cReVQkULFDIZDFPrhTzBl6sed9wcZQTbL%2BBDqMyaN3RJPh%2Fanbx%2BIv%2BqgQdAa3M9Z5JmvYlh4qop%2BHo1F1W5gbOE9YKLgAnWytXElU4G8GtW47lhgFE6gaSs%2Bgs37sFvi0PPVvA5dnCBgILTwoKd%2F%2BDoL9F6inlM7H4rOTzD79KJgKlZO%2FZgt22UsKhrAaXU5ZcLrAglTVKJEmNJvORGN1vqrcfSMizfpsgbIe9zno%2BgBoKVXgIL%2FVI8dB1O5o%2FR3Suez%2FgD7M781ShjKpIIORM%2FnxG%2BjjhhgPwsn2IoXsPGPqYHXA63zJ07M2GPEykQwJBYLK808qYxuIew4frk52nhCsnCYmXiR6CuapvE1IwRB4%2FQftDbEn%2BAucIr1oxrLabRj9q4ae0%2BfXkHnteAJwXRbVkR0mctVSwEbqhJiMSZUp9DNbEDMmjX22m3ABpkrPQQTP3S1sib5pD2VRKRd%2BeNAjLYyT0hGrdjWJZy24OYXRoWQAIhGBZRxuBFMjjZQhpgrWo8SiFYbojcHO8V5DyscJpLTHyx9Fimassyo5U6WNtquUMYgccaHY5amgR3PQzq3ToNM5ABnoB9kuxsebqmYZm0R9qxJbFXCQ1UPyFIbxoUraTJFDpCk0Wk9GaYJKz%2F6oHwEP0Q14lMtlddQsOAU9zlYdMVHiT7RQP3XCmWYDcHCGbVRHGnHuwzScA0BaSBOGkz3lM8CArjrBsyEoV6Ys4qgDK3ykQQPZ3hCRGNXQTNNXbEb6tDiTDLKOyMzRhCFT%2BmAUmiYbV3YQVqFVp9dorv%2BTsLeCykS2b5yyu8AV7IS9cxcL8z4Kfwp%2BxJyYLv1OsxQCZwTB4a8BZ%2F5EdxTBJthApqyfd9u3ifr%2FWILTqq5VqgwMT9SOxbSGWLQJUUWCVi4k9tho9nEsbUh7U6NUsLmkYFXOhZ0kmamaJLRNJzSj%2Fqn4Mso6zb6iLLBXoaZ6AqeWCjHQm2lztnejYYM2eubnpBdKVLORZhudH3JF1waBJKA9%2BW8EhMj3Kzf0L4vi4k6RoHh3Z5YgmSZmk6ns4fjScjAoL8GoOECgqgYEBYUGFVO4FUv4%2FYtowhEmTs0vrvlD%2FCrisnoBNDAcUi%2FteY7OctFlmARQzjOItrrlKuPO6E2Ox93L4O%2F4DcgV%2FdZ7qR3VBwVQxP1GCieA4RIpweYJ5FoYrHxqRBdJjnqbsikA2Ictbb8vE1GYIo9dacK0REgDX4smy6GAkxlH1yCGGsk%2BtgiDhNKuKu3yNrMdxafmKTF632F8Vx4BNK57GvlFisrkjN9WDAtjsWA0ENT2e2nETUb%2Fn7qwhvGnrHuf5bX6Vh%2Fn3xffU3PeHdR%2BFA92i6ufT3AlyAREoNDh6chiMWTvjKjHDeRhOa9YkOQRq1vQXEMppAQVwHCuIcV2g5rBn6GmZZpTR7vnSD6ZmhdSl176gqKTXu5E%2BYbfL0adwNtHP7dT7t7b46DVZIkzaRJOM%2BS6KcrzYVg%2BT3wSRFRQashjfU18NutrKa%2F7PXbtuJvpIjbgPeqd%2BpjmRw6YKpnANFSQcpzTZgpSNJ6J7uiagAbir%2F8tNXJ%2FOsOnRh6iuIexxrmkIneAgz8QoLmiaJ8sLQrELVK2yn3wOHp57BAZJhDZjTBzyoRAuuZ4eoxHruY1pSb7qq79cIeAdOwin4GdgMeIMHeG%2BFZWYaiUQQyC5b50zKjYw97dFjAeY2I4Bnl105Iku1y0lMA1ZHolLx19uZnRdILcXKlZGQx%2FGdEqSsMRU1BIrFqRcV1qQOOHyxOLXEGcbRtAEsuAC2V4K3p5mFJ22IDWaEkk9ttf5Izb2LkD1MnrSwztXmmD%2FQi%2FEmVEFBfiKGmftsPwVaIoZanlKndMZsIBOskFYpDOq3QUs9aSbAAtL5Dbokus2G4%2FasthNMK5UQKCOhU97oaOYNGsTah%2BjfCKsZnTRn5TbhFX8ghg8CBYt%2FBjeYYYUrtUZ5jVij%2Fop7V5SsbA4mYTOwZ46hqdpbB6Qvq3AS2HHNkC15pTDIcDNGsMPXaBidXYPHc6PJAkRh29Vx8KcgX46LoUQBhRM%2B3SW6Opll%2FwgxxsPgKJKzr5QCmwkUxNbeg6Wj34SUnEzOemSuvS2OetRCO8Tyy%2BQbSKVJcqkia%2BGvDefFwMOmgnD7h81TUtMn%2BmRpyJJ349HhAnoWFTejhpYTL9G8N2nVg1qkXBeoS9Nw2fB27t7trm7d%2FQK7Cr4uoCeOQ7%2F8JfKT77KiDzLImESHw%2F0wf73QeHu74hxv7uihi4fTX%2BXEwAyQG3264dwv17aJ5N335Vt9sdrAXhPOAv8JFvzqyYXwfx8WYJaef1gMl98JRFyl5Mv5Uo%2FoVH5ww5OzLFsiTPDns7fS6EURSSWd%2F92BxMYQ8sBaH%2Bj%2BwthQPdVgDGpTfi%2BJQIWMD8xKqULliRH01rTeyF8x8q%2FGBEEEBrAJMPf25UQwi0b8tmqRXY7kIvNkzrkvRWLnxoGYEJsz8u4oOyMp8cHyaybb1HdMCaLApUE%2B%2F7xLIZGP6H9xuSEXp1zLIdjk5nBaMuV%2FyTDRRP8Y2ww5RO6d2D94o%2B6ucWIqUAvgHIHXhZsmDhjVLczmZ3ca0Cb3PpKwt2UtHVQ0BgFJsqqTsnzZPlKahRUkEu4qmkJt%2Bkqdae76ViWe3STan69yaF9%2BfESD2lcQshLHWVu4ovItXxO69bqC5p1nZLvI8NdQB9s9UNaJGlQ5mG947ipdDA0eTIw%2FA1zEdjWquIsQXXGIVEH0thC5M%2BW9pZe7IhAVnPJkYCCXN5a32HjN6nsvokEqRS44tGIs7s2LVTvcrHAF%2BRVmI8L4HUYk4x%2B67AxSMJKqCg8zrGOgvK9kNMdDrNiUtSWuHFpC8%2Fp5qIQrEo%2FH%2B1l%2F0cAwQ2nKmpWxKcMIuHY44Y6DlkpO48tRuUGBWT0FyHwSKO72Ud%2BtJUfdaZ4CWNijzZtlRa8%2BCkmO%2FEwHYfPZFU%2FhzjFWH7vnzHRMo%2BaF9u8qHSAiEkA2HjoNQPEwHsDKOt6hOoK3Ce%2F%2B%2F9boMWDa44I6FrQhdgS7OnNaSzwxWKZMcyHi6LN4WC6sSj0qm2PSOGBTvDs%2FGWJS6SwEN%2FULwpb4LQo9fYjUfSXRwZkynUazlSpvX9e%2BG2zor8l%2BYaMxSEomDdLHGcD6YVQPegTaA74H8%2BV4WvJkFUrjMLGLlvSZQWvi8%2FQA7yzQ8GPno%2F%2F5SJHRP%2FOqKObPCo81s%2F%2B6WgLqykYpGAgQZhVDEBPXWgU%2FWzFZjKUhSFInufPRiMAUULC6T11yL45ZrRoB4DzOyJShKXaAJIBS9wzLYIoCEcJKQW8GVCx4fihqJ6mshBUXSw3wWVj3grrHQlGNGhIDNNzsxQ3M%2BGWn6ASobIWC%2BLbYOC6UpahVO13Zs2zOzZC8z7FmA05JhUGyBsF4tsG0drcggIFzgg%2Fkpf3%2BCnAXKiMgIE8Jk%2FMhpkc8DUJEUzDSnWlQFme3d0sHZDrg7LavtsEX3cHwjCYA17pMTfx8Ajw9hHscN67hyo%2BRJQ4458RmPywXykkVcW688oVUrQhahpPRvTWPnuI0B%2BSkQu7dCyvLRyFYlC1LG1gRCIvn3rwQeINzZQC2KXq31FaR9UmVV2QeGVqBHjmE%2BVMd3b1fhCynD0pQNhCG6%2FWCDbKPyE7NRQzL3BzQAJ0g09aUzcQA6mUp9iZFK6Sbp%2FYbHjo%2B%2B7%2FWj8S4YNa%2BZdqAw1hDrKWFXv9%2BzaXpf8ZTDSbiqsxnwN%2FCzK5tPkOr4tRh2kY3Bn9JtalbIOI4b3F7F1vPQMfoDcdxMS8CW9m%2FNCW%2FHILTUVWQIPiD0j1A6bo8vsv6P1hCESl2abrSJWDrq5sSzUpwoxaCU9FtJyYH4QFMxDBpkkBR6kn0LMPO%2B5EJ7Z6bCiRoPedRZ%2FP0SSdii7ZnPAtVwwHUidcdyspwncz5uq6vvm4IEDbJVLUFCn%2FLvIHfooUBTkFO130FC7CmmcrKdgDJcid9mvVzsDSibOoXtIf9k6ABle3PmIxejodc4aob0QKS432srrCMndbfD454q52V01G4q913mC5HOsTzWF4h2No1av1VbcUgWAqyoZl%2B11PoFYnNv2HwAODeNRkHj%2B8SF1fcvVBu6MrehHAZK1Gm69ICcTKizykHgGFx7QdowTVAsYEF2tVc0Z6wLryz2FI1sc5By2znJAAmINndoJiB4sfPdPrTC8RnkW7KRCwxC6YvXg5ahMlQuMpoCSXjOlBy0Kij%2BbsCYPbGp8BdCBiLmLSAkEQRaieWo1SYvZIKJGj9Ur%2FeWHjiB7SOVdqMAVmpBvfRiebsFjger7DC%2B8kRFGtNrTrnnGD2GAJb8rQCWkUPYHhwXsjNBSkE6lGWUj5QNhK0DMNM2l%2BkXRZ0KLZaGsFSIdQz%2FHXDxf3%2FTE30%2BDgBKWGWdxElyLccJfEpjsnszECNoDGZpdwdRgCixeg9L4EPhH%2BRptvRMVRaahu4cySjS3P5wxAUCPkmn%2BrhyASpmiTaiDeggaIxYBmtLZDDhiWIJaBgzfCsAGUF1Q1SFZYyXDt9skCaxJsxK2Ms65dmdp5WAZyxik%2FzbrTQk5KmgxCg%2Ff45L0jywebOWUYFJQAJia7XzCV0x89rpp%2Ff3AVWhSPyTanqmik2SkD8A3Ml4NhIGLAjBXtPShwKYfi2eXtrDuKLk4QlSyTw1ftXgwqA2jUuopDl%2B5tfUWZNwBpEPXghzbBggYCw%2Fdhy0ntds2yeHCDKkF%2FYxQjNIL%2FF%2F37jLPHCKBO9ibwYCmuxImIo0ijV2Wbg3kSN2psoe8IsABv3RNFaF9uMyCtCYtqcD%2BqNOhwMlfARQUdJ2tUX%2BMNJqOwIciWalZsmEjt07tfa8ma4cji9sqz%2BQ9hWfmMoKEbIHPOQORbhQRHIsrTYlnVTNvcq1imqmmPDdVDkJgRcTgB8Sb6epCQVmFZe%2BjGDiNJQLWnfx%2BdrTKYjm0G8yH0ZAGMWzEJhUEQ4Maimgf%2Fbkvo8PLVBsZl152y5S8%2BHRDfZIMCbYZ1WDp4yrdchOJw8k6R%2B%2F2pHmydK4NIK2PHdFPHtoLmHxRDwLFb7eB%2BM4zNZcB9NrAgjVyzLM7xyYSY13ykWfIEEd2n5%2FiYp3ZdrCf7fL%2Ben%2BsIJu2W7E30MrAgZBD1rAAbZHPgeAMtKCg3NpSpYQUDWJu9bT3V7tOKv%2BNRiJc8JAKqqgCA%2FPNRBR7ChpiEulyQApMK1AyqcWnpSOmYh6yLiWkGJ2mklCSPIqN7UypWj3dGi5MvsHQ87MrB4VFgypJaFriaHivwcHIpmyi5LhNqtem4q0n8awM19Qk8BOS0EsqGscuuydYsIGsbT5GHnERUiMpKJl4ON7qjB4fEqlGN%2FhCky89232UQCiaeWpDYCJINXjT6xl4Gc7DxRCtgV0i1ma4RgWLsNtnEBRQFqZggCLiuyEydmFd7WlogpkCw5G1x4ft2psm3KAREwVwr1Gzl6RT7FDAqpVal34ewVm3VH4qn5mjGj%2BbYL1NgfLNeXDwtmYSpwzbruDKpTjOdgiIHDVQSb5%2FzBgSMbHLkxWWgghIh9QTFSDILixVwg0Eg1puooBiHAt7DzwJ7m8i8%2Fi%2BjHvKf0QDnnHVkVTIqMvIQImOrzCJwhSR7qYB5gSwL6aWL9hERHCZc4G2%2BJrpgHNB8eCCmcIWIQ6rSdyPCyftXkDlErUkHafHRlkOIjxGbAktz75bnh50dU7YHk%2BMz7wwstg6RFZb%2BTZuSOx1qqP5C66c0mptQmzIC2dlpte7vZrauAMm%2F7RfBYkGtXWGiaWTtwvAQiq2oD4YixPLXE2khB2FRaNRDTk%2B9sZ6K74Ia9VntCpN4BhJGJMT4Z5c5FhSepRCRWmBXqx%2BwhVZC4me4saDs2iNqXMuCl6iAZflH8fscC1sTsy4PHeC%2BXYuqMBMUun5YezKbRKmEPwuK%2BCLzijPEQgfhahQswBBLfg%2FGBgBiI4QwAqzJkkyYAWtjzSg2ILgMAgqxYfwERRo3zruBL9WOryUArSD8sQOcD7fvIODJxKFS615KFPsb68USBEPPj1orNzFY2xoTtNBVTyzBhPbhFH0PI5AtlJBl2aSgNPYzxYLw7XTDBDinmVoENwiGzmngrMo8OmnRP0Z0i0Zrln9DDFcnmOoBZjABaQIbPOJYZGqX%2BRCMlDDbElcjaROLDoualmUIQ88Kekk3iM4OQrADcxi3rJguS4MOIBIgKgXrjd1WkbCdqxJk%2F4efRIFsavZA7KvvJQqp3Iid5Z0NFc5aiMRzGN3vrpBzaMy4JYde3wr96PjN90AYOIbyp6T4zj8LoE66OGcX1Ef4Z3KoWLAUF4BTg7ug%2FAbkG5UNQXAMkQezujSHeir2uTThgd3gpyzDrbnEdDRH2W7U6PeRvBX1ZFMP5RM%2BZu6UUZZD8hDPHldVWntTCNk7To8IeOW9yn2wx0gmurwqC60AOde4r3ETi5pVMSDK8wxhoGAoEX9NLWHIR33VbrbMveii2jAJlrxwytTHbWNu8Y4N8vCCyZjAX%2FpcsfwXbLze2%2BD%2Bu33OGBoJyAAL3jn3RuEcdp5If8O%2Ba4NKWvxOTyDltG0IWoHhwVGe7dKkCWFT%2B%2Btm%2BhaBCikRUUMrMhYKZJKYoVuv%2FbsJzO8DwfVIInQq3g3BYypiz8baogH3r3GwqCwFtZnz4xMjAVOYnyOi5HWbFA8n0qz1OjSpHWFzpQOpvkNETZBGpxN8ybhtqV%2FDMUxd9uFZmBfKXMCn%2FSqkWJyKPnT6lq%2B4zBZni6fYRByJn6OK%2BOgPBGRAJluwGSk4wxjOOzyce%2FPKODwRlsgrVkdcsEiYrqYdXo0Er2GXi2GQZd0tNJT6c9pK1EEJG1zgDJBoTVuCXGAU8BKTvCO%2FcEQ1Wjk3Zzuy90JX4m3O5IlxVFhYkSUwuQB2up7jhvkm%2BbddRQu5F9s0XftGEJ9JSuSk%2BZachCbdU45fEqbugzTIUokwoAKvpUQF%2FCvLbWW5BNQFqFkJg2f30E%2F48StNe5QwBg8zz3YAJ82FZoXBxXSv4QDooDo79NixyglO9AembuBcx5Re3CwOKTHebOPhkmFC7wNaWtoBhFuV4AkEuJ0J%2B1pT0tLkvFVZaNzfhs%2FKd3%2BA9YsImlO4XK4vpCo%2FelHQi%2F9gkFg07xxnuXLt21unCIpDV%2BbbRxb7FC6nWYTsMFF8%2B1LUg4JFjVt3vqbuhHmDKbgQ4e%2BRGizRiO8ky05LQGMdL2IKLSNar0kNG7lHJMaXr5mLdG3nykgj6vB%2FKVijd1ARWkFEf3yiUw1v%2FWaQivVUpIDdSNrrKbjO5NPnxz6qTTGgYg03HgPhDrCFyYZTi3XQw3HXCva39mpLNFtz8AiEhxAJHpWX13gCTAwgm9YTvMeiqetdNQv6IU0hH0G%2BZManTqDLPjyrOse7WiiwOJCG%2BJ0pZYULhN8NILulmYYvmVcV2MjAfA39sGKqGdjpiPo86fecg65UPyXDIAOyOkCx5NQsLeD4gGVjTVDwOHWkbbBW0GeNjDkcSOn2Nq4cEssP54t9D749A7M1AIOBl0Fi0sSO5v3P7LCBrM6ZwFY6kp2FX6AcbGUdybnfChHPyu6WlRZ2Fwv9YM0RMI7kISRgR8HpQSJJOyTfXj%2F6gQKuihPtiUtlCQVPohUgzfezTg8o1b3n9pNZeco1QucaoXe40Fa5JYhqdTspFmxGtW9h5ezLFZs3j%2FN46f%2BS2rjYNC2JySXrnSAFhvAkz9a5L3pza8eYKHNoPrvBRESpxYPJdKVUxBE39nJ1chrAFpy4MMkf0qKgYALctGg1DQI1kIymyeS2AJNT4X240d3IFQb%2F0jQbaHJ2YRK8A%2Bls6WMhWmpCXYG5jqapGs5%2FeOJErxi2%2F2KWVHiPellTgh%2FfNl%2F2KYPKb7DUcAg%2BmCOPQFCiU9Mq%2FWLcU1xxC8aLePFZZlE%2BPCLzf7ey46INWRw2kcXySR9FDgByXzfxiNKwDFbUSMMhALPFSedyjEVM5442GZ4hTrsAEvZxIieSHGSgkwFh%2FnFNdrrFD4tBH4Il7fW6ur4J8Xaz7RW9jgtuPEXQsYk7gcMs2neu3zJwTyUerHKSh1iTBkj2YJh1SSOZL5pLuQbFFAvyO4k1Hxg2h99MTC6cTUkbONQIAnEfGsGkNFWRbuRyyaEZInM5pij73EA9rPIUfU4XoqQpHT9THZkW%2BoKFLvpyvTBMM69tN1Ydwv1LIEhHsC%2BueVG%2Bw%2BkyCPsvV3erRikcscHjZCkccx6VrBkBRusTDDd8847GA7p2Ucy0y0HdSRN6YIBciYa4vuXcAZbQAuSEmzw%2BH%2FAuOx%2BaH%2BtBL88H57D0MsqyiZxhOEQkF%2F8DR1d2hSPMj%2FsNOa5rxcUnBgH8ictv2J%2Bcb4BA4v3MCShdZ2vtK30vAwkobnEWh7rsSyhmos3WC93Gn9C4nnAd%2FPjMMtQfyDNZsOPd6XcAsnBE%2FmRHtHEyJMzJfZFLE9OvQa0i9kUmToJ0ZxknTgdl%2FXPV8xoh0K7wNHHsnBdvFH3sv52lU7UFteseLG%2FVanIvcwycVA7%2BBE1Ulyb20BvwUWZcMTKhaCcmY3ROpvonVMV4N7yBXTL7IDtHzQ4CCcqF66LjF3xUqgErKzolLyCG6Kb7irP%2FMVTCCwGRxfrPGpMMGvPLgJ881PHMNMIO09T5ig7AzZTX%2F5PLlwnJLDAPfuHynSGhV4tPqR3gJ4kg4c06c%2FF1AcjGytKm2Yb5jwMotF7vro4YDLWlnMIpmPg36NgAZsGA0W1spfLSue4xxat0Gdwd0lqDBOgIaMANykwwDKejt5YaNtJYIkrSgu0KjIg0pznY0SCd1qlC6R19g97UrWDoYJGlrvCE05J%2F5wkjpkre727p5PTRX5FGrSBIfJqhJE%2FIS876PaHFkx9pGTH3oaY3jJRvLX9Iy3Edoar7cFvJqyUlOhAEiOSAyYgVEGkzHdug%2BoRHIEOXAExMiTSKU9A6nmRC8mp8iYhwWdP2U%2F5EkFAdPrZw03YA3gSyNUtMZeh7dDCu8pF5x0VORCTgKp07ehy7NZqKTpIC4UJJ89lnboyAfy5OyXzXtuDRbtAFjZRSyGFTpFrXwkpjSLIQIG3N0Vj4BtzK3wdlkBJrO18MNsgseR4BysJilI0wI6ZahLhBFA0XBmV8d4LUzEcNVb0xbLjLTETYN8OEVqNxkt10W614dd1FlFFVTIgB7%2FBQQp1sWlNolpIu4ekxUTBV7NmxOFKEBmmN%2BnA7pvF78%2FRII5ZHA09OAiE%2F66MF6HQ%2BqVEJCHxwymukkNvzqHEh52dULPbVasfQMgTDyBZzx4007YiKdBuUauQOt27Gmy8ISclPmEUCIcuLbkb1mzQSqIa3iE0PJh7UMYQbkpe%2BhXjTJKdldyt2mVPwywoODGJtBV1lJTgMsuSQBlDMwhEKIfrvsxGQjHPCEfNfMAY2oxvyKcKPUbQySkKG6tj9AQyEW3Q5rpaDJ5Sns9ScLKeizPRbvWYAw4bXkrZdmB7CQopCH8NAmqbuciZChHN8lVGaDbCnmddnqO1PQ4ieMYfcSiBE5zzMz%2BJV%2F4eyzrzTEShvqSGzgWimkNxLvUj86iAwcZuIkqdB0VaIB7wncLRmzHkiUQpPBIXbDDLHBlq7vp9xwuC9AiNkIptAYlG7Biyuk8ILdynuUM1cHWJgeB%2BK3wBP%2FineogxkvBNNQ4AkW0hvpBOQGFfeptF2YTR75MexYDUy7Q%2F9uocGsx41O4IZhViw%2F2FvAEuGO5g2kyXBUijAggWM08bRhXg5ijgMwDJy40QeY%2FcQpUDZiIzmvskQpO5G1zyGZA8WByjIQU4jRoFJt56behxtHUUE%2Fom7Rj2psYXGmq3llVOCgGYKNMo4pzwntITtapDqjvQtqpjaJwjHmDzSVGLxMt12gEXAdLi%2FcaHSM3FPRGRf7dB7YC%2BcD2ho6oL2zGDCkjlf%2FDFoQVl8GS%2F56wur3rdV6ggtzZW60MRB3g%2BU1W8o8cvqIpMkctiGVMzXUFI7FacFLrgtdz4mTEr4aRAaQ2AFQaNeG7GX0yOJgMRYFziXdJf24kg%2FgBQIZMG%2FYcPEllRTVNoDYR6oSJ8wQNLuihfw81UpiKPm714bZX1KYjcXJdfclCUOOpvTxr9AAJevTY4HK%2FG7F3mUc3GOAKqh60zM0v34v%2BELyhJZqhkaMA8UMMOU90f8RKEJFj7EqepBVwsRiLbwMo1J2zrE2UYJnsgIAscDmjPjnzI8a719Wxp757wqmSJBjXowhc46QN4RwKIxqEE6E5218OeK7RfcpGjWG1jD7qND%2B%2FGTk6M56Ig4yMsU6LUW1EWE%2BfIYycVV1thldSlbP6ltdC01y3KUfkobkt2q01YYMmxpKRvh1Z48uNKzP%2FIoRIZ%2FF6buOymSnW8gICitpJjKWBscSb9JJKaWkvEkqinAJ2kowKoqkqZftRqfRQlLtKoqvTRDi2vg%2FRrPD%2Fd3a09J8JhGZlEkOM6znTsoMCsuvTmywxTCDhw5dd0GJOHCMPbsj3QLkTE3MInsZsimDQ3HkvthT7U9VA4s6G07sID0FW4SHJmRGwCl%2BMu4xf0ezqeXD2PtPDnwMPo86sbwDV%2B9PWcgFcARUVYm3hrFQrHcgMElFGbSM2A1zUYA3baWfheJp2AINmTJLuoyYD%2FOwA4a6V0ChBN97E8YtDBerUECv0u0TlxR5yhJCXvJxgyM73Bb6pyq0jTFJDZ4p1Am1SA6sh8nADd1hAcGBMfq4d%2FUfwnmBqe0Jun1n1LzrgKuZMAnxA3NtCN7Klf4BH%2B14B7ibBmgt0TGUafVzI4uKlpF7v8NmgNjg90D6QE3tbx8AjSAC%2BOA1YJvclyPKgT27QpIEgVYpbPYGBsnyCNrGz9XUsCHkW1QAHgL2STZk12QGqmvAB0NFteERkvBIH7INDsNW9KKaAYyDMdBEMzJiWaJHZALqDxQDWRntumSDPcplyFiI1oDpT8wbwe01AHhW6%2BvAUUBoGhY3CT2tgwehdPqU%2F4Q7ZLYvhRl%2FogOvR9O2%2BwkkPKW5vCTjD2fHRYXONCoIl4Jh1bZY0ZE1O94mMGn%2FdFSWBWzQ%2FVYk%2BGezi46RgiDv3EshoTmMSlioUK6MQEN8qeyK6FRninyX8ZPeUWjjbMJChn0n%2FyJvrq5bh5UcCAcBYSafTFg7p0jDgrXo2QWLb3WpSOET%2FHh4oSadBTvyDo10IufLzxiMLAnbZ1vcUmj3w7BQuIXjEZXifwukVxrGa9j%2BDXfpi12m1RbzYLg9J2wFergEwOxFyD0%2FJstNK06ZN2XdZSGWxcJODpQHOq4iKqjqkJUmPu1VczL5xTGUfCgLEYyNBCCbMBFT%2FcUP6pE%2FmujnHsSDeWxMbhrNilS5MyYR0nJyzanWXBeVcEQrRIhQeJA6Xt4f2eQESNeLwmC10WJVHqwx8SSyrtAAjpGjidcj1E2FYN0LObUcFQhafUKTiGmHWRHGsFCB%2BHEXgrzJEB5bp0QiF8ZHh11nFX8AboTD0PS4O1LqF8XBks2MpjsQnwKHF6HgaKCVLJtcr0XjqFMRGfKv8tmmykhLRzu%2BvqQ02%2BKpJBjaLt9ye1Ab%2BBbEBhy4EVdIJDrL2naV0o4wU8YZ2Lq04FG1mWCKC%2BUwkXOoAjneU%2FxHplMQo2cXUlrVNqJYczgYlaOEczVCs%2FOCgkyvLmTmdaBJc1iBLuKwmr6qtRnhowngsDxhzKFAi02tf8bmET8BO27ovJKF1plJwm3b0JpMh38%2BxsrXXg7U74QUM8ZCIMOpXujHntKdaRtsgyEZl5MClMVMMMZkZLNxH9%2Bb8fH6%2Bb8Lev30A9TuEVj9CqAdmwAAHBPbfOBFEATAPZ2CS0OH1Pj%2F0Q7PFUcC8hDrxESWdfgFRm%2B7vvWbkEppHB4T%2F1ApWnlTIqQwjcPl0VgS1yHSmD0OdsCVST8CQVwuiew1Y%2Bg3QGFjNMzwRB2DSsAk26cmA8lp2wIU4p93AUBiUHFGOxOajAqD7Gm6NezNDjYzwLOaSXRBYcWipTSONHjUDXCY4mMI8XoVCR%2FRrs%2FJLKXgEx%2BqkmeDlFOD1%2FyTQNDClRuiUyKYCllfMiQiyFkmuTz2vLsBNyRW%2Bxz%2B5FElFxWB28VjYIGZ0Yd%2B5wIjkcoMaggxswbT0pCmckRAErbRlIlcOGdBo4djTNO8FAgQ%2BlT6vPS60BwTRSUAM3ddkEAZiwtEyArrkiDRnS7LJ%2B2hwbzd2YDQagSgACpsovmjil5wfPuXq3GuH0CyE7FK3M4FgRaFoIkaodORrPx1%2BJpI9psyNYIFuJogZa0%2F1AhOWdlHQxdAgbwacsHqPZo8u%2FngAH2GmaTdhYnBfSDbBfh8CHq6Bx5bttP2%2BRdM%2BMAaYaZ0Y%2FADkbNCZuAyAVQa2OcXOeICmDn9Q%2FeFkDeFQg5MgHEDXq%2FtVjj%2Bjtd26nhaaolWxs1ixSUgOBwrDhRIGOLyOVk2%2FBc0UxvseQCO2pQ2i%2BKrfhu%2FWeBovNb5dJxQtJRUDv2mCwYVpNl2efQM9xQHnK0JwLYt%2FU0Wf%2BphiA4uw8G91slC832pmOTCAoZXohg1fewCZqLBhkOUBofBWpMPsqg7XEXgPfAlDo2U5WXjtFdS87PIqClCK5nW6adCeXPkUiTGx0emOIDQqw1yFYGHEVx20xKjJVYe0O8iLmnQr3FA9nSIQilUKtJ4ZAdcTm7%2BExseJauyqo30hs%2B1qSW211A1SFAOUgDlCGq7eTIcMAeyZkV1SQJ4j%2Fe1Smbq4HcjqgFbLAGLyKxlMDMgZavK5NAYH19Olz3la%2FQCTiVelFnU6O%2FGCvykqS%2FwZJDhKN9gBtSOp%2F1SP5VRgJcoVj%2Bkmf2wBgv4gjrgARBWiURYx8xENV3bEVUAAWWD3dYDKAIWk5opaCFCMR5ZjJExiCAw7gYiSZ2rkyTce4eNMY3lfGn%2B8p6%2BvBckGlKEXnA6Eota69OxDO9oOsJoy28BXOR0UoXNRaJD5ceKdlWMJlOFzDdZNpc05tkMGQtqeNF2lttZqNco1VtwXgRstLSQ6tSPChgqtGV5h2DcDReIQadaNRR6AsAYKL5gSFsCJMgfsaZ7DpKh8mg8Wz8V7H%2BgDnLuMxaWEIUPevIbClgap4dqmVWSrPgVYCzAoZHIa5z2Ocx1D%2FGvDOEqMOKLrMefWIbSWHZ6jbgA8qVBhYNHpx0P%2BjAgN5TB3haSifDcApp6yymEi6Ij%2FGsEpDYUgcHATJUYDUAmC1SCkJ4cuZXSAP2DEpQsGUjQmKJfJOvlC2x%2FpChkOyLW7KEoMYc5FDC4v2FGqSoRWiLsbPCiyg1U5yiHZVm1XLkHMMZL11%2Fyxyw0UnGig3MFdZklN5FI%2FqiT65T%2BjOXOdO7XbgWurOAZR6Cv9uu1cm5LjkXX4xi6mWn5r5NjBS0gTliHhMZI2WNqSiSphEtiCAwnafS11JhseDGHYQ5%2BbqWiAYiAv6Jsf79%2FVUs4cIl%2Bn6%2BWOjcgB%2F2l5TreoAV2717JzZbQIR0W1cl%2FdEqCy5kJ3ZSIHuU0vBoHooEpiHeQWVkkkOqRX27eD1FWw4BfO9CJDdKoSogQi3hAAwsPRFrN5RbX7bqLdBJ9JYMohWrgJKHSjVl1sy2xAG0E3sNyO0oCbSGOxCNBRRXTXenYKuwAoDLfnDcQaCwehUOIDiHAu5m5hMpKeKM4sIo3vxACakIxKoH2YWF2QM84e6F5C5hJU4g8uxuFOlAYnqtwxmHyNEawLW%2FPhoawJDrGAP0JYWHgAVUByo%2FbGdiv2T2EMg8gsS14%2FrAdzlOYazFE7w4OzxeKiWdm3nSOnQRRKXSlVo8HEAbBfyJMKqoq%2BSCcTSx5NDtbFwNlh8VhjGGDu7JG5%2FTAGAvniQSSUog0pNzTim8Owc6QTuSKSTXlQqwV3eiEnklS3LeSXYPXGK2VgeZBqNcHG6tZHvA3vTINhV0ELuQdp3t1y9%2BogD8Kk%2FW7QoRN1UWPqM4%2BxdygkFDPLoTaumKReKiLWoPHOfY54m3qPx4c%2B4pgY3MRKKbljG8w4wvz8pxk3AqKsy4GMAkAtmRjRMsCxbb4Q2Ds0Ia9ci8cMT6DmsJG00XaHCIS%2Bo3F8YVVeikw13w%2BOEDaCYYhC0ZE54kA4jpjruBr5STWeqQG6M74HHL6TZ3lXrd99ZX%2B%2B7LhNatQaZosuxEf5yRA15S9gPeHskBIq3Gcw81AGb9%2FO53DYi%2F5CsQ51EmEh8Rkg4vOciClpy4d04eYsfr6fyQkBmtD%2BP8sNh6e%2BXYHJXT%2FlkXxT4KXU5F2sGxYyzfniMMQkb9OjDN2C8tRRgTyL7GwozH14PrEUZc6oz05Emne3Ts5EG7WolDmU8OB1LDG3VrpQxp%2BpT0KYV5dGtknU64JhabdqcVQbGZiAxQAnvN1u70y1AnmvOSPgLI6uB4AuDGhmAu3ATkJSw7OtS%2F2ToPjqkaq62%2F7WFG8advGlRRqxB9diP07JrXowKR9tpRa%2BjGJ91zxNTT1h8I2PcSfoUPtd7NejVoH03EUcqSBuFZPkMZhegHyo2ZAITovmm3zAIdGFWxoNNORiMRShgwdYwFzkPw5PA4a5MIIQpmq%2Bnsp3YMuXt%2FGkXxLx%2FP6%2BZJS0lFyz4MunC3eWSGE8xlCQrKvhKUPXr0hjpAN9ZK4PfEDrPMfMbGNWcHDzjA7ngMxTPnT7GMHar%2BgMQQ3NwHCv4zH4BIMYvzsdiERi6gebRmerTsVwZJTRsL8dkZgxgRxmpbgRcud%2BYlCIRpPwHShlUSwuipZnx9QCsEWziVazdDeKSYU5CF7UVPAhLer3CgJOQXl%2Fzh575R5rsrmRnKAzq4POFdgbYBuEviM4%2BLVC15ssLNFghbTtHWerS1hDt5s4qkLUha%2FqpZXhWh1C6lTQAqCNQnaDjS7UGFBC6wTu8yFnKJnExCnAs3Ok9yj5KpfZESQ4lTy5pTGTnkAUpxI%2ByjEldJfSo4y0QhG4i4IwkRFGcjWY8%2BEzgYYJUK7BXQksLxAww%2FYYWBMhJILB9e8ePEJ4OP7z%2B4%2FwOQDl64iOYDp26DaONPxpKtBxq%2FaTzRGarm3VkPYTLJKx6Z%2FMw2YbBGseJhPMwhhNswrIkyvV2BYzrvZbxLpKwcWJhYmFtVZ%2BlPEq91FzVp1HlQY1bZVLqeNR9SAUn6n0E28k%2FUuGkNpP1DBI5ch%2FEehZfjUQ9aE41NhETExoPT2gGQz0IhWJbEOvTQ4wgcXCHHFBhewYUiFHuhRSAUVmEHeCRQHQkXGFwkAgyzREJCVN7TRnTon36Zw3tPhx4EALwNdwDv%2BJ41YSP4B2CQqz0EFgARZ4ESgBHQgROwAVn9GTI%2BHYexTUevLUeta4%2FDqKrbMVS%2BYqb8hUwYCrlgKtmAq1YCrFgKrd4qpXiqZcKn1oqdWipjYKpWwVPVYqW6xUpVipKqFR3QKjagVEtAqHpxUMTitsnFaJOKx2cVhswq35RVpyiq9lFVNIKnOQVMkgqtYxVNxiqQjFS7GKlSIVIsQqPIhUWwioigFQ%2B%2BKkN8VHr49HDw9Ebo9EDo9DTo9Crg9BDg9%2FWx7gWx7YWwlobYrOGxWPNisAaAHEyALpkAVDIAeWAArsABVXACYuAD5cAF6wAKFQAQqgAbVAAsoAAlQAUaYAfkwAvogBWQACOgAD9AAHSAAKT4GUdMiOvFngBTwCn2AZ7Dv6B6k%2F90B8%2ByRnkV144AIBoAMTQATGgAjNAA4YABgwABZgB%2FmQCwyAVlwCguASlwCEuAQFwB4uAMlwBYuAJlQAUVAAhUD2KgdpUDaJgaRMDFJgX5MC1JgWJEAokQCWRAHxEAWkQBMRADpEAMkQAYROAEecC484DRpwBDTnwNOdw05tjTmiNOYwtswhYFwLA7BYG4LA2BYGOLAwRYFuLAsxYFQJAohIEyJAMwkAwiQC0JAJgkAeiQBkJAFokAPCQA0JABwcD4Dgc4cDdDgaYcDIDgYgUC6CgWgUClCgUYUAVBQBOFAEYMALgwAgDA9QYAdIn8AZzeBB2L5EcWrenUT1KXienEsuJJ7x5U8XlTjc1NVzUyXFTGb1LlpUtWlTDIjqwE4LsagowoCi2gJLKAkpoBgJQNpAIhNqaEoneI6kiiqQ6Go%2Fn6j0cS%2Ba2gEU8gIHJ%2BBwfgZX4GL%2BBd%2FgW34FZ%2BBS%2FgUH4FN6BTegTvoEv6BJegRnYEF2A79gOvYDl2BdEjCkqkGtwXp0LNToIskOTXzh%2FF062yJ7AAAAEDAWAAABWhJ%2BKPEIJgBFxMVP7w2QJBGHASQnOBKXKFIdUK4igKA9IEaYJg%29%20format%28%27embedded%2Dopentype%27%29%2Curl%28data%3Aapplication%2Ffont%2Dwoff%3Bbase64%2Cd09GRgABAAAAAFuAAA8AAAAAsVwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABWAAAABwAAAAcbSqX3EdERUYAAAF0AAAAHwAAACABRAAET1MvMgAAAZQAAABFAAAAYGe5a4ljbWFwAAAB3AAAAsAAAAZy2q3jgWN2dCAAAAScAAAABAAAAAQAKAL4Z2FzcAAABKAAAAAIAAAACP%2F%2FAANnbHlmAAAEqAAATRcAAJSkfV3Cb2hlYWQAAFHAAAAANAAAADYFTS%2FYaGhlYQAAUfQAAAAcAAAAJApEBBFobXR4AABSEAAAAU8AAAN00scgYGxvY2EAAFNgAAACJwAAAjBv%2B5XObWF4cAAAVYgAAAAgAAAAIAFqANhuYW1lAABVqAAAAZ4AAAOisyygm3Bvc3QAAFdIAAAELQAACtG6o%2BU1d2ViZgAAW3gAAAAGAAAABsMYVFAAAAABAAAAAMw9os8AAAAA0HaBdQAAAADQdnOXeNpjYGRgYOADYgkGEGBiYGRgZBQDkixgHgMABUgASgB42mNgZulmnMDAysDCzMN0gYGBIQpCMy5hMGLaAeQDpRCACYkd6h3ux%2BDAoPD%2FP%2FOB%2FwJAdSIM1UBhRiQlCgyMADGWCwwAAAB42u2UP2hTQRzHf5ekaVPExv6JjW3fvTQ0sa3QLA5xylBLgyBx0gzSWEUaXbIoBBQyCQGHLqXUqYNdtIIgIg5FHJxEtwqtpbnfaV1E1KFaSvX5vVwGEbW6OPngk8%2FvvXfv7pt3v4SImojIDw6BViKxRgIVBaZwVdSv%2BxvXA%2BIuzqcog2cOkkvDNE8Lbqs74k64i%2B5Sf3u8Z2AnIRLbyVCyTflVSEXVoEqrrMqrgiqqsqqqWQ5xlAc5zWOc5TwXucxVnuE5HdQhHdFRHdNJndZZndeFLc%2FzsKJLQ%2FWV6BcrCdWkwspVKZVROaw0qUqqoqZZcJhdTnGGxznHBS5xhad5VhNWCuturBTXKZ3RObuS98pb9c57k6ql9rp2v1as5deb1r6s9q1GV2IrHSt73T631424YXzjgPwqt%2BRn%2BVG%2BlRvyirwsS%2FKCPCfPytPypDwhj8mjctRZd9acF86y89x55jxxHjkPnXstXfbt%2FpNjj%2FnwXW%2BcHa6%2FSYvZ7yEwbDYazDcIgoUGzY3h2HtqgUcs1AFPWKgTXrRQF7xkoQhRf7uF9hPFeyzUTTSwY6EoUUJY6AC8bSGMS4Ys1Au3WaiPSGGsMtkdGH2rzJgYHAaYjxIwQqtB1CnYkEZ9BM6ALOpROAfyqI%2FDBQudgidBETXuqRIooz4DV0AV9UV4GsyivkTEyMMmw1UYGdhkuAYjA5sMGMvIwCbDDRgZeAz1TXgcmDy3YeRhk%2BcOjCxsMjyAkYFNhscwMrDJ8BQ2886gXoaRhedQvyTSkDZ7uA6HLLQBI5vGntAbGHugTc53cMxC7%2BE4SKL%2BACOzNpk3YWTWJid%2BiRo5NXIKM3fBItAPW55FdJLY3FeHBDr90606JCIU9Jk%2BMs3%2FY%2F8L8jUq3y79bJ%2F0%2F%2BROoP4v9v%2F4%2Fmj%2Bi7HBXUd0%2FelU6IHfHt8Aj9EPGAAoAvgAAAAB%2F%2F8AAnjaxb0JfBvVtTA%2BdxaN1hltI1m2ZVuSJVneLVlSHCdy9oTEWchqtrBEJRAgCYEsQNhC2EsbWmpI2dqkQBoSYgKlpaQthVL0yusrpW77aEubfq%2Fly%2BujvJampSTW5Dvnzmi1E%2Bjr%2F%2F3%2BXmbu3Llz77nnbuece865DMu0MAy5jGtiOEZkOp8lTNeUwyLP%2FDH%2BrEH41ZTDHAtB5lkOowWMPiwayNiUwwTjE46AI5xwhFrINPXYn%2F7ENY0dbWHfZAiTZbL8ID%2FInAd5xz2NpIH4STpDGonHIJNE3OP1KG4ISaSNeBuITAyRLgIxoiEUhFAnmUpEiXSRSGqAQEw0kuyFUIb0k2gnGSApyBFi0il2SI5YLGb5MdFjXCey4mNHzQ7WwLGEdZiPPgYR64we8THZHAt%2BwnT84D%2Fx8YTpGPgheKH4CMEDVF9xBOIeP3EbQgGH29BGgpGkIxCMTCW9qUTA0Zsir%2BQUP1mt%2BP2KusevwIO6Bx%2FIaj8%2FOD5O0VNrZW2EsqZBWbO1skRiEKE0DdlKKaSVO5VAuRpqk8VQJAqY7ydxaK44YJvrO2EWjOoDBoFYzQbDNkON%2BUbiKoRkywMWWf1j4bEY2iIY1AeMgvmEz%2FkVo9v4FSc%2FaMZMrFbjl4zWLL0%2BY5FlyzNlEVYDudJohg8gPUP7kcB%2Fmn%2BG6cd%2B5PV4Q72dXCgocWJADBgUuDTwiXiGSyZo14HOEQ2lE6k0XDIEusexDzZOMXwt1Dutz%2BtqmxTvlskNWXXUQIbhaurum9GrePqm9Yaeabjkiqf%2BbUvzDOvb2Y1E%2BEX2DnemcTP%2FzLcuu7xjQXdAtjR0Lo5n4%2FHs%2FGtntMlysHt%2B29NXbH6se%2F%2FWbFcyu%2Br28H0MwzI30DYeYTLMXIA2EG8QlHpAsyS0EfEToR0a3utIxFPJ3kiIHCCrZ66b0e2xEmL1dM9YN%2FMwS5p01N5jMX%2FBLKt%2F1R83l0LyC29M6%2BiYxo%2FUNg%2FEF7c2WyyW5tYl8WnhWg2%2FhyySbD5UhnDyS7OcU0dnrFw%2BDfGdI7v4QfYIIzOMq9hFtY55gmvC7jZ2FK7sEdrn6IXBuucYhjsGdQ8z0yEbWkkczjjsE5hNAIZrPx2zOLZDmKNXcXtg7EMqidAEEWg%2BSJCBBNwxvxJfc%2FbZa%2BKKf%2BxoKZybnq5vaqpPTye7CiF%2BZFjxZ8%2F7Qij0hfOG%2FcowPA1rT1l4ymWnrKmxxqfErTVrpgwPlz1kC%2BOy8NMDz6c%2BIO38K%2Fx0xkPnLW8Kx6qGAoQdL%2BTD9V9rb%2B%2Fctn%2F%2Ftrxz8dUrZrD%2Fzk%2FferF0cNt1BzctmX2FZPXt%2FjnFCQNz4Ah%2FiKllGiCMs1w5Lkg0kiEwj6VTXCDKsX9rMpnvIj9pcDecXAIXMnqn2dTUbN6w0XQ9ue6FV%2FnnXCH7S3lPWGltVcLsH75ub3ab7A8M28caNrIeOr3o5Q0yFsYL80xaa0EY%2FUEczV7icUMY5pnelAkmUAXmHYjvFWFGxuqlSaow3OM%2B%2FiYY7%2Fl%2FhVELF4EjRqNR%2FbvRbOY%2BDUGzGR%2FOh3EqmE%2FugIQQguGt%2FeMYz%2F%2BL0cimjeZfQDI3phXMbMQsqH%2BCjwVz%2Fhf4idHovgVmB8gLvjbicDcC%2FNypP536E%2F9N%2FpuMibExdohBmNwyiaZdJGoigos7GpF222xrfnZhML%2F7Z%2BylaqP63Hr%2Bm7bdUkQ6%2F2cXqdfmvwixY%2Bs2ksXFeXcE%2BiX0Z%2BIow76DBNgjJ7TOdUK18iPsPflfQD%2BDPsZG2Aj9VmKMMJ4fYRrhIaxhTDR0Elh2vA6h%2FAE6xUb29mj3sjmL72petXjejPy%2Boel60M99tFduCI59N3221xe7apOvxs6aHs7vab1IqY2tv7q2xsHeHGml%2FcV06u%2F8S%2FxTjJ%2BJYc0bWEX0ukW6YmIbGkJRMdjJ9mYIH5QIdJF4hvRGyK7cC7ctImQRcUET99fGXOoft35GYLMQu%2Bg2smnkgZUrH8AL%2F9Si217IssJ916nv14ZrJrvdxLkQvrvtBcjgPC0NXOicO8Qf4mcxPqh3hgUw3DDfdvLJXngg7N3dN2zbPJSaed3OfZnMU7dvmznp3C3bruO%2BNmue0LFsy7S%2B6265%2BfCKFYdvvuW6vmlblnUI8xCXp37CrOZv4B9gauDBlYp7adcUXB5DNCwYImlXOJJKkAdvExXxVvKEYnCo%2B3eIskP9qrrfIYs71CccBjfXRC52udTHHdaP1A1ui%2FVvH1otbrLrpNXBsGX5B89QghDyimlvNB2KfkxZ5C9%2Fem3%2Bd1%2Bd%2F%2FIfFp2%2B2Oxn%2Fs%2B9n%2F79p39S3s8idN6g0yZObwJOgKUpNB3GyU0Ls0PbRzIRq4lcarLKOJBkLRzJQD4j2090XrbA7DW8K3jNF5hlGS5e4V2D17zgss4T20egOJte5iD0bReM9yjTxnQxCRj3c5kFzGJmGbNKmwGw39IJDJcXJZGMkaAB4jyJAKw0jt5IAuIE%2BA%2BU3cVAZZrq9zhDyBrU8oosuxcGNTzCKJfla7JjNVmuSb%2F%2BtuzN2H%2BX4vlB%2BPpdfMXXmuVsNiub1T34SFbjYw5itEvVi0K0Nt9pNJUMI7SLGRhf2xipfCYf8z5OdlGKayOucFeVPeS%2Fdbo3lBrbSMmwUiQN5%2Fed7g0Ds1s17IuZC5kNzM3MZ6EWCa0DtekdJfAxz%2BR%2FOX28sND7yRMTBcf%2B%2Bs8mQCQWHya4qBv%2FufeMoWyslPA9DtMxUknxkH%2FyfTnm2CMYzs%2BCq3r7PxY%2FMXomrvTEsRpfEGHa%2BWN8E1AHjElb7d06ddA7oK%2F%2B5Mdsv9EtPms0jv0Z5kf1FqPxWdFtfFr0kHfgDX0Y%2B5PRSG7RUj0tQr7rmfX8DH4G5W28kKeJLtmQsQkuwMP1pk16EV4sl7vrMJATfyUWo%2FGwEco4rh4XFQgaiUX9qxZHrMQqKnz%2Fc2d8b9TysYrAuXpP%2FRf%2FGr8b1qwwc5a%2BeuLa6S6sneNXToG2XrEJi4R5SGs8Sq2S3d97bsfCRaTdaLwKClRHt37mkudvXbjwVrLhuYeGhh56bvfQkHpk2CwvwClqgWwuBfndC3c8dwmstj81KkagcUgbfPY8Zje0W%2F82VPWJHmSq6pP8hPWpotc%2FEexDOK3qU%2BwngPhOCiO9MJRm8TJefjelrzoKnG2Bn%2B1NCUmPE4gHFmBN9jrTigRIpsACrc9Gstg58ULkp9467%2BGf%2FeFnD5%2F31lNrt2967dhrm7bzI%2BVT5m%2BfzKhvf2MzpICEm79Bopkn07lt1762adNr127LwVqQLdJ5%2BlpQDcvHPQtVY5knhYrK6q8%2FJsiP6EuhGZdFdaNszjvpqvc%2BPI0CdjN0AXsFOC3ZfALDJwr4q2Xq%2BGF%2BGNbsxUg5NLLIEXi8otcDQcUts0D8eQ1iVDRAMBTsYiNdRIxE09EIBJO9A2xqgERTaW86BUFn0OD2xFO97FAgFhF6OoQ7prYt4XwSeUgQHiJyDbeke9IdQntciLQ1FlJMaYcUNvZBg%2BFB1ubjlnRNvl3o6IEU2w7fdNPhm%2Fhh%2BFLysUu6%2B%2BDLHkOkrSHYEjH0tEPe7WdD3uyDgvAgK%2Fm4szFFR7ch0toUgBTdWHr7EpaWru6%2B6dmbbnqWEbV2EtxAsXiZAPTtGPSbHsotI2leoM8TePEqgSQprs7AGFf8kuOkPdZPXGb55POAW1d%2FjLST9v5YflasP6v%2FCO7%2BGNAPC2BMZWmsOjp2NNbfHwMCJD%2BLPVL%2BD%2FOYlWEEI%2F9jpPddOFkB5d1GSuKZYggmCCd7JUxD7EXAzxyirYnNDLdDZoFdx14kivkvGc3579Jm36reTTvDgBnaO6vzyQ6chQmlsMoIkIQ2%2BbBDWBud1Va4pcCn8CPqxlh%2FfgtG8IPaPH8C5wk6%2FnZDv69jurV5QhtwE0x2iqOsj9Mx8B9%2F0EaUdiPfOYYDCi%2Fq9jhWRuupMDEU0%2BCtX0sDFxv07T%2FK5niBPqN9%2BtQjgEc31NGCXFeMcCEuQBIc%2FBK4CO78u7EPYvl3yaEfK3vcb6qP1R2tI7vUjVDDUdKubsSrNjYKY1qBEa2P50SJoaXiksIoLiCwnxS6EBuBde87botNfdEWwYvF%2FR0%2Fu5yCqhGeEOR2ynSeyXjt6ka7neyye8kryBSWE52y%2BRBgogrXPZ8E1yIHoHIFUM%2BAbJhE7lbMtt8ApL%2BxmZW7PwbjAO0fAVoXQOuiSP%2FksIVdFZ0aulsamKUzwPZ%2FNYDMJRBPCxsBqLzqHyneXF6Ej9HlIFo7%2Bpg%2BjUb3unRmGpstGkm6etOuDBGA5wCMefp1gTHcdZlvPBXlOslvYTp1cd8UjYLVd%2FJ5awNrIOKLnIt9MD9qdrKrWCvA6ALm3QV9VrsPm60Q7%2BRHJHP%2B2hqfugo%2FMvI2H%2Fmqr4b9tFnKSRY1Y5Ek80Nm%2FWIhr1ikKnxGz9TWXrokf9xwujfvcOTtNTWnxd0F37Y2W79tteBqZ4G5qLCuomw%2BnSr28QESCRVLTyYKILGJOPfcnaIFOsewhRdvv%2BrWa%2FWih0vlbX6Zb75T5C0qNKVFvH1QL%2FvazSWgC2s6oWXXIuUxQelKiJbowuJDQViatLmLijg9CQBMg8WiPgiw3LEeYRmm5f%2BXdnvkDnxLLjMLxtvX74C3OlwPQqx4xwIdpPx38LrlDphiyWUWHWKAzzxurS%2FxTo%2BP5wGFak62ap1PVFFN4v%2Fy%2BxuR39WnIO7lsWfwgVsK17wxrs9K8ltIKuhkw7f%2F6dhK6gQokFKhWX3urrjk%2FrnI0pgfpGMeuQIUaEM7%2BGF5q2iMkCaMQwxxOzcvU0eXbsnS9XknXvP7Gtw5dwPXlFu2ecvSHEZgNDsU6x%2FGdXBYXyOQjzZReSedeEPY6nEv9gJR4oBQJtFO6Kd0fwC6BO4LNHDeBujB6dSNcUQC9zIv2LnAzGk99bUDrdFY%2B9yGFQtEo0GQPNv6vS2drj4%2B1jHbv3aJSMUWP%2BQTZrmbNTjU8wyG%2FiXNNpskybLcJ3CiTF5Ir%2BJYzmJwE0mSVhlxbtbmvweB3ulB6Til5UuUZydpgiFVeobhU0WaBqpJ198d%2B%2FXeNRTZ9%2F1OPfG7%2B2hwzd5W3D%2BhmyjsRcUg%2F%2BCavb%2B%2BVh2ls3L7zT%2FetOnHNxeerv313vzLVqPai4nJv%2BK1FC6040%2F4udw7sAb3laSg0XCkAAs0npBO6VJabS4Elk%2FU%2BD4gTXW%2Bj0wnrMlqNamq4tMIYB87tE10i0FR3LZNhJsb7%2FR561btmes8YBCRkhYNByRtKd55mqTas9FYhJnbRGHuOh3M4QTdgQSqmgRxuzGdSvZGcbMxNQGk5C3ebLjoXIOFM4l%2BWKHmLTJwRv9E8GWJ6dYvf%2FFmEyEGr%2Bgyrr1p5zrgkz0Cw2j94Hv8Jdx7dIVegBSNtgsqGsRQEYiIBoXwD0LNvQ5d7s5Z00QzwNhqZA0b%2BtMG1tQq5nd84uq8R0zPvX35G8uRaze4jcOHzz0w1%2BQ2BIRvf6J6Kgatnrbiem%2BCFvAxfkrndzD9MFPP1GWTUHclpASUkCNAQkpCCcCgDSUDAhDZ%2BCuEkgn8J7i9nMA7pA4lISappxILKfAeSAbIcSDuN2bJcfZILqeO5rLs0MnngSHYRdrHjmaz7JEsEPw51ZqDJDmUIOZIe34WaQeegNsJn1qz8AIpT3yCjyEih%2FxELkuJ0lEMYTLVCiWpo5oYMleMH6USyYJcD%2BuOe%2BkWKpn1Qns34iyYDjkSLvgnZXcgVQNeqINXr48m3iS7cjm8tedyY0f1QvTnHHdsrKby%2F%2BSSbPY8%2FNH6vpl%2FEsq3Ae4ZU1HC44KFiI9o7CEgab%2FRqHbj7s5KAg06s39ZP%2FzxI%2FmVuF%2FTbTSy%2B3Fb8If9%2Fcv7%2Bwt91yy8RfP1QXtW5RzQn7qIiZyuFM5QfJ5E9uVnqT85TanFx0lkP3ukBAMprvsRyi%2FC8NAJL1xbIIirSvnSj4O5netb4JxmNANHPssHAcHMHsFRgEug816gDBeMbdfiuRcghqYcm0%2BXxx%2F5IAEtN3fqFF3LzAXqwoT0PN0OVTNqxo8sxMkd5Ig6k79Zk7VxxX6gMLOZFQgvpW2RrMW1D0BDihaXQ9wVRoBxPLfpknmkeMtoB%2FqM9cRc9IqmMD2XUmdZ7GSRKPUZvChf8BoykriM2MnKYbOHX8R7cLdNCxSFFVQqoYswnlWtlFS2mNkhswVpZiQW1J%2FUKFfipHGlUkM6UKBhMz1istELIHJLMSctu3ugzfaVSOjKvUgc%2FTHK4Sdg2Wscz69leKIkkrwuuWiOe9yGYKQXRumkC3qbRcMwrvhjNXgdZk3RxAUEhuSPvn3nnd%2B%2BU%2F3vlVOmrJzCD8JLxV1OHRjrZifbcFDOuRNTGqdgQm1tSNJ2OcQ04YiEXuxtII1ECSQRoQGYioEsgCfchB4ghAtw7FfJre4WZ9hkVi9MtjuWqtdNDlpMrfEG9fOT6q21okg%2Be4As38MfGquNt7oUws6Ysarj1%2FefE%2Byst86YUVNvDdts3Pv5c8m%2FaP0C%2Bf8%2FQb%2BIMnGq09BgwN01oIOAnAdagI8mBSrqk1gxTDUBOtk2ousEtBH2z4Ir2d3f6k8PXXVlt2qN9RODxRuoJT%2Fv27wm09jRYVc%2Fe%2B%2Biyx2tyzJb%2Fn3J0htXP87eSsQaf2Ly0s6Zmxela88REy1cf4273mI3iXNJ7KxrZibOm9xm6rl4fqy%2Ft27smU8tOfdW2ucBzg2UfmOIVyLIl3kpYlwphDISTXJXsctmiDtN7fNV6zelgxwnWxsVr83Aj%2FS5ki1jL%2Fa0GC6%2B2L6Um%2BaoddlNFuj%2BbJ8mH%2FiaLh8I0%2FU51NspIEfq0dohwyFXKgm4NggwQ4rRhCOUFtxxo8XnitT4cnGfT93IS8FaT85XE3H5LMY4zIEPL1hw443wz%2B1UmhTJyJGxZzw%2BwsKkKZgUiVtKOKMEb2AKHTv61FNc01PQFwKnvsZ%2F9pPA4RKTASWahmh%2B8MxwzHxKy74IRn5LGRjsPUUwTu64UYNY38caqd7HKucZ%2FtHnODtENw%2F2UfHRMaq1UUPDJQ0OKkWCeet5fYOhII1VRz8%2B%2FElg5j4Gxur3J8o2PJ4rg%2B2d08T%2FfwEzSVbyZ9XPro95T477lRKqUSRXQnauHNsISAl27oWi6Fv9z48JMv8r%2FaMMj8onCP%2FDuDZOuN%2BGPPr%2F%2Bp7bx%2B7JlbYdppcNhzKU%2F1Px5aiaGDn%2Fs1iGMaBcleKUo%2Fv9rcxkZj7DBEKOfrayytXNLYiUdBY%2BpleQXdnscKlQcpzuWluxsieeyuXIK6SdxozitWyGOV3vOHHjguyCQ6fpIYy2JwvrQEF%2FQa9Pdf%2FQqOSqCiE%2FEE1%2FXIVKTc2tzWbHnimrEd%2BVyz311Ml3P0GVTj7PD5aDnsvCvH36alEaPMePcMegXs7x8igTu4B9v7G9vTHvhCu%2FkzIdx%2BBxC0ay9zRSvoS0F2lIxI%2BX7klU63I40gLQ3w5ep5na%2BSFnba3z5D64zv%2BQtM4n4ffG3tq4aNHGRfxgrXPMim%2B5487abL7xhdseIRn1KDl%2B7aINixdv0OD%2BJSPwKf5%2BxoP6aiTeQIDVlIhMcL1H5R9PYXvprs3fv2bO7MOplCmweuiq2JRZ1zz%2B9a%2Fv2PH1Hfz9236w%2BZrPXvWfAxlj4NLLHpq3c%2FPQ3uvmvbrjG7fe%2Bo2y%2FcLdtE6VUlXi0ASb1VLUBVSUWSU4HdvAraTyS8xzM8NxvxFkXV6pUVRiJwcgC5zEeht4rwcp7ki0k41G0qlQhG1Vzlq8alEmnFi58caB5Q9vn988MLhqyVlHvLEWjtQFeupdiocF%2FtkkOGPW2ibWaBTkeZ%2FdvPWazXfOnnvL6jkRXpi85sFzZt%2B55ZptW3bl1cCCHZPD06MhySha7UFzjcjbp8fOecFCirzAG%2FyVjBX6OFIaadSjQq1nNhyIe8tVbaaSdHlXIWKacMeuZA1uxS95zILhyrxAdsXTL6m7kNQlx2P9uZf2qhufePFFbpI6%2FOU0WcP99RrCsrwseVot5mtytpf6Y0gm9sdeyKnPQ7onyK4nXlR%2Frg7H95M1upzu89DH6pgUcikoiihJ6NJKmRxV1x%2BMJiOA3YwhDRQrWU0u%2F0rvq0VYXnyCwsLeTJYBq3dAtJDavuzyoVpzZ99Z0%2Ba0uoiFH%2FxcqgDR7rUFeOrUn6Cywb8ZeNMbhLV5ugP9l0zv9UN5b5mFkjzxUcpPJCn3V402pRxtJd2GrnLdhtVk9ZSZh9W91fCSH5B7ofxPiWL%2Bj3D%2FuwhBRdyAyozeZwvQzs79soi%2BBKSnafLviZCcfrpBpLyimfLfTyJtbyruIQKD01tUwJyKEo%2FybaxkSNFUMdMkhQoJyRBQFhnUkDQSXhTM%2B3NmY0EDM7ffLIjqWEGt8lCO6mLia3PukFnghosJD5p5SIho%2FVDkzQfLE%2BIrYoJXkD19pdP7OwG%2FvoIUtagiWiZ4PAFTHHlTVhRZ7dYmPar%2BNJ%2B8JhmR6DFK5DV1foHoLNO%2FpHrvZfmWZ15RQlwvoVDKhCWNK3CCch9lfFBuAqUgpFSShmNaPj%2Bi5%2B%2BWZfKeViJfW5HnUakVL4UCNVkA4%2BETfIqx4B5xSaP2L1yn0zn2ltPn4%2BOqZGmwwEVCaCSqG53ldtL1oLGAhdMLd09MpCCF6tD6ZnAZBY9hDaYsP0jzZ0j5ZjKsF4i1UmLuhbJMCnYJPt5VwFNvmZawXjEvLJqIH8STonZjq7BZ8gKgR20C9MDFqJAX1H64QW2NEup6qgzLP8cvppL%2FNNTOBTCJABOHeWoXzLhw4Wuy7gaBtjKr9kgKq8ZlRYBS32Lpxc8vIhpNDTfyNXWybMJbn2RyQ5EmWc2QF9wmSZ0KYCE%2BcPuYO6b15Uotj2Kd4MItLS7gtFbkTdrFND6pvEZqv5Yv7jXAus7Pg7avo7KDot50NX3CPkP%2BKps8J9%2F3mGQIteY%2FLGPC%2BL7872SPR2br5fy8MtKBMHedGuM28%2FMZmPJMrGgi3Gb1S%2BSi1%2FL%2FzrZwO9XH1ce%2Fz7ZQ1WSoY%2F%2BpMb5FT4ua0Wm%2BJf%2F298nFmChEQ%2BTi71est4mq9VYI6RsymoRJKYidElT2FGnDTZvqtfhGAFTbeqEw68GqtfmbVa%2F1IFO1%2FjdWr%2F8BDRRtQh9XNjubEm4aWVpVonpTGR7PVGc%2BKJNoBIWF7kYi4gUV3r1U6723i6TxUl3n3%2FtM27aZfKb7THiHW9VzFSwHJ05VfK6Ar7kaB0XgPPE0BSkSFKsBUpaLihEWoA9wBt8qirh2VSOkZwXEwyrxZ5jyt2rJmSo9gX7cg6jsEUGJU9z9xJPOEM3uQQxKgkh35DNATnVyrmJ3mbCNyIB%2Fyox4wH1bg2DwN7q9kov4pFqny8oSm3RQbGgJ1QQTs6ZMLilOVYJ9v6Wha3HcJ9jddsXp9YhGUXLXt%2FqMDnvLpPNTXfNa60z5%2FyjXQOMq%2BlNmwh5egpYrdfZQZV9rI47xlRkuyTjpzsmCBSWNkAXVoK8sgYWqQJWbo1RLo6QH0YW6pxqfCnRgkd%2BRiFjUQUQ7poIaYoakgXxwFd9BuuI38H1xBxXSFb%2FpBDIKQFn7YB3dB36l7sG1FLaKiBdp1KxLvfswap%2F30lnVESgNnvjbUoT6w9N%2BXoio0qcYOIM%2Bheg940YimsucQVvli9NEcft2UZwGQwLuilj1fFr1i3NP94X%2BPE7Hpvtj6lBJfJ4R6NvWiaL6MgzWHxiN66DExa%2BdAdAbMYX6HVF8A%2B7rjEZIXAVbDe7PVI9rmN69JOLV1DOSvRPxWNPZBZf%2FNf%2BNy65BhYxxxV%2B77XJ2wfQ389%2FIQPgajXbwMsuAz%2F0IaQcXJavKbRqR2IqyZruXjVC2%2Bhdee%2F5vdnYOedpmVtR3NGXldxSzDSIiBVpkGb9by89UpEPKrSLZmyFDzMab%2FwXl2CNe7s%2FqCtTvWgG5kpBmCBlSzDS%2Fr8N4uwBwohRW63JTS1y32f0TQsPfXVGEHQrV8%2FNCfiOUVirYcBbIeA2%2BiF68rQIo3B%2FS628vYESr79ehzS7Q9LEL9UXmik9XVHb1yBO3Ngvt5935%2Bk1efkV51mzzrM0LL3%2F20avnwMeKuWyOUZg2TasSqZ%2BKcZQiOn1Iu2Vh497ALUVZiCKt%2Fgh6IvTIj1ZLRjWAkpHKOKovNwp00eqPROiAbiNEKieXwMLcXhVJ1%2FuzmLP4tfxaHR59cBdJVG1kTAgl9ze9QKUEQ946Hkb%2BokJ5JRDyf54Axur1D%2BWS49cLr0tTPEu7UmXrxcSr3XNvumv4yXzInXKH4F7Tc7p17Zt%2Bt%2FqW2%2B93k063X7VW6lALxTY7i1nBXMxcxmzQbabxz%2BtJo%2BwijYaIGMNS8AoSMgAPt84DdHOoMPfjXhF%2BkuH1tZvuFQrRCN07xGcXRX9MYxYchDe5BcHj%2BZ4i%2B42WyPc8Xofi7bbZJN5nJLJ5qr6IqRtzqNlM17SpFsnkEyTWoABEjz4JXOQvzWYuwdnV5LNGOwTM5v9r4RpQ8ZXsYodks3o31JBlzbYtNotisnm22MxiwGFXam5oN1n0TA%2FhRvshvTSDwHff4nNzRo9Dum6PaJbMXzDz%2Bx%2BFkj4L4bFNBb1asqsgH7Dyh4DvbkPtf5yMDKzEwyoaESMSNS9P9gJVA3%2FRTlwoMwZvxECFWxIPNw9gi01nOHjP32esZTtmXHnxvZd8ZtakqQ7ekajbXetpNa6ocTVxJtY%2BuSe69OLz77zh5bDR3xjZMzUz6fxrz1nqrZGcHQHfPVefN%2BfiK86LeXj%2BSc5lPKy%2Bk%2FvCUI%2FDaLFYCWHr6nbXuILTIsb5imNKY%2FrCm28fSMxPhkN1XbNMNZGuqwOBhtTSxWuTk6bw0ZaG86b1hKddePOKuBvmiguYBn4T%2FyOqOyGRBt7bKUI1GjioBC8aUKwF7Q319UgcmtFGIzCJGBqwQij0ynDsfdFGc3TS3BlNfJ25xmzniMkpXXTPvCaD3ZaZvyzjmZdudBostmhb0ORZNN2sJBeed1HXkrUsywueQH%2BL0eCPxmsa5ZpgRJSDZ11yDv%2Bjmbd86vxZfc1WcZJ3UkMq1BOOOVtvu%2F%2BpB%2Ben186d3GTwWAw2jheaJs09%2F%2BLNfZft37DALyrNj1wABMuUKbODyTVnT%2FKYbJ3Tpq8IrNh92dkxOj5P%2FYpZx4%2FycyiVcDYdn4JbEoKdQi9054iBKsygLW46FRGxAb0NPNCm8BSNCPjoKcj6EAus4SuP3rB%2BcV99%2FeTF6294dA8%2BTK6v74MHVpYNRt%2FI30e8QGTOOdfGWzzxcy%2B87a7bLjw37rHw1nPzp0KyyRSeZO%2BQQhInt3dYgvycjrPOv%2BT8s1rptaP84VeywdWX2T4ysr0%2F7TLIs6%2Bx9zib56ye1dM9e%2FXsZmePY3NDs9zlnNVt4%2BWgHJbbz3Livg4P9WWgviOMm4kCRT6I8vw0NbUUEnFvOuFKoxQW1gTsvFirsF5pb7qTUCx4i7VmtToveaDxvK9uOaedVvPRpVOnNz0Q6bry7uiSdQ8t7Vy4JQKVS%2BXPplV2ts4bvCwZu%2BKzgITtxepaPRzWdpv74muvv6RO0SorX6cu%2FdqKn%2FXWnrtp%2FZragz13DUCl5myiFW2Ycvb0PtsXnU%2Btx8pvLFbUspLX68mdegwmOif%2FNPDONajTGoUh6tU56HBJCTBASVvNUB5VIiKpc9kd7kludodSFz7xQbiOmMk5dOYk56gzL6uaf7N8a6MQOHm0ae6snZpFDfuT3%2FjdYzjzwkXXIVHoXNuCfQslQZqBZjTsoHMqrkE4jaYdgkGz2ATOgB3cPkSukD01DnV3ttb1wx%2B6arPqbkcNAHoFPzKUUQ%2BqL0k97pjbZv1I%2FegC9zTFbrrlFpNdmea%2BgIgfWW3wqkcis8ky5FAcRd1If5nNZrl2FFpungc8wpoCl1BpQV%2FScS%2BzjlASyUTVv%2FAJ46gkJI4bHX4lTnloctxPZE1ckS3%2BjG2fKIjkQFyzuo8jvYQG1OrGvJPSTu%2FnSp9PHNTl4z5hK%2F8gtXVKF6gEKiglgcKiRlCESsQCV5QIlKWKpr34lt%2FwkSx%2FJCmP5%2FcBKQfl%2F5gd%2BrOS%2F%2Bp91%2F%2BYCg5CXK2W4M9fu%2B%2F6xxX%2BvnelVuldIDCG0VQTpU9Dw4pRfei%2B6zWx0MLie0gPbyrkmRU7OwT16JGeyXLHqOLqAfVN1GPlBzWtFNzj0TRTCjogtP1NjIvu5habN5Aoa1k66wGpqriVetJgiGdwDZtKhnN0y4n9sXYnsqGmZfDSR15%2B5NLBlhoDaedEm7sxmpqRija6ZEEg2EAnTiAC8IrmFbGz1q08P9PSkjl%2F5bqzYqT9hMmptEXDgTqP3Wiye%2BsD4Wir4jCeoHbbp5hRfpB7BakUIppIlPCD30dR1GtslDz8OsqbXmejFC%2Fv8wu5X2myq7SJ8Avzv9DFUJySf5uNvq4%2BTi7W9D%2FOZrLChdwxmPNiBRqVjnpK%2FaGxRCDspVYKAW9AN1JANoo8wP4BJUlGqdgw6m1qPQ2QW3%2BOfU5%2FieLS%2FNuKpDU3uf8bcAXyBal5jMR2NEAbPAZt0K3hvxHBEDlUxfIGcD%2BN2gNSNx36nfqlAYow0puatNpRz0e4W2oahKzQHsjf2c16ad%2F3t2KTtPobnX6D8C8pd0MDP%2BKx7wnXqGGlLQcvikMErm6TmfsuxJXbSAxqNjOogJLQBLiKEHAE%2BJGTS3JoEhTrz8%2FCB%2B5YlupJ58aOat8Kv4JvregxwcU5Cp8GFAFm1FyOfto6GS2m1NGTS6CPNKkbsTdCBlnN9onMho55BX8IJZtEQ35lk%2BhtwN5A0V3RCPoD%2FyXAcv6pAtbZczRUA64JmcUf4q7Q89ZHLeJVZ5D1Ps%2Ft%2B0iCT3AHVtZC7JDCXfR7OSb%2FXja5H3zQbZL1B%2BULX1BMTEk3AseSpmnKEK4T9ekMIidUCRQFfcbj7z8gNLvzF7mbhQN8h6ZbRset%2BnQWdS%2FZX3k7WpS8P9sfo0iGS64wV516pOhjI6TZ2dApgI5%2BLhxywYoWxKUrykKJsIoDsR4mSrCTg0egMPnLW%2F3Q5Nn8BZEuzqEI7HK3n0%2BzFmuO3TtWQ5WJoG9YqCD6Gc32SxnbnVPfsxvrFXK2dILl7bLthDp6glhcsfp4bYvbSmj%2FmQ94uBTw0E73x2jbNRCvC6VL6GCFDwU7eWQDcC5FY5s0slieRDwtAbRsbLXbaXAuu14e2OJw1dc6jQ3ZdY8v7rv2%2FBWZLqvFWVvvcmwZkK9f5jS4muO9yR5res4kfkRxhV03L1RfPOiPtYi8pd7jNEsOpyTwxpaY%2FyCZu%2FAmd5Or9uS3DYaeqVOhH7gZN%2F8I%2Fwi1fEuLXvyNivibjuKvN%2B1Nc01HF%2F3h%2Bef%2FsOhox8MPd5SFucPjorQwXT%2BytA8EmA5mamHNFDVhBI5pjZbQpugBNkO8MvRub8KVDKST1Wag7D3xlin1ZF7LFP%2F79nbvCXFOY%2BPUjrT7%2FotsPXXZ4exdPzuhZuL5LUXVAn7k7PbhG89uz3b41X01gbjP1xwlu5rrvvf9%2Bpbs6E%2FVu7Nk642%2FPYRaAiUBdrmO6CDTBLPQFA1ur0uXoBR1INDMkypKpoTqnSMx5GiEdTEaSHLs0Alvu%2F19%2F5QW9Rv1U1ridT22i%2B53pzumbs%2BXFFXYC%2B%2BCGsTj5JUT%2FGCgRt3n78i2n71FHG4%2Fu6X%2B%2B9%2Braya7os3ZbDmgWfXun44e%2Bu2NZKuGZ0HiF8M4TlMPR%2BEU6rPKRJ8wOU2RFUFLex3egEsz3YqEAq0cqhAAW19dBZIlVzR61tuIdTnpXH7l%2BuXrbjPUyep%2B8cl6aXKWhPHpDcXl9KiTWDNr4mBQc8Tq%2BNzK%2FOKSbsfl79o9G20R%2BbrBXYvUg0rLHhtrc4TN81TTOWSZ0gL1ZVlOYH2ery%2F7XVUjFMbzYpg7UswcqJPQwBd0LKLabJ8IaCr2otcjSkIrGwootKECaUd4XH1%2BSdazRrfddkBU98t1htvWrbjqSqjaCguxrffM%2F5zDCpBALUycmajhd%2BR6ww4SWafuZ5eU%2BtPid4lgd3gt%2Bb%2FY9rQoZNmiXYPXyRHbRs8zX%2Ff4WIFjWZJtUdSD55AP3xtXH%2BZipC0EqdBGDA4CoYEU6gRLGPU11QhkLTBiEYPiqOeQgwTCl9aok1Qr5pFf71qEeNxjy%2F8F0GoqYPv75Yh9j3x4DuJ%2BuEzHRpAq2lMqb%2BqfTdiq6kGtzfOWsv0c7lSeMXDHBDe1MT%2BLUgx0Pg%2Fp87u2UicdIvqQi8DkxhcUwUXCedMpb4NQjwY3npTmgsURJavLwCRyEcN2HfWsDVGfv%2Fu9ZUWUx%2BPYFueUKwaNvbtu%2BXps3eVWbN1GcgVrdMnWJ7WmJz9SD66EBidag0NF1Ukep0t5A7sFCWdhzvYwHv6L%2FBehXuHqfaBwBEU7hfVLcXvS4VQv%2BT%2FvaSIl7cbeMc7ekv9i8S3e1L5xxpvMGcu1EYPbKyCiijjGXcDKckm43PqU2qNWlXusZMiqF82cuVzolUHN9NNR0HZPxFPV9V0wLtvq%2Bk4DqOwVWDlzuQLVdqFiP08cRX7aRlBVfR8cb55bWe5LExnlcsDp1vAP8Q9BucPMk1Ulh4GnN0SAdxcNHv3q9ohx1Ati4S%2FtkWjIDe3hQdkUGrGRaFBiUdiTSkI41UkMuuQHP%2BEaSQYlPQTFWJF03BNPpTu5KFAdkWgDukzsZKMG0Q1TAQQglScOaP%2FdsZ8%2BfP75D%2F9Uu5Gs3FY%2F2SxPld0DHOciXI9gqjcEidXjE%2B3BLosy0OcX3T7O5g65ROGyzQ2BZs7WbZVnO5ydLe32hMwTQ4wnnKXW6XW5LAa7oaXOIHoUl0FgLQLH2by8wSTWeAx2Y5PDazK3BqZbeJZwXGPaYhX87ZNszoDdaRxotXO1nNlpdvAPFWHDm8PqEE0sZxDEqGzxisFNnuCWetPcGrObN0p23tTZwMuRVodSV8%2BLTrOV3eRvzjQZiSjaLYS1WEJe0kNsJlZu9LFun7%2B%2BwW4gRDRbaxw2nrOGm%2BxOj9cmtbp9ZqeTM1m8UXfQQCSTVSQox6pvtjot%2FFpHvIUjJovFEoYvHYV9C5Y%2FxN9OfcalvII37UEhTbTg%2FAQIaPb4Vz6j5u8%2FaViycMod%2FfkDcpu8QZbZoeBi%2FvbzP3XPsZvOubMtaPHkD9jt6%2BU2O7vqU%2F9C9SMvgrXpQNG%2FE0oJxun%2BCiElUa0IKQSUwERxOntKSV7ekcuh9VBZBBo3VUcB58ofKBHCwLyf9qFosz9Ibf8dGqwaBMjRig4SGOZ2UkWI7UiO9OfUPdxOYFApUZyfpY7mgEc5rtNGGk2H1lPhAk1Hp%2FVAMqQEHEUfEYkkUQq1JMdzsX7kklRrTrUi1wMcDjmu1YYfATj7Y%2BpGpPEBXuoQIj8rR9mgCl4C9yqmF7xnVWxGVniNqtpVmXBvQ6iwni5YQ8a1jYrXtc2J13HvgkvqWxuva1sbr%2BP2S5ceKGyBwDv2DbrToe1u6BkAJV7xnVLUaq0sJB8pFqcUIPi3yuwxi4JuLr%2BP30f3OkPQ72aO0xYo3%2FEsmO3QO5qEF8S0qQH0UsKXv0brnl9%2B8M7jF174%2BDsfvPOl1au%2FRL5%2F9DsbNnwHL2pHR1NTRxMZhJtHktOOxLxErPF6YlLvpC9YP73x%2B4ofw%2B3xVdrHcDE0dQQCmCRgvt9b35xINDf1CDcRSfJ%2BpYl%2BSf8YcurfmXP5F%2Fkj6J82jNsrkWiEuhVlgFfyNkB3S5MUzLhoNiwSCYcxQ7Ui4J0Xh7fmqRbaPa1tzujxkBRlsEHy0%2FOM4pYLPb7g9O6BQJN6l9zQ0OGyCaZz0vMTbHOzXfQ7a2tsterTcqxeInODoemdktw%2B1SbVhKwtW9ffe8VKadK0OVuC3bWzyKm5LeddsWTeorWyY9IMtUFutdu5g%2BRn533qkocdvLs2HmhU75br%2FMmWtD8zA3OP2t1ea636jEzqYxJZGAwFiDEd61oTsrRuW3%2F3pYNi3bS%2BRd%2BGjOfVpAPNd6y64Gsz1GaZleWIPoYL%2Fv9mTeQBENVEguiF1aC4YeXxFETw6QyPfn0m9g8IrMFAvKM1EI11DARnbqibHk%2FIojy5rSdgCyZi06y8sS024PeuO4MfwQ5Y9yKRZCqyYaF30vzeHlmUprR21tR0t0yz8KZY66zWuGvxVQB%2F36kP%2BK38t2Hu6NQ9SFJfw0AdpqPEK2qTMpf2VCqJwqPoJezTL824b8akoL%2Bx03nhh%2BoNo5e77psxg9Q5LzebIKD%2BfsY34f2MtB9fk9v5b8PT6tYrgv4kRPwd0q9z3gdJSJ0653KjCYPwCaR5aUY63eW48O%2Fkdo33yxX9wCiMv2QTrk8eGSI6Ag6moG9t2P%2FF7GRNlDjl0gw7pJ5aOXXqyqn8SENnXBmbSwUYLyqJjv3UmY1nKr4t80no0faXsaIEiF%2FBRaIBnItSce4OUif7W6Vm9T9H1X9Vj71BEm%2BRdmIJQST%2FZfVdudUvh9S%2FqqNvqT98g9SQ3lHibZY0mRVHooyDN%2FFHmTgzjdozKw28NwQ0hwN6BCoPKaEk3YtKwNhwRLXuk076CGoZNXDQcRwZvreTZY9EZi%2Bd0s4%2Bztv8iei04JQl6ZbDD2eHV7X4uHuFVfPrOmcs6m6Kr7hssr%2B1VZFcEZ%2FPdJkn1hOs8SXS%2FNFFgqt94PIZzZ3tdaL6Q5vo6piSzdy737pwsX1VyxUrF15iJ4uNkq%2Brbyg1Z%2BO8VsNC1UmcvORPRfxtPrfRwL2p%2FoA1eZp6Z%2FaGffoewaXcA%2FxBlKlQLfhQL%2FoPgBGP3qsA7IQS8qDVNswHKRSheDUvA3Q7MZoRcJMxlEygujn1QdyzfPfq3dEp%2FbXh5e5YXW2Ngfvza0ZF6UgFL%2FE0fTq4LBlvTE2qb%2FKuuzYSXVnjTfM1osvqMHVbm9950quIZlbqaL6YP7jk3kUtA0GnX2nvq53f3WoSsvEdDRnULgo2fN7lNZJgI8%2FVWi33c3bBZnGY05%2Bdm%2B3qc7fNmj4YGKLj2nfqFP%2Bg7jdDlxEV5XsJQZP6hYrS1l0VQr4c69Xueixp90gnZPmE5OF22j%2BSYEWHlZ0K%2FHgsh%2FZtsbh6h2DNRlvv6jJh9XaJaHCZDiUDKNTMkvb8vsqCyf3ZNdSmO0fa0Y4baJTtpbKzuVzeeSI7fCKr2Z0WypapnXJ4gnoWy3PoUIlIQ1TXdqhQJIXp9Wx5fYdpeWh2TY5D%2BYVyKd0jw3iumwi%2FBC3cEy4o83QlZnW79MrCgCjbhWXBlRZVVZZv4rIKpXC01HFlHdHLoeWVl6UVc%2FJ5uGm6CViW5mulYMk%2BHqNYr0AyUPivLg2oMs2MPqtuhHyRyiwvNJej1Br%2BfcLyoAyu8D9B7bgmzUqfFobF5nKnK4%2Bt8MPJkI%2FxHUNWk117jugWF%2BxazTAALQn6%2BUE9lhoI5ApGA%2FiuJOsrlNP28SVVuBVajXmircLel46w2bJS1Q0Ft0KDuikDFL%2F3pYrid1Q4FvofwRIo4R9h2ftSwc6jHAMqLcCql8YPHtlzGoByNXYN6v8hXnRaOhUvx0sVLCexwupGDR4NOYC7PePa5keIPACnuAdD7dEadRuTIiS6Lb7uskb381My5yjzF8lGCjBRqdwrWJCagfB3yCy7XT1i92hbcZ5Ci1FJkgYMDf6n%2BjspIsHFjJrTOdzSMuOa9DbDcj%2FnH9N9bIoGVgzHPWIQuFuYtaMRaq8eCKI0gEF6lPOZjBz3EEvaaxwSUT9U%2F8JbJZPJJLBLolH1La%2FRbF9AbC8JJjv%2FmMnssKjLRBJyqj9QXxNko0Ux%2FX79epfiXkm6fmKwF%2Fen1HLc6LxloXWKvGa5rVCVL83VuiPcDEX%2FK5pTXOxHfx6HHB0t2FI0qI2rCZFTrvPWU67zVuS%2FkTsLnc7IKhFg30e4FOkqNSfH5PtkmUy6Cpiv%2F36k2sbqCeCFNa%2BURpoY0sZoYmCgCr3qgZz6s8I0gP1bYiR%2BD79H56NOz0EVWCTy2%2FfffvSCCx59W7uRV9995eqrX8GLesOXNm360iZ%2BT%2FEl3uZqL%2BFyzSZ8XxpTiI%2FG0nkT4zznFZ0t4ipMz5v4q9ssqbdKUZt6u82knPCrt6PZwsnn0XySVnyPR1ZXAn72yx48bWJsu7apnI3Hy8bygUK5Js32qcytapqgmn95uexccj205vGgJ%2BeuOeG2SORmKZr%2FqKzcx9SFctMJdwMUFZDJITs7dnOp1EKZCxg304Cevyfya%2BvlKqv6aXK1qIj3imL%2BL6hL%2ByvUlFfE0VKZ7E8gBY3M%2F8VoJCFgizH1W6VyC76nH6b7jiibYVxUmVIEspry%2FLgZIlCeP11Z4zs%2FAwvVwtGFEut5S1JY4lfyT0N%2FevOLo%2BrUEgjcqc9IkGpQbv3iW7Co5b%2BKgjvpzYdH85PLcc4X21ouwEGl%2FS4qnUAvoSlXUUhR1eKr2VWFTB%2BGMl6FsiQsVD1R3urlAAIoSn7JQkmiVVCHSpCwDH%2FqPepXQ0Db77CJOAImohB%2BRPWr31ev5g%2FkE%2BzTa4lbvZo8xdWPffQu9yJTPCNB66s%2BzXoJt%2F0L6hSoCuBIoK8fnBGG87OoRckJpLqyWe4YbpGi50g0%2B3I3UD85Oa0fzubfoXxPLbW3FDWzigmyJeM0tQkax7PqTy80%2BUxfUHPlBZIRVNQ%2Bv0xRm8REKPoLmNr0%2BUo48v9GFbXPKylqQ2IKm00QddgyWGMROCTxdLB9nCY8P7j2DjlsV%2F%2Bmfr0C0r%2FNkeXbbpPlOTBBwT0mVz1zx9S%2FwJecBF9Wgv3p032iP2v4VSgfgW2G%2BHUEdEXU6iq4CtpLJfIN9XQG8dwa1VoO8XC2SrPDDyCOQptXgbcPvlAgBfxBoGwftQKeKFrNTASPt3pGGqDt%2FQRasn2kri%2BH6L80MJRsmVYJrAKyDItpJUy3%2F15WYIJqcJ9Q5N%2FLFJ4c3dc1URpWl9hW6mu50MUIelg4ucTPf15zs5DFo1c0VSp1tKB9jkwIyuM45kb%2BIP8gHed%2B6jO3v0KbIknzLy636E8KPTdCuUpB0wLo9JKnAO6pv0vS31EtBha%2FfJemkgLVVnd8KCk4qBTpQ5m7FbifBKrPJcq0pZAFVG%2FXbOFz%2BTcq2MLrcmV28Nmi%2FOHskh82bau0k8eWCaPijQPWQ5lUvslwVCfHkXBMIehqUgtDNLeauH1huvZTbYmw%2BluPjyWoNGEuxRLR7LK5fSyXFUyK7PURQv2v8D3XOt2NJ6liBbmPGOsakw1kbeOs%2B31Wm5qpH%2BiJWSzqdPr2O7zc2TmtnrzCig6bBd%2FvgQmzOlz0STWIlmZEQfupogOZFHUZ7EkUnMn0RrpIMqAgHRJAOjIJ3yGw1I%2FMAp9q9S3Q%2FclADNm1wEeO%2Bxbwg5OIYHZLY3ehG5lJk2xhco%2B6JWybpEVz2wrR6hZyD0QXZbeDVB%2BonmlimpkWprdAs4WEZDSQppsDlcdCBJJESIYFuAtUnC4GIF2C3Uu2Kv7L1bdz6FxtqxpG4TqQOqOUNAJ2HLvPWA2GgDy4O4vaDrtyl6P%2B1fAll%2BSyFcQ28GHqh7fvvf37udylf0fNwhzgz87Y%2Bcf5x9GnF6ygHu18sAbipWeF0YPBgp2GaKeQduxxdEr3SgbH1kvH7tvqSLhedomOvZyts2dw8acu3dY%2Ff%2BucuMtCuP%2Fe4zC4XnH3OLZ8ZuxTWxy8dJfU5dhDeKPSlJy5pn%2F%2B7u3XrJhmr9C5CuleGflGQocKnlAUaRKp0BAHV0ZwUt9VCqk6zYOgRIuMfePJzdmBdpPJ7%2F6B23%2Bf%2Bsp9NMDZevovvfYHG5dGPISQq1DojqNckchVrCcCYz%2FQ0hI0m3NKDRfkgsrnamo%2Bp0CAq1FyvC3a3Nak%2Fs5VX282x9Ufy3E39VAx6o7LpCvO2wK%2Bch9jNqpJCutcIOooKnYWtDK8gTRVYygRQfwgzKM5%2BjP2jOZdx3r32Py7rQUPOzAnoRs95NvRAR0qLGU11Taqu1bUYSzMcWjMEir067JQQHfIrLBHsrgv00%2FWavd8HRLMEEYFSW3HCSNQehnrHztKqHcDyo4VfZ6gPKCR%2BgufwA8GegxUEo4A%2Bgd0BASHiH6jYMLIsUdQJTs%2FC641KN4oCHWolCMLlMfIdtWKScjx7SM5LD9HnfmhrGI0S139UWfUnxgOXdJFW%2BAMcGjKr6eHAttHF5sUoeArYKDcxMSYcKA%2FxUDhPiEOEAPafSIUFArN0r24ynI91EPARDXvIDYyvqZaWeroBOUABQA%2FE%2BDXC7PWafDLQY2oiwpUEyj4RQtVlUp1GrM7In2p2A7VuiOW6otMiGOo5Mrp05ejVuTy6dNX%2Fk%2F7mybZQ0nUmfrbx3U4KueDnlHm5wdh8FFeKnoaKKh%2FTK18StOPhwG9Xo5mqXAxvw%2F79YQwwDR%2BnAKQQ4izVXioB84qcppWB7IqjU45z4CE17OvF1Dw%2BoTFqxtz8dxwtogBnF9MjIl%2Fin%2BK8s3hM9laIn0TiCbTAXL0T798bPXqx36p3chrv0O%2BGC9Xaj48Ecv8U8UEeBvUEsDlTepiU5OvlpeNGvpnKF0RvUooWhIjnx6GeBapXCQYTw9DNg6%2FOC3gZjp76oNTj9Kz6Jqobxb9NDqc08vcKReOpcsQV2K8InXFaXW3aI6Ofr1k48rp7CX7rx%2Bv1UKPsfvzQU0Kc83i2VdILmd2%2FyX55zT9luN2%2BCu4nKfwPcK%2FCvDVU%2BpHh8%2BLaldIf1fA5h3ndT6Fln9%2FW%2F9Ce1vndfvJtnPVO2xhm3qbafHVCN1X363UXHq9xuVD8OSD29Z8pZ5cZrern9cAdGW%2Fuib%2Fud%2BVK0L9a42r6C90kL8KzxwLQw9NkIQJL0ASU8M%2BVG0KsUdgdvpgP%2F6NqqP0%2FgHZFUfGEijZLHpiIgvV5%2FBltrj8Qd7XQd5p4P%2B7tJo30NMO6VGBwahSPMYiaaBYoLY6uEnciyhhh1Z%2FvvacG%2Frjpsvnpzs0B1Id6fmX8119l88XnOxe%2FuGrzzHcdu7UtY3%2B2vmXN5zUyj3ZcPl8p1sZSs6%2FnGXtwrV7Ka0XZdz83fwjjINpZWYw85lL8BRK4nGyIir2RiOsEyipuEcIakpGjWgBjLiHWOgj0Yi34gW1kKPxHt2Na5q%2Blwg1RdRSpFDNzosb44YJXnAfoEOpZW%2F%2F6u1lhYA6leevezbI26zNHO811M2dc5HFxpk4i1jPC0s21%2FBWW5DnPQbn2X1WK43%2FaM2n18DfSoybbNHijFpamzXI31eRibGUOxSu%2FlT96YZlq1Yt20DaSBuG6knw2eusHs5EPBfNmVvHKdaQzcDfz9ZsXmLDWGXy2U5OsYSsIn8CS12jQIyD12KKqZrLPy7mSPdICmd6WGHG8NDZkkHuE4h9TU8FpmUO%2FVjC%2FEinToFyoNDz2p9XD6g78WgQdPG7Z3R0T%2FZ5dTM9lsL8Ktek7szl2L%2BgQwGgwkZHc2g5Su7NvVqwGy2Ua4KSXUwt1X4PaM5paaEu6jQ5zVFyNabxvUksVt2T%2F4VeamYPlLtffdQsk%2B2sUTY%2FzDXl%2F05W53%2FBz9UK3p7LjapZ2ZxOm%2BUlZXrL3HHGqO8%2BwVroDaCTTnTxitMxmiAAYQzVJQH%2Bnj3oIHnPaN6Zq6sNSLjBl8tKgVr2mj%2F9CWi9dnKca8rBQBsd5R1tzVlgrl5pbnPw6kZclCr2CHxMnHohLz%2B3KRQokzALyeIKFU1TNCiayJdoHvDYe7K6mZLm8S3uJ9dojuaJ62%2FqN%2FtjQxnSnhnKPw%2BLNrLi8ZKyJ3x1YhiI1aNAtP6NzCGzYv3DmaGh%2FLvQZnt0evgIhTFV0kE%2FPYxAnOHhCQUZdCWY5JWJwMzlAGl1mpNbDU7yyGnhRMILsYhH3VRAijrPcBU8%2FCj1Y9NY6cnGVW0CjTLaz7E3epvaT%2FLtTV72Rs%2B0WVVmd0dz%2FMGTI5F0OsIviaqDlbbO5X6xT3PeXbXHRtf%2Fz%2Bfdka%2BeKPr8KF7IF4vBsT9MFPuPJMBTBMq9hQxXelQ%2Bbewnf18ap4Ib%2BmSMrtDU5zqlD8QANa5MBGh%2FOwOvSDfcV2d66mfEWsbGWmIz6nsyZDWQSmqmxDneYyvjHPmRXHZxeueyRGLZzvRioKnGto9nIPkibAJA16adcOZRQr1iAP3bUyBR7T4RgAWTKxhkCYFwshq%2B7iV9r0whk50cmRcTg4fy5x4OmmNkHndIA2%2BYuMbmE9dwGYB4KFTsvnDE6Ah47r%2FfE3AYI%2BoXADpkdlENcZ8OZEEf8FFGZNxMs6ZLpG3SUFLL7Q2kcFU%2FA%2FJsw%2BvWDa%2F7emewLaoeibaF1B9qUNnuqWK3%2BUfXYVL1v%2FomD15xxeDkPnXTOKSVcCbDGtOu0YQNpGAP7U1HU58UrqGu8xIbHtkQ3LVhb7Dx46ET3Ffcm1q0YcOizNmf3bC3VjWfAcpSv3MyTlgJ23FHQgmgvk%2Bgk8pL0mcCDOn08MDAQlf%2B%2FSlTZ1z12fnqntOhbOTL9%2FZdevbAPN%2Byby1f%2FuUtC%2Fixm8ZBo59LTXEW060hGrTDplNprWd58fwB%2Fb%2FE27BdS%2Fs7U%2BrGVCeQ46nzaw9QccnmZerGZZs3Yw9aVHt%2BKh6HN4ti6lxIhT%2FwahnZtWwzlY9QHQ2c79C%2BdxzvVDKy8GqKWQERO9YAKbpsDUTLdWV5dE8PVPjvj9pqw7ah%2FPFVtkit7aj6G5xY9mfJrCz1j1e0BcnPol4UjtrCdbahIVtd2HaURujnFJR8CuOuUUfhrGhgKKgjCYNSvCc1WKlEp8wHUaAYynFNyzZn%2B2MnYv36dbMDBTonl%2FT%2Fma5IKAyEGz%2B4eRnVtaX6tss2o34u8mWorFtuFgm4A6qK%2Fyp%2FgLEBVat5WnPDdKA574ubuFJ%2FIUfZ%2FY2Nt6mN%2BZNNTSTaeI56gKwkXerTe9DDHUw8%2FH35FY3nNN7GGuBKWhrV9ep%2B0k1WjNWVaHkW1yA%2BQHWNu8rtBw2a5YXuE40rs7%2FGA%2Bj09V3hA98yRnFPOGr8ltGlsFdD%2F7tRce3LH6Trcneuiy7K7J3khKu%2B3qUaXPWaX7T6%2FKfj9BX2eZq2XAcZT79u1ClJzUtHUqfqSMWBcZS43Ena0cUGLgpkKxB1QM%2B0Fxz10wgg6r5rltnFpH05pepUq3Y2HfYqeKRntmUFNz%2BXmcOs1H31U6cC6RTVLfCg7RNBF1UF2%2FwBgu0fFQtPEU1sSg3VcNsR7dWq3af87tUFn1l3ltXpaJxpNvtcZkH2WmMst3JqRpxUH%2BWC0E1qOGtP66s1MYv%2BVLu8%2FXFXvV%2FZbunYYBeVN64ls0ur6NzpV9xzlmQwB5qC4Tq70WC0tk8dWJXeHvkD0h9zJOM0vD86%2F1NJMaIAolctvlByferCsqOKDKceOfUu1PsmoFCamV5mCrMUOCi6V6FJosMF22AcrKJgQDVhfYh6tepp%2FlYgvnCEAbJQ1L0rOpajEmRcasMiPfxhgGoVo4rwreQpV6fUJHH2e8fa1s2c13Apl1b89a58ozdoap2sjgLN9uISl7P1DrulyeIkt0zr6JjWocoPOZsaXPb6jtqBblsgsaRre2xHi4nELm0MhG1%2Bx1SXwLpFi53b%2BaHRYo%2FIrbZtuWAKu5cSEXfybnnmUCaXGTpQr0xK2O2WWY76f%2BnAjNVf7nCZHU5XqIkTnpt6VtvsFlPXg1031g%2FVRdpkkyVpD7jnmax88QwDvg%2F66NnMRdRXTcGTmQc3cuINwN5IQqi0yzb%2BYFVHuVqI5s4ADfg5oE4ybDLd28mFSFmYvRoomsWXEdLU2Wl3GJy93ZNb%2Fd5gqmNaqJZSO1l6PVRy0nZIj%2F45EetjLguh1rLqR%2BSK0hO6NrsqcNX8zoUdjQYDJ7tb4os6%2Bi%2BY0qpY2AWlnLRDWdGFTfGY1gV0zNAtJ7pdo24se0D88AwLY%2FgZmE9iuP4V5v7CSR%2FRThaHLh%2BUeBkXwU6BC7lGOevK65udTv%2BtS%2FPfW7qj3ljTcj3b9OkbV85t8xsMj7Ddj7DGpthZKwKPvso%2Fc%2F1K9aLE12fMWLV1y1D9ua8lyJdWXr%2FbG%2BnoCFutf%2FmLILe39ITUV4igr3876fpX5g2zeB52sWnIL4fXHlgeUzOx5QfIvJQyrKQE9wHUqVq%2BPEaOrz0wVvNbJZVSfsuMzxN4l9PkedFzw9V5Dj%2BnzpgoT4ZxCxJfC5RWLc74YVHxKlExCYt0JAOMatREhHBSCAtSfod6x6Ls8HCWECLwXZ9nd5Dz1T24JUdWs6fU3%2B%2BfcnT49Qe%2BkBs%2BwdsMZgPXMp3U5S958snPP%2FEE7bvkOPCuTUDTUQ%2FUzirLhML9yPahoe1D5Fj5jWsaoveyP00PehdUAHk%2FseDVWsvDWXXXsyn%2F4wfpXc2V3%2FQxli3jl%2F5hj%2F83avSCfpTNxOEKLmTjxOEKuxgNlsQn0xgct724mhynupNW1Ph6o3RYS3%2F%2B2TJrzLlkFz%2Bip3qCHKf6eqW02QJLjBYuuj4sobhCWqa%2FYHGEHpcnumuWSOhxeaL7sOakNR6vvmo%2BYcfFA8UFXEPZf9UjyudIOyNwx%2Fi90DdsujS%2FFX2UAwvWSVK4NxaMhAGw3oowp%2Fuc8CTi7D2rBgZWwb%2F60faR7SPsEbjkXy4G0XaqhXPwe2cePjxjxuHD6ssQuR1fq6PF0E%2Bo2t1nePTn8TUmxz%2FA3crMoCc7egESuoTHYc7mYdg6etORoOhR7BBGD%2BqJopELrl4S6cJNRtEAsLP%2FOdvnJq0Wo0GolY2Et9VFB2Kf%2B4bZvVyxfOMz3WdFfSIryj6DwWghre7aQbdiDrkTL3A3vNDuDpk93HqXwam%2BbWmUJZfNn5ozKV5Pmmq8PF%2FjVY%2B2Tlk2M2RzSXKjmbQ4RZcQavEYrN%2F9rlXwtIQqzxQNMzPPfHYLvuPoO9TbT8bpGw5CQPGd%2BSyX%2FCyf0Vxjd2R9NmsunnXYa8xGHzn%2BsSfM5J0y0DZEXWWxkXjcR75KBLNLHi7XvX2G8VOrf4Ykg0AMdBESIpo7MgAfyakA6rkqpI6UjNs0px7cMV%2BD5BF49Tez1VGnYmq0WIijp985m4Sn2gJR9b07riPPFo97OYbUZbxJCpot7H%2FlpZBicglCPN7WOfJkcHqc3ElWqvvz%2F1E6bIQrG%2Btz6WkM1SM9FBTR7FSs8KyBBytSmNEoquJNFN5EQyTiCrnKDx1h58yxCepPHU5nxGoxEQeeOZi2m80DxNxncVhr6BmEfUarxejw%2BWSiHhWk19bSY7aKR5MsteblJpfTLtjimBouXsm3d3djjYM%2BwEW0El9dM%2FueVRWIsXwe43R7SgbVZqrnqoJ1X%2FkuF7pcgf8duv4q6vayV5U9zMV91GxO59UUjW8rHV6u799WzKMT7umRCXbYUKM%2BfoaCcwgaoqZUtmodV3p%2BX7akb4dnU9B9La38RPFUG2SCC90tVA4XwEFhyOpZZrUCsgWYHsczLFBBVGNtstoN1bw0Z%2BO4fYIbvZVt4EUcJEKOhHeincWqONw%2Bq6w5Go%2BWGOSR7LhKV%2BKBqbBPpfUvOf9QqkpDyVhBeyyZQGMsdA5FBUqvFMtUyGq9vjnsAJU4UcrxldP1CCaofyDkSAifoP5QwWx%2BSyUGxp75BzGAvtG7uQ38LehlyEQMeh0TeE6Bm7tYdXqdkt0uOb3kfYlNwmOdDyacOq%2FqlFo1v%2BPTmTi3E%2FglC9W11b34A22zmLzvb231Q0L2Bgg60OTW4YdstO%2BYOJnO38TtpH7zy9ymokWyA79qlVSn38HtpFlImFnhu3b4boNWXklOXV0Iwo7lQ1hrZyPFcwtjwFP7iEKSHSSJw509kh8kj6pr%2BH1jR7km9vcvqN9657vffefkv%2BfKxge1X%2B7RdjYUPIESN7gTvRkB%2FRMYtEkaVkdHApmdBPpnKmz0n1xSWFOyVIuLrinZwpoCRe6kyiVZoHX088F%2BUX4%2BWKS4iBTP0IWxGtZgOdMaV4KTayqHQF%2FVihBwTbgDXTCmKoOBJeNhwJMzEVjtjIFLuU38fPR7hqNG1JS7g%2FqRCuy3vmQ3W9Vu8qbVbP%2BSzazGRJH83MzP90Ck2m31mMjP8TiLn5uwD2Ugr2PFvPQjB5BnSJvQxGQZZEB%2BLopqzGzDbMmbkAPkZVJjeO5FzOSBKCgJze2ZS4Gemc9twrwY6u9H61iUQTcRvtdT9RW3tRxAWwFs2tcuJRnI6xjmBdWjbgFNRHMHiF1uHYBfUR%2Fut5Ug2jXAaT96%2B9RH%2FFToRwIzGbKmVJ1AZQnoabSB1yyIg7ByAridHApPMjyw0OiV6RjSbCuzwLAvFizBliWJua1tsuAgvNPbmljYbpt8lkWam7b3XZiOiKJskMOtmfScnsbPW208knwjuXrXK4Q1iKIgNyYXXDVT9C2Ye%2F78GQ5BEEXfFdde2RwauOysdJNL5AzCy84ard%2FnGAVN8alecnFdgu5Gbd5DJTL%2BhHZK0vApVy3OfU8XTSJg1TlssivsPYUlIqvn66PzrVTymCc4wgF6SDNR0pDf%2B9Gp%2BVnsUH5WtpHYsuhOaey8zdwLN47V8MTbm78g687%2BP3cx6tcAeNpjYGRgYGBk8s0%2FzBIfz2%2FzlUGeZQNQhOFCWfF0GP0%2F8P8c1jusIkAuBwMTSBQAYwQM6HjaY2BkYGAV%2Bd8KJgP%2FXWG9wwAUQQGLAYqPBl942n1TvUoDQRCe1VM8kWARjNrZGIurBAsRBIuA2vkAFsJiKTYW4guIjT5ARMgTxCLoA1hcb5OgDyGHrY7f7M65e8fpLF%2B%2B2W%2FnZ2eTmGfaIJi5I0qGDlZZcD51QzTTJirZPAI9JIwVA%2BwT8L5nOdMaV0AuMJ%2BicRHq8of6LSD18fzq8ds7xjpwBnQiSI9V5QVl6NwPvgM15NXn%2FAtWZyj3W0HjEXitOc%2FdIdbetPdFTZ%2BP6t%2BX7xU0%2Fk6GJtOe1%2FB3arN0%2Fpmz1J4UZc%2BD6ExwjD7vioeGd5HvhvU%2BR%2BDZcGZ6YBPNfAi0G97iBPwFXqph2cW8%2BD7kjMfwtinHb6kLb6Wygk3cZytSEoptGrlScdHtLPeri1JKueACMZfU1ViJG1Sq5E43dIt7SZZFl1zuRhb%2FGOs44xFVDbrJzB5tYs35OmaXTrEmkv0DajnMWQB42mNgYNCCwk0MLxheMPrhgUuY2JiUmOqY2pjWMD1hdmPOY%2B5hPsLCwWLEksSyiOUOawzrLrYiti%2FsCuxJ7Kc45DiSOPZxmnG2cG7jvMelweXDNYXrEbcBdxf3KR4OngheLd443g18fHwZfFv4NfiX8T8TEBIIEZggsEpQS7BMcJsQl5CFUI3QAWEp4RLhCyJaIldEbURXiJ4RYxEzE0sQ2yD2TzxIfJkEk4SeRJbENIkNEg8k%2FklqSGZITpE8InlL8p2UmVSG1A6pb9Jx0ltkjGSmyDySlZF1kc2RnSK7R%2FaZnJ5cmdwB%2BST5SwpuCvsUjRTLFHcoOShNU9qhzKespGyhXKV8SPmBCpOKgUqcyjSVR6omqgmqe9RE1OrUnqkHqO9R%2F6FholGgsUZzgeYZLTUtL60WbS7tKh0OnQydXTpvdGV0O3S%2F6Gnopekt0ruhz6fvpl%2Bnv0n%2Fh4GdQYvBJUMhwwTDdYYvjFSM4oxmGd0zVjK2M84w3mYiYZJgssLkkqmO6TzTF2Z2ZjVmd8ylzP3MJ5lfsRCwcLJoszhhyWXpZdlhecZKxirHapbVPesF1ndsJGwCbBbZ%2FLA1sn1jZ2XXY3fFXsM%2Bz36V%2FS8HD4cGh2OOTI51ThJOK5zeOUs4OzmXOS9wPuUi4JLgss7lm2uU6zY3NrcSty1u39zN3Mvct7l%2F8xDzMPLw88jyaPM44ynkaeEZ59niucqLyUvPKwgAn3OqOQAAAQAAARcApwARAAAAAAACAAAAAQABAAAAQAAuAAAAAHjarZK9TgJBEMf%2Fd6CRaAyRhMLqCgsbL4ciglTGRPEjSiSKlnLycXJ86CEniU%2FhM9jYWPgIFkYfwd6nsDD%2Bd1mBIIUx3mZnfzs3MzszuwDCeIYG8UUwQxmAFgxxPeeuyxrmcaNYxzTuFAewi0fFQSTxqXgM11pC8TgS2oPiCUS1d8Uh8ofiSczpYcVT5LjiCPlY8Qui%2BncOr7D02y6%2FBTCrP%2Fm%2Bb5bdTrPi2I26Z9qNGtbRQBMdXMJBGRW0YOCecxEWYoiTCvxrYBunqHPdoX2bLOyrMKlZg8thDETw5K7Itci1TXlGy0124QRZZLDFU%2FexhxztMozlosTpMH6ZPge0L%2BOKGnFKjJ4WRwppHPL0PP3SI2P9jLQwFOu3GRhDfkeyDo%2F%2FG7IHgzllZQxLdquvrdCyBVvat3seJlYo06gxapUxhU2JWnFygR03sSxnEkvcpf5Y5eibGq315TDp7fKWm8zbUVl71Aqq%2FZtNnlkWmLnQtno9ycvXYbA6W2pF3aKfCayyC0Ja7Fr%2FPW70%2FHO4YM0OKxFvzf0C1MyPjwAAeNpt1VWUU2cYRuHsgxenQt1d8%2F3JOUnqAyR1d%2FcCLQVKO22pu7tQd3d3d3d3d3cXmGzumrWy3pWLs%2FNdPDMpZaWu1783l1Lpf14MnfzO6FbqVupfGkD30iR60JNe9KYP09CXfvRnAAMZxGCGMG3pW6ZjemZgKDMyEzMzC7MyG7MzB3MyF3MzD%2FMyH%2FOzAAuyEAuzCIuyGIuzBGWCRIUqOQU16jRYkqVYmmVYluVYng6GMZwRNGmxAiuyEiuzCquyGquzBmuyFmuzDuuyHuuzARuyERuzCZuyGZuzBVuyFVuzDduyHdszklGMZgd2ZAw7MZZxjGdnJrALu9LJbuzOHkxkT%2FZib%2FZhX%2FZjfw7gQA7iYA7hUA7jcI7gSI7iaI7hWI7jeE7gRE7iZE5hEqdyGqdzBmdyFmdzDudyHudzARdyERdzCZdyGZdzBVdyFVdzDddyHddzAzdyEzdzC7dyG7dzB3dyF3dzD%2FdyH%2FfzAA%2FyEA%2FzCI%2FyGI%2FzBE%2FyFE%2FzDM%2FyHM%2FzAi%2FyEi%2FzCq%2FyGq%2FzBm%2FyFm%2FzDu%2FyHu%2FzAR%2FyER%2FzCZ%2FyGZ%2FzBV%2FyFV%2FzDd%2FyHd%2FzAz%2FyEz%2FzC7%2FyG7%2FzB3%2FyF3%2FzD%2F9mpYwsy7pl3bMeWc%2BsV9Y765NNk%2FXN%2BmX9swHZwGxQNjgb0nPkmInjR0V7Uq%2FOsaPL5Y7ylE3l8tQNN7kVt%2BrmbuHW3LrbcDvam1rtzVvdm50TxrU%2FDBvRtZUY1rV5a3jXFn550Wo%2FXDNWK3dFmh7X9LimxzU9qulRTY9qelTTo5rlKLt2wk7YiaprL%2ByFvbAX9pK9ZC%2FZS%2FaSvWQv2Uv2kr1kr2KvYq9ir2KvYq9ir2KvYq9ir2Kvaq9qr2qvaq9qr2qvaq9qr2qvai%2B3l9vL7eX2cnu5vdxebi%2B3l9sr7BV2CjuFncJOYaewU9gp7NTs1LyrZq9mr2avZq9mr2avZq9mr26vbq9ur26vbq9ur26vbq9ur26vYa9hr2GvYa9hr2GvYa%2FR7oXuQ%2Feh%2B2j%2FUU7e3C3cqc%2FV3fYdof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D92H7kP3ofvQfeg%2BdB%2B6D92H7kP3ofvQfRT29B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6D%2F2H%2FkP%2Fof%2FQf%2Bg%2F9B%2F6j6nuG3Ya7U5q%2F0hN3nCTW3Grbu4Wrs%2FrP%2Bk%2F6T%2FpP%2Bk%2F6T%2FpP%2Bk%2B6T7pPek86TzpPOk86TzpOuk66TrpOuk66TrpOlWmPu%2F36zrpOuk66TrpOuk66TrpOvl%2FPek76TvpO%2Bk76TvpO%2Bk76TvpO%2Bk76TvpO7V9t%2BqtVs%2FOaOURU6bo6PgPt6rZbwAAAAABVFDDFwAA%29%20format%28%27woff%27%29%2Curl%28data%3Aapplication%2Fx%2Dfont%2Dtruetype%3Bbase64%2CAAEAAAAPAIAAAwBwRkZUTW0ql9wAAAD8AAAAHEdERUYBRAAEAAABGAAAACBPUy8yZ7lriQAAATgAAABgY21hcNqt44EAAAGYAAAGcmN2dCAAKAL4AAAIDAAAAARnYXNw%2F%2F8AAwAACBAAAAAIZ2x5Zn1dwm8AAAgYAACUpGhlYWQFTS%2FYAACcvAAAADZoaGVhCkQEEQAAnPQAAAAkaG10eNLHIGAAAJ0YAAADdGxvY2Fv%2B5XOAACgjAAAAjBtYXhwAWoA2AAAorwAAAAgbmFtZbMsoJsAAKLcAAADonBvc3S6o%2BU1AACmgAAACtF3ZWJmwxhUUAAAsVQAAAAGAAAAAQAAAADMPaLPAAAAANB2gXUAAAAA0HZzlwABAAAADgAAABgAAAAAAAIAAQABARYAAQAEAAAAAgAAAAMEiwGQAAUABAMMAtAAAABaAwwC0AAAAaQAMgK4AAAAAAUAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAFVLV04AQAAg%2F%2F8DwP8QAAAFFAB7AAAAAQAAAAAAAAAAAAAAIAABAAAABQAAAAMAAAAsAAAACgAAAdwAAQAAAAAEaAADAAEAAAAsAAMACgAAAdwABAGwAAAAaABAAAUAKAAgACsAoAClIAogLyBfIKwgvSISIxsl%2FCYBJvonCScP4APgCeAZ4CngOeBJ4FngYOBp4HngieCX4QnhGeEp4TnhRuFJ4VnhaeF54YnhleGZ4gbiCeIW4hniIeIn4jniSeJZ4mD4%2F%2F%2F%2FAAAAIAAqAKAApSAAIC8gXyCsIL0iEiMbJfwmASb6JwknD%2BAB4AXgEOAg4DDgQOBQ4GDgYuBw4IDgkOEB4RDhIOEw4UDhSOFQ4WDhcOGA4ZDhl%2BIA4gniEOIY4iHiI%2BIw4kDiUOJg%2BP%2F%2F%2F%2F%2Fj%2F9r%2FZv9i4Ajf5N%2B132nfWd4F3P3aHdoZ2SHZE9kOIB0gHCAWIBAgCiAEH%2F4f%2BB%2F3H%2FEf6x%2FlH3wfdh9wH2ofZB9jH10fVx9RH0sfRR9EHt4e3B7WHtUezh7NHsUevx65HrMIFQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAACjAAAAAAAAAA1AAAAIAAAACAAAAADAAAAKgAAACsAAAAEAAAAoAAAAKAAAAAGAAAApQAAAKUAAAAHAAAgAAAAIAoAAAAIAAAgLwAAIC8AAAATAAAgXwAAIF8AAAAUAAAgrAAAIKwAAAAVAAAgvQAAIL0AAAAWAAAiEgAAIhIAAAAXAAAjGwAAIxsAAAAYAAAl%2FAAAJfwAAAAZAAAmAQAAJgEAAAAaAAAm%2BgAAJvoAAAAbAAAnCQAAJwkAAAAcAAAnDwAAJw8AAAAdAADgAQAA4AMAAAAeAADgBQAA4AkAAAAhAADgEAAA4BkAAAAmAADgIAAA4CkAAAAwAADgMAAA4DkAAAA6AADgQAAA4EkAAABEAADgUAAA4FkAAABOAADgYAAA4GAAAABYAADgYgAA4GkAAABZAADgcAAA4HkAAABhAADggAAA4IkAAABrAADgkAAA4JcAAAB1AADhAQAA4QkAAAB9AADhEAAA4RkAAACGAADhIAAA4SkAAACQAADhMAAA4TkAAACaAADhQAAA4UYAAACkAADhSAAA4UkAAACrAADhUAAA4VkAAACtAADhYAAA4WkAAAC3AADhcAAA4XkAAADBAADhgAAA4YkAAADLAADhkAAA4ZUAAADVAADhlwAA4ZkAAADbAADiAAAA4gYAAADeAADiCQAA4gkAAADlAADiEAAA4hYAAADmAADiGAAA4hkAAADtAADiIQAA4iEAAADvAADiIwAA4icAAADwAADiMAAA4jkAAAD1AADiQAAA4kkAAAD%2FAADiUAAA4lkAAAEJAADiYAAA4mAAAAETAAD4%2FwAA%2BP8AAAEUAAH1EQAB9REAAAEVAAH2qgAB9qoAAAEWAAYCCgAAAAABAAABAAAAAAAAAAAAAAAAAAAAAQACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAEAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAL4AAAAAf%2F%2FAAIAAgAoAAABaAMgAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCxAwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIRElMxEjKAFA%2Fujw8AMg%2FOAoAtAAAQBkAGQETARMAFsAAAEyFh8BHgEdATc%2BAR8BFgYPATMyFhcWFRQGDwEOASsBFx4BDwEGJi8BFRQGBwYjIiYvAS4BPQEHDgEvASY2PwEjIiYnJjU0Nj8BPgE7AScuAT8BNhYfATU0Njc2AlgPJgsLCg%2BeBxYIagcCB57gChECBgMCAQIRCuCeBwIHaggWB54PCikiDyYLCwoPngcWCGoHAgee4AoRAgYDAgECEQrgngcCB2oIFgeeDwopBEwDAgECEQrgngcCB2oIFgeeDwopIg8mCwsKD54HFghqBwIHnuAKEQIGAwIBAhEK4J4HAgdqCBYHng8KKSIPJgsLCg%2BeBxYIagcCB57gChECBgAAAAABAAAAAARMBEwAIwAAATMyFhURITIWHQEUBiMhERQGKwEiJjURISImPQE0NjMhETQ2AcLIFR0BXhUdHRX%2Boh0VyBUd%2FqIVHR0VAV4dBEwdFf6iHRXIFR3%2BohUdHRUBXh0VyBUdAV4VHQAAAAABAHAAAARABEwARQAAATMyFgcBBgchMhYPAQ4BKwEVITIWDwEOASsBFRQGKwEiJj0BISImPwE%2BATsBNSEiJj8BPgE7ASYnASY2OwEyHwEWMj8BNgM5%2BgoFCP6UBgUBDAoGBngGGAp9ARMKBgZ4BhgKfQ8LlAsP%2Fu0KBgZ4BhgKff7tCgYGeAYYCnYFBv6UCAUK%2BhkSpAgUCKQSBEwKCP6UBgwMCKAIDGQMCKAIDK4LDw8LrgwIoAgMZAwIoAgMDAYBbAgKEqQICKQSAAABAGQABQSMBK4AOwAAATIXFhcjNC4DIyIOAwchByEGFSEHIR4EMzI%2BAzUzBgcGIyInLgEnIzczNjcjNzM%2BATc2AujycDwGtSM0QDkXEys4MjAPAXtk%2FtQGAZZk%2FtQJMDlCNBUWOUA0I64eYmunznYkQgzZZHABBdpkhhQ%2BH3UErr1oaS1LMCEPCx4uTzJkMjJkSnRCKw8PIjBKK6trdZ4wqndkLzVkV4UljQAAAgB7AAAETASwAD4ARwAAASEyHgUVHAEVFA4FKwEHITIWDwEOASsBFRQGKwEiJj0BISImPwE%2BATsBNSEiJj8BPgE7ARE0NhcRMzI2NTQmIwGsAV5DakIwFgwBAQwWMEJqQ7ICASAKBgZ4BhgKigsKlQoP%2FvUKBgZ4BhgKdf71CgYGeAYYCnUPtstALS1ABLAaJD8yTyokCwsLJCpQMkAlGmQMCKAIDK8LDg8KrwwIoAgMZAwIoAgMAdsKD8j%2B1EJWVEAAAAEAyAGQBEwCvAAPAAATITIWHQEUBiMhIiY9ATQ2%2BgMgFR0dFfzgFR0dArwdFcgVHR0VyBUdAAAAAgDIAAAD6ASwACUAQQAAARUUBisBFRQGBx4BHQEzMhYdASE1NDY7ATU0NjcuAT0BIyImPQEXFRQWFx4BFAYHDgEdASE1NCYnLgE0Njc%2BAT0BA%2BgdFTJjUVFjMhUd%2FOAdFTJjUVFjMhUdyEE3HCAgHDdBAZBBNxwgIBw3QQSwlhUdZFuVIyOVW5YdFZaWFR2WW5UjI5VbZB0VlshkPGMYDDI8MgwYYzyWljxjGAwyPDIMGGM8ZAAAAAEAAAAAAAAAAAAAAAAxAAAB%2F%2FIBLATCBEEAFgAAATIWFzYzMhYVFAYjISImNTQ2NyY1NDYB9261LCwueKqqeP0ST3FVQgLYBEF3YQ6teHmtclBFaw4MGZnXAAAAAgAAAGQEsASvABoAHgAAAB4BDwEBMzIWHQEhNTQ2OwEBJyY%2BARYfATc2AyEnAwL2IAkKiAHTHhQe%2B1AeFB4B1IcKCSAkCm9wCXoBebbDBLMTIxC7%2FRYlFSoqFSUC6rcQJBQJEJSWEPwecAIWAAAAAAQAAABkBLAETAALABcAIwA3AAATITIWBwEGIicBJjYXARYUBwEGJjURNDYJATYWFREUBicBJjQHARYGIyEiJjcBNjIfARYyPwE2MhkEfgoFCP3MCBQI%2FcwIBQMBCAgI%2FvgICgoDjAEICAoKCP74CFwBbAgFCvuCCgUIAWwIFAikCBQIpAgUBEwKCP3JCAgCNwgK2v74CBQI%2FvgIBQoCJgoF%2FvABCAgFCv3aCgUIAQgIFID%2BlAgKCggBbAgIpAgIpAgAAAAD%2F%2FD%2F8AS6BLoACQANABAAAAAyHwEWFA8BJzcTAScJAQUTA%2BAmDpkNDWPWXyL9mdYCZv4f%2FrNuBLoNmQ4mDlzWYP50%2FZrWAmb8anABTwAAAAEAAAAABLAEsAAPAAABETMyFh0BITU0NjsBEQEhArz6FR384B0V%2Bv4MBLACiv3aHRUyMhUdAiYCJgAAAAEADgAIBEwEnAAfAAABJTYWFREUBgcGLgE2NzYXEQURFAYHBi4BNjc2FxE0NgFwAoUnMFNGT4gkV09IQv2oWEFPiCRXT0hCHQP5ow8eIvzBN1EXGSltchkYEAIJm%2F2iKmAVGilucRoYEQJ%2FJioAAAACAAn%2F%2BAS7BKcAHQApAAAAMh4CFQcXFAcBFgYPAQYiJwEGIycHIi4CND4BBCIOARQeATI%2BATQmAZDItoNOAQFOARMXARY7GikT%2Fu13jgUCZLaDTk6DAXKwlFZWlLCUVlYEp06DtmQCBY15%2Fu4aJRg6FBQBEk0BAU6Dtsi2g1tWlLCUVlaUsJQAAQBkAFgErwREABkAAAE%2BAh4CFRQOAwcuBDU0PgIeAQKJMHt4dVg2Q3mEqD4%2Bp4V4Qzhadnh5A7VESAUtU3ZAOXmAf7JVVbJ%2FgHk5QHZTLQVIAAAAAf%2FTAF4EewSUABgAAAETNjIXEyEyFgcFExYGJyUFBiY3EyUmNjMBl4MHFQeBAaUVBhH%2BqoIHDxH%2Bqf6qEQ8Hgv6lEQYUAyABYRMT%2Fp8RDPn%2BbxQLDPb3DAsUAZD7DBEAAv%2FTAF4EewSUABgAIgAAARM2MhcTITIWBwUTFgYnJQUGJjcTJSY2MwUjFwc3Fyc3IycBl4MHFQeBAaUVBhH%2BqoIHDxH%2Bqf6qEQ8Hgv6lEQYUAfPwxUrBw0rA6k4DIAFhExP%2BnxEM%2Bf5vFAsM9vcMCxQBkPsMEWSO4ouM5YzTAAABAAAAAASwBLAAJgAAATIWHQEUBiMVFBYXBR4BHQEUBiMhIiY9ATQ2NyU%2BAT0BIiY9ATQ2Alh8sD4mDAkBZgkMDwr7ggoPDAkBZgkMJj6wBLCwfPouaEsKFwbmBRcKXQoPDwpdChcF5gYXCktoLvp8sAAAAA0AAAAABLAETAAPABMAIwAnACsALwAzADcARwBLAE8AUwBXAAATITIWFREUBiMhIiY1ETQ2FxUzNSkBIgYVERQWMyEyNjURNCYzFTM1BRUzNSEVMzUFFTM1IRUzNQchIgYVERQWMyEyNjURNCYFFTM1IRUzNQUVMzUhFTM1GQR%2BCg8PCvuCCg8PVWQCo%2F3aCg8PCgImCg8Pc2T8GGQDIGT8GGQDIGTh%2FdoKDw8KAiYKDw%2F872QDIGT8GGQDIGQETA8K%2B%2BYKDw8KBBoKD2RkZA8K%2FqIKDw8KAV4KD2RkyGRkZGTIZGRkZGQPCv6iCg8PCgFeCg9kZGRkZMhkZGRkAAAEAAAAAARMBEwADwAfAC8APwAAEyEyFhURFAYjISImNRE0NikBMhYVERQGIyEiJjURNDYBITIWFREUBiMhIiY1ETQ2KQEyFhURFAYjISImNRE0NjIBkBUdHRX%2BcBUdHQJtAZAVHR0V%2FnAVHR39vQGQFR0dFf5wFR0dAm0BkBUdHRX%2BcBUdHQRMHRX%2BcBUdHRUBkBUdHRX%2BcBUdHRUBkBUd%2FagdFf5wFR0dFQGQFR0dFf5wFR0dFQGQFR0AAAkAAAAABEwETAAPAB8ALwA%2FAE8AXwBvAH8AjwAAEzMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYhMzIWHQEUBisBIiY9ATQ2ATMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYhMzIWHQEUBisBIiY9ATQ2ATMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYhMzIWHQEUBisBIiY9ATQ2MsgVHR0VyBUdHQGlyBUdHRXIFR0dAaXIFR0dFcgVHR389cgVHR0VyBUdHQGlyBUdHRXIFR0dAaXIFR0dFcgVHR389cgVHR0VyBUdHQGlyBUdHRXIFR0dAaXIFR0dFcgVHR0ETB0VyBUdHRXIFR0dFcgVHR0VyBUdHRXIFR0dFcgVHf5wHRXIFR0dFcgVHR0VyBUdHRXIFR0dFcgVHR0VyBUd%2FnAdFcgVHR0VyBUdHRXIFR0dFcgVHR0VyBUdHRXIFR0ABgAAAAAEsARMAA8AHwAvAD8ATwBfAAATMzIWHQEUBisBIiY9ATQ2KQEyFh0BFAYjISImPQE0NgEzMhYdARQGKwEiJj0BNDYpATIWHQEUBiMhIiY9ATQ2ATMyFh0BFAYrASImPQE0NikBMhYdARQGIyEiJj0BNDYyyBUdHRXIFR0dAaUCvBUdHRX9RBUdHf6FyBUdHRXIFR0dAaUCvBUdHRX9RBUdHf6FyBUdHRXIFR0dAaUCvBUdHRX9RBUdHQRMHRXIFR0dFcgVHR0VyBUdHRXIFR3%2BcB0VyBUdHRXIFR0dFcgVHR0VyBUd%2FnAdFcgVHR0VyBUdHRXIFR0dFcgVHQAAAAABACYALAToBCAAFwAACQE2Mh8BFhQHAQYiJwEmND8BNjIfARYyAdECOwgUB7EICPzxBxUH%2FoAICLEHFAirBxYB3QI7CAixBxQI%2FPAICAGACBQHsQgIqwcAAQBuAG4EQgRCACMAAAEXFhQHCQEWFA8BBiInCQEGIi8BJjQ3CQEmND8BNjIXCQE2MgOIsggI%2FvUBCwgIsggVB%2F70%2FvQHFQiyCAgBC%2F71CAiyCBUHAQwBDAcVBDuzCBUH%2FvT%2B9AcVCLIICAEL%2FvUICLIIFQcBDAEMBxUIsggI%2FvUBDAcAAwAX%2F%2BsExQSZABkAJQBJAAAAMh4CFRQHARYUDwEGIicBBiMiLgI0PgEEIg4BFB4BMj4BNCYFMzIWHQEzMhYdARQGKwEVFAYrASImPQEjIiY9ATQ2OwE1NDYBmcSzgk1OASwICG0HFQj%2B1HeOYrSBTU2BAW%2BzmFhYmLOZWFj%2BvJYKD0sKDw8KSw8KlgoPSwoPDwpLDwSZTYKzYo15%2FtUIFQhsCAgBK01NgbTEs4JNWJmzmFhYmLOZIw8KSw8KlgoPSwoPDwpLDwqWCg9LCg8AAAMAF%2F%2FrBMUEmQAZACUANQAAADIeAhUUBwEWFA8BBiInAQYjIi4CND4BBCIOARQeATI%2BATQmBSEyFh0BFAYjISImPQE0NgGZxLOCTU4BLAgIbQcVCP7Ud45itIFNTYEBb7OYWFiYs5lYWP5YAV4KDw8K%2FqIKDw8EmU2Cs2KNef7VCBUIbAgIAStNTYG0xLOCTViZs5hYWJizmYcPCpYKDw8KlgoPAAAAAAIAFwAXBJkEsAAPAC0AAAEzMhYVERQGKwEiJjURNDYFNRYSFRQOAiIuAjU0EjcVDgEVFB4BMj4BNTQmAiZkFR0dFWQVHR0BD6fSW5vW6tabW9KnZ3xyxejFcnwEsB0V%2FnAVHR0VAZAVHeGmPv7ZuHXWm1tbm9Z1uAEnPqY3yHh0xXJyxXR4yAAEAGQAAASwBLAADwAfAC8APwAAATMyFhURFAYrASImNRE0NgEzMhYVERQGKwEiJjURNDYBMzIWFREUBisBIiY1ETQ2BTMyFh0BFAYrASImPQE0NgQBlgoPDwqWCg8P%2Ft6WCg8PCpYKDw%2F%2B3pYKDw8KlgoPD%2F7elgoPDwqWCg8PBLAPCvuCCg8PCgR%2BCg%2F%2BcA8K%2FRIKDw8KAu4KD%2F7UDwr%2BPgoPDwoBwgoPyA8K%2BgoPDwr6Cg8AAAAAAgAaABsElgSWAEcATwAAATIfAhYfATcWFwcXFh8CFhUUDwIGDwEXBgcnBwYPAgYjIi8CJi8BByYnNycmLwImNTQ%2FAjY%2FASc2Nxc3Nj8CNhIiBhQWMjY0AlghKSYFMS0Fhj0rUAMZDgGYBQWYAQ8YA1AwOIYFLDIFJisfISkmBTEtBYY8LFADGQ0ClwYGlwINGQNQLzqFBS0xBSYreLJ%2BfrJ%2BBJYFmAEOGQJQMDmGBSwxBiYrHiIoJgYxLAWGPSxRAxkOApcFBZcCDhkDUTA5hgUtMAYmKiAhKCYGMC0Fhj0sUAIZDgGYBf6ZfrF%2BfrEABwBkAAAEsAUUABMAFwAhACUAKQAtADEAAAEhMhYdASEyFh0BITU0NjMhNTQ2FxUhNQERFAYjISImNREXETMRMxEzETMRMxEzETMRAfQBLCk7ARMKD%2Fu0DwoBEzspASwBLDsp%2FUQpO2RkZGRkZGRkBRQ7KWQPCktLCg9kKTtkZGT%2B1PzgKTs7KQMgZP1EArz9RAK8%2FUQCvP1EArwAAQAMAAAFCATRAB8AABMBNjIXARYGKwERFAYrASImNREhERQGKwEiJjURIyImEgJsCBUHAmAIBQqvDwr6Cg%2F%2B1A8K%2BgoPrwoFAmoCYAcH%2FaAICv3BCg8PCgF3%2FokKDw8KAj8KAAIAZAAAA%2BgEsAARABcAAAERFBYzIREUBiMhIiY1ETQ2MwEjIiY9AQJYOykBLB0V%2FOAVHR0VA1L6FR0EsP5wKTv9dhUdHRUETBUd%2FnAdFfoAAwAXABcEmQSZAA8AGwAwAAAAMh4CFA4CIi4CND4BBCIOARQeATI%2BATQmBTMyFhURMzIWHQEUBisBIiY1ETQ2AePq1ptbW5vW6tabW1ubAb%2FoxXJyxejFcnL%2BfDIKD68KDw8K%2BgoPDwSZW5vW6tabW1ub1urWmztyxejFcnLF6MUNDwr%2B7Q8KMgoPDwoBXgoPAAAAAAL%2FnAAABRQEsAALAA8AACkBAyMDIQEzAzMDMwEDMwMFFP3mKfIp%2FeYBr9EVohTQ%2Fp4b4BsBkP5wBLD%2B1AEs%2FnD%2B1AEsAAAAAAIAZAAABLAEsAAVAC8AAAEzMhYVETMyFgcBBiInASY2OwERNDYBMzIWFREUBiMhIiY1ETQ2OwEyFh0BITU0NgImyBUdvxQLDf65DSYN%2FrkNCxS%2FHQJUMgoPDwr75goPDwoyCg8DhA8EsB0V%2Fj4XEP5wEBABkBAXAcIVHfzgDwr%2BogoPDwoBXgoPDwqvrwoPAAMAFwAXBJkEmQAPABsAMQAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JgUzMhYVETMyFgcDBiInAyY2OwERNDYB4%2BrWm1tbm9bq1ptbW5sBv%2BjFcnLF6MVycv58lgoPiRUKDd8NJg3fDQoViQ8EmVub1urWm1tbm9bq1ps7csXoxXJyxejFDQ8K%2Fu0XEP7tEBABExAXARMKDwAAAAMAFwAXBJkEmQAPABsAMQAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JiUTFgYrAREUBisBIiY1ESMiJjcTNjIB4%2BrWm1tbm9bq1ptbW5sBv%2BjFcnLF6MVycv7n3w0KFYkPCpYKD4kVCg3fDSYEmVub1urWm1tbm9bq1ps7csXoxXJyxejFAf7tEBf%2B7QoPDwoBExcQARMQAAAAAAIAAAAABLAEsAAZADkAABMhMhYXExYVERQGBwYjISImJyY1EzQ3Ez4BBSEiBgcDBhY7ATIWHwEeATsBMjY%2FAT4BOwEyNicDLgHhAu4KEwO6BwgFDBn7tAweAgYBB7kDEwKX%2FdQKEgJXAgwKlgoTAiYCEwr6ChMCJgITCpYKDAJXAhIEsA4K%2FXQYGf5XDB4CBggEDRkBqRkYAowKDsgOC%2F4%2BCw4OCpgKDg4KmAoODgsBwgsOAAMAFwAXBJkEmQAPABsAJwAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JgUXFhQPAQYmNRE0NgHj6tabW1ub1urWm1tbmwG%2F6MVycsXoxXJy%2Fov9ERH9EBgYBJlbm9bq1ptbW5vW6tabO3LF6MVycsXoxV2%2BDCQMvgwLFQGQFQsAAQAXABcEmQSwACgAAAE3NhYVERQGIyEiJj8BJiMiDgEUHgEyPgE1MxQOAiIuAjQ%2BAjMyA7OHBwsPCv6WCwQHhW2BdMVycsXoxXKWW5vW6tabW1ub1nXABCSHBwQL%2FpYKDwsHhUxyxejFcnLFdHXWm1tbm9bq1ptbAAAAAAIAFwABBJkEsAAaADUAAAE3NhYVERQGIyEiJj8BJiMiDgEVIzQ%2BAjMyEzMUDgIjIicHBiY1ETQ2MyEyFg8BFjMyPgEDs4cHCw8L%2FpcLBAeGboF0xXKWW5vWdcDrllub1nXAnIYHCw8LAWgKBQiFboJ0xXIEJIcHBAv%2BlwsPCweGS3LFdHXWm1v9v3XWm1t2hggFCgFoCw8LB4VMcsUAAAAKAGQAAASwBLAADwAfAC8APwBPAF8AbwB%2FAI8AnwAAEyEyFhURFAYjISImNRE0NgUhIgYVERQWMyEyNjURNCYFMzIWHQEUBisBIiY9ATQ2MyEyFh0BFAYjISImPQE0NgczMhYdARQGKwEiJj0BNDYzITIWHQEUBiMhIiY9ATQ2BzMyFh0BFAYrASImPQE0NjMhMhYdARQGIyEiJj0BNDYHMzIWHQEUBisBIiY9ATQ2MyEyFh0BFAYjISImPQE0Nn0EGgoPDwr75goPDwPA%2FK4KDw8KA1IKDw%2F9CDIKDw8KMgoPD9IBwgoPDwr%2BPgoPD74yCg8PCjIKDw%2FSAcIKDw8K%2Fj4KDw%2B%2BMgoPDwoyCg8P0gHCCg8PCv4%2BCg8PvjIKDw8KMgoPD9IBwgoPDwr%2BPgoPDwSwDwr7ggoPDwoEfgoPyA8K%2FK4KDw8KA1IKD2QPCjIKDw8KMgoPDwoyCg8PCjIKD8gPCjIKDw8KMgoPDwoyCg8PCjIKD8gPCjIKDw8KMgoPDwoyCg8PCjIKD8gPCjIKDw8KMgoPDwoyCg8PCjIKDwAAAAACAAAAAARMBLAAGQAjAAABNTQmIyEiBh0BIyIGFREUFjMhMjY1ETQmIyE1NDY7ATIWHQEDhHVT%2FtRSdmQpOzspA4QpOzsp%2FageFMgUHgMgyFN1dlLIOyn9qCk7OykCWCk7lhUdHRWWAAIAZAAABEwETAAJADcAABMzMhYVESMRNDYFMhcWFREUBw4DIyIuAScuAiMiBwYjIicmNRE%2BATc2HgMXHgIzMjc2fTIKD2QPA8AEBRADIUNAMRwaPyonKSxHHlVLBwgGBQ4WeDsXKC4TOQQpLUUdZ1AHBEwPCvvNBDMKDzACBhH%2BWwYGO1AkDQ0ODg8PDzkFAwcPAbY3VwMCAwsGFAEODg5XCAAAAwAAAAAEsASXACEAMQBBAAAAMh4CFREUBisBIiY1ETQuASAOARURFAYrASImNRE0PgEDMzIWFREUBisBIiY1ETQ2ITMyFhURFAYrASImNRE0NgHk6N6jYw8KMgoPjeT%2B%2BuSNDwoyCg9joyqgCAwMCKAIDAwCYKAIDAwIoAgMDASXY6PedP7UCg8PCgEsf9FyctF%2F%2FtQKDw8KASx03qP9wAwI%2FjQIDAwIAcwIDAwI%2FjQIDAwIAcwIDAAAAAACAAAA0wRHA90AFQA5AAABJTYWFREUBiclJisBIiY1ETQ2OwEyBTc2Mh8BFhQPARcWFA8BBiIvAQcGIi8BJjQ%2FAScmND8BNjIXAUEBAgkMDAn%2B%2FhUZ%2BgoPDwr6GQJYeAcUByIHB3h4BwciBxQHeHgHFAciBwd3dwcHIgcUBwMurAYHCv0SCgcGrA4PCgFeCg%2BEeAcHIgcUB3h4BxQHIgcHd3cHByIHFAd4eAcUByIICAAAAAACAAAA0wNyA90AFQAvAAABJTYWFREUBiclJisBIiY1ETQ2OwEyJTMWFxYVFAcGDwEiLwEuATc2NTQnJjY%2FATYBQQECCQwMCf7%2BFRn6Cg8PCvoZAdIECgZgWgYLAwkHHQcDBkhOBgMIHQcDLqwGBwr9EgoHBqwODwoBXgoPZAEJgaGafwkBAQYXBxMIZ36EaggUBxYFAAAAAAMAAADEBGID7AAbADEASwAAATMWFxYVFAYHBgcjIi8BLgE3NjU0JicmNj8BNgUlNhYVERQGJyUmKwEiJjURNDY7ATIlMxYXFhUUBwYPASIvAS4BNzY1NCcmNj8BNgPHAwsGh0RABwoDCQcqCAIGbzs3BgIJKgf9ggECCQwMCf7%2BFRn6Cg8PCvoZAdIECgZgWgYLAwkHHQcDBkhOBgMIHQcD7AEJs9lpy1QJAQYiBhQIlrJarEcJFAYhBb6sBgcK%2FRIKBwasDg8KAV4KD2QBCYGhmn8JAQEGFwcTCGd%2BhGoIFQYWBQAAAAANAAAAAASwBLAACQAVABkAHQAhACUALQA7AD8AQwBHAEsATwAAATMVIxUhFSMRIQEjFTMVIREjESM1IQURIREhESERBSM1MwUjNTMBMxEhETM1MwEzFSMVIzUjNTM1IzUhBREhEQcjNTMFIzUzASM1MwUhNSEB9GRk%2FnBkAfQCvMjI%2FtTIZAJY%2B7QBLAGQASz84GRkArxkZP1EyP4MyGQB9MhkyGRkyAEs%2FUQBLGRkZAOEZGT%2BDGRkAfT%2B1AEsA4RkZGQCWP4MZMgBLAEsyGT%2B1AEs%2FtQBLMhkZGT%2BDP4MAfRk%2FtRkZGRkyGTI%2FtQBLMhkZGT%2B1GRkZAAAAAAJAAAAAASwBLAAAwAHAAsADwATABcAGwAfACMAADcjETMTIxEzASMRMxMjETMBIxEzASE1IRcjNTMXIzUzBSM1M2RkZMhkZAGQyMjIZGQBLMjI%2FOD%2B1AEsyGRkyGRkASzIyMgD6PwYA%2Bj8GAPo%2FBgD6PwYA%2Bj7UGRkW1tbW1sAAAIAAAAKBKYEsAANABUAAAkBFhQHAQYiJwETNDYzBCYiBhQWMjYB9AKqCAj%2BMAgUCP1WAQ8KAUM7Uzs7UzsEsP1WCBQI%2FjAICAKqAdsKD807O1Q7OwAAAAADAAAACgXSBLAADQAZACEAAAkBFhQHAQYiJwETNDYzIQEWFAcBBiIvAQkBBCYiBhQWMjYB9AKqCAj%2BMAgUCP1WAQ8KAwYCqggI%2FjAIFAg4Aaj9RP7TO1M7O1M7BLD9VggUCP4wCAgCqgHbCg%2F9VggUCP4wCAg4AaoCvM07O1Q7OwAAAAABAGQAAASwBLAAJgAAASEyFREUDwEGJjURNCYjISIPAQYWMyEyFhURFAYjISImNRE0PwE2ASwDOUsSQAgKDwr9RBkSQAgFCgK8Cg8PCvyuCg8SixIEsEv8fBkSQAgFCgO2Cg8SQAgKDwr8SgoPDwoDzxkSixIAAAABAMj%2F%2FwRMBLAACgAAEyEyFhURCQERNDb6AyAVHf4%2B%2Fj4dBLAdFfuCAbz%2BQwR%2FFR0AAAAAAwAAAAAEsASwABUARQBVAAABISIGBwMGHwEeATMhMjY%2FATYnAy4BASMiBg8BDgEjISImLwEuASsBIgYVERQWOwEyNj0BNDYzITIWHQEUFjsBMjY1ETQmASEiBg8BBhYzITI2LwEuAQM2%2FkQLEAFOBw45BhcKAcIKFwY%2BDgdTARABVpYKFgROBBYK%2FdoKFgROBBYKlgoPDwqWCg8PCgLuCg8PCpYKDw%2F%2Bsf4MChMCJgILCgJYCgsCJgITBLAPCv7TGBVsCQwMCWwVGAEtCg%2F%2BcA0JnAkNDQmcCQ0PCv12Cg8PCpYKDw8KlgoPDwoCigoP%2FagOCpgKDg4KmAoOAAAAAAQAAABkBLAETAAdACEAKQAxAAABMzIeAh8BMzIWFREUBiMhIiY1ETQ2OwE%2BBAEVMzUEIgYUFjI2NCQyFhQGIiY0AfTIOF00JAcGlik7Oyn8GCk7OymWAgknM10ByGT%2Bz76Hh76H%2Fu9WPDxWPARMKTs7FRQ7Kf2oKTs7KQJYKTsIG0U1K%2F7UZGRGh76Hh74IPFY8PFYAAAAAAgA1AAAEsASvACAAIwAACQEWFx4BHwEVITUyNi8BIQYHBh4CMxUhNTY3PgE%2FAQEDIQMCqQGBFCgSJQkK%2Fl81LBFS%2Fnk6IgsJKjIe%2FpM4HAwaBwcBj6wBVKIEr%2FwaMioTFQECQkJXLd6RWSIuHAxCQhgcDCUNDQPu%2FVoByQAAAAADAGQAAAPwBLAAJwAyADsAAAEeBhUUDgMjITU%2BATURNC4EJzUFMh4CFRQOAgclMzI2NTQuAisBETMyNjU0JisBAvEFEzUwOyodN1htbDD%2BDCk7AQYLFyEaAdc5dWM%2BHy0tEP6Pi05pESpTPnbYUFJ9Xp8CgQEHGB0zOlIuQ3VONxpZBzMoAzsYFBwLEAkHRwEpSXNDM1s6KwkxYUopOzQb%2FK5lUFqBAAABAMgAAANvBLAAGQAAARcOAQcDBhYXFSE1NjcTNjQuBCcmJzUDbQJTQgeECSxK%2Fgy6Dq0DAw8MHxUXDQYEsDkTNSj8uTEoBmFhEFIDQBEaExAJCwYHAwI5AAAAAAL%2FtQAABRQEsAAlAC8AAAEjNC4FKwERFBYfARUhNTI%2BAzURIyIOBRUjESEFIxEzByczESM3BRQyCAsZEyYYGcgyGRn%2BcAQOIhoWyBkYJhMZCwgyA%2Bj7m0tLfX1LS30DhBUgFQ4IAwH8rhYZAQJkZAEFCRUOA1IBAwgOFSAVASzI%2FOCnpwMgpwACACH%2FtQSPBLAAJQAvAAABIzQuBSsBERQWHwEVITUyPgM1ESMiDgUVIxEhEwc1IRUnNxUhNQRMMggLGRMmGBnIMhkZ%2FnAEDiIaFsgZGCYTGQsIMgPoQ6f84KenAyADhBUgFQ4IAwH9dhYZAQJkZAEFCRUOAooBAwgOFSAVASz7gn1LS319S0sABAAAAAAEsARMAA8AHwAvAD8AABMhMhYdARQGIyEiJj0BNDYTITIWHQEUBiMhIiY9ATQ2EyEyFh0BFAYjISImPQE0NhMhMhYdARQGIyEiJj0BNDYyAlgVHR0V%2FagVHR0VA%2BgVHR0V%2FBgVHR0VAyAVHR0V%2FOAVHR0VBEwVHR0V%2B7QVHR0ETB0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR0ABAAAAAAEsARMAA8AHwAvAD8AABMhMhYdARQGIyEiJj0BNDYDITIWHQEUBiMhIiY9ATQ2EyEyFh0BFAYjISImPQE0NgMhMhYdARQGIyEiJj0BNDb6ArwVHR0V%2FUQVHR2zBEwVHR0V%2B7QVHR3dArwVHR0V%2FUQVHR2zBEwVHR0V%2B7QVHR0ETB0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR0ABAAAAAAEsARMAA8AHwAvAD8AAAE1NDYzITIWHQEUBiMhIiYBNTQ2MyEyFh0BFAYjISImEzU0NjMhMhYdARQGIyEiJgE1NDYzITIWHQEUBiMhIiYB9B0VAlgVHR0V%2FagVHf5wHRUD6BUdHRX8GBUdyB0VAyAVHR0V%2FOAVHf7UHRUETBUdHRX7tBUdA7ZkFR0dFWQVHR3%2B6WQVHR0VZBUdHf7pZBUdHRVkFR0d%2FulkFR0dFWQVHR0AAAQAAAAABLAETAAPAB8ALwA%2FAAATITIWHQEUBiMhIiY9ATQ2EyEyFh0BFAYjISImPQE0NhMhMhYdARQGIyEiJj0BNDYTITIWHQEUBiMhIiY9ATQ2MgRMFR0dFfu0FR0dFQRMFR0dFfu0FR0dFQRMFR0dFfu0FR0dFQRMFR0dFfu0FR0dBEwdFWQVHR0VZBUd%2FtQdFWQVHR0VZBUd%2FtQdFWQVHR0VZBUd%2FtQdFWQVHR0VZBUdAAgAAAAABLAETAAPAB8ALwA%2FAE8AXwBvAH8AABMzMhYdARQGKwEiJj0BNDYpATIWHQEUBiMhIiY9ATQ2ATMyFh0BFAYrASImPQE0NikBMhYdARQGIyEiJj0BNDYBMzIWHQEUBisBIiY9ATQ2KQEyFh0BFAYjISImPQE0NgEzMhYdARQGKwEiJj0BNDYpATIWHQEUBiMhIiY9ATQ2MmQVHR0VZBUdHQFBAyAVHR0V%2FOAVHR3%2B6WQVHR0VZBUdHQFBAyAVHR0V%2FOAVHR3%2B6WQVHR0VZBUdHQFBAyAVHR0V%2FOAVHR3%2B6WQVHR0VZBUdHQFBAyAVHR0V%2FOAVHR0ETB0VZBUdHRVkFR0dFWQVHR0VZBUd%2FtQdFWQVHR0VZBUdHRVkFR0dFWQVHf7UHRVkFR0dFWQVHR0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR0dFWQVHR0VZBUdAAAG%2F5wAAASwBEwAAwATACMAKgA6AEoAACEjETsCMhYdARQGKwEiJj0BNDYTITIWHQEUBiMhIiY9ATQ2BQc1IzUzNQUhMhYdARQGIyEiJj0BNDYTITIWHQEUBiMhIiY9ATQ2AZBkZJZkFR0dFWQVHR0VAfQVHR0V%2FgwVHR3%2B%2BqfIyAHCASwVHR0V%2FtQVHR0VAlgVHR0V%2FagVHR0ETB0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR36fUtkS68dFWQVHR0VZBUd%2FtQdFWQVHR0VZBUdAAAABgAAAAAFFARMAA8AEwAjACoAOgBKAAATMzIWHQEUBisBIiY9ATQ2ASMRMwEhMhYdARQGIyEiJj0BNDYFMxUjFSc3BSEyFh0BFAYjISImPQE0NhMhMhYdARQGIyEiJj0BNDYyZBUdHRVkFR0dA2dkZPyuAfQVHR0V%2FgwVHR0EL8jIp6f75gEsFR0dFf7UFR0dFQJYFR0dFf2oFR0dBEwdFWQVHR0VZBUd%2B7QETP7UHRVkFR0dFWQVHchkS319rx0VZBUdHRVkFR3%2B1B0VZBUdHRVkFR0AAAAAAgAAAMgEsAPoAA8AEgAAEyEyFhURFAYjISImNRE0NgkCSwLuHywsH%2F0SHywsBIT%2B1AEsA%2BgsH%2F12HywsHwKKHyz9RAEsASwAAwAAAAAEsARMAA8AFwAfAAATITIWFREUBiMhIiY1ETQ2FxE3BScBExEEMhYUBiImNCwEWBIaGhL7qBIaGkr3ASpKASXs%2FNJwTk5wTgRMGhL8DBIaGhID9BIaZP0ftoOcAT7%2B4AH0dE5vT09vAAAAAAIA2wAFBDYEkQAWAB4AAAEyHgEVFAcOAQ8BLgQnJjU0PgIWIgYUFjI2NAKIdcZzRkWyNjYJIV5YbSk8RHOft7eCgreCBJF4ynVzj23pPz4IIWZomEiEdVijeUjDgriBgbgAAAACABcAFwSZBJkADwAXAAAAMh4CFA4CIi4CND4BAREiDgEUHgEB4%2BrWm1tbm9bq1ptbW5sBS3TFcnLFBJlbm9bq1ptbW5vW6tab%2FG8DVnLF6MVyAAACAHUAAwPfBQ8AGgA1AAABHgYVFA4DBy4DNTQ%2BBQMOAhceBBcWNj8BNiYnLgInJjc2IyYCKhVJT1dOPiUzVnB9P1SbfEokP0xXUEm8FykoAwEbITEcExUWAgYCCQkFEikMGiACCAgFD0iPdXdzdYdFR4BeRiYEBTpjl1lFh3ZzeHaQ%2Ff4hS4I6JUEnIw4IBwwQIgoYBwQQQSlZtgsBAAAAAwAAAAAEywRsAAwAKgAvAAABNz4CHgEXHgEPAiUhMhcHISIGFREUFjMhMjY9ATcRFAYjISImNRE0NgkBBzcBA%2BhsAgYUFR0OFgoFBmz9BQGQMje7%2FpApOzspAfQpO8i7o%2F5wpbm5Azj%2BlqE3AWMD9XMBAgIEDw4WKgsKc8gNuzsp%2FgwpOzsptsj%2BtKW5uaUBkKW5%2Ftf%2BljKqAWMAAgAAAAAEkwRMABsANgAAASEGByMiBhURFBYzITI2NTcVFAYjISImNRE0NgUBFhQHAQYmJzUmDgMHPgY3NT4BAV4BaaQ0wyk7OykB9Ck7yLml%2FnClubkCfwFTCAj%2BrAcLARo5ZFRYGgouOUlARioTAQsETJI2Oyn%2BDCk7OymZZ6W5uaUBkKW5G%2F7TBxUH%2Fs4GBAnLAQINFjAhO2JBNB0UBwHSCgUAAAAAAgAAAAAEnQRMAB0ANQAAASEyFwchIgYVERQWMyEyNj0BNxUUBiMhIiY1ETQ2CQE2Mh8BFhQHAQYiLwEmND8BNjIfARYyAV4BXjxDsv6jKTs7KQH0KTvIuaX%2BcKW5uQHKAYsHFQdlBwf97QcVB%2FgHB2UHFQdvCBQETBexOyn%2BDCk7OylFyNulubmlAZCluf4zAYsHB2UHFQf97AcH%2BAcVB2UHB28HAAAAAQAKAAoEpgSmADsAAAkBNjIXARYGKwEVMzU0NhcBFhQHAQYmPQEjFTMyFgcBBiInASY2OwE1IxUUBicBJjQ3ATYWHQEzNSMiJgE%2BAQgIFAgBBAcFCqrICggBCAgI%2FvgICsiqCgUH%2FvwIFAj%2B%2BAgFCq%2FICgj%2B%2BAgIAQgICsivCgUDlgEICAj%2B%2BAgKyK0KBAf%2B%2FAcVB%2F73BwQKrcgKCP74CAgBCAgKyK0KBAcBCQcVBwEEBwQKrcgKAAEAyAAAA4QETAAZAAATMzIWFREBNhYVERQGJwERFAYrASImNRE0NvpkFR0B0A8VFQ%2F%2BMB0VZBUdHQRMHRX%2BSgHFDggV%2FBgVCA4Bxf5KFR0dFQPoFR0AAAABAAAAAASwBEwAIwAAEzMyFhURATYWFREBNhYVERQGJwERFAYnAREUBisBIiY1ETQ2MmQVHQHQDxUB0A8VFQ%2F%2BMBUP%2FjAdFWQVHR0ETB0V%2FkoBxQ4IFf5KAcUOCBX8GBUIDgHF%2FkoVCA4Bxf5KFR0dFQPoFR0AAAABAJ0AGQSwBDMAFQAAAREUBicBERQGJwEmNDcBNhYVEQE2FgSwFQ%2F%2BMBUP%2FhQPDwHsDxUB0A8VBBr8GBUIDgHF%2FkoVCA4B4A4qDgHgDggV%2FkoBxQ4IAAAAAQDIABYEMwQ2AAsAABMBFhQHAQYmNRE0NvMDLhIS%2FNISGRkEMv4OCx4L%2Fg4LDhUD6BUOAAIAyABkA4QD6AAPAB8AABMzMhYVERQGKwEiJjURNDYhMzIWFREUBisBIiY1ETQ2%2BsgVHR0VyBUdHQGlyBUdHRXIFR0dA%2BgdFfzgFR0dFQMgFR0dFfzgFR0dFQMgFR0AAAEAyABkBEwD6AAPAAABERQGIyEiJjURNDYzITIWBEwdFfzgFR0dFQMgFR0DtvzgFR0dFQMgFR0dAAAAAAEAAAAZBBMEMwAVAAABETQ2FwEWFAcBBiY1EQEGJjURNDYXAfQVDwHsDw%2F%2BFA8V%2FjAPFRUPAmQBthUIDv4gDioO%2FiAOCBUBtv47DggVA%2BgVCA4AAAH%2F%2FgACBLMETwAjAAABNzIWFRMUBiMHIiY1AwEGJjUDAQYmNQM0NhcBAzQ2FwEDNDYEGGQUHgUdFWQVHQL%2BMQ4VAv4yDxUFFQ8B0gIVDwHSAh0ETgEdFfwYFR0BHRUBtf46DwkVAbX%2BOQ4JFAPoFQkP%2Fj4BthQJDv49AbYVHQAAAQEsAAAD6ARMABkAAAEzMhYVERQGKwEiJjURAQYmNRE0NhcBETQ2A1JkFR0dFWQVHf4wDxUVDwHQHQRMHRX8GBUdHRUBtv47DggVA%2BgVCA7%2BOwG2FR0AAAIAZADIBLAESAALABsAAAkBFgYjISImNwE2MgEhMhYdARQGIyEiJj0BNDYCrgH1DwkW%2B%2B4WCQ8B9Q8q%2FfcD6BUdHRX8GBUdHQQ5%2FeQPFhYPAhwP%2FUgdFWQVHR0VZBUdAAEAiP%2F8A3UESgAFAAAJAgcJAQN1%2FqABYMX92AIoA4T%2Bn%2F6fxgIoAiYAAAAAAQE7%2F%2FwEKARKAAUAAAkBJwkBNwQo%2FdnGAWH%2Bn8YCI%2F3ZxgFhAWHGAAIAFwAXBJkEmQAPADMAAAAyHgIUDgIiLgI0PgEFIyIGHQEjIgYdARQWOwEVFBY7ATI2PQEzMjY9ATQmKwE1NCYB4%2BrWm1tbm9bq1ptbW5sBfWQVHZYVHR0Vlh0VZBUdlhUdHRWWHQSZW5vW6tabW1ub1urWm7odFZYdFWQVHZYVHR0Vlh0VZBUdlhUdAAAAAAIAFwAXBJkEmQAPAB8AAAAyHgIUDgIiLgI0PgEBISIGHQEUFjMhMjY9ATQmAePq1ptbW5vW6tabW1ubAkX%2BDBUdHRUB9BUdHQSZW5vW6tabW1ub1urWm%2F5%2BHRVkFR0dFWQVHQACABcAFwSZBJkADwAzAAAAMh4CFA4CIi4CND4BBCIPAScmIg8BBhQfAQcGFB8BFjI%2FARcWMj8BNjQvATc2NC8BAePq1ptbW5vW6tabW1ubAeUZCXh4CRkJjQkJeHgJCY0JGQl4eAkZCY0JCXh4CQmNBJlbm9bq1ptbW5vW6tabrQl4eAkJjQkZCXh4CRkJjQkJeHgJCY0JGQl4eAkZCY0AAgAXABcEmQSZAA8AJAAAADIeAhQOAiIuAjQ%2BAQEnJiIPAQYUHwEWMjcBNjQvASYiBwHj6tabW1ub1urWm1tbmwEVVAcVCIsHB%2FIHFQcBdwcHiwcVBwSZW5vW6tabW1ub1urWm%2F4xVQcHiwgUCPEICAF3BxUIiwcHAAAAAAMAFwAXBJkEmQAPADsASwAAADIeAhQOAiIuAjQ%2BAQUiDgMVFDsBFjc%2BATMyFhUUBgciDgUHBhY7ATI%2BAzU0LgMTIyIGHQEUFjsBMjY9ATQmAePq1ptbW5vW6tabW1ubAT8dPEIyIRSDHgUGHR8UFw4TARkOGhITDAIBDQ6tBx4oIxgiM0Q8OpYKDw8KlgoPDwSZW5vW6tabW1ub1urWm5ELHi9PMhkFEBQQFRIXFgcIBw4UHCoZCBEQKDhcNi9IKhsJ%2FeMPCpYKDw8KlgoPAAADABcAFwSZBJkADwAfAD4AAAAyHgIUDgIiLgI0PgEFIyIGHQEUFjsBMjY9ATQmAyMiBh0BFBY7ARUjIgYdARQWMyEyNj0BNCYrARE0JgHj6tabW1ub1urWm1tbmwGWlgoPDwqWCg8PCvoKDw8KS0sKDw8KAV4KDw8KSw8EmVub1urWm1tbm9bq1ptWDwqWCg8PCpYKD%2F7UDwoyCg%2FIDwoyCg8PCjIKDwETCg8AAgAAAAAEsASwAC8AXwAAATMyFh0BHgEXMzIWHQEUBisBDgEHFRQGKwEiJj0BLgEnIyImPQE0NjsBPgE3NTQ2ExUUBisBIiY9AQ4BBzMyFh0BFAYrAR4BFzU0NjsBMhYdAT4BNyMiJj0BNDY7AS4BAg2WCg9nlxvCCg8PCsIbl2cPCpYKD2eXG8IKDw8KwhuXZw%2B5DwqWCg9EZheoCg8PCqgXZkQPCpYKD0RmF6gKDw8KqBdmBLAPCsIbl2cPCpYKD2eXG8IKDw8KwhuXZw8KlgoPZ5cbwgoP%2Fs2oCg8PCqgXZkQPCpYKD0RmF6gKDw8KqBdmRA8KlgoPRGYAAwAXABcEmQSZAA8AGwA%2FAAAAMh4CFA4CIi4CND4BBCIOARQeATI%2BATQmBxcWFA8BFxYUDwEGIi8BBwYiLwEmND8BJyY0PwE2Mh8BNzYyAePq1ptbW5vW6tabW1ubAb%2FoxXJyxejFcnKaQAcHfHwHB0AHFQd8fAcVB0AHB3x8BwdABxUHfHwHFQSZW5vW6tabW1ub1urWmztyxejFcnLF6MVaQAcVB3x8BxUHQAcHfHwHB0AHFQd8fAcVB0AHB3x8BwAAAAMAFwAXBJkEmQAPABsAMAAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JgcXFhQHAQYiLwEmND8BNjIfATc2MgHj6tabW1ub1urWm1tbmwG%2F6MVycsXoxXJyg2oHB%2F7ACBQIyggIagcVB0%2FFBxUEmVub1urWm1tbm9bq1ps7csXoxXJyxejFfWoHFQf%2BvwcHywcVB2oICE%2FFBwAAAAMAFwAXBJkEmQAPABgAIQAAADIeAhQOAiIuAjQ%2BAQUiDgEVFBcBJhcBFjMyPgE1NAHj6tabW1ub1urWm1tbmwFLdMVyQQJLafX9uGhzdMVyBJlbm9bq1ptbW5vW6tabO3LFdHhpAktB0P24PnLFdHMAAAAAAQAXAFMEsAP5ABUAABMBNhYVESEyFh0BFAYjIREUBicBJjQnAgoQFwImFR0dFf3aFxD99hACRgGrDQoV%2Ft0dFcgVHf7dFQoNAasNJgAAAAABAAAAUwSZA%2FkAFQAACQEWFAcBBiY1ESEiJj0BNDYzIRE0NgJ%2FAgoQEP32EBf92hUdHRUCJhcD8f5VDSYN%2FlUNChUBIx0VyBUdASMVCgAAAAEAtwAABF0EmQAVAAAJARYGIyERFAYrASImNREhIiY3ATYyAqoBqw0KFf7dHRXIFR3%2B3RUKDQGrDSYEif32EBf92hUdHRUCJhcQAgoQAAAAAQC3ABcEXQSwABUAAAEzMhYVESEyFgcBBiInASY2MyERNDYCJsgVHQEjFQoN%2FlUNJg3%2BVQ0KFQEjHQSwHRX92hcQ%2FfYQEAIKEBcCJhUdAAABAAAAtwSZBF0AFwAACQEWFAcBBiY1EQ4DBz4ENxE0NgJ%2FAgoQEP32EBdesKWBJAUsW4fHfhcEVf5VDSYN%2FlUNChUBIwIkRHVNabGdcUYHAQYVCgACAAAAAASwBLAAFQArAAABITIWFREUBi8BBwYiLwEmND8BJyY2ASEiJjURNDYfATc2Mh8BFhQPARcWBgNSASwVHRUOXvkIFAhqBwf5Xg4I%2FiH%2B1BUdFQ5e%2BQgUCGoHB%2FleDggEsB0V%2FtQVCA5e%2BQcHaggUCPleDhX7UB0VASwVCA5e%2BQcHaggUCPleDhUAAAACAEkASQRnBGcAFQArAAABFxYUDwEXFgYjISImNRE0Nh8BNzYyASEyFhURFAYvAQcGIi8BJjQ%2FAScmNgP2agcH%2BV4OCBX%2B1BUdFQ5e%2BQgU%2FQwBLBUdFQ5e%2BQgUCGoHB%2FleDggEYGoIFAj5Xg4VHRUBLBUIDl75B%2F3xHRX%2B1BUIDl75BwdqCBQI%2BV4OFQAAAAADABcAFwSZBJkADwAfAC8AAAAyHgIUDgIiLgI0PgEFIyIGFxMeATsBMjY3EzYmAyMiBh0BFBY7ATI2PQE0JgHj6tabW1ub1urWm1tbmwGz0BQYBDoEIxQ2FCMEOgQYMZYKDw8KlgoPDwSZW5vW6tabW1ub1urWm7odFP7SFB0dFAEuFB3%2BDA8KlgoPDwqWCg8AAAAABQAAAAAEsASwAEkAVQBhAGgAbwAAATIWHwEWHwEWFxY3Nj8BNjc2MzIWHwEWHwIeATsBMhYdARQGKwEiBh0BIREjESE1NCYrASImPQE0NjsBMjY1ND8BNjc%2BBAUHBhY7ATI2LwEuAQUnJgYPAQYWOwEyNhMhIiY1ESkBERQGIyERAQQJFAUFFhbEFQ8dCAsmxBYXERUXMA0NDgQZCAEPCj0KDw8KMgoP%2FnDI%2FnAPCjIKDw8KPQsOCRkFDgIGFRYfAp2mBwQK2woKAzMDEP41sQgQAzMDCgrnCwMe%2FokKDwGQAlgPCv6JBLAEAgIKDXYNCxUJDRZ2DQoHIREQFRh7LAkLDwoyCg8PCq8BLP7UrwoPDwoyCg8GBQQwgBkUAwgWEQ55ogcKDgqVCgSqnQcECo8KDgr8cg8KAXf%2BiQoPAZAAAAAAAgAAAAwErwSmACsASQAAATYWFQYCDgQuAScmByYOAQ8BBiY1NDc%2BATc%2BAScuAT4BNz4GFyYGBw4BDwEOBAcOARY2Nz4CNz4DNz4BBI0IGgItQmxhi2KORDg9EQQRMxuZGhYqCFUYEyADCQIQOjEnUmFch3vAJQgdHyaiPT44XHRZUhcYDhItIRmKcVtGYWtbKRYEBKYDEwiy%2Ft3IlVgxEQgLCwwBAQIbG5kYEyJAJghKFRE8Hzdff4U%2FM0o1JSMbL0QJGCYvcSEhHjZST2c1ODwEJygeW0AxJUBff1UyFAABAF0AHgRyBM8ATwAAAQ4BHgQXLgc%2BATceAwYHDgQHBicmNzY3PgQuAScWDgMmJy4BJyY%2BBDcGHgM3PgEuAicmPgMCjScfCic4R0IgBBsKGAoQAwEJEg5gikggBhANPkpTPhZINx8SBgsNJysiCRZOQQoVNU1bYC9QZwICBAUWITsoCAYdJzIYHw8YIiYHDyJJYlkEz0OAZVxEOSQMBzgXOB42IzElKRIqg5Gnl0o3Z0c6IAYWCwYNAwQFIDhHXGF1OWiqb0sdBxUknF0XNTQ8PEUiNWNROBYJDS5AQVUhVZloUSkAAAAAA%2F%2FcAGoE1ARGABsAPwBRAAAAMh4FFA4FIi4FND4EBSYGFxYVFAYiJjU0NzYmBwYHDgEXHgQyPgM3NiYnJgUHDgEXFhcWNj8BNiYnJicuAQIGpJ17bk85HBw6T257naKde25POhwcOU9uewIPDwYIGbD4sBcIBw5GWg0ECxYyWl%2BDiINfWjIWCwQMWv3%2FIw8JCSU4EC0OIw4DDywtCyIERi1JXGJcSSpJXGJcSS0tSVxiXEkqSVxiXEncDwYTOT58sLB8OzcTBg9FcxAxEiRGXkQxMEVeRSQSMRF1HiQPLxJEMA0EDyIPJQ8sSRIEAAAABP%2FcAAAE1ASwABQAJwA7AEwAACEjNy4ENTQ%2BBTMyFzczEzceARUUDgMHNz4BNzYmJyYlBgcOARceBBc3LgE1NDc2JhcHDgEXFhcWNj8CJyYnLgECUJQfW6l2WSwcOU9ue51SPUEglCYvbIknUGqYUi5NdiYLBAw2%2FVFGWg0ECxIqSExoNSlrjxcIB3wjDwkJJTgQLQ4MFgMsLQsieBRhdHpiGxVJXGJcSS0Pef5StVXWNBpacm5jGq0xiD8SMRFGckVzEDESHjxRQTkNmhKnbjs3EwZwJA8vEkQwDQQPC1YELEkSBAAAAAP%2FngAABRIEqwALABgAKAAAJwE2FhcBFgYjISImJSE1NDY7ATIWHQEhAQczMhYPAQ4BKwEiJi8BJjZaAoIUOBQCghUbJfryJRsBCgFZDwqWCg8BWf5DaNAUGAQ6BCMUNhQjBDoEGGQEKh8FIfvgIEdEhEsKDw8KSwLT3x0U%2FBQdHRT8FB0AAAABAGQAFQSwBLAAKAAAADIWFREBHgEdARQGJyURFh0BFAYvAQcGJj0BNDcRBQYmPQE0NjcBETQCTHxYAWsPFhgR%2FplkGhPNzRMaZP6ZERgWDwFrBLBYPv6t%2FrsOMRQpFA0M%2Bf75XRRAFRAJgIAJEBVAFF0BB%2FkMDRQpFDEOAUUBUz4AAAARAAAAAARMBLAAHQAnACsALwAzADcAOwA%2FAEMARwBLAE8AUwBXAFsAXwBjAAABMzIWHQEzMhYdASE1NDY7ATU0NjsBMhYdASE1NDYBERQGIyEiJjURFxUzNTMVMzUzFTM1MxUzNTMVMzUFFTM1MxUzNTMVMzUzFTM1MxUzNQUVMzUzFTM1MxUzNTMVMzUzFTM1A1JkFR0yFR37tB0VMh0VZBUdAfQdAQ8dFfwYFR1kZGRkZGRkZGRk%2FHxkZGRkZGRkZGT8fGRkZGRkZGRkZASwHRUyHRWWlhUdMhUdHRUyMhUd%2FnD9EhUdHRUC7shkZGRkZGRkZGRkyGRkZGRkZGRkZGTIZGRkZGRkZGRkZAAAAAMAAAAZBXcElwAZACUANwAAARcWFA8BBiY9ASMBISImPQE0NjsBATM1NDYBBycjIiY9ATQ2MyEBFxYUDwEGJj0BIyc3FzM1NDYEb%2FkPD%2FkOFZ%2F9qP7dFR0dFdECWPEV%2FamNetEVHR0VASMDGvkPD%2FkOFfG1jXqfFQSN5g4qDuYOCBWW%2FagdFWQVHQJYlhUI%2FpiNeh0VZBUd%2Fk3mDioO5g4IFZa1jXqWFQgAAAABAAAAAASwBEwAEgAAEyEyFhURFAYjIQERIyImNRE0NmQD6Ck7Oyn9rP7QZCk7OwRMOyn9qCk7%2FtQBLDspAlgpOwAAAAMAZAAABEwEsAAJABMAPwAAEzMyFh0BITU0NiEzMhYdASE1NDYBERQOBSIuBTURIRUUFRwBHgYyPgYmNTQ9AZbIFR3%2B1B0C0cgVHf7UHQEPBhgoTGacwJxmTCgYBgEsAwcNFB8nNkI2Jx8TDwUFAQSwHRX6%2BhUdHRX6%2BhUd%2FnD%2B1ClJalZcPigoPlxWakkpASz6CRIVKyclIRsWEAgJEBccISUnKhURCPoAAAAB%2F%2F8A1ARMA8IABQAAAQcJAScBBEzG%2Fp%2F%2Bn8UCJwGbxwFh%2Fp%2FHAicAAQAAAO4ETQPcAAUAAAkCNwkBBE392v3ZxgFhAWEDFf3ZAifH%2Fp8BYQAAAAAC%2F1EAZAVfA%2BgAFAApAAABITIWFREzMhYPAQYiLwEmNjsBESElFxYGKwERIRchIiY1ESMiJj8BNjIBlALqFR2WFQgO5g4qDuYOCBWW%2FoP%2BHOYOCBWWAYHX%2FRIVHZYVCA7mDioD6B0V%2FdkVDvkPD%2FkOFQGRuPkOFf5wyB0VAiYVDvkPAAABAAYAAASeBLAAMAAAEzMyFh8BITIWBwMOASMhFyEyFhQGKwEVFAYiJj0BIRUUBiImPQEjIiYvAQMjIiY0NjheERwEJgOAGB4FZAUsIf2HMAIXFR0dFTIdKh3%2B1B0qHR8SHQYFyTYUHh4EsBYQoiUY%2FiUVK8gdKh0yFR0dFTIyFR0dFTIUCQoDwR0qHQAAAAACAAAAAASwBEwACwAPAAABFSE1MzQ2MyEyFhUFIREhBLD7UMg7KQEsKTv9RASw%2B1AD6GRkKTs7Kcj84AACAAAAAAXcBEwADAAQAAATAxEzNDYzITIWFSEVBQEhAcjIyDspASwqOgH0ASz%2B1PtQASwDIP5wAlgpOzspyGT9RAK8AAEBRQAAA2sErwAbAAABFxYGKwERMzIWDwEGIi8BJjY7AREjIiY%2FATYyAnvmDggVlpYVCA7mDioO5g4IFZaWFQgO5g4qBKD5DhX9pxUO%2BQ8P%2BQ4VAlkVDvkPAAAAAQABAUQErwNrABsAAAEXFhQPAQYmPQEhFRQGLwEmND8BNhYdASE1NDYDqPkODvkPFf2oFQ%2F5Dg75DxUCWBUDYOUPKQ%2FlDwkUl5cUCQ%2FlDykP5Q8JFZWVFQkAAAAEAAAAAASwBLAACQAZAB0AIQAAAQMuASMhIgYHAwUhIgYdARQWMyEyNj0BNCYFNTMVMzUzFQSRrAUkFP1gFCQFrAQt%2FBgpOzspA%2BgpOzv%2Bq2RkZAGQAtwXLSgV%2FR1kOylkKTs7KWQpO8hkZGRkAAAAA%2F%2BcAGQEsARMAAsAIwAxAAAAMhYVERQGIiY1ETQDJSMTFgYjIisBIiYnAj0BNDU0PgE7ASUBFSIuAz0BND4CNwRpKh0dKh1k%2FV0mLwMRFQUCVBQdBDcCCwzIAqP8GAQOIhoWFR0dCwRMHRX8rhUdHRUDUhX8mcj%2B7BAIHBUBUQ76AgQQDw36%2FtT6AQsTKRwyGigUDAEAAAACAEoAAARmBLAALAA1AAABMzIWDwEeARcTFzMyFhQGBw4EIyIuBC8BLgE0NjsBNxM%2BATcnJjYDFjMyNw4BIiYCKV4UEgYSU3oPP3YRExwaEggeZGqfTzl0XFU%2BLwwLEhocExF2Pw96UxIGEyQyNDUxDDdGOASwFRMlE39N%2FrmtHSkoBwQLHBYSCg4REg4FBAgoKR2tAUdNfhQgExr7vgYGMT09AAEAFAAUBJwEnAAXAAABNwcXBxcHFycHJwcnBzcnNyc3Jxc3FzcDIOBO6rS06k7gLZubLeBO6rS06k7gLZubA7JO4C2bmy3gTuq0tOpO4C2bmy3gTuq0tAADAAAAZASwBLAAIQAtAD0AAAEzMhYdAQchMhYdARQHAw4BKwEiJi8BIyImNRE0PwI%2BARcPAREzFzMTNSE3NQEzMhYVERQGKwEiJjURNDYCijIoPBwBSCg8He4QLBf6B0YfHz0tNxSRYA0xG2SWZIjW%2Bv4%2BMv12ZBUdHRVkFR0dBLBRLJZ9USxkLR3%2BqBghMhkZJCcBkCQbxMYcKGTU1f6JZAF3feGv%2FtQdFf4MFR0dFQH0FR0AAAAAAwAAAAAEsARMACAAMAA8AAABMzIWFxMWHQEUBiMhFh0BFAYrASImLwImNRE0NjsBNgUzMhYVERQGKwEiJjURNDYhByMRHwEzNSchNQMCWPoXLBDuHTwo%2FrgcPCgyGzENYJEUNy09fP3pZBUdHRVkFR0dAl%2BIZJZkMjIBwvoETCEY%2FqgdLWQsUXYHlixRKBzGxBskAZAnJGRkHRX%2BDBUdHRUB9BUdZP6J1dSv4X0BdwADAAAAZAUOBE8AGwA3AEcAAAElNh8BHgEPASEyFhQGKwEDDgEjISImNRE0NjcXERchEz4BOwEyNiYjISoDLgQnJj8BJwUzMhYVERQGKwEiJjURNDYBZAFrHxZuDQEMVAEuVGxuVGqDBhsP%2FqoHphwOOmQBJYMGGw%2FLFRMSFv44AgoCCQMHAwUDAQwRklb9T2QVHR0VZBUdHQNp5hAWcA0mD3lMkE7%2BrRUoog0CDRElCkj%2BCVkBUxUoMjIBAgIDBQIZFrdT5B0V%2FgwVHR0VAfQVHQAAAAP%2FnABkBLAETwAdADYARgAAAQUeBBURFAYjISImJwMjIiY0NjMhJyY2PwE2BxcWBw4FKgIjIRUzMhYXEyE3ESUFMzIWFREUBisBIiY1ETQ2AdsBbgIIFBANrAf%2Bqg8bBoNqVW1sVAEuVQsBDW4WSpIRDAIDBQMHAwkDCgH%2BJd0PHAaCASZq%2FqoCUGQVHR0VZBUdHQRP5gEFEBEXC%2F3zDaIoFQFTTpBMeQ8mDXAWrrcWGQIFAwICAWQoFf6tWQH37OQdFf4MFR0dFQH0FR0AAAADAGEAAARMBQ4AGwA3AEcAAAAyFh0BBR4BFREUBiMhIiYvAQMmPwE%2BAR8BETQXNTQmBhURHAMOBAcGLwEHEyE3ESUuAQMhMhYdARQGIyEiJj0BNDYB3pBOAVMVKKIN%2FfMRJQoJ5hAWcA0mD3nGMjIBAgIDBQIZFrdT7AH3Wf6tFSiWAfQVHR0V%2FgwVHR0FDm5UaoMGGw%2F%2BqgemHA4OAWsfFm4NAQxUAS5U1ssVExIW%2FjgCCgIJAwcDBQMBDBGSVv6tZAElgwYb%2FQsdFWQVHR0VZBUdAAP%2F%2FQAGA%2BgFFAAPAC0ASQAAASEyNj0BNCYjISIGHQEUFgEVFAYiJjURBwYmLwEmNxM%2BBDMhMhYVERQGBwEDFzc2Fx4FHAIVERQWNj0BNDY3JREnAV4B9BUdHRX%2BDBUdHQEPTpBMeQ8mDXAWEOYBBRARFwsCDQ2iKBX9iexTtxYZAgUDAgIBMjIoFQFTWQRMHRVkFR0dFWQVHfzmalRubFQBLlQMAQ1uFh8BawIIEw8Mpgf%2Bqg8bBgHP%2Fq1WkhEMAQMFAwcDCQIKAv44FhITFcsPGwaDASVkAAIAFgAWBJoEmgAPACUAAAAyHgIUDgIiLgI0PgEBJSYGHQEhIgYdARQWMyEVFBY3JTY0AeLs1ptbW5vW7NabW1ubAob%2B7RAX%2Fu0KDw8KARMXEAETEASaW5vW7NabW1ub1uzWm%2F453w0KFYkPCpYKD4kVCg3fDSYAAAIAFgAWBJoEmgAPACUAAAAyHgIUDgIiLgI0PgENAQYUFwUWNj0BITI2PQE0JiMhNTQmAeLs1ptbW5vW7NabW1ubASX%2B7RAQARMQFwETCg8PCv7tFwSaW5vW7NabW1ub1uzWm%2BjfDSYN3w0KFYkPCpYKD4kVCgAAAAIAFgAWBJoEmgAPACUAAAAyHgIUDgIiLgI0PgEBAyYiBwMGFjsBERQWOwEyNjURMzI2AeLs1ptbW5vW7NabW1ubAkvfDSYN3w0KFYkPCpYKD4kVCgSaW5vW7NabW1ub1uzWm%2F5AARMQEP7tEBf%2B7QoPDwoBExcAAAIAFgAWBJoEmgAPACUAAAAyHgIUDgIiLgI0PgEFIyIGFREjIgYXExYyNxM2JisBETQmAeLs1ptbW5vW7NabW1ubAZeWCg%2BJFQoN3w0mDd8NChWJDwSaW5vW7NabW1ub1uzWm7sPCv7tFxD%2B7RAQARMQFwETCg8AAAMAGAAYBJgEmAAPAJYApgAAADIeAhQOAiIuAjQ%2BASUOAwcGJgcOAQcGFgcOAQcGFgcUFgcyHgEXHgIXHgI3Fg4BFx4CFxQGFBcWNz4CNy4BJy4BJyIOAgcGJyY2NS4BJzYuAQYHBicmNzY3HgIXHgMfAT4CJyY%2BATc%2BAzcmNzIWMjY3LgMnND4CJiceAT8BNi4CJwYHFB4BFS4CJz4BNxYyPgEB5OjVm1xcm9Xo1ZtcXJsBZA8rHDoKDz0PFD8DAxMBAzEFCRwGIgEMFhkHECIvCxU%2FOR0HFBkDDRQjEwcFaHUeISQDDTAMD0UREi4oLBAzDwQBBikEAQMLGhIXExMLBhAGKBsGBxYVEwYFAgsFAwMNFwQGCQcYFgYQCCARFwkKKiFBCwQCAQMDHzcLDAUdLDgNEiEQEgg%2FKhADGgMKEgoRBJhcm9Xo1ZtcXJvV6NWbEQwRBwkCAwYFBycPCxcHInIWInYcCUcYChQECA4QBAkuHgQPJioRFRscBAcSCgwCch0kPiAIAQcHEAsBAgsLIxcBMQENCQIPHxkCFBkdHB4QBgEBBwoMGBENBAMMJSAQEhYXDQ4qFBkKEhIDCQsXJxQiBgEOCQwHAQ0DBAUcJAwSCwRnETIoAwEJCwsLJQcKDBEAAAAAAQAAAAIErwSFABYAAAE2FwUXNxYGBw4BJwEGIi8BJjQ3ASY2AvSkjv79kfsGUE08hjv9rA8rD28PDwJYIk8EhVxliuh%2BWYcrIgsW%2FawQEG4PKxACV2XJAAYAAABgBLAErAAPABMAIwAnADcAOwAAEyEyFh0BFAYjISImPQE0NgUjFTMFITIWHQEUBiMhIiY9ATQ2BSEVIQUhMhYdARQGIyEiJj0BNDYFIRUhZAPoKTs7KfwYKTs7BBHIyPwYA%2BgpOzsp%2FBgpOzsEEf4MAfT8GAPoKTs7KfwYKTs7BBH%2B1AEsBKw7KWQpOzspZCk7ZGTIOylkKTs7KWQpO2RkyDspZCk7OylkKTtkZAAAAAIAZAAABEwEsAALABEAABMhMhYUBiMhIiY0NgERBxEBIZYDhBUdHRX8fBUdHQI7yP6iA4QEsB0qHR0qHf1E%2FtTIAfQB9AAAAAMAAABkBLAEsAAXABsAJQAAATMyFh0BITIWFREhNSMVIRE0NjMhNTQ2FxUzNQEVFAYjISImPQEB9MgpOwEsKTv%2BDMj%2BDDspASw7KcgB9Dsp%2FBgpOwSwOylkOyn%2BcGRkAZApO2QpO2RkZP1EyCk7OynIAAAABAAAAAAEsASwABUAKwBBAFcAABMhMhYPARcWFA8BBiIvAQcGJjURNDYpATIWFREUBi8BBwYiLwEmND8BJyY2ARcWFA8BFxYGIyEiJjURNDYfATc2MgU3NhYVERQGIyEiJj8BJyY0PwE2MhcyASwVCA5exwcHaggUCMdeDhUdAzUBLBUdFQ5exwgUCGoHB8deDgj%2BL2oHB8deDggV%2FtQVHRUOXscIFALLXg4VHRX%2B1BUIDl7HBwdqCBQIBLAVDl7HCBQIagcHx14OCBUBLBUdHRX%2B1BUIDl7HBwdqCBQIx14OFf0maggUCMdeDhUdFQEsFQgOXscHzl4OCBX%2B1BUdFQ5exwgUCGoHBwAAAAYAAAAABKgEqAAPABsAIwA7AEMASwAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JiQyFhQGIiY0JDIWFAYjIicHFhUUBiImNTQ2PwImNTQEMhYUBiImNCQyFhQGIiY0Advy3Z9fX5%2Fd8t2gXl6gAcbgv29vv%2BC%2Fb2%2F%2BLS0gIC0gAUwtICAWDg83ETNIMykfegEJ%2FoctICAtIAIdLSAgLSAEqF%2Bf3fLdoF5eoN3y3Z9Xb7%2Fgv29vv%2BC%2FBiAtISEtICAtIQqRFxwkMzMkIDEFfgEODhekIC0gIC0gIC0gIC0AAf%2FYAFoEuQS8AFsAACUBNjc2JicmIyIOAwcABw4EFx4BMzI3ATYnLgEjIgcGBwEOASY0NwA3PgEzMhceARcWBgcOBgcGIyImJyY2NwE2NzYzMhceARcWBgcBDgEnLgECIgHVWwgHdl8WGSJBMD8hIP6IDx4eLRMNBQlZN0ozAiQkEAcdEhoYDRr%2Bqw8pHA4BRyIjQS4ODyw9DQ4YIwwod26La1YOOEBGdiIwGkQB%2F0coW2tQSE5nDxE4Qv4eDyoQEAOtAdZbZWKbEQQUGjIhH%2F6JDxsdNSg3HT5CMwIkJCcQFBcMGv6uDwEcKQ4BTSIjIQEINykvYyMLKnhuiWZMBxtAOU6%2BRAH%2FSBg3ISSGV121Qv4kDwIPDyYAAAACAGQAWASvBEQAGQBEAAABPgIeAhUUDgMHLgQ1ND4CHgEFIg4DIi4DIyIGFRQeAhcWFx4EMj4DNzY3PgQ1NCYCiTB7eHVYNkN5hKg%2BPqeFeEM4WnZ4eQEjIT8yLSohJyktPyJDbxtBMjMPBw86KzEhDSIzKUAMBAgrKT8dF2oDtURIBS1TdkA5eYB%2FslVVsn%2BAeTlAdlMtBUgtJjY1JiY1NiZvTRc4SjQxDwcOPCouGBgwKEALBAkpKkQqMhNPbQACADn%2F8gR3BL4AFwAuAAAAMh8BFhUUBg8BJi8BNycBFwcvASY0NwEDNxYfARYUBwEGIi8BJjQ%2FARYfAQcXAQKru0KNQjgiHR8uEl%2F3%2FnvUaRONQkIBGxJpCgmNQkL%2B5UK6Qo1CQjcdLhJf9wGFBL5CjUJeKmsiHTUuEl%2F4%2FnvUahKNQrpCARv%2BRmkICY1CukL%2B5UJCjUK7Qjc3LxFf%2BAGFAAAAAAMAyAAAA%2BgEsAARABUAHQAAADIeAhURFAYjISImNRE0PgEHESERACIGFBYyNjQCBqqaZDo7Kf2oKTs8Zj4CWP7%2FVj09Vj0EsB4uMhX8Ryk7OykDuRUzLar9RAK8%2FRY9Vj09VgABAAAAAASwBLAAFgAACQEWFAYiLwEBEScBBRMBJyEBJyY0NjIDhgEbDx0qDiT%2B6dT%2BzP7oywEz0gEsAQsjDx0qBKH%2B5g8qHQ8j%2FvX%2B1NL%2BzcsBGAE01AEXJA4qHQAAAAADAScAEQQJBOAAMgBAAEsAAAEVHgQXIy4DJxEXHgQVFAYHFSM1JicuASczHgEXEScuBDU0PgI3NRkBDgMVFB4DFxYXET4ENC4CArwmRVI8LAKfBA0dMydAIjxQNyiym2SWVygZA4sFV0obLkJOMCAyVWg6HSoqFQ4TJhkZCWgWKTEiGBkzNwTgTgUTLD9pQiQuLBsH%2Fs0NBxMtPGQ%2Bi6oMTU8QVyhrVk1iEAFPCA4ZLzlYNkZwSCoGTf4SARIEDh02Jh0rGRQIBgPQ%2FsoCCRYgNEM0JRkAAAABAGQAZgOUBK0ASgAAATIeARUjNC4CIyIGBwYVFB4BFxYXMxUjFgYHBgc%2BATM2FjMyNxcOAyMiLgEHDgEPASc%2BBTc%2BAScjNTMmJy4CPgE3NgIxVJlemSc8OxolVBQpGxoYBgPxxQgVFS02ImIWIIwiUzUyHzY4HCAXanQmJ1YYFzcEGAcTDBEJMAwk3aYXFQcKAg4tJGEErVCLTig%2FIhIdFSw5GkowKgkFZDKCHj4yCg8BIh6TExcIASIfBAMaDAuRAxAFDQsRCjePR2QvORQrREFMIVgAAAACABn%2F%2FwSXBLAADwAfAAABMzIWDwEGIi8BJjY7AREzBRcWBisBESMRIyImPwE2MgGQlhUIDuYOKg7mDggVlsgCF%2BYOCBWWyJYVCA7mDioBLBYO%2Bg8P%2Bg4WA4QQ%2BQ4V%2FHwDhBUO%2BQ8AAAQAGf%2F%2FA%2BgEsAAHABcAGwAlAAABIzUjFSMRIQEzMhYPAQYiLwEmNjsBETMFFTM1EwczFSE1NyM1IQPoZGRkASz9qJYVCA7mDioO5g4IFZbIAZFkY8jI%2FtTIyAEsArxkZAH0%2FHwWDvoPD%2FoOFgOEZMjI%2FRL6ZJb6ZAAAAAAEABn%2F%2FwPoBLAADwAZACEAJQAAATMyFg8BBiIvASY2OwERMwUHMxUhNTcjNSERIzUjFSMRIQcVMzUBkJYVCA7mDioO5g4IFZbIAljIyP7UyMgBLGRkZAEsx2QBLBYO%2Bg8P%2Bg4WA4SW%2BmSW%2BmT7UGRkAfRkyMgAAAAEABn%2F%2FwRMBLAADwAVABsAHwAAATMyFg8BBiIvASY2OwERMwEjESM1MxMjNSMRIQcVMzUBkJYVCA7mDioO5g4IFZbIAlhkZMhkZMgBLMdkASwWDvoPD%2FoOFgOE%2FgwBkGT7UGQBkGTIyAAAAAAEABn%2F%2FwRMBLAADwAVABkAHwAAATMyFg8BBiIvASY2OwERMwEjNSMRIQcVMzUDIxEjNTMBkJYVCA7mDioO5g4IFZbIArxkyAEsx2QBZGTIASwWDvoPD%2FoOFgOE%2FgxkAZBkyMj7tAGQZAAAAAAFABn%2F%2FwSwBLAADwATABcAGwAfAAABMzIWDwEGIi8BJjY7AREzBSM1MxMhNSETITUhEyE1IQGQlhUIDuYOKg7mDggVlsgB9MjIZP7UASxk%2FnABkGT%2BDAH0ASwWDvoPD%2FoOFgOEyMj%2BDMj%2BDMj%2BDMgABQAZ%2F%2F8EsASwAA8AEwAXABsAHwAAATMyFg8BBiIvASY2OwERMwUhNSEDITUhAyE1IQMjNTMBkJYVCA7mDioO5g4IFZbIAyD%2BDAH0ZP5wAZBk%2FtQBLGTIyAEsFg76Dw%2F6DhYDhMjI%2FgzI%2FgzI%2FgzIAAIAAAAABEwETAAPAB8AAAEhMhYVERQGIyEiJjURNDYFISIGFREUFjMhMjY1ETQmAV4BkKK8u6P%2BcKW5uQJn%2FgwpOzspAfQpOzsETLuj%2FnClubmlAZClucg7Kf4MKTs7KQH0KTsAAAAAAwAAAAAETARMAA8AHwArAAABITIWFREUBiMhIiY1ETQ2BSEiBhURFBYzITI2NRE0JgUXFhQPAQYmNRE0NgFeAZClubml%2FnCju7wCZP4MKTs7KQH0KTs7%2Fm%2F9ERH9EBgYBEy5pf5wpbm5pQGQo7vIOyn%2BDCk7OykB9Ck7gr4MJAy%2BDAsVAZAVCwAAAAADAAAAAARMBEwADwAfACsAAAEhMhYVERQGIyEiJjURNDYFISIGFREUFjMhMjY1ETQmBSEyFg8BBiIvASY2AV4BkKO7uaX%2BcKW5uQJn%2FgwpOzspAfQpOzv%2BFQGQFQsMvgwkDL4MCwRMvKL%2BcKW5uaUBkKO7yDsp%2FgwpOzspAfQpO8gYEP0REf0QGAAAAAMAAAAABEwETAAPAB8AKwAAASEyFhURFAYjISImNRE0NgUhIgYVERQWMyEyNjURNCYFFxYGIyEiJj8BNjIBXgGQpbm5pf5wo7u5Amf%2BDCk7OykB9Ck7O%2F77vgwLFf5wFQsMvgwkBEy5pf5wo7u8ogGQpbnIOyn%2BDCk7OykB9Ck7z%2F0QGBgQ%2FREAAAAAAgAAAAAFFARMAB8ANQAAASEyFhURFAYjISImPQE0NjMhMjY1ETQmIyEiJj0BNDYHARYUBwEGJj0BIyImPQE0NjsBNTQ2AiYBkKW5uaX%2BcBUdHRUBwik7Oyn%2BPhUdHb8BRBAQ%2FrwQFvoVHR0V%2BhYETLml%2FnCluR0VZBUdOykB9Ck7HRVkFR3p%2FuQOJg7%2B5A4KFZYdFcgVHZYVCgAAAQDZAAID1wSeACMAAAEXFgcGAgclMhYHIggBBwYrAScmNz4BPwEhIicmNzYANjc2MwMZCQgDA5gCASwYEQ4B%2Fvf%2B8wQMDgkJCQUCUCcn%2FtIXCAoQSwENuwUJEASeCQoRC%2F5TBwEjEv7K%2FsUFDwgLFQnlbm4TFRRWAS%2FTBhAAAAACAAAAAAT%2BBEwAHwA1AAABITIWHQEUBiMhIgYVERQWMyEyFh0BFAYjISImNRE0NgUBFhQHAQYmPQEjIiY9ATQ2OwE1NDYBXgGQFR0dFf4%2BKTs7KQHCFR0dFf5wpbm5AvEBRBAQ%2FrwQFvoVHR0V%2BhYETB0VZBUdOyn%2BDCk7HRVkFR25pQGQpbnp%2FuQOJg7%2B5A4KFZYdFcgVHZYVCgACAAAAAASwBLAAFQAxAAABITIWFREUBi8BAQYiLwEmNDcBJyY2ASMiBhURFBYzITI2PQE3ERQGIyEiJjURNDYzIQLuAZAVHRUObf7IDykPjQ8PAThtDgj%2B75wpOzspAfQpO8i7o%2F5wpbm5pQEsBLAdFf5wFQgObf7IDw%2BNDykPAThtDhX%2B1Dsp%2FgwpOzsplMj%2B1qW5uaUBkKW5AAADAA4ADgSiBKIADwAbACMAAAAyHgIUDgIiLgI0PgEEIg4BFB4BMj4BNCYEMhYUBiImNAHh7tmdXV2d2e7ZnV1dnQHD5sJxccLmwnFx%2FnugcnKgcgSiXZ3Z7tmdXV2d2e7ZnUdxwubCcXHC5sJzcqBycqAAAAMAAAAABEwEsAAVAB8AIwAAATMyFhURMzIWBwEGIicBJjY7ARE0NgEhMhYdASE1NDYFFTM1AcLIFR31FAoO%2FoEOJw3%2BhQ0JFfod%2FoUD6BUd%2B7QdA2dkBLAdFf6iFg%2F%2BVg8PAaoPFgFeFR38fB0V%2BvoVHWQyMgAAAAMAAAAABEwErAAVAB8AIwAACQEWBisBFRQGKwEiJj0BIyImNwE%2BAQEhMhYdASE1NDYFFTM1AkcBeg4KFfQiFsgUGPoUCw4Bfw4n%2FfkD6BUd%2B7QdA2dkBJ7%2BTQ8g%2BhQeHRX6IQ8BrxAC%2FH8dFfr6FR1kMjIAAwAAAAAETARLABQAHgAiAAAJATYyHwEWFAcBBiInASY0PwE2MhcDITIWHQEhNTQ2BRUzNQGMAXEHFQeLBwf98wcVB%2F7cBweLCBUH1APoFR37tB0DZ2QC0wFxBweLCBUH%2FfMICAEjCBQIiwcH%2FdIdFfr6FR1kMjIABAAAAAAETASbAAkAGQAjACcAABM3NjIfAQcnJjQFNzYWFQMOASMFIiY%2FASc3ASEyFh0BITU0NgUVMzWHjg4qDk3UTQ4CFtIOFQIBHRX9qxUIDtCa1P49A%2BgVHfu0HQNnZAP%2Fjg4OTdRMDyqa0g4IFf2pFB4BFQ7Qm9T9Oh0V%2BvoVHWQyMgAAAAQAAAAABEwEsAAPABkAIwAnAAABBR4BFRMUBi8BByc3JyY2EwcGIi8BJjQ%2FAQEhMhYdASE1NDYFFTM1AV4CVxQeARUO0JvUm9IOCMNMDyoOjg4OTf76A%2BgVHfu0HQNnZASwAgEdFf2rFQgO0JrUmtIOFf1QTQ4Ojg4qDk3%2BWB0V%2BvoVHWQyMgACAAT%2F7ASwBK8ABQAIAAAlCQERIQkBFQEEsP4d%2Fsb%2BcQSs%2FTMCq2cBFP5xAacDHPz55gO5AAAAAAIAAABkBEwEsAAVABkAAAERFAYrAREhESMiJjURNDY7AREhETMHIzUzBEwdFZb9RJYVHR0V%2BgH0ZMhkZAPo%2FK4VHQGQ%2FnAdFQPoFB7%2B1AEsyMgAAAMAAABFBN0EsAAWABoALwAAAQcBJyYiDwEhESMiJjURNDY7AREhETMHIzUzARcWFAcBBiIvASY0PwE2Mh8BATYyBEwC%2FtVfCRkJlf7IlhUdHRX6AfRkyGRkAbBqBwf%2BXAgUCMoICGoHFQdPASkHFQPolf7VXwkJk%2F5wHRUD6BQe%2FtQBLMjI%2Fc5qBxUH%2FlsHB8sHFQdqCAhPASkHAAMAAAANBQcEsAAWABoAPgAAAREHJy4BBwEhESMiJjURNDY7AREhETMHIzUzARcWFA8BFxYUDwEGIi8BBwYiLwEmND8BJyY0PwE2Mh8BNzYyBExnhg8lEP72%2FreWFR0dFfoB9GTIZGQB9kYPD4ODDw9GDykPg4MPKQ9GDw%2BDgw8PRg8pD4ODDykD6P7zZ4YPAw7%2B9v5wHRUD6BQe%2FtQBLMjI%2FYxGDykPg4MPKQ9GDw%2BDgw8PRg8pD4ODDykPRg8Pg4MPAAADAAAAFQSXBLAAFQAZAC8AAAERISIGHQEhESMiJjURNDY7AREhETMHIzUzEzMyFh0BMzIWDwEGIi8BJjY7ATU0NgRM%2FqIVHf4MlhUdHRX6AfRkyGRklmQVHZYVCA7mDioO5g4IFZYdA%2Bj%2B1B0Vlv5wHRUD6BQe%2FtQBLMjI%2FagdFfoVDuYODuYOFfoVHQAAAAADAAAAAASXBLAAFQAZAC8AAAERJyYiBwEhESMiJjURNDY7AREhETMHIzUzExcWBisBFRQGKwEiJj0BIyImPwE2MgRMpQ4qDv75%2Fm6WFR0dFfoB9GTIZGTr5g4IFZYdFWQVHZYVCA7mDioD6P5wpQ8P%2Fvf%2BcB0VA%2BgUHv7UASzIyP2F5Q8V%2BhQeHhT6FQ%2FlDwADAAAAyASwBEwACQATABcAABMhMhYdASE1NDYBERQGIyEiJjURExUhNTIETBUd%2B1AdBJMdFfu0FR1kAZAETB0VlpYVHf7U%2FdoVHR0VAib%2B1MjIAAAGAAMAfQStBJcADwAZAB0ALQAxADsAAAEXFhQPAQYmPQEhNSE1NDYBIyImPQE0NjsBFyM1MwE3NhYdASEVIRUUBi8BJjQFIzU7AjIWHQEUBisBA6f4Dg74DhX%2BcAGQFf0vMhUdHRUyyGRk%2FoL3DhUBkP5wFQ73DwOBZGRkMxQdHRQzBI3mDioO5g4IFZbIlhUI%2FoUdFWQVHcjI%2FcvmDggVlsiWFQgO5g4qecgdFWQVHQAAAAACAGQAAASwBLAAFgBRAAABJTYWFREUBisBIiY1ES4ENRE0NiUyFh8BERQOAg8BERQGKwEiJjURLgQ1ETQ%2BAzMyFh8BETMRPAE%2BAjMyFh8BETMRND4DA14BFBklHRXIFR0EDiIaFiX%2B4RYZAgEVHR0LCh0VyBUdBA4iGhYBBwoTDRQZAgNkBQkVDxcZAQFkAQUJFQQxdBIUH%2FuuFR0dFQGNAQgbHzUeAWcfRJEZDA3%2BPhw%2FMSkLC%2F5BFR0dFQG%2FBA8uLkAcAcICBxENCxkMDf6iAV4CBxENCxkMDf6iAV4CBxENCwABAGQAAASwBEwAMwAAARUiDgMVERQWHwEVITUyNjURIREUFjMVITUyPgM1ETQmLwE1IRUiBhURIRE0JiM1BLAEDiIaFjIZGf5wSxn%2BDBlL%2FnAEDiIaFjIZGQGQSxkB9BlLBEw4AQUKFA78iBYZAQI4OA0lAYr%2BdiUNODgBBQoUDgN4FhkBAjg4DSX%2BdgGKJQ04AAAABgAAAAAETARMAAwAHAAgACQAKAA0AAABITIWHQEjBTUnITchBSEyFhURFAYjISImNRE0NhcVITUBBTUlBRUhNQUVFAYjIQchJyE3MwKjAXcVHWn%2B2cj%2BcGQBd%2F4lASwpOzsp%2FtQpOzspASwCvP5wAZD8GAEsArwdFf6JZP6JZAGQyGkD6B0VlmJiyGTIOyn%2BDCk7OykB9Ck7ZMjI%2FveFo4XGyMhm%2BBUdZGTIAAEAEAAQBJ8EnwAmAAATNzYWHwEWBg8BHgEXNz4BHwEeAQ8BBiIuBicuBTcRohEuDosOBhF3ZvyNdxEzE8ATBxGjAw0uMUxPZWZ4O0p3RjITCwED76IRBhPCFDERdo78ZXYRBA6IDi8RogEECBUgNUNjO0qZfHNVQBAAAAACAAAAAASwBEwAIwBBAAAAMh4EHwEVFAYvAS4BPQEmIAcVFAYPAQYmPQE%2BBRIyHgIfARUBHgEdARQGIyEiJj0BNDY3ATU0PgIB%2FLimdWQ%2FLAkJHRTKFB2N%2FsKNHRTKFB0DDTE7ZnTKcFImFgEBAW0OFR0V%2B7QVHRUOAW0CFiYETBUhKCgiCgrIFRgDIgMiFZIYGJIVIgMiAxgVyAQNJyQrIP7kExwcCgoy%2FtEPMhTUFR0dFdQUMg8BLzIEDSEZAAADAAAAAASwBLAADQAdACcAAAEHIScRMxUzNTMVMzUzASEyFhQGKwEXITcjIiY0NgMhMhYdASE1NDYETMj9qMjIyMjIyPyuArwVHR0VDIn8SokMFR0dswRMFR37UB0CvMjIAfTIyMjI%2FOAdKh1kZB0qHf7UHRUyMhUdAAAAAwBkAAAEsARMAAkAEwAdAAABIyIGFREhETQmASMiBhURIRE0JgEhETQ2OwEyFhUCvGQpOwEsOwFnZCk7ASw7%2FRv%2B1DspZCk7BEw7KfwYA%2BgpO%2F7UOyn9RAK8KTv84AGQKTs7KQAAAAAF%2F5wAAASwBEwADwATAB8AJQApAAATITIWFREUBiMhIiY1ETQ2FxEhEQUjFTMRITUzNSMRIQURByMRMwcRMxHIArx8sLB8%2FUR8sLAYA4T%2BDMjI%2FtTIyAEsAZBkyMhkZARMsHz%2BDHywsHwB9HywyP1EArzIZP7UZGQBLGT%2B1GQB9GT%2B1AEsAAAABf%2BcAAAEsARMAA8AEwAfACUAKQAAEyEyFhURFAYjISImNRE0NhcRIREBIzUjFSMRMxUzNTMFEQcjETMHETMRyAK8fLCwfP1EfLCwGAOE%2FgxkZGRkZGQBkGTIyGRkBEywfP4MfLCwfAH0fLDI%2FUQCvP2oyMgB9MjIZP7UZAH0ZP7UASwABP%2BcAAAEsARMAA8AEwAbACMAABMhMhYVERQGIyEiJjURNDYXESERBSMRMxUhESEFIxEzFSERIcgCvHywsHz9RHywsBgDhP4MyMj%2B1AEsAZDIyP7UASwETLB8%2Fgx8sLB8AfR8sMj9RAK8yP7UZAH0ZP7UZAH0AAAABP%2BcAAAEsARMAA8AEwAWABkAABMhMhYVERQGIyEiJjURNDYXESERAS0BDQERyAK8fLCwfP1EfLCwGAOE%2Fgz%2B1AEsAZD%2B1ARMsHz%2BDHywsHwB9HywyP1EArz%2BDJaWlpYBLAAAAAX%2FnAAABLAETAAPABMAFwAgACkAABMhMhYVERQGIyEiJjURNDYXESERAyERIQcjIgYVFBY7AQERMzI2NTQmI8gCvHywsHz9RHywsBgDhGT9RAK8ZIImOTYpgv4Mgik2OSYETLB8%2Fgx8sLB8AfR8sMj9RAK8%2FagB9GRWQUFUASz%2B1FRBQVYAAAAF%2F5wAAASwBEwADwATAB8AJQApAAATITIWFREUBiMhIiY1ETQ2FxEhEQUjFTMRITUzNSMRIQEjESM1MwMjNTPIArx8sLB8%2FUR8sLAYA4T%2BDMjI%2FtTIyAEsAZBkZMjIZGQETLB8%2Fgx8sLB8AfR8sMj9RAK8yGT%2B1GRkASz%2BDAGQZP4MZAAG%2F5wAAASwBEwADwATABkAHwAjACcAABMhMhYVERQGIyEiJjURNDYXESERBTMRIREzASMRIzUzBRUzNQEjNTPIArx8sLB8%2FUR8sLAYA4T9RMj%2B1GQCWGRkyP2oZAEsZGQETLB8%2Fgx8sLB8AfR8sMj9RAK8yP5wAfT%2BDAGQZMjIyP7UZAAF%2F5wAAASwBEwADwATABwAIgAmAAATITIWFREUBiMhIiY1ETQ2FxEhEQEHIzU3NSM1IQEjESM1MwMjNTPIArx8sLB8%2FUR8sLAYA4T%2BDMdkx8gBLAGQZGTIx2RkBEywfP4MfLCwfAH0fLDI%2FUQCvP5wyDLIlmT%2BDAGQZP4MZAAAAAMACQAJBKcEpwAPABsAJQAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JgchFSEVISc1NyEB4PDbnl5entvw255eXp4BxeTCcXHC5MJxcWz%2B1AEs%2FtRkZAEsBKdentvw255eXp7b8NueTHHC5MJxccLkwtDIZGTIZAAAAAAEAAkACQSnBKcADwAbACcAKwAAADIeAhQOAiIuAjQ%2BAQQiDgEUHgEyPgE0JgcVBxcVIycjFSMRIQcVMzUB4PDbnl5entvw255eXp4BxeTCcXHC5MJxcWwyZGRklmQBLMjIBKdentvw255eXp7b8NueTHHC5MJxccLkwtBkMmQyZGQBkGRkZAAAAv%2Fy%2F50EwgRBACAANgAAATIWFzYzMhYUBisBNTQmIyEiBh0BIyImNTQ2NyY1ND4BEzMyFhURMzIWDwEGIi8BJjY7ARE0NgH3brUsLC54qqp4gB0V%2FtQVHd5QcFZBAmKqepYKD4kVCg3fDSYN3w0KFYkPBEF3YQ6t8a36FR0dFfpzT0VrDhMSZKpi%2FbMPCv7tFxD0EBD0EBcBEwoPAAAAAAL%2F8v%2BcBMMEQQAcADMAAAEyFhc2MzIWFxQGBwEmIgcBIyImNTQ2NyY1ND4BExcWBisBERQGKwEiJjURIyImNzY3NjIB9m62LCsueaoBeFr%2Bhg0lDf6DCU9xVkECYqnm3w0KFYkPCpYKD4kVCg3HGBMZBEF3YQ%2BteGOkHAFoEBD%2Bk3NPRWsOExNkqWP9kuQQF%2F7tCg8PCgETFxDMGBMAAAABAGQAAARMBG0AGAAAJTUhATMBMwkBMwEzASEVIyIGHQEhNTQmIwK8AZD%2B8qr%2B8qr%2B1P7Uqv7yqv7yAZAyFR0BkB0VZGQBLAEsAU3%2Bs%2F7U%2FtRkHRUyMhUdAAAAAAEAeQAABDcEmwAvAAABMhYXHgEVFAYHFhUUBiMiJxUyFh0BITU0NjM1BiMiJjU0Ny4BNTQ2MzIXNCY1NDYCWF6TGll7OzIJaUo3LRUd%2FtQdFS03SmkELzlpSgUSAqMEm3FZBoNaPWcfHRpKaR77HRUyMhUd%2Bx5pShIUFVg1SmkCAhAFdKMAAAAGACcAFASJBJwAEQAqAEIASgBiAHsAAAEWEgIHDgEiJicmAhI3PgEyFgUiBw4BBwYWHwEWMzI3Njc2Nz4BLwEmJyYXIgcOAQcGFh8BFjMyNz4BNz4BLwEmJyYWJiIGFBYyNjciBw4BBw4BHwEWFxYzMjc%2BATc2Ji8BJhciBwYHBgcOAR8BFhcWMzI3PgE3NiYvASYD8m9PT29T2dzZU29PT29T2dzZ%2Fj0EBHmxIgQNDCQDBBcGG0dGYAsNAwkDCwccBAVQdRgEDA0iBAQWBhJROQwMAwkDCwf5Y4xjY4xjVhYGElE6CwwDCQMLBwgEBVB1GAQNDCIEjRcGG0dGYAsNAwkDCwcIBAR5sSIEDQwkAwPyb%2F7V%2FtVvU1dXU28BKwErb1NXVxwBIrF5DBYDCQEWYEZHGwMVDCMNBgSRAhh1UA0WAwkBFTpREgMVCyMMBwT6Y2OMY2MVFTpREQQVCyMMBwQCGHVQDRYDCQEkFmBGRxsDFQwjDQYEASKxeQwWAwkBAAAABQBkAAAD6ASwAAwADwAWABwAIgAAASERIzUhFSERNDYzIQEjNQMzByczNTMDISImNREFFRQGKwECvAEstP6s%2FoQPCgI%2FASzIZKLU1KJktP51Cg8DhA8KwwMg%2FoTIyALzCg%2F%2B1Mj84NTUyP4MDwoBi8jDCg8AAAAABQBkAAAD6ASwAAkADAATABoAIQAAASERCQERNDYzIQEjNRMjFSM1IzcDISImPQEpARUUBisBNQK8ASz%2Bov3aDwoCPwEsyD6iZKLUqv6dCg8BfAIIDwqbAyD9%2BAFe%2FdoERwoP%2FtTI%2FHzIyNT%2BZA8KNzcKD1AAAAAAAwAAAAAEsAP0AAgAGQAfAAABIxUzFyERIzcFMzIeAhUhFSEDETM0PgIBMwMhASEEiqJkZP7UotT9EsgbGiEOASz9qMhkDiEaAnPw8PzgASwB9AMgyGQBLNTUBBErJGT%2BogHCJCsRBP5w%2FnAB9AAAAAMAAAAABEwETAAZADIAOQAAATMyFh0BMzIWHQEUBiMhIiY9ATQ2OwE1NDYFNTIWFREUBiMhIic3ARE0NjMVFBYzITI2AQc1IzUzNQKKZBUdMhUdHRX%2B1BUdHRUyHQFzKTs7Kf2oARP2%2Fro7KVg%2BASw%2BWP201MjIBEwdFTIdFWQVHR0VZBUdMhUd%2BpY7KfzgKTsE9gFGAUQpO5Y%2BWFj95tSiZKIAAwBkAAAEvARMABkANgA9AAABMzIWHQEzMhYdARQGIyEiJj0BNDY7ATU0NgU1MhYVESMRMxQOAiMhIiY1ETQ2MxUUFjMhMjYBBzUjNTM1AcJkFR0yFR0dFf7UFR0dFTIdAXMpO8jIDiEaG%2F2oKTs7KVg%2BASw%2BWAGc1MjIBEwdFTIdFWQVHR0VZBUdMhUd%2BpY7Kf4M%2FtQkKxEEOykDICk7lj5YWP3m1KJkogAAAAP%2FogAABRYE1AALABsAHwAACQEWBiMhIiY3ATYyEyMiBhcTHgE7ATI2NxM2JgMVMzUCkgJ9FyAs%2BwQsIBcCfRZARNAUGAQ6BCMUNhQjBDoEGODIBK37sCY3NyYEUCf%2BTB0U%2FtIUHR0UAS4UHf4MZGQAAAAACQAAAAAETARMAA8AHwAvAD8ATwBfAG8AfwCPAAABMzIWHQEUBisBIiY9ATQ2EzMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYBMzIWHQEUBisBIiY9ATQ2ITMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYBMzIWHQEUBisBIiY9ATQ2ITMyFh0BFAYrASImPQE0NiEzMhYdARQGKwEiJj0BNDYBqfoKDw8K%2BgoPDwr6Cg8PCvoKDw8BmvoKDw8K%2BgoPD%2Fzq%2BgoPDwr6Cg8PAZr6Cg8PCvoKDw8BmvoKDw8K%2BgoPD%2Fzq%2BgoPDwr6Cg8PAZr6Cg8PCvoKDw8BmvoKDw8K%2BgoPDwRMDwqWCg8PCpYKD%2F7UDwqWCg8PCpYKDw8KlgoPDwqWCg%2F%2B1A8KlgoPDwqWCg8PCpYKDw8KlgoPDwqWCg8PCpYKD%2F7UDwqWCg8PCpYKDw8KlgoPDwqWCg8PCpYKDw8KlgoPAAAAAwAAAAAEsAUUABkAKQAzAAABMxUjFSEyFg8BBgchJi8BJjYzITUjNTM1MwEhMhYUBisBFyE3IyImNDYDITIWHQEhNTQ2ArxkZAFePjEcQiko%2FPwoKUIcMT4BXmRkyP4%2BArwVHR0VDIn8SooNFR0dswRMFR37UB0EsMhkTzeEUzMzU4Q3T2TIZPx8HSodZGQdKh3%2B1B0VMjIVHQAABAAAAAAEsAUUAAUAGQArADUAAAAyFhUjNAchFhUUByEyFg8BIScmNjMhJjU0AyEyFhQGKwEVBSElNSMiJjQ2AyEyFh0BITU0NgIwUDnCPAE6EgMBSCkHIq%2F9WrIiCikBSAOvArwVHR0VlgET%2FEoBE5YVHR2zBEwVHftQHQUUOykpjSUmCBEhFpGRFiERCCb%2BlR0qHcjIyMgdKh39qB0VMjIVHQAEAAAAAASwBJ0ABwAUACQALgAAADIWFAYiJjQTMzIWFRQXITY1NDYzASEyFhQGKwEXITcjIiY0NgMhMhYdASE1NDYCDZZqapZqty4iKyf%2BvCcrI%2F7NArwVHR0VDYr8SokMFR0dswRMFR37UB0EnWqWamqW%2Fus5Okxra0w6Of5yHSodZGQdKh3%2B1B0VMjIVHQAEAAAAAASwBRQADwAcACwANgAAATIeARUUBiImNTQ3FzcnNhMzMhYVFBchNjU0NjMBITIWFAYrARchNyMiJjQ2AyEyFh0BITU0NgJYL1szb5xvIpBvoyIfLiIrJ%2F68Jysj%2Fs0CvBUdHRUNivxKiQwVHR2zBEwVHftQHQUUa4s2Tm9vTj5Rj2%2BjGv4KOTpMa2tMOjn%2Bch0qHWRkHSod%2FtQdFTIyFR0AAAADAAAAAASwBRIAEgAiACwAAAEFFSEUHgMXIS4BNTQ%2BAjcBITIWFAYrARchNyMiJjQ2AyEyFh0BITU0NgJYASz%2B1CU%2FP00T%2Fe48PUJtj0r%2BogK8FR0dFQ2K%2FEqJDBUdHbMETBUd%2B1AdBLChizlmUT9IGVO9VFShdksE%2FH4dKh1kZB0qHf7UHRUyMhUdAAIAyAAAA%2BgFFAAPACkAAAAyFh0BHgEdASE1NDY3NTQDITIWFyMVMxUjFTMVIxUzFAYjISImNRE0NgIvUjsuNv5wNi5kAZA2XBqsyMjIyMh1U%2F5wU3V1BRQ7KU4aXDYyMjZcGk4p%2Fkc2LmRkZGRkU3V1UwGQU3UAAAMAZP%2F%2FBEwETAAPAC8AMwAAEyEyFhURFAYjISImNRE0NgMhMhYdARQGIyEXFhQGIi8BIQcGIiY0PwEhIiY9ATQ2BQchJ5YDhBUdHRX8fBUdHQQDtgoPDwr%2B5eANGiUNWP30Vw0mGg3g%2Ft8KDw8BqmQBRGQETB0V%2FgwVHR0VAfQVHf1EDwoyCg%2FgDSUbDVhYDRslDeAPCjIKD2RkZAAAAAAEAAAAAASwBEwAGQAjAC0ANwAAEyEyFh0BIzQmKwEiBhUjNCYrASIGFSM1NDYDITIWFREhETQ2ExUUBisBIiY9ASEVFAYrASImPQHIAyBTdWQ7KfopO2Q7KfopO2R1EQPoKTv7UDvxHRVkFR0D6B0VZBUdBEx1U8gpOzspKTs7KchTdf4MOyn%2B1AEsKTv%2BDDIVHR0VMjIVHR0VMgADAAEAAASpBKwADQARABsAAAkBFhQPASEBJjQ3ATYyCQMDITIWHQEhNTQ2AeACqh8fg%2F4f%2FfsgIAEnH1n%2BrAFWAS%2F%2Bq6IDIBUd%2FHwdBI39VR9ZH4MCBh9ZHwEoH%2F5u%2FqoBMAFV%2FBsdFTIyFR0AAAAAAgCPAAAEIQSwABcALwAAAQMuASMhIgYHAwYWMyEVFBYyNj0BMzI2AyE1NDY7ATU0NjsBETMRMzIWHQEzMhYVBCG9CCcV%2FnAVJwi9CBMVAnEdKh19FROo%2Fa0dFTIdFTDILxUdMhUdAocB%2BhMcHBP%2BBhMclhUdHRWWHP2MMhUdMhUdASz%2B1B0VMh0VAAAEAAAAAASwBLAADQAQAB8AIgAAASERFAYjIREBNTQ2MyEBIzUBIREUBiMhIiY1ETQ2MyEBIzUDhAEsDwr%2Bif7UDwoBdwEsyP2oASwPCv12Cg8PCgF3ASzIAyD9wQoPAk8BLFQKD%2F7UyP4M%2FcEKDw8KA7YKD%2F7UyAAC%2F5wAZAUUBEcARgBWAAABMzIeAhcWFxY2NzYnJjc%2BARYXFgcOASsBDgEPAQ4BKwEiJj8BBisBIicHDgErASImPwEmLwEuAT0BNDY7ATY3JyY2OwE2BSMiBh0BFBY7ATI2PQE0JgHkw0uOakkMEhEfQwoKGRMKBQ8XDCkCA1Y9Pgc4HCcDIhVkFRgDDDEqwxgpCwMiFWQVGAMaVCyfExwdFXwLLW8QBxXLdAFF%2BgoPDwr6Cg8PBEdBa4pJDgYKISAiJRsQCAYIDCw9P1c3fCbqFB0dFEYOCEAUHR0UnUplNQcmFTIVHVdPXw4TZV8PCjIKDw8KMgoPAAb%2FnP%2FmBRQEfgAJACQANAA8AFIAYgAAASU2Fh8BFgYPASUzMhYfASEyFh0BFAYHBQYmJyYjISImPQE0NhcjIgYdARQ7ATI2NTQmJyYEIgYUFjI2NAE3PgEeARceAT8BFxYGDwEGJi8BJjYlBwYfAR4BPwE2Jy4BJy4BAoEBpxMuDiAOAxCL%2FCtqQ0geZgM3FR0cE%2F0fFyIJKjr%2B1D5YWLlQExIqhhALIAsSAYBALS1ALf4PmBIgHhMQHC0aPzANITNQL3wpgigJASlmHyElDR0RPRMFAhQHCxADhPcICxAmDyoNeMgiNtQdFTIVJgeEBBQPQ1g%2ByD5YrBwVODMQEAtEERzJLUAtLUD%2B24ITChESEyMgAwWzPUkrRSgJL5cvfRxYGyYrDwkLNRAhFEgJDAQAAAAAAwBkAAAEOQSwAFEAYABvAAABMzIWHQEeARcWDgIPATIeBRUUDgUjFRQGKwEiJj0BIxUUBisBIiY9ASMiJj0BNDY7AREjIiY9ATQ2OwE1NDY7ATIWHQEzNTQ2AxUhMj4CNTc0LgMjARUhMj4CNTc0LgMjAnGWCg9PaAEBIC4uEBEGEjQwOiodFyI2LUAjGg8KlgoPZA8KlgoPrwoPDwpLSwoPDwqvDwqWCg9kD9cBBxwpEwsBAQsTKRz%2B%2BQFrHCkTCwEBCxMpHASwDwptIW1KLk0tHwYGAw8UKDJOLTtdPCoVCwJLCg8PCktLCg8PCksPCpYKDwJYDwqWCg9LCg8PCktLCg%2F%2B1MgVHR0LCgQOIhoW%2FnDIFR0dCwoEDiIaFgAAAwAEAAIEsASuABcAKQAsAAATITIWFREUBg8BDgEjISImJy4CNRE0NgQiDgQPARchNy4FAyMT1AMMVnokEhIdgVL9xFKCHAgYKHoCIIx9VkcrHQYGnAIwnAIIIClJVSGdwwSuelb%2BYDO3QkJXd3ZYHFrFMwGgVnqZFyYtLSUMDPPzBQ8sKDEj%2FsIBBQACAMgAAAOEBRQADwAZAAABMzIWFREUBiMhIiY1ETQ2ARUUBisBIiY9AQHblmesVCn%2BPilUrAFINhWWFTYFFKxn%2FgwpVFQpAfRnrPwY4RU2NhXhAAACAMgAAAOEBRQADwAZAAABMxQWMxEUBiMhIiY1ETQ2ARUUBisBIiY9AQHbYLOWVCn%2BPilUrAFINhWWFTYFFJaz%2FkIpVFQpAfRnrPwY4RU2NhXhAAACAAAAFAUOBBoAFAAaAAAJASUHFRcVJwc1NzU0Jj4CPwEnCQEFJTUFJQUO%2FYL%2Bhk5klpZkAQEBBQQvkwKCAVz%2Bov6iAV4BXgL%2F%2FuWqPOCWx5SVyJb6BA0GCgYDKEEBG%2F1ipqaTpaUAAAMAZAH0BLADIAAHAA8AFwAAEjIWFAYiJjQkMhYUBiImNCQyFhQGIiY0vHxYWHxYAeh8WFh8WAHofFhYfFgDIFh8WFh8WFh8WFh8WFh8WFh8AAAAAAMBkAAAArwETAAHAA8AFwAAADIWFAYiJjQSMhYUBiImNBIyFhQGIiY0Aeh8WFh8WFh8WFh8WFh8WFh8WARMWHxYWHz%2ByFh8WFh8%2FshYfFhYfAAAAAMAZABkBEwETAAPAB8ALwAAEyEyFh0BFAYjISImPQE0NhMhMhYdARQGIyEiJj0BNDYTITIWHQEUBiMhIiY9ATQ2fQO2Cg8PCvxKCg8PCgO2Cg8PCvxKCg8PCgO2Cg8PCvxKCg8PBEwPCpYKDw8KlgoP%2FnAPCpYKDw8KlgoP%2FnAPCpYKDw8KlgoPAAAABAAAAAAEsASwAA8AHwAvADMAAAEhMhYVERQGIyEiJjURNDYFISIGFREUFjMhMjY1ETQmBSEyFhURFAYjISImNRE0NhcVITUBXgH0ory7o%2F4Mpbm5Asv9qCk7OykCWCk7O%2F2xAfQVHR0V%2FgwVHR1HAZAEsLuj%2FgylubmlAfSlucg7Kf2oKTs7KQJYKTtkHRX%2B1BUdHRUBLBUdZMjIAAAAAAEAZABkBLAETAA7AAATITIWFAYrARUzMhYUBisBFTMyFhQGKwEVMzIWFAYjISImNDY7ATUjIiY0NjsBNSMiJjQ2OwE1IyImNDaWA%2BgVHR0VMjIVHR0VMjIVHR0VMjIVHR0V%2FBgVHR0VMjIVHR0VMjIVHR0VMjIVHR0ETB0qHcgdKh3IHSodyB0qHR0qHcgdKh3IHSodyB0qHQAAAAYBLAAFA%2BgEowAHAA0AEwAZAB8AKgAAAR4BBgcuATYBMhYVIiYlFAYjNDYBMhYVIiYlFAYjNDYDFRQGIiY9ARYzMgKKVz8%2FV1c%2FP%2F75fLB8sAK8sHyw%2FcB8sHywArywfLCwHSodKAMRBKNDsrJCQrKy%2FsCwfLB8fLB8sP7UsHywfHywfLD%2B05AVHR0VjgQAAAH%2FtQDIBJQDgQBCAAABNzYXAR4BBw4BKwEyFRQOBCsBIhE0NyYiBxYVECsBIi4DNTQzIyImJyY2NwE2HwEeAQ4BLwEHIScHBi4BNgLpRRkUASoLCAYFGg8IAQQNGyc%2FKZK4ChRUFQu4jjBJJxkHAgcPGQYGCAsBKhQaTBQVCiMUM7YDe7YsFCMKFgNuEwYS%2FtkLHw8OEw0dNkY4MhwBIBgXBAQYF%2F7gKjxTQyMNEw4PHwoBKBIHEwUjKBYGDMHBDAUWKCMAAAAAAgAAAAAEsASwACUAQwAAASM0LgUrAREUFh8BFSE1Mj4DNREjIg4FFSMRIQEjNC4DKwERFBYXMxUjNTI1ESMiDgMVIzUhBLAyCAsZEyYYGcgyGRn%2BcAQOIhoWyBkYJhMZCwgyA%2Bj9RBkIChgQEWQZDQzIMmQREBgKCBkB9AOEFSAVDggDAfyuFhkBAmRkAQUJFQ4DUgEDCA4VIBUBLP0SDxMKBQH%2BVwsNATIyGQGpAQUKEw%2BWAAAAAAMAAAAABEwErgAdACAAMAAAATUiJy4BLwEBIwEGBw4BDwEVITUiJj8BIRcWBiMVARsBARUUBiMhIiY9ATQ2MyEyFgPoGR4OFgUE%2Ft9F%2FtQSFQkfCwsBETE7EkUBJT0NISf%2B7IZ5AbEdFfwYFR0dFQPoFR0BLDIgDiIKCwLr%2FQ4jFQkTBQUyMisusKYiQTIBhwFW%2Fqr942QVHR0VZBUdHQADAAAAAASwBLAADwBHAEoAABMhMhYVERQGIyEiJjURNDYFIyIHAQYHBgcGHQEUFjMhMjY9ATQmIyInJj8BIRcWBwYjIgYdARQWMyEyNj0BNCYnIicmJyMBJhMjEzIETBUdHRX7tBUdHQJGRg0F%2FtUREhImDAsJAREIDAwINxAKCj8BCjkLEQwYCAwMCAE5CAwLCBEZGQ8B%2FuAFDsVnBLAdFfu0FR0dFQRMFR1SDP0PIBMSEAUNMggMDAgyCAwXDhmjmR8YEQwIMggMDAgyBwwBGRskAuwM%2FgUBCAAABAAAAAAEsASwAAMAEwAjACcAAAEhNSEFITIWFREUBiMhIiY1ETQ2KQEyFhURFAYjISImNRE0NhcRIREEsPtQBLD7ggGQFR0dFf5wFR0dAm0BkBUdHRX%2BcBUdHUcBLARMZMgdFfx8FR0dFQOEFR0dFf5wFR0dFQGQFR1k%2FtQBLAAEAAAAAASwBLAADwAfACMAJwAAEyEyFhURFAYjISImNRE0NgEhMhYVERQGIyEiJjURNDYXESEREyE1ITIBkBUdHRX%2BcBUdHQJtAZAVHR0V%2FnAVHR1HASzI%2B1AEsASwHRX8fBUdHRUDhBUd%2FgwdFf5wFR0dFQGQFR1k%2FtQBLP2oZAAAAAACAAAAZASwA%2BgAJwArAAATITIWFREzNTQ2MyEyFh0BMxUjFRQGIyEiJj0BIxEUBiMhIiY1ETQ2AREhETIBkBUdZB0VAZAVHWRkHRX%2BcBUdZB0V%2FnAVHR0CnwEsA%2BgdFf6ilhUdHRWWZJYVHR0Vlv6iFR0dFQMgFR3%2B1P7UASwAAAQAAAAABLAEsAADABMAFwAnAAAzIxEzFyEyFhURFAYjISImNRE0NhcRIREBITIWFREUBiMhIiY1ETQ2ZGRklgGQFR0dFf5wFR0dRwEs%2FqIDhBUdHRX8fBUdHQSwZB0V%2FnAVHR0VAZAVHWT%2B1AEs%2FgwdFf5wFR0dFQGQFR0AAAAAAgBkAAAETASwACcAKwAAATMyFhURFAYrARUhMhYVERQGIyEiJjURNDYzITUjIiY1ETQ2OwE1MwcRIRECWJYVHR0VlgHCFR0dFfx8FR0dFQFelhUdHRWWZMgBLARMHRX%2BcBUdZB0V%2FnAVHR0VAZAVHWQdFQGQFR1kyP7UASwAAAAEAAAAAASwBLAAAwATABcAJwAAISMRMwUhMhYVERQGIyEiJjURNDYXESERASEyFhURFAYjISImNRE0NgSwZGT9dgGQFR0dFf5wFR0dRwEs%2FK4DhBUdHRX8fBUdHQSwZB0V%2FnAVHR0VAZAVHWT%2B1AEs%2FgwdFf5wFR0dFQGQFR0AAAEBLAAwA28EgAAPAAAJAQYjIiY1ETQ2MzIXARYUA2H%2BEhcSDhAQDhIXAe4OAjX%2BEhcbGQPoGRsX%2FhIOKgAAAAABAUEAMgOEBH4ACwAACQE2FhURFAYnASY0AU8B7h0qKh3%2BEg4CewHuHREp%2FBgpER0B7g4qAAAAAAEAMgFBBH4DhAALAAATITIWBwEGIicBJjZkA%2BgpER3%2BEg4qDv4SHREDhCod%2FhIODgHuHSoAAAAAAQAyASwEfgNvAAsAAAkBFgYjISImNwE2MgJ7Ae4dESn8GCkRHQHuDioDYf4SHSoqHQHuDgAAAAACAAgAAASwBCgABgAKAAABFQE1LQE1ASE1IQK8%2FUwBnf5jBKj84AMgAuW2%2Fr3dwcHd%2B9jIAAAAAAIAAABkBLAEsAALADEAAAEjFTMVIREzNSM1IQEzND4FOwERFAYPARUhNSIuAzURMzIeBRUzESEEsMjI%2FtTIyAEs%2B1AyCAsZEyYYGWQyGRkBkAQOIhoWZBkYJhMZCwgy%2FOADhGRkASxkZP4MFSAVDggDAf3aFhkBAmRkAQUJFQ4CJgEDCA4VIBUBLAAAAgAAAAAETAPoACUAMQAAASM0LgUrAREUFh8BFSE1Mj4DNREjIg4FFSMRIQEjFTMVIREzNSM1IQMgMggLGRMmGBlkMhkZ%2FnAEDiIaFmQZGCYTGQsIMgMgASzIyP7UyMgBLAK8FSAVDggDAf3aFhkCAWRkAQUJFQ4CJgEDCA4VIBUBLPzgZGQBLGRkAAABAMgAZgNyBEoAEgAAATMyFgcJARYGKwEiJwEmNDcBNgK9oBAKDP4wAdAMChCgDQr%2BKQcHAdcKBEoWDP4w%2FjAMFgkB1wgUCAHXCQAAAQE%2BAGYD6ARKABIAAAEzMhcBFhQHAQYrASImNwkBJjYBU6ANCgHXBwf%2BKQoNoBAKDAHQ%2FjAMCgRKCf4pCBQI%2FikJFgwB0AHQDBYAAAEAZgDIBEoDcgASAAAAFh0BFAcBBiInASY9ATQ2FwkBBDQWCf4pCBQI%2FikJFgwB0AHQA3cKEKANCv4pBwcB1woNoBAKDP4wAdAAAAABAGYBPgRKA%2BgAEgAACQEWHQEUBicJAQYmPQE0NwE2MgJqAdcJFgz%2BMP4wDBYJAdcIFAPh%2FikKDaAQCgwB0P4wDAoQoA0KAdcHAAAAAgDZ%2F%2FkEPQSwAAUAOgAAARQGIzQ2BTMyFh8BNjc%2BAh4EBgcOBgcGIiYjIgYiJy4DLwEuAT4EHgEXJyY2A%2BiwfLD%2BVmQVJgdPBQsiKFAzRyorDwURAQQSFyozTSwNOkkLDkc3EDlfNyYHBw8GDyUqPjdGMR%2BTDA0EsHywfLDIHBPCAQIGBwcFDx81S21DBxlLR1xKQhEFBQcHGWt0bCQjP2hJNyATBwMGBcASGAAAAAACAMgAFQOEBLAAFgAaAAATITIWFREUBisBEQcGJjURIyImNRE0NhcVITX6AlgVHR0Vlv8TGpYVHR2rASwEsB0V%2FnAVHf4MsgkQFQKKHRUBkBUdZGRkAAAAAgDIABkETASwAA4AEgAAEyEyFhURBRElIREjETQ2ARU3NfoC7ic9%2FUQCWP1EZB8BDWQEsFEs%2FFt1A7Z9%2FBgEARc0%2FV1kFGQAAQAAAAECTW%2FDBF9fDzz1AB8EsAAAAADQdnOXAAAAANB2c5f%2FUf%2BcBdwFFAAAAAgAAgAAAAAAAAABAAAFFP%2BFAAAFFP9R%2FtQF3AABAAAAAAAAAAAAAAAAAAAAowG4ACgAAAAAAZAAAASwAAAEsABkBLAAAASwAAAEsABwAooAAAUUAAACigAABRQAAAGxAAABRQAAANgAAADYAAAAogAAAQQAAABIAAABBAAAAUUAAASwAGQEsAB7BLAAyASwAMgB9AAABLD%2F8gSwAAAEsAAABLD%2F8ASwAAAEsAAOBLAACQSwAGQEsP%2FTBLD%2F0wSwAAAEsAAABLAAAASwAAAEsAAABLAAJgSwAG4EsAAXBLAAFwSwABcEsABkBLAAGgSwAGQEsAAMBLAAZASwABcEsP%2BcBLAAZASwABcEsAAXBLAAAASwABcEsAAXBLAAFwSwAGQEsAAABLAAZASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAZASwAMgEsAAABLAAAASwADUEsABkBLAAyASw%2F7UEsAAhBLAAAASwAAAEsAAABLAAAASwAAAEsP%2BcBLAAAASwAAAEsAAABLAA2wSwABcEsAB1BLAAAASwAAAEsAAABLAACgSwAMgEsAAABLAAnQSwAMgEsADIBLAAyASwAAAEsP%2F%2BBLABLASwAGQEsACIBLABOwSwABcEsAAXBLAAFwSwABcEsAAXBLAAFwSwAAAEsAAXBLAAFwSwABcEsAAXBLAAAASwALcEsAC3BLAAAASwAAAEsABJBLAAFwSwAAAEsAAABLAAXQSw%2F9wEsP%2FcBLD%2FnwSwAGQEsAAABLAAAASwAAAEsABkBLD%2F%2FwSwAAAEsP9RBLAABgSwAAAEsAAABLABRQSwAAEEsAAABLD%2FnASwAEoEsAAUBLAAAASwAAAEsAAABLD%2FnASwAGEEsP%2F9BLAAFgSwABYEsAAWBLAAFgSwABgEsAAABMQAAASwAGQAAAAAAAD%2F2ABkADkAyAAAAScAZAAZABkAGQAZABkAGQAZAAAAAAAAAAAAAADZAAAAAAAOAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAMAZABkAAAAEAAAAAAAZP%2Bc%2F5z%2FnP%2Bc%2F5z%2FnP%2Bc%2F5wACQAJ%2F%2FL%2F8gBkAHkAJwBkAGQAAAAAAGT%2FogAAAAAAAAAAAAAAAADIAGQAAAABAI8AAP%2Bc%2F5wAZAAEAMgAyAAAAGQBkABkAAAAZAEs%2F7UAAAAAAAAAAAAAAAAAAABkAAABLAFBADIAMgAIAAAAAADIAT4AZgBmANkAyADIAAAAKgAqACoAKgCyAOgA6AFOAU4BTgFOAU4BTgFOAU4BTgFOAU4BTgFOAU4BpAIGAiICfgKGAqwC5ANGA24DjAPEBAgEMgRiBKIE3AVcBboGcgb0ByAHYgfKCB4IYgi%2BCTYJhAm2Cd4KKApMCpQK4gswC4oLygwIDFgNKg1eDbAODg5oDrQPKA%2BmD%2BYQEhBUEJAQqhEqEXYRthIKEjgSfBLAExoTdBPQFCoU1BU8FagVzBYEFjYWYBawFv4XUhemGAIYLhhqGJYYsBjgGP4ZKBloGZQZxBnaGe4aNhpoGrga9hteG7QcMhyUHOIdHB1EHWwdlB28HeYeLh52HsAfYh%2FSIEYgviEyIXYhuCJAIpYiuCMOIyIjOCN6I8Ij4CQCJDAkXiSWJOIlNCVgJbwmFCZ%2BJuYnUCe8J%2FgoNChwKKwpoCnMKiYqSiqEKworeiwILGgsuizsLRwtiC30LiguZi6iLtgvDi9GL34vsi%2F4MD4whDDSMRIxYDGuMegyJDJeMpoy3jMiMz4zaDO2NBg0YDSoNNI1LDWeNeg2PjZ8Ntw3GjdON5I31DgQOEI4hjjIOQo5SjmIOcw6HDpsOpo63jugO9w8GDxQPKI8%2BD0yPew%2BOj6MPtQ%2FKD9uP6o%2F%2BkBIQIBAxkECQX5CGEKoQu5DGENCQ3ZDoEPKRBBEYESuRPZFWkW2RgZGdEa0RvZHNkd2R7ZH9kgWSDJITkhqSIZIzEkSSThJXkmESapKAkouSlIAAQAAARcApwARAAAAAAACAAAAAQABAAAAQAAuAAAAAAAAABAAxgABAAAAAAATABIAAAADAAEECQAAAGoAEgADAAEECQABACgAfAADAAEECQACAA4ApAADAAEECQADAEwAsgADAAEECQAEADgA%2FgADAAEECQAFAHgBNgADAAEECQAGADYBrgADAAEECQAIABYB5AADAAEECQAJABYB%2BgADAAEECQALACQCEAADAAEECQAMACQCNAADAAEECQATACQCWAADAAEECQDIABYCfAADAAEECQDJADACkgADAAEECdkDABoCwnd3dy5nbHlwaGljb25zLmNvbQBDAG8AcAB5AHIAaQBnAGgAdAAgAKkAIAAyADAAMQA0ACAAYgB5ACAASgBhAG4AIABLAG8AdgBhAHIAaQBrAC4AIABBAGwAbAAgAHIAaQBnAGgAdABzACAAcgBlAHMAZQByAHYAZQBkAC4ARwBMAFkAUABIAEkAQwBPAE4AUwAgAEgAYQBsAGYAbABpAG4AZwBzAFIAZQBnAHUAbABhAHIAMQAuADAAMAA5ADsAVQBLAFcATgA7AEcATABZAFAASABJAEMATwBOAFMASABhAGwAZgBsAGkAbgBnAHMALQBSAGUAZwB1AGwAYQByAEcATABZAFAASABJAEMATwBOAFMAIABIAGEAbABmAGwAaQBuAGcAcwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAOQA7AFAAUwAgADAAMAAxAC4AMAAwADkAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARwBMAFkAUABIAEkAQwBPAE4AUwBIAGEAbABmAGwAaQBuAGcAcwAtAFIAZQBnAHUAbABhAHIASgBhAG4AIABLAG8AdgBhAHIAaQBrAEoAYQBuACAASwBvAHYAYQByAGkAawB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQB3AHcAdwAuAGcAbAB5AHAAaABpAGMAbwBuAHMALgBjAG8AbQBXAGUAYgBmAG8AbgB0ACAAMQAuADAAVwBlAGQAIABPAGMAdAAgADIAOQAgADAANgA6ADMANgA6ADAANwAgADIAMAAxADQARgBvAG4AdAAgAFMAcQB1AGkAcgByAGUAbAAAAAIAAAAAAAD%2FtQAyAAAAAAAAAAAAAAAAAAAAAAAAAAABFwAAAQIBAwADAA0ADgEEAJYBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMA7wEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE%2BAT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG%2FAcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB%2BgH7AfwB%2FQH%2BAf8CAAIBAgICAwIEAgUCBgIHAggCCQIKAgsCDAINAg4CDwIQAhECEgZnbHlwaDEGZ2x5cGgyB3VuaTAwQTAHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMkYHdW5pMjA1RgRFdXJvB3VuaTIwQkQHdW5pMjMxQgd1bmkyNUZDB3VuaTI2MDEHdW5pMjZGQQd1bmkyNzA5B3VuaTI3MEYHdW5pRTAwMQd1bmlFMDAyB3VuaUUwMDMHdW5pRTAwNQd1bmlFMDA2B3VuaUUwMDcHdW5pRTAwOAd1bmlFMDA5B3VuaUUwMTAHdW5pRTAxMQd1bmlFMDEyB3VuaUUwMTMHdW5pRTAxNAd1bmlFMDE1B3VuaUUwMTYHdW5pRTAxNwd1bmlFMDE4B3VuaUUwMTkHdW5pRTAyMAd1bmlFMDIxB3VuaUUwMjIHdW5pRTAyMwd1bmlFMDI0B3VuaUUwMjUHdW5pRTAyNgd1bmlFMDI3B3VuaUUwMjgHdW5pRTAyOQd1bmlFMDMwB3VuaUUwMzEHdW5pRTAzMgd1bmlFMDMzB3VuaUUwMzQHdW5pRTAzNQd1bmlFMDM2B3VuaUUwMzcHdW5pRTAzOAd1bmlFMDM5B3VuaUUwNDAHdW5pRTA0MQd1bmlFMDQyB3VuaUUwNDMHdW5pRTA0NAd1bmlFMDQ1B3VuaUUwNDYHdW5pRTA0Nwd1bmlFMDQ4B3VuaUUwNDkHdW5pRTA1MAd1bmlFMDUxB3VuaUUwNTIHdW5pRTA1Mwd1bmlFMDU0B3VuaUUwNTUHdW5pRTA1Ngd1bmlFMDU3B3VuaUUwNTgHdW5pRTA1OQd1bmlFMDYwB3VuaUUwNjIHdW5pRTA2Mwd1bmlFMDY0B3VuaUUwNjUHdW5pRTA2Ngd1bmlFMDY3B3VuaUUwNjgHdW5pRTA2OQd1bmlFMDcwB3VuaUUwNzEHdW5pRTA3Mgd1bmlFMDczB3VuaUUwNzQHdW5pRTA3NQd1bmlFMDc2B3VuaUUwNzcHdW5pRTA3OAd1bmlFMDc5B3VuaUUwODAHdW5pRTA4MQd1bmlFMDgyB3VuaUUwODMHdW5pRTA4NAd1bmlFMDg1B3VuaUUwODYHdW5pRTA4Nwd1bmlFMDg4B3VuaUUwODkHdW5pRTA5MAd1bmlFMDkxB3VuaUUwOTIHdW5pRTA5Mwd1bmlFMDk0B3VuaUUwOTUHdW5pRTA5Ngd1bmlFMDk3B3VuaUUxMDEHdW5pRTEwMgd1bmlFMTAzB3VuaUUxMDQHdW5pRTEwNQd1bmlFMTA2B3VuaUUxMDcHdW5pRTEwOAd1bmlFMTA5B3VuaUUxMTAHdW5pRTExMQd1bmlFMTEyB3VuaUUxMTMHdW5pRTExNAd1bmlFMTE1B3VuaUUxMTYHdW5pRTExNwd1bmlFMTE4B3VuaUUxMTkHdW5pRTEyMAd1bmlFMTIxB3VuaUUxMjIHdW5pRTEyMwd1bmlFMTI0B3VuaUUxMjUHdW5pRTEyNgd1bmlFMTI3B3VuaUUxMjgHdW5pRTEyOQd1bmlFMTMwB3VuaUUxMzEHdW5pRTEzMgd1bmlFMTMzB3VuaUUxMzQHdW5pRTEzNQd1bmlFMTM2B3VuaUUxMzcHdW5pRTEzOAd1bmlFMTM5B3VuaUUxNDAHdW5pRTE0MQd1bmlFMTQyB3VuaUUxNDMHdW5pRTE0NAd1bmlFMTQ1B3VuaUUxNDYHdW5pRTE0OAd1bmlFMTQ5B3VuaUUxNTAHdW5pRTE1MQd1bmlFMTUyB3VuaUUxNTMHdW5pRTE1NAd1bmlFMTU1B3VuaUUxNTYHdW5pRTE1Nwd1bmlFMTU4B3VuaUUxNTkHdW5pRTE2MAd1bmlFMTYxB3VuaUUxNjIHdW5pRTE2Mwd1bmlFMTY0B3VuaUUxNjUHdW5pRTE2Ngd1bmlFMTY3B3VuaUUxNjgHdW5pRTE2OQd1bmlFMTcwB3VuaUUxNzEHdW5pRTE3Mgd1bmlFMTczB3VuaUUxNzQHdW5pRTE3NQd1bmlFMTc2B3VuaUUxNzcHdW5pRTE3OAd1bmlFMTc5B3VuaUUxODAHdW5pRTE4MQd1bmlFMTgyB3VuaUUxODMHdW5pRTE4NAd1bmlFMTg1B3VuaUUxODYHdW5pRTE4Nwd1bmlFMTg4B3VuaUUxODkHdW5pRTE5MAd1bmlFMTkxB3VuaUUxOTIHdW5pRTE5Mwd1bmlFMTk0B3VuaUUxOTUHdW5pRTE5Nwd1bmlFMTk4B3VuaUUxOTkHdW5pRTIwMAd1bmlFMjAxB3VuaUUyMDIHdW5pRTIwMwd1bmlFMjA0B3VuaUUyMDUHdW5pRTIwNgd1bmlFMjA5B3VuaUUyMTAHdW5pRTIxMQd1bmlFMjEyB3VuaUUyMTMHdW5pRTIxNAd1bmlFMjE1B3VuaUUyMTYHdW5pRTIxOAd1bmlFMjE5B3VuaUUyMjEHdW5pRTIyMwd1bmlFMjI0B3VuaUUyMjUHdW5pRTIyNgd1bmlFMjI3B3VuaUUyMzAHdW5pRTIzMQd1bmlFMjMyB3VuaUUyMzMHdW5pRTIzNAd1bmlFMjM1B3VuaUUyMzYHdW5pRTIzNwd1bmlFMjM4B3VuaUUyMzkHdW5pRTI0MAd1bmlFMjQxB3VuaUUyNDIHdW5pRTI0Mwd1bmlFMjQ0B3VuaUUyNDUHdW5pRTI0Ngd1bmlFMjQ3B3VuaUUyNDgHdW5pRTI0OQd1bmlFMjUwB3VuaUUyNTEHdW5pRTI1Mgd1bmlFMjUzB3VuaUUyNTQHdW5pRTI1NQd1bmlFMjU2B3VuaUUyNTcHdW5pRTI1OAd1bmlFMjU5B3VuaUUyNjAHdW5pRjhGRgZ1MUY1MTEGdTFGNkFBAAAAAAFUUMMXAAA%3D%29%20format%28%27truetype%27%29%2Curl%28data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI%2FPgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE%2BPC9tZXRhZGF0YT4KPGRlZnM%2BCjxmb250IGlkPSJnbHlwaGljb25zX2hhbGZsaW5nc3JlZ3VsYXIiIGhvcml6LWFkdi14PSIxMjAwIiA%2BCjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMjAwIiBhc2NlbnQ9Ijk2MCIgZGVzY2VudD0iLTI0MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIGhvcml6LWFkdi14PSIwIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjQwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiIC8%2BCjxnbHlwaCB1bmljb2RlPSIqIiBkPSJNNjAwIDExMDBxMTUgMCAzNCAtMS41dDMwIC0zLjVsMTEgLTFxMTAgLTIgMTcuNSAtMTAuNXQ3LjUgLTE4LjV2LTIyNGwxNTggMTU4cTcgNyAxOCA4dDE5IC02bDEwNiAtMTA2cTcgLTggNiAtMTl0LTggLTE4bC0xNTggLTE1OGgyMjRxMTAgMCAxOC41IC03LjV0MTAuNSAtMTcuNXE2IC00MSA2IC03NXEwIC0xNSAtMS41IC0zNHQtMy41IC0zMGwtMSAtMTFxLTIgLTEwIC0xMC41IC0xNy41dC0xOC41IC03LjVoLTIyNGwxNTggLTE1OCBxNyAtNyA4IC0xOHQtNiAtMTlsLTEwNiAtMTA2cS04IC03IC0xOSAtNnQtMTggOGwtMTU4IDE1OHYtMjI0cTAgLTEwIC03LjUgLTE4LjV0LTE3LjUgLTEwLjVxLTQxIC02IC03NSAtNnEtMTUgMCAtMzQgMS41dC0zMCAzLjVsLTExIDFxLTEwIDIgLTE3LjUgMTAuNXQtNy41IDE4LjV2MjI0bC0xNTggLTE1OHEtNyAtNyAtMTggLTh0LTE5IDZsLTEwNiAxMDZxLTcgOCAtNiAxOXQ4IDE4bDE1OCAxNThoLTIyNHEtMTAgMCAtMTguNSA3LjUgdC0xMC41IDE3LjVxLTYgNDEgLTYgNzVxMCAxNSAxLjUgMzR0My41IDMwbDEgMTFxMiAxMCAxMC41IDE3LjV0MTguNSA3LjVoMjI0bC0xNTggMTU4cS03IDcgLTggMTh0NiAxOWwxMDYgMTA2cTggNyAxOSA2dDE4IC04bDE1OCAtMTU4djIyNHEwIDEwIDcuNSAxOC41dDE3LjUgMTAuNXE0MSA2IDc1IDZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ1MCAxMTAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMzUwaDM1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0zNTB2LTM1MHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYzNTBoLTM1MHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNSBoMzUwdjM1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTU7IiBkPSJNODI1IDExMDBoMjUwcTEwIDAgMTIuNSAtNXQtNS41IC0xM2wtMzY0IC0zNjRxLTYgLTYgLTExIC0xOGgyNjhxMTAgMCAxMyAtNnQtMyAtMTRsLTEyMCAtMTYwcS02IC04IC0xOCAtMTR0LTIyIC02aC0xMjV2LTEwMGgyNzVxMTAgMCAxMyAtNnQtMyAtMTRsLTEyMCAtMTYwcS02IC04IC0xOCAtMTR0LTIyIC02aC0xMjV2LTE3NHEwIC0xMSAtNy41IC0xOC41dC0xOC41IC03LjVoLTE0OHEtMTEgMCAtMTguNSA3LjV0LTcuNSAxOC41djE3NCBoLTI3NXEtMTAgMCAtMTMgNnQzIDE0bDEyMCAxNjBxNiA4IDE4IDE0dDIyIDZoMTI1djEwMGgtMjc1cS0xMCAwIC0xMyA2dDMgMTRsMTIwIDE2MHE2IDggMTggMTR0MjIgNmgxMThxLTUgMTIgLTExIDE4bC0zNjQgMzY0cS04IDggLTUuNSAxM3QxMi41IDVoMjUwcTI1IDAgNDMgLTE4bDE2NCAtMTY0cTggLTggMTggLTh0MTggOGwxNjQgMTY0cTE4IDE4IDQzIDE4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwMDA7IiBob3Jpei1hZHYteD0iNjUwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjAwMTsiIGhvcml6LWFkdi14PSIxMzAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjAwMjsiIGhvcml6LWFkdi14PSI2NTAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMDAzOyIgaG9yaXotYWR2LXg9IjEzMDAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMDA0OyIgaG9yaXotYWR2LXg9IjQzMyIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwMDU7IiBob3Jpei1hZHYteD0iMzI1IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjAwNjsiIGhvcml6LWFkdi14PSIyMTYiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMDA3OyIgaG9yaXotYWR2LXg9IjIxNiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwMDg7IiBob3Jpei1hZHYteD0iMTYyIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjAwOTsiIGhvcml6LWFkdi14PSIyNjAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMDBhOyIgaG9yaXotYWR2LXg9IjcyIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjAyZjsiIGhvcml6LWFkdi14PSIyNjAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMDVmOyIgaG9yaXotYWR2LXg9IjMyNSIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwYWM7IiBkPSJNNzQ0IDExOThxMjQyIDAgMzU0IC0xODlxNjAgLTEwNCA2NiAtMjA5aC0xODFxMCA0NSAtMTcuNSA4Mi41dC00My41IDYxLjV0LTU4IDQwLjV0LTYwLjUgMjR0LTUxLjUgNy41cS0xOSAwIC00MC41IC01LjV0LTQ5LjUgLTIwLjV0LTUzIC0zOHQtNDkgLTYyLjV0LTM5IC04OS41aDM3OWwtMTAwIC0xMDBoLTMwMHEtNiAtNTAgLTYgLTEwMGg0MDZsLTEwMCAtMTAwaC0zMDBxOSAtNzQgMzMgLTEzMnQ1Mi41IC05MXQ2MS41IC01NC41dDU5IC0yOSB0NDcgLTcuNXEyMiAwIDUwLjUgNy41dDYwLjUgMjQuNXQ1OCA0MXQ0My41IDYxdDE3LjUgODBoMTc0cS0zMCAtMTcxIC0xMjggLTI3OHEtMTA3IC0xMTcgLTI3NCAtMTE3cS0yMDYgMCAtMzI0IDE1OHEtMzYgNDggLTY5IDEzM3QtNDUgMjA0aC0yMTdsMTAwIDEwMGgxMTJxMSA0NyA2IDEwMGgtMjE4bDEwMCAxMDBoMTM0cTIwIDg3IDUxIDE1My41dDYyIDEwMy41cTExNyAxNDEgMjk3IDE0MXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyMGJkOyIgZD0iTTQyOCAxMjAwaDM1MHE2NyAwIDEyMCAtMTN0ODYgLTMxdDU3IC00OS41dDM1IC01Ni41dDE3IC02NC41dDYuNSAtNjAuNXQwLjUgLTU3di0xNi41di0xNi41cTAgLTM2IC0wLjUgLTU3dC02LjUgLTYxdC0xNyAtNjV0LTM1IC01N3QtNTcgLTUwLjV0LTg2IC0zMS41dC0xMjAgLTEzaC0xNzhsLTIgLTEwMGgyODhxMTAgMCAxMyAtNnQtMyAtMTRsLTEyMCAtMTYwcS02IC04IC0xOCAtMTR0LTIyIC02aC0xMzh2LTE3NXEwIC0xMSAtNS41IC0xOCB0LTE1LjUgLTdoLTE0OXEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE3NWgtMjY3cS0xMCAwIC0xMyA2dDMgMTRsMTIwIDE2MHE2IDggMTggMTR0MjIgNmgxMTd2MTAwaC0yNjdxLTEwIDAgLTEzIDZ0MyAxNGwxMjAgMTYwcTYgOCAxOCAxNHQyMiA2aDExN3Y0NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNNjAwIDEwMDB2LTMwMGgyMDNxNjQgMCA4Ni41IDMzdDIyLjUgMTE5cTAgODQgLTIyLjUgMTE2dC04Ni41IDMyaC0yMDN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjIxMjsiIGQ9Ik0yNTAgNzAwaDgwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC04MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjMxYjsiIGQ9Ik0xMDAwIDEyMDB2LTE1MHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTB2LTEwMHEwIC05MSAtNDkuNSAtMTY1LjV0LTEzMC41IC0xMDkuNXE4MSAtMzUgMTMwLjUgLTEwOS41dDQ5LjUgLTE2NS41di0xNTBoNTBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTE1MGgtODAwdjE1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoNTB2MTUwcTAgOTEgNDkuNSAxNjUuNXQxMzAuNSAxMDkuNXEtODEgMzUgLTEzMC41IDEwOS41IHQtNDkuNSAxNjUuNXYxMDBoLTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxNTBoODAwek00MDAgMTAwMHYtMTAwcTAgLTYwIDMyLjUgLTEwOS41dDg3LjUgLTczLjVxMjggLTEyIDQ0IC0zN3QxNiAtNTV0LTE2IC01NXQtNDQgLTM3cS01NSAtMjQgLTg3LjUgLTczLjV0LTMyLjUgLTEwOS41di0xNTBoNDAwdjE1MHEwIDYwIC0zMi41IDEwOS41dC04Ny41IDczLjVxLTI4IDEyIC00NCAzN3QtMTYgNTV0MTYgNTV0NDQgMzcgcTU1IDI0IDg3LjUgNzMuNXQzMi41IDEwOS41djEwMGgtNDAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI1ZmM7IiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMCAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2MDE7IiBkPSJNNTAzIDEwODlxMTEwIDAgMjAwLjUgLTU5LjV0MTM0LjUgLTE1Ni41cTQ0IDE0IDkwIDE0cTEyMCAwIDIwNSAtODYuNXQ4NSAtMjA2LjVxMCAtMTIxIC04NSAtMjA3LjV0LTIwNSAtODYuNWgtNzUwcS03OSAwIC0xMzUuNSA1N3QtNTYuNSAxMzdxMCA2OSA0Mi41IDEyMi41dDEwOC41IDY3LjVxLTIgMTIgLTIgMzdxMCAxNTMgMTA4IDI2MC41dDI2MCAxMDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyNmZhOyIgZD0iTTc3NCAxMTkzLjVxMTYgLTkuNSAyMC41IC0yN3QtNS41IC0zMy41bC0xMzYgLTE4N2w0NjcgLTc0NmgzMHEyMCAwIDM1IC0xOC41dDE1IC0zOS41di00MmgtMTIwMHY0MnEwIDIxIDE1IDM5LjV0MzUgMTguNWgzMGw0NjggNzQ2bC0xMzUgMTgzcS0xMCAxNiAtNS41IDM0dDIwLjUgMjh0MzQgNS41dDI4IC0yMC41bDExMSAtMTQ4bDExMiAxNTBxOSAxNiAyNyAyMC41dDM0IC01ek02MDAgMjAwaDM3N2wtMTgyIDExMmwtMTk1IDUzNHYtNjQ2eiAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3gyNzA5OyIgZD0iTTI1IDExMDBoMTE1MHExMCAwIDEyLjUgLTV0LTUuNSAtMTNsLTU2NCAtNTY3cS04IC04IC0xOCAtOHQtMTggOGwtNTY0IDU2N3EtOCA4IC01LjUgMTN0MTIuNSA1ek0xOCA4ODJsMjY0IC0yNjRxOCAtOCA4IC0xOHQtOCAtMThsLTI2NCAtMjY0cS04IC04IC0xMyAtNS41dC01IDEyLjV2NTUwcTAgMTAgNSAxMi41dDEzIC01LjV6TTkxOCA2MThsMjY0IDI2NHE4IDggMTMgNS41dDUgLTEyLjV2LTU1MHEwIC0xMCAtNSAtMTIuNXQtMTMgNS41IGwtMjY0IDI2NHEtOCA4IC04IDE4dDggMTh6TTgxOCA0ODJsMzY0IC0zNjRxOCAtOCA1LjUgLTEzdC0xMi41IC01aC0xMTUwcS0xMCAwIC0xMi41IDV0NS41IDEzbDM2NCAzNjRxOCA4IDE4IDh0MTggLThsMTY0IC0xNjRxOCAtOCAxOCAtOHQxOCA4bDE2NCAxNjRxOCA4IDE4IDh0MTggLTh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjcwZjsiIGQ9Ik0xMDExIDEyMTBxMTkgMCAzMyAtMTNsMTUzIC0xNTNxMTMgLTE0IDEzIC0zM3QtMTMgLTMzbC05OSAtOTJsLTIxNCAyMTRsOTUgOTZxMTMgMTQgMzIgMTR6TTEwMTMgODAwbC02MTUgLTYxNGwtMjE0IDIxNGw2MTQgNjE0ek0zMTcgOTZsLTMzMyAtMTEybDExMCAzMzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAwMTsiIGQ9Ik03MDAgNjUwdi01NTBoMjUwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGgtODAwdjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgyNTB2NTUwbC01MDAgNTUwaDEyMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAwMjsiIGQ9Ik0zNjggMTAxN2w2NDUgMTYzcTM5IDE1IDYzIDB0MjQgLTQ5di04MzFxMCAtNTUgLTQxLjUgLTk1LjV0LTExMS41IC02My41cS03OSAtMjUgLTE0NyAtNC41dC04NiA3NXQyNS41IDExMS41dDEyMi41IDgycTcyIDI0IDEzOCA4djUyMWwtNjAwIC0xNTV2LTYwNnEwIC00MiAtNDQgLTkwdC0xMDkgLTY5cS03OSAtMjYgLTE0NyAtNS41dC04NiA3NS41dDI1LjUgMTExLjV0MTIyLjUgODIuNXE3MiAyNCAxMzggN3Y2MzlxMCAzOCAxNC41IDU5IHQ1My41IDM0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMDM7IiBkPSJNNTAwIDExOTFxMTAwIDAgMTkxIC0zOXQxNTYuNSAtMTA0LjV0MTA0LjUgLTE1Ni41dDM5IC0xOTFsLTEgLTJsMSAtNXEwIC0xNDEgLTc4IC0yNjJsMjc1IC0yNzRxMjMgLTI2IDIyLjUgLTQ0LjV0LTIyLjUgLTQyLjVsLTU5IC01OHEtMjYgLTIwIC00Ni41IC0yMHQtMzkuNSAyMGwtMjc1IDI3NHEtMTE5IC03NyAtMjYxIC03N2wtNSAxbC0yIC0xcS0xMDAgMCAtMTkxIDM5dC0xNTYuNSAxMDQuNXQtMTA0LjUgMTU2LjV0LTM5IDE5MSB0MzkgMTkxdDEwNC41IDE1Ni41dDE1Ni41IDEwNC41dDE5MSAzOXpNNTAwIDEwMjJxLTg4IDAgLTE2MiAtNDN0LTExNyAtMTE3dC00MyAtMTYydDQzIC0xNjJ0MTE3IC0xMTd0MTYyIC00M3QxNjIgNDN0MTE3IDExN3Q0MyAxNjJ0LTQzIDE2MnQtMTE3IDExN3QtMTYyIDQzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMDU7IiBkPSJNNjQ5IDk0OXE0OCA2OCAxMDkuNSAxMDR0MTIxLjUgMzguNXQxMTguNSAtMjB0MTAyLjUgLTY0dDcxIC0xMDAuNXQyNyAtMTIzcTAgLTU3IC0zMy41IC0xMTcuNXQtOTQgLTEyNC41dC0xMjYuNSAtMTI3LjV0LTE1MCAtMTUyLjV0LTE0NiAtMTc0cS02MiA4NSAtMTQ1LjUgMTc0dC0xNTAgMTUyLjV0LTEyNi41IDEyNy41dC05My41IDEyNC41dC0zMy41IDExNy41cTAgNjQgMjggMTIzdDczIDEwMC41dDEwNCA2NHQxMTkgMjAgdDEyMC41IC0zOC41dDEwNC41IC0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAwNjsiIGQ9Ik00MDcgODAwbDEzMSAzNTNxNyAxOSAxNy41IDE5dDE3LjUgLTE5bDEyOSAtMzUzaDQyMXEyMSAwIDI0IC04LjV0LTE0IC0yMC41bC0zNDIgLTI0OWwxMzAgLTQwMXE3IC0yMCAtMC41IC0yNS41dC0yNC41IDYuNWwtMzQzIDI0NmwtMzQyIC0yNDdxLTE3IC0xMiAtMjQuNSAtNi41dC0wLjUgMjUuNWwxMzAgNDAwbC0zNDcgMjUxcS0xNyAxMiAtMTQgMjAuNXQyMyA4LjVoNDI5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMDc7IiBkPSJNNDA3IDgwMGwxMzEgMzUzcTcgMTkgMTcuNSAxOXQxNy41IC0xOWwxMjkgLTM1M2g0MjFxMjEgMCAyNCAtOC41dC0xNCAtMjAuNWwtMzQyIC0yNDlsMTMwIC00MDFxNyAtMjAgLTAuNSAtMjUuNXQtMjQuNSA2LjVsLTM0MyAyNDZsLTM0MiAtMjQ3cS0xNyAtMTIgLTI0LjUgLTYuNXQtMC41IDI1LjVsMTMwIDQwMGwtMzQ3IDI1MXEtMTcgMTIgLTE0IDIwLjV0MjMgOC41aDQyOXpNNDc3IDcwMGgtMjQwbDE5NyAtMTQybC03NCAtMjI2IGwxOTMgMTM5bDE5NSAtMTQwbC03NCAyMjlsMTkyIDE0MGgtMjM0bC03OCAyMTF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAwODsiIGQ9Ik02MDAgMTIwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJ2LTI1MHEwIC00NiAtMzEgLTk4dC02OSAtNTJ2LTc1cTAgLTEwIDYgLTIxLjV0MTUgLTE3LjVsMzU4IC0yMzBxOSAtNSAxNSAtMTYuNXQ2IC0yMS41di05M3EwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTExNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY5M3EwIDEwIDYgMjEuNXQxNSAxNi41bDM1OCAyMzBxOSA2IDE1IDE3LjV0NiAyMS41djc1cS0zOCAwIC02OSA1MiB0LTMxIDk4djI1MHEwIDEyNCA4OCAyMTJ0MjEyIDg4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMDk7IiBkPSJNMjUgMTEwMGgxMTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTA1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTExNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxMDUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTEwMCAxMDAwdi0xMDBoMTAwdjEwMGgtMTAwek04NzUgMTAwMGgtNTUwcS0xMCAwIC0xNy41IC03LjV0LTcuNSAtMTcuNXYtMzUwcTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoNTUwIHExMCAwIDE3LjUgNy41dDcuNSAxNy41djM1MHEwIDEwIC03LjUgMTcuNXQtMTcuNSA3LjV6TTEwMDAgMTAwMHYtMTAwaDEwMHYxMDBoLTEwMHpNMTAwIDgwMHYtMTAwaDEwMHYxMDBoLTEwMHpNMTAwMCA4MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTEwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTEwMDAgNjAwdi0xMDBoMTAwdjEwMGgtMTAwek04NzUgNTAwaC01NTBxLTEwIDAgLTE3LjUgLTcuNXQtNy41IC0xNy41di0zNTBxMCAtMTAgNy41IC0xNy41IHQxNy41IC03LjVoNTUwcTEwIDAgMTcuNSA3LjV0Ny41IDE3LjV2MzUwcTAgMTAgLTcuNSAxNy41dC0xNy41IDcuNXpNMTAwIDQwMHYtMTAwaDEwMHYxMDBoLTEwMHpNMTAwMCA0MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTEwMCAyMDB2LTEwMGgxMDB2MTAwaC0xMDB6TTEwMDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMTA7IiBkPSJNNTAgMTEwMGg0MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek02NTAgMTEwMGg0MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDAgcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgNTAwaDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTY1MCA1MDBoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMTsiIGQ9Ik01MCAxMTAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQ1MCAxMTAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek04NTAgMTEwMGgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA3MDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQ1MCA3MDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNODUwIDcwMGgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMCBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgMzAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQ1MCAzMDBoMjAwIHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTg1MCAzMDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41IHQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMjsiIGQ9Ik01MCAxMTAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQ1MCAxMTAwaDcwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC03MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA3MDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNDUwIDcwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNzAwIHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgMzAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQ1MCAzMDBoNzAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDAgcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC03MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMzsiIGQ9Ik00NjUgNDc3bDU3MSA1NzFxOCA4IDE4IDh0MTcgLThsMTc3IC0xNzdxOCAtNyA4IC0xN3QtOCAtMThsLTc4MyAtNzg0cS03IC04IC0xNy41IC04dC0xNy41IDhsLTM4NCAzODRxLTggOCAtOCAxOHQ4IDE3bDE3NyAxNzdxNyA4IDE3IDh0MTggLThsMTcxIC0xNzFxNyAtNyAxOCAtN3QxOCA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMTQ7IiBkPSJNOTA0IDEwODNsMTc4IC0xNzlxOCAtOCA4IC0xOC41dC04IC0xNy41bC0yNjcgLTI2OGwyNjcgLTI2OHE4IC03IDggLTE3LjV0LTggLTE4LjVsLTE3OCAtMTc4cS04IC04IC0xOC41IC04dC0xNy41IDhsLTI2OCAyNjdsLTI2OCAtMjY3cS03IC04IC0xNy41IC04dC0xOC41IDhsLTE3OCAxNzhxLTggOCAtOCAxOC41dDggMTcuNWwyNjcgMjY4bC0yNjcgMjY4cS04IDcgLTggMTcuNXQ4IDE4LjVsMTc4IDE3OHE4IDggMTguNSA4dDE3LjUgLTggbDI2OCAtMjY3bDI2OCAyNjhxNyA3IDE3LjUgN3QxOC41IC03eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMTU7IiBkPSJNNTA3IDExNzdxOTggMCAxODcuNSAtMzguNXQxNTQuNSAtMTAzLjV0MTAzLjUgLTE1NC41dDM4LjUgLTE4Ny41cTAgLTE0MSAtNzggLTI2MmwzMDAgLTI5OXE4IC04IDggLTE4LjV0LTggLTE4LjVsLTEwOSAtMTA4cS03IC04IC0xNy41IC04dC0xOC41IDhsLTMwMCAyOTlxLTExOSAtNzcgLTI2MSAtNzdxLTk4IDAgLTE4OCAzOC41dC0xNTQuNSAxMDN0LTEwMyAxNTQuNXQtMzguNSAxODh0MzguNSAxODcuNXQxMDMgMTU0LjUgdDE1NC41IDEwMy41dDE4OCAzOC41ek01MDYuNSAxMDIzcS04OS41IDAgLTE2NS41IC00NHQtMTIwIC0xMjAuNXQtNDQgLTE2NnQ0NCAtMTY1LjV0MTIwIC0xMjB0MTY1LjUgLTQ0dDE2NiA0NHQxMjAuNSAxMjB0NDQgMTY1LjV0LTQ0IDE2NnQtMTIwLjUgMTIwLjV0LTE2NiA0NHpNNDI1IDkwMGgxNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di03NWg3NXExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41IHQtMTcuNSAtNy41aC03NXYtNzVxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0xNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY3NWgtNzVxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWg3NXY3NXEwIDEwIDcuNSAxNy41dDE3LjUgNy41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMTY7IiBkPSJNNTA3IDExNzdxOTggMCAxODcuNSAtMzguNXQxNTQuNSAtMTAzLjV0MTAzLjUgLTE1NC41dDM4LjUgLTE4Ny41cTAgLTE0MSAtNzggLTI2MmwzMDAgLTI5OXE4IC04IDggLTE4LjV0LTggLTE4LjVsLTEwOSAtMTA4cS03IC04IC0xNy41IC04dC0xOC41IDhsLTMwMCAyOTlxLTExOSAtNzcgLTI2MSAtNzdxLTk4IDAgLTE4OCAzOC41dC0xNTQuNSAxMDN0LTEwMyAxNTQuNXQtMzguNSAxODh0MzguNSAxODcuNXQxMDMgMTU0LjUgdDE1NC41IDEwMy41dDE4OCAzOC41ek01MDYuNSAxMDIzcS04OS41IDAgLTE2NS41IC00NHQtMTIwIC0xMjAuNXQtNDQgLTE2NnQ0NCAtMTY1LjV0MTIwIC0xMjB0MTY1LjUgLTQ0dDE2NiA0NHQxMjAuNSAxMjB0NDQgMTY1LjV0LTQ0IDE2NnQtMTIwLjUgMTIwLjV0LTE2NiA0NHpNMzI1IDgwMGgzNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0zNTBxLTEwIDAgLTE3LjUgNy41IHQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAxNzsiIGQ9Ik01NTAgMTIwMGgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek04MDAgOTc1djE2NnExNjcgLTYyIDI3MiAtMjA5LjV0MTA1IC0zMzEuNXEwIC0xMTcgLTQ1LjUgLTIyNHQtMTIzIC0xODQuNXQtMTg0LjUgLTEyM3QtMjI0IC00NS41dC0yMjQgNDUuNSB0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHEwIDE4NCAxMDUgMzMxLjV0MjcyIDIwOS41di0xNjZxLTEwMyAtNTUgLTE2NSAtMTU1dC02MiAtMjIwcTAgLTExNiA1NyAtMjE0LjV0MTU1LjUgLTE1NS41dDIxNC41IC01N3QyMTQuNSA1N3QxNTUuNSAxNTUuNXQ1NyAyMTQuNXEwIDEyMCAtNjIgMjIwdC0xNjUgMTU1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMTg7IiBkPSJNMTAyNSAxMjAwaDE1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTExNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0xNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxMTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTcyNSA4MDBoMTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNzUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2NzUwIHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek00MjUgNTAwaDE1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTQ1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djQ1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek0xMjUgMzAwaDE1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTI1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41IHYyNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDE5OyIgZD0iTTYwMCAxMTc0cTMzIDAgNzQgLTVsMzggLTE1Mmw1IC0xcTQ5IC0xNCA5NCAtMzlsNSAtMmwxMzQgODBxNjEgLTQ4IDEwNCAtMTA1bC04MCAtMTM0bDMgLTVxMjUgLTQ0IDM5IC05M2wxIC02bDE1MiAtMzhxNSAtNDMgNSAtNzNxMCAtMzQgLTUgLTc0bC0xNTIgLTM4bC0xIC02cS0xNSAtNDkgLTM5IC05M2wtMyAtNWw4MCAtMTM0cS00OCAtNjEgLTEwNCAtMTA1bC0xMzQgODFsLTUgLTNxLTQ0IC0yNSAtOTQgLTM5bC01IC0ybC0zOCAtMTUxIHEtNDMgLTUgLTc0IC01cS0zMyAwIC03NCA1bC0zOCAxNTFsLTUgMnEtNDkgMTQgLTk0IDM5bC01IDNsLTEzNCAtODFxLTYwIDQ4IC0xMDQgMTA1bDgwIDEzNGwtMyA1cS0yNSA0NSAtMzggOTNsLTIgNmwtMTUxIDM4cS02IDQyIC02IDc0cTAgMzMgNiA3M2wxNTEgMzhsMiA2cTEzIDQ4IDM4IDkzbDMgNWwtODAgMTM0cTQ3IDYxIDEwNSAxMDVsMTMzIC04MGw1IDJxNDUgMjUgOTQgMzlsNSAxbDM4IDE1MnE0MyA1IDc0IDV6TTYwMCA4MTUgcS04OSAwIC0xNTIgLTYzdC02MyAtMTUxLjV0NjMgLTE1MS41dDE1MiAtNjN0MTUyIDYzdDYzIDE1MS41dC02MyAxNTEuNXQtMTUyIDYzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMjA7IiBkPSJNNTAwIDEzMDBoMzAwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41di0xMDBoMjc1cTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNzVoLTExMDB2NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgyNzV2MTAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNXpNNTAwIDEyMDB2LTEwMGgzMDB2MTAwaC0zMDB6TTExMDAgOTAwdi04MDBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTcwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjUgdjgwMGg5MDB6TTMwMCA4MDB2LTcwMGgxMDB2NzAwaC0xMDB6TTUwMCA4MDB2LTcwMGgxMDB2NzAwaC0xMDB6TTcwMCA4MDB2LTcwMGgxMDB2NzAwaC0xMDB6TTkwMCA4MDB2LTcwMGgxMDB2NzAwaC0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAyMTsiIGQ9Ik0xOCA2MThsNjIwIDYwOHE4IDcgMTguNSA3dDE3LjUgLTdsNjA4IC02MDhxOCAtOCA1LjUgLTEzdC0xMi41IC01aC0xNzV2LTU3NXEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTI1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djM3NWgtMzAwdi0zNzVxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1NzVoLTE3NXEtMTAgMCAtMTIuNSA1dDUuNSAxM3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDIyOyIgZD0iTTYwMCAxMjAwdi00MDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDMwMHYtNjUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC04MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djExMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDQ1MHpNMTAwMCA4MDBoLTI1MHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MjUweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMjM7IiBkPSJNNjAwIDExNzdxMTE3IDAgMjI0IC00NS41dDE4NC41IC0xMjN0MTIzIC0xODQuNXQ0NS41IC0yMjR0LTQ1LjUgLTIyNHQtMTIzIC0xODQuNXQtMTg0LjUgLTEyM3QtMjI0IC00NS41dC0yMjQgNDUuNXQtMTg0LjUgMTIzdC0xMjMgMTg0LjV0LTQ1LjUgMjI0dDQ1LjUgMjI0dDEyMyAxODQuNXQxODQuNSAxMjN0MjI0IDQ1LjV6TTYwMCAxMDI3cS0xMTYgMCAtMjE0LjUgLTU3dC0xNTUuNSAtMTU1LjV0LTU3IC0yMTQuNXQ1NyAtMjE0LjUgdDE1NS41IC0xNTUuNXQyMTQuNSAtNTd0MjE0LjUgNTd0MTU1LjUgMTU1LjV0NTcgMjE0LjV0LTU3IDIxNC41dC0xNTUuNSAxNTUuNXQtMjE0LjUgNTd6TTUyNSA5MDBoNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0yNzVoMTc1cTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYzNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDI0OyIgZD0iTTEzMDAgMGgtNTM4bC00MSA0MDBoLTI0MmwtNDEgLTQwMGgtNTM4bDQzMSAxMjAwaDIwOWwtMjEgLTMwMGgxNjJsLTIwIDMwMGgyMDh6TTUxNSA4MDBsLTI3IC0zMDBoMjI0bC0yNyAzMDBoLTE3MHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDI1OyIgZD0iTTU1MCAxMjAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDUwaDE5MXEyMCAwIDI1LjUgLTExLjV0LTcuNSAtMjcuNWwtMzI3IC00MDBxLTEzIC0xNiAtMzIgLTE2dC0zMiAxNmwtMzI3IDQwMHEtMTMgMTYgLTcuNSAyNy41dDI1LjUgMTEuNWgxOTF2NDUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMTEyNSA0MDBoNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0zNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41IGgtMTA1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djM1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTc1aDkwMHYxNzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDI2OyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02MDAgMTAyN3EtMTE2IDAgLTIxNC41IC01N3QtMTU1LjUgLTE1NS41dC01NyAtMjE0LjV0NTcgLTIxNC41IHQxNTUuNSAtMTU1LjV0MjE0LjUgLTU3dDIxNC41IDU3dDE1NS41IDE1NS41dDU3IDIxNC41dC01NyAyMTQuNXQtMTU1LjUgMTU1LjV0LTIxNC41IDU3ek01MjUgOTAwaDE1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTI3NWgxMzdxMjEgMCAyNiAtMTEuNXQtOCAtMjcuNWwtMjIzIC0yNzVxLTEzIC0xNiAtMzIgLTE2dC0zMiAxNmwtMjIzIDI3NXEtMTMgMTYgLTggMjcuNXQyNiAxMS41aDEzN3YyNzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAyNzsiIGQ9Ik02MDAgMTE3N3ExMTcgMCAyMjQgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNHQtNDUuNSAtMjI0dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjQgLTQ1LjV0LTIyNCA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjR0NDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXpNNjAwIDEwMjdxLTExNiAwIC0yMTQuNSAtNTd0LTE1NS41IC0xNTUuNXQtNTcgLTIxNC41dDU3IC0yMTQuNSB0MTU1LjUgLTE1NS41dDIxNC41IC01N3QyMTQuNSA1N3QxNTUuNSAxNTUuNXQ1NyAyMTQuNXQtNTcgMjE0LjV0LTE1NS41IDE1NS41dC0yMTQuNSA1N3pNNjMyIDkxNGwyMjMgLTI3NXExMyAtMTYgOCAtMjcuNXQtMjYgLTExLjVoLTEzN3YtMjc1cTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2Mjc1aC0xMzdxLTIxIDAgLTI2IDExLjV0OCAyNy41bDIyMyAyNzVxMTMgMTYgMzIgMTYgdDMyIC0xNnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDI4OyIgZD0iTTIyNSAxMjAwaDc1MHExMCAwIDE5LjUgLTd0MTIuNSAtMTdsMTg2IC02NTJxNyAtMjQgNyAtNDl2LTQyNXEwIC0xMiAtNCAtMjd0LTkgLTE3cS0xMiAtNiAtMzcgLTZoLTExMDBxLTEyIDAgLTI3IDR0LTE3IDhxLTYgMTMgLTYgMzhsMSA0MjVxMCAyNSA3IDQ5bDE4NSA2NTJxMyAxMCAxMi41IDE3dDE5LjUgN3pNODc4IDEwMDBoLTU1NnEtMTAgMCAtMTkgLTd0LTExIC0xOGwtODcgLTQ1MHEtMiAtMTEgNCAtMTh0MTYgLTdoMTUwIHExMCAwIDE5LjUgLTd0MTEuNSAtMTdsMzggLTE1MnEyIC0xMCAxMS41IC0xN3QxOS41IC03aDI1MHExMCAwIDE5LjUgN3QxMS41IDE3bDM4IDE1MnEyIDEwIDExLjUgMTd0MTkuNSA3aDE1MHExMCAwIDE2IDd0NCAxOGwtODcgNDUwcS0yIDExIC0xMSAxOHQtMTkgN3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDI5OyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02MDAgMTAyN3EtMTE2IDAgLTIxNC41IC01N3QtMTU1LjUgLTE1NS41dC01NyAtMjE0LjV0NTcgLTIxNC41IHQxNTUuNSAtMTU1LjV0MjE0LjUgLTU3dDIxNC41IDU3dDE1NS41IDE1NS41dDU3IDIxNC41dC01NyAyMTQuNXQtMTU1LjUgMTU1LjV0LTIxNC41IDU3ek01NDAgODIwbDI1MyAtMTkwcTE3IC0xMiAxNyAtMzB0LTE3IC0zMGwtMjUzIC0xOTBxLTE2IC0xMiAtMjggLTYuNXQtMTIgMjYuNXY0MDBxMCAyMSAxMiAyNi41dDI4IC02LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAzMDsiIGQ9Ik05NDcgMTA2MGwxMzUgMTM1cTcgNyAxMi41IDV0NS41IC0xM3YtMzYycTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMzYycS0xMSAwIC0xMyA1LjV0NSAxMi41bDEzMyAxMzNxLTEwOSA3NiAtMjM4IDc2cS0xMTYgMCAtMjE0LjUgLTU3dC0xNTUuNSAtMTU1LjV0LTU3IC0yMTQuNXQ1NyAtMjE0LjV0MTU1LjUgLTE1NS41dDIxNC41IC01N3QyMTQuNSA1N3QxNTUuNSAxNTUuNXQ1NyAyMTQuNWgxNTBxMCAtMTE3IC00NS41IC0yMjQgdC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjQgLTQ1LjV0LTIyNCA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjR0NDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXExOTIgMCAzNDcgLTExN3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDMxOyIgZD0iTTk0NyAxMDYwbDEzNSAxMzVxNyA3IDEyLjUgNXQ1LjUgLTEzdi0zNjFxMCAtMTEgLTcuNSAtMTguNXQtMTguNSAtNy41aC0zNjFxLTExIDAgLTEzIDUuNXQ1IDEyLjVsMTM0IDEzNHEtMTEwIDc1IC0yMzkgNzVxLTExNiAwIC0yMTQuNSAtNTd0LTE1NS41IC0xNTUuNXQtNTcgLTIxNC41aC0xNTBxMCAxMTcgNDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXExOTIgMCAzNDcgLTExN3pNMTAyNyA2MDBoMTUwIHEwIC0xMTcgLTQ1LjUgLTIyNHQtMTIzIC0xODQuNXQtMTg0LjUgLTEyM3QtMjI0IC00NS41cS0xOTIgMCAtMzQ4IDExOGwtMTM0IC0xMzRxLTcgLTggLTEyLjUgLTUuNXQtNS41IDEyLjV2MzYwcTAgMTEgNy41IDE4LjV0MTguNSA3LjVoMzYwcTEwIDAgMTIuNSAtNS41dC01LjUgLTEyLjVsLTEzMyAtMTMzcTExMCAtNzYgMjQwIC03NnExMTYgMCAyMTQuNSA1N3QxNTUuNSAxNTUuNXQ1NyAyMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDMyOyIgZD0iTTEyNSAxMjAwaDEwNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xMTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMTA1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djExNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNMTA3NSAxMDAwaC04NTBxLTEwIDAgLTE3LjUgLTcuNXQtNy41IC0xNy41di04NTBxMCAtMTAgNy41IC0xNy41dDE3LjUgLTcuNWg4NTBxMTAgMCAxNy41IDcuNXQ3LjUgMTcuNXY4NTAgcTAgMTAgLTcuNSAxNy41dC0xNy41IDcuNXpNMzI1IDkwMGg1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek01MjUgOTAwaDQ1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtNDUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2NTAgcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTMyNSA3MDBoNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di01MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2NTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNNTI1IDcwMGg0NTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di01MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTQ1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djUwIHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek0zMjUgNTAwaDUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC01MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTUyNSA1MDBoNDUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC00NTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1MCBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNMzI1IDMwMGg1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek01MjUgMzAwaDQ1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtNDUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2NTAgcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAzMzsiIGQ9Ik05MDAgODAwdjIwMHEwIDgzIC01OC41IDE0MS41dC0xNDEuNSA1OC41aC0zMDBxLTgyIDAgLTE0MSAtNTl0LTU5IC0xNDF2LTIwMGgtMTAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di02MDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDkwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2NjAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41aC0xMDB6TTQwMCA4MDB2MTUwcTAgMjEgMTUgMzUuNXQzNSAxNC41aDIwMCBxMjAgMCAzNSAtMTQuNXQxNSAtMzUuNXYtMTUwaC0zMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAzNDsiIGQ9Ik0xMjUgMTEwMGg1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTEwNzVoLTEwMHYxMDc1cTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTEwNzUgMTA1MnE0IDAgOSAtMnExNiAtNiAxNiAtMjN2LTQyMXEwIC02IC0zIC0xMnEtMzMgLTU5IC02Ni41IC05OXQtNjUuNSAtNTh0LTU2LjUgLTI0LjV0LTUyLjUgLTYuNXEtMjYgMCAtNTcuNSA2LjV0LTUyLjUgMTMuNXQtNjAgMjFxLTQxIDE1IC02MyAyMi41dC01Ny41IDE1dC02NS41IDcuNSBxLTg1IDAgLTE2MCAtNTdxLTcgLTUgLTE1IC01cS02IDAgLTExIDNxLTE0IDcgLTE0IDIydjQzOHEyMiA1NSA4MiA5OC41dDExOSA0Ni41cTIzIDIgNDMgMC41dDQzIC03dDMyLjUgLTguNXQzOCAtMTN0MzIuNSAtMTFxNDEgLTE0IDYzLjUgLTIxdDU3IC0xNHQ2My41IC03cTEwMyAwIDE4MyA4N3E3IDggMTggOHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDM1OyIgZD0iTTYwMCAxMTc1cTExNiAwIDIyNyAtNDkuNXQxOTIuNSAtMTMxdDEzMSAtMTkyLjV0NDkuNSAtMjI3di0zMDBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC01MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djMwMHEwIDEyNyAtNzAuNSAyMzEuNXQtMTg0LjUgMTYxLjV0LTI0NSA1N3QtMjQ1IC01N3QtMTg0LjUgLTE2MS41dC03MC41IC0yMzEuNXYtMzAwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtNTAgcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MzAwcTAgMTE2IDQ5LjUgMjI3dDEzMSAxOTIuNXQxOTIuNSAxMzF0MjI3IDQ5LjV6TTIyMCA1MDBoMTYwcTggMCAxNCAtNnQ2IC0xNHYtNDYwcTAgLTggLTYgLTE0dC0xNCAtNmgtMTYwcS04IDAgLTE0IDZ0LTYgMTR2NDYwcTAgOCA2IDE0dDE0IDZ6TTgyMCA1MDBoMTYwcTggMCAxNCAtNnQ2IC0xNHYtNDYwcTAgLTggLTYgLTE0dC0xNCAtNmgtMTYwcS04IDAgLTE0IDZ0LTYgMTR2NDYwIHEwIDggNiAxNHQxNCA2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMzY7IiBkPSJNMzIxIDgxNGwyNTggMTcycTkgNiAxNSAyLjV0NiAtMTMuNXYtNzUwcTAgLTEwIC02IC0xMy41dC0xNSAyLjVsLTI1OCAxNzJxLTIxIDE0IC00NiAxNGgtMjUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MzUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoMjUwcTI1IDAgNDYgMTR6TTkwMCA2NjhsMTIwIDEyMHE3IDcgMTcgN3QxNyAtN2wzNCAtMzRxNyAtNyA3IC0xN3QtNyAtMTdsLTEyMCAtMTIwbDEyMCAtMTIwcTcgLTcgNyAtMTcgdC03IC0xN2wtMzQgLTM0cS03IC03IC0xNyAtN3QtMTcgN2wtMTIwIDExOWwtMTIwIC0xMTlxLTcgLTcgLTE3IC03dC0xNyA3bC0zNCAzNHEtNyA3IC03IDE3dDcgMTdsMTE5IDEyMGwtMTE5IDEyMHEtNyA3IC03IDE3dDcgMTdsMzQgMzRxNyA4IDE3IDh0MTcgLTh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTAzNzsiIGQ9Ik0zMjEgODE0bDI1OCAxNzJxOSA2IDE1IDIuNXQ2IC0xMy41di03NTBxMCAtMTAgLTYgLTEzLjV0LTE1IDIuNWwtMjU4IDE3MnEtMjEgMTQgLTQ2IDE0aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYzNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgyNTBxMjUgMCA0NiAxNHpNNzY2IDkwMGg0cTEwIC0xIDE2IC0xMHE5NiAtMTI5IDk2IC0yOTBxMCAtMTU0IC05MCAtMjgxcS02IC05IC0xNyAtMTBsLTMgLTFxLTkgMCAtMTYgNiBsLTI5IDIzcS03IDcgLTguNSAxNi41dDQuNSAxNy41cTcyIDEwMyA3MiAyMjlxMCAxMzIgLTc4IDIzOHEtNiA4IC00LjUgMTh0OS41IDE3bDI5IDIycTcgNSAxNSA1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwMzg7IiBkPSJNOTY3IDEwMDRoM3ExMSAtMSAxNyAtMTBxMTM1IC0xNzkgMTM1IC0zOTZxMCAtMTA1IC0zNCAtMjA2LjV0LTk4IC0xODUuNXEtNyAtOSAtMTcgLTEwaC0zcS05IDAgLTE2IDZsLTQyIDM0cS04IDYgLTkgMTZ0NSAxOHExMTEgMTUwIDExMSAzMjhxMCA5MCAtMjkuNSAxNzZ0LTg0LjUgMTU3cS02IDkgLTUgMTl0MTAgMTZsNDIgMzNxNyA1IDE1IDV6TTMyMSA4MTRsMjU4IDE3MnE5IDYgMTUgMi41dDYgLTEzLjV2LTc1MHEwIC0xMCAtNiAtMTMuNSB0LTE1IDIuNWwtMjU4IDE3MnEtMjEgMTQgLTQ2IDE0aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYzNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgyNTBxMjUgMCA0NiAxNHpNNzY2IDkwMGg0cTEwIC0xIDE2IC0xMHE5NiAtMTI5IDk2IC0yOTBxMCAtMTU0IC05MCAtMjgxcS02IC05IC0xNyAtMTBsLTMgLTFxLTkgMCAtMTYgNmwtMjkgMjNxLTcgNyAtOC41IDE2LjV0NC41IDE3LjVxNzIgMTAzIDcyIDIyOXEwIDEzMiAtNzggMjM4IHEtNiA4IC00LjUgMTguNXQ5LjUgMTYuNWwyOSAyMnE3IDUgMTUgNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDM5OyIgZD0iTTUwMCA5MDBoMTAwdi0xMDBoLTEwMHYtMTAwaC00MDB2LTEwMGgtMTAwdjYwMGg1MDB2LTMwMHpNMTIwMCA3MDBoLTIwMHYtMTAwaDIwMHYtMjAwaC0zMDB2MzAwaC0yMDB2MzAwaC0xMDB2MjAwaDYwMHYtNTAwek0xMDAgMTEwMHYtMzAwaDMwMHYzMDBoLTMwMHpNODAwIDExMDB2LTMwMGgzMDB2MzAwaC0zMDB6TTMwMCA5MDBoLTEwMHYxMDBoMTAwdi0xMDB6TTEwMDAgOTAwaC0xMDB2MTAwaDEwMHYtMTAwek0zMDAgNTAwaDIwMHYtNTAwIGgtNTAwdjUwMGgyMDB2MTAwaDEwMHYtMTAwek04MDAgMzAwaDIwMHYtMTAwaC0xMDB2LTEwMGgtMjAwdjEwMGgtMTAwdjEwMGgxMDB2MjAwaC0yMDB2MTAwaDMwMHYtMzAwek0xMDAgNDAwdi0zMDBoMzAwdjMwMGgtMzAwek0zMDAgMjAwaC0xMDB2MTAwaDEwMHYtMTAwek0xMjAwIDIwMGgtMTAwdjEwMGgxMDB2LTEwMHpNNzAwIDBoLTEwMHYxMDBoMTAwdi0xMDB6TTEyMDAgMGgtMzAwdjEwMGgzMDB2LTEwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQwOyIgZD0iTTEwMCAyMDBoLTEwMHYxMDAwaDEwMHYtMTAwMHpNMzAwIDIwMGgtMTAwdjEwMDBoMTAwdi0xMDAwek03MDAgMjAwaC0yMDB2MTAwMGgyMDB2LTEwMDB6TTkwMCAyMDBoLTEwMHYxMDAwaDEwMHYtMTAwMHpNMTIwMCAyMDBoLTIwMHYxMDAwaDIwMHYtMTAwMHpNNDAwIDBoLTMwMHYxMDBoMzAwdi0xMDB6TTYwMCAwaC0xMDB2OTFoMTAwdi05MXpNODAwIDBoLTEwMHY5MWgxMDB2LTkxek0xMTAwIDBoLTIwMHY5MWgyMDB2LTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNDE7IiBkPSJNNTAwIDEyMDBsNjgyIC02ODJxOCAtOCA4IC0xOHQtOCAtMThsLTQ2NCAtNDY0cS04IC04IC0xOCAtOHQtMTggOGwtNjgyIDY4MmwxIDQ3NXEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDQ3NHpNMzE5LjUgMTAyNC41cS0yOS41IDI5LjUgLTcxIDI5LjV0LTcxIC0yOS41dC0yOS41IC03MS41dDI5LjUgLTcxLjV0NzEgLTI5LjV0NzEgMjkuNXQyOS41IDcxLjV0LTI5LjUgNzEuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQyOyIgZD0iTTUwMCAxMjAwbDY4MiAtNjgycTggLTggOCAtMTh0LTggLTE4bC00NjQgLTQ2NHEtOCAtOCAtMTggLTh0LTE4IDhsLTY4MiA2ODJsMSA0NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWg0NzR6TTgwMCAxMjAwbDY4MiAtNjgycTggLTggOCAtMTh0LTggLTE4bC00NjQgLTQ2NHEtOCAtOCAtMTggLTh0LTE4IDhsLTU2IDU2bDQyNCA0MjZsLTcwMCA3MDBoMTUwek0zMTkuNSAxMDI0LjVxLTI5LjUgMjkuNSAtNzEgMjkuNXQtNzEgLTI5LjUgdC0yOS41IC03MS41dDI5LjUgLTcxLjV0NzEgLTI5LjV0NzEgMjkuNXQyOS41IDcxLjV0LTI5LjUgNzEuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQzOyIgZD0iTTMwMCAxMjAwaDgyNXE3NSAwIDc1IC03NXYtOTAwcTAgLTI1IC0xOCAtNDNsLTY0IC02NHEtOCAtOCAtMTMgLTUuNXQtNSAxMi41djk1MHEwIDEwIC03LjUgMTcuNXQtMTcuNSA3LjVoLTcwMHEtMjUgMCAtNDMgLTE4bC02NCAtNjRxLTggLTggLTUuNSAtMTN0MTIuNSAtNWg3MDBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di05NTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC04NTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY5NzUgcTAgMjUgMTggNDNsMTM5IDEzOXExOCAxOCA0MyAxOHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQ0OyIgZD0iTTI1MCAxMjAwaDgwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTE1MGwtNDUwIDQ0NGwtNDUwIC00NDV2MTE1MXEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA0NTsiIGQ9Ik04MjIgMTIwMGgtNDQ0cS0xMSAwIC0xOSAtNy41dC05IC0xNy41bC03OCAtMzAxcS03IC0yNCA3IC00NWw1NyAtMTA4cTYgLTkgMTcuNSAtMTV0MjEuNSAtNmg0NTBxMTAgMCAyMS41IDZ0MTcuNSAxNWw2MiAxMDhxMTQgMjEgNyA0NWwtODMgMzAxcS0xIDEwIC05IDE3LjV0LTE5IDcuNXpNMTE3NSA4MDBoLTE1MHEtMTAgMCAtMjEgLTYuNXQtMTUgLTE1LjVsLTc4IC0xNTZxLTQgLTkgLTE1IC0xNS41dC0yMSAtNi41aC01NTAgcS0xMCAwIC0yMSA2LjV0LTE1IDE1LjVsLTc4IDE1NnEtNCA5IC0xNSAxNS41dC0yMSA2LjVoLTE1MHEtMTAgMCAtMTcuNSAtNy41dC03LjUgLTE3LjV2LTY1MHEwIC0xMCA3LjUgLTE3LjV0MTcuNSAtNy41aDE1MHExMCAwIDE3LjUgNy41dDcuNSAxNy41djE1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDc1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCA3LjUgLTE3LjV0MTcuNSAtNy41aDE1MHExMCAwIDE3LjUgNy41IHQ3LjUgMTcuNXY2NTBxMCAxMCAtNy41IDE3LjV0LTE3LjUgNy41ek04NTAgMjAwaC01MDBxLTEwIDAgLTE5LjUgLTd0LTExLjUgLTE3bC0zOCAtMTUycS0yIC0xMCAzLjUgLTE3dDE1LjUgLTdoNjAwcTEwIDAgMTUuNSA3dDMuNSAxN2wtMzggMTUycS0yIDEwIC0xMS41IDE3dC0xOS41IDd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA0NjsiIGQ9Ik01MDAgMTEwMGgyMDBxNTYgMCAxMDIuNSAtMjAuNXQ3Mi41IC01MHQ0NCAtNTl0MjUgLTUwLjVsNiAtMjBoMTUwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41di02MDBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTEwMDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41djYwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjVoMTUwcTIgOCA2LjUgMjEuNXQyNCA0OHQ0NSA2MXQ3MiA0OHQxMDIuNSAyMS41ek05MDAgODAwdi0xMDAgaDEwMHYxMDBoLTEwMHpNNjAwIDczMHEtOTUgMCAtMTYyLjUgLTY3LjV0LTY3LjUgLTE2Mi41dDY3LjUgLTE2Mi41dDE2Mi41IC02Ny41dDE2Mi41IDY3LjV0NjcuNSAxNjIuNXQtNjcuNSAxNjIuNXQtMTYyLjUgNjcuNXpNNjAwIDYwM3E0MyAwIDczIC0zMHQzMCAtNzN0LTMwIC03M3QtNzMgLTMwdC03MyAzMHQtMzAgNzN0MzAgNzN0NzMgMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA0NzsiIGQ9Ik02ODEgMTE5OWwzODUgLTk5OHEyMCAtNTAgNjAgLTkycTE4IC0xOSAzNi41IC0yOS41dDI3LjUgLTExLjVsMTAgLTJ2LTY2aC00MTd2NjZxNTMgMCA3NSA0My41dDUgODguNWwtODIgMjIyaC0zOTFxLTU4IC0xNDUgLTkyIC0yMzRxLTExIC0zNCAtNi41IC01N3QyNS41IC0zN3Q0NiAtMjB0NTUgLTZ2LTY2aC0zNjV2NjZxNTYgMjQgODQgNTJxMTIgMTIgMjUgMzAuNXQyMCAzMS41bDcgMTNsMzk5IDEwMDZoOTN6TTQxNiA1MjFoMzQwIGwtMTYyIDQ1N3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQ4OyIgZD0iTTc1MyA2NDFxNSAtMSAxNC41IC00LjV0MzYgLTE1LjV0NTAuNSAtMjYuNXQ1My41IC00MHQ1MC41IC01NC41dDM1LjUgLTcwdDE0LjUgLTg3cTAgLTY3IC0yNy41IC0xMjUuNXQtNzEuNSAtOTcuNXQtOTguNSAtNjYuNXQtMTA4LjUgLTQwLjV0LTEwMiAtMTNoLTUwMHY4OXE0MSA3IDcwLjUgMzIuNXQyOS41IDY1LjV2ODI3cTAgMjQgLTAuNSAzNHQtMy41IDI0dC04LjUgMTkuNXQtMTcgMTMuNXQtMjggMTIuNXQtNDIuNSAxMS41djcxIGw0NzEgLTFxNTcgMCAxMTUuNSAtMjAuNXQxMDggLTU3dDgwLjUgLTk0dDMxIC0xMjQuNXEwIC01MSAtMTUuNSAtOTYuNXQtMzggLTc0LjV0LTQ1IC01MC41dC0zOC41IC0zMC41ek00MDAgNzAwaDEzOXE3OCAwIDEzMC41IDQ4LjV0NTIuNSAxMjIuNXEwIDQxIC04LjUgNzAuNXQtMjkuNSA1NS41dC02Mi41IDM5LjV0LTEwMy41IDEzLjVoLTExOHYtMzUwek00MDAgMjAwaDIxNnE4MCAwIDEyMSA1MC41dDQxIDEzMC41cTAgOTAgLTYyLjUgMTU0LjUgdC0xNTYuNSA2NC41aC0xNTl2LTQwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDQ5OyIgZD0iTTg3NyAxMjAwbDIgLTU3cS04MyAtMTkgLTExNiAtNDUuNXQtNDAgLTY2LjVsLTEzMiAtODM5cS05IC00OSAxMyAtNjl0OTYgLTI2di05N2gtNTAwdjk3cTE4NiAxNiAyMDAgOThsMTczIDgzMnEzIDE3IDMgMzB0LTEuNSAyMi41dC05IDE3LjV0LTEzLjUgMTIuNXQtMjEuNSAxMHQtMjYgOC41dC0zMy41IDEwcS0xMyAzIC0xOSA1djU3aDQyNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDUwOyIgZD0iTTEzMDAgOTAwaC01MHEwIDIxIC00IDM3dC05LjUgMjYuNXQtMTggMTcuNXQtMjIgMTF0LTI4LjUgNS41dC0zMSAydC0zNyAwLjVoLTIwMHYtODUwcTAgLTIyIDI1IC0zNC41dDUwIC0xMy41bDI1IC0ydi0xMDBoLTQwMHYxMDBxNCAwIDExIDAuNXQyNCAzdDMwIDd0MjQgMTV0MTEgMjQuNXY4NTBoLTIwMHEtMjUgMCAtMzcgLTAuNXQtMzEgLTJ0LTI4LjUgLTUuNXQtMjIgLTExdC0xOCAtMTcuNXQtOS41IC0yNi41dC00IC0zN2gtNTB2MzAwIGgxMDAwdi0zMDB6TTE3NSAxMDAwaC03NXYtODAwaDc1bC0xMjUgLTE2N2wtMTI1IDE2N2g3NXY4MDBoLTc1bDEyNSAxNjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1MTsiIGQ9Ik0xMTAwIDkwMGgtNTBxMCAyMSAtNCAzN3QtOS41IDI2LjV0LTE4IDE3LjV0LTIyIDExdC0yOC41IDUuNXQtMzEgMnQtMzcgMC41aC0yMDB2LTY1MHEwIC0yMiAyNSAtMzQuNXQ1MCAtMTMuNWwyNSAtMnYtMTAwaC00MDB2MTAwcTQgMCAxMSAwLjV0MjQgM3QzMCA3dDI0IDE1dDExIDI0LjV2NjUwaC0yMDBxLTI1IDAgLTM3IC0wLjV0LTMxIC0ydC0yOC41IC01LjV0LTIyIC0xMXQtMTggLTE3LjV0LTkuNSAtMjYuNXQtNCAtMzdoLTUwdjMwMCBoMTAwMHYtMzAwek0xMTY3IDUwbC0xNjcgLTEyNXY3NWgtODAwdi03NWwtMTY3IDEyNWwxNjcgMTI1di03NWg4MDB2NzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1MjsiIGQ9Ik01MCAxMTAwaDYwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC02MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDgwMGgxMDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA1MDBoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTgwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgMjAwaDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTEwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1MzsiIGQ9Ik0yNTAgMTEwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA4MDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDAgcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMjUwIDUwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCAyMDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwIHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDU0OyIgZD0iTTUwMCA5NTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg2MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNMTAwIDY1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDEwMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek0zMDAgMzUwdjEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTgwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTAgNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDAgcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDU1OyIgZD0iTTUwIDExMDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA4MDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDAgcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgNTAwaDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgMjAwaDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTEwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1NjsiIGQ9Ik01MCAxMTAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTM1MCAxMTAwaDgwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC04MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCA4MDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMzUwIDgwMGg4MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtODAwIHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgNTAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTM1MCA1MDBoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDAgcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC04MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDIwMGgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0zNTAgMjAwaDgwMCBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtODAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNTc7IiBkPSJNNDAwIDBoLTEwMHYxMTAwaDEwMHYtMTEwMHpNNTUwIDExMDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTUwIDgwMGg1MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTAwIHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMjY3IDU1MGwtMTY3IC0xMjV2NzVoLTIwMHYxMDBoMjAwdjc1ek01NTAgNTAwaDMwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0zMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTU1MCAyMDBoNjAwIHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC02MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1ODsiIGQ9Ik01MCAxMTAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTkwMCAwaC0xMDB2MTEwMGgxMDB2LTExMDB6TTUwIDgwMGg1MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTAwIHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMTEwMCA2MDBoMjAwdi0xMDBoLTIwMHYtNzVsLTE2NyAxMjVsMTY3IDEyNXYtNzV6TTUwIDUwMGgzMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek01MCAyMDBoNjAwIHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC02MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA1OTsiIGQ9Ik03NSAxMDAwaDc1MHEzMSAwIDUzIC0yMnQyMiAtNTN2LTY1MHEwIC0zMSAtMjIgLTUzdC01MyAtMjJoLTc1MHEtMzEgMCAtNTMgMjJ0LTIyIDUzdjY1MHEwIDMxIDIyIDUzdDUzIDIyek0xMjAwIDMwMGwtMzAwIDMwMGwzMDAgMzAwdi02MDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA2MDsiIGQ9Ik00NCAxMTAwaDExMTJxMTggMCAzMSAtMTN0MTMgLTMxdi0xMDEycTAgLTE4IC0xMyAtMzF0LTMxIC0xM2gtMTExMnEtMTggMCAtMzEgMTN0LTEzIDMxdjEwMTJxMCAxOCAxMyAzMXQzMSAxM3pNMTAwIDEwMDB2LTczN2wyNDcgMTgybDI5OCAtMTMxbC03NCAxNTZsMjkzIDMxOGwyMzYgLTI4OHY1MDBoLTEwMDB6TTM0MiA4ODRxNTYgMCA5NSAtMzl0MzkgLTk0LjV0LTM5IC05NXQtOTUgLTM5LjV0LTk1IDM5LjV0LTM5IDk1dDM5IDk0LjUgdDk1IDM5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNjI7IiBkPSJNNjQ4IDExNjlxMTE3IDAgMjE2IC02MHQxNTYuNSAtMTYxdDU3LjUgLTIxOHEwIC0xMTUgLTcwIC0yNThxLTY5IC0xMDkgLTE1OCAtMjI1LjV0LTE0MyAtMTc5LjVsLTU0IC02MnEtOSA4IC0yNS41IDI0LjV0LTYzLjUgNjcuNXQtOTEgMTAzdC05OC41IDEyOHQtOTUuNSAxNDhxLTYwIDEzMiAtNjAgMjQ5cTAgODggMzQgMTY5LjV0OTEuNSAxNDJ0MTM3IDk2LjV0MTY2LjUgMzZ6TTY1Mi41IDk3NHEtOTEuNSAwIC0xNTYuNSAtNjUgdC02NSAtMTU3dDY1IC0xNTYuNXQxNTYuNSAtNjQuNXQxNTYuNSA2NC41dDY1IDE1Ni41dC02NSAxNTd0LTE1Ni41IDY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNjM7IiBkPSJNNjAwIDExNzdxMTE3IDAgMjI0IC00NS41dDE4NC41IC0xMjN0MTIzIC0xODQuNXQ0NS41IC0yMjR0LTQ1LjUgLTIyNHQtMTIzIC0xODQuNXQtMTg0LjUgLTEyM3QtMjI0IC00NS41dC0yMjQgNDUuNXQtMTg0LjUgMTIzdC0xMjMgMTg0LjV0LTQ1LjUgMjI0dDQ1LjUgMjI0dDEyMyAxODQuNXQxODQuNSAxMjN0MjI0IDQ1LjV6TTYwMCAxNzN2ODU0cS0xMTYgMCAtMjE0LjUgLTU3dC0xNTUuNSAtMTU1LjV0LTU3IC0yMTQuNXQ1NyAtMjE0LjUgdDE1NS41IC0xNTUuNXQyMTQuNSAtNTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA2NDsiIGQ9Ik01NTQgMTI5NXEyMSAtNzIgNTcuNSAtMTQzLjV0NzYgLTEzMHQ4MyAtMTE4dDgyLjUgLTExN3Q3MCAtMTE2dDQ5LjUgLTEyNnQxOC41IC0xMzYuNXEwIC03MSAtMjUuNSAtMTM1dC02OC41IC0xMTF0LTk5IC04MnQtMTE4LjUgLTU0dC0xMjUuNSAtMjNxLTg0IDUgLTE2MS41IDM0dC0xMzkuNSA3OC41dC05OSAxMjV0LTM3IDE2NC41cTAgNjkgMTggMTM2LjV0NDkuNSAxMjYuNXQ2OS41IDExNi41dDgxLjUgMTE3LjV0ODMuNSAxMTkgdDc2LjUgMTMxdDU4LjUgMTQzek0zNDQgNzEwcS0yMyAtMzMgLTQzLjUgLTcwLjV0LTQwLjUgLTEwMi41dC0xNyAtMTIzcTEgLTM3IDE0LjUgLTY5LjV0MzAgLTUydDQxIC0zN3QzOC41IC0yNC41dDMzIC0xNXEyMSAtNyAzMiAtMXQxMyAyMmw2IDM0cTIgMTAgLTIuNSAyMnQtMTMuNSAxOXEtNSA0IC0xNCAxMnQtMjkuNSA0MC41dC0zMi41IDczLjVxLTI2IDg5IDYgMjcxcTIgMTEgLTYgMTFxLTggMSAtMTUgLTEweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNjU7IiBkPSJNMTAwMCAxMDEzbDEwOCAxMTVxMiAxIDUgMnQxMyAydDIwLjUgLTF0MjUgLTkuNXQyOC41IC0yMS41cTIyIC0yMiAyNyAtNDN0MCAtMzJsLTYgLTEwbC0xMDggLTExNXpNMzUwIDExMDBoNDAwcTUwIDAgMTA1IC0xM2wtMTg3IC0xODdoLTM2OHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djE4MmwyMDAgMjAwdi0zMzIgcTAgLTE2NSAtOTMuNSAtMjU3LjV0LTI1Ni41IC05Mi41aC00MDBxLTE2NSAwIC0yNTcuNSA5Mi41dC05Mi41IDI1Ny41djQwMHEwIDE2NSA5Mi41IDI1Ny41dDI1Ny41IDkyLjV6TTEwMDkgODAzbC0zNjIgLTM2MmwtMTYxIC01MGw1NSAxNzBsMzU1IDM1NXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDY2OyIgZD0iTTM1MCAxMTAwaDM2MXEtMTY0IC0xNDYgLTIxNiAtMjAwaC0xOTVxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNWwyMDAgMTUzdi0xMDNxMCAtMTY1IC05Mi41IC0yNTcuNXQtMjU3LjUgLTkyLjVoLTQwMHEtMTY1IDAgLTI1Ny41IDkyLjV0LTkyLjUgMjU3LjV2NDAwcTAgMTY1IDkyLjUgMjU3LjV0MjU3LjUgOTIuNXogTTgyNCAxMDczbDMzOSAtMzAxcTggLTcgOCAtMTcuNXQtOCAtMTcuNWwtMzQwIC0zMDZxLTcgLTYgLTEyLjUgLTR0LTYuNSAxMXYyMDNxLTI2IDEgLTU0LjUgMHQtNzguNSAtNy41dC05MiAtMTcuNXQtODYgLTM1dC03MCAtNTdxMTAgNTkgMzMgMTA4dDUxLjUgODEuNXQ2NSA1OC41dDY4LjUgNDAuNXQ2NyAyNC41dDU2IDEzLjV0NDAgNC41djIxMHExIDEwIDYuNSAxMi41dDEzLjUgLTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDY3OyIgZD0iTTM1MCAxMTAwaDM1MHE2MCAwIDEyNyAtMjNsLTE3OCAtMTc3aC0zNDlxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNXY2OWwyMDAgMjAwdi0yMTlxMCAtMTY1IC05Mi41IC0yNTcuNXQtMjU3LjUgLTkyLjVoLTQwMHEtMTY1IDAgLTI1Ny41IDkyLjV0LTkyLjUgMjU3LjV2NDAwcTAgMTY1IDkyLjUgMjU3LjV0MjU3LjUgOTIuNXogTTY0MyA2MzlsMzk1IDM5NXE3IDcgMTcuNSA3dDE3LjUgLTdsMTAxIC0xMDFxNyAtNyA3IC0xNy41dC03IC0xNy41bC01MzEgLTUzMnEtNyAtNyAtMTcuNSAtN3QtMTcuNSA3bC0yNDggMjQ4cS03IDcgLTcgMTcuNXQ3IDE3LjVsMTAxIDEwMXE3IDcgMTcuNSA3dDE3LjUgLTdsMTExIC0xMTFxOCAtNyAxOCAtN3QxOCA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNjg7IiBkPSJNMzE4IDkxOGwyNjQgMjY0cTggOCAxOCA4dDE4IC04bDI2MCAtMjY0cTcgLTggNC41IC0xM3QtMTIuNSAtNWgtMTcwdi0yMDBoMjAwdjE3M3EwIDEwIDUgMTJ0MTMgLTVsMjY0IC0yNjBxOCAtNyA4IC0xNy41dC04IC0xNy41bC0yNjQgLTI2NXEtOCAtNyAtMTMgLTV0LTUgMTJ2MTczaC0yMDB2LTIwMGgxNzBxMTAgMCAxMi41IC01dC00LjUgLTEzbC0yNjAgLTI2NHEtOCAtOCAtMTggLTh0LTE4IDhsLTI2NCAyNjRxLTggOCAtNS41IDEzIHQxMi41IDVoMTc1djIwMGgtMjAwdi0xNzNxMCAtMTAgLTUgLTEydC0xMyA1bC0yNjQgMjY1cS04IDcgLTggMTcuNXQ4IDE3LjVsMjY0IDI2MHE4IDcgMTMgNXQ1IC0xMnYtMTczaDIwMHYyMDBoLTE3NXEtMTAgMCAtMTIuNSA1dDUuNSAxM3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDY5OyIgZD0iTTI1MCAxMTAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDM4bDQ2NCA0NTNxMTUgMTQgMjUuNSAxMHQxMC41IC0yNXYtMTAwMHEwIC0yMSAtMTAuNSAtMjV0LTI1LjUgMTBsLTQ2NCA0NTN2LTQzOHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDcwOyIgZD0iTTUwIDExMDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MzhsNDY0IDQ1M3ExNSAxNCAyNS41IDEwdDEwLjUgLTI1di00MzhsNDY0IDQ1M3ExNSAxNCAyNS41IDEwdDEwLjUgLTI1di0xMDAwcTAgLTIxIC0xMC41IC0yNXQtMjUuNSAxMGwtNDY0IDQ1M3YtNDM4cTAgLTIxIC0xMC41IC0yNXQtMjUuNSAxMGwtNDY0IDQ1M3YtNDM4cTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNSB0LTE0LjUgMzUuNXYxMDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDcxOyIgZD0iTTEyMDAgMTA1MHYtMTAwMHEwIC0yMSAtMTAuNSAtMjV0LTI1LjUgMTBsLTQ2NCA0NTN2LTQzOHEwIC0yMSAtMTAuNSAtMjV0LTI1LjUgMTBsLTQ5MiA0ODBxLTE1IDE0IC0xNSAzNXQxNSAzNWw0OTIgNDgwcTE1IDE0IDI1LjUgMTB0MTAuNSAtMjV2LTQzOGw0NjQgNDUzcTE1IDE0IDI1LjUgMTB0MTAuNSAtMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA3MjsiIGQ9Ik0yNDMgMTA3NGw4MTQgLTQ5OHExOCAtMTEgMTggLTI2dC0xOCAtMjZsLTgxNCAtNDk4cS0xOCAtMTEgLTMwLjUgLTR0LTEyLjUgMjh2MTAwMHEwIDIxIDEyLjUgMjh0MzAuNSAtNHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDczOyIgZD0iTTI1MCAxMDAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtODAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djgwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTY1MCAxMDAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtODAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djgwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNzQ7IiBkPSJNMTEwMCA5NTB2LTgwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtODAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY4MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDgwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDc1OyIgZD0iTTUwMCA2MTJ2NDM4cTAgMjEgMTAuNSAyNXQyNS41IC0xMGw0OTIgLTQ4MHExNSAtMTQgMTUgLTM1dC0xNSAtMzVsLTQ5MiAtNDgwcS0xNSAtMTQgLTI1LjUgLTEwdC0xMC41IDI1djQzOGwtNDY0IC00NTNxLTE1IC0xNCAtMjUuNSAtMTB0LTEwLjUgMjV2MTAwMHEwIDIxIDEwLjUgMjV0MjUuNSAtMTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA3NjsiIGQ9Ik0xMDQ4IDExMDJsMTAwIDFxMjAgMCAzNSAtMTQuNXQxNSAtMzUuNWw1IC0xMDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41bC0xMDAgLTFxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41bC0yIDQzN2wtNDYzIC00NTRxLTE0IC0xNSAtMjQuNSAtMTAuNXQtMTAuNSAyNS41bC0yIDQzN2wtNDYyIC00NTVxLTE1IC0xNCAtMjUuNSAtOS41dC0xMC41IDI0LjVsLTUgMTAwMHEwIDIxIDEwLjUgMjUuNXQyNS41IC0xMC41bDQ2NiAtNDUwIGwtMiA0MzhxMCAyMCAxMC41IDI0LjV0MjUuNSAtOS41bDQ2NiAtNDUxbC0yIDQzOHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA3NzsiIGQ9Ik04NTAgMTEwMGgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDM4bC00NjQgLTQ1M3EtMTUgLTE0IC0yNS41IC0xMHQtMTAuNSAyNXYxMDAwcTAgMjEgMTAuNSAyNXQyNS41IC0xMGw0NjQgLTQ1M3Y0MzhxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwNzg7IiBkPSJNNjg2IDEwODFsNTAxIC01NDBxMTUgLTE1IDEwLjUgLTI2dC0yNi41IC0xMWgtMTA0MnEtMjIgMCAtMjYuNSAxMXQxMC41IDI2bDUwMSA1NDBxMTUgMTUgMzYgMTV0MzYgLTE1ek0xNTAgNDAwaDEwMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDc5OyIgZD0iTTg4NSA5MDBsLTM1MiAtMzUzbDM1MiAtMzUzbC0xOTcgLTE5OGwtNTUyIDU1Mmw1NTIgNTUweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwODA7IiBkPSJNMTA2NCA1NDdsLTU1MSAtNTUxbC0xOTggMTk4bDM1MyAzNTNsLTM1MyAzNTNsMTk4IDE5OHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDgxOyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02NTAgOTAwaC0xMDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjV2LTE1MGgtMTUwIHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMTAwcTAgLTIxIDE0LjUgLTM1LjV0MzUuNSAtMTQuNWgxNTB2LTE1MHEwIC0yMSAxNC41IC0zNS41dDM1LjUgLTE0LjVoMTAwcTIxIDAgMzUuNSAxNC41dDE0LjUgMzUuNXYxNTBoMTUwcTIxIDAgMzUuNSAxNC41dDE0LjUgMzUuNXYxMDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTE1MHYxNTBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA4MjsiIGQ9Ik02MDAgMTE3N3ExMTcgMCAyMjQgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNHQtNDUuNSAtMjI0dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjQgLTQ1LjV0LTIyNCA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjR0NDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXpNODUwIDcwMGgtNTAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDBxMCAtMjEgMTQuNSAtMzUuNSB0MzUuNSAtMTQuNWg1MDBxMjEgMCAzNS41IDE0LjV0MTQuNSAzNS41djEwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDgzOyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek03NDEuNSA5MTNxLTEyLjUgMCAtMjEuNSAtOWwtMTIwIC0xMjBsLTEyMCAxMjBxLTkgOSAtMjEuNSA5IHQtMjEuNSAtOWwtMTQxIC0xNDFxLTkgLTkgLTkgLTIxLjV0OSAtMjEuNWwxMjAgLTEyMGwtMTIwIC0xMjBxLTkgLTkgLTkgLTIxLjV0OSAtMjEuNWwxNDEgLTE0MXE5IC05IDIxLjUgLTl0MjEuNSA5bDEyMCAxMjBsMTIwIC0xMjBxOSAtOSAyMS41IC05dDIxLjUgOWwxNDEgMTQxcTkgOSA5IDIxLjV0LTkgMjEuNWwtMTIwIDEyMGwxMjAgMTIwcTkgOSA5IDIxLjV0LTkgMjEuNWwtMTQxIDE0MXEtOSA5IC0yMS41IDl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA4NDsiIGQ9Ik02MDAgMTE3N3ExMTcgMCAyMjQgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNHQtNDUuNSAtMjI0dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjQgLTQ1LjV0LTIyNCA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjR0NDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXpNNTQ2IDYyM2wtODQgODVxLTcgNyAtMTcuNSA3dC0xOC41IC03bC0xMzkgLTEzOXEtNyAtOCAtNyAtMTh0NyAtMTggbDI0MiAtMjQxcTcgLTggMTcuNSAtOHQxNy41IDhsMzc1IDM3NXE3IDcgNyAxNy41dC03IDE4LjVsLTEzOSAxMzlxLTcgNyAtMTcuNSA3dC0xNy41IC03eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwODU7IiBkPSJNNjAwIDExNzdxMTE3IDAgMjI0IC00NS41dDE4NC41IC0xMjN0MTIzIC0xODQuNXQ0NS41IC0yMjR0LTQ1LjUgLTIyNHQtMTIzIC0xODQuNXQtMTg0LjUgLTEyM3QtMjI0IC00NS41dC0yMjQgNDUuNXQtMTg0LjUgMTIzdC0xMjMgMTg0LjV0LTQ1LjUgMjI0dDQ1LjUgMjI0dDEyMyAxODQuNXQxODQuNSAxMjN0MjI0IDQ1LjV6TTU4OCA5NDFxLTI5IDAgLTU5IC01LjV0LTYzIC0yMC41dC01OCAtMzguNXQtNDEuNSAtNjN0LTE2LjUgLTg5LjUgcTAgLTI1IDIwIC0yNWgxMzFxMzAgLTUgMzUgMTFxNiAyMCAyMC41IDI4dDQ1LjUgOHEyMCAwIDMxLjUgLTEwLjV0MTEuNSAtMjguNXEwIC0yMyAtNyAtMzR0LTI2IC0xOHEtMSAwIC0xMy41IC00dC0xOS41IC03LjV0LTIwIC0xMC41dC0yMiAtMTd0LTE4LjUgLTI0dC0xNS41IC0zNXQtOCAtNDZxLTEgLTggNS41IC0xNi41dDIwLjUgLTguNWgxNzNxNyAwIDIyIDh0MzUgMjh0MzcuNSA0OHQyOS41IDc0dDEyIDEwMHEwIDQ3IC0xNyA4MyB0LTQyLjUgNTd0LTU5LjUgMzQuNXQtNjQgMTh0LTU5IDQuNXpNNjc1IDQwMGgtMTUwcS0xMCAwIC0xNy41IC03LjV0LTcuNSAtMTcuNXYtMTUwcTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoMTUwcTEwIDAgMTcuNSA3LjV0Ny41IDE3LjV2MTUwcTAgMTAgLTcuNSAxNy41dC0xNy41IDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDg2OyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02NzUgMTAwMGgtMTUwcS0xMCAwIC0xNy41IC03LjV0LTcuNSAtMTcuNXYtMTUwcTAgLTEwIDcuNSAtMTcuNSB0MTcuNSAtNy41aDE1MHExMCAwIDE3LjUgNy41dDcuNSAxNy41djE1MHEwIDEwIC03LjUgMTcuNXQtMTcuNSA3LjV6TTY3NSA3MDBoLTI1MHEtMTAgMCAtMTcuNSAtNy41dC03LjUgLTE3LjV2LTUwcTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoNzV2LTIwMGgtNzVxLTEwIDAgLTE3LjUgLTcuNXQtNy41IC0xNy41di01MHEwIC0xMCA3LjUgLTE3LjV0MTcuNSAtNy41aDM1MHExMCAwIDE3LjUgNy41dDcuNSAxNy41djUwcTAgMTAgLTcuNSAxNy41IHQtMTcuNSA3LjVoLTc1djI3NXEwIDEwIC03LjUgMTcuNXQtMTcuNSA3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA4NzsiIGQ9Ik01MjUgMTIwMGgxNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xOTRxMTAzIC0yNyAxNzguNSAtMTAyLjV0MTAyLjUgLTE3OC41aDE5NHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE5NHEtMjcgLTEwMyAtMTAyLjUgLTE3OC41dC0xNzguNSAtMTAyLjV2LTE5NHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE5NCBxLTEwMyAyNyAtMTc4LjUgMTAyLjV0LTEwMi41IDE3OC41aC0xOTRxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgxOTRxMjcgMTAzIDEwMi41IDE3OC41dDE3OC41IDEwMi41djE5NHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek03MDAgODkzdi0xNjhxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0xNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNjhxLTY4IC0yMyAtMTE5IC03NCB0LTc0IC0xMTloMTY4cTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMTY4cTIzIC02OCA3NCAtMTE5dDExOSAtNzR2MTY4cTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoMTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTY4cTY4IDIzIDExOSA3NHQ3NCAxMTloLTE2OHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDE2OCBxLTIzIDY4IC03NCAxMTl0LTExOSA3NHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDg4OyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02MDAgMTAyN3EtMTE2IDAgLTIxNC41IC01N3QtMTU1LjUgLTE1NS41dC01NyAtMjE0LjV0NTcgLTIxNC41IHQxNTUuNSAtMTU1LjV0MjE0LjUgLTU3dDIxNC41IDU3dDE1NS41IDE1NS41dDU3IDIxNC41dC01NyAyMTQuNXQtMTU1LjUgMTU1LjV0LTIxNC41IDU3ek03NTkgODIzbDY0IC02NHE3IC03IDcgLTE3LjV0LTcgLTE3LjVsLTEyNCAtMTI0bDEyNCAtMTI0cTcgLTcgNyAtMTcuNXQtNyAtMTcuNWwtNjQgLTY0cS03IC03IC0xNy41IC03dC0xNy41IDdsLTEyNCAxMjRsLTEyNCAtMTI0cS03IC03IC0xNy41IC03dC0xNy41IDdsLTY0IDY0IHEtNyA3IC03IDE3LjV0NyAxNy41bDEyNCAxMjRsLTEyNCAxMjRxLTcgNyAtNyAxNy41dDcgMTcuNWw2NCA2NHE3IDcgMTcuNSA3dDE3LjUgLTdsMTI0IC0xMjRsMTI0IDEyNHE3IDcgMTcuNSA3dDE3LjUgLTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA4OTsiIGQ9Ik02MDAgMTE3N3ExMTcgMCAyMjQgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNHQtNDUuNSAtMjI0dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjQgLTQ1LjV0LTIyNCA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjR0NDUuNSAyMjR0MTIzIDE4NC41dDE4NC41IDEyM3QyMjQgNDUuNXpNNjAwIDEwMjdxLTExNiAwIC0yMTQuNSAtNTd0LTE1NS41IC0xNTUuNXQtNTcgLTIxNC41dDU3IC0yMTQuNSB0MTU1LjUgLTE1NS41dDIxNC41IC01N3QyMTQuNSA1N3QxNTUuNSAxNTUuNXQ1NyAyMTQuNXQtNTcgMjE0LjV0LTE1NS41IDE1NS41dC0yMTQuNSA1N3pNNzgyIDc4OGwxMDYgLTEwNnE3IC03IDcgLTE3LjV0LTcgLTE3LjVsLTMyMCAtMzIxcS04IC03IC0xOCAtN3QtMTggN2wtMjAyIDIwM3EtOCA3IC04IDE3LjV0OCAxNy41bDEwNiAxMDZxNyA4IDE3LjUgOHQxNy41IC04bDc5IC03OWwxOTcgMTk3cTcgNyAxNy41IDd0MTcuNSAtN3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDkwOyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek02MDAgMTAyN3EtMTE2IDAgLTIxNC41IC01N3QtMTU1LjUgLTE1NS41dC01NyAtMjE0LjVxMCAtMTIwIDY1IC0yMjUgbDU4NyA1ODdxLTEwNSA2NSAtMjI1IDY1ek05NjUgODE5bC01ODQgLTU4NHExMDQgLTYyIDIxOSAtNjJxMTE2IDAgMjE0LjUgNTd0MTU1LjUgMTU1LjV0NTcgMjE0LjVxMCAxMTUgLTYyIDIxOXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDkxOyIgZD0iTTM5IDU4Mmw1MjIgNDI3cTE2IDEzIDI3LjUgOHQxMS41IC0yNnYtMjkxaDU1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC01NTB2LTI5MXEwIC0yMSAtMTEuNSAtMjZ0LTI3LjUgOGwtNTIyIDQyN3EtMTYgMTMgLTE2IDMydDE2IDMyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUwOTI7IiBkPSJNNjM5IDEwMDlsNTIyIC00MjdxMTYgLTEzIDE2IC0zMnQtMTYgLTMybC01MjIgLTQyN3EtMTYgLTEzIC0yNy41IC04dC0xMS41IDI2djI5MWgtNTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDU1MHYyOTFxMCAyMSAxMS41IDI2dDI3LjUgLTh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA5MzsiIGQ9Ik02ODIgMTE2MWw0MjcgLTUyMnExMyAtMTYgOCAtMjcuNXQtMjYgLTExLjVoLTI5MXYtNTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djU1MGgtMjkxcS0yMSAwIC0yNiAxMS41dDggMjcuNWw0MjcgNTIycTEzIDE2IDMyIDE2dDMyIC0xNnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDk0OyIgZD0iTTU1MCAxMjAwaDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTUwaDI5MXEyMSAwIDI2IC0xMS41dC04IC0yNy41bC00MjcgLTUyMnEtMTMgLTE2IC0zMiAtMTZ0LTMyIDE2bC00MjcgNTIycS0xMyAxNiAtOCAyNy41dDI2IDExLjVoMjkxdjU1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTA5NTsiIGQ9Ik02MzkgMTEwOWw1MjIgLTQyN3ExNiAtMTMgMTYgLTMydC0xNiAtMzJsLTUyMiAtNDI3cS0xNiAtMTMgLTI3LjUgLTh0LTExLjUgMjZ2MjkxcS05NCAtMiAtMTgyIC0yMHQtMTcwLjUgLTUydC0xNDcgLTkyLjV0LTEwMC41IC0xMzUuNXE1IDEwNSAyNyAxOTMuNXQ2Ny41IDE2N3QxMTMgMTM1dDE2NyA5MS41dDIyNS41IDQydjI2MnEwIDIxIDExLjUgMjZ0MjcuNSAtOHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDk2OyIgZD0iTTg1MCAxMjAwaDMwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMzAwcTAgLTIxIC0xMC41IC0yNXQtMjQuNSAxMGwtOTQgOTRsLTI0OSAtMjQ5cS04IC03IC0xOCAtN3QtMTggN2wtMTA2IDEwNnEtNyA4IC03IDE4dDcgMThsMjQ5IDI0OWwtOTQgOTRxLTE0IDE0IC0xMCAyNC41dDI1IDEwLjV6TTM1MCAwaC0zMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djMwMHEwIDIxIDEwLjUgMjV0MjQuNSAtMTBsOTQgLTk0bDI0OSAyNDkgcTggNyAxOCA3dDE4IC03bDEwNiAtMTA2cTcgLTggNyAtMTh0LTcgLTE4bC0yNDkgLTI0OWw5NCAtOTRxMTQgLTE0IDEwIC0yNC41dC0yNSAtMTAuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMDk3OyIgZD0iTTEwMTQgMTEyMGwxMDYgLTEwNnE3IC04IDcgLTE4dC03IC0xOGwtMjQ5IC0yNDlsOTQgLTk0cTE0IC0xNCAxMCAtMjQuNXQtMjUgLTEwLjVoLTMwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MzAwcTAgMjEgMTAuNSAyNXQyNC41IC0xMGw5NCAtOTRsMjQ5IDI0OXE4IDcgMTggN3QxOCAtN3pNMjUwIDYwMGgzMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTMwMHEwIC0yMSAtMTAuNSAtMjV0LTI0LjUgMTBsLTk0IDk0IGwtMjQ5IC0yNDlxLTggLTcgLTE4IC03dC0xOCA3bC0xMDYgMTA2cS03IDggLTcgMTh0NyAxOGwyNDkgMjQ5bC05NCA5NHEtMTQgMTQgLTEwIDI0LjV0MjUgMTAuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTAxOyIgZD0iTTYwMCAxMTc3cTExNyAwIDIyNCAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI0dC00NS41IC0yMjR0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNCAtNDUuNXQtMjI0IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNHQ0NS41IDIyNHQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNCA0NS41ek03MDQgOTAwaC0yMDhxLTIwIDAgLTMyIC0xNC41dC04IC0zNC41bDU4IC0zMDJxNCAtMjAgMjEuNSAtMzQuNSB0MzcuNSAtMTQuNWg1NHEyMCAwIDM3LjUgMTQuNXQyMS41IDM0LjVsNTggMzAycTQgMjAgLTggMzQuNXQtMzIgMTQuNXpNNjc1IDQwMGgtMTUwcS0xMCAwIC0xNy41IC03LjV0LTcuNSAtMTcuNXYtMTUwcTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoMTUwcTEwIDAgMTcuNSA3LjV0Ny41IDE3LjV2MTUwcTAgMTAgLTcuNSAxNy41dC0xNy41IDcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTAyOyIgZD0iTTI2MCAxMjAwcTkgMCAxOSAtMnQxNSAtNGw1IC0ycTIyIC0xMCA0NCAtMjNsMTk2IC0xMThxMjEgLTEzIDM2IC0yNHEyOSAtMjEgMzcgLTEycTExIDEzIDQ5IDM1bDE5NiAxMThxMjIgMTMgNDUgMjNxMTcgNyAzOCA3cTIzIDAgNDcgLTE2LjV0MzcgLTMzLjVsMTMgLTE2cTE0IC0yMSAxOCAtNDVsMjUgLTEyM2w4IC00NHExIC05IDguNSAtMTQuNXQxNy41IC01LjVoNjFxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di01MCBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC01MHEtMTAgMCAtMTcuNSAtNy41dC03LjUgLTE3LjV2LTE3NWgtNDAwdjMwMGgtMjAwdi0zMDBoLTQwMHYxNzVxMCAxMCAtNy41IDE3LjV0LTE3LjUgNy41aC01MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoNjFxMTEgMCAxOCAzdDcgOHEwIDQgOSA1MmwyNSAxMjhxNSAyNSAxOSA0NXEyIDMgNSA3dDEzLjUgMTV0MjEuNSAxOS41dDI2LjUgMTUuNSB0MjkuNSA3ek05MTUgMTA3OWwtMTY2IC0xNjJxLTcgLTcgLTUgLTEydDEyIC01aDIxOXExMCAwIDE1IDd0MiAxN2wtNTEgMTQ5cS0zIDEwIC0xMSAxMnQtMTUgLTZ6TTQ2MyA5MTdsLTE3NyAxNTdxLTggNyAtMTYgNXQtMTEgLTEybC01MSAtMTQzcS0zIC0xMCAyIC0xN3QxNSAtN2gyMzFxMTEgMCAxMi41IDV0LTUuNSAxMnpNNTAwIDBoLTM3NXEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djM3NWg0MDB2LTQwMHpNMTEwMCA0MDB2LTM3NSBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0zNzV2NDAwaDQwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTAzOyIgZD0iTTExNjUgMTE5MHE4IDMgMjEgLTYuNXQxMyAtMTcuNXEtMiAtMTc4IC0yNC41IC0zMjMuNXQtNTUuNSAtMjQ1LjV0LTg3IC0xNzQuNXQtMTAyLjUgLTExOC41dC0xMTggLTY4LjV0LTExOC41IC0zM3QtMTIwIC00LjV0LTEwNSA5LjV0LTkwIDE2LjVxLTYxIDEyIC03OCAxMXEtNCAxIC0xMi41IDB0LTM0IC0xNC41dC01Mi41IC00MC41bC0xNTMgLTE1M3EtMjYgLTI0IC0zNyAtMTQuNXQtMTEgNDMuNXEwIDY0IDQyIDEwMnE4IDggNTAuNSA0NSB0NjYuNSA1OHExOSAxNyAzNSA0N3QxMyA2MXEtOSA1NSAtMTAgMTAyLjV0NyAxMTF0MzcgMTMwdDc4IDEyOS41cTM5IDUxIDgwIDg4dDg5LjUgNjMuNXQ5NC41IDQ1dDExMy41IDM2dDEyOSAzMXQxNTcuNSAzN3QxODIgNDcuNXpNMTExNiAxMDk4cS04IDkgLTIyLjUgLTN0LTQ1LjUgLTUwcS0zOCAtNDcgLTExOSAtMTAzLjV0LTE0MiAtODkuNWwtNjIgLTMzcS01NiAtMzAgLTEwMiAtNTd0LTEwNCAtNjh0LTEwMi41IC04MC41dC04NS41IC05MSB0LTY0IC0xMDQuNXEtMjQgLTU2IC0zMSAtODZ0MiAtMzJ0MzEuNSAxNy41dDU1LjUgNTkuNXEyNSAzMCA5NCA3NS41dDEyNS41IDc3LjV0MTQ3LjUgODFxNzAgMzcgMTE4LjUgNjl0MTAyIDc5LjV0OTkgMTExdDg2LjUgMTQ4LjVxMjIgNTAgMjQgNjB0LTYgMTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEwNDsiIGQ9Ik02NTMgMTIzMXEtMzkgLTY3IC01NC41IC0xMzF0LTEwLjUgLTExNC41dDI0LjUgLTk2LjV0NDcuNSAtODB0NjMuNSAtNjIuNXQ2OC41IC00Ni41dDY1IC0zMHEtNCA3IC0xNy41IDM1dC0xOC41IDM5LjV0LTE3IDM5LjV0LTE3IDQzdC0xMyA0MnQtOS41IDQ0LjV0LTIgNDJ0NCA0M3QxMy41IDM5dDIzIDM4LjVxOTYgLTQyIDE2NSAtMTA3LjV0MTA1IC0xMzh0NTIgLTE1NnQxMyAtMTU5dC0xOSAtMTQ5LjVxLTEzIC01NSAtNDQgLTEwNi41IHQtNjggLTg3dC03OC41IC02NC41dC03Mi41IC00NXQtNTMgLTIycS03MiAtMjIgLTEyNyAtMTFxLTMxIDYgLTEzIDE5cTYgMyAxNyA3cTEzIDUgMzIuNSAyMXQ0MSA0NHQzOC41IDYzLjV0MjEuNSA4MS41dC02LjUgOTQuNXQtNTAgMTA3dC0xMDQgMTE1LjVxMTAgLTEwNCAtMC41IC0xODl0LTM3IC0xNDAuNXQtNjUgLTkzdC04NCAtNTJ0LTkzLjUgLTExdC05NSAyNC41cS04MCAzNiAtMTMxLjUgMTE0dC01My41IDE3MXEtMiAyMyAwIDQ5LjUgdDQuNSA1Mi41dDEzLjUgNTZ0MjcuNSA2MHQ0NiA2NC41dDY5LjUgNjguNXEtOCAtNTMgLTUgLTEwMi41dDE3LjUgLTkwdDM0IC02OC41dDQ0LjUgLTM5dDQ5IC0ycTMxIDEzIDM4LjUgMzZ0LTQuNSA1NXQtMjkgNjQuNXQtMzYgNzV0LTI2IDc1LjVxLTE1IDg1IDIgMTYxLjV0NTMuNSAxMjguNXQ4NS41IDkyLjV0OTMuNSA2MXQ4MS41IDI1LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEwNTsiIGQ9Ik02MDAgMTA5NHE4MiAwIDE2MC41IC0yMi41dDE0MCAtNTl0MTE2LjUgLTgyLjV0OTQuNSAtOTV0NjggLTk1dDQyLjUgLTgyLjV0MTQgLTU3LjV0LTE0IC01Ny41dC00MyAtODIuNXQtNjguNSAtOTV0LTk0LjUgLTk1dC0xMTYuNSAtODIuNXQtMTQwIC01OXQtMTU5LjUgLTIyLjV0LTE1OS41IDIyLjV0LTE0MCA1OXQtMTE2LjUgODIuNXQtOTQuNSA5NXQtNjguNSA5NXQtNDMgODIuNXQtMTQgNTcuNXQxNCA1Ny41dDQyLjUgODIuNXQ2OCA5NSB0OTQuNSA5NXQxMTYuNSA4Mi41dDE0MCA1OXQxNjAuNSAyMi41ek04ODggODI5cS0xNSAxNSAtMTggMTJ0NSAtMjJxMjUgLTU3IDI1IC0xMTlxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4dC0yMTIgODh0LTg4IDIxMnEwIDU5IDIzIDExNHE4IDE5IDQuNSAyMnQtMTcuNSAtMTJxLTcwIC02OSAtMTYwIC0xODRxLTEzIC0xNiAtMTUgLTQwLjV0OSAtNDIuNXEyMiAtMzYgNDcgLTcxdDcwIC04MnQ5Mi41IC04MXQxMTMgLTU4LjV0MTMzLjUgLTI0LjUgdDEzMy41IDI0dDExMyA1OC41dDkyLjUgODEuNXQ3MCA4MS41dDQ3IDcwLjVxMTEgMTggOSA0Mi41dC0xNCA0MS41cS05MCAxMTcgLTE2MyAxODl6TTQ0OCA3MjdsLTM1IC0zNnEtMTUgLTE1IC0xOS41IC0zOC41dDQuNSAtNDEuNXEzNyAtNjggOTMgLTExNnExNiAtMTMgMzguNSAtMTF0MzYuNSAxN2wzNSAzNHExNCAxNSAxMi41IDMzLjV0LTE2LjUgMzMuNXEtNDQgNDQgLTg5IDExN3EtMTEgMTggLTI4IDIwdC0zMiAtMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEwNjsiIGQ9Ik01OTIgMGgtMTQ4bDMxIDEyMHEtOTEgMjAgLTE3NS41IDY4LjV0LTE0My41IDEwNi41dC0xMDMuNSAxMTl0LTY2LjUgMTEwdC0yMiA3NnEwIDIxIDE0IDU3LjV0NDIuNSA4Mi41dDY4IDk1dDk0LjUgOTV0MTE2LjUgODIuNXQxNDAgNTl0MTYwLjUgMjIuNXE2MSAwIDEyNiAtMTVsMzIgMTIxaDE0OHpNOTQ0IDc3MGw0NyAxODFxMTA4IC04NSAxNzYuNSAtMTkydDY4LjUgLTE1OXEwIC0yNiAtMTkuNSAtNzF0LTU5LjUgLTEwMnQtOTMgLTExMiB0LTEyOSAtMTA0LjV0LTE1OCAtNzUuNWw0NiAxNzNxNzcgNDkgMTM2IDExN3Q5NyAxMzFxMTEgMTggOSA0Mi41dC0xNCA0MS41cS01NCA3MCAtMTA3IDEzMHpNMzEwIDgyNHEtNzAgLTY5IC0xNjAgLTE4NHEtMTMgLTE2IC0xNSAtNDAuNXQ5IC00Mi41cTE4IC0zMCAzOSAtNjB0NTcgLTcwLjV0NzQgLTczdDkwIC02MXQxMDUgLTQxLjVsNDEgMTU0cS0xMDcgMTggLTE3OC41IDEwMS41dC03MS41IDE5My41cTAgNTkgMjMgMTE0cTggMTkgNC41IDIyIHQtMTcuNSAtMTJ6TTQ0OCA3MjdsLTM1IC0zNnEtMTUgLTE1IC0xOS41IC0zOC41dDQuNSAtNDEuNXEzNyAtNjggOTMgLTExNnExNiAtMTMgMzguNSAtMTF0MzYuNSAxN2wxMiAxMWwyMiA4NmwtMyA0cS00NCA0NCAtODkgMTE3cS0xMSAxOCAtMjggMjB0LTMyIC0xMnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTA3OyIgZD0iTS05MCAxMDBsNjQyIDEwNjZxMjAgMzEgNDggMjguNXQ0OCAtMzUuNWw2NDIgLTEwNTZxMjEgLTMyIDcuNSAtNjcuNXQtNTAuNSAtMzUuNWgtMTI5NHEtMzcgMCAtNTAuNSAzNHQ3LjUgNjZ6TTE1NSAyMDBoMzQ1djc1cTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoMTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtNzVoMzQ1bC00NDUgNzIzek00OTYgNzAwaDIwOHEyMCAwIDMyIC0xNC41dDggLTM0LjVsLTU4IC0yNTIgcS00IC0yMCAtMjEuNSAtMzQuNXQtMzcuNSAtMTQuNWgtNTRxLTIwIDAgLTM3LjUgMTQuNXQtMjEuNSAzNC41bC01OCAyNTJxLTQgMjAgOCAzNC41dDMyIDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEwODsiIGQ9Ik02NTAgMTIwMHE2MiAwIDEwNiAtNDR0NDQgLTEwNnYtMzM5bDM2MyAtMzI1cTE1IC0xNCAyNiAtMzguNXQxMSAtNDQuNXYtNDFxMCAtMjAgLTEyIC0yNi41dC0yOSA1LjVsLTM1OSAyNDl2LTI2M3ExMDAgLTkzIDEwMCAtMTEzdi02NHEwIC0yMSAtMTMgLTI5dC0zMiAxbC0yMDUgMTI4bC0yMDUgLTEyOHEtMTkgLTkgLTMyIC0xdC0xMyAyOXY2NHEwIDIwIDEwMCAxMTN2MjYzbC0zNTkgLTI0OXEtMTcgLTEyIC0yOSAtNS41dC0xMiAyNi41djQxIHEwIDIwIDExIDQ0LjV0MjYgMzguNWwzNjMgMzI1djMzOXEwIDYyIDQ0IDEwNnQxMDYgNDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEwOTsiIGQ9Ik04NTAgMTIwMGgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTUwaDUwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xNTBoLTExMDB2MTUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg1MHY1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGg1MDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0xMTAwIDgwMHYtNzUwcTAgLTIxIC0xNC41IC0zNS41IHQtMzUuNSAtMTQuNWgtMTAwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NzUwaDExMDB6TTEwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTMwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTUwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTcwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTkwMCA2MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTEwMCA0MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTMwMCA0MDB2LTEwMGgxMDB2MTAwaC0xMDB6TTUwMCA0MDAgdi0xMDBoMTAwdjEwMGgtMTAwek03MDAgNDAwdi0xMDBoMTAwdjEwMGgtMTAwek05MDAgNDAwdi0xMDBoMTAwdjEwMGgtMTAwek0xMDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAwek0zMDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAwek01MDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAwek03MDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAwek05MDAgMjAwdi0xMDBoMTAwdjEwMGgtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTA7IiBkPSJNMTEzNSAxMTY1bDI0OSAtMjMwcTE1IC0xNCAxNSAtMzV0LTE1IC0zNWwtMjQ5IC0yMzBxLTE0IC0xNCAtMjQuNSAtMTB0LTEwLjUgMjV2MTUwaC0xNTlsLTYwMCAtNjAwaC0yOTFxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjA5bDYwMCA2MDBoMjQxdjE1MHEwIDIxIDEwLjUgMjV0MjQuNSAtMTB6TTUyMiA4MTlsLTE0MSAtMTQxbC0xMjIgMTIyaC0yMDlxLTIxIDAgLTM1LjUgMTQuNSB0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDI5MXpNMTEzNSA1NjVsMjQ5IC0yMzBxMTUgLTE0IDE1IC0zNXQtMTUgLTM1bC0yNDkgLTIzMHEtMTQgLTE0IC0yNC41IC0xMHQtMTAuNSAyNXYxNTBoLTI0MWwtMTgxIDE4MWwxNDEgMTQxbDEyMiAtMTIyaDE1OXYxNTBxMCAyMSAxMC41IDI1dDI0LjUgLTEweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTE7IiBkPSJNMTAwIDExMDBoMTAwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNjAwcTAgLTQxIC0yOS41IC03MC41dC03MC41IC0yOS41aC01OTZsLTMwNCAtMzAwdjMwMGgtMTAwcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXY2MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTI7IiBkPSJNMTUwIDEyMDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yNTBoLTMwMHYyNTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek04NTAgMTIwMGgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTI1MGgtMzAwdjI1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTExMDAgODAwdi0zMDBxMCAtNDEgLTMgLTc3LjV0LTE1IC04OS41dC0zMiAtOTZ0LTU4IC04OXQtODkgLTc3dC0xMjkgLTUxdC0xNzQgLTIwdC0xNzQgMjAgdC0xMjkgNTF0LTg5IDc3dC01OCA4OXQtMzIgOTZ0LTE1IDg5LjV0LTMgNzcuNXYzMDBoMzAwdi0yNTB2LTI3di00Mi41dDEuNSAtNDF0NSAtMzh0MTAgLTM1dDE2LjUgLTMwdDI1LjUgLTI0LjV0MzUgLTE5dDQ2LjUgLTEydDYwIC00dDYwIDQuNXQ0Ni41IDEyLjV0MzUgMTkuNXQyNSAyNS41dDE3IDMwLjV0MTAgMzV0NSAzOHQyIDQwLjV0LTAuNSA0MnYyNXYyNTBoMzAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTM7IiBkPSJNMTEwMCA0MTFsLTE5OCAtMTk5bC0zNTMgMzUzbC0zNTMgLTM1M2wtMTk3IDE5OWw1NTEgNTUxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTQ7IiBkPSJNMTEwMSA3ODlsLTU1MCAtNTUxbC01NTEgNTUxbDE5OCAxOTlsMzUzIC0zNTNsMzUzIDM1M3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTE1OyIgZD0iTTQwNCAxMDAwaDc0NnEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTUxaDE1MHEyMSAwIDI1IC0xMC41dC0xMCAtMjQuNWwtMjMwIC0yNDlxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI0OXEtMTQgMTQgLTEwIDI0LjV0MjUgMTAuNWgxNTB2NDAxaC0zODF6TTEzNSA5ODRsMjMwIC0yNDlxMTQgLTE0IDEwIC0yNC41dC0yNSAtMTAuNWgtMTUwdi00MDBoMzg1bDIxNSAtMjAwaC03NTBxLTIxIDAgLTM1LjUgMTQuNSB0LTE0LjUgMzUuNXY1NTBoLTE1MHEtMjEgMCAtMjUgMTAuNXQxMCAyNC41bDIzMCAyNDlxMTQgMTUgMzUgMTV0MzUgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTY7IiBkPSJNNTYgMTIwMGg5NHExNyAwIDMxIC0xMXQxOCAtMjdsMzggLTE2Mmg4OTZxMjQgMCAzOSAtMTguNXQxMCAtNDIuNWwtMTAwIC00NzVxLTUgLTIxIC0yNyAtNDIuNXQtNTUgLTIxLjVoLTYzM2w0OCAtMjAwaDUzNXEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTB2LTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41dC0zNS41IDE0LjV0LTE0LjUgMzUuNXY1MGgtMzAwdi01MCBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjV0LTM1LjUgMTQuNXQtMTQuNSAzNS41djUwaC0zMXEtMTggMCAtMzIuNSAxMHQtMjAuNSAxOWwtNSAxMGwtMjAxIDk2MWgtNTRxLTIwIDAgLTM1IDE0LjV0LTE1IDM1LjV0MTUgMzUuNXQzNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTc7IiBkPSJNMTIwMCAxMDAwdi0xMDBoLTEyMDB2MTAwaDIwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjVoMzAwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41aDUwMHpNMCA4MDBoMTIwMHYtODAwaC0xMjAwdjgwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTE4OyIgZD0iTTIwMCA4MDBsLTIwMCAtNDAwdjYwMGgyMDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDMwMHE0MiAwIDcxIC0yOS41dDI5IC03MC41aDUwMHYtMjAwaC0xMDAwek0xNTAwIDcwMGwtMzAwIC03MDBoLTEyMDBsMzAwIDcwMGgxMjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMTk7IiBkPSJNNjM1IDExODRsMjMwIC0yNDlxMTQgLTE0IDEwIC0yNC41dC0yNSAtMTAuNWgtMTUwdi02MDFoMTUwcTIxIDAgMjUgLTEwLjV0LTEwIC0yNC41bC0yMzAgLTI0OXEtMTQgLTE1IC0zNSAtMTV0LTM1IDE1bC0yMzAgMjQ5cS0xNCAxNCAtMTAgMjQuNXQyNSAxMC41aDE1MHY2MDFoLTE1MHEtMjEgMCAtMjUgMTAuNXQxMCAyNC41bDIzMCAyNDlxMTQgMTUgMzUgMTV0MzUgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMjA7IiBkPSJNOTM2IDg2NGwyNDkgLTIyOXExNCAtMTUgMTQgLTM1LjV0LTE0IC0zNS41bC0yNDkgLTIyOXEtMTUgLTE1IC0yNS41IC0xMC41dC0xMC41IDI0LjV2MTUxaC02MDB2LTE1MXEwIC0yMCAtMTAuNSAtMjQuNXQtMjUuNSAxMC41bC0yNDkgMjI5cS0xNCAxNSAtMTQgMzUuNXQxNCAzNS41bDI0OSAyMjlxMTUgMTUgMjUuNSAxMC41dDEwLjUgLTI1LjV2LTE0OWg2MDB2MTQ5cTAgMjEgMTAuNSAyNS41dDI1LjUgLTEwLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEyMTsiIGQ9Ik0xMTY5IDQwMGwtMTcyIDczMnEtNSAyMyAtMjMgNDUuNXQtMzggMjIuNWgtNjcycS0yMCAwIC0zOCAtMjB0LTIzIC00MWwtMTcyIC03MzloMTEzOHpNMTEwMCAzMDBoLTEwMDBxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTEwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoMTAwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2MTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41ek04MDAgMTAwdjEwMGgxMDB2LTEwMGgtMTAwIHpNMTAwMCAxMDB2MTAwaDEwMHYtMTAwaC0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEyMjsiIGQ9Ik0xMTUwIDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTg1MHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNXQtMzUuNSAxNC41dC0xNC41IDM1LjV2ODUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNMTAwMCAyMDBsLTY3NSAyMDBoLTM4bDQ3IC0yNzZxMyAtMTYgLTUuNSAtMjB0LTI5LjUgLTRoLTdoLTg0cS0yMCAwIC0zNC41IDE0dC0xOC41IDM1cS01NSAzMzcgLTU1IDM1MXYyNTB2NnEwIDE2IDEgMjMuNXQ2LjUgMTQgdDE3LjUgNi41aDIwMGw2NzUgMjUwdi04NTB6TTAgNzUwdi0yNTBxLTQgMCAtMTEgMC41dC0yNCA2dC0zMCAxNXQtMjQgMzB0LTExIDQ4LjV2NTBxMCAyNiAxMC41IDQ2dDI1IDMwdDI5IDE2dDI1LjUgN3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTIzOyIgZD0iTTU1MyAxMjAwaDk0cTIwIDAgMjkgLTEwLjV0MyAtMjkuNWwtMTggLTM3cTgzIC0xOSAxNDQgLTgyLjV0NzYgLTE0MC41bDYzIC0zMjdsMTE4IC0xNzNoMTdxMTkgMCAzMyAtMTQuNXQxNCAtMzV0LTEzIC00MC41dC0zMSAtMjdxLTggLTQgLTIzIC05LjV0LTY1IC0xOS41dC0xMDMgLTI1dC0xMzIuNSAtMjB0LTE1OC41IC05cS01NyAwIC0xMTUgNXQtMTA0IDEydC04OC41IDE1LjV0LTczLjUgMTcuNXQtNTQuNSAxNnQtMzUuNSAxMmwtMTEgNCBxLTE4IDggLTMxIDI4dC0xMyA0MC41dDE0IDM1dDMzIDE0LjVoMTdsMTE4IDE3M2w2MyAzMjdxMTUgNzcgNzYgMTQwdDE0NCA4M2wtMTggMzJxLTYgMTkgMy41IDMydDI4LjUgMTN6TTQ5OCAxMTBxNTAgLTYgMTAyIC02cTUzIDAgMTAyIDZxLTEyIC00OSAtMzkuNSAtNzkuNXQtNjIuNSAtMzAuNXQtNjMgMzAuNXQtMzkgNzkuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTI0OyIgZD0iTTgwMCA5NDZsMjI0IDc4bC03OCAtMjI0bDIzNCAtNDVsLTE4MCAtMTU1bDE4MCAtMTU1bC0yMzQgLTQ1bDc4IC0yMjRsLTIyNCA3OGwtNDUgLTIzNGwtMTU1IDE4MGwtMTU1IC0xODBsLTQ1IDIzNGwtMjI0IC03OGw3OCAyMjRsLTIzNCA0NWwxODAgMTU1bC0xODAgMTU1bDIzNCA0NWwtNzggMjI0bDIyNCAtNzhsNDUgMjM0bDE1NSAtMTgwbDE1NSAxODB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEyNTsiIGQ9Ik02NTAgMTIwMGg1MHE0MCAwIDcwIC00MC41dDMwIC04NC41di0xNTBsLTI4IC0xMjVoMzI4cTQwIDAgNzAgLTQwLjV0MzAgLTg0LjV2LTEwMHEwIC00NSAtMjkgLTc0bC0yMzggLTM0NHEtMTYgLTI0IC0zOCAtNDAuNXQtNDUgLTE2LjVoLTI1MHEtNyAwIC00MiAyNXQtNjYgNTBsLTMxIDI1aC02MXEtNDUgMCAtNzIuNSAxOHQtMjcuNSA1N3Y0MDBxMCAzNiAyMCA2M2wxNDUgMTk2bDk2IDE5OHExMyAyOCAzNy41IDQ4dDUxLjUgMjB6IE02NTAgMTEwMGwtMTAwIC0yMTJsLTE1MCAtMjEzdi0zNzVoMTAwbDEzNiAtMTAwaDIxNGwyNTAgMzc1djEyNWgtNDUwbDUwIDIyNXYxNzVoLTUwek01MCA4MDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTI2OyIgZD0iTTYwMCAxMTAwaDI1MHEyMyAwIDQ1IC0xNi41dDM4IC00MC41bDIzOCAtMzQ0cTI5IC0yOSAyOSAtNzR2LTEwMHEwIC00NCAtMzAgLTg0LjV0LTcwIC00MC41aC0zMjhxMjggLTExOCAyOCAtMTI1di0xNTBxMCAtNDQgLTMwIC04NC41dC03MCAtNDAuNWgtNTBxLTI3IDAgLTUxLjUgMjB0LTM3LjUgNDhsLTk2IDE5OGwtMTQ1IDE5NnEtMjAgMjcgLTIwIDYzdjQwMHEwIDM5IDI3LjUgNTd0NzIuNSAxOGg2MXExMjQgMTAwIDEzOSAxMDB6IE01MCAxMDAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djUwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTYzNiAxMDAwbC0xMzYgLTEwMGgtMTAwdi0zNzVsMTUwIC0yMTNsMTAwIC0yMTJoNTB2MTc1bC01MCAyMjVoNDUwdjEyNWwtMjUwIDM3NWgtMjE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMjc7IiBkPSJNMzU2IDg3M2wzNjMgMjMwcTMxIDE2IDUzIC02bDExMCAtMTEycTEzIC0xMyAxMy41IC0zMnQtMTEuNSAtMzRsLTg0IC0xMjFoMzAycTg0IDAgMTM4IC0zOHQ1NCAtMTEwdC01NSAtMTExdC0xMzkgLTM5aC0xMDZsLTEzMSAtMzM5cS02IC0yMSAtMTkuNSAtNDF0LTI4LjUgLTIwaC0zNDJxLTcgMCAtOTAgODF0LTgzIDk0djUyNXEwIDE3IDE0IDM1LjV0MjggMjguNXpNNDAwIDc5MnYtNTAzbDEwMCAtODloMjkzbDEzMSAzMzkgcTYgMjEgMTkuNSA0MXQyOC41IDIwaDIwM3EyMSAwIDMwLjUgMjV0MC41IDUwdC0zMSAyNWgtNDU2aC03aC02aC01LjV0LTYgMC41dC01IDEuNXQtNSAydC00IDIuNXQtNCA0dC0yLjUgNC41cS0xMiAyNSA1IDQ3bDE0NiAxODNsLTg2IDgzek01MCA4MDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NTAwIHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEyODsiIGQ9Ik00NzUgMTEwM2wzNjYgLTIzMHEyIC0xIDYgLTMuNXQxNCAtMTAuNXQxOCAtMTYuNXQxNC41IC0yMHQ2LjUgLTIyLjV2LTUyNXEwIC0xMyAtODYgLTk0dC05MyAtODFoLTM0MnEtMTUgMCAtMjguNSAyMHQtMTkuNSA0MWwtMTMxIDMzOWgtMTA2cS04NSAwIC0xMzkuNSAzOXQtNTQuNSAxMTF0NTQgMTEwdDEzOCAzOGgzMDJsLTg1IDEyMXEtMTEgMTUgLTEwLjUgMzR0MTMuNSAzMmwxMTAgMTEycTIyIDIyIDUzIDZ6TTM3MCA5NDVsMTQ2IC0xODMgcTE3IC0yMiA1IC00N3EtMiAtMiAtMy41IC00LjV0LTQgLTR0LTQgLTIuNXQtNSAtMnQtNSAtMS41dC02IC0wLjVoLTZoLTYuNWgtNmgtNDc1di0xMDBoMjIxcTE1IDAgMjkgLTIwdDIwIC00MWwxMzAgLTMzOWgyOTRsMTA2IDg5djUwM2wtMzQyIDIzNnpNMTA1MCA4MDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjUgdjUwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEyOTsiIGQ9Ik01NTAgMTI5NHE3MiAwIDExMSAtNTV0MzkgLTEzOXYtMTA2bDMzOSAtMTMxcTIxIC02IDQxIC0xOS41dDIwIC0yOC41di0zNDJxMCAtNyAtODEgLTkwdC05NCAtODNoLTUyNXEtMTcgMCAtMzUuNSAxNHQtMjguNSAyOGwtOSAxNGwtMjMwIDM2M3EtMTYgMzEgNiA1M2wxMTIgMTEwcTEzIDEzIDMyIDEzLjV0MzQgLTExLjVsMTIxIC04NHYzMDJxMCA4NCAzOCAxMzh0MTEwIDU0ek02MDAgOTcydjIwM3EwIDIxIC0yNSAzMC41dC01MCAwLjUgdC0yNSAtMzF2LTQ1NnYtN3YtNnYtNS41dC0wLjUgLTZ0LTEuNSAtNXQtMiAtNXQtMi41IC00dC00IC00dC00LjUgLTIuNXEtMjUgLTEyIC00NyA1bC0xODMgMTQ2bC04MyAtODZsMjM2IC0zMzloNTAzbDg5IDEwMHYyOTNsLTMzOSAxMzFxLTIxIDYgLTQxIDE5LjV0LTIwIDI4LjV6TTQ1MCAyMDBoNTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTUwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEzMDsiIGQ9Ik0zNTAgMTEwMGg1MDBxMjEgMCAzNS41IDE0LjV0MTQuNSAzNS41djEwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtNTAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDBxMCAtMjEgMTQuNSAtMzUuNXQzNS41IC0xNC41ek02MDAgMzA2di0xMDZxMCAtODQgLTM5IC0xMzl0LTExMSAtNTV0LTExMCA1NHQtMzggMTM4djMwMmwtMTIxIC04NHEtMTUgLTEyIC0zNCAtMTEuNXQtMzIgMTMuNWwtMTEyIDExMCBxLTIyIDIyIC02IDUzbDIzMCAzNjNxMSAyIDMuNSA2dDEwLjUgMTMuNXQxNi41IDE3dDIwIDEzLjV0MjIuNSA2aDUyNXExMyAwIDk0IC04M3Q4MSAtOTB2LTM0MnEwIC0xNSAtMjAgLTI4LjV0LTQxIC0xOS41ek0zMDggOTAwbC0yMzYgLTMzOWw4MyAtODZsMTgzIDE0NnEyMiAxNyA0NyA1cTIgLTEgNC41IC0yLjV0NCAtNHQyLjUgLTR0MiAtNXQxLjUgLTV0MC41IC02di01LjV2LTZ2LTd2LTQ1NnEwIC0yMiAyNSAtMzF0NTAgMC41dDI1IDMwLjUgdjIwM3EwIDE1IDIwIDI4LjV0NDEgMTkuNWwzMzkgMTMxdjI5M2wtODkgMTAwaC01MDN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEzMTsiIGQ9Ik02MDAgMTE3OHExMTggMCAyMjUgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNXQtNDUuNSAtMjI1dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjUgLTQ1LjV0LTIyNSA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjV0NDUuNSAyMjV0MTIzIDE4NC41dDE4NC41IDEyM3QyMjUgNDUuNXpNOTE0IDYzMmwtMjc1IDIyM3EtMTYgMTMgLTI3LjUgOHQtMTEuNSAtMjZ2LTEzN2gtMjc1IHEtMTAgMCAtMTcuNSAtNy41dC03LjUgLTE3LjV2LTE1MHEwIC0xMCA3LjUgLTE3LjV0MTcuNSAtNy41aDI3NXYtMTM3cTAgLTIxIDExLjUgLTI2dDI3LjUgOGwyNzUgMjIzcTE2IDEzIDE2IDMydC0xNiAzMnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTMyOyIgZD0iTTYwMCAxMTc4cTExOCAwIDIyNSAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI1dC00NS41IC0yMjV0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNSAtNDUuNXQtMjI1IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNXQ0NS41IDIyNXQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNSA0NS41ek01NjEgODU1bC0yNzUgLTIyM3EtMTYgLTEzIC0xNiAtMzJ0MTYgLTMybDI3NSAtMjIzcTE2IC0xMyAyNy41IC04IHQxMS41IDI2djEzN2gyNzVxMTAgMCAxNy41IDcuNXQ3LjUgMTcuNXYxNTBxMCAxMCAtNy41IDE3LjV0LTE3LjUgNy41aC0yNzV2MTM3cTAgMjEgLTExLjUgMjZ0LTI3LjUgLTh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEzMzsiIGQ9Ik02MDAgMTE3OHExMTggMCAyMjUgLTQ1LjV0MTg0LjUgLTEyM3QxMjMgLTE4NC41dDQ1LjUgLTIyNXQtNDUuNSAtMjI1dC0xMjMgLTE4NC41dC0xODQuNSAtMTIzdC0yMjUgLTQ1LjV0LTIyNSA0NS41dC0xODQuNSAxMjN0LTEyMyAxODQuNXQtNDUuNSAyMjV0NDUuNSAyMjV0MTIzIDE4NC41dDE4NC41IDEyM3QyMjUgNDUuNXpNODU1IDYzOWwtMjIzIDI3NXEtMTMgMTYgLTMyIDE2dC0zMiAtMTZsLTIyMyAtMjc1cS0xMyAtMTYgLTggLTI3LjUgdDI2IC0xMS41aDEzN3YtMjc1cTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoMTUwcTEwIDAgMTcuNSA3LjV0Ny41IDE3LjV2Mjc1aDEzN3EyMSAwIDI2IDExLjV0LTggMjcuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTM0OyIgZD0iTTYwMCAxMTc4cTExOCAwIDIyNSAtNDUuNXQxODQuNSAtMTIzdDEyMyAtMTg0LjV0NDUuNSAtMjI1dC00NS41IC0yMjV0LTEyMyAtMTg0LjV0LTE4NC41IC0xMjN0LTIyNSAtNDUuNXQtMjI1IDQ1LjV0LTE4NC41IDEyM3QtMTIzIDE4NC41dC00NS41IDIyNXQ0NS41IDIyNXQxMjMgMTg0LjV0MTg0LjUgMTIzdDIyNSA0NS41ek02NzUgOTAwaC0xNTBxLTEwIDAgLTE3LjUgLTcuNXQtNy41IC0xNy41di0yNzVoLTEzN3EtMjEgMCAtMjYgLTExLjUgdDggLTI3LjVsMjIzIC0yNzVxMTMgLTE2IDMyIC0xNnQzMiAxNmwyMjMgMjc1cTEzIDE2IDggMjcuNXQtMjYgMTEuNWgtMTM3djI3NXEwIDEwIC03LjUgMTcuNXQtMTcuNSA3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTEzNTsiIGQ9Ik02MDAgMTE3NnExMTYgMCAyMjIuNSAtNDZ0MTg0IC0xMjMuNXQxMjMuNSAtMTg0dDQ2IC0yMjIuNXQtNDYgLTIyMi41dC0xMjMuNSAtMTg0dC0xODQgLTEyMy41dC0yMjIuNSAtNDZ0LTIyMi41IDQ2dC0xODQgMTIzLjV0LTEyMy41IDE4NHQtNDYgMjIyLjV0NDYgMjIyLjV0MTIzLjUgMTg0dDE4NCAxMjMuNXQyMjIuNSA0NnpNNjI3IDExMDFxLTE1IC0xMiAtMzYuNSAtMjAuNXQtMzUuNSAtMTJ0LTQzIC04dC0zOSAtNi41IHEtMTUgLTMgLTQ1LjUgMHQtNDUuNSAtMnEtMjAgLTcgLTUxLjUgLTI2LjV0LTM0LjUgLTM0LjVxLTMgLTExIDYuNSAtMjIuNXQ4LjUgLTE4LjVxLTMgLTM0IC0yNy41IC05MXQtMjkuNSAtNzlxLTkgLTM0IDUgLTkzdDggLTg3cTAgLTkgMTcgLTQ0LjV0MTYgLTU5LjVxMTIgMCAyMyAtNXQyMy41IC0xNXQxOS41IC0xNHExNiAtOCAzMyAtMTV0NDAuNSAtMTV0MzQuNSAtMTJxMjEgLTkgNTIuNSAtMzJ0NjAgLTM4dDU3LjUgLTExIHE3IC0xNSAtMyAtMzR0LTIyLjUgLTQwdC05LjUgLTM4cTEzIC0yMSAyMyAtMzQuNXQyNy41IC0yNy41dDM2LjUgLTE4cTAgLTcgLTMuNSAtMTZ0LTMuNSAtMTR0NSAtMTdxMTA0IC0yIDIyMSAxMTJxMzAgMjkgNDYuNSA0N3QzNC41IDQ5dDIxIDYzcS0xMyA4IC0zNyA4LjV0LTM2IDcuNXEtMTUgNyAtNDkuNSAxNXQtNTEuNSAxOXEtMTggMCAtNDEgLTAuNXQtNDMgLTEuNXQtNDIgLTYuNXQtMzggLTE2LjVxLTUxIC0zNSAtNjYgLTEyIHEtNCAxIC0zLjUgMjUuNXQwLjUgMjUuNXEtNiAxMyAtMjYuNSAxNy41dC0yNC41IDYuNXExIDE1IC0wLjUgMzAuNXQtNyAyOHQtMTguNSAxMS41dC0zMSAtMjFxLTIzIC0yNSAtNDIgNHEtMTkgMjggLTggNThxNiAxNiAyMiAyMnE2IC0xIDI2IC0xLjV0MzMuNSAtNHQxOS41IC0xMy41cTcgLTEyIDE4IC0yNHQyMS41IC0yMC41dDIwIC0xNXQxNS41IC0xMC41bDUgLTNxMiAxMiA3LjUgMzAuNXQ4IDM0LjV0LTAuNSAzMnEtMyAxOCAzLjUgMjkgdDE4IDIyLjV0MTUuNSAyNC41cTYgMTQgMTAuNSAzNXQ4IDMxdDE1LjUgMjIuNXQzNCAyMi41cS02IDE4IDEwIDM2cTggMCAyNCAtMS41dDI0LjUgLTEuNXQyMCA0LjV0MjAuNSAxNS41cS0xMCAyMyAtMzEgNDIuNXQtMzcuNSAyOS41dC00OSAyN3QtNDMuNSAyM3EwIDEgMiA4dDMgMTEuNXQxLjUgMTAuNXQtMSA5LjV0LTQuNSA0LjVxMzEgLTEzIDU4LjUgLTE0LjV0MzguNSAyLjVsMTIgNXE1IDI4IC05LjUgNDZ0LTM2LjUgMjR0LTUwIDE1IHQtNDEgMjBxLTE4IC00IC0zNyAwek02MTMgOTk0cTAgLTE3IDggLTQydDE3IC00NXQ5IC0yM3EtOCAxIC0zOS41IDUuNXQtNTIuNSAxMHQtMzcgMTYuNXEzIDExIDE2IDI5LjV0MTYgMjUuNXExMCAtMTAgMTkgLTEwdDE0IDZ0MTMuNSAxNC41dDE2LjUgMTIuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTM2OyIgZD0iTTc1NiAxMTU3cTE2NCA5MiAzMDYgLTlsLTI1OSAtMTM4bDE0NSAtMjMybDI1MSAxMjZxNiAtODkgLTM0IC0xNTYuNXQtMTE3IC0xMTAuNXEtNjAgLTM0IC0xMjcgLTM5LjV0LTEyNiAxNi41bC01OTYgLTU5NnEtMTUgLTE2IC0zNi41IC0xNnQtMzYuNSAxNmwtMTExIDExMHEtMTUgMTUgLTE1IDM2LjV0MTUgMzcuNWw2MDAgNTk5cS0zNCAxMDEgNS41IDIwMS41dDEzNS41IDE1NC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMzc7IiBob3Jpei1hZHYteD0iMTIyMCIgZD0iTTEwMCAxMTk2aDEwMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTEwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtMTAwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV2MTAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNXpNMTEwMCAxMDk2aC0yMDB2LTEwMGgyMDB2MTAwek0xMDAgNzk2aDEwMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTEwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtMTAwMCBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41djEwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjV6TTExMDAgNjk2aC01MDB2LTEwMGg1MDB2MTAwek0xMDAgMzk2aDEwMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTEwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtMTAwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV2MTAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNXpNMTEwMCAyOTZoLTMwMHYtMTAwaDMwMHYxMDB6ICIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxMzg7IiBkPSJNMTUwIDEyMDBoOTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41dC0xNC41IC0zNS41dC0zNS41IC0xNC41aC05MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6TTcwMCA1MDB2LTMwMGwtMjAwIC0yMDB2NTAwbC0zNTAgNTAwaDkwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTM5OyIgZD0iTTUwMCAxMjAwaDIwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtMTAwaDMwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNDAwaC01MDB2MTAwaC0yMDB2LTEwMGgtNTAwdjQwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjVoMzAwdjEwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjV6TTUwMCAxMTAwdi0xMDBoMjAwdjEwMGgtMjAwek0xMjAwIDQwMHYtMjAwcTAgLTQxIC0yOS41IC03MC41dC03MC41IC0yOS41aC0xMDAwIHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV2MjAwaDEyMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE0MDsiIGQ9Ik01MCAxMjAwaDMwMHEyMSAwIDI1IC0xMC41dC0xMCAtMjQuNWwtOTQgLTk0bDE5OSAtMTk5cTcgLTggNyAtMTh0LTcgLTE4bC0xMDYgLTEwNnEtOCAtNyAtMTggLTd0LTE4IDdsLTE5OSAxOTlsLTk0IC05NHEtMTQgLTE0IC0yNC41IC0xMHQtMTAuNSAyNXYzMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek04NTAgMTIwMGgzMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTMwMHEwIC0yMSAtMTAuNSAtMjV0LTI0LjUgMTBsLTk0IDk0IGwtMTk5IC0xOTlxLTggLTcgLTE4IC03dC0xOCA3bC0xMDYgMTA2cS03IDggLTcgMTh0NyAxOGwxOTkgMTk5bC05NCA5NHEtMTQgMTQgLTEwIDI0LjV0MjUgMTAuNXpNMzY0IDQ3MGwxMDYgLTEwNnE3IC04IDcgLTE4dC03IC0xOGwtMTk5IC0xOTlsOTQgLTk0cTE0IC0xNCAxMCAtMjQuNXQtMjUgLTEwLjVoLTMwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MzAwcTAgMjEgMTAuNSAyNXQyNC41IC0xMGw5NCAtOTRsMTk5IDE5OSBxOCA3IDE4IDd0MTggLTd6TTEwNzEgMjcxbDk0IDk0cTE0IDE0IDI0LjUgMTB0MTAuNSAtMjV2LTMwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMzAwcS0yMSAwIC0yNSAxMC41dDEwIDI0LjVsOTQgOTRsLTE5OSAxOTlxLTcgOCAtNyAxOHQ3IDE4bDEwNiAxMDZxOCA3IDE4IDd0MTggLTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE0MTsiIGQ9Ik01OTYgMTE5MnExMjEgMCAyMzEuNSAtNDcuNXQxOTAgLTEyN3QxMjcgLTE5MHQ0Ny41IC0yMzEuNXQtNDcuNSAtMjMxLjV0LTEyNyAtMTkwLjV0LTE5MCAtMTI3dC0yMzEuNSAtNDd0LTIzMS41IDQ3dC0xOTAuNSAxMjd0LTEyNyAxOTAuNXQtNDcgMjMxLjV0NDcgMjMxLjV0MTI3IDE5MHQxOTAuNSAxMjd0MjMxLjUgNDcuNXpNNTk2IDEwMTBxLTExMiAwIC0yMDcuNSAtNTUuNXQtMTUxIC0xNTF0LTU1LjUgLTIwNy41dDU1LjUgLTIwNy41IHQxNTEgLTE1MXQyMDcuNSAtNTUuNXQyMDcuNSA1NS41dDE1MSAxNTF0NTUuNSAyMDcuNXQtNTUuNSAyMDcuNXQtMTUxIDE1MXQtMjA3LjUgNTUuNXpNNDU0LjUgOTA1cTIyLjUgMCAzOC41IC0xNnQxNiAtMzguNXQtMTYgLTM5dC0zOC41IC0xNi41dC0zOC41IDE2LjV0LTE2IDM5dDE2IDM4LjV0MzguNSAxNnpNNzU0LjUgOTA1cTIyLjUgMCAzOC41IC0xNnQxNiAtMzguNXQtMTYgLTM5dC0zOCAtMTYuNXEtMTQgMCAtMjkgMTBsLTU1IC0xNDUgcTE3IC0yMyAxNyAtNTFxMCAtMzYgLTI1LjUgLTYxLjV0LTYxLjUgLTI1LjV0LTYxLjUgMjUuNXQtMjUuNSA2MS41cTAgMzIgMjAuNSA1Ni41dDUxLjUgMjkuNWwxMjIgMTI2bDEgMXEtOSAxNCAtOSAyOHEwIDIzIDE2IDM5dDM4LjUgMTZ6TTM0NS41IDcwOXEyMi41IDAgMzguNSAtMTZ0MTYgLTM4LjV0LTE2IC0zOC41dC0zOC41IC0xNnQtMzguNSAxNnQtMTYgMzguNXQxNiAzOC41dDM4LjUgMTZ6TTg1NC41IDcwOXEyMi41IDAgMzguNSAtMTYgdDE2IC0zOC41dC0xNiAtMzguNXQtMzguNSAtMTZ0LTM4LjUgMTZ0LTE2IDM4LjV0MTYgMzguNXQzOC41IDE2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNDI7IiBkPSJNNTQ2IDE3M2w0NjkgNDcwcTkxIDkxIDk5IDE5MnE3IDk4IC01MiAxNzUuNXQtMTU0IDk0LjVxLTIyIDQgLTQ3IDRxLTM0IDAgLTY2LjUgLTEwdC01Ni41IC0yM3QtNTUuNSAtMzh0LTQ4IC00MS41dC00OC41IC00Ny41cS0zNzYgLTM3NSAtMzkxIC0zOTBxLTMwIC0yNyAtNDUgLTQxLjV0LTM3LjUgLTQxdC0zMiAtNDYuNXQtMTYgLTQ3LjV0LTEuNSAtNTYuNXE5IC02MiA1My41IC05NXQ5OS41IC0zM3E3NCAwIDEyNSA1MWw1NDggNTQ4IHEzNiAzNiAyMCA3NXEtNyAxNiAtMjEuNSAyNnQtMzIuNSAxMHEtMjYgMCAtNTAgLTIzcS0xMyAtMTIgLTM5IC0zOGwtMzQxIC0zMzhxLTE1IC0xNSAtMzUuNSAtMTUuNXQtMzQuNSAxMy41dC0xNCAzNC41dDE0IDM0LjVxMzI3IDMzMyAzNjEgMzY3cTM1IDM1IDY3LjUgNTEuNXQ3OC41IDE2LjVxMTQgMCAyOSAtMXE0NCAtOCA3NC41IC0zNS41dDQzLjUgLTY4LjVxMTQgLTQ3IDIgLTk2LjV0LTQ3IC04NC41cS0xMiAtMTEgLTMyIC0zMiB0LTc5LjUgLTgxdC0xMTQuNSAtMTE1dC0xMjQuNSAtMTIzLjV0LTEyMyAtMTE5LjV0LTk2LjUgLTg5dC01NyAtNDVxLTU2IC0yNyAtMTIwIC0yN3EtNzAgMCAtMTI5IDMydC05MyA4OXEtNDggNzggLTM1IDE3M3Q4MSAxNjNsNTExIDUxMXE3MSA3MiAxMTEgOTZxOTEgNTUgMTk4IDU1cTgwIDAgMTUyIC0zM3E3OCAtMzYgMTI5LjUgLTEwM3Q2Ni41IC0xNTRxMTcgLTkzIC0xMSAtMTgzLjV0LTk0IC0xNTYuNWwtNDgyIC00NzYgcS0xNSAtMTUgLTM2IC0xNnQtMzcgMTR0LTE3LjUgMzR0MTQuNSAzNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTQzOyIgZD0iTTY0OSA5NDlxNDggNjggMTA5LjUgMTA0dDEyMS41IDM4LjV0MTE4LjUgLTIwdDEwMi41IC02NHQ3MSAtMTAwLjV0MjcgLTEyM3EwIC01NyAtMzMuNSAtMTE3LjV0LTk0IC0xMjQuNXQtMTI2LjUgLTEyNy41dC0xNTAgLTE1Mi41dC0xNDYgLTE3NHEtNjIgODUgLTE0NS41IDE3NHQtMTUwIDE1Mi41dC0xMjYuNSAxMjcuNXQtOTMuNSAxMjQuNXQtMzMuNSAxMTcuNXEwIDY0IDI4IDEyM3Q3MyAxMDAuNXQxMDQgNjR0MTE5IDIwIHQxMjAuNSAtMzguNXQxMDQuNSAtMTA0ek04OTYgOTcycS0zMyAwIC02NC41IC0xOXQtNTYuNSAtNDZ0LTQ3LjUgLTUzLjV0LTQzLjUgLTQ1LjV0LTM3LjUgLTE5dC0zNiAxOXQtNDAgNDUuNXQtNDMgNTMuNXQtNTQgNDZ0LTY1LjUgMTlxLTY3IDAgLTEyMi41IC01NS41dC01NS41IC0xMzIuNXEwIC0yMyAxMy41IC01MXQ0NiAtNjV0NTcuNSAtNjN0NzYgLTc1bDIyIC0yMnExNSAtMTQgNDQgLTQ0dDUwLjUgLTUxdDQ2IC00NHQ0MSAtMzV0MjMgLTEyIHQyMy41IDEydDQyLjUgMzZ0NDYgNDR0NTIuNSA1MnQ0NCA0M3E0IDQgMTIgMTNxNDMgNDEgNjMuNSA2MnQ1MiA1NXQ0NiA1NXQyNiA0NnQxMS41IDQ0cTAgNzkgLTUzIDEzMy41dC0xMjAgNTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTQ0OyIgZD0iTTc3Ni41IDEyMTRxOTMuNSAwIDE1OS41IC02NmwxNDEgLTE0MXE2NiAtNjYgNjYgLTE2MHEwIC00MiAtMjggLTk1LjV0LTYyIC04Ny41bC0yOSAtMjlxLTMxIDUzIC03NyA5OWwtMTggMThsOTUgOTVsLTI0NyAyNDhsLTM4OSAtMzg5bDIxMiAtMjEybC0xMDUgLTEwNmwtMTkgMThsLTE0MSAxNDFxLTY2IDY2IC02NiAxNTl0NjYgMTU5bDI4MyAyODNxNjUgNjYgMTU4LjUgNjZ6TTYwMCA3MDZsMTA1IDEwNXExMCAtOCAxOSAtMTdsMTQxIC0xNDEgcTY2IC02NiA2NiAtMTU5dC02NiAtMTU5bC0yODMgLTI4M3EtNjYgLTY2IC0xNTkgLTY2dC0xNTkgNjZsLTE0MSAxNDFxLTY2IDY2IC02NiAxNTkuNXQ2NiAxNTkuNWw1NSA1NXEyOSAtNTUgNzUgLTEwMmwxOCAtMTdsLTk1IC05NWwyNDcgLTI0OGwzODkgMzg5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNDU7IiBkPSJNNjAzIDEyMDBxODUgMCAxNjIgLTE1dDEyNyAtMzh0NzkgLTQ4dDI5IC00NnYtOTUzcTAgLTQxIC0yOS41IC03MC41dC03MC41IC0yOS41aC02MDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41djk1M3EwIDIxIDMwIDQ2LjV0ODEgNDh0MTI5IDM3LjV0MTYzIDE1ek0zMDAgMTAwMHYtNzAwaDYwMHY3MDBoLTYwMHpNNjAwIDI1NHEtNDMgMCAtNzMuNSAtMzAuNXQtMzAuNSAtNzMuNXQzMC41IC03My41dDczLjUgLTMwLjV0NzMuNSAzMC41IHQzMC41IDczLjV0LTMwLjUgNzMuNXQtNzMuNSAzMC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNDY7IiBkPSJNOTAyIDExODVsMjgzIC0yODJxMTUgLTE1IDE1IC0zNnQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNXQtMzUgMTVsLTM2IDM1bC0yNzkgLTI2N3YtMzAwbC0yMTIgMjEwbC0zMDggLTMwN2wtMjgwIC0yMDNsMjAzIDI4MGwzMDcgMzA4bC0yMTAgMjEyaDMwMGwyNjcgMjc5bC0zNSAzNnEtMTUgMTQgLTE1IDM1dDE0LjUgMzUuNXQzNS41IDE0LjV0MzUgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNDg7IiBkPSJNNzAwIDEyNDh2LTc4cTM4IC01IDcyLjUgLTE0LjV0NzUuNSAtMzEuNXQ3MSAtNTMuNXQ1MiAtODR0MjQgLTExOC41aC0xNTlxLTQgMzYgLTEwLjUgNTl0LTIxIDQ1dC00MCAzNS41dC02NC41IDIwLjV2LTMwN2w2NCAtMTNxMzQgLTcgNjQgLTE2LjV0NzAgLTMydDY3LjUgLTUyLjV0NDcuNSAtODB0MjAgLTExMnEwIC0xMzkgLTg5IC0yMjR0LTI0NCAtOTd2LTc3aC0xMDB2NzlxLTE1MCAxNiAtMjM3IDEwM3EtNDAgNDAgLTUyLjUgOTMuNSB0LTE1LjUgMTM5LjVoMTM5cTUgLTc3IDQ4LjUgLTEyNnQxMTcuNSAtNjV2MzM1bC0yNyA4cS00NiAxNCAtNzkgMjYuNXQtNzIgMzZ0LTYzIDUydC00MCA3Mi41dC0xNiA5OHEwIDcwIDI1IDEyNnQ2Ny41IDkydDk0LjUgNTd0MTEwIDI3djc3aDEwMHpNNjAwIDc1NHYyNzRxLTI5IC00IC01MCAtMTF0LTQyIC0yMS41dC0zMS41IC00MS41dC0xMC41IC02NXEwIC0yOSA3IC01MC41dDE2LjUgLTM0dDI4LjUgLTIyLjV0MzEuNSAtMTR0MzcuNSAtMTAgcTkgLTMgMTMgLTR6TTcwMCA1NDd2LTMxMHEyMiAyIDQyLjUgNi41dDQ1IDE1LjV0NDEuNSAyN3QyOSA0MnQxMiA1OS41dC0xMi41IDU5LjV0LTM4IDQ0LjV0LTUzIDMxdC02Ni41IDI0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE0OTsiIGQ9Ik01NjEgMTE5N3E4NCAwIDE2MC41IC00MHQxMjMuNSAtMTA5LjV0NDcgLTE0Ny41aC0xNTNxMCA0MCAtMTkuNSA3MS41dC00OS41IDQ4LjV0LTU5LjUgMjZ0LTU1LjUgOXEtMzcgMCAtNzkgLTE0LjV0LTYyIC0zNS41cS00MSAtNDQgLTQxIC0xMDFxMCAtMjYgMTMuNSAtNjN0MjYuNSAtNjF0MzcgLTY2cTYgLTkgOSAtMTRoMjQxdi0xMDBoLTE5N3E4IC01MCAtMi41IC0xMTV0LTMxLjUgLTk1cS00NSAtNjIgLTk5IC0xMTIgcTM0IDEwIDgzIDE3LjV0NzEgNy41cTMyIDEgMTAyIC0xNnQxMDQgLTE3cTgzIDAgMTM2IDMwbDUwIC0xNDdxLTMxIC0xOSAtNTggLTMwLjV0LTU1IC0xNS41dC00MiAtNC41dC00NiAtMC41cS0yMyAwIC03NiAxN3QtMTExIDMyLjV0LTk2IDExLjVxLTM5IC0zIC04MiAtMTZ0LTY3IC0yNWwtMjMgLTExbC01NSAxNDVxNCAzIDE2IDExdDE1LjUgMTAuNXQxMyA5dDE1LjUgMTJ0MTQuNSAxNHQxNy41IDE4LjVxNDggNTUgNTQgMTI2LjUgdC0zMCAxNDIuNWgtMjIxdjEwMGgxNjZxLTIzIDQ3IC00NCAxMDRxLTcgMjAgLTEyIDQxLjV0LTYgNTUuNXQ2IDY2LjV0MjkuNSA3MC41dDU4LjUgNzFxOTcgODggMjYzIDg4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTA7IiBkPSJNNDAwIDMwMGgxNTBxMjEgMCAyNSAtMTF0LTEwIC0yNWwtMjMwIC0yNTBxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI1MHEtMTQgMTQgLTEwIDI1dDI1IDExaDE1MHY5MDBoMjAwdi05MDB6TTkzNSAxMTg0bDIzMCAtMjQ5cTE0IC0xNCAxMCAtMjQuNXQtMjUgLTEwLjVoLTE1MHYtOTAwaC0yMDB2OTAwaC0xNTBxLTIxIDAgLTI1IDEwLjV0MTAgMjQuNWwyMzAgMjQ5cTE0IDE1IDM1IDE1dDM1IC0xNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTUxOyIgZD0iTTEwMDAgNzAwaC0xMDB2MTAwaC0xMDB2LTEwMGgtMTAwdjUwMGgzMDB2LTUwMHpNNDAwIDMwMGgxNTBxMjEgMCAyNSAtMTF0LTEwIC0yNWwtMjMwIC0yNTBxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI1MHEtMTQgMTQgLTEwIDI1dDI1IDExaDE1MHY5MDBoMjAwdi05MDB6TTgwMSAxMTAwdi0yMDBoMTAwdjIwMGgtMTAwek0xMDAwIDM1MGwtMjAwIC0yNTBoMjAwdi0xMDBoLTMwMHYxNTBsMjAwIDI1MGgtMjAwdjEwMGgzMDB2LTE1MHogIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE1MjsiIGQ9Ik00MDAgMzAwaDE1MHEyMSAwIDI1IC0xMXQtMTAgLTI1bC0yMzAgLTI1MHEtMTQgLTE1IC0zNSAtMTV0LTM1IDE1bC0yMzAgMjUwcS0xNCAxNCAtMTAgMjV0MjUgMTFoMTUwdjkwMGgyMDB2LTkwMHpNMTAwMCAxMDUwbC0yMDAgLTI1MGgyMDB2LTEwMGgtMzAwdjE1MGwyMDAgMjUwaC0yMDB2MTAwaDMwMHYtMTUwek0xMDAwIDBoLTEwMHYxMDBoLTEwMHYtMTAwaC0xMDB2NTAwaDMwMHYtNTAwek04MDEgNDAwdi0yMDBoMTAwdjIwMGgtMTAweiAiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTUzOyIgZD0iTTQwMCAzMDBoMTUwcTIxIDAgMjUgLTExdC0xMCAtMjVsLTIzMCAtMjUwcS0xNCAtMTUgLTM1IC0xNXQtMzUgMTVsLTIzMCAyNTBxLTE0IDE0IC0xMCAyNXQyNSAxMWgxNTB2OTAwaDIwMHYtOTAwek0xMDAwIDcwMGgtMTAwdjQwMGgtMTAwdjEwMGgyMDB2LTUwMHpNMTEwMCAwaC0xMDB2MTAwaC0yMDB2NDAwaDMwMHYtNTAwek05MDEgNDAwdi0yMDBoMTAwdjIwMGgtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTQ7IiBkPSJNNDAwIDMwMGgxNTBxMjEgMCAyNSAtMTF0LTEwIC0yNWwtMjMwIC0yNTBxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI1MHEtMTQgMTQgLTEwIDI1dDI1IDExaDE1MHY5MDBoMjAwdi05MDB6TTExMDAgNzAwaC0xMDB2MTAwaC0yMDB2NDAwaDMwMHYtNTAwek05MDEgMTEwMHYtMjAwaDEwMHYyMDBoLTEwMHpNMTAwMCAwaC0xMDB2NDAwaC0xMDB2MTAwaDIwMHYtNTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTU7IiBkPSJNNDAwIDMwMGgxNTBxMjEgMCAyNSAtMTF0LTEwIC0yNWwtMjMwIC0yNTBxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI1MHEtMTQgMTQgLTEwIDI1dDI1IDExaDE1MHY5MDBoMjAwdi05MDB6TTkwMCAxMDAwaC0yMDB2MjAwaDIwMHYtMjAwek0xMDAwIDcwMGgtMzAwdjIwMGgzMDB2LTIwMHpNMTEwMCA0MDBoLTQwMHYyMDBoNDAwdi0yMDB6TTEyMDAgMTAwaC01MDB2MjAwaDUwMHYtMjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTY7IiBkPSJNNDAwIDMwMGgxNTBxMjEgMCAyNSAtMTF0LTEwIC0yNWwtMjMwIC0yNTBxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMjMwIDI1MHEtMTQgMTQgLTEwIDI1dDI1IDExaDE1MHY5MDBoMjAwdi05MDB6TTEyMDAgMTAwMGgtNTAwdjIwMGg1MDB2LTIwMHpNMTEwMCA3MDBoLTQwMHYyMDBoNDAwdi0yMDB6TTEwMDAgNDAwaC0zMDB2MjAwaDMwMHYtMjAwek05MDAgMTAwaC0yMDB2MjAwaDIwMHYtMjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTc7IiBkPSJNMzUwIDExMDBoNDAwcTE2MiAwIDI1NiAtOTMuNXQ5NCAtMjU2LjV2LTQwMHEwIC0xNjUgLTkzLjUgLTI1Ny41dC0yNTYuNSAtOTIuNWgtNDAwcS0xNjUgMCAtMjU3LjUgOTIuNXQtOTIuNSAyNTcuNXY0MDBxMCAxNjUgOTIuNSAyNTcuNXQyNTcuNSA5Mi41ek04MDAgOTAwaC01MDBxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNSB2NTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNTg7IiBkPSJNMzUwIDExMDBoNDAwcTE2NSAwIDI1Ny41IC05Mi41dDkyLjUgLTI1Ny41di00MDBxMCAtMTY1IC05Mi41IC0yNTcuNXQtMjU3LjUgLTkyLjVoLTQwMHEtMTYzIDAgLTI1Ni41IDkyLjV0LTkzLjUgMjU3LjV2NDAwcTAgMTYzIDk0IDI1Ni41dDI1NiA5My41ek04MDAgOTAwaC01MDBxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNSB2NTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41ek00NDAgNzcwbDI1MyAtMTkwcTE3IC0xMiAxNyAtMzB0LTE3IC0zMGwtMjUzIC0xOTBxLTE2IC0xMiAtMjggLTYuNXQtMTIgMjYuNXY0MDBxMCAyMSAxMiAyNi41dDI4IC02LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE1OTsiIGQ9Ik0zNTAgMTEwMGg0MDBxMTYzIDAgMjU2LjUgLTk0dDkzLjUgLTI1NnYtNDAwcTAgLTE2NSAtOTIuNSAtMjU3LjV0LTI1Ny41IC05Mi41aC00MDBxLTE2NSAwIC0yNTcuNSA5Mi41dC05Mi41IDI1Ny41djQwMHEwIDE2MyA5Mi41IDI1Ni41dDI1Ny41IDkzLjV6TTgwMCA5MDBoLTUwMHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41IHY1MDBxMCA0MSAtMjkuNSA3MC41dC03MC41IDI5LjV6TTM1MCA3MDBoNDAwcTIxIDAgMjYuNSAtMTJ0LTYuNSAtMjhsLTE5MCAtMjUzcS0xMiAtMTcgLTMwIC0xN3QtMzAgMTdsLTE5MCAyNTNxLTEyIDE2IC02LjUgMjh0MjYuNSAxMnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTYwOyIgZD0iTTM1MCAxMTAwaDQwMHExNjUgMCAyNTcuNSAtOTIuNXQ5Mi41IC0yNTcuNXYtNDAwcTAgLTE2MyAtOTIuNSAtMjU2LjV0LTI1Ny41IC05My41aC00MDBxLTE2MyAwIC0yNTYuNSA5NHQtOTMuNSAyNTZ2NDAwcTAgMTY1IDkyLjUgMjU3LjV0MjU3LjUgOTIuNXpNODAwIDkwMGgtNTAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di01MDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDUwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjUgdjUwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNXpNNTgwIDY5M2wxOTAgLTI1M3ExMiAtMTYgNi41IC0yOHQtMjYuNSAtMTJoLTQwMHEtMjEgMCAtMjYuNSAxMnQ2LjUgMjhsMTkwIDI1M3ExMiAxNyAzMCAxN3QzMCAtMTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE2MTsiIGQ9Ik01NTAgMTEwMGg0MDBxMTY1IDAgMjU3LjUgLTkyLjV0OTIuNSAtMjU3LjV2LTQwMHEwIC0xNjUgLTkyLjUgLTI1Ny41dC0yNTcuNSAtOTIuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDQ1MHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2NTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41aC00NTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0zMzggODY3bDMyNCAtMjg0cTE2IC0xNCAxNiAtMzN0LTE2IC0zM2wtMzI0IC0yODRxLTE2IC0xNCAtMjcgLTl0LTExIDI2djE1MGgtMjUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDI1MHYxNTBxMCAyMSAxMSAyNnQyNyAtOXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTYyOyIgZD0iTTc5MyAxMTgybDkgLTlxOCAtMTAgNSAtMjdxLTMgLTExIC03OSAtMjI1LjV0LTc4IC0yMjEuNWwzMDAgMXEyNCAwIDMyLjUgLTE3LjV0LTUuNSAtMzUuNXEtMSAwIC0xMzMuNSAtMTU1dC0yNjcgLTMxMi41dC0xMzguNSAtMTYyLjVxLTEyIC0xNSAtMjYgLTE1aC05bC05IDhxLTkgMTEgLTQgMzJxMiA5IDQyIDEyMy41dDc5IDIyNC41bDM5IDExMGgtMzAycS0yMyAwIC0zMSAxOXEtMTAgMjEgNiA0MXE3NSA4NiAyMDkuNSAyMzcuNSB0MjI4IDI1N3Q5OC41IDExMS41cTkgMTYgMjUgMTZoOXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTYzOyIgZD0iTTM1MCAxMTAwaDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00NTBxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNDUwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMHEtMTY1IDAgLTI1Ny41IDkyLjV0LTkyLjUgMjU3LjV2NDAwIHEwIDE2NSA5Mi41IDI1Ny41dDI1Ny41IDkyLjV6TTkzOCA4NjdsMzI0IC0yODRxMTYgLTE0IDE2IC0zM3QtMTYgLTMzbC0zMjQgLTI4NHEtMTYgLTE0IC0yNyAtOXQtMTEgMjZ2MTUwaC0yNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjUwdjE1MHEwIDIxIDExIDI2dDI3IC05eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNjQ7IiBkPSJNNzUwIDEyMDBoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MDBxMCAtMjEgLTEwLjUgLTI1dC0yNC41IDEwbC0xMDkgMTA5bC0zMTIgLTMxMnEtMTUgLTE1IC0zNS41IC0xNXQtMzUuNSAxNWwtMTQxIDE0MXEtMTUgMTUgLTE1IDM1LjV0MTUgMzUuNWwzMTIgMzEybC0xMDkgMTA5cS0xNCAxNCAtMTAgMjQuNXQyNSAxMC41ek00NTYgOTAwaC0xNTZxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMCBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDUwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2MTQ4bDIwMCAyMDB2LTI5OHEwIC0xNjUgLTkzLjUgLTI1Ny41dC0yNTYuNSAtOTIuNWgtNDAwcS0xNjUgMCAtMjU3LjUgOTIuNXQtOTIuNSAyNTcuNXY0MDBxMCAxNjUgOTIuNSAyNTcuNXQyNTcuNSA5Mi41aDMwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTY1OyIgZD0iTTYwMCAxMTg2cTExOSAwIDIyNy41IC00Ni41dDE4NyAtMTI1dDEyNSAtMTg3dDQ2LjUgLTIyNy41dC00Ni41IC0yMjcuNXQtMTI1IC0xODd0LTE4NyAtMTI1dC0yMjcuNSAtNDYuNXQtMjI3LjUgNDYuNXQtMTg3IDEyNXQtMTI1IDE4N3QtNDYuNSAyMjcuNXQ0Ni41IDIyNy41dDEyNSAxODd0MTg3IDEyNXQyMjcuNSA0Ni41ek02MDAgMTAyMnEtMTE1IDAgLTIxMiAtNTYuNXQtMTUzLjUgLTE1My41dC01Ni41IC0yMTJ0NTYuNSAtMjEyIHQxNTMuNSAtMTUzLjV0MjEyIC01Ni41dDIxMiA1Ni41dDE1My41IDE1My41dDU2LjUgMjEydC01Ni41IDIxMnQtMTUzLjUgMTUzLjV0LTIxMiA1Ni41ek02MDAgNzk0cTgwIDAgMTM3IC01N3Q1NyAtMTM3dC01NyAtMTM3dC0xMzcgLTU3dC0xMzcgNTd0LTU3IDEzN3Q1NyAxMzd0MTM3IDU3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNjY7IiBkPSJNNDUwIDEyMDBoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0zNTBoMjQ1cTIwIDAgMjUgLTExdC05IC0yNmwtMzgzIC00MjZxLTE0IC0xNSAtMzMuNSAtMTV0LTMyLjUgMTVsLTM3OSA0MjZxLTEzIDE1IC04LjUgMjZ0MjUuNSAxMWgyNTB2MzUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNTAgMzAwaDEwMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTI1MGgtMTEwMHYyNTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiBNOTAwIDIwMHYtNTBoMTAwdjUwaC0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE2NzsiIGQ9Ik01ODMgMTE4MmwzNzggLTQzNXExNCAtMTUgOSAtMzF0LTI2IC0xNmgtMjQ0di0yNTBxMCAtMjAgLTE3IC0zNXQtMzkgLTE1aC0yMDBxLTIwIDAgLTMyIDE0LjV0LTEyIDM1LjV2MjUwaC0yNTBxLTIwIDAgLTI1LjUgMTYuNXQ4LjUgMzEuNWwzODMgNDMxcTE0IDE2IDMzLjUgMTd0MzMuNSAtMTR6TTUwIDMwMGgxMDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yNTBoLTExMDB2MjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXogTTkwMCAyMDB2LTUwaDEwMHY1MGgtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNjg7IiBkPSJNMzk2IDcyM2wzNjkgMzY5cTcgNyAxNy41IDd0MTcuNSAtN2wxMzkgLTEzOXE3IC04IDcgLTE4LjV0LTcgLTE3LjVsLTUyNSAtNTI1cS03IC04IC0xNy41IC04dC0xNy41IDhsLTI5MiAyOTFxLTcgOCAtNyAxOHQ3IDE4bDEzOSAxMzlxOCA3IDE4LjUgN3QxNy41IC03ek01MCAzMDBoMTAwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjUwaC0xMTAwdjI1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTkwMCAyMDB2LTUwaDEwMHY1MCBoLTEwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTY5OyIgZD0iTTEzNSAxMDIzbDE0MiAxNDJxMTQgMTQgMzUgMTR0MzUgLTE0bDc3IC03N2wtMjEyIC0yMTJsLTc3IDc2cS0xNCAxNSAtMTQgMzZ0MTQgMzV6TTY1NSA4NTVsMjEwIDIxMHExNCAxNCAyNC41IDEwdDEwLjUgLTI1bC0yIC01OTlxLTEgLTIwIC0xNS41IC0zNXQtMzUuNSAtMTVsLTU5NyAtMXEtMjEgMCAtMjUgMTAuNXQxMCAyNC41bDIwOCAyMDhsLTE1NCAxNTVsMjEyIDIxMnpNNTAgMzAwaDEwMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjUgdi0yNTBoLTExMDB2MjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNOTAwIDIwMHYtNTBoMTAwdjUwaC0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE3MDsiIGQ9Ik0zNTAgMTIwMGw1OTkgLTJxMjAgLTEgMzUgLTE1LjV0MTUgLTM1LjVsMSAtNTk3cTAgLTIxIC0xMC41IC0yNXQtMjQuNSAxMGwtMjA4IDIwOGwtMTU1IC0xNTRsLTIxMiAyMTJsMTU1IDE1NGwtMjEwIDIxMHEtMTQgMTQgLTEwIDI0LjV0MjUgMTAuNXpNNTI0IDUxMmwtNzYgLTc3cS0xNSAtMTQgLTM2IC0xNHQtMzUgMTRsLTE0MiAxNDJxLTE0IDE0IC0xNCAzNXQxNCAzNWw3NyA3N3pNNTAgMzAwaDEwMDBxMjEgMCAzNS41IC0xNC41IHQxNC41IC0zNS41di0yNTBoLTExMDB2MjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNOTAwIDIwMHYtNTBoMTAwdjUwaC0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE3MTsiIGQ9Ik0xMjAwIDEwM2wtNDgzIDI3NmwtMzE0IC0zOTl2NDIzaC0zOTlsMTE5NiA3OTZ2LTEwOTZ6TTQ4MyA0MjR2LTIzMGw2ODMgOTUzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNzI7IiBkPSJNMTEwMCAxMDAwdi04NTBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTE1MHY0MDBoLTcwMHYtNDAwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDB6TTcwMCAxMDAwaC0xMDB2MjAwaDEwMHYtMjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNzM7IiBkPSJNMTEwMCAxMDAwbC0yIC0xNDlsLTI5OSAtMjk5bC05NSA5NXEtOSA5IC0yMS41IDl0LTIxLjUgLTlsLTE0OSAtMTQ3aC0zMTJ2LTQwMGgtMTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDAwcTAgMjAgMTQuNSAzNXQzNS41IDE1aDI1MHYtMzAwaDUwMHYzMDBoMTAwek03MDAgMTAwMGgtMTAwdjIwMGgxMDB2LTIwMHpNMTEzMiA2MzhsMTA2IC0xMDZxNyAtNyA3IC0xNy41dC03IC0xNy41bC00MjAgLTQyMXEtOCAtNyAtMTggLTcgdC0xOCA3bC0yMDIgMjAzcS04IDcgLTggMTcuNXQ4IDE3LjVsMTA2IDEwNnE3IDggMTcuNSA4dDE3LjUgLThsNzkgLTc5bDI5NyAyOTdxNyA3IDE3LjUgN3QxNy41IC03eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNzQ7IiBkPSJNMTEwMCAxMDAwdi0yNjlsLTEwMyAtMTAzbC0xMzQgMTM0cS0xNSAxNSAtMzMuNSAxNi41dC0zNC41IC0xMi41bC0yNjYgLTI2NmgtMzI5di00MDBoLTE1MHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwMHEwIDIwIDE0LjUgMzV0MzUuNSAxNWgyNTB2LTMwMGg1MDB2MzAwaDEwMHpNNzAwIDEwMDBoLTEwMHYyMDBoMTAwdi0yMDB6TTEyMDIgNTcybDcwIC03MHExNSAtMTUgMTUgLTM1LjV0LTE1IC0zNS41bC0xMzEgLTEzMSBsMTMxIC0xMzFxMTUgLTE1IDE1IC0zNS41dC0xNSAtMzUuNWwtNzAgLTcwcS0xNSAtMTUgLTM1LjUgLTE1dC0zNS41IDE1bC0xMzEgMTMxbC0xMzEgLTEzMXEtMTUgLTE1IC0zNS41IC0xNXQtMzUuNSAxNWwtNzAgNzBxLTE1IDE1IC0xNSAzNS41dDE1IDM1LjVsMTMxIDEzMWwtMTMxIDEzMXEtMTUgMTUgLTE1IDM1LjV0MTUgMzUuNWw3MCA3MHExNSAxNSAzNS41IDE1dDM1LjUgLTE1bDEzMSAtMTMxbDEzMSAxMzFxMTUgMTUgMzUuNSAxNSB0MzUuNSAtMTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE3NTsiIGQ9Ik0xMTAwIDEwMDB2LTMwMGgtMzUwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xNTBoLTUwMHYtNDAwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDB6TTcwMCAxMDAwaC0xMDB2MjAwaDEwMHYtMjAwek04NTAgNjAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjUwaDE1MHEyMSAwIDI1IC0xMC41dC0xMCAtMjQuNSBsLTIzMCAtMjMwcS0xNCAtMTQgLTM1IC0xNHQtMzUgMTRsLTIzMCAyMzBxLTE0IDE0IC0xMCAyNC41dDI1IDEwLjVoMTUwdjI1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE3NjsiIGQ9Ik0xMTAwIDEwMDB2LTQwMGwtMTY1IDE2NXEtMTQgMTUgLTM1IDE1dC0zNSAtMTVsLTI2MyAtMjY1aC00MDJ2LTQwMGgtMTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDAwcTAgMjAgMTQuNSAzNXQzNS41IDE1aDI1MHYtMzAwaDUwMHYzMDBoMTAwek03MDAgMTAwMGgtMTAwdjIwMGgxMDB2LTIwMHpNOTM1IDU2NWwyMzAgLTIyOXExNCAtMTUgMTAgLTI1LjV0LTI1IC0xMC41aC0xNTB2LTI1MHEwIC0yMCAtMTQuNSAtMzUgdC0zNS41IC0xNWgtMTAwcS0yMSAwIC0zNS41IDE1dC0xNC41IDM1djI1MGgtMTUwcS0yMSAwIC0yNSAxMC41dDEwIDI1LjVsMjMwIDIyOXExNCAxNSAzNSAxNXQzNSAtMTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE3NzsiIGQ9Ik01MCAxMTAwaDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTE1MGgtMTIwMHYxNTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0xMjAwIDgwMHYtNTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY1NTBoMTIwMHpNMTAwIDUwMHYtMjAwaDQwMHYyMDBoLTQwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTc4OyIgZD0iTTkzNSAxMTY1bDI0OCAtMjMwcTE0IC0xNCAxNCAtMzV0LTE0IC0zNWwtMjQ4IC0yMzBxLTE0IC0xNCAtMjQuNSAtMTB0LTEwLjUgMjV2MTUwaC00MDB2MjAwaDQwMHYxNTBxMCAyMSAxMC41IDI1dDI0LjUgLTEwek0yMDAgODAwaC01MHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg1MHYtMjAwek00MDAgODAwaC0xMDB2MjAwaDEwMHYtMjAwek0xOCA0MzVsMjQ3IDIzMCBxMTQgMTQgMjQuNSAxMHQxMC41IC0yNXYtMTUwaDQwMHYtMjAwaC00MDB2LTE1MHEwIC0yMSAtMTAuNSAtMjV0LTI0LjUgMTBsLTI0NyAyMzBxLTE1IDE0IC0xNSAzNXQxNSAzNXpNOTAwIDMwMGgtMTAwdjIwMGgxMDB2LTIwMHpNMTAwMCA1MDBoNTFxMjAgMCAzNC41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzQuNSAtMTQuNWgtNTF2MjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxNzk7IiBkPSJNODYyIDEwNzNsMjc2IDExNnEyNSAxOCA0My41IDh0MTguNSAtNDF2LTExMDZxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2Mzk3cS00IDEgLTExIDV0LTI0IDE3LjV0LTMwIDI5dC0yNCA0MnQtMTEgNTYuNXYzNTlxMCAzMSAxOC41IDY1dDQzLjUgNTJ6TTU1MCAxMjAwcTIyIDAgMzQuNSAtMTIuNXQxNC41IC0yNC41bDEgLTEzdi00NTBxMCAtMjggLTEwLjUgLTU5LjUgdC0yNSAtNTZ0LTI5IC00NXQtMjUuNSAtMzEuNWwtMTAgLTExdi00NDdxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDQ3cS00IDQgLTExIDExLjV0LTI0IDMwLjV0LTMwIDQ2dC0yNCA1NXQtMTEgNjB2NDUwcTAgMiAwLjUgNS41dDQgMTJ0OC41IDE1dDE0LjUgMTJ0MjIuNSA1LjVxMjAgMCAzMi41IC0xMi41dDE0LjUgLTI0LjVsMyAtMTN2LTM1MGgxMDB2MzUwdjUuNXQyLjUgMTIgdDcgMTV0MTUgMTJ0MjUuNSA1LjVxMjMgMCAzNS41IC0xMi41dDEzLjUgLTI0LjVsMSAtMTN2LTM1MGgxMDB2MzUwcTAgMiAwLjUgNS41dDMgMTJ0NyAxNXQxNSAxMnQyNC41IDUuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTgwOyIgZD0iTTEyMDAgMTEwMHYtNTZxLTQgMCAtMTEgLTAuNXQtMjQgLTN0LTMwIC03LjV0LTI0IC0xNXQtMTEgLTI0di04ODhxMCAtMjIgMjUgLTM0LjV0NTAgLTEzLjVsMjUgLTJ2LTU2aC00MDB2NTZxNzUgMCA4Ny41IDYuNXQxMi41IDQzLjV2Mzk0aC01MDB2LTM5NHEwIC0zNyAxMi41IC00My41dDg3LjUgLTYuNXYtNTZoLTQwMHY1NnE0IDAgMTEgMC41dDI0IDN0MzAgNy41dDI0IDE1dDExIDI0djg4OHEwIDIyIC0yNSAzNC41dC01MCAxMy41IGwtMjUgMnY1Nmg0MDB2LTU2cS03NSAwIC04Ny41IC02LjV0LTEyLjUgLTQzLjV2LTM5NGg1MDB2Mzk0cTAgMzcgLTEyLjUgNDMuNXQtODcuNSA2LjV2NTZoNDAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxODE7IiBkPSJNNjc1IDEwMDBoMzc1cTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xNTBoLTEwNWwtMjk1IC05OHY5OGwtMjAwIDIwMGgtNDAwbDEwMCAxMDBoMzc1ek0xMDAgOTAwaDMwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNTAwcTAgLTQxIC0yOS41IC03MC41dC03MC41IC0yOS41aC0zMDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41djUwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjV6TTEwMCA4MDB2LTIwMGgzMDB2MjAwIGgtMzAwek0xMTAwIDUzNWwtNDAwIC0xMzN2MTYzbDQwMCAxMzN2LTE2M3pNMTAwIDUwMHYtMjAwaDMwMHYyMDBoLTMwMHpNMTEwMCAzOTh2LTI0OHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMzc1bC0xMDAgLTEwMGgtMzc1bC0xMDAgMTAwaDQwMGwyMDAgMjAwaDEwNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTgyOyIgZD0iTTE3IDEwMDdsMTYyIDE2MnExNyAxNyA0MCAxNHQzNyAtMjJsMTM5IC0xOTRxMTQgLTIwIDExIC00NC41dC0yMCAtNDEuNWwtMTE5IC0xMThxMTAyIC0xNDIgMjI4IC0yNjh0MjY3IC0yMjdsMTE5IDExOHExNyAxNyA0Mi41IDE5dDQ0LjUgLTEybDE5MiAtMTM2cTE5IC0xNCAyMi41IC0zNy41dC0xMy41IC00MC41bC0xNjMgLTE2MnEtMyAtMSAtOS41IC0xdC0yOS41IDJ0LTQ3LjUgNnQtNjIuNSAxNC41dC03Ny41IDI2LjV0LTkwIDQyLjUgdC0xMDEuNSA2MHQtMTExIDgzdC0xMTkgMTA4LjVxLTc0IDc0IC0xMzMuNSAxNTAuNXQtOTQuNSAxMzguNXQtNjAgMTE5LjV0LTM0LjUgMTAwdC0xNSA3NC41dC00LjUgNDh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE4MzsiIGQ9Ik02MDAgMTEwMHE5MiAwIDE3NSAtMTAuNXQxNDEuNSAtMjd0MTA4LjUgLTM2LjV0ODEuNSAtNDB0NTMuNSAtMzd0MzEgLTI3bDkgLTEwdi0yMDBxMCAtMjEgLTE0LjUgLTMzdC0zNC41IC05bC0yMDIgMzRxLTIwIDMgLTM0LjUgMjB0LTE0LjUgMzh2MTQ2cS0xNDEgMjQgLTMwMCAyNHQtMzAwIC0yNHYtMTQ2cTAgLTIxIC0xNC41IC0zOHQtMzQuNSAtMjBsLTIwMiAtMzRxLTIwIC0zIC0zNC41IDl0LTE0LjUgMzN2MjAwcTMgNCA5LjUgMTAuNSB0MzEgMjZ0NTQgMzcuNXQ4MC41IDM5LjV0MTA5IDM3LjV0MTQxIDI2LjV0MTc1IDEwLjV6TTYwMCA3OTVxNTYgMCA5NyAtOS41dDYwIC0yMy41dDMwIC0yOHQxMiAtMjRsMSAtMTB2LTUwbDM2NSAtMzAzcTE0IC0xNSAyNC41IC00MHQxMC41IC00NXYtMjEycTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYyMTJxMCAyMCAxMC41IDQ1dDI0LjUgNDBsMzY1IDMwM3Y1MCBxMCA0IDEgMTAuNXQxMiAyM3QzMCAyOXQ2MCAyMi41dDk3IDEweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxODQ7IiBkPSJNMTEwMCA3MDBsLTIwMCAtMjAwaC02MDBsLTIwMCAyMDB2NTAwaDIwMHYtMjAwaDIwMHYyMDBoMjAwdi0yMDBoMjAwdjIwMGgyMDB2LTUwMHpNMjUwIDQwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEybDEzNyAtMTAwaC05NTBsMTM3IDEwMGgtMTJxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDEwMGgxMTAwcTIxIDAgMzUuNSAtMTQuNSB0MTQuNSAtMzUuNXYtNTBoLTEyMDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxODU7IiBkPSJNNzAwIDExMDBoLTEwMHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtMTAwMGgzMDB2MTAwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNXpNMTEwMCA4MDBoLTEwMHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNzAwaDMwMHY3MDBxMCA0MSAtMjkuNSA3MC41dC03MC41IDI5LjV6TTQwMCAwaC0zMDB2NDAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNWgxMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTQwMHogIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE4NjsiIGQ9Ik0yMDAgMTEwMGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnY1MDBxMCAxMjQgODggMjEydDIxMiA4OHpNMTAwIDkwMHYtNzAwaDkwMHY3MDBoLTkwMHpNNTAwIDcwMGgtMjAwdi0xMDBoMjAwdi0zMDBoLTMwMHYxMDBoMjAwdjEwMGgtMjAwdjMwMGgzMDB2LTEwMHpNOTAwIDcwMHYtMzAwbC0xMDAgLTEwMGgtMjAwdjUwMGgyMDB6IE03MDAgNzAwdi0zMDBoMTAwdjMwMGgtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxODc7IiBkPSJNMjAwIDExMDBoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODh6TTEwMCA5MDB2LTcwMGg5MDB2NzAwaC05MDB6TTUwMCAzMDBoLTEwMHYyMDBoLTEwMHYtMjAwaC0xMDB2NTAwaDEwMHYtMjAwaDEwMHYyMDBoMTAwdi01MDB6TTkwMCA3MDB2LTMwMGwtMTAwIC0xMDBoLTIwMHY1MDBoMjAweiBNNzAwIDcwMHYtMzAwaDEwMHYzMDBoLTEwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTg4OyIgZD0iTTIwMCAxMTAwaDcwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJ2LTUwMHEwIC0xMjQgLTg4IC0yMTJ0LTIxMiAtODhoLTcwMHEtMTI0IDAgLTIxMiA4OHQtODggMjEydjUwMHEwIDEyNCA4OCAyMTJ0MjEyIDg4ek0xMDAgOTAwdi03MDBoOTAwdjcwMGgtOTAwek01MDAgNzAwaC0yMDB2LTMwMGgyMDB2LTEwMGgtMzAwdjUwMGgzMDB2LTEwMHpNOTAwIDcwMGgtMjAwdi0zMDBoMjAwdi0xMDBoLTMwMHY1MDBoMzAwdi0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE4OTsiIGQ9Ik0yMDAgMTEwMGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnY1MDBxMCAxMjQgODggMjEydDIxMiA4OHpNMTAwIDkwMHYtNzAwaDkwMHY3MDBoLTkwMHpNNTAwIDQwMGwtMzAwIDE1MGwzMDAgMTUwdi0zMDB6TTkwMCA1NTBsLTMwMCAtMTUwdjMwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTkwOyIgZD0iTTIwMCAxMTAwaDcwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJ2LTUwMHEwIC0xMjQgLTg4IC0yMTJ0LTIxMiAtODhoLTcwMHEtMTI0IDAgLTIxMiA4OHQtODggMjEydjUwMHEwIDEyNCA4OCAyMTJ0MjEyIDg4ek0xMDAgOTAwdi03MDBoOTAwdjcwMGgtOTAwek05MDAgMzAwaC03MDB2NTAwaDcwMHYtNTAwek04MDAgNzAwaC0xMzBxLTM4IDAgLTY2LjUgLTQzdC0yOC41IC0xMDh0MjcgLTEwN3Q2OCAtNDJoMTMwdjMwMHpNMzAwIDcwMHYtMzAwIGgxMzBxNDEgMCA2OCA0MnQyNyAxMDd0LTI4LjUgMTA4dC02Ni41IDQzaC0xMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE5MTsiIGQ9Ik0yMDAgMTEwMGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnY1MDBxMCAxMjQgODggMjEydDIxMiA4OHpNMTAwIDkwMHYtNzAwaDkwMHY3MDBoLTkwMHpNNTAwIDcwMGgtMjAwdi0xMDBoMjAwdi0zMDBoLTMwMHYxMDBoMjAwdjEwMGgtMjAwdjMwMGgzMDB2LTEwMHpNOTAwIDMwMGgtMTAwdjQwMGgtMTAwdjEwMGgyMDB2LTUwMHogTTcwMCAzMDBoLTEwMHYxMDBoMTAwdi0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE5MjsiIGQ9Ik0yMDAgMTEwMGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnY1MDBxMCAxMjQgODggMjEydDIxMiA4OHpNMTAwIDkwMHYtNzAwaDkwMHY3MDBoLTkwMHpNMzAwIDcwMGgyMDB2LTQwMGgtMzAwdjUwMGgxMDB2LTEwMHpNOTAwIDMwMGgtMTAwdjQwMGgtMTAwdjEwMGgyMDB2LTUwMHpNMzAwIDYwMHYtMjAwaDEwMHYyMDBoLTEwMHogTTcwMCAzMDBoLTEwMHYxMDBoMTAwdi0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE5MzsiIGQ9Ik0yMDAgMTEwMGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnY1MDBxMCAxMjQgODggMjEydDIxMiA4OHpNMTAwIDkwMHYtNzAwaDkwMHY3MDBoLTkwMHpNNTAwIDUwMGwtMTk5IC0yMDBoLTEwMHY1MGwxOTkgMjAwdjE1MGgtMjAwdjEwMGgzMDB2LTMwMHpNOTAwIDMwMGgtMTAwdjQwMGgtMTAwdjEwMGgyMDB2LTUwMHpNNzAxIDMwMGgtMTAwIHYxMDBoMTAwdi0xMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTE5NDsiIGQ9Ik02MDAgMTE5MXExMjAgMCAyMjkuNSAtNDd0MTg4LjUgLTEyNnQxMjYgLTE4OC41dDQ3IC0yMjkuNXQtNDcgLTIyOS41dC0xMjYgLTE4OC41dC0xODguNSAtMTI2dC0yMjkuNSAtNDd0LTIyOS41IDQ3dC0xODguNSAxMjZ0LTEyNiAxODguNXQtNDcgMjI5LjV0NDcgMjI5LjV0MTI2IDE4OC41dDE4OC41IDEyNnQyMjkuNSA0N3pNNjAwIDEwMjFxLTExNCAwIC0yMTEgLTU2LjV0LTE1My41IC0xNTMuNXQtNTYuNSAtMjExdDU2LjUgLTIxMSB0MTUzLjUgLTE1My41dDIxMSAtNTYuNXQyMTEgNTYuNXQxNTMuNSAxNTMuNXQ1Ni41IDIxMXQtNTYuNSAyMTF0LTE1My41IDE1My41dC0yMTEgNTYuNXpNODAwIDcwMGgtMzAwdi0yMDBoMzAwdi0xMDBoLTMwMGwtMTAwIDEwMHYyMDBsMTAwIDEwMGgzMDB2LTEwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTk1OyIgZD0iTTYwMCAxMTkxcTEyMCAwIDIyOS41IC00N3QxODguNSAtMTI2dDEyNiAtMTg4LjV0NDcgLTIyOS41dC00NyAtMjI5LjV0LTEyNiAtMTg4LjV0LTE4OC41IC0xMjZ0LTIyOS41IC00N3QtMjI5LjUgNDd0LTE4OC41IDEyNnQtMTI2IDE4OC41dC00NyAyMjkuNXQ0NyAyMjkuNXQxMjYgMTg4LjV0MTg4LjUgMTI2dDIyOS41IDQ3ek02MDAgMTAyMXEtMTE0IDAgLTIxMSAtNTYuNXQtMTUzLjUgLTE1My41dC01Ni41IC0yMTF0NTYuNSAtMjExIHQxNTMuNSAtMTUzLjV0MjExIC01Ni41dDIxMSA1Ni41dDE1My41IDE1My41dDU2LjUgMjExdC01Ni41IDIxMXQtMTUzLjUgMTUzLjV0LTIxMSA1Ni41ek04MDAgNzAwdi0xMDBsLTUwIC01MGwxMDAgLTEwMHYtNTBoLTEwMGwtMTAwIDEwMGgtMTUwdi0xMDBoLTEwMHY0MDBoMzAwek01MDAgNzAwdi0xMDBoMjAwdjEwMGgtMjAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxOTc7IiBkPSJNNTAzIDEwODlxMTEwIDAgMjAwLjUgLTU5LjV0MTM0LjUgLTE1Ni41cTQ0IDE0IDkwIDE0cTEyMCAwIDIwNSAtODYuNXQ4NSAtMjA3dC04NSAtMjA3dC0yMDUgLTg2LjVoLTEyOHYyNTBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTMwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMjUwaC0yMjJxLTgwIDAgLTEzNiA1Ny41dC01NiAxMzYuNXEwIDY5IDQzIDEyMi41dDEwOCA2Ny41cS0yIDE5IC0yIDM3cTAgMTAwIDQ5IDE4NSB0MTM0IDEzNHQxODUgNDl6TTUyNSA1MDBoMTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMjc1aDEzN3EyMSAwIDI2IC0xMS41dC04IC0yNy41bC0yMjMgLTI0NHEtMTMgLTE2IC0zMiAtMTZ0LTMyIDE2bC0yMjMgMjQ0cS0xMyAxNiAtOCAyNy41dDI2IDExLjVoMTM3djI3NXEwIDEwIDcuNSAxNy41dDE3LjUgNy41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUxOTg7IiBkPSJNNTAyIDEwODlxMTEwIDAgMjAxIC01OS41dDEzNSAtMTU2LjVxNDMgMTUgODkgMTVxMTIxIDAgMjA2IC04Ni41dDg2IC0yMDYuNXEwIC05OSAtNjAgLTE4MXQtMTUwIC0xMTBsLTM3OCAzNjBxLTEzIDE2IC0zMS41IDE2dC0zMS41IC0xNmwtMzgxIC0zNjVoLTlxLTc5IDAgLTEzNS41IDU3LjV0LTU2LjUgMTM2LjVxMCA2OSA0MyAxMjIuNXQxMDggNjcuNXEtMiAxOSAtMiAzOHEwIDEwMCA0OSAxODQuNXQxMzMuNSAxMzR0MTg0LjUgNDkuNXogTTYzMiA0NjdsMjIzIC0yMjhxMTMgLTE2IDggLTI3LjV0LTI2IC0xMS41aC0xMzd2LTI3NXEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djI3NWgtMTM3cS0yMSAwIC0yNiAxMS41dDggMjcuNXExOTkgMjA0IDIyMyAyMjhxMTkgMTkgMzEuNSAxOXQzMi41IC0xOXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMTk5OyIgZD0iTTcwMCAxMDB2MTAwaDQwMGwtMjcwIDMwMGgxNzBsLTI3MCAzMDBoMTcwbC0zMDAgMzMzbC0zMDAgLTMzM2gxNzBsLTI3MCAtMzAwaDE3MGwtMjcwIC0zMDBoNDAwdi0xMDBoLTUwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di01MGg0MDB2NTBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMDA7IiBkPSJNNjAwIDExNzlxOTQgMCAxNjcuNSAtNTYuNXQ5OS41IC0xNDUuNXE4OSAtNiAxNTAuNSAtNzEuNXQ2MS41IC0xNTUuNXEwIC02MSAtMjkuNSAtMTEyLjV0LTc5LjUgLTgyLjVxOSAtMjkgOSAtNTVxMCAtNzQgLTUyLjUgLTEyNi41dC0xMjYuNSAtNTIuNXEtNTUgMCAtMTAwIDMwdi0yNTFxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTUwaC0zMDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41djI1MXEtNDUgLTMwIC0xMDAgLTMwIHEtNzQgMCAtMTI2LjUgNTIuNXQtNTIuNSAxMjYuNXEwIDE4IDQgMzhxLTQ3IDIxIC03NS41IDY1dC0yOC41IDk3cTAgNzQgNTIuNSAxMjYuNXQxMjYuNSA1Mi41cTUgMCAyMyAtMnEwIDIgLTEgMTB0LTEgMTNxMCAxMTYgODEuNSAxOTcuNXQxOTcuNSA4MS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMDE7IiBkPSJNMTAxMCAxMDEwcTExMSAtMTExIDE1MC41IC0yNjAuNXQwIC0yOTl0LTE1MC41IC0yNjAuNXEtODMgLTgzIC0xOTEuNSAtMTI2LjV0LTIxOC41IC00My41dC0yMTguNSA0My41dC0xOTEuNSAxMjYuNXEtMTExIDExMSAtMTUwLjUgMjYwLjV0MCAyOTl0MTUwLjUgMjYwLjVxODMgODMgMTkxLjUgMTI2LjV0MjE4LjUgNDMuNXQyMTguNSAtNDMuNXQxOTEuNSAtMTI2LjV6TTQ3NiAxMDY1cS00IDAgLTggLTFxLTEyMSAtMzQgLTIwOS41IC0xMjIuNSB0LTEyMi41IC0yMDkuNXEtNCAtMTIgMi41IC0yM3QxOC41IC0xNGwzNiAtOXEzIC0xIDcgLTFxMjMgMCAyOSAyMnEyNyA5NiA5OCAxNjZxNzAgNzEgMTY2IDk4cTExIDMgMTcuNSAxMy41dDMuNSAyMi41bC05IDM1cS0zIDEzIC0xNCAxOXEtNyA0IC0xNSA0ek01MTIgOTIwcS00IDAgLTkgLTJxLTgwIC0yNCAtMTM4LjUgLTgyLjV0LTgyLjUgLTEzOC41cS00IC0xMyAyIC0yNHQxOSAtMTRsMzQgLTlxNCAtMSA4IC0xcTIyIDAgMjggMjEgcTE4IDU4IDU4LjUgOTguNXQ5Ny41IDU4LjVxMTIgMyAxOCAxMy41dDMgMjEuNWwtOSAzNXEtMyAxMiAtMTQgMTlxLTcgNCAtMTUgNHpNNzE5LjUgNzE5LjVxLTQ5LjUgNDkuNSAtMTE5LjUgNDkuNXQtMTE5LjUgLTQ5LjV0LTQ5LjUgLTExOS41dDQ5LjUgLTExOS41dDExOS41IC00OS41dDExOS41IDQ5LjV0NDkuNSAxMTkuNXQtNDkuNSAxMTkuNXpNODU1IDU1MXEtMjIgMCAtMjggLTIxcS0xOCAtNTggLTU4LjUgLTk4LjV0LTk4LjUgLTU3LjUgcS0xMSAtNCAtMTcgLTE0LjV0LTMgLTIxLjVsOSAtMzVxMyAtMTIgMTQgLTE5cTcgLTQgMTUgLTRxNCAwIDkgMnE4MCAyNCAxMzguNSA4Mi41dDgyLjUgMTM4LjVxNCAxMyAtMi41IDI0dC0xOC41IDE0bC0zNCA5cS00IDEgLTggMXpNMTAwMCA1MTVxLTIzIDAgLTI5IC0yMnEtMjcgLTk2IC05OCAtMTY2cS03MCAtNzEgLTE2NiAtOThxLTExIC0zIC0xNy41IC0xMy41dC0zLjUgLTIyLjVsOSAtMzVxMyAtMTMgMTQgLTE5cTcgLTQgMTUgLTQgcTQgMCA4IDFxMTIxIDM0IDIwOS41IDEyMi41dDEyMi41IDIwOS41cTQgMTIgLTIuNSAyM3QtMTguNSAxNGwtMzYgOXEtMyAxIC03IDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIwMjsiIGQ9Ik03MDAgODAwaDMwMHYtMzgwaC0xODB2MjAwaC0zNDB2LTIwMGgtMzgwdjc1NXEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDU3NXYtNDAwek0xMDAwIDkwMGgtMjAwdjIwMHpNNzAwIDMwMGgxNjJsLTIxMiAtMjEybC0yMTIgMjEyaDE2MnYyMDBoMTAwdi0yMDB6TTUyMCAwaC0zOTVxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYzOTV6TTEwMDAgMjIwdi0xOTVxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0xOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIwMzsiIGQ9Ik03MDAgODAwaDMwMHYtNTIwbC0zNTAgMzUwbC01NTAgLTU1MHYxMDk1cTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoNTc1di00MDB6TTEwMDAgOTAwaC0yMDB2MjAwek04NjIgMjAwaC0xNjJ2LTIwMGgtMTAwdjIwMGgtMTYybDIxMiAyMTJ6TTQ4MCAwaC0zNTVxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1NWgzODB2LTgwek0xMDAwIDgwdi01NXEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTE1NXY4MGgxODB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIwNDsiIGQ9Ik0xMTYyIDgwMGgtMTYydi0yMDBoMTAwbDEwMCAtMTAwaC0zMDB2MzAwaC0xNjJsMjEyIDIxMnpNMjAwIDgwMGgyMDBxMjcgMCA0MCAtMnQyOS41IC0xMC41dDIzLjUgLTMwdDcgLTU3LjVoMzAwdi0xMDBoLTYwMGwtMjAwIC0zNTB2NDUwaDEwMHEwIDM2IDcgNTcuNXQyMy41IDMwdDI5LjUgMTAuNXQ0MCAyek04MDAgNDAwaDI0MGwtMjQwIC00MDBoLTgwMGwzMDAgNTAwaDUwMHYtMTAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMDU7IiBkPSJNNjUwIDExMDBoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGg1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0zMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoNTB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0xMDAwIDg1MHYxNTBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTgwMCBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTYwMHEtMSAwIC0yMCA0bDI0NiAyNDZsLTMyNiAzMjZ2MzI0cTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNXYtMTUwcTAgLTYyIDQ0IC0xMDZ0MTA2IC00NGgzMDBxNjIgMCAxMDYgNDR0NDQgMTA2ek00MTIgMjUwbC0yMTIgLTIxMnYxNjJoLTIwMHYxMDBoMjAwdjE2MnoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjA2OyIgZD0iTTQ1MCAxMTAwaDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTBoNTBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDUwdjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNODAwIDg1MHYxNTBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTUwMCBoLTIwMHYtMzAwaDIwMHEwIC0zNiAtNyAtNTcuNXQtMjMuNSAtMzB0LTI5LjUgLTEwLjV0LTQwIC0yaC02MDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41djgwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjV2LTE1MHEwIC02MiA0NCAtMTA2dDEwNiAtNDRoMzAwcTYyIDAgMTA2IDQ0dDQ0IDEwNnpNMTIxMiAyNTBsLTIxMiAtMjEydjE2MmgtMjAwdjEwMGgyMDB2MTYyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMDk7IiBkPSJNNjU4IDExOTdsNjM3IC0xMTA0cTIzIC0zOCA3IC02NS41dC02MCAtMjcuNWgtMTI3NnEtNDQgMCAtNjAgMjcuNXQ3IDY1LjVsNjM3IDExMDRxMjIgMzkgNTQgMzl0NTQgLTM5ek03MDQgODAwaC0yMDhxLTIwIDAgLTMyIC0xNC41dC04IC0zNC41bDU4IC0zMDJxNCAtMjAgMjEuNSAtMzQuNXQzNy41IC0xNC41aDU0cTIwIDAgMzcuNSAxNC41dDIxLjUgMzQuNWw1OCAzMDJxNCAyMCAtOCAzNC41dC0zMiAxNC41ek01MDAgMzAwdi0xMDBoMjAwIHYxMDBoLTIwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjEwOyIgZD0iTTQyNSAxMTAwaDI1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTI1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek00MjUgODAwaDI1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTI1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MHEwIDEwIDcuNSAxNy41IHQxNy41IDcuNXpNODI1IDgwMGgyNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNMjUgNTAwaDI1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTI1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MCBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNNDI1IDUwMGgyNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNODI1IDUwMGgyNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNSB2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTI1IDIwMGgyNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXYxNTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNNDI1IDIwMGgyNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di0xNTBxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0yNTBxLTEwIDAgLTE3LjUgNy41IHQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTgyNSAyMDBoMjUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMjUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIxMTsiIGQ9Ik03MDAgMTIwMGgxMDB2LTIwMGgtMTAwdi0xMDBoMzUwcTYyIDAgODYuNSAtMzkuNXQtMy41IC05NC41bC02NiAtMTMycS00MSAtODMgLTgxIC0xMzRoLTc3MnEtNDAgNTEgLTgxIDEzNGwtNjYgMTMycS0yOCA1NSAtMy41IDk0LjV0ODYuNSAzOS41aDM1MHYxMDBoLTEwMHYyMDBoMTAwdjEwMGgyMDB2LTEwMHpNMjUwIDQwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEybDEzNyAtMTAwIGgtOTUwbDEzOCAxMDBoLTEzcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXQxNC41IDM1LjV0MzUuNSAxNC41ek01MCAxMDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTBoLTEyMDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMTI7IiBkPSJNNjAwIDEzMDBxNDAgMCA2OC41IC0yOS41dDI4LjUgLTcwLjVoLTE5NHEwIDQxIDI4LjUgNzAuNXQ2OC41IDI5LjV6TTQ0MyAxMTAwaDMxNHExOCAtMzcgMTggLTc1cTAgLTggLTMgLTI1aDMyOHE0MSAwIDQ0LjUgLTE2LjV0LTMwLjUgLTM4LjVsLTE3NSAtMTQ1aC02NzhsLTE3OCAxNDVxLTM0IDIyIC0yOSAzOC41dDQ2IDE2LjVoMzI4cS0zIDE3IC0zIDI1cTAgMzggMTggNzV6TTI1MCA3MDBoNzAwcTIxIDAgMzUuNSAtMTQuNSB0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTUwdi0yMDBsMjc1IC0yMDBoLTk1MGwyNzUgMjAwdjIwMGgtMTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXQxNC41IDM1LjV0MzUuNSAxNC41ek01MCAxMDBoMTEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTBoLTEyMDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMTM7IiBkPSJNNjAwIDExODFxNzUgMCAxMjggLTUzdDUzIC0xMjh0LTUzIC0xMjh0LTEyOCAtNTN0LTEyOCA1M3QtNTMgMTI4dDUzIDEyOHQxMjggNTN6TTYwMiA3OThoNDZxMzQgMCA1NS41IC0yOC41dDIxLjUgLTg2LjVxMCAtNzYgMzkgLTE4M2gtMzI0cTM5IDEwNyAzOSAxODNxMCA1OCAyMS41IDg2LjV0NTYuNSAyOC41aDQ1ek0yNTAgNDAwaDcwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTMgbDEzOCAtMTAwaC05NTBsMTM3IDEwMGgtMTJxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDEwMGgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGgtMTIwMHY1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIxNDsiIGQ9Ik02MDAgMTMwMHE0NyAwIDkyLjUgLTUzLjV0NzEgLTEyM3QyNS41IC0xMjMuNXEwIC03OCAtNTUuNSAtMTMzLjV0LTEzMy41IC01NS41dC0xMzMuNSA1NS41dC01NS41IDEzMy41cTAgNjIgMzQgMTQzbDE0NCAtMTQzbDExMSAxMTFsLTE2MyAxNjNxMzQgMjYgNjMgMjZ6TTYwMiA3OThoNDZxMzQgMCA1NS41IC0yOC41dDIxLjUgLTg2LjVxMCAtNzYgMzkgLTE4M2gtMzI0cTM5IDEwNyAzOSAxODNxMCA1OCAyMS41IDg2LjV0NTYuNSAyOC41aDQ1IHpNMjUwIDQwMGg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEzbDEzOCAtMTAwaC05NTBsMTM3IDEwMGgtMTJxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDEwMGgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGgtMTIwMHY1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIxNTsiIGQ9Ik02MDAgMTIwMGwzMDAgLTE2MXYtMTM5aC0zMDBxMCAtNTcgMTguNSAtMTA4dDUwIC05MS41dDYzIC03MnQ3MCAtNjcuNXQ1Ny41IC02MWgtNTMwcS02MCA4MyAtOTAuNSAxNzcuNXQtMzAuNSAxNzguNXQzMyAxNjQuNXQ4Ny41IDEzOS41dDEyNiA5Ni41dDE0NS41IDQxLjV2LTk4ek0yNTAgNDAwaDcwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTNsMTM4IC0xMDBoLTk1MGwxMzcgMTAwIGgtMTJxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6TTUwIDEwMGgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGgtMTIwMHY1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIxNjsiIGQ9Ik02MDAgMTMwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNzhxNDYgLTI2IDczIC03MnQyNyAtMTAwdi01MGgtNDAwdjUwcTAgNTQgMjcgMTAwdDczIDcydjc4cTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNXpNNDAwIDgwMGg0MDBxNTQgMCAxMDAgLTI3dDcyIC03M2gtMTcydi0xMDBoMjAwdi0xMDBoLTIwMHYtMTAwaDIwMHYtMTAwaC0yMDB2LTEwMGgyMDBxMCAtODMgLTU4LjUgLTE0MS41dC0xNDEuNSAtNTguNWgtNDAwIHEtODMgMCAtMTQxLjUgNTguNXQtNTguNSAxNDEuNXY0MDBxMCA4MyA1OC41IDE0MS41dDE0MS41IDU4LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIxODsiIGQ9Ik0xNTAgMTEwMGg5MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTUwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtOTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY1MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0xMjUgNDAwaDk1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMjgzbDIyNCAtMjI0cTEzIC0xMyAxMyAtMzEuNXQtMTMgLTMyIHQtMzEuNSAtMTMuNXQtMzEuNSAxM2wtODggODhoLTUyNGwtODcgLTg4cS0xMyAtMTMgLTMyIC0xM3QtMzIgMTMuNXQtMTMgMzJ0MTMgMzEuNWwyMjQgMjI0aC0yODlxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41ek01NDEgMzAwbC0xMDAgLTEwMGgzMjRsLTEwMCAxMDBoLTEyNHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjE5OyIgZD0iTTIwMCAxMTAwaDgwMHE4MyAwIDE0MS41IC01OC41dDU4LjUgLTE0MS41di0yMDBoLTEwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNWgtMjUwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41aC0xMDBxMCA0MSAtMjkuNSA3MC41dC03MC41IDI5LjVoLTI1MHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNWgtMTAwdjIwMHEwIDgzIDU4LjUgMTQxLjV0MTQxLjUgNTguNXpNMTAwIDYwMGgxMDAwcTQxIDAgNzAuNSAtMjkuNSB0MjkuNSAtNzAuNXYtMzAwaC0xMjAwdjMwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjV6TTMwMCAxMDB2LTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djUwaDIwMHpNMTEwMCAxMDB2LTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djUwaDIwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjIxOyIgZD0iTTQ4MCAxMTY1bDY4MiAtNjgzcTMxIC0zMSAzMSAtNzUuNXQtMzEgLTc1LjVsLTEzMSAtMTMxaC00ODFsLTUxNyA1MThxLTMyIDMxIC0zMiA3NS41dDMyIDc1LjVsMjk1IDI5NnEzMSAzMSA3NS41IDMxdDc2LjUgLTMxek0xMDggNzk0bDM0MiAtMzQybDMwMyAzMDRsLTM0MSAzNDF6TTI1MCAxMDBoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di01MGgtOTAwdjUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjIzOyIgZD0iTTEwNTcgNjQ3bC0xODkgNTA2cS04IDE5IC0yNy41IDMzdC00MC41IDE0aC00MDBxLTIxIDAgLTQwLjUgLTE0dC0yNy41IC0zM2wtMTg5IC01MDZxLTggLTE5IDEuNSAtMzN0MzAuNSAtMTRoNjI1di0xNTBxMCAtMjEgMTQuNSAtMzUuNXQzNS41IC0xNC41dDM1LjUgMTQuNXQxNC41IDM1LjV2MTUwaDEyNXEyMSAwIDMwLjUgMTR0MS41IDMzek04OTcgMGgtNTk1djUwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg1MHY1MCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDQ4djMwMGgyMDB2LTMwMGg0N3EyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTBoNTBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTUweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMjQ7IiBkPSJNOTAwIDgwMGgzMDB2LTU3NXEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTM3NXY1OTFsLTMwMCAzMDB2ODRxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgzNzV2LTQwMHpNMTIwMCA5MDBoLTIwMHYyMDB6TTQwMCA2MDBoMzAwdi01NzVxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC02NTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY5NTBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgzNzV2LTQwMHpNNzAwIDcwMGgtMjAwdjIwMHogIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIyNTsiIGQ9Ik00ODQgMTA5NWgxOTVxNzUgMCAxNDYgLTMyLjV0MTI0IC04NnQ4OS41IC0xMjIuNXQ0OC41IC0xNDJxMTggLTE0IDM1IC0yMHEzMSAtMTAgNjQuNSA2LjV0NDMuNSA0OC41cTEwIDM0IC0xNSA3MXEtMTkgMjcgLTkgNDNxNSA4IDEyLjUgMTF0MTkgLTF0MjMuNSAtMTZxNDEgLTQ0IDM5IC0xMDVxLTMgLTYzIC00NiAtMTA2LjV0LTEwNCAtNDMuNWgtNjJxLTcgLTU1IC0zNSAtMTE3dC01NiAtMTAwbC0zOSAtMjM0cS0zIC0yMCAtMjAgLTM0LjUgdC0zOCAtMTQuNWgtMTAwcS0yMSAwIC0zMyAxNC41dC05IDM0LjVsMTIgNzBxLTQ5IC0xNCAtOTEgLTE0aC0xOTVxLTI0IDAgLTY1IDhsLTExIC02NHEtMyAtMjAgLTIwIC0zNC41dC0zOCAtMTQuNWgtMTAwcS0yMSAwIC0zMyAxNC41dC05IDM0LjVsMjYgMTU3cS04NCA3NCAtMTI4IDE3NWwtMTU5IDUzcS0xOSA3IC0zMyAyNnQtMTQgNDB2NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDEyNHExMSA4NyA1NiAxNjZsLTExMSA5NSBxLTE2IDE0IC0xMi41IDIzLjV0MjQuNSA5LjVoMjAzcTExNiAxMDEgMjUwIDEwMXpNNjc1IDEwMDBoLTI1MHEtMTAgMCAtMTcuNSAtNy41dC03LjUgLTE3LjV2LTUwcTAgLTEwIDcuNSAtMTcuNXQxNy41IC03LjVoMjUwcTEwIDAgMTcuNSA3LjV0Ny41IDE3LjV2NTBxMCAxMCAtNy41IDE3LjV0LTE3LjUgNy41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMjY7IiBkPSJNNjQxIDkwMGw0MjMgMjQ3cTE5IDggNDIgMi41dDM3IC0yMS41bDMyIC0zOHExNCAtMTUgMTIuNSAtMzZ0LTE3LjUgLTM0bC0xMzkgLTEyMGgtMzkwek01MCAxMTAwaDEwNnE2NyAwIDEwMyAtMTd0NjYgLTcxbDEwMiAtMjEyaDgyM3EyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNTBxMCAtMjEgLTE0IC00MHQtMzMgLTI2bC03MzcgLTEzMnEtMjMgLTQgLTQwIDZ0LTI2IDI1cS00MiA2NyAtMTAwIDY3aC0zMDBxLTYyIDAgLTEwNiA0NCB0LTQ0IDEwNnYyMDBxMCA2MiA0NCAxMDZ0MTA2IDQ0ek0xNzMgOTI4aC04MHEtMTkgMCAtMjggLTE0dC05IC0zNXYtNTZxMCAtNTEgNDIgLTUxaDEzNHExNiAwIDIxLjUgOHQ1LjUgMjRxMCAxMSAtMTYgNDV0LTI3IDUxcS0xOCAyOCAtNDMgMjh6TTU1MCA3MjdxLTMyIDAgLTU0LjUgLTIyLjV0LTIyLjUgLTU0LjV0MjIuNSAtNTQuNXQ1NC41IC0yMi41dDU0LjUgMjIuNXQyMi41IDU0LjV0LTIyLjUgNTQuNXQtNTQuNSAyMi41ek0xMzAgMzg5IGwxNTIgMTMwcTE4IDE5IDM0IDI0dDMxIC0zLjV0MjQuNSAtMTcuNXQyNS41IC0yOHEyOCAtMzUgNTAuNSAtNTF0NDguNSAtMTNsNjMgNWw0OCAtMTc5cTEzIC02MSAtMy41IC05Ny41dC02Ny41IC03OS41bC04MCAtNjlxLTQ3IC00MCAtMTA5IC0zNS41dC0xMDMgNTEuNWwtMTMwIDE1MXEtNDAgNDcgLTM1LjUgMTA5LjV0NTEuNSAxMDIuNXpNMzgwIDM3N2wtMTAyIC04OHEtMzEgLTI3IDIgLTY1bDM3IC00M3ExMyAtMTUgMjcuNSAtMTkuNSB0MzEuNSA2LjVsNjEgNTNxMTkgMTYgMTQgNDlxLTIgMjAgLTEyIDU2dC0xNyA0NXEtMTEgMTIgLTE5IDE0dC0yMyAtOHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjI3OyIgZD0iTTYyNSAxMjAwaDE1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTEwOXE3OSAtMzMgMTMxIC04Ny41dDUzIC0xMjguNXExIC00NiAtMTUgLTg0LjV0LTM5IC02MXQtNDYgLTM4dC0zOSAtMjEuNWwtMTcgLTZxNiAwIDE1IC0xLjV0MzUgLTl0NTAgLTE3LjV0NTMgLTMwdDUwIC00NXQzNS41IC02NHQxNC41IC04NHEwIC01OSAtMTEuNSAtMTA1LjV0LTI4LjUgLTc2LjV0LTQ0IC01MXQtNDkuNSAtMzEuNXQtNTQuNSAtMTZ0LTQ5LjUgLTYuNSB0LTQzLjUgLTF2LTc1cTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtMTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2NzVoLTEwMHYtNzVxMCAtMTAgLTcuNSAtMTcuNXQtMTcuNSAtNy41aC0xNTBxLTEwIDAgLTE3LjUgNy41dC03LjUgMTcuNXY3NWgtMTc1cS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjVoNzV2NjAwaC03NXEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MCBxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgxNzV2NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWgxNTBxMTAgMCAxNy41IC03LjV0Ny41IC0xNy41di03NWgxMDB2NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNXpNNDAwIDkwMHYtMjAwaDI2M3EyOCAwIDQ4LjUgMTAuNXQzMCAyNXQxNSAyOXQ1LjUgMjUuNWwxIDEwcTAgNCAtMC41IDExdC02IDI0dC0xNSAzMHQtMzAgMjR0LTQ4LjUgMTFoLTI2M3pNNDAwIDUwMHYtMjAwaDM2M3EyOCAwIDQ4LjUgMTAuNSB0MzAgMjV0MTUgMjl0NS41IDI1LjVsMSAxMHEwIDQgLTAuNSAxMXQtNiAyNHQtMTUgMzB0LTMwIDI0dC00OC41IDExaC0zNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIzMDsiIGQ9Ik0yMTIgMTE5OGg3ODBxODYgMCAxNDcgLTYxdDYxIC0xNDd2LTQxNnEwIC01MSAtMTggLTE0Mi41dC0zNiAtMTU3LjVsLTE4IC02NnEtMjkgLTg3IC05My41IC0xNDYuNXQtMTQ2LjUgLTU5LjVoLTU3MnEtODIgMCAtMTQ3IDU5dC05MyAxNDdxLTggMjggLTIwIDczdC0zMiAxNDMuNXQtMjAgMTQ5LjV2NDE2cTAgODYgNjEgMTQ3dDE0NyA2MXpNNjAwIDEwNDVxLTcwIDAgLTEzMi41IC0xMS41dC0xMDUuNSAtMzAuNXQtNzguNSAtNDEuNSB0LTU3IC00NXQtMzYgLTQxdC0yMC41IC0zMC41bC02IC0xMmwxNTYgLTI0M2g1NjBsMTU2IDI0M3EtMiA1IC02IDEyLjV0LTIwIDI5LjV0LTM2LjUgNDJ0LTU3IDQ0LjV0LTc5IDQydC0xMDUgMjkuNXQtMTMyLjUgMTJ6TTc2MiA3MDNoLTE1N2wxOTUgMjYxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMzE7IiBkPSJNNDc1IDEzMDBoMTUwcTEwMyAwIDE4OSAtODZ0ODYgLTE4OXYtNTAwcTAgLTQxIC00MiAtODN0LTgzIC00MmgtNDUwcS00MSAwIC04MyA0MnQtNDIgODN2NTAwcTAgMTAzIDg2IDE4OXQxODkgODZ6TTcwMCAzMDB2LTIyNXEwIC0yMSAtMjcgLTQ4dC00OCAtMjdoLTE1MHEtMjEgMCAtNDggMjd0LTI3IDQ4djIyNWgzMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIzMjsiIGQ9Ik00NzUgMTMwMGg5NnEwIC0xNTAgODkuNSAtMjM5LjV0MjM5LjUgLTg5LjV2LTQ0NnEwIC00MSAtNDIgLTgzdC04MyAtNDJoLTQ1MHEtNDEgMCAtODMgNDJ0LTQyIDgzdjUwMHEwIDEwMyA4NiAxODl0MTg5IDg2ek03MDAgMzAwdi0yMjVxMCAtMjEgLTI3IC00OHQtNDggLTI3aC0xNTBxLTIxIDAgLTQ4IDI3dC0yNyA0OHYyMjVoMzAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMzM7IiBkPSJNMTI5NCA3NjdsLTYzOCAtMjgzbC0zNzggMTcwbC03OCAtNjB2LTIyNGwxMDAgLTE1MHYtMTk5bC0xNTAgMTQ4bC0xNTAgLTE0OXYyMDBsMTAwIDE1MHYyNTBxMCA0IC0wLjUgMTAuNXQwIDkuNXQxIDh0MyA4dDYuNSA2bDQ3IDQwbC0xNDcgNjVsNjQyIDI4M3pNMTAwMCAzODBsLTM1MCAtMTY2bC0zNTAgMTY2djE0N2wzNTAgLTE2NWwzNTAgMTY1di0xNDd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIzNDsiIGQ9Ik0yNTAgODAwcTYyIDAgMTA2IC00NHQ0NCAtMTA2dC00NCAtMTA2dC0xMDYgLTQ0dC0xMDYgNDR0LTQ0IDEwNnQ0NCAxMDZ0MTA2IDQ0ek02NTAgODAwcTYyIDAgMTA2IC00NHQ0NCAtMTA2dC00NCAtMTA2dC0xMDYgLTQ0dC0xMDYgNDR0LTQ0IDEwNnQ0NCAxMDZ0MTA2IDQ0ek0xMDUwIDgwMHE2MiAwIDEwNiAtNDR0NDQgLTEwNnQtNDQgLTEwNnQtMTA2IC00NHQtMTA2IDQ0dC00NCAxMDZ0NDQgMTA2dDEwNiA0NHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjM1OyIgZD0iTTU1MCAxMTAwcTYyIDAgMTA2IC00NHQ0NCAtMTA2dC00NCAtMTA2dC0xMDYgLTQ0dC0xMDYgNDR0LTQ0IDEwNnQ0NCAxMDZ0MTA2IDQ0ek01NTAgNzAwcTYyIDAgMTA2IC00NHQ0NCAtMTA2dC00NCAtMTA2dC0xMDYgLTQ0dC0xMDYgNDR0LTQ0IDEwNnQ0NCAxMDZ0MTA2IDQ0ek01NTAgMzAwcTYyIDAgMTA2IC00NHQ0NCAtMTA2dC00NCAtMTA2dC0xMDYgLTQ0dC0xMDYgNDR0LTQ0IDEwNnQ0NCAxMDZ0MTA2IDQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMzY7IiBkPSJNMTI1IDExMDBoOTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtOTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjV0MTcuNSA3LjV6TTEyNSA3MDBoOTUwcTEwIDAgMTcuNSAtNy41dDcuNSAtMTcuNXYtMTUwcTAgLTEwIC03LjUgLTE3LjV0LTE3LjUgLTcuNWgtOTUwcS0xMCAwIC0xNy41IDcuNXQtNy41IDE3LjV2MTUwcTAgMTAgNy41IDE3LjUgdDE3LjUgNy41ek0xMjUgMzAwaDk1MHExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTE1MHEwIC0xMCAtNy41IC0xNy41dC0xNy41IC03LjVoLTk1MHEtMTAgMCAtMTcuNSA3LjV0LTcuNSAxNy41djE1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMzc7IiBkPSJNMzUwIDEyMDBoNTAwcTE2MiAwIDI1NiAtOTMuNXQ5NCAtMjU2LjV2LTUwMHEwIC0xNjUgLTkzLjUgLTI1Ny41dC0yNTYuNSAtOTIuNWgtNTAwcS0xNjUgMCAtMjU3LjUgOTIuNXQtOTIuNSAyNTcuNXY1MDBxMCAxNjUgOTIuNSAyNTcuNXQyNTcuNSA5Mi41ek05MDAgMTAwMGgtNjAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di02MDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDYwMHE0MSAwIDcwLjUgMjkuNSB0MjkuNSA3MC41djYwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNXpNMzUwIDkwMGg1MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTMwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYzMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek00MDAgODAwdi0yMDBoNDAwdjIwMGgtNDAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyMzg7IiBkPSJNMTUwIDExMDBoMTAwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTB2LTIwMGg1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTB2LTIwMGg1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNTB2LTIwMGg1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXQtMTQuNSAtMzUuNSB0LTM1LjUgLTE0LjVoLTEwMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjVoNTB2MjAwaC01MHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV0MTQuNSAzNS41dDM1LjUgMTQuNWg1MHYyMDBoLTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXQxNC41IDM1LjV0MzUuNSAxNC41aDUwdjIwMGgtNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41dDE0LjUgMzUuNXQzNS41IDE0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTIzOTsiIGQ9Ik02NTAgMTE4N3E4NyAtNjcgMTE4LjUgLTE1NnQwIC0xNzh0LTExOC41IC0xNTVxLTg3IDY2IC0xMTguNSAxNTV0MCAxNzh0MTE4LjUgMTU2ek0zMDAgODAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnEtMTI0IDAgLTIxMiA4OHQtODggMjEyek0xMDAwIDgwMHEwIC0xMjQgLTg4IC0yMTJ0LTIxMiAtODhxMCAxMjQgODggMjEydDIxMiA4OHpNMzAwIDUwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnogTTEwMDAgNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OHEwIDEyNCA4OCAyMTJ0MjEyIDg4ek03MDAgMTk5di0xNDRxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjV0LTM1LjUgMTQuNXQtMTQuNSAzNS41djE0MnE0MCAtNCA0MyAtNHExNyAwIDU3IDZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTI0MDsiIGQ9Ik03NDUgODc4bDY5IDE5cTI1IDYgNDUgLTEybDI5OCAtMjk1cTExIC0xMSAxNSAtMjYuNXQtMiAtMzAuNXEtNSAtMTQgLTE4IC0yMy41dC0yOCAtOS41aC04cTEgMCAxIC0xM3EwIC0yOSAtMiAtNTZ0LTguNSAtNjJ0LTIwIC02M3QtMzMgLTUzdC01MSAtMzl0LTcyLjUgLTE0aC0xNDZxLTE4NCAwIC0xODQgMjg4cTAgMjQgMTAgNDdxLTIwIDQgLTYyIDR0LTYzIC00cTExIC0yNCAxMSAtNDdxMCAtMjg4IC0xODQgLTI4OGgtMTQyIHEtNDggMCAtODQuNSAyMXQtNTYgNTF0LTMyIDcxLjV0LTE2IDc1dC0zLjUgNjguNXEwIDEzIDIgMTNoLTdxLTE1IDAgLTI3LjUgOS41dC0xOC41IDIzLjVxLTYgMTUgLTIgMzAuNXQxNSAyNS41bDI5OCAyOTZxMjAgMTggNDYgMTFsNzYgLTE5cTIwIC01IDMwLjUgLTIyLjV0NS41IC0zNy41dC0yMi41IC0zMXQtMzcuNSAtNWwtNTEgMTJsLTE4MiAtMTkzaDg5MWwtMTgyIDE5M2wtNDQgLTEycS0yMCAtNSAtMzcuNSA2dC0yMi41IDMxdDYgMzcuNSB0MzEgMjIuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjQxOyIgZD0iTTEyMDAgOTAwaC01MHEwIDIxIC00IDM3dC05LjUgMjYuNXQtMTggMTcuNXQtMjIgMTF0LTI4LjUgNS41dC0zMSAydC0zNyAwLjVoLTIwMHYtODUwcTAgLTIyIDI1IC0zNC41dDUwIC0xMy41bDI1IC0ydi0xMDBoLTQwMHYxMDBxNCAwIDExIDAuNXQyNCAzdDMwIDd0MjQgMTV0MTEgMjQuNXY4NTBoLTIwMHEtMjUgMCAtMzcgLTAuNXQtMzEgLTJ0LTI4LjUgLTUuNXQtMjIgLTExdC0xOCAtMTcuNXQtOS41IC0yNi41dC00IC0zN2gtNTB2MzAwIGgxMDAwdi0zMDB6TTUwMCA0NTBoLTI1cTAgMTUgLTQgMjQuNXQtOSAxNC41dC0xNyA3LjV0LTIwIDN0LTI1IDAuNWgtMTAwdi00MjVxMCAtMTEgMTIuNSAtMTcuNXQyNS41IC03LjVoMTJ2LTUwaC0yMDB2NTBxNTAgMCA1MCAyNXY0MjVoLTEwMHEtMTcgMCAtMjUgLTAuNXQtMjAgLTN0LTE3IC03LjV0LTkgLTE0LjV0LTQgLTI0LjVoLTI1djE1MGg1MDB2LTE1MHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjQyOyIgZD0iTTEwMDAgMzAwdjUwcS0yNSAwIC01NSAzMnEtMTQgMTQgLTI1IDMxdC0xNiAyN2wtNCAxMWwtMjg5IDc0N2gtNjlsLTMwMCAtNzU0cS0xOCAtMzUgLTM5IC01NnEtOSAtOSAtMjQuNSAtMTguNXQtMjYuNSAtMTQuNWwtMTEgLTV2LTUwaDI3M3Y1MHEtNDkgMCAtNzguNSAyMS41dC0xMS41IDY3LjVsNjkgMTc2aDI5M2w2MSAtMTY2cTEzIC0zNCAtMy41IC02Ni41dC01NS41IC0zMi41di01MGgzMTJ6TTQxMiA2OTFsMTM0IDM0MmwxMjEgLTM0MiBoLTI1NXpNMTEwMCAxNTB2LTEwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMTAwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyNDM7IiBkPSJNNTAgMTIwMGgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXYxMTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNjExIDExMThoLTcwcS0xMyAwIC0xOCAtMTJsLTI5OSAtNzUzcS0xNyAtMzIgLTM1IC01MXEtMTggLTE4IC01NiAtMzRxLTEyIC01IC0xMiAtMTh2LTUwcTAgLTggNS41IC0xNHQxNC41IC02IGgyNzNxOCAwIDE0IDZ0NiAxNHY1MHEwIDggLTYgMTR0LTE0IDZxLTU1IDAgLTcxIDIzcS0xMCAxNCAwIDM5bDYzIDE2M2gyNjZsNTcgLTE1M3ExMSAtMzEgLTYgLTU1cS0xMiAtMTcgLTM2IC0xN3EtOCAwIC0xNCAtNnQtNiAtMTR2LTUwcTAgLTggNiAtMTR0MTQgLTZoMzEzcTggMCAxNCA2dDYgMTR2NTBxMCA3IC01LjUgMTN0LTEzLjUgN3EtMTcgMCAtNDIgMjVxLTI1IDI3IC00MCA2M2gtMWwtMjg4IDc0OHEtNSAxMiAtMTkgMTJ6TTYzOSA2MTEgaC0xOTdsMTAzIDI2NHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjQ0OyIgZD0iTTEyMDAgMTEwMGgtMTIwMHYxMDBoMTIwMHYtMTAwek01MCAxMDAwaDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtOTAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djkwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTY1MCAxMDAwaDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00MDAgcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek03MDAgOTAwdi0zMDBoMzAwdjMwMGgtMzAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyNDU7IiBkPSJNNTAgMTIwMGg0MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTkwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY5MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek02NTAgNzAwaDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djQwMCBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek03MDAgNjAwdi0zMDBoMzAwdjMwMGgtMzAwek0xMjAwIDBoLTEyMDB2MTAwaDEyMDB2LTEwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjQ2OyIgZD0iTTUwIDEwMDBoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0zNTBoMTAwdjE1MHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xNTBoMTAwdi0xMDBoLTEwMHYtMTUwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC00MDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djE1MGgtMTAwdi0zNTBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djgwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTcwMCA3MDB2LTMwMGgzMDB2MzAwaC0zMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTI0NzsiIGQ9Ik0xMDAgMGgtMTAwdjEyMDBoMTAwdi0xMjAwek0yNTAgMTEwMGg0MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41ek0zMDAgMTAwMHYtMzAwaDMwMHYzMDBoLTMwMHpNMjUwIDUwMGg5MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMCBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTkwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjQ4OyIgZD0iTTYwMCAxMTAwaDE1MHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xNTB2LTEwMGg0NTBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtOTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDM1MHYxMDBoLTE1MHEtMjEgMCAtMzUuNSAxNC41IHQtMTQuNSAzNS41djQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMTUwdjEwMGgxMDB2LTEwMHpNNDAwIDEwMDB2LTMwMGgzMDB2MzAwaC0zMDB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTI0OTsiIGQ9Ik0xMjAwIDBoLTEwMHYxMjAwaDEwMHYtMTIwMHpNNTUwIDExMDBoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXpNNjAwIDEwMDB2LTMwMGgzMDB2MzAwaC0zMDB6TTUwIDUwMGg5MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMCBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTkwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjUwOyIgZD0iTTg2NSA1NjVsLTQ5NCAtNDk0cS0yMyAtMjMgLTQxIC0yM3EtMTQgMCAtMjIgMTMuNXQtOCAzOC41djEwMDBxMCAyNSA4IDM4LjV0MjIgMTMuNXExOCAwIDQxIC0yM2w0OTQgLTQ5NHExNCAtMTQgMTQgLTM1dC0xNCAtMzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTI1MTsiIGQ9Ik0zMzUgNjM1bDQ5NCA0OTRxMjkgMjkgNTAgMjAuNXQyMSAtNDkuNXYtMTAwMHEwIC00MSAtMjEgLTQ5LjV0LTUwIDIwLjVsLTQ5NCA0OTRxLTE0IDE0IC0xNCAzNXQxNCAzNXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjUyOyIgZD0iTTEwMCA5MDBoMTAwMHE0MSAwIDQ5LjUgLTIxdC0yMC41IC01MGwtNDk0IC00OTRxLTE0IC0xNCAtMzUgLTE0dC0zNSAxNGwtNDk0IDQ5NHEtMjkgMjkgLTIwLjUgNTB0NDkuNSAyMXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjUzOyIgZD0iTTYzNSA4NjVsNDk0IC00OTRxMjkgLTI5IDIwLjUgLTUwdC00OS41IC0yMWgtMTAwMHEtNDEgMCAtNDkuNSAyMXQyMC41IDUwbDQ5NCA0OTRxMTQgMTQgMzUgMTR0MzUgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyNTQ7IiBkPSJNNzAwIDc0MXYtMTgybC02OTIgLTMyM3YyMjFsNDEzIDE5M2wtNDEzIDE5M3YyMjF6TTEyMDAgMGgtODAwdjIwMGg4MDB2LTIwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjU1OyIgZD0iTTEyMDAgOTAwaC0yMDB2LTEwMGgyMDB2LTEwMGgtMzAwdjMwMGgyMDB2MTAwaC0yMDB2MTAwaDMwMHYtMzAwek0wIDcwMGg1MHEwIDIxIDQgMzd0OS41IDI2LjV0MTggMTcuNXQyMiAxMXQyOC41IDUuNXQzMSAydDM3IDAuNWgxMDB2LTU1MHEwIC0yMiAtMjUgLTM0LjV0LTUwIC0xMy41bC0yNSAtMnYtMTAwaDQwMHYxMDBxLTQgMCAtMTEgMC41dC0yNCAzdC0zMCA3dC0yNCAxNXQtMTEgMjQuNXY1NTBoMTAwcTI1IDAgMzcgLTAuNXQzMSAtMiB0MjguNSAtNS41dDIyIC0xMXQxOCAtMTcuNXQ5LjUgLTI2LjV0NCAtMzdoNTB2MzAwaC04MDB2LTMwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjU2OyIgZD0iTTgwMCA3MDBoLTUwcTAgMjEgLTQgMzd0LTkuNSAyNi41dC0xOCAxNy41dC0yMiAxMXQtMjguNSA1LjV0LTMxIDJ0LTM3IDAuNWgtMTAwdi01NTBxMCAtMjIgMjUgLTM0LjV0NTAgLTE0LjVsMjUgLTF2LTEwMGgtNDAwdjEwMHE0IDAgMTEgMC41dDI0IDN0MzAgN3QyNCAxNXQxMSAyNC41djU1MGgtMTAwcS0yNSAwIC0zNyAtMC41dC0zMSAtMnQtMjguNSAtNS41dC0yMiAtMTF0LTE4IC0xNy41dC05LjUgLTI2LjV0LTQgLTM3aC01MHYzMDAgaDgwMHYtMzAwek0xMTAwIDIwMGgtMjAwdi0xMDBoMjAwdi0xMDBoLTMwMHYzMDBoMjAwdjEwMGgtMjAwdjEwMGgzMDB2LTMwMHoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjU3OyIgZD0iTTcwMSAxMDk4aDE2MHExNiAwIDIxIC0xMXQtNyAtMjNsLTQ2NCAtNDY0bDQ2NCAtNDY0cTEyIC0xMiA3IC0yM3QtMjEgLTExaC0xNjBxLTEzIDAgLTIzIDlsLTQ3MSA0NzFxLTcgOCAtNyAxOHQ3IDE4bDQ3MSA0NzFxMTAgOSAyMyA5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGUyNTg7IiBkPSJNMzM5IDEwOThoMTYwcTEzIDAgMjMgLTlsNDcxIC00NzFxNyAtOCA3IC0xOHQtNyAtMThsLTQ3MSAtNDcxcS0xMCAtOSAtMjMgLTloLTE2MHEtMTYgMCAtMjEgMTF0NyAyM2w0NjQgNDY0bC00NjQgNDY0cS0xMiAxMiAtNyAyM3QyMSAxMXoiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjU5OyIgZD0iTTEwODcgODgycTExIC01IDExIC0yMXYtMTYwcTAgLTEzIC05IC0yM2wtNDcxIC00NzFxLTggLTcgLTE4IC03dC0xOCA3bC00NzEgNDcxcS05IDEwIC05IDIzdjE2MHEwIDE2IDExIDIxdDIzIC03bDQ2NCAtNDY0bDQ2NCA0NjRxMTIgMTIgMjMgN3oiIC8%2BCjxnbHlwaCB1bmljb2RlPSImI3hlMjYwOyIgZD0iTTYxOCA5OTNsNDcxIC00NzFxOSAtMTAgOSAtMjN2LTE2MHEwIC0xNiAtMTEgLTIxdC0yMyA3bC00NjQgNDY0bC00NjQgLTQ2NHEtMTIgLTEyIC0yMyAtN3QtMTEgMjF2MTYwcTAgMTMgOSAyM2w0NzEgNDcxcTggNyAxOCA3dDE4IC03eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGY4ZmY7IiBkPSJNMTAwMCAxMjAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OHEwIDEyNCA4OCAyMTJ0MjEyIDg4ek00NTAgMTAwMGgxMDBxMjEgMCA0MCAtMTR0MjYgLTMzbDc5IC0xOTRxNSAxIDE2IDNxMzQgNiA1NCA5LjV0NjAgN3Q2NS41IDF0NjEgLTEwdDU2LjUgLTIzdDQyLjUgLTQydDI5IC02NHQ1IC05MnQtMTkuNSAtMTIxLjVxLTEgLTcgLTMgLTE5LjV0LTExIC01MHQtMjAuNSAtNzN0LTMyLjUgLTgxLjV0LTQ2LjUgLTgzdC02NCAtNzAgdC04Mi41IC01MHEtMTMgLTUgLTQyIC01dC02NS41IDIuNXQtNDcuNSAyLjVxLTE0IDAgLTQ5LjUgLTMuNXQtNjMgLTMuNXQtNDMuNSA3cS01NyAyNSAtMTA0LjUgNzguNXQtNzUgMTExLjV0LTQ2LjUgMTEydC0yNiA5MGwtNyAzNXEtMTUgNjMgLTE4IDExNXQ0LjUgODguNXQyNiA2NHQzOS41IDQzLjV0NTIgMjUuNXQ1OC41IDEzdDYyLjUgMnQ1OS41IC00LjV0NTUuNSAtOGwtMTQ3IDE5MnEtMTIgMTggLTUuNSAzMHQyNy41IDEyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDFmNTExOyIgZD0iTTI1MCAxMjAwaDYwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xNTB2LTUwMGwtMjU1IC0xNzhxLTE5IC05IC0zMiAtMXQtMTMgMjl2NjUwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjV6TTQwMCAxMTAwdi0xMDBoMzAwdjEwMGgtMzAweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDFmNmFhOyIgZD0iTTI1MCAxMjAwaDc1MHEzOSAwIDY5LjUgLTQwLjV0MzAuNSAtODQuNXYtOTMzbC03MDAgLTExN3Y5NTBsNjAwIDEyNWgtNzAwdi0xMDAwaC0xMDB2MTAyNXEwIDIzIDE1LjUgNDl0MzQuNSAyNnpNNTAwIDUyNXYtMTAwbDEwMCAyMHYxMDB6IiAvPgo8L2ZvbnQ%2BCjwvZGVmcz48L3N2Zz4g%29%20format%28%27svg%27%29%7D%2Eglyphicon%7Bposition%3Arelative%3Btop%3A1px%3Bdisplay%3Ainline%2Dblock%3Bfont%2Dfamily%3A%27Glyphicons%20Halflings%27%3Bfont%2Dstyle%3Anormal%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%3B%2Dwebkit%2Dfont%2Dsmoothing%3Aantialiased%3B%2Dmoz%2Dosx%2Dfont%2Dsmoothing%3Agrayscale%7D%2Eglyphicon%2Dasterisk%3Abefore%7Bcontent%3A%22%5C2a%22%7D%2Eglyphicon%2Dplus%3Abefore%7Bcontent%3A%22%5C2b%22%7D%2Eglyphicon%2Deur%3Abefore%2C%2Eglyphicon%2Deuro%3Abefore%7Bcontent%3A%22%5C20ac%22%7D%2Eglyphicon%2Dminus%3Abefore%7Bcontent%3A%22%5C2212%22%7D%2Eglyphicon%2Dcloud%3Abefore%7Bcontent%3A%22%5C2601%22%7D%2Eglyphicon%2Denvelope%3Abefore%7Bcontent%3A%22%5C2709%22%7D%2Eglyphicon%2Dpencil%3Abefore%7Bcontent%3A%22%5C270f%22%7D%2Eglyphicon%2Dglass%3Abefore%7Bcontent%3A%22%5Ce001%22%7D%2Eglyphicon%2Dmusic%3Abefore%7Bcontent%3A%22%5Ce002%22%7D%2Eglyphicon%2Dsearch%3Abefore%7Bcontent%3A%22%5Ce003%22%7D%2Eglyphicon%2Dheart%3Abefore%7Bcontent%3A%22%5Ce005%22%7D%2Eglyphicon%2Dstar%3Abefore%7Bcontent%3A%22%5Ce006%22%7D%2Eglyphicon%2Dstar%2Dempty%3Abefore%7Bcontent%3A%22%5Ce007%22%7D%2Eglyphicon%2Duser%3Abefore%7Bcontent%3A%22%5Ce008%22%7D%2Eglyphicon%2Dfilm%3Abefore%7Bcontent%3A%22%5Ce009%22%7D%2Eglyphicon%2Dth%2Dlarge%3Abefore%7Bcontent%3A%22%5Ce010%22%7D%2Eglyphicon%2Dth%3Abefore%7Bcontent%3A%22%5Ce011%22%7D%2Eglyphicon%2Dth%2Dlist%3Abefore%7Bcontent%3A%22%5Ce012%22%7D%2Eglyphicon%2Dok%3Abefore%7Bcontent%3A%22%5Ce013%22%7D%2Eglyphicon%2Dremove%3Abefore%7Bcontent%3A%22%5Ce014%22%7D%2Eglyphicon%2Dzoom%2Din%3Abefore%7Bcontent%3A%22%5Ce015%22%7D%2Eglyphicon%2Dzoom%2Dout%3Abefore%7Bcontent%3A%22%5Ce016%22%7D%2Eglyphicon%2Doff%3Abefore%7Bcontent%3A%22%5Ce017%22%7D%2Eglyphicon%2Dsignal%3Abefore%7Bcontent%3A%22%5Ce018%22%7D%2Eglyphicon%2Dcog%3Abefore%7Bcontent%3A%22%5Ce019%22%7D%2Eglyphicon%2Dtrash%3Abefore%7Bcontent%3A%22%5Ce020%22%7D%2Eglyphicon%2Dhome%3Abefore%7Bcontent%3A%22%5Ce021%22%7D%2Eglyphicon%2Dfile%3Abefore%7Bcontent%3A%22%5Ce022%22%7D%2Eglyphicon%2Dtime%3Abefore%7Bcontent%3A%22%5Ce023%22%7D%2Eglyphicon%2Droad%3Abefore%7Bcontent%3A%22%5Ce024%22%7D%2Eglyphicon%2Ddownload%2Dalt%3Abefore%7Bcontent%3A%22%5Ce025%22%7D%2Eglyphicon%2Ddownload%3Abefore%7Bcontent%3A%22%5Ce026%22%7D%2Eglyphicon%2Dupload%3Abefore%7Bcontent%3A%22%5Ce027%22%7D%2Eglyphicon%2Dinbox%3Abefore%7Bcontent%3A%22%5Ce028%22%7D%2Eglyphicon%2Dplay%2Dcircle%3Abefore%7Bcontent%3A%22%5Ce029%22%7D%2Eglyphicon%2Drepeat%3Abefore%7Bcontent%3A%22%5Ce030%22%7D%2Eglyphicon%2Drefresh%3Abefore%7Bcontent%3A%22%5Ce031%22%7D%2Eglyphicon%2Dlist%2Dalt%3Abefore%7Bcontent%3A%22%5Ce032%22%7D%2Eglyphicon%2Dlock%3Abefore%7Bcontent%3A%22%5Ce033%22%7D%2Eglyphicon%2Dflag%3Abefore%7Bcontent%3A%22%5Ce034%22%7D%2Eglyphicon%2Dheadphones%3Abefore%7Bcontent%3A%22%5Ce035%22%7D%2Eglyphicon%2Dvolume%2Doff%3Abefore%7Bcontent%3A%22%5Ce036%22%7D%2Eglyphicon%2Dvolume%2Ddown%3Abefore%7Bcontent%3A%22%5Ce037%22%7D%2Eglyphicon%2Dvolume%2Dup%3Abefore%7Bcontent%3A%22%5Ce038%22%7D%2Eglyphicon%2Dqrcode%3Abefore%7Bcontent%3A%22%5Ce039%22%7D%2Eglyphicon%2Dbarcode%3Abefore%7Bcontent%3A%22%5Ce040%22%7D%2Eglyphicon%2Dtag%3Abefore%7Bcontent%3A%22%5Ce041%22%7D%2Eglyphicon%2Dtags%3Abefore%7Bcontent%3A%22%5Ce042%22%7D%2Eglyphicon%2Dbook%3Abefore%7Bcontent%3A%22%5Ce043%22%7D%2Eglyphicon%2Dbookmark%3Abefore%7Bcontent%3A%22%5Ce044%22%7D%2Eglyphicon%2Dprint%3Abefore%7Bcontent%3A%22%5Ce045%22%7D%2Eglyphicon%2Dcamera%3Abefore%7Bcontent%3A%22%5Ce046%22%7D%2Eglyphicon%2Dfont%3Abefore%7Bcontent%3A%22%5Ce047%22%7D%2Eglyphicon%2Dbold%3Abefore%7Bcontent%3A%22%5Ce048%22%7D%2Eglyphicon%2Ditalic%3Abefore%7Bcontent%3A%22%5Ce049%22%7D%2Eglyphicon%2Dtext%2Dheight%3Abefore%7Bcontent%3A%22%5Ce050%22%7D%2Eglyphicon%2Dtext%2Dwidth%3Abefore%7Bcontent%3A%22%5Ce051%22%7D%2Eglyphicon%2Dalign%2Dleft%3Abefore%7Bcontent%3A%22%5Ce052%22%7D%2Eglyphicon%2Dalign%2Dcenter%3Abefore%7Bcontent%3A%22%5Ce053%22%7D%2Eglyphicon%2Dalign%2Dright%3Abefore%7Bcontent%3A%22%5Ce054%22%7D%2Eglyphicon%2Dalign%2Djustify%3Abefore%7Bcontent%3A%22%5Ce055%22%7D%2Eglyphicon%2Dlist%3Abefore%7Bcontent%3A%22%5Ce056%22%7D%2Eglyphicon%2Dindent%2Dleft%3Abefore%7Bcontent%3A%22%5Ce057%22%7D%2Eglyphicon%2Dindent%2Dright%3Abefore%7Bcontent%3A%22%5Ce058%22%7D%2Eglyphicon%2Dfacetime%2Dvideo%3Abefore%7Bcontent%3A%22%5Ce059%22%7D%2Eglyphicon%2Dpicture%3Abefore%7Bcontent%3A%22%5Ce060%22%7D%2Eglyphicon%2Dmap%2Dmarker%3Abefore%7Bcontent%3A%22%5Ce062%22%7D%2Eglyphicon%2Dadjust%3Abefore%7Bcontent%3A%22%5Ce063%22%7D%2Eglyphicon%2Dtint%3Abefore%7Bcontent%3A%22%5Ce064%22%7D%2Eglyphicon%2Dedit%3Abefore%7Bcontent%3A%22%5Ce065%22%7D%2Eglyphicon%2Dshare%3Abefore%7Bcontent%3A%22%5Ce066%22%7D%2Eglyphicon%2Dcheck%3Abefore%7Bcontent%3A%22%5Ce067%22%7D%2Eglyphicon%2Dmove%3Abefore%7Bcontent%3A%22%5Ce068%22%7D%2Eglyphicon%2Dstep%2Dbackward%3Abefore%7Bcontent%3A%22%5Ce069%22%7D%2Eglyphicon%2Dfast%2Dbackward%3Abefore%7Bcontent%3A%22%5Ce070%22%7D%2Eglyphicon%2Dbackward%3Abefore%7Bcontent%3A%22%5Ce071%22%7D%2Eglyphicon%2Dplay%3Abefore%7Bcontent%3A%22%5Ce072%22%7D%2Eglyphicon%2Dpause%3Abefore%7Bcontent%3A%22%5Ce073%22%7D%2Eglyphicon%2Dstop%3Abefore%7Bcontent%3A%22%5Ce074%22%7D%2Eglyphicon%2Dforward%3Abefore%7Bcontent%3A%22%5Ce075%22%7D%2Eglyphicon%2Dfast%2Dforward%3Abefore%7Bcontent%3A%22%5Ce076%22%7D%2Eglyphicon%2Dstep%2Dforward%3Abefore%7Bcontent%3A%22%5Ce077%22%7D%2Eglyphicon%2Deject%3Abefore%7Bcontent%3A%22%5Ce078%22%7D%2Eglyphicon%2Dchevron%2Dleft%3Abefore%7Bcontent%3A%22%5Ce079%22%7D%2Eglyphicon%2Dchevron%2Dright%3Abefore%7Bcontent%3A%22%5Ce080%22%7D%2Eglyphicon%2Dplus%2Dsign%3Abefore%7Bcontent%3A%22%5Ce081%22%7D%2Eglyphicon%2Dminus%2Dsign%3Abefore%7Bcontent%3A%22%5Ce082%22%7D%2Eglyphicon%2Dremove%2Dsign%3Abefore%7Bcontent%3A%22%5Ce083%22%7D%2Eglyphicon%2Dok%2Dsign%3Abefore%7Bcontent%3A%22%5Ce084%22%7D%2Eglyphicon%2Dquestion%2Dsign%3Abefore%7Bcontent%3A%22%5Ce085%22%7D%2Eglyphicon%2Dinfo%2Dsign%3Abefore%7Bcontent%3A%22%5Ce086%22%7D%2Eglyphicon%2Dscreenshot%3Abefore%7Bcontent%3A%22%5Ce087%22%7D%2Eglyphicon%2Dremove%2Dcircle%3Abefore%7Bcontent%3A%22%5Ce088%22%7D%2Eglyphicon%2Dok%2Dcircle%3Abefore%7Bcontent%3A%22%5Ce089%22%7D%2Eglyphicon%2Dban%2Dcircle%3Abefore%7Bcontent%3A%22%5Ce090%22%7D%2Eglyphicon%2Darrow%2Dleft%3Abefore%7Bcontent%3A%22%5Ce091%22%7D%2Eglyphicon%2Darrow%2Dright%3Abefore%7Bcontent%3A%22%5Ce092%22%7D%2Eglyphicon%2Darrow%2Dup%3Abefore%7Bcontent%3A%22%5Ce093%22%7D%2Eglyphicon%2Darrow%2Ddown%3Abefore%7Bcontent%3A%22%5Ce094%22%7D%2Eglyphicon%2Dshare%2Dalt%3Abefore%7Bcontent%3A%22%5Ce095%22%7D%2Eglyphicon%2Dresize%2Dfull%3Abefore%7Bcontent%3A%22%5Ce096%22%7D%2Eglyphicon%2Dresize%2Dsmall%3Abefore%7Bcontent%3A%22%5Ce097%22%7D%2Eglyphicon%2Dexclamation%2Dsign%3Abefore%7Bcontent%3A%22%5Ce101%22%7D%2Eglyphicon%2Dgift%3Abefore%7Bcontent%3A%22%5Ce102%22%7D%2Eglyphicon%2Dleaf%3Abefore%7Bcontent%3A%22%5Ce103%22%7D%2Eglyphicon%2Dfire%3Abefore%7Bcontent%3A%22%5Ce104%22%7D%2Eglyphicon%2Deye%2Dopen%3Abefore%7Bcontent%3A%22%5Ce105%22%7D%2Eglyphicon%2Deye%2Dclose%3Abefore%7Bcontent%3A%22%5Ce106%22%7D%2Eglyphicon%2Dwarning%2Dsign%3Abefore%7Bcontent%3A%22%5Ce107%22%7D%2Eglyphicon%2Dplane%3Abefore%7Bcontent%3A%22%5Ce108%22%7D%2Eglyphicon%2Dcalendar%3Abefore%7Bcontent%3A%22%5Ce109%22%7D%2Eglyphicon%2Drandom%3Abefore%7Bcontent%3A%22%5Ce110%22%7D%2Eglyphicon%2Dcomment%3Abefore%7Bcontent%3A%22%5Ce111%22%7D%2Eglyphicon%2Dmagnet%3Abefore%7Bcontent%3A%22%5Ce112%22%7D%2Eglyphicon%2Dchevron%2Dup%3Abefore%7Bcontent%3A%22%5Ce113%22%7D%2Eglyphicon%2Dchevron%2Ddown%3Abefore%7Bcontent%3A%22%5Ce114%22%7D%2Eglyphicon%2Dretweet%3Abefore%7Bcontent%3A%22%5Ce115%22%7D%2Eglyphicon%2Dshopping%2Dcart%3Abefore%7Bcontent%3A%22%5Ce116%22%7D%2Eglyphicon%2Dfolder%2Dclose%3Abefore%7Bcontent%3A%22%5Ce117%22%7D%2Eglyphicon%2Dfolder%2Dopen%3Abefore%7Bcontent%3A%22%5Ce118%22%7D%2Eglyphicon%2Dresize%2Dvertical%3Abefore%7Bcontent%3A%22%5Ce119%22%7D%2Eglyphicon%2Dresize%2Dhorizontal%3Abefore%7Bcontent%3A%22%5Ce120%22%7D%2Eglyphicon%2Dhdd%3Abefore%7Bcontent%3A%22%5Ce121%22%7D%2Eglyphicon%2Dbullhorn%3Abefore%7Bcontent%3A%22%5Ce122%22%7D%2Eglyphicon%2Dbell%3Abefore%7Bcontent%3A%22%5Ce123%22%7D%2Eglyphicon%2Dcertificate%3Abefore%7Bcontent%3A%22%5Ce124%22%7D%2Eglyphicon%2Dthumbs%2Dup%3Abefore%7Bcontent%3A%22%5Ce125%22%7D%2Eglyphicon%2Dthumbs%2Ddown%3Abefore%7Bcontent%3A%22%5Ce126%22%7D%2Eglyphicon%2Dhand%2Dright%3Abefore%7Bcontent%3A%22%5Ce127%22%7D%2Eglyphicon%2Dhand%2Dleft%3Abefore%7Bcontent%3A%22%5Ce128%22%7D%2Eglyphicon%2Dhand%2Dup%3Abefore%7Bcontent%3A%22%5Ce129%22%7D%2Eglyphicon%2Dhand%2Ddown%3Abefore%7Bcontent%3A%22%5Ce130%22%7D%2Eglyphicon%2Dcircle%2Darrow%2Dright%3Abefore%7Bcontent%3A%22%5Ce131%22%7D%2Eglyphicon%2Dcircle%2Darrow%2Dleft%3Abefore%7Bcontent%3A%22%5Ce132%22%7D%2Eglyphicon%2Dcircle%2Darrow%2Dup%3Abefore%7Bcontent%3A%22%5Ce133%22%7D%2Eglyphicon%2Dcircle%2Darrow%2Ddown%3Abefore%7Bcontent%3A%22%5Ce134%22%7D%2Eglyphicon%2Dglobe%3Abefore%7Bcontent%3A%22%5Ce135%22%7D%2Eglyphicon%2Dwrench%3Abefore%7Bcontent%3A%22%5Ce136%22%7D%2Eglyphicon%2Dtasks%3Abefore%7Bcontent%3A%22%5Ce137%22%7D%2Eglyphicon%2Dfilter%3Abefore%7Bcontent%3A%22%5Ce138%22%7D%2Eglyphicon%2Dbriefcase%3Abefore%7Bcontent%3A%22%5Ce139%22%7D%2Eglyphicon%2Dfullscreen%3Abefore%7Bcontent%3A%22%5Ce140%22%7D%2Eglyphicon%2Ddashboard%3Abefore%7Bcontent%3A%22%5Ce141%22%7D%2Eglyphicon%2Dpaperclip%3Abefore%7Bcontent%3A%22%5Ce142%22%7D%2Eglyphicon%2Dheart%2Dempty%3Abefore%7Bcontent%3A%22%5Ce143%22%7D%2Eglyphicon%2Dlink%3Abefore%7Bcontent%3A%22%5Ce144%22%7D%2Eglyphicon%2Dphone%3Abefore%7Bcontent%3A%22%5Ce145%22%7D%2Eglyphicon%2Dpushpin%3Abefore%7Bcontent%3A%22%5Ce146%22%7D%2Eglyphicon%2Dusd%3Abefore%7Bcontent%3A%22%5Ce148%22%7D%2Eglyphicon%2Dgbp%3Abefore%7Bcontent%3A%22%5Ce149%22%7D%2Eglyphicon%2Dsort%3Abefore%7Bcontent%3A%22%5Ce150%22%7D%2Eglyphicon%2Dsort%2Dby%2Dalphabet%3Abefore%7Bcontent%3A%22%5Ce151%22%7D%2Eglyphicon%2Dsort%2Dby%2Dalphabet%2Dalt%3Abefore%7Bcontent%3A%22%5Ce152%22%7D%2Eglyphicon%2Dsort%2Dby%2Dorder%3Abefore%7Bcontent%3A%22%5Ce153%22%7D%2Eglyphicon%2Dsort%2Dby%2Dorder%2Dalt%3Abefore%7Bcontent%3A%22%5Ce154%22%7D%2Eglyphicon%2Dsort%2Dby%2Dattributes%3Abefore%7Bcontent%3A%22%5Ce155%22%7D%2Eglyphicon%2Dsort%2Dby%2Dattributes%2Dalt%3Abefore%7Bcontent%3A%22%5Ce156%22%7D%2Eglyphicon%2Dunchecked%3Abefore%7Bcontent%3A%22%5Ce157%22%7D%2Eglyphicon%2Dexpand%3Abefore%7Bcontent%3A%22%5Ce158%22%7D%2Eglyphicon%2Dcollapse%2Ddown%3Abefore%7Bcontent%3A%22%5Ce159%22%7D%2Eglyphicon%2Dcollapse%2Dup%3Abefore%7Bcontent%3A%22%5Ce160%22%7D%2Eglyphicon%2Dlog%2Din%3Abefore%7Bcontent%3A%22%5Ce161%22%7D%2Eglyphicon%2Dflash%3Abefore%7Bcontent%3A%22%5Ce162%22%7D%2Eglyphicon%2Dlog%2Dout%3Abefore%7Bcontent%3A%22%5Ce163%22%7D%2Eglyphicon%2Dnew%2Dwindow%3Abefore%7Bcontent%3A%22%5Ce164%22%7D%2Eglyphicon%2Drecord%3Abefore%7Bcontent%3A%22%5Ce165%22%7D%2Eglyphicon%2Dsave%3Abefore%7Bcontent%3A%22%5Ce166%22%7D%2Eglyphicon%2Dopen%3Abefore%7Bcontent%3A%22%5Ce167%22%7D%2Eglyphicon%2Dsaved%3Abefore%7Bcontent%3A%22%5Ce168%22%7D%2Eglyphicon%2Dimport%3Abefore%7Bcontent%3A%22%5Ce169%22%7D%2Eglyphicon%2Dexport%3Abefore%7Bcontent%3A%22%5Ce170%22%7D%2Eglyphicon%2Dsend%3Abefore%7Bcontent%3A%22%5Ce171%22%7D%2Eglyphicon%2Dfloppy%2Ddisk%3Abefore%7Bcontent%3A%22%5Ce172%22%7D%2Eglyphicon%2Dfloppy%2Dsaved%3Abefore%7Bcontent%3A%22%5Ce173%22%7D%2Eglyphicon%2Dfloppy%2Dremove%3Abefore%7Bcontent%3A%22%5Ce174%22%7D%2Eglyphicon%2Dfloppy%2Dsave%3Abefore%7Bcontent%3A%22%5Ce175%22%7D%2Eglyphicon%2Dfloppy%2Dopen%3Abefore%7Bcontent%3A%22%5Ce176%22%7D%2Eglyphicon%2Dcredit%2Dcard%3Abefore%7Bcontent%3A%22%5Ce177%22%7D%2Eglyphicon%2Dtransfer%3Abefore%7Bcontent%3A%22%5Ce178%22%7D%2Eglyphicon%2Dcutlery%3Abefore%7Bcontent%3A%22%5Ce179%22%7D%2Eglyphicon%2Dheader%3Abefore%7Bcontent%3A%22%5Ce180%22%7D%2Eglyphicon%2Dcompressed%3Abefore%7Bcontent%3A%22%5Ce181%22%7D%2Eglyphicon%2Dearphone%3Abefore%7Bcontent%3A%22%5Ce182%22%7D%2Eglyphicon%2Dphone%2Dalt%3Abefore%7Bcontent%3A%22%5Ce183%22%7D%2Eglyphicon%2Dtower%3Abefore%7Bcontent%3A%22%5Ce184%22%7D%2Eglyphicon%2Dstats%3Abefore%7Bcontent%3A%22%5Ce185%22%7D%2Eglyphicon%2Dsd%2Dvideo%3Abefore%7Bcontent%3A%22%5Ce186%22%7D%2Eglyphicon%2Dhd%2Dvideo%3Abefore%7Bcontent%3A%22%5Ce187%22%7D%2Eglyphicon%2Dsubtitles%3Abefore%7Bcontent%3A%22%5Ce188%22%7D%2Eglyphicon%2Dsound%2Dstereo%3Abefore%7Bcontent%3A%22%5Ce189%22%7D%2Eglyphicon%2Dsound%2Ddolby%3Abefore%7Bcontent%3A%22%5Ce190%22%7D%2Eglyphicon%2Dsound%2D5%2D1%3Abefore%7Bcontent%3A%22%5Ce191%22%7D%2Eglyphicon%2Dsound%2D6%2D1%3Abefore%7Bcontent%3A%22%5Ce192%22%7D%2Eglyphicon%2Dsound%2D7%2D1%3Abefore%7Bcontent%3A%22%5Ce193%22%7D%2Eglyphicon%2Dcopyright%2Dmark%3Abefore%7Bcontent%3A%22%5Ce194%22%7D%2Eglyphicon%2Dregistration%2Dmark%3Abefore%7Bcontent%3A%22%5Ce195%22%7D%2Eglyphicon%2Dcloud%2Ddownload%3Abefore%7Bcontent%3A%22%5Ce197%22%7D%2Eglyphicon%2Dcloud%2Dupload%3Abefore%7Bcontent%3A%22%5Ce198%22%7D%2Eglyphicon%2Dtree%2Dconifer%3Abefore%7Bcontent%3A%22%5Ce199%22%7D%2Eglyphicon%2Dtree%2Ddeciduous%3Abefore%7Bcontent%3A%22%5Ce200%22%7D%2Eglyphicon%2Dcd%3Abefore%7Bcontent%3A%22%5Ce201%22%7D%2Eglyphicon%2Dsave%2Dfile%3Abefore%7Bcontent%3A%22%5Ce202%22%7D%2Eglyphicon%2Dopen%2Dfile%3Abefore%7Bcontent%3A%22%5Ce203%22%7D%2Eglyphicon%2Dlevel%2Dup%3Abefore%7Bcontent%3A%22%5Ce204%22%7D%2Eglyphicon%2Dcopy%3Abefore%7Bcontent%3A%22%5Ce205%22%7D%2Eglyphicon%2Dpaste%3Abefore%7Bcontent%3A%22%5Ce206%22%7D%2Eglyphicon%2Dalert%3Abefore%7Bcontent%3A%22%5Ce209%22%7D%2Eglyphicon%2Dequalizer%3Abefore%7Bcontent%3A%22%5Ce210%22%7D%2Eglyphicon%2Dking%3Abefore%7Bcontent%3A%22%5Ce211%22%7D%2Eglyphicon%2Dqueen%3Abefore%7Bcontent%3A%22%5Ce212%22%7D%2Eglyphicon%2Dpawn%3Abefore%7Bcontent%3A%22%5Ce213%22%7D%2Eglyphicon%2Dbishop%3Abefore%7Bcontent%3A%22%5Ce214%22%7D%2Eglyphicon%2Dknight%3Abefore%7Bcontent%3A%22%5Ce215%22%7D%2Eglyphicon%2Dbaby%2Dformula%3Abefore%7Bcontent%3A%22%5Ce216%22%7D%2Eglyphicon%2Dtent%3Abefore%7Bcontent%3A%22%5C26fa%22%7D%2Eglyphicon%2Dblackboard%3Abefore%7Bcontent%3A%22%5Ce218%22%7D%2Eglyphicon%2Dbed%3Abefore%7Bcontent%3A%22%5Ce219%22%7D%2Eglyphicon%2Dapple%3Abefore%7Bcontent%3A%22%5Cf8ff%22%7D%2Eglyphicon%2Derase%3Abefore%7Bcontent%3A%22%5Ce221%22%7D%2Eglyphicon%2Dhourglass%3Abefore%7Bcontent%3A%22%5C231b%22%7D%2Eglyphicon%2Dlamp%3Abefore%7Bcontent%3A%22%5Ce223%22%7D%2Eglyphicon%2Dduplicate%3Abefore%7Bcontent%3A%22%5Ce224%22%7D%2Eglyphicon%2Dpiggy%2Dbank%3Abefore%7Bcontent%3A%22%5Ce225%22%7D%2Eglyphicon%2Dscissors%3Abefore%7Bcontent%3A%22%5Ce226%22%7D%2Eglyphicon%2Dbitcoin%3Abefore%7Bcontent%3A%22%5Ce227%22%7D%2Eglyphicon%2Dbtc%3Abefore%7Bcontent%3A%22%5Ce227%22%7D%2Eglyphicon%2Dxbt%3Abefore%7Bcontent%3A%22%5Ce227%22%7D%2Eglyphicon%2Dyen%3Abefore%7Bcontent%3A%22%5C00a5%22%7D%2Eglyphicon%2Djpy%3Abefore%7Bcontent%3A%22%5C00a5%22%7D%2Eglyphicon%2Druble%3Abefore%7Bcontent%3A%22%5C20bd%22%7D%2Eglyphicon%2Drub%3Abefore%7Bcontent%3A%22%5C20bd%22%7D%2Eglyphicon%2Dscale%3Abefore%7Bcontent%3A%22%5Ce230%22%7D%2Eglyphicon%2Dice%2Dlolly%3Abefore%7Bcontent%3A%22%5Ce231%22%7D%2Eglyphicon%2Dice%2Dlolly%2Dtasted%3Abefore%7Bcontent%3A%22%5Ce232%22%7D%2Eglyphicon%2Deducation%3Abefore%7Bcontent%3A%22%5Ce233%22%7D%2Eglyphicon%2Doption%2Dhorizontal%3Abefore%7Bcontent%3A%22%5Ce234%22%7D%2Eglyphicon%2Doption%2Dvertical%3Abefore%7Bcontent%3A%22%5Ce235%22%7D%2Eglyphicon%2Dmenu%2Dhamburger%3Abefore%7Bcontent%3A%22%5Ce236%22%7D%2Eglyphicon%2Dmodal%2Dwindow%3Abefore%7Bcontent%3A%22%5Ce237%22%7D%2Eglyphicon%2Doil%3Abefore%7Bcontent%3A%22%5Ce238%22%7D%2Eglyphicon%2Dgrain%3Abefore%7Bcontent%3A%22%5Ce239%22%7D%2Eglyphicon%2Dsunglasses%3Abefore%7Bcontent%3A%22%5Ce240%22%7D%2Eglyphicon%2Dtext%2Dsize%3Abefore%7Bcontent%3A%22%5Ce241%22%7D%2Eglyphicon%2Dtext%2Dcolor%3Abefore%7Bcontent%3A%22%5Ce242%22%7D%2Eglyphicon%2Dtext%2Dbackground%3Abefore%7Bcontent%3A%22%5Ce243%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dtop%3Abefore%7Bcontent%3A%22%5Ce244%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dbottom%3Abefore%7Bcontent%3A%22%5Ce245%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dhorizontal%3Abefore%7Bcontent%3A%22%5Ce246%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dleft%3Abefore%7Bcontent%3A%22%5Ce247%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dvertical%3Abefore%7Bcontent%3A%22%5Ce248%22%7D%2Eglyphicon%2Dobject%2Dalign%2Dright%3Abefore%7Bcontent%3A%22%5Ce249%22%7D%2Eglyphicon%2Dtriangle%2Dright%3Abefore%7Bcontent%3A%22%5Ce250%22%7D%2Eglyphicon%2Dtriangle%2Dleft%3Abefore%7Bcontent%3A%22%5Ce251%22%7D%2Eglyphicon%2Dtriangle%2Dbottom%3Abefore%7Bcontent%3A%22%5Ce252%22%7D%2Eglyphicon%2Dtriangle%2Dtop%3Abefore%7Bcontent%3A%22%5Ce253%22%7D%2Eglyphicon%2Dconsole%3Abefore%7Bcontent%3A%22%5Ce254%22%7D%2Eglyphicon%2Dsuperscript%3Abefore%7Bcontent%3A%22%5Ce255%22%7D%2Eglyphicon%2Dsubscript%3Abefore%7Bcontent%3A%22%5Ce256%22%7D%2Eglyphicon%2Dmenu%2Dleft%3Abefore%7Bcontent%3A%22%5Ce257%22%7D%2Eglyphicon%2Dmenu%2Dright%3Abefore%7Bcontent%3A%22%5Ce258%22%7D%2Eglyphicon%2Dmenu%2Ddown%3Abefore%7Bcontent%3A%22%5Ce259%22%7D%2Eglyphicon%2Dmenu%2Dup%3Abefore%7Bcontent%3A%22%5Ce260%22%7D%2A%7B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dsizing%3Aborder%2Dbox%7D%3Aafter%2C%3Abefore%7B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dsizing%3Aborder%2Dbox%7Dhtml%7Bfont%2Dsize%3A10px%3B%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3Argba%280%2C0%2C0%2C0%29%7Dbody%7Bfont%2Dfamily%3A%22Helvetica%20Neue%22%2CHelvetica%2CArial%2Csans%2Dserif%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23fff%7Dbutton%2Cinput%2Cselect%2Ctextarea%7Bfont%2Dfamily%3Ainherit%3Bfont%2Dsize%3Ainherit%3Bline%2Dheight%3Ainherit%7Da%7Bcolor%3A%23337ab7%3Btext%2Ddecoration%3Anone%7Da%3Afocus%2Ca%3Ahover%7Bcolor%3A%2323527c%3Btext%2Ddecoration%3Aunderline%7Da%3Afocus%7Boutline%3Athin%20dotted%3Boutline%3A5px%20auto%20%2Dwebkit%2Dfocus%2Dring%2Dcolor%3Boutline%2Doffset%3A%2D2px%7Dfigure%7Bmargin%3A0%7Dimg%7Bvertical%2Dalign%3Amiddle%7D%2Ecarousel%2Dinner%3E%2Eitem%3Ea%3Eimg%2C%2Ecarousel%2Dinner%3E%2Eitem%3Eimg%2C%2Eimg%2Dresponsive%2C%2Ethumbnail%20a%3Eimg%2C%2Ethumbnail%3Eimg%7Bdisplay%3Ablock%3Bmax%2Dwidth%3A100%25%3Bheight%3Aauto%7D%2Eimg%2Drounded%7Bborder%2Dradius%3A6px%7D%2Eimg%2Dthumbnail%7Bdisplay%3Ainline%2Dblock%3Bmax%2Dwidth%3A100%25%3Bheight%3Aauto%3Bpadding%3A4px%3Bline%2Dheight%3A1%2E42857143%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dtransition%3Aall%20%2E2s%20ease%2Din%2Dout%3B%2Do%2Dtransition%3Aall%20%2E2s%20ease%2Din%2Dout%3Btransition%3Aall%20%2E2s%20ease%2Din%2Dout%7D%2Eimg%2Dcircle%7Bborder%2Dradius%3A50%25%7Dhr%7Bmargin%2Dtop%3A20px%3Bmargin%2Dbottom%3A20px%3Bborder%3A0%3Bborder%2Dtop%3A1px%20solid%20%23eee%7D%2Esr%2Donly%7Bposition%3Aabsolute%3Bwidth%3A1px%3Bheight%3A1px%3Bpadding%3A0%3Bmargin%3A%2D1px%3Boverflow%3Ahidden%3Bclip%3Arect%280%2C0%2C0%2C0%29%3Bborder%3A0%7D%2Esr%2Donly%2Dfocusable%3Aactive%2C%2Esr%2Donly%2Dfocusable%3Afocus%7Bposition%3Astatic%3Bwidth%3Aauto%3Bheight%3Aauto%3Bmargin%3A0%3Boverflow%3Avisible%3Bclip%3Aauto%7D%5Brole%3Dbutton%5D%7Bcursor%3Apointer%7D%2Eh1%2C%2Eh2%2C%2Eh3%2C%2Eh4%2C%2Eh5%2C%2Eh6%2Ch1%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%7Bfont%2Dfamily%3Ainherit%3Bfont%2Dweight%3A500%3Bline%2Dheight%3A1%2E1%3Bcolor%3Ainherit%7D%2Eh1%20%2Esmall%2C%2Eh1%20small%2C%2Eh2%20%2Esmall%2C%2Eh2%20small%2C%2Eh3%20%2Esmall%2C%2Eh3%20small%2C%2Eh4%20%2Esmall%2C%2Eh4%20small%2C%2Eh5%20%2Esmall%2C%2Eh5%20small%2C%2Eh6%20%2Esmall%2C%2Eh6%20small%2Ch1%20%2Esmall%2Ch1%20small%2Ch2%20%2Esmall%2Ch2%20small%2Ch3%20%2Esmall%2Ch3%20small%2Ch4%20%2Esmall%2Ch4%20small%2Ch5%20%2Esmall%2Ch5%20small%2Ch6%20%2Esmall%2Ch6%20small%7Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%3Bcolor%3A%23777%7D%2Eh1%2C%2Eh2%2C%2Eh3%2Ch1%2Ch2%2Ch3%7Bmargin%2Dtop%3A20px%3Bmargin%2Dbottom%3A10px%7D%2Eh1%20%2Esmall%2C%2Eh1%20small%2C%2Eh2%20%2Esmall%2C%2Eh2%20small%2C%2Eh3%20%2Esmall%2C%2Eh3%20small%2Ch1%20%2Esmall%2Ch1%20small%2Ch2%20%2Esmall%2Ch2%20small%2Ch3%20%2Esmall%2Ch3%20small%7Bfont%2Dsize%3A65%25%7D%2Eh4%2C%2Eh5%2C%2Eh6%2Ch4%2Ch5%2Ch6%7Bmargin%2Dtop%3A10px%3Bmargin%2Dbottom%3A10px%7D%2Eh4%20%2Esmall%2C%2Eh4%20small%2C%2Eh5%20%2Esmall%2C%2Eh5%20small%2C%2Eh6%20%2Esmall%2C%2Eh6%20small%2Ch4%20%2Esmall%2Ch4%20small%2Ch5%20%2Esmall%2Ch5%20small%2Ch6%20%2Esmall%2Ch6%20small%7Bfont%2Dsize%3A75%25%7D%2Eh1%2Ch1%7Bfont%2Dsize%3A36px%7D%2Eh2%2Ch2%7Bfont%2Dsize%3A30px%7D%2Eh3%2Ch3%7Bfont%2Dsize%3A24px%7D%2Eh4%2Ch4%7Bfont%2Dsize%3A18px%7D%2Eh5%2Ch5%7Bfont%2Dsize%3A14px%7D%2Eh6%2Ch6%7Bfont%2Dsize%3A12px%7Dp%7Bmargin%3A0%200%2010px%7D%2Elead%7Bmargin%2Dbottom%3A20px%3Bfont%2Dsize%3A16px%3Bfont%2Dweight%3A300%3Bline%2Dheight%3A1%2E4%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Elead%7Bfont%2Dsize%3A21px%7D%7D%2Esmall%2Csmall%7Bfont%2Dsize%3A85%25%7D%2Emark%2Cmark%7Bpadding%3A%2E2em%3Bbackground%2Dcolor%3A%23fcf8e3%7D%2Etext%2Dleft%7Btext%2Dalign%3Aleft%7D%2Etext%2Dright%7Btext%2Dalign%3Aright%7D%2Etext%2Dcenter%7Btext%2Dalign%3Acenter%7D%2Etext%2Djustify%7Btext%2Dalign%3Ajustify%7D%2Etext%2Dnowrap%7Bwhite%2Dspace%3Anowrap%7D%2Etext%2Dlowercase%7Btext%2Dtransform%3Alowercase%7D%2Etext%2Duppercase%7Btext%2Dtransform%3Auppercase%7D%2Etext%2Dcapitalize%7Btext%2Dtransform%3Acapitalize%7D%2Etext%2Dmuted%7Bcolor%3A%23777%7D%2Etext%2Dprimary%7Bcolor%3A%23337ab7%7Da%2Etext%2Dprimary%3Afocus%2Ca%2Etext%2Dprimary%3Ahover%7Bcolor%3A%23286090%7D%2Etext%2Dsuccess%7Bcolor%3A%233c763d%7Da%2Etext%2Dsuccess%3Afocus%2Ca%2Etext%2Dsuccess%3Ahover%7Bcolor%3A%232b542c%7D%2Etext%2Dinfo%7Bcolor%3A%2331708f%7Da%2Etext%2Dinfo%3Afocus%2Ca%2Etext%2Dinfo%3Ahover%7Bcolor%3A%23245269%7D%2Etext%2Dwarning%7Bcolor%3A%238a6d3b%7Da%2Etext%2Dwarning%3Afocus%2Ca%2Etext%2Dwarning%3Ahover%7Bcolor%3A%2366512c%7D%2Etext%2Ddanger%7Bcolor%3A%23a94442%7Da%2Etext%2Ddanger%3Afocus%2Ca%2Etext%2Ddanger%3Ahover%7Bcolor%3A%23843534%7D%2Ebg%2Dprimary%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23337ab7%7Da%2Ebg%2Dprimary%3Afocus%2Ca%2Ebg%2Dprimary%3Ahover%7Bbackground%2Dcolor%3A%23286090%7D%2Ebg%2Dsuccess%7Bbackground%2Dcolor%3A%23dff0d8%7Da%2Ebg%2Dsuccess%3Afocus%2Ca%2Ebg%2Dsuccess%3Ahover%7Bbackground%2Dcolor%3A%23c1e2b3%7D%2Ebg%2Dinfo%7Bbackground%2Dcolor%3A%23d9edf7%7Da%2Ebg%2Dinfo%3Afocus%2Ca%2Ebg%2Dinfo%3Ahover%7Bbackground%2Dcolor%3A%23afd9ee%7D%2Ebg%2Dwarning%7Bbackground%2Dcolor%3A%23fcf8e3%7Da%2Ebg%2Dwarning%3Afocus%2Ca%2Ebg%2Dwarning%3Ahover%7Bbackground%2Dcolor%3A%23f7ecb5%7D%2Ebg%2Ddanger%7Bbackground%2Dcolor%3A%23f2dede%7Da%2Ebg%2Ddanger%3Afocus%2Ca%2Ebg%2Ddanger%3Ahover%7Bbackground%2Dcolor%3A%23e4b9b9%7D%2Epage%2Dheader%7Bpadding%2Dbottom%3A9px%3Bmargin%3A40px%200%2020px%3Bborder%2Dbottom%3A1px%20solid%20%23eee%7Dol%2Cul%7Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A10px%7Dol%20ol%2Col%20ul%2Cul%20ol%2Cul%20ul%7Bmargin%2Dbottom%3A0%7D%2Elist%2Dunstyled%7Bpadding%2Dleft%3A0%3Blist%2Dstyle%3Anone%7D%2Elist%2Dinline%7Bpadding%2Dleft%3A0%3Bmargin%2Dleft%3A%2D5px%3Blist%2Dstyle%3Anone%7D%2Elist%2Dinline%3Eli%7Bdisplay%3Ainline%2Dblock%3Bpadding%2Dright%3A5px%3Bpadding%2Dleft%3A5px%7Ddl%7Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A20px%7Ddd%2Cdt%7Bline%2Dheight%3A1%2E42857143%7Ddt%7Bfont%2Dweight%3A700%7Ddd%7Bmargin%2Dleft%3A0%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Edl%2Dhorizontal%20dt%7Bfloat%3Aleft%3Bwidth%3A160px%3Boverflow%3Ahidden%3Bclear%3Aleft%3Btext%2Dalign%3Aright%3Btext%2Doverflow%3Aellipsis%3Bwhite%2Dspace%3Anowrap%7D%2Edl%2Dhorizontal%20dd%7Bmargin%2Dleft%3A180px%7D%7Dabbr%5Bdata%2Doriginal%2Dtitle%5D%2Cabbr%5Btitle%5D%7Bcursor%3Ahelp%3Bborder%2Dbottom%3A1px%20dotted%20%23777%7D%2Einitialism%7Bfont%2Dsize%3A90%25%3Btext%2Dtransform%3Auppercase%7Dblockquote%7Bpadding%3A10px%2020px%3Bmargin%3A0%200%2020px%3Bfont%2Dsize%3A17%2E5px%3Bborder%2Dleft%3A5px%20solid%20%23eee%7Dblockquote%20ol%3Alast%2Dchild%2Cblockquote%20p%3Alast%2Dchild%2Cblockquote%20ul%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7Dblockquote%20%2Esmall%2Cblockquote%20footer%2Cblockquote%20small%7Bdisplay%3Ablock%3Bfont%2Dsize%3A80%25%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23777%7Dblockquote%20%2Esmall%3Abefore%2Cblockquote%20footer%3Abefore%2Cblockquote%20small%3Abefore%7Bcontent%3A%27%5C2014%20%5C00A0%27%7D%2Eblockquote%2Dreverse%2Cblockquote%2Epull%2Dright%7Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A0%3Btext%2Dalign%3Aright%3Bborder%2Dright%3A5px%20solid%20%23eee%3Bborder%2Dleft%3A0%7D%2Eblockquote%2Dreverse%20%2Esmall%3Abefore%2C%2Eblockquote%2Dreverse%20footer%3Abefore%2C%2Eblockquote%2Dreverse%20small%3Abefore%2Cblockquote%2Epull%2Dright%20%2Esmall%3Abefore%2Cblockquote%2Epull%2Dright%20footer%3Abefore%2Cblockquote%2Epull%2Dright%20small%3Abefore%7Bcontent%3A%27%27%7D%2Eblockquote%2Dreverse%20%2Esmall%3Aafter%2C%2Eblockquote%2Dreverse%20footer%3Aafter%2C%2Eblockquote%2Dreverse%20small%3Aafter%2Cblockquote%2Epull%2Dright%20%2Esmall%3Aafter%2Cblockquote%2Epull%2Dright%20footer%3Aafter%2Cblockquote%2Epull%2Dright%20small%3Aafter%7Bcontent%3A%27%5C00A0%20%5C2014%27%7Daddress%7Bmargin%2Dbottom%3A20px%3Bfont%2Dstyle%3Anormal%3Bline%2Dheight%3A1%2E42857143%7Dcode%2Ckbd%2Cpre%2Csamp%7Bfont%2Dfamily%3Amonospace%7Dcode%7Bpadding%3A2px%204px%3Bfont%2Dsize%3A90%25%3Bcolor%3A%23c7254e%3Bbackground%2Dcolor%3A%23f9f2f4%3Bborder%2Dradius%3A4px%7Dkbd%7Bpadding%3A2px%204px%3Bfont%2Dsize%3A90%25%3Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23333%3Bborder%2Dradius%3A3px%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%20%2D1px%200%20rgba%280%2C0%2C0%2C%2E25%29%3Bbox%2Dshadow%3Ainset%200%20%2D1px%200%20rgba%280%2C0%2C0%2C%2E25%29%7Dkbd%20kbd%7Bpadding%3A0%3Bfont%2Dsize%3A100%25%3Bfont%2Dweight%3A700%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7Dpre%7Bdisplay%3Ablock%3Bpadding%3A9%2E5px%3Bmargin%3A0%200%2010px%3Bfont%2Dsize%3A13px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23333%3Bword%2Dbreak%3Abreak%2Dall%3Bword%2Dwrap%3Abreak%2Dword%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%3A1px%20solid%20%23ccc%3Bborder%2Dradius%3A4px%7Dpre%20code%7Bpadding%3A0%3Bfont%2Dsize%3Ainherit%3Bcolor%3Ainherit%3Bwhite%2Dspace%3Apre%2Dwrap%3Bbackground%2Dcolor%3Atransparent%3Bborder%2Dradius%3A0%7D%2Epre%2Dscrollable%7Bmax%2Dheight%3A340px%3Boverflow%2Dy%3Ascroll%7D%2Econtainer%7Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A15px%3Bmargin%2Dright%3Aauto%3Bmargin%2Dleft%3Aauto%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Econtainer%7Bwidth%3A750px%7D%7D%40media%20%28min%2Dwidth%3A992px%29%7B%2Econtainer%7Bwidth%3A970px%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Econtainer%7Bwidth%3A1170px%7D%7D%2Econtainer%2Dfluid%7Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A15px%3Bmargin%2Dright%3Aauto%3Bmargin%2Dleft%3Aauto%7D%2Erow%7Bmargin%2Dright%3A%2D15px%3Bmargin%2Dleft%3A%2D15px%7D%2Ecol%2Dlg%2D1%2C%2Ecol%2Dlg%2D10%2C%2Ecol%2Dlg%2D11%2C%2Ecol%2Dlg%2D12%2C%2Ecol%2Dlg%2D2%2C%2Ecol%2Dlg%2D3%2C%2Ecol%2Dlg%2D4%2C%2Ecol%2Dlg%2D5%2C%2Ecol%2Dlg%2D6%2C%2Ecol%2Dlg%2D7%2C%2Ecol%2Dlg%2D8%2C%2Ecol%2Dlg%2D9%2C%2Ecol%2Dmd%2D1%2C%2Ecol%2Dmd%2D10%2C%2Ecol%2Dmd%2D11%2C%2Ecol%2Dmd%2D12%2C%2Ecol%2Dmd%2D2%2C%2Ecol%2Dmd%2D3%2C%2Ecol%2Dmd%2D4%2C%2Ecol%2Dmd%2D5%2C%2Ecol%2Dmd%2D6%2C%2Ecol%2Dmd%2D7%2C%2Ecol%2Dmd%2D8%2C%2Ecol%2Dmd%2D9%2C%2Ecol%2Dsm%2D1%2C%2Ecol%2Dsm%2D10%2C%2Ecol%2Dsm%2D11%2C%2Ecol%2Dsm%2D12%2C%2Ecol%2Dsm%2D2%2C%2Ecol%2Dsm%2D3%2C%2Ecol%2Dsm%2D4%2C%2Ecol%2Dsm%2D5%2C%2Ecol%2Dsm%2D6%2C%2Ecol%2Dsm%2D7%2C%2Ecol%2Dsm%2D8%2C%2Ecol%2Dsm%2D9%2C%2Ecol%2Dxs%2D1%2C%2Ecol%2Dxs%2D10%2C%2Ecol%2Dxs%2D11%2C%2Ecol%2Dxs%2D12%2C%2Ecol%2Dxs%2D2%2C%2Ecol%2Dxs%2D3%2C%2Ecol%2Dxs%2D4%2C%2Ecol%2Dxs%2D5%2C%2Ecol%2Dxs%2D6%2C%2Ecol%2Dxs%2D7%2C%2Ecol%2Dxs%2D8%2C%2Ecol%2Dxs%2D9%7Bposition%3Arelative%3Bmin%2Dheight%3A1px%3Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A15px%7D%2Ecol%2Dxs%2D1%2C%2Ecol%2Dxs%2D10%2C%2Ecol%2Dxs%2D11%2C%2Ecol%2Dxs%2D12%2C%2Ecol%2Dxs%2D2%2C%2Ecol%2Dxs%2D3%2C%2Ecol%2Dxs%2D4%2C%2Ecol%2Dxs%2D5%2C%2Ecol%2Dxs%2D6%2C%2Ecol%2Dxs%2D7%2C%2Ecol%2Dxs%2D8%2C%2Ecol%2Dxs%2D9%7Bfloat%3Aleft%7D%2Ecol%2Dxs%2D12%7Bwidth%3A100%25%7D%2Ecol%2Dxs%2D11%7Bwidth%3A91%2E66666667%25%7D%2Ecol%2Dxs%2D10%7Bwidth%3A83%2E33333333%25%7D%2Ecol%2Dxs%2D9%7Bwidth%3A75%25%7D%2Ecol%2Dxs%2D8%7Bwidth%3A66%2E66666667%25%7D%2Ecol%2Dxs%2D7%7Bwidth%3A58%2E33333333%25%7D%2Ecol%2Dxs%2D6%7Bwidth%3A50%25%7D%2Ecol%2Dxs%2D5%7Bwidth%3A41%2E66666667%25%7D%2Ecol%2Dxs%2D4%7Bwidth%3A33%2E33333333%25%7D%2Ecol%2Dxs%2D3%7Bwidth%3A25%25%7D%2Ecol%2Dxs%2D2%7Bwidth%3A16%2E66666667%25%7D%2Ecol%2Dxs%2D1%7Bwidth%3A8%2E33333333%25%7D%2Ecol%2Dxs%2Dpull%2D12%7Bright%3A100%25%7D%2Ecol%2Dxs%2Dpull%2D11%7Bright%3A91%2E66666667%25%7D%2Ecol%2Dxs%2Dpull%2D10%7Bright%3A83%2E33333333%25%7D%2Ecol%2Dxs%2Dpull%2D9%7Bright%3A75%25%7D%2Ecol%2Dxs%2Dpull%2D8%7Bright%3A66%2E66666667%25%7D%2Ecol%2Dxs%2Dpull%2D7%7Bright%3A58%2E33333333%25%7D%2Ecol%2Dxs%2Dpull%2D6%7Bright%3A50%25%7D%2Ecol%2Dxs%2Dpull%2D5%7Bright%3A41%2E66666667%25%7D%2Ecol%2Dxs%2Dpull%2D4%7Bright%3A33%2E33333333%25%7D%2Ecol%2Dxs%2Dpull%2D3%7Bright%3A25%25%7D%2Ecol%2Dxs%2Dpull%2D2%7Bright%3A16%2E66666667%25%7D%2Ecol%2Dxs%2Dpull%2D1%7Bright%3A8%2E33333333%25%7D%2Ecol%2Dxs%2Dpull%2D0%7Bright%3Aauto%7D%2Ecol%2Dxs%2Dpush%2D12%7Bleft%3A100%25%7D%2Ecol%2Dxs%2Dpush%2D11%7Bleft%3A91%2E66666667%25%7D%2Ecol%2Dxs%2Dpush%2D10%7Bleft%3A83%2E33333333%25%7D%2Ecol%2Dxs%2Dpush%2D9%7Bleft%3A75%25%7D%2Ecol%2Dxs%2Dpush%2D8%7Bleft%3A66%2E66666667%25%7D%2Ecol%2Dxs%2Dpush%2D7%7Bleft%3A58%2E33333333%25%7D%2Ecol%2Dxs%2Dpush%2D6%7Bleft%3A50%25%7D%2Ecol%2Dxs%2Dpush%2D5%7Bleft%3A41%2E66666667%25%7D%2Ecol%2Dxs%2Dpush%2D4%7Bleft%3A33%2E33333333%25%7D%2Ecol%2Dxs%2Dpush%2D3%7Bleft%3A25%25%7D%2Ecol%2Dxs%2Dpush%2D2%7Bleft%3A16%2E66666667%25%7D%2Ecol%2Dxs%2Dpush%2D1%7Bleft%3A8%2E33333333%25%7D%2Ecol%2Dxs%2Dpush%2D0%7Bleft%3Aauto%7D%2Ecol%2Dxs%2Doffset%2D12%7Bmargin%2Dleft%3A100%25%7D%2Ecol%2Dxs%2Doffset%2D11%7Bmargin%2Dleft%3A91%2E66666667%25%7D%2Ecol%2Dxs%2Doffset%2D10%7Bmargin%2Dleft%3A83%2E33333333%25%7D%2Ecol%2Dxs%2Doffset%2D9%7Bmargin%2Dleft%3A75%25%7D%2Ecol%2Dxs%2Doffset%2D8%7Bmargin%2Dleft%3A66%2E66666667%25%7D%2Ecol%2Dxs%2Doffset%2D7%7Bmargin%2Dleft%3A58%2E33333333%25%7D%2Ecol%2Dxs%2Doffset%2D6%7Bmargin%2Dleft%3A50%25%7D%2Ecol%2Dxs%2Doffset%2D5%7Bmargin%2Dleft%3A41%2E66666667%25%7D%2Ecol%2Dxs%2Doffset%2D4%7Bmargin%2Dleft%3A33%2E33333333%25%7D%2Ecol%2Dxs%2Doffset%2D3%7Bmargin%2Dleft%3A25%25%7D%2Ecol%2Dxs%2Doffset%2D2%7Bmargin%2Dleft%3A16%2E66666667%25%7D%2Ecol%2Dxs%2Doffset%2D1%7Bmargin%2Dleft%3A8%2E33333333%25%7D%2Ecol%2Dxs%2Doffset%2D0%7Bmargin%2Dleft%3A0%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Ecol%2Dsm%2D1%2C%2Ecol%2Dsm%2D10%2C%2Ecol%2Dsm%2D11%2C%2Ecol%2Dsm%2D12%2C%2Ecol%2Dsm%2D2%2C%2Ecol%2Dsm%2D3%2C%2Ecol%2Dsm%2D4%2C%2Ecol%2Dsm%2D5%2C%2Ecol%2Dsm%2D6%2C%2Ecol%2Dsm%2D7%2C%2Ecol%2Dsm%2D8%2C%2Ecol%2Dsm%2D9%7Bfloat%3Aleft%7D%2Ecol%2Dsm%2D12%7Bwidth%3A100%25%7D%2Ecol%2Dsm%2D11%7Bwidth%3A91%2E66666667%25%7D%2Ecol%2Dsm%2D10%7Bwidth%3A83%2E33333333%25%7D%2Ecol%2Dsm%2D9%7Bwidth%3A75%25%7D%2Ecol%2Dsm%2D8%7Bwidth%3A66%2E66666667%25%7D%2Ecol%2Dsm%2D7%7Bwidth%3A58%2E33333333%25%7D%2Ecol%2Dsm%2D6%7Bwidth%3A50%25%7D%2Ecol%2Dsm%2D5%7Bwidth%3A41%2E66666667%25%7D%2Ecol%2Dsm%2D4%7Bwidth%3A33%2E33333333%25%7D%2Ecol%2Dsm%2D3%7Bwidth%3A25%25%7D%2Ecol%2Dsm%2D2%7Bwidth%3A16%2E66666667%25%7D%2Ecol%2Dsm%2D1%7Bwidth%3A8%2E33333333%25%7D%2Ecol%2Dsm%2Dpull%2D12%7Bright%3A100%25%7D%2Ecol%2Dsm%2Dpull%2D11%7Bright%3A91%2E66666667%25%7D%2Ecol%2Dsm%2Dpull%2D10%7Bright%3A83%2E33333333%25%7D%2Ecol%2Dsm%2Dpull%2D9%7Bright%3A75%25%7D%2Ecol%2Dsm%2Dpull%2D8%7Bright%3A66%2E66666667%25%7D%2Ecol%2Dsm%2Dpull%2D7%7Bright%3A58%2E33333333%25%7D%2Ecol%2Dsm%2Dpull%2D6%7Bright%3A50%25%7D%2Ecol%2Dsm%2Dpull%2D5%7Bright%3A41%2E66666667%25%7D%2Ecol%2Dsm%2Dpull%2D4%7Bright%3A33%2E33333333%25%7D%2Ecol%2Dsm%2Dpull%2D3%7Bright%3A25%25%7D%2Ecol%2Dsm%2Dpull%2D2%7Bright%3A16%2E66666667%25%7D%2Ecol%2Dsm%2Dpull%2D1%7Bright%3A8%2E33333333%25%7D%2Ecol%2Dsm%2Dpull%2D0%7Bright%3Aauto%7D%2Ecol%2Dsm%2Dpush%2D12%7Bleft%3A100%25%7D%2Ecol%2Dsm%2Dpush%2D11%7Bleft%3A91%2E66666667%25%7D%2Ecol%2Dsm%2Dpush%2D10%7Bleft%3A83%2E33333333%25%7D%2Ecol%2Dsm%2Dpush%2D9%7Bleft%3A75%25%7D%2Ecol%2Dsm%2Dpush%2D8%7Bleft%3A66%2E66666667%25%7D%2Ecol%2Dsm%2Dpush%2D7%7Bleft%3A58%2E33333333%25%7D%2Ecol%2Dsm%2Dpush%2D6%7Bleft%3A50%25%7D%2Ecol%2Dsm%2Dpush%2D5%7Bleft%3A41%2E66666667%25%7D%2Ecol%2Dsm%2Dpush%2D4%7Bleft%3A33%2E33333333%25%7D%2Ecol%2Dsm%2Dpush%2D3%7Bleft%3A25%25%7D%2Ecol%2Dsm%2Dpush%2D2%7Bleft%3A16%2E66666667%25%7D%2Ecol%2Dsm%2Dpush%2D1%7Bleft%3A8%2E33333333%25%7D%2Ecol%2Dsm%2Dpush%2D0%7Bleft%3Aauto%7D%2Ecol%2Dsm%2Doffset%2D12%7Bmargin%2Dleft%3A100%25%7D%2Ecol%2Dsm%2Doffset%2D11%7Bmargin%2Dleft%3A91%2E66666667%25%7D%2Ecol%2Dsm%2Doffset%2D10%7Bmargin%2Dleft%3A83%2E33333333%25%7D%2Ecol%2Dsm%2Doffset%2D9%7Bmargin%2Dleft%3A75%25%7D%2Ecol%2Dsm%2Doffset%2D8%7Bmargin%2Dleft%3A66%2E66666667%25%7D%2Ecol%2Dsm%2Doffset%2D7%7Bmargin%2Dleft%3A58%2E33333333%25%7D%2Ecol%2Dsm%2Doffset%2D6%7Bmargin%2Dleft%3A50%25%7D%2Ecol%2Dsm%2Doffset%2D5%7Bmargin%2Dleft%3A41%2E66666667%25%7D%2Ecol%2Dsm%2Doffset%2D4%7Bmargin%2Dleft%3A33%2E33333333%25%7D%2Ecol%2Dsm%2Doffset%2D3%7Bmargin%2Dleft%3A25%25%7D%2Ecol%2Dsm%2Doffset%2D2%7Bmargin%2Dleft%3A16%2E66666667%25%7D%2Ecol%2Dsm%2Doffset%2D1%7Bmargin%2Dleft%3A8%2E33333333%25%7D%2Ecol%2Dsm%2Doffset%2D0%7Bmargin%2Dleft%3A0%7D%7D%40media%20%28min%2Dwidth%3A992px%29%7B%2Ecol%2Dmd%2D1%2C%2Ecol%2Dmd%2D10%2C%2Ecol%2Dmd%2D11%2C%2Ecol%2Dmd%2D12%2C%2Ecol%2Dmd%2D2%2C%2Ecol%2Dmd%2D3%2C%2Ecol%2Dmd%2D4%2C%2Ecol%2Dmd%2D5%2C%2Ecol%2Dmd%2D6%2C%2Ecol%2Dmd%2D7%2C%2Ecol%2Dmd%2D8%2C%2Ecol%2Dmd%2D9%7Bfloat%3Aleft%7D%2Ecol%2Dmd%2D12%7Bwidth%3A100%25%7D%2Ecol%2Dmd%2D11%7Bwidth%3A91%2E66666667%25%7D%2Ecol%2Dmd%2D10%7Bwidth%3A83%2E33333333%25%7D%2Ecol%2Dmd%2D9%7Bwidth%3A75%25%7D%2Ecol%2Dmd%2D8%7Bwidth%3A66%2E66666667%25%7D%2Ecol%2Dmd%2D7%7Bwidth%3A58%2E33333333%25%7D%2Ecol%2Dmd%2D6%7Bwidth%3A50%25%7D%2Ecol%2Dmd%2D5%7Bwidth%3A41%2E66666667%25%7D%2Ecol%2Dmd%2D4%7Bwidth%3A33%2E33333333%25%7D%2Ecol%2Dmd%2D3%7Bwidth%3A25%25%7D%2Ecol%2Dmd%2D2%7Bwidth%3A16%2E66666667%25%7D%2Ecol%2Dmd%2D1%7Bwidth%3A8%2E33333333%25%7D%2Ecol%2Dmd%2Dpull%2D12%7Bright%3A100%25%7D%2Ecol%2Dmd%2Dpull%2D11%7Bright%3A91%2E66666667%25%7D%2Ecol%2Dmd%2Dpull%2D10%7Bright%3A83%2E33333333%25%7D%2Ecol%2Dmd%2Dpull%2D9%7Bright%3A75%25%7D%2Ecol%2Dmd%2Dpull%2D8%7Bright%3A66%2E66666667%25%7D%2Ecol%2Dmd%2Dpull%2D7%7Bright%3A58%2E33333333%25%7D%2Ecol%2Dmd%2Dpull%2D6%7Bright%3A50%25%7D%2Ecol%2Dmd%2Dpull%2D5%7Bright%3A41%2E66666667%25%7D%2Ecol%2Dmd%2Dpull%2D4%7Bright%3A33%2E33333333%25%7D%2Ecol%2Dmd%2Dpull%2D3%7Bright%3A25%25%7D%2Ecol%2Dmd%2Dpull%2D2%7Bright%3A16%2E66666667%25%7D%2Ecol%2Dmd%2Dpull%2D1%7Bright%3A8%2E33333333%25%7D%2Ecol%2Dmd%2Dpull%2D0%7Bright%3Aauto%7D%2Ecol%2Dmd%2Dpush%2D12%7Bleft%3A100%25%7D%2Ecol%2Dmd%2Dpush%2D11%7Bleft%3A91%2E66666667%25%7D%2Ecol%2Dmd%2Dpush%2D10%7Bleft%3A83%2E33333333%25%7D%2Ecol%2Dmd%2Dpush%2D9%7Bleft%3A75%25%7D%2Ecol%2Dmd%2Dpush%2D8%7Bleft%3A66%2E66666667%25%7D%2Ecol%2Dmd%2Dpush%2D7%7Bleft%3A58%2E33333333%25%7D%2Ecol%2Dmd%2Dpush%2D6%7Bleft%3A50%25%7D%2Ecol%2Dmd%2Dpush%2D5%7Bleft%3A41%2E66666667%25%7D%2Ecol%2Dmd%2Dpush%2D4%7Bleft%3A33%2E33333333%25%7D%2Ecol%2Dmd%2Dpush%2D3%7Bleft%3A25%25%7D%2Ecol%2Dmd%2Dpush%2D2%7Bleft%3A16%2E66666667%25%7D%2Ecol%2Dmd%2Dpush%2D1%7Bleft%3A8%2E33333333%25%7D%2Ecol%2Dmd%2Dpush%2D0%7Bleft%3Aauto%7D%2Ecol%2Dmd%2Doffset%2D12%7Bmargin%2Dleft%3A100%25%7D%2Ecol%2Dmd%2Doffset%2D11%7Bmargin%2Dleft%3A91%2E66666667%25%7D%2Ecol%2Dmd%2Doffset%2D10%7Bmargin%2Dleft%3A83%2E33333333%25%7D%2Ecol%2Dmd%2Doffset%2D9%7Bmargin%2Dleft%3A75%25%7D%2Ecol%2Dmd%2Doffset%2D8%7Bmargin%2Dleft%3A66%2E66666667%25%7D%2Ecol%2Dmd%2Doffset%2D7%7Bmargin%2Dleft%3A58%2E33333333%25%7D%2Ecol%2Dmd%2Doffset%2D6%7Bmargin%2Dleft%3A50%25%7D%2Ecol%2Dmd%2Doffset%2D5%7Bmargin%2Dleft%3A41%2E66666667%25%7D%2Ecol%2Dmd%2Doffset%2D4%7Bmargin%2Dleft%3A33%2E33333333%25%7D%2Ecol%2Dmd%2Doffset%2D3%7Bmargin%2Dleft%3A25%25%7D%2Ecol%2Dmd%2Doffset%2D2%7Bmargin%2Dleft%3A16%2E66666667%25%7D%2Ecol%2Dmd%2Doffset%2D1%7Bmargin%2Dleft%3A8%2E33333333%25%7D%2Ecol%2Dmd%2Doffset%2D0%7Bmargin%2Dleft%3A0%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Ecol%2Dlg%2D1%2C%2Ecol%2Dlg%2D10%2C%2Ecol%2Dlg%2D11%2C%2Ecol%2Dlg%2D12%2C%2Ecol%2Dlg%2D2%2C%2Ecol%2Dlg%2D3%2C%2Ecol%2Dlg%2D4%2C%2Ecol%2Dlg%2D5%2C%2Ecol%2Dlg%2D6%2C%2Ecol%2Dlg%2D7%2C%2Ecol%2Dlg%2D8%2C%2Ecol%2Dlg%2D9%7Bfloat%3Aleft%7D%2Ecol%2Dlg%2D12%7Bwidth%3A100%25%7D%2Ecol%2Dlg%2D11%7Bwidth%3A91%2E66666667%25%7D%2Ecol%2Dlg%2D10%7Bwidth%3A83%2E33333333%25%7D%2Ecol%2Dlg%2D9%7Bwidth%3A75%25%7D%2Ecol%2Dlg%2D8%7Bwidth%3A66%2E66666667%25%7D%2Ecol%2Dlg%2D7%7Bwidth%3A58%2E33333333%25%7D%2Ecol%2Dlg%2D6%7Bwidth%3A50%25%7D%2Ecol%2Dlg%2D5%7Bwidth%3A41%2E66666667%25%7D%2Ecol%2Dlg%2D4%7Bwidth%3A33%2E33333333%25%7D%2Ecol%2Dlg%2D3%7Bwidth%3A25%25%7D%2Ecol%2Dlg%2D2%7Bwidth%3A16%2E66666667%25%7D%2Ecol%2Dlg%2D1%7Bwidth%3A8%2E33333333%25%7D%2Ecol%2Dlg%2Dpull%2D12%7Bright%3A100%25%7D%2Ecol%2Dlg%2Dpull%2D11%7Bright%3A91%2E66666667%25%7D%2Ecol%2Dlg%2Dpull%2D10%7Bright%3A83%2E33333333%25%7D%2Ecol%2Dlg%2Dpull%2D9%7Bright%3A75%25%7D%2Ecol%2Dlg%2Dpull%2D8%7Bright%3A66%2E66666667%25%7D%2Ecol%2Dlg%2Dpull%2D7%7Bright%3A58%2E33333333%25%7D%2Ecol%2Dlg%2Dpull%2D6%7Bright%3A50%25%7D%2Ecol%2Dlg%2Dpull%2D5%7Bright%3A41%2E66666667%25%7D%2Ecol%2Dlg%2Dpull%2D4%7Bright%3A33%2E33333333%25%7D%2Ecol%2Dlg%2Dpull%2D3%7Bright%3A25%25%7D%2Ecol%2Dlg%2Dpull%2D2%7Bright%3A16%2E66666667%25%7D%2Ecol%2Dlg%2Dpull%2D1%7Bright%3A8%2E33333333%25%7D%2Ecol%2Dlg%2Dpull%2D0%7Bright%3Aauto%7D%2Ecol%2Dlg%2Dpush%2D12%7Bleft%3A100%25%7D%2Ecol%2Dlg%2Dpush%2D11%7Bleft%3A91%2E66666667%25%7D%2Ecol%2Dlg%2Dpush%2D10%7Bleft%3A83%2E33333333%25%7D%2Ecol%2Dlg%2Dpush%2D9%7Bleft%3A75%25%7D%2Ecol%2Dlg%2Dpush%2D8%7Bleft%3A66%2E66666667%25%7D%2Ecol%2Dlg%2Dpush%2D7%7Bleft%3A58%2E33333333%25%7D%2Ecol%2Dlg%2Dpush%2D6%7Bleft%3A50%25%7D%2Ecol%2Dlg%2Dpush%2D5%7Bleft%3A41%2E66666667%25%7D%2Ecol%2Dlg%2Dpush%2D4%7Bleft%3A33%2E33333333%25%7D%2Ecol%2Dlg%2Dpush%2D3%7Bleft%3A25%25%7D%2Ecol%2Dlg%2Dpush%2D2%7Bleft%3A16%2E66666667%25%7D%2Ecol%2Dlg%2Dpush%2D1%7Bleft%3A8%2E33333333%25%7D%2Ecol%2Dlg%2Dpush%2D0%7Bleft%3Aauto%7D%2Ecol%2Dlg%2Doffset%2D12%7Bmargin%2Dleft%3A100%25%7D%2Ecol%2Dlg%2Doffset%2D11%7Bmargin%2Dleft%3A91%2E66666667%25%7D%2Ecol%2Dlg%2Doffset%2D10%7Bmargin%2Dleft%3A83%2E33333333%25%7D%2Ecol%2Dlg%2Doffset%2D9%7Bmargin%2Dleft%3A75%25%7D%2Ecol%2Dlg%2Doffset%2D8%7Bmargin%2Dleft%3A66%2E66666667%25%7D%2Ecol%2Dlg%2Doffset%2D7%7Bmargin%2Dleft%3A58%2E33333333%25%7D%2Ecol%2Dlg%2Doffset%2D6%7Bmargin%2Dleft%3A50%25%7D%2Ecol%2Dlg%2Doffset%2D5%7Bmargin%2Dleft%3A41%2E66666667%25%7D%2Ecol%2Dlg%2Doffset%2D4%7Bmargin%2Dleft%3A33%2E33333333%25%7D%2Ecol%2Dlg%2Doffset%2D3%7Bmargin%2Dleft%3A25%25%7D%2Ecol%2Dlg%2Doffset%2D2%7Bmargin%2Dleft%3A16%2E66666667%25%7D%2Ecol%2Dlg%2Doffset%2D1%7Bmargin%2Dleft%3A8%2E33333333%25%7D%2Ecol%2Dlg%2Doffset%2D0%7Bmargin%2Dleft%3A0%7D%7Dtable%7Bbackground%2Dcolor%3Atransparent%7Dcaption%7Bpadding%2Dtop%3A8px%3Bpadding%2Dbottom%3A8px%3Bcolor%3A%23777%3Btext%2Dalign%3Aleft%7Dth%7B%7D%2Etable%7Bwidth%3A100%25%3Bmax%2Dwidth%3A100%25%3Bmargin%2Dbottom%3A20px%7D%2Etable%3Etbody%3Etr%3Etd%2C%2Etable%3Etbody%3Etr%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2C%2Etable%3Etfoot%3Etr%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2C%2Etable%3Ethead%3Etr%3Eth%7Bpadding%3A8px%3Bline%2Dheight%3A1%2E42857143%3Bvertical%2Dalign%3Atop%3Bborder%2Dtop%3A1px%20solid%20%23ddd%7D%2Etable%3Ethead%3Etr%3Eth%7Bvertical%2Dalign%3Abottom%3Bborder%2Dbottom%3A2px%20solid%20%23ddd%7D%2Etable%3Ecaption%2Bthead%3Etr%3Afirst%2Dchild%3Etd%2C%2Etable%3Ecaption%2Bthead%3Etr%3Afirst%2Dchild%3Eth%2C%2Etable%3Ecolgroup%2Bthead%3Etr%3Afirst%2Dchild%3Etd%2C%2Etable%3Ecolgroup%2Bthead%3Etr%3Afirst%2Dchild%3Eth%2C%2Etable%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%3Etd%2C%2Etable%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%3Eth%7Bborder%2Dtop%3A0%7D%2Etable%3Etbody%2Btbody%7Bborder%2Dtop%3A2px%20solid%20%23ddd%7D%2Etable%20%2Etable%7Bbackground%2Dcolor%3A%23fff%7D%2Etable%2Dcondensed%3Etbody%3Etr%3Etd%2C%2Etable%2Dcondensed%3Etbody%3Etr%3Eth%2C%2Etable%2Dcondensed%3Etfoot%3Etr%3Etd%2C%2Etable%2Dcondensed%3Etfoot%3Etr%3Eth%2C%2Etable%2Dcondensed%3Ethead%3Etr%3Etd%2C%2Etable%2Dcondensed%3Ethead%3Etr%3Eth%7Bpadding%3A5px%7D%2Etable%2Dbordered%7Bborder%3A1px%20solid%20%23ddd%7D%2Etable%2Dbordered%3Etbody%3Etr%3Etd%2C%2Etable%2Dbordered%3Etbody%3Etr%3Eth%2C%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%2C%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%2C%2Etable%2Dbordered%3Ethead%3Etr%3Etd%2C%2Etable%2Dbordered%3Ethead%3Etr%3Eth%7Bborder%3A1px%20solid%20%23ddd%7D%2Etable%2Dbordered%3Ethead%3Etr%3Etd%2C%2Etable%2Dbordered%3Ethead%3Etr%3Eth%7Bborder%2Dbottom%2Dwidth%3A2px%7D%2Etable%2Dstriped%3Etbody%3Etr%3Anth%2Dof%2Dtype%28odd%29%7Bbackground%2Dcolor%3A%23f9f9f9%7D%2Etable%2Dhover%3Etbody%3Etr%3Ahover%7Bbackground%2Dcolor%3A%23f5f5f5%7Dtable%20col%5Bclass%2A%3Dcol%2D%5D%7Bposition%3Astatic%3Bdisplay%3Atable%2Dcolumn%3Bfloat%3Anone%7Dtable%20td%5Bclass%2A%3Dcol%2D%5D%2Ctable%20th%5Bclass%2A%3Dcol%2D%5D%7Bposition%3Astatic%3Bdisplay%3Atable%2Dcell%3Bfloat%3Anone%7D%2Etable%3Etbody%3Etr%2Eactive%3Etd%2C%2Etable%3Etbody%3Etr%2Eactive%3Eth%2C%2Etable%3Etbody%3Etr%3Etd%2Eactive%2C%2Etable%3Etbody%3Etr%3Eth%2Eactive%2C%2Etable%3Etfoot%3Etr%2Eactive%3Etd%2C%2Etable%3Etfoot%3Etr%2Eactive%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2Eactive%2C%2Etable%3Etfoot%3Etr%3Eth%2Eactive%2C%2Etable%3Ethead%3Etr%2Eactive%3Etd%2C%2Etable%3Ethead%3Etr%2Eactive%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2Eactive%2C%2Etable%3Ethead%3Etr%3Eth%2Eactive%7Bbackground%2Dcolor%3A%23f5f5f5%7D%2Etable%2Dhover%3Etbody%3Etr%2Eactive%3Ahover%3Etd%2C%2Etable%2Dhover%3Etbody%3Etr%2Eactive%3Ahover%3Eth%2C%2Etable%2Dhover%3Etbody%3Etr%3Ahover%3E%2Eactive%2C%2Etable%2Dhover%3Etbody%3Etr%3Etd%2Eactive%3Ahover%2C%2Etable%2Dhover%3Etbody%3Etr%3Eth%2Eactive%3Ahover%7Bbackground%2Dcolor%3A%23e8e8e8%7D%2Etable%3Etbody%3Etr%2Esuccess%3Etd%2C%2Etable%3Etbody%3Etr%2Esuccess%3Eth%2C%2Etable%3Etbody%3Etr%3Etd%2Esuccess%2C%2Etable%3Etbody%3Etr%3Eth%2Esuccess%2C%2Etable%3Etfoot%3Etr%2Esuccess%3Etd%2C%2Etable%3Etfoot%3Etr%2Esuccess%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2Esuccess%2C%2Etable%3Etfoot%3Etr%3Eth%2Esuccess%2C%2Etable%3Ethead%3Etr%2Esuccess%3Etd%2C%2Etable%3Ethead%3Etr%2Esuccess%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2Esuccess%2C%2Etable%3Ethead%3Etr%3Eth%2Esuccess%7Bbackground%2Dcolor%3A%23dff0d8%7D%2Etable%2Dhover%3Etbody%3Etr%2Esuccess%3Ahover%3Etd%2C%2Etable%2Dhover%3Etbody%3Etr%2Esuccess%3Ahover%3Eth%2C%2Etable%2Dhover%3Etbody%3Etr%3Ahover%3E%2Esuccess%2C%2Etable%2Dhover%3Etbody%3Etr%3Etd%2Esuccess%3Ahover%2C%2Etable%2Dhover%3Etbody%3Etr%3Eth%2Esuccess%3Ahover%7Bbackground%2Dcolor%3A%23d0e9c6%7D%2Etable%3Etbody%3Etr%2Einfo%3Etd%2C%2Etable%3Etbody%3Etr%2Einfo%3Eth%2C%2Etable%3Etbody%3Etr%3Etd%2Einfo%2C%2Etable%3Etbody%3Etr%3Eth%2Einfo%2C%2Etable%3Etfoot%3Etr%2Einfo%3Etd%2C%2Etable%3Etfoot%3Etr%2Einfo%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2Einfo%2C%2Etable%3Etfoot%3Etr%3Eth%2Einfo%2C%2Etable%3Ethead%3Etr%2Einfo%3Etd%2C%2Etable%3Ethead%3Etr%2Einfo%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2Einfo%2C%2Etable%3Ethead%3Etr%3Eth%2Einfo%7Bbackground%2Dcolor%3A%23d9edf7%7D%2Etable%2Dhover%3Etbody%3Etr%2Einfo%3Ahover%3Etd%2C%2Etable%2Dhover%3Etbody%3Etr%2Einfo%3Ahover%3Eth%2C%2Etable%2Dhover%3Etbody%3Etr%3Ahover%3E%2Einfo%2C%2Etable%2Dhover%3Etbody%3Etr%3Etd%2Einfo%3Ahover%2C%2Etable%2Dhover%3Etbody%3Etr%3Eth%2Einfo%3Ahover%7Bbackground%2Dcolor%3A%23c4e3f3%7D%2Etable%3Etbody%3Etr%2Ewarning%3Etd%2C%2Etable%3Etbody%3Etr%2Ewarning%3Eth%2C%2Etable%3Etbody%3Etr%3Etd%2Ewarning%2C%2Etable%3Etbody%3Etr%3Eth%2Ewarning%2C%2Etable%3Etfoot%3Etr%2Ewarning%3Etd%2C%2Etable%3Etfoot%3Etr%2Ewarning%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2Ewarning%2C%2Etable%3Etfoot%3Etr%3Eth%2Ewarning%2C%2Etable%3Ethead%3Etr%2Ewarning%3Etd%2C%2Etable%3Ethead%3Etr%2Ewarning%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2Ewarning%2C%2Etable%3Ethead%3Etr%3Eth%2Ewarning%7Bbackground%2Dcolor%3A%23fcf8e3%7D%2Etable%2Dhover%3Etbody%3Etr%2Ewarning%3Ahover%3Etd%2C%2Etable%2Dhover%3Etbody%3Etr%2Ewarning%3Ahover%3Eth%2C%2Etable%2Dhover%3Etbody%3Etr%3Ahover%3E%2Ewarning%2C%2Etable%2Dhover%3Etbody%3Etr%3Etd%2Ewarning%3Ahover%2C%2Etable%2Dhover%3Etbody%3Etr%3Eth%2Ewarning%3Ahover%7Bbackground%2Dcolor%3A%23faf2cc%7D%2Etable%3Etbody%3Etr%2Edanger%3Etd%2C%2Etable%3Etbody%3Etr%2Edanger%3Eth%2C%2Etable%3Etbody%3Etr%3Etd%2Edanger%2C%2Etable%3Etbody%3Etr%3Eth%2Edanger%2C%2Etable%3Etfoot%3Etr%2Edanger%3Etd%2C%2Etable%3Etfoot%3Etr%2Edanger%3Eth%2C%2Etable%3Etfoot%3Etr%3Etd%2Edanger%2C%2Etable%3Etfoot%3Etr%3Eth%2Edanger%2C%2Etable%3Ethead%3Etr%2Edanger%3Etd%2C%2Etable%3Ethead%3Etr%2Edanger%3Eth%2C%2Etable%3Ethead%3Etr%3Etd%2Edanger%2C%2Etable%3Ethead%3Etr%3Eth%2Edanger%7Bbackground%2Dcolor%3A%23f2dede%7D%2Etable%2Dhover%3Etbody%3Etr%2Edanger%3Ahover%3Etd%2C%2Etable%2Dhover%3Etbody%3Etr%2Edanger%3Ahover%3Eth%2C%2Etable%2Dhover%3Etbody%3Etr%3Ahover%3E%2Edanger%2C%2Etable%2Dhover%3Etbody%3Etr%3Etd%2Edanger%3Ahover%2C%2Etable%2Dhover%3Etbody%3Etr%3Eth%2Edanger%3Ahover%7Bbackground%2Dcolor%3A%23ebcccc%7D%2Etable%2Dresponsive%7Bmin%2Dheight%3A%2E01%25%3Boverflow%2Dx%3Aauto%7D%40media%20screen%20and%20%28max%2Dwidth%3A767px%29%7B%2Etable%2Dresponsive%7Bwidth%3A100%25%3Bmargin%2Dbottom%3A15px%3Boverflow%2Dy%3Ahidden%3B%2Dms%2Doverflow%2Dstyle%3A%2Dms%2Dautohiding%2Dscrollbar%3Bborder%3A1px%20solid%20%23ddd%7D%2Etable%2Dresponsive%3E%2Etable%7Bmargin%2Dbottom%3A0%7D%2Etable%2Dresponsive%3E%2Etable%3Etbody%3Etr%3Etd%2C%2Etable%2Dresponsive%3E%2Etable%3Etbody%3Etr%3Eth%2C%2Etable%2Dresponsive%3E%2Etable%3Etfoot%3Etr%3Etd%2C%2Etable%2Dresponsive%3E%2Etable%3Etfoot%3Etr%3Eth%2C%2Etable%2Dresponsive%3E%2Etable%3Ethead%3Etr%3Etd%2C%2Etable%2Dresponsive%3E%2Etable%3Ethead%3Etr%3Eth%7Bwhite%2Dspace%3Anowrap%7D%2Etable%2Dresponsive%3E%2Etable%2Dbordered%7Bborder%3A0%7D%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Afirst%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Afirst%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Afirst%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Afirst%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Afirst%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Afirst%2Dchild%7Bborder%2Dleft%3A0%7D%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Alast%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Alast%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Alast%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Alast%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Alast%2Dchild%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Alast%2Dchild%7Bborder%2Dright%3A0%7D%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Etd%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Eth%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Etd%2C%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Eth%7Bborder%2Dbottom%3A0%7D%7Dfieldset%7Bmin%2Dwidth%3A0%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3A0%7Dlegend%7Bdisplay%3Ablock%3Bwidth%3A100%25%3Bpadding%3A0%3Bmargin%2Dbottom%3A20px%3Bfont%2Dsize%3A21px%3Bline%2Dheight%3Ainherit%3Bcolor%3A%23333%3Bborder%3A0%3Bborder%2Dbottom%3A1px%20solid%20%23e5e5e5%7Dlabel%7Bdisplay%3Ainline%2Dblock%3Bmax%2Dwidth%3A100%25%3Bmargin%2Dbottom%3A5px%3Bfont%2Dweight%3A700%7Dinput%5Btype%3Dsearch%5D%7B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dsizing%3Aborder%2Dbox%7Dinput%5Btype%3Dcheckbox%5D%2Cinput%5Btype%3Dradio%5D%7Bmargin%3A4px%200%200%3Bmargin%2Dtop%3A1px%5C9%3Bline%2Dheight%3Anormal%7Dinput%5Btype%3Dfile%5D%7Bdisplay%3Ablock%7Dinput%5Btype%3Drange%5D%7Bdisplay%3Ablock%3Bwidth%3A100%25%7Dselect%5Bmultiple%5D%2Cselect%5Bsize%5D%7Bheight%3Aauto%7Dinput%5Btype%3Dfile%5D%3Afocus%2Cinput%5Btype%3Dcheckbox%5D%3Afocus%2Cinput%5Btype%3Dradio%5D%3Afocus%7Boutline%3Athin%20dotted%3Boutline%3A5px%20auto%20%2Dwebkit%2Dfocus%2Dring%2Dcolor%3Boutline%2Doffset%3A%2D2px%7Doutput%7Bdisplay%3Ablock%3Bpadding%2Dtop%3A7px%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23555%7D%2Eform%2Dcontrol%7Bdisplay%3Ablock%3Bwidth%3A100%25%3Bheight%3A34px%3Bpadding%3A6px%2012px%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23555%3Bbackground%2Dcolor%3A%23fff%3Bbackground%2Dimage%3Anone%3Bborder%3A1px%20solid%20%23ccc%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%3B%2Dwebkit%2Dtransition%3Aborder%2Dcolor%20ease%2Din%2Dout%20%2E15s%2C%2Dwebkit%2Dbox%2Dshadow%20ease%2Din%2Dout%20%2E15s%3B%2Do%2Dtransition%3Aborder%2Dcolor%20ease%2Din%2Dout%20%2E15s%2Cbox%2Dshadow%20ease%2Din%2Dout%20%2E15s%3Btransition%3Aborder%2Dcolor%20ease%2Din%2Dout%20%2E15s%2Cbox%2Dshadow%20ease%2Din%2Dout%20%2E15s%7D%2Eform%2Dcontrol%3Afocus%7Bborder%2Dcolor%3A%2366afe9%3Boutline%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%208px%20rgba%28102%2C175%2C233%2C%2E6%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%208px%20rgba%28102%2C175%2C233%2C%2E6%29%7D%2Eform%2Dcontrol%3A%3A%2Dmoz%2Dplaceholder%7Bcolor%3A%23999%3Bopacity%3A1%7D%2Eform%2Dcontrol%3A%2Dms%2Dinput%2Dplaceholder%7Bcolor%3A%23999%7D%2Eform%2Dcontrol%3A%3A%2Dwebkit%2Dinput%2Dplaceholder%7Bcolor%3A%23999%7D%2Eform%2Dcontrol%5Bdisabled%5D%2C%2Eform%2Dcontrol%5Breadonly%5D%2Cfieldset%5Bdisabled%5D%20%2Eform%2Dcontrol%7Bbackground%2Dcolor%3A%23eee%3Bopacity%3A1%7D%2Eform%2Dcontrol%5Bdisabled%5D%2Cfieldset%5Bdisabled%5D%20%2Eform%2Dcontrol%7Bcursor%3Anot%2Dallowed%7Dtextarea%2Eform%2Dcontrol%7Bheight%3Aauto%7Dinput%5Btype%3Dsearch%5D%7B%2Dwebkit%2Dappearance%3Anone%7D%40media%20screen%20and%20%28%2Dwebkit%2Dmin%2Ddevice%2Dpixel%2Dratio%3A0%29%7Binput%5Btype%3Ddate%5D%2Eform%2Dcontrol%2Cinput%5Btype%3Dtime%5D%2Eform%2Dcontrol%2Cinput%5Btype%3Ddatetime%2Dlocal%5D%2Eform%2Dcontrol%2Cinput%5Btype%3Dmonth%5D%2Eform%2Dcontrol%7Bline%2Dheight%3A34px%7D%2Einput%2Dgroup%2Dsm%20input%5Btype%3Ddate%5D%2C%2Einput%2Dgroup%2Dsm%20input%5Btype%3Dtime%5D%2C%2Einput%2Dgroup%2Dsm%20input%5Btype%3Ddatetime%2Dlocal%5D%2C%2Einput%2Dgroup%2Dsm%20input%5Btype%3Dmonth%5D%2Cinput%5Btype%3Ddate%5D%2Einput%2Dsm%2Cinput%5Btype%3Dtime%5D%2Einput%2Dsm%2Cinput%5Btype%3Ddatetime%2Dlocal%5D%2Einput%2Dsm%2Cinput%5Btype%3Dmonth%5D%2Einput%2Dsm%7Bline%2Dheight%3A30px%7D%2Einput%2Dgroup%2Dlg%20input%5Btype%3Ddate%5D%2C%2Einput%2Dgroup%2Dlg%20input%5Btype%3Dtime%5D%2C%2Einput%2Dgroup%2Dlg%20input%5Btype%3Ddatetime%2Dlocal%5D%2C%2Einput%2Dgroup%2Dlg%20input%5Btype%3Dmonth%5D%2Cinput%5Btype%3Ddate%5D%2Einput%2Dlg%2Cinput%5Btype%3Dtime%5D%2Einput%2Dlg%2Cinput%5Btype%3Ddatetime%2Dlocal%5D%2Einput%2Dlg%2Cinput%5Btype%3Dmonth%5D%2Einput%2Dlg%7Bline%2Dheight%3A46px%7D%7D%2Eform%2Dgroup%7Bmargin%2Dbottom%3A15px%7D%2Echeckbox%2C%2Eradio%7Bposition%3Arelative%3Bdisplay%3Ablock%3Bmargin%2Dtop%3A10px%3Bmargin%2Dbottom%3A10px%7D%2Echeckbox%20label%2C%2Eradio%20label%7Bmin%2Dheight%3A20px%3Bpadding%2Dleft%3A20px%3Bmargin%2Dbottom%3A0%3Bfont%2Dweight%3A400%3Bcursor%3Apointer%7D%2Echeckbox%20input%5Btype%3Dcheckbox%5D%2C%2Echeckbox%2Dinline%20input%5Btype%3Dcheckbox%5D%2C%2Eradio%20input%5Btype%3Dradio%5D%2C%2Eradio%2Dinline%20input%5Btype%3Dradio%5D%7Bposition%3Aabsolute%3Bmargin%2Dtop%3A4px%5C9%3Bmargin%2Dleft%3A%2D20px%7D%2Echeckbox%2B%2Echeckbox%2C%2Eradio%2B%2Eradio%7Bmargin%2Dtop%3A%2D5px%7D%2Echeckbox%2Dinline%2C%2Eradio%2Dinline%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%3Bpadding%2Dleft%3A20px%3Bmargin%2Dbottom%3A0%3Bfont%2Dweight%3A400%3Bvertical%2Dalign%3Amiddle%3Bcursor%3Apointer%7D%2Echeckbox%2Dinline%2B%2Echeckbox%2Dinline%2C%2Eradio%2Dinline%2B%2Eradio%2Dinline%7Bmargin%2Dtop%3A0%3Bmargin%2Dleft%3A10px%7Dfieldset%5Bdisabled%5D%20input%5Btype%3Dcheckbox%5D%2Cfieldset%5Bdisabled%5D%20input%5Btype%3Dradio%5D%2Cinput%5Btype%3Dcheckbox%5D%2Edisabled%2Cinput%5Btype%3Dcheckbox%5D%5Bdisabled%5D%2Cinput%5Btype%3Dradio%5D%2Edisabled%2Cinput%5Btype%3Dradio%5D%5Bdisabled%5D%7Bcursor%3Anot%2Dallowed%7D%2Echeckbox%2Dinline%2Edisabled%2C%2Eradio%2Dinline%2Edisabled%2Cfieldset%5Bdisabled%5D%20%2Echeckbox%2Dinline%2Cfieldset%5Bdisabled%5D%20%2Eradio%2Dinline%7Bcursor%3Anot%2Dallowed%7D%2Echeckbox%2Edisabled%20label%2C%2Eradio%2Edisabled%20label%2Cfieldset%5Bdisabled%5D%20%2Echeckbox%20label%2Cfieldset%5Bdisabled%5D%20%2Eradio%20label%7Bcursor%3Anot%2Dallowed%7D%2Eform%2Dcontrol%2Dstatic%7Bmin%2Dheight%3A34px%3Bpadding%2Dtop%3A7px%3Bpadding%2Dbottom%3A7px%3Bmargin%2Dbottom%3A0%7D%2Eform%2Dcontrol%2Dstatic%2Einput%2Dlg%2C%2Eform%2Dcontrol%2Dstatic%2Einput%2Dsm%7Bpadding%2Dright%3A0%3Bpadding%2Dleft%3A0%7D%2Einput%2Dsm%7Bheight%3A30px%3Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%3Bborder%2Dradius%3A3px%7Dselect%2Einput%2Dsm%7Bheight%3A30px%3Bline%2Dheight%3A30px%7Dselect%5Bmultiple%5D%2Einput%2Dsm%2Ctextarea%2Einput%2Dsm%7Bheight%3Aauto%7D%2Eform%2Dgroup%2Dsm%20%2Eform%2Dcontrol%7Bheight%3A30px%3Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%3Bborder%2Dradius%3A3px%7D%2Eform%2Dgroup%2Dsm%20select%2Eform%2Dcontrol%7Bheight%3A30px%3Bline%2Dheight%3A30px%7D%2Eform%2Dgroup%2Dsm%20select%5Bmultiple%5D%2Eform%2Dcontrol%2C%2Eform%2Dgroup%2Dsm%20textarea%2Eform%2Dcontrol%7Bheight%3Aauto%7D%2Eform%2Dgroup%2Dsm%20%2Eform%2Dcontrol%2Dstatic%7Bheight%3A30px%3Bmin%2Dheight%3A32px%3Bpadding%3A6px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%7D%2Einput%2Dlg%7Bheight%3A46px%3Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%3Bborder%2Dradius%3A6px%7Dselect%2Einput%2Dlg%7Bheight%3A46px%3Bline%2Dheight%3A46px%7Dselect%5Bmultiple%5D%2Einput%2Dlg%2Ctextarea%2Einput%2Dlg%7Bheight%3Aauto%7D%2Eform%2Dgroup%2Dlg%20%2Eform%2Dcontrol%7Bheight%3A46px%3Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%3Bborder%2Dradius%3A6px%7D%2Eform%2Dgroup%2Dlg%20select%2Eform%2Dcontrol%7Bheight%3A46px%3Bline%2Dheight%3A46px%7D%2Eform%2Dgroup%2Dlg%20select%5Bmultiple%5D%2Eform%2Dcontrol%2C%2Eform%2Dgroup%2Dlg%20textarea%2Eform%2Dcontrol%7Bheight%3Aauto%7D%2Eform%2Dgroup%2Dlg%20%2Eform%2Dcontrol%2Dstatic%7Bheight%3A46px%3Bmin%2Dheight%3A38px%3Bpadding%3A11px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%7D%2Ehas%2Dfeedback%7Bposition%3Arelative%7D%2Ehas%2Dfeedback%20%2Eform%2Dcontrol%7Bpadding%2Dright%3A42%2E5px%7D%2Eform%2Dcontrol%2Dfeedback%7Bposition%3Aabsolute%3Btop%3A0%3Bright%3A0%3Bz%2Dindex%3A2%3Bdisplay%3Ablock%3Bwidth%3A34px%3Bheight%3A34px%3Bline%2Dheight%3A34px%3Btext%2Dalign%3Acenter%3Bpointer%2Devents%3Anone%7D%2Eform%2Dgroup%2Dlg%20%2Eform%2Dcontrol%2B%2Eform%2Dcontrol%2Dfeedback%2C%2Einput%2Dgroup%2Dlg%2B%2Eform%2Dcontrol%2Dfeedback%2C%2Einput%2Dlg%2B%2Eform%2Dcontrol%2Dfeedback%7Bwidth%3A46px%3Bheight%3A46px%3Bline%2Dheight%3A46px%7D%2Eform%2Dgroup%2Dsm%20%2Eform%2Dcontrol%2B%2Eform%2Dcontrol%2Dfeedback%2C%2Einput%2Dgroup%2Dsm%2B%2Eform%2Dcontrol%2Dfeedback%2C%2Einput%2Dsm%2B%2Eform%2Dcontrol%2Dfeedback%7Bwidth%3A30px%3Bheight%3A30px%3Bline%2Dheight%3A30px%7D%2Ehas%2Dsuccess%20%2Echeckbox%2C%2Ehas%2Dsuccess%20%2Echeckbox%2Dinline%2C%2Ehas%2Dsuccess%20%2Econtrol%2Dlabel%2C%2Ehas%2Dsuccess%20%2Ehelp%2Dblock%2C%2Ehas%2Dsuccess%20%2Eradio%2C%2Ehas%2Dsuccess%20%2Eradio%2Dinline%2C%2Ehas%2Dsuccess%2Echeckbox%20label%2C%2Ehas%2Dsuccess%2Echeckbox%2Dinline%20label%2C%2Ehas%2Dsuccess%2Eradio%20label%2C%2Ehas%2Dsuccess%2Eradio%2Dinline%20label%7Bcolor%3A%233c763d%7D%2Ehas%2Dsuccess%20%2Eform%2Dcontrol%7Bborder%2Dcolor%3A%233c763d%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%7D%2Ehas%2Dsuccess%20%2Eform%2Dcontrol%3Afocus%7Bborder%2Dcolor%3A%232b542c%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%2367b168%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%2367b168%7D%2Ehas%2Dsuccess%20%2Einput%2Dgroup%2Daddon%7Bcolor%3A%233c763d%3Bbackground%2Dcolor%3A%23dff0d8%3Bborder%2Dcolor%3A%233c763d%7D%2Ehas%2Dsuccess%20%2Eform%2Dcontrol%2Dfeedback%7Bcolor%3A%233c763d%7D%2Ehas%2Dwarning%20%2Echeckbox%2C%2Ehas%2Dwarning%20%2Echeckbox%2Dinline%2C%2Ehas%2Dwarning%20%2Econtrol%2Dlabel%2C%2Ehas%2Dwarning%20%2Ehelp%2Dblock%2C%2Ehas%2Dwarning%20%2Eradio%2C%2Ehas%2Dwarning%20%2Eradio%2Dinline%2C%2Ehas%2Dwarning%2Echeckbox%20label%2C%2Ehas%2Dwarning%2Echeckbox%2Dinline%20label%2C%2Ehas%2Dwarning%2Eradio%20label%2C%2Ehas%2Dwarning%2Eradio%2Dinline%20label%7Bcolor%3A%238a6d3b%7D%2Ehas%2Dwarning%20%2Eform%2Dcontrol%7Bborder%2Dcolor%3A%238a6d3b%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%7D%2Ehas%2Dwarning%20%2Eform%2Dcontrol%3Afocus%7Bborder%2Dcolor%3A%2366512c%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%23c0a16b%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%23c0a16b%7D%2Ehas%2Dwarning%20%2Einput%2Dgroup%2Daddon%7Bcolor%3A%238a6d3b%3Bbackground%2Dcolor%3A%23fcf8e3%3Bborder%2Dcolor%3A%238a6d3b%7D%2Ehas%2Dwarning%20%2Eform%2Dcontrol%2Dfeedback%7Bcolor%3A%238a6d3b%7D%2Ehas%2Derror%20%2Echeckbox%2C%2Ehas%2Derror%20%2Echeckbox%2Dinline%2C%2Ehas%2Derror%20%2Econtrol%2Dlabel%2C%2Ehas%2Derror%20%2Ehelp%2Dblock%2C%2Ehas%2Derror%20%2Eradio%2C%2Ehas%2Derror%20%2Eradio%2Dinline%2C%2Ehas%2Derror%2Echeckbox%20label%2C%2Ehas%2Derror%2Echeckbox%2Dinline%20label%2C%2Ehas%2Derror%2Eradio%20label%2C%2Ehas%2Derror%2Eradio%2Dinline%20label%7Bcolor%3A%23a94442%7D%2Ehas%2Derror%20%2Eform%2Dcontrol%7Bborder%2Dcolor%3A%23a94442%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%7D%2Ehas%2Derror%20%2Eform%2Dcontrol%3Afocus%7Bborder%2Dcolor%3A%23843534%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%23ce8483%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E075%29%2C0%200%206px%20%23ce8483%7D%2Ehas%2Derror%20%2Einput%2Dgroup%2Daddon%7Bcolor%3A%23a94442%3Bbackground%2Dcolor%3A%23f2dede%3Bborder%2Dcolor%3A%23a94442%7D%2Ehas%2Derror%20%2Eform%2Dcontrol%2Dfeedback%7Bcolor%3A%23a94442%7D%2Ehas%2Dfeedback%20label%7E%2Eform%2Dcontrol%2Dfeedback%7Btop%3A25px%7D%2Ehas%2Dfeedback%20label%2Esr%2Donly%7E%2Eform%2Dcontrol%2Dfeedback%7Btop%3A0%7D%2Ehelp%2Dblock%7Bdisplay%3Ablock%3Bmargin%2Dtop%3A5px%3Bmargin%2Dbottom%3A10px%3Bcolor%3A%23737373%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Eform%2Dinline%20%2Eform%2Dgroup%7Bdisplay%3Ainline%2Dblock%3Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Eform%2Dinline%20%2Eform%2Dcontrol%7Bdisplay%3Ainline%2Dblock%3Bwidth%3Aauto%3Bvertical%2Dalign%3Amiddle%7D%2Eform%2Dinline%20%2Eform%2Dcontrol%2Dstatic%7Bdisplay%3Ainline%2Dblock%7D%2Eform%2Dinline%20%2Einput%2Dgroup%7Bdisplay%3Ainline%2Dtable%3Bvertical%2Dalign%3Amiddle%7D%2Eform%2Dinline%20%2Einput%2Dgroup%20%2Eform%2Dcontrol%2C%2Eform%2Dinline%20%2Einput%2Dgroup%20%2Einput%2Dgroup%2Daddon%2C%2Eform%2Dinline%20%2Einput%2Dgroup%20%2Einput%2Dgroup%2Dbtn%7Bwidth%3Aauto%7D%2Eform%2Dinline%20%2Einput%2Dgroup%3E%2Eform%2Dcontrol%7Bwidth%3A100%25%7D%2Eform%2Dinline%20%2Econtrol%2Dlabel%7Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Eform%2Dinline%20%2Echeckbox%2C%2Eform%2Dinline%20%2Eradio%7Bdisplay%3Ainline%2Dblock%3Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Eform%2Dinline%20%2Echeckbox%20label%2C%2Eform%2Dinline%20%2Eradio%20label%7Bpadding%2Dleft%3A0%7D%2Eform%2Dinline%20%2Echeckbox%20input%5Btype%3Dcheckbox%5D%2C%2Eform%2Dinline%20%2Eradio%20input%5Btype%3Dradio%5D%7Bposition%3Arelative%3Bmargin%2Dleft%3A0%7D%2Eform%2Dinline%20%2Ehas%2Dfeedback%20%2Eform%2Dcontrol%2Dfeedback%7Btop%3A0%7D%7D%2Eform%2Dhorizontal%20%2Echeckbox%2C%2Eform%2Dhorizontal%20%2Echeckbox%2Dinline%2C%2Eform%2Dhorizontal%20%2Eradio%2C%2Eform%2Dhorizontal%20%2Eradio%2Dinline%7Bpadding%2Dtop%3A7px%3Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A0%7D%2Eform%2Dhorizontal%20%2Echeckbox%2C%2Eform%2Dhorizontal%20%2Eradio%7Bmin%2Dheight%3A27px%7D%2Eform%2Dhorizontal%20%2Eform%2Dgroup%7Bmargin%2Dright%3A%2D15px%3Bmargin%2Dleft%3A%2D15px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Eform%2Dhorizontal%20%2Econtrol%2Dlabel%7Bpadding%2Dtop%3A7px%3Bmargin%2Dbottom%3A0%3Btext%2Dalign%3Aright%7D%7D%2Eform%2Dhorizontal%20%2Ehas%2Dfeedback%20%2Eform%2Dcontrol%2Dfeedback%7Bright%3A15px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Eform%2Dhorizontal%20%2Eform%2Dgroup%2Dlg%20%2Econtrol%2Dlabel%7Bpadding%2Dtop%3A14%2E33px%3Bfont%2Dsize%3A18px%7D%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Eform%2Dhorizontal%20%2Eform%2Dgroup%2Dsm%20%2Econtrol%2Dlabel%7Bpadding%2Dtop%3A6px%3Bfont%2Dsize%3A12px%7D%7D%2Ebtn%7Bdisplay%3Ainline%2Dblock%3Bpadding%3A6px%2012px%3Bmargin%2Dbottom%3A0%3Bfont%2Dsize%3A14px%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%2E42857143%3Btext%2Dalign%3Acenter%3Bwhite%2Dspace%3Anowrap%3Bvertical%2Dalign%3Amiddle%3B%2Dms%2Dtouch%2Daction%3Amanipulation%3Btouch%2Daction%3Amanipulation%3Bcursor%3Apointer%3B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%3Buser%2Dselect%3Anone%3Bbackground%2Dimage%3Anone%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A4px%7D%2Ebtn%2Eactive%2Efocus%2C%2Ebtn%2Eactive%3Afocus%2C%2Ebtn%2Efocus%2C%2Ebtn%3Aactive%2Efocus%2C%2Ebtn%3Aactive%3Afocus%2C%2Ebtn%3Afocus%7Boutline%3Athin%20dotted%3Boutline%3A5px%20auto%20%2Dwebkit%2Dfocus%2Dring%2Dcolor%3Boutline%2Doffset%3A%2D2px%7D%2Ebtn%2Efocus%2C%2Ebtn%3Afocus%2C%2Ebtn%3Ahover%7Bcolor%3A%23333%3Btext%2Ddecoration%3Anone%7D%2Ebtn%2Eactive%2C%2Ebtn%3Aactive%7Bbackground%2Dimage%3Anone%3Boutline%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%203px%205px%20rgba%280%2C0%2C0%2C%2E125%29%3Bbox%2Dshadow%3Ainset%200%203px%205px%20rgba%280%2C0%2C0%2C%2E125%29%7D%2Ebtn%2Edisabled%2C%2Ebtn%5Bdisabled%5D%2Cfieldset%5Bdisabled%5D%20%2Ebtn%7Bcursor%3Anot%2Dallowed%3Bfilter%3Aalpha%28opacity%3D65%29%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%3Bopacity%3A%2E65%7Da%2Ebtn%2Edisabled%2Cfieldset%5Bdisabled%5D%20a%2Ebtn%7Bpointer%2Devents%3Anone%7D%2Ebtn%2Ddefault%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23fff%3Bborder%2Dcolor%3A%23ccc%7D%2Ebtn%2Ddefault%2Efocus%2C%2Ebtn%2Ddefault%3Afocus%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23e6e6e6%3Bborder%2Dcolor%3A%238c8c8c%7D%2Ebtn%2Ddefault%3Ahover%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23e6e6e6%3Bborder%2Dcolor%3A%23adadad%7D%2Ebtn%2Ddefault%2Eactive%2C%2Ebtn%2Ddefault%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddefault%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23e6e6e6%3Bborder%2Dcolor%3A%23adadad%7D%2Ebtn%2Ddefault%2Eactive%2Efocus%2C%2Ebtn%2Ddefault%2Eactive%3Afocus%2C%2Ebtn%2Ddefault%2Eactive%3Ahover%2C%2Ebtn%2Ddefault%3Aactive%2Efocus%2C%2Ebtn%2Ddefault%3Aactive%3Afocus%2C%2Ebtn%2Ddefault%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddefault%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddefault%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddefault%3Ahover%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23d4d4d4%3Bborder%2Dcolor%3A%238c8c8c%7D%2Ebtn%2Ddefault%2Eactive%2C%2Ebtn%2Ddefault%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddefault%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Ddefault%2Edisabled%2C%2Ebtn%2Ddefault%2Edisabled%2Eactive%2C%2Ebtn%2Ddefault%2Edisabled%2Efocus%2C%2Ebtn%2Ddefault%2Edisabled%3Aactive%2C%2Ebtn%2Ddefault%2Edisabled%3Afocus%2C%2Ebtn%2Ddefault%2Edisabled%3Ahover%2C%2Ebtn%2Ddefault%5Bdisabled%5D%2C%2Ebtn%2Ddefault%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Ddefault%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Ddefault%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Ddefault%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Ddefault%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddefault%3Ahover%7Bbackground%2Dcolor%3A%23fff%3Bborder%2Dcolor%3A%23ccc%7D%2Ebtn%2Ddefault%20%2Ebadge%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23333%7D%2Ebtn%2Dprimary%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23337ab7%3Bborder%2Dcolor%3A%232e6da4%7D%2Ebtn%2Dprimary%2Efocus%2C%2Ebtn%2Dprimary%3Afocus%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23286090%3Bborder%2Dcolor%3A%23122b40%7D%2Ebtn%2Dprimary%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23286090%3Bborder%2Dcolor%3A%23204d74%7D%2Ebtn%2Dprimary%2Eactive%2C%2Ebtn%2Dprimary%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dprimary%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23286090%3Bborder%2Dcolor%3A%23204d74%7D%2Ebtn%2Dprimary%2Eactive%2Efocus%2C%2Ebtn%2Dprimary%2Eactive%3Afocus%2C%2Ebtn%2Dprimary%2Eactive%3Ahover%2C%2Ebtn%2Dprimary%3Aactive%2Efocus%2C%2Ebtn%2Dprimary%3Aactive%3Afocus%2C%2Ebtn%2Dprimary%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dprimary%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dprimary%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dprimary%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23204d74%3Bborder%2Dcolor%3A%23122b40%7D%2Ebtn%2Dprimary%2Eactive%2C%2Ebtn%2Dprimary%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dprimary%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Dprimary%2Edisabled%2C%2Ebtn%2Dprimary%2Edisabled%2Eactive%2C%2Ebtn%2Dprimary%2Edisabled%2Efocus%2C%2Ebtn%2Dprimary%2Edisabled%3Aactive%2C%2Ebtn%2Dprimary%2Edisabled%3Afocus%2C%2Ebtn%2Dprimary%2Edisabled%3Ahover%2C%2Ebtn%2Dprimary%5Bdisabled%5D%2C%2Ebtn%2Dprimary%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Dprimary%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Dprimary%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Dprimary%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Dprimary%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dprimary%3Ahover%7Bbackground%2Dcolor%3A%23337ab7%3Bborder%2Dcolor%3A%232e6da4%7D%2Ebtn%2Dprimary%20%2Ebadge%7Bcolor%3A%23337ab7%3Bbackground%2Dcolor%3A%23fff%7D%2Ebtn%2Dsuccess%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%235cb85c%3Bborder%2Dcolor%3A%234cae4c%7D%2Ebtn%2Dsuccess%2Efocus%2C%2Ebtn%2Dsuccess%3Afocus%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23449d44%3Bborder%2Dcolor%3A%23255625%7D%2Ebtn%2Dsuccess%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23449d44%3Bborder%2Dcolor%3A%23398439%7D%2Ebtn%2Dsuccess%2Eactive%2C%2Ebtn%2Dsuccess%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dsuccess%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23449d44%3Bborder%2Dcolor%3A%23398439%7D%2Ebtn%2Dsuccess%2Eactive%2Efocus%2C%2Ebtn%2Dsuccess%2Eactive%3Afocus%2C%2Ebtn%2Dsuccess%2Eactive%3Ahover%2C%2Ebtn%2Dsuccess%3Aactive%2Efocus%2C%2Ebtn%2Dsuccess%3Aactive%3Afocus%2C%2Ebtn%2Dsuccess%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dsuccess%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dsuccess%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dsuccess%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23398439%3Bborder%2Dcolor%3A%23255625%7D%2Ebtn%2Dsuccess%2Eactive%2C%2Ebtn%2Dsuccess%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dsuccess%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Dsuccess%2Edisabled%2C%2Ebtn%2Dsuccess%2Edisabled%2Eactive%2C%2Ebtn%2Dsuccess%2Edisabled%2Efocus%2C%2Ebtn%2Dsuccess%2Edisabled%3Aactive%2C%2Ebtn%2Dsuccess%2Edisabled%3Afocus%2C%2Ebtn%2Dsuccess%2Edisabled%3Ahover%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Dsuccess%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dsuccess%3Ahover%7Bbackground%2Dcolor%3A%235cb85c%3Bborder%2Dcolor%3A%234cae4c%7D%2Ebtn%2Dsuccess%20%2Ebadge%7Bcolor%3A%235cb85c%3Bbackground%2Dcolor%3A%23fff%7D%2Ebtn%2Dinfo%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%235bc0de%3Bborder%2Dcolor%3A%2346b8da%7D%2Ebtn%2Dinfo%2Efocus%2C%2Ebtn%2Dinfo%3Afocus%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2331b0d5%3Bborder%2Dcolor%3A%231b6d85%7D%2Ebtn%2Dinfo%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2331b0d5%3Bborder%2Dcolor%3A%23269abc%7D%2Ebtn%2Dinfo%2Eactive%2C%2Ebtn%2Dinfo%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dinfo%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2331b0d5%3Bborder%2Dcolor%3A%23269abc%7D%2Ebtn%2Dinfo%2Eactive%2Efocus%2C%2Ebtn%2Dinfo%2Eactive%3Afocus%2C%2Ebtn%2Dinfo%2Eactive%3Ahover%2C%2Ebtn%2Dinfo%3Aactive%2Efocus%2C%2Ebtn%2Dinfo%3Aactive%3Afocus%2C%2Ebtn%2Dinfo%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dinfo%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dinfo%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dinfo%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23269abc%3Bborder%2Dcolor%3A%231b6d85%7D%2Ebtn%2Dinfo%2Eactive%2C%2Ebtn%2Dinfo%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dinfo%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Dinfo%2Edisabled%2C%2Ebtn%2Dinfo%2Edisabled%2Eactive%2C%2Ebtn%2Dinfo%2Edisabled%2Efocus%2C%2Ebtn%2Dinfo%2Edisabled%3Aactive%2C%2Ebtn%2Dinfo%2Edisabled%3Afocus%2C%2Ebtn%2Dinfo%2Edisabled%3Ahover%2C%2Ebtn%2Dinfo%5Bdisabled%5D%2C%2Ebtn%2Dinfo%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Dinfo%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Dinfo%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Dinfo%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Dinfo%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dinfo%3Ahover%7Bbackground%2Dcolor%3A%235bc0de%3Bborder%2Dcolor%3A%2346b8da%7D%2Ebtn%2Dinfo%20%2Ebadge%7Bcolor%3A%235bc0de%3Bbackground%2Dcolor%3A%23fff%7D%2Ebtn%2Dwarning%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23f0ad4e%3Bborder%2Dcolor%3A%23eea236%7D%2Ebtn%2Dwarning%2Efocus%2C%2Ebtn%2Dwarning%3Afocus%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ec971f%3Bborder%2Dcolor%3A%23985f0d%7D%2Ebtn%2Dwarning%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ec971f%3Bborder%2Dcolor%3A%23d58512%7D%2Ebtn%2Dwarning%2Eactive%2C%2Ebtn%2Dwarning%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dwarning%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ec971f%3Bborder%2Dcolor%3A%23d58512%7D%2Ebtn%2Dwarning%2Eactive%2Efocus%2C%2Ebtn%2Dwarning%2Eactive%3Afocus%2C%2Ebtn%2Dwarning%2Eactive%3Ahover%2C%2Ebtn%2Dwarning%3Aactive%2Efocus%2C%2Ebtn%2Dwarning%3Aactive%3Afocus%2C%2Ebtn%2Dwarning%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dwarning%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dwarning%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dwarning%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23d58512%3Bborder%2Dcolor%3A%23985f0d%7D%2Ebtn%2Dwarning%2Eactive%2C%2Ebtn%2Dwarning%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Dwarning%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Dwarning%2Edisabled%2C%2Ebtn%2Dwarning%2Edisabled%2Eactive%2C%2Ebtn%2Dwarning%2Edisabled%2Efocus%2C%2Ebtn%2Dwarning%2Edisabled%3Aactive%2C%2Ebtn%2Dwarning%2Edisabled%3Afocus%2C%2Ebtn%2Dwarning%2Edisabled%3Ahover%2C%2Ebtn%2Dwarning%5Bdisabled%5D%2C%2Ebtn%2Dwarning%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Dwarning%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Dwarning%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Dwarning%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Dwarning%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dwarning%3Ahover%7Bbackground%2Dcolor%3A%23f0ad4e%3Bborder%2Dcolor%3A%23eea236%7D%2Ebtn%2Dwarning%20%2Ebadge%7Bcolor%3A%23f0ad4e%3Bbackground%2Dcolor%3A%23fff%7D%2Ebtn%2Ddanger%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23d9534f%3Bborder%2Dcolor%3A%23d43f3a%7D%2Ebtn%2Ddanger%2Efocus%2C%2Ebtn%2Ddanger%3Afocus%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23c9302c%3Bborder%2Dcolor%3A%23761c19%7D%2Ebtn%2Ddanger%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23c9302c%3Bborder%2Dcolor%3A%23ac2925%7D%2Ebtn%2Ddanger%2Eactive%2C%2Ebtn%2Ddanger%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddanger%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23c9302c%3Bborder%2Dcolor%3A%23ac2925%7D%2Ebtn%2Ddanger%2Eactive%2Efocus%2C%2Ebtn%2Ddanger%2Eactive%3Afocus%2C%2Ebtn%2Ddanger%2Eactive%3Ahover%2C%2Ebtn%2Ddanger%3Aactive%2Efocus%2C%2Ebtn%2Ddanger%3Aactive%3Afocus%2C%2Ebtn%2Ddanger%3Aactive%3Ahover%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddanger%2Efocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddanger%3Afocus%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddanger%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ac2925%3Bborder%2Dcolor%3A%23761c19%7D%2Ebtn%2Ddanger%2Eactive%2C%2Ebtn%2Ddanger%3Aactive%2C%2Eopen%3E%2Edropdown%2Dtoggle%2Ebtn%2Ddanger%7Bbackground%2Dimage%3Anone%7D%2Ebtn%2Ddanger%2Edisabled%2C%2Ebtn%2Ddanger%2Edisabled%2Eactive%2C%2Ebtn%2Ddanger%2Edisabled%2Efocus%2C%2Ebtn%2Ddanger%2Edisabled%3Aactive%2C%2Ebtn%2Ddanger%2Edisabled%3Afocus%2C%2Ebtn%2Ddanger%2Edisabled%3Ahover%2C%2Ebtn%2Ddanger%5Bdisabled%5D%2C%2Ebtn%2Ddanger%5Bdisabled%5D%2Eactive%2C%2Ebtn%2Ddanger%5Bdisabled%5D%2Efocus%2C%2Ebtn%2Ddanger%5Bdisabled%5D%3Aactive%2C%2Ebtn%2Ddanger%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Ddanger%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%2Eactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%2Efocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%3Aactive%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Ddanger%3Ahover%7Bbackground%2Dcolor%3A%23d9534f%3Bborder%2Dcolor%3A%23d43f3a%7D%2Ebtn%2Ddanger%20%2Ebadge%7Bcolor%3A%23d9534f%3Bbackground%2Dcolor%3A%23fff%7D%2Ebtn%2Dlink%7Bfont%2Dweight%3A400%3Bcolor%3A%23337ab7%3Bborder%2Dradius%3A0%7D%2Ebtn%2Dlink%2C%2Ebtn%2Dlink%2Eactive%2C%2Ebtn%2Dlink%3Aactive%2C%2Ebtn%2Dlink%5Bdisabled%5D%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dlink%7Bbackground%2Dcolor%3Atransparent%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7D%2Ebtn%2Dlink%2C%2Ebtn%2Dlink%3Aactive%2C%2Ebtn%2Dlink%3Afocus%2C%2Ebtn%2Dlink%3Ahover%7Bborder%2Dcolor%3Atransparent%7D%2Ebtn%2Dlink%3Afocus%2C%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%2323527c%3Btext%2Ddecoration%3Aunderline%3Bbackground%2Dcolor%3Atransparent%7D%2Ebtn%2Dlink%5Bdisabled%5D%3Afocus%2C%2Ebtn%2Dlink%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dlink%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%23777%3Btext%2Ddecoration%3Anone%7D%2Ebtn%2Dgroup%2Dlg%3E%2Ebtn%2C%2Ebtn%2Dlg%7Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%3Bborder%2Dradius%3A6px%7D%2Ebtn%2Dgroup%2Dsm%3E%2Ebtn%2C%2Ebtn%2Dsm%7Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%3Bborder%2Dradius%3A3px%7D%2Ebtn%2Dgroup%2Dxs%3E%2Ebtn%2C%2Ebtn%2Dxs%7Bpadding%3A1px%205px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%3Bborder%2Dradius%3A3px%7D%2Ebtn%2Dblock%7Bdisplay%3Ablock%3Bwidth%3A100%25%7D%2Ebtn%2Dblock%2B%2Ebtn%2Dblock%7Bmargin%2Dtop%3A5px%7Dinput%5Btype%3Dbutton%5D%2Ebtn%2Dblock%2Cinput%5Btype%3Dreset%5D%2Ebtn%2Dblock%2Cinput%5Btype%3Dsubmit%5D%2Ebtn%2Dblock%7Bwidth%3A100%25%7D%2Efade%7Bopacity%3A0%3B%2Dwebkit%2Dtransition%3Aopacity%20%2E15s%20linear%3B%2Do%2Dtransition%3Aopacity%20%2E15s%20linear%3Btransition%3Aopacity%20%2E15s%20linear%7D%2Efade%2Ein%7Bopacity%3A1%7D%2Ecollapse%7Bdisplay%3Anone%7D%2Ecollapse%2Ein%7Bdisplay%3Ablock%7Dtr%2Ecollapse%2Ein%7Bdisplay%3Atable%2Drow%7Dtbody%2Ecollapse%2Ein%7Bdisplay%3Atable%2Drow%2Dgroup%7D%2Ecollapsing%7Bposition%3Arelative%3Bheight%3A0%3Boverflow%3Ahidden%3B%2Dwebkit%2Dtransition%2Dtiming%2Dfunction%3Aease%3B%2Do%2Dtransition%2Dtiming%2Dfunction%3Aease%3Btransition%2Dtiming%2Dfunction%3Aease%3B%2Dwebkit%2Dtransition%2Dduration%3A%2E35s%3B%2Do%2Dtransition%2Dduration%3A%2E35s%3Btransition%2Dduration%3A%2E35s%3B%2Dwebkit%2Dtransition%2Dproperty%3Aheight%2Cvisibility%3B%2Do%2Dtransition%2Dproperty%3Aheight%2Cvisibility%3Btransition%2Dproperty%3Aheight%2Cvisibility%7D%2Ecaret%7Bdisplay%3Ainline%2Dblock%3Bwidth%3A0%3Bheight%3A0%3Bmargin%2Dleft%3A2px%3Bvertical%2Dalign%3Amiddle%3Bborder%2Dtop%3A4px%20dashed%3Bborder%2Dtop%3A4px%20solid%5C9%3Bborder%2Dright%3A4px%20solid%20transparent%3Bborder%2Dleft%3A4px%20solid%20transparent%7D%2Edropdown%2C%2Edropup%7Bposition%3Arelative%7D%2Edropdown%2Dtoggle%3Afocus%7Boutline%3A0%7D%2Edropdown%2Dmenu%7Bposition%3Aabsolute%3Btop%3A100%25%3Bleft%3A0%3Bz%2Dindex%3A1000%3Bdisplay%3Anone%3Bfloat%3Aleft%3Bmin%2Dwidth%3A160px%3Bpadding%3A5px%200%3Bmargin%3A2px%200%200%3Bfont%2Dsize%3A14px%3Btext%2Dalign%3Aleft%3Blist%2Dstyle%3Anone%3Bbackground%2Dcolor%3A%23fff%3B%2Dwebkit%2Dbackground%2Dclip%3Apadding%2Dbox%3Bbackground%2Dclip%3Apadding%2Dbox%3Bborder%3A1px%20solid%20%23ccc%3Bborder%3A1px%20solid%20rgba%280%2C0%2C0%2C%2E15%29%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dbox%2Dshadow%3A0%206px%2012px%20rgba%280%2C0%2C0%2C%2E175%29%3Bbox%2Dshadow%3A0%206px%2012px%20rgba%280%2C0%2C0%2C%2E175%29%7D%2Edropdown%2Dmenu%2Epull%2Dright%7Bright%3A0%3Bleft%3Aauto%7D%2Edropdown%2Dmenu%20%2Edivider%7Bheight%3A1px%3Bmargin%3A9px%200%3Boverflow%3Ahidden%3Bbackground%2Dcolor%3A%23e5e5e5%7D%2Edropdown%2Dmenu%3Eli%3Ea%7Bdisplay%3Ablock%3Bpadding%3A3px%2020px%3Bclear%3Aboth%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23333%3Bwhite%2Dspace%3Anowrap%7D%2Edropdown%2Dmenu%3Eli%3Ea%3Afocus%2C%2Edropdown%2Dmenu%3Eli%3Ea%3Ahover%7Bcolor%3A%23262626%3Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23f5f5f5%7D%2Edropdown%2Dmenu%3E%2Eactive%3Ea%2C%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Afocus%2C%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Ahover%7Bcolor%3A%23fff%3Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23337ab7%3Boutline%3A0%7D%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%2C%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Afocus%2C%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23777%7D%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Afocus%2C%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Ahover%7Btext%2Ddecoration%3Anone%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dcolor%3Atransparent%3Bbackground%2Dimage%3Anone%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28enabled%3Dfalse%29%7D%2Eopen%3E%2Edropdown%2Dmenu%7Bdisplay%3Ablock%7D%2Eopen%3Ea%7Boutline%3A0%7D%2Edropdown%2Dmenu%2Dright%7Bright%3A0%3Bleft%3Aauto%7D%2Edropdown%2Dmenu%2Dleft%7Bright%3Aauto%3Bleft%3A0%7D%2Edropdown%2Dheader%7Bdisplay%3Ablock%3Bpadding%3A3px%2020px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23777%3Bwhite%2Dspace%3Anowrap%7D%2Edropdown%2Dbackdrop%7Bposition%3Afixed%3Btop%3A0%3Bright%3A0%3Bbottom%3A0%3Bleft%3A0%3Bz%2Dindex%3A990%7D%2Epull%2Dright%3E%2Edropdown%2Dmenu%7Bright%3A0%3Bleft%3Aauto%7D%2Edropup%20%2Ecaret%2C%2Enavbar%2Dfixed%2Dbottom%20%2Edropdown%20%2Ecaret%7Bcontent%3A%22%22%3Bborder%2Dtop%3A0%3Bborder%2Dbottom%3A4px%20dashed%3Bborder%2Dbottom%3A4px%20solid%5C9%7D%2Edropup%20%2Edropdown%2Dmenu%2C%2Enavbar%2Dfixed%2Dbottom%20%2Edropdown%20%2Edropdown%2Dmenu%7Btop%3Aauto%3Bbottom%3A100%25%3Bmargin%2Dbottom%3A2px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dright%20%2Edropdown%2Dmenu%7Bright%3A0%3Bleft%3Aauto%7D%2Enavbar%2Dright%20%2Edropdown%2Dmenu%2Dleft%7Bright%3Aauto%3Bleft%3A0%7D%7D%2Ebtn%2Dgroup%2C%2Ebtn%2Dgroup%2Dvertical%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2C%2Ebtn%2Dgroup%3E%2Ebtn%7Bposition%3Arelative%3Bfloat%3Aleft%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Eactive%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Aactive%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Afocus%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Ahover%2C%2Ebtn%2Dgroup%3E%2Ebtn%2Eactive%2C%2Ebtn%2Dgroup%3E%2Ebtn%3Aactive%2C%2Ebtn%2Dgroup%3E%2Ebtn%3Afocus%2C%2Ebtn%2Dgroup%3E%2Ebtn%3Ahover%7Bz%2Dindex%3A2%7D%2Ebtn%2Dgroup%20%2Ebtn%2B%2Ebtn%2C%2Ebtn%2Dgroup%20%2Ebtn%2B%2Ebtn%2Dgroup%2C%2Ebtn%2Dgroup%20%2Ebtn%2Dgroup%2B%2Ebtn%2C%2Ebtn%2Dgroup%20%2Ebtn%2Dgroup%2B%2Ebtn%2Dgroup%7Bmargin%2Dleft%3A%2D1px%7D%2Ebtn%2Dtoolbar%7Bmargin%2Dleft%3A%2D5px%7D%2Ebtn%2Dtoolbar%20%2Ebtn%2C%2Ebtn%2Dtoolbar%20%2Ebtn%2Dgroup%2C%2Ebtn%2Dtoolbar%20%2Einput%2Dgroup%7Bfloat%3Aleft%7D%2Ebtn%2Dtoolbar%3E%2Ebtn%2C%2Ebtn%2Dtoolbar%3E%2Ebtn%2Dgroup%2C%2Ebtn%2Dtoolbar%3E%2Einput%2Dgroup%7Bmargin%2Dleft%3A5px%7D%2Ebtn%2Dgroup%3E%2Ebtn%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%3Anot%28%2Edropdown%2Dtoggle%29%7Bborder%2Dradius%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%3Afirst%2Dchild%7Bmargin%2Dleft%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%3Anot%28%2Edropdown%2Dtoggle%29%7Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%3Alast%2Dchild%3Anot%28%3Afirst%2Dchild%29%2C%2Ebtn%2Dgroup%3E%2Edropdown%2Dtoggle%3Anot%28%3Afirst%2Dchild%29%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%2Dgroup%7Bfloat%3Aleft%7D%2Ebtn%2Dgroup%3E%2Ebtn%2Dgroup%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%7Bborder%2Dradius%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%2Dgroup%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%3Alast%2Dchild%2C%2Ebtn%2Dgroup%3E%2Ebtn%2Dgroup%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%3E%2Edropdown%2Dtoggle%7Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%2Dgroup%3Alast%2Dchild%3Anot%28%3Afirst%2Dchild%29%3E%2Ebtn%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Ebtn%2Dgroup%20%2Edropdown%2Dtoggle%3Aactive%2C%2Ebtn%2Dgroup%2Eopen%20%2Edropdown%2Dtoggle%7Boutline%3A0%7D%2Ebtn%2Dgroup%3E%2Ebtn%2B%2Edropdown%2Dtoggle%7Bpadding%2Dright%3A8px%3Bpadding%2Dleft%3A8px%7D%2Ebtn%2Dgroup%3E%2Ebtn%2Dlg%2B%2Edropdown%2Dtoggle%7Bpadding%2Dright%3A12px%3Bpadding%2Dleft%3A12px%7D%2Ebtn%2Dgroup%2Eopen%20%2Edropdown%2Dtoggle%7B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%203px%205px%20rgba%280%2C0%2C0%2C%2E125%29%3Bbox%2Dshadow%3Ainset%200%203px%205px%20rgba%280%2C0%2C0%2C%2E125%29%7D%2Ebtn%2Dgroup%2Eopen%20%2Edropdown%2Dtoggle%2Ebtn%2Dlink%7B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7D%2Ebtn%20%2Ecaret%7Bmargin%2Dleft%3A0%7D%2Ebtn%2Dlg%20%2Ecaret%7Bborder%2Dwidth%3A5px%205px%200%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Edropup%20%2Ebtn%2Dlg%20%2Ecaret%7Bborder%2Dwidth%3A0%205px%205px%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3E%2Ebtn%7Bdisplay%3Ablock%3Bfloat%3Anone%3Bwidth%3A100%25%3Bmax%2Dwidth%3A100%25%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3E%2Ebtn%7Bfloat%3Anone%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2B%2Ebtn%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2B%2Ebtn%2Dgroup%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%2B%2Ebtn%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%2B%2Ebtn%2Dgroup%7Bmargin%2Dtop%3A%2D1px%3Bmargin%2Dleft%3A0%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dradius%3A0%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dtop%2Dright%2Dradius%3A4px%3Bborder%2Dbottom%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%3Alast%2Dchild%3Anot%28%3Afirst%2Dchild%29%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A4px%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%7Bborder%2Dradius%3A0%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%3Alast%2Dchild%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Afirst%2Dchild%3Anot%28%3Alast%2Dchild%29%3E%2Edropdown%2Dtoggle%7Bborder%2Dbottom%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Alast%2Dchild%3Anot%28%3Afirst%2Dchild%29%3E%2Ebtn%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dtop%2Dright%2Dradius%3A0%7D%2Ebtn%2Dgroup%2Djustified%7Bdisplay%3Atable%3Bwidth%3A100%25%3Btable%2Dlayout%3Afixed%3Bborder%2Dcollapse%3Aseparate%7D%2Ebtn%2Dgroup%2Djustified%3E%2Ebtn%2C%2Ebtn%2Dgroup%2Djustified%3E%2Ebtn%2Dgroup%7Bdisplay%3Atable%2Dcell%3Bfloat%3Anone%3Bwidth%3A1%25%7D%2Ebtn%2Dgroup%2Djustified%3E%2Ebtn%2Dgroup%20%2Ebtn%7Bwidth%3A100%25%7D%2Ebtn%2Dgroup%2Djustified%3E%2Ebtn%2Dgroup%20%2Edropdown%2Dmenu%7Bleft%3Aauto%7D%5Bdata%2Dtoggle%3Dbuttons%5D%3E%2Ebtn%20input%5Btype%3Dcheckbox%5D%2C%5Bdata%2Dtoggle%3Dbuttons%5D%3E%2Ebtn%20input%5Btype%3Dradio%5D%2C%5Bdata%2Dtoggle%3Dbuttons%5D%3E%2Ebtn%2Dgroup%3E%2Ebtn%20input%5Btype%3Dcheckbox%5D%2C%5Bdata%2Dtoggle%3Dbuttons%5D%3E%2Ebtn%2Dgroup%3E%2Ebtn%20input%5Btype%3Dradio%5D%7Bposition%3Aabsolute%3Bclip%3Arect%280%2C0%2C0%2C0%29%3Bpointer%2Devents%3Anone%7D%2Einput%2Dgroup%7Bposition%3Arelative%3Bdisplay%3Atable%3Bborder%2Dcollapse%3Aseparate%7D%2Einput%2Dgroup%5Bclass%2A%3Dcol%2D%5D%7Bfloat%3Anone%3Bpadding%2Dright%3A0%3Bpadding%2Dleft%3A0%7D%2Einput%2Dgroup%20%2Eform%2Dcontrol%7Bposition%3Arelative%3Bz%2Dindex%3A2%3Bfloat%3Aleft%3Bwidth%3A100%25%3Bmargin%2Dbottom%3A0%7D%2Einput%2Dgroup%2Dlg%3E%2Eform%2Dcontrol%2C%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Daddon%2C%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3A46px%3Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%3Bborder%2Dradius%3A6px%7Dselect%2Einput%2Dgroup%2Dlg%3E%2Eform%2Dcontrol%2Cselect%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Daddon%2Cselect%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3A46px%3Bline%2Dheight%3A46px%7Dselect%5Bmultiple%5D%2Einput%2Dgroup%2Dlg%3E%2Eform%2Dcontrol%2Cselect%5Bmultiple%5D%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Daddon%2Cselect%5Bmultiple%5D%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%2Ctextarea%2Einput%2Dgroup%2Dlg%3E%2Eform%2Dcontrol%2Ctextarea%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Daddon%2Ctextarea%2Einput%2Dgroup%2Dlg%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3Aauto%7D%2Einput%2Dgroup%2Dsm%3E%2Eform%2Dcontrol%2C%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Daddon%2C%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3A30px%3Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%3Bborder%2Dradius%3A3px%7Dselect%2Einput%2Dgroup%2Dsm%3E%2Eform%2Dcontrol%2Cselect%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Daddon%2Cselect%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3A30px%3Bline%2Dheight%3A30px%7Dselect%5Bmultiple%5D%2Einput%2Dgroup%2Dsm%3E%2Eform%2Dcontrol%2Cselect%5Bmultiple%5D%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Daddon%2Cselect%5Bmultiple%5D%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%2Ctextarea%2Einput%2Dgroup%2Dsm%3E%2Eform%2Dcontrol%2Ctextarea%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Daddon%2Ctextarea%2Einput%2Dgroup%2Dsm%3E%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bheight%3Aauto%7D%2Einput%2Dgroup%20%2Eform%2Dcontrol%2C%2Einput%2Dgroup%2Daddon%2C%2Einput%2Dgroup%2Dbtn%7Bdisplay%3Atable%2Dcell%7D%2Einput%2Dgroup%20%2Eform%2Dcontrol%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%2C%2Einput%2Dgroup%2Daddon%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%2C%2Einput%2Dgroup%2Dbtn%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dradius%3A0%7D%2Einput%2Dgroup%2Daddon%2C%2Einput%2Dgroup%2Dbtn%7Bwidth%3A1%25%3Bwhite%2Dspace%3Anowrap%3Bvertical%2Dalign%3Amiddle%7D%2Einput%2Dgroup%2Daddon%7Bpadding%3A6px%2012px%3Bfont%2Dsize%3A14px%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%3Bcolor%3A%23555%3Btext%2Dalign%3Acenter%3Bbackground%2Dcolor%3A%23eee%3Bborder%3A1px%20solid%20%23ccc%3Bborder%2Dradius%3A4px%7D%2Einput%2Dgroup%2Daddon%2Einput%2Dsm%7Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bborder%2Dradius%3A3px%7D%2Einput%2Dgroup%2Daddon%2Einput%2Dlg%7Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bborder%2Dradius%3A6px%7D%2Einput%2Dgroup%2Daddon%20input%5Btype%3Dcheckbox%5D%2C%2Einput%2Dgroup%2Daddon%20input%5Btype%3Dradio%5D%7Bmargin%2Dtop%3A0%7D%2Einput%2Dgroup%20%2Eform%2Dcontrol%3Afirst%2Dchild%2C%2Einput%2Dgroup%2Daddon%3Afirst%2Dchild%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%2Dgroup%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Edropdown%2Dtoggle%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%2Dgroup%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%3Anot%28%3Alast%2Dchild%29%3Anot%28%2Edropdown%2Dtoggle%29%7Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A0%7D%2Einput%2Dgroup%2Daddon%3Afirst%2Dchild%7Bborder%2Dright%3A0%7D%2Einput%2Dgroup%20%2Eform%2Dcontrol%3Alast%2Dchild%2C%2Einput%2Dgroup%2Daddon%3Alast%2Dchild%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%2Dgroup%3Anot%28%3Afirst%2Dchild%29%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%3Anot%28%3Afirst%2Dchild%29%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%2Dgroup%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Edropdown%2Dtoggle%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Einput%2Dgroup%2Daddon%3Alast%2Dchild%7Bborder%2Dleft%3A0%7D%2Einput%2Dgroup%2Dbtn%7Bposition%3Arelative%3Bfont%2Dsize%3A0%3Bwhite%2Dspace%3Anowrap%7D%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%7Bposition%3Arelative%7D%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%2B%2Ebtn%7Bmargin%2Dleft%3A%2D1px%7D%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%3Aactive%2C%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%3Afocus%2C%2Einput%2Dgroup%2Dbtn%3E%2Ebtn%3Ahover%7Bz%2Dindex%3A2%7D%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Afirst%2Dchild%3E%2Ebtn%2Dgroup%7Bmargin%2Dright%3A%2D1px%7D%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%2C%2Einput%2Dgroup%2Dbtn%3Alast%2Dchild%3E%2Ebtn%2Dgroup%7Bz%2Dindex%3A2%3Bmargin%2Dleft%3A%2D1px%7D%2Enav%7Bpadding%2Dleft%3A0%3Bmargin%2Dbottom%3A0%3Blist%2Dstyle%3Anone%7D%2Enav%3Eli%7Bposition%3Arelative%3Bdisplay%3Ablock%7D%2Enav%3Eli%3Ea%7Bposition%3Arelative%3Bdisplay%3Ablock%3Bpadding%3A10px%2015px%7D%2Enav%3Eli%3Ea%3Afocus%2C%2Enav%3Eli%3Ea%3Ahover%7Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23eee%7D%2Enav%3Eli%2Edisabled%3Ea%7Bcolor%3A%23777%7D%2Enav%3Eli%2Edisabled%3Ea%3Afocus%2C%2Enav%3Eli%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23777%3Btext%2Ddecoration%3Anone%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dcolor%3Atransparent%7D%2Enav%20%2Eopen%3Ea%2C%2Enav%20%2Eopen%3Ea%3Afocus%2C%2Enav%20%2Eopen%3Ea%3Ahover%7Bbackground%2Dcolor%3A%23eee%3Bborder%2Dcolor%3A%23337ab7%7D%2Enav%20%2Enav%2Ddivider%7Bheight%3A1px%3Bmargin%3A9px%200%3Boverflow%3Ahidden%3Bbackground%2Dcolor%3A%23e5e5e5%7D%2Enav%3Eli%3Ea%3Eimg%7Bmax%2Dwidth%3Anone%7D%2Enav%2Dtabs%7Bborder%2Dbottom%3A1px%20solid%20%23ddd%7D%2Enav%2Dtabs%3Eli%7Bfloat%3Aleft%3Bmargin%2Dbottom%3A%2D1px%7D%2Enav%2Dtabs%3Eli%3Ea%7Bmargin%2Dright%3A2px%3Bline%2Dheight%3A1%2E42857143%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A4px%204px%200%200%7D%2Enav%2Dtabs%3Eli%3Ea%3Ahover%7Bborder%2Dcolor%3A%23eee%20%23eee%20%23ddd%7D%2Enav%2Dtabs%3Eli%2Eactive%3Ea%2C%2Enav%2Dtabs%3Eli%2Eactive%3Ea%3Afocus%2C%2Enav%2Dtabs%3Eli%2Eactive%3Ea%3Ahover%7Bcolor%3A%23555%3Bcursor%3Adefault%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%3Bborder%2Dbottom%2Dcolor%3Atransparent%7D%2Enav%2Dtabs%2Enav%2Djustified%7Bwidth%3A100%25%3Bborder%2Dbottom%3A0%7D%2Enav%2Dtabs%2Enav%2Djustified%3Eli%7Bfloat%3Anone%7D%2Enav%2Dtabs%2Enav%2Djustified%3Eli%3Ea%7Bmargin%2Dbottom%3A5px%3Btext%2Dalign%3Acenter%7D%2Enav%2Dtabs%2Enav%2Djustified%3E%2Edropdown%20%2Edropdown%2Dmenu%7Btop%3Aauto%3Bleft%3Aauto%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enav%2Dtabs%2Enav%2Djustified%3Eli%7Bdisplay%3Atable%2Dcell%3Bwidth%3A1%25%7D%2Enav%2Dtabs%2Enav%2Djustified%3Eli%3Ea%7Bmargin%2Dbottom%3A0%7D%7D%2Enav%2Dtabs%2Enav%2Djustified%3Eli%3Ea%7Bmargin%2Dright%3A0%3Bborder%2Dradius%3A4px%7D%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%2C%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%3Afocus%2C%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%3Ahover%7Bborder%3A1px%20solid%20%23ddd%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enav%2Dtabs%2Enav%2Djustified%3Eli%3Ea%7Bborder%2Dbottom%3A1px%20solid%20%23ddd%3Bborder%2Dradius%3A4px%204px%200%200%7D%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%2C%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%3Afocus%2C%2Enav%2Dtabs%2Enav%2Djustified%3E%2Eactive%3Ea%3Ahover%7Bborder%2Dbottom%2Dcolor%3A%23fff%7D%7D%2Enav%2Dpills%3Eli%7Bfloat%3Aleft%7D%2Enav%2Dpills%3Eli%3Ea%7Bborder%2Dradius%3A4px%7D%2Enav%2Dpills%3Eli%2Bli%7Bmargin%2Dleft%3A2px%7D%2Enav%2Dpills%3Eli%2Eactive%3Ea%2C%2Enav%2Dpills%3Eli%2Eactive%3Ea%3Afocus%2C%2Enav%2Dpills%3Eli%2Eactive%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23337ab7%7D%2Enav%2Dstacked%3Eli%7Bfloat%3Anone%7D%2Enav%2Dstacked%3Eli%2Bli%7Bmargin%2Dtop%3A2px%3Bmargin%2Dleft%3A0%7D%2Enav%2Djustified%7Bwidth%3A100%25%7D%2Enav%2Djustified%3Eli%7Bfloat%3Anone%7D%2Enav%2Djustified%3Eli%3Ea%7Bmargin%2Dbottom%3A5px%3Btext%2Dalign%3Acenter%7D%2Enav%2Djustified%3E%2Edropdown%20%2Edropdown%2Dmenu%7Btop%3Aauto%3Bleft%3Aauto%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enav%2Djustified%3Eli%7Bdisplay%3Atable%2Dcell%3Bwidth%3A1%25%7D%2Enav%2Djustified%3Eli%3Ea%7Bmargin%2Dbottom%3A0%7D%7D%2Enav%2Dtabs%2Djustified%7Bborder%2Dbottom%3A0%7D%2Enav%2Dtabs%2Djustified%3Eli%3Ea%7Bmargin%2Dright%3A0%3Bborder%2Dradius%3A4px%7D%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%2C%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%3Afocus%2C%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%3Ahover%7Bborder%3A1px%20solid%20%23ddd%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enav%2Dtabs%2Djustified%3Eli%3Ea%7Bborder%2Dbottom%3A1px%20solid%20%23ddd%3Bborder%2Dradius%3A4px%204px%200%200%7D%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%2C%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%3Afocus%2C%2Enav%2Dtabs%2Djustified%3E%2Eactive%3Ea%3Ahover%7Bborder%2Dbottom%2Dcolor%3A%23fff%7D%7D%2Etab%2Dcontent%3E%2Etab%2Dpane%7Bdisplay%3Anone%7D%2Etab%2Dcontent%3E%2Eactive%7Bdisplay%3Ablock%7D%2Enav%2Dtabs%20%2Edropdown%2Dmenu%7Bmargin%2Dtop%3A%2D1px%3Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dtop%2Dright%2Dradius%3A0%7D%2Enavbar%7Bposition%3Arelative%3Bmin%2Dheight%3A50px%3Bmargin%2Dbottom%3A20px%3Bborder%3A1px%20solid%20transparent%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%7Bborder%2Dradius%3A4px%7D%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dheader%7Bfloat%3Aleft%7D%7D%2Enavbar%2Dcollapse%7Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A15px%3Boverflow%2Dx%3Avisible%3B%2Dwebkit%2Doverflow%2Dscrolling%3Atouch%3Bborder%2Dtop%3A1px%20solid%20transparent%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%3Bbox%2Dshadow%3Ainset%200%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%7D%2Enavbar%2Dcollapse%2Ein%7Boverflow%2Dy%3Aauto%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dcollapse%7Bwidth%3Aauto%3Bborder%2Dtop%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7D%2Enavbar%2Dcollapse%2Ecollapse%7Bdisplay%3Ablock%21important%3Bheight%3Aauto%21important%3Bpadding%2Dbottom%3A0%3Boverflow%3Avisible%21important%7D%2Enavbar%2Dcollapse%2Ein%7Boverflow%2Dy%3Avisible%7D%2Enavbar%2Dfixed%2Dbottom%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Dfixed%2Dtop%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Dstatic%2Dtop%20%2Enavbar%2Dcollapse%7Bpadding%2Dright%3A0%3Bpadding%2Dleft%3A0%7D%7D%2Enavbar%2Dfixed%2Dbottom%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Dfixed%2Dtop%20%2Enavbar%2Dcollapse%7Bmax%2Dheight%3A340px%7D%40media%20%28max%2Ddevice%2Dwidth%3A480px%29%20and%20%28orientation%3Alandscape%29%7B%2Enavbar%2Dfixed%2Dbottom%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Dfixed%2Dtop%20%2Enavbar%2Dcollapse%7Bmax%2Dheight%3A200px%7D%7D%2Econtainer%2Dfluid%3E%2Enavbar%2Dcollapse%2C%2Econtainer%2Dfluid%3E%2Enavbar%2Dheader%2C%2Econtainer%3E%2Enavbar%2Dcollapse%2C%2Econtainer%3E%2Enavbar%2Dheader%7Bmargin%2Dright%3A%2D15px%3Bmargin%2Dleft%3A%2D15px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Econtainer%2Dfluid%3E%2Enavbar%2Dcollapse%2C%2Econtainer%2Dfluid%3E%2Enavbar%2Dheader%2C%2Econtainer%3E%2Enavbar%2Dcollapse%2C%2Econtainer%3E%2Enavbar%2Dheader%7Bmargin%2Dright%3A0%3Bmargin%2Dleft%3A0%7D%7D%2Enavbar%2Dstatic%2Dtop%7Bz%2Dindex%3A1000%3Bborder%2Dwidth%3A0%200%201px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dstatic%2Dtop%7Bborder%2Dradius%3A0%7D%7D%2Enavbar%2Dfixed%2Dbottom%2C%2Enavbar%2Dfixed%2Dtop%7Bposition%3Afixed%3Bright%3A0%3Bleft%3A0%3Bz%2Dindex%3A1030%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dfixed%2Dbottom%2C%2Enavbar%2Dfixed%2Dtop%7Bborder%2Dradius%3A0%7D%7D%2Enavbar%2Dfixed%2Dtop%7Btop%3A0%3Bborder%2Dwidth%3A0%200%201px%7D%2Enavbar%2Dfixed%2Dbottom%7Bbottom%3A0%3Bmargin%2Dbottom%3A0%3Bborder%2Dwidth%3A1px%200%200%7D%2Enavbar%2Dbrand%7Bfloat%3Aleft%3Bheight%3A50px%3Bpadding%3A15px%2015px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A20px%7D%2Enavbar%2Dbrand%3Afocus%2C%2Enavbar%2Dbrand%3Ahover%7Btext%2Ddecoration%3Anone%7D%2Enavbar%2Dbrand%3Eimg%7Bdisplay%3Ablock%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%3E%2Econtainer%20%2Enavbar%2Dbrand%2C%2Enavbar%3E%2Econtainer%2Dfluid%20%2Enavbar%2Dbrand%7Bmargin%2Dleft%3A%2D15px%7D%7D%2Enavbar%2Dtoggle%7Bposition%3Arelative%3Bfloat%3Aright%3Bpadding%3A9px%2010px%3Bmargin%2Dtop%3A8px%3Bmargin%2Dright%3A15px%3Bmargin%2Dbottom%3A8px%3Bbackground%2Dcolor%3Atransparent%3Bbackground%2Dimage%3Anone%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A4px%7D%2Enavbar%2Dtoggle%3Afocus%7Boutline%3A0%7D%2Enavbar%2Dtoggle%20%2Eicon%2Dbar%7Bdisplay%3Ablock%3Bwidth%3A22px%3Bheight%3A2px%3Bborder%2Dradius%3A1px%7D%2Enavbar%2Dtoggle%20%2Eicon%2Dbar%2B%2Eicon%2Dbar%7Bmargin%2Dtop%3A4px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dtoggle%7Bdisplay%3Anone%7D%7D%2Enavbar%2Dnav%7Bmargin%3A7%2E5px%20%2D15px%7D%2Enavbar%2Dnav%3Eli%3Ea%7Bpadding%2Dtop%3A10px%3Bpadding%2Dbottom%3A10px%3Bline%2Dheight%3A20px%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%7Bposition%3Astatic%3Bfloat%3Anone%3Bwidth%3Aauto%3Bmargin%2Dtop%3A0%3Bbackground%2Dcolor%3Atransparent%3Bborder%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7D%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%20%2Edropdown%2Dheader%2C%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%7Bpadding%3A5px%2015px%205px%2025px%7D%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%7Bline%2Dheight%3A20px%7D%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Afocus%2C%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Ahover%7Bbackground%2Dimage%3Anone%7D%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dnav%7Bfloat%3Aleft%3Bmargin%3A0%7D%2Enavbar%2Dnav%3Eli%7Bfloat%3Aleft%7D%2Enavbar%2Dnav%3Eli%3Ea%7Bpadding%2Dtop%3A15px%3Bpadding%2Dbottom%3A15px%7D%7D%2Enavbar%2Dform%7Bpadding%3A10px%2015px%3Bmargin%2Dtop%3A8px%3Bmargin%2Dright%3A%2D15px%3Bmargin%2Dbottom%3A8px%3Bmargin%2Dleft%3A%2D15px%3Bborder%2Dtop%3A1px%20solid%20transparent%3Bborder%2Dbottom%3A1px%20solid%20transparent%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%2C0%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%3Bbox%2Dshadow%3Ainset%200%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%2C0%201px%200%20rgba%28255%2C255%2C255%2C%2E1%29%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dform%20%2Eform%2Dgroup%7Bdisplay%3Ainline%2Dblock%3Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Enavbar%2Dform%20%2Eform%2Dcontrol%7Bdisplay%3Ainline%2Dblock%3Bwidth%3Aauto%3Bvertical%2Dalign%3Amiddle%7D%2Enavbar%2Dform%20%2Eform%2Dcontrol%2Dstatic%7Bdisplay%3Ainline%2Dblock%7D%2Enavbar%2Dform%20%2Einput%2Dgroup%7Bdisplay%3Ainline%2Dtable%3Bvertical%2Dalign%3Amiddle%7D%2Enavbar%2Dform%20%2Einput%2Dgroup%20%2Eform%2Dcontrol%2C%2Enavbar%2Dform%20%2Einput%2Dgroup%20%2Einput%2Dgroup%2Daddon%2C%2Enavbar%2Dform%20%2Einput%2Dgroup%20%2Einput%2Dgroup%2Dbtn%7Bwidth%3Aauto%7D%2Enavbar%2Dform%20%2Einput%2Dgroup%3E%2Eform%2Dcontrol%7Bwidth%3A100%25%7D%2Enavbar%2Dform%20%2Econtrol%2Dlabel%7Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Enavbar%2Dform%20%2Echeckbox%2C%2Enavbar%2Dform%20%2Eradio%7Bdisplay%3Ainline%2Dblock%3Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Enavbar%2Dform%20%2Echeckbox%20label%2C%2Enavbar%2Dform%20%2Eradio%20label%7Bpadding%2Dleft%3A0%7D%2Enavbar%2Dform%20%2Echeckbox%20input%5Btype%3Dcheckbox%5D%2C%2Enavbar%2Dform%20%2Eradio%20input%5Btype%3Dradio%5D%7Bposition%3Arelative%3Bmargin%2Dleft%3A0%7D%2Enavbar%2Dform%20%2Ehas%2Dfeedback%20%2Eform%2Dcontrol%2Dfeedback%7Btop%3A0%7D%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Enavbar%2Dform%20%2Eform%2Dgroup%7Bmargin%2Dbottom%3A5px%7D%2Enavbar%2Dform%20%2Eform%2Dgroup%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7D%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dform%7Bwidth%3Aauto%3Bpadding%2Dtop%3A0%3Bpadding%2Dbottom%3A0%3Bmargin%2Dright%3A0%3Bmargin%2Dleft%3A0%3Bborder%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%7D%7D%2Enavbar%2Dnav%3Eli%3E%2Edropdown%2Dmenu%7Bmargin%2Dtop%3A0%3Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dtop%2Dright%2Dradius%3A0%7D%2Enavbar%2Dfixed%2Dbottom%20%2Enavbar%2Dnav%3Eli%3E%2Edropdown%2Dmenu%7Bmargin%2Dbottom%3A0%3Bborder%2Dtop%2Dleft%2Dradius%3A4px%3Bborder%2Dtop%2Dright%2Dradius%3A4px%3Bborder%2Dbottom%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Enavbar%2Dbtn%7Bmargin%2Dtop%3A8px%3Bmargin%2Dbottom%3A8px%7D%2Enavbar%2Dbtn%2Ebtn%2Dsm%7Bmargin%2Dtop%3A10px%3Bmargin%2Dbottom%3A10px%7D%2Enavbar%2Dbtn%2Ebtn%2Dxs%7Bmargin%2Dtop%3A14px%3Bmargin%2Dbottom%3A14px%7D%2Enavbar%2Dtext%7Bmargin%2Dtop%3A15px%3Bmargin%2Dbottom%3A15px%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dtext%7Bfloat%3Aleft%3Bmargin%2Dright%3A15px%3Bmargin%2Dleft%3A15px%7D%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Enavbar%2Dleft%7Bfloat%3Aleft%21important%7D%2Enavbar%2Dright%7Bfloat%3Aright%21important%3Bmargin%2Dright%3A%2D15px%7D%2Enavbar%2Dright%7E%2Enavbar%2Dright%7Bmargin%2Dright%3A0%7D%7D%2Enavbar%2Ddefault%7Bbackground%2Dcolor%3A%23f8f8f8%3Bborder%2Dcolor%3A%23e7e7e7%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dbrand%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dbrand%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dbrand%3Ahover%7Bcolor%3A%235e5e5e%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dtext%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3Eli%3Ea%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3Eli%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3Eli%3Ea%3Ahover%7Bcolor%3A%23333%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%3Ahover%7Bcolor%3A%23555%3Bbackground%2Dcolor%3A%23e7e7e7%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23ccc%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dtoggle%7Bborder%2Dcolor%3A%23ddd%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dtoggle%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dtoggle%3Ahover%7Bbackground%2Dcolor%3A%23ddd%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dtoggle%20%2Eicon%2Dbar%7Bbackground%2Dcolor%3A%23888%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dform%7Bborder%2Dcolor%3A%23e7e7e7%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%3Ahover%7Bcolor%3A%23555%3Bbackground%2Dcolor%3A%23e7e7e7%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Ahover%7Bcolor%3A%23333%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Ahover%7Bcolor%3A%23555%3Bbackground%2Dcolor%3A%23e7e7e7%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Afocus%2C%2Enavbar%2Ddefault%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23ccc%3Bbackground%2Dcolor%3Atransparent%7D%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dlink%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Enavbar%2Dlink%3Ahover%7Bcolor%3A%23333%7D%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%7Bcolor%3A%23777%7D%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%3Afocus%2C%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%23333%7D%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%5Bdisabled%5D%3Afocus%2C%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Enavbar%2Ddefault%20%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%23ccc%7D%2Enavbar%2Dinverse%7Bbackground%2Dcolor%3A%23222%3Bborder%2Dcolor%3A%23080808%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dbrand%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dbrand%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dbrand%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dtext%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3Eli%3Ea%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3Eli%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3Eli%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eactive%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23080808%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23444%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dtoggle%7Bborder%2Dcolor%3A%23333%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dtoggle%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dtoggle%3Ahover%7Bbackground%2Dcolor%3A%23333%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dtoggle%20%2Eicon%2Dbar%7Bbackground%2Dcolor%3A%23fff%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dcollapse%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dform%7Bborder%2Dcolor%3A%23101010%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%3E%2Eopen%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23080808%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edropdown%2Dheader%7Bborder%2Dcolor%3A%23080808%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%20%2Edivider%7Bbackground%2Dcolor%3A%23080808%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3Eli%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3Atransparent%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Eactive%3Ea%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23080808%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Afocus%2C%2Enavbar%2Dinverse%20%2Enavbar%2Dnav%20%2Eopen%20%2Edropdown%2Dmenu%3E%2Edisabled%3Ea%3Ahover%7Bcolor%3A%23444%3Bbackground%2Dcolor%3Atransparent%7D%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dlink%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Enavbar%2Dlink%3Ahover%7Bcolor%3A%23fff%7D%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%7Bcolor%3A%239d9d9d%7D%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%3Afocus%2C%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%23fff%7D%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%5Bdisabled%5D%3Afocus%2C%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%5Bdisabled%5D%3Ahover%2Cfieldset%5Bdisabled%5D%20%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%3Afocus%2Cfieldset%5Bdisabled%5D%20%2Enavbar%2Dinverse%20%2Ebtn%2Dlink%3Ahover%7Bcolor%3A%23444%7D%2Ebreadcrumb%7Bpadding%3A8px%2015px%3Bmargin%2Dbottom%3A20px%3Blist%2Dstyle%3Anone%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%2Dradius%3A4px%7D%2Ebreadcrumb%3Eli%7Bdisplay%3Ainline%2Dblock%7D%2Ebreadcrumb%3Eli%2Bli%3Abefore%7Bpadding%3A0%205px%3Bcolor%3A%23ccc%3Bcontent%3A%22%2F%5C00a0%22%7D%2Ebreadcrumb%3E%2Eactive%7Bcolor%3A%23777%7D%2Epagination%7Bdisplay%3Ainline%2Dblock%3Bpadding%2Dleft%3A0%3Bmargin%3A20px%200%3Bborder%2Dradius%3A4px%7D%2Epagination%3Eli%7Bdisplay%3Ainline%7D%2Epagination%3Eli%3Ea%2C%2Epagination%3Eli%3Espan%7Bposition%3Arelative%3Bfloat%3Aleft%3Bpadding%3A6px%2012px%3Bmargin%2Dleft%3A%2D1px%3Bline%2Dheight%3A1%2E42857143%3Bcolor%3A%23337ab7%3Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%7D%2Epagination%3Eli%3Afirst%2Dchild%3Ea%2C%2Epagination%3Eli%3Afirst%2Dchild%3Espan%7Bmargin%2Dleft%3A0%3Bborder%2Dtop%2Dleft%2Dradius%3A4px%3Bborder%2Dbottom%2Dleft%2Dradius%3A4px%7D%2Epagination%3Eli%3Alast%2Dchild%3Ea%2C%2Epagination%3Eli%3Alast%2Dchild%3Espan%7Bborder%2Dtop%2Dright%2Dradius%3A4px%3Bborder%2Dbottom%2Dright%2Dradius%3A4px%7D%2Epagination%3Eli%3Ea%3Afocus%2C%2Epagination%3Eli%3Ea%3Ahover%2C%2Epagination%3Eli%3Espan%3Afocus%2C%2Epagination%3Eli%3Espan%3Ahover%7Bz%2Dindex%3A3%3Bcolor%3A%2323527c%3Bbackground%2Dcolor%3A%23eee%3Bborder%2Dcolor%3A%23ddd%7D%2Epagination%3E%2Eactive%3Ea%2C%2Epagination%3E%2Eactive%3Ea%3Afocus%2C%2Epagination%3E%2Eactive%3Ea%3Ahover%2C%2Epagination%3E%2Eactive%3Espan%2C%2Epagination%3E%2Eactive%3Espan%3Afocus%2C%2Epagination%3E%2Eactive%3Espan%3Ahover%7Bz%2Dindex%3A2%3Bcolor%3A%23fff%3Bcursor%3Adefault%3Bbackground%2Dcolor%3A%23337ab7%3Bborder%2Dcolor%3A%23337ab7%7D%2Epagination%3E%2Edisabled%3Ea%2C%2Epagination%3E%2Edisabled%3Ea%3Afocus%2C%2Epagination%3E%2Edisabled%3Ea%3Ahover%2C%2Epagination%3E%2Edisabled%3Espan%2C%2Epagination%3E%2Edisabled%3Espan%3Afocus%2C%2Epagination%3E%2Edisabled%3Espan%3Ahover%7Bcolor%3A%23777%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dcolor%3A%23fff%3Bborder%2Dcolor%3A%23ddd%7D%2Epagination%2Dlg%3Eli%3Ea%2C%2Epagination%2Dlg%3Eli%3Espan%7Bpadding%3A10px%2016px%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A1%2E3333333%7D%2Epagination%2Dlg%3Eli%3Afirst%2Dchild%3Ea%2C%2Epagination%2Dlg%3Eli%3Afirst%2Dchild%3Espan%7Bborder%2Dtop%2Dleft%2Dradius%3A6px%3Bborder%2Dbottom%2Dleft%2Dradius%3A6px%7D%2Epagination%2Dlg%3Eli%3Alast%2Dchild%3Ea%2C%2Epagination%2Dlg%3Eli%3Alast%2Dchild%3Espan%7Bborder%2Dtop%2Dright%2Dradius%3A6px%3Bborder%2Dbottom%2Dright%2Dradius%3A6px%7D%2Epagination%2Dsm%3Eli%3Ea%2C%2Epagination%2Dsm%3Eli%3Espan%7Bpadding%3A5px%2010px%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E5%7D%2Epagination%2Dsm%3Eli%3Afirst%2Dchild%3Ea%2C%2Epagination%2Dsm%3Eli%3Afirst%2Dchild%3Espan%7Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epagination%2Dsm%3Eli%3Alast%2Dchild%3Ea%2C%2Epagination%2Dsm%3Eli%3Alast%2Dchild%3Espan%7Bborder%2Dtop%2Dright%2Dradius%3A3px%3Bborder%2Dbottom%2Dright%2Dradius%3A3px%7D%2Epager%7Bpadding%2Dleft%3A0%3Bmargin%3A20px%200%3Btext%2Dalign%3Acenter%3Blist%2Dstyle%3Anone%7D%2Epager%20li%7Bdisplay%3Ainline%7D%2Epager%20li%3Ea%2C%2Epager%20li%3Espan%7Bdisplay%3Ainline%2Dblock%3Bpadding%3A5px%2014px%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%3Bborder%2Dradius%3A15px%7D%2Epager%20li%3Ea%3Afocus%2C%2Epager%20li%3Ea%3Ahover%7Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23eee%7D%2Epager%20%2Enext%3Ea%2C%2Epager%20%2Enext%3Espan%7Bfloat%3Aright%7D%2Epager%20%2Eprevious%3Ea%2C%2Epager%20%2Eprevious%3Espan%7Bfloat%3Aleft%7D%2Epager%20%2Edisabled%3Ea%2C%2Epager%20%2Edisabled%3Ea%3Afocus%2C%2Epager%20%2Edisabled%3Ea%3Ahover%2C%2Epager%20%2Edisabled%3Espan%7Bcolor%3A%23777%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dcolor%3A%23fff%7D%2Elabel%7Bdisplay%3Ainline%3Bpadding%3A%2E2em%20%2E6em%20%2E3em%3Bfont%2Dsize%3A75%25%3Bfont%2Dweight%3A700%3Bline%2Dheight%3A1%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Bwhite%2Dspace%3Anowrap%3Bvertical%2Dalign%3Abaseline%3Bborder%2Dradius%3A%2E25em%7Da%2Elabel%3Afocus%2Ca%2Elabel%3Ahover%7Bcolor%3A%23fff%3Btext%2Ddecoration%3Anone%3Bcursor%3Apointer%7D%2Elabel%3Aempty%7Bdisplay%3Anone%7D%2Ebtn%20%2Elabel%7Bposition%3Arelative%3Btop%3A%2D1px%7D%2Elabel%2Ddefault%7Bbackground%2Dcolor%3A%23777%7D%2Elabel%2Ddefault%5Bhref%5D%3Afocus%2C%2Elabel%2Ddefault%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%235e5e5e%7D%2Elabel%2Dprimary%7Bbackground%2Dcolor%3A%23337ab7%7D%2Elabel%2Dprimary%5Bhref%5D%3Afocus%2C%2Elabel%2Dprimary%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%23286090%7D%2Elabel%2Dsuccess%7Bbackground%2Dcolor%3A%235cb85c%7D%2Elabel%2Dsuccess%5Bhref%5D%3Afocus%2C%2Elabel%2Dsuccess%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%23449d44%7D%2Elabel%2Dinfo%7Bbackground%2Dcolor%3A%235bc0de%7D%2Elabel%2Dinfo%5Bhref%5D%3Afocus%2C%2Elabel%2Dinfo%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%2331b0d5%7D%2Elabel%2Dwarning%7Bbackground%2Dcolor%3A%23f0ad4e%7D%2Elabel%2Dwarning%5Bhref%5D%3Afocus%2C%2Elabel%2Dwarning%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%23ec971f%7D%2Elabel%2Ddanger%7Bbackground%2Dcolor%3A%23d9534f%7D%2Elabel%2Ddanger%5Bhref%5D%3Afocus%2C%2Elabel%2Ddanger%5Bhref%5D%3Ahover%7Bbackground%2Dcolor%3A%23c9302c%7D%2Ebadge%7Bdisplay%3Ainline%2Dblock%3Bmin%2Dwidth%3A10px%3Bpadding%3A3px%207px%3Bfont%2Dsize%3A12px%3Bfont%2Dweight%3A700%3Bline%2Dheight%3A1%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Bwhite%2Dspace%3Anowrap%3Bvertical%2Dalign%3Amiddle%3Bbackground%2Dcolor%3A%23777%3Bborder%2Dradius%3A10px%7D%2Ebadge%3Aempty%7Bdisplay%3Anone%7D%2Ebtn%20%2Ebadge%7Bposition%3Arelative%3Btop%3A%2D1px%7D%2Ebtn%2Dgroup%2Dxs%3E%2Ebtn%20%2Ebadge%2C%2Ebtn%2Dxs%20%2Ebadge%7Btop%3A0%3Bpadding%3A1px%205px%7Da%2Ebadge%3Afocus%2Ca%2Ebadge%3Ahover%7Bcolor%3A%23fff%3Btext%2Ddecoration%3Anone%3Bcursor%3Apointer%7D%2Elist%2Dgroup%2Ditem%2Eactive%3E%2Ebadge%2C%2Enav%2Dpills%3E%2Eactive%3Ea%3E%2Ebadge%7Bcolor%3A%23337ab7%3Bbackground%2Dcolor%3A%23fff%7D%2Elist%2Dgroup%2Ditem%3E%2Ebadge%7Bfloat%3Aright%7D%2Elist%2Dgroup%2Ditem%3E%2Ebadge%2B%2Ebadge%7Bmargin%2Dright%3A5px%7D%2Enav%2Dpills%3Eli%3Ea%3E%2Ebadge%7Bmargin%2Dleft%3A3px%7D%2Ejumbotron%7Bpadding%2Dtop%3A30px%3Bpadding%2Dbottom%3A30px%3Bmargin%2Dbottom%3A30px%3Bcolor%3Ainherit%3Bbackground%2Dcolor%3A%23eee%7D%2Ejumbotron%20%2Eh1%2C%2Ejumbotron%20h1%7Bcolor%3Ainherit%7D%2Ejumbotron%20p%7Bmargin%2Dbottom%3A15px%3Bfont%2Dsize%3A21px%3Bfont%2Dweight%3A200%7D%2Ejumbotron%3Ehr%7Bborder%2Dtop%2Dcolor%3A%23d5d5d5%7D%2Econtainer%20%2Ejumbotron%2C%2Econtainer%2Dfluid%20%2Ejumbotron%7Bborder%2Dradius%3A6px%7D%2Ejumbotron%20%2Econtainer%7Bmax%2Dwidth%3A100%25%7D%40media%20screen%20and%20%28min%2Dwidth%3A768px%29%7B%2Ejumbotron%7Bpadding%2Dtop%3A48px%3Bpadding%2Dbottom%3A48px%7D%2Econtainer%20%2Ejumbotron%2C%2Econtainer%2Dfluid%20%2Ejumbotron%7Bpadding%2Dright%3A60px%3Bpadding%2Dleft%3A60px%7D%2Ejumbotron%20%2Eh1%2C%2Ejumbotron%20h1%7Bfont%2Dsize%3A63px%7D%7D%2Ethumbnail%7Bdisplay%3Ablock%3Bpadding%3A4px%3Bmargin%2Dbottom%3A20px%3Bline%2Dheight%3A1%2E42857143%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dtransition%3Aborder%20%2E2s%20ease%2Din%2Dout%3B%2Do%2Dtransition%3Aborder%20%2E2s%20ease%2Din%2Dout%3Btransition%3Aborder%20%2E2s%20ease%2Din%2Dout%7D%2Ethumbnail%20a%3Eimg%2C%2Ethumbnail%3Eimg%7Bmargin%2Dright%3Aauto%3Bmargin%2Dleft%3Aauto%7Da%2Ethumbnail%2Eactive%2Ca%2Ethumbnail%3Afocus%2Ca%2Ethumbnail%3Ahover%7Bborder%2Dcolor%3A%23337ab7%7D%2Ethumbnail%20%2Ecaption%7Bpadding%3A9px%3Bcolor%3A%23333%7D%2Ealert%7Bpadding%3A15px%3Bmargin%2Dbottom%3A20px%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A4px%7D%2Ealert%20h4%7Bmargin%2Dtop%3A0%3Bcolor%3Ainherit%7D%2Ealert%20%2Ealert%2Dlink%7Bfont%2Dweight%3A700%7D%2Ealert%3Ep%2C%2Ealert%3Eul%7Bmargin%2Dbottom%3A0%7D%2Ealert%3Ep%2Bp%7Bmargin%2Dtop%3A5px%7D%2Ealert%2Ddismissable%2C%2Ealert%2Ddismissible%7Bpadding%2Dright%3A35px%7D%2Ealert%2Ddismissable%20%2Eclose%2C%2Ealert%2Ddismissible%20%2Eclose%7Bposition%3Arelative%3Btop%3A%2D2px%3Bright%3A%2D21px%3Bcolor%3Ainherit%7D%2Ealert%2Dsuccess%7Bcolor%3A%233c763d%3Bbackground%2Dcolor%3A%23dff0d8%3Bborder%2Dcolor%3A%23d6e9c6%7D%2Ealert%2Dsuccess%20hr%7Bborder%2Dtop%2Dcolor%3A%23c9e2b3%7D%2Ealert%2Dsuccess%20%2Ealert%2Dlink%7Bcolor%3A%232b542c%7D%2Ealert%2Dinfo%7Bcolor%3A%2331708f%3Bbackground%2Dcolor%3A%23d9edf7%3Bborder%2Dcolor%3A%23bce8f1%7D%2Ealert%2Dinfo%20hr%7Bborder%2Dtop%2Dcolor%3A%23a6e1ec%7D%2Ealert%2Dinfo%20%2Ealert%2Dlink%7Bcolor%3A%23245269%7D%2Ealert%2Dwarning%7Bcolor%3A%238a6d3b%3Bbackground%2Dcolor%3A%23fcf8e3%3Bborder%2Dcolor%3A%23faebcc%7D%2Ealert%2Dwarning%20hr%7Bborder%2Dtop%2Dcolor%3A%23f7e1b5%7D%2Ealert%2Dwarning%20%2Ealert%2Dlink%7Bcolor%3A%2366512c%7D%2Ealert%2Ddanger%7Bcolor%3A%23a94442%3Bbackground%2Dcolor%3A%23f2dede%3Bborder%2Dcolor%3A%23ebccd1%7D%2Ealert%2Ddanger%20hr%7Bborder%2Dtop%2Dcolor%3A%23e4b9c0%7D%2Ealert%2Ddanger%20%2Ealert%2Dlink%7Bcolor%3A%23843534%7D%40%2Dwebkit%2Dkeyframes%20progress%2Dbar%2Dstripes%7Bfrom%7Bbackground%2Dposition%3A40px%200%7Dto%7Bbackground%2Dposition%3A0%200%7D%7D%40%2Do%2Dkeyframes%20progress%2Dbar%2Dstripes%7Bfrom%7Bbackground%2Dposition%3A40px%200%7Dto%7Bbackground%2Dposition%3A0%200%7D%7D%40keyframes%20progress%2Dbar%2Dstripes%7Bfrom%7Bbackground%2Dposition%3A40px%200%7Dto%7Bbackground%2Dposition%3A0%200%7D%7D%2Eprogress%7Bheight%3A20px%3Bmargin%2Dbottom%3A20px%3Boverflow%3Ahidden%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%202px%20rgba%280%2C0%2C0%2C%2E1%29%3Bbox%2Dshadow%3Ainset%200%201px%202px%20rgba%280%2C0%2C0%2C%2E1%29%7D%2Eprogress%2Dbar%7Bfloat%3Aleft%3Bwidth%3A0%3Bheight%3A100%25%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A20px%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Bbackground%2Dcolor%3A%23337ab7%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%20%2D1px%200%20rgba%280%2C0%2C0%2C%2E15%29%3Bbox%2Dshadow%3Ainset%200%20%2D1px%200%20rgba%280%2C0%2C0%2C%2E15%29%3B%2Dwebkit%2Dtransition%3Awidth%20%2E6s%20ease%3B%2Do%2Dtransition%3Awidth%20%2E6s%20ease%3Btransition%3Awidth%20%2E6s%20ease%7D%2Eprogress%2Dbar%2Dstriped%2C%2Eprogress%2Dstriped%20%2Eprogress%2Dbar%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3Alinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3B%2Dwebkit%2Dbackground%2Dsize%3A40px%2040px%3Bbackground%2Dsize%3A40px%2040px%7D%2Eprogress%2Dbar%2Eactive%2C%2Eprogress%2Eactive%20%2Eprogress%2Dbar%7B%2Dwebkit%2Danimation%3Aprogress%2Dbar%2Dstripes%202s%20linear%20infinite%3B%2Do%2Danimation%3Aprogress%2Dbar%2Dstripes%202s%20linear%20infinite%3Banimation%3Aprogress%2Dbar%2Dstripes%202s%20linear%20infinite%7D%2Eprogress%2Dbar%2Dsuccess%7Bbackground%2Dcolor%3A%235cb85c%7D%2Eprogress%2Dstriped%20%2Eprogress%2Dbar%2Dsuccess%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3Alinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%7D%2Eprogress%2Dbar%2Dinfo%7Bbackground%2Dcolor%3A%235bc0de%7D%2Eprogress%2Dstriped%20%2Eprogress%2Dbar%2Dinfo%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3Alinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%7D%2Eprogress%2Dbar%2Dwarning%7Bbackground%2Dcolor%3A%23f0ad4e%7D%2Eprogress%2Dstriped%20%2Eprogress%2Dbar%2Dwarning%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3Alinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%7D%2Eprogress%2Dbar%2Ddanger%7Bbackground%2Dcolor%3A%23d9534f%7D%2Eprogress%2Dstriped%20%2Eprogress%2Dbar%2Ddanger%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%3Bbackground%2Dimage%3Alinear%2Dgradient%2845deg%2Crgba%28255%2C255%2C255%2C%2E15%29%2025%25%2Ctransparent%2025%25%2Ctransparent%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2050%25%2Crgba%28255%2C255%2C255%2C%2E15%29%2075%25%2Ctransparent%2075%25%2Ctransparent%29%7D%2Emedia%7Bmargin%2Dtop%3A15px%7D%2Emedia%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%7D%2Emedia%2C%2Emedia%2Dbody%7Boverflow%3Ahidden%3Bzoom%3A1%7D%2Emedia%2Dbody%7Bwidth%3A10000px%7D%2Emedia%2Dobject%7Bdisplay%3Ablock%7D%2Emedia%2Dobject%2Eimg%2Dthumbnail%7Bmax%2Dwidth%3Anone%7D%2Emedia%2Dright%2C%2Emedia%3E%2Epull%2Dright%7Bpadding%2Dleft%3A10px%7D%2Emedia%2Dleft%2C%2Emedia%3E%2Epull%2Dleft%7Bpadding%2Dright%3A10px%7D%2Emedia%2Dbody%2C%2Emedia%2Dleft%2C%2Emedia%2Dright%7Bdisplay%3Atable%2Dcell%3Bvertical%2Dalign%3Atop%7D%2Emedia%2Dmiddle%7Bvertical%2Dalign%3Amiddle%7D%2Emedia%2Dbottom%7Bvertical%2Dalign%3Abottom%7D%2Emedia%2Dheading%7Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A5px%7D%2Emedia%2Dlist%7Bpadding%2Dleft%3A0%3Blist%2Dstyle%3Anone%7D%2Elist%2Dgroup%7Bpadding%2Dleft%3A0%3Bmargin%2Dbottom%3A20px%7D%2Elist%2Dgroup%2Ditem%7Bposition%3Arelative%3Bdisplay%3Ablock%3Bpadding%3A10px%2015px%3Bmargin%2Dbottom%3A%2D1px%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23ddd%7D%2Elist%2Dgroup%2Ditem%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A4px%3Bborder%2Dtop%2Dright%2Dradius%3A4px%7D%2Elist%2Dgroup%2Ditem%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A4px%3Bborder%2Dbottom%2Dleft%2Dradius%3A4px%7Da%2Elist%2Dgroup%2Ditem%2Cbutton%2Elist%2Dgroup%2Ditem%7Bcolor%3A%23555%7Da%2Elist%2Dgroup%2Ditem%20%2Elist%2Dgroup%2Ditem%2Dheading%2Cbutton%2Elist%2Dgroup%2Ditem%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3A%23333%7Da%2Elist%2Dgroup%2Ditem%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%3Ahover%7Bcolor%3A%23555%3Btext%2Ddecoration%3Anone%3Bbackground%2Dcolor%3A%23f5f5f5%7Dbutton%2Elist%2Dgroup%2Ditem%7Bwidth%3A100%25%3Btext%2Dalign%3Aleft%7D%2Elist%2Dgroup%2Ditem%2Edisabled%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Afocus%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Ahover%7Bcolor%3A%23777%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dcolor%3A%23eee%7D%2Elist%2Dgroup%2Ditem%2Edisabled%20%2Elist%2Dgroup%2Ditem%2Dheading%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dheading%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3Ainherit%7D%2Elist%2Dgroup%2Ditem%2Edisabled%20%2Elist%2Dgroup%2Ditem%2Dtext%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dtext%2C%2Elist%2Dgroup%2Ditem%2Edisabled%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dtext%7Bcolor%3A%23777%7D%2Elist%2Dgroup%2Ditem%2Eactive%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Afocus%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Ahover%7Bz%2Dindex%3A2%3Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23337ab7%3Bborder%2Dcolor%3A%23337ab7%7D%2Elist%2Dgroup%2Ditem%2Eactive%20%2Elist%2Dgroup%2Ditem%2Dheading%2C%2Elist%2Dgroup%2Ditem%2Eactive%20%2Elist%2Dgroup%2Ditem%2Dheading%3E%2Esmall%2C%2Elist%2Dgroup%2Ditem%2Eactive%20%2Elist%2Dgroup%2Ditem%2Dheading%3Esmall%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dheading%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dheading%3E%2Esmall%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dheading%3Esmall%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dheading%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dheading%3E%2Esmall%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dheading%3Esmall%7Bcolor%3Ainherit%7D%2Elist%2Dgroup%2Ditem%2Eactive%20%2Elist%2Dgroup%2Ditem%2Dtext%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Afocus%20%2Elist%2Dgroup%2Ditem%2Dtext%2C%2Elist%2Dgroup%2Ditem%2Eactive%3Ahover%20%2Elist%2Dgroup%2Ditem%2Dtext%7Bcolor%3A%23c7ddef%7D%2Elist%2Dgroup%2Ditem%2Dsuccess%7Bcolor%3A%233c763d%3Bbackground%2Dcolor%3A%23dff0d8%7Da%2Elist%2Dgroup%2Ditem%2Dsuccess%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%7Bcolor%3A%233c763d%7Da%2Elist%2Dgroup%2Ditem%2Dsuccess%20%2Elist%2Dgroup%2Ditem%2Dheading%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3Ainherit%7Da%2Elist%2Dgroup%2Ditem%2Dsuccess%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dsuccess%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%3Ahover%7Bcolor%3A%233c763d%3Bbackground%2Dcolor%3A%23d0e9c6%7Da%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%2Ca%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dsuccess%2Eactive%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%233c763d%3Bborder%2Dcolor%3A%233c763d%7D%2Elist%2Dgroup%2Ditem%2Dinfo%7Bcolor%3A%2331708f%3Bbackground%2Dcolor%3A%23d9edf7%7Da%2Elist%2Dgroup%2Ditem%2Dinfo%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%7Bcolor%3A%2331708f%7Da%2Elist%2Dgroup%2Ditem%2Dinfo%20%2Elist%2Dgroup%2Ditem%2Dheading%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3Ainherit%7Da%2Elist%2Dgroup%2Ditem%2Dinfo%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dinfo%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%3Ahover%7Bcolor%3A%2331708f%3Bbackground%2Dcolor%3A%23c4e3f3%7Da%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%2Ca%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dinfo%2Eactive%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2331708f%3Bborder%2Dcolor%3A%2331708f%7D%2Elist%2Dgroup%2Ditem%2Dwarning%7Bcolor%3A%238a6d3b%3Bbackground%2Dcolor%3A%23fcf8e3%7Da%2Elist%2Dgroup%2Ditem%2Dwarning%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%7Bcolor%3A%238a6d3b%7Da%2Elist%2Dgroup%2Ditem%2Dwarning%20%2Elist%2Dgroup%2Ditem%2Dheading%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3Ainherit%7Da%2Elist%2Dgroup%2Ditem%2Dwarning%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dwarning%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%3Ahover%7Bcolor%3A%238a6d3b%3Bbackground%2Dcolor%3A%23faf2cc%7Da%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%2Ca%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Dwarning%2Eactive%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%238a6d3b%3Bborder%2Dcolor%3A%238a6d3b%7D%2Elist%2Dgroup%2Ditem%2Ddanger%7Bcolor%3A%23a94442%3Bbackground%2Dcolor%3A%23f2dede%7Da%2Elist%2Dgroup%2Ditem%2Ddanger%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%7Bcolor%3A%23a94442%7Da%2Elist%2Dgroup%2Ditem%2Ddanger%20%2Elist%2Dgroup%2Ditem%2Dheading%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%20%2Elist%2Dgroup%2Ditem%2Dheading%7Bcolor%3Ainherit%7Da%2Elist%2Dgroup%2Ditem%2Ddanger%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Ddanger%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%3Ahover%7Bcolor%3A%23a94442%3Bbackground%2Dcolor%3A%23ebcccc%7Da%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%2Ca%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%3Afocus%2Ca%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%3Ahover%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%3Afocus%2Cbutton%2Elist%2Dgroup%2Ditem%2Ddanger%2Eactive%3Ahover%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23a94442%3Bborder%2Dcolor%3A%23a94442%7D%2Elist%2Dgroup%2Ditem%2Dheading%7Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A5px%7D%2Elist%2Dgroup%2Ditem%2Dtext%7Bmargin%2Dbottom%3A0%3Bline%2Dheight%3A1%2E3%7D%2Epanel%7Bmargin%2Dbottom%3A20px%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dbox%2Dshadow%3A0%201px%201px%20rgba%280%2C0%2C0%2C%2E05%29%3Bbox%2Dshadow%3A0%201px%201px%20rgba%280%2C0%2C0%2C%2E05%29%7D%2Epanel%2Dbody%7Bpadding%3A15px%7D%2Epanel%2Dheading%7Bpadding%3A10px%2015px%3Bborder%2Dbottom%3A1px%20solid%20transparent%3Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dtop%2Dright%2Dradius%3A3px%7D%2Epanel%2Dheading%3E%2Edropdown%20%2Edropdown%2Dtoggle%7Bcolor%3Ainherit%7D%2Epanel%2Dtitle%7Bmargin%2Dtop%3A0%3Bmargin%2Dbottom%3A0%3Bfont%2Dsize%3A16px%3Bcolor%3Ainherit%7D%2Epanel%2Dtitle%3E%2Esmall%2C%2Epanel%2Dtitle%3E%2Esmall%3Ea%2C%2Epanel%2Dtitle%3Ea%2C%2Epanel%2Dtitle%3Esmall%2C%2Epanel%2Dtitle%3Esmall%3Ea%7Bcolor%3Ainherit%7D%2Epanel%2Dfooter%7Bpadding%3A10px%2015px%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%2Dtop%3A1px%20solid%20%23ddd%3Bborder%2Dbottom%2Dright%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Elist%2Dgroup%2C%2Epanel%3E%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%7Bmargin%2Dbottom%3A0%7D%2Epanel%3E%2Elist%2Dgroup%20%2Elist%2Dgroup%2Ditem%2C%2Epanel%3E%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%20%2Elist%2Dgroup%2Ditem%7Bborder%2Dwidth%3A1px%200%3Bborder%2Dradius%3A0%7D%2Epanel%3E%2Elist%2Dgroup%3Afirst%2Dchild%20%2Elist%2Dgroup%2Ditem%3Afirst%2Dchild%2C%2Epanel%3E%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%3Afirst%2Dchild%20%2Elist%2Dgroup%2Ditem%3Afirst%2Dchild%7Bborder%2Dtop%3A0%3Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dtop%2Dright%2Dradius%3A3px%7D%2Epanel%3E%2Elist%2Dgroup%3Alast%2Dchild%20%2Elist%2Dgroup%2Ditem%3Alast%2Dchild%2C%2Epanel%3E%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%3Alast%2Dchild%20%2Elist%2Dgroup%2Ditem%3Alast%2Dchild%7Bborder%2Dbottom%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%20%2Elist%2Dgroup%2Ditem%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dtop%2Dright%2Dradius%3A0%7D%2Epanel%2Dheading%2B%2Elist%2Dgroup%20%2Elist%2Dgroup%2Ditem%3Afirst%2Dchild%7Bborder%2Dtop%2Dwidth%3A0%7D%2Elist%2Dgroup%2B%2Epanel%2Dfooter%7Bborder%2Dtop%2Dwidth%3A0%7D%2Epanel%3E%2Epanel%2Dcollapse%3E%2Etable%2C%2Epanel%3E%2Etable%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%7Bmargin%2Dbottom%3A0%7D%2Epanel%3E%2Epanel%2Dcollapse%3E%2Etable%20caption%2C%2Epanel%3E%2Etable%20caption%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%20caption%7Bpadding%2Dright%3A15px%3Bpadding%2Dleft%3A15px%7D%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dtop%2Dright%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dtop%2Dright%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Afirst%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Afirst%2Dchild%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Afirst%2Dchild%3Ethead%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%3Alast%2Dchild%7Bborder%2Dtop%2Dright%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%7Bborder%2Dbottom%2Dright%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%7Bborder%2Dbottom%2Dright%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Afirst%2Dchild%7Bborder%2Dbottom%2Dleft%2Dradius%3A3px%7D%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3Alast%2Dchild%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etbody%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20td%3Alast%2Dchild%2C%2Epanel%3E%2Etable%3Alast%2Dchild%3Etfoot%3Alast%2Dchild%3Etr%3Alast%2Dchild%20th%3Alast%2Dchild%7Bborder%2Dbottom%2Dright%2Dradius%3A3px%7D%2Epanel%3E%2Epanel%2Dbody%2B%2Etable%2C%2Epanel%3E%2Epanel%2Dbody%2B%2Etable%2Dresponsive%2C%2Epanel%3E%2Etable%2B%2Epanel%2Dbody%2C%2Epanel%3E%2Etable%2Dresponsive%2B%2Epanel%2Dbody%7Bborder%2Dtop%3A1px%20solid%20%23ddd%7D%2Epanel%3E%2Etable%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20td%2C%2Epanel%3E%2Etable%3Etbody%3Afirst%2Dchild%3Etr%3Afirst%2Dchild%20th%7Bborder%2Dtop%3A0%7D%2Epanel%3E%2Etable%2Dbordered%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%7Bborder%3A0%7D%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Afirst%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Afirst%2Dchild%7Bborder%2Dleft%3A0%7D%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Eth%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Eth%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Etd%3Alast%2Dchild%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Eth%3Alast%2Dchild%7Bborder%2Dright%3A0%7D%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Afirst%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Afirst%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Afirst%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dbordered%3Ethead%3Etr%3Afirst%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Afirst%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Afirst%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Afirst%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Ethead%3Etr%3Afirst%2Dchild%3Eth%7Bborder%2Dbottom%3A0%7D%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etbody%3Etr%3Alast%2Dchild%3Eth%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Etd%2C%2Epanel%3E%2Etable%2Dresponsive%3E%2Etable%2Dbordered%3Etfoot%3Etr%3Alast%2Dchild%3Eth%7Bborder%2Dbottom%3A0%7D%2Epanel%3E%2Etable%2Dresponsive%7Bmargin%2Dbottom%3A0%3Bborder%3A0%7D%2Epanel%2Dgroup%7Bmargin%2Dbottom%3A20px%7D%2Epanel%2Dgroup%20%2Epanel%7Bmargin%2Dbottom%3A0%3Bborder%2Dradius%3A4px%7D%2Epanel%2Dgroup%20%2Epanel%2B%2Epanel%7Bmargin%2Dtop%3A5px%7D%2Epanel%2Dgroup%20%2Epanel%2Dheading%7Bborder%2Dbottom%3A0%7D%2Epanel%2Dgroup%20%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Elist%2Dgroup%2C%2Epanel%2Dgroup%20%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%3A1px%20solid%20%23ddd%7D%2Epanel%2Dgroup%20%2Epanel%2Dfooter%7Bborder%2Dtop%3A0%7D%2Epanel%2Dgroup%20%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%20%2Epanel%2Dbody%7Bborder%2Dbottom%3A1px%20solid%20%23ddd%7D%2Epanel%2Ddefault%7Bborder%2Dcolor%3A%23ddd%7D%2Epanel%2Ddefault%3E%2Epanel%2Dheading%7Bcolor%3A%23333%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%2Dcolor%3A%23ddd%7D%2Epanel%2Ddefault%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23ddd%7D%2Epanel%2Ddefault%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23f5f5f5%3Bbackground%2Dcolor%3A%23333%7D%2Epanel%2Ddefault%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23ddd%7D%2Epanel%2Dprimary%7Bborder%2Dcolor%3A%23337ab7%7D%2Epanel%2Dprimary%3E%2Epanel%2Dheading%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23337ab7%3Bborder%2Dcolor%3A%23337ab7%7D%2Epanel%2Dprimary%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23337ab7%7D%2Epanel%2Dprimary%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23337ab7%3Bbackground%2Dcolor%3A%23fff%7D%2Epanel%2Dprimary%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23337ab7%7D%2Epanel%2Dsuccess%7Bborder%2Dcolor%3A%23d6e9c6%7D%2Epanel%2Dsuccess%3E%2Epanel%2Dheading%7Bcolor%3A%233c763d%3Bbackground%2Dcolor%3A%23dff0d8%3Bborder%2Dcolor%3A%23d6e9c6%7D%2Epanel%2Dsuccess%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23d6e9c6%7D%2Epanel%2Dsuccess%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23dff0d8%3Bbackground%2Dcolor%3A%233c763d%7D%2Epanel%2Dsuccess%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23d6e9c6%7D%2Epanel%2Dinfo%7Bborder%2Dcolor%3A%23bce8f1%7D%2Epanel%2Dinfo%3E%2Epanel%2Dheading%7Bcolor%3A%2331708f%3Bbackground%2Dcolor%3A%23d9edf7%3Bborder%2Dcolor%3A%23bce8f1%7D%2Epanel%2Dinfo%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23bce8f1%7D%2Epanel%2Dinfo%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23d9edf7%3Bbackground%2Dcolor%3A%2331708f%7D%2Epanel%2Dinfo%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23bce8f1%7D%2Epanel%2Dwarning%7Bborder%2Dcolor%3A%23faebcc%7D%2Epanel%2Dwarning%3E%2Epanel%2Dheading%7Bcolor%3A%238a6d3b%3Bbackground%2Dcolor%3A%23fcf8e3%3Bborder%2Dcolor%3A%23faebcc%7D%2Epanel%2Dwarning%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23faebcc%7D%2Epanel%2Dwarning%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23fcf8e3%3Bbackground%2Dcolor%3A%238a6d3b%7D%2Epanel%2Dwarning%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23faebcc%7D%2Epanel%2Ddanger%7Bborder%2Dcolor%3A%23ebccd1%7D%2Epanel%2Ddanger%3E%2Epanel%2Dheading%7Bcolor%3A%23a94442%3Bbackground%2Dcolor%3A%23f2dede%3Bborder%2Dcolor%3A%23ebccd1%7D%2Epanel%2Ddanger%3E%2Epanel%2Dheading%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dtop%2Dcolor%3A%23ebccd1%7D%2Epanel%2Ddanger%3E%2Epanel%2Dheading%20%2Ebadge%7Bcolor%3A%23f2dede%3Bbackground%2Dcolor%3A%23a94442%7D%2Epanel%2Ddanger%3E%2Epanel%2Dfooter%2B%2Epanel%2Dcollapse%3E%2Epanel%2Dbody%7Bborder%2Dbottom%2Dcolor%3A%23ebccd1%7D%2Eembed%2Dresponsive%7Bposition%3Arelative%3Bdisplay%3Ablock%3Bheight%3A0%3Bpadding%3A0%3Boverflow%3Ahidden%7D%2Eembed%2Dresponsive%20%2Eembed%2Dresponsive%2Ditem%2C%2Eembed%2Dresponsive%20embed%2C%2Eembed%2Dresponsive%20iframe%2C%2Eembed%2Dresponsive%20object%2C%2Eembed%2Dresponsive%20video%7Bposition%3Aabsolute%3Btop%3A0%3Bbottom%3A0%3Bleft%3A0%3Bwidth%3A100%25%3Bheight%3A100%25%3Bborder%3A0%7D%2Eembed%2Dresponsive%2D16by9%7Bpadding%2Dbottom%3A56%2E25%25%7D%2Eembed%2Dresponsive%2D4by3%7Bpadding%2Dbottom%3A75%25%7D%2Ewell%7Bmin%2Dheight%3A20px%3Bpadding%3A19px%3Bmargin%2Dbottom%3A20px%3Bbackground%2Dcolor%3A%23f5f5f5%3Bborder%3A1px%20solid%20%23e3e3e3%3Bborder%2Dradius%3A4px%3B%2Dwebkit%2Dbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E05%29%3Bbox%2Dshadow%3Ainset%200%201px%201px%20rgba%280%2C0%2C0%2C%2E05%29%7D%2Ewell%20blockquote%7Bborder%2Dcolor%3A%23ddd%3Bborder%2Dcolor%3Argba%280%2C0%2C0%2C%2E15%29%7D%2Ewell%2Dlg%7Bpadding%3A24px%3Bborder%2Dradius%3A6px%7D%2Ewell%2Dsm%7Bpadding%3A9px%3Bborder%2Dradius%3A3px%7D%2Eclose%7Bfloat%3Aright%3Bfont%2Dsize%3A21px%3Bfont%2Dweight%3A700%3Bline%2Dheight%3A1%3Bcolor%3A%23000%3Btext%2Dshadow%3A0%201px%200%20%23fff%3Bfilter%3Aalpha%28opacity%3D20%29%3Bopacity%3A%2E2%7D%2Eclose%3Afocus%2C%2Eclose%3Ahover%7Bcolor%3A%23000%3Btext%2Ddecoration%3Anone%3Bcursor%3Apointer%3Bfilter%3Aalpha%28opacity%3D50%29%3Bopacity%3A%2E5%7Dbutton%2Eclose%7B%2Dwebkit%2Dappearance%3Anone%3Bpadding%3A0%3Bcursor%3Apointer%3Bbackground%3A0%200%3Bborder%3A0%7D%2Emodal%2Dopen%7Boverflow%3Ahidden%7D%2Emodal%7Bposition%3Afixed%3Btop%3A0%3Bright%3A0%3Bbottom%3A0%3Bleft%3A0%3Bz%2Dindex%3A1050%3Bdisplay%3Anone%3Boverflow%3Ahidden%3B%2Dwebkit%2Doverflow%2Dscrolling%3Atouch%3Boutline%3A0%7D%2Emodal%2Efade%20%2Emodal%2Ddialog%7B%2Dwebkit%2Dtransition%3A%2Dwebkit%2Dtransform%20%2E3s%20ease%2Dout%3B%2Do%2Dtransition%3A%2Do%2Dtransform%20%2E3s%20ease%2Dout%3Btransition%3Atransform%20%2E3s%20ease%2Dout%3B%2Dwebkit%2Dtransform%3Atranslate%280%2C%2D25%25%29%3B%2Dms%2Dtransform%3Atranslate%280%2C%2D25%25%29%3B%2Do%2Dtransform%3Atranslate%280%2C%2D25%25%29%3Btransform%3Atranslate%280%2C%2D25%25%29%7D%2Emodal%2Ein%20%2Emodal%2Ddialog%7B%2Dwebkit%2Dtransform%3Atranslate%280%2C0%29%3B%2Dms%2Dtransform%3Atranslate%280%2C0%29%3B%2Do%2Dtransform%3Atranslate%280%2C0%29%3Btransform%3Atranslate%280%2C0%29%7D%2Emodal%2Dopen%20%2Emodal%7Boverflow%2Dx%3Ahidden%3Boverflow%2Dy%3Aauto%7D%2Emodal%2Ddialog%7Bposition%3Arelative%3Bwidth%3Aauto%3Bmargin%3A10px%7D%2Emodal%2Dcontent%7Bposition%3Arelative%3Bbackground%2Dcolor%3A%23fff%3B%2Dwebkit%2Dbackground%2Dclip%3Apadding%2Dbox%3Bbackground%2Dclip%3Apadding%2Dbox%3Bborder%3A1px%20solid%20%23999%3Bborder%3A1px%20solid%20rgba%280%2C0%2C0%2C%2E2%29%3Bborder%2Dradius%3A6px%3Boutline%3A0%3B%2Dwebkit%2Dbox%2Dshadow%3A0%203px%209px%20rgba%280%2C0%2C0%2C%2E5%29%3Bbox%2Dshadow%3A0%203px%209px%20rgba%280%2C0%2C0%2C%2E5%29%7D%2Emodal%2Dbackdrop%7Bposition%3Afixed%3Btop%3A0%3Bright%3A0%3Bbottom%3A0%3Bleft%3A0%3Bz%2Dindex%3A1040%3Bbackground%2Dcolor%3A%23000%7D%2Emodal%2Dbackdrop%2Efade%7Bfilter%3Aalpha%28opacity%3D0%29%3Bopacity%3A0%7D%2Emodal%2Dbackdrop%2Ein%7Bfilter%3Aalpha%28opacity%3D50%29%3Bopacity%3A%2E5%7D%2Emodal%2Dheader%7Bmin%2Dheight%3A16%2E43px%3Bpadding%3A15px%3Bborder%2Dbottom%3A1px%20solid%20%23e5e5e5%7D%2Emodal%2Dheader%20%2Eclose%7Bmargin%2Dtop%3A%2D2px%7D%2Emodal%2Dtitle%7Bmargin%3A0%3Bline%2Dheight%3A1%2E42857143%7D%2Emodal%2Dbody%7Bposition%3Arelative%3Bpadding%3A15px%7D%2Emodal%2Dfooter%7Bpadding%3A15px%3Btext%2Dalign%3Aright%3Bborder%2Dtop%3A1px%20solid%20%23e5e5e5%7D%2Emodal%2Dfooter%20%2Ebtn%2B%2Ebtn%7Bmargin%2Dbottom%3A0%3Bmargin%2Dleft%3A5px%7D%2Emodal%2Dfooter%20%2Ebtn%2Dgroup%20%2Ebtn%2B%2Ebtn%7Bmargin%2Dleft%3A%2D1px%7D%2Emodal%2Dfooter%20%2Ebtn%2Dblock%2B%2Ebtn%2Dblock%7Bmargin%2Dleft%3A0%7D%2Emodal%2Dscrollbar%2Dmeasure%7Bposition%3Aabsolute%3Btop%3A%2D9999px%3Bwidth%3A50px%3Bheight%3A50px%3Boverflow%3Ascroll%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Emodal%2Ddialog%7Bwidth%3A600px%3Bmargin%3A30px%20auto%7D%2Emodal%2Dcontent%7B%2Dwebkit%2Dbox%2Dshadow%3A0%205px%2015px%20rgba%280%2C0%2C0%2C%2E5%29%3Bbox%2Dshadow%3A0%205px%2015px%20rgba%280%2C0%2C0%2C%2E5%29%7D%2Emodal%2Dsm%7Bwidth%3A300px%7D%7D%40media%20%28min%2Dwidth%3A992px%29%7B%2Emodal%2Dlg%7Bwidth%3A900px%7D%7D%2Etooltip%7Bposition%3Aabsolute%3Bz%2Dindex%3A1070%3Bdisplay%3Ablock%3Bfont%2Dfamily%3A%22Helvetica%20Neue%22%2CHelvetica%2CArial%2Csans%2Dserif%3Bfont%2Dsize%3A12px%3Bfont%2Dstyle%3Anormal%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%2E42857143%3Btext%2Dalign%3Aleft%3Btext%2Dalign%3Astart%3Btext%2Ddecoration%3Anone%3Btext%2Dshadow%3Anone%3Btext%2Dtransform%3Anone%3Bletter%2Dspacing%3Anormal%3Bword%2Dbreak%3Anormal%3Bword%2Dspacing%3Anormal%3Bword%2Dwrap%3Anormal%3Bwhite%2Dspace%3Anormal%3Bfilter%3Aalpha%28opacity%3D0%29%3Bopacity%3A0%3Bline%2Dbreak%3Aauto%7D%2Etooltip%2Ein%7Bfilter%3Aalpha%28opacity%3D90%29%3Bopacity%3A%2E9%7D%2Etooltip%2Etop%7Bpadding%3A5px%200%3Bmargin%2Dtop%3A%2D3px%7D%2Etooltip%2Eright%7Bpadding%3A0%205px%3Bmargin%2Dleft%3A3px%7D%2Etooltip%2Ebottom%7Bpadding%3A5px%200%3Bmargin%2Dtop%3A3px%7D%2Etooltip%2Eleft%7Bpadding%3A0%205px%3Bmargin%2Dleft%3A%2D3px%7D%2Etooltip%2Dinner%7Bmax%2Dwidth%3A200px%3Bpadding%3A3px%208px%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Bbackground%2Dcolor%3A%23000%3Bborder%2Dradius%3A4px%7D%2Etooltip%2Darrow%7Bposition%3Aabsolute%3Bwidth%3A0%3Bheight%3A0%3Bborder%2Dcolor%3Atransparent%3Bborder%2Dstyle%3Asolid%7D%2Etooltip%2Etop%20%2Etooltip%2Darrow%7Bbottom%3A0%3Bleft%3A50%25%3Bmargin%2Dleft%3A%2D5px%3Bborder%2Dwidth%3A5px%205px%200%3Bborder%2Dtop%2Dcolor%3A%23000%7D%2Etooltip%2Etop%2Dleft%20%2Etooltip%2Darrow%7Bright%3A5px%3Bbottom%3A0%3Bmargin%2Dbottom%3A%2D5px%3Bborder%2Dwidth%3A5px%205px%200%3Bborder%2Dtop%2Dcolor%3A%23000%7D%2Etooltip%2Etop%2Dright%20%2Etooltip%2Darrow%7Bbottom%3A0%3Bleft%3A5px%3Bmargin%2Dbottom%3A%2D5px%3Bborder%2Dwidth%3A5px%205px%200%3Bborder%2Dtop%2Dcolor%3A%23000%7D%2Etooltip%2Eright%20%2Etooltip%2Darrow%7Btop%3A50%25%3Bleft%3A0%3Bmargin%2Dtop%3A%2D5px%3Bborder%2Dwidth%3A5px%205px%205px%200%3Bborder%2Dright%2Dcolor%3A%23000%7D%2Etooltip%2Eleft%20%2Etooltip%2Darrow%7Btop%3A50%25%3Bright%3A0%3Bmargin%2Dtop%3A%2D5px%3Bborder%2Dwidth%3A5px%200%205px%205px%3Bborder%2Dleft%2Dcolor%3A%23000%7D%2Etooltip%2Ebottom%20%2Etooltip%2Darrow%7Btop%3A0%3Bleft%3A50%25%3Bmargin%2Dleft%3A%2D5px%3Bborder%2Dwidth%3A0%205px%205px%3Bborder%2Dbottom%2Dcolor%3A%23000%7D%2Etooltip%2Ebottom%2Dleft%20%2Etooltip%2Darrow%7Btop%3A0%3Bright%3A5px%3Bmargin%2Dtop%3A%2D5px%3Bborder%2Dwidth%3A0%205px%205px%3Bborder%2Dbottom%2Dcolor%3A%23000%7D%2Etooltip%2Ebottom%2Dright%20%2Etooltip%2Darrow%7Btop%3A0%3Bleft%3A5px%3Bmargin%2Dtop%3A%2D5px%3Bborder%2Dwidth%3A0%205px%205px%3Bborder%2Dbottom%2Dcolor%3A%23000%7D%2Epopover%7Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%3Bz%2Dindex%3A1060%3Bdisplay%3Anone%3Bmax%2Dwidth%3A276px%3Bpadding%3A1px%3Bfont%2Dfamily%3A%22Helvetica%20Neue%22%2CHelvetica%2CArial%2Csans%2Dserif%3Bfont%2Dsize%3A14px%3Bfont%2Dstyle%3Anormal%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A1%2E42857143%3Btext%2Dalign%3Aleft%3Btext%2Dalign%3Astart%3Btext%2Ddecoration%3Anone%3Btext%2Dshadow%3Anone%3Btext%2Dtransform%3Anone%3Bletter%2Dspacing%3Anormal%3Bword%2Dbreak%3Anormal%3Bword%2Dspacing%3Anormal%3Bword%2Dwrap%3Anormal%3Bwhite%2Dspace%3Anormal%3Bbackground%2Dcolor%3A%23fff%3B%2Dwebkit%2Dbackground%2Dclip%3Apadding%2Dbox%3Bbackground%2Dclip%3Apadding%2Dbox%3Bborder%3A1px%20solid%20%23ccc%3Bborder%3A1px%20solid%20rgba%280%2C0%2C0%2C%2E2%29%3Bborder%2Dradius%3A6px%3B%2Dwebkit%2Dbox%2Dshadow%3A0%205px%2010px%20rgba%280%2C0%2C0%2C%2E2%29%3Bbox%2Dshadow%3A0%205px%2010px%20rgba%280%2C0%2C0%2C%2E2%29%3Bline%2Dbreak%3Aauto%7D%2Epopover%2Etop%7Bmargin%2Dtop%3A%2D10px%7D%2Epopover%2Eright%7Bmargin%2Dleft%3A10px%7D%2Epopover%2Ebottom%7Bmargin%2Dtop%3A10px%7D%2Epopover%2Eleft%7Bmargin%2Dleft%3A%2D10px%7D%2Epopover%2Dtitle%7Bpadding%3A8px%2014px%3Bmargin%3A0%3Bfont%2Dsize%3A14px%3Bbackground%2Dcolor%3A%23f7f7f7%3Bborder%2Dbottom%3A1px%20solid%20%23ebebeb%3Bborder%2Dradius%3A5px%205px%200%200%7D%2Epopover%2Dcontent%7Bpadding%3A9px%2014px%7D%2Epopover%3E%2Earrow%2C%2Epopover%3E%2Earrow%3Aafter%7Bposition%3Aabsolute%3Bdisplay%3Ablock%3Bwidth%3A0%3Bheight%3A0%3Bborder%2Dcolor%3Atransparent%3Bborder%2Dstyle%3Asolid%7D%2Epopover%3E%2Earrow%7Bborder%2Dwidth%3A11px%7D%2Epopover%3E%2Earrow%3Aafter%7Bcontent%3A%22%22%3Bborder%2Dwidth%3A10px%7D%2Epopover%2Etop%3E%2Earrow%7Bbottom%3A%2D11px%3Bleft%3A50%25%3Bmargin%2Dleft%3A%2D11px%3Bborder%2Dtop%2Dcolor%3A%23999%3Bborder%2Dtop%2Dcolor%3Argba%280%2C0%2C0%2C%2E25%29%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Epopover%2Etop%3E%2Earrow%3Aafter%7Bbottom%3A1px%3Bmargin%2Dleft%3A%2D10px%3Bcontent%3A%22%20%22%3Bborder%2Dtop%2Dcolor%3A%23fff%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Epopover%2Eright%3E%2Earrow%7Btop%3A50%25%3Bleft%3A%2D11px%3Bmargin%2Dtop%3A%2D11px%3Bborder%2Dright%2Dcolor%3A%23999%3Bborder%2Dright%2Dcolor%3Argba%280%2C0%2C0%2C%2E25%29%3Bborder%2Dleft%2Dwidth%3A0%7D%2Epopover%2Eright%3E%2Earrow%3Aafter%7Bbottom%3A%2D10px%3Bleft%3A1px%3Bcontent%3A%22%20%22%3Bborder%2Dright%2Dcolor%3A%23fff%3Bborder%2Dleft%2Dwidth%3A0%7D%2Epopover%2Ebottom%3E%2Earrow%7Btop%3A%2D11px%3Bleft%3A50%25%3Bmargin%2Dleft%3A%2D11px%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%23999%3Bborder%2Dbottom%2Dcolor%3Argba%280%2C0%2C0%2C%2E25%29%7D%2Epopover%2Ebottom%3E%2Earrow%3Aafter%7Btop%3A1px%3Bmargin%2Dleft%3A%2D10px%3Bcontent%3A%22%20%22%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%23fff%7D%2Epopover%2Eleft%3E%2Earrow%7Btop%3A50%25%3Bright%3A%2D11px%3Bmargin%2Dtop%3A%2D11px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%23999%3Bborder%2Dleft%2Dcolor%3Argba%280%2C0%2C0%2C%2E25%29%7D%2Epopover%2Eleft%3E%2Earrow%3Aafter%7Bright%3A1px%3Bbottom%3A%2D10px%3Bcontent%3A%22%20%22%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%23fff%7D%2Ecarousel%7Bposition%3Arelative%7D%2Ecarousel%2Dinner%7Bposition%3Arelative%3Bwidth%3A100%25%3Boverflow%3Ahidden%7D%2Ecarousel%2Dinner%3E%2Eitem%7Bposition%3Arelative%3Bdisplay%3Anone%3B%2Dwebkit%2Dtransition%3A%2E6s%20ease%2Din%2Dout%20left%3B%2Do%2Dtransition%3A%2E6s%20ease%2Din%2Dout%20left%3Btransition%3A%2E6s%20ease%2Din%2Dout%20left%7D%2Ecarousel%2Dinner%3E%2Eitem%3Ea%3Eimg%2C%2Ecarousel%2Dinner%3E%2Eitem%3Eimg%7Bline%2Dheight%3A1%7D%40media%20all%20and%20%28transform%2D3d%29%2C%28%2Dwebkit%2Dtransform%2D3d%29%7B%2Ecarousel%2Dinner%3E%2Eitem%7B%2Dwebkit%2Dtransition%3A%2Dwebkit%2Dtransform%20%2E6s%20ease%2Din%2Dout%3B%2Do%2Dtransition%3A%2Do%2Dtransform%20%2E6s%20ease%2Din%2Dout%3Btransition%3Atransform%20%2E6s%20ease%2Din%2Dout%3B%2Dwebkit%2Dbackface%2Dvisibility%3Ahidden%3Bbackface%2Dvisibility%3Ahidden%3B%2Dwebkit%2Dperspective%3A1000px%3Bperspective%3A1000px%7D%2Ecarousel%2Dinner%3E%2Eitem%2Eactive%2Eright%2C%2Ecarousel%2Dinner%3E%2Eitem%2Enext%7Bleft%3A0%3B%2Dwebkit%2Dtransform%3Atranslate3d%28100%25%2C0%2C0%29%3Btransform%3Atranslate3d%28100%25%2C0%2C0%29%7D%2Ecarousel%2Dinner%3E%2Eitem%2Eactive%2Eleft%2C%2Ecarousel%2Dinner%3E%2Eitem%2Eprev%7Bleft%3A0%3B%2Dwebkit%2Dtransform%3Atranslate3d%28%2D100%25%2C0%2C0%29%3Btransform%3Atranslate3d%28%2D100%25%2C0%2C0%29%7D%2Ecarousel%2Dinner%3E%2Eitem%2Eactive%2C%2Ecarousel%2Dinner%3E%2Eitem%2Enext%2Eleft%2C%2Ecarousel%2Dinner%3E%2Eitem%2Eprev%2Eright%7Bleft%3A0%3B%2Dwebkit%2Dtransform%3Atranslate3d%280%2C0%2C0%29%3Btransform%3Atranslate3d%280%2C0%2C0%29%7D%7D%2Ecarousel%2Dinner%3E%2Eactive%2C%2Ecarousel%2Dinner%3E%2Enext%2C%2Ecarousel%2Dinner%3E%2Eprev%7Bdisplay%3Ablock%7D%2Ecarousel%2Dinner%3E%2Eactive%7Bleft%3A0%7D%2Ecarousel%2Dinner%3E%2Enext%2C%2Ecarousel%2Dinner%3E%2Eprev%7Bposition%3Aabsolute%3Btop%3A0%3Bwidth%3A100%25%7D%2Ecarousel%2Dinner%3E%2Enext%7Bleft%3A100%25%7D%2Ecarousel%2Dinner%3E%2Eprev%7Bleft%3A%2D100%25%7D%2Ecarousel%2Dinner%3E%2Enext%2Eleft%2C%2Ecarousel%2Dinner%3E%2Eprev%2Eright%7Bleft%3A0%7D%2Ecarousel%2Dinner%3E%2Eactive%2Eleft%7Bleft%3A%2D100%25%7D%2Ecarousel%2Dinner%3E%2Eactive%2Eright%7Bleft%3A100%25%7D%2Ecarousel%2Dcontrol%7Bposition%3Aabsolute%3Btop%3A0%3Bbottom%3A0%3Bleft%3A0%3Bwidth%3A15%25%3Bfont%2Dsize%3A20px%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Btext%2Dshadow%3A0%201px%202px%20rgba%280%2C0%2C0%2C%2E6%29%3Bfilter%3Aalpha%28opacity%3D50%29%3Bopacity%3A%2E5%7D%2Ecarousel%2Dcontrol%2Eleft%7Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%28left%2Crgba%280%2C0%2C0%2C%2E5%29%200%2Crgba%280%2C0%2C0%2C%2E0001%29%20100%25%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%28left%2Crgba%280%2C0%2C0%2C%2E5%29%200%2Crgba%280%2C0%2C0%2C%2E0001%29%20100%25%29%3Bbackground%2Dimage%3A%2Dwebkit%2Dgradient%28linear%2Cleft%20top%2Cright%20top%2Cfrom%28rgba%280%2C0%2C0%2C%2E5%29%29%2Cto%28rgba%280%2C0%2C0%2C%2E0001%29%29%29%3Bbackground%2Dimage%3Alinear%2Dgradient%28to%20right%2Crgba%280%2C0%2C0%2C%2E5%29%200%2Crgba%280%2C0%2C0%2C%2E0001%29%20100%25%29%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28startColorstr%3D%27%2380000000%27%2C%20endColorstr%3D%27%2300000000%27%2C%20GradientType%3D1%29%3Bbackground%2Drepeat%3Arepeat%2Dx%7D%2Ecarousel%2Dcontrol%2Eright%7Bright%3A0%3Bleft%3Aauto%3Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%28left%2Crgba%280%2C0%2C0%2C%2E0001%29%200%2Crgba%280%2C0%2C0%2C%2E5%29%20100%25%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%28left%2Crgba%280%2C0%2C0%2C%2E0001%29%200%2Crgba%280%2C0%2C0%2C%2E5%29%20100%25%29%3Bbackground%2Dimage%3A%2Dwebkit%2Dgradient%28linear%2Cleft%20top%2Cright%20top%2Cfrom%28rgba%280%2C0%2C0%2C%2E0001%29%29%2Cto%28rgba%280%2C0%2C0%2C%2E5%29%29%29%3Bbackground%2Dimage%3Alinear%2Dgradient%28to%20right%2Crgba%280%2C0%2C0%2C%2E0001%29%200%2Crgba%280%2C0%2C0%2C%2E5%29%20100%25%29%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28startColorstr%3D%27%2300000000%27%2C%20endColorstr%3D%27%2380000000%27%2C%20GradientType%3D1%29%3Bbackground%2Drepeat%3Arepeat%2Dx%7D%2Ecarousel%2Dcontrol%3Afocus%2C%2Ecarousel%2Dcontrol%3Ahover%7Bcolor%3A%23fff%3Btext%2Ddecoration%3Anone%3Bfilter%3Aalpha%28opacity%3D90%29%3Boutline%3A0%3Bopacity%3A%2E9%7D%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dleft%2C%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dright%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%7Bposition%3Aabsolute%3Btop%3A50%25%3Bz%2Dindex%3A5%3Bdisplay%3Ainline%2Dblock%3Bmargin%2Dtop%3A%2D10px%7D%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dleft%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%7Bleft%3A50%25%3Bmargin%2Dleft%3A%2D10px%7D%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dright%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%7Bright%3A50%25%3Bmargin%2Dright%3A%2D10px%7D%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%7Bwidth%3A20px%3Bheight%3A20px%3Bfont%2Dfamily%3Aserif%3Bline%2Dheight%3A1%7D%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%3Abefore%7Bcontent%3A%27%5C2039%27%7D%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%3Abefore%7Bcontent%3A%27%5C203a%27%7D%2Ecarousel%2Dindicators%7Bposition%3Aabsolute%3Bbottom%3A10px%3Bleft%3A50%25%3Bz%2Dindex%3A15%3Bwidth%3A60%25%3Bpadding%2Dleft%3A0%3Bmargin%2Dleft%3A%2D30%25%3Btext%2Dalign%3Acenter%3Blist%2Dstyle%3Anone%7D%2Ecarousel%2Dindicators%20li%7Bdisplay%3Ainline%2Dblock%3Bwidth%3A10px%3Bheight%3A10px%3Bmargin%3A1px%3Btext%2Dindent%3A%2D999px%3Bcursor%3Apointer%3Bbackground%2Dcolor%3A%23000%5C9%3Bbackground%2Dcolor%3Argba%280%2C0%2C0%2C0%29%3Bborder%3A1px%20solid%20%23fff%3Bborder%2Dradius%3A10px%7D%2Ecarousel%2Dindicators%20%2Eactive%7Bwidth%3A12px%3Bheight%3A12px%3Bmargin%3A0%3Bbackground%2Dcolor%3A%23fff%7D%2Ecarousel%2Dcaption%7Bposition%3Aabsolute%3Bright%3A15%25%3Bbottom%3A20px%3Bleft%3A15%25%3Bz%2Dindex%3A10%3Bpadding%2Dtop%3A20px%3Bpadding%2Dbottom%3A20px%3Bcolor%3A%23fff%3Btext%2Dalign%3Acenter%3Btext%2Dshadow%3A0%201px%202px%20rgba%280%2C0%2C0%2C%2E6%29%7D%2Ecarousel%2Dcaption%20%2Ebtn%7Btext%2Dshadow%3Anone%7D%40media%20screen%20and%20%28min%2Dwidth%3A768px%29%7B%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dleft%2C%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dright%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%7Bwidth%3A30px%3Bheight%3A30px%3Bmargin%2Dtop%3A%2D15px%3Bfont%2Dsize%3A30px%7D%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dleft%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dprev%7Bmargin%2Dleft%3A%2D15px%7D%2Ecarousel%2Dcontrol%20%2Eglyphicon%2Dchevron%2Dright%2C%2Ecarousel%2Dcontrol%20%2Eicon%2Dnext%7Bmargin%2Dright%3A%2D15px%7D%2Ecarousel%2Dcaption%7Bright%3A20%25%3Bleft%3A20%25%3Bpadding%2Dbottom%3A30px%7D%2Ecarousel%2Dindicators%7Bbottom%3A20px%7D%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Aafter%2C%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Abefore%2C%2Ebtn%2Dtoolbar%3Aafter%2C%2Ebtn%2Dtoolbar%3Abefore%2C%2Eclearfix%3Aafter%2C%2Eclearfix%3Abefore%2C%2Econtainer%2Dfluid%3Aafter%2C%2Econtainer%2Dfluid%3Abefore%2C%2Econtainer%3Aafter%2C%2Econtainer%3Abefore%2C%2Edl%2Dhorizontal%20dd%3Aafter%2C%2Edl%2Dhorizontal%20dd%3Abefore%2C%2Eform%2Dhorizontal%20%2Eform%2Dgroup%3Aafter%2C%2Eform%2Dhorizontal%20%2Eform%2Dgroup%3Abefore%2C%2Emodal%2Dfooter%3Aafter%2C%2Emodal%2Dfooter%3Abefore%2C%2Enav%3Aafter%2C%2Enav%3Abefore%2C%2Enavbar%2Dcollapse%3Aafter%2C%2Enavbar%2Dcollapse%3Abefore%2C%2Enavbar%2Dheader%3Aafter%2C%2Enavbar%2Dheader%3Abefore%2C%2Enavbar%3Aafter%2C%2Enavbar%3Abefore%2C%2Epager%3Aafter%2C%2Epager%3Abefore%2C%2Epanel%2Dbody%3Aafter%2C%2Epanel%2Dbody%3Abefore%2C%2Erow%3Aafter%2C%2Erow%3Abefore%7Bdisplay%3Atable%3Bcontent%3A%22%20%22%7D%2Ebtn%2Dgroup%2Dvertical%3E%2Ebtn%2Dgroup%3Aafter%2C%2Ebtn%2Dtoolbar%3Aafter%2C%2Eclearfix%3Aafter%2C%2Econtainer%2Dfluid%3Aafter%2C%2Econtainer%3Aafter%2C%2Edl%2Dhorizontal%20dd%3Aafter%2C%2Eform%2Dhorizontal%20%2Eform%2Dgroup%3Aafter%2C%2Emodal%2Dfooter%3Aafter%2C%2Enav%3Aafter%2C%2Enavbar%2Dcollapse%3Aafter%2C%2Enavbar%2Dheader%3Aafter%2C%2Enavbar%3Aafter%2C%2Epager%3Aafter%2C%2Epanel%2Dbody%3Aafter%2C%2Erow%3Aafter%7Bclear%3Aboth%7D%2Ecenter%2Dblock%7Bdisplay%3Ablock%3Bmargin%2Dright%3Aauto%3Bmargin%2Dleft%3Aauto%7D%2Epull%2Dright%7Bfloat%3Aright%21important%7D%2Epull%2Dleft%7Bfloat%3Aleft%21important%7D%2Ehide%7Bdisplay%3Anone%21important%7D%2Eshow%7Bdisplay%3Ablock%21important%7D%2Einvisible%7Bvisibility%3Ahidden%7D%2Etext%2Dhide%7Bfont%3A0%2F0%20a%3Bcolor%3Atransparent%3Btext%2Dshadow%3Anone%3Bbackground%2Dcolor%3Atransparent%3Bborder%3A0%7D%2Ehidden%7Bdisplay%3Anone%21important%7D%2Eaffix%7Bposition%3Afixed%7D%40%2Dms%2Dviewport%7Bwidth%3Adevice%2Dwidth%7D%2Evisible%2Dlg%2C%2Evisible%2Dmd%2C%2Evisible%2Dsm%2C%2Evisible%2Dxs%7Bdisplay%3Anone%21important%7D%2Evisible%2Dlg%2Dblock%2C%2Evisible%2Dlg%2Dinline%2C%2Evisible%2Dlg%2Dinline%2Dblock%2C%2Evisible%2Dmd%2Dblock%2C%2Evisible%2Dmd%2Dinline%2C%2Evisible%2Dmd%2Dinline%2Dblock%2C%2Evisible%2Dsm%2Dblock%2C%2Evisible%2Dsm%2Dinline%2C%2Evisible%2Dsm%2Dinline%2Dblock%2C%2Evisible%2Dxs%2Dblock%2C%2Evisible%2Dxs%2Dinline%2C%2Evisible%2Dxs%2Dinline%2Dblock%7Bdisplay%3Anone%21important%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Evisible%2Dxs%7Bdisplay%3Ablock%21important%7Dtable%2Evisible%2Dxs%7Bdisplay%3Atable%21important%7Dtr%2Evisible%2Dxs%7Bdisplay%3Atable%2Drow%21important%7Dtd%2Evisible%2Dxs%2Cth%2Evisible%2Dxs%7Bdisplay%3Atable%2Dcell%21important%7D%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Evisible%2Dxs%2Dblock%7Bdisplay%3Ablock%21important%7D%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Evisible%2Dxs%2Dinline%7Bdisplay%3Ainline%21important%7D%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Evisible%2Dxs%2Dinline%2Dblock%7Bdisplay%3Ainline%2Dblock%21important%7D%7D%40media%20%28min%2Dwidth%3A768px%29%20and%20%28max%2Dwidth%3A991px%29%7B%2Evisible%2Dsm%7Bdisplay%3Ablock%21important%7Dtable%2Evisible%2Dsm%7Bdisplay%3Atable%21important%7Dtr%2Evisible%2Dsm%7Bdisplay%3Atable%2Drow%21important%7Dtd%2Evisible%2Dsm%2Cth%2Evisible%2Dsm%7Bdisplay%3Atable%2Dcell%21important%7D%7D%40media%20%28min%2Dwidth%3A768px%29%20and%20%28max%2Dwidth%3A991px%29%7B%2Evisible%2Dsm%2Dblock%7Bdisplay%3Ablock%21important%7D%7D%40media%20%28min%2Dwidth%3A768px%29%20and%20%28max%2Dwidth%3A991px%29%7B%2Evisible%2Dsm%2Dinline%7Bdisplay%3Ainline%21important%7D%7D%40media%20%28min%2Dwidth%3A768px%29%20and%20%28max%2Dwidth%3A991px%29%7B%2Evisible%2Dsm%2Dinline%2Dblock%7Bdisplay%3Ainline%2Dblock%21important%7D%7D%40media%20%28min%2Dwidth%3A992px%29%20and%20%28max%2Dwidth%3A1199px%29%7B%2Evisible%2Dmd%7Bdisplay%3Ablock%21important%7Dtable%2Evisible%2Dmd%7Bdisplay%3Atable%21important%7Dtr%2Evisible%2Dmd%7Bdisplay%3Atable%2Drow%21important%7Dtd%2Evisible%2Dmd%2Cth%2Evisible%2Dmd%7Bdisplay%3Atable%2Dcell%21important%7D%7D%40media%20%28min%2Dwidth%3A992px%29%20and%20%28max%2Dwidth%3A1199px%29%7B%2Evisible%2Dmd%2Dblock%7Bdisplay%3Ablock%21important%7D%7D%40media%20%28min%2Dwidth%3A992px%29%20and%20%28max%2Dwidth%3A1199px%29%7B%2Evisible%2Dmd%2Dinline%7Bdisplay%3Ainline%21important%7D%7D%40media%20%28min%2Dwidth%3A992px%29%20and%20%28max%2Dwidth%3A1199px%29%7B%2Evisible%2Dmd%2Dinline%2Dblock%7Bdisplay%3Ainline%2Dblock%21important%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Evisible%2Dlg%7Bdisplay%3Ablock%21important%7Dtable%2Evisible%2Dlg%7Bdisplay%3Atable%21important%7Dtr%2Evisible%2Dlg%7Bdisplay%3Atable%2Drow%21important%7Dtd%2Evisible%2Dlg%2Cth%2Evisible%2Dlg%7Bdisplay%3Atable%2Dcell%21important%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Evisible%2Dlg%2Dblock%7Bdisplay%3Ablock%21important%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Evisible%2Dlg%2Dinline%7Bdisplay%3Ainline%21important%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Evisible%2Dlg%2Dinline%2Dblock%7Bdisplay%3Ainline%2Dblock%21important%7D%7D%40media%20%28max%2Dwidth%3A767px%29%7B%2Ehidden%2Dxs%7Bdisplay%3Anone%21important%7D%7D%40media%20%28min%2Dwidth%3A768px%29%20and%20%28max%2Dwidth%3A991px%29%7B%2Ehidden%2Dsm%7Bdisplay%3Anone%21important%7D%7D%40media%20%28min%2Dwidth%3A992px%29%20and%20%28max%2Dwidth%3A1199px%29%7B%2Ehidden%2Dmd%7Bdisplay%3Anone%21important%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Ehidden%2Dlg%7Bdisplay%3Anone%21important%7D%7D%2Evisible%2Dprint%7Bdisplay%3Anone%21important%7D%40media%20print%7B%2Evisible%2Dprint%7Bdisplay%3Ablock%21important%7Dtable%2Evisible%2Dprint%7Bdisplay%3Atable%21important%7Dtr%2Evisible%2Dprint%7Bdisplay%3Atable%2Drow%21important%7Dtd%2Evisible%2Dprint%2Cth%2Evisible%2Dprint%7Bdisplay%3Atable%2Dcell%21important%7D%7D%2Evisible%2Dprint%2Dblock%7Bdisplay%3Anone%21important%7D%40media%20print%7B%2Evisible%2Dprint%2Dblock%7Bdisplay%3Ablock%21important%7D%7D%2Evisible%2Dprint%2Dinline%7Bdisplay%3Anone%21important%7D%40media%20print%7B%2Evisible%2Dprint%2Dinline%7Bdisplay%3Ainline%21important%7D%7D%2Evisible%2Dprint%2Dinline%2Dblock%7Bdisplay%3Anone%21important%7D%40media%20print%7B%2Evisible%2Dprint%2Dinline%2Dblock%7Bdisplay%3Ainline%2Dblock%21important%7D%7D%40media%20print%7B%2Ehidden%2Dprint%7Bdisplay%3Anone%21important%7D%7D%0A\" rel=\"stylesheet\" />\n<script src=\"data:application/x-javascript;base64,LyohCiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqLwppZigidW5kZWZpbmVkIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5Iik7K2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1hLmZuLmpxdWVyeS5zcGxpdCgiICIpWzBdLnNwbGl0KCIuIik7aWYoYlswXTwyJiZiWzFdPDl8fDE9PWJbMF0mJjk9PWJbMV0mJmJbMl08MSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyIil9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYm9vdHN0cmFwIiksYj17V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn07Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YS5zdHlsZVtjXSlyZXR1cm57ZW5kOmJbY119O3JldHVybiExfWEuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24oYil7dmFyIGM9ITEsZD10aGlzO2EodGhpcykub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Yz0hMH0pO3ZhciBlPWZ1bmN0aW9uKCl7Y3x8YShkKS50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCl9O3JldHVybiBzZXRUaW1lb3V0KGUsYiksdGhpc30sYShmdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uPWIoKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGEuZXZlbnQuc3BlY2lhbC5ic1RyYW5zaXRpb25FbmQ9e2JpbmRUeXBlOmEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxkZWxlZ2F0ZVR5cGU6YS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGhhbmRsZTpmdW5jdGlvbihiKXtyZXR1cm4gYShiLnRhcmdldCkuaXModGhpcyk/Yi5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGU9Yy5kYXRhKCJicy5hbGVydCIpO2V8fGMuZGF0YSgiYnMuYWxlcnQiLGU9bmV3IGQodGhpcykpLCJzdHJpbmciPT10eXBlb2YgYiYmZVtiXS5jYWxsKGMpfSl9dmFyIGM9J1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGQ9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2siLGMsdGhpcy5jbG9zZSl9O2QuVkVSU0lPTj0iMy4zLjUiLGQuVFJBTlNJVElPTl9EVVJBVElPTj0xNTAsZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYygpe2cuZGV0YWNoKCkudHJpZ2dlcigiY2xvc2VkLmJzLmFsZXJ0IikucmVtb3ZlKCl9dmFyIGU9YSh0aGlzKSxmPWUuYXR0cigiZGF0YS10YXJnZXQiKTtmfHwoZj1lLmF0dHIoImhyZWYiKSxmPWYmJmYucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGc9YShmKTtiJiZiLnByZXZlbnREZWZhdWx0KCksZy5sZW5ndGh8fChnPWUuY2xvc2VzdCgiLmFsZXJ0IikpLGcudHJpZ2dlcihiPWEuRXZlbnQoImNsb3NlLmJzLmFsZXJ0IikpLGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fChnLnJlbW92ZUNsYXNzKCJpbiIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZnLmhhc0NsYXNzKCJmYWRlIik/Zy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKTpjKCkpfTt2YXIgZT1hLmZuLmFsZXJ0O2EuZm4uYWxlcnQ9YixhLmZuLmFsZXJ0LkNvbnN0cnVjdG9yPWQsYS5mbi5hbGVydC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWxlcnQ9ZSx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuYWxlcnQuZGF0YS1hcGkiLGMsZC5wcm90b3R5cGUuY2xvc2UpfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYnV0dG9uIiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5idXR0b24iLGU9bmV3IGModGhpcyxmKSksInRvZ2dsZSI9PWI/ZS50b2dnbGUoKTpiJiZlLnNldFN0YXRlKGIpfSl9dmFyIGM9ZnVuY3Rpb24oYixkKXt0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy5pc0xvYWRpbmc9ITF9O2MuVkVSU0lPTj0iMy4zLjUiLGMuREVGQVVMVFM9e2xvYWRpbmdUZXh0OiJsb2FkaW5nLi4uIn0sYy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oYil7dmFyIGM9ImRpc2FibGVkIixkPXRoaXMuJGVsZW1lbnQsZT1kLmlzKCJpbnB1dCIpPyJ2YWwiOiJodG1sIixmPWQuZGF0YSgpO2IrPSJUZXh0IixudWxsPT1mLnJlc2V0VGV4dCYmZC5kYXRhKCJyZXNldFRleHQiLGRbZV0oKSksc2V0VGltZW91dChhLnByb3h5KGZ1bmN0aW9uKCl7ZFtlXShudWxsPT1mW2JdP3RoaXMub3B0aW9uc1tiXTpmW2JdKSwibG9hZGluZ1RleHQiPT1iPyh0aGlzLmlzTG9hZGluZz0hMCxkLmFkZENsYXNzKGMpLmF0dHIoYyxjKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykpfSx0aGlzKSwwKX0sYy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucyJdJyk7aWYoYi5sZW5ndGgpe3ZhciBjPXRoaXMuJGVsZW1lbnQuZmluZCgiaW5wdXQiKTsicmFkaW8iPT1jLnByb3AoInR5cGUiKT8oYy5wcm9wKCJjaGVja2VkIikmJihhPSExKSxiLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kZWxlbWVudC5hZGRDbGFzcygiYWN0aXZlIikpOiJjaGVja2JveCI9PWMucHJvcCgidHlwZSIpJiYoYy5wcm9wKCJjaGVja2VkIikhPT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSYmKGE9ITEpLHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoImFjdGl2ZSIpKSxjLnByb3AoImNoZWNrZWQiLHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpKSxhJiZjLnRyaWdnZXIoImNoYW5nZSIpfWVsc2UgdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSksdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygiYWN0aXZlIil9O3ZhciBkPWEuZm4uYnV0dG9uO2EuZm4uYnV0dG9uPWIsYS5mbi5idXR0b24uQ29uc3RydWN0b3I9YyxhLmZuLmJ1dHRvbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYnV0dG9uPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmJ1dHRvbi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKGMudGFyZ2V0KTtkLmhhc0NsYXNzKCJidG4iKXx8KGQ9ZC5jbG9zZXN0KCIuYnRuIikpLGIuY2FsbChkLCJ0b2dnbGUiKSxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0icmFkaW8iXScpfHxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0iY2hlY2tib3giXScpfHxjLnByZXZlbnREZWZhdWx0KCl9KS5vbigiZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlXj0iYnV0dG9uIl0nLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNsb3Nlc3QoIi5idG4iKS50b2dnbGVDbGFzcygiZm9jdXMiLC9eZm9jdXMoaW4pPyQvLnRlc3QoYi50eXBlKSl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmNhcm91c2VsIiksZj1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZz0ic3RyaW5nIj09dHlwZW9mIGI/YjpmLnNsaWRlO2V8fGQuZGF0YSgiYnMuY2Fyb3VzZWwiLGU9bmV3IGModGhpcyxmKSksIm51bWJlciI9PXR5cGVvZiBiP2UudG8oYik6Zz9lW2ddKCk6Zi5pbnRlcnZhbCYmZS5wYXVzZSgpLmN5Y2xlKCl9KX12YXIgYz1mdW5jdGlvbihiLGMpe3RoaXMuJGVsZW1lbnQ9YShiKSx0aGlzLiRpbmRpY2F0b3JzPXRoaXMuJGVsZW1lbnQuZmluZCgiLmNhcm91c2VsLWluZGljYXRvcnMiKSx0aGlzLm9wdGlvbnM9Yyx0aGlzLnBhdXNlZD1udWxsLHRoaXMuc2xpZGluZz1udWxsLHRoaXMuaW50ZXJ2YWw9bnVsbCx0aGlzLiRhY3RpdmU9bnVsbCx0aGlzLiRpdGVtcz1udWxsLHRoaXMub3B0aW9ucy5rZXlib2FyZCYmdGhpcy4kZWxlbWVudC5vbigia2V5ZG93bi5icy5jYXJvdXNlbCIsYS5wcm94eSh0aGlzLmtleWRvd24sdGhpcykpLCJob3ZlciI9PXRoaXMub3B0aW9ucy5wYXVzZSYmISgib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkmJnRoaXMuJGVsZW1lbnQub24oIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5wYXVzZSx0aGlzKSkub24oIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5jeWNsZSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj02MDAsYy5ERUZBVUxUUz17aW50ZXJ2YWw6NWUzLHBhdXNlOiJob3ZlciIsd3JhcDohMCxrZXlib2FyZDohMH0sYy5wcm90b3R5cGUua2V5ZG93bj1mdW5jdGlvbihhKXtpZighL2lucHV0fHRleHRhcmVhL2kudGVzdChhLnRhcmdldC50YWdOYW1lKSl7c3dpdGNoKGEud2hpY2gpe2Nhc2UgMzc6dGhpcy5wcmV2KCk7YnJlYWs7Y2FzZSAzOTp0aGlzLm5leHQoKTticmVhaztkZWZhdWx0OnJldHVybn1hLnByZXZlbnREZWZhdWx0KCl9fSxjLnByb3RvdHlwZS5jeWNsZT1mdW5jdGlvbihiKXtyZXR1cm4gYnx8KHRoaXMucGF1c2VkPSExKSx0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCYmIXRoaXMucGF1c2VkJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChhLnByb3h5KHRoaXMubmV4dCx0aGlzKSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSx0aGlzfSxjLnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGl0ZW1zPWEucGFyZW50KCkuY2hpbGRyZW4oIi5pdGVtIiksdGhpcy4kaXRlbXMuaW5kZXgoYXx8dGhpcy4kYWN0aXZlKX0sYy5wcm90b3R5cGUuZ2V0SXRlbUZvckRpcmVjdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0SXRlbUluZGV4KGIpLGQ9InByZXYiPT1hJiYwPT09Y3x8Im5leHQiPT1hJiZjPT10aGlzLiRpdGVtcy5sZW5ndGgtMTtpZihkJiYhdGhpcy5vcHRpb25zLndyYXApcmV0dXJuIGI7dmFyIGU9InByZXYiPT1hPy0xOjEsZj0oYytlKSV0aGlzLiRpdGVtcy5sZW5ndGg7cmV0dXJuIHRoaXMuJGl0ZW1zLmVxKGYpfSxjLnByb3RvdHlwZS50bz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5nZXRJdGVtSW5kZXgodGhpcy4kYWN0aXZlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIikpO3JldHVybiBhPnRoaXMuJGl0ZW1zLmxlbmd0aC0xfHwwPmE/dm9pZCAwOnRoaXMuc2xpZGluZz90aGlzLiRlbGVtZW50Lm9uZSgic2xpZC5icy5jYXJvdXNlbCIsZnVuY3Rpb24oKXtiLnRvKGEpfSk6Yz09YT90aGlzLnBhdXNlKCkuY3ljbGUoKTp0aGlzLnNsaWRlKGE+Yz8ibmV4dCI6InByZXYiLHRoaXMuJGl0ZW1zLmVxKGEpKX0sYy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYil7cmV0dXJuIGJ8fCh0aGlzLnBhdXNlZD0hMCksdGhpcy4kZWxlbWVudC5maW5kKCIubmV4dCwgLnByZXYiKS5sZW5ndGgmJmEuc3VwcG9ydC50cmFuc2l0aW9uJiYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCksdGhpcy5jeWNsZSghMCkpLHRoaXMuaW50ZXJ2YWw9Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSx0aGlzfSxjLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgibmV4dCIpfSxjLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgicHJldiIpfSxjLnByb3RvdHlwZS5zbGlkZT1mdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIiksZj1kfHx0aGlzLmdldEl0ZW1Gb3JEaXJlY3Rpb24oYixlKSxnPXRoaXMuaW50ZXJ2YWwsaD0ibmV4dCI9PWI/ImxlZnQiOiJyaWdodCIsaT10aGlzO2lmKGYuaGFzQ2xhc3MoImFjdGl2ZSIpKXJldHVybiB0aGlzLnNsaWRpbmc9ITE7dmFyIGo9ZlswXSxrPWEuRXZlbnQoInNsaWRlLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGspLCFrLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtpZih0aGlzLnNsaWRpbmc9ITAsZyYmdGhpcy5wYXVzZSgpLHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKXt0aGlzLiRpbmRpY2F0b3JzLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7dmFyIGw9YSh0aGlzLiRpbmRpY2F0b3JzLmNoaWxkcmVuKClbdGhpcy5nZXRJdGVtSW5kZXgoZildKTtsJiZsLmFkZENsYXNzKCJhY3RpdmUiKX12YXIgbT1hLkV2ZW50KCJzbGlkLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJzbGlkZSIpPyhmLmFkZENsYXNzKGIpLGZbMF0ub2Zmc2V0V2lkdGgsZS5hZGRDbGFzcyhoKSxmLmFkZENsYXNzKGgpLGUub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcyhbYixoXS5qb2luKCIgIikpLmFkZENsYXNzKCJhY3RpdmUiKSxlLnJlbW92ZUNsYXNzKFsiYWN0aXZlIixoXS5qb2luKCIgIikpLGkuc2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS4kZWxlbWVudC50cmlnZ2VyKG0pfSwwKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikpOihlLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxmLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLnNsaWRpbmc9ITEsdGhpcy4kZWxlbWVudC50cmlnZ2VyKG0pKSxnJiZ0aGlzLmN5Y2xlKCksdGhpc319O3ZhciBkPWEuZm4uY2Fyb3VzZWw7YS5mbi5jYXJvdXNlbD1iLGEuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3I9YyxhLmZuLmNhcm91c2VsLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jYXJvdXNlbD1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe3ZhciBkLGU9YSh0aGlzKSxmPWEoZS5hdHRyKCJkYXRhLXRhcmdldCIpfHwoZD1lLmF0dHIoImhyZWYiKSkmJmQucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKSk7aWYoZi5oYXNDbGFzcygiY2Fyb3VzZWwiKSl7dmFyIGc9YS5leHRlbmQoe30sZi5kYXRhKCksZS5kYXRhKCkpLGg9ZS5hdHRyKCJkYXRhLXNsaWRlLXRvIik7aCYmKGcuaW50ZXJ2YWw9ITEpLGIuY2FsbChmLGcpLGgmJmYuZGF0YSgiYnMuY2Fyb3VzZWwiKS50byhoKSxjLnByZXZlbnREZWZhdWx0KCl9fTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0iLGUpLm9uKCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaSIsIltkYXRhLXNsaWRlLXRvXSIsZSksYSh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpe2EoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKTtiLmNhbGwoYyxjLmRhdGEoKSl9KX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXt2YXIgYyxkPWIuYXR0cigiZGF0YS10YXJnZXQiKXx8KGM9Yi5hdHRyKCJocmVmIikpJiZjLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik7cmV0dXJuIGEoZCl9ZnVuY3Rpb24gYyhiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxlPWMuZGF0YSgiYnMuY29sbGFwc2UiKSxmPWEuZXh0ZW5kKHt9LGQuREVGQVVMVFMsYy5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTshZSYmZi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoYikmJihmLnRvZ2dsZT0hMSksZXx8Yy5kYXRhKCJicy5jb2xsYXBzZSIsZT1uZXcgZCh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBkPWZ1bmN0aW9uKGIsYyl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxkLkRFRkFVTFRTLGMpLHRoaXMuJHRyaWdnZXI9YSgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2hyZWY9IiMnK2IuaWQrJyJdLFtkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXVtkYXRhLXRhcmdldD0iIycrYi5pZCsnIl0nKSx0aGlzLnRyYW5zaXRpb25pbmc9bnVsbCx0aGlzLm9wdGlvbnMucGFyZW50P3RoaXMuJHBhcmVudD10aGlzLmdldFBhcmVudCgpOnRoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuJGVsZW1lbnQsdGhpcy4kdHJpZ2dlciksdGhpcy5vcHRpb25zLnRvZ2dsZSYmdGhpcy50b2dnbGUoKX07ZC5WRVJTSU9OPSIzLjMuNSIsZC5UUkFOU0lUSU9OX0RVUkFUSU9OPTM1MCxkLkRFRkFVTFRTPXt0b2dnbGU6ITB9LGQucHJvdG90eXBlLmRpbWVuc2lvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoIndpZHRoIik7cmV0dXJuIGE/IndpZHRoIjoiaGVpZ2h0In0sZC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJiF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpKXt2YXIgYixlPXRoaXMuJHBhcmVudCYmdGhpcy4kcGFyZW50LmNoaWxkcmVuKCIucGFuZWwiKS5jaGlsZHJlbigiLmluLCAuY29sbGFwc2luZyIpO2lmKCEoZSYmZS5sZW5ndGgmJihiPWUuZGF0YSgiYnMuY29sbGFwc2UiKSxiJiZiLnRyYW5zaXRpb25pbmcpKSl7dmFyIGY9YS5FdmVudCgic2hvdy5icy5jb2xsYXBzZSIpO2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihmKSwhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7ZSYmZS5sZW5ndGgmJihjLmNhbGwoZSwiaGlkZSIpLGJ8fGUuZGF0YSgiYnMuY29sbGFwc2UiLG51bGwpKTt2YXIgZz10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKVtnXSgwKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksdGhpcy4kdHJpZ2dlci5yZW1vdmVDbGFzcygiY29sbGFwc2VkIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITApLHRoaXMudHJhbnNpdGlvbmluZz0xO3ZhciBoPWZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygiY29sbGFwc2luZyIpLmFkZENsYXNzKCJjb2xsYXBzZSBpbiIpW2ddKCIiKSx0aGlzLnRyYW5zaXRpb25pbmc9MCx0aGlzLiRlbGVtZW50LnRyaWdnZXIoInNob3duLmJzLmNvbGxhcHNlIil9O2lmKCFhLnN1cHBvcnQudHJhbnNpdGlvbilyZXR1cm4gaC5jYWxsKHRoaXMpO3ZhciBpPWEuY2FtZWxDYXNlKFsic2Nyb2xsIixnXS5qb2luKCItIikpO3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkoaCx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKVtnXSh0aGlzLiRlbGVtZW50WzBdW2ldKX19fX0sZC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIikpe3ZhciBiPWEuRXZlbnQoImhpZGUuYnMuY29sbGFwc2UiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksIWIuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBjPXRoaXMuZGltZW5zaW9uKCk7dGhpcy4kZWxlbWVudFtjXSh0aGlzLiRlbGVtZW50W2NdKCkpWzBdLm9mZnNldEhlaWdodCx0aGlzLiRlbGVtZW50LmFkZENsYXNzKCJjb2xsYXBzaW5nIikucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIGluIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLHRoaXMuJHRyaWdnZXIuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgZT1mdW5jdGlvbigpe3RoaXMudHJhbnNpdGlvbmluZz0wLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UiKS50cmlnZ2VyKCJoaWRkZW4uYnMuY29sbGFwc2UiKX07cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uP3ZvaWQgdGhpcy4kZWxlbWVudFtjXSgwKS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYS5wcm94eShlLHRoaXMpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChkLlRSQU5TSVRJT05fRFVSQVRJT04pOmUuY2FsbCh0aGlzKX19fSxkLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIik/ImhpZGUiOiJzaG93Il0oKX0sZC5wcm90b3R5cGUuZ2V0UGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5vcHRpb25zLnBhcmVudCkuZmluZCgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMub3B0aW9ucy5wYXJlbnQrJyJdJykuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGU9YShkKTt0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhiKGUpLGUpfSx0aGlzKSkuZW5kKCl9LGQucHJvdG90eXBlLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaGFzQ2xhc3MoImluIik7YS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKSxiLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQiLCFjKS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKX07dmFyIGU9YS5mbi5jb2xsYXBzZTthLmZuLmNvbGxhcHNlPWMsYS5mbi5jb2xsYXBzZS5Db25zdHJ1Y3Rvcj1kLGEuZm4uY29sbGFwc2Uubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmNvbGxhcHNlPWUsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxmdW5jdGlvbihkKXt2YXIgZT1hKHRoaXMpO2UuYXR0cigiZGF0YS10YXJnZXQiKXx8ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPWIoZSksZz1mLmRhdGEoImJzLmNvbGxhcHNlIiksaD1nPyJ0b2dnbGUiOmUuZGF0YSgpO2MuY2FsbChmLGgpfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3ZhciBjPWIuYXR0cigiZGF0YS10YXJnZXQiKTtjfHwoYz1iLmF0dHIoImhyZWYiKSxjPWMmJi8jW0EtWmEtel0vLnRlc3QoYykmJmMucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGQ9YyYmYShjKTtyZXR1cm4gZCYmZC5sZW5ndGg/ZDpiLnBhcmVudCgpfWZ1bmN0aW9uIGMoYyl7YyYmMz09PWMud2hpY2h8fChhKGUpLnJlbW92ZSgpLGEoZikuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1iKGQpLGY9e3JlbGF0ZWRUYXJnZXQ6dGhpc307ZS5oYXNDbGFzcygib3BlbiIpJiYoYyYmImNsaWNrIj09Yy50eXBlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpJiZhLmNvbnRhaW5zKGVbMF0sYy50YXJnZXQpfHwoZS50cmlnZ2VyKGM9YS5FdmVudCgiaGlkZS5icy5kcm9wZG93biIsZikpLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fChkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGUucmVtb3ZlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJoaWRkZW4uYnMuZHJvcGRvd24iLGYpKSkpfSkpfWZ1bmN0aW9uIGQoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoImJzLmRyb3Bkb3duIik7ZHx8Yy5kYXRhKCJicy5kcm9wZG93biIsZD1uZXcgZyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZkW2JdLmNhbGwoYyl9KX12YXIgZT0iLmRyb3Bkb3duLWJhY2tkcm9wIixmPSdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nLGc9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2suYnMuZHJvcGRvd24iLHRoaXMudG9nZ2xlKX07Zy5WRVJTSU9OPSIzLjMuNSIsZy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7aWYoIWUuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpe3ZhciBmPWIoZSksZz1mLmhhc0NsYXNzKCJvcGVuIik7aWYoYygpLCFnKXsib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIWYuY2xvc2VzdCgiLm5hdmJhci1uYXYiKS5sZW5ndGgmJmEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmFkZENsYXNzKCJkcm9wZG93bi1iYWNrZHJvcCIpLmluc2VydEFmdGVyKGEodGhpcykpLm9uKCJjbGljayIsYyk7dmFyIGg9e3JlbGF0ZWRUYXJnZXQ6dGhpc307aWYoZi50cmlnZ2VyKGQ9YS5FdmVudCgic2hvdy5icy5kcm9wZG93biIsaCkpLGQuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2UudHJpZ2dlcigiZm9jdXMiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLGYudG9nZ2xlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJzaG93bi5icy5kcm9wZG93biIsaCl9cmV0dXJuITF9fSxnLnByb3RvdHlwZS5rZXlkb3duPWZ1bmN0aW9uKGMpe2lmKC8oMzh8NDB8Mjd8MzIpLy50ZXN0KGMud2hpY2gpJiYhL2lucHV0fHRleHRhcmVhL2kudGVzdChjLnRhcmdldC50YWdOYW1lKSl7dmFyIGQ9YSh0aGlzKTtpZihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSwhZC5pcygiLmRpc2FibGVkLCA6ZGlzYWJsZWQiKSl7dmFyIGU9YihkKSxnPWUuaGFzQ2xhc3MoIm9wZW4iKTtpZighZyYmMjchPWMud2hpY2h8fGcmJjI3PT1jLndoaWNoKXJldHVybiAyNz09Yy53aGljaCYmZS5maW5kKGYpLnRyaWdnZXIoImZvY3VzIiksZC50cmlnZ2VyKCJjbGljayIpO3ZhciBoPSIgbGk6bm90KC5kaXNhYmxlZCk6dmlzaWJsZSBhIixpPWUuZmluZCgiLmRyb3Bkb3duLW1lbnUiK2gpO2lmKGkubGVuZ3RoKXt2YXIgaj1pLmluZGV4KGMudGFyZ2V0KTszOD09Yy53aGljaCYmaj4wJiZqLS0sNDA9PWMud2hpY2gmJmo8aS5sZW5ndGgtMSYmaisrLH5qfHwoaj0wKSxpLmVxKGopLnRyaWdnZXIoImZvY3VzIil9fX19O3ZhciBoPWEuZm4uZHJvcGRvd247YS5mbi5kcm9wZG93bj1kLGEuZm4uZHJvcGRvd24uQ29uc3RydWN0b3I9ZyxhLmZuLmRyb3Bkb3duLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5kcm9wZG93bj1oLHRoaXN9LGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsYykub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLGYsZy5wcm90b3R5cGUudG9nZ2xlKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsZixnLnByb3RvdHlwZS5rZXlkb3duKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsIi5kcm9wZG93bi1tZW51IixnLnByb3RvdHlwZS5rZXlkb3duKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYixkKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxmPWUuZGF0YSgiYnMubW9kYWwiKSxnPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZS5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTtmfHxlLmRhdGEoImJzLm1vZGFsIixmPW5ldyBjKHRoaXMsZykpLCJzdHJpbmciPT10eXBlb2YgYj9mW2JdKGQpOmcuc2hvdyYmZi5zaG93KGQpfSl9dmFyIGM9ZnVuY3Rpb24oYixjKXt0aGlzLm9wdGlvbnM9Yyx0aGlzLiRib2R5PWEoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxjLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3coYSl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcyxlPWEuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSksdGhpcy5pc1Nob3dufHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLGEucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmlzKGQuJGVsZW1lbnQpJiYoZC5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBlPWEuc3VwcG9ydC50cmFuc2l0aW9uJiZkLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7ZC4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fGQuJGVsZW1lbnQuYXBwZW5kVG8oZC4kYm9keSksZC4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLGQuYWRqdXN0RGlhbG9nKCksZSYmZC4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxkLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLGQuZW5mb3JjZUZvY3VzKCk7dmFyIGY9YS5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTtlP2QuJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtkLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihmKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZC4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIoZil9KSl9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7YiYmYi5wcmV2ZW50RGVmYXVsdCgpLGI9YS5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihiKSx0aGlzLmlzU2hvd24mJiFiLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSxhKGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGMucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMuJGVsZW1lbnRbMF09PT1hLnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXMoYS50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGMucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsYS5wcm94eShmdW5jdGlvbihhKXsyNz09YS53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP2Eod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIixhLnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTphKHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7YS4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLGEucmVzZXRBZGp1c3RtZW50cygpLGEucmVzZXRTY3JvbGxiYXIoKSxhLiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGMucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGMucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMsZT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgZj1hLnN1cHBvcnQudHJhbnNpdGlvbiYmZTtpZih0aGlzLiRiYWNrZHJvcD1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIitlKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQoYS50YXJnZXQ9PT1hLmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSksZiYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWIpcmV0dXJuO2Y/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6YigpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciBnPWZ1bmN0aW9uKCl7ZC5yZW1vdmVCYWNrZHJvcCgpLGImJmIoKX07YS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpnKCl9ZWxzZSBiJiZiKCl9LGMucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGMucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiFhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0sYy5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0sYy5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuaW5uZXJXaWR0aDtpZighYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9Yi5yaWdodC1NYXRoLmFicyhiLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDxhLHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGMucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIix0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsYSt0aGlzLnNjcm9sbGJhcldpZHRoKX0sYy5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsdGhpcy5vcmlnaW5hbEJvZHlQYWQpfSxjLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5jbGFzc05hbWU9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIix0aGlzLiRib2R5LmFwcGVuZChhKTt2YXIgYj1hLm9mZnNldFdpZHRoLWEuY2xpZW50V2lkdGg7cmV0dXJuIHRoaXMuJGJvZHlbMF0ucmVtb3ZlQ2hpbGQoYSksYn07dmFyIGQ9YS5mbi5tb2RhbDthLmZuLm1vZGFsPWIsYS5mbi5tb2RhbC5Db25zdHJ1Y3Rvcj1jLGEuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLm1vZGFsPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLGU9ZC5hdHRyKCJocmVmIiksZj1hKGQuYXR0cigiZGF0YS10YXJnZXQiKXx8ZSYmZS5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpKSxnPWYuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjphLmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChlKSYmZX0sZi5kYXRhKCksZC5kYXRhKCkpO2QuaXMoImEiKSYmYy5wcmV2ZW50RGVmYXVsdCgpLGYub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbihhKXthLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuaXMoIjp2aXNpYmxlIikmJmQudHJpZ2dlcigiZm9jdXMiKX0pfSksYi5jYWxsKGYsZyx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMudG9vbHRpcCIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnRvb2x0aXAiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9bnVsbCx0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLmVuYWJsZWQ9bnVsbCx0aGlzLnRpbWVvdXQ9bnVsbCx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy5pblN0YXRlPW51bGwsdGhpcy5pbml0KCJ0b29sdGlwIixhLGIpfTtjLlZFUlNJT049IjMuMy41IixjLlRSQU5TSVRJT05fRFVSQVRJT049MTUwLGMuREVGQVVMVFM9e2FuaW1hdGlvbjohMCxwbGFjZW1lbnQ6InRvcCIsc2VsZWN0b3I6ITEsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InRvb2x0aXAiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9InRvb2x0aXAtYXJyb3ciPjwvZGl2PjxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PjwvZGl2PicsdHJpZ2dlcjoiaG92ZXIgZm9jdXMiLHRpdGxlOiIiLGRlbGF5OjAsaHRtbDohMSxjb250YWluZXI6ITEsdmlld3BvcnQ6e3NlbGVjdG9yOiJib2R5IixwYWRkaW5nOjB9fSxjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIsYyxkKXtpZih0aGlzLmVuYWJsZWQ9ITAsdGhpcy50eXBlPWIsdGhpcy4kZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz10aGlzLmdldE9wdGlvbnMoZCksdGhpcy4kdmlld3BvcnQ9dGhpcy5vcHRpb25zLnZpZXdwb3J0JiZhKGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmlld3BvcnQpP3RoaXMub3B0aW9ucy52aWV3cG9ydC5jYWxsKHRoaXMsdGhpcy4kZWxlbWVudCk6dGhpcy5vcHRpb25zLnZpZXdwb3J0LnNlbGVjdG9yfHx0aGlzLm9wdGlvbnMudmlld3BvcnQpLHRoaXMuaW5TdGF0ZT17Y2xpY2s6ITEsaG92ZXI6ITEsZm9jdXM6ITF9LHRoaXMuJGVsZW1lbnRbMF1pbnN0YW5jZW9mIGRvY3VtZW50LmNvbnN0cnVjdG9yJiYhdGhpcy5vcHRpb25zLnNlbGVjdG9yKXRocm93IG5ldyBFcnJvcigiYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgIit0aGlzLnR5cGUrIiBvbiB0aGUgd2luZG93LmRvY3VtZW50IG9iamVjdCEiKTtmb3IodmFyIGU9dGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoIiAiKSxmPWUubGVuZ3RoO2YtLTspe3ZhciBnPWVbZl07aWYoImNsaWNrIj09Zyl0aGlzLiRlbGVtZW50Lm9uKCJjbGljay4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLnRvZ2dsZSx0aGlzKSk7ZWxzZSBpZigibWFudWFsIiE9Zyl7dmFyIGg9ImhvdmVyIj09Zz8ibW91c2VlbnRlciI6ImZvY3VzaW4iLGk9ImhvdmVyIj09Zz8ibW91c2VsZWF2ZSI6ImZvY3Vzb3V0Ijt0aGlzLiRlbGVtZW50Lm9uKGgrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmVudGVyLHRoaXMpKSx0aGlzLiRlbGVtZW50Lm9uKGkrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmxlYXZlLHRoaXMpKX19dGhpcy5vcHRpb25zLnNlbGVjdG9yP3RoaXMuX29wdGlvbnM9YS5leHRlbmQoe30sdGhpcy5vcHRpb25zLHt0cmlnZ2VyOiJtYW51YWwiLHNlbGVjdG9yOiIifSk6dGhpcy5maXhUaXRsZSgpfSxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5nZXRPcHRpb25zPWZ1bmN0aW9uKGIpe3JldHVybiBiPWEuZXh0ZW5kKHt9LHRoaXMuZ2V0RGVmYXVsdHMoKSx0aGlzLiRlbGVtZW50LmRhdGEoKSxiKSxiLmRlbGF5JiYibnVtYmVyIj09dHlwZW9mIGIuZGVsYXkmJihiLmRlbGF5PXtzaG93OmIuZGVsYXksaGlkZTpiLmRlbGF5fSksYn0sYy5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz10aGlzLmdldERlZmF1bHRzKCk7cmV0dXJuIHRoaXMuX29wdGlvbnMmJmEuZWFjaCh0aGlzLl9vcHRpb25zLGZ1bmN0aW9uKGEsZCl7Y1thXSE9ZCYmKGJbYV09ZCl9KSxifSxjLnByb3RvdHlwZS5lbnRlcj1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGN8fChjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGIuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSxhKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsYykpLGIgaW5zdGFuY2VvZiBhLkV2ZW50JiYoYy5pblN0YXRlWyJmb2N1c2luIj09Yi50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITApLGMudGlwKCkuaGFzQ2xhc3MoImluIil8fCJpbiI9PWMuaG92ZXJTdGF0ZT92b2lkKGMuaG92ZXJTdGF0ZT0iaW4iKTooY2xlYXJUaW1lb3V0KGMudGltZW91dCksYy5ob3ZlclN0YXRlPSJpbiIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuc2hvdz92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ImluIj09Yy5ob3ZlclN0YXRlJiZjLnNob3coKX0sYy5vcHRpb25zLmRlbGF5LnNob3cpKTpjLnNob3coKSl9LGMucHJvdG90eXBlLmlzSW5TdGF0ZVRydWU9ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gdGhpcy5pblN0YXRlKWlmKHRoaXMuaW5TdGF0ZVthXSlyZXR1cm4hMDtyZXR1cm4hMX0sYy5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7dmFyIGM9YiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YjphKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUpO3JldHVybiBjfHwoYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlLGMpKSxiIGluc3RhbmNlb2YgYS5FdmVudCYmKGMuaW5TdGF0ZVsiZm9jdXNvdXQiPT1iLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMSksYy5pc0luU3RhdGVUcnVlKCk/dm9pZCAwOihjbGVhclRpbWVvdXQoYy50aW1lb3V0KSxjLmhvdmVyU3RhdGU9Im91dCIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuaGlkZT92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Im91dCI9PWMuaG92ZXJTdGF0ZSYmYy5oaWRlKCl9LGMub3B0aW9ucy5kZWxheS5oaWRlKSk6Yy5oaWRlKCkpfSxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9YS5FdmVudCgic2hvdy5icy4iK3RoaXMudHlwZSk7aWYodGhpcy5oYXNDb250ZW50KCkmJnRoaXMuZW5hYmxlZCl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpO3ZhciBkPWEuY29udGFpbnModGhpcy4kZWxlbWVudFswXS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0aGlzLiRlbGVtZW50WzBdKTtpZihiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwhZClyZXR1cm47dmFyIGU9dGhpcyxmPXRoaXMudGlwKCksZz10aGlzLmdldFVJRCh0aGlzLnR5cGUpO3RoaXMuc2V0Q29udGVudCgpLGYuYXR0cigiaWQiLGcpLHRoaXMuJGVsZW1lbnQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsZyksdGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmZi5hZGRDbGFzcygiZmFkZSIpO3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50P3RoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLGZbMF0sdGhpcy4kZWxlbWVudFswXSk6dGhpcy5vcHRpb25zLnBsYWNlbWVudCxpPS9ccz9hdXRvP1xzPy9pLGo9aS50ZXN0KGgpO2omJihoPWgucmVwbGFjZShpLCIiKXx8InRvcCIpLGYuZGV0YWNoKCkuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheToiYmxvY2sifSkuYWRkQ2xhc3MoaCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsdGhpcyksdGhpcy5vcHRpb25zLmNvbnRhaW5lcj9mLmFwcGVuZFRvKHRoaXMub3B0aW9ucy5jb250YWluZXIpOmYuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKCJpbnNlcnRlZC5icy4iK3RoaXMudHlwZSk7dmFyIGs9dGhpcy5nZXRQb3NpdGlvbigpLGw9ZlswXS5vZmZzZXRXaWR0aCxtPWZbMF0ub2Zmc2V0SGVpZ2h0O2lmKGope3ZhciBuPWgsbz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtoPSJib3R0b20iPT1oJiZrLmJvdHRvbSttPm8uYm90dG9tPyJ0b3AiOiJ0b3AiPT1oJiZrLnRvcC1tPG8udG9wPyJib3R0b20iOiJyaWdodCI9PWgmJmsucmlnaHQrbD5vLndpZHRoPyJsZWZ0IjoibGVmdCI9PWgmJmsubGVmdC1sPG8ubGVmdD8icmlnaHQiOmgsZi5yZW1vdmVDbGFzcyhuKS5hZGRDbGFzcyhoKX12YXIgcD10aGlzLmdldENhbGN1bGF0ZWRPZmZzZXQoaCxrLGwsbSk7dGhpcy5hcHBseVBsYWNlbWVudChwLGgpO3ZhciBxPWZ1bmN0aW9uKCl7dmFyIGE9ZS5ob3ZlclN0YXRlO2UuJGVsZW1lbnQudHJpZ2dlcigic2hvd24uYnMuIitlLnR5cGUpLGUuaG92ZXJTdGF0ZT1udWxsLCJvdXQiPT1hJiZlLmxlYXZlKGUpfTthLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kdGlwLmhhc0NsYXNzKCJmYWRlIik/Zi5vbmUoImJzVHJhbnNpdGlvbkVuZCIscSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKTpxKCl9fSxjLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudD1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMudGlwKCksZT1kWzBdLm9mZnNldFdpZHRoLGY9ZFswXS5vZmZzZXRIZWlnaHQsZz1wYXJzZUludChkLmNzcygibWFyZ2luLXRvcCIpLDEwKSxoPXBhcnNlSW50KGQuY3NzKCJtYXJnaW4tbGVmdCIpLDEwKTtpc05hTihnKSYmKGc9MCksaXNOYU4oaCkmJihoPTApLGIudG9wKz1nLGIubGVmdCs9aCxhLm9mZnNldC5zZXRPZmZzZXQoZFswXSxhLmV4dGVuZCh7dXNpbmc6ZnVuY3Rpb24oYSl7ZC5jc3Moe3RvcDpNYXRoLnJvdW5kKGEudG9wKSxsZWZ0Ok1hdGgucm91bmQoYS5sZWZ0KX0pfX0sYiksMCksZC5hZGRDbGFzcygiaW4iKTt2YXIgaT1kWzBdLm9mZnNldFdpZHRoLGo9ZFswXS5vZmZzZXRIZWlnaHQ7InRvcCI9PWMmJmohPWYmJihiLnRvcD1iLnRvcCtmLWopO3ZhciBrPXRoaXMuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhKGMsYixpLGopO2subGVmdD9iLmxlZnQrPWsubGVmdDpiLnRvcCs9ay50b3A7dmFyIGw9L3RvcHxib3R0b20vLnRlc3QoYyksbT1sPzIqay5sZWZ0LWUraToyKmsudG9wLWYraixuPWw/Im9mZnNldFdpZHRoIjoib2Zmc2V0SGVpZ2h0IjtkLm9mZnNldChiKSx0aGlzLnJlcGxhY2VBcnJvdyhtLGRbMF1bbl0sbCl9LGMucHJvdG90eXBlLnJlcGxhY2VBcnJvdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5hcnJvdygpLmNzcyhjPyJsZWZ0IjoidG9wIiw1MCooMS1hL2IpKyIlIikuY3NzKGM/InRvcCI6ImxlZnQiLCIiKX0sYy5wcm90b3R5cGUuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMudGlwKCksYj10aGlzLmdldFRpdGxlKCk7YS5maW5kKCIudG9vbHRpcC1pbm5lciIpW3RoaXMub3B0aW9ucy5odG1sPyJodG1sIjoidGV4dCJdKGIpLGEucmVtb3ZlQ2xhc3MoImZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0Iil9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpeyJpbiIhPWUuaG92ZXJTdGF0ZSYmZi5kZXRhY2goKSxlLiRlbGVtZW50LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKS50cmlnZ2VyKCJoaWRkZW4uYnMuIitlLnR5cGUpLGImJmIoKX12YXIgZT10aGlzLGY9YSh0aGlzLiR0aXApLGc9YS5FdmVudCgiaGlkZS5icy4iK3RoaXMudHlwZSk7cmV0dXJuIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihnKSxnLmlzRGVmYXVsdFByZXZlbnRlZCgpP3ZvaWQgMDooZi5yZW1vdmVDbGFzcygiaW4iKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmZi5oYXNDbGFzcygiZmFkZSIpP2Yub25lKCJic1RyYW5zaXRpb25FbmQiLGQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZCgpLHRoaXMuaG92ZXJTdGF0ZT1udWxsLHRoaXMpfSxjLnByb3RvdHlwZS5maXhUaXRsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQ7KGEuYXR0cigidGl0bGUiKXx8InN0cmluZyIhPXR5cGVvZiBhLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKSkmJmEuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsYS5hdHRyKCJ0aXRsZSIpfHwiIikuYXR0cigidGl0bGUiLCIiKX0sYy5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl9LGMucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy4kZWxlbWVudDt2YXIgYz1iWzBdLGQ9IkJPRFkiPT1jLnRhZ05hbWUsZT1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO251bGw9PWUud2lkdGgmJihlPWEuZXh0ZW5kKHt9LGUse3dpZHRoOmUucmlnaHQtZS5sZWZ0LGhlaWdodDplLmJvdHRvbS1lLnRvcH0pKTt2YXIgZj1kP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCksZz17c2Nyb2xsOmQ/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6Yi5zY3JvbGxUb3AoKX0saD1kP3t3aWR0aDphKHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6YSh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiBhLmV4dGVuZCh7fSxlLGcsaCxmKX0sYy5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4iYm90dG9tIj09YT97dG9wOmIudG9wK2IuaGVpZ2h0LGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OiJ0b3AiPT1hP3t0b3A6Yi50b3AtZCxsZWZ0OmIubGVmdCtiLndpZHRoLzItYy8yfToibGVmdCI9PWE/e3RvcDpiLnRvcCtiLmhlaWdodC8yLWQvMixsZWZ0OmIubGVmdC1jfTp7dG9wOmIudG9wK2IuaGVpZ2h0LzItZC8yLGxlZnQ6Yi5sZWZ0K2Iud2lkdGh9fSxjLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBlO3ZhciBmPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAsZz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdChhKSl7dmFyIGg9Yi50b3AtZi1nLnNjcm9sbCxpPWIudG9wK2YtZy5zY3JvbGwrZDtoPGcudG9wP2UudG9wPWcudG9wLWg6aT5nLnRvcCtnLmhlaWdodCYmKGUudG9wPWcudG9wK2cuaGVpZ2h0LWkpfWVsc2V7dmFyIGo9Yi5sZWZ0LWYsaz1iLmxlZnQrZitjO2o8Zy5sZWZ0P2UubGVmdD1nLmxlZnQtajprPmcucmlnaHQmJihlLmxlZnQ9Zy5sZWZ0K2cud2lkdGgtayl9cmV0dXJuIGV9LGMucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLiRlbGVtZW50LGM9dGhpcy5vcHRpb25zO3JldHVybiBhPWIuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGMudGl0bGU/Yy50aXRsZS5jYWxsKGJbMF0pOmMudGl0bGUpfSxjLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24oYSl7ZG8gYSs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTtyZXR1cm4gYX0sYy5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD1hKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0sYy5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0sYy5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxjLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxjLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LGMucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihiKXt2YXIgYz10aGlzO2ImJihjPWEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksY3x8KGM9bmV3IHRoaXMuY29uc3RydWN0b3IoYi5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxjKSkpLGI/KGMuaW5TdGF0ZS5jbGljaz0hYy5pblN0YXRlLmNsaWNrLGMuaXNJblN0YXRlVHJ1ZSgpP2MuZW50ZXIoYyk6Yy5sZWF2ZShjKSk6Yy50aXAoKS5oYXNDbGFzcygiaW4iKT9jLmxlYXZlKGMpOmMuZW50ZXIoYyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe2EuJGVsZW1lbnQub2ZmKCIuIithLnR5cGUpLnJlbW92ZURhdGEoImJzLiIrYS50eXBlKSxhLiR0aXAmJmEuJHRpcC5kZXRhY2goKSxhLiR0aXA9bnVsbCxhLiRhcnJvdz1udWxsLGEuJHZpZXdwb3J0PW51bGx9KX07dmFyIGQ9YS5mbi50b29sdGlwO2EuZm4udG9vbHRpcD1iLGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvcj1jLGEuZm4udG9vbHRpcC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udG9vbHRpcD1kLHRoaXN9fShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMucG9wb3ZlciIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnBvcG92ZXIiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLmluaXQoInBvcG92ZXIiLGEsYil9O2lmKCFhLmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtjLlZFUlNJT049IjMuMy41IixjLkRFRkFVTFRTPWEuZXh0ZW5kKHt9LGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksYy5wcm90b3R5cGU9YS5leHRlbmQoe30sYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aXAoKSxiPXRoaXMuZ2V0VGl0bGUoKSxjPXRoaXMuZ2V0Q29udGVudCgpO2EuZmluZCgiLnBvcG92ZXItdGl0bGUiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXShiKSxhLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpW3RoaXMub3B0aW9ucy5odG1sPyJzdHJpbmciPT10eXBlb2YgYz8iaHRtbCI6ImFwcGVuZCI6InRleHQiXShjKSxhLnJlbW92ZUNsYXNzKCJmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbiIpLGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5odG1sKCl8fGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5oaWRlKCl9LGMucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfHx0aGlzLmdldENvbnRlbnQoKX0sYy5wcm90b3R5cGUuZ2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQsYj10aGlzLm9wdGlvbnM7cmV0dXJuIGEuYXR0cigiZGF0YS1jb250ZW50Iil8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5jb250ZW50P2IuY29udGVudC5jYWxsKGFbMF0pOmIuY29udGVudCl9LGMucHJvdG90eXBlLmFycm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFycm93PXRoaXMuJGFycm93fHx0aGlzLnRpcCgpLmZpbmQoIi5hcnJvdyIpfTt2YXIgZD1hLmZuLnBvcG92ZXI7YS5mbi5wb3BvdmVyPWIsYS5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yPWMsYS5mbi5wb3BvdmVyLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5wb3BvdmVyPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGMsZCl7dGhpcy4kYm9keT1hKGRvY3VtZW50LmJvZHkpLHRoaXMuJHNjcm9sbEVsZW1lbnQ9YShhKGMpLmlzKGRvY3VtZW50LmJvZHkpP3dpbmRvdzpjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkKSx0aGlzLnNlbGVjdG9yPSh0aGlzLm9wdGlvbnMudGFyZ2V0fHwiIikrIiAubmF2IGxpID4gYSIsdGhpcy5vZmZzZXRzPVtdLHRoaXMudGFyZ2V0cz1bXSx0aGlzLmFjdGl2ZVRhcmdldD1udWxsLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdGhpcy4kc2Nyb2xsRWxlbWVudC5vbigic2Nyb2xsLmJzLnNjcm9sbHNweSIsYS5wcm94eSh0aGlzLnByb2Nlc3MsdGhpcykpLHRoaXMucmVmcmVzaCgpLHRoaXMucHJvY2VzcygpfWZ1bmN0aW9uIGMoYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLnNjcm9sbHNweSIpLGY9Im9iamVjdCI9PXR5cGVvZiBjJiZjO2V8fGQuZGF0YSgiYnMuc2Nyb2xsc3B5IixlPW5ldyBiKHRoaXMsZikpLCJzdHJpbmciPT10eXBlb2YgYyYmZVtjXSgpfSl9Yi5WRVJTSU9OPSIzLjMuNSIsYi5ERUZBVUxUUz17b2Zmc2V0OjEwfSxiLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHR8fE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpfSxiLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPSJvZmZzZXQiLGQ9MDt0aGlzLm9mZnNldHM9W10sdGhpcy50YXJnZXRzPVtdLHRoaXMuc2Nyb2xsSGVpZ2h0PXRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCksYS5pc1dpbmRvdyh0aGlzLiRzY3JvbGxFbGVtZW50WzBdKXx8KGM9InBvc2l0aW9uIixkPXRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkpLHRoaXMuJGJvZHkuZmluZCh0aGlzLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGU9Yi5kYXRhKCJ0YXJnZXQiKXx8Yi5hdHRyKCJocmVmIiksZj0vXiMuLy50ZXN0KGUpJiZhKGUpO3JldHVybiBmJiZmLmxlbmd0aCYmZi5pcygiOnZpc2libGUiKSYmW1tmW2NdKCkudG9wK2QsZV1dfHxudWxsfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLWJbMF19KS5lYWNoKGZ1bmN0aW9uKCl7Yi5vZmZzZXRzLnB1c2godGhpc1swXSksYi50YXJnZXRzLnB1c2godGhpc1sxXSl9KX0sYi5wcm90b3R5cGUucHJvY2Vzcz1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSt0aGlzLm9wdGlvbnMub2Zmc2V0LGM9dGhpcy5nZXRTY3JvbGxIZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQrYy10aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpLGU9dGhpcy5vZmZzZXRzLGY9dGhpcy50YXJnZXRzLGc9dGhpcy5hY3RpdmVUYXJnZXQ7aWYodGhpcy5zY3JvbGxIZWlnaHQhPWMmJnRoaXMucmVmcmVzaCgpLGI+PWQpcmV0dXJuIGchPShhPWZbZi5sZW5ndGgtMV0pJiZ0aGlzLmFjdGl2YXRlKGEpO2lmKGcmJmI8ZVswXSlyZXR1cm4gdGhpcy5hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLmNsZWFyKCk7Zm9yKGE9ZS5sZW5ndGg7YS0tOylnIT1mW2FdJiZiPj1lW2FdJiYodm9pZCAwPT09ZVthKzFdfHxiPGVbYSsxXSkmJnRoaXMuYWN0aXZhdGUoZlthXSl9LGIucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKGIpe3RoaXMuYWN0aXZlVGFyZ2V0PWIsdGhpcy5jbGVhcigpO3ZhciBjPXRoaXMuc2VsZWN0b3IrJ1tkYXRhLXRhcmdldD0iJytiKyciXSwnK3RoaXMuc2VsZWN0b3IrJ1tocmVmPSInK2IrJyJdJyxkPWEoYykucGFyZW50cygibGkiKS5hZGRDbGFzcygiYWN0aXZlIik7ZC5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiYoZD1kLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpKSwKZC50cmlnZ2VyKCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiKX0sYi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXthKHRoaXMuc2VsZWN0b3IpLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfTt2YXIgZD1hLmZuLnNjcm9sbHNweTthLmZuLnNjcm9sbHNweT1jLGEuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yPWIsYS5mbi5zY3JvbGxzcHkubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnNjcm9sbHNweT1kLHRoaXN9LGEod2luZG93KS5vbigibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJzY3JvbGwiXScpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2MuY2FsbChiLGIuZGF0YSgpKX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy50YWIiKTtlfHxkLmRhdGEoImJzLnRhYiIsZT1uZXcgYyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCl9KX12YXIgYz1mdW5jdGlvbihiKXt0aGlzLmVsZW1lbnQ9YShiKX07Yy5WRVJTSU9OPSIzLjMuNSIsYy5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9Yi5jbG9zZXN0KCJ1bDpub3QoLmRyb3Bkb3duLW1lbnUpIiksZD1iLmRhdGEoInRhcmdldCIpO2lmKGR8fChkPWIuYXR0cigiaHJlZiIpLGQ9ZCYmZC5yZXBsYWNlKC8uKig/PSNbXlxzXSokKS8sIiIpKSwhYi5wYXJlbnQoImxpIikuaGFzQ2xhc3MoImFjdGl2ZSIpKXt2YXIgZT1jLmZpbmQoIi5hY3RpdmU6bGFzdCBhIiksZj1hLkV2ZW50KCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6YlswXX0pLGc9YS5FdmVudCgic2hvdy5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OmVbMF19KTtpZihlLnRyaWdnZXIoZiksYi50cmlnZ2VyKGcpLCFnLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGg9YShkKTt0aGlzLmFjdGl2YXRlKGIuY2xvc2VzdCgibGkiKSxjKSx0aGlzLmFjdGl2YXRlKGgsaC5wYXJlbnQoKSxmdW5jdGlvbigpe2UudHJpZ2dlcih7dHlwZToiaGlkZGVuLmJzLnRhYiIscmVsYXRlZFRhcmdldDpiWzBdfSksYi50cmlnZ2VyKHt0eXBlOiJzaG93bi5icy50YWIiLHJlbGF0ZWRUYXJnZXQ6ZVswXX0pfSl9fX0sYy5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oYixkLGUpe2Z1bmN0aW9uIGYoKXtnLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5maW5kKCI+IC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5lbmQoKS5maW5kKCdbZGF0YS10b2dnbGU9InRhYiJdJykuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLGIuYWRkQ2xhc3MoImFjdGl2ZSIpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksaD8oYlswXS5vZmZzZXRXaWR0aCxiLmFkZENsYXNzKCJpbiIpKTpiLnJlbW92ZUNsYXNzKCJmYWRlIiksYi5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiZiLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpLmVuZCgpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksZSYmZSgpfXZhciBnPWQuZmluZCgiPiAuYWN0aXZlIiksaD1lJiZhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGcubGVuZ3RoJiZnLmhhc0NsYXNzKCJmYWRlIil8fCEhZC5maW5kKCI+IC5mYWRlIikubGVuZ3RoKTtnLmxlbmd0aCYmaD9nLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixmKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOmYoKSxnLnJlbW92ZUNsYXNzKCJpbiIpfTt2YXIgZD1hLmZuLnRhYjthLmZuLnRhYj1iLGEuZm4udGFiLkNvbnN0cnVjdG9yPWMsYS5mbi50YWIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnRhYj1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe2MucHJldmVudERlZmF1bHQoKSxiLmNhbGwoYSh0aGlzKSwic2hvdyIpfTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXScsZSkub24oImNsaWNrLmJzLnRhYi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0icGlsbCJdJyxlKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmFmZml4IiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5hZmZpeCIsZT1uZXcgYyh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBjPWZ1bmN0aW9uKGIsZCl7dGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy4kdGFyZ2V0PWEodGhpcy5vcHRpb25zLnRhcmdldCkub24oInNjcm9sbC5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcykpLm9uKCJjbGljay5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wLHRoaXMpKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5hZmZpeGVkPW51bGwsdGhpcy51bnBpbj1udWxsLHRoaXMucGlubmVkT2Zmc2V0PW51bGwsdGhpcy5jaGVja1Bvc2l0aW9uKCl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuUkVTRVQ9ImFmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20iLGMuREVGQVVMVFM9e29mZnNldDowLHRhcmdldDp3aW5kb3d9LGMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKSxmPXRoaXMuJGVsZW1lbnQub2Zmc2V0KCksZz10aGlzLiR0YXJnZXQuaGVpZ2h0KCk7aWYobnVsbCE9YyYmInRvcCI9PXRoaXMuYWZmaXhlZClyZXR1cm4gYz5lPyJ0b3AiOiExO2lmKCJib3R0b20iPT10aGlzLmFmZml4ZWQpcmV0dXJuIG51bGwhPWM/ZSt0aGlzLnVucGluPD1mLnRvcD8hMToiYm90dG9tIjphLWQ+PWUrZz8hMToiYm90dG9tIjt2YXIgaD1udWxsPT10aGlzLmFmZml4ZWQsaT1oP2U6Zi50b3Asaj1oP2c6YjtyZXR1cm4gbnVsbCE9YyYmYz49ZT8idG9wIjpudWxsIT1kJiZpK2o+PWEtZD8iYm90dG9tIjohMX0sYy5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5waW5uZWRPZmZzZXQpcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0O3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoImFmZml4Iik7dmFyIGE9dGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpLGI9dGhpcy4kZWxlbWVudC5vZmZzZXQoKTtyZXR1cm4gdGhpcy5waW5uZWRPZmZzZXQ9Yi50b3AtYX0sYy5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3A9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpLDEpfSxjLnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kZWxlbWVudC5pcygiOnZpc2libGUiKSl7dmFyIGI9dGhpcy4kZWxlbWVudC5oZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQsZT1kLnRvcCxmPWQuYm90dG9tLGc9TWF0aC5tYXgoYShkb2N1bWVudCkuaGVpZ2h0KCksYShkb2N1bWVudC5ib2R5KS5oZWlnaHQoKSk7Im9iamVjdCIhPXR5cGVvZiBkJiYoZj1lPWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1kLnRvcCh0aGlzLiRlbGVtZW50KSksImZ1bmN0aW9uIj09dHlwZW9mIGYmJihmPWQuYm90dG9tKHRoaXMuJGVsZW1lbnQpKTt2YXIgaD10aGlzLmdldFN0YXRlKGcsYixlLGYpO2lmKHRoaXMuYWZmaXhlZCE9aCl7bnVsbCE9dGhpcy51bnBpbiYmdGhpcy4kZWxlbWVudC5jc3MoInRvcCIsIiIpO3ZhciBpPSJhZmZpeCIrKGg/Ii0iK2g6IiIpLGo9YS5FdmVudChpKyIuYnMuYWZmaXgiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoaiksai5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47dGhpcy5hZmZpeGVkPWgsdGhpcy51bnBpbj0iYm90dG9tIj09aD90aGlzLmdldFBpbm5lZE9mZnNldCgpOm51bGwsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhjLlJFU0VUKS5hZGRDbGFzcyhpKS50cmlnZ2VyKGkucmVwbGFjZSgiYWZmaXgiLCJhZmZpeGVkIikrIi5icy5hZmZpeCIpfSJib3R0b20iPT1oJiZ0aGlzLiRlbGVtZW50Lm9mZnNldCh7dG9wOmctYi1mfSl9fTt2YXIgZD1hLmZuLmFmZml4O2EuZm4uYWZmaXg9YixhLmZuLmFmZml4LkNvbnN0cnVjdG9yPWMsYS5mbi5hZmZpeC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWZmaXg9ZCx0aGlzfSxhKHdpbmRvdykub24oImxvYWQiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJhZmZpeCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoKTtkLm9mZnNldD1kLm9mZnNldHx8e30sbnVsbCE9ZC5vZmZzZXRCb3R0b20mJihkLm9mZnNldC5ib3R0b209ZC5vZmZzZXRCb3R0b20pLG51bGwhPWQub2Zmc2V0VG9wJiYoZC5vZmZzZXQudG9wPWQub2Zmc2V0VG9wKSxiLmNhbGwoYyxkKX0pfSl9KGpRdWVyeSk7\"></script>\n<script src=\"data:application/x-javascript;base64,LyoqCiogQHByZXNlcnZlIEhUTUw1IFNoaXYgMy43LjIgfCBAYWZhcmthcyBAamRhbHRvbiBAam9uX25lYWwgQHJlbSB8IE1JVC9HUEwyIExpY2Vuc2VkCiovCi8vIE9ubHkgcnVuIHRoaXMgY29kZSBpbiBJRSA4CmlmICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJNU0lFIDgiKSkgewohZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEuZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2IrIjwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGQoKXt2YXIgYT10LmVsZW1lbnRzO3JldHVybiJzdHJpbmciPT10eXBlb2YgYT9hLnNwbGl0KCIgIik6YX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9dC5lbGVtZW50czsic3RyaW5nIiE9dHlwZW9mIGMmJihjPWMuam9pbigiICIpKSwic3RyaW5nIiE9dHlwZW9mIGEmJihhPWEuam9pbigiICIpKSx0LmVsZW1lbnRzPWMrIiAiK2EsaihiKX1mdW5jdGlvbiBmKGEpe3ZhciBiPXNbYVtxXV07cmV0dXJuIGJ8fChiPXt9LHIrKyxhW3FdPXIsc1tyXT1iKSxifWZ1bmN0aW9uIGcoYSxjLGQpe2lmKGN8fChjPWIpLGwpcmV0dXJuIGMuY3JlYXRlRWxlbWVudChhKTtkfHwoZD1mKGMpKTt2YXIgZTtyZXR1cm4gZT1kLmNhY2hlW2FdP2QuY2FjaGVbYV0uY2xvbmVOb2RlKCk6cC50ZXN0KGEpPyhkLmNhY2hlW2FdPWQuY3JlYXRlRWxlbShhKSkuY2xvbmVOb2RlKCk6ZC5jcmVhdGVFbGVtKGEpLCFlLmNhbkhhdmVDaGlsZHJlbnx8by50ZXN0KGEpfHxlLnRhZ1Vybj9lOmQuZnJhZy5hcHBlbmRDaGlsZChlKX1mdW5jdGlvbiBoKGEsYyl7aWYoYXx8KGE9YiksbClyZXR1cm4gYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yz1jfHxmKGEpO2Zvcih2YXIgZT1jLmZyYWcuY2xvbmVOb2RlKCksZz0wLGg9ZCgpLGk9aC5sZW5ndGg7aT5nO2crKyllLmNyZWF0ZUVsZW1lbnQoaFtnXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gdC5zaGl2TWV0aG9kcz9nKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIitkKCkuam9pbigpLnJlcGxhY2UoL1tcd1wtOl0rL2csZnVuY3Rpb24oYSl7cmV0dXJuIGIuY3JlYXRlRWxlbShhKSxiLmZyYWcuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyciKSd9KSsiKTtyZXR1cm4gbn0iKSh0LGIuZnJhZyl9ZnVuY3Rpb24gaihhKXthfHwoYT1iKTt2YXIgZD1mKGEpO3JldHVybiF0LnNoaXZDU1N8fGt8fGQuaGFzQ1NTfHwoZC5oYXNDU1M9ISFjKGEsImFydGljbGUsYXNpZGUsZGlhbG9nLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX0iKSksbHx8aShhLGQpLGF9dmFyIGssbCxtPSIzLjcuMiIsbj1hLmh0bWw1fHx7fSxvPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLHA9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLHE9Il9odG1sNXNoaXYiLHI9MCxzPXt9OyFmdW5jdGlvbigpe3RyeXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGs9ImhpZGRlbiJpbiBhLGw9MT09YS5jaGlsZE5vZGVzLmxlbmd0aHx8ZnVuY3Rpb24oKXtiLmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgYT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuY2xvbmVOb2RlfHwidW5kZWZpbmVkIj09dHlwZW9mIGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8InVuZGVmaW5lZCI9PXR5cGVvZiBhLmNyZWF0ZUVsZW1lbnR9KCl9Y2F0Y2goYyl7az0hMCxsPSEwfX0oKTt2YXIgdD17ZWxlbWVudHM6bi5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBkaWFsb2cgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFpbiBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcGljdHVyZSBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGVtcGxhdGUgdGltZSB2aWRlbyIsdmVyc2lvbjptLHNoaXZDU1M6bi5zaGl2Q1NTIT09ITEsc3VwcG9ydHNVbmtub3duRWxlbWVudHM6bCxzaGl2TWV0aG9kczpuLnNoaXZNZXRob2RzIT09ITEsdHlwZToiZGVmYXVsdCIsc2hpdkRvY3VtZW50OmosY3JlYXRlRWxlbWVudDpnLGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6aCxhZGRFbGVtZW50czplfTthLmh0bWw1PXQsaihiKX0odGhpcyxkb2N1bWVudCk7Cn07Cg==\"></script>\n<script src=\"data:application/x-javascript;base64,LyohIFJlc3BvbmQuanMgdjEuNC4yOiBtaW4vbWF4LXdpZHRoIG1lZGlhIHF1ZXJ5IHBvbHlmaWxsICogQ29weXJpZ2h0IDIwMTMgU2NvdHQgSmVobAogKiBMaWNlbnNlZCB1bmRlciBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL1Jlc3BvbmQvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVQKICogICovCgovLyBPbmx5IHJ1biB0aGlzIGNvZGUgaW4gSUUgOAppZiAoISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiTVNJRSA4IikpIHsKIWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KCJib2R5IiksZj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmLmlkPSJtcS10ZXN0LTEiLGYuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBlbSIsZS5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIixlLmFwcGVuZENoaWxkKGYpLGZ1bmN0aW9uKGEpe3JldHVybiBmLmlubmVySFRNTD0nJnNoeTs8c3R5bGUgbWVkaWE9IicrYSsnIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dSghMCl9dmFyIGM9e307YS5yZXNwb25kPWMsYy51cGRhdGU9ZnVuY3Rpb24oKXt9O3ZhciBkPVtdLGU9ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj1uZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChjKXtiPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSgpLGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1lKCk7YyYmKGMub3BlbigiR0VUIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9O2lmKGMuYWpheD1mLGMucXVldWU9ZCxjLnJlZ2V4PXttZWRpYTovQG1lZGlhW15ce10rXHsoW15ce1x9XSpce1teXH1ce10qXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcLSg/Om98bW96fHdlYmtpdClcLSk/a2V5ZnJhbWVzW15ce10rXHsoPzpbXlx7XH1dKlx7W15cfVx7XSpcfSkrW15cfV0qXH0vZ2ksdXJsczovKHVybFwoKVsnIl0/KFteXC9cKSciXVteOlwpJyJdKylbJyJdPyhcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlx7XSspXHsoW1xTXHNdKz8pJC8sb25seTovKG9ubHlccyspPyhbYS16QS1aXSspXHM/LyxtaW53Oi9cKFtcc10qbWluXC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpLyxtYXh3Oi9cKFtcc10qbWF4XC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpL30sYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQ9YS5tYXRjaE1lZGlhJiZudWxsIT09YS5tYXRjaE1lZGlhKCJvbmx5IGFsbCIpJiZhLm1hdGNoTWVkaWEoIm9ubHkgYWxsIikubWF0Y2hlcywhYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQpe3ZhciBnLGgsaSxqPWEuZG9jdW1lbnQsaz1qLmRvY3VtZW50RWxlbWVudCxsPVtdLG09W10sbj1bXSxvPXt9LHA9MzAscT1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGsscj1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0scz1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIiksdD1mdW5jdGlvbigpe3ZhciBhLGI9ai5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWouYm9keSxkPWsuc3R5bGUuZm9udFNpemUsZT1jJiZjLnN0eWxlLmZvbnRTaXplLGY9ITE7cmV0dXJuIGIuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW0iLGN8fChjPWY9ai5jcmVhdGVFbGVtZW50KCJib2R5IiksYy5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIiksay5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5hcHBlbmRDaGlsZChiKSxmJiZrLmluc2VydEJlZm9yZShjLGsuZmlyc3RDaGlsZCksYT1iLm9mZnNldFdpZHRoLGY/ay5yZW1vdmVDaGlsZChjKTpjLnJlbW92ZUNoaWxkKGIpLGsuc3R5bGUuZm9udFNpemU9ZCxlJiYoYy5zdHlsZS5mb250U2l6ZT1lKSxhPWk9cGFyc2VGbG9hdChhKX0sdT1mdW5jdGlvbihiKXt2YXIgYz0iY2xpZW50V2lkdGgiLGQ9a1tjXSxlPSJDU1MxQ29tcGF0Ij09PWouY29tcGF0TW9kZSYmZHx8ai5ib2R5W2NdfHxkLGY9e30sbz1zW3MubGVuZ3RoLTFdLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmZyYmcD5yLWcpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGgpLGg9YS5zZXRUaW1lb3V0KHUscCksdm9pZCAwO2c9cjtmb3IodmFyIHYgaW4gbClpZihsLmhhc093blByb3BlcnR5KHYpKXt2YXIgdz1sW3ZdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPSJlbSI7eCYmKHg9cGFyc2VGbG9hdCh4KSooeC5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSkseSYmKHk9cGFyc2VGbG9hdCh5KSooeS5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSksdy5oYXNxdWVyeSYmKHomJkF8fCEoenx8ZT49eCl8fCEoQXx8eT49ZSkpfHwoZlt3Lm1lZGlhXXx8KGZbdy5tZWRpYV09W10pLGZbdy5tZWRpYV0ucHVzaChtW3cucnVsZXNdKSl9Zm9yKHZhciBDIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShDKSYmbltDXSYmbltDXS5wYXJlbnROb2RlPT09cSYmcS5yZW1vdmVDaGlsZChuW0NdKTtuLmxlbmd0aD0wO2Zvcih2YXIgRCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkoRCkpe3ZhciBFPWouY3JlYXRlRWxlbWVudCgic3R5bGUiKSxGPWZbRF0uam9pbigiXG4iKTtFLnR5cGU9InRleHQvY3NzIixFLm1lZGlhPUQscS5pbnNlcnRCZWZvcmUoRSxvLm5leHRTaWJsaW5nKSxFLnN0eWxlU2hlZXQ/RS5zdHlsZVNoZWV0LmNzc1RleHQ9RjpFLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoRikpLG4ucHVzaChFKX19LHY9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEucmVwbGFjZShjLnJlZ2V4LmtleWZyYW1lcywiIikubWF0Y2goYy5yZWdleC5tZWRpYSksZj1lJiZlLmxlbmd0aHx8MDtiPWIuc3Vic3RyaW5nKDAsYi5sYXN0SW5kZXhPZigiLyIpKTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGMucmVnZXgudXJscywiJDEiK2IrIiQyJDMiKX0saD0hZiYmZDtiLmxlbmd0aCYmKGIrPSIvIiksaCYmKGY9MSk7Zm9yKHZhciBpPTA7Zj5pO2krKyl7dmFyIGosayxuLG87aD8oaj1kLG0ucHVzaChnKGEpKSk6KGo9ZVtpXS5tYXRjaChjLnJlZ2V4LmZpbmRTdHlsZXMpJiZSZWdFeHAuJDEsbS5wdXNoKFJlZ0V4cC4kMiYmZyhSZWdFeHAuJDIpKSksbj1qLnNwbGl0KCIsIiksbz1uLmxlbmd0aDtmb3IodmFyIHA9MDtvPnA7cCsrKWs9bltwXSxsLnB1c2goe21lZGlhOmsuc3BsaXQoIigiKVswXS5tYXRjaChjLnJlZ2V4Lm9ubHkpJiZSZWdFeHAuJDJ8fCJhbGwiLHJ1bGVzOm0ubGVuZ3RoLTEsaGFzcXVlcnk6ay5pbmRleE9mKCIoIik+LTEsbWludzprLm1hdGNoKGMucmVnZXgubWludykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIiksbWF4dzprLm1hdGNoKGMucmVnZXgubWF4dykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIil9KX11KCl9LHc9ZnVuY3Rpb24oKXtpZihkLmxlbmd0aCl7dmFyIGI9ZC5zaGlmdCgpO2YoYi5ocmVmLGZ1bmN0aW9uKGMpe3YoYyxiLmhyZWYsYi5tZWRpYSksb1tiLmhyZWZdPSEwLGEuc2V0VGltZW91dChmdW5jdGlvbigpe3coKX0sMCl9KX19LHg9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHMubGVuZ3RoO2IrKyl7dmFyIGM9c1tiXSxlPWMuaHJlZixmPWMubWVkaWEsZz1jLnJlbCYmInN0eWxlc2hlZXQiPT09Yy5yZWwudG9Mb3dlckNhc2UoKTtlJiZnJiYhb1tlXSYmKGMuc3R5bGVTaGVldCYmYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQ/KHYoYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQsZSxmKSxvW2VdPSEwKTooIS9eKFthLXpBLVo6XSpcL1wvKS8udGVzdChlKSYmIXJ8fGUucmVwbGFjZShSZWdFeHAuJDEsIiIpLnNwbGl0KCIvIilbMF09PT1hLmxvY2F0aW9uLmhvc3QpJiYoIi8vIj09PWUuc3Vic3RyaW5nKDAsMikmJihlPWEubG9jYXRpb24ucHJvdG9jb2wrZSksZC5wdXNoKHtocmVmOmUsbWVkaWE6Zn0pKSl9dygpfTt4KCksYy51cGRhdGU9eCxjLmdldEVtVmFsdWU9dCxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGIsITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9ucmVzaXplIixiKX19KHRoaXMpOwp9Owo=\"></script>\n<script src=\"data:application/x-javascript;base64,CgovKioKICogalF1ZXJ5IFBsdWdpbjogU3RpY2t5IFRhYnMKICoKICogQGF1dGhvciBBaWRhbiBMaXN0ZXIgPGFpZGFuQHBocC5uZXQ+CiAqIGFkYXB0ZWQgYnkgUnViZW4gQXJzbGFuIHRvIGFjdGl2YXRlIHBhcmVudCB0YWJzIHRvbwogKiBodHRwOi8vd3d3LmFpZGFubGlzdGVyLmNvbS8yMDE0LzAzL3BlcnNpc3RpbmctdGhlLXRhYi1zdGF0ZS1pbi1ib290c3RyYXAvCiAqLwooZnVuY3Rpb24oJCkgewogICJ1c2Ugc3RyaWN0IjsKICAkLmZuLnJtYXJrZG93blN0aWNreVRhYnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgIC8vIFNob3cgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGhhc2ggaW4gdGhlIFVSTCwgb3IgdGhlIGZpcnN0IHRhYgogICAgdmFyIHNob3dTdHVmZkZyb21IYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHZhciBzZWxlY3RvciA9IGhhc2ggPyAnYVtocmVmPSInICsgaGFzaCArICciXScgOiAnbGkuYWN0aXZlID4gYSc7CiAgICAgIHZhciAkc2VsZWN0b3IgPSAkKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgICAgaWYoJHNlbGVjdG9yLmRhdGEoJ3RvZ2dsZScpID09PSAidGFiIikgewogICAgICAgICRzZWxlY3Rvci50YWIoJ3Nob3cnKTsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBlbGVtZW50LCBzaG93IGFueSBoaWRkZW4gdGFicwogICAgICAgICRzZWxlY3Rvci5wYXJlbnRzKCcuc2VjdGlvbi50YWJzZXQnKS5lYWNoKGZ1bmN0aW9uKGksIGVsbSkgewogICAgICAgICAgdmFyIGxpbmsgPSAkKCdhW2hyZWY9IiMnICsgJChlbG0pLmF0dHIoJ2lkJykgKyAnIl0nKTsKICAgICAgICAgIGlmKGxpbmsuZGF0YSgndG9nZ2xlJykgPT09ICJ0YWIiKSB7CiAgICAgICAgICAgIGxpbmsudGFiKCJzaG93Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgoKICAgIC8vIFNldCB0aGUgY29ycmVjdCB0YWIgd2hlbiB0aGUgcGFnZSBsb2FkcwogICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CgogICAgLy8gU2V0IHRoZSBjb3JyZWN0IHRhYiB3aGVuIGEgdXNlciB1c2VzIHRoZWlyIGJhY2svZm9yd2FyZCBidXR0b24KICAgICQod2luZG93KS5vbignaGFzaGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICBzaG93U3R1ZmZGcm9tSGFzaChjb250ZXh0KTsKICAgIH0pOwoKICAgIC8vIENoYW5nZSB0aGUgVVJMIHdoZW4gdGFicyBhcmUgY2xpY2tlZAogICAgJCgnYScsIGNvbnRleHQpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5ocmVmKTsKICAgICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KGpRdWVyeSkpOwoKd2luZG93LmJ1aWxkVGFic2V0cyA9IGZ1bmN0aW9uKHRvY0lEKSB7CgogIC8vIGJ1aWxkIGEgdGFic2V0IGZyb20gYSBzZWN0aW9uIGRpdiB3aXRoIHRoZSAudGFic2V0IGNsYXNzCiAgZnVuY3Rpb24gYnVpbGRUYWJzZXQodGFic2V0KSB7CgogICAgLy8gY2hlY2sgZm9yIGZhZGUgYW5kIHBpbGxzIG9wdGlvbnMKICAgIHZhciBmYWRlID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtZmFkZSIpOwogICAgdmFyIHBpbGxzID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtcGlsbHMiKTsKICAgIHZhciBuYXZDbGFzcyA9IHBpbGxzID8gIm5hdi1waWxscyIgOiAibmF2LXRhYnMiOwoKICAgIC8vIGRldGVybWluZSB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgdGFic2V0IGFuZCB0YWJzCiAgICB2YXIgbWF0Y2ggPSB0YWJzZXQuYXR0cignY2xhc3MnKS5tYXRjaCgvbGV2ZWwoXGQpIC8pOwogICAgaWYgKG1hdGNoID09PSBudWxsKQogICAgICByZXR1cm47CiAgICB2YXIgdGFic2V0TGV2ZWwgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgdmFyIHRhYkxldmVsID0gdGFic2V0TGV2ZWwgKyAxOwoKICAgIC8vIGZpbmQgYWxsIHN1YmhlYWRpbmdzIGltbWVkaWF0ZWx5IGJlbG93CiAgICB2YXIgdGFicyA9IHRhYnNldC5maW5kKCJkaXYuc2VjdGlvbi5sZXZlbCIgKyB0YWJMZXZlbCk7CiAgICBpZiAoIXRhYnMubGVuZ3RoKQogICAgICByZXR1cm47CgogICAgLy8gY3JlYXRlIHRhYmxpc3QgYW5kIHRhYi1jb250ZW50IGVsZW1lbnRzCiAgICB2YXIgdGFiTGlzdCA9ICQoJzx1bCBjbGFzcz0ibmF2ICcgKyBuYXZDbGFzcyArICciIHJvbGU9InRhYmxpc3QiPjwvdWw+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJMaXN0KTsKICAgIHZhciB0YWJDb250ZW50ID0gJCgnPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPjwvZGl2PicpOwogICAgJCh0YWJzWzBdKS5iZWZvcmUodGFiQ29udGVudCk7CgogICAgLy8gYnVpbGQgdGhlIHRhYnNldAogICAgdmFyIGFjdGl2ZVRhYiA9IDA7CiAgICB0YWJzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgLy8gZ2V0IHRoZSB0YWIgZGl2CiAgICAgIHZhciB0YWIgPSAkKHRhYnNbaV0pOwoKICAgICAgLy8gZ2V0IHRoZSBpZCB0aGVuIHNhbml0aXplIGl0IGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICB2YXIgaWQgPSB0YWIuYXR0cignaWQnKTsKCiAgICAgIC8vIHNlZSBpZiB0aGlzIGlzIG1hcmtlZCBhcyB0aGUgYWN0aXZlIHRhYgogICAgICBpZiAodGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkKICAgICAgICBhY3RpdmVUYWIgPSBpOwoKICAgICAgLy8gcmVtb3ZlIGFueSB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aAogICAgICAvLyB0aGlzIElEIChzaW5jZSB3ZSdsbCBiZSByZW1vdmluZyB0aGUgaGVhZGluZyBlbGVtZW50KQogICAgICAkKCJkaXYjIiArIHRvY0lEICsgIiBsaSBhW2hyZWY9JyMiICsgaWQgKyAiJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKCiAgICAgIC8vIHNhbml0aXplIHRoZSBpZCBmb3IgdXNlIHdpdGggYm9vdHN0cmFwIHRhYnMKICAgICAgaWQgPSBpZC5yZXBsYWNlKC9bLlwvPyYhIzw+XS9nLCAnJykucmVwbGFjZSgvXHMvZywgJ18nKTsKICAgICAgdGFiLmF0dHIoJ2lkJywgaWQpOwoKICAgICAgLy8gZ2V0IHRoZSBoZWFkaW5nIGVsZW1lbnQgd2l0aGluIGl0LCBncmFiIGl0J3MgdGV4dCwgdGhlbiByZW1vdmUgaXQKICAgICAgdmFyIGhlYWRpbmcgPSB0YWIuZmluZCgnaCcgKyB0YWJMZXZlbCArICc6Zmlyc3QnKTsKICAgICAgdmFyIGhlYWRpbmdUZXh0ID0gaGVhZGluZy5odG1sKCk7CiAgICAgIGhlYWRpbmcucmVtb3ZlKCk7CgogICAgICAvLyBidWlsZCBhbmQgYXBwZW5kIHRoZSB0YWIgbGlzdCBpdGVtCiAgICAgIHZhciBhID0gJCgnPGEgcm9sZT0idGFiIiBkYXRhLXRvZ2dsZT0idGFiIj4nICsgaGVhZGluZ1RleHQgKyAnPC9hPicpOwogICAgICBhLmF0dHIoJ2hyZWYnLCAnIycgKyBpZCk7CiAgICAgIGEuYXR0cignYXJpYS1jb250cm9scycsIGlkKTsKICAgICAgdmFyIGxpID0gJCgnPGxpIHJvbGU9InByZXNlbnRhdGlvbiI+PC9saT4nKTsKICAgICAgbGkuYXBwZW5kKGEpOwogICAgICB0YWJMaXN0LmFwcGVuZChsaSk7CgogICAgICAvLyBzZXQgaXQncyBhdHRyaWJ1dGVzCiAgICAgIHRhYi5hdHRyKCdyb2xlJywgJ3RhYnBhbmVsJyk7CiAgICAgIHRhYi5hZGRDbGFzcygndGFiLXBhbmUnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWJiZWQtcGFuZScpOwogICAgICBpZiAoZmFkZSkKICAgICAgICB0YWIuYWRkQ2xhc3MoJ2ZhZGUnKTsKCiAgICAgIC8vIG1vdmUgaXQgaW50byB0aGUgdGFiIGNvbnRlbnQgZGl2CiAgICAgIHRhYi5kZXRhY2goKS5hcHBlbmRUbyh0YWJDb250ZW50KTsKICAgIH0pOwoKICAgIC8vIHNldCBhY3RpdmUgdGFiCiAgICAkKHRhYkxpc3QuY2hpbGRyZW4oJ2xpJylbYWN0aXZlVGFiXSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgdmFyIGFjdGl2ZSA9ICQodGFiQ29udGVudC5jaGlsZHJlbignZGl2LnNlY3Rpb24nKVthY3RpdmVUYWJdKTsKICAgIGFjdGl2ZS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICBpZiAoZmFkZSkKICAgICAgYWN0aXZlLmFkZENsYXNzKCdpbicpOwoKICAgIGlmICh0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1zdGlja3kiKSkKICAgICAgdGFic2V0LnJtYXJrZG93blN0aWNreVRhYnMoKTsKICB9CgogIC8vIGNvbnZlcnQgc2VjdGlvbiBkaXZzIHdpdGggdGhlIC50YWJzZXQgY2xhc3MgdG8gdGFic2V0cwogIHZhciB0YWJzZXRzID0gJCgiZGl2LnNlY3Rpb24udGFic2V0Iik7CiAgdGFic2V0cy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgIGJ1aWxkVGFic2V0KCQodGFic2V0c1tpXSkpOwogIH0pOwp9OwoK\"></script>\n<link href=\"data:text/css;charset=utf-8,%2Ehljs%2Dliteral%20%7B%0Acolor%3A%20%23990073%3B%0A%7D%0A%2Ehljs%2Dnumber%20%7B%0Acolor%3A%20%23099%3B%0A%7D%0A%2Ehljs%2Dcomment%20%7B%0Acolor%3A%20%23998%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0A%2Ehljs%2Dkeyword%20%7B%0Acolor%3A%20%23900%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0A%2Ehljs%2Dstring%20%7B%0Acolor%3A%20%23d14%3B%0A%7D%0A\" rel=\"stylesheet\" />\n<script src=\"data:application/x-javascript;base64,LyohIGhpZ2hsaWdodC5qcyB2OS4xMi4wIHwgQlNEMyBMaWNlbnNlIHwgZ2l0LmlvL2hsanNsaWNlbnNlICovCiFmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93fHwib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGY7InVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2UoZXhwb3J0cyk6biYmKG4uaGxqcz1lKHt9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gbi5obGpzfSkpfShmdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiB0KGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQuaW5kZXh9ZnVuY3Rpb24gYShlKXtyZXR1cm4gay50ZXN0KGUpfWZ1bmN0aW9uIGkoZSl7dmFyIG4sdCxyLGksbz1lLmNsYXNzTmFtZSsiICI7aWYobys9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1CLmV4ZWMobykpcmV0dXJuIHcodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobz1vLnNwbGl0KC9ccysvKSxuPTAscj1vLmxlbmd0aDtyPm47bisrKWlmKGk9b1tuXSxhKGkpfHx3KGkpKXJldHVybiBpfWZ1bmN0aW9uIG8oZSl7dmFyIG4sdD17fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1mdW5jdGlvbiB1KGUpe3ZhciBuPVtdO3JldHVybiBmdW5jdGlvbiByKGUsYSl7Zm9yKHZhciBpPWUuZmlyc3RDaGlsZDtpO2k9aS5uZXh0U2libGluZykzPT09aS5ub2RlVHlwZT9hKz1pLm5vZGVWYWx1ZS5sZW5ndGg6MT09PWkubm9kZVR5cGUmJihuLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OmEsbm9kZTppfSksYT1yKGksYSksdChpKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fG4ucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDphLG5vZGU6aX0pKTtyZXR1cm4gYX0oZSwwKSxufWZ1bmN0aW9uIGMoZSxyLGEpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gZS5sZW5ndGgmJnIubGVuZ3RoP2VbMF0ub2Zmc2V0IT09clswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8clswXS5vZmZzZXQ/ZTpyOiJzdGFydCI9PT1yWzBdLmV2ZW50P2U6cjplLmxlbmd0aD9lOnJ9ZnVuY3Rpb24gbyhlKXtmdW5jdGlvbiByKGUpe3JldHVybiIgIitlLm5vZGVOYW1lKyc9IicrbihlLnZhbHVlKS5yZXBsYWNlKCciJywiJnF1b3Q7IikrJyInfXMrPSI8Iit0KGUpK0UubWFwLmNhbGwoZS5hdHRyaWJ1dGVzLHIpLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1KGUpe3MrPSI8LyIrdChlKSsiPiJ9ZnVuY3Rpb24gYyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/bzp1KShlLm5vZGUpfWZvcih2YXIgbD0wLHM9IiIsZj1bXTtlLmxlbmd0aHx8ci5sZW5ndGg7KXt2YXIgZz1pKCk7aWYocys9bihhLnN1YnN0cmluZyhsLGdbMF0ub2Zmc2V0KSksbD1nWzBdLm9mZnNldCxnPT09ZSl7Zi5yZXZlcnNlKCkuZm9yRWFjaCh1KTtkbyBjKGcuc3BsaWNlKDAsMSlbMF0pLGc9aSgpO3doaWxlKGc9PT1lJiZnLmxlbmd0aCYmZ1swXS5vZmZzZXQ9PT1sKTtmLnJldmVyc2UoKS5mb3JFYWNoKG8pfWVsc2Uic3RhcnQiPT09Z1swXS5ldmVudD9mLnB1c2goZ1swXS5ub2RlKTpmLnBvcCgpLGMoZy5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIHMrbihhLnN1YnN0cihsKSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZS52JiYhZS5jYWNoZWRfdmFyaWFudHMmJihlLmNhY2hlZF92YXJpYW50cz1lLnYubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKGUse3Y6bnVsbH0sbil9KSksZS5jYWNoZWRfdmFyaWFudHN8fGUuZVcmJltvKGUpXXx8W2VdfWZ1bmN0aW9uIHMoZSl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gdCh0LHIpe3JldHVybiBuZXcgUmVnRXhwKG4odCksIm0iKyhlLmNJPyJpIjoiIikrKHI/ImciOiIiKSl9ZnVuY3Rpb24gcihhLGkpe2lmKCFhLmNvbXBpbGVkKXtpZihhLmNvbXBpbGVkPSEwLGEuaz1hLmt8fGEuYkssYS5rKXt2YXIgbz17fSx1PWZ1bmN0aW9uKG4sdCl7ZS5jSSYmKHQ9dC50b0xvd2VyQ2FzZSgpKSx0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCJ8Iik7b1t0WzBdXT1bbix0WzFdP051bWJlcih0WzFdKToxXX0pfTsic3RyaW5nIj09dHlwZW9mIGEuaz91KCJrZXl3b3JkIixhLmspOngoYS5rKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UoZSxhLmtbZV0pfSksYS5rPW99YS5sUj10KGEubHx8L1x3Ky8sITApLGkmJihhLmJLJiYoYS5iPSJcXGIoIithLmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiksYS5ifHwoYS5iPS9cQnxcYi8pLGEuYlI9dChhLmIpLGEuZXx8YS5lV3x8KGEuZT0vXEJ8XGIvKSxhLmUmJihhLmVSPXQoYS5lKSksYS50RT1uKGEuZSl8fCIiLGEuZVcmJmkudEUmJihhLnRFKz0oYS5lPyJ8IjoiIikraS50RSkpLGEuaSYmKGEuaVI9dChhLmkpKSxudWxsPT1hLnImJihhLnI9MSksYS5jfHwoYS5jPVtdKSxhLmM9QXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhLmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBsKCJzZWxmIj09PWU/YTplKX0pKSxhLmMuZm9yRWFjaChmdW5jdGlvbihlKXtyKGUsYSl9KSxhLnN0YXJ0cyYmcihhLnN0YXJ0cyxpKTt2YXIgYz1hLmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJLPyJcXC4/KCIrZS5iKyIpXFwuPyI6ZS5ifSkuY29uY2F0KFthLnRFLGEuaV0pLm1hcChuKS5maWx0ZXIoQm9vbGVhbik7YS50PWMubGVuZ3RoP3QoYy5qb2luKCJ8IiksITApOntleGVjOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fX19cihlKX1mdW5jdGlvbiBmKGUsdCxhLGkpe2Z1bmN0aW9uIG8oZSxuKXt2YXIgdCxhO2Zvcih0PTAsYT1uLmMubGVuZ3RoO2E+dDt0KyspaWYocihuLmNbdF0uYlIsZSkpcmV0dXJuIG4uY1t0XX1mdW5jdGlvbiB1KGUsbil7aWYocihlLmVSLG4pKXtmb3IoO2UuZW5kc1BhcmVudCYmZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7cmV0dXJuIGV9cmV0dXJuIGUuZVc/dShlLnBhcmVudCxuKTp2b2lkIDB9ZnVuY3Rpb24gYyhlLG4pe3JldHVybiFhJiZyKG4uaVIsZSl9ZnVuY3Rpb24gbChlLG4pe3ZhciB0PU4uY0k/blswXS50b0xvd2VyQ2FzZSgpOm5bMF07cmV0dXJuIGUuay5oYXNPd25Qcm9wZXJ0eSh0KSYmZS5rW3RdfWZ1bmN0aW9uIHAoZSxuLHQscil7dmFyIGE9cj8iIjpJLmNsYXNzUHJlZml4LGk9JzxzcGFuIGNsYXNzPSInK2Esbz10PyIiOkM7cmV0dXJuIGkrPWUrJyI+JyxpK24rb31mdW5jdGlvbiBoKCl7dmFyIGUsdCxyLGE7aWYoIUUuaylyZXR1cm4gbihrKTtmb3IoYT0iIix0PTAsRS5sUi5sYXN0SW5kZXg9MCxyPUUubFIuZXhlYyhrKTtyOylhKz1uKGsuc3Vic3RyaW5nKHQsci5pbmRleCkpLGU9bChFLHIpLGU/KEIrPWVbMV0sYSs9cChlWzBdLG4oclswXSkpKTphKz1uKHJbMF0pLHQ9RS5sUi5sYXN0SW5kZXgscj1FLmxSLmV4ZWMoayk7cmV0dXJuIGErbihrLnN1YnN0cih0KSl9ZnVuY3Rpb24gZCgpe3ZhciBlPSJzdHJpbmciPT10eXBlb2YgRS5zTDtpZihlJiYheVtFLnNMXSlyZXR1cm4gbihrKTt2YXIgdD1lP2YoRS5zTCxrLCEwLHhbRS5zTF0pOmcoayxFLnNMLmxlbmd0aD9FLnNMOnZvaWQgMCk7cmV0dXJuIEUucj4wJiYoQis9dC5yKSxlJiYoeFtFLnNMXT10LnRvcCkscCh0Lmxhbmd1YWdlLHQudmFsdWUsITEsITApfWZ1bmN0aW9uIGIoKXtMKz1udWxsIT1FLnNMP2QoKTpoKCksaz0iIn1mdW5jdGlvbiB2KGUpe0wrPWUuY04/cChlLmNOLCIiLCEwKToiIixFPU9iamVjdC5jcmVhdGUoZSx7cGFyZW50Ont2YWx1ZTpFfX0pfWZ1bmN0aW9uIG0oZSxuKXtpZihrKz1lLG51bGw9PW4pcmV0dXJuIGIoKSwwO3ZhciB0PW8obixFKTtpZih0KXJldHVybiB0LnNraXA/ays9bjoodC5lQiYmKGsrPW4pLGIoKSx0LnJCfHx0LmVCfHwoaz1uKSksdih0LG4pLHQuckI/MDpuLmxlbmd0aDt2YXIgcj11KEUsbik7aWYocil7dmFyIGE9RTthLnNraXA/ays9bjooYS5yRXx8YS5lRXx8KGsrPW4pLGIoKSxhLmVFJiYoaz1uKSk7ZG8gRS5jTiYmKEwrPUMpLEUuc2tpcHx8KEIrPUUuciksRT1FLnBhcmVudDt3aGlsZShFIT09ci5wYXJlbnQpO3JldHVybiByLnN0YXJ0cyYmdihyLnN0YXJ0cywiIiksYS5yRT8wOm4ubGVuZ3RofWlmKGMobixFKSl0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgbGV4ZW1lICInK24rJyIgZm9yIG1vZGUgIicrKEUuY058fCI8dW5uYW1lZD4iKSsnIicpO3JldHVybiBrKz1uLG4ubGVuZ3RofHwxfXZhciBOPXcoZSk7aWYoIU4pdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiAiJytlKyciJyk7cyhOKTt2YXIgUixFPWl8fE4seD17fSxMPSIiO2ZvcihSPUU7UiE9PU47Uj1SLnBhcmVudClSLmNOJiYoTD1wKFIuY04sIiIsITApK0wpO3ZhciBrPSIiLEI9MDt0cnl7Zm9yKHZhciBNLGosTz0wOzspe2lmKEUudC5sYXN0SW5kZXg9TyxNPUUudC5leGVjKHQpLCFNKWJyZWFrO2o9bSh0LnN1YnN0cmluZyhPLE0uaW5kZXgpLE1bMF0pLE89TS5pbmRleCtqfWZvcihtKHQuc3Vic3RyKE8pKSxSPUU7Ui5wYXJlbnQ7Uj1SLnBhcmVudClSLmNOJiYoTCs9Qyk7cmV0dXJue3I6Qix2YWx1ZTpMLGxhbmd1YWdlOmUsdG9wOkV9fWNhdGNoKFQpe2lmKFQubWVzc2FnZSYmLTEhPT1ULm1lc3NhZ2UuaW5kZXhPZigiSWxsZWdhbCIpKXJldHVybntyOjAsdmFsdWU6bih0KX07dGhyb3cgVH19ZnVuY3Rpb24gZyhlLHQpe3Q9dHx8SS5sYW5ndWFnZXN8fHgoeSk7dmFyIHI9e3I6MCx2YWx1ZTpuKGUpfSxhPXI7cmV0dXJuIHQuZmlsdGVyKHcpLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHQ9ZihuLGUsITEpO3QubGFuZ3VhZ2U9bix0LnI+YS5yJiYoYT10KSx0LnI+ci5yJiYoYT1yLHI9dCl9KSxhLmxhbmd1YWdlJiYoci5zZWNvbmRfYmVzdD1hKSxyfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIEkudGFiUmVwbGFjZXx8SS51c2VCUj9lLnJlcGxhY2UoTSxmdW5jdGlvbihlLG4pe3JldHVybiBJLnVzZUJSJiYiXG4iPT09ZT8iPGJyPiI6SS50YWJSZXBsYWNlP24ucmVwbGFjZSgvXHQvZyxJLnRhYlJlcGxhY2UpOiIifSk6ZX1mdW5jdGlvbiBoKGUsbix0KXt2YXIgcj1uP0xbbl06dCxhPVtlLnRyaW0oKV07cmV0dXJuIGUubWF0Y2goL1xiaGxqc1xiLyl8fGEucHVzaCgiaGxqcyIpLC0xPT09ZS5pbmRleE9mKHIpJiZhLnB1c2gociksYS5qb2luKCIgIikudHJpbSgpfWZ1bmN0aW9uIGQoZSl7dmFyIG4sdCxyLG8sbCxzPWkoZSk7YShzKXx8KEkudXNlQlI/KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iiksbi5pbm5lckhUTUw9ZS5pbm5lckhUTUwucmVwbGFjZSgvXG4vZywiIikucmVwbGFjZSgvPGJyWyBcL10qPi9nLCJcbiIpKTpuPWUsbD1uLnRleHRDb250ZW50LHI9cz9mKHMsbCwhMCk6ZyhsKSx0PXUobiksdC5sZW5ndGgmJihvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpLG8uaW5uZXJIVE1MPXIudmFsdWUsci52YWx1ZT1jKHQsdShvKSxsKSksci52YWx1ZT1wKHIudmFsdWUpLGUuaW5uZXJIVE1MPXIudmFsdWUsZS5jbGFzc05hbWU9aChlLmNsYXNzTmFtZSxzLHIubGFuZ3VhZ2UpLGUucmVzdWx0PXtsYW5ndWFnZTpyLmxhbmd1YWdlLHJlOnIucn0sci5zZWNvbmRfYmVzdCYmKGUuc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOnIuc2Vjb25kX2Jlc3QubGFuZ3VhZ2UscmU6ci5zZWNvbmRfYmVzdC5yfSkpfWZ1bmN0aW9uIGIoZSl7ST1vKEksZSl9ZnVuY3Rpb24gdigpe2lmKCF2LmNhbGxlZCl7di5jYWxsZWQ9ITA7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicHJlIGNvZGUiKTtFLmZvckVhY2guY2FsbChlLGQpfX1mdW5jdGlvbiBtKCl7YWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdiwhMSksYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdiwhMSl9ZnVuY3Rpb24gTihuLHQpe3ZhciByPXlbbl09dChlKTtyLmFsaWFzZXMmJnIuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe0xbZV09bn0pfWZ1bmN0aW9uIFIoKXtyZXR1cm4geCh5KX1mdW5jdGlvbiB3KGUpe3JldHVybiBlPShlfHwiIikudG9Mb3dlckNhc2UoKSx5W2VdfHx5W0xbZV1dfXZhciBFPVtdLHg9T2JqZWN0LmtleXMseT17fSxMPXt9LGs9L14obm8tP2hpZ2hsaWdodHxwbGFpbnx0ZXh0KSQvaSxCPS9cYmxhbmcoPzp1YWdlKT8tKFtcdy1dKylcYi9pLE09LygoXig8W14+XSs+fFx0fCkrfCg/OlxuKSkpL2dtLEM9Ijwvc3Bhbj4iLEk9e2NsYXNzUHJlZml4OiJobGpzLSIsdGFiUmVwbGFjZTpudWxsLHVzZUJSOiExLGxhbmd1YWdlczp2b2lkIDB9O3JldHVybiBlLmhpZ2hsaWdodD1mLGUuaGlnaGxpZ2h0QXV0bz1nLGUuZml4TWFya3VwPXAsZS5oaWdobGlnaHRCbG9jaz1kLGUuY29uZmlndXJlPWIsZS5pbml0SGlnaGxpZ2h0aW5nPXYsZS5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPW0sZS5yZWdpc3Rlckxhbmd1YWdlPU4sZS5saXN0TGFuZ3VhZ2VzPVIsZS5nZXRMYW5ndWFnZT13LGUuaW5oZXJpdD1vLGUuSVI9IlthLXpBLVpdXFx3KiIsZS5VSVI9IlthLXpBLVpfXVxcdyoiLGUuTlI9IlxcYlxcZCsoXFwuXFxkKyk/IixlLkNOUj0iKC0/KShcXGIwW3hYXVthLWZBLUYwLTldK3woXFxiXFxkKyhcXC5cXGQqKT98XFwuXFxkKykoW2VFXVstK10/XFxkKyk/KSIsZS5CTlI9IlxcYigwYlswMV0rKSIsZS5SU1I9IiF8IT18IT09fCV8JT18JnwmJnwmPXxcXCp8XFwqPXxcXCt8XFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+IixlLkJFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH0sZS5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbZS5CRV19LGUuUVNNPXtjTjoic3RyaW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W2UuQkVdfSxlLlBXTT17YjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiL30sZS5DPWZ1bmN0aW9uKG4sdCxyKXt2YXIgYT1lLmluaGVyaXQoe2NOOiJjb21tZW50IixiOm4sZTp0LGM6W119LHJ8fHt9KTtyZXR1cm4gYS5jLnB1c2goZS5QV00pLGEuYy5wdXNoKHtjTjoiZG9jdGFnIixiOiIoPzpUT0RPfEZJWE1FfE5PVEV8QlVHfFhYWCk6IixyOjB9KSxhfSxlLkNMQ009ZS5DKCIvLyIsIiQiKSxlLkNCQ009ZS5DKCIvXFwqIiwiXFwqLyIpLGUuSENNPWUuQygiIyIsIiQiKSxlLk5NPXtjTjoibnVtYmVyIixiOmUuTlIscjowfSxlLkNOTT17Y046Im51bWJlciIsYjplLkNOUixyOjB9LGUuQk5NPXtjTjoibnVtYmVyIixiOmUuQk5SLHI6MH0sZS5DU1NOTT17Y046Im51bWJlciIsYjplLk5SKyIoJXxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjfHB4fGRlZ3xncmFkfHJhZHx0dXJufHN8bXN8SHp8a0h6fGRwaXxkcGNtfGRwcHgpPyIscjowfSxlLlJNPXtjTjoicmVnZXhwIixiOi9cLy8sZTovXC9bZ2ltdXldKi8saTovXG4vLGM6W2UuQkUse2I6L1xbLyxlOi9cXS8scjowLGM6W2UuQkVdfV19LGUuVE09e2NOOiJ0aXRsZSIsYjplLklSLHI6MH0sZS5VVE09e2NOOiJ0aXRsZSIsYjplLlVJUixyOjB9LGUuTUVUSE9EX0dVQVJEPXtiOiJcXC5cXHMqIitlLlVJUixyOjB9LGV9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInNxbCIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5DKCItLSIsIiQiKTtyZXR1cm57Y0k6ITAsaTovWzw+e30qI10vLGM6W3tiSzoiYmVnaW4gZW5kIHN0YXJ0IGNvbW1pdCByb2xsYmFjayBzYXZlcG9pbnQgbG9jayBhbHRlciBjcmVhdGUgZHJvcCByZW5hbWUgY2FsbCBkZWxldGUgZG8gaGFuZGxlciBpbnNlcnQgbG9hZCByZXBsYWNlIHNlbGVjdCB0cnVuY2F0ZSB1cGRhdGUgc2V0IHNob3cgcHJhZ21hIGdyYW50IG1lcmdlIGRlc2NyaWJlIHVzZSBleHBsYWluIGhlbHAgZGVjbGFyZSBwcmVwYXJlIGV4ZWN1dGUgZGVhbGxvY2F0ZSByZWxlYXNlIHVubG9jayBwdXJnZSByZXNldCBjaGFuZ2Ugc3RvcCBhbmFseXplIGNhY2hlIGZsdXNoIG9wdGltaXplIHJlcGFpciBraWxsIGluc3RhbGwgdW5pbnN0YWxsIGNoZWNrc3VtIHJlc3RvcmUgY2hlY2sgYmFja3VwIHJldm9rZSBjb21tZW50IixlOi87LyxlVzohMCxsOi9bXHdcLl0rLyxrOntrZXl3b3JkOiJhYm9ydCBhYnMgYWJzb2x1dGUgYWNjIGFjY2UgYWNjZXAgYWNjZXB0IGFjY2VzcyBhY2Nlc3NlZCBhY2Nlc3NpYmxlIGFjY291bnQgYWNvcyBhY3Rpb24gYWN0aXZhdGUgYWRkIGFkZHRpbWUgYWRtaW4gYWRtaW5pc3RlciBhZHZhbmNlZCBhZHZpc2UgYWVzX2RlY3J5cHQgYWVzX2VuY3J5cHQgYWZ0ZXIgYWdlbnQgYWdncmVnYXRlIGFsaSBhbGlhIGFsaWFzIGFsbG9jYXRlIGFsbG93IGFsdGVyIGFsd2F5cyBhbmFseXplIGFuY2lsbGFyeSBhbmQgYW55IGFueWRhdGEgYW55ZGF0YXNldCBhbnlzY2hlbWEgYW55dHlwZSBhcHBseSBhcmNoaXZlIGFyY2hpdmVkIGFyY2hpdmVsb2cgYXJlIGFzIGFzYyBhc2NpaSBhc2luIGFzc2VtYmx5IGFzc2VydGlvbiBhc3NvY2lhdGUgYXN5bmNocm9ub3VzIGF0IGF0YW4gYXRuMiBhdHRyIGF0dHJpIGF0dHJpYiBhdHRyaWJ1IGF0dHJpYnV0IGF0dHJpYnV0ZSBhdHRyaWJ1dGVzIGF1ZGl0IGF1dGhlbnRpY2F0ZWQgYXV0aGVudGljYXRpb24gYXV0aGlkIGF1dGhvcnMgYXV0byBhdXRvYWxsb2NhdGUgYXV0b2RibGluayBhdXRvZXh0ZW5kIGF1dG9tYXRpYyBhdmFpbGFiaWxpdHkgYXZnIGJhY2t1cCBiYWRmaWxlIGJhc2ljZmlsZSBiZWZvcmUgYmVnaW4gYmVnaW5uaW5nIGJlbmNobWFyayBiZXR3ZWVuIGJmaWxlIGJmaWxlX2Jhc2UgYmlnIGJpZ2ZpbGUgYmluIGJpbmFyeV9kb3VibGUgYmluYXJ5X2Zsb2F0IGJpbmxvZyBiaXRfYW5kIGJpdF9jb3VudCBiaXRfbGVuZ3RoIGJpdF9vciBiaXRfeG9yIGJpdG1hcCBibG9iX2Jhc2UgYmxvY2sgYmxvY2tzaXplIGJvZHkgYm90aCBib3VuZCBidWZmZXJfY2FjaGUgYnVmZmVyX3Bvb2wgYnVpbGQgYnVsayBieSBieXRlIGJ5dGVvcmRlcm1hcmsgYnl0ZXMgY2FjaGUgY2FjaGluZyBjYWxsIGNhbGxpbmcgY2FuY2VsIGNhcGFjaXR5IGNhc2NhZGUgY2FzY2FkZWQgY2FzZSBjYXN0IGNhdGFsb2cgY2F0ZWdvcnkgY2VpbCBjZWlsaW5nIGNoYWluIGNoYW5nZSBjaGFuZ2VkIGNoYXJfYmFzZSBjaGFyX2xlbmd0aCBjaGFyYWN0ZXJfbGVuZ3RoIGNoYXJhY3RlcnMgY2hhcmFjdGVyc2V0IGNoYXJpbmRleCBjaGFyc2V0IGNoYXJzZXRmb3JtIGNoYXJzZXRpZCBjaGVjayBjaGVja3N1bSBjaGVja3N1bV9hZ2cgY2hpbGQgY2hvb3NlIGNociBjaHVuayBjbGFzcyBjbGVhbnVwIGNsZWFyIGNsaWVudCBjbG9iIGNsb2JfYmFzZSBjbG9uZSBjbG9zZSBjbHVzdGVyX2lkIGNsdXN0ZXJfcHJvYmFiaWxpdHkgY2x1c3Rlcl9zZXQgY2x1c3RlcmluZyBjb2FsZXNjZSBjb2VyY2liaWxpdHkgY29sIGNvbGxhdGUgY29sbGF0aW9uIGNvbGxlY3QgY29sdSBjb2x1bSBjb2x1bW4gY29sdW1uX3ZhbHVlIGNvbHVtbnMgY29sdW1uc191cGRhdGVkIGNvbW1lbnQgY29tbWl0IGNvbXBhY3QgY29tcGF0aWJpbGl0eSBjb21waWxlZCBjb21wbGV0ZSBjb21wb3NpdGVfbGltaXQgY29tcG91bmQgY29tcHJlc3MgY29tcHV0ZSBjb25jYXQgY29uY2F0X3dzIGNvbmN1cnJlbnQgY29uZmlybSBjb25uIGNvbm5lYyBjb25uZWN0IGNvbm5lY3RfYnlfaXNjeWNsZSBjb25uZWN0X2J5X2lzbGVhZiBjb25uZWN0X2J5X3Jvb3QgY29ubmVjdF90aW1lIGNvbm5lY3Rpb24gY29uc2lkZXIgY29uc2lzdGVudCBjb25zdGFudCBjb25zdHJhaW50IGNvbnN0cmFpbnRzIGNvbnN0cnVjdG9yIGNvbnRhaW5lciBjb250ZW50IGNvbnRlbnRzIGNvbnRleHQgY29udHJpYnV0b3JzIGNvbnRyb2xmaWxlIGNvbnYgY29udmVydCBjb252ZXJ0X3R6IGNvcnIgY29ycl9rIGNvcnJfcyBjb3JyZXNwb25kaW5nIGNvcnJ1cHRpb24gY29zIGNvc3QgY291bnQgY291bnRfYmlnIGNvdW50ZWQgY292YXJfcG9wIGNvdmFyX3NhbXAgY3B1X3Blcl9jYWxsIGNwdV9wZXJfc2Vzc2lvbiBjcmMzMiBjcmVhdGUgY3JlYXRpb24gY3JpdGljYWwgY3Jvc3MgY3ViZSBjdW1lX2Rpc3QgY3VyZGF0ZSBjdXJyZW50IGN1cnJlbnRfZGF0ZSBjdXJyZW50X3RpbWUgY3VycmVudF90aW1lc3RhbXAgY3VycmVudF91c2VyIGN1cnNvciBjdXJ0aW1lIGN1c3RvbWRhdHVtIGN5Y2xlIGRhdGEgZGF0YWJhc2UgZGF0YWJhc2VzIGRhdGFmaWxlIGRhdGFmaWxlcyBkYXRhbGVuZ3RoIGRhdGVfYWRkIGRhdGVfY2FjaGUgZGF0ZV9mb3JtYXQgZGF0ZV9zdWIgZGF0ZWFkZCBkYXRlZGlmZiBkYXRlZnJvbXBhcnRzIGRhdGVuYW1lIGRhdGVwYXJ0IGRhdGV0aW1lMmZyb21wYXJ0cyBkYXkgZGF5X3RvX3NlY29uZCBkYXluYW1lIGRheW9mbW9udGggZGF5b2Z3ZWVrIGRheW9meWVhciBkYXlzIGRiX3JvbGVfY2hhbmdlIGRidGltZXpvbmUgZGRsIGRlYWxsb2NhdGUgZGVjbGFyZSBkZWNvZGUgZGVjb21wb3NlIGRlY3JlbWVudCBkZWNyeXB0IGRlZHVwbGljYXRlIGRlZiBkZWZhIGRlZmF1IGRlZmF1bCBkZWZhdWx0IGRlZmF1bHRzIGRlZmVycmVkIGRlZmkgZGVmaW4gZGVmaW5lIGRlZ3JlZXMgZGVsYXllZCBkZWxlZ2F0ZSBkZWxldGUgZGVsZXRlX2FsbCBkZWxpbWl0ZWQgZGVtYW5kIGRlbnNlX3JhbmsgZGVwdGggZGVxdWV1ZSBkZXNfZGVjcnlwdCBkZXNfZW5jcnlwdCBkZXNfa2V5X2ZpbGUgZGVzYyBkZXNjciBkZXNjcmkgZGVzY3JpYiBkZXNjcmliZSBkZXNjcmlwdG9yIGRldGVybWluaXN0aWMgZGlhZ25vc3RpY3MgZGlmZmVyZW5jZSBkaW1lbnNpb24gZGlyZWN0X2xvYWQgZGlyZWN0b3J5IGRpc2FibGUgZGlzYWJsZV9hbGwgZGlzYWxsb3cgZGlzYXNzb2NpYXRlIGRpc2NhcmRmaWxlIGRpc2Nvbm5lY3QgZGlza2dyb3VwIGRpc3RpbmN0IGRpc3RpbmN0cm93IGRpc3RyaWJ1dGUgZGlzdHJpYnV0ZWQgZGl2IGRvIGRvY3VtZW50IGRvbWFpbiBkb3RuZXQgZG91YmxlIGRvd25ncmFkZSBkcm9wIGR1bXBmaWxlIGR1cGxpY2F0ZSBkdXJhdGlvbiBlYWNoIGVkaXRpb24gZWRpdGlvbmFibGUgZWRpdGlvbnMgZWxlbWVudCBlbGxpcHNpcyBlbHNlIGVsc2lmIGVsdCBlbXB0eSBlbmFibGUgZW5hYmxlX2FsbCBlbmNsb3NlZCBlbmNvZGUgZW5jb2RpbmcgZW5jcnlwdCBlbmQgZW5kLWV4ZWMgZW5kaWFuIGVuZm9yY2VkIGVuZ2luZSBlbmdpbmVzIGVucXVldWUgZW50ZXJwcmlzZSBlbnRpdHllc2NhcGluZyBlb21vbnRoIGVycm9yIGVycm9ycyBlc2NhcGVkIGV2YWxuYW1lIGV2YWx1YXRlIGV2ZW50IGV2ZW50ZGF0YSBldmVudHMgZXhjZXB0IGV4Y2VwdGlvbiBleGNlcHRpb25zIGV4Y2hhbmdlIGV4Y2x1ZGUgZXhjbHVkaW5nIGV4ZWN1IGV4ZWN1dCBleGVjdXRlIGV4ZW1wdCBleGlzdHMgZXhpdCBleHAgZXhwaXJlIGV4cGxhaW4gZXhwb3J0IGV4cG9ydF9zZXQgZXh0ZW5kZWQgZXh0ZW50IGV4dGVybmFsIGV4dGVybmFsXzEgZXh0ZXJuYWxfMiBleHRlcm5hbGx5IGV4dHJhY3QgZmFpbGVkIGZhaWxlZF9sb2dpbl9hdHRlbXB0cyBmYWlsb3ZlciBmYWlsdXJlIGZhciBmYXN0IGZlYXR1cmVfc2V0IGZlYXR1cmVfdmFsdWUgZmV0Y2ggZmllbGQgZmllbGRzIGZpbGUgZmlsZV9uYW1lX2NvbnZlcnQgZmlsZXN5c3RlbV9saWtlX2xvZ2dpbmcgZmluYWwgZmluaXNoIGZpcnN0IGZpcnN0X3ZhbHVlIGZpeGVkIGZsYXNoX2NhY2hlIGZsYXNoYmFjayBmbG9vciBmbHVzaCBmb2xsb3dpbmcgZm9sbG93cyBmb3IgZm9yYWxsIGZvcmNlIGZvcm0gZm9ybWEgZm9ybWF0IGZvdW5kIGZvdW5kX3Jvd3MgZnJlZWxpc3QgZnJlZWxpc3RzIGZyZWVwb29scyBmcmVzaCBmcm9tIGZyb21fYmFzZTY0IGZyb21fZGF5cyBmdHAgZnVsbCBmdW5jdGlvbiBnZW5lcmFsIGdlbmVyYXRlZCBnZXQgZ2V0X2Zvcm1hdCBnZXRfbG9jayBnZXRkYXRlIGdldHV0Y2RhdGUgZ2xvYmFsIGdsb2JhbF9uYW1lIGdsb2JhbGx5IGdvIGdvdG8gZ3JhbnQgZ3JhbnRzIGdyZWF0ZXN0IGdyb3VwIGdyb3VwX2NvbmNhdCBncm91cF9pZCBncm91cGluZyBncm91cGluZ19pZCBncm91cHMgZ3RpZF9zdWJ0cmFjdCBndWFyYW50ZWUgZ3VhcmQgaGFuZGxlciBoYXNoIGhhc2hrZXlzIGhhdmluZyBoZWEgaGVhZCBoZWFkaSBoZWFkaW4gaGVhZGluZyBoZWFwIGhlbHAgaGV4IGhpZXJhcmNoeSBoaWdoIGhpZ2hfcHJpb3JpdHkgaG9zdHMgaG91ciBodHRwIGlkIGlkZW50X2N1cnJlbnQgaWRlbnRfaW5jciBpZGVudF9zZWVkIGlkZW50aWZpZWQgaWRlbnRpdHkgaWRsZV90aW1lIGlmIGlmbnVsbCBpZ25vcmUgaWlmIGlsaWtlIGlsbSBpbW1lZGlhdGUgaW1wb3J0IGluIGluY2x1ZGUgaW5jbHVkaW5nIGluY3JlbWVudCBpbmRleCBpbmRleGVzIGluZGV4aW5nIGluZGV4dHlwZSBpbmRpY2F0b3IgaW5kaWNlcyBpbmV0Nl9hdG9uIGluZXQ2X250b2EgaW5ldF9hdG9uIGluZXRfbnRvYSBpbmZpbGUgaW5pdGlhbCBpbml0aWFsaXplZCBpbml0aWFsbHkgaW5pdHJhbnMgaW5tZW1vcnkgaW5uZXIgaW5ub2RiIGlucHV0IGluc2VydCBpbnN0YWxsIGluc3RhbmNlIGluc3RhbnRpYWJsZSBpbnN0ciBpbnRlcmZhY2UgaW50ZXJsZWF2ZWQgaW50ZXJzZWN0IGludG8gaW52YWxpZGF0ZSBpbnZpc2libGUgaXMgaXNfZnJlZV9sb2NrIGlzX2lwdjQgaXNfaXB2NF9jb21wYXQgaXNfbm90IGlzX25vdF9udWxsIGlzX3VzZWRfbG9jayBpc2RhdGUgaXNudWxsIGlzb2xhdGlvbiBpdGVyYXRlIGphdmEgam9pbiBqc29uIGpzb25fZXhpc3RzIGtlZXAga2VlcF9kdXBsaWNhdGVzIGtleSBrZXlzIGtpbGwgbGFuZ3VhZ2UgbGFyZ2UgbGFzdCBsYXN0X2RheSBsYXN0X2luc2VydF9pZCBsYXN0X3ZhbHVlIGxheCBsY2FzZSBsZWFkIGxlYWRpbmcgbGVhc3QgbGVhdmVzIGxlZnQgbGVuIGxlbmdodCBsZW5ndGggbGVzcyBsZXZlbCBsZXZlbHMgbGlicmFyeSBsaWtlIGxpa2UyIGxpa2U0IGxpa2VjIGxpbWl0IGxpbmVzIGxpbmsgbGlzdCBsaXN0YWdnIGxpdHRsZSBsbiBsb2FkIGxvYWRfZmlsZSBsb2IgbG9icyBsb2NhbCBsb2NhbHRpbWUgbG9jYWx0aW1lc3RhbXAgbG9jYXRlIGxvY2F0b3IgbG9jayBsb2NrZWQgbG9nIGxvZzEwIGxvZzIgbG9nZmlsZSBsb2dmaWxlcyBsb2dnaW5nIGxvZ2ljYWwgbG9naWNhbF9yZWFkc19wZXJfY2FsbCBsb2dvZmYgbG9nb24gbG9ncyBsb25nIGxvb3AgbG93IGxvd19wcmlvcml0eSBsb3dlciBscGFkIGxydHJpbSBsdHJpbSBtYWluIG1ha2Vfc2V0IG1ha2VkYXRlIG1ha2V0aW1lIG1hbmFnZWQgbWFuYWdlbWVudCBtYW51YWwgbWFwIG1hcHBpbmcgbWFzayBtYXN0ZXIgbWFzdGVyX3Bvc193YWl0IG1hdGNoIG1hdGNoZWQgbWF0ZXJpYWxpemVkIG1heCBtYXhleHRlbnRzIG1heGltaXplIG1heGluc3RhbmNlcyBtYXhsZW4gbWF4bG9nZmlsZXMgbWF4bG9naGlzdG9yeSBtYXhsb2dtZW1iZXJzIG1heHNpemUgbWF4dHJhbnMgbWQ1IG1lYXN1cmVzIG1lZGlhbiBtZWRpdW0gbWVtYmVyIG1lbWNvbXByZXNzIG1lbW9yeSBtZXJnZSBtaWNyb3NlY29uZCBtaWQgbWlncmF0aW9uIG1pbiBtaW5leHRlbnRzIG1pbmltdW0gbWluaW5nIG1pbnVzIG1pbnV0ZSBtaW52YWx1ZSBtaXNzaW5nIG1vZCBtb2RlIG1vZGVsIG1vZGlmaWNhdGlvbiBtb2RpZnkgbW9kdWxlIG1vbml0b3JpbmcgbW9udGggbW9udGhzIG1vdW50IG1vdmUgbW92ZW1lbnQgbXVsdGlzZXQgbXV0ZXggbmFtZSBuYW1lX2NvbnN0IG5hbWVzIG5hbiBuYXRpb25hbCBuYXRpdmUgbmF0dXJhbCBuYXYgbmNoYXIgbmNsb2IgbmVzdGVkIG5ldmVyIG5ldyBuZXdsaW5lIG5leHQgbmV4dHZhbCBubyBub193cml0ZV90b19iaW5sb2cgbm9hcmNoaXZlbG9nIG5vYXVkaXQgbm9iYWRmaWxlIG5vY2hlY2sgbm9jb21wcmVzcyBub2NvcHkgbm9jeWNsZSBub2RlbGF5IG5vZGlzY2FyZGZpbGUgbm9lbnRpdHllc2NhcGluZyBub2d1YXJhbnRlZSBub2tlZXAgbm9sb2dmaWxlIG5vbWFwcGluZyBub21heHZhbHVlIG5vbWluaW1pemUgbm9taW52YWx1ZSBub21vbml0b3Jpbmcgbm9uZSBub25lZGl0aW9uYWJsZSBub25zY2hlbWEgbm9vcmRlciBub3ByIG5vcHJvIG5vcHJvbSBub3Byb21wIG5vcHJvbXB0IG5vcmVseSBub3Jlc2V0bG9ncyBub3JldmVyc2Ugbm9ybWFsIG5vcm93ZGVwZW5kZW5jaWVzIG5vc2NoZW1hY2hlY2sgbm9zd2l0Y2ggbm90IG5vdGhpbmcgbm90aWNlIG5vdHJpbSBub3ZhbGlkYXRlIG5vdyBub3dhaXQgbnRoX3ZhbHVlIG51bGxpZiBudWxscyBudW0gbnVtYiBudW1iZSBudmFyY2hhciBudmFyY2hhcjIgb2JqZWN0IG9jaWNvbGwgb2NpZGF0ZSBvY2lkYXRldGltZSBvY2lkdXJhdGlvbiBvY2lpbnRlcnZhbCBvY2lsb2Jsb2NhdG9yIG9jaW51bWJlciBvY2lyZWYgb2NpcmVmY3Vyc29yIG9jaXJvd2lkIG9jaXN0cmluZyBvY2l0eXBlIG9jdCBvY3RldF9sZW5ndGggb2Ygb2ZmIG9mZmxpbmUgb2Zmc2V0IG9pZCBvaWRpbmRleCBvbGQgb24gb25saW5lIG9ubHkgb3BhcXVlIG9wZW4gb3BlcmF0aW9ucyBvcGVyYXRvciBvcHRpbWFsIG9wdGltaXplIG9wdGlvbiBvcHRpb25hbGx5IG9yIG9yYWNsZSBvcmFjbGVfZGF0ZSBvcmFkYXRhIG9yZCBvcmRhdWRpbyBvcmRkaWNvbSBvcmRkb2Mgb3JkZXIgb3JkaW1hZ2Ugb3JkaW5hbGl0eSBvcmR2aWRlbyBvcmdhbml6YXRpb24gb3JsYW55IG9ybHZhcnkgb3V0IG91dGVyIG91dGZpbGUgb3V0bGluZSBvdXRwdXQgb3ZlciBvdmVyZmxvdyBvdmVycmlkaW5nIHBhY2thZ2UgcGFkIHBhcmFsbGVsIHBhcmFsbGVsX2VuYWJsZSBwYXJhbWV0ZXJzIHBhcmVudCBwYXJzZSBwYXJ0aWFsIHBhcnRpdGlvbiBwYXJ0aXRpb25zIHBhc2NhbCBwYXNzaW5nIHBhc3N3b3JkIHBhc3N3b3JkX2dyYWNlX3RpbWUgcGFzc3dvcmRfbG9ja190aW1lIHBhc3N3b3JkX3JldXNlX21heCBwYXNzd29yZF9yZXVzZV90aW1lIHBhc3N3b3JkX3ZlcmlmeV9mdW5jdGlvbiBwYXRjaCBwYXRoIHBhdGluZGV4IHBjdGluY3JlYXNlIHBjdHRocmVzaG9sZCBwY3R1c2VkIHBjdHZlcnNpb24gcGVyY2VudCBwZXJjZW50X3JhbmsgcGVyY2VudGlsZV9jb250IHBlcmNlbnRpbGVfZGlzYyBwZXJmb3JtYW5jZSBwZXJpb2QgcGVyaW9kX2FkZCBwZXJpb2RfZGlmZiBwZXJtYW5lbnQgcGh5c2ljYWwgcGkgcGlwZSBwaXBlbGluZWQgcGl2b3QgcGx1Z2dhYmxlIHBsdWdpbiBwb2xpY3kgcG9zaXRpb24gcG9zdF90cmFuc2FjdGlvbiBwb3cgcG93ZXIgcHJhZ21hIHByZWJ1aWx0IHByZWNlZGVzIHByZWNlZGluZyBwcmVjaXNpb24gcHJlZGljdGlvbiBwcmVkaWN0aW9uX2Nvc3QgcHJlZGljdGlvbl9kZXRhaWxzIHByZWRpY3Rpb25fcHJvYmFiaWxpdHkgcHJlZGljdGlvbl9zZXQgcHJlcGFyZSBwcmVzZW50IHByZXNlcnZlIHByaW9yIHByaW9yaXR5IHByaXZhdGUgcHJpdmF0ZV9zZ2EgcHJpdmlsZWdlcyBwcm9jZWR1cmFsIHByb2NlZHVyZSBwcm9jZWR1cmVfYW5hbHl6ZSBwcm9jZXNzbGlzdCBwcm9maWxlcyBwcm9qZWN0IHByb21wdCBwcm90ZWN0aW9uIHB1YmxpYyBwdWJsaXNoaW5nc2VydmVybmFtZSBwdXJnZSBxdWFydGVyIHF1ZXJ5IHF1aWNrIHF1aWVzY2UgcXVvdGEgcXVvdGVuYW1lIHJhZGlhbnMgcmFpc2UgcmFuZCByYW5nZSByYW5rIHJhdyByZWFkIHJlYWRzIHJlYWRzaXplIHJlYnVpbGQgcmVjb3JkIHJlY29yZHMgcmVjb3ZlciByZWNvdmVyeSByZWN1cnNpdmUgcmVjeWNsZSByZWRvIHJlZHVjZWQgcmVmIHJlZmVyZW5jZSByZWZlcmVuY2VkIHJlZmVyZW5jZXMgcmVmZXJlbmNpbmcgcmVmcmVzaCByZWdleHBfbGlrZSByZWdpc3RlciByZWdyX2F2Z3ggcmVncl9hdmd5IHJlZ3JfY291bnQgcmVncl9pbnRlcmNlcHQgcmVncl9yMiByZWdyX3Nsb3BlIHJlZ3Jfc3h4IHJlZ3Jfc3h5IHJlamVjdCByZWtleSByZWxhdGlvbmFsIHJlbGF0aXZlIHJlbGF5bG9nIHJlbGVhc2UgcmVsZWFzZV9sb2NrIHJlbGllc19vbiByZWxvY2F0ZSByZWx5IHJlbSByZW1haW5kZXIgcmVuYW1lIHJlcGFpciByZXBlYXQgcmVwbGFjZSByZXBsaWNhdGUgcmVwbGljYXRpb24gcmVxdWlyZWQgcmVzZXQgcmVzZXRsb2dzIHJlc2l6ZSByZXNvdXJjZSByZXNwZWN0IHJlc3RvcmUgcmVzdHJpY3RlZCByZXN1bHQgcmVzdWx0X2NhY2hlIHJlc3VtYWJsZSByZXN1bWUgcmV0ZW50aW9uIHJldHVybiByZXR1cm5pbmcgcmV0dXJucyByZXVzZSByZXZlcnNlIHJldm9rZSByaWdodCBybGlrZSByb2xlIHJvbGVzIHJvbGxiYWNrIHJvbGxpbmcgcm9sbHVwIHJvdW5kIHJvdyByb3dfY291bnQgcm93ZGVwZW5kZW5jaWVzIHJvd2lkIHJvd251bSByb3dzIHJ0cmltIHJ1bGVzIHNhZmUgc2FsdCBzYW1wbGUgc2F2ZSBzYXZlcG9pbnQgc2IxIHNiMiBzYjQgc2NhbiBzY2hlbWEgc2NoZW1hY2hlY2sgc2NuIHNjb3BlIHNjcm9sbCBzZG9fZ2VvcmFzdGVyIHNkb190b3BvX2dlb21ldHJ5IHNlYXJjaCBzZWNfdG9fdGltZSBzZWNvbmQgc2VjdGlvbiBzZWN1cmVmaWxlIHNlY3VyaXR5IHNlZWQgc2VnbWVudCBzZWxlY3Qgc2VsZiBzZXF1ZW5jZSBzZXF1ZW50aWFsIHNlcmlhbGl6YWJsZSBzZXJ2ZXIgc2VydmVyZXJyb3Igc2Vzc2lvbiBzZXNzaW9uX3VzZXIgc2Vzc2lvbnNfcGVyX3VzZXIgc2V0IHNldHMgc2V0dGluZ3Mgc2hhIHNoYTEgc2hhMiBzaGFyZSBzaGFyZWQgc2hhcmVkX3Bvb2wgc2hvcnQgc2hvdyBzaHJpbmsgc2h1dGRvd24gc2lfYXZlcmFnZWNvbG9yIHNpX2NvbG9yaGlzdG9ncmFtIHNpX2ZlYXR1cmVsaXN0IHNpX3Bvc2l0aW9uYWxjb2xvciBzaV9zdGlsbGltYWdlIHNpX3RleHR1cmUgc2libGluZ3Mgc2lkIHNpZ24gc2luIHNpemUgc2l6ZV90IHNpemVzIHNraXAgc2xhdmUgc2xlZXAgc21hbGxkYXRldGltZWZyb21wYXJ0cyBzbWFsbGZpbGUgc25hcHNob3Qgc29tZSBzb25hbWUgc29ydCBzb3VuZGV4IHNvdXJjZSBzcGFjZSBzcGFyc2Ugc3BmaWxlIHNwbGl0IHNxbCBzcWxfYmlnX3Jlc3VsdCBzcWxfYnVmZmVyX3Jlc3VsdCBzcWxfY2FjaGUgc3FsX2NhbGNfZm91bmRfcm93cyBzcWxfc21hbGxfcmVzdWx0IHNxbF92YXJpYW50X3Byb3BlcnR5IHNxbGNvZGUgc3FsZGF0YSBzcWxlcnJvciBzcWxuYW1lIHNxbHN0YXRlIHNxcnQgc3F1YXJlIHN0YW5kYWxvbmUgc3RhbmRieSBzdGFydCBzdGFydGluZyBzdGFydHVwIHN0YXRlbWVudCBzdGF0aWMgc3RhdGlzdGljcyBzdGF0c19iaW5vbWlhbF90ZXN0IHN0YXRzX2Nyb3NzdGFiIHN0YXRzX2tzX3Rlc3Qgc3RhdHNfbW9kZSBzdGF0c19td190ZXN0IHN0YXRzX29uZV93YXlfYW5vdmEgc3RhdHNfdF90ZXN0XyBzdGF0c190X3Rlc3RfaW5kZXAgc3RhdHNfdF90ZXN0X29uZSBzdGF0c190X3Rlc3RfcGFpcmVkIHN0YXRzX3dzcl90ZXN0IHN0YXR1cyBzdGQgc3RkZGV2IHN0ZGRldl9wb3Agc3RkZGV2X3NhbXAgc3RkZXYgc3RvcCBzdG9yYWdlIHN0b3JlIHN0b3JlZCBzdHIgc3RyX3RvX2RhdGUgc3RyYWlnaHRfam9pbiBzdHJjbXAgc3RyaWN0IHN0cmluZyBzdHJ1Y3Qgc3R1ZmYgc3R5bGUgc3ViZGF0ZSBzdWJwYXJ0aXRpb24gc3VicGFydGl0aW9ucyBzdWJzdGl0dXRhYmxlIHN1YnN0ciBzdWJzdHJpbmcgc3VidGltZSBzdWJ0cmluZ19pbmRleCBzdWJ0eXBlIHN1Y2Nlc3Mgc3VtIHN1c3BlbmQgc3dpdGNoIHN3aXRjaG9mZnNldCBzd2l0Y2hvdmVyIHN5bmMgc3luY2hyb25vdXMgc3lub255bSBzeXMgc3lzX3htbGFnZyBzeXNhc20gc3lzYXV4IHN5c2RhdGUgc3lzZGF0ZXRpbWVvZmZzZXQgc3lzZGJhIHN5c29wZXIgc3lzdGVtIHN5c3RlbV91c2VyIHN5c3V0Y2RhdGV0aW1lIHRhYmxlIHRhYmxlcyB0YWJsZXNwYWNlIHRhbiB0ZG8gdGVtcGxhdGUgdGVtcG9yYXJ5IHRlcm1pbmF0ZWQgdGVydGlhcnlfd2VpZ2h0cyB0ZXN0IHRoYW4gdGhlbiB0aHJlYWQgdGhyb3VnaCB0aWVyIHRpZXMgdGltZSB0aW1lX2Zvcm1hdCB0aW1lX3pvbmUgdGltZWRpZmYgdGltZWZyb21wYXJ0cyB0aW1lb3V0IHRpbWVzdGFtcCB0aW1lc3RhbXBhZGQgdGltZXN0YW1wZGlmZiB0aW1lem9uZV9hYmJyIHRpbWV6b25lX21pbnV0ZSB0aW1lem9uZV9yZWdpb24gdG8gdG9fYmFzZTY0IHRvX2RhdGUgdG9fZGF5cyB0b19zZWNvbmRzIHRvZGF0ZXRpbWVvZmZzZXQgdHJhY2UgdHJhY2tpbmcgdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb25hbCB0cmFuc2xhdGUgdHJhbnNsYXRpb24gdHJlYXQgdHJpZ2dlciB0cmlnZ2VyX25lc3RsZXZlbCB0cmlnZ2VycyB0cmltIHRydW5jYXRlIHRyeV9jYXN0IHRyeV9jb252ZXJ0IHRyeV9wYXJzZSB0eXBlIHViMSB1YjIgdWI0IHVjYXNlIHVuYXJjaGl2ZWQgdW5ib3VuZGVkIHVuY29tcHJlc3MgdW5kZXIgdW5kbyB1bmhleCB1bmljb2RlIHVuaWZvcm0gdW5pbnN0YWxsIHVuaW9uIHVuaXF1ZSB1bml4X3RpbWVzdGFtcCB1bmtub3duIHVubGltaXRlZCB1bmxvY2sgdW5waXZvdCB1bnJlY292ZXJhYmxlIHVuc2FmZSB1bnNpZ25lZCB1bnRpbCB1bnRydXN0ZWQgdW51c2FibGUgdW51c2VkIHVwZGF0ZSB1cGRhdGVkIHVwZ3JhZGUgdXBwZWQgdXBwZXIgdXBzZXJ0IHVybCB1cm93aWQgdXNhYmxlIHVzYWdlIHVzZSB1c2Vfc3RvcmVkX291dGxpbmVzIHVzZXIgdXNlcl9kYXRhIHVzZXJfcmVzb3VyY2VzIHVzZXJzIHVzaW5nIHV0Y19kYXRlIHV0Y190aW1lc3RhbXAgdXVpZCB1dWlkX3Nob3J0IHZhbGlkYXRlIHZhbGlkYXRlX3Bhc3N3b3JkX3N0cmVuZ3RoIHZhbGlkYXRpb24gdmFsaXN0IHZhbHVlIHZhbHVlcyB2YXIgdmFyX3NhbXAgdmFyY2hhcmMgdmFyaSB2YXJpYSB2YXJpYWIgdmFyaWFibCB2YXJpYWJsZSB2YXJpYWJsZXMgdmFyaWFuY2UgdmFycCB2YXJyYXcgdmFycmF3YyB2YXJyYXkgdmVyaWZ5IHZlcnNpb24gdmVyc2lvbnMgdmlldyB2aXJ0dWFsIHZpc2libGUgdm9pZCB3YWl0IHdhbGxldCB3YXJuaW5nIHdhcm5pbmdzIHdlZWsgd2Vla2RheSB3ZWVrb2Z5ZWFyIHdlbGxmb3JtZWQgd2hlbiB3aGVuZSB3aGVuZXYgd2hlbmV2ZSB3aGVuZXZlciB3aGVyZSB3aGlsZSB3aGl0ZXNwYWNlIHdpdGggd2l0aGluIHdpdGhvdXQgd29yayB3cmFwcGVkIHhkYiB4bWwgeG1sYWdnIHhtbGF0dHJpYnV0ZXMgeG1sY2FzdCB4bWxjb2xhdHR2YWwgeG1sZWxlbWVudCB4bWxleGlzdHMgeG1sZm9yZXN0IHhtbGluZGV4IHhtbG5hbWVzcGFjZXMgeG1scGkgeG1scXVlcnkgeG1scm9vdCB4bWxzY2hlbWEgeG1sc2VyaWFsaXplIHhtbHRhYmxlIHhtbHR5cGUgeG9yIHllYXIgeWVhcl90b19tb250aCB5ZWFycyB5ZWFyd2VlayIsbGl0ZXJhbDoidHJ1ZSBmYWxzZSBudWxsIixidWlsdF9pbjoiYXJyYXkgYmlnaW50IGJpbmFyeSBiaXQgYmxvYiBib29sZWFuIGNoYXIgY2hhcmFjdGVyIGRhdGUgZGVjIGRlY2ltYWwgZmxvYXQgaW50IGludDggaW50ZWdlciBpbnRlcnZhbCBudW1iZXIgbnVtZXJpYyByZWFsIHJlY29yZCBzZXJpYWwgc2VyaWFsOCBzbWFsbGludCB0ZXh0IHZhcmNoYXIgdmFyeWluZyB2b2lkIn0sYzpbe2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGM6W2UuQkUse2I6IicnIn1dfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzpbZS5CRSx7YjonIiInfV19LHtjTjoic3RyaW5nIixiOiJgIixlOiJgIixjOltlLkJFXX0sZS5DTk0sZS5DQkNNLHRdfSxlLkNCQ00sdF19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJyIixmdW5jdGlvbihlKXt2YXIgcj0iKFthLXpBLVpdfFxcLlthLXpBLVouXSlbYS16QS1aMC05Ll9dKiI7cmV0dXJue2M6W2UuSENNLHtiOnIsbDpyLGs6e2tleXdvcmQ6ImZ1bmN0aW9uIGlmIGluIGJyZWFrIG5leHQgcmVwZWF0IGVsc2UgZm9yIHJldHVybiBzd2l0Y2ggd2hpbGUgdHJ5IHRyeUNhdGNoIHN0b3Agd2FybmluZyByZXF1aXJlIGxpYnJhcnkgYXR0YWNoIGRldGFjaCBzb3VyY2Ugc2V0TWV0aG9kIHNldEdlbmVyaWMgc2V0R3JvdXBHZW5lcmljIHNldENsYXNzIC4uLiIsbGl0ZXJhbDoiTlVMTCBOQSBUUlVFIEZBTFNFIFQgRiBJbmYgTmFOIE5BX2ludGVnZXJffDEwIE5BX3JlYWxffDEwIE5BX2NoYXJhY3Rlcl98MTAgTkFfY29tcGxleF98MTAifSxyOjB9LHtjTjoibnVtYmVyIixiOiIwW3hYXVswLTlhLWZBLUZdK1tMaV0/XFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXGQrKD86W2VFXVsrXFwtXT9cXGQqKT9MXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXGQrXFwuKD8hXFxkKSg/OmlcXGIpPyIscjowfSx7Y046Im51bWJlciIsYjoiXFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK1xcLV0/XFxkKik/aT9cXGIiLHI6MH0se2NOOiJudW1iZXIiLGI6IlxcLlxcZCsoPzpbZUVdWytcXC1dP1xcZCopP2k/XFxiIixyOjB9LHtiOiJgIixlOiJgIixyOjB9LHtjTjoic3RyaW5nIixjOltlLkJFXSx2Olt7YjonIicsZTonIid9LHtiOiInIixlOiInIn1dfV19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJwZXJsIixmdW5jdGlvbihlKXt2YXIgdD0iZ2V0cHdlbnQgZ2V0c2VydmVudCBxdW90ZW1ldGEgbXNncmN2IHNjYWxhciBraWxsIGRibWNsb3NlIHVuZGVmIGxjIG1hIHN5c3dyaXRlIHRyIHNlbmQgdW1hc2sgc3lzb3BlbiBzaG13cml0ZSB2ZWMgcXggdXRpbWUgbG9jYWwgb2N0IHNlbWN0bCBsb2NhbHRpbWUgcmVhZHBpcGUgZG8gcmV0dXJuIGZvcm1hdCByZWFkIHNwcmludGYgZGJtb3BlbiBwb3AgZ2V0cGdycCBub3QgZ2V0cHduYW0gcmV3aW5kZGlyIHFxZmlsZW5vIHF3IGVuZHByb3RvZW50IHdhaXQgc2V0aG9zdGVudCBibGVzcyBzfDAgb3BlbmRpciBjb250aW51ZSBlYWNoIHNsZWVwIGVuZGdyZW50IHNodXRkb3duIGR1bXAgY2hvbXAgY29ubmVjdCBnZXRzb2NrbmFtZSBkaWUgc29ja2V0cGFpciBjbG9zZSBmbG9jayBleGlzdHMgaW5kZXggc2htZ2V0c3ViIGZvciBlbmRwd2VudCByZWRvIGxzdGF0IG1zZ2N0bCBzZXRwZ3JwIGFicyBleGl0IHNlbGVjdCBwcmludCByZWYgZ2V0aG9zdGJ5YWRkciB1bnNoaWZ0IGZjbnRsIHN5c2NhbGwgZ290byBnZXRuZXRieWFkZHIgam9pbiBnbXRpbWUgc3ltbGluayBzZW1nZXQgc3BsaWNlIHh8MCBnZXRwZWVybmFtZSByZWN2IGxvZyBzZXRzb2Nrb3B0IGNvcyBsYXN0IHJldmVyc2UgZ2V0aG9zdGJ5bmFtZSBnZXRncm5hbSBzdHVkeSBmb3JtbGluZSBlbmRob3N0ZW50IHRpbWVzIGNob3AgbGVuZ3RoIGdldGhvc3RlbnQgZ2V0bmV0ZW50IHBhY2sgZ2V0cHJvdG9lbnQgZ2V0c2VydmJ5bmFtZSByYW5kIG1rZGlyIHBvcyBjaG1vZCB5fDAgc3Vic3RyIGVuZG5ldGVudCBwcmludGYgbmV4dCBvcGVuIG1zZ3NuZCByZWFkZGlyIHVzZSB1bmxpbmsgZ2V0c29ja29wdCBnZXRwcmlvcml0eSByaW5kZXggd2FudGFycmF5IGhleCBzeXN0ZW0gZ2V0c2VydmJ5cG9ydCBlbmRzZXJ2ZW50IGludCBjaHIgdW50aWUgcm1kaXIgcHJvdG90eXBlIHRlbGwgbGlzdGVuIGZvcmsgc2htcmVhZCB1Y2ZpcnN0IHNldHByb3RvZW50IGVsc2Ugc3lzc2VlayBsaW5rIGdldGdyZ2lkIHNobWN0bCB3YWl0cGlkIHVucGFjayBnZXRuZXRieW5hbWUgcmVzZXQgY2hkaXIgZ3JlcCBzcGxpdCByZXF1aXJlIGNhbGxlciBsY2ZpcnN0IHVudGlsIHdhcm4gd2hpbGUgdmFsdWVzIHNoaWZ0IHRlbGxkaXIgZ2V0cHd1aWQgbXkgZ2V0cHJvdG9ieW51bWJlciBkZWxldGUgYW5kIHNvcnQgdWMgZGVmaW5lZCBzcmFuZCBhY2NlcHQgcGFja2FnZSBzZWVrZGlyIGdldHByb3RvYnluYW1lIHNlbW9wIG91ciByZW5hbWUgc2VlayBpZiBxfDAgY2hyb290IHN5c3JlYWQgc2V0cHdlbnQgbm8gY3J5cHQgZ2V0YyBjaG93biBzcXJ0IHdyaXRlIHNldG5ldGVudCBzZXRwcmlvcml0eSBmb3JlYWNoIHRpZSBzaW4gbXNnZ2V0IG1hcCBzdGF0IGdldGxvZ2luIHVubGVzcyBlbHNpZiB0cnVuY2F0ZSBleGVjIGtleXMgZ2xvYiB0aWVkIGNsb3NlZGlyaW9jdGwgc29ja2V0IHJlYWRsaW5rIGV2YWwgeG9yIHJlYWRsaW5lIGJpbm1vZGUgc2V0c2VydmVudCBlb2Ygb3JkIGJpbmQgYWxhcm0gcGlwZSBhdGFuMiBnZXRncmVudCBleHAgdGltZSBwdXNoIHNldGdyZW50IGd0IGx0IG9yIG5lIG18MCBicmVhayBnaXZlbiBzYXkgc3RhdGUgd2hlbiIscj17Y046InN1YnN0IixiOiJbJEBdXFx7IixlOiJcXH0iLGs6dH0scz17YjoiLT57IixlOiJ9In0sbj17djpbe2I6L1wkXGQvfSx7YjovW1wkJUBdKFxeXHdcYnwjXHcrKDo6XHcrKSp8e1x3K318XHcrKDo6XHcqKSopL30se2I6L1tcJCVAXVteXHNcd3tdLyxyOjB9XX0saT1bZS5CRSxyLG5dLG89W24sZS5IQ00sZS5DKCJeXFw9XFx3IiwiXFw9Y3V0Iix7ZVc6ITB9KSxzLHtjTjoic3RyaW5nIixjOmksdjpbe2I6InFbcXd4cl0/XFxzKlxcKCIsZToiXFwpIixyOjV9LHtiOiJxW3F3eHJdP1xccypcXFsiLGU6IlxcXSIscjo1fSx7YjoicVtxd3hyXT9cXHMqXFx7IixlOiJcXH0iLHI6NX0se2I6InFbcXd4cl0/XFxzKlxcfCIsZToiXFx8IixyOjV9LHtiOiJxW3F3eHJdP1xccypcXDwiLGU6IlxcPiIscjo1fSx7YjoicXdcXHMrcSIsZToicSIscjo1fSx7YjoiJyIsZToiJyIsYzpbZS5CRV19LHtiOiciJyxlOiciJ30se2I6ImAiLGU6ImAiLGM6W2UuQkVdfSx7Yjoie1xcdyt9IixjOltdLHI6MH0se2I6Ii0/XFx3K1xccypcXD1cXD4iLGM6W10scjowfV19LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtiOiIoXFwvXFwvfCIrZS5SU1IrInxcXGIoc3BsaXR8cmV0dXJufHByaW50fHJldmVyc2V8Z3JlcClcXGIpXFxzKiIsazoic3BsaXQgcmV0dXJuIHByaW50IHJldmVyc2UgZ3JlcCIscjowLGM6W2UuSENNLHtjTjoicmVnZXhwIixiOiIoc3x0cnx5KS8oXFxcXC58W14vXSkqLyhcXFxcLnxbXi9dKSovW2Etel0qIixyOjEwfSx7Y046InJlZ2V4cCIsYjoiKG18cXIpPy8iLGU6Ii9bYS16XSoiLGM6W2UuQkVdLHI6MH1dfSx7Y046ImZ1bmN0aW9uIixiSzoic3ViIixlOiIoXFxzKlxcKC4qP1xcKSk/Wzt7XSIsZUU6ITAscjo1LGM6W2UuVE1dfSx7YjoiLVxcd1xcYiIscjowfSx7YjoiXl9fREFUQV9fJCIsZToiXl9fRU5EX18kIixzTDoibW9qb2xpY2lvdXMiLGM6W3tiOiJeQEAuKiIsZToiJCIsY046ImNvbW1lbnQifV19XTtyZXR1cm4gci5jPW8scy5jPW8se2FsaWFzZXM6WyJwbCIsInBtIl0sbDovW1x3XC5dKy8sazp0LGM6b319KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImluaSIsZnVuY3Rpb24oZSl7dmFyIGI9e2NOOiJzdHJpbmciLGM6W2UuQkVdLHY6W3tiOiInJyciLGU6IicnJyIscjoxMH0se2I6JyIiIicsZTonIiIiJyxyOjEwfSx7YjonIicsZTonIid9LHtiOiInIixlOiInIn1dfTtyZXR1cm57YWxpYXNlczpbInRvbWwiXSxjSTohMCxpOi9cUy8sYzpbZS5DKCI7IiwiJCIpLGUuSENNLHtjTjoic2VjdGlvbiIsYjovXlxzKlxbKy8sZTovXF0rL30se2I6L15bYS16MC05XFtcXV8tXStccyo9XHMqLyxlOiIkIixyQjohMCxjOlt7Y046ImF0dHIiLGI6L1thLXowLTlcW1xdXy1dKy99LHtiOi89LyxlVzohMCxyOjAsYzpbe2NOOiJsaXRlcmFsIixiOi9cYm9ufG9mZnx0cnVlfGZhbHNlfHllc3xub1xiL30se2NOOiJ2YXJpYWJsZSIsdjpbe2I6L1wkW1x3XGQiXVtcd1xkX10qL30se2I6L1wkXHsoLio/KX0vfV19LGIse2NOOiJudW1iZXIiLGI6LyhbXCtcLV0rKT9bXGRdK19bXGRfXSsvfSxlLk5NXX1dfV19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJkaWZmIixmdW5jdGlvbihlKXtyZXR1cm57YWxpYXNlczpbInBhdGNoIl0sYzpbe2NOOiJtZXRhIixyOjEwLHY6W3tiOi9eQEAgK1wtXGQrLFxkKyArXCtcZCssXGQrICtAQCQvfSx7YjovXlwqXCpcKiArXGQrLFxkKyArXCpcKlwqXCokL30se2I6L15cLVwtXC0gK1xkKyxcZCsgK1wtXC1cLVwtJC99XX0se2NOOiJjb21tZW50Iix2Olt7YjovSW5kZXg6IC8sZTovJC99LHtiOi89ezMsfS8sZTovJC99LHtiOi9eXC17M30vLGU6LyQvfSx7YjovXlwqezN9IC8sZTovJC99LHtiOi9eXCt7M30vLGU6LyQvfSx7YjovXCp7NX0vLGU6L1wqezV9JC99XX0se2NOOiJhZGRpdGlvbiIsYjoiXlxcKyIsZToiJCJ9LHtjTjoiZGVsZXRpb24iLGI6Il5cXC0iLGU6IiQifSx7Y046ImFkZGl0aW9uIixiOiJeXFwhIixlOiIkIn1dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgiZ28iLGZ1bmN0aW9uKGUpe3ZhciB0PXtrZXl3b3JkOiJicmVhayBkZWZhdWx0IGZ1bmMgaW50ZXJmYWNlIHNlbGVjdCBjYXNlIG1hcCBzdHJ1Y3QgY2hhbiBlbHNlIGdvdG8gcGFja2FnZSBzd2l0Y2ggY29uc3QgZmFsbHRocm91Z2ggaWYgcmFuZ2UgdHlwZSBjb250aW51ZSBmb3IgaW1wb3J0IHJldHVybiB2YXIgZ28gZGVmZXIgYm9vbCBieXRlIGNvbXBsZXg2NCBjb21wbGV4MTI4IGZsb2F0MzIgZmxvYXQ2NCBpbnQ4IGludDE2IGludDMyIGludDY0IHN0cmluZyB1aW50OCB1aW50MTYgdWludDMyIHVpbnQ2NCBpbnQgdWludCB1aW50cHRyIHJ1bmUiLGxpdGVyYWw6InRydWUgZmFsc2UgaW90YSBuaWwiLGJ1aWx0X2luOiJhcHBlbmQgY2FwIGNsb3NlIGNvbXBsZXggY29weSBpbWFnIGxlbiBtYWtlIG5ldyBwYW5pYyBwcmludCBwcmludGxuIHJlYWwgcmVjb3ZlciBkZWxldGUifTtyZXR1cm57YWxpYXNlczpbImdvbGFuZyJdLGs6dCxpOiI8LyIsYzpbZS5DTENNLGUuQ0JDTSx7Y046InN0cmluZyIsdjpbZS5RU00se2I6IiciLGU6IlteXFxcXF0nIn0se2I6ImAiLGU6ImAifV19LHtjTjoibnVtYmVyIix2Olt7YjplLkNOUisiW2RmbHNpXSIscjoxfSxlLkNOTV19LHtiOi86PS99LHtjTjoiZnVuY3Rpb24iLGJLOiJmdW5jIixlOi9ccypcey8sZUU6ITAsYzpbZS5UTSx7Y046InBhcmFtcyIsYjovXCgvLGU6L1wpLyxrOnQsaTovWyInXS99XX1dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgiYmFzaCIsZnVuY3Rpb24oZSl7dmFyIHQ9e2NOOiJ2YXJpYWJsZSIsdjpbe2I6L1wkW1x3XGQjQF1bXHdcZF9dKi99LHtiOi9cJFx7KC4qPyl9L31dfSxzPXtjTjoic3RyaW5nIixiOi8iLyxlOi8iLyxjOltlLkJFLHQse2NOOiJ2YXJpYWJsZSIsYjovXCRcKC8sZTovXCkvLGM6W2UuQkVdfV19LGE9e2NOOiJzdHJpbmciLGI6LycvLGU6LycvfTtyZXR1cm57YWxpYXNlczpbInNoIiwienNoIl0sbDovXGItP1thLXpcLl9dK1xiLyxrOntrZXl3b3JkOiJpZiB0aGVuIGVsc2UgZWxpZiBmaSBmb3Igd2hpbGUgaW4gZG8gZG9uZSBjYXNlIGVzYWMgZnVuY3Rpb24iLGxpdGVyYWw6InRydWUgZmFsc2UiLGJ1aWx0X2luOiJicmVhayBjZCBjb250aW51ZSBldmFsIGV4ZWMgZXhpdCBleHBvcnQgZ2V0b3B0cyBoYXNoIHB3ZCByZWFkb25seSByZXR1cm4gc2hpZnQgdGVzdCB0aW1lcyB0cmFwIHVtYXNrIHVuc2V0IGFsaWFzIGJpbmQgYnVpbHRpbiBjYWxsZXIgY29tbWFuZCBkZWNsYXJlIGVjaG8gZW5hYmxlIGhlbHAgbGV0IGxvY2FsIGxvZ291dCBtYXBmaWxlIHByaW50ZiByZWFkIHJlYWRhcnJheSBzb3VyY2UgdHlwZSB0eXBlc2V0IHVsaW1pdCB1bmFsaWFzIHNldCBzaG9wdCBhdXRvbG9hZCBiZyBiaW5ka2V5IGJ5ZSBjYXAgY2hkaXIgY2xvbmUgY29tcGFyZ3VtZW50cyBjb21wY2FsbCBjb21wY3RsIGNvbXBkZXNjcmliZSBjb21wZmlsZXMgY29tcGdyb3VwcyBjb21wcXVvdGUgY29tcHRhZ3MgY29tcHRyeSBjb21wdmFsdWVzIGRpcnMgZGlzYWJsZSBkaXNvd24gZWNob3RjIGVjaG90aSBlbXVsYXRlIGZjIGZnIGZsb2F0IGZ1bmN0aW9ucyBnZXRjYXAgZ2V0bG4gaGlzdG9yeSBpbnRlZ2VyIGpvYnMga2lsbCBsaW1pdCBsb2cgbm9nbG9iIHBvcGQgcHJpbnQgcHVzaGQgcHVzaGxuIHJlaGFzaCBzY2hlZCBzZXRjYXAgc2V0b3B0IHN0YXQgc3VzcGVuZCB0dHljdGwgdW5mdW5jdGlvbiB1bmhhc2ggdW5saW1pdCB1bnNldG9wdCB2YXJlZCB3YWl0IHdoZW5jZSB3aGVyZSB3aGljaCB6Y29tcGlsZSB6Zm9ybWF0IHpmdHAgemxlIHptb2Rsb2FkIHpwYXJzZW9wdHMgenByb2YgenB0eSB6cmVnZXhwYXJzZSB6c29ja2V0IHpzdHlsZSB6dGNwIixfOiItbmUgLWVxIC1sdCAtZ3QgLWYgLWQgLWUgLXMgLWwgLWEifSxjOlt7Y046Im1ldGEiLGI6L14jIVteXG5dK3NoXHMqJC8scjoxMH0se2NOOiJmdW5jdGlvbiIsYjovXHdbXHdcZF9dKlxzKlwoXHMqXClccypcey8sckI6ITAsYzpbZS5pbmhlcml0KGUuVE0se2I6L1x3W1x3XGRfXSovfSldLHI6MH0sZS5IQ00scyxhLHRdfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgicHl0aG9uIixmdW5jdGlvbihlKXt2YXIgcj17a2V5d29yZDoiYW5kIGVsaWYgaXMgZ2xvYmFsIGFzIGluIGlmIGZyb20gcmFpc2UgZm9yIGV4Y2VwdCBmaW5hbGx5IHByaW50IGltcG9ydCBwYXNzIHJldHVybiBleGVjIGVsc2UgYnJlYWsgbm90IHdpdGggY2xhc3MgYXNzZXJ0IHlpZWxkIHRyeSB3aGlsZSBjb250aW51ZSBkZWwgb3IgZGVmIGxhbWJkYSBhc3luYyBhd2FpdCBub25sb2NhbHwxMCBOb25lIFRydWUgRmFsc2UiLGJ1aWx0X2luOiJFbGxpcHNpcyBOb3RJbXBsZW1lbnRlZCJ9LGI9e2NOOiJtZXRhIixiOi9eKD4+PnxcLlwuXC4pIC99LGM9e2NOOiJzdWJzdCIsYjovXHsvLGU6L1x9LyxrOnIsaTovIy99LGE9e2NOOiJzdHJpbmciLGM6W2UuQkVdLHY6W3tiOi8odXxiKT9yPycnJy8sZTovJycnLyxjOltiXSxyOjEwfSx7YjovKHV8Yik/cj8iIiIvLGU6LyIiIi8sYzpbYl0scjoxMH0se2I6LyhmcnxyZnxmKScnJy8sZTovJycnLyxjOltiLGNdfSx7YjovKGZyfHJmfGYpIiIiLyxlOi8iIiIvLGM6W2IsY119LHtiOi8odXxyfHVyKScvLGU6LycvLHI6MTB9LHtiOi8odXxyfHVyKSIvLGU6LyIvLHI6MTB9LHtiOi8oYnxiciknLyxlOi8nL30se2I6LyhifGJyKSIvLGU6LyIvfSx7YjovKGZyfHJmfGYpJy8sZTovJy8sYzpbY119LHtiOi8oZnJ8cmZ8ZikiLyxlOi8iLyxjOltjXX0sZS5BU00sZS5RU01dfSxzPXtjTjoibnVtYmVyIixyOjAsdjpbe2I6ZS5CTlIrIltsTGpKXT8ifSx7YjoiXFxiKDBvWzAtN10rKVtsTGpKXT8ifSx7YjplLkNOUisiW2xMakpdPyJ9XX0saT17Y046InBhcmFtcyIsYjovXCgvLGU6L1wpLyxjOlsic2VsZiIsYixzLGFdfTtyZXR1cm4gYy5jPVthLHMsYl0se2FsaWFzZXM6WyJweSIsImd5cCJdLGs6cixpOi8oPFwvfC0+fFw/KXw9Pi8sYzpbYixzLGEsZS5IQ00se3Y6W3tjTjoiZnVuY3Rpb24iLGJLOiJkZWYifSx7Y046ImNsYXNzIixiSzoiY2xhc3MifV0sZTovOi8saTovWyR7PTtcbixdLyxjOltlLlVUTSxpLHtiOi8tPi8sZVc6ITAsazoiTm9uZSJ9XX0se2NOOiJtZXRhIixiOi9eW1x0IF0qQC8sZTovJC99LHtiOi9cYihwcmludHxleGVjKVwoL31dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgianVsaWEiLGZ1bmN0aW9uKGUpe3ZhciByPXtrZXl3b3JkOiJpbiBpc2Egd2hlcmUgYmFyZW1vZHVsZSBiZWdpbiBicmVhayBjYXRjaCBjY2FsbCBjb25zdCBjb250aW51ZSBkbyBlbHNlIGVsc2VpZiBlbmQgZXhwb3J0IGZhbHNlIGZpbmFsbHkgZm9yIGZ1bmN0aW9uIGdsb2JhbCBpZiBpbXBvcnQgaW1wb3J0YWxsIGxldCBsb2NhbCBtYWNybyBtb2R1bGUgcXVvdGUgcmV0dXJuIHRydWUgdHJ5IHVzaW5nIHdoaWxlIHR5cGUgaW1tdXRhYmxlIGFic3RyYWN0IGJpdHN0eXBlIHR5cGVhbGlhcyAiLGxpdGVyYWw6InRydWUgZmFsc2UgQVJHUyBDX05VTEwgRGV2TnVsbCBFTkRJQU5fQk9NIEVOViBJIEluZiBJbmYxNiBJbmYzMiBJbmY2NCBJbnNlcnRpb25Tb3J0IEpVTElBX0hPTUUgTE9BRF9QQVRIIE1lcmdlU29ydCBOYU4gTmFOMTYgTmFOMzIgTmFONjQgUFJPR1JBTV9GSUxFIFF1aWNrU29ydCBSb3VuZERvd24gUm91bmRGcm9tWmVybyBSb3VuZE5lYXJlc3QgUm91bmROZWFyZXN0VGllc0F3YXkgUm91bmROZWFyZXN0VGllc1VwIFJvdW5kVG9aZXJvIFJvdW5kVXAgU1RERVJSIFNURElOIFNURE9VVCBWRVJTSU9OIGNhdGFsYW4gZXwwIGV1fDAgZXVsZXJnYW1tYSBnb2xkZW4gaW0gbm90aGluZyBwaSDOsyDPgCDPhiAiLGJ1aWx0X2luOiJBTlkgQWJzdHJhY3RBcnJheSBBYnN0cmFjdENoYW5uZWwgQWJzdHJhY3RGbG9hdCBBYnN0cmFjdE1hdHJpeCBBYnN0cmFjdFJORyBBYnN0cmFjdFNlcmlhbGl6ZXIgQWJzdHJhY3RTZXQgQWJzdHJhY3RTcGFyc2VBcnJheSBBYnN0cmFjdFNwYXJzZU1hdHJpeCBBYnN0cmFjdFNwYXJzZVZlY3RvciBBYnN0cmFjdFN0cmluZyBBYnN0cmFjdFVuaXRSYW5nZSBBYnN0cmFjdFZlY09yTWF0IEFic3RyYWN0VmVjdG9yIEFueSBBcmd1bWVudEVycm9yIEFycmF5IEFzc2VydGlvbkVycm9yIEFzc29jaWF0aXZlIEJhc2U2NERlY29kZVBpcGUgQmFzZTY0RW5jb2RlUGlwZSBCaWRpYWdvbmFsIEJpZ0Zsb2F0IEJpZ0ludCBCaXRBcnJheSBCaXRNYXRyaXggQml0VmVjdG9yIEJvb2wgQm91bmRzRXJyb3IgQnVmZmVyU3RyZWFtIENhY2hpbmdQb29sIENhcHR1cmVkRXhjZXB0aW9uIENhcnRlc2lhbkluZGV4IENhcnRlc2lhblJhbmdlIENjaGFyIENkb3VibGUgQ2Zsb2F0IENoYW5uZWwgQ2hhciBDaW50IENpbnRtYXhfdCBDbG9uZyBDbG9uZ2xvbmcgQ2x1c3Rlck1hbmFnZXIgQ21kIENvZGVJbmZvIENvbG9uIENvbXBsZXggQ29tcGxleDEyOCBDb21wbGV4MzIgQ29tcGxleDY0IENvbXBvc2l0ZUV4Y2VwdGlvbiBDb25kaXRpb24gQ29uakFycmF5IENvbmpNYXRyaXggQ29ualZlY3RvciBDcHRyZGlmZl90IENzaG9ydCBDc2l6ZV90IENzc2l6ZV90IENzdHJpbmcgQ3VjaGFyIEN1aW50IEN1aW50bWF4X3QgQ3Vsb25nIEN1bG9uZ2xvbmcgQ3VzaG9ydCBDd2NoYXJfdCBDd3N0cmluZyBEYXRhVHlwZSBEYXRlIERhdGVGb3JtYXQgRGF0ZVRpbWUgRGVuc2VBcnJheSBEZW5zZU1hdHJpeCBEZW5zZVZlY09yTWF0IERlbnNlVmVjdG9yIERpYWdvbmFsIERpY3QgRGltZW5zaW9uTWlzbWF0Y2ggRGltcyBEaXJlY3RJbmRleFN0cmluZyBEaXNwbGF5IERpdmlkZUVycm9yIERvbWFpbkVycm9yIEVPRkVycm9yIEVhY2hMaW5lIEVudW0gRW51bWVyYXRlIEVycm9yRXhjZXB0aW9uIEV4Y2VwdGlvbiBFeHBvbmVudGlhbEJhY2tPZmYgRXhwciBGYWN0b3JpemF0aW9uIEZpbGVNb25pdG9yIEZsb2F0MTYgRmxvYXQzMiBGbG9hdDY0IEZ1bmN0aW9uIEZ1dHVyZSBHbG9iYWxSZWYgR290b05vZGUgSFRNTCBIZXJtaXRpYW4gSU8gSU9CdWZmZXIgSU9Db250ZXh0IElPU3RyZWFtIElQQWRkciBJUHY0IElQdjYgSW5kZXhDYXJ0ZXNpYW4gSW5kZXhMaW5lYXIgSW5kZXhTdHlsZSBJbmV4YWN0RXJyb3IgSW5pdEVycm9yIEludCBJbnQxMjggSW50MTYgSW50MzIgSW50NjQgSW50OCBJbnRTZXQgSW50ZWdlciBJbnRlcnJ1cHRFeGNlcHRpb24gSW52YWxpZFN0YXRlRXhjZXB0aW9uIElycmF0aW9uYWwgS2V5RXJyb3IgTGFiZWxOb2RlIExpblNwYWNlIExpbmVOdW1iZXJOb2RlIExvYWRFcnJvciBMb3dlclRyaWFuZ3VsYXIgTUlNRSBNYXRyaXggTWVyc2VubmVUd2lzdGVyIE1ldGhvZCBNZXRob2RFcnJvciBNZXRob2RUYWJsZSBNb2R1bGUgTlR1cGxlIE5ld3Zhck5vZGUgTnVsbEV4Y2VwdGlvbiBOdWxsYWJsZSBOdW1iZXIgT2JqZWN0SWREaWN0IE9yZGluYWxSYW5nZSBPdXRPZk1lbW9yeUVycm9yIE92ZXJmbG93RXJyb3IgUGFpciBQYXJzZUVycm9yIFBhcnRpYWxRdWlja1NvcnQgUGVybXV0ZWREaW1zQXJyYXkgUGlwZSBQb2xsaW5nRmlsZVdhdGNoZXIgUHJvY2Vzc0V4aXRlZEV4Y2VwdGlvbiBQdHIgUXVvdGVOb2RlIFJhbmRvbURldmljZSBSYW5nZSBSYW5nZUluZGV4IFJhdGlvbmFsIFJhd0ZEIFJlYWRPbmx5TWVtb3J5RXJyb3IgUmVhbCBSZWVudHJhbnRMb2NrIFJlZiBSZWdleCBSZWdleE1hdGNoIFJlbW90ZUNoYW5uZWwgUmVtb3RlRXhjZXB0aW9uIFJldlN0cmluZyBSb3VuZGluZ01vZGUgUm93VmVjdG9yIFNTQVZhbHVlIFNlZ21lbnRhdGlvbkZhdWx0IFNlcmlhbGl6YXRpb25TdGF0ZSBTZXQgU2hhcmVkQXJyYXkgU2hhcmVkTWF0cml4IFNoYXJlZFZlY3RvciBTaWduZWQgU2ltcGxlVmVjdG9yIFNsb3QgU2xvdE51bWJlciBTcGFyc2VNYXRyaXhDU0MgU3BhcnNlVmVjdG9yIFN0YWNrRnJhbWUgU3RhY2tPdmVyZmxvd0Vycm9yIFN0YWNrVHJhY2UgU3RlcFJhbmdlIFN0ZXBSYW5nZUxlbiBTdHJpZGVkQXJyYXkgU3RyaWRlZE1hdHJpeCBTdHJpZGVkVmVjT3JNYXQgU3RyaWRlZFZlY3RvciBTdHJpbmcgU3ViQXJyYXkgU3ViU3RyaW5nIFN5bVRyaWRpYWdvbmFsIFN5bWJvbCBTeW1tZXRyaWMgU3lzdGVtRXJyb3IgVENQU29ja2V0IFRhc2sgVGV4dCBUZXh0RGlzcGxheSBUaW1lciBUcmlkaWFnb25hbCBUdXBsZSBUeXBlIFR5cGVFcnJvciBUeXBlTWFwRW50cnkgVHlwZU1hcExldmVsIFR5cGVOYW1lIFR5cGVWYXIgVHlwZWRTbG90IFVEUFNvY2tldCBVSW50IFVJbnQxMjggVUludDE2IFVJbnQzMiBVSW50NjQgVUludDggVW5kZWZSZWZFcnJvciBVbmRlZlZhckVycm9yIFVuaWNvZGVFcnJvciBVbmlmb3JtU2NhbGluZyBVbmlvbiBVbmlvbkFsbCBVbml0UmFuZ2UgVW5zaWduZWQgVXBwZXJUcmlhbmd1bGFyIFZhbCBWYXJhcmcgVmVjRWxlbWVudCBWZWNPck1hdCBWZWN0b3IgVmVyc2lvbk51bWJlciBWb2lkIFdlYWtLZXlEaWN0IFdlYWtSZWYgV29ya2VyQ29uZmlnIFdvcmtlclBvb2wgIn0sdD0iW0EtWmEtel9cXHUwMEExLVxcdUZGRkZdW0EtWmEtel8wLTlcXHUwMEExLVxcdUZGRkZdKiIsYT17bDp0LGs6cixpOi88XC8vfSxuPXtjTjoibnVtYmVyIixiOi8oXGIweFtcZF9dKihcLltcZF9dKik/fDB4XC5cZFtcZF9dKilwWy0rXT9cZCt8XGIwW2JveF1bYS1mQS1GMC05XVthLWZBLUYwLTlfXSp8KFxiXGRbXGRfXSooXC5bXGRfXSopP3xcLlxkW1xkX10qKShbZUVmRl1bLStdP1xkKyk/LyxyOjB9LG89e2NOOiJzdHJpbmciLGI6LycoLnxcXFt4WHVVXVthLXpBLVowLTldKyknL30saT17Y046InN1YnN0IixiOi9cJFwoLyxlOi9cKS8sazpyfSxsPXtjTjoidmFyaWFibGUiLGI6IlxcJCIrdH0sYz17Y046InN0cmluZyIsYzpbZS5CRSxpLGxdLHY6W3tiOi9cdyoiIiIvLGU6LyIiIlx3Ki8scjoxMH0se2I6L1x3KiIvLGU6LyJcdyovfV19LHM9e2NOOiJzdHJpbmciLGM6W2UuQkUsaSxsXSxiOiJgIixlOiJgIn0sZD17Y046Im1ldGEiLGI6IkAiK3R9LHU9e2NOOiJjb21tZW50Iix2Olt7YjoiIz0iLGU6Ij0jIixyOjEwfSx7YjoiIyIsZToiJCJ9XX07cmV0dXJuIGEuYz1bbixvLGMscyxkLHUsZS5IQ00se2NOOiJrZXl3b3JkIixiOiJcXGIoKChhYnN0cmFjdHxwcmltaXRpdmUpXFxzKyl0eXBlfChtdXRhYmxlXFxzKyk/c3RydWN0KVxcYiJ9LHtiOi88Oi99XSxpLmM9YS5jLGF9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImNvZmZlZXNjcmlwdCIsZnVuY3Rpb24oZSl7dmFyIGM9e2tleXdvcmQ6ImluIGlmIGZvciB3aGlsZSBmaW5hbGx5IG5ldyBkbyByZXR1cm4gZWxzZSBicmVhayBjYXRjaCBpbnN0YW5jZW9mIHRocm93IHRyeSB0aGlzIHN3aXRjaCBjb250aW51ZSB0eXBlb2YgZGVsZXRlIGRlYnVnZ2VyIHN1cGVyIHlpZWxkIGltcG9ydCBleHBvcnQgZnJvbSBhcyBkZWZhdWx0IGF3YWl0IHRoZW4gdW5sZXNzIHVudGlsIGxvb3Agb2YgYnkgd2hlbiBhbmQgb3IgaXMgaXNudCBub3QiLGxpdGVyYWw6InRydWUgZmFsc2UgbnVsbCB1bmRlZmluZWQgeWVzIG5vIG9uIG9mZiIsYnVpbHRfaW46Im5wbSByZXF1aXJlIGNvbnNvbGUgcHJpbnQgbW9kdWxlIGdsb2JhbCB3aW5kb3cgZG9jdW1lbnQifSxuPSJbQS1aYS16JF9dWzAtOUEtWmEteiRfXSoiLHI9e2NOOiJzdWJzdCIsYjovI1x7LyxlOi99LyxrOmN9LGk9W2UuQk5NLGUuaW5oZXJpdChlLkNOTSx7c3RhcnRzOntlOiIoXFxzKi8pPyIscjowfX0pLHtjTjoic3RyaW5nIix2Olt7YjovJycnLyxlOi8nJycvLGM6W2UuQkVdfSx7YjovJy8sZTovJy8sYzpbZS5CRV19LHtiOi8iIiIvLGU6LyIiIi8sYzpbZS5CRSxyXX0se2I6LyIvLGU6LyIvLGM6W2UuQkUscl19XX0se2NOOiJyZWdleHAiLHY6W3tiOiIvLy8iLGU6Ii8vLyIsYzpbcixlLkhDTV19LHtiOiIvL1tnaW1dKiIscjowfSx7YjovXC8oPyFbICpdKShcXFwvfC4pKj9cL1tnaW1dKig/PVxXfCQpL31dfSx7YjoiQCIrbn0se3NMOiJqYXZhc2NyaXB0IixlQjohMCxlRTohMCx2Olt7YjoiYGBgIixlOiJgYGAifSx7YjoiYCIsZToiYCJ9XX1dO3IuYz1pO3ZhciBzPWUuaW5oZXJpdChlLlRNLHtiOm59KSx0PSIoXFwoLipcXCkpP1xccypcXEJbLT1dPiIsbz17Y046InBhcmFtcyIsYjoiXFwoW15cXChdIixyQjohMCxjOlt7YjovXCgvLGU6L1wpLyxrOmMsYzpbInNlbGYiXS5jb25jYXQoaSl9XX07cmV0dXJue2FsaWFzZXM6WyJjb2ZmZWUiLCJjc29uIiwiaWNlZCJdLGs6YyxpOi9cL1wqLyxjOmkuY29uY2F0KFtlLkMoIiMjIyIsIiMjIyIpLGUuSENNLHtjTjoiZnVuY3Rpb24iLGI6Il5cXHMqIituKyJcXHMqPVxccyoiK3QsZToiWy09XT4iLHJCOiEwLGM6W3Msb119LHtiOi9bOlwoLD1dXHMqLyxyOjAsYzpbe2NOOiJmdW5jdGlvbiIsYjp0LGU6IlstPV0+IixyQjohMCxjOltvXX1dfSx7Y046ImNsYXNzIixiSzoiY2xhc3MiLGU6IiQiLGk6L1s6PSJcW1xdXS8sYzpbe2JLOiJleHRlbmRzIixlVzohMCxpOi9bOj0iXFtcXV0vLGM6W3NdfSxzXX0se2I6bisiOiIsZToiOiIsckI6ITAsckU6ITAscjowfV0pfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgiY3BwIixmdW5jdGlvbih0KXt2YXIgZT17Y046ImtleXdvcmQiLGI6IlxcYlthLXpcXGRfXSpfdFxcYiJ9LHI9e2NOOiJzdHJpbmciLHY6W3tiOicodTg/fFUpP0w/IicsZTonIicsaToiXFxuIixjOlt0LkJFXX0se2I6Jyh1OD98VSk/UiInLGU6JyInLGM6W3QuQkVdfSx7YjoiJ1xcXFw/LiIsZToiJyIsaToiLiJ9XX0scz17Y046Im51bWJlciIsdjpbe2I6IlxcYigwYlswMSddKykifSx7YjoiKC0/KVxcYihbXFxkJ10rKFxcLltcXGQnXSopP3xcXC5bXFxkJ10rKSh1fFV8bHxMfHVsfFVMfGZ8RnxifEIpIn0se2I6IigtPykoXFxiMFt4WF1bYS1mQS1GMC05J10rfChcXGJbXFxkJ10rKFxcLltcXGQnXSopP3xcXC5bXFxkJ10rKShbZUVdWy0rXT9bXFxkJ10rKT8pIn1dLHI6MH0saT17Y046Im1ldGEiLGI6LyNccypbYS16XStcYi8sZTovJC8sazp7Im1ldGEta2V5d29yZCI6ImlmIGVsc2UgZWxpZiBlbmRpZiBkZWZpbmUgdW5kZWYgd2FybmluZyBlcnJvciBsaW5lIHByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZSJ9LGM6W3tiOi9cXFxuLyxyOjB9LHQuaW5oZXJpdChyLHtjTjoibWV0YS1zdHJpbmcifSkse2NOOiJtZXRhLXN0cmluZyIsYjovPFteXG4+XSo+LyxlOi8kLyxpOiJcXG4ifSx0LkNMQ00sdC5DQkNNXX0sYT10LklSKyJcXHMqXFwoIixjPXtrZXl3b3JkOiJpbnQgZmxvYXQgd2hpbGUgcHJpdmF0ZSBjaGFyIGNhdGNoIGltcG9ydCBtb2R1bGUgZXhwb3J0IHZpcnR1YWwgb3BlcmF0b3Igc2l6ZW9mIGR5bmFtaWNfY2FzdHwxMCB0eXBlZGVmIGNvbnN0X2Nhc3R8MTAgY29uc3QgZm9yIHN0YXRpY19jYXN0fDEwIHVuaW9uIG5hbWVzcGFjZSB1bnNpZ25lZCBsb25nIHZvbGF0aWxlIHN0YXRpYyBwcm90ZWN0ZWQgYm9vbCB0ZW1wbGF0ZSBtdXRhYmxlIGlmIHB1YmxpYyBmcmllbmQgZG8gZ290byBhdXRvIHZvaWQgZW51bSBlbHNlIGJyZWFrIGV4dGVybiB1c2luZyBhc20gY2FzZSB0eXBlaWQgc2hvcnQgcmVpbnRlcnByZXRfY2FzdHwxMCBkZWZhdWx0IGRvdWJsZSByZWdpc3RlciBleHBsaWNpdCBzaWduZWQgdHlwZW5hbWUgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIGlubGluZSBkZWxldGUgYWxpZ25vZiBjb25zdGV4cHIgZGVjbHR5cGUgbm9leGNlcHQgc3RhdGljX2Fzc2VydCB0aHJlYWRfbG9jYWwgcmVzdHJpY3QgX0Jvb2wgY29tcGxleCBfQ29tcGxleCBfSW1hZ2luYXJ5IGF0b21pY19ib29sIGF0b21pY19jaGFyIGF0b21pY19zY2hhciBhdG9taWNfdWNoYXIgYXRvbWljX3Nob3J0IGF0b21pY191c2hvcnQgYXRvbWljX2ludCBhdG9taWNfdWludCBhdG9taWNfbG9uZyBhdG9taWNfdWxvbmcgYXRvbWljX2xsb25nIGF0b21pY191bGxvbmcgbmV3IHRocm93IHJldHVybiBhbmQgb3Igbm90IixidWlsdF9pbjoic3RkIHN0cmluZyBjaW4gY291dCBjZXJyIGNsb2cgc3RkaW4gc3Rkb3V0IHN0ZGVyciBzdHJpbmdzdHJlYW0gaXN0cmluZ3N0cmVhbSBvc3RyaW5nc3RyZWFtIGF1dG9fcHRyIGRlcXVlIGxpc3QgcXVldWUgc3RhY2sgdmVjdG9yIG1hcCBzZXQgYml0c2V0IG11bHRpc2V0IG11bHRpbWFwIHVub3JkZXJlZF9zZXQgdW5vcmRlcmVkX21hcCB1bm9yZGVyZWRfbXVsdGlzZXQgdW5vcmRlcmVkX211bHRpbWFwIGFycmF5IHNoYXJlZF9wdHIgYWJvcnQgYWJzIGFjb3MgYXNpbiBhdGFuMiBhdGFuIGNhbGxvYyBjZWlsIGNvc2ggY29zIGV4aXQgZXhwIGZhYnMgZmxvb3IgZm1vZCBmcHJpbnRmIGZwdXRzIGZyZWUgZnJleHAgZnNjYW5mIGlzYWxudW0gaXNhbHBoYSBpc2NudHJsIGlzZGlnaXQgaXNncmFwaCBpc2xvd2VyIGlzcHJpbnQgaXNwdW5jdCBpc3NwYWNlIGlzdXBwZXIgaXN4ZGlnaXQgdG9sb3dlciB0b3VwcGVyIGxhYnMgbGRleHAgbG9nMTAgbG9nIG1hbGxvYyByZWFsbG9jIG1lbWNociBtZW1jbXAgbWVtY3B5IG1lbXNldCBtb2RmIHBvdyBwcmludGYgcHV0Y2hhciBwdXRzIHNjYW5mIHNpbmggc2luIHNucHJpbnRmIHNwcmludGYgc3FydCBzc2NhbmYgc3RyY2F0IHN0cmNociBzdHJjbXAgc3RyY3B5IHN0cmNzcG4gc3RybGVuIHN0cm5jYXQgc3RybmNtcCBzdHJuY3B5IHN0cnBicmsgc3RycmNociBzdHJzcG4gc3Ryc3RyIHRhbmggdGFuIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgZW5kbCBpbml0aWFsaXplcl9saXN0IHVuaXF1ZV9wdHIiLGxpdGVyYWw6InRydWUgZmFsc2UgbnVsbHB0ciBOVUxMIn0sbj1bZSx0LkNMQ00sdC5DQkNNLHMscl07cmV0dXJue2FsaWFzZXM6WyJjIiwiY2MiLCJoIiwiYysrIiwiaCsrIiwiaHBwIl0sazpjLGk6IjwvIixjOm4uY29uY2F0KFtpLHtiOiJcXGIoZGVxdWV8bGlzdHxxdWV1ZXxzdGFja3x2ZWN0b3J8bWFwfHNldHxiaXRzZXR8bXVsdGlzZXR8bXVsdGltYXB8dW5vcmRlcmVkX21hcHx1bm9yZGVyZWRfc2V0fHVub3JkZXJlZF9tdWx0aXNldHx1bm9yZGVyZWRfbXVsdGltYXB8YXJyYXkpXFxzKjwiLGU6Ij4iLGs6YyxjOlsic2VsZiIsZV19LHtiOnQuSVIrIjo6IixrOmN9LHt2Olt7YjovPS8sZTovOy99LHtiOi9cKC8sZTovXCkvfSx7Yks6Im5ldyB0aHJvdyByZXR1cm4gZWxzZSIsZTovOy99XSxrOmMsYzpuLmNvbmNhdChbe2I6L1woLyxlOi9cKS8sazpjLGM6bi5jb25jYXQoWyJzZWxmIl0pLHI6MH1dKSxyOjB9LHtjTjoiZnVuY3Rpb24iLGI6IigiK3QuSVIrIltcXComXFxzXSspKyIrYSxyQjohMCxlOi9bezs9XS8sZUU6ITAsazpjLGk6L1teXHdcc1wqJl0vLGM6W3tiOmEsckI6ITAsYzpbdC5UTV0scjowfSx7Y046InBhcmFtcyIsYjovXCgvLGU6L1wpLyxrOmMscjowLGM6W3QuQ0xDTSx0LkNCQ00scixzLGVdfSx0LkNMQ00sdC5DQkNNLGldfSx7Y046ImNsYXNzIixiSzoiY2xhc3Mgc3RydWN0IixlOi9bezs6XS8sYzpbe2I6LzwvLGU6Lz4vLGM6WyJzZWxmIl19LHQuVE1dfV0pLGV4cG9ydHM6e3ByZXByb2Nlc3NvcjppLHN0cmluZ3M6cixrOmN9fX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgicnVieSIsZnVuY3Rpb24oZSl7dmFyIGI9IlthLXpBLVpfXVxcdypbIT89XT98Wy0rfl1cXEB8PDx8Pj58PX58PT09P3w8PT58Wzw+XT0/fFxcKlxcKnxbLS8rJV4mKn5gfF18XFxbXFxdPT8iLHI9e2tleXdvcmQ6ImFuZCB0aGVuIGRlZmluZWQgbW9kdWxlIGluIHJldHVybiByZWRvIGlmIEJFR0lOIHJldHJ5IGVuZCBmb3Igc2VsZiB3aGVuIG5leHQgdW50aWwgZG8gYmVnaW4gdW5sZXNzIEVORCByZXNjdWUgZWxzZSBicmVhayB1bmRlZiBub3Qgc3VwZXIgY2xhc3MgY2FzZSByZXF1aXJlIHlpZWxkIGFsaWFzIHdoaWxlIGVuc3VyZSBlbHNpZiBvciBpbmNsdWRlIGF0dHJfcmVhZGVyIGF0dHJfd3JpdGVyIGF0dHJfYWNjZXNzb3IiLGxpdGVyYWw6InRydWUgZmFsc2UgbmlsIn0sYz17Y046ImRvY3RhZyIsYjoiQFtBLVphLXpdKyJ9LGE9e2I6IiM8IixlOiI+In0scz1bZS5DKCIjIiwiJCIse2M6W2NdfSksZS5DKCJeXFw9YmVnaW4iLCJeXFw9ZW5kIix7YzpbY10scjoxMH0pLGUuQygiXl9fRU5EX18iLCJcXG4kIildLG49e2NOOiJzdWJzdCIsYjoiI1xceyIsZToifSIsazpyfSx0PXtjTjoic3RyaW5nIixjOltlLkJFLG5dLHY6W3tiOi8nLyxlOi8nL30se2I6LyIvLGU6LyIvfSx7YjovYC8sZTovYC99LHtiOiIlW3FRd1d4XT9cXCgiLGU6IlxcKSJ9LHtiOiIlW3FRd1d4XT9cXFsiLGU6IlxcXSJ9LHtiOiIlW3FRd1d4XT97IixlOiJ9In0se2I6IiVbcVF3V3hdPzwiLGU6Ij4ifSx7YjoiJVtxUXdXeF0/LyIsZToiLyJ9LHtiOiIlW3FRd1d4XT8lIixlOiIlIn0se2I6IiVbcVF3V3hdPy0iLGU6Ii0ifSx7YjoiJVtxUXdXeF0/XFx8IixlOiJcXHwifSx7YjovXEJcPyhcXFxkezEsM318XFx4W0EtRmEtZjAtOV17MSwyfXxcXHVbQS1GYS1mMC05XXs0fXxcXD9cUylcYi99LHtiOi88PCgtPylcdyskLyxlOi9eXHMqXHcrJC99XX0saT17Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGVuZHNQYXJlbnQ6ITAsazpyfSxkPVt0LGEse2NOOiJjbGFzcyIsYks6ImNsYXNzIG1vZHVsZSIsZToiJHw7IixpOi89LyxjOltlLmluaGVyaXQoZS5UTSx7YjoiW0EtWmEtel9dXFx3Kig6OlxcdyspKihcXD98XFwhKT8ifSkse2I6IjxcXHMqIixjOlt7YjoiKCIrZS5JUisiOjopPyIrZS5JUn1dfV0uY29uY2F0KHMpfSx7Y046ImZ1bmN0aW9uIixiSzoiZGVmIixlOiIkfDsiLGM6W2UuaW5oZXJpdChlLlRNLHtiOmJ9KSxpXS5jb25jYXQocyl9LHtiOmUuSVIrIjo6In0se2NOOiJzeW1ib2wiLGI6ZS5VSVIrIihcXCF8XFw/KT86IixyOjB9LHtjTjoic3ltYm9sIixiOiI6KD8hXFxzKSIsYzpbdCx7YjpifV0scjowfSx7Y046Im51bWJlciIsYjoiKFxcYjBbMC03X10rKXwoXFxiMHhbMC05YS1mQS1GX10rKXwoXFxiWzEtOV1bMC05X10qKFxcLlswLTlfXSspPyl8WzBfXVxcYiIscjowfSx7YjoiKFxcJFxcVyl8KChcXCR8XFxAXFxAPykoXFx3KykpIn0se2NOOiJwYXJhbXMiLGI6L1x8LyxlOi9cfC8sazpyfSx7YjoiKCIrZS5SU1IrInx1bmxlc3MpXFxzKiIsazoidW5sZXNzIixjOlthLHtjTjoicmVnZXhwIixjOltlLkJFLG5dLGk6L1xuLyx2Olt7YjoiLyIsZToiL1thLXpdKiJ9LHtiOiIlcnsiLGU6In1bYS16XSoifSx7YjoiJXJcXCgiLGU6IlxcKVthLXpdKiJ9LHtiOiIlciEiLGU6IiFbYS16XSoifSx7YjoiJXJcXFsiLGU6IlxcXVthLXpdKiJ9XX1dLmNvbmNhdChzKSxyOjB9XS5jb25jYXQocyk7bi5jPWQsaS5jPWQ7dmFyIGw9Ils+P10+IixvPSJbXFx3I10rXFwoXFx3K1xcKTpcXGQrOlxcZCs+Iix1PSIoXFx3Ky0pP1xcZCtcXC5cXGQrXFwuXFxkKHBcXGQrKT9bXj5dKz4iLHc9W3tiOi9eXHMqPT4vLHN0YXJ0czp7ZToiJCIsYzpkfX0se2NOOiJtZXRhIixiOiJeKCIrbCsifCIrbysifCIrdSsiKSIsc3RhcnRzOntlOiIkIixjOmR9fV07cmV0dXJue2FsaWFzZXM6WyJyYiIsImdlbXNwZWMiLCJwb2RzcGVjIiwidGhvciIsImlyYiJdLGs6cixpOi9cL1wqLyxjOnMuY29uY2F0KHcpLmNvbmNhdChkKX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInlhbWwiLGZ1bmN0aW9uKGUpe3ZhciBiPSJ0cnVlIGZhbHNlIHllcyBubyBudWxsIixhPSJeWyBcXC1dKiIscj0iW2EtekEtWl9dW1xcd1xcLV0qIix0PXtjTjoiYXR0ciIsdjpbe2I6YStyKyI6In0se2I6YSsnIicrcisnIjonfSx7YjphKyInIityKyInOiJ9XX0sYz17Y046InRlbXBsYXRlLXZhcmlhYmxlIix2Olt7Yjoie3siLGU6In19In0se2I6IiV7IixlOiJ9In1dfSxsPXtjTjoic3RyaW5nIixyOjAsdjpbe2I6LycvLGU6LycvfSx7YjovIi8sZTovIi99LHtiOi9cUysvfV0sYzpbZS5CRSxjXX07cmV0dXJue2NJOiEwLGFsaWFzZXM6WyJ5bWwiLCJZQU1MIiwieWFtbCJdLGM6W3Qse2NOOiJtZXRhIixiOiJeLS0tcyokIixyOjEwfSx7Y046InN0cmluZyIsYjoiW1xcfD5dICokIixyRTohMCxjOmwuYyxlOnQudlswXS5ifSx7YjoiPCVbJT0tXT8iLGU6IlslLV0/JT4iLHNMOiJydWJ5IixlQjohMCxlRTohMCxyOjB9LHtjTjoidHlwZSIsYjoiISEiK2UuVUlSfSx7Y046Im1ldGEiLGI6IiYiK2UuVUlSKyIkIn0se2NOOiJtZXRhIixiOiJcXCoiK2UuVUlSKyIkIn0se2NOOiJidWxsZXQiLGI6Il4gKi0iLHI6MH0sZS5IQ00se2JLOmIsazp7bGl0ZXJhbDpifX0sZS5DTk0sbF19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJjc3MiLGZ1bmN0aW9uKGUpe3ZhciBjPSJbYS16QS1aLV1bYS16QS1aMC05Xy1dKiIsdD17YjovW0EtWlxfXC5cLV0rXHMqOi8sckI6ITAsZToiOyIsZVc6ITAsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6L1xTLyxlOiI6IixlRTohMCxzdGFydHM6e2VXOiEwLGVFOiEwLGM6W3tiOi9bXHctXStcKC8sckI6ITAsYzpbe2NOOiJidWlsdF9pbiIsYjovW1x3LV0rL30se2I6L1woLyxlOi9cKS8sYzpbZS5BU00sZS5RU01dfV19LGUuQ1NTTk0sZS5RU00sZS5BU00sZS5DQkNNLHtjTjoibnVtYmVyIixiOiIjWzAtOUEtRmEtZl0rIn0se2NOOiJtZXRhIixiOiIhaW1wb3J0YW50In1dfX1dfTtyZXR1cm57Y0k6ITAsaTovWz1cL3wnXCRdLyxjOltlLkNCQ00se2NOOiJzZWxlY3Rvci1pZCIsYjovI1tBLVphLXowLTlfLV0rL30se2NOOiJzZWxlY3Rvci1jbGFzcyIsYjovXC5bQS1aYS16MC05Xy1dKy99LHtjTjoic2VsZWN0b3ItYXR0ciIsYjovXFsvLGU6L1xdLyxpOiIkIn0se2NOOiJzZWxlY3Rvci1wc2V1ZG8iLGI6LzooOik/W2EtekEtWjAtOVxfXC1cK1woXCkiJy5dKy99LHtiOiJAKGZvbnQtZmFjZXxwYWdlKSIsbDoiW2Etei1dKyIsazoiZm9udC1mYWNlIHBhZ2UifSx7YjoiQCIsZToiW3s7XSIsaTovOi8sYzpbe2NOOiJrZXl3b3JkIixiOi9cdysvfSx7YjovXHMvLGVXOiEwLGVFOiEwLHI6MCxjOltlLkFTTSxlLlFTTSxlLkNTU05NXX1dfSx7Y046InNlbGVjdG9yLXRhZyIsYjpjLHI6MH0se2I6InsiLGU6In0iLGk6L1xTLyxjOltlLkNCQ00sdF19XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImZvcnRyYW4iLGZ1bmN0aW9uKGUpe3ZhciB0PXtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSJ9LG49e2xpdGVyYWw6Ii5GYWxzZS4gLlRydWUuIixrZXl3b3JkOiJraW5kIGRvIHdoaWxlIHByaXZhdGUgY2FsbCBpbnRyaW5zaWMgd2hlcmUgZWxzZXdoZXJlIHR5cGUgZW5kdHlwZSBlbmRtb2R1bGUgZW5kc2VsZWN0IGVuZGludGVyZmFjZSBlbmQgZW5kZG8gZW5kaWYgaWYgZm9yYWxsIGVuZGZvcmFsbCBvbmx5IGNvbnRhaW5zIGRlZmF1bHQgcmV0dXJuIHN0b3AgdGhlbiBwdWJsaWMgc3Vicm91dGluZXwxMCBmdW5jdGlvbiBwcm9ncmFtIC5hbmQuIC5vci4gLm5vdC4gLmxlLiAuZXEuIC5nZS4gLmd0LiAubHQuIGdvdG8gc2F2ZSBlbHNlIHVzZSBtb2R1bGUgc2VsZWN0IGNhc2UgYWNjZXNzIGJsYW5rIGRpcmVjdCBleGlzdCBmaWxlIGZtdCBmb3JtIGZvcm1hdHRlZCBpb3N0YXQgbmFtZSBuYW1lZCBuZXh0cmVjIG51bWJlciBvcGVuZWQgcmVjIHJlY2wgc2VxdWVudGlhbCBzdGF0dXMgdW5mb3JtYXR0ZWQgdW5pdCBjb250aW51ZSBmb3JtYXQgcGF1c2UgY3ljbGUgZXhpdCBjX251bGxfY2hhciBjX2FsZXJ0IGNfYmFja3NwYWNlIGNfZm9ybV9mZWVkIGZsdXNoIHdhaXQgZGVjaW1hbCByb3VuZCBpb21zZyBzeW5jaHJvbm91cyBub3Bhc3Mgbm9uX292ZXJyaWRhYmxlIHBhc3MgcHJvdGVjdGVkIHZvbGF0aWxlIGFic3RyYWN0IGV4dGVuZHMgaW1wb3J0IG5vbl9pbnRyaW5zaWMgdmFsdWUgZGVmZXJyZWQgZ2VuZXJpYyBmaW5hbCBlbnVtZXJhdG9yIGNsYXNzIGFzc29jaWF0ZSBiaW5kIGVudW0gY19pbnQgY19zaG9ydCBjX2xvbmcgY19sb25nX2xvbmcgY19zaWduZWRfY2hhciBjX3NpemVfdCBjX2ludDhfdCBjX2ludDE2X3QgY19pbnQzMl90IGNfaW50NjRfdCBjX2ludF9sZWFzdDhfdCBjX2ludF9sZWFzdDE2X3QgY19pbnRfbGVhc3QzMl90IGNfaW50X2xlYXN0NjRfdCBjX2ludF9mYXN0OF90IGNfaW50X2Zhc3QxNl90IGNfaW50X2Zhc3QzMl90IGNfaW50X2Zhc3Q2NF90IGNfaW50bWF4X3QgQ19pbnRwdHJfdCBjX2Zsb2F0IGNfZG91YmxlIGNfbG9uZ19kb3VibGUgY19mbG9hdF9jb21wbGV4IGNfZG91YmxlX2NvbXBsZXggY19sb25nX2RvdWJsZV9jb21wbGV4IGNfYm9vbCBjX2NoYXIgY19udWxsX3B0ciBjX251bGxfZnVucHRyIGNfbmV3X2xpbmUgY19jYXJyaWFnZV9yZXR1cm4gY19ob3Jpem9udGFsX3RhYiBjX3ZlcnRpY2FsX3RhYiBpc29fY19iaW5kaW5nIGNfbG9jIGNfZnVubG9jIGNfYXNzb2NpYXRlZCAgY19mX3BvaW50ZXIgY19wdHIgY19mdW5wdHIgaXNvX2ZvcnRyYW5fZW52IGNoYXJhY3Rlcl9zdG9yYWdlX3NpemUgZXJyb3JfdW5pdCBmaWxlX3N0b3JhZ2Vfc2l6ZSBpbnB1dF91bml0IGlvc3RhdF9lbmQgaW9zdGF0X2VvciBudW1lcmljX3N0b3JhZ2Vfc2l6ZSBvdXRwdXRfdW5pdCBjX2ZfcHJvY3BvaW50ZXIgaWVlZV9hcml0aG1ldGljIGllZWVfc3VwcG9ydF91bmRlcmZsb3dfY29udHJvbCBpZWVlX2dldF91bmRlcmZsb3dfbW9kZSBpZWVlX3NldF91bmRlcmZsb3dfbW9kZSBuZXd1bml0IGNvbnRpZ3VvdXMgcmVjdXJzaXZlIHBhZCBwb3NpdGlvbiBhY3Rpb24gZGVsaW0gcmVhZHdyaXRlIGVvciBhZHZhbmNlIG5tbCBpbnRlcmZhY2UgcHJvY2VkdXJlIG5hbWVsaXN0IGluY2x1ZGUgc2VxdWVuY2UgZWxlbWVudGFsIHB1cmUgaW50ZWdlciByZWFsIGNoYXJhY3RlciBjb21wbGV4IGxvZ2ljYWwgZGltZW5zaW9uIGFsbG9jYXRhYmxlfDEwIHBhcmFtZXRlciBleHRlcm5hbCBpbXBsaWNpdHwxMCBub25lIGRvdWJsZSBwcmVjaXNpb24gYXNzaWduIGludGVudCBvcHRpb25hbCBwb2ludGVyIHRhcmdldCBpbiBvdXQgY29tbW9uIGVxdWl2YWxlbmNlIGRhdGEiLGJ1aWx0X2luOiJhbG9nIGFsb2cxMCBhbWF4MCBhbWF4MSBhbWluMCBhbWluMSBhbW9kIGNhYnMgY2NvcyBjZXhwIGNsb2cgY3NpbiBjc3FydCBkYWJzIGRhY29zIGRhc2luIGRhdGFuIGRhdGFuMiBkY29zIGRjb3NoIGRkaW0gZGV4cCBkaW50IGRsb2cgZGxvZzEwIGRtYXgxIGRtaW4xIGRtb2QgZG5pbnQgZHNpZ24gZHNpbiBkc2luaCBkc3FydCBkdGFuIGR0YW5oIGZsb2F0IGlhYnMgaWRpbSBpZGludCBpZG5pbnQgaWZpeCBpc2lnbiBtYXgwIG1heDEgbWluMCBtaW4xIHNuZ2wgYWxnYW1hIGNkYWJzIGNkY29zIGNkZXhwIGNkbG9nIGNkc2luIGNkc3FydCBjcWFicyBjcWNvcyBjcWV4cCBjcWxvZyBjcXNpbiBjcXNxcnQgZGNtcGx4IGRjb25qZyBkZXJmIGRlcmZjIGRmbG9hdCBkZ2FtbWEgZGltYWcgZGxnYW1hIGlxaW50IHFhYnMgcWFjb3MgcWFzaW4gcWF0YW4gcWF0YW4yIHFjbXBseCBxY29uamcgcWNvcyBxY29zaCBxZGltIHFlcmYgcWVyZmMgcWV4cCBxZ2FtbWEgcWltYWcgcWxnYW1hIHFsb2cgcWxvZzEwIHFtYXgxIHFtaW4xIHFtb2QgcW5pbnQgcXNpZ24gcXNpbiBxc2luaCBxc3FydCBxdGFuIHF0YW5oIGFicyBhY29zIGFpbWFnIGFpbnQgYW5pbnQgYXNpbiBhdGFuIGF0YW4yIGNoYXIgY21wbHggY29uamcgY29zIGNvc2ggZXhwIGljaGFyIGluZGV4IGludCBsb2cgbG9nMTAgbWF4IG1pbiBuaW50IHNpZ24gc2luIHNpbmggc3FydCB0YW4gdGFuaCBwcmludCB3cml0ZSBkaW0gbGdlIGxndCBsbGUgbGx0IG1vZCBudWxsaWZ5IGFsbG9jYXRlIGRlYWxsb2NhdGUgYWRqdXN0bCBhZGp1c3RyIGFsbCBhbGxvY2F0ZWQgYW55IGFzc29jaWF0ZWQgYml0X3NpemUgYnRlc3QgY2VpbGluZyBjb3VudCBjc2hpZnQgZGF0ZV9hbmRfdGltZSBkaWdpdHMgZG90X3Byb2R1Y3QgZW9zaGlmdCBlcHNpbG9uIGV4cG9uZW50IGZsb29yIGZyYWN0aW9uIGh1Z2UgaWFuZCBpYmNsciBpYml0cyBpYnNldCBpZW9yIGlvciBpc2hmdCBpc2hmdGMgbGJvdW5kIGxlbl90cmltIG1hdG11bCBtYXhleHBvbmVudCBtYXhsb2MgbWF4dmFsIG1lcmdlIG1pbmV4cG9uZW50IG1pbmxvYyBtaW52YWwgbW9kdWxvIG12Yml0cyBuZWFyZXN0IHBhY2sgcHJlc2VudCBwcm9kdWN0IHJhZGl4IHJhbmRvbV9udW1iZXIgcmFuZG9tX3NlZWQgcmFuZ2UgcmVwZWF0IHJlc2hhcGUgcnJzcGFjaW5nIHNjYWxlIHNjYW4gc2VsZWN0ZWRfaW50X2tpbmQgc2VsZWN0ZWRfcmVhbF9raW5kIHNldF9leHBvbmVudCBzaGFwZSBzaXplIHNwYWNpbmcgc3ByZWFkIHN1bSBzeXN0ZW1fY2xvY2sgdGlueSB0cmFuc3Bvc2UgdHJpbSB1Ym91bmQgdW5wYWNrIHZlcmlmeSBhY2hhciBpYWNoYXIgdHJhbnNmZXIgZGJsZSBlbnRyeSBkcHJvZCBjcHVfdGltZSBjb21tYW5kX2FyZ3VtZW50X2NvdW50IGdldF9jb21tYW5kIGdldF9jb21tYW5kX2FyZ3VtZW50IGdldF9lbnZpcm9ubWVudF92YXJpYWJsZSBpc19pb3N0YXRfZW5kIGllZWVfYXJpdGhtZXRpYyBpZWVlX3N1cHBvcnRfdW5kZXJmbG93X2NvbnRyb2wgaWVlZV9nZXRfdW5kZXJmbG93X21vZGUgaWVlZV9zZXRfdW5kZXJmbG93X21vZGUgaXNfaW9zdGF0X2VvciBtb3ZlX2FsbG9jIG5ld19saW5lIHNlbGVjdGVkX2NoYXJfa2luZCBzYW1lX3R5cGVfYXMgZXh0ZW5kc190eXBlX29mYWNvc2ggYXNpbmggYXRhbmggYmVzc2VsX2owIGJlc3NlbF9qMSBiZXNzZWxfam4gYmVzc2VsX3kwIGJlc3NlbF95MSBiZXNzZWxfeW4gZXJmIGVyZmMgZXJmY19zY2FsZWQgZ2FtbWEgbG9nX2dhbW1hIGh5cG90IG5vcm0yIGF0b21pY19kZWZpbmUgYXRvbWljX3JlZiBleGVjdXRlX2NvbW1hbmRfbGluZSBsZWFkeiB0cmFpbHogc3RvcmFnZV9zaXplIG1lcmdlX2JpdHMgYmdlIGJndCBibGUgYmx0IGRzaGlmdGwgZHNoaWZ0ciBmaW5kbG9jIGlhbGwgaWFueSBpcGFyaXR5IGltYWdlX2luZGV4IGxjb2JvdW5kIHVjb2JvdW5kIG1hc2tsIG1hc2tyIG51bV9pbWFnZXMgcGFyaXR5IHBvcGNudCBwb3BwYXIgc2hpZnRhIHNoaWZ0bCBzaGlmdHIgdGhpc19pbWFnZSJ9O3JldHVybntjSTohMCxhbGlhc2VzOlsiZjkwIiwiZjk1Il0sazpuLGk6L1wvXCovLGM6W2UuaW5oZXJpdChlLkFTTSx7Y046InN0cmluZyIscjowfSksZS5pbmhlcml0KGUuUVNNLHtjTjoic3RyaW5nIixyOjB9KSx7Y046ImZ1bmN0aW9uIixiSzoic3Vicm91dGluZSBmdW5jdGlvbiBwcm9ncmFtIixpOiJbJHs9XFxuXSIsYzpbZS5VVE0sdF19LGUuQygiISIsIiQiLHtyOjB9KSx7Y046Im51bWJlciIsYjoiKD89XFxifFxcK3xcXC18XFwuKSg/PVxcLlxcZHxcXGQpKD86XFxkKyk/KD86XFwuP1xcZCopKD86W2RlXVsrLV0/XFxkKyk/XFxiXFwuPyIscjowfV19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJhd2siLGZ1bmN0aW9uKGUpe3ZhciByPXtjTjoidmFyaWFibGUiLHY6W3tiOi9cJFtcd1xkI0BdW1x3XGRfXSovfSx7YjovXCRceyguKj8pfS99XX0sYj0iQkVHSU4gRU5EIGlmIGVsc2Ugd2hpbGUgZG8gZm9yIGluIGJyZWFrIGNvbnRpbnVlIGRlbGV0ZSBuZXh0IG5leHRmaWxlIGZ1bmN0aW9uIGZ1bmMgZXhpdHwxMCIsbj17Y046InN0cmluZyIsYzpbZS5CRV0sdjpbe2I6Lyh1fGIpP3I/JycnLyxlOi8nJycvLHI6MTB9LHtiOi8odXxiKT9yPyIiIi8sZTovIiIiLyxyOjEwfSx7YjovKHV8cnx1ciknLyxlOi8nLyxyOjEwfSx7YjovKHV8cnx1cikiLyxlOi8iLyxyOjEwfSx7YjovKGJ8YnIpJy8sZTovJy99LHtiOi8oYnxicikiLyxlOi8iL30sZS5BU00sZS5RU01dfTtyZXR1cm57azp7a2V5d29yZDpifSxjOltyLG4sZS5STSxlLkhDTSxlLk5NXX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoIm1ha2VmaWxlIixmdW5jdGlvbihlKXt2YXIgaT17Y046InZhcmlhYmxlIix2Olt7YjoiXFwkXFwoIitlLlVJUisiXFwpIixjOltlLkJFXX0se2I6L1wkW0AlPD9cXlwrXCpdL31dfSxyPXtjTjoic3RyaW5nIixiOi8iLyxlOi8iLyxjOltlLkJFLGldfSxhPXtjTjoidmFyaWFibGUiLGI6L1wkXChbXHctXStccy8sZTovXCkvLGs6e2J1aWx0X2luOiJzdWJzdCBwYXRzdWJzdCBzdHJpcCBmaW5kc3RyaW5nIGZpbHRlciBmaWx0ZXItb3V0IHNvcnQgd29yZCB3b3JkbGlzdCBmaXJzdHdvcmQgbGFzdHdvcmQgZGlyIG5vdGRpciBzdWZmaXggYmFzZW5hbWUgYWRkc3VmZml4IGFkZHByZWZpeCBqb2luIHdpbGRjYXJkIHJlYWxwYXRoIGFic3BhdGggZXJyb3Igd2FybmluZyBzaGVsbCBvcmlnaW4gZmxhdm9yIGZvcmVhY2ggaWYgb3IgYW5kIGNhbGwgZXZhbCBmaWxlIHZhbHVlIn0sYzpbaV19LG49e2I6Il4iK2UuVUlSKyJcXHMqWzorP10/PSIsaToiXFxuIixyQjohMCxjOlt7YjoiXiIrZS5VSVIsZToiWzorP10/PSIsZUU6ITB9XX0sdD17Y046Im1ldGEiLGI6L15cLlBIT05ZOi8sZTovJC8sazp7Im1ldGEta2V5d29yZCI6Ii5QSE9OWSJ9LGw6L1tcLlx3XSsvfSxsPXtjTjoic2VjdGlvbiIsYjovXlteXHNdKzovLGU6LyQvLGM6W2ldfTtyZXR1cm57YWxpYXNlczpbIm1rIiwibWFrIl0sazoiZGVmaW5lIGVuZGVmIHVuZGVmaW5lIGlmZGVmIGlmbmRlZiBpZmVxIGlmbmVxIGVsc2UgZW5kaWYgaW5jbHVkZSAtaW5jbHVkZSBzaW5jbHVkZSBvdmVycmlkZSBleHBvcnQgdW5leHBvcnQgcHJpdmF0ZSB2cGF0aCIsbDovW1x3LV0rLyxjOltlLkhDTSxpLHIsYSxuLHQsbF19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJqYXZhIixmdW5jdGlvbihlKXt2YXIgYT0iW8OALcq4YS16QS1aXyRdW8OALcq4YS16QS1aXyQwLTldKiIsdD1hKyIoPCIrYSsiKFxccyosXFxzKiIrYSsiKSo+KT8iLHI9ImZhbHNlIHN5bmNocm9uaXplZCBpbnQgYWJzdHJhY3QgZmxvYXQgcHJpdmF0ZSBjaGFyIGJvb2xlYW4gc3RhdGljIG51bGwgaWYgY29uc3QgZm9yIHRydWUgd2hpbGUgbG9uZyBzdHJpY3RmcCBmaW5hbGx5IHByb3RlY3RlZCBpbXBvcnQgbmF0aXZlIGZpbmFsIHZvaWQgZW51bSBlbHNlIGJyZWFrIHRyYW5zaWVudCBjYXRjaCBpbnN0YW5jZW9mIGJ5dGUgc3VwZXIgdm9sYXRpbGUgY2FzZSBhc3NlcnQgc2hvcnQgcGFja2FnZSBkZWZhdWx0IGRvdWJsZSBwdWJsaWMgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIHRocm93cyBwcm90ZWN0ZWQgcHVibGljIHByaXZhdGUgbW9kdWxlIHJlcXVpcmVzIGV4cG9ydHMgZG8iLHM9IlxcYigwW2JCXShbMDFdK1swMV9dK1swMV0rfFswMV0rKXwwW3hYXShbYS1mQS1GMC05XStbYS1mQS1GMC05X10rW2EtZkEtRjAtOV0rfFthLWZBLUYwLTldKyl8KChbXFxkXStbXFxkX10rW1xcZF0rfFtcXGRdKykoXFwuKFtcXGRdK1tcXGRfXStbXFxkXSt8W1xcZF0rKSk/fFxcLihbXFxkXStbXFxkX10rW1xcZF0rfFtcXGRdKykpKFtlRV1bLStdP1xcZCspPylbbExmRl0/IixjPXtjTjoibnVtYmVyIixiOnMscjowfTtyZXR1cm57YWxpYXNlczpbImpzcCJdLGs6cixpOi88XC98Iy8sYzpbZS5DKCIvXFwqXFwqIiwiXFwqLyIse3I6MCxjOlt7YjovXHcrQC8scjowfSx7Y046ImRvY3RhZyIsYjoiQFtBLVphLXpdKyJ9XX0pLGUuQ0xDTSxlLkNCQ00sZS5BU00sZS5RU00se2NOOiJjbGFzcyIsYks6ImNsYXNzIGludGVyZmFjZSIsZTovW3s7PV0vLGVFOiEwLGs6ImNsYXNzIGludGVyZmFjZSIsaTovWzoiXFtcXV0vLGM6W3tiSzoiZXh0ZW5kcyBpbXBsZW1lbnRzIn0sZS5VVE1dfSx7Yks6Im5ldyB0aHJvdyByZXR1cm4gZWxzZSIscjowfSx7Y046ImZ1bmN0aW9uIixiOiIoIit0KyJcXHMrKSsiK2UuVUlSKyJcXHMqXFwoIixyQjohMCxlOi9bezs9XS8sZUU6ITAsazpyLGM6W3tiOmUuVUlSKyJcXHMqXFwoIixyQjohMCxyOjAsYzpbZS5VVE1dfSx7Y046InBhcmFtcyIsYjovXCgvLGU6L1wpLyxrOnIscjowLGM6W2UuQVNNLGUuUVNNLGUuQ05NLGUuQ0JDTV19LGUuQ0xDTSxlLkNCQ01dfSxjLHtjTjoibWV0YSIsYjoiQFtBLVphLXpdKyJ9XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInN0YW4iLGZ1bmN0aW9uKGUpe3JldHVybntjOltlLkhDTSxlLkNMQ00sZS5DQkNNLHtiOmUuVUlSLGw6ZS5VSVIsazp7bmFtZToiZm9yIGluIHdoaWxlIHJlcGVhdCB1bnRpbCBpZiB0aGVuIGVsc2UiLHN5bWJvbDoiYmVybm91bGxpIGJlcm5vdWxsaV9sb2dpdCBiaW5vbWlhbCBiaW5vbWlhbF9sb2dpdCBiZXRhX2Jpbm9taWFsIGh5cGVyZ2VvbWV0cmljIGNhdGVnb3JpY2FsIGNhdGVnb3JpY2FsX2xvZ2l0IG9yZGVyZWRfbG9naXN0aWMgbmVnX2Jpbm9taWFsIG5lZ19iaW5vbWlhbF8yIG5lZ19iaW5vbWlhbF8yX2xvZyBwb2lzc29uIHBvaXNzb25fbG9nIG11bHRpbm9taWFsIG5vcm1hbCBleHBfbW9kX25vcm1hbCBza2V3X25vcm1hbCBzdHVkZW50X3QgY2F1Y2h5IGRvdWJsZV9leHBvbmVudGlhbCBsb2dpc3RpYyBndW1iZWwgbG9nbm9ybWFsIGNoaV9zcXVhcmUgaW52X2NoaV9zcXVhcmUgc2NhbGVkX2ludl9jaGlfc3F1YXJlIGV4cG9uZW50aWFsIGludl9nYW1tYSB3ZWlidWxsIGZyZWNoZXQgcmF5bGVpZ2ggd2llbmVyIHBhcmV0byBwYXJldG9fdHlwZV8yIHZvbl9taXNlcyB1bmlmb3JtIG11bHRpX25vcm1hbCBtdWx0aV9ub3JtYWxfcHJlYyBtdWx0aV9ub3JtYWxfY2hvbGVza3kgbXVsdGlfZ3AgbXVsdGlfZ3BfY2hvbGVza3kgbXVsdGlfc3R1ZGVudF90IGdhdXNzaWFuX2RsbV9vYnMgZGlyaWNobGV0IGxral9jb3JyIGxral9jb3JyX2Nob2xlc2t5IHdpc2hhcnQgaW52X3dpc2hhcnQiLCJzZWxlY3Rvci10YWciOiJpbnQgcmVhbCB2ZWN0b3Igc2ltcGxleCB1bml0X3ZlY3RvciBvcmRlcmVkIHBvc2l0aXZlX29yZGVyZWQgcm93X3ZlY3RvciBtYXRyaXggY2hvbGVza3lfZmFjdG9yX2NvcnIgY2hvbGVza3lfZmFjdG9yX2NvdiBjb3JyX21hdHJpeCBjb3ZfbWF0cml4Iix0aXRsZToiZnVuY3Rpb25zIG1vZGVsIGRhdGEgcGFyYW1ldGVycyBxdWFudGl0aWVzIHRyYW5zZm9ybWVkIGdlbmVyYXRlZCIsbGl0ZXJhbDoidHJ1ZSBmYWxzZSJ9LHI6MH0se2NOOiJudW1iZXIiLGI6IjBbeFhdWzAtOWEtZkEtRl0rW0xpXT9cXGIiLHI6MH0se2NOOiJudW1iZXIiLGI6IjBbeFhdWzAtOWEtZkEtRl0rW0xpXT9cXGIiLHI6MH0se2NOOiJudW1iZXIiLGI6IlxcZCsoPzpbZUVdWytcXC1dP1xcZCopP0xcXGIiLHI6MH0se2NOOiJudW1iZXIiLGI6IlxcZCtcXC4oPyFcXGQpKD86aVxcYik/IixyOjB9LHtjTjoibnVtYmVyIixiOiJcXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIscjowfSx7Y046Im51bWJlciIsYjoiXFwuXFxkKyg/OltlRV1bK1xcLV0/XFxkKik/aT9cXGIiLHI6MH1dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgiamF2YXNjcmlwdCIsZnVuY3Rpb24oZSl7dmFyIHI9IltBLVphLXokX11bMC05QS1aYS16JF9dKiIsdD17a2V5d29yZDoiaW4gb2YgaWYgZm9yIHdoaWxlIGZpbmFsbHkgdmFyIG5ldyBmdW5jdGlvbiBkbyByZXR1cm4gdm9pZCBlbHNlIGJyZWFrIGNhdGNoIGluc3RhbmNlb2Ygd2l0aCB0aHJvdyBjYXNlIGRlZmF1bHQgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIHR5cGVvZiBkZWxldGUgbGV0IHlpZWxkIGNvbnN0IGV4cG9ydCBzdXBlciBkZWJ1Z2dlciBhcyBhc3luYyBhd2FpdCBzdGF0aWMgaW1wb3J0IGZyb20gYXMiLGxpdGVyYWw6InRydWUgZmFsc2UgbnVsbCB1bmRlZmluZWQgTmFOIEluZmluaXR5IixidWlsdF9pbjoiZXZhbCBpc0Zpbml0ZSBpc05hTiBwYXJzZUZsb2F0IHBhcnNlSW50IGRlY29kZVVSSSBkZWNvZGVVUklDb21wb25lbnQgZW5jb2RlVVJJIGVuY29kZVVSSUNvbXBvbmVudCBlc2NhcGUgdW5lc2NhcGUgT2JqZWN0IEZ1bmN0aW9uIEJvb2xlYW4gRXJyb3IgRXZhbEVycm9yIEludGVybmFsRXJyb3IgUmFuZ2VFcnJvciBSZWZlcmVuY2VFcnJvciBTdG9wSXRlcmF0aW9uIFN5bnRheEVycm9yIFR5cGVFcnJvciBVUklFcnJvciBOdW1iZXIgTWF0aCBEYXRlIFN0cmluZyBSZWdFeHAgQXJyYXkgRmxvYXQzMkFycmF5IEZsb2F0NjRBcnJheSBJbnQxNkFycmF5IEludDMyQXJyYXkgSW50OEFycmF5IFVpbnQxNkFycmF5IFVpbnQzMkFycmF5IFVpbnQ4QXJyYXkgVWludDhDbGFtcGVkQXJyYXkgQXJyYXlCdWZmZXIgRGF0YVZpZXcgSlNPTiBJbnRsIGFyZ3VtZW50cyByZXF1aXJlIG1vZHVsZSBjb25zb2xlIHdpbmRvdyBkb2N1bWVudCBTeW1ib2wgU2V0IE1hcCBXZWFrU2V0IFdlYWtNYXAgUHJveHkgUmVmbGVjdCBQcm9taXNlIn0sYT17Y046Im51bWJlciIsdjpbe2I6IlxcYigwW2JCXVswMV0rKSJ9LHtiOiJcXGIoMFtvT11bMC03XSspIn0se2I6ZS5DTlJ9XSxyOjB9LG49e2NOOiJzdWJzdCIsYjoiXFwkXFx7IixlOiJcXH0iLGs6dCxjOltdfSxjPXtjTjoic3RyaW5nIixiOiJgIixlOiJgIixjOltlLkJFLG5dfTtuLmM9W2UuQVNNLGUuUVNNLGMsYSxlLlJNXTt2YXIgcz1uLmMuY29uY2F0KFtlLkNCQ00sZS5DTENNXSk7cmV0dXJue2FsaWFzZXM6WyJqcyIsImpzeCJdLGs6dCxjOlt7Y046Im1ldGEiLHI6MTAsYjovXlxzKlsnIl11c2UgKHN0cmljdHxhc20pWyciXS99LHtjTjoibWV0YSIsYjovXiMhLyxlOi8kL30sZS5BU00sZS5RU00sYyxlLkNMQ00sZS5DQkNNLGEse2I6L1t7LF1ccyovLHI6MCxjOlt7YjpyKyJcXHMqOiIsckI6ITAscjowLGM6W3tjTjoiYXR0ciIsYjpyLHI6MH1dfV19LHtiOiIoIitlLlJTUisifFxcYihjYXNlfHJldHVybnx0aHJvdylcXGIpXFxzKiIsazoicmV0dXJuIHRocm93IGNhc2UiLGM6W2UuQ0xDTSxlLkNCQ00sZS5STSx7Y046ImZ1bmN0aW9uIixiOiIoXFwoLio/XFwpfCIrcisiKVxccyo9PiIsckI6ITAsZToiXFxzKj0+IixjOlt7Y046InBhcmFtcyIsdjpbe2I6cn0se2I6L1woXHMqXCkvfSx7YjovXCgvLGU6L1wpLyxlQjohMCxlRTohMCxrOnQsYzpzfV19XX0se2I6LzwvLGU6LyhcL1x3K3xcdytcLyk+LyxzTDoieG1sIixjOlt7YjovPFx3K1xzKlwvPi8sc2tpcDohMH0se2I6LzxcdysvLGU6LyhcL1x3K3xcdytcLyk+Lyxza2lwOiEwLGM6W3tiOi88XHcrXHMqXC8+Lyxza2lwOiEwfSwic2VsZiJdfV19XSxyOjB9LHtjTjoiZnVuY3Rpb24iLGJLOiJmdW5jdGlvbiIsZTovXHsvLGVFOiEwLGM6W2UuaW5oZXJpdChlLlRNLHtiOnJ9KSx7Y046InBhcmFtcyIsYjovXCgvLGU6L1wpLyxlQjohMCxlRTohMCxjOnN9XSxpOi9cW3wlL30se2I6L1wkWyguXS99LGUuTUVUSE9EX0dVQVJELHtjTjoiY2xhc3MiLGJLOiJjbGFzcyIsZTovW3s7PV0vLGVFOiEwLGk6L1s6IlxbXF1dLyxjOlt7Yks6ImV4dGVuZHMifSxlLlVUTV19LHtiSzoiY29uc3RydWN0b3IiLGU6L1x7LyxlRTohMH1dLGk6LyMoPyEhKS99fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJ0ZXgiLGZ1bmN0aW9uKGMpe3ZhciBlPXtjTjoidGFnIixiOi9cXC8scjowLGM6W3tjTjoibmFtZSIsdjpbe2I6L1thLXpBLVrQsC3Rj9CQLdGPXStbKl0/L30se2I6L1teYS16QS1a0LAt0Y/QkC3RjzAtOV0vfV0sc3RhcnRzOntlVzohMCxyOjAsYzpbe2NOOiJzdHJpbmciLHY6W3tiOi9cWy8sZTovXF0vfSx7YjovXHsvLGU6L1x9L31dfSx7YjovXHMqPVxzKi8sZVc6ITAscjowLGM6W3tjTjoibnVtYmVyIixiOi8tP1xkKlwuP1xkKyhwdHxwY3xtbXxjbXxpbnxkZHxjY3xleHxlbSk/L31dfV19fV19O3JldHVybntjOltlLHtjTjoiZm9ybXVsYSIsYzpbZV0scjowLHY6W3tiOi9cJFwkLyxlOi9cJFwkL30se2I6L1wkLyxlOi9cJC99XX0sYy5DKCIlIiwiJCIse3I6MH0pXX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIsZnVuY3Rpb24ocyl7dmFyIGU9IltBLVphLXowLTlcXC5fOi1dKyIsdD17ZVc6ITAsaTovPC8scjowLGM6W3tjTjoiYXR0ciIsYjplLHI6MH0se2I6Lz1ccyovLHI6MCxjOlt7Y046InN0cmluZyIsZW5kc1BhcmVudDohMCx2Olt7YjovIi8sZTovIi99LHtiOi8nLyxlOi8nL30se2I6L1teXHMiJz08PmBdKy99XX1dfV19O3JldHVybnthbGlhc2VzOlsiaHRtbCIsInhodG1sIiwicnNzIiwiYXRvbSIsInhqYiIsInhzZCIsInhzbCIsInBsaXN0Il0sY0k6ITAsYzpbe2NOOiJtZXRhIixiOiI8IURPQ1RZUEUiLGU6Ij4iLHI6MTAsYzpbe2I6IlxcWyIsZToiXFxdIn1dfSxzLkMoIjwhLS0iLCItLT4iLHtyOjEwfSkse2I6IjxcXCFcXFtDREFUQVxcWyIsZToiXFxdXFxdPiIscjoxMH0se2I6LzxcPyhwaHApPy8sZTovXD8+LyxzTDoicGhwIixjOlt7YjoiL1xcKiIsZToiXFwqLyIsc2tpcDohMH1dfSx7Y046InRhZyIsYjoiPHN0eWxlKD89XFxzfD58JCkiLGU6Ij4iLGs6e25hbWU6InN0eWxlIn0sYzpbdF0sc3RhcnRzOntlOiI8L3N0eWxlPiIsckU6ITAsc0w6WyJjc3MiLCJ4bWwiXX19LHtjTjoidGFnIixiOiI8c2NyaXB0KD89XFxzfD58JCkiLGU6Ij4iLGs6e25hbWU6InNjcmlwdCJ9LGM6W3RdLHN0YXJ0czp7ZToiPC9zY3JpcHQ+IixyRTohMCxzTDpbImFjdGlvbnNjcmlwdCIsImphdmFzY3JpcHQiLCJoYW5kbGViYXJzIiwieG1sIl19fSx7Y046Im1ldGEiLHY6W3tiOi88XD94bWwvLGU6L1w/Pi8scjoxMH0se2I6LzxcP1x3Ky8sZTovXD8+L31dfSx7Y046InRhZyIsYjoiPC8/IixlOiIvPz4iLGM6W3tjTjoibmFtZSIsYjovW15cLz48XHNdKy8scjowfSx0XX1dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgibWFya2Rvd24iLGZ1bmN0aW9uKGUpe3JldHVybnthbGlhc2VzOlsibWQiLCJta2Rvd24iLCJta2QiXSxjOlt7Y046InNlY3Rpb24iLHY6W3tiOiJeI3sxLDZ9IixlOiIkIn0se2I6Il4uKz9cXG5bPS1dezIsfSQifV19LHtiOiI8IixlOiI+IixzTDoieG1sIixyOjB9LHtjTjoiYnVsbGV0IixiOiJeKFsqKy1dfChcXGQrXFwuKSlcXHMrIn0se2NOOiJzdHJvbmciLGI6IlsqX117Mn0uKz9bKl9dezJ9In0se2NOOiJlbXBoYXNpcyIsdjpbe2I6IlxcKi4rP1xcKiJ9LHtiOiJfLis/XyIscjowfV19LHtjTjoicXVvdGUiLGI6Il4+XFxzKyIsZToiJCJ9LHtjTjoiY29kZSIsdjpbe2I6Il5gYGB3KnMqJCIsZToiXmBgYHMqJCJ9LHtiOiJgLis/YCJ9LHtiOiJeKCB7NH18CSkiLGU6IiQiLHI6MH1dfSx7YjoiXlstXFwqXXszLH0iLGU6IiQifSx7YjoiXFxbLis/XFxdW1xcKFxcW10uKj9bXFwpXFxdXSIsckI6ITAsYzpbe2NOOiJzdHJpbmciLGI6IlxcWyIsZToiXFxdIixlQjohMCxyRTohMCxyOjB9LHtjTjoibGluayIsYjoiXFxdXFwoIixlOiJcXCkiLGVCOiEwLGVFOiEwfSx7Y046InN5bWJvbCIsYjoiXFxdXFxbIixlOiJcXF0iLGVCOiEwLGVFOiEwfV0scjoxMH0se2I6L15cW1teXG5dK1xdOi8sckI6ITAsYzpbe2NOOiJzeW1ib2wiLGI6L1xbLyxlOi9cXS8sZUI6ITAsZUU6ITB9LHtjTjoibGluayIsYjovOlxzKi8sZTovJC8sZUI6ITB9XX1dfX0pO2hsanMucmVnaXN0ZXJMYW5ndWFnZSgianNvbiIsZnVuY3Rpb24oZSl7dmFyIGk9e2xpdGVyYWw6InRydWUgZmFsc2UgbnVsbCJ9LG49W2UuUVNNLGUuQ05NXSxyPXtlOiIsIixlVzohMCxlRTohMCxjOm4sazppfSx0PXtiOiJ7IixlOiJ9IixjOlt7Y046ImF0dHIiLGI6LyIvLGU6LyIvLGM6W2UuQkVdLGk6IlxcbiJ9LGUuaW5oZXJpdChyLHtiOi86L30pXSxpOiJcXFMifSxjPXtiOiJcXFsiLGU6IlxcXSIsYzpbZS5pbmhlcml0KHIpXSxpOiJcXFMifTtyZXR1cm4gbi5zcGxpY2Uobi5sZW5ndGgsMCx0LGMpLHtjOm4sazppLGk6IlxcUyJ9fSk7\"></script>\n\n<style type=\"text/css\">code{white-space: pre;}</style>\n<style type=\"text/css\">\n  pre:not([class]) {\n    background-color: white;\n  }\n</style>\n<script type=\"text/javascript\">\nif (window.hljs) {\n  hljs.configure({languages: []});\n  hljs.initHighlightingOnLoad();\n  if (document.readyState && document.readyState === \"complete\") {\n    window.setTimeout(function() { hljs.initHighlighting(); }, 0);\n  }\n}\n</script>\n\n\n\n<style type=\"text/css\">\nh1 {\n  font-size: 34px;\n}\nh1.title {\n  font-size: 38px;\n}\nh2 {\n  font-size: 30px;\n}\nh3 {\n  font-size: 24px;\n}\nh4 {\n  font-size: 18px;\n}\nh5 {\n  font-size: 16px;\n}\nh6 {\n  font-size: 12px;\n}\n.table th:not([align]) {\n  text-align: left;\n}\n</style>\n\n\n</head>\n\n<body>\n\n<style type=\"text/css\">\n.main-container {\n  max-width: 940px;\n  margin-left: auto;\n  margin-right: auto;\n}\ncode {\n  color: inherit;\n  background-color: rgba(0, 0, 0, 0.04);\n}\nimg {\n  max-width:100%;\n  height: auto;\n}\n.tabbed-pane {\n  padding-top: 12px;\n}\nbutton.code-folding-btn:focus {\n  outline: none;\n}\n</style>\n\n\n\n<div class=\"container-fluid main-container\">\n\n<!-- tabsets -->\n<script>\n$(document).ready(function () {\n  window.buildTabsets(\"TOC\");\n});\n</script>\n\n<!-- code folding -->\n\n\n\n\n\n\n<div class=\"fluid-row\" id=\"header\">\n\n\n\n<h1 class=\"title toc-ignore\">Working with matrix output by sourmash compare</h1>\n\n</div>\n\n\n<div id=\"load-a-comparison-matrix-into-r\" class=\"section level3\">\n<h3>Load a comparison matrix into R</h3>\n<pre class=\"r\"><code>sourmash_comp_matrix &lt;- read.csv(&quot;ecoli.cmp.csv&quot;)\n\n# Label the rows\nrownames(sourmash_comp_matrix) &lt;- colnames(sourmash_comp_matrix)\n\n# Transform for plotting\nsourmash_comp_matrix &lt;- as.matrix(sourmash_comp_matrix)</code></pre>\n</div>\n<div id=\"make-an-mds-plot\" class=\"section level3\">\n<h3>Make an MDS plot</h3>\n<pre class=\"r\"><code>fit &lt;- dist(sourmash_comp_matrix)\nfit &lt;- cmdscale(fit)\nx &lt;- fit[, 1]\ny &lt;- fit[, 2]\nplot(fit[ , 1], fit[ , 2], xlab = &quot;Dimension 1&quot;, ylab = &quot;Dimension 2&quot;)</code></pre>\n<p><img src=\"data:image/png;base64,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\" width=\"672\" /></p>\n</div>\n<div id=\"make-a-tsne-plot\" class=\"section level3\">\n<h3>Make a tSNE plot</h3>\n<pre class=\"r\"><code>library(Rtsne)\ntsne_model &lt;- Rtsne(sourmash_comp_matrix, check_duplicates=FALSE, pca=TRUE, perplexity=5, theta=0.5, dims=2)\nd_tsne = as.data.frame(tsne_model$Y) \nplot(d_tsne$V1, d_tsne$V2)</code></pre>\n<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAADAFBMVEUAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tMTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1eXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29wcHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGCgoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OUlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWmpqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnKysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////isF19AAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdB5gUVdqG4bcnMAw5CiLZQFBABUQRSWIEEcGsrLqYIyYwg5gQA5jWvP+qqOgqiAFMgGnNiigCoqJiQhFJQxpmpv/OXZO7aqorzDz3dS1zTlX3Od+OzUt3V9UpBQEAlsjtAgDArwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAizwdoD9dNR4A7DJpk80Z5ekAHScAsM8zNmeUpwP0Yg2bDAD22EtP2JxRHg/QO90uAUC1cTIBCgDWEKAAYBEBCgAWEaAAYBEBCgAWEaAAYBEBCgAWEaAAYBEBCgAWEaAAYBEBCgAWEaBAajYveuPT9W4XAW/xYYDmrVj0waIVeZaeS4DCokVH15GUfchbhm15a10rB97gswBd9/jIDoHIKnyB9iOfMP92gACFJUWTMpSxx5C9s6UztkU3vXVCE6nO0GeL3K0MrvJVgG6b3LDYUqaNpuSbHIEAhSWXKuvS30I/195cVyPDkbnh6NALsG6j0B/7rnS7OLjHTwG6fnA0NwO5jXOjb0N10AZzQxCgsGKWcubGmp830R2h/NxLDW/8MRhc/UAbtVzham1wk58CdEQoMbtOnLeyMNQuXDlvYpdQf5S5IQhQWFC4m+5NdOao0drg0eoci821B6q72Q9CqDZ8FKBzQp/ZZxTb8lToE/3cch5dNgIUFrynDtuTvcF67C01TLzt3NBZ97hRFLzARwF6ggJvldg0XzrR1BgEKCy4URcbevfp1BN0Q7I/W7s7XhE8wkcB2kGDSm0bqI6mxiBAYcG5us/Qe10HNdEPyf72JvrZ6YrgET4K0NxibwOixirX1BgEKCy4UHcZenN0sOoZd++v9xwuCF7howBtpLNKbTtTjU2NQYDCgjt0hqE3WacVf9kN1AJn64Fn+ChAu6ljYYlNhR3U3dQYBCgsWKxmGxOdwm56oY5WJ/cW7aTlLhQFL/BRgI6Triyxabx0hakxCFBY0U+XJNr3qf3Ww/VAcuf7asPVSDWVjwJ0eW1pxCLDhoXDpdrfmhqDAIUVH9fSlFhzRi09F3xGbdfF9xX01zUulQXX+ShAg1PD1x51GjN5+qxXZk2fPKZTuHu3uSEIUFjyaIYGv7YtWPjesQFdHfrU3kcHxT7UF5yjlusqfjKqLz8FaHBalorLMnsGMwEKa2Y3kzKbZUt1J3y1Ohj8qYU6v1gQ2v7+AOVwDL7m8lWABpcdXcsQnznHfmN2AAIUFq27ca9MqVW78D/iu9+S990eUtN+A1pLLcnPGsxfARoMrp8xflivTm079Ro2boaFxW0JUFhXsPxAKbvTHg2l1h9uu6tr+F/xNlfz+b0m81uAVhEBCuvWdlXL+0N5uf21Pqodet+58t23vuH4e81WnQN01iFDSmqpC92uCr51lLr/Gm1tP0Mt/na3GHhCdQ7QUSpDL7ergl+9o4aJtZMLBulyN2uBR1TnAP37jVJ21ZFuVwW/OlUTk53P1LzAvVLgFb4L0OJXc/66dKmpZ+9NgMKqNlpi6O2qz12rBJ7hrwCdfUjDQPPjDKeNhD6lmxqAAIVVBVmZhlWVg8M127VS4Bl+CtCiM2LfY45OrOxAgMIphVkZxgA9Qi+6Vgo8w08Ben3iSFCn72ObCFA4pq2+NvR21kLXKoFn+ChAf64l7fnM4vnn5UitY2uIEKBwzBjjoiEfqUXJxRVRA/koQCdJ/TaHG0v2DCXod5FtBCgc877qJ+4kt71fqbUVURP5KEAHKhA75J43PJ6gBCicc5y6/BRtbfuHWnEJJ3wVoC3ULd4sOElqE/4elACFczb0UNOpq4PBrbP3VN2P3K4GXuCjAK2lIxLtghOltisIUDhq3RFSZtvOtaWOnASKMB8FaK4OTnYKjpHa/UiAwllzhobSUz2nbXW7EHiDjwK0g3Y39PKHSx1WEqBw2Laflm4sa/v8U9pm5+xyLuc21Sw+CtAjlWFcAXTbYdLOfQlQeMFfQ2OnKGecvsXtWuAgHwXo7dLTxv6WIZFXrKkxCFBUZNO9g1toh4F355l83u+7qPENy7Zv/fzSXPXdnJbS4Ek+CtBl0qHFNmweSIDCTq/uFHsfuePLpp5X2Fe9fos2v+6gf6ShMniUjwI0uJcCXxbbkNePAIV9HstUnxmrgque2U8ZD5t6otqujreX1gv8z/7S4FF+CtA3J0x4o/iWDWccd5ypIQhQlOujWpoUu0PHLYFsMynYW9OTnQk60day4GV+ClAbEKAoT9F+ujjRGa9eqd/t6M9APcORox/UyM6y4GkEKBDxiVomjx1taa3U71b8qXoau43E7ZJqDAIUiJikCwy9y3R1ys98T/sbuy31m101wesIUCDiNP3b0HtSJ6T8zO/VyvB5f0NmdvxuSdw1qdojQIGIE/SUoTdTR6X8zKI2+jDZm66BkZ9zT2iVkd3x3C9sKg+eRIACEZfoJkPvdp2X+lOv0EGJt6CbO+mR0I/fD5SUGb406Syum6/GCFAgYpb2MfT6aUbqT13TVJfFEnTbMdp9ezC4sq2aT/muMP/zi2urPxd3uqBw7rkH9znixmVpnoYABSI2NTfcZ3OOmmww8dw3szQscs/j9/uoQaiRv7f6xU6t/7KtTrezTKTkf91jaxOckt5TIghQIOoeNVkUay5upjtNPfe1xlK3EcN3ltqF12P6l3ZdG9/1VZ3AJzZWiVRMr6UON7z+4XNjamu3H9M5EQEKRBWNUr1pW/6+Y1Cr3AztY/II+qrzGoXf8LS8NvLGdQ/NTO66Qv+0s0xU7u1sXb4t0vqhp7pvSuNMBCgQs/VUKSc7tp7IPt+YfHb+hzNnL4zeqXOlmhhuIb9ULe2rESnY3llXxNvru+r6NE5FgAIJc1qHszPQ6193tFbjjy0P8476GXpFtcVhJEc9r07Jf8D+p0bb0jcVAQokPKnsS5+c80uolTdKO/1pdZg3NMTYbSju4JlmhTOP61hvxwF3RL95Hq07DPv21mvpm5gABeI2tlRiGbvtgxJngm7+scybeJTva3U09FarbtVLQ0WW7B374qXJf8LdfWS8Z+oFuit9MxOgQNwjxoval2bWDufm6qt2C/3FbH3+DybGKdxBhguQHtLhNtWHsr3fUO3uWrbx1+cOkiaE+rvJ+AX2BE1M39QEKBB3lB419PrrhWDw6QZSbru6Us5tJgYaq6GJS5M2ti92jShs91sLHR+7j8r/1QpfALG/3jLsPkP/St/cBCgQt6eMN9W8WHcE7w3oiHcLg8HPTsvQJakP9EcjXRVL0M3D1LPQ1ipRwhk6OHHS2QNqlRe80LiUVlGHYh/obUaAAnHFP/pdoxveywrcG+vNrm3mjeScTA1fGm4s2EtNv7evQpS2rlbWd4lO0b76T/AdNU1cxxB8Uu1TXxvbNAIUiOuv1w29k/RIH12V6D6i1ibut/lKQ2mPI4e2kXZdYl+BKMN/daCh95COCQYP1LD8WH9ZE/0njZMToEDclcY1lbc21yy1SF7FUrS3njcx1u/nRi5NanNTOq+DQcgUXW7ofaq9g8Efmmvgt5Hu8001Ko1vQAlQIGFRIDd54fQU7T1FZxn23qYzTY2W//ELLy1O519eRFyv6wy9Jeoc+vOznVTrsOvvunR3aUReeU+0AwEKJJykveOL97xRS69foLsNO+fqUDdqQiUe1CmG3hwNDv9YdUZW5MTQHR9M7xE8AhRIWNtJu8wNN/JuyA59MDxP9xp2vqaDXCoLFVmsFoZrNc/WtdHGX49fd+FNb24v+zm2IUCBpF96Se1POOPwugpcWRi8WRca9t3Nqkre1MOw9uB3tTO+Lv2IL24+4+TLXjBxDDBlBChgsG1qZD2RjAHvhjofqm1+ctcBmu5aWajAHOW8GWuu7q7TSu3/fED0Os/m99j/jTQBChRT9NlTD83+Ndrc3bAqxSw1Xe9WTajQJcqeFD5UVPRie3Ut9R/pmdpqds5DT9zQWzrK9mWxCFCgXK8EsmfFmh82KvaFKDyk8IqA6hw65ujQh4f9fi+5c362zo3enmV2E422e2oCFCjfNco454fQzz+ura0TOCXJs94dkBH+kN7uvvySe7a215Xx9lf19aLNExOgQAVuy5Z26dclQ4GL0n1AF1Xx20uPPPtFGdsf0p7JE5nuUy+bpyVAgYosG90w9NYmd0QaF6RAGh2qx5OdbQ1l8y3mCFCgYvlL313M9Zh+1Uo/G3pD7f4MT4ACqL5ytNXQO03/tnd4AhRA9bWjfjH0hmm2vcMToACqr4P0ZLKT30Q2L85KgAKovv6lfZKnnz2sPW0engAFUH1tbq0b4+3ljfWczcMToACqsbmZgXHRZUTmtdTRdl8MQYACqM7+na3W455+cdpg6RDbF1cmQAFUa+/3iq7G1PCWgmLbFz0x9bFPqviWlAAFUL0VvXvF8cPOfGKtcVvh47tGUrXdg1W6RJcABVDjbBwhtTpx7MltpSFrqjAOAQqgpik4VE2nhxcZKXq+lfpurfTx5SJAAdQ0t6vFt7HmL+11lfWBCFAANUxeE72W6HwUqPNnif2/zH/+3bXBVBCgAGqYmdrP0Bumh407i57fJyAp+/BUVjAkQAHUMJfrBkPv/mK3Ww0fXqo/aOR+2QpcXfk95QlQADXMP/SYofeKDk928geq6UPho0p/X52tsZWORIACqGHO1X2G3jM6Ntm5Sq2/izXfzNELlY1EgAKoYe4odvf4Sw2H4X/Lzfgw0blXnSq7UIkABVDDfKOGfyU6eTvq/UTnHh2VfNj2dvowWDECFEBNM1QnJdrna7/k+8xjin07er6mVDIQAQqgplnWQGdGrz/aPk61P03u6Kd3DQ+bposqGYgABVDjzK2jjtO+/GPxfV1U6xnD9gP1pqE3WeMqGYcABVDzfNY9usadOhnfcgb/qTsNvRN0fyXDEKAAaqDC507YvXmXo58qvprdc9ozefb86vqBHysZhQAFgJgtbQ2niJ6iYZU9ngAFgLjnAtmxSCy8XPWWVvZwAhQAEiZI3S54bt2aGXsre2aljyZAASDuu+OzYkeX1O7tyh9OgAJAzPN1ld1vn2YZUuZZW1J4PAEKAFFzM3XSr+HGt8cr640UnkCAAkDE3010bbx9pZqvq/wZBCiAGmbtY2MOH37Rq6VuaHyNDkpcFl80UBMrH4kABVD9FM4c3a31Hsc/W1DGrlsbxi5CmlNiz87GK+EXqFPl0xCgAKqdT+NXanZ5v+SuLUdIg+975YXrd1NG8cWW/lRjw008Chqo8jvGE6AAqps5ddThzoU/f3HXbsopeTLnaDV/PdLYfmumphv3fKU9jN2u+rrSiQhQANXM0vo6a1uklT9Wdb4otm+u6n8Vbz+kxsY3mSvUwfjItvqp0pkIUADVzGE6OdE+U/2L7TtAU40PNN6ec2tuxh/J3q8ZdfMrnYkABVC9LFGj5BvLDTvo40gjuoDyHxm5eclHvqqexicO183JziSNrHwqAhRA9TJFYwy9i3RdcM2NPXNVt9/UvOA76mfYt0m1jbeNW6AGieVDFtcrtjh9OQhQANXLWXrA0HtSJz7eSFLt0P92fPWF4hFQR5uM3ZPU9vNo65PWOjWFqQhQANXLScUOrs9WF+mwVzcF1z2/nzKv076GfRtUp9gzN/dX1pjXf/nl1VOzNJhr4UshQIFq7xLdYujdo0Dmw9Fm0fXKyaq1NrlvlvoWf+q2sdnR80drXVb5EaQgAQqgunm22Pech0i3JTrnq4nhCs2ivsVugRTx7bX77bRT3+u+S20qAhRA9bKxkeYlOh8EtEvyes71TaWcxMGhG7RjXrBKCFAA1cwt2nFFrPlLO2mSYdfpGqA6/xe5YnPjhcoseTW8WQQogGpm+xA1nxE5P2nmjmqqFwy77tW5Z0hdrvj3fWc2U87jVZ2JAAVQ3WwYJrUZffk/2ktDDtRcw56HdHrwybbRA0X9P6vyRD4M0LwViz5YtMLaVxcEKFATFP5fh0hGtn2w4J+GGxUHg+M1IfQO9c3rTjv31i9tmMdnAbru8ZEdApFfTKD9yCfWm34+AQrUEJ/959b/+yj0Of4/OjC5sbCT5ts5ia8CdNvkhjJqNCWlU7UMCFCghvm7od5MdB5V+1Lr0FeFnwJ0/eBobgZyG+dG34bqoA3mhiBAgZrmFu2wONZ8p46etnVsPwXoiFBidp04b2X4FITClfMmdgn1R5kbggAFapqCoWowLXzJ+9oJtXSWvWP7KEDnhD6zzyi25anQJ/q55Ty6bAQoUONsOVmqc8DI/WopcHkZ90iqCh8F6AkKvFVi03zpRFNjEKBADTSnX0bo82r2oR9EelvnTh5/84ub7RjYRwHaQYNKbRuojqbGIECBGmnV28+9+3ektfWWxpEDKPWv21TJc1LgowDN1cWlto1VrqkxCFCgZvuzr9Tz8slX7BvQniurPJqPArRRGd//nqnGpsYgQIEabUsftV8QaX3YRbubPIunNB8FaDd1LCyxqbCDupsagwAFarRrtHP8xnFru+n8qg7nowAdJ11ZYtN46QpTYxCgQE22rm7gw0RnSVb2L1Ucz0cBury2NGKRYcPC4VLtb02NQYACNdmTGmzoHa17qjiejwI0ODV86KzTmMnTZ70ya/rkMZ3C3bvNDUGAAjXZpbrV0Hs4pRvHVcRPARqclqXissz++0GAAjXZaBmXAH1Fh1dxPF8FaHDZ0bUM8Zlz7DdmByBAgZrs/GIfWp/UCVUcz18BGgyunzF+WK9ObTv1GjZuhvnV7AhQoEa7R8cbeufq+iqO57cArSICFKjJfgrkJg+8r2msL6o4XnUO0C+uHF9SCw11uyoA7jlBh8bXEyk6TodWdbjqHKDDVIY93a4KgHt+bqHh0WviN56kRsurOlx1DtDFk0vZiXegQI32YTM1uXzup69f1UIN5lX+8Er4PEBfv/9+U4/nO1CghltxSOzTaP8lVR/M5wE6SuamI0CBGu+Dyw7uOWTs23YMRYACgEUEKABYRIACgEU+CtAFZehPgAJwjY8CtKyzOkWAAnANAQoAFvkqQLPblVSHAAXgGh8FaBs1KCq5jYNIANzjowAdIZW6cpUABeAeHwXoDdLTJbcRoADc46MAnSNdVnIbAQrAPT4K0D9U7IZ6EQQoAPf4KECDt91wV8lN+Vu2mBqCAAVgHz8FqA0IUAD2IUABeMGqGXdOm7nW7SpMIkABuG/R4RnhCwuzT/rB7UpMIUABuO6RWqoz/OILh2SrwStu12IGAQrAbdMDOn9NuLHyGNV6x+1qTCBAAbjs5zq6J9YsukQ7bXK1GFMIUAAuO1fHJ9qF++o2F0sxiQAF4K6C5lqc7L2snu6VYhYBCsBdy9XO0NtaK7At0ih6+R9dmrY/+J4NrhSVGgIUgLve1f7Gbmv9HP6xfN/Ymuk7lFpEyDsIUADu+kI9jN2GWhf68+MmajXly79+eKq/Aje7VFjlCFAA7lqXlbM+2VuqHUJ//tFKI/OiGx7ICsx0pa4UEKAAXDZYdyc7YzUm9Oc5Grw9vuVutdnsQlWpIEABuOxlNfku3n6/VuZXweD6nKxvEruLetkeU3YhQAG47Si1/yLaerNpZN305zXIsPtfOs6NqlJAgAJw28a+yjptznfLnh8Z0KiC0Ibbit1+4hP1cquyShCgAFy39cLs6DlLdW8qDPcnaoJh7xJ1caesShGgANz09Y0nHXzyrd9+O7F/x05Dpvwe3fiATjU8ZE7pu/l4BAEKwD0/HRV955lx0h/GzV9qx/xk71xd43RdKSJAAbjm4xaqd+b01x47JVdtvzbu2COxPlMwuKJ2xuJSz/QGAhSAW35qocNWRVorD1D71YY9L6p2fF3Qv/fSaMcrSxEBCsAto3RYQay5ta/ONO66QDm3Ru65+9ou6uTZWyURoABcsjRQb1Wi822trN8M+woulhoMP/fkjlKvX5wvLUUEKACX3BK5ajNupB4MBr9/Zca8v6L9N/eLHF5qdedWV4pLCQEKwCUn6zFDb5oueGz3cGRmHfJBdMtPz933+MeFrpSWIgIUgEuG6mVDb7paSk0PP65/jgLXFLlWlCkEKACXnKJ/G3qTpR2fDB9TWndtdrErOT2MAAXgkjt0sqHXTi3iR4ter6U5bhRkGgEKwCUrMnJ+THTmSMk7wt+pbm4UZBoBCsAtp6jvllhzfUvjiiH5rfSFKxWZRIACcMuf7dUnunDyom7S44Y9pxsXqfcuAjSNVj927YU3vJ5f+QOBGmrpzso+8s7HbzssQ7n61LDjZl3pWlEmEKBps+r0rOhNWe8tqPzBQM205pzoX5OcS/vof4bt1+l612oygQBNl892Uq2hk+4a110autGpSQHfWfXwRaPHPvZX8CTda9g6rNgHes8iQNPkh+YaFL1P1ovNdaSnL6YAvOBJ9U6ePf9z7cw/KnisZxCgaXKQhsa//Py2mR5xaFbAtzbtFL4WPqroKJ3oZi0pI0DT4z01/TvReVZteAsKVGKGasU+tuefoSY/VvxgjyBA0+Mi4zHEol2KfT0OoCzXSkNfWVf0y6OdVedNt4tJDQGaHv0139A723B7AgDleLRR9AZJ6vyZ26WkiABNjy5aYuhdr2udmRbwtb9u6tMw0HLoY9vdLiRVBGh67FfsQ/tY3enMtACcRICmx2maYuj10lxnpgXgJAI0PWZr5+QlnO8HGnj4pgQArCJA06NgD10ab6/vqonOzArAUQRomvwvRxdFF+r6vqe65zk0KwAnEaDpMiNHba+b88Gz/8zRbv44JxiASQRo2nzUM3pKW8Zpax2bE4CTCND0KXrjgkP3PfLm5c7NCMBRBGg6rXv98ec/9cn9WQGYRoCmz+KjaoU/wre6eZNzcwJwEAGaNv/KUtYBo0d2kLp869ikABxEgKbLfQqc/2e4Mb+bWv3q1KwAHESApslXWYH/izXzButAh2YF4CQCNE1G6IJEe01zvebQtAAcRIDabOXdpxx+8qRFa7Oz/0xuvEX/SPO0AFxAgNpq3dnRe7RqH/U3bP5aHdM6LQBXOBKgxW8I9OvSpTZPmbo0B+iPnZV97COvPHF2I+kQw/bNyk3ntADckf4AnX1Iw0Dz495Lbhgl996kpjdAN+6hPb+JtP7aV9nfJHesUZM0TgvAJekO0KIzYjc5Gb0xvqn6BuiV2mN9rPmxNDi543X1SuO0AFyS7gC9XnGdvo9tqrYBurFO4NN4u7CF9H5iz/GakL5pAbglzQH6cy1pz2cWzz8vR2odux6n2gboc8YDRzdIF8XbrwVyf07ftADckuYAnST12xxuLNkzlKDfRbZV2wC9XtckO3mt1fTvaPO1hro5fbMCcE2aA3SgArFD7nnD4wlabQN0rKYaev+Vdpi8ZOuaN44PaDQrMgHVUZoDtIW6xZsFJ0ltwt+DVtsAvUFXGXovqmns2986t5CfQLWU5gCtpSMS7YITpbYrqnGAvqh9Db2LdNXc0e1zGve8ju8/gWoqzQGaq4OTnYJjpHY/Vt8A3dxA7yY6qxvqs/RNBcAL0hygHbS7oZc/XOqwstoGaOgz/M6rY83th2lYGmcC4AVpDtAjlbHe0N12mLRz32oboFv6aJePI62fhmiHn9I4EwAvSHOA3i49bexvGRI5rGLzlKlL87Xwq3orMGTK9LuPra1Wn6RzIgBekOYAXSYdWmzv5oHVOUCDm6+uE72V8ejf0joPAC9I96WceynwZbENef2qc4AGg2unjz3xgntWpnkWAF6Q7gB9c8KEN4rv33DGccfZPGXqHL6tMYBqjQWVAcAiAhQALEpzgN61xubRq4gABWCfNAeoco57vbC8R7qAAAVgn3QHaEi7id45pZwABWCfNAdop+hZkQc/s83mWSwiQAHYJ90Hkd77Z71Ihja96MtyHu8oAhSAfdJ/FD7v3/2iy2L2fmB9mU9wEgEKwD6OnMa0/IpW0ZWF//G2zZOZ5WyALr352CEjr/vcwRkBOMmh80ALXh6ZHcnQXW9x9SJxJwP09+MD0bfeh37r2JwAnOTcifSr7+wWiZPMI17YbvOUqXMwQBe3UZ3Tn37jvxc0VpN3nJoUgJMcvRLp416vC+UAACAASURBVHMaRTK0hc1Tps65AF3dXgN+jbTWjFKT7xyaFYCTHL6Uc8uTBwaq92pMcWdp/62xZuFIHV5851/vznznT4cKAZA2Tl8L/7/T6/gsQFc9OOaIkyeaPRL0R1b28kTnr0ZaaNj31pDM8FcZA98o/TQAfuJogP5+a+fIR/gcm6dMnekA3XRpTvRI0IFfm3reoxpu6J2vCYn29vNCv4D9j9q/tjTGI5cXALDGuQDNnzksMxJFPe7+2+YpU2c2QFftrYwj73/xifOaqv4cM0+8TLcZes/omET7ZOXevCH0c+NtdTWKG8YDfuZUgH51cfNIejY851Ob5zPFZIBu3U+dvoi01v1DdRdW8mijMXrE0HtDB8abD6vBR7Hmwia620w1ADzGkQBde3/vSHoGBjyx2ebZTDIZoFPUMXGs53T1MvF+cbxuMvSe0Amx1pYd9Uxi84tqutFMOQC8Jf0BWvTmibUj8dnqSntOKM9bseiDRSvyLD3XXIDmN9W8RGdzG5n4EP+0Bht6p+jWWOtl7WnYvr8hTQH4TroD9IcJ7SLpmTXipQIbBl/3+MgO0et7Au1HPmH+2npzATpP3Qy9m3RG6k9dXyfwcaLzY+2M+L8dl+t6w6Nu17kmygHgMWkO0AOjaddpyio7ht42uaGMGk3JNzmCuQC9W+cbeu9pPxPPvVq7/RVrbu6rf8Q3F/99z9IIE0MC8BgHFlSue+q79oy8fnA0NwO5jXNjl5kftMHcEOYCdKLh7KNg8BvtZuK5m3pq1+jRoiW91WF1fPMYPWp40Awda2JIAB6T9gDt85DJjCvfiFBidp04b2X4HiGFK+dN7BLqjzI3hLkAvafYJ+x31NfMVL/1UmDgDQ9OPixLuyxLbJ2kCw2PuVLjzQwJwFvSHKAXL7Zv4Dmhz+wzim15KvSJfq6pMcwF6NvqYuhN1Dmm5tp8bd3Iu+TsCwznvX6iHZMnImxrr7dMDQnAU3x0W+MTFCgZN/OlE02NYS5AC1rqlURnY0u9aWquYHDDM1edOe6xv4ybivbRuERnorp76Y57AEzyUYB20KBS2waqY/lPWP3fZ0vqUOwKy/IUvXbeoJ6HXvl58G7t9Et82wna31LZJbyfHYif0nR3RuZ8O4YE4BJHA3T59ccfO/49qwPn6uJS28Yqt/wnjFQZelY+0cc9Y4898sfBahs9ArZqhBostVp5MQ9nqP/sDcGNLx+owF22jAjAJWkP0HVz58YPodyaFYmlo6ydAx9spLNKbTtTjct/wkvHlNJYB1c6z8zaajtp3qcvX1Rfrd49QBp061P/Oiy8nn69w5+24xP3iy3CdzcJ/a/Zf20YDYB70h6gj0uxGyE9EX8TOMzawN3UsWR+FXZQd1NjpPAd6Ke5On9LpPXHELX/dVL9WNU54duL9lyR8lR//t/4s66duamMPRtu27eOcntPXpfyWAA8Ke0Bek78SPaWltJ+z35wewOZuSTSYJx0ZYlN46UrTI1ReYAW9U6eu7R1/1B7/dPnN1ets78JBlc/2E7NllX05KQ/zoi+3W5wY9lL1pUVrAB8Ju0B2kdXRxtPSfuHb4Y0T4mVNcxZXlsasciwYeFwqba56+srD9B5ap08z2hZVvaa8Mnv7ZZE+xsO124pLYeyqK2yj7j1gQl9pX6rK384AF9Ke4C21+xo4zjFTgM6XDtbG3lq5KrQMZOnz3pl1vTJYzqFuybXg6s8QC/SNYbeoZoe/CwjN7GY8uYempzCNL+0Uv9osr/dTgewbDJQTaU9QOsptgBoWzWKfoU5TXUtDj0tq8Qh9ax7TI5QeYAeWuwLhkmhOD1Llyc3vKn2KUwzQkPiqflb28RKTBX44Ynb737J4sE1AG5Jb4D26NFD6twjQsqNNjpK4R/3Wxh72dG1DPGZc+w3ZgeoPED30/uG3t26INhOhu8NinbSkkpn+UL1/0h05qnxlkoe/06/yP+f3HNtWXIFgFPSG6ADBgyQ+gwI6yrtEmkM2Evav98B/f/P0ujrZ4wf1qtT2069ho2bYX41uxQC9Eg9Z+hdoRsKsjKN97E/NIWLR68ptopTb71c8cNvCKjRMZde0C9TLT+odGwA3pH2j/B19Grk502K58irqmPzlKmrPEAn6UxDby/NzQ9kG1eiP0IvVjrLML1g6IVCuMJH36LMiZGD8suGqEHlb28BeEbaA3Q3nRf52VOZa6Jb/q02Nk+ZusoDdElG7s+Jzhw12xbcQT8Y9nfWZ5XOsq+M7yTvKrYAUymfZ2TOjDW3H689uTge8I+0B+hpygrfFuM+Je5xcYYOsnnK1KVwIv2J2i9+kuaPO2paMHisbk/uXaym28t8mtFhhjVIgsHrNLGiBw8zHKPa3EEzKngoAG9Je4B+IGUcfv4AKf7Rt6B1/MxQF6QQoKs7aK/o/TdfbKmDC4LBV9QisaBS0VBdUPkslxQ743+Qnq3gsWuzs9cke//SUZUPD8Aj0r+YyMWxY+bxpY9nSTatUG9BKsvZLe+kjP5X3Tp2D+mQyNWWg3RA7KrLovFq/EdFz416Ry2Sd9tcmFG7oqNd89TP0PtRO1Y+PACPcGA1ptsbhc/YPD92YmRBN7UzcXtgm6W0Huj6cbmRyG9xb/Q+eL+11q6zws2Fhyrr1VSm6adT4s28PY2nkZb2VLHrsgoCme79cgCY5MRydvn/e/71tfHOX08//aHNM5qQ4oLKeTNvHHfbm4kvO3/aS2p6wEEdpCavpTTNV/U1Ovq284d91LnC061eKra2yjo1TGkCAF7gowWV7WBuRfqE/Pt2j7wlvSTV69pfq6/ml85a8OSpOdq54qv1l6qF4cD7a+plpT4AriBAU/TTO69/beIUo68HRb/5zTh1TSWP3FUzk52RxW4bD8DbCNB0+fDKIwceO7nyxaIeUPvE+9rnA/W4mhPwDwLUbdv3U4/YMs1P1zG7uhQANzkUoFsfPap9vczwTTXzX5jl/YNIjvq9i3IvfPOHJU8OUSonmQLwDGcC9L02kS8EF4TbA9Qs3+YpU+fFAA2uPzkj+oVpk4fcLgWAGY4E6FvhW7I1iAXoLCmlcynTwrUA/fL2C8+/6YPyjkItGt+3fZfD7/3b0ZIAVJUTAZrXQjrr+2AsQLc20GU2T5k6lwL0g/2ibzG7VLKwHQBfcSJAp0o3hXdEAzQ4RINsnjJ17gTog9na4ay77hnbToGrXJgeQJo4EaCDtXP4s2s8QMeqlc1Tps6VAP1vIDAucruO/DuzU7m/BwCfcCJAd4guiBkP0BuUa/OUqXMjQNc0Ci+KF/VCRtZSxwsAkCZOBGi2bonsiAXo9cqxecrUuRGg1+mwZOd8neR4AQDSxIkAbRy9U3A8QE+vYR/hu2p+svNToMFWxysAkB5OBOju0dSKBWhRR/W3ecrUuRCg2wK1jGvYd9LX5T4UgL84EaDnqfafwUSAPilNsHnK1LkQoL8Wf8M9QG85XQGANHEiQD+QjiqIB+j7DZS1wuYpU+dCgG5WrnGN5D2Md5kH4GuOXIk0Uhr0QSRAv7qwlnS2zTOa4MZ3oB30cbKzOrN2nuMVAEgPRwJ0XdfopZy7NA1fjtNzi80zmuBGgI7V6GRnoo5wvAAAaeLMYiJ/D1fC8A02T2iGGwH6U+2MWfH2x7mB9x0vAECaOLUe6PyjI+8+6w1zbyGRMFeuRLpTOQ9FvwZ9qbHOc35+AGni3ILKRSsXfrLCvYXsoty5Fv5yaa/b57xx7wDpGLd/AwDsw4r0Tni6TWzBz7u4aTFQjRCgjtjy3JmHDTn18XWuTA4gTQhQALDIoQAteO+eay++KMHmKVNHgAKwjyMBWnRfKxVj85SpI0AB2MeRAD1dIkABVDtOBOjsUGTudsV/Zs5KsHnK1BGgAOzjRIAOlS4psHkWi+wI0IIZx3RustuR/9lmQz0A/MyZW3p0Ku9+vk6zIUA/6hL7HqLjPDsqAuBfztzSwzPXL1Y9QF+urd3uW7Lmm4e6K2u6LTUB8CsnAnQnXW7zHJZVOUCX1Nd50asxC69Rzkc2lATAt5z5DnSUzXNYVuUAPVT/SLTHah+uzARqMicCdKbqr7F5EquqGqDL1Cj5f2XzTnqvqgUB8DFHzgMdpaOryVH423WaoXe5rqhaOQB8zZEAzRulvvM9EaFVDdBzdZ+h96yOqVo5AHzNiQDt2bNnhlS/a88Em6dMXVUD9BT9x9B7RYdXrRwAvuZEgJa8kNPHl3KO1yRD7z79s2rlAPA1AtSU2ept6B2mR6tWDgBfcyJAfy/F5ilTV9UA3dxMLyc67wfqrq5qQQB8jAWVzZmm5stizZVtdV2VCwLgYwSoOYVHqPG/wycUFD3TUgewnghQoxGgJm06Rtrh2AtO2Ek6ZK0tNQHwK4cDtOivTTZPZ44NqzEVzYgux9Tx3544sxWAe5wI0IKvvvo10th+dTOp1xs2T2iGPQsqL3ny7ie+sGEcAP7mRIC+JT0VaZwUeeuWMdPmGU1gRXoA9nEiQK9WvcjRlrdD6dkw9B606d82T5k6mwLUK+tDA3CVEwHaX8MiP4+Xbi8qnCTdZfOUqbMjQOee0Cqj1i7nf2VDOQB8zYkA3VXjwz8K6qtX6EdRex1i85Spq3qA/n5g+FuI0P8yz+MkJqCGcyJAG+v28I+PpdvCP89Ta5unTF2VA/SnNmo+5bvCbZ9dlKPBJChQszkRoJmaGv4xTfos/PMm5do8ZeqqGqD5e6pf7PLNha11jg0VAfAvJwK0ga4O/xipOtvDP29Tls1Tpq6qAXqvdlsXb39RO2NhlQsC4GNOBGh3HRj6c1N9DY50r1BTm6dMXVUDtItmJzuX6YwqlgPA15wI0HMVmB8MXi9NjnSHyrcLKq9QM8PlR1+5+GUuAA9wIkA/DSj7sH5Szi/h3vbGOtXmKVNXxQBdoIGGXlGtAIeRgJrMkWvhL44uozwx0nlNesDmKVNXxQCdq0ON3XraWLVyAPiaIwFadEcraYfbojdRHy79YPOUqatigC7SbobeKjWoYjkAfM2h1ZiKVv1aFGvOf2OBzTOaUMUA3d5UXyd7D8SusAJQQ7EeqCnnG56/oa1mVLUeAH5GgJryewNNiDU3D1VvFhUBajQnArRPn8+M3f/26WPzlKmr8qWcL2Vo5PJwY8FearbCjpIA+JYztzVeYOze4+PbGgeDs+tLPUYMayftusSWkgD4FgFq1i9nNgyfk9X6JndvTgLAfS4E6FQfXwsf8uaZPZq13mci8QnAhQC9yMfXwgdXDIheFKCdZtlTEQD/cj5AP2qmvjZPmbqqBujC5trhho9/XfLoPgpMtakmAH6V5gC9a+cQqdXOce3rh9693WzzlKmrYoD+2UbD1kdaRVMzM162pSQAvpXmAJ2gMnTeYPOUqatigJ6v/vnx9m3qsLXqBQHwMccDtH7vSettntGEqgXohtqZSxOdwh6xmzUDqKnSHKDbt4RIr22Jc/nanaoF6EwNMPTu0YlVrAaAv7lwFN5NVQvQ23SZofeR9qlqOQB8zYkA/fbbzWU9cPUs588EqlqATogtaRr1tbpWtRwAvubiYiILXLgiqWoB+i+NMfTmxu7xBKCmIkBNWKjWhlsinR+92SiAGosANaOzHky0f6oT+LLK9QDwMx8GaN6KRR8sWpFn6blVDNDnVPfDWHN9bw7CAzWdzwJ03eMjOwQi55MG2o98wvwJpVW9lPMM1bk7cir9W120y5oqDQXA93wVoNsmNyx2Un6jKfmVP6mYqgZo/tlSs+MuHdNV6vFjlUYC4H9+CtD1g6O5GchtnBt9G6qDTF4VWvXl7F7eMzJxs5vLPDULQE3ipwAdEQqurhPnrQxfzVS4ct7ELqH+KHND2LAeaPCbJ25/5O2Cyh8HoLrzUYDOCX1mL34bzKdCn+jnmhrDjgAFgCgfBegJCrxVYtN8mTwUToACsI+PArSDBpXaNlAdTY1BgAKwj48CNFcXl9o2VrmmxiBAAdjHRwHaSGeV2namGpsagwAFYB8fBWg3dSy5mmhhB3U3NQYBCsA+PgrQcdKVJTaNl64wNQYBCsA+PgrQ5bWlEYsMGxYOl2p/a2oMAhSAfVwMUNMLKk8NXwLUaczk6bNemTV98phO4e7d5oYgQAHYx8UANW9aVok71GXdY3IEAhSAfdIboPeXw+rYy46uZYjPnGO/MTsAAQrAPukN0LLuCh9mffT1M8YP69Wpbadew8bNsHB7ZAIUgH38FqBVRIACsE96A/SWmH9KWf0vmDDx/P5Z0j9vucXmKVNHgAKwjyMHkV6vr7NXRZurzlb9N2ye0QQCFIB9nAjQn5toSrI3Rc1+s3nK1BGgAOzjRIBeqR5FyV5RD11r22SvmzyiT4ACsI8TAbqHrjJ2rzJ5/XpFRpk8IEWAArCPEwHaQHcYu7erkW2TVRighSu+L2l3AhSAbZwI0Dq6wNi9QHVtm6zCAB1T1hlU+9o2N4CazokA7aJWecleXit1tW2yCgN0WsdScjTQtrkB1HROBOjl0rGJG7jnHyuNtzTwgjL05ztQAK5xIkB/bSh1/2/kPuqb/9tNavS7tYFtuKqJAAVgH0dOpJ+dHV45qesBB3QNL6dU62WLAxOgADzFmeXs5rdLBl6HkvcmTnlgZbcrqQ4BCsA1Dq0HuunBfrXD6Vn7gAc3WR24jRoUldzGeaAA3OPcgsr5333yyXf55exMxQhpecltBCgA9/hoRfobpKdLbiNAAbjHRwE6R7qs5DYCFIB7fBSgf0iDS24jQAG4x0cBGrzthrtKbsrfssXUEAQoAPv4KUBtQIACsA8BCgAWEaAAYBEBCgAWEaAAYJFPA/TCzExLzyNAAdjHpwF6nsnzP+MIUAD2IUABwCICFAAsIkABwCICFAAsIkABwCICFAAs8mmALpg61dLzCFAA9vFpgFpFgAKwDwEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoABgEQEKABYRoEjJlgWP/+eNTW5XAXgLAYoU/H5OPYXknvqT25UAXkKAonILmirQe/Qp+2Wo/my3awE8hABFpT6orcOXhRs/HqPM19yuBvAOAhSV2dxG5xTG2lep6d+uFgN4CQGKytyu3tvj7aKDdKWbtQCeQoCiMnvrpWTnA7Urcq8UwFsIUFRic6D21mSvaAf97F4tgLcQoKjED2pv7PbWx25VAngNAYpK/KEdjN3dtditSgCvIUBRicIGgZXJ3rpaWRvcqwXwFgIUlTlOZ7/85rexzj060NViAC8hQFGJ30eFr+LUrlO3hTo/NtOLbhcEeAYBioq90iB8Efw+LaQ9vg8u76Qj3C4I8A4CFBV6OVPDPxug7LOn7KZmZ+Rqr3VuVwR4BwGKivzWQFcXBbddkBX5GK+M0/LcrgjwEAIUFTlXR0YuPFo6rkeTBlma5nY9gKcQoKhAfmMtSfamaZR7pQAeRICiAp+pi6H3k5q5VgngRQQoKvCShhl6RTmBreU+FKiBCFBU4DUdbOgVZGVuL/ehQA1EgKICy9TKsHjdIrVzrRLAiwhQVKSDXk92LtHZ7lUCeBABiopMUbfEmZ+LamcsdLMWwHMIUFRkSxcdHLv26Ms2vAEFiiNAUaHlLbTTvb8Fi768LFcDOAYPFEOAomI/7SepTraUcRb5CRRHgKISRc+PaKRAmzM/d7sQwHMIUKRgU77bFQBeRIACgEUEKABYRIACgEUEKABYRIACgEUEKABYRIACgEUEKABYRIACgEUEKABYRIACgEUEKABYRIACgEUEKABY5MMAzVux6INFK/Iqf2AZCFAA9vFZgK57fGSHgMIC7Uc+sd708wlQAPbxVYBum9xQRo2mmF3nlwAFYB8/Bej6wdHcDOQ2zo2+DdVBG8wNQYACsI+fAnREKDG7Tpy3sjDULlw5b2KXUH+UuSEIUOf98NYrX2x3uwggLXwUoHNCn9lnFNvyVOgT/VxTYxCgDsu/N/zPnJqc+5vblQBp4KMAPUGBt0psmi+daGoMAtRZK/eSmg04fFep/gtu1wLYz0cB2kGDSm0bqI6mxiBAHbWqrXZ9oSDUWHKUMma6XQ1gOx8FaK4uLrVtrHJNjUGAOmqI9l8Xa05SvZWu1gKkgY8CtJHOKrXtTDU2NQYB6qTX1Hx1onOsxrhYCpAWPgrQbupYWGJTYQd1NzUGAeqkk3VLsvN9oP4W485tr004e+w9K5yuCbCTjwJ0nHRliU3jpStMjUGAOqm1vjH09tJ7yU7RAy2jZ/IO/6bU0wDf8FGALq8tjVhk2LBwuFT7W1NjEKAOKszKMJ7/eYyeTbS3HCN1v+r+qSfVVwNzJ6IBXuKjAA1ODb9j6TRm8vRZr8yaPnlMp3D3bnNDEKBOWHj1sN6HXfx2MFebDVuP1KxEe7QaPxdp/HmCcj91uDzANn4K0OC0LBWXdY/JEQjQ9Pt5eOy/Tr/2+siwvYMWxpszVf/LWLPoLO1R4GyBgG18FaDBZUfXMsRnzrGmvz8jQNPuix3V4MLZH8+5sqVq6fzk9nfUqije3lMPJLZv21XFry8D/MNfARoMrp8xflivTm079Ro2bob51ewI0LRb1UYH/RlpbTxFyv4svn3L3poUb3+rJoZltO7T0Q7WB9jJbwFaRQRoup2uAdvi7dFSq8+jzQ3DtHNiDeznNMLwjGXaxbHqAHsRoLDTqsxa3yc665tLOZcsKgqueqCtmi5ObH+g2CUR69TQwQIBOxGgsNOjGm7oXaKeGaHP8XUl9U7mavAZHWt40Aq1d6o6wGYEKOw0Trcaes/rqEVntQ2owbAZRYbNXxqOJwWD/9FQp6oDbOa7AC1+NeevS5eaejYBmmZn6kFDb35kAa38UjcA3MVwTn1hTz3sQGFAOvgrQGcf0jDQ/DjDFYGjZG46AjTNrtZEQ2+6jivzUY9qx5/j7RvVdkuZDwK8z08BWnRG7ATQ0RvjmwhQj5mp/Q29UzSlzEcVHKT2n0RaW68MZL7qQF1AWvgpQK9PnELfKX5EosIAvaVxKVnqn7byEJLXQO8kOityMr8r+2F/91XGkY+8Pvua9sp+xKHSAPv5KEB/riXt+czi+eflSK1ja4hUGKDnqgwcsEivG9Xu91gzr7dOK7Zv2zMn7tu5/+Xh955br8iN/vfo8a7jJQK28VGATpL6RRanWLJnKEGjb20q/gj/dynn6M50lYeIbfur7fxIa+Ge2mWNcderO8f+ERsRjtjf7z95yBEXv1lyiVfAT3wUoAMViB1yzxseT1Cz34FeTICm2+oDpN5X3nXdoAx1KfYB/v5Mdbv7w6VvXFJfbVgEFNWDjwK0hbrFmwUnSW3C34MSoN6zbXLjyPvM3HHFFiuYmxm4Kfp2c1V/7VbmOgYFf/N+FP7iowCtpSMS7YITpbYrCFBv2vLypAsnPrOh2LZtHXVTvL1p71L3FgjF6lVdM5TZY9Lf6a8PsIuPAjRXByc7BcdI7X4kQD1u/V0HtWnc6cQXioJPq1vy7eWngXqbSzzykXpSVuMMqcl/nS0RqAIfBWgH7W7o5Q+XOqwkQD3tqeaxw0a9lp5Q7OYBffRK8UfeKI18uyCY//rBCtzvaI1AFfgoQI9UhvGbs22HSTv3JUA97OaABj6z8u/Fd7RRwy762LDnIk0t9sgXA1mPx5rTAln/c6xCoGp8FKC3S08b+1uGRN7cmBqDAHXQ84Gs2IXxm45VlpYZdl2n642PzN/V8N/lSu1jXHkE8DAfBegy6dBiGzYPJEA9bHOb5Kf2goOkeYZ9/zTc0yPkVXVK3hdp847iNnPwCR8FaHAvBb4stiGvHwHqXdPVM/lO8rsMXZjcVdBanxsfenGxJUjO143prg2wh58C9M0JE94ovmXDGceVvdxPeQhQ55yoew29fVTnz0TnEe1W7KGj9Jyh95DOSG9lgF38FKA2IECds68+MPSukAbFl61bWF/PFHvocM029P5Pp6a7NsAeBCjSpLsWGXo3qL56fxFuFf67vv5R/KFn6w5D70pdk/7qADsQoEiTg/WioTdG1+6ijP0vmXR6W2n01uIPfUZ9k53CzsWONwEeRoDCHptW/FpQbMNEnZns5LfSF2svqxM58WyXGSWfu7GZXkh0HlKH7ekrE7CTTwP0wsxMS88jQNNj8+17h5KxzsgFhm1LM3OSqzHdE7mMbNMLd1x77ydlnOV5jxrFz7Ofl1viC1LAu3waoOeZPH0pjgBNi4/aSLU77JghHW+4gdxp6v5XrPlO7WKf50spOl65N4SXEfljfLbOS1+hgL0IUFTZ27XV++VtweBvNzfUfsk7xK3vqo6RS94335qjCyoeYnvov2hWzyE9MpVxDWvawTcIUFTVn811Zuxby+UddFZyx299pPYnnjWsvnRxQdnPTXrv0FoKvY896vPKHgh4BwGKqrpQByfeNH5dO8Nwtdi2u1qHjxoF+qZ0WH39J298VuoW8oCXEaCoom0NtTjZu0hjjTuLPpv+wMyVqQzz3TvvpfQ4wEMIUFTRe+pu6H2orhbG2DChffitauc7t1b+WMA7CFBU0dM63tDboPrmh/h4J6nVAfs3C0Uot5uDn/g0QBdMnVr5g8pAgNrvKZ1g6OWprukRPqmjvu8UBYMFr+yhZt/bVxmQbj4NUKsIUPu9o70NvU/U2ewAea11auwo/qbDtVelx+sBzyBAUUVb6weWJ3uXmz8P/kb1yY+3N3TUY/aUBTiAAEVVnaXhiaszv60TML2c/G56M9n5jwbbUxXgAAIUVfVrI10aOxF0ZZeSK9VV7hc1NVx7tD4zi6VE4BsEKKrs1WwNfCcUguvuba4eG80++2P1NnZ30i/2VQakFwGKqpu/g9Rsr661pKFrTT/5c+1l7O6gVbbVBaQZAQobrLtuZ0lZB86u/KGlrA7Uzg9NRwAAFBBJREFUN5w+/3ugDouJwDcIUNjjt8+/Nv3pPaqXcQHQ2zXCnnoABxCgcNvD2nldvP1zU811sxbAFAIUbtu+twasiTZXdtMwd4sBzCBA4bqfdlKr+/4Mvf2c3ERdzR+FAlxDgMJ9v/aT1KRh6I8jyU/4CQEKDyh6flgdqcExb7hdCGAKAQqP+Gtd5Y8BvIUABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFAAsIgABQCLCFDP27D0+81u1wCgLASot227q2dAyh7yfJHblQAohQD1tK92kXI7d8ySBq92uxYAJRGgXrawgbq/sDUYXHt/S+22xu1qAJRAgHpYXjsdtzXa/H0vDXW3GAClEKAedoN6b4u3f22q192sBUBpBKiHddCCZOdWHetaIQDKRIB617fa0XDs/Sc1ca8UAGUhQL1rgQYau/W00a1KAJSJAPWu+Rpk7BKggNcQoN61XK0MH+FXqrF7pQAoCwHqPYXvXD36hEte3BJsr7eSW6foGPdKAlAWAtRz3thDEa0enaQ++fGtvzXVq25WBaA0AtRr7shQ+/GPP3XjntJJbXVi7ET6Vb10mLt1ASiFAPWYJ5RxY+Ts+aKn6unkeurxYqi3/qFW2uWv0MaCTS6XB8CAAPWW1Q31YLz9Xk5g+s5Svd07ZUuD/gwuPrdDhhoMfbLQzQIBJBGg3nKdhhk7Q7feGfoor6zBzxZtH5spZdYJ9fb8xr36ABgQoN6yh+YlO39l5WwIBv9evCz0wX37UNW6cGFh8I+HOqrxIvcKBJBEgHpKQWZmvqG7tz6JN8epxcfR1qaj1H69w3UBKAsB6il/qamxe0ji1KVvs7M+iG/d1kdXO1oVgLIRoJ5S7jvQ8To9ufkjNS9wsioAZSNAvaVb6e9AI3robcOjOutDJ4sCUDYC1FsmFD8Kn+g00lrDo47VMw7WBKAcBKi3lDgPNPFGs67yDI86WY87WhWAMhGgHjNdGZOiVyI9WU+XJjbvKuOpS/saP+gDcAsB6jV3ZKr9+CeeDl8Lf1pBcPEjN057cVMweLomJh+yMjM3r/wBADiFAPWced1iqzH9X/DFaLPOxWveVqPfE484WSe7WB+AOALUewrfuerk4y95cUvBeVLL0Vdf1DdD7RYNU5/4jeGnqM4KVwsEEEWAetcFyr0nclboV/trh887quNz4bM/lx+rwAyXKwMQQYB61lzVfjfW3Ha4Bv26j9R04LAuUt1nXa0LQBwB6lm9DLWuba43tz+we/gL0UZn/uxiUQAMCFCv+k6NtyZ7k3RG6M8f5r/0WX65zwDgMALUq57WKEPvE/VwrRIA5SBAvWqaLjT0VqmFa5UAKAcB6lX/1mmG3jfa1bVKAJSDAPWqd9XV0HtMQ12rBEA5CFCvKmhmWMGuqK8ecLEWAGUiQD3rRu0eXw00eK925Op3wHMIUM/a1E37/hppFd2dFfivy9UAKI0A9a4VHVTv4nnLv3iwtwKT3S4GQGkEqIetPjoQXZip9Uy3SwFQBgLU0z67vN+uPY75z2a36wBQFgIUACwiQAHAIgIUACwiQAHAIgIUACwiQAHAIgIUACwiQAHAIgIUACwiQAHAIgIUACwiQAHAIgIUACyqcQHatKN7mgaysn0nI8PtCszLCmS6XYJ5GQG3KzDPl7/ozIy29v2drlezAvQuAYBtAu/anFGeDtDgj9+76J867y2/WaCA2yWYd66OdbsE83bQs26XYNoEDXS7BPN2139t/Ev9m90R5e0AdZUfv4EtUsDtEsy7Q5e4XYJ5bbTS7RJMe1bHuF2CeX31P7dLqAgBWi4C1CEEqEMIUPsRoOUiQB1CgDqEALUfAVouAtQhBKhDCFD7EaDlIkAdQoA6hAC1HwFaLgLUIQSoQwhQ+xGg5SJAHUKAOoQAtR8BWi4C1CEEqEMIUPsRoOUiQB1CgDqEALUfAVouAtQhBKhDCFD7EaDlIkAdQoA6hAC1HwFaLgLUIQSoQwhQ+xGg5SJAHUKAOoQAtR8BWi4C1CEEqEMIUPsRoOUiQB1CgDqEALUfAVouAtQhBKhDCFD7EaDlIkAdQoA6hAC1HwFargl61O0SzGvQyO0KzHtEE90uwbw9sta4XYJpr2mM2yWYd5gWu11CRQjQcm16abvbJZi36Eu3KzAv/6VNbpdg3rcful2BeUVz/Rf6wV/nu11BhQhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAAUAiwhQALCIAC3bT/UlvZvsf3tF98a5HU+c615FFfpm2sid69RqMWjSz8atHi86yhdFBn39K/bZizkYXP/Q0A51GnYedvfyxCav1kyAlu0gFXvN3V1bUaM2uFhUed7sqbhak4oSm71ddIwvivT3r9hfL+aQ6S3jv+vd45s8WzMBWqYHFcg2vObuCf2X63Dm2IGhHwflu1lX2SaE6gp0OWjYHoFQ48z4Vo8XHeWLIoO+/hX77MUcDE4KVZbR/dBDujdKBKh3ayZAyxL6zHNOi+Rr7pssaXxhqDG/oTTFzcLKNiFw8BNrw42l/UKvsBejG71edIQvigzz76/Yby/m4MNS9jV/hVtFnz0R3eThmgnQshysNhsMr7ljpeHR1lNSo/WulVWeNxbFW5t7SIdEm14vOsIXRYb591fstxdzKO8zXyuxzcM1E6BleEh6JZh8za3PkRbGdnWRnnCtrhQ8IzWMNHxRtC+KLMlfv2LfvZgvkK4qscnLNROgpa1soJODhtdc6G9Mp/i+idJIt+pKxWIpEP6s44+ifVFkSf76FfvtxZzXQDmrS2zzcs0EaGkHa4e/jK+58dKY+L55Uge36krFfKl5pOGLon1RZEn++hX77cX8ujQouOyCXXMbdbtoWWybl2smQEsJfeaZETS+5oZJk+M7V4befuS5VFgqzpOOizR8UbQviizJV79i372YJ0nj74+ds5R5TfSEMS/XTICWFPrME/nCOvma6yVNj+8tDEgr3CksFUtypPciLV8U7YsiS/DVr9h/L+bRUn+p2T+uPH2nUIReEtnm5ZoJ0JIOUcNfwz+Tr7lO0qzE7lxpUZnP84K8vaTR0aYvivZFkcX561fsvxfzsPBbz2PCZ8tvDb3V17zwNi/XTICW8LD0UKSRfM21DR/HjGssfeBGXakoGC7ttjHa9kXRviiyGH/9in34Yh4QSs0esXPlD5GGhH96uWYCNLjgvKgLw52fG2hQ9IsXb/+jXazomMKTpZ2+i3W8WHQpvijSyF+/Yr+8mI0ODQXok7H2u1JW+B8rL9dMgAanxq6yzQx3DlGd2N8Pb39tVKzoqILQX+5WidUXvFh0Kb4o0sBnv2K/vJiNjgm9qFfF2gV1pP8FvV0zAVosi56Tbo9t9vaBy9IBuv340F/ubxJdLxZdii+KTPLZr9g3L2ajC0PvOhOdnaXZQW/XTIAWE8+lhItCG8cZTkObL7V3sb7y5Y8MfbhMrv7lj6J9UWSC337FvnwxP2gM0I7RZQe8XDMBWkyZr7kZhgshrpeOcrG+cm0N/Svd5jvDBj8U7Y8i43z3K/bli/mzUJ2/x9rhj/DhA0ZerpkALea1UxJqS4edckr4++z1tZLfW3eVHnezwHJsPlhq+71xiw+K9kmRMf77Ffvzxdw++YXn21LO5qC3ayZAy2NYwOZoaUS0Ffq3sOE610oqV96g0AebH4pv83zRYb4oMsK3v+IIH72YJ0rdY6cxHSQdGWl4uGYCtDyG19yyLOnK8PoRbzUyfJ3tHRsPkDr+VGKj14uO8EWRYf79FUf46cW8ozQynJFbzpYyP4ls83DNBGh5DK+54DSF/vqcdfGggDR4m5tFle2MUHl9RyX8Gt3q8aKjfFFk0Ne/4jAfvZiDC3KkJieNOy0UpLotts27NROg5TG+5oJT47dkGeGp1Vxjjit+rGBpbLO3i47xRZH+/hUHffViDgZf3ylWX+79iW2erZkALU+x11xw+bhujXI7nDDHvXoqUM7fbm8XHeeLIv39K/bVizlk/bQBO2Y33efa3wzbvFozAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgAGARAQoAFhGgcNUt0v1pn2RAj7RPgZqJAIWrygvQ7RMm3GXbJIYAHSsdWHxnJyky0x9zbzyqraQFtk2L6o8AhavKC9At0s62TWII0MVS4AfjvveknDWhn7cpZoFt06L6I0DhqrQH6EdjOteT6nfY99wn1oX7faQJxv3/lI4L/7whHJ71swlQmEGAwlXpDtDLA0qYG97wkNSuKLk/L5Sur4cbdw269KlvitoRoDCDAIWr0hygd0qZZ8/t0/mTWeM7RQN0Q13pzeQD/h3K08JklwCFKQQo3PD7+K51G3W/9rdyAvTb5NvGPpENn57bo0FWk90GXPN2QeTpUs9gcObQ1rV2GDbb8LwPL+jWJLvlkGmbYv38xsp4Pf4d6IJlkW2nSicmn9FPmmgYgACFKQQoXPByo2g6NnsjpQAtujj5Qfyr8P5wgOaNim05Pf6JfF18i3Z8N7rlf9JhwRKnMb0r5a6Ld5ZLGT8ZdhKg+P/27ja0qjqA4/hvbq459wBzIxySZoZmrRUllDltVBJktlTEIgoipWKWRkaaYokpytRKevBNBpZSoU6sSI3NokxcEUGvSnxRWZK2Enzc0+n8zzn37tzbXbvnTzury/fz5v7vOefeo2++nHPP/5xFQkARv4OFUvXCpmW1Kn04Y0DPte5zt2g1vnbfbpDy6pdtXL/kzuG9AZ2jkllPPz7ezeWr/ofar5aK7lm+pvEKqfCQt2in1OikzwMdH9rls9L08DoCikgIKGJ39nJp7hl30LPeHC72+xtoT7WGtvjDC28fNy9uQIeo4ZQ76n7KLa13Wu/MlBp+M4Ou1dJlF81ovzTNSQ+ou9NJwbCrWno3vI6AIhICithtkWo6/OGj2QT0hH8iHuIGVDd1esOuK6XPzaBFqu8K1i+Q3jSvfxRIr6UH9ERB8EOA43wgjbgQXkdAEQkBRezqpPeDoYlZvwE9Lk1JXWsCGhyTmrPwzeZ1jnQosf6odK83aHQ3vHHNxNRbORukxf5olvRkyioCikgIKOLWUaSCc4k3U7M5ha+SXjwfXusGtCRxtPmWtMJsNEJlvRuUa4z3ejG4rjTmvh29R5p7pSrvCPhkofRtym4JKCIhoIibe3g4MfmmMZt5oOY2y7LZL7UlmmkCmvyKXf7x5I9KVRKs3lOfH1yZ3574hPnlc5cZbOz9NTRAQBEJAUXc2qS65Jvnswloz8pCr4Fl9wfTk/x5oL7d/mn4N2kBzU9++tTeccO8aVNNiSVLpRnmtUZ6I3W3BBSREFDELSWgK7O7E+nntfXFXhcf8i4dZQio+63jWkMOhj49rbb7wGSp4Pvg/Q95yv/VcY5IxadTd0tAEQkBRdxSTuEXZn0rZ2fbuhvcgi434wwBPSaN6GuP5ip8583SC8kF0jrHeUx6MG1LAopICCjiFvkiUq8mqcrcd5QhoB3Dpe/62KM3jek9aV5iwTZpgnPePa//NG1LAopICChiNyWLaUzdCq6jp+gpl8z0+QwBde6Snuhjh15Av5TmJhacc7/ni3fck/70LQkoIiGgiN0W6dr+JtI7pSr9+8LuSsk8KCRTQD9O3sDp8Xbwu3/d3guoe/T6THKte/b+yG3S2vQdEFBEQkARu7Oj+7+V05kkHQmGLQ2f+CHsWRWEM1NAnRlS2Xb/wSIXmm9tNq87aprNJ01AD5YHdyx5vpKK85T/S/peCSgiIaCIX8tQ8zCRDX0/TMTltrJq0abNm92T/QNS5cylTWsax0hDDpiVGQP653VujcfOX7V68R1l0m6zaIc0asHWfdePfdk9wQ9uTvLVmnTfHVrQMdsolqaa1/3/9n8ZuYmAYhDsKfcna1bs7/Ovcp6ekHycXWvv7M6Knd7KjAF1zs7PT25YedgsOTw6NDN0xpnQ179iljSHFpxPmUU68H8pFDmBgGIwHF9yVXHZNUt/+oc/a3x69eSKAv95oMdef6C2ouCS6umb2v11mQPqOEdX1I0sLBpZt+ij4DfWns+eu33UMGnY2Hkfpnx7e5F0aWdoAQGFBQKK3HcLfxceA4OAIvdNIaAYGAQUua+OgGJgEFDkvqkEFAODgCL3beWaEAYGAcXgO9ma5uRg/4uArBBQDL7dac/y9GfBA/95BBSDj4Dif4qAAoAlAgoAlggoAFgioABgiYACgCUCCgCWCCgAWCKgAGCJgAKAJQIKAJYIKABYIqAAYImAAoAlAgoAlggoAFgioABgiYACgCUCCgCWCCgAWCKgAGCJgAKAJQIKAJYIKABYIqAAYImAAoAlAgoAlggoAFgioABgiYACgCUCCgCWCCgAWCKgAGCJgAKAJQIKAJYIKABYIqAAYImAAoAlAgoAlggoAFgioABgiYACgCUCCgCW/gKUJO+T20otewAAAABJRU5ErkJggg==\" width=\"672\" /></p>\n</div>\n<div id=\"make-an-unclustered-heatmap\" class=\"section level3\">\n<h3>Make an unclustered heatmap</h3>\n<pre class=\"r\"><code>heatmap(sourmash_comp_matrix, Colv=F, scale='none')</code></pre>\n<p><img src=\"data:image/png;base64,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\" width=\"672\" /></p>\n</div>\n<div id=\"make-a-clustered-heatmap\" class=\"section level3\">\n<h3>Make a clustered heatmap</h3>\n<pre class=\"r\"><code>hc.rows &lt;- hclust(dist(sourmash_comp_matrix))\nhc.cols &lt;- hclust(dist(t(sourmash_comp_matrix)))\nheatmap(sourmash_comp_matrix[cutree(hc.rows,k=2)==1,], Colv=as.dendrogram(hc.cols), scale='none')</code></pre>\n<p><img src=\"data:image/png;base64,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HzuCx+OhwGB3d3ebBEQHbDJduABAKBSiKWVTpky5cOGCWOPunp6eY8eO6enpIV+6T/Ly8rKysqqrq4cNG+bk5LRx40YAMDExaWxsrKqqEpVEE+OWLFlia2vb09NTUFCA0uk//fTTEydOtLa2lpWV5ebm5ubmnjp1ikajpaenBwUFUSiUZ8+eUalUe3v727dv19bW7t69++XLl6tXrxYIBE+fPs3Pz8/Pz3/+/LmYYaK5AyS1DWQxku9UKm+yF1FcXIy+ge3t7cQXTygUos/r999/X7duHZ/Pv3jxYmJiYnNz88aNG0tKSogmCABgZWVVWlq6detWGo2WlJTE5XLpdLqfn1+foWxJzMzMysrK/Pz8NDU18/LykpOTnzx5MnPmTA6H069O0goKCpGRkf7+/vI1T0w5ZaCNBMRgXhs9Pb2ampp79+6hx43yRVlZ+dWrVx0dHYMHD3758mVnZyd6TizG/v37AwMDv/vuu7CwMNkKvby8IiMj9+3b5+npKXdr/zGQ+VkQ+NateG/8QyPw8kpAGIDI6xMheYsC/oER+HcMmeJB3bdtxNuhloSMrpz0yFfVgDqL5HH/UGJf5yc6g8FobW318vLat2/fmjVrRMt64+PjV65c6eDgkJCQIFvJsmXLzp07N2fOnIyMDKm/diSpqanR09MDgB9//PHbb7/95Zdf3N3diauXL19euHChv79/dHR0a2trfX090dkbGVxdXY0miu3du9fHx2fdunWHDh0itn/++ee//fbb0aNHV69ezeFwkD+PmDx58u3bty9fvjx//nypCiURCAQaGhpNTU0lJSVERzehUGhqalpaWnru3LmlS5dK7kIPMtra2sTGsJHUNpDFSL5TMvR3b58flrxoaGjQ1NQ0MTEpLi5+qwe9Hv01D0fgMZj+8erVq2HDhqmrqzOlERgYCH9X6WAwGAwGg8G8e7766it1dfVjx46JxavJsHfv3nPnzmloaJw4cYKk987n89HvHwBwcHBQVlaOi4sTFUD58y4uLn2qmj17NgDk5OSILubk5BgYGCxZskRBQUH00rNnzyoqKqhU6owZM8jYicjLy2tqajI0NBTtx06hUJydnQEgOTmZvCry2gay2MCntLR09erVenp6dDqdyWROmjTp888/FysJqa+v/+abbwwNDZWVlRkMhqmpqZ+fX1NTk5gqPp8fHBysr6+v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RiMglQSigIogIBREdBNdEEGTNKBYe3rc2irE07BLF6s91D+0Z1ciSMwqWBCWHLbaICCNIgm/LBgJApJfEAxHQEOW/L79Y86Jw0x+3JiH5z535v36C+Z+55nPxxsf5iaTGfHll1/W1NT067FycnKcTuef//zn5cuXNzc3d93e1ta2bdu2/fv39ze83HgeeAk9AAAA4LOys7NfeeWVM2fOuN/4l7/85dlnnxVChISEuH/Otoe/+7u/W7x4ce/r79y58/z58yNGjJg4cWK3AwsXLly+fPm7777r/lPuxx57zPsdyKOiolzv3d2t2NjYTz755L777jtw4MDcuXM//vjj//3f/+3XQ7/44os7d+50vRnehAkTampqvvrqq4iIiPfee8/9beGKi4tXr17tvs60adNcv6j8/PPPz58/33WjydXkjplx9uzZX//61y+88EJycnJMTExdXd25c+eEEE6nc8uWLV2/cV1fX/9P//RPL774YnJycmxs7IULF2pra9va2oKDg3//+9+73gjdZffu3Xv37r333ntdP6nu13+lbu/r0vvXwOuvv/73f//3f/3Xfz1q1Kjg4OBTp07t378/NDS061PZoqKitm7dOmfOnPz8/LfffnvChAnt7e2VlZWVlZU7d+70/uTCXkRGRhYXF8+ZM+ff/u3f1q1bN3bs2NjY2Nra2hMnTly8ePGdd97p6QusFxLjefJ+tQkAAAAA24mOjhZCXLhwweP29evXu575Z2Zmum5x/7lrL1555ZU+H9T12/UvvvhiTwPV1dUOhyM0NPTSpUtdIbsVHR3t0eXkyZMeq9XW1ro+DHzmzJmZmZn9emjDMJqbm3/729+mpKSEhoYOGTJk/vz5J06c8LhXQUFBTwlff/1190kzq0kfc+fxEnqXkydP/vrXv77zzjuHDh0aHBwcFRU1fvz43/zmNxcvXvT4L/mv//qvU6dOHT58eEhISERExOjRo5ctW1ZRUeHxKK7fQn/jjTd+xn+lbu9r5mtgy5YtWVlZo0ePvvHGG8PDw1NSUnJzcysrKz2y1dbWPvfcc8nJySEhITExMampqXl5eV3/C7g+iW3s2LEe99q4caMQ4h//8R/db7xw4UJeXt4dd9wRERFxww033HzzzXPnzi0oKOj64ulpNcMwXL+mMWLEiOsRz2Nxh/GzPvkQAAAAAACoxO/AAwAAAABgA1zAAwAAAABgA7yJHQAAAIBuNDc3V1VV9TIQGRnpdDpVxQHABTwAAACA7nz11Ve9f2z4rFmzBvj5cAD6hQt4AAAAAN1ITk7evHlzLwPx8fHKwgAQQvAu9AAAAAAA2ABvYgcAAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ8AAAAAgA1wAQ9AC3V1datXr87MzJw6der69etdNx45cmTLli2NjY1yZxQ/HNV8NTbVdItENV+tpmEkxdUA4CcGAFitoKAgNDS0a1/Kz8933b5jxw4hRGFhocQZxQ9HNV+NTTXdIlHNV6tpGElxNQBwxwU8AIvt2rXL4XDExMSsWbPm0KFD7s9g2traoqOjMzIyZM0ofjiq+WpsqukWiWq+Ws2msSVWMwDgWkECACz16quvBgUFlZSUpKenexwKCgoaP358RUWFrBnFD0c1X41NNd0iUc1Xq9k0tsRqAgCuxe/AA7BYWVnZpEmTvJ++uMTHx9fV1cmaUfxwVPPV2FTTLRLVfLWaTWNLrNbtIQD+jAt4ABa7evVqXFxcT0cbGhokzih+OKr5amyq6RaJar5aTcNIiqsBgAdeQg/AYk6n89ixY4ZhOBwOj0MtLS1Hjx5NTk6+cuWKlBnFD6dyxqbVbBqbalSz3YxNq9k0tsRqAgCuxU/gAVhszpw5J0+eXLt2rfehVatWNTQ0PPTQQ7JmFD8c1Xw1NtV0i0Q1X61m09gSq3kfAuDvZL8rHgD0T21tbWxsrMPhyM7Odn1wzrJlyzZv3jxv3jwhREJCwoULF2TNKH44qvlqbKrpFolqvlrNprElVrPs32YAuuICHoD1ysrKnE6n93cYnU7n4cOH5c4ofjiq+WpsqukWiWq+Wk3DSIqrAYA7h2EY3rsGACjW1NRUVFRUUlJSVVXV2dmZmJg4c+bMnJyciIgI6TOKH45qvhqbarpFopqvVtMwkuJqANCFC3gAAAAAAGyAN7EDAAAAAMAGAleuXGl1BgD+zjCM0tLSoqKiDz74YNu2bcVeJk+e/H//93+BgYFRUVEe962vr6+oqIiMjLx69WqfM2FhYZcuXZK1lLLYiqupnLFpbKpRTWUkKVuNhtVsekYUVwsLCxMA4M7S38AHAOP777+fMmVK7zvVihUrhBAHDhzwvnt5ebkQ4je/+Y2ZGcMwZC2lMrbiasSmGtX0iSRrq9Gwmg/HlljN+xAAP8fvwAOwWFZWVmFh4c0337xkyZJbbrklMjLSe+af//mfW1paTpw40e0Kt912W1RUVGtra58zBw8evOOOO6QsNWbMGGWxFVdTOWPT2FSjmrIZWVuNhtVsekYUVzt48GC3RwH4rSCrAwDwd9u3bx88eHBZWVlcXFxPM/Pnz586dWpPR0eOHPn555+3tbX1OSOEqK6ulrLU6dOnlcVWXE3ljE1jU41qymZkbTVCv2o2PSOKq/V0FIDf4gIegMXa29snTJjQy3NTIURLS0toaGhPR0NCQq5cuSKEMDMja6ng4GCVsVVWUzxj09hU0y2Sr1aTuNXoVs3kjE1jS6wGAO54CT0Ai917772XLl2qqKjoZSYlJaW1tfXbb78NCPD87IzOzs6bbropODg4ICCgz5lTp07JWio+Pl5ZbMXVVM7YNDbVqKZsRtZWo2E1m54RxdVOnTolAMANHyMHwGIrVqyorKz88MMPe5mZPXt2dXX1a6+95n3olVdeqampmT17tpkZiUupjK24GrGpRjV9IsnaajSs5sOxJVbzPgTA31n9LnoAYGzYsOHGG29cunTphx9+WFZWdsBLbW1tTEyMEOL+++/fuHHjgQMHysvLN27c6PrtwZiYmNraWjMzhmFIXEpZbMXViE01qmkVScpWo2E1H44tsZpF/ywD0BcX8ACst2nTpqSkJNEzwzA+++yzX/ziF96HEhIS9u3b51rHzIzEpVTGVlyN2FSjmj6RZG01Glbz4dgSqwGAO34HHoDF/vjHPy5evFgIMWLEiJ4+JOlPf/qTEOLHH3985513du3aVVtbK4RISkqaMWNGVlZWVFRU16SZGSlLqY+trJr6GQ0jUY1qmkSSu9VoVc2mZ8SSagDQhQt4ABa7/fbbjx8/XlhYuGjRIofDYXUcs2waG4C9sNUAANxxAQ/AYmFhYWlpaV988YXVQfrHprEB2AtbDQDAHZ8DD8Biv/jFL0JCQsxMVldXl5aW1tfXt7S0eB99+eWXTc5IWUp9bGXV1M9oGIlqVNMkktytRqtqNj0jllQDgJ9Y/Dv4APzeCy+8EBERUVdX18tMa2trTk5O7y8fNTMjcSmVsRVXIzbVqKZPJFlbjYbVfDi2xGr9+wcVgB/gJfQALHb16tW5c+devny5oKBg3Lhx3c7k5eWtXr06IiLi8ccfHz16dLdv7XPmzJk+Z3Jzc2Ut9cQTTyiLrbiayhmbxqYa1ZTNyNpqNKxm0zOiuFpubq73jQD8mtXfQQDg78aPH5+amurakYYMGZKWljbeS1JSUlhY2LFjx3pZx8yMyTEzMypjK65GbKpRTZ9IsrYaDav5cGyJ1QDAAxfwACxm5luNwcHBU6ZM6X0dMzMmx8zMqIytuBqxqdb7jIaRfLiarK1GcWwfPiOKqwGAB97EDoDF6uvr+5y5++67W1tbe59xOp19zpgcMzOjMrbiaipnNIxENappFUnWViMxkp+fEcXVAMBDgNUBAPi7eBMWL1785ZdfVlVV9bKOmRmTY2ZmVMZWXI3YVKOaPpFkbTWKY/vwGVFcDQA8Wf0SAADoW0tLy+zZs8eOHVteXj6QGblLKYutuBqxqUY1rSL1yabVfDi2xGoA4IF3oQeghY6Ojo8//ri0tPTcuXOGYQwfPnzy5Ml/8zd/ExgYKIRIT0/v7Ow8cuSIECIuLi4xMTEgoJsXEPU5c/DgQYlLKYutuJrKGZvGphrVVEYSMrYaDauZrG/H2BKrub4AAKALF/AArHf48OHHH3/8m2++8bg9JSVl48aN48aN6/1jcs0zDEPiUspim8yj8uFksWlsM6hmRxpWk7XVaFjNDJvGNsNkNZ6oA/DABTwAi1VVVY0bN+7SpUs333zzggULbrrpJiHEmTNnNm7ceObMmZiYmCNHjoSGhkp5rPj4+PPnz0tZqrm5WVlsMyRWU8mmsc2gmh1pWE3WVqNhNTNsGtsMk9Xi4+MVhAFgJ6pfsw8A1/rbv/1bIcSKFSva2trcb29ra3vxxReFELm5uVZl64VNYwOwF7YaAIA7fgIPwGKJiYlRUVEVFRXeLyY0DOP222+/cuVKTU2NJdl6YdPYAOyFrQYA4I6PkQNgse+++y41NbXbXwV0OBypqanfffed6691dXWrV6/OzMycOnXq+vXrXTceOXJky5YtjY2N5mekLKU+trJqxKYa1fSJJHer0aqaz8eWWA0AfmLtCwAAIC4u7u677+7p6KRJk4YOHWoYRkFBgfvveebn57sGduzYIYQoLCw0OSNrKcWxVVYjNtWopk8kiVuNbtV8O7bEagDgjgt4ABbLyMgQQmzevNn70H/9138JITIyMnbt2uVwOGJiYtasWXPo0CH3ZzltbW3R0dEmZwzDkLWUytiKqxGbalTTJ5KsrUbDaj4cW2I17/MOwM8FCQCw1EsvvVRcXPyrX/3qkUceeeKJJ2666SbDMKqqqt57770//elPQUFBy5cvz8vLCwoKKikpSU9P97h7UFDQ+PHjKyoqXn311T5nhBBmxszMFBUVKYutuJrKGZvGpppukXy4mqytRsNqNj0jiqsJALgWF/AALHbnnXe+//77OTk527Zt27Ztm/uhyMjI9evXp6enl5WVTZo0yfspjkt8fHxZWdn58+f7nBFCyFpKZWzF1VTO2DQ21aimbEbWVqNhNZueEcXVuj0EwJ9xAQ/Aeo899tjkyZPfeeed0tLSc+fOCSGGDRs2efLk7Oxs10fgXr16NS4urqe7NzQ0mJyRu5Sy2IqrEZtqvc9oGMmHqwlJW42G1Xw4tsRqAOCBC3gAWoiPj1++fPny5cu7Pep0Oo8dO2YYhvdbMbe0tBw9ejQ5OfnKlSt9zshdSllsxdVUztg0NtWopjKSkLHVaFjNpmdEcTUBANfiY+QA2MCcOXNOnjy5du1a70OrVq1qaGh46KGHzMzIXUpZbMXViE01qmkVqU82rebDsSVW8z4EwN/Jflc8APg5qqqqioqKXnvttVXdqa2tjY2NdTgc2dnZrg/XWbZs2ebNm+fNmyeESEhIuHDhgpkZwzAkLqUstuJqxKYa1bSKJGWr0bCaD8eWWE35v8YAdMcFPACLtba25uTkeL+A0ONbjWVlZU6n0/uQ0+k8fPiwaykzM7KWUhxbZTViU41q+kSSuNXoVs23Y0usBgDuHIZheO8aAKBMXl7e6tWrIyIiHn/88dGjR0dFRXnP5ObmCiGampqKiopKSkqqqqo6OzsTExNnzpyZk5MTERHRNWlmRspS6mMrq6Z+RsNIVKOaJpHkbjVaVbPpGbGkGgB04QIegMVGjBjR0NBw4MCBMWPGWJ2lH2waG4C9sNUAANzxJnYALFZfXz9hwgTbPTe1aWwA9sJWAwBwx8fIAbCY0+lsbW3tfWbDhg1SHisrK0vWUipjmyGxmko2jW0G1exIw2qythoNq5lh09hmmKyWlZV13aMAsBVeQg/AYvn5+f/+7//+9ddf/9Vf/VVPM72/gZN5Rncft/vz/Mu//Iuy2GZIrKaSTWObQTU70rCarK1Gw2pm2DS2GSar8UQdgAd+Ag/AYnl5eQcOHHjkkUcKCgruvPPOnmY8buns7Kyurv7000/PnTuXnZ09bNgw73t1OyNrKcWxVVZTPGPT2FTTLZKvVpO41ehWzeSMTWNfv2oA/J0l730PAF3Gjx+flpbm2pHi4uLS0tLGe+npvk1NTQsXLhw2bNjZs2cHMvMzltIh9nWqpsOMhpGoRjVLIl3vrcbCan4YW2I1AH6LC3gAFhvgtxqbmpoGDx68aNGiAc70dylNYl+PaprMaBiJalRTH0nBVmNVNf+MLbEaAP/ES+gBWKy+vn4gdw8PD09NTf34448HONPfpTSJfT2qaTKjYSSqUU19JAVbTX8jaTKjYSTF1QD4Jy7gAVgsPj5+gCtcunSpsbFx4DP9Wkqf2NKr6TOjYSSqUU1xJDVbTb8i6TOjYSTF1QD4I6tfAgAAA7Ju3TohRGpq6gBn5C7VJ1mPpbgasalGNa0i9cmm1Xw4tsRqAPwTHyMHQAt1dXXvvvvuoUOHvv/++yeffDInJ0cIceTIkdOnT8+aNWvJkiXed2lsbDxx4sTp06eFEJs2bdq2bVufM/Pnz1+wYIGspZTFVlxN5YxNY1ONaiojCRlbjYbVbHpGFFdzfQEAwE+s/g4CABgFBQWhoaFd+1J+fr7r9h07dgghCgsLe9nEUlJS3n//faPX70V2zZgcM7mUstgm86h8OD+PbWZGw0iyZjSMJGtGz0hSthoNq/lwbDMz5scAwB2/Aw/AYrt37166dOmNN964evXqqVOnjh8/vuvQrFmzoqOjt2/f/sUXX3jfMSQkJCEhISEhwfVXMzMmx8zMqIytuBqxqUY1fSLJ2mo0rObDsSVWAwAPvIQegMVmzZq1Z8+effv2paenCyEcDkd+fv7KlStdR6dPn3727NnKykorI3bHprEB2AtbDQDAXYDVAQD4u7KyskmTJrmem3qLj4+vq6tTHMkMm8YGYC9sNQAAd7yEHoDFrl69GhcX19PRhoYGIcTbb7/d5zqlpaVdf548eXKfY2Zmehlramq6cuWKK1hubu51ja24msoZYc/YVKOaskiythqhXzWbnhHF1dx5fwEA8EO8hB6AxZKTkwMDA0+cOOFwOMS1LxBtaWlJSkqKj48/evSoxSl7ZRiGHWMDsBe2Gj/Hk3YAgp/AA7DcnDlz3nzzzbVr1z799NMeh1atWtXQ0LBkyZJf/vKXJ0+efP/99yMjIx944IERI0YIIaqrq0tKSpqamhYuXHjrrbd++umnFy9ePHbsWEhIyIMPPtjtjBCia2yAS3300Ufl5eVz5851f0+p6xRbcTWVMzaNTTWqKYska6vRsJpNz4jiaib+FQXgZyx9D3wAMGpra2NjYx0OR3Z2tutTkZYtW7Z58+Z58+YJIRISEi5cuFBRUREVFZWdnX3x4kX3+7o+EnnQoEHHjx83M2MYhqylVMZWXI3YVKOaPpFkbTUaVvPh2BKrGQBwLV5CD8B65eXlmZmZ3m/F5HQ6i4uL09LSHn744a+//rqysjIwMNBjpr29feTIkXfccUdHR0efM1u3bpW4lLLYiqupnLFpbKpRTWUkKVuNhtVsekYUV9u6dasAADe8hB6A9e66667KysqioqKSkpKqqqrOzs7ExMSZM2fm5OREREQIIUpLSx988EHvpzhCiKCgoIkTJ3700UeGYfQ5I3cpZbEVV1M5Y9PYVKOaykhSthoNq9n0jCiu5n0IgJ/jAh6AFiIiIp555plnnnmm26PNzc3nz5/v6b719fXNzc2GYfQ5I3cpZbEVV1M5Y9PYVKOaykhCxlZjcowzolu1no4C8F8DePk9AChy9913BwQE7N692/vQJ598EhAQcM8995iZkbuUstiKqxGbalTTKlKfbFrNh2NLrOZ9CICf43fgAVis908wDgkJGTx48MWLF5988smQkJDFixfPnz9/xIgRhmFUV1dv2rTpj3/8Y3t7+5///GfDMB588MHeZ2bPnv3f//3ffY6ZWers2bPKYiuupnLGprGpRjVlM7K2Gg2r2fSMKK42e/bsn/mPKwBfZQCApUxuVqNGjQoLC/O+PTw8fP369a6l1q9fHx4e3vuMybE+ZxTHVllN8YyGkahGNX0ieR/qlpmtRrdqNj0j6qsBgDt+Ag/AYitXrjx16tR77703aNCgBx54IDExUQhRU1Ozc+fOxsbGJ554Ijw8/Isvvvjqq69iY2OXLFly9OjRs2fPOhyOYcOGTZ48+amnnho2bFjXaufOnSssLCwtLe1lxuRY7zPqYyurpn5Gw0hUo5omkeRuNVpVs+kZsaQaAPzE6u8gAPB3FRUVgwYNevrpp3/44Qf32y9fvpybmxsdHX38+PGOjo4VK1YIIZ599lmrcnqwaWwA9sJWAwBwx0/gAVjs4YcfrqysPH78eEBAgMehjo6OUaNGjRkzZuvWre3t7SkpKQEBAadOnbIkpwebxgZgL2w1AAB3nv8YAIBipaWld911l/dzUyFEYGDghAkT9u7dK4QICgoaOXJkdXV1Zmbm1KlT169f75o5cuTIli1bGhsbXX+tq6tbvXp17zMmx3qfUR9bWTX1MxpGohrVNIkkd6vRqppNz4gl1QDgJ1a/BACAv7vhhhseeOCBno7OmDEjPDzcMIyCgoLAwMCuvSs/P981sGPHDiFEYWGhayY0NLT3GZNjfc4ojq2ymuIZDSNRjWr6RJK41ehWzaZnRH01AHDHBTwAi02cODEwMPCzzz7zPrR3797AwMBJkybt2rXL4XAEBQUNHjz40KFD7s9y2traoqOjMzIyXDMxMTFr1qzpacYwDDNjZmZUxlZcTeWMTWNTTbdIPlxN1lajYTWbnhHF1bzPOwA/FyQAwFLLly9/+OGHZ8yY8dRTTz366KNJSUlCiJqams2bNxcWFnZ0dLz00kuvvvpqUFBQQEDArFmzxo0b5373oKCg8ePHV1RUuGZKSkrS09M9HqJrRghhZszMzGuvvaYstuJqKmdsGptqukXy4WqythoNq9n0jCiuJgDgWlzAA7DYvHnzfv/73z///PNvvfXWW2+95X4oLCzsD3/4w7x585588sm0tLRf/vKX06ZN814hPj6+rKzs/PnzkyZN8n4a5D4jhCgrK+tzzMxSKmMrrqZyxqaxqUY1ZTOythoNq9n0jCiu1u0hAP6MC3gA1nvmmWcefPDBwsLCzz///Ny5cw6HIyEh4Z577nnqqadcH3p89epVp9P50ksvdXv3hoYG10xcXFxPD+GaMTlmcillsRVXUzmjYSSqUU23SFK2Gg2r2fSMKK4GAB64gAeghcTExJdffrmno06n89ixY4ZhOBwOj0MtLS1Hjx5NTk6+cuVKnzNyl1IWW3E1lTM2jU01qqmMJGRsNRpWs+kZUVxNAMC1+Bg5ADYwZ86ckydPrl271vvQqlWrGhoaHnroITMzcpdSFltxNWJTjWpaReqTTav5cGyJ1bwPAfB31+GN8QBAstra2tjYWIfDkZ2d7fpwnWXLlm3evHnevHlCiISEhAsXLpiZkbuUstiKqxGbagHYleAAABAoSURBVFTTKpKUrUbDaj4cW2K1n/VvJgBfxgU8AH3t3r27oKCgoKDAMIyysjKn0+n9XUin03n48GHXvJkZuUspi624GrGpRjWtInWrv1uNhtV8OLbEagDgzmEYhveuAQA6WLBgwQcffCCEcO1UTU1NRUVFJSUlVVVVnZ2diYmJM2fOzMnJiYiI6LqLmRm5SymLrbgasalGNa0iefsZW42G1Xw4tsRqANCFC3gA+lq5cuUnn3wihPjss8+sztIPNo0NwF7YagDAD3EBDwAAAACADfAu9ABsoK6u7pNPPqmvr++65cSJExkZGSkpKTNnziwrKzM5I3cpZbEVVyM21aimVaQ+2bSaD8eWWA0APFn5C/gAYM4zzzwjhDh58qTrr5cvXx46dGjXPhYREfHtt9+amZG7lLLYiqsRm2pU0ypSn2xazYdjS6xm5gsAgF/hAh6AFmpra3/3u99lZGRMmTJl3bp1rhsPHz68efPmH3/8cfTo0XfccUfX8Ouvvy6EeOqpp86ePVtQUCCEePbZZ83MGIYhcSllsRVXIzbVqKZVJEPGVqNhNR+OLbGaAQDX4gIegPUKCgpCQ0O7fuyQn5/vut31ubiFhYUxMTGPPPJI1/z06dMDAwMbGhpcf01PTx81apSZGcMwJC6lLLbiasSmGtW0iiRlq9Gwmg/HlljNAIBr8TvwACy2e/fupUuXhoeHr1mz5tChQ+6HZs2aFR0dvX379qampsjISNeN7e3t+/fvT0tLGzJkiOuW2267raamxsyMEELWUipjK65GbKpRTZ9IsrYaDav5cGyJ1QQAXCvI6gAA/N2rr74aFBRUUlKSnp7ucSgoKGj8+PEVFRXDhg07ffq068Z9+/Y1NTVNmTKla6y9vT04OHjIkCF9zgghZC2lMrbiaipnbBqbalRTNiNrq9Gwmk3PiOJqAgA8WP0SAAD+Ljo6+r777uv6q3B7gahhGAsXLoyIiFiwYIHD4di0aVN9ff306dOFEHv27OmaGTt27OjRo83MGIYhaymVsRVXIzbVqKZPJFlbjYbVfDi2xGoGAFyLC3gAFgsJCcnIyOj6q8fT0xkzZkRERHz55ZchISFd33m89957Ozs7XQN1dXUOhyM7O9vMjGEYspZSGVtxNWJTjWr6RJK11WhYzYdjS6xmAMC1uIAHYLGbb7751ltv7XrW4v70tLm5eejQoa436f38889/9atf3X///S+88MLFixe77v7mm28mJyd/+OGHJmdkLaU4tspqxKYa1fSJJHGr0a2ab8eWWA0A3HEBD8Bizz33nBDiD3/4g+uv7k9P8/LyhBB5eXmWheuZTWMDsBe2GgCAO4dhGAIArFNXVzd27NhLly5lZWVlZmbOnTt32bJl06ZNKyoqKi4uTkhIOHr0aFxcnNUxPdk0NgB7YasBALjjAh6A9crLyzMzM+vq6jxudzqdxcXFaWlplqTqk01jA7AXthoAQBcu4AFooampqaioqKSkpKqqqrOzMzExcebMmTk5OREREb3fcc+ePa6P4cnNzR3IzM9byvLY16+a5TMaRqIa1ayKdF23Gmur+VtsidUA+CmLX8IPAAMzf/78PnczMzNyl+qTrMdSXI3YVKOaVpH6ZNNqPhxbYjUA/ilIAICl5s6du3jx4q4nKx7eeOON//mf/9mxY0dPdx85cuQ999zT+0OYmenvUprEvh7VNJnRMBLVqKY+koKtpr+RNJnRMJLiagD8Ey+hB2Axh8OxatWql19+udujubm569at03CnsmlsAPbCVgMAcBdgdQAA6E1zc3NQkP1eK2TT2ADsha0GAPwNF/AA9NXU1LR///74+Hirg/SPTWMDsBe2GgDwQ7yEHoA1xowZ4/pDRUXF0KFDhwwZ4jHQ3t5eU1Nz9erVpUuXvvXWW0KI6urq0tLS+vr6lpYW7wVdLzE1MzOQpd544w3XHxoaGhTHvt7VLJzRMBLVqGZtpOu01ehQ7WfMaBhJcTUA+Imlb6EHwH+Z2aBiYmKys7MvX77c2tqak5PjcDh6GTYzYxiGrKVUxlZcjdhUo5o+kXrRr61Gw2o+HFtiNcv+kQagK34CD8Aaly9fdv0hJiYmLy/vhRde8BgICQkJDw93/TkvL2/16tURERGPP/746NGjo6KivBc8c+ZMnzO5ubkDXOovf/mL6w//8A//oCy2mmqWzNg0NtWodr1npG81+lTr14xNY0usxufAA/Bk9XcQAPi7119/vaysrPeZpKSksLCwY8eODXBG4lIqYyuuRmyqUU2fSLK2GomR/PyMKK4GAB64gAdgA8HBwVOmTBn4jNyllD2W4mrEplrvMxpG8uFqZti0mg/HllgNADzw0SMAtFBXV/fuu+8eOnTo+++/f/LJJ3NycoQQR44cOX369KxZs5xOZ2tra+8rmJkxOWZyKWWxFVcjNtV6n9Ewkg9Xcxn4VqM4tg+fEcXVAMADHyMHwHpvv/32LbfckpeXt3Xr1r1799bU1LhuP3fu3GOPPbZt27bFixd/+eWXVVVVvSxiZsbkmMmllMVWXI3YVKOaVpGkbDWKY/vwGVFcDQA8Wf0SAAD+bteuXQ6HIyYmZs2aNYcOHRJC5Ofnuw61tbVFR0dnZGS0tLTMnj177Nix5eXlPa1jZsbkmJkZlbEVVyM21aimTyRZW42G1Xw4tsRqAOCBd6EHYLFZs2bt2bNn37596enpQgiHw5Gfn79y5UrX0enTp589ezYyMrKzs/PIkSNCiLi4uMTExICAbl5A1OfMwYMH09PTpSw1ePBgZbEVV1M5Y9PYVKOashlZW42G1czM2DS2xGoHDx70XhyAX7P6OwgA/F10dPR9993X9Vfh9vMlwzAWLlwYEREhcceTtZTK2GZIrKaSTWObQTU70rCarK1Gw2pm2DS2GSaryfznFoBP4E3sAFjs6tWrcXFxPR1taGgQQtTX18t6OFlLjRgxQmVsMxQ/nCw2jW0G1exIt2oStxrdqplk09hm+HA1ANcPF/AALOZ0Ol2fgutwODwOtbS0HD16NDk5OT4+XtbDyVpKcWwzFD+cLDaNbQbV7Ei3ahK3Gt2qmWTT2Gb4cDUA1w/vQg/AYnPmzDl58uTatWu9D61ataqhoeGhhx5Sn6pPNo0NwF7YagAA7ngTOwAWq6urGzt27KVLl7KysjIzM+fOnbts2bJp06YVFRUVFxcnJCQcPXp0x44dUh4rKytrw4YNUpaaMWOGsthmSKymkk1jm0E1O9KwmqytRsNqZtg0thkmq2VlZV33KABshQt4ANYrLy/PzMysq6vzuN3pdBYXF6elpXm/dvTn6fZlqD97KWWxTeZR+XCy2DS2GVSzIw2rydpqNKxmhk1jm2GyGk/UAXjgd+ABWO+uu+6qrKwsKioqKSmpqqrq7OxMTEycOXNmTk6O6w2W8/LyPO7S2dlZXV396aefnjt3Ljs7e9iwYd7LdjsjcSmVsRVXIzbVqKZPJFlbjYbVfDj29asGwN8pf997AJCmqalp4cKFw4YNO3v27EBm5C6lLLbiasSmGtW0itQnm1bz4dgSqwHwW1zAA7C3pqamwYMHL1q0aIAzcpfqk6zHUlyN2FSjmlaR+mTTaj4cW2I1AP6JC3gAtjd9+vS4uLiBz8hdStljKa5GbKr1PqNhJB+uZoZNq/lwbInVAPghfgcegAVuueWWfs2fOnWql6OXLl1qbGzsfQUzM32OuWLX1dW1traaqaAmtpRqes5oGIlqVFPwcOq3GpNjus1oGElxNQD+yOrvIADwRxJ3qnXr1gkhUlNTBzhjZkzD2LKqaTijYSSqUU3NwynealRWkzijYSTF1QD4Jz5GDoAFmpub+zXf7QfhNjY2njhx4vTp00KITZs2bdu2rc+Z+fPnL1iw4GcvVVlZ+e233wohioqKHn30UWWxFVSzasamsalGtes6cz22Gk2q2fSMWFht/vz53jMA/JrV30EAgL71somlpKS8//77JmfkLqUstuJqxJYyo2EkWTMaRpI1o2ckKVuNhtV8OLaZGYlfAAD8Cj+BB6CR1tbWCxcuCCGGDBkSEhLSdfv+/fu9h0NCQhISEhISEszPyF1KWWzF1YhNNappFanLQLYaDav5cGyJ1QDAAxfwALSwadOmN998s7y8vK2tTQgRHBx81113Pffcc92+wlAfNo0NwF7YagAALlzAA7BYe3v7okWLPvjgAyFEcHDw8OHDhRBnz551PU9dsGBBUVFRUJB2H5lh09gA7IWtBgDgjh0fgMX+4z/+44MPPrj11lt/97vfZWRkBAYGCiE6Ojq2bNny8ssvb9q0ady4cTExMb2sEBISMnjw4OPHj9944429z6Smpn700UdSltq3b5+y2IqrqZyxaWyqUU1ZJFlbjYbVbHpGFFdLTU11fdcGAFz4CTwAi6WkpDQ0NFRWVsbHx3scqq+vHzlyZHx8/DfffGNJtt4FBQXt2bPn3nvv9bhd89gA7IWtxs9NmzbtP//zP0eOHGl1EABa4AIegMVCQ0PnzZu3efPmbo8++uijO3bseOmll06dOvXee+8NGjTogQceSExMFELU1NTs3LmzsbHxiSeeCA8P3759e0NDgxAiMjJy1qxZ3c588cUXX331VWhoaEtLywCXevvttw3DiIuLO3z4sGvg+sVWXE3ljE1jU41qyiLJ2mo0rGbTM6K4mmuspy8AAP7IwnfABwDDMJxO52OPPdbT0czMzKSkpIqKikGDBj399NM//PCD+9HLly/n5uZGR0cfP3782LFjoaGhQojc3NyeZjo6OpYuXSqEuP322we4lNPpHDVqlBDi2Wefvd6xFVdTOWPT2FSjmrJIsrYaDavZ9IwortbR0bFixYqevgAA+CF+Ag/AYs8///yGDRu++eabIUOGeBz67rvvbrvttiVLlnzzzTeVlZXHjx8PCAjwmOno6Bg1atSYMWM6OjqOHz/e3t4eEBBw6tSpbme2bt06b968jz/+OCkpyWOmv0uNGDFiw4YNgwYNCg4O9piRHltxNZUzNo1NNaopiyRrq9Gwmk3PiOJqW7dubW9vT0lJ8V4KgJ+y+jsIAPzdlStX7r777tGjR2/fvr2zs9N1Y0dHx7Zt20aOHHnPPfdcuXIlJiZm0aJFPa2waNGi2NhY10xGRkZYWFhPM4ZhxMTEJCUldTvTr6VcsQcNGhQSEnK9YyuupnLGprGpRjVlkWRtNRpWs+kZUVzN9eeelgLgh3gXegAWmzJlSnt7+9dff/3www+HhYW5fsevtra2ublZCDF27NgpU6b88MMPxcXF6enpQoiDBw96rHD+/Pnm5mbDML777rvhw4cHBwd7P4prRgjR3Nx8ww03dDvTr6VcsX/88UchRHh4+HWNrbiayhmbxqYa1ZRFkrXVaFjNpmdEcTXXn10vweh2DIDfuc7fIACAPgxw19q7d29gYOCkSZMmTpwYGBg4bty45OTknmYMw5g4caLD4Rg+fLh3kn4tpTK24moqZ2wam2pUUxZJ1lajYTWbnhHF1Vx/vf/++72XAuCf/h9tAZlYSyd8+gAAAABJRU5ErkJggg==\" width=\"672\" /></p>\n</div>\n\n\n\n\n</div>\n\n<script>\n\n// add bootstrap table styles to pandoc tables\nfunction bootstrapStylePandocTables() {\n  $('tr.header').parent('thead').parent('table').addClass('table table-condensed');\n}\n$(document).ready(function () {\n  bootstrapStylePandocTables();\n});\n\n\n</script>\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/_static/ecoli.cmp.csv",
    "content": "\"NZ_JHDG01000001.1 Escherichia coli 1-176-05_S3_C1 e117605S3C1.contig.0_1, whole genome shotgun sequence\",\"NZ_JSMW01000001.1 Escherichia coli strain upec-154 upec-154_ctg_43, whole genome shotgun sequence\",\"NZ_JHGS01000001.1 Escherichia coli O111:NM str. 2009C-4052 contig1, whole genome shotgun sequence\",\"NZ_JHRU01000001.1 Escherichia coli strain 100854 100854_1, whole genome shotgun sequence\",\"NZ_JMGU01000001.1 Escherichia coli 2-011-08_S3_C2 e201108S3C2.contig.0_1, whole genome shotgun sequence\",\"NZ_MOJK01000001.1 Escherichia coli strain 469 Cleandata-BN4_469_1_(paired)_contig_1, whole genome shotgun sequence\",\"NZ_JSLN01000058.1 Escherichia coli strain upec-2 upec-2_ctg_1006, whole genome shotgun sequence\",\"NZ_BBUW01000001.1 Escherichia coli O119:H6 strain EC404/03, whole genome shotgun sequence\",\"NZ_KB732227.1 Escherichia coli KTE5 acEom-supercont1.1, whole genome shotgun sequence\",\"NZ_JHHE01000001.1 Escherichia coli O103:H2 str. 2009C-3279 contig1, whole genome shotgun sequence\",\"NZ_JHMG01000001.1 Escherichia coli O121:H19 str. 2010EL1058 contig1, whole genome shotgun sequence\",\"NZ_MOGK01000001.1 Escherichia coli strain 676 BN4_676_1_(paired)_contig_1, whole genome shotgun sequence\",\"NZ_CP011331.1 Escherichia coli O104:H4 str. C227-11, complete genome\",\"NZ_MKJG01000001.1 Escherichia coli strain SF-596 Contig_10_consensus_sequence, whole genome shotgun sequence\",\"NC_017651.1 Escherichia coli str. 'clone D i2', complete genome\",\"NZ_MOZC01000010.1 Escherichia coli strain 3.3-R2 NODE_10_length_194691_cov_23.1887, whole genome shotgun sequence\",\"NZ_MOFN01000001.1 Escherichia coli strain 461 BN4_461_1_(paired)_contig_1, whole genome shotgun sequence\",\"NZ_JHJO01000001.1 Escherichia coli O157:H7 str. F6751 contig1, whole genome shotgun sequence\",\"NC_027387.1 Escherichia phage CICC 80001, complete genome\",\"NZ_MIWP01000001.1 Escherichia coli strain K6412 contig_0001, whole genome shotgun sequence\",\"NZ_JHRJ01000001.1 Escherichia coli strain 303289 303289_1, whole genome shotgun sequence\",\"NZ_MIWF01000001.1 Escherichia coli strain AF7759-1 contig_0001, whole genome shotgun sequence\",\"NZ_AVRP01000001.1 Escherichia coli T924_01 gecT92401.contig.0, whole genome shotgun sequence\",\"NZ_JHRE01000001.1 Escherichia coli strain 302014 302014_1, whole genome shotgun sequence\",\"NZ_KB732756.1 Escherichia coli KTE66 acEnR-supercont1.1, whole genome shotgun sequence\",\"NZ_GG774190.1 Escherichia coli MS 196-1 Scfld2538, whole genome shotgun sequence\",\"NZ_AEKA01000453.1 Escherichia sp. TW10509 contig_453, whole genome shotgun sequence\",\"NZ_JNLZ01000001.1 Escherichia coli 3-105-05_S1_C1 e310505S1C1.contig.0_1, whole genome shotgun sequence\",\"NZ_GG749254.1 Escherichia coli FVEC1412 supercont1.49, whole genome shotgun sequence\",\"NZ_JHGJ01000001.1 Escherichia coli O45:H2 str. 2009C-4780 contig1, whole genome shotgun sequence\",\"NZ_KE701326.1 Escherichia coli KOEGE 58 (171a) acYAA-supercont1.1, whole genome shotgun sequence\",\"NZ_KE699066.1 Escherichia coli HVH 26 (4-5703913) acXtt-supercont1.1, whole genome shotgun sequence\",\"NZ_JH704579.1 Escherichia coli PA33 PA33.contig.0, whole genome shotgun sequence\",\"NZ_MBNU01000001.1 Escherichia coli strain 1409150006 contig1, whole genome shotgun sequence\",\"NZ_JHNB01000001.1 Escherichia coli O103:H25 str. 2010C-4529 contig1, whole genome shotgun sequence\",\"NZ_MKJO01000001.1 Escherichia coli strain USVAST184 Contig_10_consensus_sequence, whole genome shotgun sequence\",\"NZ_APWY01000001.1 Escherichia coli 178200 gec178200.contig.0, whole genome shotgun sequence\",\"NZ_CCQJ01000001.1 Escherichia coli strain E. coli, whole genome shotgun sequence\",\"NZ_LVOV01000001.1 Escherichia coli strain swine72 swine72_contig_1, whole genome shotgun sequence\",\"NZ_KE701477.1 Escherichia coli UMEA 3053-1 acYxz-supercont1.1, whole genome shotgun sequence\",\"NZ_JSRD01000001.1 Escherichia coli strain blood-09-0856 blood-09-0856_ctg_605, whole genome shotgun sequence\",\"NZ_LQWB01000001.1 Escherichia coli strain GN03624 GCID_ECOLID_00149_NODE_1.ctg_1, whole genome shotgun sequence\",\"NZ_KE700241.1 Escherichia coli HVH 147 (4-5893887) acYxy-supercont1.1, whole genome shotgun sequence\",\"NZ_JSGR01000003.1 Escherichia coli strain upec-73 upec-73_ctg_2796, whole genome shotgun sequence\",\"NZ_KB733029.1 Escherichia coli KTE46 acASD-supercont1.1, whole genome shotgun sequence\",\"NZ_JMGW01000001.1 Escherichia coli 1-176-05_S4_C2 e117605S4C2.contig.0_1, whole genome shotgun sequence\",\"NZ_LEAD01000071.1 Escherichia coli strain 1935, whole genome shotgun sequence\",\"NZ_AIGC01000068.1 Escherichia coli DEC7C gecDEC7C.contig.67_1, whole genome shotgun sequence\",\"NZ_MOZX01000101.1 Escherichia coli strain 6.2-R1 NODE_100_length_1258_cov_32.0593, whole genome shotgun sequence\",\"NZ_JH659569.1 Escherichia coli M919 supercont2.1, whole genome shotgun sequence\"\r\n0.9999999471821057,0.28897811310691957,0.38817722712894365,0.4757808766883508,0.4880299908750865,0.46201423317620816,0.2898486180778608,0.235105836841783,0.2707382033252863,0.4016795125934354,0.39005222558204056,0.4612223450755799,0.43635095213371566,0.27253766138045876,0.26486875481824657,0.25348383186951673,0.2649954245973648,0.3384418724488407,0.0,0.40565849657034736,0.2621719711636269,0.44486414040347677,0.35579608659711115,0.3999977822718572,0.29873573726319025,0.47444767241869845,0.22301848630672783,0.5147593476586576,0.30062384007374965,0.39173534800444454,0.2547972118149203,0.24817676594465055,0.34434072403483373,0.2510115332983013,0.3762451961365837,0.263545553902819,0.398034399223939,0.3956541904843327,0.40352821928227545,0.2602472849701728,0.25190256268046574,0.38715047896524724,0.42128870956978015,0.2627491839252317,0.2669119059298235,0.5058321332714905,0.3374819330465959,0.38854576688484144,0.2881198223424366,0.4711915855378318\n0.28897811310691957,0.9999998558196002,0.2909943810847362,0.2994193766848995,0.28543915691008603,0.2978520856361603,0.3154450574208947,0.22293091046246272,0.26721513861469093,0.2923078137999847,0.29766192966737903,0.29774556448485945,0.29087908407332896,0.25892564349122926,0.2666861206737712,0.2587651998768996,0.3095098199902525,0.287020466729495,0.0,0.3037620169427505,0.2614389955612667,0.29797118302473613,0.29944107807651765,0.2907185416329692,0.41512581312633956,0.3002017976248007,0.2525588367233852,0.29618686208116396,0.3782223989097524,0.29236576119984614,0.255362131976278,0.2585512966136698,0.2892014516599165,0.2549185523067041,0.2900272102531586,0.26287174566551263,0.30993619970199804,0.29728770486886846,0.31032336885767864,0.2563338195937147,0.25283955677914915,0.2902405241343867,0.3213968743819182,0.26145457767152414,0.2723898413426654,0.30389602146567907,0.28174248936938817,0.2819537078373747,0.32700171571637293,0.301427011588676\n0.38817722712894365,0.2909943810847362,0.9999998485147576,0.40553795295415473,0.37304826046403894,0.4086453161457221,0.2819662961048318,0.22720112039951978,0.25481469466020557,0.5326840233988901,0.5069138592853972,0.4086795638627633,0.4719709211895996,0.257707988915611,0.25228863092704057,0.2478998089107718,0.2747569001771131,0.3824747990688999,0.0,0.5045019193871383,0.26546106930145774,0.40455100738327743,0.36978231043325827,0.5096652681776028,0.2878170002935184,0.40577536888558985,0.22126016068798582,0.39716622795756884,0.2981511214088277,0.52339600655624,0.24474807359398076,0.2469898993647024,0.38289258533998616,0.24082517548970117,0.4921100394770249,0.2589319229111542,0.4819525819015692,0.5081152588400042,0.5075240842110538,0.23756983073475124,0.2366610133465742,0.4771830458766476,0.5098540312502364,0.2595952297993569,0.24974179847959443,0.40068205725811434,0.3676927488734396,0.3973165461672866,0.2943715222621487,0.40708824648695185\n0.4757808766883508,0.2994193766848995,0.40553795295415473,1.0,0.5411284088217856,0.46748047230806933,0.29180690558697653,0.22683315325656517,0.26421183252649505,0.4137548959075745,0.411264363458522,0.4672612423310636,0.40019767153593655,0.26118282744258625,0.2555011679016145,0.2541102142979712,0.26955706688292214,0.3523216646206665,0.0,0.41843346664215486,0.25219644265415897,0.47361290228761566,0.3528951903738383,0.4118525313827618,0.29992603163814713,0.5691038813053363,0.21692195407115034,0.4840259768638657,0.3064680730997654,0.4087121771185832,0.2528193089497591,0.24990548198873197,0.3570492507411126,0.24436888062086481,0.40126363808792254,0.26032844445441294,0.4207743615906131,0.41027722544164535,0.42141243038639786,0.24420528931612473,0.24521228927158623,0.39593916528954265,0.4310202715229394,0.2615330894682013,0.2575316778770629,0.5760750043800423,0.34030048003929925,0.3721518260103309,0.29237205789119725,0.5706301813455024\n0.4880299908750865,0.28543915691008603,0.37304826046403894,0.5411284088217856,0.9999999392575697,0.42978644971230295,0.2764902285300225,0.22362491235902038,0.2703797362677679,0.37992326447451474,0.37484267680630357,0.4293543810612944,0.4242766527777674,0.25853536358389007,0.2711482060460192,0.2539427528932958,0.25926002800980186,0.3224553326445353,0.0,0.38742405225903986,0.2415672811992946,0.4326172373349185,0.34582113070468756,0.3699384885332503,0.29563911340477833,0.5285657118275889,0.21347267030603412,0.5196064343973287,0.29043686318426043,0.36838302222327357,0.24324691055889947,0.23974121188587083,0.3283892738805162,0.25854326917745074,0.3596855942270649,0.25960585921308776,0.3828896324250416,0.3766394507532944,0.38389227733700926,0.26180377593284265,0.26083264436148457,0.38071435962418054,0.41472191466177777,0.24522653399014804,0.27388922340437627,0.5613879057056965,0.3277320196672653,0.3958467594767514,0.2714683100171924,0.5351201855699161\n0.46201423317620816,0.2978520856361603,0.4086453161457221,0.46748047230806933,0.42978644971230295,1.0,0.29103220925158435,0.22572812657294516,0.2556811295609067,0.41004267392210936,0.4122106441669764,0.9543779147322967,0.413677575502584,0.26803220851778886,0.25417818890808175,0.25708328160498717,0.29495440535493966,0.3388895656578921,0.0,0.42642766203223736,0.2513642862410894,0.4991600138997141,0.3410382599931985,0.40843517971094234,0.28997346607075114,0.47614782551048296,0.22798245818295593,0.46061691505414515,0.2970448784824551,0.40934419113676646,0.25253311249521404,0.25174649412311956,0.34139501045398546,0.24236822712216888,0.39886873631753395,0.2640879999832564,0.4336869401317842,0.4109024892879457,0.4475558871105577,0.254212154300813,0.2439569533104895,0.4184735222873246,0.4313792250179578,0.26504255198264215,0.25726078332736146,0.4660557318089056,0.3274266439321081,0.37658887854183953,0.307699216091586,0.47968637297613304\n0.2898486180778608,0.3154450574208947,0.2819662961048318,0.29180690558697653,0.2764902285300225,0.29103220925158435,0.9999998367902532,0.25372871681335907,0.30770957976222124,0.29768722163553074,0.29391318897411933,0.2909074893285024,0.28919654890026647,0.310655654195091,0.29712232611332534,0.29532870536702915,0.385128508510982,0.2810369842435849,0.0,0.30036353634168733,0.2967896304017278,0.2935158341391554,0.2834087010668812,0.2930149208830499,0.3248635225210055,0.3068699622619949,0.2410050919973752,0.2924685724997733,0.33907631526729476,0.29011361021254634,0.2995344866307753,0.3014220705083076,0.28225617538006376,0.28394330221747965,0.2845682512813217,0.3125585866975501,0.3051704687489861,0.29766578881042605,0.29730210861085293,0.2890623597967259,0.28678876150489885,0.2925870072153952,0.30903975161006714,0.3120956414351099,0.3028795518241494,0.2904017337097822,0.2708366899160384,0.2739084856286924,0.6130809837198987,0.307002642780976\n0.235105836841783,0.22293091046246272,0.22720112039951978,0.22683315325656517,0.22362491235902038,0.22572812657294516,0.25372871681335907,0.9999998770425419,0.38615248954259684,0.23151009822721091,0.23075585105808405,0.22537991733978513,0.22451491975788251,0.3957297145125197,0.386916083540469,0.3708607789098908,0.25185608846479746,0.22006826548430036,0.0,0.2314105730288527,0.3726894370778936,0.22440184459018986,0.22411376399260707,0.23549971921710688,0.22602387845547034,0.23343734837603236,0.18242068756033025,0.22772105602990167,0.22553496001641193,0.22713636598678788,0.3836528309542031,0.37766131456464336,0.22293134635238543,0.36890925991489465,0.22711351385615275,0.3921015189709981,0.23604283239863788,0.219307740361105,0.2288049639399723,0.3730654155221039,0.36577388430783,0.24810852461796395,0.23573549361356605,0.38900868581337966,0.3941088989365237,0.22377064060232255,0.21565188497095322,0.2950970788850731,0.2567622155546765,0.24141860763406897\n0.2707382033252863,0.26721513861469093,0.25481469466020557,0.26421183252649505,0.2703797362677679,0.2556811295609067,0.30770957976222124,0.38615248954259684,0.999999819758897,0.2613387425209236,0.26096085029651517,0.2550189837338993,0.2777215367937953,0.6519182567533042,0.5059129423772891,0.44081135982855457,0.3023011598029818,0.2517237950122515,0.0,0.26744631478980374,0.3962138800257512,0.260303933843851,0.26857136915619595,0.2574246604283499,0.28156945825995683,0.2770335789242785,0.21345122164386843,0.2795901514514594,0.27301827409275903,0.25329504153908,0.48312888047804625,0.46111424176683125,0.25223145336425645,0.4794739474726971,0.2530578498658562,0.6780625259462549,0.26583789289683346,0.26134513164706585,0.26735324804674465,0.485713034115709,0.47837203215502444,0.2802895609819781,0.284938051372826,0.6768072783978119,0.5042365490568765,0.28689436793051737,0.24970864870907905,0.2799634574021872,0.3049833595228002,0.280225531093105\n0.4016795125934354,0.2923078137999847,0.5326840233988901,0.4137548959075745,0.37992326447451474,0.41004267392210936,0.29768722163553074,0.23151009822721091,0.2613387425209236,0.9999998114620487,0.5157186359057855,0.4097721647437347,0.49513518700364123,0.26455871928617347,0.26507120279702046,0.2553763643442797,0.2752320737645698,0.38007990243783785,0.0,0.513669012422536,0.2688628508733417,0.4117184931265764,0.3750453435619697,0.6493730426276352,0.2944590957446077,0.41454411957759274,0.2229795736076453,0.4020821871767135,0.302509727216251,0.7294634312440538,0.2573103600087232,0.2537298750665109,0.3840262777175024,0.24917393415197775,0.49668451837218497,0.2657040128886744,0.48696106692834606,0.5196415426272107,0.5157341023640856,0.2524624981282294,0.24854520400381297,0.4918150711274022,0.561137137408755,0.26693666550302486,0.2560680989322194,0.40596789226867247,0.36707483696215404,0.401798136324381,0.29869297094417835,0.4208427881348984\n0.39005222558204056,0.29766192966737903,0.5069138592853972,0.411264363458522,0.37484267680630357,0.4122106441669764,0.29391318897411933,0.23075585105808405,0.26096085029651517,0.5157186359057855,0.999999764554393,0.41193146638699507,0.45660329616372597,0.2594707803959406,0.25799534105314625,0.2515008154538151,0.27431364852288787,0.37528109505739826,0.0,0.4833528830586864,0.27443043009510115,0.41644935060859267,0.3694403587986699,0.4782944601244342,0.2938494578467056,0.41711870515118665,0.2246522468516421,0.39505306343784163,0.3018806696742512,0.5149858669584797,0.25372878144492317,0.25079688351897145,0.3751879367624352,0.24447251427837746,0.5124956389126696,0.2612437868599402,0.4753843438069387,0.48944305250880527,0.496702803356429,0.24532702268593132,0.24632410687489115,0.4573744130361198,0.49617477141608823,0.26379877257752427,0.26141161186455864,0.4008810180190403,0.36463870503679907,0.38280530509415633,0.29750095429701584,0.4223254324399509\n0.4612223450755799,0.29774556448485945,0.4086795638627633,0.4672612423310636,0.4293543810612944,0.9543779147322967,0.2909074893285024,0.22537991733978513,0.2550189837338993,0.4097721647437347,0.41193146638699507,0.9999997743120086,0.4125785213351193,0.2678994417977907,0.2540192962232106,0.25718751597106526,0.29408732019864214,0.3385431978896083,0.0,0.42616174565098874,0.25118806469291566,0.4982865396242181,0.3407036982871605,0.40815881638267826,0.28959245758739793,0.4759441083455004,0.22804551903550718,0.46045170181850137,0.2969300872662999,0.40908385148128756,0.25235985953749984,0.2518493768075183,0.3410587231586659,0.24246986770211965,0.39890465763758487,0.2639385810349524,0.43336878971282655,0.41029259874860824,0.4473043497061465,0.25381011039249557,0.24405982596080067,0.41822615690054143,0.4311121371117833,0.2651620123718942,0.2573677921804638,0.46588711689628226,0.32711124246838263,0.3764052218740255,0.30704356620977635,0.4778272948006781\n0.43635095213371566,0.29087908407332896,0.4719709211895996,0.40019767153593655,0.4242766527777674,0.413677575502584,0.28919654890026647,0.22451491975788251,0.2777215367937953,0.49513518700364123,0.45660329616372597,0.4125785213351193,0.9999998175259557,0.2672602194370375,0.28688469506029024,0.24437553822238656,0.2687065971721936,0.3400350183298423,0.0,0.49770600288019906,0.2504369202418206,0.40532434171118326,0.3527439603940944,0.47791519974490126,0.30569132085503803,0.4089493470626765,0.22184261825441554,0.424406814001258,0.29394727354230565,0.47742574316673403,0.25780870000853906,0.2444605891605196,0.34241974735926073,0.26464418273212775,0.4493692887462172,0.26598367638342124,0.4591294932804545,0.48907330995975484,0.49709716567919704,0.2769189309987222,0.26894565511675683,0.482932791,0.5161201334849299,0.2639444024252646,0.2790391660722765,0.41684380974444346,0.34021826361136576,0.44547660430121727,0.28439710571927734,0.4124788846827371\n0.27253766138045876,0.25892564349122926,0.257707988915611,0.26118282744258625,0.25853536358389007,0.26803220851778886,0.310655654195091,0.3957297145125197,0.6519182567533042,0.26455871928617347,0.2594707803959406,0.2678994417977907,0.2672602194370375,1.0,0.5052917365139082,0.4596725433406198,0.302670589235996,0.2532927566576638,0.0,0.2646845034356724,0.40499697483034025,0.26040761853174876,0.2580010331666207,0.25645342166944196,0.26453388080423346,0.2878301953873994,0.21363662092292646,0.26587622441187064,0.2792630273393042,0.25641765894142765,0.4995113941238797,0.4717637260804258,0.2550895869407016,0.4692506255016974,0.2538969716014724,0.7972038180771777,0.27421616977474517,0.2587532972015957,0.26507882656689863,0.4692880422370572,0.4605972099027118,0.27467406069162126,0.26892463976522296,0.774466461032286,0.49083818738964224,0.26726523941056934,0.24374452256541868,0.2531853900512432,0.3036329268714705,0.27022349378776844\n0.26486875481824657,0.2666861206737712,0.25228863092704057,0.2555011679016145,0.2711482060460192,0.25417818890808175,0.29712232611332534,0.386916083540469,0.5059129423772891,0.26507120279702046,0.25799534105314625,0.2540192962232106,0.28688469506029024,0.5052917365139082,0.9999998452819248,0.44542223684126336,0.29513606746354404,0.2517908112001793,0.0,0.2611431066365413,0.4134197167811091,0.25117230219564113,0.2688712897991511,0.2505112207818392,0.2880295189554397,0.2713143437320451,0.20972811331332197,0.2827273113745197,0.26589675781613153,0.24754689557354148,0.5371533952081105,0.48075949820428865,0.2534042474027416,0.5310151583912843,0.24382311581382854,0.5179631319216235,0.2629243891193711,0.2563931217590797,0.2558478393865373,0.5669440606295857,0.5275931063749303,0.2582538337996416,0.282165022477734,0.5209104613219031,0.5304069945729701,0.2748381253904313,0.25477187279868696,0.28765599539559394,0.3015630721073195,0.2669711998227874\n0.25348383186951673,0.2587651998768996,0.2478998089107718,0.2541102142979712,0.2539427528932958,0.25708328160498717,0.29532870536702915,0.3708607789098908,0.44081135982855457,0.2553763643442797,0.2515008154538151,0.25718751597106526,0.24437553822238656,0.4596725433406198,0.44542223684126336,0.9999998235432463,0.2866684682411105,0.250659336033924,0.0,0.257133704353834,0.39729743303802967,0.25404596336813967,0.25436987368922415,0.25039309273654364,0.26051082036051654,0.27961759876940595,0.2188930872174485,0.2613577043408405,0.26832231712430854,0.253801796787114,0.44482686388145143,0.42713237686884,0.2497224093642666,0.42890969029716774,0.24474055047646803,0.4678240240537255,0.26728740068304835,0.2551932469006917,0.25300880390549363,0.42800925831641257,0.4251334954773578,0.26960453779761817,0.26222187381324646,0.45914275715801534,0.4597516780454137,0.25670922855461586,0.24015350666654722,0.24269943844831254,0.2941935392050711,0.2620412368881361\n0.2649954245973648,0.3095098199902525,0.2747569001771131,0.26955706688292214,0.25926002800980186,0.29495440535493966,0.385128508510982,0.25185608846479746,0.3023011598029818,0.2752320737645698,0.27431364852288787,0.29408732019864214,0.2687065971721936,0.302670589235996,0.29513606746354404,0.2866684682411105,0.999999836239797,0.2652123153366365,0.0,0.2810278303427509,0.2857195198434509,0.26659851530201994,0.2648633506212076,0.2706777117094512,0.30170538039279116,0.2885437514425654,0.23686916813046155,0.27003438975236427,0.3105126564312507,0.274300048315554,0.2965269579289497,0.2938086979714327,0.26280406643973697,0.27621670933796605,0.27262350681935976,0.3065495110363402,0.2833609433435864,0.2790838952757665,0.28134960740312964,0.28807275481871264,0.27963185248069133,0.2795783030806178,0.28457684606852063,0.30412183608632737,0.28945370895458467,0.2732126690024931,0.25535677880971985,0.25269783749128627,0.4367014310473386,0.28430931892202327\n0.3384418724488407,0.287020466729495,0.3824747990688999,0.3523216646206665,0.3224553326445353,0.3388895656578921,0.2810369842435849,0.22006826548430036,0.2517237950122515,0.38007990243783785,0.37528109505739826,0.3385431978896083,0.3400350183298423,0.2532927566576638,0.2517908112001793,0.250659336033924,0.2652123153366365,1.0,0.0,0.3550277278771885,0.26058767308819863,0.3456335902120995,0.7781023644629838,0.35031514052445467,0.29056428019096736,0.3516843098105509,0.22175808134565378,0.3420091580138276,0.2916134603177508,0.367185239088882,0.2472503104599536,0.24158412343118751,0.866450575120429,0.23343970928940405,0.352736557137032,0.25576113473734874,0.3571091815904134,0.3551671675583349,0.35142308439702274,0.23814022623660513,0.23448089923896942,0.33798782282363893,0.3544018688544559,0.2564122842161447,0.25431222789742836,0.34506080324904864,0.8248292526142869,0.3016320981002961,0.28790957234904746,0.35238416520267757\n0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0\n0.40565849657034736,0.3037620169427505,0.5045019193871383,0.41843346664215486,0.38742405225903986,0.42642766203223736,0.30036353634168733,0.2314105730288527,0.26744631478980374,0.513669012422536,0.4833528830586864,0.42616174565098874,0.49770600288019906,0.2646845034356724,0.2611431066365413,0.257133704353834,0.2810278303427509,0.3550277278771885,0.0,1.0,0.2634051600250318,0.44957252074922827,0.35298391205659807,0.51374533800091,0.3031376085644669,0.42685366396993873,0.23226819661665898,0.40372354383824216,0.3075188693503005,0.5161733759424463,0.2558344210473208,0.2589619136995457,0.35482388534439124,0.24367418577805777,0.4747428208748824,0.2689949906211474,0.5097118755036006,0.6173364185914356,0.5489079224879514,0.24912379704510068,0.2445134700552033,0.6219967921004634,0.5340490651956405,0.2694323041830258,0.261363634237716,0.4141763484043185,0.34286481143908576,0.42406724351358693,0.30335206370609136,0.42664174334954097\n0.2621719711636269,0.2614389955612667,0.26546106930145774,0.25219644265415897,0.2415672811992946,0.2513642862410894,0.2967896304017278,0.3726894370778936,0.3962138800257512,0.2688628508733417,0.27443043009510115,0.25118806469291566,0.2504369202418206,0.40499697483034025,0.4134197167811091,0.39729743303802967,0.2857195198434509,0.26058767308819863,0.0,0.2634051600250318,0.999999814590528,0.2548401991518512,0.263691700524485,0.27642252370971965,0.27378303669584914,0.2640988152030006,0.21722806801822558,0.25169624638359833,0.2677930935604761,0.26604796974030065,0.4052594605622365,0.39042364746126235,0.261166172488868,0.38903305673750577,0.2618285226885133,0.4080452386401463,0.27456605918970034,0.26261538542164875,0.2634345580346229,0.38851990097692146,0.3878044468486648,0.25845235687597934,0.2663524198251388,0.4073576712393052,0.4176329385832305,0.2554379307806314,0.25461390724339816,0.23516218663213984,0.29922971608657856,0.26418450969434604\n0.44486414040347677,0.29797118302473613,0.40455100738327743,0.47361290228761566,0.4326172373349185,0.4991600138997141,0.2935158341391554,0.22440184459018986,0.260303933843851,0.4117184931265764,0.41644935060859267,0.4982865396242181,0.40532434171118326,0.26040761853174876,0.25117230219564113,0.25404596336813967,0.26659851530201994,0.3456335902120995,0.0,0.44957252074922827,0.2548401991518512,1.0,0.34622221317077884,0.41324559521764437,0.29254848309922155,0.46875720642787666,0.22301804565867367,0.44897821994946385,0.30302422436427356,0.41336089535319576,0.24956409888037778,0.24617493779947708,0.34745293115027287,0.2479286917951612,0.4061805064298639,0.2596143981772402,0.4360601940820392,0.4178039432165267,0.43919712334250505,0.23881044613007718,0.24630085496873166,0.4156726743047774,0.4378136207229846,0.2594893607645281,0.25846507065687174,0.47403378729444323,0.33635523302047965,0.3773336909947087,0.2926544541636801,0.47286127618056295\n0.35579608659711115,0.29944107807651765,0.36978231043325827,0.3528951903738383,0.34582113070468756,0.3410382599931985,0.2834087010668812,0.22411376399260707,0.26857136915619595,0.3750453435619697,0.3694403587986699,0.3407036982871605,0.3527439603940944,0.2580010331666207,0.2688712897991511,0.25436987368922415,0.2648633506212076,0.7781023644629838,0.0,0.35298391205659807,0.263691700524485,0.34622221317077884,0.9999998074476409,0.3503094820628525,0.3089477132542485,0.35338027504313796,0.2251837525328001,0.36349406419817454,0.2974039472307758,0.36778007005291735,0.2525716916129852,0.2449601252464485,0.775797473785721,0.2513073109138103,0.35176511365500074,0.2567005040115867,0.358569181403248,0.3519775071410326,0.35060633993539725,0.25642902057376793,0.2499638690321846,0.3424745550891868,0.37235015775385594,0.25709987391747036,0.2762124491299982,0.36462786927788093,0.7477237570757456,0.3378912619317537,0.2869287473133567,0.35961358971218815\n0.3999977822718572,0.2907185416329692,0.5096652681776028,0.4118525313827618,0.3699384885332503,0.40843517971094234,0.2930149208830499,0.23549971921710688,0.2574246604283499,0.6493730426276352,0.4782944601244342,0.40815881638267826,0.47791519974490126,0.25645342166944196,0.2505112207818392,0.25039309273654364,0.2706777117094512,0.35031514052445467,0.0,0.51374533800091,0.27642252370971965,0.41324559521764437,0.3503094820628525,1.0,0.2923744958743054,0.40772119620271163,0.22454335478213372,0.3937820830578276,0.299249728004477,0.6611029554350251,0.2483106702783281,0.2580832006829836,0.3524172508988689,0.24087932728443773,0.46916089876001643,0.2579221136653904,0.4776350735702415,0.5048159021332668,0.5092656164397462,0.2421976652033505,0.24120849660859234,0.480792864241824,0.5500868695416428,0.25911428835879957,0.2532730326892274,0.4039623095488819,0.33918595498891924,0.39861130021920055,0.2932689504899636,0.42305227145129054\n0.29873573726319025,0.41512581312633956,0.2878170002935184,0.29992603163814713,0.29563911340477833,0.28997346607075114,0.3248635225210055,0.22602387845547034,0.28156945825995683,0.2944590957446077,0.2938494578467056,0.28959245758739793,0.30569132085503803,0.26453388080423346,0.2880295189554397,0.26051082036051654,0.30170538039279116,0.29056428019096736,0.0,0.3031376085644669,0.27378303669584914,0.29254848309922155,0.3089477132542485,0.2923744958743054,0.9999999018721859,0.30121443613880516,0.24496511755429362,0.31546018532128217,0.379218321925897,0.28652318119484776,0.2716578185286489,0.25761168483475727,0.29054084484312603,0.2703644162114919,0.28267365964146085,0.2702070386259373,0.30856283012544083,0.3014589317325038,0.301629261828095,0.27949141596233196,0.2730803057070038,0.2894277204023573,0.3267390387558745,0.2670169445578775,0.2938500958215946,0.30931531913489196,0.292833474479396,0.3049429630309648,0.32905010638998067,0.30393720487908804\n0.47444767241869845,0.3002017976248007,0.40577536888558985,0.5691038813053363,0.5285657118275889,0.47614782551048296,0.3068699622619949,0.23343734837603236,0.2770335789242785,0.41454411957759274,0.41711870515118665,0.4759441083455004,0.4089493470626765,0.2878301953873994,0.2713143437320451,0.27961759876940595,0.2885437514425654,0.3516843098105509,0.0,0.42685366396993873,0.2640988152030006,0.46875720642787666,0.35338027504313796,0.40772119620271163,0.30121443613880516,0.9999998905977998,0.2361336069811173,0.4832717816893518,0.32014684897844314,0.4091799193436719,0.26658252317016407,0.28006099387926287,0.35004817391824616,0.25705352870734866,0.40114975528772334,0.2873231833351574,0.4322914197664691,0.4194144109268725,0.4280072728364861,0.25257758885075177,0.2566995728521033,0.42869574951819445,0.42922246943333864,0.28080236035176076,0.27820991956220853,0.5618421139546848,0.3353205930165697,0.3716483155646463,0.30586162165727104,0.5666178406441851\n0.22301848630672783,0.2525588367233852,0.22126016068798582,0.21692195407115034,0.21347267030603412,0.22798245818295593,0.2410050919973752,0.18242068756033025,0.21345122164386843,0.2229795736076453,0.2246522468516421,0.22804551903550718,0.22184261825441554,0.21363662092292646,0.20972811331332197,0.2188930872174485,0.23686916813046155,0.22175808134565378,0.0,0.23226819661665898,0.21722806801822558,0.22301804565867367,0.2251837525328001,0.22454335478213372,0.24496511755429362,0.2361336069811173,1.0,0.22321984205588463,0.26305935465090646,0.22232631452052942,0.21135810859648652,0.20789631557099675,0.22081977597850255,0.20536963984552348,0.22317386832210284,0.2185291513654828,0.23789641115908433,0.22796652394617567,0.22936861586865565,0.20048879493372518,0.20309818378916633,0.22645572877872588,0.23279453920587867,0.2138087521282973,0.21730854633028285,0.22232792143824187,0.21534021623109478,0.20517320757113466,0.2450055404909719,0.22421966646343094\n0.5147593476586576,0.29618686208116396,0.39716622795756884,0.4840259768638657,0.5196064343973287,0.46061691505414515,0.2924685724997733,0.22772105602990167,0.2795901514514594,0.4020821871767135,0.39505306343784163,0.46045170181850137,0.424406814001258,0.26587622441187064,0.2827273113745197,0.2613577043408405,0.27003438975236427,0.3420091580138276,0.0,0.40372354383824216,0.25169624638359833,0.44897821994946385,0.36349406419817454,0.3937820830578276,0.31546018532128217,0.4832717816893518,0.22321984205588463,1.0,0.29750279229564913,0.39156223047297045,0.2552844897457035,0.2528599667695226,0.3441338308574703,0.2697723469083716,0.37634035914761677,0.26857119322223666,0.41967801740419364,0.40192504138473273,0.41880670191165437,0.27657273048799047,0.27003438975236493,0.4004646356575129,0.4473934424633661,0.2574503104502701,0.28402661270787233,0.5067119441917232,0.34422463428005423,0.4208781424530702,0.28916078486751917,0.47262800622810164\n0.30062384007374965,0.3782223989097524,0.2981511214088277,0.3064680730997654,0.29043686318426043,0.2970448784824551,0.33907631526729476,0.22553496001641193,0.27301827409275903,0.302509727216251,0.3018806696742512,0.2969300872662999,0.29394727354230565,0.2792630273393042,0.26589675781613153,0.26832231712430854,0.3105126564312507,0.2916134603177508,0.0,0.3075188693503005,0.2677930935604761,0.30302422436427356,0.2974039472307758,0.299249728004477,0.379218321925897,0.32014684897844314,0.26305935465090646,0.29750279229564913,0.9999998631855707,0.2984033946180874,0.2575566436530723,0.27513978819910057,0.29491661810868164,0.25044113061117323,0.3022333099308978,0.2718706128743046,0.3194810707592546,0.30376610462761466,0.3079209484231168,0.2481432166044656,0.24730564911183328,0.30657874548021,0.31683982742932837,0.27018078604233775,0.2783655363200245,0.3092841630721356,0.284664411962379,0.27721833618740865,0.33624843645155666,0.311467310120094\n0.39173534800444454,0.29236576119984614,0.52339600655624,0.4087121771185832,0.36838302222327357,0.40934419113676646,0.29011361021254634,0.22713636598678788,0.25329504153908,0.7294634312440538,0.5149858669584797,0.40908385148128756,0.47742574316673403,0.25641765894142765,0.24754689557354148,0.253801796787114,0.274300048315554,0.367185239088882,0.0,0.5161733759424463,0.26604796974030065,0.41336089535319576,0.36778007005291735,0.6611029554350251,0.28652318119484776,0.4091799193436719,0.22232631452052942,0.39156223047297045,0.2984033946180874,0.9999998605793474,0.24725825985194227,0.24878597435295446,0.36822689774628525,0.23485942402139381,0.5074366826484185,0.2590017221949662,0.4855780554357867,0.5099712670007543,0.515070677916023,0.23785315351710845,0.23370725214867438,0.489209729515823,0.5533066027836087,0.2615118091659645,0.24870838910670456,0.3984489492862443,0.3543453783324306,0.3866300587586028,0.29707488471363996,0.4108616238460707\n0.2547972118149203,0.255362131976278,0.24474807359398076,0.2528193089497591,0.24324691055889947,0.25253311249521404,0.2995344866307753,0.3836528309542031,0.48312888047804625,0.2573103600087232,0.25372878144492317,0.25235985953749984,0.25780870000853906,0.4995113941238797,0.5371533952081105,0.44482686388145143,0.2965269579289497,0.2472503104599536,0.0,0.2558344210473208,0.4052594605622365,0.24956409888037778,0.2525716916129852,0.2483106702783281,0.2716578185286489,0.26658252317016407,0.21135810859648652,0.2552844897457035,0.2575566436530723,0.24725825985194227,0.9999998818955981,0.4776354486784805,0.24634353225657635,0.5038193296601331,0.23984896820958335,0.5083859623296025,0.2612652925297051,0.25470853591906095,0.25088861182671285,0.5411434605160139,0.4999647476710899,0.25611939537747086,0.2631035824092307,0.5165644383310315,0.49635056604042294,0.25495639292813344,0.24273115467548956,0.25748856935478437,0.3022083449408304,0.25996742657611793\n0.24817676594465055,0.2585512966136698,0.2469898993647024,0.24990548198873197,0.23974121188587083,0.25174649412311956,0.3014220705083076,0.37766131456464336,0.46111424176683125,0.2537298750665109,0.25079688351897145,0.2518493768075183,0.2444605891605196,0.4717637260804258,0.48075949820428865,0.42713237686884,0.2938086979714327,0.24158412343118751,0.0,0.2589619136995457,0.39042364746126235,0.24617493779947708,0.2449601252464485,0.2580832006829836,0.25761168483475727,0.28006099387926287,0.20789631557099675,0.2528599667695226,0.27513978819910057,0.24878597435295446,0.4776354486784805,1.0,0.24147085877363206,0.43956755253015534,0.24683717055557886,0.47261775566986597,0.2594785311479575,0.2531275584265722,0.2579395551304675,0.5712143997461587,0.43008813162950665,0.2615655959215405,0.2586268867710544,0.4722405830164924,0.4612915328933007,0.2575949811116791,0.23177088824115,0.2418472396376884,0.28914908573565434,0.2645774263547017\n0.34434072403483373,0.2892014516599165,0.38289258533998616,0.3570492507411126,0.3283892738805162,0.34139501045398546,0.28225617538006376,0.22293134635238543,0.25223145336425645,0.3840262777175024,0.3751879367624352,0.3410587231586659,0.34241974735926073,0.2550895869407016,0.2534042474027416,0.2497224093642666,0.26280406643973697,0.866450575120429,0.0,0.35482388534439124,0.261166172488868,0.34745293115027287,0.775797473785721,0.3524172508988689,0.29054084484312603,0.35004817391824616,0.22081977597850255,0.3441338308574703,0.29491661810868164,0.36822689774628525,0.24634353225657635,0.24147085877363206,0.9999998545766426,0.23427734745060147,0.3563815298033064,0.25658352200469425,0.3549247109557899,0.35265104710554884,0.3501105536620681,0.23824990179600003,0.23605910082480241,0.3347943689650116,0.35510091220293816,0.25592991830933187,0.2559631257521997,0.35022147167059114,0.8143386248435964,0.3021416563731405,0.28714803194484617,0.3555047767555092\n0.2510115332983013,0.2549185523067041,0.24082517548970117,0.24436888062086481,0.25854326917745074,0.24236822712216888,0.28394330221747965,0.36890925991489465,0.4794739474726971,0.24917393415197775,0.24447251427837746,0.24246986770211965,0.26464418273212775,0.4692506255016974,0.5310151583912843,0.42890969029716774,0.27621670933796605,0.23343970928940405,0.0,0.24367418577805777,0.38903305673750577,0.2479286917951612,0.2513073109138103,0.24087932728443773,0.2703644162114919,0.25705352870734866,0.20536963984552348,0.2697723469083716,0.25044113061117323,0.23485942402139381,0.5038193296601331,0.43956755253015534,0.23427734745060147,0.9999997868202617,0.23037747318647628,0.4777191351085348,0.24934742863910586,0.24472512360645648,0.2429421517852428,0.5122164607379383,0.6567369448953961,0.24742429415728817,0.2690746313081388,0.47562885644496045,0.5244797419143419,0.2652204916095843,0.238421341502965,0.2795688181401411,0.28176293739487845,0.25592003856646905\n0.3762451961365837,0.2900272102531586,0.4921100394770249,0.40126363808792254,0.3596855942270649,0.39886873631753395,0.2845682512813217,0.22711351385615275,0.2530578498658562,0.49668451837218497,0.5124956389126696,0.39890465763758487,0.4493692887462172,0.2538969716014724,0.24382311581382854,0.24474055047646803,0.27262350681935976,0.352736557137032,0.0,0.4747428208748824,0.2618285226885133,0.4061805064298639,0.35176511365500074,0.46916089876001643,0.28267365964146085,0.40114975528772334,0.22317386832210284,0.37634035914761677,0.3022333099308978,0.5074366826484185,0.23984896820958335,0.24683717055557886,0.3563815298033064,0.23037747318647628,0.9999998577043923,0.2551538542452486,0.45594461280113463,0.47898130786938287,0.48861566078038565,0.23008842330087798,0.23116157091520317,0.45457497125730373,0.49048253710584355,0.2563317332781546,0.24779712998255188,0.39107915998003107,0.3415291088117326,0.3735735461577625,0.2898837891716187,0.40347144887219577\n0.263545553902819,0.26287174566551263,0.2589319229111542,0.26032844445441294,0.25960585921308776,0.2640879999832564,0.3125585866975501,0.3921015189709981,0.6780625259462549,0.2657040128886744,0.2612437868599402,0.2639385810349524,0.26598367638342124,0.7972038180771777,0.5179631319216235,0.4678240240537255,0.3065495110363402,0.25576113473734874,0.0,0.2689949906211474,0.4080452386401463,0.2596143981772402,0.2567005040115867,0.2579221136653904,0.2702070386259373,0.2873231833351574,0.2185291513654828,0.26857119322223666,0.2718706128743046,0.2590017221949662,0.5083859623296025,0.47261775566986597,0.25658352200469425,0.4777191351085348,0.2551538542452486,0.9999999471821057,0.2708927300976479,0.26425265047783053,0.26423006210490585,0.4779870688034059,0.46998549447594573,0.2792904413062015,0.2708822217453223,0.8246991883350175,0.49365521147155333,0.26486642107838,0.24665713701900716,0.24862602343155193,0.3057054357371687,0.2692039491519743\n0.398034399223939,0.30993619970199804,0.4819525819015692,0.4207743615906131,0.3828896324250416,0.4336869401317842,0.3051704687489861,0.23604283239863788,0.26583789289683346,0.48696106692834606,0.4753843438069387,0.43336878971282655,0.4591294932804545,0.27421616977474517,0.2629243891193711,0.26728740068304835,0.2833609433435864,0.3571091815904134,0.0,0.5097118755036006,0.27456605918970034,0.4360601940820392,0.358569181403248,0.4776350735702415,0.30856283012544083,0.4322914197664691,0.23789641115908433,0.41967801740419364,0.3194810707592546,0.4855780554357867,0.2612652925297051,0.2594785311479575,0.3549247109557899,0.24934742863910586,0.45594461280113463,0.2708927300976479,1.0,0.49438879323452367,0.5173334457089351,0.25029935284364546,0.2493922989202313,0.4874840544381932,0.5226732327799266,0.2721526179659093,0.26927241915116285,0.4176793491961668,0.3432481750733627,0.4747790117384405,0.3120974063614431,0.4218970653671277\n0.3956541904843327,0.29728770486886846,0.5081152588400042,0.41027722544164535,0.3766394507532944,0.4109024892879457,0.29766578881042605,0.219307740361105,0.26134513164706585,0.5196415426272107,0.48944305250880527,0.41029259874860824,0.48907330995975484,0.2587532972015957,0.2563931217590797,0.2551932469006917,0.2790838952757665,0.3551671675583349,0.0,0.6173364185914356,0.26261538542164875,0.4178039432165267,0.3519775071410326,0.5048159021332668,0.3014589317325038,0.4194144109268725,0.22796652394617567,0.40192504138473273,0.30376610462761466,0.5099712670007543,0.25470853591906095,0.2531275584265722,0.35265104710554884,0.24472512360645648,0.47898130786938287,0.26425265047783053,0.49438879323452367,1.0,0.5465208136195578,0.2468289225283561,0.24454745079012474,0.5768266007767564,0.5342665944548596,0.2613923302750264,0.25950334665479025,0.4069850008547615,0.34113114630045926,0.4077566333930832,0.2968219650421704,0.4144309439854085\n0.40352821928227545,0.31032336885767864,0.5075240842110538,0.42141243038639786,0.38389227733700926,0.4475558871105577,0.29730210861085293,0.2288049639399723,0.26735324804674465,0.5157341023640856,0.496702803356429,0.4473043497061465,0.49709716567919704,0.26507882656689863,0.2558478393865373,0.25300880390549363,0.28134960740312964,0.35142308439702274,0.0,0.5489079224879514,0.2634345580346229,0.43919712334250505,0.35060633993539725,0.5092656164397462,0.301629261828095,0.4280072728364861,0.22936861586865565,0.41880670191165437,0.3079209484231168,0.515070677916023,0.25088861182671285,0.2579395551304675,0.3501105536620681,0.2429421517852428,0.48861566078038565,0.26423006210490585,0.5173334457089351,0.5465208136195578,1.0,0.24811748528861377,0.24581039661976123,0.5146101866668131,0.5432343027899934,0.2640946977354891,0.2624918146442635,0.41957937963991776,0.3367841454422126,0.41819272453790346,0.308519288947976,0.4338633722548412\n0.2602472849701728,0.2563338195937147,0.23756983073475124,0.24420528931612473,0.26180377593284265,0.254212154300813,0.2890623597967259,0.3730654155221039,0.485713034115709,0.2524624981282294,0.24532702268593132,0.25381011039249557,0.2769189309987222,0.4692880422370572,0.5669440606295857,0.42800925831641257,0.28807275481871264,0.23814022623660513,0.0,0.24912379704510068,0.38851990097692146,0.23881044613007718,0.25642902057376793,0.2421976652033505,0.27949141596233196,0.25257758885075177,0.20048879493372518,0.27657273048799047,0.2481432166044656,0.23785315351710845,0.5411434605160139,0.5712143997461587,0.23824990179600003,0.5122164607379383,0.23008842330087798,0.4779870688034059,0.25029935284364546,0.2468289225283561,0.24811748528861377,1.0,0.5118495414834878,0.24845569168166348,0.2756679038168631,0.47994532628027875,0.5062936848040472,0.26625119967803745,0.24205083476726608,0.2919371480289621,0.3004036293512895,0.2563690679728253\n0.25190256268046574,0.25283955677914915,0.2366610133465742,0.24521228927158623,0.26083264436148457,0.2439569533104895,0.28678876150489885,0.36577388430783,0.47837203215502444,0.24854520400381297,0.24632410687489115,0.24405982596080067,0.26894565511675683,0.4605972099027118,0.5275931063749303,0.4251334954773578,0.27963185248069133,0.23448089923896942,0.0,0.2445134700552033,0.3878044468486648,0.24630085496873166,0.2499638690321846,0.24120849660859234,0.2730803057070038,0.2566995728521033,0.20309818378916633,0.27003438975236493,0.24730564911183328,0.23370725214867438,0.4999647476710899,0.43008813162950665,0.23605910082480241,0.6567369448953961,0.23116157091520317,0.46998549447594573,0.2493922989202313,0.24454745079012474,0.24581039661976123,0.5118495414834878,0.9999998470368179,0.24362697766031083,0.26874488004226893,0.4660125727906499,0.5250342437379556,0.2661782906722868,0.23948696454625307,0.276661698437076,0.2843219645988302,0.2555883550472554\n0.38715047896524724,0.2902405241343867,0.4771830458766476,0.39593916528954265,0.38071435962418054,0.4184735222873246,0.2925870072153952,0.24810852461796395,0.2802895609819781,0.4918150711274022,0.4573744130361198,0.41822615690054143,0.482932791,0.27467406069162126,0.2582538337996416,0.26960453779761817,0.2795783030806178,0.33798782282363893,0.0,0.6219967921004634,0.25845235687597934,0.4156726743047774,0.3424745550891868,0.480792864241824,0.2894277204023573,0.42869574951819445,0.22645572877872588,0.4004646356575129,0.30657874548021,0.489209729515823,0.25611939537747086,0.2615655959215405,0.3347943689650116,0.24742429415728817,0.45457497125730373,0.2792904413062015,0.4874840544381932,0.5768266007767564,0.5146101866668131,0.24845569168166348,0.24362697766031083,1.0,0.5069493517619994,0.2792690904249723,0.2632662970442844,0.400040549981182,0.32532964504103223,0.43844571490329753,0.2954577936100209,0.4200266274559561\n0.42128870956978015,0.3213968743819182,0.5098540312502364,0.4310202715229394,0.41472191466177777,0.4313792250179578,0.30903975161006714,0.23573549361356605,0.284938051372826,0.561137137408755,0.49617477141608823,0.4311121371117833,0.5161201334849299,0.26892463976522296,0.282165022477734,0.26222187381324646,0.28457684606852063,0.3544018688544559,0.0,0.5340490651956405,0.2663524198251388,0.4378136207229846,0.37235015775385594,0.5500868695416428,0.3267390387558745,0.42922246943333864,0.23279453920587867,0.4473934424633661,0.31683982742932837,0.5533066027836087,0.2631035824092307,0.2586268867710544,0.35510091220293816,0.2690746313081388,0.49048253710584355,0.2708822217453223,0.5226732327799266,0.5342665944548596,0.5432343027899934,0.2756679038168631,0.26874488004226893,0.5069493517619994,1.0,0.27023168796379227,0.2865440857668655,0.4472416705056771,0.35232959696622546,0.4707688237349038,0.30579996841007406,0.43250484464514805\n0.2627491839252317,0.26145457767152414,0.2595952297993569,0.2615330894682013,0.24522653399014804,0.26504255198264215,0.3120956414351099,0.38900868581337966,0.6768072783978119,0.26693666550302486,0.26379877257752427,0.2651620123718942,0.2639444024252646,0.774466461032286,0.5209104613219031,0.45914275715801534,0.30412183608632737,0.2564122842161447,0.0,0.2694323041830258,0.4073576712393052,0.2594893607645281,0.25709987391747036,0.25911428835879957,0.2670169445578775,0.28080236035176076,0.2138087521282973,0.2574503104502701,0.27018078604233775,0.2615118091659645,0.5165644383310315,0.4722405830164924,0.25592991830933187,0.47562885644496045,0.2563317332781546,0.8246991883350175,0.2721526179659093,0.2613923302750264,0.2640946977354891,0.47994532628027875,0.4660125727906499,0.2792690904249723,0.27023168796379227,0.999999912026988,0.48958269076756,0.2625231663456966,0.24554211809889392,0.24386193953752633,0.3082500489482092,0.2675568990419732\n0.2669119059298235,0.2723898413426654,0.24974179847959443,0.2575316778770629,0.27388922340437627,0.25726078332736146,0.3028795518241494,0.3941088989365237,0.5042365490568765,0.2560680989322194,0.26141161186455864,0.2573677921804638,0.2790391660722765,0.49083818738964224,0.5304069945729701,0.4597516780454137,0.28945370895458467,0.25431222789742836,0.0,0.261363634237716,0.4176329385832305,0.25846507065687174,0.2762124491299982,0.2532730326892274,0.2938500958215946,0.27820991956220853,0.21730854633028285,0.28402661270787233,0.2783655363200245,0.24870838910670456,0.49635056604042294,0.4612915328933007,0.2559631257521997,0.5244797419143419,0.24779712998255188,0.49365521147155333,0.26927241915116285,0.25950334665479025,0.2624918146442635,0.5062936848040472,0.5250342437379556,0.2632662970442844,0.2865440857668655,0.48958269076756,0.99999987202182,0.2796051958039667,0.26019101056771055,0.29425544258212566,0.2975277748093106,0.2692295352018308\n0.5058321332714905,0.30389602146567907,0.40068205725811434,0.5760750043800423,0.5613879057056965,0.4660557318089056,0.2904017337097822,0.22377064060232255,0.28689436793051737,0.40596789226867247,0.4008810180190403,0.46588711689628226,0.41684380974444346,0.26726523941056934,0.2748381253904313,0.25670922855461586,0.2732126690024931,0.34506080324904864,0.0,0.4141763484043185,0.2554379307806314,0.47403378729444323,0.36462786927788093,0.4039623095488819,0.30931531913489196,0.5618421139546848,0.22232792143824187,0.5067119441917232,0.3092841630721356,0.3984489492862443,0.25495639292813344,0.2575949811116791,0.35022147167059114,0.2652204916095843,0.39107915998003107,0.26486642107838,0.4176793491961668,0.4069850008547615,0.41957937963991776,0.26625119967803745,0.2661782906722868,0.400040549981182,0.4472416705056771,0.2625231663456966,0.2796051958039667,0.9999998539591309,0.3444802880666622,0.40652570290685663,0.2949476267717278,0.5554263583689878\n0.3374819330465959,0.28174248936938817,0.3676927488734396,0.34030048003929925,0.3277320196672653,0.3274266439321081,0.2708366899160384,0.21565188497095322,0.24970864870907905,0.36707483696215404,0.36463870503679907,0.32711124246838263,0.34021826361136576,0.24374452256541868,0.25477187279868696,0.24015350666654722,0.25535677880971985,0.8248292526142869,0.0,0.34286481143908576,0.25461390724339816,0.33635523302047965,0.7477237570757456,0.33918595498891924,0.292833474479396,0.3353205930165697,0.21534021623109478,0.34422463428005423,0.284664411962379,0.3543453783324306,0.24273115467548956,0.23177088824115,0.8143386248435964,0.238421341502965,0.3415291088117326,0.24665713701900716,0.3432481750733627,0.34113114630045926,0.3367841454422126,0.24205083476726608,0.23948696454625307,0.32532964504103223,0.35232959696622546,0.24554211809889392,0.26019101056771055,0.3444802880666622,0.9999998039737765,0.312331346523412,0.27597875222769264,0.3436520338401108\n0.38854576688484144,0.2819537078373747,0.3973165461672866,0.3721518260103309,0.3958467594767514,0.37658887854183953,0.2739084856286924,0.2950970788850731,0.2799634574021872,0.401798136324381,0.38280530509415633,0.3764052218740255,0.44547660430121727,0.2531853900512432,0.28765599539559394,0.24269943844831254,0.25269783749128627,0.3016320981002961,0.0,0.42406724351358693,0.23516218663213984,0.3773336909947087,0.3378912619317537,0.39861130021920055,0.3049429630309648,0.3716483155646463,0.20517320757113466,0.4208781424530702,0.27721833618740865,0.3866300587586028,0.25748856935478437,0.2418472396376884,0.3021416563731405,0.2795688181401411,0.3735735461577625,0.24862602343155193,0.4747790117384405,0.4077566333930832,0.41819272453790346,0.2919371480289621,0.276661698437076,0.43844571490329753,0.4707688237349038,0.24386193953752633,0.29425544258212566,0.40652570290685663,0.312331346523412,0.9999998117008556,0.2652866397261534,0.3878353492982356\n0.2881198223424366,0.32700171571637293,0.2943715222621487,0.29237205789119725,0.2714683100171924,0.307699216091586,0.6130809837198987,0.2567622155546765,0.3049833595228002,0.29869297094417835,0.29750095429701584,0.30704356620977635,0.28439710571927734,0.3036329268714705,0.3015630721073195,0.2941935392050711,0.4367014310473386,0.28790957234904746,0.0,0.30335206370609136,0.29922971608657856,0.2926544541636801,0.2869287473133567,0.2932689504899636,0.32905010638998067,0.30586162165727104,0.2450055404909719,0.28916078486751917,0.33624843645155666,0.29707488471363996,0.3022083449408304,0.28914908573565434,0.28714803194484617,0.28176293739487845,0.2898837891716187,0.3057054357371687,0.3120974063614431,0.2968219650421704,0.308519288947976,0.3004036293512895,0.2843219645988302,0.2954577936100209,0.30579996841007406,0.3082500489482092,0.2975277748093106,0.2949476267717278,0.27597875222769264,0.2652866397261534,0.9999999090098985,0.30920716718279395\n0.4711915855378318,0.301427011588676,0.40708824648695185,0.5706301813455024,0.5351201855699161,0.47968637297613304,0.307002642780976,0.24141860763406897,0.280225531093105,0.4208427881348984,0.4223254324399509,0.4778272948006781,0.4124788846827371,0.27022349378776844,0.2669711998227874,0.2620412368881361,0.28430931892202327,0.35238416520267757,0.0,0.42664174334954097,0.26418450969434604,0.47286127618056295,0.35961358971218815,0.42305227145129054,0.30393720487908804,0.5666178406441851,0.22421966646343094,0.47262800622810164,0.311467310120094,0.4108616238460707,0.25996742657611793,0.2645774263547017,0.3555047767555092,0.25592003856646905,0.40347144887219577,0.2692039491519743,0.4218970653671277,0.4144309439854085,0.4338633722548412,0.2563690679728253,0.2555883550472554,0.4200266274559561,0.43250484464514805,0.2675568990419732,0.2692295352018308,0.5554263583689878,0.3436520338401108,0.3878353492982356,0.30920716718279395,0.9999998284565611\n"
  },
  {
    "path": "doc/_templates/.empty",
    "content": ""
  },
  {
    "path": "doc/api-example.md",
    "content": "# `sourmash` Python API examples\n\nAll of sourmash's functionality is available via its [Python API](api.md). Below are both basic and advanced examples that use the API to accomplish common tasks.\n\n```{contents}\n   :depth: 2\n```\n\n## A first example: two k-mers\n\nDefine two sequences:\n\n```\n>>> seq1 = \"ATGGCA\"\n>>> seq2 = \"AGAGCA\"\n\n```\n\nCreate two MinHashes using 3-mers, and add the sequences:\n\n```\n>>> import sourmash\n>>> mh1 = sourmash.MinHash(n=0, ksize=3, scaled=1)\n>>> mh1.add_sequence(seq1)\n\n```\n\n```\n>>> mh2 = sourmash.MinHash(n=0, ksize=3, scaled=1)\n>>> mh2.add_sequence(seq2)\n\n```\n\nOne of the 3-mers (out of 7) overlaps, so Jaccard index is 1/7:\n\n```\n>>> round(mh1.jaccard(mh2), 2)\n0.14\n\n```\n\nand of course the MinHashes match themselves:\n\n```\n>>> mh1.jaccard(mh1)\n1.0\n\n```\n\nWe can add sequences to the MinHash objects and query at any time --\n\n```\n>>> mh1.add_sequence(seq2)\n>>> x = mh1.jaccard(mh2)\n>>> round(x, 3)\n0.571\n\n```\n\n## Introduction: k-mers, molecule types, and hashing.\n\n### DNA k-mers\n\nThe basis of sourmash is k-mers. Suppose we have a 35 base DNA sequence, and\nwe break it into four 31-mers:\n```\n>>> K = 31\n>>> dnaseq = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGC\"\n>>> for i in range(0, len(dnaseq) - K + 1):\n...    kmer = dnaseq[i:i+K]\n...    print(i, kmer)\n0 ATGCGAGTGTTGAAGTTCGGCGGTACATCAG\n1 TGCGAGTGTTGAAGTTCGGCGGTACATCAGT\n2 GCGAGTGTTGAAGTTCGGCGGTACATCAGTG\n3 CGAGTGTTGAAGTTCGGCGGTACATCAGTGG\n4 GAGTGTTGAAGTTCGGCGGTACATCAGTGGC\n\n```\n\nsourmash uses a hash function (by default MurmurHash) that converts\neach k-mer into 64-bit numbers. These numbers form the basis of everything\nelse sourmash does; the k-mer strings are not used internally at all.\n\nThe easiest way to access the hash\nfunction is via the `seq_to_hashes` method on `MinHash` objects, which\nreturns a list:\n```\n>>> from sourmash import MinHash\n>>> mh = MinHash(n=0, ksize=K, scaled=1)\n>>> for i in range(0, len(dnaseq) - K + 1):\n...    kmer = dnaseq[i:i+K]\n...    print(i, kmer, mh.seq_to_hashes(kmer))\n0 ATGCGAGTGTTGAAGTTCGGCGGTACATCAG [7488148386897425535]\n1 TGCGAGTGTTGAAGTTCGGCGGTACATCAGT [3674733966066518639]\n2 GCGAGTGTTGAAGTTCGGCGGTACATCAGTG [2135725670290847794]\n3 CGAGTGTTGAAGTTCGGCGGTACATCAGTGG [14521729668397845245]\n4 GAGTGTTGAAGTTCGGCGGTACATCAGTGGC [15919051675656106963]\n\n```\n\nNote that this is the same as using the MurmurHash hash function with a seed\nof 42 and taking the first 64 bits.\n\nBecause DNA is double-stranded and has no inherent directionality, but\ncomputers represent DNA with only one strand, it's important for\nsourmash to represent both strands. sourmash does this by building a\ncanonical representation for each k-mer so that reverse-complement\nsequences match to their forward sequence.\n\nUnderneath, sourmash DNA hashing does this by taking each k-mer,\nbuilding the reverse complement, choosing the lexicographically lesser of\nthe two, and then hashes it - for example, for the first and second\nk-mers above, you get:\n\n```\n>>> from sourmash.minhash import hash_murmur\n>>> from screed import rc\n>>> kmer_1 = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAG\"\n>>> hash_murmur(kmer_1)\n7488148386897425535\n>>> hash_murmur(kmer_1) == mh.seq_to_hashes(kmer_1)[0]\nTrue\n>>> kmer_2 = \"TGCGAGTGTTGAAGTTCGGCGGTACATCAGT\"\n>>> hash_murmur(kmer_2)\n6388498842523164783\n>>> kmer_2_rc = rc(kmer_2)\n>>> kmer_2_rc\n'ACTGATGTACCGCCGAACTTCAACACTCGCA'\n>>> hash_murmur(kmer_2_rc) == mh.seq_to_hashes(kmer_2)[0]\nTrue\n\n```\nwhere the second k-mer's reverse complement starts with 'A' and is therefore\nchosen for hashing by sourmash. This method was chosen to be compatible\nwith [mash](https://mash.readthedocs.io/.\n\n### Protein-based encodings\n\nBy default, `MinHash` objects work with DNA. However, sourmash\nsupports amino acid, Dayhoff, and hydrophobic-polar (hp) encodings as\nwell. The Dayhoff and hp encodings support degenerate\nmatching that is less stringent than exact matches.\n\nThe simplest way to use a protein `MinHash` object is to create one and\ncall `add_protein` on it --\n\n```\n>>> K = 7\n>>> mh = MinHash(0, K, is_protein=True, scaled=1)\n>>> protseq = \"MVKVYAPAS\"\n>>> mh.add_protein(protseq)\n\n```\n\nThis creates three 7-mers from the sequence and hashes them:\n```\n>>> list(sorted(mh.hashes))\n[5834377656419371297, 8846570680426381265, 10273850291677879123]\n\n```\n\nAs with DNA k-mers, above, you can also use `seq_to_hashes` to generate\nthe hashes for protein k-mers, if you add the `is_protein=True` flag:\n```\n>>> for i in range(0, len(protseq) - K + 1):\n...    kmer = protseq[i:i+K]\n...    print(i, kmer, mh.seq_to_hashes(kmer, is_protein=True))\n0 MVKVYAP [5834377656419371297]\n1 VKVYAPA [10273850291677879123]\n2 KVYAPAS [8846570680426381265]\n\n```\n\nIn this case, the k-mers are always hashed in the forward direction\n(because protein sequence always has an orientation, unlike DNA).\n\nsourmash also supports the\n[Dayhoff](https://en.wikipedia.org/wiki/Margaret_Oakley_Dayhoff#Table_of_Dayhoff_encoding_of_amino_acids)\nand hydrophobic-polar encodings; here, amino acids are first mapped to\ntheir encodings and then hashed. So, for example, the amino acid sequence\n`CADHIF*` is mapped to `abcdef*` in the Dayhoff encoding:\n\n```\n>>> mh = MinHash(0, K, dayhoff=True, scaled=1)\n>>> h1 = mh.seq_to_hashes('CADHIF*', is_protein=True)[0]\n>>> h1\n12061624913065022412\n>>> h1 == hash_murmur('abcdef*')\nTrue\n\n```\n\n### Translating DNA into protein-based encodings.\n\nIf you use `add_sequence(...)` to add DNA sequence to a protein encoding,\nor call `seq_to_hashes(...)` on a protein encoding without `is_protein=True`,\nsourmash will *translate* the sequences in all possible reading frames\nand hash the translated amino acids. The k-mer size for the `MinHash`\nis used as the k-mer size of the amino acids, i.e. 7 aa is 21 DNA bases.\n\n```\n>>> dnaseq = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGC\"\n>>> len(dnaseq)\n35\n>>> K = 7\n>>> mh = MinHash(n=0, ksize=K, is_protein=True, scaled=1)\n>>> mh.add_sequence(dnaseq)\n>>> len(mh)\n30\n\n```\nHere, 30 hashes are added to the `MinHash` object because we are starting\nwith a 35 base DNA sequence, and using 21-mers of DNA (7-mer of protein),\nwhich give us 15 distinct 21-mers in the three forward frames, and\n15 distinct 21-mers in the three reverse-complement frames, for a total\nof 30.\n\nIf a dayhoff or hp `MinHash` object is used, then `add_sequence(...)`\nwill first translate each sequence into protein space in all six frames,\nand then further encode the sequences into Dayhoff or hp encodings.\n\n### Invalid characters in DNA and protein sequences\n\nsourmash detects invalid DNA characters (non-ACTG) and raises an\nexception on `add_sequence`, unless `force=True`, in which case\nk-mers containing invalid characters are ignored.\n```\n>>> dnaseq = \"nTGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGC\"\n>>> K = 31\n>>> mh = MinHash(n=0, ksize=K, scaled=1)\n>>> mh.add_sequence(dnaseq)\nTraceback (most recent call last):\n    ...\nValueError: invalid DNA character in input k-mer: NTGCGAGTGTTGAAGTTCGGCGGTACATCAG\n>>> mh.add_sequence(dnaseq, force=True)\n>>> len(mh)\n4\n\n```\n\nFor protein sequences, sourmash does not currently do any invalid\ncharacter detection; k-mers are hashed as they are, and can only be\nmatched by an identical k-mer (with the same invalid character).\n(Please [file an issue](https://github.com/sourmash-bio/sourmash/issues) if\nyou'd like us to change this!)\n```\n>>> K = 7\n>>> mh = MinHash(n=0, ksize=K, is_protein=True, scaled=1)\n>>> protseq = \"XVKVYAPAS\"\n>>> mh.add_protein(protseq)\n>>> len(mh)\n3\n\n```\n\nFor the Dayhoff and hp encodings on top of amino acids, invalid amino\nacids (any letter for which no encoded character exists) are replaced with\n'X'.\n```\n>>> K = 7\n>>> mh = MinHash(n=0, ksize=K, dayhoff=True, scaled=1)\n>>> protseq1 = \".VKVYAPAS\"\n>>> hashes1 = mh.seq_to_hashes(protseq1, is_protein=True)\n>>> protseq2 = \"XVKVYAPAS\"\n>>> hashes2 = mh.seq_to_hashes(protseq2, is_protein=True)\n>>> hashes1 == hashes2\nTrue\n\n```\n\n### Extracting both k-mers and hashes for a sequence\n\nAs of sourmash 4.2.2, `MinHash` objects provide a method called\n`kmers_and_hashes` that will return the k-mers and their corresponding\nhashes for an input sequence --\n\n```\n>>> mh = MinHash(n=0, ksize=31, scaled=1)\n>>> dnaseq = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGC\"\n>>> for kmer, hashval in mh.kmers_and_hashes(dnaseq):\n...    print(kmer, hashval)\nATGCGAGTGTTGAAGTTCGGCGGTACATCAG 7488148386897425535\nTGCGAGTGTTGAAGTTCGGCGGTACATCAGT 3674733966066518639\nGCGAGTGTTGAAGTTCGGCGGTACATCAGTG 2135725670290847794\nCGAGTGTTGAAGTTCGGCGGTACATCAGTGG 14521729668397845245\nGAGTGTTGAAGTTCGGCGGTACATCAGTGGC 15919051675656106963\n\n```\n\nThis works for protein `MinHash` objects as well, of course, although\nyou have to provide the `is_protein` flag, since `MinHash` objects assume\ninput sequence is DNA otherwise --\n\n```\n>>> K = 7\n>>> mh = MinHash(n=0, ksize=K, is_protein=True, scaled=1)\n>>> protseq = \"XVKVYAPAS\"\n>>> for (kmer, hashval) in mh.kmers_and_hashes(protseq, is_protein=True):\n...     print(kmer, hashval)\nXVKVYAP 3140823561012061964\nVKVYAPA 10273850291677879123\nKVYAPAS 8846570680426381265\n\n```\n\nFor translated `MinHash`, the k-mers and hashes corresponding to all\nsix reading frames are returned.\n\n```\n>>> dnaseq = \"ATGCGAGTGTTGAAGTTCGGCGGTA\"\n>>> K = 7\n>>> mh = MinHash(n=0, ksize=K, is_protein=True, scaled=1)\n>>> for (kmer, hashval) in mh.kmers_and_hashes(dnaseq):\n...    print(kmer, hashval)\nATGCGAGTGTTGAAGTTCGGC 16652503548557650904\nCGAGTGTTGAAGTTCGGCGGT 9978056796243419534\nTACCGCCGAACTTCAACACTC 2748622134668949083\nCGCCGAACTTCAACACTCGCA 4263227699724621735\nTGCGAGTGTTGAAGTTCGGCG 14299765336094039482\nGAGTGTTGAAGTTCGGCGGTA 18155608748862746902\nACCGCCGAACTTCAACACTCG 14490181201772650983\nGCCGAACTTCAACACTCGCAT 17205086974168937105\nGCGAGTGTTGAAGTTCGGCGG 13354527969598897281\nCCGCCGAACTTCAACACTCGC 16506504121672505595\n\n```\n\nIn all cases, the k-mers are taken from the sequence itself, so the\nk-mers will match to the input sequence, even when there are multiple\nk-mers that hash to the same value (e.g. in the case of reverse\ncomplements, or DNA k-mers that are translated to the same amino acid\nsequence).\n\nNote that sourmash also provides a `translate_codon` function if you\nneed to get the specific amino acids -\n\n```\n>>> from sourmash.minhash import translate_codon\n>>> kmer = 'ATGCGAGT'\n>>> for start in range(0, len(kmer) - 3 + 1, 3):\n...    codon = kmer[start:start+3]\n...    print(codon, translate_codon(codon))\nATG M\nCGA R\n\n```\n\n### Summary\n\nIn sum,\n* `MinHash.add_sequence(...)` converts DNA sequence into DNA or protein k-mers, and then hashes them and stores them.\n* `MinHash.add_protein(...)` converts protein sequence into protein k-mers, and then hashes them and stores them.\n* `MinHash.seq_to_hashes(...)` will give you the hash values without adding them to the `MinHash` object.\n* `MinHash.kmers_and_hashes(...)` will provide tuples of `(kmer, hashval)` for an input sequence.\n* The `dayhoff` and `hp` encodings can be calculated on amino acid k-mers as well, using `MinHash` objects.\n\nNote that this is the code that is used by the command-line\nfunctionality in `sourmash sketch`, so the results at the command-line\nwill match the results from the Python API.\n\n## Set operations on hashes\n\nAll of the hashes in a `MinHash` object are available via the `hashes`\nproperty:\n\n```\n>>> mh1 = sourmash.MinHash(n=0, ksize=3, scaled=1)\n>>> seq1 = \"ATGGCA\"\n>>> mh1.add_sequence(seq1)\n>>> seq2 = \"AGAGCA\"\n>>> mh1.add_sequence(seq2)\n>>> list(mh1.hashes)\n[1274996984489324440, 2529443451610975987, 3115010115530738562, 5059920851104263793, 5740495330885152257, 8652222673649005300, 18398176440806921933]\n\n```\n\nand you can easily do your own set operations with `.hashes` - e.g.\nthe following calculates the Jaccard similarity (intersection over union) of two \n```\n>>> s1 = set(mh1.hashes)\n>>> s2 = set(mh2.hashes)\n>>> round(len(s1 & s2) / len(s1 | s2), 3)\n0.571\n\n```\nHowever, the MinHash class also supports a number of basic operations - the following operations work directly on the hashes:\n```\n>>> combined = mh1 + mh2\n>>> combined += mh1\n>>> combined.remove_many(mh1.hashes)\n>>> combined.add_many(mh2.hashes)\n\n```\n\nYou can create an empty copy of a MinHash object with `copy_and_clear`:\n```\n>>> new_mh = mh1.copy_and_clear()\n\n```\n\nand you can also access the various parameters of a MinHash object directly as properties --\n```\n>>> mh1.ksize\n3\n>>> mh1.scaled\n1\n>>> mh1.num\n0\n>>> mh1.is_dna\nTrue\n>>> mh1.is_protein\nFalse\n>>> mh1.dayhoff\nFalse\n>>> mh1.hp\nFalse\n>>> mh1.moltype\n'DNA'\n\n```\nsee the \"Advanced\" section, below, for a more complete discussion of MinHash objects.\n\n## Creating MinHash sketches programmatically, from genome files\n\nSuppose we want to create MinHash sketches from genomes --\n\n```\n>>> import glob, pprint\n>>> genomes = glob.glob('data/GCF*.fna.gz')\n>>> genomes = list(sorted(genomes))\n>>> pprint.pprint(genomes)\n['data/GCF_000005845.2_ASM584v2_genomic.fna.gz',\n 'data/GCF_000006945.1_ASM694v1_genomic.fna.gz',\n 'data/GCF_000783305.1_ASM78330v1_genomic.fna.gz']\n\n```\n\nWe have to read them in (here using screed), but then they can be fed\ninto `add_sequence` directly; here we set `force=True` in `add_sequence`\nto skip over k-mers containing characters other than ACTG, rather than\nraising an exception.\n\n(Note, just for speed reasons, we're truncating the sequences to 50kb in length.)\n\n```\n>>> import screed\n>>> minhashes = []\n>>> for g in genomes:\n...     mh = sourmash.MinHash(n=500, ksize=31)\n...     for record in screed.open(g):\n...         mh.add_sequence(record.sequence[:50000], True)\n...     minhashes.append(mh)\n\n```\n\nAnd now the resulting MinHash objects can be compared against each other:\n\n```\n>>> import sys\n>>> for i, e in enumerate(minhashes):\n...    _ = sys.stdout.write(genomes[i][:20] + ' ')\n...    for j, e2 in enumerate(minhashes):\n...       x = e.jaccard(minhashes[j])\n...       _ = sys.stdout.write(str(round(x, 3)) + ' ')\n...    _= sys.stdout.write('\\n')\ndata/GCF_000005845.2 1.0 0.0 0.0 \ndata/GCF_000006945.1 0.0 1.0 0.0 \ndata/GCF_000783305.1 0.0 0.0 1.0 \n\n```\n\nNote that the comparisons are quite quick; most of the time is spent in\nbuilding the minhashes.\n\n## Plotting dendrograms and matrices\n\nIf you're interested in building comparison matrices and dendrograms,\nplease see the notebook\n[Building plots from `sourmash compare` output](plotting-compare.ipynb).\n\n## Saving and loading signature files\n\nSignature files encapsulate MinHashes in JSON, and provide a way to\nwrap MinHash objects with some metadata (the name and filename). To save signatures, use `save_signatures` with a list of signatures and a Python file pointer:\n\n```\n>>> from sourmash import SourmashSignature, save_signatures\n>>> from tempfile import mkdtemp\n>>> sig1 = SourmashSignature(minhashes[0], name=genomes[0][:20])\n>>> tempdir = mkdtemp(suffix = \"temp\")\n>>> with open(tempdir + '/genome1.sig', 'wt') as fp:\n...   save_signatures([sig1], fp)\n\n```\n\nHere, `genome1.sig` is a JSON file that can now be loaded and\ncompared -- first, load it using `load_one_signature`:\n\n```\n>>> from sourmash import load_one_signature\n>>> loaded_sig = load_one_signature(tempdir + '/genome1.sig')\n\n```\n\nthen compare:\n\n```\n>>> loaded_sig.jaccard(sig1)\n1.0\n>>> sig1.jaccard(loaded_sig)\n1.0\n\n```\n\nThere are two primary signature loading functions - `load_one_signature`, used above, which loads exactly one signature or else raises an exception; and the  powerful and more generic `load_file_as_signatures`, which takes in a filename or directory containing a collection of signatures and returns the individual signatures -- for example, you can load all of the signatures under the `tempdir` created above like so,\n\n```\n>>> loaded_sigs = list(sourmash.load_file_as_signatures(tempdir))\n\n```\n\nBoth `load_file_as_signatures` and `load_one_signature` take molecule type and k-mer size selectors, e.g.\n```\n>>> loaded_sigs = load_one_signature(tempdir + '/genome1.sig', select_moltype='DNA', ksize=31)\n\n```\nwill load precisely one signature containing a DNA MinHash created at k-mer size of 31.\n\n## Going from signatures back to MinHash objects and their hashes -\n\nOnce you load a signature, you can go back to its MinHash object with\n`.minhash`; e.g.\n\nFirst, load two signatures:\n\n```\n>>> sigfile1 = 'tests/test-data/genome-s10.fa.gz.sig'\n>>> sig1 = load_one_signature(sigfile1, ksize=21, select_moltype='DNA')\n>>> sigfile2 = 'tests/test-data/genome-s11.fa.gz.sig'\n>>> sig2 = load_one_signature(sigfile2, ksize=21, select_moltype='DNA')\n\n```\n\nThen, get the hashes, and (e.g.) calculate the union:\n\n```\n>>> hashes1 = set(sig1.minhash.hashes.keys())\n>>> hashes2 = set(sig2.minhash.hashes.keys())\n>>> hash_union = hashes1.union(hashes2)\n>>> print(f'{len(hash_union)} hashes in union of {len(hashes1)} and {len(hashes2)}')\n1000 hashes in union of 500 and 500\n\n```\n\n## Advanced features of sourmash MinHash objects - `scaled` and `num`\n\nsourmash supports two basic kinds of signatures, MinHash and modulo hash\nsignatures. MinHash signatures are equivalent to mash signatures;\nthey are limited in size, and very effective for comparing genomes and\nother data sets that are of similar size. The key parameter for MinHash\nsignatures is `num`, which specifies the maximum number of hashes to\nbe collected for a given input data set.\n\n```\n>>> signum = sourmash.MinHash(n=500, ksize=31)\n\n```\nBecause of this parameter, below we'll call them 'num' signatures.\n\nModulo hash (or 'scaled') signatures are specific to sourmash and they\nenable containment operations that are useful for metagenome analyses. The tradeoff is that unlike num MinHashes, they can become arbitrarily large.  The key parameter for modulo hash signatures is `scaled`, which specifies the average sampling rate\nfor hashes for a given input data set.  A scaled factor  of 1000 means that,\non average, 1 in 1000 k-mers will be turned into a hash for later\ncomparisons; this is a sort of compression factor, in that a 5 Mbp\ngenome will yield approximately 5000 hash values with a scaled factor\nof 1000 (5000 x 1000 = 5,000,000).\n\n```\n>>> sigscaled = sourmash.MinHash(n=0, ksize=31, scaled=1000)\n\n```\nNote also that with a scaled factor of 1, the signature will contain **all**\nof the k-mers.\n\n\n----\n\nYou can differentiate between num signatures and scaled signatures by\nlooking at the `num` and `scaled` attributes on a MinHash object:\n\n```\n>>> signum.num\n500\n>>> signum.scaled\n0\n>>> sigscaled.num\n0\n>>> sigscaled.scaled\n1000\n\n```\n\nThe MinHash class is otherwise identical between the two types of signatures.\n\nYou cannot calculate Jaccard similarity or containment for\nMinHash objects with different num or scaled values (or different ksizes):\n\n```\n>>> signum2 = sourmash.MinHash(n=1000, ksize=31)\n>>> signum.jaccard(signum2)\nTraceback (most recent call last):\n  ...\nTypeError: must have same num: 500 != 1000\n\n```\n\nHowever, you can make signatures compatible by downsampling; see the next\nsections.\n\n### A brief introduction to MinHash object methods and attributes\n\nMinHash objects have the following methods and attributes:\n\n* `ksize`, `num`, and `scaled` - the basic parameters used to create a MinHash object.\n* `hashes` - retrieve all of the hashes contained in this object.\n* `add_sequence(seq)` - hash sequence and add hash values.\n* `add(hash)` and `add_many(hashvals)` - add hash values directly.\n* `similarity(other)` - calculate Jaccard similarity with the other MinHash object.\n* `contained_by(other)` - calculate the Jaccard containment of self by other.\n* `copy_and_clear()` - make an empty copy of a MinHash object with the same parameters.\n* `__len__()` - return the number of actual hash values. Note you can also do `len(mh)`, where `mh` is a MinHash object.\n\n### Downsampling signatures\n\nNum and scaled signatures can always be downsampled without referring\nback to the original data.\n\nLet's start by loading 50kb of genomic sequence in to memory:\n```\n>>> genomes = glob.glob('data/GCF*.fna.gz')\n>>> genomes = list(sorted(genomes))\n>>> genome = genomes[0]\n>>> record = next(iter(screed.open(genome)))\n>>> sequence = record.sequence[:50000]\n\n```\n\nNow, suppose we make a num signature limited to 1000 hashes:\n\n```\n>>> larger = sourmash.MinHash(n=1000, ksize=31)\n>>> larger.add_sequence(sequence)\n>>> len(larger)\n1000\n\n```\n\nWe can downsample this to 500 by extracting the hashes and using\n`add_many` to add them to a new MinHash like so:\n\n```\n>>> hashvals = larger.hashes.keys()\n>>> smaller = sourmash.MinHash(n=500, ksize=31)\n>>> smaller.add_many(hashvals)\n>>> len(smaller)\n500\n\n```\n\nAlso note that there's a convenience function that does the same thing,\nfaster!\n```\n>>> smaller2 = larger.downsample(num=500)\n>>> smaller2 == smaller\nTrue\n\n```\n\nThe same can be done with scaled MinHashes:\n\n```\n>>> large_scaled = sourmash.MinHash(n=0, ksize=31, scaled=100)\n>>> large_scaled.add_sequence(sequence)\n>>> len(large_scaled)\n459\n>>> small_scaled = sourmash.MinHash(n=0, ksize=31, scaled=500)\n>>> small_scaled.add_many(large_scaled.hashes.keys())\n>>> len(small_scaled)\n69\n\n```\n\nAnd, again, there's a convenience function that you can use:\n```\n>>> small_scaled2 = large_scaled.downsample(scaled=500)\n>>> small_scaled == small_scaled2\nTrue\n\n```\n\n### Converting between `num` and `scaled` signatures\n\n(Beware, these are confusing techniques for working with hashes that\nare easy to get wrong! We suggest\n[posting questions in the issue tracker](https://github.com/sourmash-bio/sourmash/issues)\nas you go, if you are interested in exploring this area!)\n\nThe hashing function used is identical between num and scaled signatures,\nso the hash values themselves are compatible - it's the comparison between\ncollections of them that doesn't work.\n\nBut, in some circumstances, num signatures can be extracted from\nscaled signatures, and vice versa.  We haven't yet implemented a\nPython API for this in sourmash, but you can hack it together yourself\nquite easily, and a conversion utility is implemented through the command\nline in `sourmash signature downsample`.\n\n\nTo extract a num MinHash object from a scaled MinHash, first create or load\nyour MinHash, and then extract the hash values:\n```\n>>> num_mh = sourmash.MinHash(n=1000, ksize=31)\n>>> num_mh.add_sequence(sequence)\n>>> hashvals = num_mh.hashes.keys()\n\n```\n\nNow, create the new scaled MinHash object and add the hashes to it:\n\n```\n>>> scaled_mh = sourmash.MinHash(n=0, ksize=31, scaled=10000)\n>>> scaled_mh.add_many(hashvals)\n\n```\n\nand you are done!\n\nThe same works in reverse, of course:\n```\n>>> scaled_mh = sourmash.MinHash(n=0, ksize=31, scaled=50)\n>>> scaled_mh.add_sequence(sequence)\n>>> hashvals = scaled_mh.hashes.keys()\n>>> num_mh = sourmash.MinHash(n=500, ksize=31)\n>>> num_mh.add_many(hashvals)\n\n```\n\nSo... when can you do this extraction reliably?\n\nYou can extract num MinHashes from scaled MinHashes whenever the\nmaximum hash value in the num MinHash is greater than or equal to the\n`max_hash` attribute of the scaled MinHash.\n\nYou can extract scaled MinHashes to num MinHashes whenever there are\nmore hash values in the scaled MinHash than num.\n\nYoda sayeth: *When understand these two sentences you can, use this code may\nyou.*\n\n(You can also take a look at the logic in `sourmash signature\ndownsample` if you are interested.)\n\n## Working with indexed collections of signatures\n\nIf you want to search large collections of signatures, sourmash provides\ntwo different indexing strategies, together with a generic `Index` class\nthat supports a common API for searching the collections.\n\nThe first indexing strategy is a Sequence Bloom Tree, which is\ndesigned to support fast and efficient containment operations on large\ncollections of signatures.  SBTs are an _on disk_ search structure, so\nthey are a low-memory way to search collections.\n\nTo use SBTs from the command line, we first\nneed to create some `scaled` signatures:\n\n```\nsourmash sketch dna -p scaled=10000 data/GCF*.fna.gz --outdir data/\n```\n\nand then build a Sequence Bloom Tree (SBT) index with `sourmash\nindex`, like so:\n\n```\nsourmash index foo.sbt.zip data/GCF*.sig -k 31\n```\n\nHere, sourmash is storing the entire SBT in a single portable Zip file.\n\n### Creating an on-disk SBT in Python\n\nLet's start by using 'glob' to grab some example signatures from the\ntest data in the sourmash repository:\n\n```\n>>> import glob\n>>> input_filenames = glob.glob('tests/test-data/doctest-data/GCF*.sig')\n\n```\n\nNow, create an SBT:\n\n```\n>>> import sourmash.sbtmh\n>>> tree = sourmash.sbtmh.create_sbt_index()\n\n```\n\nLoad each signature, and add it to the tree:\n\n```\n>>> from sourmash.sbtmh import SigLeaf\n>>> for filename in input_filenames:\n...     sig = sourmash.load_one_signature(filename, ksize=31)\n...     leaf = SigLeaf(sig.md5sum(), sig)\n...     tree.add_node(leaf)\n\n```\n(note, you'll need to make sure that all of the signatures are compatible\nwith each other! The `sourmash index` command does all of the necessary\nchecks, but the Python API doesn't.)\n\nNow, save the tree:\n\n```\n>>> filename = tree.save(tempdir + '/test.sbt.zip')\n\n```\n\n### Loading and searching SBTs\n\nHow do we load the SBT and search it with a DNA sequence,\nfrom within Python?\n\nThe SBT filename is `test.sbt.zip`, as above:\n```\n>>> SBT_filename = tempdir + '/test.sbt.zip'\n\n```\n\nand with it we can load the SBT:\n```\n>>> tree = sourmash.load_file_as_index(SBT_filename)\n\n```\n\nNow, load a DNA sequence:\n\n```\n>>> filename = 'data/GCF_000005845.2_ASM584v2_genomic.fna.gz'\n>>> query_seq = next(iter(screed.open(filename))).sequence\n>>> print(f'got {len(query_seq)} DNA characters to query')\ngot 4641652 DNA characters to query\n\n```\n\nand create a scaled signature:\n```\n>>> minhash = sourmash.MinHash(ksize=31, n=0, scaled=10000)\n>>> minhash.add_sequence(query_seq)\n\n>>> query_sig = sourmash.SourmashSignature(minhash, name='my favorite query')\n\n```\n\nNow do a search --\n\n```\n>>> for similarity, found_sig, filename in tree.search(query_sig, threshold=0.1):\n...    print(query_sig)\n...    print(found_sig)\n...    print(similarity)\nmy favorite query\nNC_000913.3 Escherichia coli str. K-12 substr. MG1655, complete genome\n1.0\n\n```\n\net voila!\n\n### In-memory databases: the LCA or \"reverse index\" database.\n\nThe LCA database lets you work with large collections of signatures in\nmemory.\n\nThe LCA database was initially designed to support individual hash\nqueries for taxonomic operations - hence its name, which stands for\n\"Lowest Common Ancestor.\" However, it supports all of the standard\n`Index` operations, just like the SBT. \n\nFirst, let's create an LCA database programmatically.\n\n```\n>>> from sourmash.lca import LCA_Database\n>>> db = LCA_Database(ksize=31, scaled=10000, moltype='DNA')\n\n```\n\nNow, let's load in all of the signatures from the test directory:\n\n```\n>>> for sig in sourmash.load_file_as_signatures('tests/test-data/doctest-data', ksize=31):\n...    hashes_inserted = db.insert(sig)\n...    print(f\"Inserted {hashes_inserted} hashes into db.\")\nInserted 493 hashes into db.\nInserted 490 hashes into db.\nInserted 525 hashes into db.\n\n```\n\nand now you have an `Index` class that supports all the generic index operations (below). You can save an LCA Database to disk with `db.save(filename)`, and load it with `sourmash.load_file_as_index`, below.\n\n### The `Index` class API.\n\nThe `Index` class supports a generic API for SBTs, LCAs, and other collections of signatures.\n\nTo load an SBT or an LCA database from a file, use `sourmash.load_file_as_index`:\n```\n>>> sbt_db = sourmash.load_file_as_index('tests/test-data/prot/protein.sbt.zip')\n>>> lca_db = sourmash.load_file_as_index('tests/test-data/prot/protein.lca.json.gz')\n\n```\n\n`Index` objects provide `search`, `insert`, `load`, `save`, and `__len__`. The signatures can be accessed directly via the  `.signatures()` method, which returns an iterable.  Last but not least, `Index.select(ksize=..., moltype=...)` will return a view on the Index object that contains only signatures with the desired k-mer size/molecule type.\n"
  },
  {
    "path": "doc/api.md",
    "content": "# `sourmash` Python API\n\nThe primary programmatic way of interacting with `sourmash` is via\nits Python API.\n\n**Please also see [examples of using the API](api-example.md).**\n\n```{contents}\n   :depth: 2\n```\n\n## `MinHash`: basic MinHash sketch functionality\n\n```{eval-rst}\n.. autoclass:: sourmash.MinHash\n   :members:\n\n   .. automethod:: __init__\n```\n\n## `SourmashSignature`: save and load MinHash sketches in JSON\n\n```{eval-rst}\n.. automodule:: sourmash.signature\n   :members:\n```\n\n## `SBT`: save and load Sequence Bloom Trees in JSON\n\n```{eval-rst}\n.. automodule:: sourmash.sbt\n   :members: GraphFactory, Node, NodePos, SBT, Leaf\n   :undoc-members:\n```\n\n## `sourmash.fig`: make plots and figures\n\n```{eval-rst}\n.. automodule:: sourmash.fig\n   :members:\n```\n"
  },
  {
    "path": "doc/cite.md",
    "content": "# How to cite sourmash\n\nThe primary citation for the sourmash software is:\n\nIrber et al., (2024). sourmash v4: A multitool to quickly search, compare, and analyze genomic and metagenomic data sets. Journal of Open Source Software, 9(98), 6830, (https://doi.org/10.21105/joss.06830).\n"
  },
  {
    "path": "doc/classifying-signatures.md",
    "content": "# Classifying signatures: `search`, `gather`, and `lca` methods.\n\nsourmash provides several different techniques for doing\nclassification and breakdown of genomic and metagenomic signatures.\nThese include taxonomic classification as well as decomposition of\nmetagenomic data into constitutent genomes.\n\n```{contents} Contents\n:depth: 3\n```\n\n## Searching for similar samples with `search`.\n\nThe `sourmash search` command is most useful when you are looking for\nhigh similarity matches to other signatures; this is the most basic use\ncase for MinHash searching.  The command takes a query signature and one\nor more search signatures, and finds all the matches it can above a particular\nthreshold.\n\nBy default `search` will find matches with high [*Jaccard\nsimilarity*](https://en.wikipedia.org/wiki/Jaccard_index), which will\nconsider all of the k-mers in the union of the two samples.\nPractically, this means that you will only find matches if there is\nboth high overlap between the samples *and* relatively few k-mers that\nare disjoint between the samples.  This is effective for finding genomes\nor transcriptomes that are similar but rarely works well for samples\nof vastly different sizes.\n\nOne useful modification to `search` is to calculate containment with\n`--containment` instead of the (default) similarity; this will find\nmatches where the query is contained within the subject, but the\nsubject may have many other k-mers in it. For example, if you are using\na plasmid as a query, you would use `--containment` to find genomes\nthat contained that plasmid.  `gather` (discussed below) uses containment\nanalysis only.\n\nSee [the main sourmash tutorial](tutorial-basic.md#make-and-search-a-database-quickly)\nfor information on using `search` with and without `--containment`.\n\n## Analyzing metagenomic samples with `gather`\n\nNeither search option (similarity or containment) is effective when\ncomparing or searching with metagenomes, which typically contain a\nmixture of many different genomes.  While you might use containment to\nsee if a query genome is present in one or more metagenomes, a common\nquestion to ask is the reverse: **what genomes are in my metagenome?**\nAn alternative phrasing is this: **what reference genomes should I map\nmy metagenomic reads to?**\n\nThe main approach we provide in sourmash is `sourmash gather`. This\nconstructs the shortest possible list of reference genomes that cover\nall of the known k-mers in a metagenome. We call this a *minimum\nmetagenome cover*.\n\nFrom an algorithmic perspective, `gather` generates a minimum set\ncover for a query metagenome, using the reference database you give\nit.  The minimum set cover is calculated using a greedy approximation\nalgorithm.  Essentially, `gather` takes a query metagenome and\nsearches the database for the most highly contained genome; it then\nsubtracts that match from the metagenome, and repeats.  At the end it\nreports how much of the metagenome remains unknown.  The\n[basic sourmash tutorial](tutorial-basic.md#whats-in-my-metagenome)\nhas some sample output from using gather with GenBank.  See Appendix A\nat the bottom of this page for more technical details.\n\nThe `gather` method is described in\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers, Irber et al., 2022](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2).\nOur benchmarking in that paper and also in\n[Evaluation of taxonomic classification and profiling methods for long-read shotgun metagenomic sequencing datasets, Portik et al., 2022](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-022-05103-0)\nsuggests that it is a very sensitive and specific method for\nanalyzing metagenomes.\n\n## Taxonomic profiling with sourmash\n\nsourmash supports two basic kinds of taxonomic profiling, under the\n`lca` and `tax` modules. **As of 2023, we strongly recommend the\n`tax`-based profiling approach.**\n\nBut first, let's back up! By default, there is no structured taxonomic\ninformation available in sourmash signatures or collections.  What\nthis means is that you will have to provide your own mapping from a\nmatch to some taxonomic hierarchy.  Both the `lca` and `tax` modules\nsupport identifier-based taxonomic mappings, in which identifiers\nfrom the signature names can be linked to the standard seven NCBI/GTDB\ntaxonomy ranks - superkingdom, phylum, class, order, family, genus, and\nspecies. These are typically provided in a spreadsheet _separately_ from\nthe signature collection. The `tax` module also supports `lins` taxonomies,\nfor which we have a tutorial.\n\nThere are several advantages that this approach affords sourmash. One\nis that sourmash is not tied closely to a specific taxonomy - you can\nuse either GTDB or NCBI as you wish. Another advantage is that you can\ncreate your own custom taxonomic ranks and even use them with private\ndatabases of genomes to classify your own metagenomes.\n\nThe main disadvantage of sourmash's approach to taxonomy is that\nsourmash doesn't classify individual metagenomic reads to either a\ngenome or a taxon. (Note that we're not sure this can be done robustly\nin practice - neither short nor long reads typically contain enough\ninformation to uniquely identify a single genome, especially if there\nare many genomes from the same species present in the database.)  If\nyou want to do this, we suggest running `sourmash gather` first, and\nthen mapping the reads to the matching genomes; then you can determine\nwhich read maps to which genome. This is the approach taken by\n[the genome-grist pipeline](https://dib-lab.github.io/genome-grist/).\n\n<!-- link to tutorials and examples -->\n\n### Using `sourmash tax` to do taxonomic analysis\n\nWe recommend using the `tax` module to do taxonomic classification of\ngenomes (with `tax genome`) and metagenomes (with `tax metagenome`).\nThe `tax` module commands operate downstream of `sourmash gather`,\nwhich builds a minimum set cover of the query against the database -\nintuitively speaking, this is the shortest possible list of genomes\nthat the query would map to.  Then, both `tax genome` and `tax\nmetagenome` take the CSV output of `sourmash gather` and produce\ntaxonomic profiles.  (You can read more about minimum set covers\nin\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers, Irber et al., 2022](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2).)\n\nThe `tax metagenome` approach was benchmarked in\n[Evaluation of taxonomic classification and profiling methods for long-read shotgun metagenomic sequencing datasets, Portik et al., 2022](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-022-05103-0)\nand appears to be both very accurate and very sensitive, unless you're\nusing Nanopore data or other data types that have a high sequencing\nerror rate.\n\nIt's important to note that taxonomy based on multiple k-mers is very,\nvery specific and if you get a match, it's pretty reliable. On the\nconverse, however, k-mer identification is very brittle with respect\nto evolutionary divergence, so if you don't get a match it may only\nmean that the specific species or genus you're searching for isn't in\nthe database.\n\n### Using `sourmash lca` to do taxonomic analysis\n\nThe `sourmash lca` module supports taxonomic classification using\nsingle hashes, corresponding to single k-mers, in an approach inspired\nby Kraken. Briefly, you first build an LCA database using `lca index`,\nwhich takes a taxonomy spreadsheet and a collection of sketches.  Then,\nyou can use `lca classify` to classify single-genome sketches or \n`lca summarize` to classify metagenomes.\n\nThe `lca` approach is not published anywhere, but we're happy to discuss\nit in more detail; just [post to the issue tracker](https://github.com/sourmash-bio/sourmash/issues).\n\nWhile we do not recommend the `lca` approach for general taxonomic\nclassification purposes (see below!), it remains useful for certain\nkinds of diagnostic evaluation of sequences, so we are leaving the\nfunctionality in sourmash.\n\n### `sourmash tax` vs `sourmash lca`\n\nWhy do we recommend using the `tax` module over `lca`? `sourmash lca`\nwas the first implementation in sourmash, and over the years we've\nfound that it is prone to false positives: that is, individual k-mers\nare very sensitive but are often misassigned to higher taxonomic ranks\nthan they need to be, either because of contamination in the reference\ndatabase or because the taxonomy is not based directly on genome\nsimilarity.  Instead of using single k-mers, `sourmash gather` estimates\nthe best matching genome based on combinations of k-mers, which is much\nmore specific than the LCA approach; only then is a taxonomy assigned\nusing `sourmash tax`.\n\nThe bottom line is that in our experience, `sourmash tax` is as\nsensitive as `lca`, and a lot more specific. Please let us know if you\ndiscover differently!\n\n## Abundance weighting\n\nBy default, sourmash tracks k-mer presence, *not* their abundance. The\nproportions and fractions reported also ignore abundance. So, if\n`sourmash gather` reports that a genome is 5% of a metagenome, it is\nreporting Jaccard containment of that genome in the metagenome, and it\nis ignoring information like the number of reads in the metagenome\nthat come from that genome.  Similarly, when `sourmash compare`\ncompares genome or metagenome signatures, it's reporting Jaccard\nsimilarity *without* abundance.\n\nHowever, it is possible to take into account abundance information by\ncomputing signatures with `-p abund`. The abundance\ninformation will be used if it's present in the signature, and it can\nbe ignored with `--ignore-abundance` in any signature comparison.\n\nThere are two ways that abundance weighting can be used. One is in\ncontainment queries for metagenomes, e.g. with `sourmash\ngather`, and the other is in comparisons of abundance-weighted signatures,\ne.g. with `sourmash search` and `sourmash compare`.  Below, we refer to the\nfirst as \"abundance projection\" and the second as \"angular similarity\".\n\n### Projecting abundances in `sourmash gather`:\n\n`sourmash gather` can report approximate abundance information for\ncontainment queries against genome databases.  This will give you\nnumbers that (approximately) match what you get from counting the coverage\nof each contig by mapping reads.\n\nIf you create your query signature with `-p abund`,\n`sourmash gather` will use the resulting k-mer multiplicity information\nto calculate an abundance-weighted result, weighting\neach hash value match by the multiplicity of the hash value in\nthe query signature.  You can turn off this behavior with\n`--ignore-abundance`.  The abundance is reported as column `avg_abund`\nin the console output, and columns `average_abund`, `median_abund`, and\n`std_abund` in the CSV output.\n\nFor example, if you have a metagenome composed of two equal sized genomes\nA and B, with A present at 10 times the abundance of B, `gather` on\nabundance-weighted signatures will report that approximately 91% of the\nmetagenome is A and approximately 9% is B. (If you use `--ignore-abundance`,\nthen `gather` will report approximately 50:50, since the genomes are equal\nsized.)\n\nYou can also get count-like information from the CSV output of `sourmash\ngather`; the column `median_abund` contains the median abundance of the k-mers\nin the match to the given genome.\n\nPlease see Appendix B, below, for some actual numbers and output.\n\n**Buyer beware:** There are substantial challenges in doing this kind\nof analysis on real metagenomic samples, relating to genome representation\nand strain overlap; see [this issue](https://github.com/sourmash-bio/sourmash/issues/461) for a discussion.\n\n### Computing signature similarity with angular similarity.\n\nIf signatures that have abundance information are compared with\n`sourmash search` or `sourmash compare`, the default comparison is\ndone with\n[angular similarity](https://en.wikipedia.org/wiki/Cosine_similarity#Angular_distance_and_similarity). This\nis a distance metric based on cosine similarity, and it is suitable\nfor use in clustering.\n\nFor more information on the value of this kind of comparison for\nmetagenomics, please see the simka paper,\n[Multiple comparative metagenomics using multiset k-mer counting](https://peerj.com/articles/cs-94/),\nBenoit et al., 2016.\n\n**Implementation note:** Angular similarity searches cannot be done on\nSBT or LCA databases currently; you have to provide collections of\nsignature files or zip file collections to `sourmash search` and\n`sourmash compare`.  sourmash will provide a warning if you run\n`sourmash search` on an LCA or SBT with an abundance-weighted query,\nand automatically apply `--ignore-abundance`.\n\n### Estimating ANI from FracMinHash comparisons.\n\nAs of v4.4, `sourmash` can estimate Average Nucleotide Identity (ANI)\nbetween two FracMinHash (\"scaled\") sketches. `sourmash compare` can now\nproduce a matrix of ANI values estimated from Jaccard, Containment,\nor Max Containment by specifying `--ani` (optionally along with search type,\ne.g. `--containment`). `sourmash search`, `sourmash prefetch`, and\n`sourmash gather` will now output ANI estimates to output CSVs.\n\nNote that while ANI can be estimated from either the Jaccard Index or\nthe Containment Index, ANI from Containment is preferable (more accurate).\nFor `sourmash search`, `sourmash prefetch`, and `sourmash gather`, you can\noptionally return confidence intervals around containment-derived ANI estimates,\nwhich take into account the impact of the scaling factor (via `--estimate-ani-ci`).\n\nFor details on ANI estimation, please see the paper [\"Deriving confidence intervals for mutation rates across a wide range of evolutionary distances using FracMinHash\"](https://pubmed.ncbi.nlm.nih.gov/37344105/), Hera et al., 2023.\n\n## What commands should I use?\n\nIt's not always easy to figure that out, we know! We're thinking about\nbetter tutorials and documentation constantly.\n\nWe suggest the following approach:\n\n* build some signatures and do some searches, to get some basic familiarity\n  with sourmash;\n\n* explore the available databases;\n\n* then ask questions [via the issue tracker](https://github.com/sourmash-bio/sourmash/issues) and we will do our best to help you out!\n\nThis helps us figure out what people are actually interested in doing, and\nany help we provide via the issue tracker will eventually be added into the\ndocumentation.\n\n## Appendix A: how `sourmash gather` works.\n\nThe sourmash gather algorithm works as follows:\n\n* find the best match in the database, based on containment;\n* subtract that match from the query;\n* repeat.\n* when the number of shared hashes between the _remaining_ query and the\n  best match drops below `threshold_bp/scaled` (or is zero), break out of\n  the loop.\n\nThe output below is the CSV output for a fictional metagenome.\n\nThe first column, `f_unique_to_query`, is the fraction of the database\nmatch that is _unique_ with respect to the original query. It will\nalways decrease as you get more matches. The sum of\n`f_unique_to_query` across all rows is what is reported in by gather\nas the fraction of query k-mers hit by the recovered matches\n(unweighted) and should never be greater than 1! This column should\nbe used in any analysis that needs to avoid double-counting matches.\n\nThe second column, `f_match_orig`, is how much of the match is in the\n_original_ query.  For this fictional metagenome, each match is\nentirely contained in the original query. This is the number you would\nget by running `sourmash search --containment <match> <metagenome>`.\n\nThe third column, `f_match`, is how much of the match is in the remaining\nquery metagenome, after all of the previous matches have been removed.\n\nThe fourth column, `f_orig_query`, is how much of the original query\nbelongs to the match. This is the number you'd get by running\n`sourmash search --containment <metagenome> <match>`.\n\n```\nf_unique_to_query      f_match_orig  f_match                f_orig_query\n0.3321964529331514     1.0           1.0                    0.3321964529331514\n0.13096862210095497    1.0           1.0                    0.13096862210095497\n0.11527967257844475    1.0           0.898936170212766      0.12824010914051842\n0.10709413369713507    1.0           1.0                    0.10709413369713507\n0.10368349249658936    1.0           0.3134020618556701     0.33083219645293316\n```\nWhere there are overlapping matches (e.g. to multiple\n*E. coli* species in a gut metagenome) the overlaps will be represented\nmultiple times in this column.\n\nA few quick notes for the algorithmic folk out there --\n\n* the key innovation for gather is that it looks for **groups** of\n  k-mers in the databases, and picks the best group (based on\n  containment). It does not treat k-mers individually.\n* because of this, gather does not saturate as databases grow in size,\n  and in fact should only become more sensitive and specific as we\n  increase database size. (Although of course it may get a lot\n  slower...)\n\n## Appendix B: sourmash gather and signatures with abundance information\n\nBelow is a discussion of a synthetic set of test cases using three\nrandomly generated (fake) genomes of the same size, with two even read\ndata set abundances of 2x each, and a third read data set with 20x.\n\n### Data set prep\n\nFirst, we make some synthetic data sets:\n\n* r1.fa with 2x coverage of genome s10\n* r2.fa with 20x coverage of genome s10.\n* r3.fa with 2x coverage of genome s11.\n\nthen we make signature s10-s11 with r1 and r3, i.e. 1:1 abundance, and\nmake signature s10x10-s11 with r2 and r3, i.e. 10:1 abundance.\n\n### A first experiment: 1:1 abundance ratio.\n\nWhen we project r1+r3, 1:1 abundance, onto s10, s11, and s12 genomes\nwith gather:\n\n```\nsourmash gather r1+r3 genome-s10.sig genome-s11.sig genome-s12.sig\n```\n\nwe get:\n\n```\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n394.0 kbp     49.6%   78.5%       1.8    genome-s10.fa.gz\n376.0 kbp     50.4%   80.0%       1.9    genome-s11.fa.gz\n```\n\n* approximately 50% of each query matching (first column, `p_query`)\n* approximately 80% of subject genome's contents being matched (this is due to the low coverage of 2 used to build queries; `p_match`)\n* approximately 2.0 coverage (third column, `avg_abund`)\n* no match to genome s12.\n\n### A second experiment: 10:1 abundance ratio.\n\nWhen we project r2+r3, 10:1 abundance, onto s10, s11, and s12 genomes\nwith gather:\n\n```\nsourmash gather r2+r3 genome-s10.sig genome-s11.sig genome-s12.sig\n```\n\nwe get:\n\n```\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n0.5 Mbp       91.0%  100.0%      14.5    tests/test-data/genome-s10.fa.gz\n376.0 kbp      9.0%   80.0%       1.9    tests/test-data/genome-s11.fa.gz\n```\n\n* approximately 91% of s10 matching\n* approximately 9% of s11 matching\n* approximately 100% of the high coverage genome being matched, with only 80% of the low coverage genome\n* approximately 2.0 coverage (third column, avg_abund) for s11, and (very) approximately 20x coverage for genome s10.\n\nThe cause of the poor approximation for genome s10 is unclear; it\ncould be due to low coverage, or small genome size, or something\nelse. More investigation is needed.\n\n## Appendix C: sourmash gather output examples\n\nBelow we show two real gather analyses done with a mock metagenome,\nSRR606249 (from\n[Shakya et al., 2014](https://pubmed.ncbi.nlm.nih.gov/23387867/)) and\nthree of the known genomes contained within it - two *Shewanella baltica*\nstrains and one *Akkermansia muciniphila* genome\n\n### sourmash gather with a query containing abundance information\n\n```\n% sourmash gather -k 31 SRR606249.trim.sig.zip podar-ref/2.fa.sig podar-ref/47.fa.sig podar-ref/63.fa.sig\n\n== This is sourmash version 4.8.5.dev0. ==\n== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n\nselecting specified query k=31\nloaded query: SRR606249... (k=31, DNA)\n--\nloaded 9 total signatures from 3 locations.\nafter selecting signatures compatible with search, 3 remain.\n\nStarting prefetch sweep across databases.\nPrefetch found 3 signatures with overlap >= 50.0 kbp.\nDoing gather to generate minimum metagenome cover.\n\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n5.2 Mbp        0.8%   99.0%      11.7    NC_011663.1 Shewanella baltica OS223...\n2.7 Mbp        0.9%  100.0%      24.5    CP001071.1 Akkermansia muciniphila A...\n5.2 Mbp        0.3%   51.0%       8.1    NC_009665.1 Shewanella baltica OS185...\nfound less than 50.0 kbp in common. => exiting\n\nfound 3 matches total;\nthe recovered matches hit 2.0% of the abundance-weighted query.\nthe recovered matches hit 2.5% of the query k-mers (unweighted).\n```\n\n### sourmash gather with the same query, *ignoring* abundances\n\n```\n% sourmash gather -k 31 SRR606249.trim.sig.zip podar-ref/2.fa.sig podar-ref/47.fa.sig podar-ref/63.fa.sig --ignore-abundance\n\n== This is sourmash version 4.8.5.dev0. ==\n== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n\nselecting specified query k=31\nloaded query: SRR606249... (k=31, DNA)\n--\nloaded 9 total signatures from 3 locations.\nafter selecting signatures compatible with search, 3 remain.\n\nStarting prefetch sweep across databases.\nPrefetch found 3 signatures with overlap >= 50.0 kbp.\nDoing gather to generate minimum metagenome cover.\n\noverlap     p_query p_match\n---------   ------- -------\n5.2 Mbp        1.2%   99.0%    NC_011663.1 Shewanella baltica OS223, complete...\n2.7 Mbp        0.6%  100.0%    CP001071.1 Akkermansia muciniphila ATCC BAA-83...\n5.2 Mbp        0.6%   51.0%    NC_009665.1 Shewanella baltica OS185, complete...\nfound less than 50.0 kbp in common. => exiting\n\nfound 3 matches total;\nthe recovered matches hit 2.5% of the query k-mers (unweighted).\n```\n\n### Notes and comparisons\n\nThere are a few interesting things to point out about the above output:\n\n* `p_match` is the same whether or not abundance information is used.\n  This is because it is the fraction of the matching genome detected in\n  the metagenome, which is inherently \"flat\". It is also reported\n  progressively: only the portions of the metagenome that have not\n  matched to any previous matches are used in `p_match`; read on for\n  details :).\n* `p_query` is different when abundance information is used. For\n  queries with abundance information, `p_query` provides a weighted\n  estimate that approximates the number of metagenome reads that would\n  map to this genome _after_ mapping reads to all previously reported\n  matches, i.e. all matches above this match.\n* When abundance information is not available or\n  not used, `p_query` is an estimate of what fraction of the remaining k-mers\n  in the metagenome match to this genome, after all previous matches\n  have been removed.\n* The `avg_abund` column only shows up when abundance information is\n  supplied. This is the k-mer coverage of the detected portion of the\n  match; it is a lower bound on the expected mapping-based coverage\n  for metagenome reads mapped to the detected portion of the match.\n* The percent of recovered matches for the abundance-weighted query\n  is the sum of the `p_query` column and estimates the total fraction\n  of metagenome reads that will map across all of the matching references.\n* The percent of recovered matches when _ignoring_ abundances is likewise\n  the sum of the (unweighted) `p_query` column and is not particularly\n  informative - it will always be low for real metagenomes, because sourmash\n  cannot match erroneous k-mers created by sequencing errors.\n* The `overlap` column is the estimated size of the overlap between the\n  (unweighted) original query metagenome and the match. It does not take\n  into account previous matches.\n\nLast but not least, something interesting is going on here with strains.\nWhile it is not highlighted in the text output of gather, there is\nsubstantial overlap between the two *Shewanella baltica* genomes. And,\nin fact, both of them are entirely (well, 99%) present in the metagenome\nif measured individually with `sourmash search --containment`.\n\nConsider a few more details:\n\n* `p_match` for the first *Shewanella* match, `NC_011663.1`, is 99%!\n* `p_match` for the second *Shewanella* match, `NC_009665.1`, is only 50%!\n* and, confusingly, the `overlap` for both matches is 5.2 Mbp!\n\nWhat's up?!\n\nWhat's happening here is that `sourmash gather` is subtracting the match\nto the first *Shewanella* genome from the metagenome before moving on to\nthe next result, and `p_match` reports only the amount of the match\ndetected in the _remaining_ metagenome after that subtraction.\nHowever, `overlap` is reported as the amount of overlap with the\n_original_ metagenome, which is essentially the entire genome in all\nthree cases.\n\nThe main things to keep in mind for gather are this:\n\n* `p_query` and `p_match` do not double-count k-mers or matches; in particular, you can sum across `p_query` for a metagenome without\n  counting anything more than once.\n* `overlap` _does_ count matches redundantly.\n* the percent of recovered matches is a useful summary of the whole\n  metagenome!\n\nWe know it's confusing but it's the best output we've been able to\nfigure out across all of the different use cases for gather.  Perhaps\nin the future we'll find a better way to represent all of these\nnumbers in a more clear, concise, and interpretable way; in the\nmeantime, we welcome your questions and comments!\n\n## Appendix D: Gather CSV output columns\n\nNote that order of columns is not guaranteed and may change between versions.\n\n| `Gather` column header                | Type          | Description |\n| :------------------------------: | :-------------: | :----------- |\n| `unique_intersect_bp`          | integer       | Size of overlap between match and _remaining_ query, estimated by multiplying the number of overlapping hashes by scaled. Rank/order dependent. Does not double count hashes. |\n| `intersect_bp`                 | integer       | Size of overlap between match and query, estimated by multiplying the number of overlapping hashes by scaled. Independent of rank order and will often double-count hashes. |\n| `f_orig_query`                 | float         | The fraction of the original query represented by this match. Approximates the fraction of metagenomic reads that will map to this genome. |\n| `f_match`                      | float         | The containment of the match in the query after previous matches have been removed from the query. |\n| `f_unique_to_query`            | float         | The fraction of matching hashes (unweighted) that are unique to this match; rank dependent. Will sum to the fraction of total k-mers (unweighted) that were identified. |\n| `f_unique_weighted`            | float         | The fraction of matching hashes (weighted by multiplicity) that are unique to this match. This will sum (across the rows) to the fraction of total _weighted_ k-mers that were identified. Approximates the fraction of metagenomic reads that will map to this genome _after_ all previous matches at lower (earlier) ranks are mapped. |\n| `average_abund`                | float         | Mean abundance of the weighted hashes unique to the intersection. Empty if query does not have abundance. Rank dependent, does not double count. |\n| `median_abund`                 | integer       | Median abundance of the weighted hashes unique to the intersection. Empty if query has no abundance. Rank dependent, does not double count. |\n| `std_abund`                    | float         | Std deviation of the abundance of the hashes unique to the intersection. Empty if query has no abundance. Rank dependent, does not double count. |\n| `filename`                     | string        | Filename/location of the database from which the match was loaded. |\n| `name`                         | string        | Full sketch name of the match. |\n| `md5`                          | string        | Full md5sum of the match sketch. |\n| `f_match_orig`                 | float         | The fraction of the match in the full query. Rank independent. |\n| `gather_result_rank`           | float         | Rank of this match in the results. |\n| `remaining_bp`                 | integer       | How many bp remain in the query after subtracting this match, estimated by multiplying remaining hashes by scaled. Starts at `query_n_hashes`. Unweighted. See `sum_weighted_found` for the related weighted value. |\n| `query_filename`               | string        | The filename from which the query was loaded. |\n| `query_name`                   | string        | The query sketch name. |\n| `query_md5`                    | string        | Truncated md5sum of the query sketch. |\n| `query_bp`                     | integer       | Estimated number of bp in the query, estimated by multiplying the sketch size by scaled. |\n| `ksize`                        | integer       | K-mer size for the sketches used in the comparison. |\n| `moltype`                      | string        | Molecule type of the comparison. |\n| `scaled`                       | integer       | Scaled value of the comparison. |\n| `query_n_hashes`               | integer       | Number of hashes in the query sketch. Unweighted. See `total_weighted_hashes` for weighted value. |\n| `query_abundance`              | boolean       | True if the query has abundance information; False otherwise. |\n| `query_containment_ani`        | float         | ANI estimated from the query containment in the match. |\n| `match_containment_ani`        | float         | ANI estimated from the match containment in the query. |\n| `average_containment_ani`      | float         | ANI estimated from the average of the query and match containment. |\n| `max_containment_ani`          | float         | ANI estimated from the max of the query and match containment. |\n| `potential_false_negative`     | boolean       | True if the sketch size(s) were too small to give a reliable ANI estimate. False otherwise. |\n| `n_unique_weighted_found`      | integer       | Sum of (abundance-weighted) hashes found in this rank. |\n| `sum_weighted_found`            | integer       | Sum of the hashes x abundance found thus far, i.e., running total of `n_unique_weighted_found`. The last value divided by `total_weighted_hashes` will equal the total fraction of (weighted) k-mers identified. |\n| `total_weighted_hashes`         | integer       | Sum of hashes x abundance for the entire dataset. Constant value. |\n\n## Appendix E: Prefetch CSV output columns\n\nNote that order of columns is not guaranteed and may change between versions.\n\n| `Prefetch` column header                   | Type          | Description |\n| :----------------------------: | :-------------: | :----------- |\n| `intersect_bp`               | integer       | Size of overlap between match and original query, estimated by multiplying the number of overlapping hashes by `scaled`. |\n| `jaccard`                    | float         | Jaccard similarity of the two sketches. |\n| `max_containment`            | float         | Max of `f_query_match` and `f_match_query`. |\n| `f_query_match`              | float         | The fraction of the query contained by the match. |\n| `f_match_query`              | float         | The fraction of the match contained by the query. |\n| `match_filename`             | string        | Filename the match sketch was loaded from. |\n| `match_name`                 | string        | Full name of the match sketch. |\n| `match_md5`                  | string        | Truncated md5sum of match sketch (8 char). |\n| `match_bp`                   | integer       | Size of match, estimated by multiplying the sketch size by scaled. |\n| `query_filename`             | string        | Filename the query sketch was loaded from. |\n| `query_name`                 | string        | Full name of the query sketch. |\n| `query_md5`                  | string        | Truncated md5sum of query sketch (8 char). |\n| `query_bp`                   | integer       | Size of query, estimated by multiplying the sketch size by scaled. |\n| `ksize`                      | integer       | K-mer size for the sketches used in the comparison. |\n| `moltype`                    | string        | Molecule type of the sketches. |\n| `scaled`                     | integer       | Scaled value at which the comparison was done. |\n| `query_n_hashes`             | integer       | Number of hashes in the query. |\n| `query_abundance`            | integer       | Median hash abundance in the sketch, if available. |\n| `query_containment_ani`      | float         | ANI estimated from the query containment in the match. |\n| `match_containment_ani`      | float         | ANI estimated from the match containment in the query. |\n| `average_containment_ani`    | float         | ANI estimated from the average of the query and match containment. |\n| `max_containment_ani`        | float         | ANI estimated from the max containment between query/match. |\n| `potential_false_negative`   | boolean       | True if the sketch size(s) were too small to give a reliable ANI estimate. False if ANI estimate is reliable. |\n"
  },
  {
    "path": "doc/command-line.md",
    "content": "# Using sourmash from the command line\n\n```{contents} Contents\n:depth: 3\n```\n\nFrom the command line, sourmash can be used to create\n[FracMinHash sketches][0] from DNA and protein sequences, compare them\nto each other, and plot the results; these sketches are saved into\n\"signature files\".  These signatures allow you to estimate sequence\nsimilarity and containment quickly and accurately in large\ncollections, among other capabilities.\n\nsourmash also provides a suite of metagenome functionality.  This\nincludes genome search in metagenomes, metagenome decomposition into a\nlist of genomes from a database, and taxonomic classification\nfunctionality.\n\nThe sourmash team provides a collection of prepared\n[databases](databases.md) for GTDB and GenBank. There is an\nincreasingly large ecosystem of plugins that support\n[high-performance search and sketching](https://github.com/sourmash-bio/sourmash_plugin_branchwater),\n[more advanced plotting capabilities](https://github.com/sourmash-bio/sourmash_plugin_betterplot/),\nand\n[streaming sketching of large collections of genomes](https://github.com/sourmash-bio/sourmash_plugin_directsketch).\n\nPlease see the [mash software][1] and the\n[mash paper (Ondov et al., 2016)][2] for background information on\nhow and why MinHash sketches work. The [FracMinHash preprint (Irber et al,\n2022)](https://www.biorxiv.org/content/10.1101/2022.01.11.475838) describes\nFracMinHash sketches as well as the metagenome-focused features of sourmash.\n\nsourmash uses a subcommand syntax, so all commands start with\n`sourmash` followed by a subcommand specifying the action to be\ntaken.\n\n## An example\n\nDownload three bacterial genomes from NCBI:\n```\ncurl -L -O https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/017/325/GCF_000017325.1_ASM1732v1/GCF_000017325.1_ASM1732v1_genomic.fna.gz\ncurl -L -O https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/021/665/GCF_000021665.1_ASM2166v1/GCF_000021665.1_ASM2166v1_genomic.fna.gz\ncurl -L -O https://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/Escherichia_coli/reference/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_genomic.fna.gz\n```\nCompute sourmash signatures for them all:\n```\nsourmash sketch dna -p k=31 *.fna.gz\n```\nThis will produce three `.sig` files containing MinHash signatures using a k-mer size of 31.\n\nNext, compare all the signatures to each other:\n```\nsourmash compare *.sig -o cmp.dist\n```\n\nFinally, plot a dendrogram:\n```\nsourmash plot cmp.dist --labels\n```\nThis will output three files, `cmp.dist.dendro.png`,\n`cmp.dist.matrix.png`, and `cmp.dist.hist.png`, containing a\nclustering & dendrogram of the sequences, a similarity matrix and\nheatmap, and a histogram of the pairwise similarities between the three\ngenomes.\n\nMatrix:\n\n![Matrix](_static/cmp.matrix.png)\n\nHere, the two genomes that cluster together are strains of the same\nspecies, while the third is from a completely different genus.\n\n## The `sourmash` command and its subcommands\n\nTo get a list of subcommands, run `sourmash` without any arguments.\n\nPlease use the command line option `--help` to get more detailed usage\ninformation for each command.\n\nAll signature saving commands can save to a variety of formats (we\nsuggest `.zip` files) and all signature loading commands can load\nsignatures from any of these formats.\n\nThere are seven main subcommands: `sketch`, `compare`, `plot`,\n`search`, `gather`, `index`, and `prefetch`.  See\n[the tutorial](tutorials.md) for a walkthrough of these commands.\n\n* `sketch` creates signatures.\n* `compare` compares signatures and builds a similarity matrix.\n* `plot` plots similarity matrices created by `compare`.\n* `search` finds matches to a query signature in a collection of signatures.\n* `gather` finds the best reference genomes for a metagenome, using the provided collection of signatures.\n* `index` builds fast indexes for searching many (thousands to millions) of signatures.\n* `prefetch` selects signatures of interest from a very large collection of signatures, for later processing.\n\nThere are also a number of commands that work with taxonomic\ninformation; these are grouped under the `sourmash tax` and\n`sourmash lca` subcommands.\n\n`sourmash tax` commands:\n\n* `tax metagenome` - summarize metagenome gather results at each taxonomic rank.\n* `tax genome`     - summarize single-genome gather results and report most likely classification.\n* `tax annotate`   - annotate gather results with lineage information (no summarization or classification).\n* `tax prepare`    - prepare and/or combine taxonomy files.\n* `tax grep` - subset taxonomies and create picklists based on taxonomy string matches.\n* `tax summarize` - print summary information (counts of lineages) for a taxonomy lineages file or database.\n\n`sourmash lca` commands:\n\n```{attention}\n\nWe do not recommend using the `lca` subcommands for taxonomic analysis\nany more; please use `sourmash tax` instead. See\n[taxonomic profiling with sourmash](classifying-signatures.md#taxonomic-profiling-with-sourmash)\nfor more information.\n```\n\n* `lca classify` classifies many signatures against an LCA database.\n* `lca summarize` summarizes the content of metagenomes using an LCA database.\n* `lca index` creates a database for use with LCA subcommands.\n* `lca rankinfo` summarizes the content of a database.\n* `lca compare_csv` compares lineage spreadsheets, e.g. those output by `lca classify`.\n\nSee [the LCA tutorial](tutorials-lca.md) for a\nwalkthrough of some of these commands.\n\nFinally, there are a number of utility and information commands:\n\n* `info` shows version and software information.\n* `sbt_combine` combines multiple SBT indexes.\n* `categorize` is an experimental command to categorize many signatures.\n* `watch` is an experimental command to classify a stream of sequencing data.\n* `multigather` is an experimental command to run multiple gathers against the same collection of databases.\n\nPlease use the command line option `--help` to get more detailed usage\ninformation for each command.\n\n### `sourmash sketch` - make sourmash signatures from sequence data\n\nMost of the commands in sourmash work with **signatures**, which contain information about genomic or proteomic sequences. Each signature contains one or more **sketches**, which are compressed versions of these sequences. Using sourmash, you can search, compare, and analyze these sequences in various ways.\n\nTo create a signature with one or more sketches, you use the `sourmash sketch` command. There are four main commands:\n\n```\nsourmash sketch dna\nsourmash sketch protein\nsourmash sketch translate\nsourmash sketch fromfile\n```\n\nThe `sketch dna` command reads in **DNA sequences** and outputs **DNA sketches**.\n\nThe `sketch protein` command reads in **protein sequences** and outputs **protein sketches**.\n\nThe `sketch translate` command reads in **DNA sequences**, translates them in all six frames, and outputs **protein sketches**.\n\nThe `sketch fromfile` command takes in a CSV file containing the\nlocations of genomes and proteomes, and outputs all of the requested\nsketches. It is primarily intended for large-scale database construction.\n(`fromfile` is a new command as of sourmash v4.4.0.)\n\nAll of the `sourmash sketch` commands take FASTA or FASTQ sequences as\ninput; input data can be uncompressed, compressed with gzip, or\ncompressed with bzip2. The output will be one or more signature files\nthat can be used by other sourmash commands.\n\nPlease see\n[the `sourmash sketch` documentation page](sourmash-sketch.md) for\ndetails on `sketch`, and see\n[Using sourmash: a practical guide](using-sourmash-a-guide.md) for\nmore information on creating signatures.\n\n### `sourmash compute` - make sourmash signatures from sequence data\n\n**Note: `sourmash compute` is deprecated in sourmash 4.0 and will be removed in\nsourmash 5.0; please switch to using `sourmash sketch`, above.**\n\nThe `compute` subcommand computes and saves signatures for\neach sequence in one or more sequence files.  It takes as input FASTA\nor FASTQ files, and these files can be uncompressed or compressed with\ngzip or bzip2.  The output will be one or more JSON signature files\nthat can be used with `sourmash compare`.\n\nPlease see [Using sourmash: a practical guide](using-sourmash-a-guide.md)\nfor more information on computing signatures.\n\n______\n\nUsage:\n```\nsourmash compute <filename> [<filename2> ... ]\n```\nOptional arguments:\n```\n--ksizes K1[,K2,K3] -- one or more k-mer sizes to use; default is 31\n--force -- recompute existing signatures; convert non-DNA characters to N\n--output -- save all the signatures to this file; can be '-' for stdout.\n--track-abundance -- compute and save k-mer abundances.\n--name-from-first -- name the signature based on the first sequence in the file\n--singleton -- instead of computing a single signature for each input file,\n               compute one for each sequence\n--merged <name> -- compute a single signature for all of the input files,\n                   naming it <name>\n```\n### `sourmash compare` - compare many signatures\n\n**Note:** As of 2025, we have a much faster implementation of `compare` called `multisearch` available in [the branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater). It is multithreaded and much more memory efficient than `compare`, although it does accept a slightly more restricted set of inputs.\n\nThe `compare` subcommand compares one or more signatures\n(created with `sketch`) using estimated [Jaccard index][3] or\n(if signatures are created with `-p abund`) the [angular\nsimilarity](https://en.wikipedia.org/wiki/Cosine_similarity#Angular_distance_and_similarity).  Jaccard is most appropriate for genome comparisons, while\nangular similarity has been used for comparing metagenomes (e.g. see [simka](https://github.com/GATB/simka)). Use `--ignore-abundance` to force Jaccard.\n\nThe default output of `compare` is a text display of a similarity\nmatrix where each entry `[i, j]` contains the estimated Jaccard index\nbetween input signature `i` and input signature `j`.  The output\nmatrix can be saved to a numpy binary file with `--output\n<outfile.mat>` and used with the `sourmash plot` subcommand (or loaded\nwith `numpy.load(...)`.  Using `--csv <outfile.csv>` will output a CSV\nfile that can be loaded into other languages than Python, such as R.\n\nAs of sourmash 4.4.0, `compare` also supports Average Nucleotide\nIdentity (ANI) estimates instead of Jaccard or containment index; use\n`--ani` to enable this.\n\nUsage:\n```\nsourmash compare <sourmash sketches> [ <sourmash sketches> ... ]\n```\n\nOptions:\n\n* `--output <filename>` -- save the output matrix to this file, as a numpy binary matrix.\n* `--distance-matrix` -- create and output a distance matrix, instead of a similarity matrix.\n* `--ksize <k>` -- select sketches at this k-mer size\n* `--containment` -- calculate containment instead of similarity; `C(i, j) = size(i intersection j) / size(i)`\n* `--ani` -- output estimates of Average Nucleotide Identity (ANI) instead of Jaccard similarity or containment.\n* `--from-file <filelist.txt>` -- append the list of files in this text file to the input signatures.\n* `--ignore-abundance` -- ignore abundances in signatures and calculate Jaccard instead of angular similarity.\n* `--picklist <pickfile>:<colname>:<coltype>` -- select a subset of signatures with [a picklist](#using-picklists-to-subset-large-collections-of-signatures)\n* `--csv <outfile.csv>` -- save the output matrix in CSV format.\n* `--labels-to <labels.csv>` -- create a CSV file (spreadsheet) that can be passed in to `sourmash plot` with `--labels-from` in order to customize the labels.\n\n**Note:** compare by default produces a symmetric similarity matrix\nthat can be used for clustering in downstream tasks. With `--containment`,\nhowever, this matrix is no longer symmetric and cannot formally be\nused for clustering (although `sourmash plot` will still cluster it).\n\nThe containment matrix is organized such that the value in row A for column B is the containment of the B'th sketch in the A'th sketch, i.e.\n\n```\nC(A, B) = B.contained_by(A)\n```\n\n**Note:** The ANI estimate will be calculated based on Jaccard similarity\nby default; however, if `--containment`, `--max-containment`, or `--avg-containment` is\nspecified, those values will be used instead. With `--containment --ani`, the\nANI output matrix will be asymmetric as discussed above.\n\n### `sourmash plot` - cluster and visualize comparisons of many signatures\n\n**Note:** The [betterplot plugin](https://github.com/sourmash-bio/sourmash_plugin_betterplot/) provides a wide array of improved visualization options, including MDS and tSNE plots, as well as more customizable version of `plot`. Please take a look!\n\nThe `plot` subcommand produces two plots -- a dendrogram and a\ndendrogram+matrix -- from a matrix created by `sourmash compare\n--output <matrix>`.  The default output is two PNG files.\n\nUsage:\n```\nsourmash plot <matrix_file>\n```\n\nOptions:\n* `--pdf` -- output PDF files. (defaults to PNG)\n* `--labels` -- display the signature names on the plot (default)\n* `--indices` -- turn on index display on the plot.\n* `--vmax` -- maximum value (default 1.0) for heatmap.\n* `--vmin` -- minimum value (default 0.0) for heatmap.\n* `--subsample=<N>` -- plot a maximum of <N> samples, randomly chosen.\n* `--subsample-seed=<seed>` -- seed for pseudorandom number generator.\n\nExample command lines for label and index display -\n\n* `--indices` will show only numbers;\n* `--no-labels --no-indices` will remove all labels!\n\nExample output:\n\n![An E. coli comparison plot](_static/ecoli_cmp.matrix.png)\n\n### `sourmash search` - search for signatures in collections or databases\n\nThe `search` subcommand searches a collection of signatures\n(in any of the [formats supported by sourmash](#storing-and-searching-signatures))\nfor matches to a single query signature.  It can search for matches with either\nhigh [Jaccard similarity](https://en.wikipedia.org/wiki/Jaccard_index)\nor containment; the default is to use Jaccard similarity, unless\n`--containment` is specified.  `-o/--output` will create a CSV file\ncontaining all of the matches with respective similarity or containment score.\n\n`search` makes use of [indexed databases](#loading-many-signatures) to\ndecrease search time and memory where possible.\n\nUsage:\n```\nsourmash search query.sig <database1> [ <database2> ... ]\n```\n\nExample output:\n\n```\n% sourmash search tests/test-data/47.fa.sig gtdb-rs207.genomic-reps.dna.k31.zip\n\n...\n--\nloaded 65703 total signatures from 1 locations.\nafter selecting signatures compatible with search, 65703 remain.\n\n2 matches above threshold 0.080:\nsimilarity   match\n----------   -----\n 32.3%       GCF_900456975.1 Shewanella baltica strain=NCTC10735, 5088...\n 14.0%       GCF_002838165.1 Shewanella sp. Pdp11 strain=Pdp11, ASM283...\n```\n\n`search` takes a number of command line options -\n* `--containment` - find matches using the containment index rather than Jaccard similarity;\n* `--max-containment` - find matches using the max containment index rather than Jaccard similarity;\n* `-t/--threshold` - lower threshold for matching; defaults to 0.08;\n* `--best-only` - find and report only the best match;\n* `-n/--num-results` - number of matches to report to stdout; defaults to 3; 0 to report all;\n\nMatch information can be saved to a CSV file with `-o/--output`; with\n`-o`, all matches above the threshold will be saved, not just those\nprinted to stdout (which are limited to `-n/--num-results`).\n\nThe `--containment` flag calculates the containment of the query in\ndatabase matches; this is an asymmetric order-dependent measure,\nunlike Jaccard. Here, `search --containment Q A B C D` will report the\ncontainment of `Q` in each of `A`, `B`, `C`, and `D`. This is opposite\nto the order used by `prefetch`, where the composite sketch (e.g. metagenomes)\nis the query, and the matches are contained items (e.g. genomes).\n\nAs of sourmash 4.2.0, `search` supports `--picklist`, to\n[select a subset of signatures to search, based on a CSV file](#using-picklists-to-subset-large-collections-of-signatures). This\ncan be used to search only a small subset of a large collection, or to\nexclude a few signatures from a collection, without modifying the\ncollection itself.\n\nRelated commands:\n* `sourmash compare` will compare many sketches to many sketches.\n* `sourmash prefetch` is an upgraded version of `search` that returns more information in the output CSV file.\n* `sourmash scripts manysearch` from [the branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater) will search multiple sketches against a database, and outputs abundance-weighted comparisons as well.\n\n### `sourmash gather` - find metagenome members\n\n**Note:** As of 2025, we have a much faster implementation of `gather` called `fastgather` available in [the branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater). It is multithreaded and similar in memory usage, although it does accept a slightly more restricted set of inputs than `gather`.\n\nThe `gather` subcommand selects the best reference genomes to use for\na metagenome analysis, by finding the smallest set of non-overlapping\nmatches to the query metagenome in a database of genomes.  This is specifically meant for\nmetagenome and genome bin analysis.  (See\n[Classifying Signatures](classifying-signatures.md) for more\ninformation on the different approaches that can be used here.)\n\n`sourmash gather` takes exactly one query and one or more\n[collections of signatures](#storing-and-searching-signatures). Please see\n[`sourmash multigather`](#sourmash-multigather-do-gather-with-many-queries) if you have multiple queries!\n\nIf the input signature was created with `-p abund`, output\nwill be abundance weighted (unless `--ignore-abundances` is\nspecified). \n\n`-o/--output` will create a CSV file containing the\nmatches and quite a bit more information; see [the CSV output file documentation for gather](classifying-signatures.md#appendix-d-gather-csv-output-columns) for details of the output columns.\n\n`gather`, like `search`, works with any of the\n[signature collection formats supported by sourmash](#storing-and-searching-signatures)\nand will make use of [indexed databases](#loading-many-signatures) to\ndecrease search time and memory where possible. We recommend using RocksDB indexes if you are running gather regularly!\n\nUsage:\n```\nsourmash gather query.sig <database1> [ <database2> ... ]\n```\n\nExample output:\n```\noverlap     p_query p_match \n---------   ------- --------\n1.4 Mbp      11.0%   58.0%      JANA01000001.1 Fusobacterium sp. OBRC...\n1.0 Mbp       7.7%   25.9%      CP001957.1 Haloferax volcanii DS2 pla...\n0.9 Mbp       7.4%   11.8%      BA000019.2 Nostoc sp. PCC 7120 DNA, c...\n0.7 Mbp       5.9%   23.0%      FOVK01000036.1 Proteiniclasticum rumi...\n0.7 Mbp       5.3%   17.6%      AE017285.1 Desulfovibrio vulgaris sub...\n...\nfound less than 50.0 kbp in common. => exiting\n\nfound 64 matches total;\nthe recovered matches hit 94.0% of the abundance-weighted query.\nthe recovered matches hit 45.6% of the query k-mers (unweighted).\n```\n\nFor each match,\n* 'overlap', the first column, is the estimated number of base pairs shared between the match and the query, based on the number of shared hashes.\n* 'p_query' is the _percentage_ of the query that overlaps with the match; it is the amount of the metagenome \"explained\" by this match. It is typically a lower bound on the percent of metagenomes reads that will map to this genome.\n* 'p_match' is the percentage of the _match_ that overlaps with the query; it is the \"detection\" of the match in the metagenome. It is typically a lower bound on the number of base pairs that will be covered by read mapping.\n\nQuite a bit more information per match row is available in the CSV\noutput saved with `-o`; for details, see\n[Classifying signatures: how sourmash gather works](classifying-signatures.md#appendix-a-how-sourmash-gather-works).\n\nThe \"recovered matches\" lines detail how much of the query is\nexplained by the entire collection of matches. You will get two numbers if\nyour metagenome sketch has been calculated with `-p abund`, and only\none if it does not have abundances. The abundance-weighted\nnumber should approximate the fraction of metagenome reads that will\nmap to at least one reference genome, while the unweighted number\ndescribes how much of the metagenome itself matches to genomes.\nHere's another way to put it: if the metagenome could be perfectly\nassembled into contigs, the unweighted number would approximate the\nnumber of bases from the contigs that would match perfectly to at\nleast one genome in the reference database.  More practically,\nthe abundance-weighted number is less sensitive to sequencing errors.\nSee [classifying signatures](classifying-signatures.md#abundance-weighting) or [the FAQ](faq.md) for more information!\n\nThe command line option `--threshold-bp` sets the threshold below\nwhich matches are no longer reported; by default, this is set to\n50kb. See the Appendix in\n[Classifying Signatures](classifying-signatures.md) for details.\n\nAs of sourmash 4.2.0, `gather` supports `--picklist`, to\n[select a subset of signatures based on a CSV file](#using-picklists-to-subset-large-collections-of-signatures). This\ncan be used to search only a small subset of a large collection, or to\nexclude a few signatures from a collection, without modifying the\ncollection itself.\n\nNote:\n\nUse `sourmash gather` to analyze a metagenome against a collection of\ngenomes.  Then use `sourmash tax metagenome` to integrate that collection\nof genomes with taxonomic information.\n\n#### Alternative search mode for low-memory (but slow) search: `--linear`\n\nBy default, `sourmash gather` uses all information available for\nfaster search. In particular, for SBTs, `prefetch` will prune the search\ntree.  This can be slow and/or memory intensive for very large databases,\nand `--linear` asks `sourmash prefetch` to instead use a linear search\nacross all leaf nodes in the tree.\n\nThe results are the same whether `--no-linear` or `--linear` is\nused.\n\n#### Alternative search mode: `--no-prefetch`\n\nBy default, `sourmash gather` does a \"prefetch\" to find *all* candidate\nsignatures across all databases, before removing overlaps between the\ncandidates. In rare circumstances, depending on the databases and parameters\nused, this may be slower or more memory intensive than doing iterative\noverlap removal. Prefetch behavior can be turned off with `--no-prefetch`.\n\nThe results are the same whether `--prefetch` or `--no-prefetch` is\nused.  This option can be used with or without `--linear` (although\n`--no-prefetch --linear` will generally be MUCH slower).\n\n### `sourmash index` - build an index of signatures\n\nThe `sourmash index` command creates indexed databases from a\ncollection of signatures. This can be used to create databases from\nprivate collections of genomes or metagenomes, and can also be used to create\ndatabases for e.g. subsets of GenBank.\n\nAs of sourmash v4.9.0, there are two types of indexed databases\nsupported by sourmash: RocksDB-based inverted indexes, and Sequence\nBloom Trees (SBTs). RocksDB indexes are a newer form of fast and\nlow-memory on-disk indexes that work at massive scale, while SBTs are older\nindexes that we support for legacy reasons.\n\nAll signatures in an index must be of compatible types (i.e. the same\nk-mer size, scaled, and molecule type). You can specify the usual\ncommand line selectors (`-k`, `--scaled`, `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`, etc.)\nto pick out the types of signatures to include when running `index`.\n\nUsage:\n```\nsourmash index <database_name>.rocksdb <inputfile1> [ <inputfile2> ... ] -F rocksdb\n```\n\nThis will create a `database.rocksdb` file containing the\nsketches.\n\nNote that you can use `--from-file` to pass `index` a text file\ncontaining a list of file names to index; you can also provide individual\nsignature files, directories full of signatures, or other sourmash\ndatabases.\n\nAs of sourmash 4.2.0, `index` supports `--picklist`, to\n[select a subset of signatures based on a CSV file](#using-picklists-to-subset-large-collections-of-signatures). This\ncan be used to index a subset of a large collection, or to\nexclude a few signatures from an index being built from a large collection.\n\nNote: until sourmash v5, the default index type is \"SBT\"; this is to\nensure backwards compatibility of the command line API for semantic\nversioning. We no longer recommend SBTs. Also note that a third index\ntype, 'zip', is supported by the command line, but this should be used\nsolely for testing purposes - it is identical in format to a zipped\ndatabase output by e.g. `sig cat`, but restricted to the same\nksize/moltype/scaled.\n\n### `sourmash prefetch` - select subsets of very large databases for more processing\n\nThe `prefetch` subcommand searches a scaled signature (usually a genome or a metagenome)\nfor matches in a large database of genomes, using containment. It is similar to\n`search --containment`, while taking a `--threshold-bp` argument like\n`gather` does for thresholding matches (instead of using Jaccard\nsimilarity or containment). Note that `prefetch` uses the composite\nsketch (e.g. a metagenome) as the query, and finds all matching\nsubjects (e.g. genomes) from the database - the arguments are in the\nopposite order from `search --containment`.\n\nNote that the `manysearch` command in\n[the branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater)\nis a fast, multithreaded version of `prefetch` that will search for\nmultiple genomes in multiple metagenomes.\n\n`sourmash prefetch` is intended to select a subset of a large database\nfor further processing. As such, it can search very large collections\nof signatures (potentially millions or more), operates in very low\nmemory (see `--linear` option, below), and does no post-processing of signatures.\n\n`prefetch` has four main output options, which can all be used individually\nor together:\n* `-o/--output` produces a CSV summary file; see [the CSV output file documentation for prefetch](classifying-signatures.md#appendix-e-prefetch-csv-output-columns) for details of the output columns.\n* `--save-matches` saves all matching signatures;\n* `-save-matching-hashes` saves a single signature containing all of the hashes that matched any signature in the database at or above the specified threshold;\n* `--save-unmatched-hashes` saves a single signature containing the complement of `--save-matching-hashes`.\n\nOther options include:\n* the usual `-k/--ksize` and `--dna/--protein/--dayhoff/--hp/--skipm1n3/--skipm2n3` signature selectors;\n* `--threshold-bp` to require a minimum estimated bp overlap for output;\n* `--scaled` for downsampling;\n* `--force` to continue past survivable errors;\n* `--picklist` will select a subset of signatures to search, using [a picklist](#using-picklists-to-subset-large-collections-of-signatures)\n\n#### Alternative search mode for low-memory (but slow) search: `--linear`\n\nBy default, `sourmash prefetch` uses all information available for\nfaster search. In particular, for SBTs, `prefetch` will prune the search\ntree.  This can be slow and/or memory intensive for very large databases,\nand `--linear` asks `sourmash prefetch` to instead use a linear search\nacross all leaf nodes in the tree.\n\n#### Caveats and comments\n\n`sourmash prefetch` provides no guarantees on output order. It runs in\n\"streaming mode\" on its inputs, in that each input file is loaded,\nsearched, and then unloaded.  And `sourmash prefetch` can be run\nseparately on multiple databases, after which the results can be\nsearched in combination with `search`, `gather`, `compare`, etc.\n\nA motivating use case for `sourmash prefetch` is to run it on multiple\nlarge databases with a metagenome query using `--threshold-bp=0`,\n`--save-matching-hashes matching-hashes.sig`, and `--save-matches\ndb-matches.sig`, and then run `sourmash gather matching-hashes.sig\ndb-matches.sig`. \n\nThis combination of commands ensures that the more time- and\nmemory-intensive `gather` step is run only on a small set of relevant\nsignatures, rather than all the signatures in the database.\n\n### `sourmash multigather` - do gather with many queries\n\n**Note:** As of 2025, we have a much faster implementation of `multigather` called `fastmultigather` available in [the branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater). It is multithreaded and similar in memory usage, although it does accept a slightly more restricted set of inputs than `multigather`.\n\nThe `multigather` subcommand runs `sourmash gather` on multiple\nqueries.  (See\n[`sourmash gather` docs](#sourmash-gather-find-metagenome-members) for\nspecifics on what gather does, and how!)\n\nUsage:\n```\nsourmash multigather --query <queries ...> --db <collections>\n```\n\nNote that multigather is single threaded, so it offers no substantial\nefficiency gains over just running gather multiple times!  Nonetheless, it\nis useful for situations where you have many sketches organized in a\ncombined file, e.g. sketches built with `sourmash sketch\n... --singleton`).\n\n#### `multigather` output files\n\nmultigather produces three output files for each\nquery:\n\n* `<output_base>.csv` - gather CSV output\n* `<output_base>.matches.sig` - all matching outputs\n* `<output_base>.unassigned.sig` - all remaining unassigned hashes\n\nAs of sourmash v4.8.7, `<output_base>` is set as follows:\n* the filename attribute of the query sketch, if it is not empty or `-`;\n* the query sketch md5sum, if the query filename is empty or `-`;\n* the query filename + the query sketch md5sum\n  (`<query_file>.<md5sum>`), if `-U/--output-add-query-md5sum` is\n  specified;\n\nBy default, `multigather` will complain and exit with an error if\nthe same `<output_base>` is used repeatedly and an output file is\ngoing to be overwritten.  With `-U/--output-add-query-md5sum` this\nshould only happen when identical sketches are present in a query\ndatabase. Use `--force-allow-overwrite-output`\nto allow overwriting of output files without an error.\n\n## `sourmash tax` subcommands for integrating taxonomic information into gather results\n\nThe `sourmash tax` subcommands support taxonomic analysis of genomes\nand taxonomic profiling of metagenomes.  See\n[taxonomic profiling with sourmash](classifying-signatures.md#taxonomic-profiling-with-sourmash)\nfor more information. There are a number of plotting and visualization\noptions for `tax metagenome` output available in\n[the betterplot plugin](#the-betterplot-plugin-improved-plotting-and-visualization)\nas well as\n[the taxburst fork of the Krona visualization software](https://taxburst.github.io/).\n\nThe sourmash `tax` or `taxonomy` commands integrate taxonomic\n information with the results of `sourmash gather`. All `tax` commands\n require one or more properly formatted `taxonomy` files where the\n identifiers correspond to those in the database(s) used for\n `gather`. Note that if using multiple databases, the `gather` needs\n to have been conducted against all desired databases within the same\n `gather` command (we cannot combine separate `gather` runs for the\n same query). For supported databases (e.g. GTDB, NCBI), we provide\n taxonomy csv files, but they can also be generated for user-generated\n databases. As of v4.8 and 4.8.6, respectively, some sourmash taxonomy\n commands can also use `LIN` or `ICTV` lineage information.\n\n`tax` commands rely upon the fact that `gather` provides both the total\n fraction of the query matched to each database matched, as well as a\n non-overlapping `f_unique_to_query`, which is the fraction of the query\n uniquely matched to each reference genome. The `f_unique_to_query` for\n any reference match will always be between (0% of query matched) and 1\n (100% of query matched), and for a query matched to multiple references,\n the `f_unique_to_query` will sum to at most 1 (100% of query matched).\n We use this property to aggregate gather matches at the desired\n taxonomic rank. For example, if the gather results for a metagenome\n include results for 30 different strains of a given species, we can sum\n the fraction uniquely matched to each strain to obtain the fraction\n uniquely matched to this species. Alternatively, taxonomic summarization\n can take into account abundance weighting; see\n [classifying signatures](classifying-signatures.md) for more information.\n\nAs with all reference-based analysis, results can be affected by the\n completeness of the reference database. However, summarizing taxonomic\n results from `gather` minimizes issues associated with increasing size\n and redundancy of reference databases.\n\nFor more details on how `gather` works and can be used to classify\nsignatures, see <project:classifying-signatures.md>\n\n### `sourmash tax metagenome` - summarize metagenome content from `gather` results\n\n`sourmash tax metagenome` summarizes gather results for each query\nmetagenome by taxonomic lineage.\n\nHere is an example command to summarize a single `gather csv`, where\n the query was gathered against `gtdb-rs202` representative species\ndatabase:\n\n```\nsourmash tax metagenome\n    --gather-csv HSMA33MX_gather_x_gtdbrs202_k31.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv\n```\n\nOne or more output formats can be provided with `-F/--output-format`, and\noutput will be saved to files named for each format. The possible output formats are listed below, followed by the file extension used when writing to a file rather than stdout. When using more than one output format, you must provide an output basename (`--output-base`) that will be used to name the output files. If an `--output-dir` is provided, files will output to that directory.\n\n- `human`: \".human.txt\"\n- `csv_summary`: \".summarized.csv\"\n- `lineage_summary`: \".lineage_summary.tsv\"\n- `krona`: \".krona.tsv\"\n- `kreport`: \".kreport.txt\"\n- `lingroup`: \".lingroup.tsv\"\n- `bioboxes`: \".bioboxes.profile\"\n\nIn general, `tax metagenome` should be used with gather results that\nuse abundance (e.g. sketches calculated with `-p abund`). This will\nproperly report the proportion of the metagenome data that can be\nclassified.  However, in sourmash v4, abundance reporting is\ninconsistent between formats; see the below table for a summary.\n\nAs of sourmash v4.9.4, we recommend using `--use-abund` with `tax\nmetagenome`, which will force consistent reporting of abundances, and\nwill fail when abundances are not available. `--ignore-abund` can be\nused to force ignoring abundances.  `--use-abund` will be the default\nbehavior in sourmash v5.\n\n| output format | v4 behavior | v5 default behavior | notes |\n| -------- | -------- | -------- | -- |\n| human     | abund     | abund     | default output in v5\n| csv_summary     | provides both     | provides both     | default output in v4\n| lineage_summary     | no abund     | abund     |\n| krona     | no abund    | abund     |\n| kreport     | abund | abund     |\n\n:::{warning}\n**sourmash v5 breaking change:** In sourmash v5.0 and later, the\ndefault output format will become `human`, instead of `csv_summary`.\nLikewise, `--use-abundances` will be on by default for `tax\nmetagenome`, and it will be an error to not have abundances in your\ngather output.  You can specify `--ignore-abundances` to override the\nerror.\n:::\n\nYou can specify `--v4` to keep the old behavior, or `--v5` to support\nthe new default behavior, or simply specify the desired formats and/or\nabundance flags to override the default. See\n[Migrating from sourmash v4.x to sourmash v5.x](support.md#migrating-from-sourmash-v4x-to-sourmash-v5x) for more\ndetails.\n\n#### `human` output format\n\n`human` will be the default output format in sourmash v5. This outputs a human-readable table with summarization for each leaf node. It is not intended for automated parsing.\n\nexample `human` output:\n\n```\nsample name    proportion   cANI   lineage\n-----------    ----------   ----   -------\ntest1             86.9%     -      unclassified\ntest1              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\ntest1              5.7%     92.5%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\ntest1              1.6%     89.1%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\n\n```\n\n#### `csv_summary` output format\n\n`csv_summary` is the default output format in sourmash v4. This outputs a `csv` with lineage\nsummarization for each taxonomic rank. This output currently consists of six\ncolumns, `query_name,rank,fraction,lineage,query_md5,query_filename`, where\n`fraction` is the  fraction of the query matched to the reported rank and\nlineage.\n\nexample `csv_summary` output from the command above:\n\n```\nquery_name,rank,fraction,lineage\nHSMA33MX,superkingdom,0.131,d__Bacteria\nHSMA33MX,phylum,0.073,d__Bacteria;p__Bacteroidota\nHSMA33MX,phylum,0.058,d__Bacteria;p__Proteobacteria\n.\n.\n.\nHSMA33MX,species,0.058,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;\no__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\nHSMA33MX,species,0.057,d__Bacteria;p__Bacteroidota;c__Bacteroidia;\no__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\nHSMA33MX,species,0.016,d__Bacteria;p__Bacteroidota;c__Bacteroidia;\no__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\n```\nThe `query_md5` and `query_filename` columns are omitted here for brevity.\n\nNote: When using `--lins` with a `--lingroup` file, the `csv_summary` file will report\nsummarization for each specified `lingroup`, rather than all possible `lin` ranks (v4.8.12+).\n\n#### `krona` output format\n\n`krona` format is a tab-separated list of these results at a specific rank.\n The first column, `fraction` is the fraction of the query matched to the\n reported rank and lineage. The remaining columns are `superkingdom`, `phylum`,\n ... etc down to the rank used for summarization. This output can be used\n directly for summary visualization.\n\nTo generate `krona`, we add `--output-format krona` to the command above, and\n need to specify a rank to summarize. Here's the command for reporting `krona`\n summary at `species` level:\n\n```\nsourmash tax metagenome\n    --gather-csv HSMA33MX_gather_x_gtdbrs202_k31.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv \\\n    --output-format krona --rank species\n```\n\nexample krona output from this command:\n\n```\nfraction\tsuperkingdom\tphylum\tclass\torder\tfamily\tgenus\tspecies\n0.05815279361459521\tBacteria\tProteobacteria\tGammaproteobacteria\tEnterobacterales\tEnterobacteriaceae\tEscherichia\tEscherichia coli\n0.05701254275940707\tBacteria\tBacteroidetes\tBacteroidia\tBacteroidales\tPrevotellaceae\tPrevotella\tPrevotella copri\n0.015637726014008795\tBacteria\tBacteroidetes\tBacteroidia\tBacteroidales\tBacteroidaceae\tBacteroides\tBacteroides vulgatus\n```\n\n#### `lineage_summary` output format\n\nThe lineage summary format is most useful when comparing across metagenome queries.\n Each row is a lineage at the desired reporting rank. The columns are each query\n used for gather, with the fraction match reported for each lineage. This format\n is commonly used as input for many external multi-sample visualization tools.\n\nTo generate `lineage_summary`, we add `--output-format lineage_summary` to the summarize\n command, and need to specify a rank to summarize. Here's the command for reporting\n `lineage_summary` for two queries (HSMA33MX, PSM6XBW3) summary at `species` level.\n\n```\nsourmash tax metagenome\n    --gather-csv HSMA33MX_gather_x_gtdbrs202_k31.csv \\\n    --gather-csv PSM6XBW3_gather_x_gtdbrs202_k31.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv \\\n    --output-format lineage_summary --rank species\n```\n\nexample `lineage_summary`:\n\n```\nlineage HSMA33MX   PSM6XBW3\nd__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus    0.015637726014008795    0.015642822225843248\nd__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri 0.05701254275940707     0.05703112269838684\nd__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli       0.05815279361459521     0.05817174515235457\n```\n\nTo produce multiple output types from the same command, add the types into the\n `--output-format` argument, e.g. `--output-format summary krona lineage_summary`\n\n\n#### `kreport` output format\n\nThe `kreport` output reports kraken-style `kreport` output, which may be useful for\ncomparison with other taxonomic profiling methods. While this format typically\nrecords the percent of number of reads assigned to taxa, we create ~comparable\noutput by reporting the percent of k-mers matched to each taxon and the estimated\nnumber of base pairs that these k-mers represent. To best represent the percent of all\nreads, we use k-mer abundance information in this output. To generate this properly, query\nFracMinHash sketches should be generated with abundance information (`-p abund`) to allow\nabundance-weighted `gather` results.\n\nNote: `sourmash gather` makes all assignments to genomes, and then `sourmash tax`\nintegrates taxonomy information and uses LCA-style summarization to build assignments.\nFor species-level specificity, our current recommendation is to use use our default\nk-mer size of 31.\n\nstandard `kreport` columns (read-based tools):\n- `Percent Reads Contained in Taxon`: The cumulative percentage of reads for this taxon and all descendants.\n- `Number of Reads Contained in Taxon`: The cumulative number of reads for this taxon and all descendants.\n- `Number of Reads Assigned to Taxon`: The number of reads assigned directly to this taxon (not a cumulative count of all descendants).\n- `Rank Code`: (U)nclassified, (R)oot, (D)omain, (K)ingdom, (P)hylum, (C)lass, (O)rder, (F)amily, (G)enus, or (S)pecies.\n- `NCBI Taxon ID`: Numerical ID from the NCBI taxonomy database.\n- `Scientific Name`: The scientific name of the taxon.\n\nExample reads-based `kreport` with all columns:\n\n```\n    88.41\t2138742\t193618\tK\t2\tBacteria\n    0.16\t3852\t818\tP\t201174\t  Actinobacteria\n    0.13\t3034\t0\tC\t1760\t    Actinomycetia\n    0.13\t3034\t45\tO\t85009\t      Propionibacteriales\n    0.12\t2989\t1847\tF\t31957\t        Propionibacteriaceae\n    0.05\t1142\t352\tG\t1912216\t          Cutibacterium\n    0.03\t790\t790\tS\t1747\t            Cutibacterium acnes\n```\n\nsourmash `kreport` columns:\n- `Percent [k-mers] contained in taxon`: The cumulative percentage of k-mers for this taxon and all descendants.\n- `Estimated base pairs contained in taxon`: The cumulative estimated base pairs for this taxon and all descendants.\n- `Estimated base pairs \"assigned\" (species-level)`: The estimated base pairs assigned at species-level (cumulative count of base pairs assigned to individual genomes in this species).\n- `Rank Code`: (U)nclassified, (R)oot, (D)omain, (K)ingdom, (P)hylum, (C)lass, (O)rder, (F)amily, (G)enus, or (S)pecies.\n- `NCBI Taxon ID`: Reported (v4.7+) if using NCBI taxonomy. Otherwise blank.\n- `Scientific Name`: The scientific name of the taxon.\n\nnotes:\n- `gather` assigns k-mers to specific genomes. To mimic the output of other\n  tools, we report all results as \"assigned\" to species-level, which summarizes\n  the k-mers matched to each genome within a given species. Hence, column 3 will\n  show all estimated base pairs at this level, and 0 for all other ranks.\n  Column 2 contains the summarized info at the higher ranks.\n- Since `gather` results are non-overlapping and all assignments are done at the\n  genome level, the percent match (first column) will sum to 100% at each rank\n  (aside from rounding issues) when including the unclassified (U) percentage.\n  Higher-rank assignments are generated using LCA-style summarization of genome\n  matches.\n- Rows are ordered by rank and then ~percent containment.\n\n\nexample sourmash `{output-name}.kreport.txt`:\n\n```\n92.73    64060000                D               Bacteria\n0.44    11299000                D               Eukaryota\n6.82    284315000               U               unclassified\n60.23    30398000                P               Proteobacteria\n21.86    22526000                P               Firmicutes\n10.41    5250000         P               Bacteroidetes\n.\n.\n.\n3.94    6710000         S               Escherichia coli\n4.56    6150000         S               Pseudomonas aeruginosa\n0.71    5801000         S               Clostridium beijerinckii\n2.55    5474000         S               Bacillus cereus\n21.95    4987000         S               Escherichia sp. XD7\n28.57    4124000         S               Cereibacter sphaeroides\n0.25    4014000         S               Acinetobacter baumannii\n7.23    3934000         S               Staphylococcus haemolyticus\n0.09    3187000         S               Phocaeicola vulgatus\n0.61    2820000         S               Streptococcus agalactiae\n0.20    2499000         S               Cutibacterium acnes\n0.03    2339000         S               Deinococcus radiodurans\n10.31    2063000         S               Porphyromonas gingivalis\n9.24    2011000         S               Streptococcus mutans\n```\n\n\n#### `lingroup` output format\n\nWhen using LIN taxonomic information, you can optionally also provide a `lingroup` file with two required columns: `name` and `lin`. If provided, we will produce a file, `{base}.lingroups.tsv`, where `{base}` is the name provided via the `-o`,` --output-base` option. This output will select information from the full summary that match the LIN prefixes provided as groups.\n\nThis output format consists of four columns:\n- `name`, `lin` columns are taken directly from the `--lingroup` file\n- `percent_containment`, the total percent of the dataset contained in this lingroup and all descendants\n- `num_bp_contained`, the estimated number of base pairs contained in this lingroup and all descendants.\n\nSimilar to `kreport` above, we use the wording \"contained\" rather than \"assigned,\" because `sourmash` assigns matches at the genome level, and the `tax` functions summarize this information.\n\nexample output:\n```\nname\tlin\tpercent_containment\tnum_bp_contained\nlg1\t0;0;0\t5.82\t714000\nlg2\t1;0;0\t5.05\t620000\nlg3\t2;0;0\t1.56\t192000\nlg3\t1;0;1\t0.65\t80000\nlg4\t1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\t0.65\t80000\n```\n\nRelated lingroup subpaths will be grouped in output, but exact ordering may change between runs.\n\nNote: this output format requires a single sample only. For a similar output with multiple query samples, provide the `lingroup` file and use the 'csv_summary' output format.\n\n#### `bioboxes` output format\n\nWhen using standard taxonomic ranks (not lins), you can choose to output a 'bioboxes' profile, `{base}.bioboxes.profile`, where `{base}` is the name provided via the `-o/--output-base` option. This output is organized according to the [bioboxes profile specifications](https://github.com/bioboxes/rfc/tree/master/data-format) so that this file can be used for CAMI challenges. As of v4.9.4, `bioboxes` will support taxonomies with missing ranks, as seen in some NCBI taxonomies (e.g. taxpath: 2|1239|||||2292892|). In these cases, the missing rank-taxid combinations will be omitted from the output.\n\nThis output format starts with some header information:\n```\n#CAMI Submission for Taxonomic Profiling\n@Version:0.9.3\n@SampleID:SAMPLEID\n@Ranks:superkingdom|phylum|class|order|family|genus|species|strain\n@__program__:sourmash\n@@TAXID\tRANK\tTAXPATH\tTAXPATHSN\tPERCENTAGE\n```\nand then provides taxonomic profiling information in the tab-separated columns described by the last header line:\n\n- `TAXID` - specifies a unique alphanumeric ID for a node in a reference tree such as the NCBI taxonomy\n- `RANK` -  superkingdom --> strain\n- `TAXPATH` - the path from the root of the reference taxonomy to the respective taxon \n- `TAXPATHSN` - scientific names of taxpath\n- `PERCENTAGE` (0-100) -  field specifies what percentage of the sample was assigned to the respective TAXID\n\nexample output (using small test data):\n```\n# Taxonomic Profiling Output\n@SampleID:test1\n@Version:0.10.0\n@Ranks:superkingdom|phylum|class|order|family|genus|species\n@__program__:sourmash\n@@TAXID\tRANK\tTAXPATH\tTAXPATHSN\tPERCENTAGE\n2\tsuperkingdom\t2\tBacteria\t13.08\n976\tphylum\t2|976\tBacteria|Bacteroidota\t7.27\n1224\tphylum\t2|1224\tBacteria|Pseudomonadota\t5.82\n200643\tclass\t2|976|200643\tBacteria|Bacteroidota|Bacteroidia\t7.27\n1236\tclass\t2|1224|1236\tBacteria|Pseudomonadota|Gammaproteobacteria\t5.82\n171549\torder\t2|976|200643|171549\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales\t7.27\n91347\torder\t2|1224|1236|91347\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales\t5.82\n171552\tfamily\t2|976|200643|171549|171552\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae\t5.70\n543\tfamily\t2|1224|1236|91347|543\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae\t5.82\n815\tfamily\t2|976|200643|171549|815\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae\t1.56\n838\tgenus\t2|976|200643|171549|171552|838\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae|Prevotella\t5.70\n561\tgenus\t2|1224|1236|91347|543|561\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae|Escherichia\t5.82\n909656\tgenus\t2|976|200643|171549|815|909656\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola\t1.56\n165179\tspecies\t2|976|200643|171549|171552|838|165179\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae|Prevotella|Prevotella copri\t5.70\n562\tspecies\t2|1224|1236|91347|543|561|562\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae|Escherichia|Escherichia coli\t5.82\n821\tspecies\t2|976|200643|171549|815|909656|821\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola|Phocaeicola vulgatus\t1.56\n```\n\n\n### `sourmash tax genome` - classify a genome using `gather` results\n\n`sourmash tax genome` reports likely classification for each query,\n based on `gather` matches. By default, classification requires at least 10%\n of the query to be matched. Thus, if 10% of the query was matched to a species,\n the species-level classification can be reported. However, if 7% of the query\n was matched to one species, and an additional 5% matched to a different species\n in the same genus, the genus-level classification will be reported.\n\n`sourmash tax genome` can use an ANI threshold (`--ani-threshold`) instead of a\n containment threshold. This works the same way as the containment threshold\n (and indeed, is using the same underlying information). Note that for DNA k-mers,\n k=21 ANI is most similar to alignment-based ANI values, and ANI values should only\n be compared if they were generated using the same ksize.\n\nOptionally, `genome` can instead report classifications at a desired `rank`,\n regardless of match threshold (`--rank` argument, e.g. `--rank species`).\n\nIf using `--lins` taxonomy, you can also provide a `--lingroup` file containing two\ncolumns, `name`, and `lin`, which provide a series of lin prefixes of interest.\nIf provided,  genome classification will be restricted to provided lingroups only.\nAll other options (`--rank`, `--ani-threshold`, etc) should continue to function.\nIf you specify a `--rank` that does not have an associated lingroup, sourmash will\nnotify you that you eliminated all classification options.\n\nNote that these thresholds and strategies are under active testing.\n\nTo illustrate the utility of `genome`, let's consider a signature consisting\n of two different Shewanella strains, `Shewanella baltica OS185 strain=OS185`\n and `Shewanella baltica OS223 strain=OS223`. For simplicity, we gave this query\n the name \"Sb47+63\".\n\nWhen we gather this signature against the `gtdb-rs202` representatives database,\nwe see 66% matches to one strain, and 33% to the other:\n\nabbreviated gather_csv:\n\n```\nf_match,f_unique_to_query,name,query_name\n0.664,0.664,\"GCF_000021665.1 Shewanella baltica OS223 strain=OS223, ASM2166v1\",Sb47+63\n0.656,0.335,\"GCF_000017325.1 Shewanella baltica OS185 strain=OS185, ASM1732v1\",Sb47+63\n```\n\n> Here, `f_match` shows that independently, both strains match ~65% percent of\n this mixed query. The `f_unique_to_query` column has the results of gather-style\n decomposition. As the OS223 strain had a slightly higher `f_match` (66%), it\n was the first match. The remaining 33% of the query matched to strain OS185.\n\nWe can use `tax genome` on this gather csv to classify our \"Sb47+63\" mixed-strain query:\n\n```\nsourmash tax genome\n    --gather-csv 47+63_x_gtdb-rs202.gather.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv\n```\n> This command uses the default classification strategy, which uses a\ncontainment threshold of 0.1 (10%).\n\n`sourmash tax genome` can produce the following output formats:\n\n- `human`: \".human.txt\",\n- `csv_summary`: \".classifications.csv\",\n- `krona`: \".krona.tsv\",\n- `lineage_summary`: \".lineage_summary.tsv\",\n\n:::{warning}\n**sourmash v5 breaking change:** In sourmash v5.0 and later, the\ndefault output format will become `human`, instead of `csv_summary`.\n\nYou can specify `--v4` to keep the old behavior, or `--v5` to support\nthe new default behavior, or simply specify the desired output format.\nSee [Migrating from sourmash v4.x to sourmash v5.x](support.md#migrating-from-sourmash-v4x-to-sourmash-v5x) for more\ndetails.\n:::\n\n#### `csv_summary` output format\n\n`csv_summary` is the default output format. This outputs a `csv` with taxonomic\n classification for each query genome. This output currently consists of six\n columns, `query_name,rank,fraction,lineage,query_md5,query_filename`, where\n `fraction` is the  fraction of the query matched to the reported rank and lineage.\n The `status` column provides additional information on the classification:\n\n  - `match` - this query was classified\n  - `nomatch`- this query could not be classified\n  - `below_threshold` - this query was classified at the specified rank,\n     but the query fraction matched was below the containment threshold\n\nHere is the `csv_summary` output from classifying this mixed-strain Shewanella query to\nspecies level:\n\n```\nquery_name,status,rank,fraction,lineage\n\"Sb47+63\",match,species,1.000,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Shewanellaceae;g__Shewanella;s__Shewanella baltica\n```\n>Here, we see that the match percentages to both strains have been aggregated,\nand we have 100% species-level `Shewanella baltica` annotation. We have omitted\nthe `query_md5` and `query_filename` columns for brevity.\n\n#### `krona` output format\n\n`krona` format is a tab-separated list of these results at a specific rank.\n  The first column, `fraction` is the fraction of the query matched to the\n  reported rank and lineage. The remaining columns are `superkingdom`, `phylum`,\n  ... etc down to the rank used for summarization. This output can be used\n  directly for `krona` visualization.\n\nTo generate `krona`, we must classify by `--rank` instead of using the\n classification threshold. For the command, we add `--output-format krona`\n  and `--rank <RANK>` to the command above. Here's the command for producing\n  `krona` output for `species`-level classifications:\n\n```\nsourmash tax genome\n    --gather-csv Sb47+63_gather_x_gtdbrs202_k31.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv \\\n    --output-format krona --rank species\n```\n> Note that specifying `--rank` forces classification by rank rather than\nby the containment threshold.\n\nHere is the `krona`-formatted output for this command:\n\n```\nfraction        superkingdom    phylum  class   order   family  genus   species\n1.0     d__Bacteria     p__Proteobacteria       c__Gammaproteobacteria  o__Enterobacterales     f__Shewanellaceae       g__Shewanella   s__Shewanella baltica\n```\n\nTo produce multiple output types from the same command, add the types into the\n `--output-format` argument, e.g. `--output-format csv_summary krona`.\n **Note that specifying the classification rank with `--rank`,\n (e.g. `--rank species`), as needed for `krona` output, forces classification\n by `rank` rather than by containment threshold.** If the query\n classification at this rank does not meet the containment threshold\n (default=0.1), the `status` column will contain `below_threshold`.\n\n\n### `sourmash tax annotate` - annotates gather output with taxonomy\n\n`sourmash tax annotate` adds a column with taxonomic lineage information\n for each genome match in the gather output, without LCA summarization\n or classification. This format is not required for either `metagenome`\n or `genome`, but may be helpful for other downstream analyses.\n\nBy default, `annotate` uses the name of each input gather csv to write\nan updated version with lineages information. For example, annotating\n`sample1.gather.csv` would produce `sample1.gather.with-lineages.csv`.\n\nThis will produce an annotated gather CSV, `Sb47+63_gather_x_gtdbrs202_k31.with-lineages.csv`:\n```\nsourmash tax annotate\n    --gather-csv Sb47+63_gather_x_gtdbrs202_k31.csv \\\n    --taxonomy gtdb-rs202.taxonomy.v2.csv\n```\n\nThe `with-lineages` output file format can be summarized with\n`sourmash tax summarize` and can also be used as an input taxonomy\nspreadsheet for any of the tax subcommands (new as of v4.6.0).\n\n### `sourmash tax prepare` - prepare and/or combine taxonomy files\n\n`sourmash tax prepare` prepares taxonomy files for other `sourmash tax`\ncommands.\n\nAll `sourmash tax` commands must be given one or more taxonomy files as\nparameters to the `--taxonomy` argument. These files can be either CSV\nfiles or (as of sourmash 4.2.1) SQLite databases. SQLite databases\nare much faster for large taxonomies, while CSV files are easier to view\nand modify using spreadsheet software.\n\n`sourmash tax prepare` is a utility function that can ingest and validate\nmultiple CSV files or SQLite databases, and output a CSV file or a SQLite\ndatabase. It can be used to combine multiple taxonomies into a single file,\nas well as change formats between CSV and SQLite.\n\nThe following command will take in two taxonomy files and combine them into\na single taxonomy SQLite database.\n\n```\nsourmash tax prepare --taxonomy file1.csv file2.csv -o tax.db\n```\n\nInput databases formats can be mixed and matched, and the output format\ncan be set to CSV like so:\n```\nsourmash tax prepare --taxonomy file1.csv file2.db -o tax.csv -F csv\n```\n\n**Note:** As of sourmash v4.6.0, the output of `sourmash tax annotate` can\n be used as a taxonomy input spreadsheet as well.\n\n### `sourmash tax grep` - subset taxonomies and create picklists based on taxonomy string matches\n\n(`sourmash tax grep` is a new command as of sourmash v4.5.0.)\n\n`sourmash tax grep` searches taxonomies for matching strings,\noptionally restricting the string search to a specific taxonomic rank.\nIt creates new files containing matching taxonomic entries; these new\nfiles can serve as taxonomies and can also be used as\n[picklists to restrict database matches](#using-picklists-to-subset-large-collections-of-signatures).\n\nUsage:\n```\nsourmash tax grep <pattern> -t <taxonomy-db> [<taxonomy-db> ...]\n```\nwhere `pattern` is a regular expression; see Python's\n[Regular Expression HOWTO for details on supported regexp features](https://docs.python.org/3/howto/regex.html#regex-howto).\n\nFor example,\n```\nsourmash tax grep Shew -t gtdb-rs207.taxonomy.sqldb -o shew-picklist.csv\n```\nwill search for a string match to `Shew` within the entire GTDB RS207\ntaxonomy, and will output a subset taxonomy in `shew-picklist.csv`.\nThis picklist can be used with the GTDB\nRS207 databases like so:\n```\nsourmash search query.sig gtdb-rs207.genomic.k31.zip \\\n    --picklist shew-picklist.csv:ident:ident\n```\n\n`tax grep` can also restrict string matching to a specific taxonomic rank\nwith `-r/--rank`; for example,\n```\nsourmash tax grep Shew -t gtdb-rs207.taxonomy.sqldb \\\n    -o shew-picklist.csv -r genus\n```\nwill restrict matches to the rank of genus. Available ranks are\nsuperkingdom, phylum, class, order, family, genus, and species.\n\n`tax grep` also takes several standard grep arguments, including `-i`\nto ignore case and `-v` to output only taxonomic lineages that do\n_not_ match the pattern.\n\nNote: `tax grep` only searches taxonomic ranks, not identifier strings.\nUse `sig grep` to search for identifiers in sketch collections.\n\nCurrently only CSV output (optionally gzipped) is supported; use `sourmash tax prepare` to\nconvert CSV output from `tax grep` into a SQLite taxonomy database.\n\n### `sourmash tax summarize` - print summary information for lineage spreadsheets or taxonomy databases\n\n(`sourmash tax summarize` is a new command as of sourmash v4.6.0.)\n\n`sourmash tax summarize` loads in one or more lineage spreadsheets,\ncounts the distinct taxonomic lineages, and outputs a summary. It\noptionally will output a CSV file with a detailed count of how many\nidentifiers belong to each taxonomic lineage.\n\nFor example,\n```\nsourmash tax summarize gtdb-rs202.taxonomy.v2.db -o ranks.csv\n```\noutputs\n```\nnumber of distinct taxonomic lineages: 258406\nrank superkingdom:        2 distinct taxonomic lineages\nrank phylum:              169 distinct taxonomic lineages\nrank class:               419 distinct taxonomic lineages\nrank order:               1312 distinct taxonomic lineages\nrank family:              3264 distinct taxonomic lineages\nrank genus:               12888 distinct taxonomic lineages\nrank species:             47894 distinct taxonomic lineages\n```\n\nand creates a file `ranks.csv` with the number of distinct identifier\ncounts for each lineage at each rank:\n```\nrank,lineage_count,lineage\nsuperkingdom,254090,d__Bacteria\nphylum,120757,d__Bacteria;p__Proteobacteria\nclass,104665,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria\norder,64157,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales\nfamily,55347,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae\n...\n```\nThat is, there are 254,090 identifiers in GTDB rs202 under `d__Bacteria`,\nand 120,757 within the `p__Proteobacteria`.\n\n`tax summarize` can also be used to summarize the output of `tax annotate`.\n\n## `sourmash lca` subcommands for in-memory taxonomy integration\n\nThese commands use LCA databases (created with `lca index`, below, or\nprepared databases such as [genbank-k31.lca.json.gz](databases.md)).\n\n### `sourmash lca classify` - classify a genome using an LCA database\n\n`sourmash lca classify` classifies one or more signatures using the given\nlist of LCA DBs. It is meant for classifying metagenome-assembled genome\nbins (MAGs) and single-cell genomes (SAGs).\n\n```{attention}\nWe no longer recommend using `sourmash lca` for taxonomic analysis;\nplease use `sourmash tax` instead.  See\n[taxonomic profiling with sourmash](classifying-signatures.md#taxonomic-profiling-with-sourmash)\nfor more information.\n```\n\nUsage:\n\n```\nsourmash lca classify --query query.sig [query2.sig ...] --db <lca db> [<lca db2> ...]\n```\n\nFor example, the command\n\n```\nsourmash lca classify --query tests/test-data/63.fa.sig \\\n    --db podar-ref.lca.json \n```\n\nwill produce the following logging to stderr:\n\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nfinding query signatures...\noutputting classifications to stdout\n... classifying NC_011663.1 Shewanella baltica OS223, complete genome\nclassified 1 signatures total\n```\n\nand the example classification output is a CSV file with headers:\n\n```\nID,status,superkingdom,phylum,class,order,family,genus,species\n\"NC_009665.1 Shewanella baltica OS185, complete genome\",found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica\n```\n\nThe `status` column in the classification output can take three\npossible values: `nomatch`, `found`, and `disagree`.  `nomatch` means\nthat no match was found for this query, and `found` means that an\nunambiguous assignment was found - all k-mers were classified within\nthe same taxonomic hierarchy, and the most detailed lineage available\nwas reported.  `disagree` means that there was a taxonomic disagreement,\nand the lowest compatible taxonomic node was reported.\n\nTo elaborate on this a bit, suppose that all of the k-mers within a\nsignature were classified as family *Shewanellaceae*, genus\n*Shewanella*, or species *Shewanella baltica*. Then the lowest\ncompatible node (here species *Shewanella baltica*) would be reported,\nand the status of the classification would be `found`.  However, if a\nnumber of additional k-mers in the input signature were classified as\n*Shewanella oneidensis*, sourmash would be unable to resolve the\ntaxonomic assignment below genus *Shewanella* and it would report\na status of `disagree` with the genus-level assignment of *Shewanella*;\nspecies level assignments would not be reported.\nHere, the assigned rank is the rank immediately *above* where there is\na taxonomic disagreement, and the taxid & lineage refer to the name at\nthat rank (the lowest common ancestor at which an assignment can be\nmade).\n\nFor another example, if you saw this line in the CSV file: \n\n```\nTARA_ASW_MAG_00029,1224,disagree,phylum,Bacteria;Proteobacteria\n```\n\nyou would know that TARA_ASW_MAG_00029 has k-mers that are shared\nbetween different orders: 'Pseudomonadales' and\n'Rhodobacterales'. Therefore, the classifier status is `disagree`, and\nthe classified taxid is at rank `phylum` - just above `order`.\n\n(This is the approach that Kraken and other lowest common ancestor\nimplementations use, we believe.)\n\nNote: you can specify a list of file names to load signatures from in a\ntext file passed to `sourmash lca classify` with the\n`--query-from-file` flag; these files will be appended to the `--query`\ninput.\n\n### `sourmash lca summarize` - summarize a metagenome's contents using an LCA database\n\n`sourmash lca summarize` produces a Kraken-style summary of the\ncombined contents of the given query signatures.  It is meant for\nexploring metagenomes and metagenome-assembled genome bins.\n\n`sourmash lca summarize` also weights output with hash abundances, so\nthat output percentages are weighted by the number of times a k-mer is\nseen; this can be turned off with `--ignore-abundance`.\n\n```{attention}\nWe no longer recommend using `sourmash lca` for taxonomic analysis;\nplease use `sourmash tax` instead.  See\n[taxonomic profiling with sourmash](classifying-signatures.md#taxonomic-profiling-with-sourmash)\nfor more information.\n```\n\nUsage:\n\n```\nsourmash lca summarize --query query.sig [query2.sig ...] \n    --db <lca db> [<lca db2> ...]\n```\n\nFor example, with the data in `tests/test-data/fake-abund`, the command line:\n\n```\nsourmash lca summarize --query query.sig.gz --db matches.lca.json.gz\n```\n\nwill produce the following log output to stderr:\n\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nfinding query signatures...\nloaded 1 signatures from 1 files total.\n```\n\nand the following example summarize output to stdout:\n\n```\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\n79.6%   550   Bacteria;Proteobacteria;Gammaproteobacteria\n79.6%   550   Bacteria;Proteobacteria\n79.6%   550   Bacteria\n20.4%   141   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum;Aciduliprofundum boonei;Aciduliprofundum boonei T469\n20.4%   141   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum;Aciduliprofundum boonei\n20.4%   141   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum\n20.4%   141   Archaea;Euryarchaeota;unassigned;unassigned;unassigned\n20.4%   141   Archaea;Euryarchaeota;unassigned;unassigned\n20.4%   141   Archaea;Euryarchaeota;unassigned\n20.4%   141   Archaea;Euryarchaeota\n20.4%   141   Archaea\n```\n\nThe output is space-separated and consists of three columns: the\npercentage of total k-mers that have this classification; the number of\nk-mers that have this classification; and the lineage classification.\nK-mer classifications are reported hierarchically, so the percentages\nand totals contain all assignments that are at a lower taxonomic level -\ne.g. *Bacteria*, above, contains all the k-mers in *Bacteria;Proteobacteria*.\n\nThe same information is reported in a CSV file if `-o/--output` is used.\n\nThe proportions reflect the query signature construction, where the\nmetagenome contains a 1.5 Mbp Archaeal genome and a 5.4 Mbp Bacterial\ngenome.  The Archaeal genome is therefore only ~20% of the distinct\nk-mers in the metagenome (1.5 Mbp divided by 6.9 Mbp).\n\nIf `--with-abundance` is given, the output changes to reflect the proportions\nof the query metagenome based on k-mer/read abundances:\n```\n56.8%   740   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum;Aciduliprofundum boonei;Aciduliprofundum boonei T469\n56.8%   740   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum;Aciduliprofundum boonei\n56.8%   740   Archaea;Euryarchaeota;unassigned;unassigned;unassigned;Aciduliprofundum\n56.8%   740   Archaea;Euryarchaeota;unassigned;unassigned;unassigned\n56.8%   740   Archaea;Euryarchaeota;unassigned;unassigned\n56.8%   740   Archaea;Euryarchaeota;unassigned\n56.8%   740   Archaea;Euryarchaeota\n56.8%   740   Archaea\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\n43.2%   563   Bacteria;Proteobacteria;Gammaproteobacteria\n43.2%   563   Bacteria;Proteobacteria\n43.2%   563   Bacteria\n```\n\nHere, the changed proportions reflect the query signature abundances, where\nthe 1.5 Mbp Archaeal genome is present 5 times, while the 5.4 Mbp Bacterial\ngenome is present only once; when weighted by abundance, the Bacterial genome\nis only 41.8% of the metagenome content, while the Archaeal genome is\n58.1% of the metagenome content.\n\nNote: you can specify a list of file names to load signatures from in a\ntext file passed to `sourmash lca summarize` with the\n`--query-from-file` flag; these files will be appended to the `--query`\ninput.\n\n### `sourmash lca index` - build an LCA database\n\nThe `sourmash lca index` command creates an LCA database from\na lineage spreadsheet and a collection of signatures.  This can be used\nto create LCA databases from private collections of genomes, and can\nalso be used to create databases for e.g. subsets of GenBank.\n\nSee [the `sourmash lca` tutorial](tutorials-lca.md) and the blog\npost\n[Why are taxonomic assignments so different for Tara bins?](http://ivory.idyll.org/blog/2017-taxonomic-disagreements-in-tara-mags.html)\nfor some use cases.\n\nIf you are interested in preparing lineage spreadsheets from GenBank\ngenomes (or building off of NCBI taxonomies more generally), please\nsee\n[the NCBI lineage repository](https://github.com/dib-lab/2018-ncbi-lineages).\n\nYou can use `--from-file` to pass `lca index` a text file containing a\nlist of file names to index.\n\nAs of sourmash 4.2.0, `lca index` supports `--picklist`, to\n[select a subset of signatures based on a CSV file](#using-picklists-to-subset-large-collections-of-signatures). This\ncan be used to index a subset of a large collection, or to\nexclude a few signatures from an index being built from a large collection.\n\nAs of sourmash 4.4.0, `lca index` can produce an _on disk_ LCA\ndatabase using SQLite. To prepare such a database, use\n`sourmash lca index ... -F sql`.\n\nAll sourmash commands work with either type of LCA database (the\ndefault JSON database, and the SQLite version). SQLite databases are\nlarger than JSON databases on disk but are typically much faster\nto load and search, and use much less memory.\n\n### `sourmash lca rankinfo` - examine an LCA database\n\nThe `sourmash lca rankinfo` command displays k-mer specificity\ninformation for one or more LCA databases.  See the blog post\n[How specific are k-mers for taxonomic assignment of microbes, anyway?](http://ivory.idyll.org/blog/2017-how-specific-kmers.html) for example output.\n\n### `sourmash lca compare_csv` - compare taxonomic spreadsheets\n\nThe `sourmash lca compare_csv` command compares two lineage\nspreadsheets (such as those output by `sourmash lca classify` or taken\nas input by `sourmash lca index`) and summarizes their\nagreement/disagreement.  Please see the blog post\n[Why are taxonomic assignments so different for Tara bins?](http://ivory.idyll.org/blog/2017-taxonomic-disagreements-in-tara-mags.html)\nfor an example use case.\n\n[0]:https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2\n[1]:http://mash.readthedocs.io/en/latest/\n[2]:http://biorxiv.org/content/early/2015/10/26/029827\n[3]:https://en.wikipedia.org/wiki/Jaccard_index\n\n## `sourmash signature` subcommands for signature manipulation\n\nThese commands manipulate signatures from the command line.\n\nThe signature commands that combine or otherwise have multiple\nsignatures interacting (`merge`, `intersect`, `subtract`) work only on\ncompatible signatures, where the k-mer size and nucleotide/protein\nsequences match each other.  If working directly with the hash values\n(e.g. `merge`, `intersect`, `subtract`) then the scaled values must\nalso match; you can use `downsample` to convert a bunch of samples to\nthe same scaled value.\n\nIf there are multiple signatures in a file with different ksizes and/or\nfrom nucleotide and protein sequences, you can choose amongst them with\n`-k/--ksize` and `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`, as with other sourmash commands\nsuch as `search`, `gather`, and `compare`.\n\nNote, you can use `sourmash sig` as shorthand for all of these commands.\n\nAll commands load signatures in all supported sourmash formats,\nincluding indexed databases, and will save signatures in formats based\non the extension (e.g. `-o output.zip` will use the zip format).  You\ncan load signatures from stdin using `-` on the command line.\n\n### `sourmash signature cat` - combine signatures into one file\n\nConcatenate signature files.\n\nFor example,\n```\nsourmash signature cat file1.sig file2.sig -o all.sig.zip\n```\nwill combine all signatures in `file1.sig` and `file2.sig` and put them\nin the file `all.sig.zip`.\n\n#### Using picklists with `sourmash sig cat`\n\nAs of sourmash 4.2.0, `cat` also supports picklists, a feature by\nwhich you can select signatures based on values in a CSV file. See\n[Using picklists to subset large collections of signatures](#using-picklists-to-subset-large-collections-of-signatures), below.\n\n### `sourmash signature describe` - display detailed information about signatures\n\nDisplay signature details.\n\nFor example,\n```\nsourmash sig describe tests/test-data/track_abund/47.fa.sig\n```\nwill display:\n\n```\nsignature filename: tests/test-data/track_abund/47.fa.sig\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: podar-ref/47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=1\nsize: 5177\nsum hashes: 5292\nsignature license: CC0\n```\n\nHere, the `size` is the number of distinct hashes in the sketch, and\n`sum_hashes` is the total number of hashes in the sketch, with abundances.\nWhen `track_abundance` is 0, `size` is always the same as `sum_hashes`.\n\n### `sourmash signature fileinfo` - display a summary of the contents of a sourmash collection\n\nDisplay signature file, database, or collection.\n\nFor example,\n```\nsourmash sig fileinfo tests/test-data/prot/all.zip\n```\nwill display:\n```\npath filetype: ZipFileLinearIndex\nlocation: /Users/t/dev/sourmash/tests/test-data/prot/all.zip\nis database? yes\nhas manifest? yes\nis nonempty? yes\nnum signatures: 8\n** examining manifest...\n31758 total hashes\nsummary of sketches:\n   2 sketches with dayhoff, k=19, scaled=100          7945 total hashes\n   2 sketches with hp, k=19, scaled=100               5184 total hashes\n   2 sketches with protein, k=19, scaled=100          8214 total hashes\n   2 sketches with DNA, k=31, scaled=1000             10415 total hashes\n```\n\n`sig fileinfo` will recognize\n[all accepted sourmash input files](#loading-signatures-and-databases),\nincluding individual .sig and .sig.gz files, Zip file collections, SBT\ndatabases, LCA databases, and directory hierarchies.\n\n`sourmash sig fileinfo` provides optional JSON and YAML output, and\nthose formats are under semantic versioning.\n\nNote: `sourmash signature summarize` is an alias for `fileinfo`; they are\nthe same command.\n\n### `sourmash signature grep` - extract matching signatures using pattern matching\n\nExtract matching signatures with substring and regular expression matching\non the name, filename, and md5 fields.\n\nFor example,\n```\nsourmash signature grep -i shewanella tests/test-data/prot/all.zip -o shew.sig.zip\n```\nwill extract the two signatures in `all.zip` with 'Shewanella baltica'\nin their name and save them to `shew.sig.zip`.\n\n`grep` will search for substring matches or regular expressions;\ne.g. `sourmash sig grep 'os185|os223' ...` will find matches to either\nof those expressions.\n\nString matching modifiers include `-i` for case-insensitive matching,\nand `-v` for exclusion rather than inclusion.\n\nBy default, `sig grep` outputs matching sketches. Alternatively,\n`-l/--print-matched-names` prints a list of distinct matching\nsketch names and `-c/--count` prints a count of total matching\nsketches; both disable sketch output by setting `--no-sigs`.\n\nA CSV file of the matching sketch information can be saved using\n`--csv <outfile>`; this file is in the sourmash manifest format and\ncan be used as a picklist with `--pickfile <outfile>::manifest`.\n\nIf `--no-sigs` is specified, `sourmash sig grep` will not output matching\nsignatures.\n\n### `sourmash signature split` - split signatures into individual files\n\nSplit each signature in the input file(s) into individual files, with\nstandardized names.\n\nFor example,\n```\nsourmash signature split tests/test-data/2.fa.sig\n```\nwill create 3 files,\n\n`f372e478.k=21.scaled=1000.DNA.dup=0.2.fa.sig`,\n`f3a90d4e.k=31.scaled=1000.DNA.dup=0.2.fa.sig`, and\n`43f3b48e.k=51.scaled=1000.DNA.dup=0.2.fa.sig`, representing the three\ndifferent DNA signatures at different ksizes created from the input file\n`2.fa`.\n\nThe format of the names of the output files is standardized and stable\nfor major versions of sourmash: currently, they are period-separated\nwith fields:\n\n* `md5sum` - a unique hash value based on the contents of the signature.\n* `k=<ksize>` - k-mer size.\n* `scaled=<scaled>` or `num=<num>` - scaled or num value for MinHash.\n* `<moltype>` - the molecule type (DNA, protein, dayhoff, hp, skipm1n3, or skipm2n3)\n* `dup=<n>` - a non-negative integer that prevents duplicate signatures from colliding.\n* `basename` - basename of first input file used to create signature; if none provided, or stdin, this is `none`.\n\nIf `--outdir` is specified, all of the signatures are placed in outdir.\n\nNote: `split` only saves files in the JSON `.sig` format.\n\n### `sourmash signature merge` - merge two or more signatures into one\n\nMerge two (or more) signatures.\n\nFor example,\n```\nsourmash signature merge file1.sig file2.sig -o merged.sig\n```\nwill output the union of all the hashes in `file1.sig` and `file2.sig`\nto `merged.sig`.\n\nAll of the signatures passed to merge must either have been created\nwith `-p abund`, or not.  If they have `track_abundance` on,\nthen the merged signature will have the sum of all abundances across\nthe individual signatures.  The `--flatten` flag will override this\nbehavior and allow merging of mixtures by removing all abundances.\n\n`sig merge` can only merge compatible sketches - if there are multiple\nk-mer sizes or molecule types present in any of the signature files,\nyou will need to choose one k-mer size with `-k/--ksize`, and/or one\nmoltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`.\n\nUse `--set-name <name>` to set the name of the output sketch.\n\nNote: `merge` only creates one output file, with one signature in it.\n\n### `sourmash signature rename` - rename a signature\n\nRename the display name for one or more signatures - this is the name\noutput for matches in `compare`, `search`, `gather`, etc.\n\nFor example,\n```\nsourmash signature rename file1.sig \"new name\" -o renamed.sig\n```\nwill place a renamed copy of the hashes in `file1.sig` in the file\n`renamed.sig`. If you provide multiple signatures, all will be renamed\nto the same name.\n\n### `sourmash signature subtract` - subtract other signatures from a signature\n\nSubtract all of the hash values from one signature that are in one or more\nof the others.\n\nFor example,\n\n```\nsourmash signature subtract file1.sig file2.sig file3.sig -o subtracted.sig\n```\nwill subtract all of the hashes in `file2.sig` and `file3.sig` from\n`file1.sig`, and save the new signature to `subtracted.sig`.\n\nTo use `subtract` on signatures calculated with\n`-p abund`, you must specify `--flatten`.\n\n`sig subtract` can only work with compatible sketches - if there are multiple\nk-mer sizes or molecule types present in any of the signature files,\nyou will need to choose one k-mer size with `-k/--ksize`, and/or one\nmoltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`.\n\nUse `--set-name <name>` to set the name of the output sketch.\n\nNote: `subtract` only creates one output file, with one signature in it.\n\n### `sourmash signature intersect` - intersect two (or more) signatures\n\nOutput the intersection of the hash values in multiple signature files.\n\nFor example,\n\n```\nsourmash signature intersect file1.sig file2.sig file3.sig -o intersect.sig\n```\nwill output the intersection of all the hashes in those three files to\n`intersect.sig`.\n\nThe `intersect` command flattens all signatures, i.e. the abundances\nin any signatures will be ignored and the output signature will have\n`track_abundance` turned off.  The `-A/--abundance-from` argument will\nborrow abundances from the specified signature (which will also be added\nto the intersection).\n\n`sig intersect` can only work with compatible sketches - if there are multiple\nk-mer sizes or molecule types present in any of the signature files,\nyou will need to choose one k-mer size with `-k/--ksize`, and/or one\nmoltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`.\n\nUse `--set-name <name>` to set the name of the output sketch(es).\n\n### `sourmash signature inflate` - transfer abundances from one signature to others\n\nUse abundances from one signature to provide abundances on other signatures.\n\nFor example,\n\n```\nsourmash signature inflate file1.sig file2.sig file3.sig -o inflated.sig\n```\nwill take the abundances from hashes `file1.sig` and use them to set\nthe abundances on matching hashes in `file2.sig` and `file3.sig`.\nAny hashes that are not present in `file1.sig` will be removed from\n`file2.sig` and `file3.sig` as they will now have zero abundance.\n\n`sig inflate` can only work with compatible sketches - if there are multiple\nk-mer sizes or molecule types present in any of the signature files,\nyou will need to choose one k-mer size with `-k/--ksize`, and/or one\nmoltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`.\n\n### `sourmash signature downsample` - decrease the size of a signature\n\nDownsample one or more signatures.\n\nWith `downsample`, you can --\n\n* increase the `scaled` value for a signature created with `-p scaled=SCALED`, shrinking it in size;\n* decrease the `num` value for a traditional num MinHash, shrinking it in size;\n* try to convert a `scaled` signature to a `num` signature;\n* try to convert a `num` signature to a `scaled` signature.\n\nFor example,\n```\nsourmash signature downsample file1.sig file2.sig --scaled 100000 -o downsampled.sig\n```\nwill output each signature, downsampled to a scaled value of 100000, to\n`downsampled.sig`; and\n```\nsourmash signature downsample --num 500 scaled_file.sig -o downsampled.sig\n```\nwill try to convert a scaled MinHash to a num MinHash.\n\n### `sourmash signature extract` - extract signatures from a collection\n\nExtract the specified signature(s) from a collection of signatures.\n\nFor example,\n```\nsourmash signature extract *.sig -k 21 --dna -o extracted.sig\n```\nwill extract all nucleotide signatures calculated at k=21 from all\n.sig files in the current directory.\n\nThere are currently two other useful selectors for `extract`: you can specify\n(part of) an md5sum, as output in the CSVs produced by `search` and `gather`;\nand you can specify (part of) a name.\n\nFor example,\n```\nsourmash signature extract tests/test-data/*.fa.sig --md5 09a0869\n```\nwill extract the signature from `47.fa.sig` which has an md5sum of\n`09a08691ce52952152f0e866a59f6261`; and \n```\nsourmash signature extract tests/test-data/*.fa.sig --name NC_009665\n```\nwill extract the same signature, which has an accession number of\n`NC_009665.1`.\n\n#### Using picklists with `sourmash sig extract`\n\nAs of sourmash 4.2.0, `extract` also supports picklists, a feature by\nwhich you can select signatures based on values in a CSV file. See\n[Using picklists to subset large collections of signatures](#using-picklists-to-subset-large-collections-of-signatures), below.\n\n### `sourmash signature flatten` - remove abundance information from signatures\n\nFlatten the specified signature(s), removing abundances and setting\ntrack_abundance to False.\n\nFor example,\n```\nsourmash signature flatten *.sig -o flattened.sig\n```\nwill remove all abundances from all of the .sig files in the current\ndirectory.\n\nThe `flatten` command accepts the same selectors as `extract`.\n\n### `sourmash signature filter` - remove hashes based on abundance\n\nFilter the hashes in the specified signature(s) by abundance, by either\n`-m/--min-abundance` or `-M/--max-abundance` or both. Abundance selection is\ninclusive, so `-m 2 -M 5` will select hashes with abundance greater than\nor equal to 2, and less than or equal to 5.\n\nFor example,\n```\nsourmash signature filter -m 2 *.sig\n```\n\nwill output new signatures containing only hashes that occur two or\nmore times in each signature.\n\nThe `filter` command accepts the same selectors as `extract`.\n\n### `sourmash signature import` - import signatures from mash.\n\nImport signatures into sourmash format. Currently only supports mash,\nand can import mash sketches output by `mash info -d <filename.msh>`.\n\nFor example,\n```\nsourmash signature import filename.msh.json -o imported.sig\n```\nwill import the contents of `filename.msh.json` into `imported.sig`.\n\nNote: `import` only creates one output file, with one signature in it.\n\nNote: `ingest` is an alias for `import`.\n\n### `sourmash signature export` - export signatures to mash.\n\nExport signatures from sourmash format. Currently only supports\nmash dump format.\n\nFor example,\n```\nsourmash signature export filename.sig -o filename.sig.msh.json\n```\n\n### `sourmash signature overlap` - detailed comparison of two signatures' overlap\n\nDisplay a detailed comparison of two signatures. This calculates the\nJaccard similarity (as in `sourmash compare` or `sourmash search`) and\nthe Jaccard containment in both directions (as with `--containment`).\nIt also displays the number of hash values in the union and\nintersection of the two signatures, as well as the number of disjoint\nhash values in each signature.\n\nThis command has two uses - first, it is helpful for understanding how\nsimilarity and containment are calculated, and second, it is useful for\nanalyzing signatures with very small overlaps, where the similarity\nand/or containment might be very close to zero.\n\nFor example,\n```\nsourmash signature overlap tests/test-data/63.fa.sig \\\n    tests/test-data/47.fa.sig\n```\nwill display the detailed comparison of the two files like so:\n```text\nloaded one signature each from tests/test-data/63.fa.sig and tests/test-data/47.fa.sig\nfirst signature:\n  signature filename: tests/test-data/63.fa.sig\n  signature: NC_011663.1 Shewanella baltica OS223, complete genome\n  md5: 38729c6374925585db28916b82a6f513\n  k=31 molecule=DNA num=0 scaled=1000\n\nsecond signature:\n  signature filename: tests/test-data/47.fa.sig\n  signature: NC_009665.1 Shewanella baltica OS185, complete genome\n  md5: 09a08691ce52952152f0e866a59f6261\n  k=31 molecule=DNA num=0 scaled=1000\n\nsimilarity:                  0.32069\nfirst contained in second:   0.48282\nsecond contained in first:   0.48851\n\nnumber of hashes in first:   5238\nnumber of hashes in second:  5177\n\nnumber of hashes in common:  2529\nonly in first:               2709\nonly in second:              2648\ntotal (union):               7886\n```\n\n`sig overlap` can only work with compatible sketches - if there are multiple\nk-mer sizes or molecule types present in any of the signature files,\nyou will need to choose one k-mer size with `-k/--ksize`, and/or one\nmoltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3`.\n\n### `sourmash signature kmers` - extract k-mers and/or sequences that match to signatures\n\nGiven one or more compatible sketches and some sequence files, extract\nthe k-mers and/or sequences corresponding to the hash values in the\nsketch. Because the sourmash hash function is one-way, this requires\nFASTA or FASTQ sequence files in addition to the sketch.\n\nFor example,\n```\nsourmash sig kmers --signatures sig1.sig --sequences seqfile.fasta \\\n    --save-sequences matches.fasta --save-kmers kmer-matches.csv\n```\nwill search `seqfile.fasta` for matching sequences and k-mers,\nand produce two files. The file `matches.fasta` will contain FASTA\nsequences that match the hashes in the input signature, while the\nfile `kmer-matches.csv` provides the matching k-mers and hash values,\ntogether with their originating filename and sequence name.\n\nIf the sketch is a protein sketch (protein, dayhoff, or hp), then\nthe input sequences are assumed to be protein. To search DNA sequences\nfor translated protein hashes, provide the `--translate` flag to `sig kmers`.\n\n`--save-sequences` and `--save-kmers` are both optional.  If neither are\ngiven, basic statistics on k-mer matching are given.\n\nPlease note that `--save-kmers` can be very slow on large files!\n\nThe input sketches are the source of the input hashes.  So, for example,\nIf `--scaled=1` sketches are provided, `sig kmers` can be used to\nyield all the k-mers and their matching hashes.  Likewise, if the\nsketch is built from the intersection of two other sketches, only\nthe k-mers and hash values present in both sketches will be used.\n\nLikewise, the input sequences are used for matching; they do not need\nto be the same sequences that were used to create the sketches.\nInput sequences can be in FASTA or FASTQ format, and either flat text\nor compressed with gzip or bzip2; formats are auto-detected.\n\nBy default, `sig kmers` ignores bad k-mers (e.g. non-ACGT characters\nin DNA). If `--check-sequence` is provided, `sig kmers` will error\nexit on the first bad k-mer.  If `--check-sequence --force` is provided,\n`sig kmers` will provide error messages (and skip bad sequences), but\nwill continue processing input sequences.\n\n### `sourmash signature manifest` - output a manifest for a file\n\nOutput a manifest for a file, database, or collection.  Note that\nthese manifests are not usually suitable for use as standalone\nmanifests; the `sourmash sig collect` and `sourmash sig check`\ncommands produce standalone manifests.\n\nFor example,\n```\nsourmash sig manifest tests/test-data/prot/all.zip -o manifest.csv\n```\nwill create a CSV file, `manifest.csv`, in the internal sourmash\nmanifest format.  The manifest will contain an entry for every\nsignature in the file, database, or collection. This format is largely\nmeant for internal use, but it can serve as a\n[picklist pickfile](#using-picklists-to-subset-large-collections-of-signatures)\nfor subsetting large collections.\n\nBy default, `sourmash sig manifest` will rebuild the manifest by\niterating over the signatures in the input file. This can be slow for\nlarge collections. Use `--no-rebuild-manifest` to load an existing\nmanifest if it is available.\n\nAs of sourmash 4.4.0, `sig manifest` can produce a manifest in a fast\non-disk format (a SQLite database). SQLite manifests can be _much_\nfaster when working with very large collections of signatures.\nTo produce a SQLite manifest, use `sourmash sig manifest ... -F sql`.\n\nAll sourmash commands that work with manifests will accept both\nCSV and SQLite manifest files.\n\n:::{warning}\n**sourmash v5 breaking change:** In sourmash v5.0 and later,\n`--no-rebuild-manifest` will become default. You can specify `--v4` to\nkeep the old behavior, or `--v5` to support the new default behavior,\nor simply specify `--no-rebuild-manifest` to override the default. See\n[Migrating from sourmash v4.x to sourmash v5.x](support.md#migrating-from-sourmash-v4x-to-sourmash-v5x) for more\ndetails.\n:::\n\n### `sourmash signature check` - compare picklists and manifests\n\nCompare picklists and manifests across databases, and optionally\noutput matches and missing items.  In particular, `sig check` can be\nused to create standalone manifests for a subset of a large collection,\nusing picklists.\n\nFor example,\n```\nsourmash sig check tests/test-data/gather/GCF*.sig \\\n    --picklist tests/test-data/gather/salmonella-picklist.csv::manifest\n```\nwill load all of the `GCF` signatures and compare them to the given picklist.\nWith `-o/--output-missing`, `sig check` will save unmatched elements of the\npicklist CSV. With `--save-manifest-matching`, `sig check` will save all\nof the _matched_ elements to a manifest file, which can then be used as a\nsourmash database.\n\n`sourmash sig check` is particularly useful when working with large\ncollections of signatures and identifiers.\n\nWith `-m/--save-manifest-matching`, `sig check` creates a standalone\nmanifest. In these manifests, sourmash v4 will by default write paths\nto the matched elements that are relative to the current working\ndirectory.  In some cases - when the output manifest is in a different\ndirectory - this will create manifests that do not work properly\nwith sourmash.  The `--relpath` argument will rewrite the paths to be\nrelative to the manifest, while the `--abspath` argument will rewrite\npaths to be absolute.  The `--relpath` behavior will be the default in\nsourmash v5.\n\nStandalone manifests created with `-m/--save-manifest-matching` will\nuse the paths given to `sig check` on the command line; we recommend\nusing zip files and sig files, and avoiding directory hierarchies or\npath lists. You can use `--from-file` to pass in long lists of\nfilenames via a text file.\n\n:::{warning}\n**sourmash v5 breaking change:** In sourmash v5.0 and later,\n`--relpath` will become default. You can specify `--v4` to keep the\nold behavior, or `--v5` to support the new default behavior, or simply\nspecify `--relpath` or `--abspath` to specify the desired\nbehavior. See [Migrating from sourmash v4.x to sourmash v5.x](support.md#migrating-from-sourmash-v4x-to-sourmash-v5x)\nfor more details.\n:::\n\n### `sourmash signature collect` - collect manifests across databases\n\nCollect manifests from across (many) files and merge into a single\nstandalone manifest. Standalone manifests can be used directly as a\nsourmash database; they support efficient searching and selection of\nsketches, as well as lazy loading of individual sketches from large\ncollections.  See\n[advanced usage information on sourmash databases](databases-advanced.md)\nfor more information.\n\nFor example,\n```\nsourmash sig collect tests/test-data/gather/GCF*.sig -o mf.sqlmf\n```\nwill load all of the `GCF` signatures and build a manifest file `mf.sqlmf`\nthat contains references to all of the signatures, but not the signatures\nthemselves.\nThis manifest file can be loaded directly from the command line by sourmash.\n\n`sourmash sig collect` defaults to outputting SQLite manifests. It is\nparticularly useful when working with large collections of signatures and\nidentifiers, and has command line options for merging and updating manifests.\n\nThe standalone manifests created by `sig collect` will reference the\npaths given on the command line; we recommend using zip files and sig\nfiles, and avoiding directory hierarchies or path lists. You can also\nuse `--from-file` to pass in long lists of filenames.\n\nStandalone manifests produced by `sig collect` work most efficiently\nwhen constructed from many small zip file collections.  \n\nAs with `sig check`, the standalone manifests created by `sig collect`\nin sourmash v4 will by default write paths to the matched elements\nrelative to the current working directory.  When the output manifest\nis in a different directory, this will create manifests that do not\nwork properly with sourmash.  The `--relpath` argument will rewrite\nthe paths to be relative to the manifest, while the `--abspath`\nargument will rewrite paths to be absolute.  The `--relpath` behavior\nwill be the default in sourmash v5.\n\n## Advanced command-line usage\n\n### Loading signatures and databases\n\nsourmash uses several different command-line styles.  Most sourmash\ncommands can load sketches from any standard collection type; we\nprimarily recommend using zipfiles (but read on!)\n\nBriefly,\n\n* `search` and `gather` both take a single query signature and search\n  multiple signatures or databases. In this case, there has to be a\n  single identifiable query for sourmash to use, and if you're using a\n  database or list of signatures as the source of a query, you'll\n  need to provide a selector (ksize with `-k`, moltype with `--dna/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3` etc,\n  or md5sum with `--query-md5`) that picks out a single signature.\n\n* `compare` takes multiple signatures and can load them from any\n  sourmash collection type.\n  \n* the `lca classify` and `lca summarize` commands take multiple\n  signatures with `--query`, and multiple LCA databases, with\n  `--db`. `sourmash multigather` also uses this style.  This allows these\n  commands to specify multiple queries **and** multiple databases without\n  (too much) confusion.  The database must be LCA databases.\n  \n* `index` and `lca index` take a few fixed parameters (database name,\n  and for `lca index`, a taxonomy file) and then an arbitrary number of\n  other files that contain signatures.\n\nNone of these commands currently support searching, comparing, or indexing\nsignatures with multiple ksizes or moltypes at the same time; you need\nto pick the ksize and moltype to use for your query. Where possible,\nscaled values will be made compatible.\n\n### Selecting signatures \n\n(sourmash v4.3.0 and later)\n\nsourmash is built to work with very large collections of signatures,\nand you may want to select (or exclude) specific signatures from\nsearch or other operations, based on their name. This can be done\nwithout modifying the collections themselves via the\n`--include-db-pattern` and `--exclude-db-pattern` arguments to many\nsourmash commands, including `search`, `gather`, `compare`, `prefetch`,\nand `sig extract`.\n\nIn brief, `sourmash search ... --include <pattern>` will search only\nthose database signatures that match `<pattern>` in their `name`,\n`filename`, or `md5` strings.  Here, `<pattern>` can be either a\nsubstring or a regular expression.  Likewise, `sourmash search\n... --exclude <pattern>` will search only those database signatures\nthat _don't_ match pattern in their `name`, `filename`, or `md5` strings.\n\n### Using picklists to subset large collections of signatures\n\n(sourmash v4.2.0 and later)\n\nMany commands support *picklists*, a feature by which you can select\nor \"pick out\" signatures based on values in a CSV file. This is\ntypically used to index, extract, or search a subset of a large\ncollection where modifying the collection itself isn't desired.\n\nFor example,\n```\nsourmash sig extract --picklist list.csv:md5:md5sum <signatures>\n```\nwill extract only the signatures that have md5sums matching the\ncolumn `md5sum` in the CSV file `list.csv`. The command\n```\nsourmash sig extract --picklist list.csv::prefetch <signatures>\n```\nwill extract only the signatures found in the output\nof `sourmash prefetch ... -o list.csv`.\n\nThe `--picklist` argument string must be of the format\n`pickfile:colname:coltype[:pickstyle]`, where `pickfile` is the path\nto a CSV file, `colname` is the name of the column to select from the\nCSV file (based on the headers in the first line of the CSV file), and\n`coltype` is the type of match.  An optional pickstyle argument,\n`:include` or `:exclude`, can be added as a fourth parameter; if\nomitted, the default is `:include`.\n\nThe following `coltype`s are currently supported for picklists:\n\n* `name` - exact match to signature's name\n* `md5` - exact match to signature's md5sum\n* `md5prefix8` - match to 8-character prefix of signature's md5sum\n* `md5short` - same as `md5prefix8`\n* `ident` - exact match to signature's identifier\n* `identprefix` - match to signature's identifier, before '.'\n* `gather` - use the CSV output of `sourmash gather` as a picklist\n* `prefetch` - use the CSV output of `sourmash prefetch` as a picklist\n* `search` - use the CSV output of `sourmash prefetch` as a picklist\n* `manifest` - use CSV manifests produced by `sig manifest`, `sig collect`, or `sig check` as a picklist\n\nIdentifiers are constructed by using the first space delimited word in\nthe signature name.\n\nOne way to build a picklist is to use `sourmash sig grep <pattern>\n<collection> --csv out.csv` to construct a CSV file containing a list\nof all sketches that match the pattern (which can be a string or\nregexp). The `out.csv` file can be used as a picklist via the picklist\nmanifest CSV format with `--picklist out.csv::manifest`.\n\nYou can also use `sourmash sig describe --csv out.csv <signatures>` or\n`sourmash sig manifest -o out.csv <filename_or_db>` to construct an\ninitial CSV file that you can then edit further and use as a picklist\nas above.\n\nThe picklist functionality also supports excluding (rather than\nincluding) signatures matching the picklist arguments. To specify a\npicklist for exclusion, add `:exclude` to the `--picklist` argument\nstring, e.g. `pickfile:colname:coltype:exclude`.\n\nFor example,\n```\nsourmash sig extract --picklist list.csv:md5:md5sum:exclude <signatures>\n```\nwill extract only the signatures that have md5sums that **do not** match\nentries in the column `md5sum` in the CSV file `list.csv`.\n\nIn addition to `sig extract`, the following commands support\n`--picklist` selection: `index`, `search`, `gather`, `prefetch`,\n`compare`, `index`, and `lca index`.\n\n### Storing (and searching) signatures\n  \nBacking up a little, there are many ways to store and search\nsignatures. `sourmash` supports storing and loading signatures from\nJSON files, directories, lists of files, Zip files, custom indexed\ndatabases, and SQLite databases.  These can all be used\ninterchangeably for most sourmash operations.\n\nThe simplest is one signature in a single JSON file. You can also put\nmany signatures in a single JSON file, either by building them that\nway with `sourmash sketch` or by using `sourmash sig cat` or other\ncommands. Searching or comparing these files involves loading them\nsequentially and iterating across all of the signatures - which can be\nslow, especially for many (100s or 1000s) of signatures.\n\n### Zip files\n\nAll of the `sourmash` commands support loading collections of\nsignatures from zip files.  You can create a compressed collection of\nsignatures using `sourmash sig cat *.sig -o collections.sig.zip` and then\nspecifying `collections.sig.zip` on the command line in place of `*.sig`;\nyou can also sketch FASTA/FASTQ files directly into a zip file with\n`-o collections.sig.zip`.\n\n### Choosing signature output formats\n\n(sourmash v4.1 and later)\n\nAll signature saving arguments (`--save-matches` for `search` and\n`gather`, `-o` for `sourmash sketch`, and `-o` for the `sourmash\nsignature` commands) support flexible saving of collections of\nsignatures into JSON text, Zip files, and/or directories.\n\nThis behavior is triggered by the requested output filename --\n\n* to save to JSON signature files, use `.sig`; using the filename `-`\n  will send JSON to stdout.\n* to save to gzipped JSON signature files, use `.sig.gz`;\n* to save to a Zip file collection, use `.zip`;\n* to save signature files to a directory, use a name ending in `/`; the directory will be created if it doesn't exist;\n* to save to a SQLite database, use `.sqldb` (as of sourmash v4.4.0).\n\nIf none of these file extensions is detected, output will be written\nin the JSON `.sig` format, either to the provided output filename or\nto stdout.\n\nAll of these save formats can be loaded by sourmash commands.\n\n**We strongly suggest using .zip files to store signatures: they are fast,\nsmall, and fully supported by all the sourmash commands and API.**\n\nNote that when outputting large collections of signatures, some save\nformats require holding all the sketches in memory until they can be\nwritten out, and others can save progressively. This can affect memory\nusage! Currently `.sig` and `.sig.gz` formats are held in memory,\nwhile `.zip`, directory outputs, and `.sqldb` formats write progressively\nto disk.\n\nFor more detailed information on database formats and performance\ntradeoffs, please see [the advanced usage information for\ndatabases!](databases-advanced.md)\n\n### Loading many signatures\n\n#### Indexed databases\n\nIndexed databases can make searching signatures much, much faster.\nRocksDB databases produced by `sourmash index` are low memory and\ndisk-intensive databases that allow for fast searches using an\ninverted index.  (We continue to support other indexed database types,\nincluding SBTs, LCA databases, and SQLite databases, but recommend\nusing RocksDB over these other formats.)\n\nCommands that take multiple signatures or collections of signatures\nwill also work with one or more indexed databases.\n\nOne limitation of indexed databases is that they are all restricted in\nto certain kinds of signatures. RocksDB, SBT, and LCA databases can only\ncontain one \"type\" of signature (one ksize/one moltype at one scaled\nvalue). SQLite databases can contain multiple ksizes and moltypes, but\nonly at one scaled value. If the database signature type is\nincompatible with the other signatures, sourmash will complain\nappropriately.\n\nIn contrast, signature files and zip collections can contain many\ndifferent types of signatures, and compatible ones will be selected\nautomatically.\n\nUse the `sourmash index -F rocksdb` command to create a RocksDB index.\n\n#### Loading signatures within a directory hierarchy\n\nAll of the `sourmash` commands support loading signatures (`.sig` or\n`.sig.gz` files) from within directory hierarchies; you can\nprovide the paths to the top-level directory on the command line.\n\nHowever, this is no longer recommended because it can be very\ninefficient; we instead suggest passing all of the sketch files in\nthe directory into `sig collect` to build a standalone manifest, or\nusing `sig cat` on the directory to generate a zip file.\n\n#### Passing in lists of files\n\nsourmash commands support `--from-file` or `--query-from-file`, which\nwill take the location of a text file containing a list of file\npaths. This can be useful for situations where you want to specify\nthousands of queries, or a subset of signatures produced by some other\ncommand.\n\nThis is no longer recommended when using large collections; we instead\nsuggest using standalone manifests built with `sig collect` and `sig\ncheck`, which will include extra metadata that supports fast loading.\n\n### Combining search databases on the command line\n\nAll of the commands in sourmash operate in \"online\" mode, so **you can\ncombine multiple databases and signatures on the command line and get\nthe same answer as if you built a single large database from all of\nthem**.  The only caveat to this rule is that if you have multiple\nidentical matches present across the databases, the order in which\nthey are used may depend on the order that the files are\npassed in on the command line.\n\n### Using stdin\n\nMost commands will take signature JSON data via stdin using the usual\nUNIX convention, `-`.  Moreover, `sourmash sketch` and the `sourmash\nsig` commands will output to stdout.  So, for example,\n```\nsourmash sketch ... -o - | sourmash sig describe -\n```\nwill describe the signatures that were just created.\n\n### Using standalone manifests to explicitly refer to collections of files\n\n(sourmash v4.4 and later)\n\nManifests are metadata catalogs of signatures that are used for\nsignature selection and loading. They are used extensively by sourmash\ninternals to speed up signature selection through picklists and\npattern matching.\n\nManifests can _also_ be used externally (via the command-line), and\nthese \"standalone manifests\" may be useful for organizing large\ncollections of signatures. They can be generated with the `sig\ncollect`, `sig manifest`, and `sig check` subcommands.\n\nThe only difference between standalone manifests and internal manifests\nare that standalone manifests contain externally resolvable path names\nin the `internal_location` column.\n\nSuppose you have a large collection of signatures (`.sig` or `.sig.gz`\nfiles) in a location (e.g., under a directory, or in a zip file). You\ncan create a manifest file for them like so:\n```\nsourmash sig collect <dir> <zipfile> -o manifest.sqlmf\n```\nand then use the manifest directly for sourmash operations, for example:\n```\nsourmash sig fileinfo manifest.sqlmf\n```\nThis manifest contains _references_ to the signatures (but not the\nsignatures themselves) and can then be used as a database target for most\nsourmash operations - search, gather, etc. Manifests support\nfast selection and lazy loading of sketches in many situations.\n\nThe `sig check` command can also be used to create standalone manifests\nfrom collections using a picklist, with the `-m/--save-manifest-matching`\noption. This is useful for commands that don't support picklists natively,\nsuch as commands in plugins.\n\nNote that `sig collect` and `sig check` will generate manifests containing the\npathnames given to them - so if you use relative paths, the references\nwill be relative to the working directory in which the command was\nrun.  You can use `sig collect --abspath` to rewrite the paths\ninto absolute paths, or `sig collect --relpath` to rewrite the paths\nrelative to the manifest file.\n\n**Our advice:** We suggest using zip file collections for most\nsituations; we strongly recommend using standalone manifests for\nsituations where you have **very large** sketches or a **very large**\ncollection of sketches (1000s or more), and don't want to make\nmultiple copies of signatures in the collection (as you would have to,\nwith a zipfile). This is particularly useful if you want to refer to different\nsubsets of the collection without making multiple copies in a zip\nfile.\n\nYou can read more about the details of zip files and manifests in\n[the advanced usage information for databases](databases-advanced.md).\n\n## Using sourmash plugins\n\nAs of sourmash v4.7.0, sourmash has an experimental plugins interface!\nThe plugin interface supports extending sourmash to load and save\nsignatures in new ways, and also supports the addition of sourmash\nsubcommands via `sourmash scripts`.\n\nIn order to use a plugin with sourmash, you will need to use `pip`\nor `conda` to install the plugin the same environment that sourmash\nis installed in.\n\nIn the future, we will include a list of available sourmash plugins in\nthe documentation, and also provide a way to list available plugins.\n\nYou can list all installed plugins and their versions with `sourmash info -v`.\n\nBelow are some useful plugins that the sourmash team uses regularly\nand supports!\n\n### The `branchwater` plugin - multithreaded and optimized sourmash operations\n\n(Installable via conda and pip as `sourmash_plugin_branchwater`.)\n\nThe\n[`branchwater` plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater)\nprovides faster and lower memory versions of `search`, `gather`, and\n`sketch`, as well as large-scale metagenome search\n(used for [petabyte-scale sequence search](https://www.biorxiv.org/content/10.1101/2022.11.02.514947v1))\nand large-scale clustering.\n\nRead [the branchwater plugin docs](https://github.com/sourmash-bio/sourmash_plugin_branchwater/tree/main/doc/) for more information, and ask questions on [the sourmash issue tracker!](https://github.com/sourmash-bio/sourmash/issues)\n\n### The `betterplot` plugin - improved plotting and visualization\n\n(Installable via pip as `sourmash_plugin_betterplot`.)\n\nThe [`betterplot` plugin](https://github.com/sourmash-bio/sourmash_plugin_betterplot/) provides a variety of new plotting outputs for sourmash, including improved distance matrices, MDS plots, tSNE plots, upset plots, and Venn diagrams. It also supports cluster-cutting and extraction, as well as improved labeling and coloring by category.\n\nRead [the betterplot docs](https://github.com/sourmash-bio/sourmash_plugin_betterplot/) for more information, and ask questions on [the sourmash issue tracker!](https://github.com/sourmash-bio/sourmash/issues)\n\n### The `directsketch` plugin - streaming download and sketch\n\n(Installable via conda and pip as `sourmash_plugin_directsketch`.)\n\nThe [`directsketch` plugin](https://github.com/sourmash-bio/sourmash_plugin_directsketch/) provides two parallelized methods for streaming download and sketch from online sources. It provides two utilities: `gbsketch` for sketching NCBI Assembly Datasets, and `urlsketch` for sketching from generic URLs.\n\nRead [the directsketch docs](https://github.com/sourmash-bio/sourmash_plugin_directsketch/) for more information, and ask questions on [the sourmash issue tracker!](https://github.com/sourmash-bio/sourmash/issues)\n"
  },
  {
    "path": "doc/conf.py",
    "content": "#!/usr/bin/env python3\n#\n# sourmash documentation build configuration file, created by\n# sphinx-quickstart on Sat Jun  4 16:35:43 2016.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\nimport sys\nimport os\n\nimport sourmash\n\nprint(\"sourmash at:\", sourmash)\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\nsys.path.insert(0, os.path.abspath(\"..\"))\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.doctest\",\n    \"sphinx.ext.coverage\",\n    \"sphinx.ext.viewcode\",\n    #    'sphinx.ext.napoleon',\n    \"nbsphinx\",\n    \"IPython.sphinxext.ipython_console_highlighting\",\n    \"myst_parser\",\n    \"sphinx_design\",\n    \"sphinx_copybutton\",\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n# source_suffix = ['.rst', '.md']\nsource_suffix = [\".rst\", \".md\"]\n\n# The encoding of source files.\n# source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = \"index\"\n\n# General information about the project.\nproject = \"sourmash\"\ncopyright = \"2016-2023, C. Titus Brown, Luiz Irber, and N. Tessa Pierce-Ward\"\nauthor = \"C. Titus Brown, Luiz Irber, and N. Tessa Pierce-Ward\"\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\nfrom importlib.metadata import version\n\nrelease = version(\"sourmash\")\nversion = \".\".join(release.split(\".\")[:2])\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = \"en\"\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n# today = ''\n# Else, today_fmt is used as the format for a strftime call.\n# today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = [\"_build\", \"Thumbs.db\", \".DS_Store\"]\n\n# The reST default role (used for this markup: `text`) to use for all\n# documents.\n# default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n# add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n# add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n# show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = \"sphinx\"\n\n# A list of ignored prefixes for module index sorting.\n# modindex_common_prefix = []\n\n# If true, keep warnings as \"system message\" paragraphs in the built documents.\n# keep_warnings = False\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n# CTB: suppress warnings about circularity in ToC.\n# see https://github.com/sphinx-doc/sphinx/issues/7410.\nsuppress_warnings = [\"toc.circular\"]\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = \"alabaster\"\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\nhtml_theme_options = {\n    \"logo\": \"logo.png\",\n    \"logo_name\": True,\n    \"description\": \"Quickly search, compare, and analyze genomic and metagenomic data sets\",\n    \"sidebar_collapse\": False,\n}\n\n# Add any paths that contain custom themes here, relative to this directory.\n# html_theme_path = []\n\n# The name for this set of Sphinx documents.\n# \"<project> v<release> documentation\" by default.\n# html_title = 'sourmash v1.0'\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n# html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n# html_logo = None\n\n# The name of an image file (relative to this directory) to use as a favicon of\n# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n# html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# Add any extra paths that contain custom files (such as robots.txt or\n# .htaccess) here, relative to this directory. These files are copied\n# directly to the root of the documentation.\n# html_extra_path = []\n\n# If not None, a 'Last updated on:' timestamp is inserted at every page\n# bottom, using the given strftime format.\n# The empty string is equivalent to '%b %d, %Y'.\n# html_last_updated_fmt = None\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n# html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\nhtml_sidebars = {\n    \"*\": [\n        \"about.html\",\n        \"navigation.html\",\n        \"relations.html\",\n        \"sourcelink.html\",\n        \"searchbox.html\",\n    ]\n}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n# html_additional_pages = {}\n\n# If false, no module index is generated.\n# html_domain_indices = True\n\n# If false, no index is generated.\n# html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n# html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n# html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n# html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n# html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n# html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n# html_file_suffix = None\n\n# Language to be used for generating the HTML full-text search index.\n# Sphinx supports the following languages:\n#   'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'\n#   'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh'\n# html_search_language = 'en'\n\n# A dictionary with options for the search language support, empty by default.\n# 'ja' uses this config value.\n# 'zh' user can custom change `jieba` dictionary path.\n# html_search_options = {'type': 'default'}\n\n# The name of a javascript file (relative to the configuration directory) that\n# implements a search results scorer. If empty, the default will be used.\n# html_search_scorer = 'scorer.js'\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"sourmashdoc\"\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #'papersize': 'letterpaper',\n    # The font size ('10pt', '11pt' or '12pt').\n    #'pointsize': '10pt',\n    # Additional stuff for the LaTeX preamble.\n    #'preamble': '',\n    # Latex figure (float) alignment\n    #'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, \"sourmash.tex\", \"sourmash Documentation\", \"C. Titus Brown\", \"manual\"),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n# latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n# latex_use_parts = False\n\n# If true, show page references after internal links.\n# latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n# latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n# latex_appendices = []\n\n# If false, no module index is generated.\n# latex_domain_indices = True\n\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [(master_doc, \"sourmash\", \"sourmash Documentation\", [author], 1)]\n\n# If true, show URL addresses after external links.\n# man_show_urls = False\n\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (\n        master_doc,\n        \"sourmash\",\n        \"sourmash Documentation\",\n        author,\n        \"sourmash\",\n        \"One line description of project.\",\n        \"Miscellaneous\",\n    ),\n]\n\n# Documents to append as an appendix to all manuals.\n# texinfo_appendices = []\n\n# If false, no module index is generated.\n# texinfo_domain_indices = True\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n# texinfo_show_urls = 'footnote'\n\n# If true, do not generate a @detailmenu in the \"Top\" node's menu.\n# texinfo_no_detailmenu = False\n\nautodoc_mock_imports = [\"sourmash.minhash\"]\nmyst_heading_anchors = 3\nmyst_enable_extensions = [\n    \"html_admonition\",\n    \"colon_fence\",\n]\n"
  },
  {
    "path": "doc/databases-advanced.md",
    "content": "# sourmash databases - advanced usage information.\n\ntl;dr use `zip` files for heterogeneous collections of sourmash\nsketches, and RocksDB indexes for fast, low-memory searches at a\nspecific ksize/moltype/scaled.\n\nsourmash supports a variety of different mechanisms and formats for storing, organizing, indexing, and searching signatures. Some of these mechanisms, \"collections\", just store the signatures; others (\"indexed\" databases) provide indices on the signatures for fast content-based search. _Most_ of the mechanisms now use manifests that permit fast selection and loading of signatures based on metadata. Below we refer to \"databases\" generically as any on-disk storage mechanism for sourmash signatures.\n\nWhich database type is best to use depends on what you're doing - which is what this document is about! In general, however, sourmash should be fast enough that database choice will only impact performance when searching thousands of signatures, or doing thousands of searches.\n\nThe recommended file extensions below are conventions used to signal the output format when using `-o` with `sourmash sketch` and the `sourmash sig` subcommands; so, for example, `sourmash sketch dna *.fa -o xyz.zip` will output signatures in the .zip format. Indexed formats (SBT, LCA, and RocksDB) need to be constructed with `sourmash index`.\n\nsourmash will automatically detect and load the database, based on the database _content_ and not the database extension, in most cases.\n\nUnless noted otherwise, the below database formats are supported in all releases since sourmash v4.9.0.\n\n## How are signatures actually stored?\n\nsourmash signatures are typically serialized into JSON for on-disk storage, with rare exceptions (SQLite and LCA databases). The internal sourmash code automatically detects and properly handles compressed (gzipped) JSON data.\n\n## Storing signatures in `.zip` files\n\n**This is our recommended format for storing collections of signatures.**\n\nMultiple signatures can be stored in a single .zip file. The best way to construct that zip file is from within sourmash, by specifying `-o filename.zip` when outputting signatures. Zip files created from within sourmash will automatically have manifests; this enables rapid subselection and direct loading of signatures via e.g. picklists.\n\nZip files are not indexed by content, so they can be slow for searching. But they are small, and provide a good compromise between disk size (small), flexibility (can store any mixture of signatures), and speed (good for `gather`, not good for `search`).\n\nZip file collections can contain any number of signatures, of any type (`num` or `scaled`, DNA/protein/dayhoff/hp/skipm1n3/skipm2n3).\n\nYou should create your own zip files by using `sourmash cat ... -o <filename>.sig.zip`; this will create a zip file with an internal manifest that will speed up many operations, including picklists.\n\n### RocksDB indexes.\n\n**This is our recommended format for indexing signatures for search.**\n\nRocksDB indexes are fast and low-memory on-disk inverted indexes that\nsupport massive-scale content-based search. They can be built with\n`sourmash index -F rocksdb`.  RocksDB indexes are fully supported\nsince sourmash v4.9.0.\n\n### Standalone manifests\n\n(This format is ideal for many advanced use cases.)\n\nManifests are catalogs of signature metadata - name, molecule type,\nk-mer size, and other information - that can be used to select\nspecific signatures for searching or processing. Typically when using\nmanifests the actual signatures themselves are not loaded until they\nare needed, although the efficiency of this depends on the signature\nstorage mechanism; for example, JSON-format containers (`.sig` and\n`.lca.json` files) must be entirely loaded before any signature in the\nfile them can be used, unlike zip containers.\n\nAs of sourmash 4.4 manifests can be *directly* loaded from the command\nline as standalone collections. This lets manifests serve as a catalog\nof signatures stored in many different locations. Sketches can be\nselected by name, k-mer size, molecule type, and other features\nwithout loading the actual sketch data.\n\nStandalone manifests are preferable to both directory storage and\npathlists (below), because they support fast selection and direct lazy\nloading. This means that sourmash operations that support streaming or\nonline search (such as `prefetch` and `gather`, among others) can\navoid loading everything all at once.\n\nStandalone manifests are the most effective solution for managing custom\ncollections of thousands to millions of signatures, as well as working\nwith multiple large sketches.\n\nThey can be created with `sourmash sig collect` and `sourmash sig\ncheck` (sourmash v4.4 and later).\n\nSourmash supports two manifest file formats - CSV and SQLite. SQLite\nmanifests are much faster and lower-memory than CSV manifests.\n\n## Storing JSON in `.sig` and `.sig.gz` files: the original format.\n\n(This format is not recommended. Use zip files instead.)\n\nMultiple signatures can be stored in a single JSON file. However, this file will be loaded in its entirety by sourmash, even if you only select one for later analysis.\n\nThis is the least efficient way to store multiple signatures, because all of the JSON must be loaded before any signature can be selected or searched. But it is the oldest format and so a lot of our documentation describes it!\n\n### Storing signatures in SQLite databases\n\n(This format is not recommended any more; use zip files.)\n\nAs of sourmash 4.4, we support storing signatures directly in a [SQLite](https://www.sqlite.org/index.html) database (`-o .sqldb`). This is a fast, low-memory, on-disk format that is suitable for use with `search` and can support multiple simultaneous queries. However, the resulting file is also rather large, so we do not distribute databases in this format.\n\nSQLite databases are implemented as an [inverted index](https://en.wikipedia.org/wiki/Inverted_index), with hashes stored directly in a table.\n\nSQLite databases are limited to scaled signatures, and can only contain sketches with the same scaled value across the entire database. They *can* store multiple molecule types.\n\nWe do not recommend using SQLite databases for storing signatures, although\nthey are still fully supported.\n\n### Other Indexed collections - SBTs and LCAs.\n\n(These formats are not recommended any more, although they are still supported; use RocksDB indexes instead.)\n\nWe provide two other indexed collection formats, Sequence Bloom Trees (SBTs) and LCA databases.\n\nSBTs implement our version of [Sequence Bloom Trees](http://www.cs.cmu.edu/~ckingsf/software/bloomtree/), a fast tree-based index that support rapid `search` for matches; they are particularly effective when searching for *best* matches across large databases. They are relatively low memory and typically about twice the size of .zip files on disk. They can be constructed with `sourmash index`.\n\nLCA databases are [inverted indices](https://en.wikipedia.org/wiki/Inverted_index) that support individual hash lookup. They provide fast `search` and `gather`, and also support all of the `sourmash lca` subcommands for hash-based taxonomic analysis. There are two LCA database formats, JSON and SQLite; JSON is small on disk but JSON LCA databases consume a lot of memory when loaded, while SQLite LCA databases are large on disk but low-memory and fast. JSON LCA databases do not support multiprocess queries. LCA databases can be constructed with `sourmash lca index`.\n\nBoth SBTs and LCA databases can only store homogeneous collections of signature types - all signatures must have the same molecule type and scaled or num value. Furthermore, LCA databases can only store scaled signatures.\n\nWe no longer recommend SBT and LCA databases. As of sourmash v4.9.0,\nsourmash supports RocksDB indexes, which are much faster and lower\nmemory.  See\n[the `index` documentation](command-line.md#sourmash-index-build-an-index-of-signatures).  The\ntaxonomic functionality of LCAs is also no longer recommended; use\n[`sourmash tax` instead](command-line.md#sourmash-tax-subcommands-for-integrating-taxonomic-information-into-gather-results).\n\n### Directories\n\n(No longer recommended. Use zip files or standalone manifests instead.)\n\nDirectory hierarchies of signatures are read natively by sourmash, and\ncan be created or extended by specifying `-o dirname/` (with a\ntrailing slash).\n\nTo read from a directory, specify the directory name on the sourmash\ncommand line. When reading from directories, the entire directory\nhierarchy is traversed and all `.sig` and `.sig.gz` files are loaded\nas signatures. If `--force` is specified, _all_ files will be read,\nand failures will be ignored.\n\nWhen directories are specified as outputs, the signatures will be\nsaved by their complete md5sum underneath the directory.\n\nWe don't recommend loading signatures from directory hierarchies,\nsince the implementation is not particularly memory efficient and most\nof the use cases for directories are now covered by other approaches -\nin particular, standalone manifests.\n\n### Pathlists\n\n(No longer recommended. Use zip files or standalone manifests instead.)\n\nPathlists are text files containing paths to one or more sourmash\ndatabases; any type of sourmash-readable collection can be listed.\n\nThe paths in pathlists can be relative or absolute within the file\nsystem. If they are relative, they must resolve with respect to the\ncurrent working directory of the sourmash command.\n\nWe don't recommend using pathlists, since the original use cases are\nnow supported with picklists and standalone manifests, but they are\nstill supported. Loading sketches from pathlists is also not very\nefficient.\n\nPathlists are not output by any sourmash commands.\n\nMany commands support `--query-from-file` or `--from-file` as a way to\npass in a file containing many paths to sketches or collections. The\ninternal implementation of sourmash simply adds these to the\ncommand-line arguments, and this is an effective and efficient way to\nprovide long lists of files to commands like `sig check` and `sig\ncollect` that create standalone manifests to support efficient lazy\nloading.\n\n## Storing taxonomies\n\nsourmash supports taxonomic information output via the `sourmash lca` and `sourmash tax` subcommands. Both sets of commands rely on the same 7 taxonomic ranks: superkingdom, phylum, class, order, family, genus, and species (with limited support for a 'strain' rank). And both sets of subcommands take lineage spreadsheets that link specific identifiers to taxonomic lineages.\n\nLineage spreadsheets can be provided in two on-disk formats, CSV and SQLite.\n\nCSV is the original format, and consists of separate columns for identifier and each taxonomic rank.\n\nSQLite taxonomy databases are typically built from CSV using `sourmash tax prepare`. They contain a single table, `sourmash_taxonomy`, with columns for `ident` and each taxonomic rank. Only the `sourmash tax` command supports SQLite taxonomy databases.\n\n## Appendix: SQLite complexities\n\nThe SQLite implementation of signature storage, metadata manifests, and LCA databases is all bundled into a single SQLite database. Because of this, sourmash must examine the database tables to decide what kind of sourmash structure the database is - the logic is roughly this:\n\n* does the database store both sketch information and taxonomy information? It's an LCA database!\n* if it has sketch information but no taxonomy information, it's just a regular index.\n* if it only has manifest information, it's a manifest!\n* if it only has taxonomy information, it's a taxonomy!\n\nThis is complicated by several other details -\n\n* we can treat SQLite databases with sketch information as read-only manifests, but because the sketch information is tightly coupled to the manifest table, we cannot insert new manifest entries;\n* we can treat SQLite databases with sketch information as read/write taxonomy files, since the taxonomy information is not tightly coupled to the sketches;\n\nLast but not least, the hashes in SQLite are stored as signed 64-bit integers and must be converted to unsigned 64-bit numbers internally by sourmash; negative numbers in the SQLite table represent unsigned ints that are larger than 2**63 - 1. Please see [this blog post](http://ivory.idyll.org/blog/2022-storing-ulong-in-sqlite-sourmash.html) for more information.\n\nThe SQLite schema itself is not very complicated and can be used for lineage and manifest querying by other scripts. However, we recommend doing hash value querying/search via the Python code.\n"
  },
  {
    "path": "doc/databases-md/gtdb220.md",
    "content": "<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/gtdb.md -->\n\n# Collection: GTDB RS220\n\nBacterial and Archaeal genomes from GTDB RS220.\n\nLinks:\n\n* [Announcement](https://forum.gtdb.ecogenomic.org/t/announcing-gtdb-r09-rs220/595)\n\n## Database files\n\n| K-mer size | GTDB reps | GTDB entire |\n| -------- | -------- | -------- |\n| 21 | [download (2.8 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k21.dna.zip) | [download (17.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k21.dna.zip)  |\n| 31 | [download (2.8 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k31.dna.zip) | [download (17.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k31.dna.zip)  |\n| 51 | [download (2.8 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k51.dna.zip) | [download (17.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k51.dna.zip)  |\n\n\n## Taxonomy files\n\n* [GTDB taxonomy for RS220.](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220.lineages.csv)\n\n\n## Advanced\n\n<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/advanced.md -->\n\n### Complete list of database files\n\nFiles:\n\n* zip: [gtdb-rs220-k21.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k21.dna.zip) - all GTDB genomes - DNA, k=21, scaled=1000 (17.0 GB)\n* zip: [gtdb-rs220-k31.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k31.dna.zip) - all GTDB genomes - DNA, k=31, scaled=1000 (17.0 GB)\n* zip: [gtdb-rs220-k51.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k51.dna.zip) - all GTDB genomes - DNA, k=51, scaled=1000 (17.0 GB)\n\n\n* zip: [gtdb-reps-rs220-k21.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k21.dna.zip) - GTDB species representative genomes - DNA, k=21, scaled=1000 (2.8 GB)\n* zip: [gtdb-reps-rs220-k31.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k31.dna.zip) - GTDB species representative genomes - DNA, k=31, scaled=1000 (2.8 GB)\n* zip: [gtdb-reps-rs220-k51.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k51.dna.zip) - GTDB species representative genomes - DNA, k=51, scaled=1000 (2.8 GB)\n\n\n\n### Download via curl using the command line\n\n```shell\n# download gtdb-rs220-k21.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k21.dna.zip\n\n# download gtdb-rs220-k31.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k31.dna.zip\n\n# download gtdb-rs220-k51.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k51.dna.zip\n\n# download gtdb-reps-rs220-k21.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k21.dna.zip\n\n# download gtdb-reps-rs220-k31.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k31.dna.zip\n\n# download gtdb-reps-rs220-k51.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k51.dna.zip\n\n# download taxonomy file\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220.lineages.csv\n```\n\n\n\n### A list of all the URLs\n\n```\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k21.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k31.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220-k51.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k21.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k31.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-reps-rs220-k51.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs220/gtdb-rs220.lineages.csv\n```"
  },
  {
    "path": "doc/databases-md/gtdb226.md",
    "content": "<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/gtdb.md -->\n\n# Collection: GTDB RS226\n\nBacterial and Archaeal genomes from GTDB RS226.\n\nLinks:\n\n* [Announcement](https://forum.gtdb.ecogenomic.org/t/announcing-gtdb-r10-rs226/724)\n\n## Database files\n\n| K-mer size | GTDB reps | GTDB entire | RocksDB index of entire |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (3.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k21.dna.zip) | [download (21.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.zip)  | [download (31.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.rocksdb.tar.gz)  |\n| 31 | [download (3.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k31.dna.zip) | [download (21.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.zip)  | [download (32.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.rocksdb.tar.gz)  |\n| 51 | [download (3.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k51.dna.zip) | [download (21.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.zip)  | [download (33.0 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.rocksdb.tar.gz)  |\n\n\nNote: RocksDB indexes must be unpacked before use, while the other\ndatabases can be used directly as zip files. You can\n[unpack while downloading](https://unix.stackexchange.com/questions/85194/how-to-download-an-archive-and-extract-it-without-saving-the-archive-to-disk/85195#85195)\nin order to avoid temporarily using disk space to store the downloaded tar.gz.\n\n## Taxonomy files\n\n* [GTDB taxonomy for RS226.](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226.lineages.csv)\n\n\n## Advanced\n\n<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/advanced.md -->\n\n### Complete list of database files\n\nFiles:\n\n* zip: [gtdb-reps-rs226-k21.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k21.dna.zip) - GTDB species representative genomes - DNA, k=21, scaled=1000 (3.7 GB)\n* zip: [gtdb-reps-rs226-k31.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k31.dna.zip) - GTDB species representative genomes - DNA, k=31, scaled=1000 (3.7 GB)\n* zip: [gtdb-reps-rs226-k51.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k51.dna.zip) - GTDB species representative genomes - DNA, k=51, scaled=1000 (3.7 GB)\n\n\n* zip: [gtdb-rs226-k21.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.zip) - all GTDB genomes - DNA, k=21, scaled=1000 (21.0 GB)\n* zip: [gtdb-rs226-k31.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.zip) - all GTDB genomes - DNA, k=31, scaled=1000 (21.0 GB)\n* zip: [gtdb-rs226-k51.dna.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.zip) - all GTDB genomes - DNA, k=51, scaled=1000 (21.0 GB)\n\n\n* tar.gz: [gtdb-rs226-k21.dna.rocksdb.tar.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.rocksdb.tar.gz) - all GTDB genomes, indexed with RocksDB - DNA, k=21, scaled=1000 (31.0 GB)\n* tar.gz: [gtdb-rs226-k31.dna.rocksdb.tar.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.rocksdb.tar.gz) - all GTDB genomes, indexed with RocksDB - DNA, k=31, scaled=1000 (32.0 GB)\n* tar.gz: [gtdb-rs226-k51.dna.rocksdb.tar.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.rocksdb.tar.gz) - all GTDB genomes, indexed with RocksDB - DNA, k=51, scaled=1000 (33.0 GB)\n\n\n\n### Download via curl using the command line\n\n```shell\n# download gtdb-reps-rs226-k21.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k21.dna.zip\n\n# download gtdb-reps-rs226-k31.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k31.dna.zip\n\n# download gtdb-reps-rs226-k51.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k51.dna.zip\n\n# download gtdb-rs226-k21.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.zip\n\n# download gtdb-rs226-k31.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.zip\n\n# download gtdb-rs226-k51.dna.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.zip\n\n# download gtdb-rs226-k21.dna.rocksdb.tar.gz\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.rocksdb.tar.gz\n\n# download gtdb-rs226-k31.dna.rocksdb.tar.gz\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.rocksdb.tar.gz\n\n# download gtdb-rs226-k51.dna.rocksdb.tar.gz\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.rocksdb.tar.gz\n\n# download taxonomy file\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226.lineages.csv\n```\n\n\n\n### Download and unpack RocksDB indexes\n\n```\n\n# download and unpack gtdb-rs226-k21.dna.rocksdb.tar.gz\ncurl -L https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.rocksdb.tar.gz | tar xzf -\n\n# download and unpack gtdb-rs226-k31.dna.rocksdb.tar.gz\ncurl -L https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.rocksdb.tar.gz | tar xzf -\n\n# download and unpack gtdb-rs226-k51.dna.rocksdb.tar.gz\ncurl -L https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.rocksdb.tar.gz | tar xzf -\n\n```\n\n\n### A list of all the URLs\n\n```\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k21.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k31.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-reps-rs226-k51.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k21.dna.rocksdb.tar.gz\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k31.dna.rocksdb.tar.gz\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226-k51.dna.rocksdb.tar.gz\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/gtdb-rs226/gtdb-rs226.lineages.csv\n```"
  },
  {
    "path": "doc/databases-md/ncbi_euks_2025_01.md",
    "content": "<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/ncbi.md -->\n\n# Collection: NCBI Eukaryotes (Jan 2025)\n\nAll eukaryotic reference genomes from NCBI (NCBI:txid2759) as of January 2025.\n\nLinks:\n\n* [NCBI Taxonomy](https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=2759&lvl=3&lin=f&keep=1&srchmode=1&unlock)\n\n## Database files\n\n\n### Indexed RocksDB collections\n\n   * tar.gz: [ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz) - all NCBI eukaryotes, indexed in a RocksDB - DNA, k=51, scaled=10000 (19.0 GB)\n\n\nNote: RocksDB indexes must be unpacked before use, while the other\ndatabases can be used directly as zip files. You can\n[unpack while downloading](https://unix.stackexchange.com/questions/85194/how-to-download-an-archive-and-extract-it-without-saving-the-archive-to-disk/85195#85195)\nin order to avoid temporarily using disk space to store the downloaded tar.gz.\n\n\n\n### Zip collections\n\n   * zip: [ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip) - vertebrate reference genomes (NCBI:txid7742) - DNA, k=51, scaled=10000 (4.0 GB)\n\n   * zip: [ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip) - bilateria minus the vertebrates - DNA, k=51, scaled=10000 (1.7 GB)\n\n   * zip: [ncbi-euks-plants-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-plants-2025.01.dna.k=51.sig.zip) - plant reference genomes (NCBI:txid33090) - DNA, k=51, scaled=10000 (1.3 GB)\n\n   * zip: [ncbi-euks-fungi-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-fungi-2025.01.dna.k=51.sig.zip) - fungal reference genomes (NCBI:txid4751) - DNA, k=51, scaled=10000 (0.2 GB)\n\n   * zip: [ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip) - metazoan reference genomes minus the bilateria - DNA, k=51, scaled=10000 (0.1 GB)\n\n   * zip: [ncbi-euks-other-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-other-2025.01.dna.k=51.sig.zip) - remaining eukaryotes (not plants, fungi, or metazoa) - DNA, k=51, scaled=10000 (0.1 GB)\n\n\n## Taxonomy files\n\n* [NCBI taxonomy for eukaryotes (NCBI:txid2759) as of January 2025.](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-eukaryotes.2025.01.lineages.csv)\n\n\n## Advanced\n\n<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/advanced.md -->\n\n### Complete list of database files\n\nFiles:\n\n* tar.gz: [ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz) - all NCBI eukaryotes, indexed in a RocksDB - DNA, k=51, scaled=10000 (19.0 GB)\n\n\n* zip: [ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip) - vertebrate reference genomes (NCBI:txid7742) - DNA, k=51, scaled=10000 (4.0 GB)\n\n\n* zip: [ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip) - bilateria minus the vertebrates - DNA, k=51, scaled=10000 (1.7 GB)\n\n\n* zip: [ncbi-euks-plants-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-plants-2025.01.dna.k=51.sig.zip) - plant reference genomes (NCBI:txid33090) - DNA, k=51, scaled=10000 (1.3 GB)\n\n\n* zip: [ncbi-euks-fungi-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-fungi-2025.01.dna.k=51.sig.zip) - fungal reference genomes (NCBI:txid4751) - DNA, k=51, scaled=10000 (0.2 GB)\n\n\n* zip: [ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip) - metazoan reference genomes minus the bilateria - DNA, k=51, scaled=10000 (0.1 GB)\n\n\n* zip: [ncbi-euks-other-2025.01.dna.k=51.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-other-2025.01.dna.k=51.sig.zip) - remaining eukaryotes (not plants, fungi, or metazoa) - DNA, k=51, scaled=10000 (0.1 GB)\n\n\n\n### Download via curl using the command line\n\n```shell\n# download ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz\n\n# download ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip\n\n# download ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip\n\n# download ncbi-euks-plants-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-plants-2025.01.dna.k=51.sig.zip\n\n# download ncbi-euks-fungi-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-fungi-2025.01.dna.k=51.sig.zip\n\n# download ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip\n\n# download ncbi-euks-other-2025.01.dna.k=51.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-other-2025.01.dna.k=51.sig.zip\n\n# download taxonomy file\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-eukaryotes.2025.01.lineages.csv\n```\n\n\n\n### Download and unpack RocksDB indexes\n\n```\n\n# download and unpack ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz\ncurl -L https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz | tar xzf -\n\n```\n\n\n### A list of all the URLs\n\n```\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-all-2025.01-k51.dna.rocksdb.tar.gz\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-vertebrates-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-bilateria-minus-vertebrates-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-plants-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-fungi-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-metazoa-minus-bilateria-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-euks-other-2025.01.dna.k=51.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-euks-2025.01/ncbi-eukaryotes.2025.01.lineages.csv\n```"
  },
  {
    "path": "doc/databases-md/ncbi_viruses_2025_01.md",
    "content": "<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/ncbi.md -->\n\n# Collection: NCBI Viruses (Jan 2025)\n\nAll viruses from NCBI (NCBI:txid10239) as of January 2025.\n\nLinks:\n\n* [NCBI Taxonomy](https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=10239&lvl=3&lin=f&keep=1&srchmode=1&unlock)\n\n## Database files\n\n\n\n### Zip collections\n\n   * zip: [ncbi-viruses-2025.01.dna.k=21.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=21.sig.zip) - all viral genomes - DNA, k=21, scaled=50 (1.4 GB)\n\n   * zip: [ncbi-viruses-2025.01.dna.k=31.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=31.sig.zip) - all viral genomes - DNA, k=31, scaled=50 (1.4 GB)\n\n   * zip: [ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip) - all viral genomes - skip_m2n3, k=24, scaled=50 (2.7 GB)\n\n\n## Taxonomy files\n\n* [NCBI taxonomy for viruses as of January 2025.](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses.2025.01.lineages.csv)\n\n\n## Advanced\n\n<!-- automatically generated by code in https://github.com/sourmash-bio/2025-sourmash-databases-doc-template/ -->\n<!-- template file: templates/advanced.md -->\n\n### Complete list of database files\n\nFiles:\n\n* zip: [ncbi-viruses-2025.01.dna.k=21.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=21.sig.zip) - all viral genomes - DNA, k=21, scaled=50 (1.4 GB)\n* zip: [ncbi-viruses-2025.01.dna.k=31.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=31.sig.zip) - all viral genomes - DNA, k=31, scaled=50 (1.4 GB)\n* zip: [ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip) - all viral genomes - skip_m2n3, k=24, scaled=50 (2.7 GB)\n\n\n\n### Download via curl using the command line\n\n```shell\n# download ncbi-viruses-2025.01.dna.k=21.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=21.sig.zip\n\n# download ncbi-viruses-2025.01.dna.k=31.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=31.sig.zip\n\n# download ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip\n\n# download taxonomy file\ncurl -O --no-clobber https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses.2025.01.lineages.csv\n```\n\n\n\n### A list of all the URLs\n\n```\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=21.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.dna.k=31.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses-2025.01.skip_m2n3.k=24.sig.zip\nhttps://farm.cse.ucdavis.edu/~ctbrown/sourmash-db.new/ncbi-viruses-2025.01/ncbi-viruses.2025.01.lineages.csv\n```"
  },
  {
    "path": "doc/databases.md",
    "content": "# Prepared databases\n\n```{contents}\n```\n\n## Modern databases\n\nWe provide a number of pre-built collections and indexed databases\nthat you can use with sourmash.  As of August 2025, we provide\ndatabases in zip and RocksDB formats; older databases are available in\na variety of [legacy formats](legacy-databases.md).\n\n[GTDB RS220](databases-md/gtdb220.md) -- Bacterial and Archaeal genomes from GTDB RS220.\n\n[GTDB RS226](databases-md/gtdb226.md) -- Bacterial and Archaeal genomes from GTDB RS226.\n\n[NCBI Viruses (Jan 2025)](databases-md/ncbi_viruses_2025_01.md) -- All viruses from NCBI (NCBI:txid10239) as of January 2025.\n\n[NCBI Eukaryotes (Jan 2025)](databases-md/ncbi_euks_2025_01.md) -- All eukaryotic reference genomes from NCBI (NCBI:txid2759) as of January 2025.\n\n## Database formats and sourmash versions\n\nZip format databases can be used with sourmash v4.1.0 and later (May\n2021), while RocksDB databases can be used with sourmash v4.9.0 and\nlater (May 2025).  All older database formats work with these versions\nof sourmash as well, and we always recommend using the latest version\navailable.\n\n## Legacy database information (2024 and before)\n\nLegacy databases are available [here](legacy-databases.md).\n"
  },
  {
    "path": "doc/dev_plugins.md",
    "content": "# sourmash plugins via Python entry points\n\nAs of version 4.7.0, sourmash has experimental support for Python\nplugins to load and save signatures in different ways (e.g. file\nformats, RPC servers, databases, etc.) and to run additional commands\nvia the command-line.  This support is provided via\nthe \"entry points\" mechanism supplied by\n[`importlib.metadata`](https://docs.python.org/3/library/importlib.metadata.html)\nand documented\n[here](https://setuptools.pypa.io/en/latest/userguide/entry_point.html).\n\n```{note}\nNote: The plugin API is _not_ finalized or subject to semantic\nversioning just yet!  Please subscribe to\n[sourmash#1353](https://github.com/sourmash-bio/sourmash/issues/1353)\nif you want to keep up to date on plugin support.\n```\n\nYou can define entry points in the `pyproject.toml` file\nlike so:\n\n```\n[project.entry-points.\"sourmash.load_from\"]\na_reader = \"module_name:load_sketches\"\n\n[project.entry-points.\"sourmash.save_to\"]\na_writer = \"module_name:SaveSignatures_WriteFile\"\n\n[project.entry-points.\"sourmash.cli_script\"]\nnew_cli = \"module_name:Command_NewCommand\"\n```\n\nHere, `module_name` should be the name of the module to import.\n\n* `load_sketches` should be a function that takes a location along with\narbitrary keyword arguments and returns an `Index` object\n(e.g. `LinearIndex` for a collection of in-memory\nsignatures).\n* `SaveSignatures_WriteFile` should be a class that\nsubclasses `BaseSave_SignaturesToLocation` and implements its own\nmechanisms of saving signatures. See the `sourmash.save_load` module\nfor saving and loading code already used in sourmash.\n* `Command_NewCommand` should be a class that subclasses\n  `plugins.CommandLinePlugin` and provides an `__init__` and\n  `main` method.\n\nNote that if the reader function or writer class has a `priority`\nattribute, this will be used to determine the order in which the\nplugins are called. Priorities lower than 10 will get called before\nany internal load or save function, while priorities greater than 80\nwill get called after almost all internal load/save functions; see\n`src/sourmash/save_load.py` for details and the current priorities.\n\nThe `name` attribute of the plugin (`a_reader`, `a_writer`, and `new_cli` in\n`pyproject.toml`, above) is only used in debugging.\n\nYou can provide zero or more plugins, and you can define just a reader, or\njust a writer, or just a CLI plugin.\n\n## Templates and examples\n\nIf you want to create your own plug-in, you can start with the\n[sourmash_plugin_template](https://github.com/sourmash-bio/sourmash_plugin_template) repo.\n\nSome (early stage) plugins are also available as examples:\n\n* [sourmash-bio/sourmash_plugin_load_urls](https://github.com/sourmash-bio/sourmash_plugin_load_urls) - load signatures and CSV manifests via [fsspec](https://filesystem-spec.readthedocs.io/).\n* [sourmash-bio/sourmash_plugin_avro](https://github.com/sourmash-bio/sourmash_plugin_avro) - use [Apache Avro](https://avro.apache.org/) as a serialization format.\n\n## Debugging plugins\n\n`sourmash info -v` will list all installed plugins and their versions.\n\n`sourmash sig cat <input sig> -o <output sig>` is a simple way to\ninvoke a `save_to` plugin. Use `-d` to turn on debugging output.\n\n`sourmash sig describe <input location>` is a simple way to invoke\na `load_from` plugin. Use `-d` to turn on debugging output.\n\n`sourmash scripts` will list available command-line plugins.\n\n## Semantic versioning and listing sourmash as a dependency\n\nPlugins should generally list sourmash as a dependency for installation.\n\nOnce plugins are officially supported by sourmash, the plugin API will\nbe under [semantic versioning constraints](https://semver.org/). That\nmeans that you should constrain plugins to depend on sourmash only up\nto the next major version, e.g. sourmash v5.\n\nSpecifically, we suggest placing something like:\n```\ndependencies = ['sourmash>=4.8.0,<5']\n```\nin your `pyproject.toml` file.\n"
  },
  {
    "path": "doc/developer.md",
    "content": "```{contents} Contents\n:depth: 3\n```\n\n# Developer information\n\n## Development environment\n\nYou can get the latest development branch with:\n```\ngit clone https://github.com/sourmash-bio/sourmash.git\n```\nsourmash runs under Python 3.11 and later.\n\nWe recommend using `conda` for setting up an environment for developing\nnew features, running tests and code quality checks.\nHere are some suggestions on how to set them up\n\n:::{note}\nYou only need one of these, no need to install them all!\n:::\n\n::::{tab-set}\n\n:::{tab-item} conda\n\nFollow the [installation instructions](https://github.com/conda-forge/miniforge#install) for\ninstalling `Miniforge3` (a conda distribution that uses\nthe [`conda-forge`](https://conda-forge.org/) channel by default).\n\nOnce `conda` is installed, run\n```\nconda env create -n sourmash_dev --file dev.yml\n```\nto create an environment called `sourmash_dev` containing the programs needed\nfor development.\n\nOnce the environment is created, you can activate it for development with\n```\nconda activate sourmash_dev\n```\n\n:::\n\n:::{tab-item} pixi\n\nFollow the [installation instructions](https://github.com/prefix-dev/pixi) for\ninstalling `pixi`.\n\nTo activate the new environment, run\n```\npixi shell\n```\nand proceed to the [\"Running tests and checks\"](#running-tests-and-checks) section.\n\n:::\n\n:::{tab-item} nix\n\nFollow the [installation instructions](https://zero-to-nix.com/start/install)\nfor setting up Nix in your system (Linux or macOS).\n\nOnce Nix is installed, run\n```\nnix develop\n```\nto start an environment ready for [running tests and checks](#running-tests-and-checks).\n\n:::\n\n:::{tab-item} General instructions\n\nAs long as you have `tox` and a Rust compiler available,\nyou can skip `conda`, `pixi`, or `nix`.\n\nFor Rust, we suggest using `rustup` to install the Rust environment:\n```\ncurl https://sh.rustup.rs -sSf | sh\n```\n\nAnd for `tox` you can use [pipx](https://pipx.pypa.io/latest/installation/) for\ninstalling it without interfering with other Python environments:\n```\npipx install tox\n```\n\nWe suggest working on sourmash in a virtualenv; e.g. from within the\ncloned repository (and after installing `tox` and Rust), you can do:\n```\ntox -e dev\n. .tox/dev/bin/activate\n```\n\nFinally, you can also explicitly install all the Python dependencies for sourmash by running\n```\npip install -r requirements.txt\n```\n(but they are already installed in the virtualenv created with `tox -e dev`).\n\nTo update rust to the latest version, use `rustup update`.\n\nTo update your Python dependencies to the latest required for sourmash, you can run `pip install -r requirements.txt`.\n\n:::\n\n::::\n\n\n## Running tests and checks\n\nWe use [`tox`](https://tox.readthedocs.io) for managing dependencies and\nrunning tests and checks during development.\n`tox -l` lists available tasks.\n\nYou can run tests by invoking `make test` in the sourmash directory;\n`tox -e py311` will run the Python tests with Python 3.11,\nand `cargo test` will run the Rust tests.\n\n## Adding new changes\n\nWe use [`pre-commit`](https://pre-commit.com/) to run automatic checks and fixes\nwhen developing sourmash. You can run it with\n```\ntox -e fix_lint\n```\nwhich prints a \"hint\" at the end of the run with instructions to set it up to\nrun automatically every time you run `git commit`.\n\n## Automated tests and code coverage calculation\n\nWe use [GitHub Actions][2] for continuous integration.\n\nCode coverage can be viewed interactively at [codecov.io][1].\n\n[1]: https://codecov.io/gh/sourmash-bio/sourmash/\n[2]: https://github.com/sourmash-bio/sourmash/actions\n\n## Writing docs.\n\nPlease see [the docs README](README.md) for information on how we\nwrite and build the sourmash docs.\n\n## Code organization\n\nThere are three main components in the sourmash repo:\n- Python module (in `src/sourmash/`)\n- The command-line interface (in `src/sourmash/cli`)\n- The Rust core library  (in `src/core`)\n\n`pyproject.toml` has all the configuration to prepare a Python package containing these\nthree components.\nFirst it compiles the Rust core component into a shared library,\nwhich is wrapped by [cffi] and exposed to the Python module.\nThese steps are executed by [maturin],\na modern [PEP 517]-compatible build backend for Python projects containing Rust\nextensions.\n\n[cffi]: https://cffi.readthedocs.io/\n[maturin]: https://www.maturin.rs/\n[PEP 517]: https://peps.python.org/pep-0517/\n\nA short description of the high-level files and dirs in the sourmash repo:\n```\n.\n├── benchmarks/         | Benchmarks for the Python module\n├── binder/             | mybinder.org configuration\n├── data/               | data used for demos\n├── doc/                | the documentation rendered in sourmash.bio\n├── include/            | C/C++ header files for using core library\n├── src/                |\n│   ├── core/           | Code for the core library (Rust)\n│   └── sourmash/       | The Python module and CLI code\n├── tests/              | Tests for the Python module and CLI\n├── utils/              |\n├── asv.conf.json       | benchmarking config file (for ASV)\n├── Cargo.toml          | Rust definition for a workspace\n├── CITATION.cff        | Citation info\n├── codemeta.json       | Metadata for software discovery\n├── CODE_OF_CONDUCT.rst | Code of conduct\n├── CONTRIBUTING.md     | Instruction for contributing to development\n├── LICENSE             | License for the repo\n├── Makefile            | Entry point for most development tasks\n├── MANIFEST.in         | Describes what files to add to the Python package\n├── matplotlibrc        | Configuration for matplotlib\n├── flake.nix           | Nix definitions (package, dev env)\n├── shell.nix           | Nix config  for creating a dev env (backward-compatible)\n├── paper.bib           | References in the JOSS paper\n├── paper.md            | JOSS paper content\n├── pyproject.toml      | Python project definitions (build system and tooling)\n├── README.md           | Info to get started\n├── requirements.txt    | Python dependencies for development\n└── tox.ini             | Configuration for test automation\n```\n\n### The Python module (and CLI)\n\n```\nsrc/sourmash\n├── cli/                | Command-line parsing, help messages and overall infrastucture\n├── command_compute.py  | compute command implementation\n├── command_compute.py  | sketch command implementation\n├── commands.py         | implementation for other CLI commands\n├── compare.py          | Signature comparison functions\n├── _compat.py          | Py2/3 compatibility functions\n├── exceptions.py       | Mapping from core library errors to Python exceptions\n├── fig.py              | Plotting functions\n├── index.py            | Index base class and definitions\n├── lca/                | LCA index and utility functions\n├── logging.py          | Logging functions (notify, error, set_quiet)\n├── __main__.py         | Entry point for the CLI\n├── _minhash.py         | MinHash sketch implementation (calls the core library)\n├── np_utils.py         | NumPy utils\n├── sbt*.py             | SBT implementation\n├── search.py           | search functions for indices (search, gather)\n├── sig                 | signature manipulation functions\n│   └── __main__.py     | implementation for `sourmash sig` commands\n├── signature_json.py   | signature parsing code (to/from JSON)\n├── signature.py        | signature class and methods\n├── sourmash_args.py    | convenient shortcuts for CLI usage\n└── utils.py            | Convenience functions to interact with core library\n```\n\n### The Rust core library\n\nThis is completely defined in `src/core` to avoid mixing with the code of other components\n(and trying to make it easier to reason about changes).\nIf you're only working on the core,\nyou don't need to change any files outside this directory.\n\nThis is also published to [crates.io] (the Rust package repository) and [NPM],\nafter it is compiled to Webassembly.\nThe GitHub Actions workflow publishes new versions automatically to these\nrepositories.\n\n[crates.io]: https://crates.io/crates/sourmash\n[NPM]: https://www.npmjs.com/package/sourmash\n\n```\nsrc/core\n├── benches/             | Benchmarks for the core library\n├── Cargo.toml           | Crate definition and metadata\n├── cbindgen.toml        | Configuration for cbindgen (the C header generator)\n├── examples/            | Examples using the crate API\n├── README.md            | Containing links to CI, docs and general info about crate.\n├── src                  |\n│   ├── cmd.rs           | High-level commands (search, index, compute...)\n│   ├── errors.rs        | All the errors generated by this crate\n│   ├── ffi/             | FFI-related functions. They are exported to a C header by cbindgen.\n│   ├── from.rs          | Conversion methods for other crates\n│   ├── index/           | Index methods. An index is a collection of signatures, optimized for searching.\n│   ├── lib.rs           | Entry point for the library, control the exposed public API.\n│   ├── signature.rs     | Signature methods. A signature is a collection of sketches.\n│   ├── sketch/          | Sketch methods. A sketch is compressed representation of data.\n│   └── wasm.rs          | Webassembly API.\n└── tests/               | Integration tests (using the public API of the crate)\n```\n\n### Exposing new functions on the FFI\n\nIf you change anything in `src/core/src/ffi` (where the boundary between Rust\nand C is defined) you need to regenerate the `include/sourmash.h` header,\nand potentially fix any differences in the Python CFFI layer (which reads the C\nheader file and expose functionality to Python).\n\nTo regenerate the C header, run\n```\n$ make include/sourmash.h\n```\nThis requires `cbindgen` (and technically a nightly Rust compiler,\nbut we cheat with `RUSTC_BOOTSTRAP=1`. For more info check [this post]).\n`cbindgen` can be installed by running\n```\n$ cargo install --force cbindgen\n```\n\n[this post]: https://fasterthanli.me/articles/my-ideal-rust-workflow\n\n### Changing code touching all layers: an example PR\n\nLuiz wrote a [blog post] describing a PR that changes code at the Python API down to the Rust code library,\nincluding some tools for evaluating performance changes.\n\n[blog post]: https://blog.luizirber.org/2020/01/10/sourmash-pr/\n\n## Versioning\n\nVersions are tagged in a `vMAJOR.MINOR.PATH` format,\nfollowing the [Semantic Versioning] convention.\nFrom their definition:\n\n> Given a version number MAJOR.MINOR.PATCH, increment the:\n>\n> MAJOR version when you make incompatible API changes,\n> MINOR version when you add functionality in a backwards compatible manner, and\n> PATCH version when you make backwards compatible bug fixes.\n\n[Semantic Versioning]: https://semver.org/\n\nThe Python version is not automated,\nand must be bumped in `pyproject.toml` and `flake.nix`.\n\nFor the Rust core library we use `rMAJOR.MINOR.PATCH`\n(note it starts with `r`, and not `v`).\n\nThe Rust version is not automated,\nand must be bumped in `src/core/Cargo.toml`.\n\n## Common errors and solutions\n\n### Cannot import name `to_bytes` from `sourmash.minhash`\n\nIf you are getting an error that contains `ImportError: cannot import name 'to_bytes' from 'sourmash.minhash'`,\nthen it's likely you need to update Rust and clean up your environment.\nSome installation issues can be solved by simply removing the intermediate build files with:\n\n```\nmake clean\n```\n\n## Additional developer-focused documents\n\n```{toctree}\n:maxdepth: 2\n\nrelease\nrequirements\nstorage\nrelease-notes/releases\ndev_plugins\n```\n\n"
  },
  {
    "path": "doc/faq.md",
    "content": "# Frequently Asked Questions (FAQ)\n\n```{contents} Contents\n:depth: 3\n```\n\n## How is sourmash different from mash?\n\n[mash](https://mash.readthedocs.org/) is an awesome piece of software\nthat inspired sourmash - hence the name we chose for sourmash! But are\nthey the same? No, they are not!\n\nmash is based on\n[MinHash sketching](https://en.wikipedia.org/wiki/MinHash), a\ntechnique for randomly selecting a very small set of k-mers to\nrepresent a potentially very large sequence. MinHash sketches can be\nused to estimate Jaccard similarity (a distance metric that lets you\nfind closely related sequences) with very high accuracy, under one\ncondition - that the two sequences be of similar size.\n\nSo, MinHash sketching is great when comparing bacterial genomes, which are\nall around 2-10 MB in size.\n\nBut... MinHash sketching doesn't work when comparing _metagenomes_ to\ngenomes, because metagenomes are usually _much_ larger than genomes.\n\nSo we built sourmash around a different kind of sketch - FracMinHash -\nwhich can estimate Jaccard similarity between sets of very different\nsizes. FracMinHash sketches also support overlap and containment\nanalysis, and are convenient in a variety of other ways - see our\npaper on FracMinHash,\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2).\n\nThere are some drawbacks to FracMinHash sketches - read on!\n\n## What are the drawbacks to FracMinHash and sourmash?\n\nThere are two drawbacks to FracMinHash relative to MinHash. Neither\none is a showstopper, but you should know about them!\n\nOne drawback is that FracMinHash sketches can be a _lot_ bigger than\nMinHash sketches - technically speaking, MinHash sketches are bounded\nin size (you pick the number of hashes to keep!) while FracMinHash\nsketches can get arbitrarily large. In practice this means that when\nyou're sketching large metagenomes, you end up with large sketches.\nHow large depends on the _cardinality_ of the metagenome k-mers - if a\nmetagenome has 1 billion unique k-mers, a FracMinHash sketch with scaled\nparameter of 1000 will contain a million hashes.\n\nThe other drawback is that FracMinHash sketches _don't work well_ for\nvery small sequences. Our default parameter choice for DNA\n(scaled=1000) works well for finding 10 kb or larger matches between\nsequences - some simple Poisson matching math suggests that about\n99.98% of 5kb overlaps will be found with scaled=1000.\n\n## How can I better understand FracMinHash and sourmash intuitively?\n\nPlease see [the k-mers and minhash tutorial](kmers-and-minhash.ipynb).\n\n## What papers should I read to better understand the FracMinHash approach used by sourmash?\n\nI would suggest reading these four papers, in order:\n\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2),\nIrber et al., 2022. This is the fullest technical description of FracMinHash available.\n\n[Mash: fast genome and metagenome distance estimation using MinHash](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-016-0997-x),\nOndov et al., 2016. This is the original paper that inspired\nsourmash. It discusses sketching with MinHash and does a great job of\nshowing how well Jaccard estimation works for comparing genomes! A\ngood contrasting point to take into account is that _MinHash cannot do\noverlap or containment estimation_, which nicely motivates the\nprevious paper and the next two.\n\n[Mash Screen: high-throughput sequence containment estimation for genome discovery](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1841-x),\nOndov et al., 2019; and\n[CMash: fast, multi-resolution estimation of k-mer-based Jaccard and containment indices](https://academic.oup.com/bioinformatics/article/38/Supplement_1/i28/6617499). Both\npapers discusses containment and metagenome analysis extensively, and\nuse an approach that can be usefully contrasted with sourmash. There\nis a nice blog post on\n[mash screen](https://genomeinformatics.github.io/mash-screen/) that\nis worth reading, too!\n\nIf you want a nice chaser, please see this section at the end of the\nblog post above:\n\n>It would be great to see additional methods developed to process\ncontainment scores, reduce the output redundancy, and report accurate\ncompositional estimates for metagenomes. One easy approach is a\n“winner take all” model, like sourmash implements.\n\n## What k-mer size(s) should I use with sourmash?\n\nThe short answer is: for DNA, use k=31.\n\nSlightly longer answer: when we look at the k-mer distribution\nacross all of the bacterial genomes in GTDB, we find that 99% (or\nmore) of 31-mers are _genome_, _species_, or _genus_ specific.\n\nIf you go lower (say, k=21), then you get a few percent of k-mers\nthat match above the genus level - family or above. This is useful for\nfuzzier matching, e.g. if you have a metagenome with a high fraction of\nunknown k-mers.\n\nIf you go higher (k=51), a higher percentage of k-mers are genome-specific.\nThis can be valuable in situations where you have highly specific reference\ngenomes (e.g. isolates, single-cell genomes, or MAGs) that should match\nvery closely to this metagenome.\n\nFor the core sourmash operations - search, gather, and compare - we\nbelieve (with evidence!) that (a) the differences between k=21, k=31,\nand k=51 are negligible; and that (b) k=31 works fine for most\nday-to-day use of sourmash. \n\nWe also provide [Genbank and GTDB databases](databases.md) for k=21,\nk=31, and k=51, so choosing from those k-mer sizes for your own sketches\nwill allow you to directly use those databases.\n\nFor some background on k-mer specificity, we recommend this paper:\n[MetaPalette: a k-mer Painting Approach for Metagenomic Taxonomic Profiling and Quantification of Novel Strain Variation](https://journals.asm.org/doi/10.1128/msystems.00020-16),\nKoslicki & Falush, 2016.\n\n## What scaled values should I use with sourmash?\n\nWe recommend scaled=1000 or scaled=10000 when working with bacterial\nand archaeal sketches and DNA. We have quite a bit of experience with\nthis, and even some\n[published benchmarks](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-022-05103-0)\nshowing that this works very well.  You may need to use lower scaled\nvalues with smaller query and target sequences, such as viral genomes\nor genes, but we do not have systematic advice on this.\n\nThat having been said, you can always use a lower scaled value - the only\nconsequence is that memory and compute requirements increase.\n\nAlso, sourmash will automatically use the larger of two scaled values\nwhen comparing two sketches with different scaled values. So if, for example,\nyou use [the precomputed databases](databases.md), you will always end up\nusing your query sketches at a minimum scaled of 1000, even if you created\nthem with a lower scaled value.\n\nPlease also see [What resolution should my signatures be?](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-and-how-should-i-create-them).\n\n## What threshold-bp value should I use with `sourmash prefetch` and `sourmash gather`?\n\nThe parameter `--threshold-bp` sets the minimum estimated overlap for reporting\na match, in both the `gather` and `prefetch` commands. The default is 50kb, and\nthis works well for microbial-genome-scale work, where the genomes are often\nquite large (one or more megabases).\n\nIn case you need more sensitivity, setting `--threshold-bp=0` will return any\nmatch that shares at least one hash. This will also increase potential\nfalse positives, however.\n\nWe have found a good intermediate threshold is 3 times the `scaled` value, e.g.\n`--threshold-bp=3000` for a scaled value of 1000. This requires at least three\noverlapping hashes before a match is reported. If you are using a lower scaled\nvalue (a higher density sketch) because you are looking for matches between\nshorter sequences, then setting threshold-bp to 3 times that scaled value will\ntake advantage of the increased sensitivity to short matches without introducing\nmore false positives.\n\n## How do k-mer-based analyses compare with read mapping?\n\ntl;dr very well! But it's a bit one sided: if k-mers match, reads will\nmap, but not necessarily vice versa. So read mapping rates are almost always\nhigher than k-mer matching rates.\n\n### Mapping reads to reference vs k-mer \"detection\" or containment\n\nLet's start by looking at a simple example: suppose you have Illumina\nshotgun sequencing of a new isolate, and you want to compare it to a\nreference genome for a member of the same species.  You calculate\nk-mer containment of the reference genome in the isolate shotgun\nsequence to be 65%, using e.g. `sourmash search --containment\nref.sig.gz isolate.sig.gz`. You then map the reads from the isolate\ndata to the reference genome. What should you expect to see?\n\nWhat you should see is that 65% or more of the reference genome is\ncovered by at least one read. This is known as the mapping-based\n\"detection\" of the reference genome in the read data set, and k-mer\ndetection typically *underestimates* mapping-based detection.\n\n(If you want to know _how many of the reads will map_, you need to use\na different number that is output by `sourmash gather` - although, for\nsingle genomes with only a few repeats, the percentage of reads that\nmap should match the k-mer detection number you calculate with\ncontainment. Read the section below on metagenome analysis for more\ninformation on read mapping rates!)\n\n### Why do k-mers underestimate read mapping?\n\nK-mers underestimate read mapping because k-mers rely on exact matches,\nwhile read mapping tolerates mismatches. So unless you are looking at\nentirely error free data with no strain variation, mismatches will\nsometimes prevent k-mers from matching.\n\nFor some math: consider a k-mer of size 21. It will only match to a\nspecific 21 base sequence exactly. If you are matching two isolate genomes\nthat align completely but have a 95% average nucleotide identity, then\none out of every 20 bases will be different (on average), and, on average,\nevery 21-mer will be different! (In practice you'd expect about 1/3 of the\nk-mers to match if the variation is random, since there will be many 21-base\nwindows that don't have any mismatches.) However, alignment-based approaches\nlike read mapping will happily align across single-base mismatches, and so\neven at 95% ANI you would expect many reads to align.\n\nIn practice, the numbers will differ, but the intuition remains!\n\n### How do read mapping rates for metagenomes compare with k-mer statistics?\n\nShotgun metagenome sequencing adds several complicating factors when\ncomparing metagenome reads to a reference database. First, each genome\nwill generally be present at a different abundance in the metagenome.\nSecond, metagenomes rarely contain the exact strain genome present in\na reference database; often the genomes in the metagenome differ both\nin terms of SNPs _and_ accessory elements from what's in the reference\ndatabase. And third, metagenomes often contain complicated mixtures of\nstrains - even if one strain is dominant.\n\nThe `sourmash gather` method is built for analyzing metagenomes against\nreference databases, and it does so by finding the shortest list of\nreference genomes that \"cover\" all of the k-mers in the metagenome.\nThis list is arranged by how many k-mers from the metagenome are covered\nby that entry in the output: the first match is the biggest, and the\nsecond match is the second biggest, and so on. We call this a \"minimum\nmetagenome cover\" and it is described in the Irber et al., 2022, paper below.\n\nWhen we construct the minimum metagenome cover, it correlates well with\nmapping (per Irber et al., 2022), with one caveat: you need to assign\nreads to the reference genomes in the rank order output by gather.\nThis is needed to properly assign reads that map to multiple genomes\nto the \"best\" match - the one that will capture the most reads.\n\n`sourmash gather` is still a research method but it seems to work\npretty well - in particular, it is both highly sensitive _and_ highly\nspecific in taxonomic benchmarking. Please ask questions as you have them!\n\n### Further reading and links on k-mers and mapping:\n\n* The paper\n  [Biogeographic Distribution of Five Antarctic Cyanobacteria Using Large-Scale k-mer Searching with sourmash branchwater](https://www.biorxiv.org/content/10.1101/2022.10.27.514113v1),\n  Lumian et al., 2022, shows that k-mer detection almost always\n  underestimates mapping, and k-mer abundance analysis is always more\n  conservative than mapping-based analyses.\n\n* The paper\n  [Deriving confidence intervals for mutation rates across a wide range of evolutionary distances using FracMinHash](https://genome.cshlp.org/content/33/7/1061),\n  Rahman Hera et al., 2023, shows how to translate between average\n  nucleotide identity (ANI) and k-mer statistics.\n\n* The paper\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2),\nIrber et al., 2022, describes how `sourmash gather` assigns k-mers\nfrom metagenomes to a set of reference genomes, and shows that read\nmapping correlates pretty well with k-mer overlap. Note that it is\nfocused on *systematic decomposition of metagenomes against reference\ndatabases*, so it tackles the question of analyzing an entire\nmetagenome against all available references, not just a single\nmatching genome.\n\n## Can I use sourmash to determine the best reference genome for mapping my reads?\n\nYes! (And see the FAQ above,\n[How do k-mer analyses compare with read mapping?](#how-do-k-mer-based-analyses-compare-with-read-mapping))\n\nIf you're interested in picking a single best reference genome (from a\nlarge database) for read mapping, you can do the following:\n\n* sketch all your reference genomes with `sourmash sketch dna`, and/or download one of our [prepared databases](databases.md).  You can use default parameters for `sourmash sketch`.\n* sketch your read collection with `sourmash sketch dna`.\n* run `sourmash prefetch reads.sig <reference genome sketch collection(s)> -o matches.csv`\n* sort `matches.csv` on the `f_match_query` column and pick the highest value - this is the k-mer detection - and pick the match name from the `match_name` column;\n* use that reference genome as your mapping target.\n\nIf you want to map a metagenome to _multiple_ references, consider\nusing `sourmash gather` and/or\n[the genome-grist workflow](https://dib-lab.github.io/genome-grist/).\n\n(This is also known as \"read recruitment.\")\n\n## How do I get the sequences for a particular reference genome from a metagenome, using sourmash?\n\nIf sourmash reports that a particular strain or genome is present in a\nmetagenome, how do you retrieve the reads using sourmash?\n\nThe short answer is: you have to use a different tool.  You can do\nread mapping between the metagenome and the relevant reference genome\n(which can be automated with\n[the genome-grist workflow](https://dib-lab.github.io/genome-grist/);\nor, if you are interested in retrieving accessory elements, you can\ntry out\n[spacegraphcats](https://spacegraphcats.github.io/spacegraphcats/02-spacegraphcats-use-cases/).\n\n## How does memory usage for sourmash change with k-mer size?\n\nsourmash hashes k-mers into 64-bit numbers, so the size of what is\nstored is independent of the k-mer size. The only impact of k-mer size\non sourmash behavior is then more on the biology side - how many\nmatches do you gain (or lose) with that k-mer size? And do you have a\nlot of new k-mers that pop up with a longer k-mer size (e.g. because\nof included variation)? These questions must be answered by experimentation\nand may be data-set specific.\n\n## Can sourmash run with multiple theads?\n\nsourmash is currently single-threaded, but the [branchwater plugin for sourmash](https://github.com/sourmash-bio/sourmash_plugin_branchwater) provides faster and lower-memory  multithreaded implementations of several important sourmash features - sketching, searching, and gather (metagenome decomposition). It does so by implementing higher-level functions in Rust on top of the core Rust library of sourmash. As a result it provides some of the same functionality as sourmash, but 10-100x faster and in 10x lower memory. Note that this code is functional and tested, but does not have all of the features of sourmash. Code and features will be integrated back into sourmash as they mature.\n"
  },
  {
    "path": "doc/funding.md",
    "content": "# Funding\n\nSourmash development was initiated under award GBMF4551 from the Gordon\nand Betty Moore Foundation to C. Titus Brown.\n\nFurther development was sponsored by:\n\n* [NSF DBI-2018911](https://www.nsf.gov/awardsearch/showAward?AWD_ID=2018911&HistoricalAwards=false), BBSRC-NSF/BIO:Collaborative Research: genomeRxiv: a microbial whole-genome database and diagnostic marker design resource for classification, identification, and data sharing.\n* [NIH 1R03OD030596-01](https://reporter.nih.gov/search/aktj48mYz0ObXo62p_Tx7Q/project-details/10112077), Large-scale annotation-free disease correlation analysis of the iHMP.\n"
  },
  {
    "path": "doc/howto-rocksdb.md",
    "content": "# A quickstart guide to using RocksDB indexing\n\nThis quickstart shows how to index the GTDB species representatives database for fast search using `sourmash index` with the RocksDB index type.\n\nNOTE: You'll need sourmash v4.9.0 or later to run this tutorial.\n\n## Download a database\n\nLet's start by downloading the GTDB rs226 \"reps\" database:\n\n```\ncurl -JLO https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs226/gtdb-rs226-reps.k31.sig.zip\n```\n\nThis database is 3.7 GB and contains sketches of the 143k genomes from [GTDB rs226](https://gtdb.ecogenomic.org/stats/r226).\n\nIf you inspect the database with sourmash, you will see:\n```\n% sourmash sig summarize gtdb-rs226-reps.k31.sig.zip\n\n...\nis database? yes\nhas manifest? yes\nnum signatures: 143384\n** examining manifest...\ntotal hashes: 460383140\nsummary of sketches:\n   143384 sketches with DNA, k=31, scaled=1000        460383140 total hashes\n```\n\n## Build an index\n\n\nRun the `sourmash index` command to build a RocksDB index:\n```\nsourmash index -F rocksdb gtdb-rs226-reps.k31.rocksdb gtdb-rs226-reps.k31.sig.zip\n```\n\nThis will take about 2 hours and 10 GB of RAM (and may be significantly faster with an SSD). The time and memory should scale approximately with the total number of hashes in the database (460m, per the `summarize` output above). The final size of the `gtdb-rs226-reps.k31.rocksdb` directory is 12 GB - again, this should roughly scale with the total number of hashes in the database.\n\nRocksDB indexes can only contain a single type of sketch, so if the source database contains more than one ksize, moltype, or scaled, you'll need to specify which one to index. The command above could be modified to include `-k 31 --scaled 1000 --dna` - but, in the case of this GTDB rs226 database, there is only one type of sketch, so sourmash automatically figures out what to index.\n\nYou can now run `sourmash sig summarize` on the index:\n```\n% sourmash sig summarize gtdb-rs226-reps.k31.rocksdb\n...\n** loading from 'gtdb-rs226-reps.k31.rocksdb'\npath filetype: DiskRevIndex\nlocation: gtdb-rs226-reps.k31.rocksdb\nis database? yes\nhas manifest? yes\nnum signatures: 143384\n** examining manifest...\ntotal hashes: 460383140\nsummary of sketches:\n   143384 sketches with DNA, k=31, scaled=1000        460383140 total hashes\n```\n\nRocksDB indexes support all of the  sourmash signature collection commands - they are a full equivalent to any other sourmash collection.\n\n## Search the RocksDB index\n\nLet's try searching the index with `sourmash search`.\n\nFirst, grab a signature with `sig grep`. I've chosen this one at random.\n```\nsourmash sig grep GCA_036718335 gtdb-rs226-reps.k31.sig.zip -o query.sig\n```\nnow search the RocksDB index with the query:\n```\nsourmash search query.sig gtdb-rs226-reps.k31.rocksdb\n```\n\nYou should see:\n```\n977 matches above threshold 0.080; showing first 3:\nsimilarity   match\n----------   -----\n100.0%       GCA_036718335.1 Coriobacteriaceae bacterium\n 21.5%       GCF_040098165.1 Collinsella sp. CLA-JM-H32\n 21.3%       GCA_031292915.1 Collinsella sp.\n```\n\nSearching the RocksDB index takes about 15 seconds and 400 MB; by contrast, searching the `.sig.zip` database takes 10 minutes and 4.1 GB.\n\n## Additional notes on RocksDB indexes\n\nRocksDB indexes in sourmash are an _inverted index_, which store a mapping from each k-mer hash to the set of sketches that contain that k-mer. This means that query performance will scale with the size of the query, rather than with the number of signatures in the database.\n\nRocksDB indexes are incredibly scalable; the\n[branchwater petabase scale search](https://branchwater.jgi.doe.gov/)\nsystem uses them internally.\n\nThe\n[branchwater plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater)\nprovides a somewhat more flexible indexing command, as well. RocksDB\ndatabases produced by sourmash and the branchwater plugin are\nfully interoperable.\n"
  },
  {
    "path": "doc/index.md",
    "content": "# Welcome to sourmash!\n\nsourmash is a command-line tool and Python/Rust library for\n**metagenome analysis** and **genome comparison** using k-mers.  It\nsupports the compositional analysis of metagenomes, rapid search of\nlarge sequence databases, and flexible taxonomic profiling with both\nNCBI and GTDB taxonomies\n([see our prepared databases for more information](databases.md)). sourmash\nworks well with sequences 30kb or larger, including bacterial and\nviral genomes.\n\nYou might try sourmash if you want to -\n\n* identify which reference genomes to use for metagenomic read mapping;\n* search all Genbank microbial genomes with a sequence query;\n* cluster hundreds or thousands of genomes by similarity;\n* taxonomically classify genomes or metagenomes against NCBI and/or GTDB;\n* search thousands of metagenomes with a query genome or sequence;\n\n<span style=\"color:red\"><b>New!</b></span> The sourmash project also supports\n[querying all 1 million publicly available metagenomes in the Sequence Read\nArchive](https://branchwater.sourmash.bio/). Give it a try!\n\nOur **vision**: sourmash strives to support biologists in analyzing\nmodern sequencing data at high resolution and with full context,\nincluding all public reference genomes and metagenomes.\n\n## Mission statement\n\nThis project's mission is to provide practical tools and approaches for\nanalyzing extremely large sequencing data sets, with an emphasis on\nhigh resolution results. Our designs follow these guiding principles:\n\n* genomic and metagenomic analyses should be able to make use of all\n  available reference genomes.\n* metagenomic analyses should support assembly independent approaches,\n  to avoid biases stemming from low coverage or high strain\n  variability.\n* private and public databases should be equally well supported.\n* a variety of data structures and algorithms are necessary to support\n  a wide set of use cases, including efficient command-line analysis,\n  real-time queries, and massive-scale batch analyses.\n* our tools should be well behaved members of the bioinformatics\n  analysis tool ecosystem, and use common installation approaches,\n  standard formats, and semantic versioning.\n* our tools should be robustly tested, well documented, and supported.\n* we discuss scientific and computational tradeoffs and make specific\n  recommendations where possible, admitting uncertainty as needed.\n\n## How does sourmash work?\n\nUnderneath, sourmash uses [FracMinHash sketches](https://www.biorxiv.org/content/10.1101/2022.01.11.475838) for fast and\nlightweight sequence comparison; FracMinHash builds on\n[MinHash sketching](https://en.wikipedia.org/wiki/MinHash) to support both Jaccard similarity\n_and_ containment analyses with k-mers.  This significantly expands\nthe range of operations that can be done quickly and in low\nmemory. sourmash also implements a number of new and powerful techniques\nfor analysis, including minimum metagenome covers and alignment-free ANI\nestimation.\n\nsourmash is inspired by [mash](https://mash.readthedocs.io), and\nsupports most mash analyses. sourmash also implements an expanded set\nof functionality for metagenome and taxonomic analysis.\n\nWhile sourmash is currently single-threaded, the [branchwater plugin for sourmash](https://github.com/sourmash-bio/sourmash_plugin_branchwater) provides faster and lower-memory multithreaded implementations of several important sourmash features - sketching, searching, and gather (metagenome decomposition). It does so by implementing higher-level functions in Rust on top of the core Rust library of sourmash. As a result it provides some of the same functionality as sourmash, but 10-100x faster and in 10x lower memory. Note that this code is functional and tested, but does not have all of the features of sourmash. Code and features will be integrated back into sourmash as they mature.\n\nsourmash development was initiated with a grant from the Moore\nFoundation under the Data Driven Discovery program, and has been\nsupported by further funding from the NIH and NSF. Please see\n[funding acknowledgements](funding.md) for details!\n\n## Using sourmash\n\n<!-- Please remember to add things to sidebar.md ;) -->\n\n### Tutorials and examples\n\nThese tutorials are command line tutorials that should work on Mac OS\nX and Linux. They require about 5 GB of disk space and 5 GB of RAM.\n\n* [Installing sourmash with conda](tutorial-install.md)\n\n* [The first sourmash tutorial - making signatures, comparing, and searching](tutorial-basic.md)\n\n* [Using sourmash LCA to do taxonomic classification](tutorials-lca.md)\n\n* [Analyzing the genomic and taxonomic composition of an environmental genome using GTDB and sample-specific MAGs with sourmash](tutorial-lemonade.md)\n\n* [Some sourmash command line examples!](sourmash-examples.ipynb)\n\n### How-To Guides\n\n* [Classifying genome and metagenome sketches](classifying-signatures.md)\n\n* [A quickstart guide to using RocksDB indexing](howto-rocksdb.md)\n\n* [Working with private collections of genome sketches](sourmash-collections.ipynb)\n\n* [Using the `LCA_Database` API](using-LCA-database-API.ipynb)\n\n* [Building plots from `sourmash compare` output](plotting-compare.ipynb).\n\n* [A short guide to using sourmash output with R](other-languages.md).\n\n## Frequently Asked Questions\n\n* [Frequently asked questions](faq.md)\n\n### How sourmash works under the hood\n\n* [An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\n* [Support, versioning, and migration between versions](support.md)\n\n### Reference material\n\n* [Full table of contents for all docs](toc.md)\n* [UNIX command-line documentation](command-line.md)\n* [Genbank and GTDB databases and taxonomy files](databases.md)\n* [Python examples using the API](api-example.md)\n* [Publications about sourmash](publications.md)\n* [A guide to the internal design and structure of sourmash](sourmash-internals.md)\n* [Funding acknowledgements](funding.md)\n\n## Developing and extending sourmash\n\n* [Releasing a new version of sourmash](release.md)\n\n<!--\n\nThis toctree sets the sidebar menu, but is otherwise hidden so that it\ndoesn't show up redundantly at the bottom of the index page.\n\nEdit sidebar.md to add to the initial set of headings, or add direct links\nlike `cite`.\n\n-->\n\n```{toctree}\n---\nmaxdepth: 1\nhidden: true\n---\n\nsidebar\ncommand-line\ndatabases\napi-example\ncite\n```\n"
  },
  {
    "path": "doc/kmers-and-minhash.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# An introduction to k-mers for genome comparison and analysis\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"k-mers provide sensitive and specific methods for comparing and analyzing genomes.\\n\",\n    \"\\n\",\n    \"This notebook provides pure Python implementations of some of the basic k-mer comparison techniques implemented in sourmash, including hash-based subsampling techniques.\\n\",\n    \"\\n\",\n    \"### Running this notebook.\\n\",\n    \"\\n\",\n    \"You can run this notebook interactively via mybinder; click on this button:\\n\",\n    \"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dib-lab/sourmash/latest?labpath=doc%2Fkmers-and-minhash.ipynb)\\n\",\n    \"\\n\",\n    \"A rendered version of this notebook is available at [sourmash.readthedocs.io](https://sourmash.readthedocs.io) under \\\"Tutorials and notebooks\\\".\\n\",\n    \"\\n\",\n    \"You can also get this notebook from the [doc/ subdirectory of the sourmash github repository](https://github.com/dib-lab/sourmash/tree/latest/doc). See [binder/environment.yaml](https://github.com/dib-lab/sourmash/blob/latest/binder/environment.yml) for installation dependencies.\\n\",\n    \"\\n\",\n    \"### What is this?\\n\",\n    \"\\n\",\n    \"This is a Jupyter Notebook using Python 3. If you are running this via [binder](https://mybinder.org), you can use Shift-ENTER to run cells, and double click on code cells to edit them.\\n\",\n    \"\\n\",\n    \"Contact: C. Titus Brown, ctbrown@ucdavis.edu. Please [file issues on GitHub](https://github.com/dib-lab/sourmash/issues/) if you have any questions or comments!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Calculating Jaccard similarity and containment\\n\",\n    \"\\n\",\n    \"Given any two collections of k-mers, we can calculate similarity and containment using the union and intersection functionality in Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def jaccard_similarity(a, b):\\n\",\n    \"    a = set(a)\\n\",\n    \"    b = set(b)\\n\",\n    \"\\n\",\n    \"    intersection = len(a.intersection(b))\\n\",\n    \"    union = len(a.union(b))\\n\",\n    \"\\n\",\n    \"    return intersection / union\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def jaccard_containment(a, b):\\n\",\n    \"    a = set(a)\\n\",\n    \"    b = set(b)\\n\",\n    \"\\n\",\n    \"    intersection = len(a.intersection(b))\\n\",\n    \"\\n\",\n    \"    return intersection / len(a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Let's try these functions out on some simple examples!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"a = [\\\"ATGG\\\", \\\"AACC\\\"]\\n\",\n    \"b = [\\\"ATGG\\\", \\\"CACA\\\"]\\n\",\n    \"c = [\\\"ATGC\\\", \\\"CACA\\\"]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jaccard_similarity(a, a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jaccard_containment(a, a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.3333333333333333\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jaccard_similarity(b, a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.0\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jaccard_similarity(a, c)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.5\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jaccard_containment(b, a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib_venn._common.VennDiagram at 0x132a99340>\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"%matplotlib inline\\n\",\n    \"from matplotlib_venn import venn2, venn3\\n\",\n    \"\\n\",\n    \"venn2([set(a), set(b)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib_venn._common.VennDiagram at 0x132c42430>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"venn3([set(a), set(b), set(c)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Calculating k-mers from DNA sequences\\n\",\n    \"\\n\",\n    \"To extract k-mers from DNA sequences, we walk over the sequence with a sliding window:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def build_kmers(sequence, ksize):\\n\",\n    \"    kmers = []\\n\",\n    \"    n_kmers = len(sequence) - ksize + 1\\n\",\n    \"\\n\",\n    \"    for i in range(n_kmers):\\n\",\n    \"        kmer = sequence[i : i + ksize]\\n\",\n    \"        kmers.append(kmer)\\n\",\n    \"\\n\",\n    \"    return kmers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['ATGGACCAGATATAGGGAGAG',\\n\",\n       \" 'TGGACCAGATATAGGGAGAGC',\\n\",\n       \" 'GGACCAGATATAGGGAGAGCC',\\n\",\n       \" 'GACCAGATATAGGGAGAGCCA',\\n\",\n       \" 'ACCAGATATAGGGAGAGCCAG',\\n\",\n       \" 'CCAGATATAGGGAGAGCCAGG',\\n\",\n       \" 'CAGATATAGGGAGAGCCAGGT',\\n\",\n       \" 'AGATATAGGGAGAGCCAGGTA',\\n\",\n       \" 'GATATAGGGAGAGCCAGGTAG',\\n\",\n       \" 'ATATAGGGAGAGCCAGGTAGG',\\n\",\n       \" 'TATAGGGAGAGCCAGGTAGGA',\\n\",\n       \" 'ATAGGGAGAGCCAGGTAGGAC',\\n\",\n       \" 'TAGGGAGAGCCAGGTAGGACA']\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"build_kmers(\\\"ATGGACCAGATATAGGGAGAGCCAGGTAGGACA\\\", 21)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the k-mers that are output, you can see how the sequence shifts to the right - look at the pattern in the middle.\\n\",\n    \"\\n\",\n    \"So, now, you can compare two sequences!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"seq1 = \\\"ATGGACCAGATATAGGGAGAGCCAGGTAGGACA\\\"\\n\",\n    \"seq2 = \\\"ATGGACCAGATATTGGGAGAGCCGGGTAGGACA\\\"\\n\",\n    \"# differences:       ^         ^\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"10 0.09090909090909091\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"K = 10\\n\",\n    \"kmers1 = build_kmers(seq1, K)\\n\",\n    \"kmers2 = build_kmers(seq2, K)\\n\",\n    \"\\n\",\n    \"print(K, jaccard_similarity(kmers1, kmers2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reading k-mers in from a file\\n\",\n    \"\\n\",\n    \"In practice, we often need to work with 100s of thousands of k-mers, and this means loading them in from sequences in files.\\n\",\n    \"\\n\",\n    \"There are three cut-down genome files in the `genomes/` directory that we will use below:\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"akkermansia.fa\\n\",\n    \"shew_os185.fa\\n\",\n    \"shew_os223.fa\\n\",\n    \"```\\n\",\n    \"The latter two are two strains of *Shewanella baltica*, and the first one is an unrelated genome *Akkermansia muciniphila*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import screed  # a library for reading in FASTA/FASTQ\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def read_kmers_from_file(filename, ksize):\\n\",\n    \"    all_kmers = []\\n\",\n    \"    for record in screed.open(filename):\\n\",\n    \"        sequence = record.sequence\\n\",\n    \"\\n\",\n    \"        kmers = build_kmers(sequence, ksize)\\n\",\n    \"        all_kmers += kmers\\n\",\n    \"\\n\",\n    \"    return all_kmers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"akker_kmers = read_kmers_from_file(\\\"genomes/akkermansia.fa\\\", 31)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['AAATCTTATAAAATAACCACATAACTTAAAA',\\n\",\n       \" 'AATCTTATAAAATAACCACATAACTTAAAAA',\\n\",\n       \" 'ATCTTATAAAATAACCACATAACTTAAAAAG',\\n\",\n       \" 'TCTTATAAAATAACCACATAACTTAAAAAGA',\\n\",\n       \" 'CTTATAAAATAACCACATAACTTAAAAAGAA']\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"akker_kmers[:5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"499970\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(len(akker_kmers))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"shew1_kmers = read_kmers_from_file(\\\"genomes/shew_os185.fa\\\", 31)\\n\",\n    \"shew2_kmers = read_kmers_from_file(\\\"genomes/shew_os223.fa\\\", 31)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can see the relationship between these three like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"akker vs shew1 0.0\\n\",\n      \"akker vs shew2 0.0\\n\",\n      \"shew1 vs shew2 0.23675152210020398\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"akker vs shew1\\\", jaccard_similarity(akker_kmers, shew1_kmers))\\n\",\n    \"print(\\\"akker vs shew2\\\", jaccard_similarity(akker_kmers, shew2_kmers))\\n\",\n    \"print(\\\"shew1 vs shew2\\\", jaccard_similarity(shew1_kmers, shew2_kmers))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"akker vs shew1 0.0\\n\",\n      \"akker vs shew2 0.0\\n\",\n      \"shew1 vs shew2 0.38397187523995907\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"akker vs shew1\\\", jaccard_containment(akker_kmers, shew1_kmers))\\n\",\n    \"print(\\\"akker vs shew2\\\", jaccard_containment(akker_kmers, shew2_kmers))\\n\",\n    \"print(\\\"shew1 vs shew2\\\", jaccard_containment(shew1_kmers, shew2_kmers))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib_venn._common.VennDiagram at 0x15aa8d8b0>\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"venn3([set(akker_kmers), set(shew1_kmers), set(shew2_kmers)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Let's hash!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Choose a hash function!\\n\",\n    \"\\n\",\n    \"We need to pick a hash function that takes DNA k-mers and converts them into numbers.\\n\",\n    \"\\n\",\n    \"Both the [mash](https://mash.readthedocs.io/en/latest/) software for MinHash, and the [sourmash](https://sourmash.readthedocs.io) software for modulo and MinHash, use MurmurHash:\\n\",\n    \"\\n\",\n    \"https://en.wikipedia.org/wiki/MurmurHash\\n\",\n    \"\\n\",\n    \"this is implemented in the 'mmh3' library in Python.\\n\",\n    \"\\n\",\n    \"The other thing we need to do here is take into account the fact that DNA is double stranded, and so\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"hash_kmer('ATGG')\\n\",\n    \"```\\n\",\n    \"should be equivalent to\\n\",\n    \"```\\n\",\n    \"hash_kmer('CCAT')\\n\",\n    \"```\\n\",\n    \"Following mash's lead, for every input k-mer we will choose a *canonical* k-mer that is the lesser of the k-mer and its reverse complement.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import mmh3\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def hash_kmer(kmer):\\n\",\n    \"    # calculate the reverse complement\\n\",\n    \"    rc_kmer = screed.rc(kmer)\\n\",\n    \"\\n\",\n    \"    # determine whether original k-mer or reverse complement is lesser\\n\",\n    \"    if kmer < rc_kmer:\\n\",\n    \"        canonical_kmer = kmer\\n\",\n    \"    else:\\n\",\n    \"        canonical_kmer = rc_kmer\\n\",\n    \"\\n\",\n    \"    # calculate murmurhash using a hash seed of 42\\n\",\n    \"    hash = mmh3.hash64(canonical_kmer, 42)[0]\\n\",\n    \"    if hash < 0:\\n\",\n    \"        hash += 2**64\\n\",\n    \"\\n\",\n    \"    # done\\n\",\n    \"    return hash\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is now a function that we can use to turn any DNA \\\"word\\\" into a number:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13663093258475204077\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hash_kmer(\\\"ATGGC\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The same input word always returns the same number:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13663093258475204077\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hash_kmer(\\\"ATGGC\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"as does its reverse complement:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13663093258475204077\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hash_kmer(\\\"GCCAT\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"and nearby words return very different numbers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1777382721305265773\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hash_kmer(\\\"GCCAA\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Note that hashing collections of k-mers doesn't change Jaccard calculations:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def hash_kmers(kmers):\\n\",\n    \"    hashes = []\\n\",\n    \"    for kmer in kmers:\\n\",\n    \"        hashes.append(hash_kmer(kmer))\\n\",\n    \"    return hashes\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"shew1_hashes = hash_kmers(shew1_kmers)\\n\",\n    \"shew2_hashes = hash_kmers(shew2_kmers)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0.23675152210020398\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jaccard_similarity(shew1_kmers, shew2_kmers))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0.2371520123045373\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jaccard_similarity(shew1_hashes, shew2_hashes))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"(ok, it changes it a little, because of the canonical k-mer calculation!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Implementing subsampling with modulo hashing\\n\",\n    \"\\n\",\n    \"We are now ready to implement k-mer subsampling with modulo hash.\\n\",\n    \"\\n\",\n    \"We need to pick a sampling rate, and know the maximum possible hash value.\\n\",\n    \"\\n\",\n    \"For a sampling rate, let's start with 1000.\\n\",\n    \"\\n\",\n    \"The MurmurHash function turns k-mers into numbers between 0 and `2**64 - 1` (the maximum 64-bit number).\\n\",\n    \"\\n\",\n    \"Let's define these as variables:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"scaled = 1000\\n\",\n    \"MAX_HASH = 2**64\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now, choose the range of hash values that we'll keep.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1.844674407370955e+16\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"keep_below = MAX_HASH / scaled\\n\",\n    \"print(keep_below)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"and write a filter function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def subsample_modulo(kmers):\\n\",\n    \"    keep = []\\n\",\n    \"    for kmer in kmers:\\n\",\n    \"        if hash_kmer(kmer) < keep_below:\\n\",\n    \"            keep.append(kmer)\\n\",\n    \"        # otherwise, discard\\n\",\n    \"\\n\",\n    \"    return keep\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Now let's apply this to our big collections of k-mers!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"akker_sub = subsample_modulo(akker_kmers)\\n\",\n    \"shew1_sub = subsample_modulo(shew1_kmers)\\n\",\n    \"shew2_sub = subsample_modulo(shew2_kmers)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"499970 502\\n\",\n      \"499970 513\\n\",\n      \"499970 503\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(len(akker_kmers), len(akker_sub))\\n\",\n    \"print(len(shew1_kmers), len(shew1_sub))\\n\",\n    \"print(len(shew2_kmers), len(shew2_sub))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we go from ~500,000 k-mers to ~500 hashes! Do the Jaccard calculations change??\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"akker vs akker, total 1.0\\n\",\n      \"akker vs akker, sub 1.0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"akker vs akker, total\\\", jaccard_similarity(akker_kmers, akker_kmers))\\n\",\n    \"print(\\\"akker vs akker, sub\\\", jaccard_similarity(akker_sub, akker_sub))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"akker vs shew1, total 0.0\\n\",\n      \"akker vs shew1, sub 0.0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"akker vs shew1, total\\\", jaccard_similarity(akker_kmers, shew1_kmers))\\n\",\n    \"print(\\\"akker vs shew1, sub\\\", jaccard_similarity(akker_sub, shew1_sub))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"shew1 vs shew2, total 0.23675152210020398\\n\",\n      \"shew1 vs shew2, sub 0.2281795511221945\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"shew1 vs shew2, total\\\", jaccard_similarity(shew1_kmers, shew2_kmers))\\n\",\n    \"print(\\\"shew1 vs shew2, sub\\\", jaccard_similarity(shew1_sub, shew2_sub))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And you can see that the numbers are different, but not very much - the Jaccard similarity is being *estimated*, so it is not exact but it is close.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Let's visualize --\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib_venn._common.VennDiagram at 0x163888190>\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"venn3([set(akker_kmers), set(shew1_kmers), set(shew2_kmers)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib_venn._common.VennDiagram at 0x1638e11c0>\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"venn3([set(akker_sub), set(shew1_sub), set(shew2_sub)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Other pointers\\n\",\n    \"\\n\",\n    \"[Sourmash: a practical guide](https://sourmash.readthedocs.io/en/latest/using-sourmash-a-guide.html)\\n\",\n    \"\\n\",\n    \"[Classifying signatures taxonomically](https://sourmash.readthedocs.io/en/latest/classifying-signatures.html)\\n\",\n    \"\\n\",\n    \"[Pre-built search databases](https://sourmash.readthedocs.io/en/latest/databases.html)\\n\",\n    \"\\n\",\n    \"## A full list of notebooks\\n\",\n    \"\\n\",\n    \"[An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\\n\",\n    \"\\n\",\n    \"[Some sourmash command line examples!](sourmash-examples.ipynb)\\n\",\n    \"\\n\",\n    \"[Working with private collections of signatures.](sourmash-collections.ipynb)\\n\",\n    \"\\n\",\n    \"[Using the LCA_Database API.](using-LCA-database-API.ipynb)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"py38arm\",\n   \"language\": \"python\",\n   \"name\": \"py38arm\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "doc/legacy-databases.md",
    "content": "# Legacy Databases - 2024 and before\n\n## Types of databases\n\nFor each k-mer size, three types of databases may be available: Zipfile (`.zip`), SBT (`.sbt.zip`), and LCA (`.lca.jzon.gz`). The Zipfile and SBT databases are built with scaled=1000, and then LCA databases are built with scaled=10,000.\nWe recommend using the Zipfile databases for `sourmash gather` and the SBT databases for `sourmash search`. You must use the LCA databases for `sourmash lca` operations.\n\nYou can read more about the different database and index types [here](https://sourmash.readthedocs.io/en/latest/command-line.html#indexed-databases).\n\nNote that the SBT and LCA databases can be used with sourmash v3.5 and later, while Zipfile collections can only be used with sourmash v4.1 and up.\n\n## Taxonomic Information (for non-LCA databases)\n\nFor each prepared database, we have also made taxonomic information available linking each genome with its assigned lineage (`GTDB` or `NCBI` as appropriate).\nFor private databases, users can create their own `taxonomy` files: the critical columns are `ident`, containing the genome accession (e.g. `GCA_1234567.1`) and\na column for each taxonomic rank, `superkingdom` to `species`. If a `strain` column is provided, it will also be used.\nAs of v4.8, we can also use LIN taxonomic information in tax commands that accept the `--lins` flag. If used, `sourmash tax` commands will require a `lin` column in the taxonomy file which should contain `;`-separated LINs, preferably with a standard number of positions (e.g. all 20 positions in length or all 10 positions in length). Some taxonomy commands also accept a `lingroups` file, which is a two-column file (`name`, `lin`) describing the name and LIN prefix of LINgroups to be used for taxonomic summarization.\n\n## Downloading and using the databases\n\nAll databases below can be downloaded via the command line with `curl -JLO <url>`, where `<url>` is the URL below. This will download an appropriately named file; you can name it yourself by specify `'-o <output>` to specify the local filename.\n\nThe databases do not need to be unpacked or prepared in any way after download.\n\nYou can verify that they've been successfully downloaded (and view database properties such as `ksize` and `scaled`) with `sourmash sig summarize <output>`.\n\n## Sketches for human and animal genomes\n\nThese sketches are of the latest releases of a number of animal\ngenomes. Among other uses, they can be used to detect host\ncontamination in microbial metagenomes.\n\nEach file includes sketches at k=21, k=31, and k=51, at a scaled of\n1000, and is under 50 MB.\n\n* Human (hg38) - [hg38.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/hg38.sig.zip)\n* Cow (bosTau9) - [bosTau9.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/bosTau9.sig.zip)\n* Dog (canFam6) - [canFam6.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/canFam6.sig.zip)\n* Horse (equCab3) - [equCab3.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/equCab3.sig.zip)\n* Cat (felCat9) - [felCat9.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/felCat9.sig.zip)\n* Chicken (galGAl6) - [galGal6.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/galGal6.sig.zip)\n* Mouse (mm39) - [mm39.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/mm39.sig.zip)\n* Goat (oviAri4) - [oviAri4.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/oviAri4.sig.zip)\n* Pig (susCr11) - [susScr11.sig.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/host/susScr11.sig.zip)\n\n## Sketches for plant genomes\n\nThese sketches are for the plant genomes available in GenBank as of 2024-07.\n\n| K-mer size | Zipfile collection |\n| -------- | -------- |\n| k21 | [download (7G)](https://farm.cse.ucdavis.edu/\\~ctbrown/sourmash-db/genbank-plant-2024-07/genbank-plants-2024-07.k21.zip) |\n| k31 | [download (8.8G)](https://farm.cse.ucdavis.edu/\\~ctbrown/sourmash-db/genbank-plant-2024-07/genbank-plants-2024-07.k31.zip) |\n| k51 | [download (11G)](https://farm.cse.ucdavis.edu/\\~ctbrown/sourmash-db/genbank-plant-2024-07/genbank-plants-2024-07.k51.zip) |\n\nLineage spreadsheet for sourmash `tax` commands: [download](https://farm.cse.ucdavis.edu/\\~ctbrown/sourmash-db/genbank-plant-2024-07/genbank-plants-2024-07.lineages.csv.gz)\n\n## GTDB R08-RS214 - DNA databases\n\n[GTDB R08-RS214](https://forum.gtdb.ecogenomic.org/t/announcing-gtdb-r08-rs214/456) consists of 402,709 genomes organized into 85,205 species clusters.\n\nThe lineage spreadsheet (for `sourmash tax` commands) is available [for the genome database (402k)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214.lineages.csv.gz).\n\n### GTDB R08-RS214 genomic representatives (85k)\n\nThe GTDB genomic representatives are a low-redundancy subset of Genbank genomes, with 85,205 species-level genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (2.2 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k21.zip) | [download (4.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k21.sbt.zip) | [download (189 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k21.lca.json.gz) |\n| 31 | [download (2.2 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k31.zip) | [download (4.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k31.sbt.zip) | [download (221 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k31.lca.json.gz) |\n| 51 | [download (2.2 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k51.zip) | [download (4.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k51.sbt.zip) | [download (230 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-reps.k51.lca.json.gz) |\n\n### GTDB R08-RS214 all genomes (403k)\n\nThese are databases for the full GTDB release, each containing 402,709  genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (12 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k21.zip) | [download (23 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k21.sbt.zip) | [download (406 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k21.lca.json.gz) |\n| 31 | [download (12 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k31.zip) | [download (23 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k31.sbt.zip) | [download (438 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k31.lca.json.gz) |\n| 51 | [download (12 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k51.zip) | [download (23 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k51.sbt.zip) | [download (460 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs214/gtdb-rs214-k51.lca.json.gz) |\n\n## Genbank genomes from March 2022\n\nThe below zip files contain different subsets of the signatures for\nall microbial Genbank genomes. The databases were built in March 2022,\nand are based on the assembly_summary files provided\n[here](https://ftp.ncbi.nlm.nih.gov/genomes/genbank/).\n\nSince some of the files are extremely large, we only provide them in\nZip format (which is our smallest and most flexible format).\n\nNote that all of the sourmash search commands support multiple\ndatabases on the command line, so you can search multiple subsets\nsimply by providing them all on the command line, e.g. `sourmash\nsearch query.sig genbank-2022.03-{viral,protozoa}-k31.zip`.\n\nTaxonomic spreadsheets for each domain are provided below as well.\n\n### Genbank viral\n\n47,952 genomes:\n\n[genbank-2022.03-viral-k21.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-viral-k21.zip)\n\n[genbank-2022.03-viral-k31.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-viral-k31.zip)\n\n[genbank-2022.03-viral-k51.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-viral-k51.zip)\n\n[genbank-2022.03-viral.lineages.csv.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-viral.lineages.csv.gz)\n\n### Genbank archaeal\n\n8,750 genomes:\n\n[genbank-2022.03-archaea-k21.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-archaea-k21.zip)\n\n[genbank-2022.03-archaea-k31.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-archaea-k31.zip)\n\n[genbank-2022.03-archaea-k51.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-archaea-k51.zip)\n\n[genbank-2022.03-archaea.lineages.csv.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-archaea.lineages.csv.gz)\n\n\n### Genbank protozoa\n\n1193 genomes:\n\n[genbank-2022.03-protozoa-k21.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-protozoa-k21.zip)\n\n[genbank-2022.03-protozoa-k31.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-protozoa-k31.zip)\n\n[genbank-2022.03-protozoa-k51.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-protozoa-k51.zip)\n\n[genbank-2022.03-protozoa.lineages.csv.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-protozoa.lineages.csv.gz)\n\n\n### Genbank fungi\n\n10,286 genomes:\n\n[genbank-2022.03-fungi-k21.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-fungi-k21.zip)\n\n[genbank-2022.03-fungi-k31.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-fungi-k31.zip)\n\n[genbank-2022.03-fungi-k51.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-fungi-k51.zip)\n\n[genbank-2022.03-fungi.lineages.csv.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-fungi.lineages.csv.gz)\n\n### Genbank bacterial:\n\n1,148,011 genomes:\n\n[genbank-2022.03-bacteria-k21.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-bacteria-k21.zip)\n\n[genbank-2022.03-bacteria-k31.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-bacteria-k31.zip)\n\n[genbank-2022.03-bacteria-k51.zip](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-bacteria-k51.zip)\n\n[genbank-2022.03-bacteria.lineages.csv.gz](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/genbank-2022.03/genbank-2022.03-bacteria.lineages.csv.gz)\n\n## GTDB R07-RS207 - DNA databases\n\n[GTDB R07-RS207](https://forum.gtdb.ecogenomic.org/t/announcing-gtdb-r07-rs207/264) consists of 317,542 genomes organized into 65,703 species clusters.\n\nThe lineage spreadsheet (for `sourmash tax` commands) is available [for the species database (65k)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.taxonomy.reps.csv.gz) and [for the genome database (317k)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.taxonomy.with-strain.csv.gz).\n\n### GTDB R07-RS207 genomic representatives (66k)\n\nThe GTDB genomic representatives are a low-redundancy subset of Genbank genomes, with 65,703 species-level genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (1.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k21.zip) | [download (3.5 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k21.sbt.zip) | [download (181 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k21.lca.json.gz) |\n| 31 | [download (1.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k31.zip) | [download (3.5 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k31.sbt.zip) | [download (181 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k31.lca.json.gz) |\n| 51 | [download (1.7 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k51.zip) | [download (3.5 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k51.sbt.zip) | [download (181 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic-reps.dna.k51.lca.json.gz) |\n\n### GTDB R07-RS207 all genomes (318k)\n\nThese are databases for the full GTDB release, each containing 317,542 genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (9.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k21.zip) | [download (19 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k21.sbt.zip) | [download (351 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k21.lca.json.gz) |\n| 31 | [download (9.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k31.zip) | [download (19 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k31.sbt.zip) | [download (351 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k31.lca.json.gz) |\n| 51 | [download (9.4 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k51.zip) | [download (19 GB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k51.sbt.zip) | [download (351 MB)](https://farm.cse.ucdavis.edu/~ctbrown/sourmash-db/gtdb-rs207/gtdb-rs207.genomic.k51.lca.json.gz) |\n\n\n## GTDB R06-RS202 - DNA databases\n\nAll files below are available under https://osf.io/wxf9z/. The GTDB taxonomy spreadsheet (in a format suitable for `sourmash lca index`) is available [here](https://osf.io/p6z3w/).\n\n### GTDB R06-RS202 genomic representatives (47.8k)\n\nThe GTDB genomic representatives are a low-redundancy subset of Genbank genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (1.3 GB)](https://osf.io/jp5zh/download) | [download (2.6 GB)](https://osf.io/py92w/download) | [download (114 MB)](https://osf.io/gk2za/download) | \n| 31 | [download (1.3 GB)](https://osf.io/nqmau/download) | [download (2.6 GB)](https://osf.io/w4bcm/download) | [download (131 MB)](https://osf.io/ypsjq/download) | \n| 51 | [download (1.3 GB)](https://osf.io/px6qd/download) | [download (2.6 GB)](https://osf.io/rv9zp/download) | [download (137 MB)](https://osf.io/297dp/download) | \n\n### GTDB R06-RS202 all genomes (258k)\n\nThese databases contain the complete GTDB collection of 258,406 genomes.\n\n| K-mer size | Zipfile collection | SBT | LCA |\n| -------- | -------- | -------- | ---- |\n| 21 | [download (7.8 GB)](https://osf.io/vgex4/download) | [download (15 GB)](https://osf.io/ar67j/download) | [download (266 MB)](https://osf.io/hm3c4/download) | \n| 31 | [download (7.8 GB)](https://osf.io/94mzh/download) | [download (15 GB)](https://osf.io/dmsz8/download) | [download (286 MB)](https://osf.io/9xdg2/download) | \n| 51 | [download (7.8 GB)](https://osf.io/x9cdp/download) | [download (15 GB)](https://osf.io/8fc3t/download) | [download (299 MB)](https://osf.io/3cdp6/download)  | \n\n## Appendix: database use and construction details\n\nDatabase release workflows are being archived at [sourmash-bio/database-releases](https://github.com/sourmash-bio/database-releases).\n\nSome more details on database use and construction:\n\n* Zipfile collections can be used for a linear search. The signatures were calculated with a scaled of 1000, which robustly supports searches for ~10kb or larger matches.\n* SBT databases are indexed versions of the Zipfile collections that support faster search. They are also indexed with scaled=1000.\n* LCA databases are indexed versions of the Zipfile collections that also contain taxonomy information and can be used with regular search as well as with [the `lca` subcommands for taxonomic analysis](https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-lca-subcommands-for-taxonomic-classification). They are indexed with scaled=10,000, which robustly supports searches for 100kb or larger matches.\n\n## Appendix: Memory and time requirements\n\nThe detailed memory usage of sourmash depends on the type of search, the query, and the database you're searching, but to help guide you here is a range of numbers:\n\n| Search type | Query | Database | Max RAM | Time |\n| -------- | -------- | -------- | -------- | -------- |\n| gather | Bacterial genome | GTDB complete (280k) | 1 GB | 6 minutes |\n| gather | Simple metagenome | GTDB reps .zip (65k)     |   2 GB   | 6 minutes |\n| gather | Real metagenome | All Genbank (1.2m) | 100 GB | 3 hours\n| lca summarize     |Simple metagenome | GTDB reps .sql (65k)     |   400 MB   | 20 seconds |\n| lca summarize | Simple metagenome | GTDB reps .json (65k) | 6.2 GB | 1m 20 seconds |\n\n\nPlease see [sourmash#1958](https://github.com/sourmash-bio/sourmash/issues/1958) for detailed GTDB numbers and [gather paper#47](https://github.com/dib-lab/2020-paper-sourmash-gather/issues/47) for detailed Genbank numbers.\n\n\n\nSourmash databases have evolved over time. \nWe have changed how the database is stored (uncompressed `.zip`) and how we name each signature.\nAll SBT databases below are in `.sbt.zip` format.\nNote that the SBT and LCA databases can be used with sourmash v3.5 and later, while Zipfile collections can only be used with sourmash v4.1.0 and up.\nWe detail these changes below, and include links to legacy databases.\nSee [github.com/sourmash-bio/databases](https://github.com/sourmash-bio/databases) for a Snakemake workflow that builds current and legacy databases.\n\n## Sourmash signature names\n\nEarlier versions of sourmash databases were built using individual signatures that were calculated as follows:\n\n```\nsourmash compute -k 4,5 \\\n                 -n 2000 \\\n                 --track-abundance \\\n                 --name-from-first \\\n                 -o {output} \\\n                 {input}\n\nsourmash compute -k 21,31,51 \\\n                 --scaled 2000 \\\n                 --track-abundance \\\n                 --name-from-first \\\n                 -o {output} \\\n                 {input}\n```\n\nWe moved away from this strategy because `--name-from-first` named each signature from the name of the first sequence in the FASTA file.\nWhile the species name of the organism was present in this name, the accession number corresponded to the accession of the first sequence fragment in the file, not the genome assembly.\nAs such, we revised our strategy so that signatures are named by genome assembly accession and species name. \nThis requires the `assembly_summary.txt` file to be parsed. \n\n## Sourmash database compression\n\n## Legacy databases\n\n### RefSeq microbial genomes - SBT\n\nThese database are formatted for use with `sourmash search` and\n`sourmash gather`. They are calculated with a scaled value of 2000.\n\nApproximately 91,000 microbial genomes (including viral and fungal)\nfrom NCBI RefSeq.\n\n* [RefSeq k=21, 2018.03.29][0] - 3.3 GB - [manifest](https://osf.io/wamfk/download)\n* [RefSeq k=31, 2018.03.29][1] - 3.3 GB - [manifest](https://osf.io/x3aut/download)\n* [RefSeq k=51, 2018.03.29][2] - 3.4 GB - [manifest](https://osf.io/zpkau/download)\n\n### Genbank microbial genomes - SBT\n\nThese database are formatted for use with `sourmash search` and\n`sourmash gather`.\n\nApproximately 98,000 microbial genomes (including viral and fungal)\nfrom NCBI Genbank.\n\n* [Genbank k=21, 2018.03.29][3] - 3.9 GB - [manifest](https://osf.io/vm5kb/download)\n* [Genbank k=31, 2018.03.29][4] - 3.9 GB - [manifest](https://osf.io/p87ec/download)\n* [Genbank k=51, 2018.03.29][5] - 3.9 GB - [manifest](https://osf.io/cbxg9/download)\n\n\n[0]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/refseq-k21.sbt.zip\n[1]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/refseq-k31.sbt.zip\n[2]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/refseq-k51.sbt.zip\n\n[3]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/genbank-k21.sbt.zip\n[4]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/genbank-k31.sbt.zip\n[5]: https://sourmash-databases.s3-us-west-2.amazonaws.com/zip/genbank-k51.sbt.zip\n\n### Genbank microbial genomes - LCA\n\nThese databases are formatted for use with `sourmash lca`; they are\nv2 LCA databases and will work with sourmash v2.0a11 and later.\nThey are calculated with a scaled value of 10000 (1e5).\n\nApproximately 87,000 microbial genomes (including viral and fungal)\nfrom NCBI Genbank.\n\n* [Genbank k=21, 2017.11.07](https://osf.io/d7rv8/download), 109 MB\n* [Genbank k=31, 2017.11.07](https://osf.io/4f8n3/download), 120 MB\n* [Genbank k=51, 2017.11.07](https://osf.io/nemkw/download), 125 MB\n\n\nThe above LCA databases were calculated as follows:\n\n```\nsourmash lca index genbank-genomes-taxonomy.2017.05.29.csv \\\n    genbank-k21.lca.json.gz -k 21 --scaled=10000 \\\n    -f --traverse-directory .sbt.genbank-k21 --split-identifiers\n```\n\nSee\n[github.com/dib-lab/2018-ncbi-lineages](https://github.com/dib-lab/2018-ncbi-lineages)\nfor information on preparing the genbank-genomes-taxonomy when signatures are generated using `--name-from-first`.\n\n### GTDB databases - SBT\n\nAll files below are available [here](https://osf.io/wxf9z/).\n\nRelease 89\n\n* [GTDB k=31, release 89](https://osf.io/5mb9k/download)\n\nRelease 95\n\n* [GTDB k=21, scaled=1000](https://osf.io/4yhe2/download)\n* [GTDB k=31, scaled=1000](https://osf.io/4n3m5/download)\n* [GTDB k=51, scaled=1000](https://osf.io/c8wj7/download)\n\n\n"
  },
  {
    "path": "doc/more-info.md",
    "content": "# Additional information on sourmash\n\n## Computational requirements\n\nRead more about the [computational requirements, here.](requirements.md)\n\n## Prepared search databases\n\nWe offer a number of [prepared search databases.](databases.md)\n\nYou can read about the supported database formats [here.](databases-advanced.md)\n\n## Other MinHash implementations for DNA\n\nIn addition to [mash][0], also see:\n\n* [RKMH][1]: Read Classification by Kmers\n* [mashtree][2]: For building trees using Mash\n* [Finch][3]: \"Fast sketches,\n  count histograms, better filtering.\"\n* [BBMap and SendSketch][13]: part of Brian Bushnell's tool collection.\n* [PATRIC](https://patricbrc.org/) uses MinHash for genome search.\n\nIf you are interested in exactly how these MinHash approaches\ncalculate the hashes of DNA sequences, please see some simple Python\ncode in sourmash, [utils/compute-dna-mh-another-way.py][4]\n\n## Papers and references\n\n[On the resemblance and containment of documents][20],  Broder, 1997. The original MinHash paper!\n\n[Mash: fast genome and metagenome distance estimation using MinHash.][21], Ondov et al. 2016.\n\n[sourmash: a library for MinHash sketching of DNA.][22], Brown and Irber, 2017.\n\n[Improving MinHash via the Containment Index with Applications to Metagenomic Analysis][23], Koslicki and Zabeti, 2017.\n\n[Ultra-fast search of all deposited bacterial and viral genomic data](http://dx.doi.org/10.1038/s41587-018-0010-1), Bradley et al., 2019.\n \n[Streaming histogram sketching for rapid microbiome analytics](https://www.biorxiv.org/content/10.1101/408070v1), Rowe et al., 2019.\n\n[Dashing: Fast and Accurate Genomic Distances with HyperLogLog](https://www.biorxiv.org/content/10.1101/501726v2), Baker and Langmead, 2019.\n\n## Presentations and posters\n\n[Taxonomic classification of microbial metagenomes using MinHash signatures][12], Brooks et al., 2017. Presented at ASM.\n\n## Blog posts\n\n\n We (and others) have a number of blog posts on sourmash and MinHash\n more generally:\n\n * [Some background on k-mers, and their use in taxonomy][15]\n\n * From the Phillippy lab: [mash screen: what's in my sequencing run?][14]\n\n* [Applying MinHash to cluster RNAseq samples][5]\n\n\n* [MinHash signatures as ways to find samples, and collaborators?][6]\n\n\n* [Efficiently searching MinHash Sketch collections][7]:\n   indexing and\n  search 42,000 bacterial genomes with Sequence Bloom Trees.\n\n* [Quickly searching all the microbial genomes, mark 2 - now with archaea, phage, fungi, and protists!][8]:\n indexing\n  and searching 50,000 microbial genomes, round 2.\n\n* [What metadata should we put in MinHash Sketch signatures?][9]:\n  crowdsourcing ideas for what metadata belongs in a signature file.\n\n* [Minhashing all the things (part 1): microbial genomes][10]:\n   on\n  approaches to computing MinHashes for large collections of public data.\n* [Comparing genome sets extracted from metagenomes][16]\n\n* [Taxonomic examinations of genome bins from Tara Oceans][17]\n\n* [Classifying genome bins using a custom reference database, part I][18]\n\n* [Classifying genome bins using a custom reference database, part II][19]\n\n## JSON format for the signature\n\n\nThe JSON format is not necessarily final; this is a TODO item for future\nreleases.  In particular, we'd like to update it to store more metadata\nfor samples.\n\n## Interoperability with mash\n\n\nThe hashing functions used by sourmash and mash are the same, but we\nare still [working on ways to convert the file formats][11]. Please\nkeep an eye on `sourmash signature import` and `sourmash signature\nexport`!\n\n## Developing sourmash\n\n\nPlease see:\n * [Developer information][24]\n * [Release workflow][25]\n\n## Known issues\n\nFor at least some versions of matplotlib, users may encounter an\nerror \"Failed to connect to server socket:\" or \"RuntimeError:\nInvalid DISPLAY variable\".  This is because by default matplotlib\ntries to connect to X11 to use the Tkinter backend.\n\nThe solution is to force the use of the 'Agg' backend in matplotlib;\nsee [this stackoverflow answer](https://stackoverflow.com/a/34294056)\nor [this sourmash issue comment](https://github.com/sourmash-bio/sourmash/issues/254#issuecomment-304274590).\n\nNewer versions of matplotlib do not seem to have this problem.\n\n```{toctree}\n---\nhidden:\n---\nREADME.md\nlegacy-databases.md\ndatabases-advanced.md\nplotting-compare.ipynb\nsourmash-sketch.md\n```\n\n[0]:https://github.com/marbl/Mash\n[1]:https://github.com/edawson/rkmh\n[2]:https://github.com/lskatz/mashtree/blob/master/README.md\n[3]:https://github.com/onecodex/finch-rs\n[4]:https://github.com/sourmash-bio/sourmash/blob/latest/utils/compute-dna-mh-another-way.py\n[5]:http://ivory.idyll.org/blog/2016-sourmash.html\n[6]:http://ivory.idyll.org/blog/2016-sourmash-signatures.html\n[7]:http://ivory.idyll.org/blog/2016-sourmash-sbt.html\n[8]:http://ivory.idyll.org/blog/2016-sourmash-sbt-more.html\n[9]:http://ivory.idyll.org/blog/2016-sourmash-signatures-metadata.html\n[10]:http://blog.luizirber.org/2016/12/28/soursigs-arch-1/\n[11]:https://github.com/marbl/Mash/issues/27\n[12]:https://osf.io/mu4gk/\n[13]:http://seqanswers.com/forums/showthread.php?t=74019\n[14]:https://genomeinformatics.github.io/mash-screen/\n[15]:http://ivory.idyll.org/blog/2017-something-about-kmers.html\n[16]:http://ivory.idyll.org/blog/2017-comparing-genomes-from-metagenomes.html\n[17]:http://ivory.idyll.org/blog/2017-taxonomy-of-tara-ocean-genomes.html\n[18]:http://ivory.idyll.org/blog/2017-classify-genome-bins-with-custom-db-part-1.html\n[19]:http://ivory.idyll.org/blog/2017-classify-genome-bins-with-custom-db-part-2.html\n[20]:http://ieeexplore.ieee.org/document/666900/?reload=true\n[21]:https://genomebiology.biomedcentral.com/articles/10.1186/s13059-016-0997-x\n[22]:http://joss.theoj.org/papers/3d793c6e7db683bee7c03377a4a7f3c9\n[23]:https://www.biorxiv.org/content/early/2017/09/04/184150\n[24]:developer.md\n[25]:release.md\n"
  },
  {
    "path": "doc/other-languages.md",
    "content": "# Using `sourmash` output with R and other languages\n\nMost of the sourmash shell commands output CSV files upon request;\nthese files have headers and are straightforward to load into R.\nBelow are some code snippets and links that might be useful.\n\n## R code for working with compare output\n\n(by Taylor Reiter)\n\n`sourmash compare` can output matrices in a CSV format, which can\neasily be read into R.  For example, if you download the Eschericia\nsignature collection as in\n[the sourmash tutorial](tutorial-basic.md#make-and-search-a-database-quickly),\nthen the shell command\n\n```shell\nsourmash compare ecoli_many_sigs/*.sig --csv ecoli.cmp.csv\n```\n\nwill output a file `ecoli.cmp.csv` that can be loaded into R like so:\n\n```r\n\nsourmash_comp_matrix <- read.csv(\"ecoli.cmp.csv\")\n\n# Label the rows\nrownames(sourmash_comp_matrix) <- colnames(sourmash_comp_matrix)\n\n# Transform for plotting\nsourmash_comp_matrix <- as.matrix(sourmash_comp_matrix)\n\n```\n\nSee the output of plotting and clustering this matrix by downloading and opening [this html](https://raw.githubusercontent.com/sourmash-bio/sourmash/latest/doc/_static/ecoli-cmp.html), produced by [this RMarkdown file](https://raw.githubusercontent.com/sourmash-bio/sourmash/latest/doc/_static/ecoli-cmp.Rmd).\n\nYou can download the `ecoli.cmp.csv` file itself [here](https://raw.githubusercontent.com/sourmash-bio/sourmash/latest/doc/_static/ecoli.cmp.csv).\n\n"
  },
  {
    "path": "doc/plotting-compare.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Building plots from `sourmash compare` output\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\\n\",\n    \"### Running this notebook.\\n\",\n    \"\\n\",\n    \"You can run this notebook interactively via mybinder; click on this button:\\n\",\n    \"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dib-lab/sourmash/latest?labpath=doc%2Fplotting-compare.ipynb)\\n\",\n    \"\\n\",\n    \"A rendered version of this notebook is available at [sourmash.readthedocs.io](https://sourmash.readthedocs.io) under \\\"Tutorials and notebooks\\\".\\n\",\n    \"\\n\",\n    \"You can also get this notebook from the [doc/ subdirectory of the sourmash github repository](https://github.com/dib-lab/sourmash/tree/latest/doc). See [binder/environment.yaml](https://github.com/dib-lab/sourmash/blob/latest/binder/environment.yml) for installation dependencies.\\n\",\n    \"\\n\",\n    \"### What is this?\\n\",\n    \"\\n\",\n    \"This is a Jupyter Notebook using Python 3. If you are running this via [binder](https://mybinder.org), you can use Shift-ENTER to run cells, and double click on code cells to edit them.\\n\",\n    \"\\n\",\n    \"Contact: C. Titus Brown, ctbrown@ucdavis.edu. Please [file issues on GitHub](https://github.com/dib-lab/sourmash/issues/) if you have any questions or comments!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Running `sourmash compare` and generating figures in Python\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, we need to generate a similarity matrix with compare. (If you want to generate this programmatically, it's just a `numpy` matrix.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.8.5.dev0. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloaded 7 signatures total.                                                     \\n\",\n      \"\\u001b[K\\n\",\n      \"0-SRR2060939_1.fa...\\t[1.    0.356 0.078 0.086 0.    0.    0.   ]\\n\",\n      \"1-SRR2060939_2.fa...\\t[0.356 1.    0.072 0.078 0.    0.    0.   ]\\n\",\n      \"2-SRR2241509_1.fa...\\t[0.078 0.072 1.    0.074 0.    0.    0.   ]\\n\",\n      \"3-SRR2255622_1.fa...\\t[0.086 0.078 0.074 1.    0.    0.    0.   ]\\n\",\n      \"4-SRR453566_1.fas...\\t[0.    0.    0.    0.    1.    0.382 0.364]\\n\",\n      \"5-SRR453569_1.fas...\\t[0.    0.    0.    0.    0.382 1.    0.386]\\n\",\n      \"6-SRR453570_1.fas...\\t[0.    0.    0.    0.    0.364 0.386 1.   ]\\n\",\n      \"min similarity in matrix: 0.000\\n\",\n      \"\\u001b[Ksaving labels to: compare-demo.labels.txt\\n\",\n      \"\\u001b[Ksaving comparison matrix to: compare-demo\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash compare ../tests/test-data/demo/*.sig -o compare-demo\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"%pylab is deprecated, use %matplotlib inline and import the required libraries.\\n\",\n      \"Populating the interactive namespace from numpy and matplotlib\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%pylab inline\\n\",\n    \"# import the `fig` module from sourmash:\\n\",\n    \"from sourmash import fig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `sourmash.fig` module contains code to load the similarity matrix and associated labels:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"matrix, labels = fig.load_matrix_and_labels(\\\"compare-demo\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here, `matrix` is a numpy matrix and `labels` is a list of labels (by default, filenames).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"matrix:\\n\",\n      \" [[1.    0.356 0.078 0.086 0.    0.    0.   ]\\n\",\n      \" [0.356 1.    0.072 0.078 0.    0.    0.   ]\\n\",\n      \" [0.078 0.072 1.    0.074 0.    0.    0.   ]\\n\",\n      \" [0.086 0.078 0.074 1.    0.    0.    0.   ]\\n\",\n      \" [0.    0.    0.    0.    1.    0.382 0.364]\\n\",\n      \" [0.    0.    0.    0.    0.382 1.    0.386]\\n\",\n      \" [0.    0.    0.    0.    0.364 0.386 1.   ]]\\n\",\n      \"labels: ['SRR2060939_1.fastq.gz', 'SRR2060939_2.fastq.gz', 'SRR2241509_1.fastq.gz', 'SRR2255622_1.fastq.gz', 'SRR453566_1.fastq.gz', 'SRR453569_1.fastq.gz', 'SRR453570_1.fastq.gz']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"matrix:\\\\n\\\", matrix)\\n\",\n    \"print(\\\"labels:\\\", labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `plot_composite_matrix` function returns a generated plot, along with the labels and matrix as re-ordered by the clustering:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA88AAAICCAYAAADxiv8dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACOC0lEQVR4nOzdeXhN5/r/8c+KRBIihsQQIkLwRc1zqirmmsupUkNpTTVryyE1V1SEorSqKkgH5acojplojw5R0XJQ/bbfanAIkRhLiCT794eTVVt2kh1na2zer17rumTtez3rWbsJuff9DIbFYrEIAAAAAABkySWvOwAAAAAAwMOO5BkAAAAAgByQPAMAAAAAkAOSZwAAAAAAckDyDAAAAABADkieAQAAAADIAckzAAAAAAA5IHkGAAAAACAHJM8AAAAAAOSA5BkAAAAAgByQPAMAAAAAnMY///lPderUSaVLl5ZhGPriiy9yvOarr75SvXr15OHhoQoVKmjJkiW5vi/JMwAAAADAaVy/fl21atXSu+++a1f877//rvbt26tp06b68ccf9cYbb2jUqFFat25dru5rWCwWy/10GAAAAACAvGQYhjZs2KBnn302y5jx48dr06ZNOn78uHnulVde0eHDh/Xdd9/ZfS8qzwAAAACAR9Z3332nNm3aWJ1r27atYmNjdfv2bbvbcbUnKD09XWfPnlWhQoVkGEbuegogVywWi65du6bSpUvLxYXPt+Bc+PcCAADnktvfPW/evKmUlJQH0o97f3dwd3eXu7v7f932uXPnVLJkSatzJUuWVGpqqhITE+Xn52dXO3Ylz2fPnlXZsmVz30sA9+306dPy9/fP624AucK/FwAAOCd7fve8efOmPAsWldJvOvz+Xl5e+uOPP6zOTZ06VdOmTXNI+/cm5hmzl3PzYb9dyXOhQoUk3XlDvb297W4cQO5dvXpVZcuWNX/uAGfy578XX8nb2yuPewM4v2u3z+R1Fx5aLvb9Gvv4YdRPlsrXXJbXXXgoWdJvKyV+k12/e6akpEjpN+VR+lnJxc1xnUi/rT/OfpEp33RE1VmSSpUqpXPnzlmdS0hIkKurq3x8fOxux66/dTKycW9vb5Jn4C/CkFc4oz//vfAieQYcwLhdMK+78NAiec4Cvz9kyXBksvcIytXvni5uDn0/M1awflD5ZnBwsDZv3mx1bufOnapfv77c3Ox/DiZUAgAAAADsZsiQIRcHHrn70OePP/7QoUOHdOjQIUl3tqI6dOiQTp06JUkKDQ3Viy++aMa/8sorOnnypF577TUdP35cy5cvV2RkpMaOHZur+/KRHQAAAADAacTGxqp58+bm16+99pokqV+/flq5cqXi4+PNRFqSypcvr61bt+rVV1/Ve++9p9KlS2vhwoX629/+lqv7kjwDAAAAAOxmGC4yDAcOYs5lWyEhIeaCX7asXLky07lmzZrphx9+yG3PrDBsGwAAAACAHFB5BgAAAADYLa8rz3nFOXoJAAAAAEAeovIMAAAAALCbYRiO3VbVSbZYo/IMAAAAAEAOqDwDAAAAAHLBRY6twzpHTdc5egkAAAAAQB6i8gwAAAAAsBurbQMAAAAAAJuoPAMAAAAA7Pa4Vp5JngEAAAAAdjPkIoMFwwAAAAAAwL2oPAMAAAAA7Pa4Dtt2jl4CAAAAAJCHqDwDAAAAAOxmyMGVZyep6TpHLwEAAAAAyENUngEAAAAA9jMMh1aeLYbhsLYeJCrPAAAAAADkgMozAAAAAMBuxn/+c2R7zoDKMwAAAAAAOaDyDAAAAACwm6P3eXbsyt0PjnP0EgAAAACAPETyDDwC9u/fr65duyogIEDu7u4qWbKkgoOD9frrr5sxISEhMgzDPDw8PFStWjWFhYUpJSXFqr24uDirWBcXFxUtWlQtW7bUzp07M91//fr1euGFF1SxYkV5enoqMDBQvXv31q+//moVd/XqVc2cOVMhISEqVaqUvLy8VKNGDc2ePVs3b97Mtg93H6tXr7aKnTZtms04Dw8Pm+9XYmKiRo8ercDAQPP9ateunS5evGjGREdH6+WXX1aVKlVUsGBBlSlTRl26dNHBgwet2kpLS9O8efP0zDPPyN/fXwUKFFDVqlU1YcIEXb58Oev/aVn4+uuvNXDgQNWrV0/u7u4yDENxcXF2X3/x4kX17NlTJUqUkGEYevbZZ3Pdh+zcuHFD06ZN05dffunQdgEAgPPIqDw78nAGDNsGnNyWLVvUuXNnhYSEKCIiQn5+foqPj1dsbKxWr16tt99+24ytUKGCPv30U0nShQsXtGzZMk2ePFmnTp3S0qVLM7U9cuRI9erVS2lpafr55581ffp0tW/fXtHR0Xr66afNuNmzZ6tUqVKaOHGiKlSooNOnT+utt95S3bp1FRMToyeeeEKSdOrUKS1YsEB9+/bVa6+9Ji8vL+3bt0/Tpk3Trl27tGvXLhn3bFWQ0Ye7VapUyeZ7sX37dhUuXNj82sUl81/EZ8+eVdOmTeXq6qrJkyerUqVKSkxM1N69e60+RHj//feVlJSk0aNHq1q1arpw4YLefvttNW7cWDt27FCLFi0kScnJyZo2bZpeeOEFDRw4UL6+vvrhhx8UFhamzZs3KzY2Vp6enrb/59mwZ88e7d69W3Xq1JG3t3euk9QZM2Zow4YNWr58uYKCglSsWLFcXZ+TGzduaPr06ZLufCADAADwuCB5BpxcRESEypcvrx07dsjV9c8f6Z49eyoiIsIq1tPTU40bNza/bteunapVq6aoqCgtXLgwU6U2ICDAjG/SpIkqVaqkZs2aKTIy0ip53rx5s0qUKGF1bYsWLRQYGKj58+dr2bJlkqTy5csrLi5OBQsWtIorWLCgxo0bp2+++UZPPfVUln3ISb169eTr65ttzLBhw3Tr1i3FxsaqaNGi5vlu3bpZxb333nuZnumZZ55RxYoV9dZbb5nJs6enp37//Xf5+PiYcSEhIQoICFD37t21bt069enTx67+S9LkyZM1depUSdLcuXNznTwfPXpUQUFB6t27d66uAwAAsBdzngE4paSkJPn6+lolzhlsVV7v5urqqtq1ayslJcWuIcb169eXJJ0/f97q/L1JpiSVLl1a/v7+On36tHmuYMGCVolzhoYNG0qSVeyDEBcXp02bNmnQoEFWibMttp7Jy8tL1apVs+pnvnz5rBLnDPf7TDn9P8tKxjD33bt36/jx4+bQ9Yzke/r06WrUqJGKFSsmb29v1a1bV5GRkbJYLFbtREdHKyQkRD4+PvL09FRAQID+9re/6caNG4qLi1Px4sXN9jLu0b9/f/P6HTt23Ff/AQCAM3F5AMfDz+krzxaLRcm30/K6G4DD3EhJzVV8cHCwli1bplGjRql3796qW7eu3Nzc7L7+999/V5EiRcykKKdYSapcuXKOsSdOnNDJkyftmnMbHR0tSebw7ruFh4frjTfekKurq+rWrau///3v6ty5s812atSooYSEBPn6+qpt27YKCwtTQECA+fq+fftksVhUunRpvfDCC9q8ebNSU1PVuHFjzZo1S8HBwdn288qVK/rhhx/MqvP9PtOD4Ofnp++++07Dhg3TlStXzOH51apVk3QnuR4yZIj5fsTExGjkyJE6c+aMpkyZYsZ06NBBTZs21fLly1WkSBGdOXNG27dvV0pKivz8/LR9+3Y988wzGjBggAYOHChJ5vfOnj171LNnz7/keQEAAP5qTp08WywWPbfkOx08eSmvuwI4TPqtG7mKDw8P188//6xFixZp0aJFcnNzU4MGDdSpUyeNGDFCXl5eVvGpqXeS88TERL3//vuKjY3VkiVLlC9fvsx9SU9XamqqOed56NCh8vPz02uvvZZtn1JTUzVgwAB5eXnp1VdfzTb2X//6lyIiItS1a1fVrFnTPO/u7q5BgwapdevW8vPz06lTp7Ro0SJ16dJFH374oZm4SVJQUJBmzpypOnXqyMPDQ99//70iIiK0c+dOHTx4UGXKlJEknTlzRpI0duxYNW/eXOvWrdP169c1ffp0tWjRQvv377fqw72GDx+u69eva+LEidk+05kzZzRhwgTVr19fHTt2zDbWUdzd3dW4cWN5e3srJSUl01D3FStWmH9OT09XSEiILBaL3nnnHU2ePFmGYejgwYO6efOm5syZo1q1apnxd885r1evniTJ398/0z0mTpyoEiVK6Ny5cw/iEQEAwEPicR227dTJc/LtNBJnPPZ8fHy0b98+xcbGas+ePYqNjdWXX36p0NBQffDBBzpw4IA5D/jYsWOZqtKhoaEaMmSIzbbHjx+v8ePHm18XKlRIe/fuVWBgYJb9sVgsGjBggPbt26d169apbNmyWcbGxcWpY8eOKlu2rDkvOoOfn1+mRcy6d++uRo0aacKECerfv785VL1v375Wcc2bN1fz5s0VHBysiIgIvfPOO5LuJI3SncRv3bp15gcGwcHBqlixoiIiIvTJJ5/Y7OvkyZP16aefatGiRWYCacvFixfVvn17WSwWrVmz5r6HYTtadHS03nrrLR04cEBXr161ei0hIUElS5ZU7dq1lT9/fg0ePFjDhg1T06ZNVaFCBbvav379ug4cOKCBAwfaXHwOAADA2Tl18ny32EmtVCB/5soZ4GyuXr0qvwW5v65+/frmnOTbt29r/Pjxmj9/viIiIsyFw4KCgrR69WpZLBadPHlSYWFhmjVrlmrWrGlzuO3o0aPVp08f3bp1SzExMZo0aZK6dOmiw4cP25zna7FYNHDgQH3yySeKiopSly5dsuzvyZMn1bx5c7m6umrPnj12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29v1u2fGv/Nl3vqHXDwKOqwP6Tev68wbHR/6338fvawTAAAAAPDgPKb7PJM8A8BfIC0tTdkN9DEMw2pBLwAAADxcWG0bAP4CQUFBcnNzy/Jo2bJlXncRAADAPsYDOJwAlWcA+Ats3rxZt27dyvL1QoUK/YW9AQAAuH8uhuTiyDIsyTMAIMO9q3kDAADAuZA8AwAAAADs9pjuVMWcZwAAAAAAckLlGQAAAABgNyrPAAAAAADAJpJnAAAAAIDdDMNw+HE/Fi9erPLly8vDw0P16tXTvn37so2/deuWJk6cqHLlysnd3V1BQUFavny53fdj2DYAAAAAwKmsWbNGY8aM0eLFi9WkSRN98MEHateunX766ScFBATYvOb555/X+fPnFRkZqYoVKyohIUGpqal235PkGQAAAABgt4dhzvO8efM0YMAADRw4UJK0YMEC7dixQ++//75mzZqVKX779u366quvdOLECRUrVkySFBgYmKt7MmwbAAAAAJDnrl69anXcunXLZlxKSooOHjyoNm3aWJ1v06aNvv32W5vXbNq0SfXr11dERITKlCmjypUra+zYsUpOTra7f1SeAQAAAAB2e1CV57Jly1qdnzp1qqZNm5YpPjExUWlpaSpZsqTV+ZIlS+rcuXM273HixAl9/fXX8vDw0IYNG5SYmKhhw4bp4sWLds97JnkGAAAAAOS506dPy9vb2/za3d092/h7FxqzWCxZLj6Wnp4uwzD06aefqnDhwpLuDP1+7rnn9N5778nT0zPH/pE8AwAAAADs5yIZjpwA/J+2vL29rZLnrPj6+ipfvnyZqswJCQmZqtEZ/Pz8VKZMGTNxlqSqVavKYrHo3//+typVqmRvNwEAAAAAePjlz59f9erV065du6zO79q1S08++aTNa5o0aaKzZ8/qjz/+MM/98ssvcnFxkb+/v133JXkGAAAAANgtY86zI4/ceu2117Rs2TItX75cx48f16uvvqpTp07plVdekSSFhobqxRdfNON79eolHx8fvfTSS/rpp5/0z3/+U+PGjdPLL79s15BtiWHbAAAAAIBccDHuHI5iuY+2evTooaSkJL355puKj49X9erVtXXrVpUrV06SFB8fr1OnTpnxXl5e2rVrl0aOHKn69evLx8dHzz//vMLCwuy+J8kzAAAAAMDpDBs2TMOGDbP52sqVKzOdq1KlSqah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7du3q3DhwubXLi7Wnw/WrVtX3333Xabr3n//fX300Ufq2rWr1flu3brpwIEDCg8PV+XKlbVq1Sq98MILSk9PV69evbJ8vnslJSVp6dKlqlWrlp599lmbfc/OoUOHNGrUKA0cOFD9+vWTq6urChUqlKs2crJq1SodPXpUY8aMcWi7AADg0fO4blVF8gw4uYiICJUvX147duyQq+ufP9I9e/ZURESEVaynp6caN25sft2uXTtVq1ZNUVFRWrhwYaZKbUBAgBnfpEkTVapUSc2aNVNkZKTN5Dk1NVUvvfSShgwZosOHDysxMdFmn+/thy1VqlRRVFSU1bl27dopISFBUVFReu+99+Tu7m71er169eTr65tlm97e3pnua7FY1Lt3b5UrV06tW7c2z2/dulW7du0yE2ZJat68uU6ePKlx48apR48eypfPvkFG5cqV06VLl2QYhhITE3OdPB87dkySNGjQIDVs2DBX1wIAAMAxGLYNOLmkpCT5+vpaJc4Z7q283svV1VW1a9dWSkqKXcOA69evL0k6f/68zdfDw8N18eJFzZw5M+eO36fixYvLxcXF7sQ1J3v37tWJEyf00ksvWb1fGzZskJeXl7p3724V/9JLL+ns2bPav3+/3ffIGBZ+P0JCQtSnTx9JUqNGjWQYhvr37y9J2rVrl7p06SJ/f395eHioYsWKGjJkSKYPLS5cuKDBgwerbNmycnd3V/HixdWkSRPt3r3bvMeWLVt08uRJq2HsGc6ePavnn39ehQoVUuHChdWjRw/FxMTIMAytXLnyvp4LAAA4r4ytqhx5OAMqz87IYpFu38jrXuBBSbmeq/Dg4GAtW7ZMo0aNUu/evVW3bl25ubnZff3vv/+uIkWKqHjx4nbFSlLlypUzvfbTTz8pLCxM69evl5eXV7bt/PbbbypWrJiuXr2qcuXKqWfPnpo0aZI8PT0zxVosFqWlpenatWvauXOnVq5cqddff93mhwU1atRQQkKCfH191bZtW4WFhSkgICDbvkRGRsrFxUUvvfSS1fmjR4+qatWqme5Ts2ZN8/Unn3wy27YdYfHixfrss88UFhamFStWqEqVKub/q99++03BwcEaOHCgChcurLi4OM2bN09PPfWUjhw5Yn4f9O3bVz/88INmzpypypUr6/Lly/rhhx+UlJRk3mPw4MH67bfftGHDBqv7Jycnq1Wr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\",\n      \"text/plain\": [\n       \"<Figure size 1100x800 with 3 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"f, reordered_labels, reordered_matrix = fig.plot_composite_matrix(matrix, labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"reordered matrix:\\n\",\n      \" [[1.    0.382 0.364 0.    0.    0.    0.   ]\\n\",\n      \" [0.382 1.    0.386 0.    0.    0.    0.   ]\\n\",\n      \" [0.364 0.386 1.    0.    0.    0.    0.   ]\\n\",\n      \" [0.    0.    0.    1.    0.356 0.078 0.086]\\n\",\n      \" [0.    0.    0.    0.356 1.    0.072 0.078]\\n\",\n      \" [0.    0.    0.    0.078 0.072 1.    0.074]\\n\",\n      \" [0.    0.    0.    0.086 0.078 0.074 1.   ]]\\n\",\n      \"reordered labels: ['SRR453566_1.fastq.gz', 'SRR453569_1.fastq.gz', 'SRR453570_1.fastq.gz', 'SRR2060939_1.fastq.gz', 'SRR2060939_2.fastq.gz', 'SRR2241509_1.fastq.gz', 'SRR2255622_1.fastq.gz']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"reordered matrix:\\\\n\\\", reordered_matrix)\\n\",\n    \"print(\\\"reordered labels:\\\", reordered_labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Customizing plots\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want to customize the plots, please see the code for `plot_composite_matrix` in [sourmash/fig.py](https://github.com/sourmash-bio/sourmash/blob/latest/src/sourmash/fig.py), which is reproduced below; you can modify the code in place to (for example) [use custom dendrogram colors](https://stackoverflow.com/questions/38153829/custom-cluster-colors-of-scipy-dendrogram-in-python-link-color-func).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import scipy.cluster.hierarchy as sch\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def plot_composite_matrix(\\n\",\n    \"    D, labeltext, show_labels=True, vmax=1.0, vmin=0.0, force=False\\n\",\n    \"):\\n\",\n    \"    \\\"\\\"\\\"Build a composite plot showing dendrogram + distance matrix/heatmap.\\n\",\n    \"\\n\",\n    \"    Returns a matplotlib figure.\\n\",\n    \"\\n\",\n    \"    If show_labels is True, display labels. Otherwise, no labels are\\n\",\n    \"    shown on the plot.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    if D.max() > 1.0 or D.min() < 0.0:\\n\",\n    \"        error(\\n\",\n    \"            \\\"This matrix doesn't look like a distance matrix - min value {}, max value {}\\\",\\n\",\n    \"            D.min(),\\n\",\n    \"            D.max(),\\n\",\n    \"        )\\n\",\n    \"        if not force:\\n\",\n    \"            raise ValueError(\\\"not a distance matrix\\\")\\n\",\n    \"        else:\\n\",\n    \"            notify(\\\"force is set; scaling to [0, 1]\\\")\\n\",\n    \"            D -= D.min()\\n\",\n    \"            D /= D.max()\\n\",\n    \"\\n\",\n    \"    if show_labels:\\n\",\n    \"        pass\\n\",\n    \"\\n\",\n    \"    fig = pylab.figure(figsize=(11, 8))\\n\",\n    \"    ax1 = fig.add_axes([0.09, 0.1, 0.2, 0.6])\\n\",\n    \"\\n\",\n    \"    # plot dendrogram\\n\",\n    \"    Y = sch.linkage(D, method=\\\"single\\\")  # centroid\\n\",\n    \"\\n\",\n    \"    Z1 = sch.dendrogram(\\n\",\n    \"        Y,\\n\",\n    \"        orientation=\\\"left\\\",\\n\",\n    \"        labels=labeltext,\\n\",\n    \"        no_labels=not show_labels,\\n\",\n    \"        get_leaves=True,\\n\",\n    \"    )\\n\",\n    \"    ax1.set_xticks([])\\n\",\n    \"\\n\",\n    \"    xstart = 0.45\\n\",\n    \"    width = 0.45\\n\",\n    \"    if not show_labels:\\n\",\n    \"        xstart = 0.315\\n\",\n    \"    scale_xstart = xstart + width + 0.01\\n\",\n    \"\\n\",\n    \"    # re-order labels along rows, top to bottom\\n\",\n    \"    idx1 = Z1[\\\"leaves\\\"]\\n\",\n    \"    reordered_labels = [labeltext[i] for i in idx1]\\n\",\n    \"\\n\",\n    \"    # reorder D by the clustering in the dendrogram\\n\",\n    \"    D = D[idx1, :]\\n\",\n    \"    D = D[:, idx1]\\n\",\n    \"\\n\",\n    \"    # show matrix\\n\",\n    \"    axmatrix = fig.add_axes([xstart, 0.1, width, 0.6])\\n\",\n    \"\\n\",\n    \"    im = axmatrix.matshow(\\n\",\n    \"        D, aspect=\\\"auto\\\", origin=\\\"lower\\\", cmap=pylab.cm.YlGnBu, vmin=vmin, vmax=vmax\\n\",\n    \"    )\\n\",\n    \"    axmatrix.set_xticks([])\\n\",\n    \"    axmatrix.set_yticks([])\\n\",\n    \"\\n\",\n    \"    # Plot colorbar.\\n\",\n    \"    axcolor = fig.add_axes([scale_xstart, 0.1, 0.02, 0.6])\\n\",\n    \"    pylab.colorbar(im, cax=axcolor)\\n\",\n    \"\\n\",\n    \"    return fig, reordered_labels, D\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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1apVk3QnuR4yZIj5fsTExGjkyJE6c+aMpkyZYsZ06NBBTZs21fLly1WkSBGdOXNG27dvV0pKivz8/LR9+3Y988wzGjBggAYOHChJ5vfOnj171LNnz7/keQEAAP5qTp08WywWPbfkOx08eSmvuwI4TPqtG7mKDw8P188//6xFixZp0aJFcnNzU4MGDdSpUyeNGDFCXl5eVvGpqXeS88TERL3//vuKjY3VkiVLlC9fvsx9SU9XamqqOed56NCh8vPz02uvvZZtn1JTUzVgwAB5eXnp1VdfzTb2X//6lyIiItS1a1fVrFnTPO/u7q5BgwapdevW8vPz06lTp7Ro0SJ16dJFH374oZm4SVJQUJBmzpypOnXqyMPDQ99//70iIiK0c+dOHTx4UGXKlJEknTlzRpI0duxYNW/eXOvWrdP169c1ffp0tWjRQvv377fqw72GDx+u69eva+LEidk+05kzZzRhwgTVr19fHTt2zDbWUdzd3dW4cWN5e3srJSUl01D3FStWmH9OT09XSEiILBaL3nnnHU2ePFmGYejgwYO6efOm5syZo1q1apnxd885r1evniTJ398/0z0mTpyoEiVK6Ny5cw/iEQEAwEPicR227dTJc/LtNBJnPPZ8fHy0b98+xcbGas+ePYqNjdWXX36p0NBQffDBBzpw4IA5D/jYsWOZqtKhoaEaMmSIzbbHjx+v8ePHm18XKlRIe/fuVWBgYJb9sVgsGjBggPbt26d169apbNmyWcbGxcWpY8eOKlu2rDkvOoOfn1+mRcy6d++uRo0aacKECerfv785VL1v375Wcc2bN1fz5s0VHBysiIgIvfPOO5LuJI3SncRv3bp15gcGwcHBqlixoiIiIvTJJ5/Y7OvkyZP16aefatGiRWYCacvFixfVvn17WSwWrVmz5r6HYTtadHS03nrrLR04cEBXr161ei0hIUElS5ZU7dq1lT9/fg0ePFjDhg1T06ZNVaFCBbvav379ug4cOKCBAwfaXHwOAADA2Tl18ny32EmtVCB/5soZ4GyuXr0qvwW5v65+/frmnOTbt29r/Pjxmj9/viIiIsyFw4KCgrR69WpZLBadPHlSYWFhmjVrlmrWrGlzuO3o0aPVp08f3bp1SzExMZo0aZK6dOmiw4cP25zna7FYNHDgQH3yySeKiopSly5dsuzvyZMn1bx5c7m6umrPnj12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29v1u2fGv/Nl3vqHXDwKOqwP6Tev68wbHR/6338fvawTAAAAAPDgPKb7PJM8A8BfIC0tTdkN9DEMw2pBLwAAADxcWG0bAP4CQUFBcnNzy/Jo2bJlXncRAADAPsYDOJwAlWcA+Ats3rxZt27dyvL1QoUK/YW9AQAAuH8uhuTiyDIsyTMAIMO9q3kDAADAuZA8AwAAAADs9pjuVMWcZwAAAAAAckLlGQAAAABgNyrPAAAAAADAJpJnAAAAAIDdDMNw+HE/Fi9erPLly8vDw0P16tXTvn37so2/deuWJk6cqHLlysnd3V1BQUFavny53fdj2DYAAAAAwKmsWbNGY8aM0eLFi9WkSRN98MEHateunX766ScFBATYvOb555/X+fPnFRkZqYoVKyohIUGpqal235PkGQAAAABgt4dhzvO8efM0YMAADRw4UJK0YMEC7dixQ++//75mzZqVKX779u366quvdOLECRUrVkySFBgYmKt7MmwbAAAAAJDnrl69anXcunXLZlxKSooOHjyoNm3aWJ1v06aNvv32W5vXbNq0SfXr11dERITKlCmjypUra+zYsUpOTra7f1SeAQAAAAB2e1CV57Jly1qdnzp1qqZNm5YpPjExUWlpaSpZsqTV+ZIlS+rcuXM273HixAl9/fXX8vDw0IYNG5SYmKhhw4bp4sWLds97JnkGAAAAAOS506dPy9vb2/za3d092/h7FxqzWCxZLj6Wnp4uwzD06aefqnDhwpLuDP1+7rnn9N5778nT0zPH/pE8AwAAAADs5yIZjpwA/J+2vL29rZLnrPj6+ipfvnyZqswJCQmZqtEZ/Pz8VKZMGTNxlqSqVavKYrHo3//+typVqmRvNwEAAAAAePjlz59f9erV065du6zO79q1S08++aTNa5o0aaKzZ8/qjz/+MM/98ssvcnFxkb+/v133JXkGAAAAANgtY86zI4/ceu2117Rs2TItX75cx48f16uvvqpTp07plVdekSSFhobqxRdfNON79eolHx8fvfTSS/rpp5/0z3/+U+PGjdPLL79s15BtiWHbAAAAAIBccDHuHI5iuY+2evTooaSkJL355puKj49X9erVtXXrVpUrV06SFB8fr1OnTpnxXl5e2rVrl0aOHKn69evLx8dHzz//vMLCwuy+J8kzAAAAAMDpDBs2TMOGDbP52sqVKzOdq1KlSqah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7du3q3DhwubXLi7Wnw/WrVtX3333Xabr3n//fX300Ufq2rWr1flu3brpwIEDCg8PV+XKlbVq1Sq98MILSk9PV69evbJ8vnslJSVp6dKlqlWrlp599lmbfc/OoUOHNGrUKA0cOFD9+vWTq6urChUqlKs2crJq1SodPXpUY8aMcWi7AADg0fO4blVF8gw4uYiICJUvX147duyQq+ufP9I9e/ZURESEVaynp6caN25sft2uXTtVq1ZNUVFRWrhwYaZKbUBAgBnfpEkTVapUSc2aNVNkZKTN5Dk1NVUvvfSShgwZosOHDysxMdFmn+/thy1VqlRRVFSU1bl27dopISFBUVFReu+99+Tu7m71er169eTr65tlm97e3pnua7FY1Lt3b5UrV06tW7c2z2/dulW7du0yE2ZJat68uU6ePKlx48apR48eypfPvkFG5cqV06VLl2QYhhITE3OdPB87dkySNGjQIDVs2DBX1wIAAMAxGLYNOLmkpCT5+vpaJc4Z7q283svV1VW1a9dWSkqKXcOA69evL0k6f/68zdfDw8N18eJFzZw5M+eO36fixYvLxcXF7sQ1J3v37tWJEyf00ksvWb1fGzZskJeXl7p3724V/9JLL+ns2bPav3+/3ffIGBZ+P0JCQtSnTx9JUqNGjWQYhvr37y9J2rVrl7p06SJ/f395eHioYsWKGjJkSKYPLS5cuKDBgwerbNmycnd3V/HixdWkSRPt3r3bvMeWLVt08uRJq2HsGc6ePavnn39ehQoVUuHChdWjRw/FxMTIMAytXLnyvp4LAAA4r4ytqhx5OAMqz87IYpFu38jrXuBBSbmeq/Dg4GAtW7ZMo0aNUu/evVW3bl25ubnZff3vv/+uIkWKqHjx4nbFSlLlypUzvfbTTz8pLCxM69evl5eXV7bt/PbbbypWrJiuXr2qcuXKqWfPnpo0aZI8PT0zxVosFqWlpenatWvauXOnVq5cqddff93mhwU1atRQQkKCfH191bZtW4WFhSkgICDbvkRGRsrFxUUvvfSS1fmjR4+qatWqme5Ts2ZN8/Unn3wy27YdYfHixfrss88UFhamFStWqEqVKub/q99++03BwcEaOHCgChcurLi4OM2bN09PPfWUjhw5Yn4f9O3bVz/88INmzpypypUr6/Lly/rhhx+UlJRk3mPw4MH67bfftGHDBqv7Jycnq1Wr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\",\n      \"text/plain\": [\n       \"<Figure size 1100x800 with 3 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"_ = plot_composite_matrix(matrix, labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"smash-notebooks\",\n   \"language\": \"python\",\n   \"name\": \"smash-notebooks\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.11.3\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "doc/podar-lineage.csv",
    "content": "accession,taxid,superkingdom,phylum,class,order,family,genus,species,strain\r\nAE000782,224325,Archaea,Euryarchaeota,Archaeoglobi,Archaeoglobales,Archaeoglobaceae,Archaeoglobus,Archaeoglobus fulgidus,Archaeoglobus fulgidus DSM 4304\r\nNC_000909,243232,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanocaldococcaceae,Methanocaldococcus,Methanocaldococcus jannaschii,Methanocaldococcus jannaschii DSM 2661\r\nNC_003272,103690,Bacteria,Cyanobacteria,,Nostocales,Nostocaceae,Nostoc,Nostoc sp. PCC 7120,\r\nAE009441,178306,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum aerophilum,Pyrobaculum aerophilum str. IM2\r\nAE009950,186497,Archaea,Euryarchaeota,Thermococci,Thermococcales,Thermococcaceae,Pyrococcus,Pyrococcus furiosus,Pyrococcus furiosus DSM 3638\r\nAE009951,190304,Bacteria,Fusobacteria,Fusobacteriia,Fusobacteriales,Fusobacteriaceae,Fusobacterium,Fusobacterium nucleatum,\r\nAE010299,188937,Archaea,Euryarchaeota,Methanomicrobia,Methanosarcinales,Methanosarcinaceae,Methanosarcina,Methanosarcina acetivorans,Methanosarcina acetivorans C2A\r\nAE009439,190192,Archaea,Euryarchaeota,Methanopyri,Methanopyrales,Methanopyraceae,Methanopyrus,Methanopyrus kandleri,Methanopyrus kandleri AV19\r\nNC_003911,246200,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Ruegeria,Ruegeria pomeroyi,Ruegeria pomeroyi DSS-3\r\nAE006470,194439,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobaculum,Chlorobaculum tepidum,Chlorobaculum tepidum TLS\r\nAE015928,226186,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Bacteroidaceae,Bacteroides,Bacteroides thetaiotaomicron,Bacteroides thetaiotaomicron VPI-5482\r\nAL954747,228410,Bacteria,Proteobacteria,Betaproteobacteria,Nitrosomonadales,Nitrosomonadaceae,Nitrosomonas,Nitrosomonas europaea,Nitrosomonas europaea ATCC 19718\r\nBX119912,243090,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,Rhodopirellula baltica,Rhodopirellula baltica SH 1\r\nBX571656,273121,Bacteria,Proteobacteria,Epsilonproteobacteria,Campylobacterales,Helicobacteraceae,Wolinella,Wolinella succinogenes,Wolinella succinogenes DSM 1740\r\nAE017180,243231,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfuromonadales,Geobacteraceae,Geobacter,Geobacter sulfurreducens,Geobacter sulfurreducens PCA\r\nAE017226,243275,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,Treponema,Treponema denticola,Treponema denticola ATCC 35405\r\nBX950229,267377,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanococcaceae,Methanococcus,Methanococcus maripaludis,Methanococcus maripaludis S2\r\nAE017221,262724,Bacteria,Deinococcus-Thermus,Deinococci,Thermales,Thermaceae,Thermus,Thermus thermophilus,Thermus thermophilus HB27\r\nBA000001,70601,Archaea,Euryarchaeota,Thermococci,Thermococcales,Thermococcaceae,Pyrococcus,Pyrococcus horikoshii,Pyrococcus horikoshii OT3\r\nBA000023,273063,Archaea,Crenarchaeota,Thermoprotei,Sulfolobales,Sulfolobaceae,Sulfolobus,Sulfolobus tokodaii,Sulfolobus tokodaii str. 7\r\nNC_007951,266265,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Burkholderiaceae,Paraburkholderia,Paraburkholderia xenovorans,Paraburkholderia xenovorans LB400\r\nCP000492,290317,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium phaeobacteroides,Chlorobium phaeobacteroides DSM 266\r\nNC_008751,391774,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,Desulfovibrio vulgaris,Desulfovibrio vulgaris DP4\r\nCP000568,203119,Bacteria,Firmicutes,Clostridia,Clostridiales,Ruminococcaceae,Ruminiclostridium,Ruminiclostridium thermocellum,Ruminiclostridium thermocellum ATCC 27405\r\nCP000561,410359,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum calidifontis,Pyrobaculum calidifontis JCM 11548\r\nCP000609,402880,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanococcaceae,Methanococcus,Methanococcus maripaludis,Methanococcus maripaludis C5\r\nCP000607,290318,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium phaeovibrioides,Chlorobium phaeovibrioides DSM 265\r\nCP000660,340102,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum arsenaticum,Pyrobaculum arsenaticum DSM 13514\r\nCP000667,369723,Bacteria,Actinobacteria,Actinobacteria,Micromonosporales,Micromonosporaceae,Salinispora,Salinispora tropica,Salinispora tropica CNB-440\r\nCP000679,351627,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacterales Family III. Incertae Sedis,Caldicellulosiruptor,Caldicellulosiruptor saccharolyticus,Caldicellulosiruptor saccharolyticus DSM 8903\r\nCP000702,390874,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga petrophila,Thermotoga petrophila RKU-1\r\nCP000139,435590,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Bacteroidaceae,Bacteroides,Bacteroides vulgatus,Bacteroides vulgatus ATCC 8482\r\nNC_009665,402882,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS185\r\nCP000816,453591,Archaea,Crenarchaeota,Thermoprotei,Desulfurococcales,Desulfurococcaceae,Ignicoccus,Ignicoccus hospitalis,Ignicoccus hospitalis KIN4/I\r\nCP000850,391037,Bacteria,Actinobacteria,Actinobacteria,Micromonosporales,Micromonosporaceae,Salinispora,Salinispora arenicola,Salinispora arenicola CNS-205\r\nCP000909,324602,Bacteria,Chloroflexi,Chloroflexia,Chloroflexales,Chloroflexaceae,Chloroflexus,Chloroflexus aurantiacus,Chloroflexus aurantiacus J-10-fl\r\nCP000924,340099,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacteraceae,Thermoanaerobacter,Thermoanaerobacter pseudethanolicus,Thermoanaerobacter pseudethanolicus ATCC 33223\r\nCP000969,126740,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga sp. RQ2,\r\nCP001013,395495,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,Leptothrix,Leptothrix cholodnii,Leptothrix cholodnii SP-6\r\nCP001071,349741,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Akkermansiaceae,Akkermansia,Akkermansia muciniphila,Akkermansia muciniphila ATCC BAA-835\r\nAP009380,431947,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Porphyromonadaceae,Porphyromonas,Porphyromonas gingivalis,Porphyromonas gingivalis ATCC 33277\r\nNC_010730,436114,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Sulfurihydrogenibium,Sulfurihydrogenibium sp. YO3AOP1,\r\nCP001097,290315,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium limicola,Chlorobium limicola DSM 245\r\nCP001110,324925,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Pelodictyon,Pelodictyon phaeoclathratiforme,Pelodictyon phaeoclathratiforme BU-1\r\nCP001130,380749,Bacteria,Aquificae,Aquificae,Aquificales,Aquificaceae,Hydrogenobaculum,Hydrogenobaculum sp. Y04AAS1,\r\nNZ_CH959311,52598,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Sulfitobacter,Sulfitobacter sp. EE-36,\r\nNZ_CH959317,314267,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Sulfitobacter,Sulfitobacter sp. NAS-14.1,\r\nCP001251,515635,Bacteria,Dictyoglomi,Dictyoglomia,Dictyoglomales,Dictyoglomaceae,Dictyoglomus,Dictyoglomus turgidum,Dictyoglomus turgidum DSM 6724\r\nNC_011663,407976,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS223\r\nCP000916,309803,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga neapolitana,Thermotoga neapolitana DSM 4359\r\nNZ_DS996397,411464,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,Desulfovibrio piger,Desulfovibrio piger ATCC 29098\r\nCP001230,123214,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Persephonella,Persephonella marina,Persephonella marina EX-H1\r\nCP001472,240015,Bacteria,Acidobacteria,Acidobacteriia,Acidobacteriales,Acidobacteriaceae,Acidobacterium,Acidobacterium capsulatum,Acidobacterium capsulatum ATCC 51196\r\nAP009153,379066,Bacteria,Gemmatimonadetes,Gemmatimonadetes,Gemmatimonadales,Gemmatimonadaceae,Gemmatimonas,Gemmatimonas aurantiaca,Gemmatimonas aurantiaca T-27\r\nCP001941,439481,Archaea,Euryarchaeota,,,,Aciduliprofundum,Aciduliprofundum boonei,Aciduliprofundum boonei T469\r\nNC_013968,309800,Archaea,Euryarchaeota,Halobacteria,Haloferacales,Haloferacaceae,Haloferax,Haloferax volcanii,Haloferax volcanii DS2\r\nNZ_KE136524,226185,Bacteria,Firmicutes,Bacilli,Lactobacillales,Enterococcaceae,Enterococcus,Enterococcus faecalis,Enterococcus faecalis V583\r\nNZ_KQ961402,542,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Zymomonas,Zymomonas mobilis,\r\nNZ_CP015081,243230,Bacteria,Deinococcus-Thermus,Deinococci,Deinococcales,Deinococcaceae,Deinococcus,Deinococcus radiodurans,Deinococcus radiodurans R1\r\nNZ_ABZS01000228,432331,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Sulfurihydrogenibium,Sulfurihydrogenibium yellowstonense,Sulfurihydrogenibium yellowstonense SS-5\r\nNZ_JGWU01000001,1458259,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Bordetella,Bordetella bronchiseptica,Bordetella bronchiseptica D989\r\nNZ_FWDH01000003,31899,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacterales Family III. Incertae Sedis,Caldicellulosiruptor,Caldicellulosiruptor bescii,\r\nNC_009972,316274,Bacteria,Chloroflexi,Chloroflexia,Herpetosiphonales,Herpetosiphonaceae,Herpetosiphon,Herpetosiphon aurantiacus,Herpetosiphon aurantiacus DSM 785\r\nNC_005213,228908,Archaea,Nanoarchaeota,,Nanoarchaeales,Nanoarchaeaceae,Nanoarchaeum,Nanoarchaeum equitans,Nanoarchaeum equitans Kin4-M\r\n"
  },
  {
    "path": "doc/publications.md",
    "content": "# Publications\n\nBelow are publications from the sourmash team.\n\n## sourmash fundamentals\n\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2), Irber et al., 2022. This is the core technical paper describing both FracMinHash and `sourmash gather`.\n\n[Large-scale sequence comparisons with sourmash](https://f1000research.com/articles/8-1006),\nPierce et al., 2019. This is the original sourmash use case paper.\n\n## Evaluation and benchmarking\n\n[Evaluation of taxonomic classification and profiling methods for long-read shotgun metagenomic sequencing datasets](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-022-05103-0),\nPortik et al., 2022. This paper shows that sourmash is extremely\nsensitive and very specific for taxonomic profiling.\n\n## Petabase-scale search\n\n[Biogeographic Distribution of Five Antarctic Cyanobacteria Using Large-Scale k-mer Searching with sourmash branchwater](https://www.biorxiv.org/content/10.1101/2022.10.27.514113v1),\nLumian et al., 2022. This paper uses sourmash and branchwater to\nsearch ~500,000 public metagenomes for 5 query genomes, validates the\nresults using mapping, and discusses the biogeography of the query\nspecies.\n\n[Sourmash Branchwater Enables Lightweight Petabyte-Scale Sequence Search](https://www.biorxiv.org/content/10.1101/2022.11.02.514947v1),\nIrber et al., 2022. This paper describes the technical underpinnings\nof the first version of sourmash branchwater, for petabase-scale search.\n\n## Advanced uses of sourmash\n\n[Single-cell transcriptomics for the 99.9% of species without reference genomes](https://www.biorxiv.org/content/10.1101/2021.07.09.450799v1.abstract),\nBotvinnik et al., 2021. This paper uses sourmash (and many other\ntechniques!) to analyze single cell data from the Chinese horseshoe\nbat.\n\n[Meta-analysis of metagenomes via machine learning and assembly graphs reveals strain switches in Crohn’s disease](https://www.biorxiv.org/content/10.1101/2022.06.30.498290v1.abstract),\nReiter et al., 2022. This paper uses sourmash and\n[spacegraphcats](https://spacegraphcats.github.io/spacegraphcats/) to\ndetect and analyze strain-specific signals in fecal microbiomes from\nthe iHMP.\n\n[Protein k-mers enable assembly-free microbial metapangenomics](https://www.biorxiv.org/content/10.1101/2022.06.27.497795v1),\nReiter et al., 2022. This paper develops a technique to use protein\nk-mers to analyze metapangenome graphs from metagenomes.\n\n## Additional works\n\nDr. Luiz Irber's PhD thesis,\n[Decentralizing Indices for Genomic Data](https://github.com/luizirber/phd/releases),\ndescribes several additional features of the sourmash ecosystem,\nincluding wort, which monitors the SRA for new data sets and sketches\nthem automatically.\n"
  },
  {
    "path": "doc/release-notes/releases.md",
    "content": "# sourmash release notes\n\nPlease see the\n[github releases page](https://github.com/sourmash-bio/sourmash/releases)\nfor detailed release notes for each version!\n\n```{toctree}\n:maxdepth: 2\n\nsourmash-5.0\nsourmash-4.0\nsourmash-3.0\nsourmash-2.0\n```\n"
  },
  {
    "path": "doc/release-notes/sourmash-2.0.md",
    "content": "# sourmash v2.0 release notes\n\nWe are pleased to announce release 2.0 of sourmash!  This release is\nthe first full release of sourmash since 1.0, and provides much\nexpanded core functionality as well as many more utility functions.\n\nThe full documentation for this version is available at\nhttps://sourmash.readthedocs.io/en/v2.0/. Documentation for the latest\nreleased version is at http://sourmash.readthedocs.io/en/stable/.\n\n**This release breaks compatibility with sourmash 1.0: the sourmash\nPython API, command-line, and signature file formats have all changed\nsubstantially.** Please post questions about migrating to sourmash 2.0\nin the\n[sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues/new).\n\n## Major new features since 1.0\n\nThis is a list of substantial new features and functionality in sourmash 2.0.\n\n* Added Sequence Bloom Tree search to enable similarity and containment queries on very large collections of signatures in low memory; see `sourmash index`, `sourmash search`, and `sourmash gather` in [the command line documentation](../command-line.md).\n* Added \"LCA databases\" for fast searching of large databases in not-so-low memory; see [`sourmash lca index` in command-line docs](../command-line.md#sourmash-lca-subcommands-for-in-memory-taxonomy-integration).\n* Created [precomputed databases](../databases.md) for most of GenBank genomes.\n* Added taxonomic reporting functionality in the `sourmash lca` submodule - [see command-line docs](../command-line.md#sourmash-lca-subcommands-for-in-memory-taxonomy-integration).\n* Added signature manipulation utilities in the `sourmash signature` submodule - [see command-line docs](../command-line.md#sourmash-signature-subcommands-for-signature-manipulation)\n* Introduced new modulo hash or \"scaled\" signatures for containment analysis; see [Using sourmash: a practical guide](../using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-and-how-should-i-create-them) and [more details in the Python API examples](../api-example.md#advanced-features-of-sourmash-minhash-objects---scaled-and-num).\n* Switched to using JSON instead of YAML for signatures.\n* Many performance optimizations!\n* Many more tests!\n* A much cleaner and more robust [Python API](../api-example.md).\n* Installation via bioconda is now recommended (and actively maintained :)\n* Support for building signatures from BAM files.\n\n## Other features of note\n\n* Renamed Python library to `sourmash` from `sourmash_lib`.\n* Signatures now default to a license of CC0.\n* Implemented `sourmash watch` for classifying streams of data (see [blog post](http://ivory.idyll.org/blog/2017-sourmash-sra-microbial-wgs.html)).\n* Implemented `sourmash categorize` for classifying many signatures (see [blog post](http://ivory.idyll.org/blog/2017-sourmash-sra-microbial-wgs.html)).\n* CSV output enabled from most commands.\n"
  },
  {
    "path": "doc/release-notes/sourmash-3.0.md",
    "content": "# sourmash v3.0 release notes\n\nWe are pleased to announce release 3.0 of sourmash!  This release includes internal changes like the new Rust backend (replacing C++) and lays the groundwork for future improvements.\n\nThe full documentation for this version is available at\nhttps://sourmash.readthedocs.io/en/v3.0.0/. Documentation for the latest\nreleased version is at http://sourmash.readthedocs.io/en/stable/.\n\n**This release is compatible with sourmash 2.0: the sourmash\nPython API, command-line, signature and databases file formats are all the same.** We are releasing 3.0 to indicate the build system and internal implementation changed.\n\nPlease post questions about migrating to sourmash 3.0\nin the [sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues/new).\n\n## Highlighted changes since 2.0\n\nThis is a list of substantial new features and functionality since sourmash 2.0. For more details check the [releases page on GitHub](https://github.com/sourmash-bio/sourmash/releases).\n\nFeatures:\n\n- Replacing C++ with Rust ([#424](https://github.com/sourmash-bio/sourmash/pull/424))\n- Create an `Index` abstract base class ([#556](https://github.com/sourmash-bio/sourmash/pull/556))\n- Dayhoff and HP encoding for proteins ([#689](https://github.com/sourmash-bio/sourmash/pull/689)) ([#758](https://github.com/sourmash-bio/sourmash/pull/758))\n- Add `sourmash signature filter` to do abundance filtering. ([#748](https://github.com/sourmash-bio/sourmash/pull/748))\n- Parallelized compare function with multiprocessing ([#709](https://github.com/sourmash-bio/sourmash/pull/709))\n- add compute signatures for 10x bam file ([#713](https://github.com/sourmash-bio/sourmash/pull/713))\n\nImprovements:\n\n- improve error handling in `sourmash lca index`. ([#798](https://github.com/sourmash-bio/sourmash/pull/798))\n- Include more base deps: numpy, scipy and matplotlib ([#770](https://github.com/sourmash-bio/sourmash/pull/770))\n- use `bam2fasta` package to simplify `sourmash compute` ([#768](https://github.com/sourmash-bio/sourmash/pull/768))\n- add a `--abundances-from` flag to sourmash signature intersect, to preserve abundances ([#747](https://github.com/sourmash-bio/sourmash/pull/747))\n- Compare outputs can be saved to an output dir ([#715](https://github.com/sourmash-bio/sourmash/pull/715))\n"
  },
  {
    "path": "doc/release-notes/sourmash-4.0.md",
    "content": "# sourmash v4.0 release notes\n\n```{contents}\n   :depth: 2\n```\n\nWe are pleased to announce release 4.0 of sourmash! This release\ncontains many feature improvements and new functionality, as well as\nmany breaking changes with sourmash 2.x and 3.x.\n\nPlease see\n[our migration guide](../support.md#migrating-from-sourmash-v3x-to-sourmash-v4x)\nfor guidance on updating to sourmash v4, and post questions about\nmigrating to sourmash 4.0 in the\n[sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues/new).\n\n## Major changes for 4.0\n\n### Numerical output and search results are unchanged\n\nThere are no changes to numerical output or search results in this\nrelease; you should get the same results with v4 as you get with v3,\nexcept where command-line parameters need to be adjusted as noted\nbelow (see: protein ksize #1277, lca summarize changes #1175, sourmash\ngather on signatures without abundance #1328). Please\n[file an issue](https://github.com/sourmash-bio/sourmash/issues) if your\nresults change!\n\n### New or changed behavior\n\n* default SBT storage is now .sbt.zip (#1174, #1170)\n* add `sourmash sketch` command for creating signatures (#1159)\n* protein ksizes in MinHash are now divided by 3, except in `sourmash compute` (#1277)\n* refactor MinHash API and implementation: add, iadd, merge, hashes, and max_hash (#1282, #1154, #1139, #1301)\n* add HyperLogLog implementation (#1223)\n* `SourmashSignature.name` is now a property (not a method): use `str(sig)` instead of `name()` (#1179, #1232)\n*  `lca summarize` no longer merges all signatures, and uses hash abundance by default (#1175)\n* `index `and `lca index` (#1186, #1222) now support `--from-file` and no longer require signature files on command line\n* `--traverse-directory` is now on by default for signature loading behavior (#1178)\n* `sourmash sketch` and `sourmash compute` no longer create empty signatures from empty files and stdin (#1347)\n* `sourmash sketch` and `sourmash compute` set `sig.filename` to empty string when filename is `-` (#1347)\n\n### Feature removal\n\n* remove Python 2.7 support (& end Python 2 compatibility) (#1145, #1144)\n* remove `lca gather` (#1307)\n* remove 10x support from `sourmash compute` (#1229)\n* remove `dump` command (#1157)\n\n### Feature/function deprecations \n\n* deprecate `sourmash compute` (#1159)\n* deprecate `load_signatures`, `sourmash.load_one_signature`, `create_sbt_index`, and `load_sbt_index` (#1279, #1304)\n* deprecate `import_csv` in favor of new `sourmash sig import --csv` (#1281)\n\n## Refactoring, improvements, and minor bug fixes:\n\n* accept file list in `sourmash sig cat` (#1236)\n* add unique_intersect_bp and gather_result_rank to gather CSV output (#1219)\n* remove deprecated minhash functions (#1149)\n* fix Rust panic error in signature creation (#1172)\n* cache nodes in SBT during search (#1161)\n* fix two bugs in gather `--output-unassigned` (#1156)\n\n## Documentation updates\n\n* major update and cleanup of docs given new functionality; add sourmash sketch documentation (#1283)\n* add information about versioning, migrations, etc to the docs (#1153, #1283)\n\n## Infrastructure and CI changes:\n\n* update finch requirement from 0.3.0 to 0.4.1 (#1290)\n* update rand for test, and activate \"js\" feature for getrandom (#1275)\n* dev updates (configs and doc) (#1298)\n* move wheel building from Travis to GitHub Actions (#1295)\n* fix new clippy warnings from Rust 1.49 (#1267)\n* use tox for running tests locally (#696)\n* CI: small build fixes (#1252)\n* CI: Fix releases in GitHub Actions (#1250)\n* update build_wheel action paths\n* CI: moving python tests from travis to GH actions (#1249)\n* CI: move wheel building to GitHub actions (#1244)\n* remove last .rst file from docs (#1185)\n* update CI for latest branch name change (#1150)\n"
  },
  {
    "path": "doc/release-notes/sourmash-5.0.md",
    "content": "# sourmash v5.0 _draft_ release notes\n\n```{contents}\n   :depth: 2\n```\n\nDraft text: We are pleased to announce release 5.0 of sourmash! This\nrelease contains many feature improvements and new functionality, as\nwell as many breaking changes with sourmash 4.0\n\nPlease see\n[our migration guide](../support.md#migrating-from-sourmash-v4x-to-sourmash-v5x)\nfor guidance on updating to sourmash v5, and post questions about\nmigrating to sourmash 5.0 in the\n[sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues/new)!\n\n## Breaking changes for 5.0\n\n### Numerical output and search results are mostly unchanged\n\n* several `tax metagenome` output formats will produce different results: in particular, the `lineage_summary` and `krona` formats now use abundances, and `tax metagenome` requires abundance-weighted gather results. You can use `--ignore-abund` to recover the v4 behavior. See [#3711](https://github.com/sourmash-bio/sourmash/pull/3711) for details.\n\n### New or changed behavior\n\n* the default output format for `tax metagenome` is now `human`, instead of `csv_summary`. You can use `-F human` to recover the v4 behavior. ([#3711](https://github.com/sourmash-bio/sourmash/pull/3711))\n* `sig manifest` now defaults to `--no-rebuild-manifest` - see [#3074](https://github.com/sourmash-bio/sourmash/pull/3074).\n* `sig check` and `sig collect` now default to `--relpath` - see [#3071](https://github.com/sourmash-bio/sourmash/issues/3071).\n\n### Feature removal\n\n### Feature/function deprecations \n\n## Refactoring, improvements, and minor bug fixes\n\n## Documentation updates\n\n## Infrastructure and CI changes\n"
  },
  {
    "path": "doc/release.md",
    "content": "# Releasing a new version of sourmash\n\nThese are adapted from the khmer release docs, originally written by\nMichael Crusoe.\n\n## A release process overview\n\nSuggested overall process:\n\n1. Create an issue entitled \"release checklist: sourmash vX.Y.Z\".\n2. Copy-paste the below checklist into it.\n3. Follow the overall process.\n4. Place draft release notes in the release PR, so that they are linked to the relevant issues.\n5. link the release PR to the release issue, too.\n\n## Checklist\n\nHere's a checklist to copy/paste into the issue:\n\n```\n\nRelease candidate testing:\n- [ ] Command line tests pass for a release candidate\n- [ ] All five release candidate wheels are built\n\nReleasing to PyPI:\n\n- [ ] RC tag(s)s deleted on github\n- [ ] Release tag cut\n- [ ] Release notes written\n- [ ] All five release wheels built\n- [ ] Release wheels uploaded to pypi\n- [ ] tar.gz distribution built in **clean** checkout & uploaded to pypi\n\nAfter release to PyPI and conda-forge/bioconda packages built:\n\n- [ ] [PyPI page](https://pypi.org/project/sourmash/) updated\n- [ ] Zenodo DOI successfully minted upon new github release - [see search results](https://zenodo.org/search?page=1&size=20&q=sourmash&sort=mostrecent)\n- [ ] `pip install sourmash` installs the correct version\n- [ ] [conda-forge sourmash-minimal-feedstock](https://github.com/conda-forge/sourmash-minimal-feedstock) has updated `sourmash-minimal` to the correct version \n- [ ] `mamba create -n smash-release1 -y sourmash-minimal` installs the correct version\n- [ ] `mamba create -n smash-release2 -y sourmash` installs the correct version\n\nOptional but recommended:\n\n- [ ] PR submitted to update pyodide version\n- [ ] PR submitted to update spack version\n```\n\n## Creating the build environment with conda\n\nYou can most easily set up your build environment with conda.\n\nYour conda version will need to be at least `v4.9.0`. You can check your\nconda version with `conda --version` and update with `conda update conda`.\n\nCreate the basic build environment:\n\n```\nconda create -y -n sourmash-rc python=3.12 pip \\\n    cxx-compiler make twine tox tox-conda rust\n```\n\nThen activate it with `conda activate sourmash-rc`.\n\n## Writing release notes\n\nDraft release notes can be created with this command:\n```\ngit log --oneline v4.9.3..latest | cut -d\\  -f2- | sort > release-notes.txt\n```\nbut should then be edited manually. We suggest\nputting PRs in the following categories:\n\n```\nMajor new features:\n\nMinor new features:\n\nBug fixes:\n\nCleanup and documentation updates:\n\nDeveloper updates:\n\nDependabot updates:\n```\n\nA convenient way to edit release notes is to put them in a [hackmd.io](https://hackmd.io) document and edit/display them there; then, paste them into the release PR.\n\n## Testing a release\n\n0\\. First things first: check if Read the Docs is building properly for `latest`.\nThe build for the `latest` branch on [Read the Docs] should be passing,\nand also the [rendered docs] should be up to date.\n\n[Read the Docs]: https://readthedocs.org/projects/sourmash/builds/\n[rendered docs]: https://sourmash.readthedocs.io/en/latest/\n\n1\\. The below should be done in a clean checkout.\n\nWith token:\n```\ncd $(mktemp -d)\ngit clone https://github.com/sourmash-bio/sourmash\ncd sourmash\n```\nor with SSH key:\n```\ncd $(mktemp -d)\ngit clone git@github.com:sourmash-bio/sourmash\ncd sourmash\n```\n\n2\\. Set your new version number and release candidate.\nYou might want to check [the releases page] for next version number,\nor you can run `make last-tag` and check the output.\n```\nrc=rc1\nnew_version=4.X.X\n```\n\nNext create a new branch to work on release candidates and the version bump:\n```\ngit switch -c release/v${new_version}\n```\nand update the version number in `pyproject.toml` and `flake.nix`:\n```\nsed -i -e \"s|version = .*$|version = \\\"${new_version}\\\"|g\" pyproject.toml\nsed -i -e \"s|version = .*$|version = \\\"${new_version}\\\";|g\" flake.nix\n```\n\nCommit the changes and push the branch:\n```\ngit add pyproject.toml flake.nix\ngit commit -m \"${new_version} release branch\"\ngit push -u origin release/v${new_version}\n```\nand then open a PR for the new branch by following the link printed by\n```\necho \"https://github.com/sourmash-bio/sourmash/pull/new/release/v${new_version}\"\n```\n\n[the releases page]: https://github.com/sourmash-bio/sourmash/releases\n\nOnce the checks for the PR work, trigger the automatic wheel building\nby creating a tag:\n\n```\ngit tag -a v${new_version}${rc} -m \"${new_version} release candidate ${rc}\"\ngit push origin refs/tags/v${new_version}${rc}\n```\n\n3\\. Test the release candidate. Bonus: repeat on macOS:\n\nSet up:\n```shell\npython -m pip install -U pip\n\ncd ..\npython -m venv testenv1\npython -m venv testenv2\npython -m venv testenv3\n```\n\nFirst we test the tag:\n```shell\ncd testenv1\nsource bin/activate\ngit clone --depth 1 --branch release/v${new_version} https://github.com/sourmash-bio/sourmash.git\ncd sourmash\npython -m pip install -r requirements.txt\npytest && cargo test\n```\n\nSecondly we test via pip:\n\n```shell\ncd ../../testenv2\ndeactivate\nsource bin/activate\npython -m pip install build\npython -m pip install -e git+https://github.com/sourmash-bio/sourmash.git@release/v${new_version}#egg=sourmash[test]\ncd src/sourmash\npytest && cargo test\nmake dist\ncp dist/sourmash*tar.gz ../../../testenv3/\n```\n\nIs the distribution in testenv2 complete enough to build another\nfunctional distribution?\n\n```shell\ncd ../../../testenv3/\ndeactivate\nsource bin/activate\npython -m pip install sourmash*tar.gz\ntar xzf sourmash-${new_version}.tar.gz\ncd sourmash-${new_version}\npython -m pip install -r requirements.txt\npytest && cargo test\n```\n\n4\\. Do any final testing:\n\n * check that the binder demo notebook is up to date\n\n5\\. Wait for GitHub Actions to finish running on the release candidate tag.\n\nWait for the\n[various cibuildwheel actions](https://github.com/sourmash-bio/sourmash/actions)\nto finish and upload; the\n[latest release](https://github.com/sourmash-bio/sourmash/releases)\nshould have nine wheel files attached to it.\n\n6\\. Remove release candidate tags\n\nNOTE: If you delete the rc tag before the rc wheels are done building, they\nmay get added to the wrong release. So you should wait for the rc actions to finish!\n\n```\ncd ../../sourmash\ngit tag -d v${new_version}${rc}\ngit push --delete origin v${new_version}${rc}\n```\n\n## How to make a final release\n\nWhen you've got a thoroughly tested release candidate,\ncut a release like so:\n\n1\\. Merge the pull request bumping the version. Once the PR is merged,\nchange back to the `latest` branch and pull the new commit:\n\n```\ngit checkout latest\ngit pull --rebase\n```\n\n2\\. Create the final tag and push to GitHub:\n\n```\ngit tag -a v${new_version} -m \"${new_version} release tag\"\ngit push --tags origin\n```\n\n(make sure to be in the `latest` branch when creating the final tag!)\n\n3\\. Upload wheels from GitHub Releases to PyPI\n\n[GitHub Actions will automatically build wheels and upload them to GitHub Releases](https://github.com/sourmash-bio/sourmash/actions?query=workflow%3Acibuildwheel).\nThis will take about 45 minutes, or more. After they're built, they must be\ncopied over to PyPI manually.\n\nYou can do this in two ways: you can manually download all the files\nfrom [the releases page], or, if you have the\n[`GitHub CLI`](https://cli.github.com/), you can use that to download the\npackages.\n\nDownload the wheels with the `GitHub CLI`:\n```\nmkdir -p wheel && cd wheel\ngh release download v${new_version}\n```\nor download them manually.\n\nOnce you have them downloaded, upload them to PyPI like so:\n```\ntwine upload *.whl\n```\ntwine will correctly determine the version from the filenames.\n\n4\\. Once the wheels are uploaded, publish the new release on PyPI (requires an authorized account).\n```\ncd ..\nmake dist\ntwine upload dist/sourmash-${new_version}.tar.gz\n```\n\nTwo notes:\n* This must be done *after* the wheels are available, because some of\nthe conda package build steps require the source dist and are automatically\ntriggered when a new version shows up on PyPI.\n* make sure to do this in a completely clean checkout. If there are additional files present, they will be included in the tar.gz.\n\n5\\. Edit the release on GitHub; there will already be one associated\nwith the tag you pushed. Copy and paste in the release notes.\n\nNote that there will also be releases associated with the Rust `core`\npackage, which is versioned differently than `sourmash`.  These will\nbe of the form `rXX.YY.ZZ`, e.g. `r0.9.0`. Please just ignore them :)\n\n## Conda-forge\n\nThe [sourmash-minimal feedstock](https://github.com/conda-forge/sourmash-minimal-feedstock/)\nin [conda-forge](https://conda-forge.org/) picks up new versions from\nPyPI (need the sdist to be published) and opens a new PR.\n\nCheck if there are any dependency changes,\nwith special attention to the minimum supported Rust version.\n\nAfter tests pass,\nmerge it and wait for the `sourmash-minimal` package to show up in conda-forge:\n```\nconda search sourmash-minimal={new_version}\n```\n\n[An example conda-forge PR for `4.6.0`](https://github.com/conda-forge/sourmash-minimal-feedstock/pull/37).\n\n[An example bioconda PR for `4.6.0`](https://github.com/bioconda/bioconda-recipes/pull/38205).\n\n## Bioconda\n\nThe BiocondaBot has an `autobump` feature that should pick up new releases from PyPI,\nand open a PR in Bioconda. Review any changes\n(especially dependency versions, since these don't get picked up).\n\nNote that you need to wait for the `sourmash-minimal` package\nprepared in the previous section to be available for installation,\nand tests are going to fail in Bioconda before that.\n\nAn example PR for [`3.4.0`](https://github.com/bioconda/bioconda-recipes/pull/23171).\n\n## Pyodide\n\nYou will need to open a PR on pyodide manually, e.g. [pyodide#4075 for 4.8.3](https://github.com/pyodide/pyodide/pull/4075).\n\n## Spack\n\nYou will need to open a PR on spack manually, e.g. [spack#40062 for 4.8.4](https://github.com/spack/spack/pull/40062).\n\n## Announce it!\n\nIf a bioinformatics software is released and no one posts about it, is it really released?\n\nExamples:\n\n- [3.4.1](https://twitter.com/ctitusbrown/status/1286652952828993537)\n- [3.4.0](https://twitter.com/luizirber/status/1283157954598858752)\n- [3.0.0](https://twitter.com/luizirber/status/1213588144458649600)\n\n## After release\n\nUpdate version to next minor version + `-dev`, e.g. [4.8.3-dev as in this PR](https://github.com/sourmash-bio/sourmash/pull/2584), per [sourmash#2517](https://github.com/sourmash-bio/sourmash/issues/2517).\n"
  },
  {
    "path": "doc/requirements.md",
    "content": "# Computational requirements\n\nsourmash has no particular memory requirements; it will need to hold\nthe largest single sequence you have in memory, but the individual\nsignatures are quite small and we do no special buffer allocation.\n\nsourmash's intensive computation is almost entirely computing k-mers\nand hashes of k-mers.  It will create a sketch of several megabases\nin a second or so on a rather slow 2016 Mac laptop.\n\nMinHash sketches and signatures are quite small on disk.\n\nsourmash should run with no modification on Linux and Mac OS X,\nunder Python 3.11 and later.  Please see [the development repository README][0]\nfor\ninformation on source code, tests, and continuous integration.\n\n[0]:https://github.com/sourmash-bio/sourmash/blob/latest/README.md\n"
  },
  {
    "path": "doc/runtime.txt",
    "content": "3.11\n"
  },
  {
    "path": "doc/sidebar.md",
    "content": "## Tutorials and examples\n\nThese tutorials are command line tutorials that should work on Mac OS\nX and Linux. They require about 5 GB of disk space and 5 GB of RAM.\n\n* [Installing sourmash with conda](tutorial-install.md)\n\n* [The first sourmash tutorial - making signatures, comparing, and searching](tutorial-basic.md)\n\n* [Using sourmash LCA to do taxonomic classification](tutorials-lca.md)\n\n* [Analyzing the genomic and taxonomic composition of an environmental genome using GTDB and sample-specific MAGs with sourmash](tutorial-lemonade.md)\n\n* [Some sourmash command line examples!](sourmash-examples.ipynb)\n\n## How-To Guides\n\n* [Classifying genome and metagenome sketches](classifying-signatures.md)\n\n* [A quickstart guide to using RocksDB indexing](howto-rocksdb.md)\n\n* [Working with private collections of genome sketches](sourmash-collections.ipynb)\n\n* [Using the `LCA_Database` API](using-LCA-database-API.ipynb)\n\n* [Building plots from `sourmash compare` output](plotting-compare.ipynb).\n\n* [A short guide to using sourmash output with R](other-languages.md).\n\n## Frequently Asked Questions\n\n* [Frequently asked questions](faq.md)\n\n## How sourmash works under the hood\n\n* [An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\n* [Support, versioning, and migration between versions](support.md)\n\n## Reference material\n\n* [UNIX command-line documentation](command-line.md)\n* [Genbank and GTDB databases and taxonomy files](databases.md)\n* [Python examples using the API](api-example.md)\n* [Publications about sourmash](publications.md)\n* [A guide to the internal design and structure of sourmash](sourmash-internals.md)\n* [Funding acknowledgements](funding.md)\n\n## Developing and extending sourmash\n\n* [Getting started with sourmash development](developer.md)\n* [Releasing a new version of sourmash](release.md)\n\n## [Full table of contents for all docs](toc.md)\n"
  },
  {
    "path": "doc/sourmash-collections.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# sourmash: working with private collections of signatures\\n\",\n    \"\\n\",\n    \"### Running this notebook.\\n\",\n    \"\\n\",\n    \"You can run this notebook interactively via mybinder; click on this button:\\n\",\n    \"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dib-lab/sourmash/latest?labpath=doc%2Fsourmash-collections.ipynb)\\n\",\n    \"\\n\",\n    \"A rendered version of this notebook is available at [sourmash.readthedocs.io](https://sourmash.readthedocs.io) under \\\"Tutorials and notebooks\\\".\\n\",\n    \"\\n\",\n    \"You can also get this notebook from the [doc/ subdirectory of the sourmash github repository](https://github.com/dib-lab/sourmash/tree/latest/doc). See [binder/environment.yaml](https://github.com/dib-lab/sourmash/blob/latest/binder/environment.yml) for installation dependencies.\\n\",\n    \"\\n\",\n    \"### What is this?\\n\",\n    \"\\n\",\n    \"This is a Jupyter Notebook using Python 3. If you are running this via [binder](https://mybinder.org), you can use Shift-ENTER to run cells, and double click on code cells to edit them.\\n\",\n    \"\\n\",\n    \"Contact: C. Titus Brown, ctbrown@ucdavis.edu. Please [file issues on GitHub](https://github.com/dib-lab/sourmash/issues/) if you have any questions or comments!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## download a bunch of genomes\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/Users/t/dev/sourmash/doc/big_genomes\\n\",\n      \"  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\\n\",\n      \"                                 Dload  Upload   Total   Spent    Left  Speed\\n\",\n      \"100   459  100   459    0     0   1017      0 --:--:-- --:--:-- --:--:--  1017\\n\",\n      \"100 61.1M  100 61.1M    0     0  2932k      0  0:00:21  0:00:21 --:--:-- 3468k\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!mkdir -p big_genomes\\n\",\n    \"!curl -L https://osf.io/8uxj9/?action=download | (cd big_genomes && tar xzf -)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## compute signatures for each file\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/Users/t/dev/sourmash/doc/big_genomes\\n\",\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kcomputing signatures for files: 0.fa, 1.fa, 10.fa, 11.fa, 12.fa, 13.fa, 14.fa, 15.fa, 16.fa, 17.fa, 18.fa, 19.fa, 2.fa, 20.fa, 21.fa, 22.fa, 23.fa, 24.fa, 25.fa, 26.fa, 27.fa, 28.fa, 29.fa, 3.fa, 30.fa, 31.fa, 32.fa, 33.fa, 34.fa, 35.fa, 36.fa, 37.fa, 38.fa, 39.fa, 4.fa, 40.fa, 41.fa, 42.fa, 43.fa, 44.fa, 45.fa, 46.fa, 47.fa, 48.fa, 49.fa, 5.fa, 50.fa, 51.fa, 52.fa, 53.fa, 54.fa, 55.fa, 56.fa, 57.fa, 58.fa, 59.fa, 6.fa, 60.fa, 61.fa, 62.fa, 63.fa, 7.fa, 8.fa, 9.fa\\n\",\n      \"\\u001b[KComputing a total of 1 signature(s).\\n\",\n      \"\\u001b[K... reading sequences from 0.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 0.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 0.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 1.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 1.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 1.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 10.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 10.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 10.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 11.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 11.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 11.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 12.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 12.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 12.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 13.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 13.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 13.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 14.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 14.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 14.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 15.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 15.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 15.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 16.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 4 sequences in 16.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 16.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 17.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 2 sequences in 17.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 17.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 18.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 18.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 18.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 19.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 9 sequences in 19.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 19.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 2.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 2.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 2.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 20.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 20.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 20.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 21.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 21.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 21.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 22.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 22.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 22.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 23.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 5 sequences in 23.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 23.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 24.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in 24.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 24.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 25.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 25.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 25.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 26.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 26.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 26.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 27.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 27.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 27.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 28.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in 28.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 28.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 29.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 29.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 29.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 3.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 3.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 3.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 30.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 30.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 30.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 31.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 31.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 31.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 32.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 32.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 32.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 33.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 33.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 33.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 34.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 34.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 34.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 35.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 7 sequences in 35.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 35.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 36.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 36.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 36.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 37.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 37.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 37.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 38.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 38.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 38.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 39.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 39.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 39.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 4.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 4.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 4.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 40.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 40.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 40.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 41.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 41.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 41.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 42.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 42.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 42.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 43.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 43.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 43.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 44.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 2 sequences in 44.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 44.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 45.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 45.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 45.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 46.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 46.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 46.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 47.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 2 sequences in 47.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 47.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 48.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 48.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 48.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 49.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 228 sequences in 49.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 49.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 5.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 5.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 5.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 50.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 50.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 50.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 51.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 51.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 51.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 52.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 52.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 52.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 53.fa\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 53.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 53.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 54.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 54.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 54.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 55.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 55.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 55.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 56.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 56.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 56.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 57.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 57.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 57.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 58.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 30 sequences in 58.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 58.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 59.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 5 sequences in 59.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 59.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 6.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 76 sequences in 6.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 6.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 60.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 11 sequences in 60.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 60.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 61.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 47 sequences in 61.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 61.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 62.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 62.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 62.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 63.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 4 sequences in 63.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 63.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 7.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in 7.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 7.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 8.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in 8.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 8.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from 9.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in 9.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to 9.fa.sig. Note: signature license is CC0.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!cd big_genomes/ && sourmash sketch dna -p k=31,scaled=1000 --name-from-first *.fa\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Compare them all\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/0.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/1.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/10.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/11.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/12.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/13.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/14.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/15.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/16.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/17.fa.sig'10 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/18.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/19.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/2.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/20.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/21.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/22.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/23.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/24.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/25.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/26.fa.sig'20 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/27.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/28.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/29.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/3.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/30.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/31.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/32.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/33.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/34.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/35.fa.sig'30 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/36.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/37.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/38.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/39.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/4.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/40.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/41.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/42.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/43.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/44.fa.sig'40 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/45.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/46.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/47.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/48.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/49.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/5.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/50.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/51.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/52.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/53.fa.sig'50 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/54.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/55.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/56.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/57.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/58.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/59.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/6.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/60.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/61.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/62.fa.sig'60 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/63.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/7.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/8.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/9.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 64 signatures total.                                                    \\n\",\n      \"\\u001b[K\\n\",\n      \"min similarity in matrix: 0.000\\n\",\n      \"\\u001b[Ksaving labels to: compare_all.mat.labels.txt\\n\",\n      \"\\u001b[Ksaving comparison matrix to: compare_all.mat\\n\",\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloading comparison matrix from compare_all.mat...\\n\",\n      \"\\u001b[K...got 64 x 64 matrix.\\n\",\n      \"\\u001b[Kloading labels from compare_all.mat.labels.txt\\n\",\n      \"\\u001b[Ksaving histogram of matrix values => compare_all.mat.hist.png\\n\",\n      \"\\u001b[Kwrote dendrogram to: compare_all.mat.dendro.png\\n\",\n      \"\\u001b[Kwrote numpy distance matrix to: compare_all.mat.matrix.png\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash compare big_genomes/*.sig -o compare_all.mat\\n\",\n    \"!sourmash plot compare_all.mat\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB29UlEQVR4nOzdfXhU9b3u/3tN5iEZAkExQgyPgiAEPVqjv0KMUQoIFLAVFKkXltYHELq5EIEqcgQMyAGK5PQIKFVgU5TyoCClVAhKCAbcAg3bKj1uYAvhuEHQrU5oQiaZzO8PJJIFTDIwkzWz8n71mmtPZlZWbna60syd73w/RjAYDAoAAAAAAAA1HFYHAAAAAAAAiDUUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAA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\\n\",\n      \"text/plain\": [\n       \"<IPython.core.display.Image object>\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import Image\\n\",\n    \"\\n\",\n    \"Image(filename=\\\"compare_all.mat.matrix.png\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## make a fast(er) search database for all of them\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloading 64 files into SBT\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/0.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/1.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/10.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/11.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/12.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/13.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/14.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/15.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/16.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/17.fa.sig'10 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/18.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/19.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/2.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/20.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/21.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/22.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/23.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/24.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/25.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/26.fa.sig'20 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/27.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/28.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/29.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/3.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/30.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/31.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/32.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/33.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/34.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/35.fa.sig'30 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/36.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/37.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/38.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/39.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/4.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/40.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/41.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/42.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/43.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/44.fa.sig'40 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/45.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/46.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/47.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/48.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/49.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/5.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/50.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/51.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/52.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/53.fa.sig'50 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/54.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/55.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/56.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/57.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/58.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/59.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/6.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/60.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/61.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/62.fa.sig'60 sigs total\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/63.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/7.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/8.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'big_genomes/9.fa.sig'g'\\n\",\n      \"\\u001b[K\\n\",\n      \"\\u001b[Kloaded 64 sigs; saving SBT under \\\"all-genomes\\\"\\n\",\n      \"\\u001b[KFinished saving nodes, now saving SBT index file.\\n\",\n      \"\\u001b[KFinished saving SBT index, available at /Users/t/dev/sourmash/doc/all-genomes.sbt.zip\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash index -k 31 all-genomes big_genomes/*.sig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can now use this to search, and gather.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[KCannot open file 'shew_os185.fa.sig'\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash search shew_os185.fa.sig all-genomes --threshold=0.001\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kcomputing signatures for files: fake-metagenome.fa\\n\",\n      \"\\u001b[KComputing a total of 1 signature(s).\\n\",\n      \"\\u001b[K... reading sequences from fake-metagenome.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in fake-metagenome.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to fake-metagenome.fa.sig. Note: signature license is CC0.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# (make fake metagenome again, just in case)\\n\",\n    \"!cat genomes/*.fa > fake-metagenome.fa\\n\",\n    \"!rm -f fake-metagenome.fa.sig\\n\",\n    \"!sourmash sketch dna -p k=31,scaled=1000 fake-metagenome.fa\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kselect query k=31 automatically.\\n\",\n      \"\\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\\n\",\n      \"\\u001b[Kloaded 1 databases.                                                            \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"overlap     p_query p_match\\n\",\n      \"---------   ------- -------\\n\",\n      \"0.5 Mbp       42.2%   10.5%    NC_011663.1 Shewanella baltica OS223,...\\n\",\n      \"499.0 kbp     38.4%   18.5%    CP001071.1 Akkermansia muciniphila AT...\\n\",\n      \"0.5 Mbp       19.4%    4.9%    NC_009665.1 Shewanella baltica OS185,...\\n\",\n      \"\\n\",\n      \"found 3 matches total;\\n\",\n      \"the recovered matches hit 100.0% of the query\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash gather fake-metagenome.fa.sig all-genomes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## build a database with taxonomic information --\\n\",\n    \"\\n\",\n    \"for this, we need to provide a metadata file that contains accession => tax information.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>accession</th>\\n\",\n       \"      <th>taxid</th>\\n\",\n       \"      <th>superkingdom</th>\\n\",\n       \"      <th>phylum</th>\\n\",\n       \"      <th>class</th>\\n\",\n       \"      <th>order</th>\\n\",\n       \"      <th>family</th>\\n\",\n       \"      <th>genus</th>\\n\",\n       \"      <th>species</th>\\n\",\n       \"      <th>strain</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>AE000782</td>\\n\",\n       \"      <td>224325</td>\\n\",\n       \"      <td>Archaea</td>\\n\",\n       \"      <td>Euryarchaeota</td>\\n\",\n       \"      <td>Archaeoglobi</td>\\n\",\n       \"      <td>Archaeoglobales</td>\\n\",\n       \"      <td>Archaeoglobaceae</td>\\n\",\n       \"      <td>Archaeoglobus</td>\\n\",\n       \"      <td>Archaeoglobus fulgidus</td>\\n\",\n       \"      <td>Archaeoglobus fulgidus DSM 4304</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>NC_000909</td>\\n\",\n       \"      <td>243232</td>\\n\",\n       \"      <td>Archaea</td>\\n\",\n       \"      <td>Euryarchaeota</td>\\n\",\n       \"      <td>Methanococci</td>\\n\",\n       \"      <td>Methanococcales</td>\\n\",\n       \"      <td>Methanocaldococcaceae</td>\\n\",\n       \"      <td>Methanocaldococcus</td>\\n\",\n       \"      <td>Methanocaldococcus jannaschii</td>\\n\",\n       \"      <td>Methanocaldococcus jannaschii DSM 2661</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>NC_003272</td>\\n\",\n       \"      <td>103690</td>\\n\",\n       \"      <td>Bacteria</td>\\n\",\n       \"      <td>Cyanobacteria</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>Nostocales</td>\\n\",\n       \"      <td>Nostocaceae</td>\\n\",\n       \"      <td>Nostoc</td>\\n\",\n       \"      <td>Nostoc sp. PCC 7120</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>AE009441</td>\\n\",\n       \"      <td>178306</td>\\n\",\n       \"      <td>Archaea</td>\\n\",\n       \"      <td>Crenarchaeota</td>\\n\",\n       \"      <td>Thermoprotei</td>\\n\",\n       \"      <td>Thermoproteales</td>\\n\",\n       \"      <td>Thermoproteaceae</td>\\n\",\n       \"      <td>Pyrobaculum</td>\\n\",\n       \"      <td>Pyrobaculum aerophilum</td>\\n\",\n       \"      <td>Pyrobaculum aerophilum str. IM2</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>AE009950</td>\\n\",\n       \"      <td>186497</td>\\n\",\n       \"      <td>Archaea</td>\\n\",\n       \"      <td>Euryarchaeota</td>\\n\",\n       \"      <td>Thermococci</td>\\n\",\n       \"      <td>Thermococcales</td>\\n\",\n       \"      <td>Thermococcaceae</td>\\n\",\n       \"      <td>Pyrococcus</td>\\n\",\n       \"      <td>Pyrococcus furiosus</td>\\n\",\n       \"      <td>Pyrococcus furiosus DSM 3638</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>...</th>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>59</th>\\n\",\n       \"      <td>NZ_ABZS01000228</td>\\n\",\n       \"      <td>432331</td>\\n\",\n       \"      <td>Bacteria</td>\\n\",\n       \"      <td>Aquificae</td>\\n\",\n       \"      <td>Aquificae</td>\\n\",\n       \"      <td>Aquificales</td>\\n\",\n       \"      <td>Hydrogenothermaceae</td>\\n\",\n       \"      <td>Sulfurihydrogenibium</td>\\n\",\n       \"      <td>Sulfurihydrogenibium yellowstonense</td>\\n\",\n       \"      <td>Sulfurihydrogenibium yellowstonense SS-5</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>60</th>\\n\",\n       \"      <td>NZ_JGWU01000001</td>\\n\",\n       \"      <td>1458259</td>\\n\",\n       \"      <td>Bacteria</td>\\n\",\n       \"      <td>Proteobacteria</td>\\n\",\n       \"      <td>Betaproteobacteria</td>\\n\",\n       \"      <td>Burkholderiales</td>\\n\",\n       \"      <td>Alcaligenaceae</td>\\n\",\n       \"      <td>Bordetella</td>\\n\",\n       \"      <td>Bordetella bronchiseptica</td>\\n\",\n       \"      <td>Bordetella bronchiseptica D989</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>61</th>\\n\",\n       \"      <td>NZ_FWDH01000003</td>\\n\",\n       \"      <td>31899</td>\\n\",\n       \"      <td>Bacteria</td>\\n\",\n       \"      <td>Firmicutes</td>\\n\",\n       \"      <td>Clostridia</td>\\n\",\n       \"      <td>Thermoanaerobacterales</td>\\n\",\n       \"      <td>Thermoanaerobacterales Family III. Incertae Sedis</td>\\n\",\n       \"      <td>Caldicellulosiruptor</td>\\n\",\n       \"      <td>Caldicellulosiruptor bescii</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>62</th>\\n\",\n       \"      <td>NC_009972</td>\\n\",\n       \"      <td>316274</td>\\n\",\n       \"      <td>Bacteria</td>\\n\",\n       \"      <td>Chloroflexi</td>\\n\",\n       \"      <td>Chloroflexia</td>\\n\",\n       \"      <td>Herpetosiphonales</td>\\n\",\n       \"      <td>Herpetosiphonaceae</td>\\n\",\n       \"      <td>Herpetosiphon</td>\\n\",\n       \"      <td>Herpetosiphon aurantiacus</td>\\n\",\n       \"      <td>Herpetosiphon aurantiacus DSM 785</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>63</th>\\n\",\n       \"      <td>NC_005213</td>\\n\",\n       \"      <td>228908</td>\\n\",\n       \"      <td>Archaea</td>\\n\",\n       \"      <td>Nanoarchaeota</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>Nanoarchaeales</td>\\n\",\n       \"      <td>Nanoarchaeaceae</td>\\n\",\n       \"      <td>Nanoarchaeum</td>\\n\",\n       \"      <td>Nanoarchaeum equitans</td>\\n\",\n       \"      <td>Nanoarchaeum equitans Kin4-M</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"<p>64 rows × 10 columns</p>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"          accession    taxid superkingdom          phylum               class  \\\\\\n\",\n       \"0          AE000782   224325      Archaea   Euryarchaeota        Archaeoglobi   \\n\",\n       \"1         NC_000909   243232      Archaea   Euryarchaeota        Methanococci   \\n\",\n       \"2         NC_003272   103690     Bacteria   Cyanobacteria                 NaN   \\n\",\n       \"3          AE009441   178306      Archaea   Crenarchaeota        Thermoprotei   \\n\",\n       \"4          AE009950   186497      Archaea   Euryarchaeota         Thermococci   \\n\",\n       \"..              ...      ...          ...             ...                 ...   \\n\",\n       \"59  NZ_ABZS01000228   432331     Bacteria       Aquificae           Aquificae   \\n\",\n       \"60  NZ_JGWU01000001  1458259     Bacteria  Proteobacteria  Betaproteobacteria   \\n\",\n       \"61  NZ_FWDH01000003    31899     Bacteria      Firmicutes          Clostridia   \\n\",\n       \"62        NC_009972   316274     Bacteria     Chloroflexi        Chloroflexia   \\n\",\n       \"63        NC_005213   228908      Archaea   Nanoarchaeota                 NaN   \\n\",\n       \"\\n\",\n       \"                     order                                             family  \\\\\\n\",\n       \"0          Archaeoglobales                                   Archaeoglobaceae   \\n\",\n       \"1          Methanococcales                              Methanocaldococcaceae   \\n\",\n       \"2               Nostocales                                        Nostocaceae   \\n\",\n       \"3          Thermoproteales                                   Thermoproteaceae   \\n\",\n       \"4           Thermococcales                                    Thermococcaceae   \\n\",\n       \"..                     ...                                                ...   \\n\",\n       \"59             Aquificales                                Hydrogenothermaceae   \\n\",\n       \"60         Burkholderiales                                     Alcaligenaceae   \\n\",\n       \"61  Thermoanaerobacterales  Thermoanaerobacterales Family III. Incertae Sedis   \\n\",\n       \"62       Herpetosiphonales                                 Herpetosiphonaceae   \\n\",\n       \"63          Nanoarchaeales                                    Nanoarchaeaceae   \\n\",\n       \"\\n\",\n       \"                   genus                              species  \\\\\\n\",\n       \"0          Archaeoglobus               Archaeoglobus fulgidus   \\n\",\n       \"1     Methanocaldococcus        Methanocaldococcus jannaschii   \\n\",\n       \"2                 Nostoc                  Nostoc sp. PCC 7120   \\n\",\n       \"3            Pyrobaculum               Pyrobaculum aerophilum   \\n\",\n       \"4             Pyrococcus                  Pyrococcus furiosus   \\n\",\n       \"..                   ...                                  ...   \\n\",\n       \"59  Sulfurihydrogenibium  Sulfurihydrogenibium yellowstonense   \\n\",\n       \"60            Bordetella            Bordetella bronchiseptica   \\n\",\n       \"61  Caldicellulosiruptor          Caldicellulosiruptor bescii   \\n\",\n       \"62         Herpetosiphon            Herpetosiphon aurantiacus   \\n\",\n       \"63          Nanoarchaeum                Nanoarchaeum equitans   \\n\",\n       \"\\n\",\n       \"                                      strain  \\n\",\n       \"0            Archaeoglobus fulgidus DSM 4304  \\n\",\n       \"1     Methanocaldococcus jannaschii DSM 2661  \\n\",\n       \"2                                        NaN  \\n\",\n       \"3            Pyrobaculum aerophilum str. IM2  \\n\",\n       \"4               Pyrococcus furiosus DSM 3638  \\n\",\n       \"..                                       ...  \\n\",\n       \"59  Sulfurihydrogenibium yellowstonense SS-5  \\n\",\n       \"60            Bordetella bronchiseptica D989  \\n\",\n       \"61                                       NaN  \\n\",\n       \"62         Herpetosiphon aurantiacus DSM 785  \\n\",\n       \"63              Nanoarchaeum equitans Kin4-M  \\n\",\n       \"\\n\",\n       \"[64 rows x 10 columns]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import pandas\\n\",\n    \"\\n\",\n    \"df = pandas.read_csv(\\\"podar-lineage.csv\\\")\\n\",\n    \"df\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[KBuilding LCA database with ksize=31 scaled=10000 moltype=DNA.\\n\",\n      \"\\u001b[Kexamining spreadsheet headers...\\n\",\n      \"\\u001b[K** assuming column 'accession' is identifiers in spreadsheet\\n\",\n      \"\\u001b[K64 distinct identities in spreadsheet out of 64 rows.\\n\",\n      \"\\u001b[K64 distinct lineages in spreadsheet out of 64 rows.\\n\",\n      \"\\u001b[K... loaded 64 signatures.H01000003.1 Caldicellulo (64 of 64); skipped 0 so far\\n\",\n      \"\\u001b[Kloaded 19993 hashes at ksize=31 scaled=10000\\n\",\n      \"\\u001b[K64 assigned lineages out of 64 distinct lineages in spreadsheet.\\n\",\n      \"\\u001b[K64 identifiers used out of 64 distinct identifiers in spreadsheet.\\n\",\n      \"\\u001b[Ksaving to LCA DB: taxdb.lca.json\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash lca index podar-lineage.csv taxdb big_genomes/*.sig  -C 3 --split-identifiers\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This database 'taxdb.lca.json' can be used for search and gather as above:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kselect query k=31 automatically.\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloading from taxdb.lca.json...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded LCA taxdb.lca.json\\r\",\n      \"\\r\",\n      \"\\u001b[K                                                                               \\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 databases.\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\\n\",\n      \"overlap     p_query p_match\\r\\n\",\n      \"---------   ------- -------\\r\\n\",\n      \"0.6 Mbp       46.7%   11.6%    NC_011663.1 Shewanella baltica OS223,...\\r\\n\",\n      \"0.5 Mbp       38.7%   19.3%    CP001071.1 Akkermansia muciniphila AT...\\r\\n\",\n      \"0.5 Mbp       14.6%    3.9%    NC_009665.1 Shewanella baltica OS185,...\\r\\n\",\n      \"\\r\\n\",\n      \"found 3 matches total;\\r\\n\",\n      \"the recovered matches hit 100.0% of the query\\r\\n\",\n      \"\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash gather fake-metagenome.fa.sig taxdb.lca.json\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"...but can also be used for taxonomic summarization:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K... loading database taxdb.lca.json\\r\",\n      \"\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[Kloaded 1 LCA databases. ksize=31, scaled=10000 moltype=DNA\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kfinding query signatures...\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K... loading fake-metagenome.fa (file 1 of 1)\\r\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila;Akkermansia muciniphila ATCC BAA-835   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia;Verrucomicrobiae   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"38.7%    53   Bacteria;Verrucomicrobia   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"100.0%   137   Bacteria   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria;Gammaproteobacteria   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"61.3%    84   Bacteria;Proteobacteria   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"22.6%    31   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"14.6%    20   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS185   fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[K\\r\",\n      \"\\u001b[Kloaded 1 signatures from 1 files total.\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash lca summarize --query fake-metagenome.fa.sig --db taxdb.lca.json\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Other pointers\\n\",\n    \"\\n\",\n    \"[Sourmash: a practical guide](https://sourmash.readthedocs.io/en/latest/using-sourmash-a-guide.html)\\n\",\n    \"\\n\",\n    \"[Classifying signatures taxonomically](https://sourmash.readthedocs.io/en/latest/classifying-signatures.html)\\n\",\n    \"\\n\",\n    \"[Pre-built search databases](https://sourmash.readthedocs.io/en/latest/databases.html)\\n\",\n    \"\\n\",\n    \"## A full list of notebooks\\n\",\n    \"\\n\",\n    \"[An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\\n\",\n    \"\\n\",\n    \"[Some sourmash command line examples!](sourmash-examples.ipynb)\\n\",\n    \"\\n\",\n    \"[Working with private collections of signatures.](sourmash-collections.ipynb)\\n\",\n    \"\\n\",\n    \"[Using the LCA_Database API.](using-LCA-database-API.ipynb)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python (myenv)\",\n   \"language\": \"python\",\n   \"name\": \"myenv\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "doc/sourmash-examples.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Some sourmash command line examples!\\n\",\n    \"\\n\",\n    \"[sourmash](https://sourmash.readthedocs.io/en/latest/) is research software from the Lab for Data Intensive Biology at UC Davis. It implements MinHash and modulo hash.\\n\",\n    \"\\n\",\n    \"Below are some examples of using sourmash. They are computed in a Jupyter Notebook so you can run them yourself if you like!\\n\",\n    \"\\n\",\n    \"Sourmash works on *signature files*, which are just saved collections of hashes.\\n\",\n    \"\\n\",\n    \"Let's try it out!\\n\",\n    \"\\n\",\n    \"### Running this notebook.\\n\",\n    \"\\n\",\n    \"You can run this notebook interactively via mybinder; click on this button:\\n\",\n    \"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dib-lab/sourmash/latest?labpath=doc%2Fsourmash-examples.ipynb)\\n\",\n    \"\\n\",\n    \"A rendered version of this notebook is available at [sourmash.readthedocs.io](https://sourmash.readthedocs.io) under \\\"Tutorials and notebooks\\\".\\n\",\n    \"\\n\",\n    \"You can also get this notebook from the [doc/ subdirectory of the sourmash github repository](https://github.com/dib-lab/sourmash/tree/latest/doc). See [binder/environment.yaml](https://github.com/dib-lab/sourmash/blob/latest/binder/environment.yml) for installation dependencies.\\n\",\n    \"\\n\",\n    \"### What is this?\\n\",\n    \"\\n\",\n    \"This is a Jupyter Notebook using Python 3. If you are running this via [binder](https://mybinder.org), you can use Shift-ENTER to run cells, and double click on code cells to edit them.\\n\",\n    \"\\n\",\n    \"Contact: C. Titus Brown, ctbrown@ucdavis.edu. Please [file issues on GitHub](https://github.com/dib-lab/sourmash/issues/) if you have any questions or comments!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Compute scaled signatures\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kcomputing signatures for files: genomes/akkermansia.fa, genomes/shew_os185.fa, genomes/shew_os223.fa\\n\",\n      \"\\u001b[KComputing a total of 1 signature(s).\\n\",\n      \"\\u001b[K... reading sequences from genomes/akkermansia.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in genomes/akkermansia.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to akkermansia.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from genomes/shew_os185.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in genomes/shew_os185.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to shew_os185.fa.sig. Note: signature license is CC0.\\n\",\n      \"\\u001b[K... reading sequences from genomes/shew_os223.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 1 sequences in genomes/shew_os223.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to shew_os223.fa.sig. Note: signature license is CC0.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!rm -f *.sig\\n\",\n    \"!sourmash sketch dna -p k=21,k=31,k=51,scaled=1000 genomes/*.fa --name-from-first -f\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This outputs three signature files, each containing three signatures (one calculated at k=21, one at k=31, and one at k=51).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"akkermansia.fa.sig  shew_os185.fa.sig   shew_os223.fa.sig\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"ls *.sig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can now use these signature files for various comparisons.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Search multiple signatures with a query\\n\",\n    \"\\n\",\n    \"The below command queries all of the signature files in the directory with the `shew_os223` signature and finds the best Jaccard similarity:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kselecting specified query k=31\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloaded query: NC_011663.1 Shewanella baltica... (k=31, DNA)\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloading from akkermansia.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from akkermansia.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[Kloading from shew_os185.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from shew_os185.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[Kloading from shew_os223.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from shew_os223.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[K                                                                               \\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 3 signatures.\\r\\n\",\n      \"\\r\\n\",\n      \"2 matches:\\r\\n\",\n      \"similarity   match\\r\\n\",\n      \"----------   -----\\r\\n\",\n      \"100.0%       NC_011663.1 Shewanella baltica OS223, complete genome\\r\\n\",\n      \" 22.8%       NC_009665.1 Shewanella baltica OS185, complete genome\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash search -k 31 shew_os223.fa.sig *.sig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The below command uses Jaccard containment instead of Jaccard similarity:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kselecting specified query k=31\\n\",\n      \"\\u001b[Kloaded query: NC_011663.1 Shewanella baltica... (k=31, DNA)\\n\",\n      \"\\u001b[Kloaded 3 signatures.                                                           \\n\",\n      \"\\n\",\n      \"2 matches:\\n\",\n      \"similarity   match\\n\",\n      \"----------   -----\\n\",\n      \"100.0%       NC_011663.1 Shewanella baltica OS223, complete genome\\n\",\n      \" 37.3%       NC_009665.1 Shewanella baltica OS185, complete genome\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash search -k 31 shew_os223.fa.sig *.sig --containment\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Performing all-by-all queries\\n\",\n    \"\\n\",\n    \"We can also compare all three signatures:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 3 signatures total.                                                     \\n\",\n      \"\\u001b[K\\n\",\n      \"0-CP001071.1 Akke...\\t[1. 0. 0.]\\n\",\n      \"1-NC_009665.1 She...\\t[0.    1.    0.228]\\n\",\n      \"2-NC_011663.1 She...\\t[0.    0.228 1.   ]\\n\",\n      \"min similarity in matrix: 0.000\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash compare -k 31 *.sig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"...and produce a similarity matrix that we can use for plotting:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 3 signatures total.                                                     \\n\",\n      \"\\u001b[K\\n\",\n      \"0-CP001071.1 Akke...\\t[1. 0. 0.]\\n\",\n      \"1-NC_009665.1 She...\\t[0.    1.    0.228]\\n\",\n      \"2-NC_011663.1 She...\\t[0.    0.228 1.   ]\\n\",\n      \"min similarity in matrix: 0.000\\n\",\n      \"\\u001b[Ksaving labels to: genome_compare.mat.labels.txt\\n\",\n      \"\\u001b[Ksaving comparison matrix to: genome_compare.mat\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash compare -k 31 *.sig -o genome_compare.mat\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloading comparison matrix from genome_compare.mat...\\n\",\n      \"\\u001b[K...got 3 x 3 matrix.\\n\",\n      \"\\u001b[Kloading labels from genome_compare.mat.labels.txt\\n\",\n      \"\\u001b[Ksaving histogram of matrix values => genome_compare.mat.hist.png\\n\",\n      \"\\u001b[Kwrote dendrogram to: genome_compare.mat.dendro.png\\n\",\n      \"\\u001b[Kwrote numpy distance matrix to: genome_compare.mat.matrix.png\\n\",\n      \"0\\tCP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\\n\",\n      \"1\\tNC_009665.1 Shewanella baltica OS185, complete genome\\n\",\n      \"2\\tNC_011663.1 Shewanella baltica OS223, complete genome\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwJUlEQVR4nO3df5BX5X0v8M/zXYTV4JKqcQXdIFYdydAkc5emgmVSbVyDjjdJ00rrHUkUOiEYLVJNg6SK1Ia20zCYRDCOWuqUWK4aWzOzJW6vEzXVdCLBTlqdaW9jXKJLGDDjgj9Yge/9A9jcfXYV2HPg7H55vZjzh2e/+3yfL3KY5X3e53lSvV6vBwAAAAD9alVPAAAAAGCkEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQm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\\n\",\n      \"text/plain\": [\n       \"<IPython.core.display.Image object>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"!sourmash plot genome_compare.mat\\n\",\n    \"\\n\",\n    \"from IPython.display import Image\\n\",\n    \"Image(filename='genome_compare.mat.matrix.png') \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"and for the R aficionados, you can output a CSV version of the matrix:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\\n\",\n      \"\\u001b[Kloaded 3 signatures total.                                                     \\n\",\n      \"\\u001b[K\\n\",\n      \"0-CP001071.1 Akke...\\t[1. 0. 0.]\\n\",\n      \"1-NC_009665.1 She...\\t[0.    1.    0.228]\\n\",\n      \"2-NC_011663.1 She...\\t[0.    0.228 1.   ]\\n\",\n      \"min similarity in matrix: 0.000\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash compare -k 31 *.sig --csv genome_compare.csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\\"CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\\\",\\\"NC_009665.1 Shewanella baltica OS185, complete genome\\\",\\\"NC_011663.1 Shewanella baltica OS223, complete genome\\\"\\r\",\n      \"\\r\\n\",\n      \"1.0,0.0,0.0\\r\",\n      \"\\r\\n\",\n      \"0.0,1.0,0.22846441947565543\\r\",\n      \"\\r\\n\",\n      \"0.0,0.22846441947565543,1.0\\r\",\n      \"\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!cat genome_compare.csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is now a file that you can load into R and examine - see [our documentation](https://sourmash.readthedocs.io/en/latest/other-languages.html) on that.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## working with metagenomes\\n\",\n    \"\\n\",\n    \"Let's make a fake metagenome:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[K\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\n\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\n\",\n      \"\\n\",\n      \"\\u001b[Kcomputing signatures for files: fake-metagenome.fa\\n\",\n      \"\\u001b[KComputing a total of 1 signature(s).\\n\",\n      \"\\u001b[K... reading sequences from fake-metagenome.fa\\n\",\n      \"\\u001b[Kcalculated 1 signatures for 3 sequences in fake-metagenome.fa\\n\",\n      \"\\u001b[Ksaved signature(s) to fake-metagenome.fa.sig. Note: signature license is CC0.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!rm -f fake-metagenome.fa*\\n\",\n    \"!cat genomes/*.fa > fake-metagenome.fa\\n\",\n    \"!sourmash sketch dna -p k=31,scaled=1000 fake-metagenome.fa\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the `sourmash gather` command to see what's in it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kselect query k=31 automatically.\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kloading from shew_os185.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from shew_os185.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[Kloading from shew_os223.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from shew_os223.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[Kloading from akkermansia.fa.sig...\\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 1 signatures from akkermansia.fa.sig\\r\",\n      \"\\r\",\n      \"\\u001b[K                                                                               \\r\",\n      \"\\r\",\n      \"\\u001b[Kloaded 3 signatures.\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\\n\",\n      \"overlap     p_query p_match\\r\\n\",\n      \"---------   ------- -------\\r\\n\",\n      \"499.0 kbp     38.4%  100.0%    CP001071.1 Akkermansia muciniphila AT...\\r\\n\",\n      \"494.0 kbp     38.0%  100.0%    NC_009665.1 Shewanella baltica OS185,...\\r\\n\",\n      \"490.0 kbp     23.6%   62.7%    NC_011663.1 Shewanella baltica OS223,...\\r\\n\",\n      \"\\r\\n\",\n      \"found 3 matches total;\\r\\n\",\n      \"the recovered matches hit 100.0% of the query\\r\\n\",\n      \"\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash gather fake-metagenome.fa.sig shew*.sig akker*.sig\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Other pointers\\n\",\n    \"\\n\",\n    \"[Sourmash: a practical guide](https://sourmash.readthedocs.io/en/latest/using-sourmash-a-guide.html)\\n\",\n    \"\\n\",\n    \"[Classifying signatures taxonomically](https://sourmash.readthedocs.io/en/latest/classifying-signatures.html)\\n\",\n    \"\\n\",\n    \"[Pre-built search databases](https://sourmash.readthedocs.io/en/latest/databases.html)\\n\",\n    \"\\n\",\n    \"## A full list of notebooks\\n\",\n    \"\\n\",\n    \"[An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\\n\",\n    \"\\n\",\n    \"[Some sourmash command line examples!](sourmash-examples.ipynb)\\n\",\n    \"\\n\",\n    \"[Working with private collections of signatures.](sourmash-collections.ipynb)\\n\",\n    \"\\n\",\n    \"[Using the LCA_Database API.](using-LCA-database-API.ipynb)\\n\",\n    \"\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"smash-notebooks\",\n   \"language\": \"python\",\n   \"name\": \"smash-notebooks\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "doc/sourmash-internals.md",
    "content": "# A guide to the internal design and structure of sourmash\n\n```{contents} Contents\n:depth: 3\n```\n\nsourmash was created in 2015, and has been repeatedly reorganized,\nrefactored, and optimized to support ever larger databases, faster\nqueries, and new use cases. We've also regularly added new\nfunctionality and features.  So sourmash can be pretty complicated\ninternally, and our user-facing documentation only covers a fraction\nof its potential!\n\nThis document is a brain dump intended for expert users and sourmash\ndevelopers who want to understand how, why, and when to use various\nsourmash features. It is unlikely ever to be comprehensive, so the\ninformation you are interested in may not yet exist in this document,\nbut we are always happy to add to it -\n[just ask in an issue!](https://github.com/sourmash-bio/sourmash/issues)\n\n## Signatures and sketches\n\nsourmash operates on sketches. Each sketch is a collection of hashes,\nwhich are in turn built from k-mers by applying a hash function\n(currently always murmurhash) and a filtering function.  Each sketch\nis contained in a signature wrapper that contains some metadata.\n\nInternally, sketches (class `MinHash`) contain the following information:\n* a set of hashes;\n* an optional abundance for each hash (when `track_abund` is True);\n* a seed;\n* a k-mer size;\n* a molecule type;\n* either a `num` (for MinHash) or a `scaled` value (for FracMinHash);\n\nSignature objects (class `SourmashSignature`) contain a sketch (property `.minhash`) as well as additional information:\n* an optional `name`\n* an optional `filename`\n* a license (currently must be CC0);\n* an `md5sum(...)` method that returns a hash of the sketch.\n\nFor now, we tend to refer to signatures and sketches interchangeably,\nbecause they are almost entirely 1:1 in the code base (but see [sourmash#616](https://github.com/sourmash-bio/sourmash/issues/616)).\n\nThe default signature interchange/serialization format is JSON, optionally\ngzipped. This format is written and read by Rust code.\n\nIn general, a lot of effort in sourmash is spent managing collections of\nsignatures _before_ actually doing comparisons with them; see manifests,\nand `Index` objects, below.\n\n### Making sketches\n\nSketches are produced by hashing k-mers with murmurhash and then\nkeeping either the lowest `num` hashes (for MinHashes sketches) or\nkeeping all hashes below `2**64 / scaled` (for FracMinHash sketches).\nThis has the effect of selecting approximately one hash for every\n`scaled` k-mers - so, when sketching a set of 100,000 distinct k-mers,\na scaled value of 1,000 would yield approximately 100 hashes to be\nretained in the sketch.\n\nThe default MinHash sketches use parameters so that they are\ncompatible with mash sketches.\n\nSee [utils/compute-dna-mh-another-way.py](https://github.com/sourmash-bio/sourmash/blob/latest/utils/compute-dna-mh-another-way.py) for details on how k-mers are\nhashed.\n\nNote that if hashes are produced some other way (with a different hash\nfunction) or from some source other than DNA, sourmash can still work\nwith them; only `sourmash sketch` actually cares about DNA sequences,\neverything else works with hashes.\n\n### Compatibility checking\n\nThe point of the signatures and sketches is to enable certain kinds of\nrapid comparisons - Jaccard similarity and number of overlapping k-mers,\nspecifically. However, these comparisons can only be done between\ncompatible sketches.\n\nHere, \"compatible\" means -\n* the same MurmurHash seed (default 42);\n* the same k-mer size/ksize (see k-mer sizes, below);\n* the same molecule type (see molecule types, below);\n* the same `num` or `scaled` (although see [this downsampling discussion](api-example.md#downsampling-signatures), and the next two sections);\n\nsourmash uses selectors (`Index.select(...)`) to select sketches with\ncompatible ksizes, molecule types, and sketch types.\n\n### Scaled (FracMinHash) sketches support similarity and containment\n\nPer our discussion in [Irber et al., 2022](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2), FracMinHash sketches can always be compared\nby downsampling to the max of the two scaled values.  (This is not always\nindexed collections of sketches, e.g. SBTs; see [sourmash#1799](https://github.com/sourmash-bio/sourmash/issues/1799).)\n\nIn practice, sourmash does all necessary downsampling dynamically, but\nreturns the original sketches. This means that (for example) you can\ndo a low-resolution/high-scaled search quickly by specifying a\nhigh `scaled` value, and then use a higher resolution comparison with\nthe resulting matches for a more refined and accurate analysis (see\nbelow, [Speeding up `gather` and `search`](#speeding-up-gather-and-search).)\n\n### Num (MinHash) sketches support Jaccard similarity\n\n\"Regular\" MinHash (or \"num MinHash\") sketches are implemented the same\nway as in mash.  However, they are less well supported in sourmash,\nbecause they don't offer the same opportunities for metagenome\nanalysis.  (See also [sourmash#1354](https://github.com/sourmash-bio/sourmash/issues/1354).)\n\nNum MinHash sketches can always be compared by downsampling to a\ncommon `num` value. This may need to be done manually using `sourmash\nsig downsample`, however.\n\n### Conversion between Scaled (FracMinHash) and Num (MinHash) signatures with `downsample`\n\nAs discussed in the previous sections, it is possible to adjust the `scaled` and `num` values to compare two FracMinHash signatures or two Num MinHash signatures. However, it is also possible to covert between the `scaled` and `num` signatures with the `sourmash sig downsample` command. For more details, review the [command line docs for `sig downsample`](https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-signature-downsample-decrease-the-size-of-a-signature).\n\n### Operations you can do safely with FracMinHash sketches\n\nAs described in\n[Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2),\nFracMinHash sketches support a wide range of operations that mirror\nactions taken on the underlying data set _without_ revisiting the\nunderlying data. This allows users to build sketches once (requiring\nthe original data) and then do all sorts of manipulations on the\nsketches, and know that the results of the sketch manipulations\nrepresent what would happen if they did the same thing on the original\ndata.  For example,\n\n* set unions, intersections, and subtractions all perform the same\n  when done on the sketches as when applied to the underling data.\n  So, for example, you can sketch two files separately and merge\n  the sketches (with `sig merge`), and get the same result as if you'd\n  concatenated the files first and then sketched them.\n* if you filter hashes on abundance with `sig filter`, you get the\n  same result as if you filtered the data set on k-mer abundance and\n  then sketched it.\n* downsampling: you can sketch the original data set at a high resolution\n  (e.g. scaled=100) and then downsample it later (to e.g. scaled=1000),\n  and get the same result as if you'd sketched the data set at scaled=1000.\n\n## K-mer sizes\n\nThere is no explicit restriction on k-mer sizes built into sourmash.\n\nFor highly specific genome and metagenome comparisons, we typically\nuse k=21, k=31, or k=51. For a longer discussion, see [Assembly Free Analysis with K-mers](https://github.com/mblstamps/stamps2022/blob/main/kmers_and_sourmash/2022-stamps-assembly-free%20class.pdf) from STAMPS 2022\nand a more general overview at [Using sourmash:a practical guide](using-sourmash-a-guide.md).\n\n## Molecule types - DNA, protein, Dayhoff, and hydrophobic-polar\n\nsourmash supports four different sequence encodings, which we refer to\nas \"molecule\": DNA (`--dna`), protein (`--protein`), [Dayhoff encoding](https://en.wikipedia.org/wiki/Margaret_Oakley_Dayhoff#Table_of_Dayhoff_encoding_of_amino_acids), \n(`--dayhoff`), and [hydrophobic-polar](sourmash-sketch.md#protein-encodings) (`--hp`).\n\nAll FracMinHash sketches have exactly one molecule type, and can only\nbe compared to the same molecule type (and ksize).\n\nDNA moltype sketches can be constructed from DNA input sequences using\n`sourmash sketch dna`.\n\nProtein, Dayhoff, and HP moltype sketches can be constructed from\nprotein input sequences using `sourmash sketch protein`, or from DNA\ninput sequences using `sourmash sketch translate`; `translate` will\ntranslate in all six reading frames (see also\n[orpheum](https://github.com/czbiohub/orpheum) from\n[Botvinnik et al., 2021](https://www.biorxiv.org/content/10.1101/2021.07.09.450799v1)).\nBy default protein sketches will be created; dayhoff sketches can be\ncreated by including `dayhoff` in the param string, e.g. `sourmash\nsketch protein -p dayhoff`, and hydrophobic-polar sketches can be\nbuilt with `hp` in the param string, e.g. `sourmash sketch protein -p hp`.\n\n## Manifests\n\nManifests are catalogs of sketches: they include most of the information\nabout a sketch, except for the actual hashes. The idea of manifests is\nthat you can use them to identify *which* sketches you are interested\nin before actually working with them (loading them, for example).\n\nsourmash makes extensive use of signature manifests to support rapid\nselection and lazy loading of signatures based on signature metadata\n(name, ksize, moltype, etc.) See\n[Blog post: Scaling sourmash to millions of samples](http://ivory.idyll.org/blog/2021-sourmash-scaling-to-millions.html)\nfor some of the motivation.\n\nManifests are an internal format that is not meant to be particularly\nhuman readable, but the CSV format can be loaded into a spreadsheet\nprogram if you're curious :).\n\nIf a collection of signatures is in a zipfile (`.zip`) or SBT zipfile (`.sbt.zip`), manifests must\nbe named `SOURMASH-MANIFEST.csv`. They can also be stored directly on\ndisk in CSV/gzipped CSV, or in a sqlite database; see\n`sourmash sig manifest`, `sourmash sig check`, and `sourmash sig collect`\nfor manifest creation, management, and export utilities.\n\nWhere signatures are stored individually in `Index` collections,\ne.g. as separate files in a zipfile, manifests may be stored alongside\nthem; for other subclasses of `Index` such as the inverted indices,\nmanifests are generated dynamically by the class itself.\n\nCurrently (sourmash 4.x) manifests do not contain information about the\nhash seed or sketch license. This will be fixed in the future - see [sourmash#1849](https://github.com/sourmash-bio/sourmash/issues/1849).\n\nManifests are very flexible and, especially when stored in a sqlite\ndatabase, can be extremely performant for organizing hundreds of\nthousands to millions of sketches.  Please see `StandaloneManifestIndex`\nfor a lazy-loading `Index` class that supports such massive-scale\norganization.\n\n## Index implementations\n\nThe `Index` class and its various subclasses (in `sourmash.index`) are\ncontainers that provide an API for organizing, selecting, and\nsearching (potentially) large numbers of signatures.\n\n`sourmash sig summarize` is a good way to determine what type of `Index`\nclass is used to handle a collection.\n\nLoading and saving of `Index` objects is handled separately from the\nclass: loading can be done in Python via the\n`sourmash.load_file_as_index(...)` method, while creation and/or\nupdating of `Index` objects is done via\n`sourmash.sourmash_args.SaveSignaturesToLocation(...)`.  These are the\nsame APIs used by the command-line functionality.\n\nThere are quite a few different `Index` subclasses and they all have\ndistinct features.  We have a high-level guide to which collection\ntype to use [here](command-line.md#loading-many-signatures).\n\nConceptually, `Index` classes are either organized around storing\nindividual signatures often with metadata that permits loading,\nselecting, and/or searching them more efficiently\n(e.g. `ZipFileLinearIndex` and `SBTs`); or they store signatures\nas inverted indices (`LCA_Database` and `SqliteIndex`) that permit\ncertain kinds of fast queries.\n\nUnless otherwise noted, the `Index` classes below can be loaded\nconcurrently in \"read only\" mode - that is, you should build the\ncollection _once_, and then use it from multiple processes. We\ncurrently do not test for or support concurrent read/write. Note also\nthat (generally speaking) memory footprints will be additive, so\nloading the same `LCA_Database` twice will consume twice the memory.\n(If you're interested in concurrency, we suggest using the sqlite\ncontainers - see `SqliteIndex`.)\n\n### In-memory storage and search.\n\nThe simplest way to handle collections of signatures is to load them\ninto memory, but it is also the least performant and most memory\nintensive mechanism!\n\n`LinearIndex` and `MultiIndex` both support sketches loaded from\nJSON files; both will load the sketches once and then keep them in\nmemory.  `LinearIndex` does not use manifests while `MultiIndex` builds\na manifest as it loads the sketches.\n\nNote that `MultiIndex` is the class used to load signatures from\npathlists, directory hierarchies, and so on; because it stores\nsketches in memory, this can incur a significant memory penalty (see\n[sourmash#1899](https://github.com/sourmash-bio/sourmash/issues/1899)).  Therefore where possible we suggest building a standalone\nmanifest (`StandaloneManifestIndex`) to do lazy loading from the disk\ninstead; you can use `sourmash sig collect` to do this.\n\n### Zipfile collections\n\n`ZipFileLinearIndex` stores signature files in a zip file with an\naccompanying manifest.  This is the most versatile and compressed\noption for working with large collections of sketches - it supports\nrapid selection and loading of specific sketches from disk, and can\nstore and search any mixture of sketch types (ksize, molecule type,\nscaled values, etc.)\n\nBy default, `ZipFileLinearIndex` stores one signature (equiv. one\nsketch) in each member file in the zip archive. Each signature is\nstored uncompressed. The accompanying manifest stores the full member\nfile path in `internal_location`, so that sketches can be retrieved\ndirectly.\n\nSearching a `ZipFileLinearIndex` is done linearly, as implied by the\nname. This is fine for `gather` but if you are doing repeated queries\nwith `search` you may want to use an SBT or LCA database instead; see\nbelow.\n\nIn the future we expect to parallelize searching `ZipFileLinearIndex`\nfiles in Rust; see [sourmash#1752](https://github.com/sourmash-bio/sourmash/issues/1752).\n\n`ZipFileLinearIndex` does support zip files without manifests as well\nas multiple signatures in a single file; this was originally intended\nto support simply zipping entire directory hierarchies into a zipfile.\nHowever, this slows down performance and is not recommended.  If you\nhave an existing zipfile (or really any collection of signatures) and\nyou want to turn them into a proper `ZipFileLinearIndex`, you can use\n`sig cat <collection(s)> -o combined.zip` to create a\n`ZipFileLinearIndex` file named `combined.zip` that will have a\nmanifest and signatures broken out into individual files.\n\n### Sequence Bloom Trees (SBTs)\n\nSequence Bloom Trees (SBTs; see\n[the Kingsford Lab page for details](http://www.cs.cmu.edu/~ckingsf/software/bloomtree/))\nprovide a faster (but more memory intensive) on-disk storage and\nsearch mechanism.  In brief, SBTs implement a binary tree organization\nof an arbitrary number of signatures; each internal node is a Bloom\nfilter containing all of the hashes for the nodes below them. This\npermits potentially rapid elimination of irrelevant nodes on search.\n\nSBTs are restricted to storing and searching sketches with the\nsame/single k-mer size and molecule type, as well as either a single\nnum value or a single scaled value.\n\nWe suggest using SBTs when you are doing multiple Jaccard search or\ncontainment searches with genomes via `sourmash search`.\n\n### Lowest common ancestor (LCA) databases\n\nThe `LCA_Database` index class stores signatures in an inverted index,\nwhere a Python dictionary is used to link individual hashes back to\nsignatures and/or taxonomic lineages. This supports the individualized\nhash analyses used in the `lca` submodule.\n\nLCA databases only support a single ksize, moltype, and scaled. They\ncan only be used with FracMinHash (scaled) sketches.\n\nThe default `LCA_Database` class is serialized via JSON, and loads\neverything into memory when requested. The load time incurs a\nsignificant latency penalty when used from the command line, as well\nas having a potentially large memory footprint; this makes it\ndifficult to use the default `LCA_Database` for very large databases,\ne.g. genbank bacteria.\n\nThe newer `LCA_SqliteDatabase` (based on `SqliteIndex`, described\nbelow) also supports LCA-style queries, and is stored on disk, is fast to\nload, and uses very little memory. The tradeoff is that the underlying\nsqlite database can be quite large.  `LCA_SqliteDatabase` should also\nsupport rapid concurrent access (see [sourmash#909](https://github.com/sourmash-bio/sourmash/issues/909)).\n\nBoth types of LCA database can be constructed with `sourmash lca index`.\n\n### SqliteIndex\n\nThe `SqliteIndex` storage class uses sqlite3 to store hashes and\nsketch information for search and retrieval; see\n[this blog post](http://ivory.idyll.org/blog/2022-storing-ulong-in-sqlite-sourmash.html)\nfor background information and details. These are fast, low-memory,\non-disk databases, with the tradeoff that they can be quite large.\nThis is probably currently the best solution for concurrent access to\nsketches via e.g. a Web server (see also [sourmash#909](https://github.com/sourmash-bio/sourmash/issues/909)).\n\n`SqliteIndex` can only contain FracMinHash sketches and can only store\nsketches with the same scaled parameter. However, it can store \nmultiple ksizes and moltypes as long as the same scaled is used.\n\n`SqliteIndex` objects can be constructed using `sourmash sig cat\n... -o filename.sqldb`.\n\n### Standalone manifests\n\nThe `StandaloneManifestIndex` class loads standalone manifests generated\nby `sourmash sig collect`. They support rapid selection and lazy loading\non potentially extremely large collections of signatures.\n\nThe underlying mechanism uses the `internal_location` field of\nmanifests to point to the container file. When particular sketches are\nrequested, the container file is loaded into an `Index` object with\n`sourmash.load_file_as_index` and the `md5` values of the requested\nsketches are used as a picklist to retrieve the desired signatures.\n\nThus, while standalone manifests can point at any kind of container,\nincluding JSON files or LCA databases, they are most efficient when\n`internal_location` points at a file with either a single sketch in\nit, or a manifest that supports direct loading of sketches. Therefore,\nwe suggest using standalone manifest indices.  Note that sourmash\ninterprets paths to locations in standalone manifests relative to the\nmanifest filename; see the `--relpath` behavior in `sig check` and\n`sig collect` to output manifests that deal with relative filenames\nproperly.\n\nNote that searching a standalone manifest is currently done through a\nlinear iteration, and does not use any features of indexed containers\nsuch as SBTs or LCAs.  This is fine for `gather` with the default\napproach, but is probably suboptimal for a `search`.\n\n### Pathlists and `--from-file`\n\nAll (or most) sourmash commands natively support taking in lists of\nsignature collections via pathlists, `--from-file`, or paths to\ndirectories. This is useful for situations where you have thousands of\nsignature files and don't want to provide them explicitly on the\ncommand line; you can simply put a list of the files in a text file,\nand pass it in directly (or use `--from-file` to pass it in).\n\nBoth pathlists and files passed to `--from-file` contain a list of\npaths to be loaded; relatives paths will be interpreted relative to\nthe current working directory of sourmash.  Pathlists should be\nuniversally available on sourmash commands.  When `--from-file` is\navailable for a command, sourmash will behave as if the file paths in\nthe file were provided on the command line.\n\nWe suggest avoiding pathlists. Instead, we suggest using `--from-file`\nor a standalone manifest index (generated with `sourmash sig\ncollect`). This is because the signatures from pathlists are loaded\ninto memory (see `MultiIndex`, above) it is generally a bad idea to\nuse them - they may be slow to load and may consume a lot of\nmemory. They also do not support good loading error messages;\nsee [sourmash#1414](https://github.com/sourmash-bio/sourmash/issues/1414).\n\n### Extensions for outputting index classes\n\nMost commands that support saving signatures will save them in a\nvariety of formats, based on the extension provided (see\n[sourmash#1890](https://github.com/sourmash-bio/sourmash/issues/1890)\nfor exceptions). The supported extensions are -\n\n* `.zip` for `ZipFileLinearIndex`\n* `.sqldb` for `SqliteIndex`\n* `.sig` or `.sig.gz` for JSON/gzipped JSON\n* `dirname/` to save in a directory hierarchy\n\nThe default signature save format is JSON, if the extension is not\nrecognized.\n\n## Speeding up `gather` and `search`\n\nThere are two primary search commands in sourmash: `gather` and\n`search`.\n\n`gather` calculates a minimum metagenome cover as discussed in [Irber et al., 2022](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2). It\nis mostly intended for querying a database with a metagenome, although\nit can be used with genome queries, as well. This approach relies on overlaps\nbetween genomes and metagenomes and can only be used with FracMinHash sketches.\n\n`search` does a straight Jaccard similarity search on MinHash and\nFracMinHash sketches (or, with `--containment`, a containment search\non FracMinHash sketches). It is typically used to find matches to a\nquery genome sketch in a large database of sketches.\n\nThe `prefetch` command does a containment search and is intended for\npower users; it is a standalone implementation of the prefetch\nalgorithm discussed below for `gather`.  It only works with FracMinHash\nsketches.\n\nNote that all of these commands work with any and all `Index`\ncollection/container types, and will return the same results however\nthe collections are organized - see the \"online behavior\" section,\nbelow. In practice this means that you can provide additional\ncollections of signatures via the command line without building a\ncombined index of all your signatures. It also means that the only\nreason to choose different collections/containers is for\noptimization - you should select the containers that help you achieve\nthe desired performance characteristics for your search\n(i.e. the right memory/time/disk space tradeoffs).\n\n### Running `search` many times on the same database\n\n`search` typically is used to search a large database of sketches for\nall similarity or containment matches above a threshold. Depending on\nthe query and the database, certain kinds of database indices may make\nsearch much faster, especially when only a few matches are expected.\n\nIf you are doing many searches against the same database, indexing the\ndatabase as an SBT (with `sourmash index`) or as a `SqliteIndex`/sqldb\ndatabase is likely to provide a significant speed increase, albeit\nwith increased memory usage (SBT) or increased disk space (sqldb).\n\nConversely, `ZipFileLinearIndex` and the default `LCA_Database` are likely\nto be poor choices for many searches - the former only supports linear\nsearches, and the latter needs to be loaded from disk and deserialized each\ntime.\n\n### Running `gather` once\n\n`gather` is typically used to search a metagenome against a large\ndatabase of sketches, as part of finding a minimum set cover. This can\nbe quite slow! Our current implementation (as of sourmash 4.1.0, [pull request sourmash#1370](https://github.com/sourmash-bio/sourmash/pull/1370)) does a single pass across the database to find all matches\nwith a Jaccard similarity or containment above the provided threshold, and then organizes\nthe matches for rapid min-set-cov analysis. This single pass across the\ndatabase is called a \"prefetch\", and it is also implemented in the\n`prefetch` subcommand.\n\nWith this single pass approach, benchmarks - [sourmash#2014](https://github.com/sourmash-bio/sourmash/issues/2014) - show that a\nlinearly searchable database is performant enough to be used with\n`gather`.  We therefore suggest using a `ZipFileLinearIndex` container\nwith gather, or in cases where low-memory concurrency is desired, a\n`SqliteIndex` container.\n\n### Using `prefetch` and `gather` together\n\nIf you want to use `prefetch` independently of `gather`, you can use\nthe prefetch output as a picklist passed into gather - see\n[picklists](#picklists), below.  This can be useful when you want to\nexperiment with different threshold parameters for `gather` - first,\ndo a very sensitive/low-threshold search with `prefetch` and save the\nresults to a CSV file with `-o`,\n\nRepeated gathers and searches. CTB\n\nUsing prefetch explicitly. CTB\n\n### Using a higher scaled value\n\nWith FracMinHash sketches, you can downsample the query to make both\n`search` and `gather` _much_ faster.  A good rule of thumb is to use a\nscaled value that is about 5x smaller than the minimum overlap to\ndetect; so, if you want to be able to detect 50kb of similarity, you\ncan use a scaled value of 10,000. Conversely, the default scaled value\nof 1,000 (for DNA sketches) should robustly detect overlaps of 5kb.\n\nYou can supply `--scaled` to `gather` and `prefetch` to dynamically\ndownsample the query FracMinHash. For `search` you will need to use\n`sourmash sig downsample` to generate a downsampled sketch.\n\n### Running `gather` many times - `multigather`\n\nIn situations where loading the search database is slow (e.g.\n`LCA_Database` or zipfiles with very large manifests), the `sourmash\nmultigather` command supports many queries against many databases.\n\n(We don't particularly suggest using `multigather`; we would prefer\nto make search databases faster. But it's there! :)\n\n### Much faster search and gather with branchwater\n\nWe also have a reasonably stable plugin,\n[pyo3_branchwater](https://github.com/sourmash-bio/pyo3_branchwater),\nthat implements multithreaded operations using Rust.  It is 100-1000\ntimes faster than sourmash, and 5-50 times lower memory. In exchange,\nit's not quite as flexible as the full sourmash package. But if you're\nrunning into speed or memory problems, you should give it a try!\n\n## Taxonomy and assigning lineages\n\nAll sourmash taxonomy handling is done within the `lca` and `tax`\nsubcommands (CLI) and submodules (Python).\n\nIn the case of the `lca` subcommands, the taxonomic information is\nincorporated into the LCA database construction (see the `lca index`\ncommand), while the `tax` subcommands load taxonomic information\non demand from taxonomy databases (CSVs or databases).\n\nsourmash anchors all taxonomy to identifiers, and uses the signature\nname to do so - this is the name as set by the `--name` parameter to\n`sourmash sketch`, and output by `sourmash sig describe` as the\n`signature:` field.\n\n### Identifier handling\n\nsourmash prefers identifiers to be the first space-separated token in\nthe signature name.  This token can contain any alphanumeric letters\nother than space, and should contain at most one period.  The version\nof the identifier will be the component after the period.\n\nSo, for example, for a signature name of\n\n```\nCP001941.1 Aciduliprofundum boonei T469, complete genome\n```\nthe identifier would be `CP001941.1` and the version would be 1.\nThere are no other constraints placed on the identifier, and\nversions are not handled in any special way other than as below.\n\nThe `lca index` and `tax` commands both support some modified\nidentifier handling in sourmash 3.x and 4.x, but in the future, we\nplan to deprecate these as they mostly cause confusion and internal\ncomplexity.\n\nThe two modifiers are:\n\n* `--keep-full-identifiers` will use the entire signature\nname instead of just the first space-separated token. It is by default\noff (set to False).\n\n* `--keep-identifier-versions` turns on keeping the full identifier,\nincluding what is after the first period. It is by default off (set to\nFalse), stripping identifiers of their version on load. When it is on (True), identifiers are not stripped of their version on load.\n\n### Taxonomies, or lineage spreadsheets\n\nsourmash supports arbitrary (free) taxonomies, and new taxonomic\nlineages can be created and used internally as long as they\nare provided in the appropriate spreadsheet format.\n\nYou can also mix and match taxonomies as you need; for example, it is\nentirely legitimate in sourmash-land to combine the GTDB taxonomy for\nbacterial and archaeal sequence classification, with the NCBI taxonomy\nfor eukaryotic and viral sequence classification.  (You probably don't\nwant to mix and match within superkingdoms, though!)\n\nAs of sourmash v4, lineage spreadsheets should contain columns for\nsuperkingdom, phylum, class, order, family, genus, and species.  Some\ncommands may also support a 'strain' column, although this is\ninconsistently handled within sourmash internally at the moment.\n\nFor spreadsheet organization, `lca index` expects the columns to be\npresent in order from superkingdom on down, while the `tax`\nsubcommands use CSV column headers instead.  We are planning to\nconsolidate around the `tax` subcommand handling in the future (see [sourmash#2198](https://github.com/sourmash-bio/sourmash/issues/2198)).\n\nAn example spreadsheet is\n[here, bacteria_refseq_lineage.csv](https://github.com/sourmash-bio/sourmash/blob/latest/tests/test-data/tax/bacteria_refseq_lineage.csv). (The\n`taxid` column is not used by most sourmash functions and is mostly\nignored, but it is needed for the `kreport` and `bioboxes` report\nformats.)\n\n### `LCA_SqliteDatabase` - a special case\n\nThe `LCA_SqliteDatabase` index class can serve multiple purposes: as\nan index of sketches (for regular search and gather); as a taxonomy\ndatabase for use with the `tax` subcommands; and as an LCA database\nfor use with the `lca` subcommands.\n\nWhen used as a taxonomy database, an `LCA_SqliteDatabase` file\ncontains the same SQL tables as a sqlite taxonomy database.\n\nWhen used as an LCA database, an `LCA_SqliteDatabase` dynamically loads\nthe taxonomic lineages from the sqlite database and applies them to the\nindividual hashes, permitting the same kind of hash-to-lineage query\ncapability as the `LCA_Database`.\n\n## Picklists\n\nPicklists are a generic mechanism used to select a (potentially small)\nsubset of signatures for search/display.\n\nThe general idea of picklists is that you create a list of signatures\nyou're interested in - by name, or identifier, or md5sum - and then\nsupply that list in a csvfile on the command line via `--picklist`.\nFor example, `--picklist list.csv:colname:ident` would load the\nvalues in the column named `colname` in the file `list.csv` as identifiers\nto be used to restrict the search.\n\nThe support picklist column types are `name`, `ident`\n(space-delimited identifier), `identprefix` (identifier with version\nremoved), `md5`, `md5prefix8`, and `md5short`.  Generally the `md5`\nand derived values are used to reference signatures found some other\nway with sourmash, while the identifiers are more broadly useful.\n\nThere are also four special column types that can be used without a column\nname: `gather`, `prefetch`, `search`, and `manifest`. These take the\nCSV output of the respective sourmash commands as inputs for picklists,\nso that you can use prefetch to generate a picklist and then use that\npicklist with `--picklist prefetch_out.csv.gz::prefetch`.\n\n### Differing internal behavior \n\nPicklists behave differently with different `Index` classes.\n\nFor indexed databases like SBT, LCA, and `SqliteIndex`, the search is\ndone _first_, and then only those results that match the picklist are\nselected.\n\nFor linear search databases like `ZipFileLinearIndex` or standalone\nmanifests, picklists are _first_ used to subselect the desired\nsignatures, and only those signatures are searched.\n\nThis means that picklists can dramatically speed up searches on some\n`Index` types, but won't affect performance on others. But\nthe results will be the same.\n\n### Taxonomy / lineage spreadsheets as picklists\n\nNote that lineage CSV spreadsheets, as consumed by `sourmash tax` commands\nand as output by `sourmash tax grep`, can be used as `ident` picklists.\n\n<!-- \n## ANI\n\nestimated from k-mers\n\ncontainment preferred\n\nani variability, point at issue\n\nminimum size for ani calculation\n\n-->\n\n## Online and streaming; and adding to collections of sketches.\n\nOne of the big challenges with Big Data is looking at it all at once -\nloading all your data into memory, for example, will fail with really large\ndata sets. The ability to look at subsets of data without looking at _all_\nof it is called \"streaming\" (much like when you watch a streaming\nmovie online - you can start watching the movie without downloading the\nwhole video, and you can also usually jump to a particular\nlocation in the video without downloading the intervening bits.)\n\nAnother related challenge is analyzing data against a database that is\nconstantly growing, either because you're adding to it or because it's\nbeing updated by others.  For example, in genomics, often you want to\nrepeat the same analysis you did last time but with more reference\ngenomes. With many software packages, this requires rebuilding your\nindexed database, which can be challenging for large genomes.  In\ncomputer science parlance, the ability to add new data at the end\n_without_ performing an expensive reindexing operation is referred\nto as \"online\".\n\nsourmash tackles these challenges in a few different ways, and does its\nbest to support streaming and online behavior.\n\nFirst, all sourmash commands can take multiple databases and will\nreturn the same results with multiple databases as they would with a\nsingle database containing the same sketches, unless otherwise\nnoted. This allows you to incrementally expand your sketch collections\nover time without building new databases. _Performance_ may vary\n(i.e. if you're using an SBT to do search, and you add an unindexed\ncollection of sketches to the search, the search may take longer than\nif you'd add the new sketches to the SBT) but the _results_ will be\nthe same. In this sense, many of the sourmash algorithms are online.\n\nSecond, several sourmash algorithms use _streaming_ when searching\ndatabases - in particular, `prefetch` will load and unload sketches as\nit goes, as long as the underlying collection data structure supports\nit (`.sig.gz` and LCA JSON databases do _not_, but zip files, SBTs,\nand SQLite databases _do_).  This lets you do containment searches\nagainst really large collections without consuming large amounts of\nmemory.  Another example is the `manysearch` command in the\n[pyo3_branchwater](https://github.com/sourmash-bio/pyo3_branchwater)\nplugin, which loads and searches a limited number of metagenomes from\na large collection, rather than loading the entire collection into\nmemory - which would be impossible.\n\nLast but not least, one of the interesting guarantees that FracMinHash\nsketches provide is that no hash is ever _removed_ when sketching.\nThis supports various types of input streaming, which we haven't spent\ntoo much time exploring, but (for example) means that \"watching\"\nsequencing runs and/or downloads of sequencing data, and reporting\ninterim results with certainty, is possible.  If you're interested\nin making use of this, please reach out!\n\n### Gather on multiple collections, and order of search and reporting\n\nSince `sourmash gather` will pick only one \"best match\" if there\nare several (and will ignore the others), the order of searching\ncan matter for large collections. How does this work?\n\nIn brief, sourmash doesn't guarantee a particular load order for\nsketches in a single collection, but it _does_ guarantee that\ncollections are loaded and searched in their entirety in the order\nthat you provide them.  So, for example, if you have a large zipfile\ndatabase of sketches that contains duplicates, you can't predict which\nof the duplicates will be chosen as a match; but you _can_ build your\nown collection of prioritized matches as a separate database, and put\nit first on the command line.  A practical application of this might\nbe to list the GTDB \"representatives\" database first on the command\nline, with the full GTDB database second, in order to prioritize\nchoosing representative genomes as matches over the rest.\n\nThis also plays a role in the order of reporting for `prefetch`\noutput - `prefetch` will report matching sketches in the order it\nencounters them, which will match the order in which collections are\ngiven to `sourmash prefetch` on the command line.\n\n## Formats natively understood by sourmash\n\nsourmash should always autodetect the format of a collection or\ndatabase, in most cases based on its content (and not its\nfilename). Please file a bug report if this doesn't work for you!\n\n`sourmash sig summarize` is a good way to examine the properties of a\nsignature collection.\n\n### Reading and writing gzipped CSV files\n\n(As of sourmash v4.5)\n\nWhen a CSV filename is specified (e.g. `sourmash gather ... -o\nmygather.csv`), you can always provide a name that ends with `.gz` to\nproduce a gzip-compressed file instead. This can save quite a bit of\nspace for prefetch results and manifests in particular!\n\nAll sourmash commands that take in a CSV (via manifest, or picklist,\nor taxonomy) will autodetect a gzipped CSV based on content (the file\ndoes not need to end with `.gz`). The one exception is manifests,\nwhere the CSV needs to end with `.gz` to be loaded as a gzipped CSV;\nsee\n[sourmash#2214](https://github.com/sourmash-bio/sourmash/issues/2214)\nfor an issue to fix this.\n"
  },
  {
    "path": "doc/sourmash-sketch.md",
    "content": "# `sourmash sketch` documentation\n\n```{contents} Contents\n:depth: 3\n```\n\nMost of the commands in sourmash work with **signatures**, which contain information about genomic or proteomic sequences. Each signature contains one or more **sketches**, which are compressed versions of these sequences. Using sourmash, you can search, compare, and analyze these sequences in various ways.\n\nTo create a signature with one or more sketches, you use the `sourmash sketch` command. There are three main commands:\n\n```\nsourmash sketch dna\nsourmash sketch protein\nsourmash sketch translate\nsourmash sketch fromfile\n```\n\nThe `sketch dna` command reads in **DNA sequences** and outputs **DNA sketches** (including skip-mer sketches - see [DNA encodings](#dna-encodings)).\n\nThe `sketch protein` command reads in **protein sequences** and outputs **protein sketches** (including hp and dayhoff sketches - see [protein encodings](#protein-encodings)).\n\nThe `sketch translate` command reads in **DNA sequences**, translates them in all six frames, and outputs **protein sketches**.\n\nThe `sketch fromfile` command takes in a CSV file containing the\nlocations of genomes and proteomes, and outputs all of the requested\nsketches. It is primarily intended for large-scale database construction.\n(`fromfile` is a new command as of sourmash v4.4.0.)\n\nAll `sourmash sketch` commands take FASTA or FASTQ sequences as input;\ninput data can be uncompressed, compressed with gzip, or compressed\nwith bzip2. The output will be one or more signature files that\ncan be used by other sourmash commands.\n\nFaster, multithreaded implementations of many commands are now available in sourmash plugins.\n\n[`branchwater` plugin](https://github.com/sourmash-bio/sourmash_plugin_branchwater):\n- `sourmash scripts manysketch` - multithreaded sketching of many files\n- `sourmash scripts singlesketch` - faster sketching of a single file or a set of PE files\n\n[`directsketch` plugin](https://github.com/sourmash-bio/sourmash_plugin_directsketch):\n- `sourmash scripts gbsketch` - multithreaded streaming download and sketch of GenBank Assembly datasets\n- `sourmash scripts urlsketch` - multithreaded streaming download and sketch of any URL\n\nSee the [`branchwater` documentation](https://github.com/sourmash-bio/sourmash_plugin_branchwater/tree/main/doc/) and the [`directsketch` README](https://github.com/sourmash-bio/sourmash_plugin_directsketch) for more information.\n\nNote: translated sketches are not yet supported in the `branchwater` and `directsketch` plugins.\n\n## Quickstart\n\n### DNA sketches for genomes and reads\n\nTo create a DNA sketch for a genome, run:\n```\nsourmash sketch dna genome.fna\n```\nThis will create an output file `genome.fna.sig` in the current directory, containing a single DNA signature for the entire genome, calculated using the default parameters.\n\n\nSourmash can work with unassembled reads; run\n```\nsourmash sketch dna -p k=21,k=31,k=51,abund metagenome.fq.gz\n```\nto create three abundance-weighted sketches at k=21, 31, and 51, for the given FASTQ file.\n\nBy default, `sketch dna` ignores bad k-mers (e.g. non-ACGT characters\nin DNA). If `--check-sequence` is provided, `sketch dna` will error\nexit on the first bad k-mer.\n\n### Building a combined sketch from two or more files\n\nIf you have multiple files, sourmash will by default create one sketch\nfor _each_ file.  For situations such as paired-end read files from\nIllumina sequencing, you may instead want to build a combined sketch.\n\nYou can build a combined sketch in two ways.\n\nFirst, you can use `--name/--merge` to build\na single (named) sketch out of multiple input files:\n```\nsourmash sketch dna -p k=31 sample_R1.fq.gz sample_R2.fq.gz \\\n    --name \"sample\" -o sample.zip\n```\nHere you need to specify a name because sourmash does not pick a default\nname when given multiple files; you also need to provide an output file\nname because sourmash doesn't pick a default output name in this situation.\n\nSecond, you can stream the input files into `sourmash sketch` via stdin:\n```\ngunzip -c sample_R?.fq.gz | sourmash sketch dna -p k=31 - \\\n    -o sample.zip\n```\nAs above, you need to specify an output filename because sourmash\ncan't guess a good default for streaming input.  The `--name` option\ncan still be specified if you want to name the output sketch something\nother than `-`.\n\nNote that the order of sequences or sequence files does not affect\nthe output of `sourmash sketch` at all: you do not need to\ninterleave reads or provide the input files in a consistent order.\n\n### Protein sketches for genomes and proteomes\n\nThe command:\n```\nsourmash sketch translate genome.fna\n```\nwill output a protein sketch in `./genome.fna.sig`, calculated by translating the genome sequence in all six frames and then using the default protein sketch parameters.  K-mers may include stop codons and stop codons are considered valid protein-coding sequence.\n\nAnd\n```\nsourmash sketch protein -p k=25,scaled=500 -p k=27,scaled=250 genome.faa\n```\noutputs two protein sketches to `./genome.faa.sig`, one calculated with k=25 and scaled=500, the other calculated with k=27 and scaled=250.\n\nIf you want to use different encodings, you can specify them in a few ways; here is a parameter string that specifies a dayhoff encoding for the k-mers:\n```\nsourmash sketch protein -p k=25,scaled=500,dayhoff genome.faa\n```\n\n### Translated DNA sketches for metagenomes\n\nThe command\n```\nsourmash sketch translate metagenome.fq\n```\nwill take each read in the FASTQ file and translate the read into\namino acid sequence in all six possible coding frames. No attempt is\nmade to determine the right frame (but we are working on ways to\ndetermine this; see [orpheum](https://github.com/czbiohub/orpheum)).\n\nWe suggest using this primarily on unassembled metagenome data. For\nmost microbial genomes, it is both higher quality and more efficient\nto first predict the coding sequences (using e.g. prodigal) and then\nuse `sketch protein` to build signatures.\n\n### Bulk sketch construction from many files\n\n(This was added as of sourmash v4.4.0.)\n\nThe `sourmash sketch fromfile` command is intended for use when\nbuilding many signatures as part of a larger workflow. It supports a\nvariety of options to build new signatures, parallelize\nsignature construction, and otherwise aid in tracking and managing\ndatabase construction.\n\nThe command\n```\nsourmash sketch fromfile datasets.csv -p dna -p protein -o database.zip\n```\nwill ingest a CSV spreadsheet containing (at a minimum) the three columns\n`name`, `genome_filename`, and `protein_filename`, and build all of\nthe signatures requested by the parameter strings.  Other columns in\nthis file will be ignored.\n\nIf no protein, hp, or dayhoff sketches are requested, `protein_filename`\ncan be empty for a given row; likewise, if no DNA, skipm1n3, or skipm2n3 sketches are requested,\n`genome_filename` can be empty for a given row.\n\nSome of the key command-line options supported by `fromfile` are:\n* `-o/--output-signatures` will save generated signatures to any of the [standard supported output formats](command-line.md#choosing-signature-output-formats).\n* `-o/--output-csv-info` will save a CSV file of input filenames and parameter strings for use with the `sourmash sketch` command line; this can be used to construct signatures in parallel.\n* `--already-done` will take a list of existing signatures/databases to check against; signatures with matching names and parameter strings will not be rebuilt.\n* `--output-manifest-matching` will output a manifest of already-existing signatures, which can then be used with `sourmash sig cat` to collate signatures across databases; see [using manifests](command-line.md#using-standalone-manifests-to-explicitly-refer-to-collections-of-files). (This provides [`sourmash sig check` functionality](command-line.md#sourmash-signature-check---compare-picklists-and-manifests) in `sketch fromfile`.)\n\nIf you would like help and advice on constructing large databases, or\npointers to code for generating the `fromfile` CSV format, please ask\n[on the sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues) or [gitter support channel](https://gitter.im/sourmash-bio/community).\n\n## More detailed documentation\n\n### Input formats\n\n`sourmash sketch` auto-detects and reads FASTQ or FASTA files, either uncompressed or compressed with gzip or bzip2. The filename doesn't matter; `sourmash sketch` will figure out the format from the file contents.\n\nYou can also stream any of these formats into `sourmash sketch` via stdin by using `-` as the input filename. For example,\n```\ngunzip -c data/GCF*.fna.gz | sourmash sketch dna - -o out.sig\n```\nwill make a single DNA signature from all of the FASTA sequences in\n`data/GCF*.fna.gz`.\n\nNote, for signatures calculated from stdin, the signature filename attribute\nwill be left empty, and `sourmash sig describe` will output `** no name **`.\n\n### Input contents and output signatures\n\nBy default, `sourmash sketch` will produce signatures for each input\n*file*. If the file contains multiple FASTA/FASTQ records, these\nrecords will be merged into the output signature.  You can provide a\n*list of FASTA files* in a text file to `sourmash sketch` by passing\nthe text file path in via `--from-file`.\n\nIf you specify `--singleton`, `sourmash sketch` will produce signatures for each *record*.\n\nIf you specify `--merge <name>`, sourmash sketch will produce signatures for all input files and combine them into one signature.\n\nThe output signature(s) will be saved in locations that depend on your input parameters. By default, `sourmash sketch` will put the signatures in the current directory, in a file named for the input file with a `.sig` suffix. If you specify `-o`, all of the signatures will be placed in that file.\n\n### DNA encodings\n\n`sourmash sketch dna` outputs DNA sketches (by default) or,\noptionally, skip-mer sketches of types `skipm1n3` and\n`skipm2n3`. Skip-mers allow more mismatches and hence are more\nsensitive across evolutionary distances.\n\n`skipm1n3` keeps 1 base, and skips 2 bases; `skipm2n3` keeps 2 bases,\nand skips 1 base. The ksize specified is the sum of the bases kept,\nthat is, the final size of the k-mer that is sketched. So, for ksize\n3, the sequence ACTAG would produce two skip-mers for m2n3: ACA, CTG.\n\nSkip-mer references:\n- [Skip-mers: increasing entropy and sensitivity to detect conserved genic regions with simple cyclic q-grams](https://www.biorxiv.org/content/10.1101/179960.abstract)\n- [Extracting and Evaluating Features from RNA Virus Sequences to Predict Host Species Susceptibility Using Deep Learning](https://dl.acm.org/doi/abs/10.1145/3473258.3473271)\n\n### Protein encodings\n\n`sourmash sketch protein` and `sourmash sketch translate` output protein sketches by default, but can also use the `dayhoff` and `hp` encodings.  The [Dayhoff encoding](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-367/tables/1) collapses multiple amino acids into a smaller alphabet so that amino acids that share biochemical properties map to the same character. The hp encoding divides amino acids into hydrophobic and polar (hydrophilic) amino acids, collapsing amino acids with hydrophobic side chains together and doing the same for polar amino acids.\n\nWe are still in the process of benchmarking these encodings; ask [on the issue tracker](https://github.com/sourmash-bio/sourmash/issues) if you are interested in updates.\n\nNote that stop characters (`*`) are considered valid in all three\nencodings, and are not truncated. For example, amino acid sequences\nthat contain stop characters at the end will produce a k-mer containing\nthe stop character, and that k-mer will be hashed and potentially included\nin the sketch.\n\n### Parameter strings\n\nThe `-p` argument to `sourmash sketch` provides parameter strings to sourmash, and these control what signatures and sketches are calculated and output. Zero or more parameter strings can be given to sourmash. Each parameter string produces at least one sketch.\n\nA parameter string is a space-delimited collection that can contain one or more fields, comma-separated.\n* `k=<ksize>` - create a sketch at this k-mer size; can provide more than one time in a parameter string. Typically `ksize` is between 4 and 100.\n* `scaled=<int>` - create a scaled MinHash with k-mers sampled deterministically at 1 per `<scaled>` value. This controls sketch compression rates and resolution; for example, a 5 Mbp genome sketched with a scaled of 1000 would yield approximately 5,000 k-mers. `scaled` is incompatible with `num`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-and-how-should-i-create-them) for more information.\n* `num=<int>` - create a standard MinHash with no more than `<num>` k-mers kept. This will produce sketches identical to [mash sketches](https://mash.readthedocs.io/en/latest/). `num` is incompatible with `scaled`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-and-how-should-i-create-them) for more information.\n* `abund` / `noabund` - create abundance-weighted (or not) sketches. See [Classify signatures: Abundance Weighting](classifying-signatures.md#abundance-weighting) for details of how this works.\n* `dna`, `protein`, `dayhoff`, `hp`, `skipm1n3`, `skipm2n3` - create this kind of sketch. Note that `sourmash sketch dna -p protein` and `sourmash sketch protein -p dna` are invalid; please use `sourmash sketch translate` for the former.\n* `seed=<int>` - set the random number seed used for k-mer hashing. This is for advanced users who want to choose a completely different set of k-mers for sketches! The default is 42.\n\nFor all field names but `k`, if multiple fields in a parameter string are provided, the last one encountered overrides the previous values. For `k`, if multiple ksizes are specified in a single parameter string, sketches for all ksizes specified are created.\n\nIf a field isn't specified, then the default value for that sketch type is used; so, for example, `sourmash sketch dna -p abund` would calculate a sketch with `k=31,scaled=1000,abund`. See below for the defaults.\n\n### Default parameters\n\nThe default parameters for sketches are as follows:\n\n* dna: `k=31,scaled=1000,noabund`\n* protein: `k=10,scaled=200,noabund`\n* dayhoff: `k=16,scaled=200,noabund`\n* hp: `k=42,scaled=200,noabund`\n* skipm1n3: `k=21,scaled=1000,noabund`\n* skipm2n3: `k=21,scaled=1000,noabund`\n\nThese were chosen by a committee of PhDs as being good defaults for an initial analysis, so, beware :).\n\nMore seriously, the DNA parameters were chosen based on the analyses done by Koslicki and Falush in [MetaPalette: a k-mer Painting Approach for Metagenomic Taxonomic Profiling and Quantification of Novel Strain Variation](https://msystems.asm.org/content/1/3/e00020-16).\n\nThe protein, dayhoff, hp, skipm1n3, and skipm2n3 parameters were selected based on unpublished research results and/or magic formulas. We are working on publishing the results! Please ask on the [issue tracker](https://github.com/sourmash-bio/sourmash/issues) if you are curious.\n\n### More complex parameter string examples\n\nBelow are some more complicated `sourmash sketch` command lines:\n\n* `sourmash sketch dna -p k=51` - default to a scaled=1000 and noabund for a k-mer size of 51 (based on moltype/command)\n* `sourmash sketch dna -p k=31,k=51,k=21` - create one signature with multiple ksizes, using the defaults otherwise\n* `sourmash sketch translate -p k=20,num=500,protein -p k=19,num=400,dayhoff,abund -p k=30,scaled=200,hp` - create three signatures with different ksizes, moltypes, and scaled/num.\n\n### Signature naming\n\nSignature names are displayed in the output for search, gather, and\ncompare, and can be specified in a few different ways.\n\nWith default arguments, `sourmash sketch` does not set a name, and the\nfilename is used in display output.\n\nYou can set a name using `--name`, but this has the side effect of\nmerging the sequence records before signature creation. So, for example,\n`sourmash sketch dna genome1.fa genome2.fa --name genome1 -o\ngenome.sig` would produce one signature after combining `genome1.fa`\nand `genome2.fa`.\n\nThe option `--name-from-first` will set the signature name from the\nfirst record header encountered in each file.  When used with `--singleton`,\nthis will name each signature based on the record that it is created from.\n\nYou can examine the signature name using `sourmash sig describe`.\n\nIndividual signature renaming can be done from the command line using\n`sourmash sig split` to create individual files for each signature,\nand then `sourmash sig rename`.\n\n### Locations for output files\n\nSignature files can contain multiple signatures and sketches. Use\n`sourmash sig fileinfo` to summarize the contents of a signature file,\nand `sourmash sig describe` to get details on the contents of a file.\n\nYou can use `-o <filename>` to specify a file output location for all the output signatures; `-o -` means stdout. This does not merge signatures unless `--merge` is provided.\n\nSpecify `--outdir` to put all the signatures in a specific directory.\n\n### Output file formats\n\nSourmash can read and write signatures in many different formats, and\n`sourmash sketch ... -o <filename>` supports all of the standard\noutput formats. Our recommendation is to output to zip files -\ne.g. `filename.zip` - as this is the smallest and most flexible\nsignature storage format.\n\nPlease see\n[Choosing signature output formats](command-line.md#choosing-signature-output-formats) for more details.\n\n### Downsampling and flattening signatures\n\nCreating signatures is probably the most time consuming part of using sourmash, and it is the only part that requires access to the raw data. Moreover, the output signatures are generally much smaller than the input data. So, we generally suggest creating a large set of signatures once.\n\nTo support this, sourmash can do two kinds of signature conversion without going back to the raw data.\n\nFirst, you can downsample `num` and `scaled` signatures using `sourmash sig downsample`.  For any sketch created with `num` parameter, you can decrease that `num`. And, for any `scaled` parameter, you can increase the `scaled`. This will decrease the size of the sketch accordingly; for example, going from a `num` of 5000 to a `num` of 1000 will decrease the sketch size by a factor of 5, and going from a `scaled` of 1000 to a `scaled` of 10000 will decrease the sketch size by a factor of 10.\n\n(Note that decreasing `num` or increasing `scaled` will increase calculation speed and lower the accuracy of your results.)\n\nSecond, you can flatten abundances using `sourmash sig flatten`. For any sketch created with `abund`, you can convert it to a `noabund` sketch.  This will decrease the sketch size, although not necessarily by a lot.\n\nUnfortunately, changing the k-mer size or using different DNA/protein encodings cannot be done on a sketch, and you need to create new signatures from the raw data for that.\n\n### Examining the output of `sourmash sketch`\n\nYou can use `sourmash sig describe` to get detailed information about the contents of a signature file, and `sourmash sig fileinfo` to get a human-readable summary of the contents. This can help if you want to see exactly what a particular `sourmash sketch` command does!\n\n### Filing issues and asking for help\n\nWe try to provide good documentation and error messages, but may not succeed in answer all your questions! So we're happy to help out!\n\nPlease post questions [on the sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues). If you find something confusing or buggy about the documentation or about sourmash, we'd love to fix it -- for you *and* for everyone else!\n"
  },
  {
    "path": "doc/storage.md",
    "content": "# Storing SBTs\n\nWe support different storage options for the internal SBT data.\n\n\n## Available storages\n\n### FSStorage\n\nThe initial storage schema.\nSaves internal SBT data in a hidden directory near the SBT JSON description.\n- Pros: easy to create\n- Cons: annoying to distribute (thousands of files).\n        We used to create a tar file of JSON + hidden directory,\n        which requires extracting and using more disk space.\n\n### ZipStorage\n\nSimilar to FSStorage,\nbut saves the internal SBT data in a `zip` file.\n- Pros\n  * easy to distribute (one file)\n- Cons\n  * still need to distribute and download everything\n    (you need the full zip file available locally to be able to use the SBT).\n\n### IPFSStorage\n\nUses IPFS to store internal SBT data,\nallowing partial database download.\n- Pros\n  * easy to distribute (one file, the SBT JSON description)\n  * only data needed for analysis is downloaded\n  * benefits from more people storing the data in their computers and sharing bandwidth\n- Cons:\n  * needs IPFS daemon running in the computer\n  * takes longer to run if data is not prefetched\n\n### RedisStorage\n\nMeant to be a fast in-memory storage.\nThere won't be a public Redis server to provide the internal SBT data,\nbut this storage is a good option for loading data from others sources and sharing\nwith other processes or servers in your private network.\n- Pros\n  * Shareable between processes or servers in a network\n  * Faster access time than reading from disk (probably?)\n- Cons\n  * No public server for the data (need to convert from other sources)\n\n## Converting an existing tree to use a new storage\n\nYou can convert SBTs to another storage using the `sourmash storage convert` command:\n``` bash\n$ sourmash storage convert -b new_storage_type database.sbt.json\n```\n\nFor example: to convert a tree to IPFSStorage, do\n``` bash\n$ sourmash storage convert -b ipfs database.sbt.json\n```\n"
  },
  {
    "path": "doc/support.md",
    "content": "# Support, Versioning, and Migration\n\n```{contents}\n   :depth: 3\n```\n\n## Asking questions and filing bugs\n\nWe do our best to support sourmash users! Users have found important\nbugs, and some of our best features have come from user\nrequests. Please help us improve sourmash for everyone by asking\nquestions as you have them!\n\nPlease ask questions and file bug descriptions [on the GitHub issue tracker for sourmash, sourmash-bio/sourmash/issues][0].\n\nYou can also ask questions of Titus on Bluesky at [@titus.idyll.org][1].\n\n[0]:https://github.com/sourmash-bio/sourmash/issues\n[1]:https://bsky.app/profile/titus.idyll.org\n\n## Versioning and stability of features and APIs\n\nWe do our best to guarantee stability of features and APIs within\nmajor versions - because of this, upgrading from (e.g.) sourmash v4.0 to\nsourmash v4.9 should be a simple matter of installing the new version.\n\nWe also recommend using _version pinning_ for software and workflows\nthat depend on sourmash, e.g. specifying `sourmash >=3,<4` for\nsoftware that is tested with sourmash 3.x. Read on for details!\n\nUpgrading major versions (to sourmash 4.0, for example) will often involve\nmore work; see the [next section](#upgrading-major-versions) for more\nour suggested process.\n\n### Semantic versioning\n\nOur goal is to support the use of sourmash in pipelines and\napplications by communicating clearly about bug fixes, feature\nadditions, and feature changes in sourmash.  Versions are tagged in a\n`vMAJOR.MINOR.PATCH` format, following the [Semantic Versioning]\nconvention.  From their definition:\n\n\"Given a version number MAJOR.MINOR.PATCH, increment the:\n\n* MAJOR version when you make incompatible API changes,\n* MINOR version when you add functionality in a backwards compatible manner, and\n* PATCH version when you make backwards compatible bug fixes.\"\n\nSo, for example,\n\n* Major releases, like v4.0.0, may break backwards compatibility at\n  the command line as well as top-level Python/Rust APIs.\n* Minor releases, like v4.1.0, will remain backwards compatible but\n  may introduce significant new features.\n* Patch releases, like v4.1.1, are for minor bug fixes; full backwards\n  compatibility is retained.\n\nWe do sometimes (rarely!) alter behavior in minor versions by fixing\nbugs; this will be documented in release notes.\n\n### Version pinning\n\nFor software and workflows that depend on sourmash, we recommend\npinning versions to the current _major_ release of sourmash.\n\nFor example, with Python toolchains such as pip, you should be able to use:\n\n```\nsourmash>=3,<4\n```\nto pin the version requirement to any sourmash v3.x release.\n\nFor conda, the same syntax should work.\n\n### Command line stability\n\nWe intend that all command-line commands, command-line options, input\nformats, and output formats will be fully backwards compatible within\nmajor versions. That is, you should never see old behavior change when\nyou upgrade within a major sourmash release (barring bug fixes!). Moreover,\nif you rely on a feature introduced in v3.3.0, that feature will not break\nin v3.4.0, but will also not be backported to version 3.2.0.\n\n### Output file formats\n\nIn particular, the CSV output file formats are guaranteed to be stable\nwithin major versions, with one caveat: we may add or rearrange\ncolumns between releases.  You should use column headers/column names\nto parse CSV files, and not depend on column order.\n\n### Python API\n\nWe intend to guarantee the Python API at the top level, i.e.\nfunctions and classes available from the `sourmash` top-level module\nwill be stable within major versions.\n\nThe latest minor release (e.g. v3.5) before a new major release (v4.0)\nwill contain deprecations for all top-level API changes at the time of\nthe first major release.  See below for our suggested migration\nprocedure.\n\n### Python version support\n\nsourmash v3.x supports Python 2.7 as well as Python 3.x, through Python 3.8.\n\nsourmash v4.0 dropped support for versions of Python before Python 3.7,\nand our intent is that it will support as-yet unreleased versions of Python 3.x\n(e.g. 3.14) moving forward.\n\nFor future versions of sourmash, we plan to follow the\n[Scientific Python SPEC 0](https://scientific-python.org/specs/spec-0000/)\nproposal for Python version support. For example, this\nmeans that we dropped support for Python 3.9 on October 10,\n2023.\n\n### Rust API\n\nThe Rust API is not yet at 1.0 and should not be regarded as stable.\n\n## Upgrading major versions\n\nIf you depend on sourmash, we recommend using the following process:\n\n* pin sourmash to the major version you developed against, e.g. `sourmash >=3,<4`.\n* when ready to upgrade sourmash, upgrade to the latest minor release within that major version (e.g. sourmash 3.5.x).\n* scan for deprecations that affect you, check [the release notes](https://github.com/sourmash-bio/sourmash/releases), \nand fix any major issues noted.\n* upgrade to the next major version (e.g. sourmash 4.0) and run your integration tests or workflow.\n* fix outstanding issues.\n\nIn particular, we recommend upgrading major versions of sourmash in\nisolation, without adding any new features to your software.\n\n### Migrating from sourmash v4.x to sourmash v5.x\n\nsourmash v5 is not yet out, but we have begun to make v5 breaking\nchanges.  We are doing this using `--v5` command line flags that\nsupport the switch to v5 behavior. Until sourmash v5 is released, no\nbreaking changes will be introduced into the default behavior of\nsourmash.\n\nTo experiment with the new v5 behavior in v4.9.4 and above, specify\n`--v5` for any of the changed commands below. If you want to retain\n`--v4` behavior (and cause errors when v5.0 is released) specify\n`--v4` instead.\n\nA full list of breaking changes can be found in the\n[draft release notes for 5.0](release-notes/sourmash-5.0.md), which\nwill be kept up to date with the changes as they are made.\n\n### Sourmash command line changes for 5.0\n\nIf you use sourmash from the command line, there are a few major\nchanges in 5.0 that you should know about.\n\n`tax` subcommands:\n* several `tax metagenome` output formats will produce different results: in particular, the `lineage_summary` and `krona` formats now use abundances, and `tax metagenome` requires abundance-weighted gather results. You can use `--ignore-abund` to recover the v4 behavior. See [#3711](https://github.com/sourmash-bio/sourmash/pull/3711) for details.\n* the default output format for `tax metagenome` is now `human`, instead of `csv_summary`. You can use `-F human` to recover the v4 behavior. ([#3711](https://github.com/sourmash-bio/sourmash/pull/3711))\n\n`sig` subcommands:\n* `sig manifest` now defaults to `--no-rebuild-manifest` - see [#3074](https://github.com/sourmash-bio/sourmash/pull/3074).\n* `sig check` and `sig collect` now default to `--relpath` - see [#3071](https://github.com/sourmash-bio/sourmash/issues/3071).\n\nPlease post questions and concerns to the\n[sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues)\nand we'll be happy to help!\n\n## Appendix: Migration guide for v4\n\nsourmash v4.0.0 was released on Mar 2, 2021. This migration guide is\nleft here for posterity :).\n\n### Migrating from sourmash v3.x to sourmash v4.x.\n\nIf you want to upgrade workflows and scripts from prior releases of\nsourmash to sourmash v4.0, we suggest doing this in two stages.\n\nFirst, upgrade to the latest version of sourmash 3.5.x (currently\n[v3.5.1](https://github.com/sourmash-bio/sourmash/releases/tag/v3.5.1)),\nwhich is compatible with all files and command lines used in previous\nversions of sourmash (v2.x and v3.x). After upgrading to 3.5.x, scan\nthe sourmash output for deprecation warnings and fix those.\n\nNext, upgrade to the latest version of 4.x, which will introduce some\nbackwards incompatibilities based upon the deprecation warnings.\n\nPlease see the\n[full release notes for 4.0](release-notes/sourmash-4.0.md) for all\nthe details and links to the code changes.\n\n### Sourmash command line\n\nIf you use sourmash from the command line, there are a few major changes in 4.0 that you should know about.\n\nFirst, **`sourmash compute` is deprecated in favor of [`sourmash sketch`](sourmash-sketch.md)**, which provides quite a bit more flexibility in creating signatures.\n\nSecond, **`sourmash index` will now save databases in the Zip format (`.sbt.zip`) instead of the old JSON+subdirectory format** (see [updated docs](command-line.md#sourmash-index---build-an-index-of-signatures)). You can revert to the old behavior by explicitly specifying the `.sbt.json` filename for output when running `sourmash index`.\n\nThird, all sourmash commands that operate on signatures should now be able to directly read from lists of signatures in signature files, SBT databases, LCA databases, directories, and files containing lists of filenames (see [updated docs](command-line.md#advanced-command-line-usage)).\n\nFourth, if you use `sourmash lca` commands, **`sourmash lca gather` has been removed**. In addition, there are some **changes in how `summarize` works**: it now uses abundances by default, and no longer combines all signatures before summarizing. Specify `--ignore-abundance` and combine your signatures using `sourmash sig merge` to recover the old behavior. Note also that `lca summarize` now includes a new column, `filename`, in the CSV output.\n\nFinally, **k-mer sizes have changed for amino acid sequences** in v4. If you use protein, Dayhoff, or HP signatures, we now interpret k-mer sizes differently on the command line. Briefly, k-mer sizes for protein/dayhoff/hp signatures are now the size of the k-mer in amino acid space, *not* the space of the k-mer in DNA space (as previously used). In practice this means that you need to divide all your old k-mer sizes by 3 when working with k-mers in amino acid space!\n\nNote also that while `sourmash compute` still behaves the same way in v4.x as it did in sourmash 3.5.x, `sourmash sketch translate` and `sourmash sketch protein` both use the *new* approach to amino acid k-mer sizes, as do all of the the command line options for searching, manipulation, and display. Again, in practice this means that you need to divide all your old k-mer sizes by 3 if they apply to amino acid k-mers.\n\nThere are several minor changes where error messages should occur appropriately:\n* `--traverse-directory` is no longer needed on the command line for `sourmash index` or other functions; directory traversal happens automatically.\n* the command lines for `sourmash index` and `sourmash lca index` no longer require signature files to be specified, which can break existing command lines. To fix this, reorder arguments so that any signatures are specified at the end of the command line.\n\n### Python API\n\nFirst, all k-mer sizes for `protein`, `dayhoff`, and `hp` signatures have changed in the Python layer to be \"correct\", i.e., to be the size of the protein k-mer. Previously they were 3\\*k, i.e. based on the size of the DNA k-mer from which the protein sequence would have been created.\n\nSecond, the `MinHash` class API has changed significantly!\n* `get_mins()` has been deprecated in favor of `.hashes`, which is a dictionary that contains abundances.\n* `merge` now just modifies `MinHash` objects in-place, and no longer returns the merged object; use `__iadd__` (`+=`) for the old behavior, or `__add__` (`+`) to create a new merged object.\n* `max_hash` has been deprecated in favor of `scaled`.\n* instead of `downsample_scaled(s)` use `downsample(scaled=s)`\n* instead of `downsample_n(m)` use `downsample(num=m)`\n* `is_molecule_type` has been replaced with a property, `moltype` -- instead of `is_molecule_type(t)` use `moltype == t`.\n\n\nThird, `SourmashSignature` objects no longer have a `name()` method but instead a `name` property, which can be assigned to. This property is now `None` when no name has been assigned. Note that `str(sig)` should now be used to retrieve a display name, and should replace all previous uses of `sig.name()`.\n\nFourth, a few top-level functions have been deprecated: `load_signatures(...)`, `load_one_signature(...)`, `create_sbt_index(...)`, and `load_sbt_index(...)`.\n* `load_signatures(...)`, `load_one_signature(...)` should be replaced with `load_file_as_signatures(...)`. Note there is currently no top-level way to load signatures from strings. For now, if you need that functionality, you can use `sourmash.signature.load_signatures(...)` and `sourmash.signature.load_one_signature(...)`, but please be aware that these are not considered part of the public API that is under semantic versioning, so they may change in the next minor point release; this is tracked in  https://github.com/sourmash-bio/sourmash/issues/1312.\n* `load_sbt_index(...)` have been deprecated.  Please use `load_file_as_index(...)` instead.\n* `create_sbt_index(...)` has been deprecated. There is currently no replacement, although you can use it directly from `sourmash.sbtmh` if necessary.\n\nFifth, directory traversal now happens by default when loading signatures, so remove `traverse=True` arguments to several functions in `sourmash_args` - `load_dbs_and_sigs`, `load_file_as_index`, `and load_file_as_signatures`.\n\nPlease post questions and concerns to the\n[sourmash issue tracker](https://github.com/sourmash-bio/sourmash/issues)\nand we'll be happy to help!\n"
  },
  {
    "path": "doc/toc.md",
    "content": "# Full table of contents\n\n```{toctree}\n---\nmaxdepth: 2\n---\n\napi-example.md\napi.md\ncite.md\nclassifying-signatures.md\ncommand-line.md\ndatabases-advanced.md\ndatabases.md\ndev_plugins.md\ndeveloper.md\nfaq.md\nfunding.md\nindex.md\nkmers-and-minhash.ipynb\nlegacy-databases.md\nmore-info.md\nother-languages.md\nplotting-compare.ipynb\npublications.md\nrelease.md\nrequirements.md\nsourmash-collections.ipynb\nsourmash-examples.ipynb\nsourmash-internals.md\nsourmash-sketch.md\nstorage.md\nsupport.md\nhowto-rocksdb.md\ntutorial-install.md\ntutorial-basic.md\ntutorial-lemonade.md\ntutorial-lin-taxonomy.md\ntutorial-long.md\ntutorials-lca.md\ntutorials.md\nusing-LCA-database-API.ipynb\nusing-sourmash-a-guide.md\n```\n"
  },
  {
    "path": "doc/tutorial-basic.md",
    "content": "# The first sourmash tutorial - making signatures, comparing, and searching\n\nYou'll need about 5 GB of free disk space, and about 5 GB of RAM to\nsearch GenBank.  The tutorial should take about 20 minutes total to\nrun. In fact, we have successfully tested it on\n[binder.pangeo.io](https://binder.pangeo.io/v2/gh/binder-examples/r-conda/master?urlpath=urlpath%3Drstudio)\nif you want to give it a try!\n\n## Install sourmash\n\nYou'll need to [install sourmash](tutorial-install.md) first!\n\n## Generate a signature for Illumina reads\n\nDownload some reads and a reference genome:\n\n```\nmkdir ~/data\ncd ~/data\ncurl -L https://osf.io/ruanf/download -o ecoliMG1655.fa.gz\ncurl -L https://osf.io/q472x/download -o ecoli_ref-5m.fastq.gz\n```\n\nCompute a scaled signature from our reads:\n\n```\nmkdir ~/sourmash\ncd ~/sourmash\n\nsourmash sketch dna -p scaled=10000,k=31 ~/data/ecoli_ref*.fastq.gz -o ecoli-reads.sig\n```\n\n## Compare reads to assemblies\n\nUse case: how much of the read content is contained in the reference genome?\n\nBuild a signature for an E. coli genome:\n\n```\nsourmash sketch dna -p scaled=1000,k=31 ~/data/ecoliMG1655.fa.gz -o ecoli-genome.sig\n```\n\nand now evaluate *containment*, that is, what fraction of the read content is\ncontained in the genome:\n\n```\nsourmash search ecoli-reads.sig ecoli-genome.sig --containment\n```\n\nand you should see:\n\n```\n\nselect query k=31 automatically.\nloaded query: /home/jovyan/data/ecoli_ref-5m... (k=31, DNA)\nloaded 1 signatures.\n\n1 matches:\nsimilarity   match\n----------   -----\n 31.0%       /home/jovyan/data/ecoliMG1655.fa.gz\n```\n\n\nTry the reverse, too!\n\n```\nsourmash search ecoli-genome.sig ecoli-reads.sig --containment\n```\n\n## Make and search a database quickly.\n\nSuppose that we have a collection of signatures (made with `sourmash\ncompute` as above) and we want to search it with our newly assembled\ngenome (or the reads, even!). How would we do that?\n\nLet's grab a sample collection of 50 E. coli genomes and unpack it --\n\n```\nmkdir ecoli_many_sigs\ncd ecoli_many_sigs\n\ncurl -O -L https://github.com/sourmash-bio/sourmash/raw/latest/data/eschericia-sigs.tar.gz\n\ntar xzf eschericia-sigs.tar.gz\nrm eschericia-sigs.tar.gz\n\ncd ../\n\n```\n\nThis will produce 50 files named `ecoli-N.sig` in the directory `ecoli_many_sigs/` --\n\n```\nls ecoli_many_sigs\n```\n\nLet's turn this into an easily-searchable database with `sourmash index` --\n\n```\nsourmash index ecolidb ecoli_many_sigs/*.sig\n```\n\nand now we can search!\n\n```\nsourmash search ecoli-genome.sig ecolidb.sbt.zip -n 20\n```\n\nYou should see output like this:\n\n```\nselect query k=31 automatically.\nloaded query: /home/ubuntu/data/ecoliMG1655.... (k=31, DNA)\nloaded 0 signatures and 1 databases total.                                     \n\n49 matches; showing first 20:\nsimilarity   match\n----------   -----\n 75.9%       NZ_JMGW01000001.1 Escherichia coli 1-176-05_S4_C2 e117605...\n 73.0%       NZ_JHRU01000001.1 Escherichia coli strain 100854 100854_1...\n 71.9%       NZ_GG774190.1 Escherichia coli MS 196-1 Scfld2538, whole ...\n 70.5%       NZ_JMGU01000001.1 Escherichia coli 2-011-08_S3_C2 e201108...\n 69.8%       NZ_JH659569.1 Escherichia coli M919 supercont2.1, whole g...\n 59.9%       NZ_JNLZ01000001.1 Escherichia coli 3-105-05_S1_C1 e310505...\n 58.3%       NZ_JHDG01000001.1 Escherichia coli 1-176-05_S3_C1 e117605...\n 56.5%       NZ_MIWF01000001.1 Escherichia coli strain AF7759-1 contig...\n 56.1%       NZ_MOJK01000001.1 Escherichia coli strain 469 Cleandata-B...\n 56.1%       NZ_MOGK01000001.1 Escherichia coli strain 676 BN4_676_1_(...\n 50.5%       NZ_KE700241.1 Escherichia coli HVH 147 (4-5893887) acYxy-...\n 50.3%       NZ_APWY01000001.1 Escherichia coli 178200 gec178200.conti...\n 48.8%       NZ_LVOV01000001.1 Escherichia coli strain swine72 swine72...\n 48.8%       NZ_MIWP01000001.1 Escherichia coli strain K6412 contig_00...\n 48.7%       NZ_AIGC01000068.1 Escherichia coli DEC7C gecDEC7C.contig....\n 48.2%       NZ_LQWB01000001.1 Escherichia coli strain GN03624 GCID_EC...\n 48.0%       NZ_CCQJ01000001.1 Escherichia coli strain E. coli, whole ...\n 47.3%       NZ_JHMG01000001.1 Escherichia coli O121:H19 str. 2010EL10...\n 47.2%       NZ_JHGJ01000001.1 Escherichia coli O45:H2 str. 2009C-4780...\n 46.5%       NZ_JHHE01000001.1 Escherichia coli O103:H2 str. 2009C-327...\n\n```\n\n## Compare many signatures and build a tree.\n\nCompare all the things:\n\n```\nsourmash compare ecoli_many_sigs/* -o ecoli_cmp\n```\n\nOptionally, parallelize to 8 threads using `-p 8`:\n\n```\nsourmash compare -p 8 ecoli_many_sigs/* -o ecoli_cmp\n```\n\nand then plot:\n\n```\nsourmash plot --pdf --labels ecoli_cmp\n```\n\nwhich will produce files named `ecoli_cmp.matrix.pdf` and\n`ecoli_cmp.dendro.pdf`.\n\nHere's a PNG version:\n\n![E. coli comparison plot](_static/ecoli_cmp.matrix.png)\n\n## What's in my metagenome?\n\nDownload a database containing all of the GenBank microbial genomes:\n```\ncurl -L -o genbank-k31.lca.json.gz https://osf.io/4f8n3/download\n```\n\nNext, run the 'gather' command to see what's in your ecoli genome --\n```\nsourmash gather ecoli-genome.sig genbank-k31.lca.json.gz\n```\n\nand you should get:\n\n```\nloaded query: /home/diblions/data/ecoliMG165... (k=31, DNA)\nloading from genbank-k31.lca.json.gz...\nloaded 1 databases.\n\n\noverlap     p_query p_match\n---------   ------- -------\n4.9 Mbp      100.0%  100.0%    LRDF01000001.1 Escherichia coli strai...\n\nfound 1 matches total;\nthe recovered matches hit 100.0% of the query\n```\n\nIn this case, the output is kind of boring because this is a single\ngenome.  But! You can use this on metagenomes (assembled and\nunassembled) as well; you've just got to make the signature files.\n\nTo see this in action, here is gather running on a signature generated\nfrom some sequences that assemble (but don't align to known genomes)\nfrom the\n[Shakya et al. 2013 mock metagenome paper.][2]\n\n```\nwget https://github.com/sourmash-bio/sourmash/raw/latest/doc/_static/shakya-unaligned-contigs.sig\nsourmash gather -k 31 shakya-unaligned-contigs.sig genbank-k31.lca.json.gz\n```\n\nThis should yield:\n```\nloaded query: mqc500.QC.AMBIGUOUS.99.unalign... (k=31, DNA)\nloaded 1 databases.\n\n\noverlap     p_query p_match\n---------   ------- -------\n1.4 Mbp       11.0%   58.0%    JANA01000001.1 Fusobacterium sp. OBRC...\n1.0 Mbp        7.7%   25.9%    CP001957.1 Haloferax volcanii DS2 pla...\n0.9 Mbp        7.4%   11.8%    BA000019.2 Nostoc sp. PCC 7120 DNA, c...\n0.7 Mbp        5.9%   23.0%    FOVK01000036.1 Proteiniclasticum rumi...\n0.7 Mbp        5.3%   17.6%    AE017285.1 Desulfovibrio vulgaris sub...\n0.6 Mbp        4.9%   11.1%    CP001252.1 Shewanella baltica OS223, ...\n0.6 Mbp        4.8%   27.3%    AP008226.1 Thermus thermophilus HB8 g...\n0.6 Mbp        4.4%   11.2%    CP000031.2 Ruegeria pomeroyi DSS-3, c...\n480.0 kbp      3.8%    7.6%    CP000875.1 Herpetosiphon aurantiacus ...\n410.0 kbp      3.3%   10.5%    CH959317.1 Sulfitobacter sp. NAS-14.1...\n1.4 Mbp        2.2%   11.8%    LN831027.1 Fusobacterium nucleatum su...\n0.5 Mbp        2.1%    5.3%    CP000753.1 Shewanella baltica OS185, ...\n420.0 kbp      1.9%    7.7%    FNDZ01000023.1 Proteiniclasticum rumi...\n150.0 kbp      1.2%    4.6%    AE000513.1 Deinococcus radiodurans R1...\n150.0 kbp      1.2%    8.2%    CP000969.1 Thermotoga sp. RQ2, comple...\n290.0 kbp      1.1%    4.1%    CH959311.1 Sulfitobacter sp. EE-36 sc...\n1.2 Mbp        1.0%    5.0%    CP013328.1 Fusobacterium nucleatum su...\n110.0 kbp      0.9%    3.7%    FRDZ01000215.1 Enterococcus faecalis ...\n0.6 Mbp        0.8%    2.8%    CP000527.1 Desulfovibrio vulgaris DP4...\n70.0 kbp       0.6%    1.2%    CP000850.1 Salinispora arenicola CNS-...\n340.0 kbp      0.6%    3.3%    KQ235732.1 Fusobacterium nucleatum su...\n60.0 kbp       0.5%    0.7%    CP000270.1 Burkholderia xenovorans LB...\n50.0 kbp       0.4%    2.6%    CP001080.1 Sulfurihydrogenibium sp. Y...\n50.0 kbp       0.4%    3.2%    L77117.1 Methanocaldococcus jannaschi...\nfound less than 40.0 kbp in common. => exiting\n\nfound 24 matches total;\nthe recovered matches hit 73.1% of the query\n\n```\n\nIf you use the `-o` flag, gather will write out a csv that contains additional information. The column headers and their meanings are:  \n\n+ `intersect_bp`: the approximate number of base pairs in common between the query and the match  \n+ `f_orig_query`: fraction of original query; the fraction of the original query that is contained within the match  \n+ `f_match`: fraction of match; the fraction of the match that is contained within the query  \n+ `f_unique_to_query`: fraction unique to query; the fraction of the query that uniquely overlaps with the match  \n+ `f_unique_weighted`: fraction unique to query weighted by abundance; fraction unique to query, weighted by abundance in the query     \n\nIt is straightforward to build your own databases for use with `search`\nand `gather`; see `sourmash index`, above, [the LCA tutorial][4], or\n[our notebook on working with private collections of signatures][5].\n\n[Return to index][3]\n\n[0]:http://ivory.idyll.org/blog/2016-sourmash-sbt-more.html\n[1]:databases.md\n[2]:https://pubmed.ncbi.nlm.nih.gov/23387867/\n[3]:index.md\n[4]:tutorials-lca.md\n[5]:sourmash-collections.ipynb\n"
  },
  {
    "path": "doc/tutorial-install.md",
    "content": "# Installing sourmash\n\nThis tutorial should run without modification on Linux or Mac OS X,\nunder [Miniforge](https://github.com/conda-forge/miniforge).\n\nYou'll need about 5 GB of free disk space.\n\n## Install miniforge\n\nIf you don't have the `mamba` command installed, you'll need to install\n[miniforge](https://github.com/conda-forge/miniforge#install).\n\nOn Linux, this should work:\n```\ncurl -L -O \"https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh\"\nbash Miniforge3-$(uname)-$(uname -m).sh -b\n\n~/miniforge3/bin/mamba init\n\necho 'source ~/.bashrc' > ~/.bash_profile\nsource ~/.bash_profile\n```\notherwise, follow the instructions [here](https://github.com/conda-forge/miniforge#install).\n\n## Install sourmash\n\nTo install sourmash, create a new environment named `smash` and install sourmash:\n\n```\nmamba create -y -n smash sourmash-minimal\n```\n\nand then activate:\n```\nconda activate smash\n```\n\nYou should now be able to use the `sourmash` command:\n\n```\nsourmash info\n```\n\nVoila!\n"
  },
  {
    "path": "doc/tutorial-lemonade.md",
    "content": "# Analyzing the genomic and taxonomic composition of an environmental genome using GTDB and sample-specific MAGs with sourmash\n\nC. Titus Brown, Taylor Reiter, and Tessa Pierce Ward\n\nJuly 2022\n\nBased on a tutorial developed for MBL STAMPS 2022.\n\nYou'll need 5 GB of disk space and 5 GB of RAM in order to run this tutorial.\nIt will take about 30 minutes of compute time to execute all the commands.\n\n---\n\n```{contents}\n   :depth: 2\n```\n\nIn this tutorial, we'll use sourmash to analyze the composition of a metagenome, both genomically and taxonomically. We'll also use sourmash to classify some MAGs and integrate them into our analysis.\n\n## Install sourmash\n\nFirst, we need to install the software! We'll use conda/mamba to do this.\n\nThe below command installs [sourmash](http://sourmash.readthedocs.io/) and [GNU parallel](https://www.gnu.org/software/parallel/).\n\nRun:\n```\n# create a new environment\nmamba create -n smash -y -c conda-forge -c bioconda sourmash parallel\n```\nto install the software, and then run\n\n```\nconda activate smash\n```\nto activate the conda environment so you can run the software.\n\n```{note}\nVictory conditions: your prompt should start with\n`(smash)  `\nand you should now be able to run `sourmash` and have it output usage information!!\n```\n\n## Create a working subdirectory\n\nMake a directory named `kmers` and change into it.\n\n```\nmkdir ~/kmers\ncd ~/kmers\n```\n\n## Download a database and a taxonomy spreadsheet.\n\nWe're going to start by doing a reference-based _compositional analysis_ of the lemonade metagenome from [Taylor Reiter's STAMPS 2022 tutorial on assembly and binning](https://github.com/mblstamps/stamps2022/blob/main/assembly_and_binning/tutorial_assembly_and_binning.md).\n\nFor this purpose, we're going to need a database of known genomes. We'll use the GTDB genomic representatives database, containing ~65,000 genomes - that's because it's smaller than the full GTDB database (~320,000) or Genbank (~1.3m), and hence faster. But you can download and use those on your own, if you like!\n\nYou can find the link to a prepared GTDB RS207 database for k=31 on the [the sourmash prepared databases page](https://sourmash.readthedocs.io/en/latest/databases.html). Let's download it to the current directory:\n\n```\ncurl -JLO https://osf.io/3a6gn/download\n```\n\nThis will create a 1.7 GB file:\n```\nls -lh gtdb-rs207.genomic-reps.dna.k31.zip\n```\nand you can examine the contents with sourmash `sig summarize`:\n```\nsourmash sig summarize gtdb-rs207.genomic-reps.dna.k31.zip\n```\n\nwhich will show you:\n```\n>path filetype: ZipFileLinearIndex\n>location: /home/stamps2022/kmers/gtdb-rs207.genomic-reps.dna.k31.zip\n>is database? yes\n>has manifest? yes\n>num signatures: 65703\n>** examining manifest...\n>total hashes: 212454591\n>summary of sketches:\n>   65703 sketches with DNA, k=31, scaled=1000, abund  212454591 total hashes\n```\n\nThere's a lot of things to digest in this output but the two main ones are:\n* there are 65,703 genome sketches in this database, for a k-mer size of 31\n* this database represents 212 *billion* k-mers (multiply number of hashes by the scaled number)\n\nIf you want to read more about what, exactly, sourmash is doing, please see [Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2), Irber et al., 2022.\n\nWe also want to download the accompanying taxonomy spreadsheet:\n```\ncurl -JLO https://osf.io/v3zmg/download\n```\n\nand uncompress it:\n```\ngunzip gtdb-rs207.taxonomy.csv.gz\n```\n\nThis spreadsheet contains information connecting Genbank genome identifiers to the GTDB taxonomy - take a look:\n```\nhead -2 gtdb-rs207.taxonomy.csv\n```\nwill show you:\n```\n>ident,superkingdom,phylum,class,order,family,genus,species\n>GCF_000566285.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli\n```\n\nLet's index the taxonomy database using SQLite, for faster access later on:\n```\nsourmash tax prepare -t gtdb-rs207.taxonomy.csv \\\n    -o gtdb-rs207.taxonomy.sqldb -F sql\n```\nThis creates a file `gtdb-rs207.taxonomy.sqldb` that contains all the information in the CSV file, but which is faster to load than the CSV file.\n\n## Download and prepare sample reads\n\nNext, let's download one of the metagenomes from [the assembly and binning tutorial](https://github.com/mblstamps/stamps2022/blob/main/assembly_and_binning/tutorial_assembly_and_binning.md#retrieving-the-data).\n\nWe'll use sample SRR8859675 for today, and you can view sample info [here](https://www.ebi.ac.uk/ena/browser/view/SRR8859675?show=reads) on the ENA.\n\nTo download the metagenome from the ENA, run:\n```\nwget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR885/005/SRR8859675/SRR8859675_1.fastq.gz\nwget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR885/005/SRR8859675/SRR8859675_2.fastq.gz\n```\n\nNow we're going to prepare the metagenome for use with sourmash by converting it into a _signature file_ containing _sketches_ of the k-mers in the metagenome. This is the step that \"shreds\" all of the reads into k-mers of size 31, and then does further data reduction by [sketching](https://en.wikipedia.org/wiki/Streaming_algorithm) the resulting k-mers.\n\nTo build a signature file, we run `sourmash sketch dna` like so:\n```\nsourmash sketch dna -p k=31,abund SRR8859675*.gz \\\n    -o SRR8859675.sig.gz --name SRR8859675\n```\nHere we're telling sourmash to sketch at k=31, and to track k-mer multiplicity (with 'abund'). We sketch _both_ metagenome files together into a single signature named `SRR8859675` and stored in the file `SRR8859675.sig.gz`.\n\nWhen we run this, we should see:\n\n>`calculated 1 signature for 3452142 sequences taken from 2 files`\n\nwhich tells you how many reads there are in these two files!\n\nIf you look at the resulting files,\n```\nls -lh SRR8859675*\n```\nyou'll see that the signature file is _much_ smaller (2.5mb) than the metagenome files (~600mb). This is because of the way sourmash uses a reduced representation of the data, and it's what makes sourmash fast. Please see the paper above for more info!\n\nAlso note that the GTDB prepared database we downloaded above was built using the same `sourmash sketch dna` command, but applied to 65,000 genomes and stored in a zip file.\n\n## Find matching genomes with `sourmash gather`\n\nAt last, we have the ingredients we need to analyze the metagenome against GTDB!\n* the software is installed\n* the GTDB database is downloaded\n* the metagenome is downloaded and sketched\n\nNow, we'll run the [sourmash gather](https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-gather-find-metagenome-members) command to find matching genomes.\n\nRun gather - this will take ~6 minutes:\n```\nsourmash gather SRR8859675.sig.gz gtdb-rs207.genomic-reps.dna.k31.zip --save-matches matches.zip\n```\nHere we are saving the matching genome sketches to `matches.zip` so we can rerun the analysis if we like.\n\nThe results will look like this:\n```\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n2.0 Mbp        0.4%   31.8%       1.3    GCF_004138165.1 Candidatus Chloroploc...\n1.9 Mbp        0.5%   66.9%       2.1    GCF_900101955.1 Desulfuromonas thioph...\n0.6 Mbp        0.3%   23.3%       3.2    GCA_016938795.1 Chromatiaceae bacteri...\n0.6 Mbp        0.5%   27.3%       6.6    GCA_016931495.1 Chlorobiaceae bacteri...\n...\nfound 22 matches total;\nthe recovered matches hit 5.3% of the abundance-weighted query\n```\nIn this output:\n* the last column is the name of the matching GTDB genome\n* the first column is the estimated overlap between the metagenome and that genome, in base pairs (estimated from shared k-mers)\n* the second column, `p_query` is the percentage of metagenome k-mers (weighted by multiplicity) that match to the genome; this will approximate the percentage of _metagenome reads_ that will map to this genome, if you map.\n* the third column, `p_match`, is the percentage of the genome k-mers that are matched by the metagenome; this will approximate the percentage of _genome bases_ that will be covered by mapped reads;\n* the fourth column is the estimated mean abundance of this genome in the metagenome.\n\nThe other interesting number is here:\n>`the recovered matches hit 5.3% of the abundance-weighted query`\n\nwhich tells you that you should expect about 5.3% of the metagenome reads to map to these 22 reference genomes.\n\n```{note}\nYou can try running gather without abundance weighting:\n\n`sourmash gather SRR8859675.sig.gz matches.zip --ignore-abundance`\n\nHow does the output differ?\n\nThe main number that changes bigly is:\n>`the recovered matches hit 2.4% of the query (unweighted)`\n\nwhich represents the proportion of _unique_ kmers in the metagenome that are not found in any genome.\n\nThis is (approximately) the following number:\n* suppose you assembled the entire metagenome perfectly into perfect contigs (**note, this is impossible, although you can get close with \"unitigs\"**);\n* and then matched all the genomes to the contigs;\n* approximately 2.4% of the bases in the contigs would have genomes that match to them.\n\nInterestingly, this is the _only_ number in this entire tutorial that is essentially impossible to estimate any way other than with k-mers.\n\nThis number is also a big underestimate of the \"true\" number for the metagenome - we'll explain more later :)\n```\n\n## Build a taxonomic summary of the metagenome\n\nWe can use these matching genomes to build a taxonomic summary of the metagenome using [sourmash tax metagenome](https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-subcommands-for-integrating-taxonomic-information-into-gather-results) like so:\n\n```\n# rerun gather, save the results to a CSV\nsourmash gather SRR8859675.sig.gz matches.zip -o SRR8859675.x.gtdb.csv\n\n# use tax metagenome to classify the metagenome\nsourmash tax metagenome -g SRR8859675.x.gtdb.csv \\\n    -t gtdb-rs207.taxonomy.sqldb -F human -r order\n```\nthis shows you the rank, taxonomic lineage, and weighted fraction of the metagenome at the 'order' rank.\n\nAt the bottom, we have a script to plot the resulting taxonomy using [metacoder](https://grunwaldlab.github.io/metacoder_documentation/) - here's what it looks like:\n\n![metacoder output](https://raw.githubusercontent.com/mblstamps/stamps2022/main/kmers_and_sourmash/metacoder_gather.png)\n\n## Interlude: why reference-based analyses are problematic for environmental metagenomes\n\nReference-based metagenome classification is highly dependent on the organisms present in our reference databases.\nFor well-studied environments, such as human-associated microbiomes, your classification percentage is likely to be quite high.\nIn contrast, this is an environmental metagenome, and you can see that we're estimating only 5.3% of it will map to GTDB reference genomes!\n\nWow, that's **terrible**! Our taxonomic and/or functional analysis will be based on only 1/20th of the data!\n\nWhat could we do to improve that?? There are two basic options -\n\n(1) Use a more complete reference database, like the entire GTDB, or Genbank. This will only get you so far, unfortunately. (See exercises at end.)\n(2) Assemble and bin the metagenome to produce new reference genomes!\n\nThere are other things you could think about doing here, too, but these are probably the \"easiest\" options. And what's super cool is that we did the second one as part of [Taylor Reiter's STAMPS 2022 tutorial on assembly and binning](https://github.com/mblstamps/stamps2022/blob/main/assembly_and_binning/tutorial_assembly_and_binning.md). So can we include that in the analysis??\n\nYes, yes we can! We can integrate the three MAGs that Taylor generated during her tutorial into the sourmash analysis.\n\nWe'll need to:\n\n* download the three genomes;\n* sketch them with k=31;\n* re-run sourmash gather with both GTDB _and_ the MAGs.\n\nLet's do it!!\n\n## Update gather with information from MAGs\n\nFirst, download the MAGs:\n\n```\n# Download 3 MAGs generated by ATLAS\ncurl -JLO https://osf.io/fejps/download\ncurl -JLO https://osf.io/jf65t/download\ncurl -JLO https://osf.io/2a4nk/download\n```\nThis will produce three files, `MAG*.fasta`.\n\nNow sketch them:\n```\nsourmash sketch dna MAG*.fasta --name-from-first\n```\nhere, `--name-from-first` is a convenient way to give them distinguishing names based on the name of the first contig in the FASTA file; you can see the names of the signatures by doing:\n```\nsourmash sig describe MAG1.fasta.sig\n```\n\nNow, let's re-do the metagenome classification with the MAGs:\n```\nsourmash gather SRR8859675.sig.gz MAG*.sig matches.zip -o SRR8859675.x.gtdb+MAGS.csv\n```\n\nand look, we classify a lot more!\n```\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n2.3 Mbp       12.1%   99.9%      39.4    MAG2_1\n2.2 Mbp       26.5%   99.9%      92.4    MAG3_1\n2.0 Mbp        0.4%   31.8%       1.3    GCF_004138165.1 Candidatus Chloroploc...\n1.9 Mbp        0.5%   66.9%       2.1    GCF_900101955.1 Desulfuromonas thioph...\n1.0 Mbp        2.7%  100.0%      20.3    MAG1_1\n0.6 Mbp        0.3%   23.2%       3.1    GCA_016938795.1 Chromatiaceae bacteri...\n0.6 Mbp        0.1%   24.5%       2.1    GCA_016931495.1 Chlorobiaceae bacteri...\n...\nfound 24 matches total;\nthe recovered matches hit 43.5% of the abundance-weighted query\n```\n\nHere we see a few interesting things -\n\n(1) The three MAG matches are all ~100% present in the metagenome.\n(2) They are all at high abundance in the metagenome, because assembly needs genomes to be ~5x or more in abundance in order to work!\n(3) Because they're at high abundance and 100% present, they account for _a lot_ of the metagenome!\n\nWhat's the remaining 50%? There are several answers -\n\n(1) most of the constitutent genomes aren't in the reference database;\n(2) not everything in the metagenome is high enough coverage to bin into MAGs;\n(3) not everything in the metagenome is bacterial or archaeal, and we didn't do viral or eukaryotic binning;\n(4) some of what's in the metagenome k-mers may simply be erroneous (although with abundance weighting, this is likely to be a small chunk of things)\n\n## Classify the taxonomy of the MAGs; update metagenome classification\n\nNow we can also classify the genomes and update the taxonomic summary of the metagenome!\n\nFirst, classify the genomes using GTDB; this will use trace overlaps between contigs in the MAGs and GTDB genomes to tentatively identify the _entire_ bin.\n```\nfor i in MAG*.fasta.sig\ndo\n    # get 'MAG' prefix. => NAME\n    NAME=$(basename $i .fasta.sig)\n    # search against GTDB\n    echo sourmash gather $i gtdb-rs207.genomic-reps.dna.k31.zip \\\n        --threshold-bp=5000 \\\n        -o ${NAME}.x.gtdb.csv\ndone | parallel\n```\n(This will take about a minute.)\n\nHere, we're using a for loop and [GNU parallel](https://www.gnu.org/software/parallel/) to classify the three genomes in parallel.\n\nIf you scan the results quickly, you'll see that one MAG has matches in genus Prosthecochloris, another MAG has matches to Chlorobaculum, and one has matches to Candidatus Moranbacteria.\n\nLet's classify them \"officially\" using sourmash and an average nucleotide identity threshold of 0.8 -\n```\nsourmash tax genome -g MAG*.x.gtdb.csv \\\n    -t gtdb-rs207.taxonomy.sqldb -F human \\\n    --ani 0.8 \n```\nThis is an extremely liberal ANI threshold, incidentally; in reality you'd probably want to do something more stringent, as at least one of these is probably a new species.\n\nYou should see:\n```\n>sample name    proportion   lineage\n>-----------    ----------   -------\n>MAG3_1             5.3%     d__Bacteria;p__Bacteroidota;c__Chlorobia;o__Chlorobiales;f__Chlorobiaceae;g__Prosthecochloris;s__Prosthecochloris vibrioformis\n>MAG2_1             5.0%     d__Bacteria;p__Bacteroidota;c__Chlorobia;o__Chlorobiales;f__Chlorobiaceae;g__Chlorobaculum;s__Chlorobaculum parvum_B\n>MAG1_1             1.1%     d__Bacteria;p__Patescibacteria;c__Paceibacteria;o__Moranbacterales;f__UBA1568;g__JAAXTX01;s__JAAXTX01 sp013334245\n```\nThe proportion here is the fraction of k-mers in the MAG that are annotated.\n\nNow let's turn this into a lineage spreadsheet:\n```\nsourmash tax genome -g MAG*.x.gtdb.csv \\\n    -t gtdb-rs207.taxonomy.sqldb -F lineage_csv \\\n    --ani 0.8 -o MAGs\n```\nThis will produce a file `MAGs.lineage.csv`; let's take a look:\n```\ncat MAGs.lineage.csv\n```\nYou should see:\n```\n>ident,superkingdom,phylum,class,order,family,genus,species\n>MAG1_1,d__Bacteria,p__Patescibacteria,c__Paceibacteria,o__Moranbacterales,f__UBA1\n568,g__JAAXTX01,s__JAAXTX01 sp013334245\n>MAG2_1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,\ng__Chlorobaculum,s__Chlorobaculum parvum_B\n>MAG3_1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,\ng__Prosthecochloris,s__Prosthecochloris vibrioformis\n```\n\nAnd if we re-classify the metagenome using the combined information, we see:\n```\nsourmash tax metagenome -g SRR8859675.x.gtdb+MAGS.csv \\\n    -t gtdb-rs207.taxonomy.sqldb MAGs.lineage.csv \\\n    -F human -r order\n```\nNow only 56.5% remains unclassified, which is much better than before!\n\n## Interlude: where we are and what we've done so far\n\nTo recap, we've done the following:\n* analyzed a metagenome's composition against 65,000 GTDB genomes, using 31-mers;\n* found that a disappointingly small fraction of the metagenome can be identified this way.\n* incorporated MAGs built from the metagenome into this analysis, bumping up the classification rate to ~45%;\n* added taxonomic output to both sets of analyses.\n\nATLAS only bins bacterial and archaeal genomes, so we wouldn't expect much in the way of viral or eukaryotic genomes to be binned.\n\nBut... how much even _assembles_?\n\nLet's pick a few of the matching genomes out from GTDB and evaluate how many of the k-mers from that genome match to the unassembled metagenome, and then how many of them match to the assembled contigs.\n\nFirst, download the contigs:\n```\ncurl -JLO https://osf.io/jfuhy/download\n```\nthis produces a file `SRR8859675_contigs.fasta`.\n\nSketch the contigs into a sourmash signature -\n```\nsourmash sketch dna SRR8859675_contigs.fasta --name-from-first\n```\n\nNow, extract one of the top gather matches to use as a query; this is \"Chromatiaceae bacterium\":\n```\nsourmash sig cat matches.zip --include GCA_016938795.1 -o GCA_016938795.sig\n```\n\n### Evaluate containment of known genomes in reads vs assembly\n\n```{note}\nIf you want to just start here, you can download the files needed for the below sourmash searches from [this link](https://github.com/mblstamps/stamps2022/raw/main/kmers_and_sourmash/assembly-loss-files.zip).\n```\n\nNow do a containment search of this genome against both the unassembled metagenome and the assembled (but unbinned) contigs -\n```\nsourmash search --containment GCA_016938795.sig \\\n    SRR8859675*.sig* --threshold=0 --ignore-abund\n```\nWe see:\n```\nsimilarity   match\n----------   -----\n 23.3%       SRR8859675\n  4.7%       SRR8859675_0\n```\nwhere the first match (at 23.3% containment) is to the metagenome. (You'll note this matches the % in the gather output, too.)\n\nThe second match is to the assembled contigs, and it's 4.7%. That means ~19% of the k-mers that match to this GTDB genome are present in the unassembled metagenome, but are lost during the assembly process.\n\nWhy? \n\nSome thoughts and answers\n\nIt _could_ be that the GTDB genome is full of errors, and those errors are shared with the metagenome, and assembly is squashing those errors. Yay!\n\nBut this is extremely unlikely... This GTDB genome was built and validated entirely independently from this sample...\n\nIt's much more likely (IMO) that one of two things is happening:\n\n(1) this sample is at low abundance in the metagenome, and assembly can only recover parts of it.\n(2) this sample contains _several_ strain variants of this genome, and assembly is squashing the strain variation, because that's what assembly does.\n\nNote, you can try the above with another one of the top gather matches and you'll see it's *entirely* lost in the process of assembly -\n```\nsourmash sig cat matches.zip --include GCF_004138165.1 -o GCF_004138165.sig\nsourmash search --containment GCF_004138165.sig \\\n    SRR8859675*.sig* \\\n    --ignore-abund --threshold=0\n```\n\n## Summary and concluding thoughts\n\nAbove, we demonstrated a _reference-based_ analysis of shotgun metagenome data using sourmash.\n\nWe then _updated our references_ using the MAGs produced from assembly and binning tutorial, which increased our classification rate substantially.\n\nLast but not least, we looked at the loss of k-mer information due to metagenome assembly.\n\nAll of these results were based on 31-mer overlap and containment - k-mers FTW!\n\nA few points:\n\n* We would have gotten slightly different results using k=21 or k=51; more of the metagenome would have been classified with k=21, while the classification results would have been more closely specific to genomes with k=51;\n* sourmash is a nice one-stop-shop tool for doing this, but you could have gotten similar results by using other tools.\n* Next steps here could include mapping reads to the genomes we found, and/or doing functional analysis on the matching genes and genomes.\n"
  },
  {
    "path": "doc/tutorial-lin-taxonomy.md",
    "content": "# Analyzing Metagenome Composition using the LIN taxonomic framework  \n\nTessa Pierce Ward\n\nMarch 2023\n\nrequires sourmash v4.8+\n\n---\n\n```{contents}\n   :depth: 2\n```\n\nThis tutorial uses the `sourmash taxonomy` module, which was introduced via [blog post](https://bluegenes.github.io/sourmash-tax/)\nand was recently shown to perfom well for taxonomic profiling of long (and short) reads in [Evaluation of taxonomic classification and profiling methods for long-read shotgun metagenomic sequencing datasets](https://link.springer.com/article/10.1186/s12859-022-05103-0), Portik et al., 2022.\n\n\nIn this tutorial, we'll use sourmash gather to analyze metagenomes using the [LIN taxonomic framework](https://dl.acm.org/doi/pdf/10.1145/3535508.3545546).\nSpecifically, we will analyze plant metagenomes with a low-level pathogen spike-in.\nThe goal is to see if we can correctly assign the pathogen sequence to its LINgroup, which includes\nall known pathogenic strains.\n\n- `barcode1` - highest spike-in (75 picogram/microliter pathogen DNA)\n- `barcode3` - lower spike-in (7.5 picogram/microliter pathogen DNA)\n- `barcode5` - no spike-in\n\nThe pathogen is `Ralstonia solanacearum` in the `Phylum IIB sequevar 1` group. \n\nThis data is courtesy of [The Laboratory of Plant & Atmospheric Microbiology & (Meta)Genomics](https://sites.google.com/vt.edu/lab-vinatzer/home) in collaboration with USDA APHIS.\n\n## Install sourmash\n\nFirst, we need to install the software! We'll use conda/mamba to do this.\n\nThe below command installs [sourmash](http://sourmash.readthedocs.io/).\n\nInstall the software:\n```\n# create a new environment\nmamba create -n smash -y -c conda-forge -c bioconda sourmash\n```\n\nthen activate the conda environment:\n```\nconda activate smash\n```\n\n> Victory conditions: your prompt should start with\n> `(smash) `\n> and you should now be able to run `sourmash` and have it output usage information!!\n\n## Create a working subdirectory\n\nMake a directory named `smash_lin`, change into it:\n```\nmkdir -p ~/smash_lin\ncd ~/smash_lin\n```\n\nNow make a couple useful folders:\n```\nmkdir -p inputs\nmkdir -p databases\n```\n\n## Download relevant data\n\n### First, download a database and taxonomic information\n\nHere, we know the spike-in is a pathogenic seqevar of Ralstonia. We will download a database\ncontaining signatures of 27 Ralstonia genomes (pathogenic and not) and the corresponding taxonomic and lingroup information.\n\n```\n# database\ncurl -JLO https://osf.io/vxsta/download\nmv ralstonia*.zip ./databases/ralstonia.zip\n\n# taxonomy csv\ncurl -JLO https://raw.githubusercontent.com/bluegenes/2023-demo-sourmash-LIN/main/databases/ralstonia-lin.taxonomy.GCA-GCF.csv\nmv ralstonia-lin.taxonomy.GCA-GCF.csv ./databases\n\n# lingroup csv\ncurl -JLO https://raw.githubusercontent.com/bluegenes/2023-demo-sourmash-LIN/main/inputs/ralstonia.lingroups.csv\nmv ralstonia.lingroups.csv ./databases\n\nls databases # look at the database files\n```\n\n### Next, download pre-made sourmash signatures made from the input metagenomes\n\n```\n# download barcode 1 sig\ncurl -JLO https://osf.io/ujntr/download\nmv barcode1_22142.sig.zip ./inputs/\n\n# download barcode 3 signature\ncurl -JLO https://osf.io/2h9wx/download\nmv barcode3_31543.sig.zip ./inputs\n\n# download barcode 5 signature\ncurl -JLO https://osf.io/k8nw5/download\nmv barcode5_36481.sig.zip ./inputs\n\n# look at available input files\nls inputs\n```\n\n## Look at the signatures\n\nLet's start with the `barcode1` (highest spike-in) sample\n\n### First, let's look at the metagenome signature.\n\nBy running `sourmash sig fileinfo`, we can see information on the signatures available within the zip file.\n\nHere, you can see I've generated the metagenome signature with `scaled=1000` and built two ksizes, `k=31` and `k=51`\n\nRun:\n```\nsourmash sig fileinfo ./inputs/barcode1_22142.sig.zip\n```\n\nIn the output, you should see:\n```\n** loading from './inputs/barcode1_22142.sig.zip'\npath filetype: ZipFileLinearIndex\nlocation: /home/jovyan/smash_lin/inputs/barcode1_22142.sig.zip\nis database? yes\nhas manifest? yes\nnum signatures: 2\ntotal hashes: 914328\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000, abund      426673 total hashes\n   1 sketches with DNA, k=51, scaled=1000, abund      487655 total hashes\n```\n\n### We can also look at the database\n\nHere, you can see I've generated the database with `scaled=1000` and built three ksizes, `k=21`, `k=31` and `k=51`\n\nRun:\n```\nsourmash sig fileinfo ./databases/ralstonia.zip\n```\n\nIn the output, you should see:\n\n```\n** loading from './databases/ralstonia.zip'\npath filetype: ZipFileLinearIndex\nlocation: /home/jovyan/databases/ralstonia.zip\nis database? yes\nhas manifest? yes\nnum signatures: 81\n** examining manifest...\ntotal hashes: 445041\nsummary of sketches:\n   27 sketches with DNA, k=21, scaled=1000, abund     148324 total hashes\n   27 sketches with DNA, k=31, scaled=1000, abund     148111 total hashes\n   27 sketches with DNA, k=51, scaled=1000, abund     148606 total hashes\n```\nThere's a lot of things to digest in this output but the two main ones are:\n* there are 27 genomes represented in this database, each of which are sketched at k=21,k=31,k=51\n* this database represents ~445 *million* k-mers (multiply number of hashes by the scaled number)\n\n\n## Run sourmash gather using ksize 51\n\nNow let's run `sourmash gather` to find the closest reference genome(s) in the database.\nIf you want to read more about what sourmash is doing, please see [Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers](https://www.biorxiv.org/content/10.1101/2022.01.11.475838v2), Irber et al., 2022.\n\nRun:\n```\nquery=\"inputs/barcode1_22142.sig.zip\"\ndatabase=\"databases/ralstonia.zip\"\n\ngather_csv_output=\"barcode1_22141.k51.gather.csv\"\n\nsourmash gather $query $database -k 51 -o $gather_csv_output\n```\n\nYou should see the following output:\n```\nselecting specified query k=51\nloaded query: barcode1_22142... (k=51, DNA)\n--ading from 'databases/ralstonia.zip'...\nloaded 81 total signatures from 1 locations.\nafter selecting signatures compatible with search, 27 remain.\nStarting prefetch sweep across databases.\n\nFound 7 signatures via prefetch; now doing gather.\n\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n105.0 kbp      0.0%    2.0%       1.0    GCA_002251655.1 Ralstonia solanacear...\nfound less than 50.0 kbp in common. => exiting\n\nfound 1 matches total;\nthe recovered matches hit 0.0% of the abundance-weighted query.\nthe recovered matches hit 0.0% of the query k-mers (unweighted).\n```\n\nThe first step of gather found all potential matches (7), and the greedy algorithm narrowed this to a single best match, `GCA_002251655.1` which shared an estimated 105 kbp with the metagenome (a very small percentage of the total dataset.) This is expected, though, since the dataset is a plant metagenome with a small `Ralstonia` spike-in.\n\n## Add taxonomic information and summarize up lingroups\n\n`sourmash gather` finds the smallest set of reference genomes that contains all the known information (k-mers) in the metagenome. In most cases, `gather` will find many metagenome matches. Here, we're only looking for `Ralstonia` matches and we only have a single gather result. Regardless, let's use `sourmash tax metagenome` to add taxonomic information and see if we've correctly assigned the pathogenic sequence.\n\n### First, let's look at the relevant taxonomy files.\n\nThese commands will show the first few lines of each file. If you prefer, you can look at a more human-friendly view by opening the files in a spreadsheet program.\n\n- **taxonomy_csv:** `databases/ralstonia-lin.taxonomy.GCA-GCF.csv`\n  - the essential columns are `lin` (`14;1;0;...`) and `ident` (`GCF_00`...)\n- **lingroups information:** `databases/ralstonia.lingroups.csv`\n  - both columns are essential (`name`, `lin`)\n\n\nLook at the taxonomy file:\n```\nhead -n 5 databases/ralstonia-lin.taxonomy.GCA-GCF.csv\n```\n\nYou should see:\n```\nlin,species,strain,filename,accession,ident\n14;1;0;0;0;0;0;0;0;0;6;0;1;0;1;0;0;0;0;0,Ralstonia solanacearum,OE1_1,GCF_001879565.1_ASM187956v1_genomic.fna,GCF_001879565.1,GCF_001879565.1\n14;1;0;0;0;0;0;0;0;0;6;0;1;0;0;0;0;0;0;0,Ralstonia solanacearum,PSS1308,GCF_001870805.1_ASM187080v1_genomic.fna,GCF_001870805.1,GCF_001870805.1\n14;1;0;0;0;0;0;0;0;0;2;1;0;0;0;0;0;0;0;0,Ralstonia solanacearum,FJAT_1458,GCF_001887535.1_ASM188753v1_genomic.fna,GCF_001887535.1,GCF_001887535.1\n14;1;0;0;0;0;0;0;0;0;2;0;0;4;4;0;0;0;0;0,Ralstonia solanacearum,Pe_13,GCF_012062595.1_ASM1206259v1_genomic.fna,GCF_012062595.1,GCF_012062595.1\n```\n> The key columns are:\n> - `ident`, containing identifiers matching the database sketches\n> - `lin`, containing the species information.\n\nNow, let's look at the lingroups file\n```\nhead -n5 databases/ralstonia.lingroups.csv\n```\n\nYou should see:\n```\nname,lin\nPhyl II,14;1;0;0;0;3;0\nPhyl IIA,14;1;0;0;0;3;0;1;0;0\nPhyl IIB,14;1;0;0;0;3;0;0\nPhyl IIB seq1 and seq2,14;1;0;0;0;3;0;0;0;0;1;0;0;0;0\n```\n> Here, we have two columns:\n> - `name` - the name for each lingroup. \n> - `lin` - the LIN prefix corresponding to each group.\n\n\n### Now, run `sourmash tax metagenome` to integrate taxonomic information into `gather` results\n\nUsing the `gather` output we generated above, we can integrate taxonomic information and summarize up \"ranks\" (lin positions). We can produce several different types of outputs, including a `lingroup` report.\n\n`lingroup` format summarizes the taxonomic information at each `lingroup`, and produces a report with 4 columns: \n- `name` (from lingroups file)\n- `lin` (from lingroups file)\n- `percent_containment` - total % of the file matched to this lingroup\n- `num_bp_contained` - estimated number of bp matched to this lingroup\n\n> Since sourmash assigns all k-mers to individual genomes, no reads/base pairs are \"assigned\" to higher taxonomic ranks or lingroups (as with Kraken-style LCA). Here, \"percent_containment\" and \"num_bp_contained\" is calculated by summarizing the assignments made to all genomes in a lingroup. This is akin to the \"contained\" information in Kraken-style reports.\n\nRun `tax metagenome`:\n```\ngather_csv_output=\"barcode1_22141.k51.gather.csv\"\ntaxonomy_csv=\"databases/ralstonia-lin.taxonomy.GCA-GCF.csv\"\nlingroups_csv=\"databases/ralstonia.lingroups.csv\"\n\nsourmash tax metagenome -g $gather_csv_output -t $taxonomy_csv \\\n                        --lins --lingroup $lingroups_csv\n```\n\nYou should see:\n```\nloaded 1 gather results from 'barcode1_22141.k51.gather.csv'.\nloaded results for 1 queries from 1 gather CSVs\nStarting summarization up rank(s): 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 \nRead 11 lingroup rows and found 11 distinct lingroup prefixes.\n```\n\nand the results:\n```\nname\tlin\tpercent_containment\tnum_bp_contained\nPhyl II\t14;1;0;0;0;3;0\t0.02\t108000\nPhyl IIB\t14;1;0;0;0;3;0;0\t0.02\t108000\nPhyl IIB seq1 and seq2\t14;1;0;0;0;3;0;0;0;0;1;0;0;0;0\t0.02\t108000\nIIB seq1\t14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0\t0.02\t108000\n```\n\nHere, the most specific lingroup we assign to is `Phyl IIB seq1`, which is the pathogenic lingroup that was spiked in, yay! Note that the other groups in the output all contain this group.\n\n\n#### Now output the lingroup report to a file (instead of to the terminal)\n\nuse `-o` to provide an output basename for taxonomic output.\n\n```\ngather_csv_output=\"barcode1_22141.k51.gather.csv\"\ntaxonomy_csv=\"databases/ralstonia-lin.taxonomy.GCA-GCF.csv\"\nlingroups_csv=\"databases/ralstonia.lingroups.csv\"\n\nsourmash tax metagenome -g $gather_csv_output -t $taxonomy_csv \\\n                        --lins --lingroup $lingroups_csv \\\n                        -o \"barcode1\"\n```\n\n> You should see `saving 'lingroup' output to 'barcode1.lingroup.tsv'` in the output.\n\n#### Optionally, write multiple output formats\n\nYou can use `-F` to specify additional output formats. Here, I've added `csv_summary`. Note that while the `lingroup` format will be generated automatically if you specify the `--lingroup` file, you can also specify it with `-F lingroup` if you want, as I've done here.\n\nRun:\n```\ngather_csv_output=\"barcode1_22141.k51.gather.csv\"\ntaxonomy_csv=\"databases/ralstonia-lin.taxonomy.GCA-GCF.csv\"\nlingroups_csv=\"databases/ralstonia.lingroups.csv\"\n\nsourmash tax metagenome -g $gather_csv_output -t $taxonomy_csv \\\n                        --lins --lingroup $lingroups_csv \\\n                        -F lingroup csv_summary -o \"barcode1\"\n```\n\n\nYou should see the following in the output:\n\n```\nsaving 'csv_summary' output to 'barcode1.summarized.csv'.\nsaving 'lingroup' output to 'barcode1.lingroup.txt'.\n```\n\nThe `csv_summary` format is the **full** summary of this sample, e.g. the summary at each taxonomic rank (LIN position). It also includes an entry with the `unclassified` portion at each rank.\n\n> Note: Multiple output formats require the `-o` `--output-base` to be specified, as each must be written to a file.\n\nHere's an abbreviated version of the `gather` results for  `barcode1`, with lingroup information added:\n\n|         | **ksize** | **scaled** | **best overlap** | **gather match(es)** | **lingroup** | **lin**                            |\n| ------- | --------- | ---------- | ---------------- | -------------------- | ------------ | ---------------------------------- |\n| **bc1** | 51        | 1000       | 105 kb           | GCA_002251655.1      | IIB seq1     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0 |\n| **bc1** | 31        | 1000       | 173 kb           | GCA_002251655.1      | IIB seq1     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0 |\n\n\n### Now run with `barcode3` sample\n\n#### sourmash gather\nRun:\n```\nquery=\"inputs/barcode3_31543.sig.zip\"\ndatabase=\"databases/ralstonia.zip\"\n\ngather_csv_output=\"barcode3_31543.dna.k51.gather.csv\"\n\nsourmash gather $query $database -k 51 -o $gather_csv_output\n```\n\nYou should see:\n```\nselecting specified query k=51\nloaded query: barcode3_31543... (k=51, DNA)\nloading from 'databases/ralstonia.zip'...\nloaded 81 total signatures from 1 locations.\nafter selecting signatures compatible with search, 27 remain.\nStarting prefetch sweep across databases.\nFound 0 signatures via prefetch; now doing gather.\nfound less than 50.0 kbp in common. => exiting\n\n\nfound 0 matches total;\nthe recovered matches hit 0.0% of the query k-mers (unweighted).\n```\n\n#### gather found no sequence matches! But, we can lower the detection threshold:\n\n```\nquery=\"inputs/barcode3_31543.sig.zip\"\ndatabase=\"databases/ralstonia.zip\"\ngather_csv_output=\"barcode3_31543.k51.gather.csv\"\n\n# use a 10kb detection threshold\nsourmash gather $query $database -k 51 --threshold-bp 10000 -o $gather_csv_output\n```\n\nThis time, you should see:\n```\nselecting specified query k=51\nloaded query: barcode3_31543... (k=51, DNA)\nloading from 'databases/ralstonia.zip'...\nloaded 81 total signatures from 1 locations.\nafter selecting signatures compatible with search, 27 remain.\nStarting prefetch sweep across databases.\nFound 6 signatures via prefetch; now doing gather.\n\n\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n12.0 kbp       0.0%    0.2%       1.0    GCA_000750575.1 Ralstonia solanacear...\n\nfound 1 matches total;\nthe recovered matches hit 0.0% of the abundance-weighted query.\nthe recovered matches hit 0.0% of the query k-mers (unweighted).\n\n```\n\nYou'll notice that while we have an estimated ~12kbp overlap, the matched genome (`GCA_000750575.1`) is different from the one matched above for `barcode5`. If you run `sourmash tax metagenome` on this output, you'll see that this genome belongs to `Phyl IIB seq 2` group, which is a sister group to the correct `Phyl IIB seq 1` group that we expected. So we have a match but it's not the right one -- why not?\n\n### What happened? Use `prefetch` to investigate\n\n`sourmash gather` has two steps: first, it runs a `prefetch` to find ALL genome matches, and then uses a greedy approach to select the smallest set of genomes that contain ('cover') all known sequence content. Let's run `prefetch` independently so we can look at the results of the first step. Here, let's use `--threshold-bp 0` to get all possible matches.\n\nRun:\n```\nquery=\"inputs/barcode3_31543.sig.zip\"\nprefetch_csv_output=\"barcode3_31543.k51.prefetch.csv\"\ndatabase=\"databases/ralstonia.zip\"\n\nsourmash prefetch $query $database -k 51 --threshold-bp 0 -o $prefetch_csv_output \n```\n\nYou should see:\n```\nselecting specified query k=51\nloaded query: barcode3_31543... (k=51, DNA)\nquery sketch has scaled=1000; will be dynamically downsampled as needed.\n--tal of 10 matching signatures so far.tonia.zip'\nloaded 81 total signatures from 1 locations.\nafter selecting signatures compatible with search, 27 remain.\n--\ntotal of 15 matching signatures.\nsaved 15 matches to CSV file 'barcode3_31543.k51.prefetch.csv'\nof 487043 distinct query hashes, 12 were found in matches above threshold.\na total of 487031 query hashes remain unmatched.\nfinal scaled value (max across query and all matches) is 1000\n```\n\nHere, the output is telling us we found matches to 15 of the 27 Ralstonia genomes. But only **12 k-mers** were shared between the metagenome sample and the genomes. Remember that sourmash uses a representative subsample of all k-mers, so here these 12 k-mers represent ~ 12kb of sequence (12 * scaled). We've found that this is sufficient to detect presence of an organism, but at this low level, it can be hard to distinguish between closely-related genomes. Let's open the prefetch output to see how those 12 k-mers matched between different genomes.\n\n#### Look at the `barcode3_31543.k51.prefetch.csv` file\n\n> Use a spreadsheet program on your computer or use `less -S barcode3_31543.k51.prefetch.csv` to see the file on the terminal. If using `less`, hit `q` when you want to exit and return to your terminal prompt.\n\nThe first column contains the estimated number of base pairs matched between our query and each matching reference genome. You'll notice there are four genomes that match 12kb of sequence, one of which is the \"correct\" genome (`GCA_002251655.1`, which is in the `IIB seq1` lingroup).\n\n**What is happening here?**\n\nWhen faced with equally good matches, `sourmash gather` makes a random choice about which genome to assign these k-mers to. This happens primarily with highly similar genomes and/or very small sequence matches. If this happens and you need to distinguish between these genomes, we recommend trying a lower scaled value (higher resolution). \"scaled\" refers to the systematic downsampling: we keep rougly 1/scaled k-mers (`scaled=1000` keeps ~1 of every 1000 unique k-mers). `scaled=1` keeps all k-mers, but our signature storage is not optimized for this use case.\n\nTo see if we could robustly assign the correct sequevar for `barcode3` using a higher resolution sketch, I also ran `gather` using `scaled=100`.\n\nHere's an abbreviated version of the `gather` results for  `barcode3`, with lingroup information added:\n\n\n\n|         | **ksize** | **scaled** | **best overlap** | **gather match(es)** | **lingroup** | **lin**                            |\n| ------- | --------- | ---------- | ---------------- | -------------------- | ------------ | ---------------------------------- |\n| **bc3** | 51        | 1000       | 12kb             | GCA_000750575.1      | IIB seq2     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;1;0 |\n| **bc3** | 31        | 1000       | 28 kb            | GCA_002251655.1      | IIB seq1     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0 |\n| **bc3** | 51        | 100        | 14.8 kb          | GCA_002251655.1      | IIB seq1     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0 |\n| **bc3** | 31        | 100        | 21.1 kb          | GCA_002251655.1      | IIB seq1     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;0;0 |\n\nWe typically use k=51 for strain-level matching and k=31 for species-level matching. Notice that running at k=31 with scaled 1000 found the right match. However, if you run prefetch for `k=31`, you see there are three matches with `28kb` overlap, so we just got lucky that `gather` selected the right one for this test case.\n\nIn contrast, by sketching the `Ralstonia` genomes and metagenome at higher resolution (`scaled=100`), we had sufficient information to correctly assign the sequence to the `IIB seq1` lingroup at either ksize.\n\n\n### Now try the `barcode5` sample\n\nYou can also run the `barcode5` file using the same commands as above:\n\n```\nquery=\"inputs/barcode5_36481.sig.zip\"\ndatabase=\"databases/ralstonia.zip\"\n\ngather_csv_output=\"barcode5_36481.dna.k51.gather.csv\"\n\nsourmash gather $query $database -k 51 -o $gather_csv_output\n```\n\nYou should see:\n\n```\nselecting specified query k=51\nloaded query: barcode5_36481... (k=51, DNA)\n--\nloaded 81 total signatures from 1 locations.\nafter selecting signatures compatible with search, 27 remain.\n\nStarting prefetch sweep across databases.\nFound 0 signatures via prefetch; now doing gather.\nfound less than 50.0 kbp in common. => exiting\n\nfound 0 matches total;\nthe recovered matches hit 0.0% of the query k-mers (unweighted).\n```\n\n\nNo matches are found. If you drop the threshold-bp  to 0 (`--threshold-bp 0`), you can find ~1kbp overlap (a single k-mer match!). **Note, we do not recommend trusting/using results with fewer than 3 k-mer matches (3kbp at scaled=1000)**. Especially in larger databases (e.g. NCBI/GTDB), a single k-mer match might actually be from contamination in the reference genome rather than true genome content, so you may end up assigning the wrong lineage. Requiring 3 k-mers (representing ~3kb of matching sequence) makes it more likely your matches represent true genome content.\n\nI then ran this file at higher resolution to see how the results changed. In each case, very few k-mers matched and we could not robustly identify a specific `Ralstonia` genome or lingroup. As it turns out, `barcode5` does not have a `Ralstonia` spike-in, so this is a good thing!\n\nHere's an abbreviated version of the `gather` results for  `barcode5`, with lingroup information added in cases with a single gather match:\n\n|         | **ksize** | **scaled** | **best overlap** | **gather match(es)** | **lingroup** | **lin**                            |\n| ------- | --------- | ---------- | ---------------- | -------------------- | ------------ | ---------------------------------- |\n| **bc5** | 51        | 1000       | 1 kbp            | GCA_000750575.1      | IIB seq2     | 14;1;0;0;0;3;0;0;0;0;1;0;0;0;0;1;0 |\n| **bc5** | 31        | 1000       | 0                | N/A                  |              |                                    |\n| **bc5** | 51        | 100        | 300bp            | all                  |              |                                    |\n| **bc5** | 31        | 100        | 1.2 kb           | all                  |              |                                    |\n| **bc5** | 51        | 10         | 120 bp           | all                  |              |                                    |\n| **bc5** | 31        | 10         | 670 bp           | all                  |              |                                    |\n| **bc5** | 51        | 5          | 150 bp           | all                  |              |                                    |\n| **bc5** | 31        | 5          | 500 bp           | all                  |              |                                    |\n\n\n**Again, while I've used a threshold-bp of 0 to get the gather match at scaled=1000, we do not typically trust gather matches with less than `3*scaled` overlap (< 3 k-mers matched).** Even at very high resolution (scaled=5), we matched nearly all Ralstonia genomes and could not distinguish a single lingroup.\n\nWe typically recommend running at `scaled=1000` (our default), as this works for most microbial use cases. You can run at higher resolution (lower scaled) if you need to, but higher resolution signatures are larger and can take significantly longer to build and search - use at your own risk :).\n\n## Summary and concluding thoughts\n\nThe LIN taxonomic framework may be useful distinguishing groups below the species level.\nWe can now use LINs and lingroups with `sourmash tax metagenome`. For low level matches, the gather greedy\napproach can struggle. We are working on ways to better warn users about this behavior and welcome\nfeedback and suggestions on our [issue tracker](https://github.com/sourmash-bio/sourmash/issues/new)."
  },
  {
    "path": "doc/tutorial-long.md",
    "content": "# Quick Insights from Sequencing Data with sourmash\n\nNote: this tutorial was developed for and first presented at\n[ANGUS 2019](https://angus.readthedocs.io/en/2019/sourmash.html).\n\n## Objectives\n1. Discuss k-mers and their utility\n2. Compare RNA-seq samples quickly\n3. Detect eukaryotic contamination in raw RNA-seq reads\n4. Compare reads to an assembly\n5. Build your own database for searching \n6. Other sourmash databases\n\n## Introduction to k-mers\n\nA \"k-mer\" is a word of DNA that is k long:\n\n```\nATTG - a 4-mer\nATGGAC - a 6-mer\n```\n\nTypically we extract k-mers from genomic assemblies or read data sets by running a k-length window across all of the reads and sequences -- e.g. given a sequence of length 16, you could extract 11 k-mers of length six from it like so:\n\n```\nAGGATGAGACAGATAG\n```\nbecomes the following set of 6-mers:\n```\nAGGATG\n GGATGA\n  GATGAG\n   ATGAGA\n    TGAGAC\n     GAGACA\n      AGACAG\n       GACAGA\n        ACAGAT\n         CAGATA\n          AGATAG\n```\n\nToday we will be using a tool called [sourmash](https://f1000research.com/articles/8-1006) \nto explore k-mers!\n\n## Why k-mers, though? Why not just work with the full read sequences?\n\nComputers *love* k-mers because there's no ambiguity in matching them. You either have an exact match, or you don't. And computers love that sort of thing!\n\nBasically, it's really easy for a computer to tell if two reads share a k-mer, and it's pretty easy for a computer to store all the k-mers that it sees in a pile of reads or in a genome.\n\n## Long k-mers are species specific\n\nk-mers are most useful when they're *long*, because then they're *specific*. That is, if you have a 31-mer taken from a human genome, it's pretty unlikely that another genome has that exact 31-mer in it.  (You can calculate the probability if you assume genomes are random: there are 4<sup>31</sup> possible 31-mers, and 4<sup>31</sup> = 4,611,686,018,427,387,904\\.  So, you know, a lot.)\n\nEssentially, *long k-mers are species specific*. Check out this figure from the [MetaPalette paper](http://msystems.asm.org/content/1/3/e00020-16):\n\n![](_static/kmers-metapalette.png)\n\nHere, Koslicki and Falush show that k-mer similarity works to group microbes by genus, at k=40\\. If you go longer (say k=50) then you get only very little similarity between different species.\n\n## Using k-mers to compare samples\n\nSo, one thing you can do is use k-mers to compare read data sets to read data sets, or genomes to genomes: data sets that have a lot of similarity probably are similar or even the same genome.\n\nOne metric you can use for this comparisons is the Jaccard distance, which is calculated by asking how many k-mers are *shared* between two samples vs how many k-mers in total are in the combined samples.\n\n```\nonly k-mers in both samples\n----------------------------\nall k-mers in either or both samples\n```\n\nA Jaccard distance of 1 means the samples are identical; a Jaccard distance of 0 means the samples are completely different.\n\nJaccard distance works really well when we don't care how many times we see a k-mer. \nWhen we keep track of the abundance of a k-mer, say for example in RNA-seq samples where the number of read counts matters, we use cosine distance instead. \n\nThese two measures can be used to search databases, compare RNA-seq samples, and all sorts of other things!  The only real problem with it is that there are a *lot* of k-mers in a genome -- a 5 Mbp genome (like E. coli) has 5 m k-mers!\n\nAbout two years ago, [Ondov et al. (2016)](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-016-0997-x) showed that [MinHash approaches](https://en.wikipedia.org/wiki/MinHash) could be used to estimate Jaccard distance using only a small fraction (1 in 10,000 or so) of all the k-mers.\n\nThe basic idea behind MinHash is that you pick a small subset of k-mers to look at, and you use those as a proxy for *all* the k-mers.  The trick is that you pick the k-mers randomly but consistently: so if a chosen k-mer is present in two data sets of interest, it will be picked in both. This is done using a clever trick that we can try to explain to you in class - but either way, trust us, it works!\n\nWe have implemented a MinHash approach in our [sourmash software](https://github.com/sourmash-bio/sourmash/), which can do some nice things with samples.  We'll show you some of these things next!\n\n## Installing sourmash\n\nTo install sourmash, run:\n\n```\nconda install -y -c conda-forge -c bioconda sourmash\n```\n\n## Creating signatures\n\nA signature is a compressed representation of the k-mers in the sequence. \n\nDepending on your application, we recommend different ways of preparing sequencing data to create a signature. \n\nIn a genome or transcriptome, we expect that the k-mers we see are accurate. We can create \nsignatures from these type of sequencing data sets without any preparation. We demonstrate\nhow to create a signature from high-quality sequences below.\n\nFirst, download a genome assembly:\n\n```\ncd ~\nmkdir sourmash_data\ncd sourmash_data\n\ncurl -L https://osf.io/963dg/download -o ecoliMG1655.fa.gz \ngunzip -c ecoliMG1655.fa.gz | head\n```\n\nCompute a scaled MinHash from the assembly:\n\n```\nsourmash compute -k 21,31,51 --scaled 2000 --track-abundance -o ecoliMG1655.sig ecoliMG1655.fa.gz\n```\n\nFor raw sequencing reads, we expect that many of the unique k-mers we observe will be due\nto errors in sequencing. Unlike with high-quality sequences like transcriptomes and \ngenomes, we need to think carefully about how we want to create each signature, as it will\ndepend on the downstream application. \n\n+ **Comparing reads against high quality sequences**: Because our references that we are\ncomparing or searching against only contain k-mers that are likely real, we don't want to \ntrim potentially erroneous k-mers. Although most of the k-mers would be errors that we \nwould trim, there is a chance we could accidentally remove **real** biological variation\nthat is present at low abundance. Instead, we only want to trim adapters.\n+ **Comparing reads against other reads**: Because both datasets likely have many \nerroneous k-mers, we want to remove the majority of these so as not to falsely deflate\nsimilarity between samples. Therefore, we want to trim what are likely erroneous k-mers \nfrom sequencing errors, as well as adapters.\n\nLet's download some raw sequencing reads and demonstrate what k-mer trimming looks like. \n\nFirst, download a read file:\n\n```\ncurl -L https://osf.io/pfxth/download -o ERR458584.fq.gz\ngunzip -c ERR458584.fq.gz | head\n```\n\nNext, perform k-mer trimming using a library called khmer. K-mer trimming removes\nlow-abundant k-mers from the sample.\n\n```\ntrim-low-abund.py ERR458584.fq.gz -V -Z 10 -C 3 --gzip -M 3e9 -o ERR458584.khmer.fq.gz\n```\n\nFinally, calculate a signature from the trimmed reads.\n```\nsourmash compute -k 21,31,51 --scaled 2000 --track-abundance -o ERR458584.khmer.sig ERR458584.khmer.fq.gz\n```\n\n![qc](_static/Sourmash_flow_diagrams_QC.png)\n\n\n![compute](_static/Sourmash_flow_diagrams_compute.png)\n\nWe can prepare signatures like this for any sequencing data file! For the rest of the \ntutorial, we have prepared signatures for each sequencing data set we will be working\nwith.\n\n## Compare many RNA-seq samples quickly\n\nUse case: how similar are my samples to one another?\n\nTraditionally in RNA-seq workflows, we use MDS plots to determine how similar our samples\nare. Samples that are closer together on the MDS plot are more similar. However, to get\nto this point, we have to trim our reads, download or build a reference transcriptome,\nquantify our reads using a tool like Salmon, and then read the counts into R and make an\nMDS plot. This is a lot of steps to go through just to figure out how similar your samples\nare! \n\nLuckily, we can use sourmash to quickly compare how similar our samples are. \n\nWe [generated signatures](https://github.com/taylorreiter/yeast-rna-sigs/blob/master/Snakefile) \nfor the majority of the rest of the \n[Schurch et al. experiment](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4878611/) we \nhave been working with this week. Below we download and compare the 647 signatures, and\nthen produce a plot that shows how similar they are to one another.\n\nFirst, download and uncompress the signatures.\n\n```\ncurl -o schurch_sigs.tar.gz -L https://osf.io/p3ryg/download\ntar xf schurch_sigs.tar.gz\n```\n\nNext, compare the signatures using sourmash.\n\n```\nsourmash compare -k 31 -o schurch_compare_matrix schurch_sigs/*sig\n```\n\nThis outputs a comparison matrix and a set of labels. The matrix is symmetrical, and \ncontains numbers 0-1 that captures similarity between samples. 0 means there are no \nk-mers in common between two samples, while 1 means all k-mers are shared.\n\nLastly, we plot the comparison matrix.\n\n```\nsourmash plot --labels schurch_compare_matrix\n```\n\n![](_static/schurch_comp.matrix.png)\n\nWe see there are two major blocks of similar samples, which makes sense given that we have\nWT and SNF2 knockout samples. However, we also see that some of our samples are outliers!\nIf this were our experiment, we would want to investigate the outliers further to see \nwhat caused them to be so dissimilar.\n\n## Detect Eukaryotic Contamination in Raw RNA Sequencing data\n\nUse case: Search for the presence of unexpected organisms in raw RNA-seq reads \n\nFor most analysis pipelines, there are many steps that need to be executed before we get \nto the analysis and interpretation of what is in our sample. This often means we are 10-15\nsteps into our analysis before we find any problems. However, if our reads contain \ncontamination, we want to know that as quickly as possible so we can remove the\ncontamination and solve any issues that led to the contamination.\n\nUsing sourmash, we can quickly check if we have any unexpected organisms in our sequencing\nsamples. We do this by comparing a signature from our reads against a database of known \nsignatures from publicly available reference sequences.\n \nWe have generated sourmash databases for all publicly available Eukaryotic RNA samples\n(we used the `*rna_from_genomic*` files from RefSeq and Genbank...however keep in mind\nthat not all sequenced genomes have these files!). This database includes\nfungi, plants, vertebrates, invertebrates, and protazoa. It does not include human, so we\nincorporate that separately. We also built another database of the ~700 recently \n[re-assembled](https://academic.oup.com/gigascience/article/8/4/giy158/5241890)  marine \ntranscriptomes from the \n[MMETSP project](https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1001889). \nThese databases allow us to detect common organisms that might be unexpectedly present\nin our sequencing data. \n\nFirst, let's download and uncompress our three databases: human, MMETSP, and everything \nelse!\n\n```\nwget -O sourmash_euk_rna_db.tar.gz https://osf.io/vpk8s/download\ntar xf sourmash_euk_rna_db.tar.gz\n```\n\nNext, let's download a signature from some sequencing reads. We'll work with some \nsequencing reads from a wine fermentation. \n\n```\nwget -O wine.sig https://osf.io/5vsjq/download\n```\n\nWe expected fungus and grape to be metabolically active in these samples. Let's check \nwhich organisms we detect.\n\n```\nsourmash gather -k 31 --scaled 2000 -o wine.csv wine.sig sourmash_euk_rna_db/*sbt.json sourmash_euk_rna_db/*sig  \n```\n\nIf we take a look at the output, we see:\n\n```\n== This is sourmash version 2.0.1. ==\n== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n\nloaded query: wine_fermentation... (k=31, DNA)\ndownsampling query from scaled=2000 to 2000\nloaded 1 signatures and 2 databases total.\n\n\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n2.2 Mbp       79.0%   28.5%     122.2     Sc_YJM1477_v1  Saccharomyces cerevis...\n0.8 Mbp        1.4%    2.2%       6.2     12X  Vitis vinifera (wine grape)\n2.1 Mbp        0.4%    1.6%       9.3     GLBRCY22-3  Saccharomyces cerevisiae...\n124.0 kbp      0.1%    0.7%       3.1     Aureobasidium pullulans var. pullula...\n72.0 kbp       0.0%    0.1%       1.9     Mm_Celera  Mus musculus (house mouse)\n1.9 Mbp        0.0%    0.5%       3.7     Sc_YJM1460_v1  Saccharomyces cerevis...\n1.8 Mbp        0.1%    0.5%      14.1     ASM18217v1  Saccharomyces cerevisiae...\n2.1 Mbp        0.1%    0.3%      17.7     R008  Saccharomyces cerevisiae R008 ...\n1.9 Mbp        0.0%    0.1%       3.1     ASM32610v1  Saccharomyces cerevisiae...\nfound less than 18.0 kbp in common. => exiting\n\nfound 9 matches total;\nthe recovered matches hit 81.2% of the query\n```\n\n...which is almost exactly what we expect, except we see some house mouse! And I promise\nRatatouille was not making this wine.\n\nUsing this method, we have now identified contamination in our reads. We could align to\nthe mouse genome to remove these reads, however the best strategy to remove these reads\nmay vary on a case by case basis.  \n\n## Compare reads to assemblies\n\nUse case: how much of the read content is contained in the reference genome?\n\nFirst we’ll download some reads from an E. coli genome, then we will generate a signature from them\n\n```\ncurl -L https://osf.io/frdz5/download -o ecoli_ref-5m.fastq.gz\nsourmash compute  -k 31 --scaled 2000 ~/sourmash_data/ecoli_ref-5m.fastq.gz -o ecoli-reads.sig\n```\n\n![search](_static/Sourmash_flow_diagrams_search.png)\n\nBuild a signature for an E. coli genome:\n\n```\nsourmash compute --scaled 2000 -k 31 ~/sourmash_data/ecoliMG1655.fa.gz -o ecoli-genome.sig\n```\n\nand now evaluate *containment*, that is, what fraction of the read content is\ncontained in the genome:\n\n```\nsourmash search -k 31 ecoli-reads.sig ecoli-genome.sig --containment\n```\n\nand you should see:\n\n```\nloaded query: /home/diblions/data/ecoli_ref-... (k=31, DNA)\nloaded 1 signatures.\n\n1 matches:\nsimilarity   match\n----------   -----\n  9.7%       /home/diblions/data/ecoliMG1655.fa.gz\n```\n\nWhy are only 10% or so of our k-mers from the reads in the genome!?\nAny ideas?\n\nTry the reverse - why is it bigger?\n\n```\nsourmash search -k 31 ecoli-genome.sig ecoli-reads.sig --containment\n```\n\n(...but 100% of our k-mers from the genome are in the reads!?)\n\n\n## Make and search a database quickly.\n\nSuppose that we have a collection of signatures (made with `sourmash\ncompute` as above) and we want to search it with our newly assembled\ngenome (or the reads, even!). How would we do that?\n\nLet's grab a sample collection of 50 E. coli genomes and unpack it --\n\n```\nmkdir ecoli_many_sigs\ncd ecoli_many_sigs\n\ncurl -O -L https://github.com/sourmash-bio/sourmash/raw/master/data/eschericia-sigs.tar.gz\n\ntar xzf eschericia-sigs.tar.gz\nrm eschericia-sigs.tar.gz\n\ncd ../\n```\n\nThis will produce 50 files named `ecoli-N.sig` in the `ecoli_many_sigs` --\n\n```\nls ecoli_many_sigs\n```\n\nLet's turn this into an easily-searchable database with `sourmash index` --\n\n```\nsourmash index -k 31 ecolidb ecoli_many_sigs/*.sig\n```\n\nOne point to make with this is that the search can quickly narrow down\nwhich signatures match your query, without losing any matches.  It's a\nclever example of how computer scientists can actually make life\nbetter :).\n\n----\n\nAnd now we can search!\n\n```\nsourmash search ecoli-genome.sig ecolidb.sbt.json -n 20\n```\n\nYou should see output like this:\n\n```\n# running sourmash subcommand: search\nselect query k=31 automatically.\nloaded query: /home/tx160085/data/ecoliMG165... (k=31, DNA)\nloaded SBT ecolidb.sbt.json\nSearching SBT ecolidb.sbt.json\n49 matches; showing first 20:\nsimilarity   match\n----------   -----\n 75.9%       NZ_JMGW01000001.1 Escherichia coli 1-176-05_S4_C2 e117605...\n 73.0%       NZ_JHRU01000001.1 Escherichia coli strain 100854 100854_1...\n 71.9%       NZ_GG774190.1 Escherichia coli MS 196-1 Scfld2538, whole ...\n 70.5%       NZ_JMGU01000001.1 Escherichia coli 2-011-08_S3_C2 e201108...\n 69.8%       NZ_JH659569.1 Escherichia coli M919 supercont2.1, whole g...\n 59.9%       NZ_JNLZ01000001.1 Escherichia coli 3-105-05_S1_C1 e310505...\n 58.3%       NZ_JHDG01000001.1 Escherichia coli 1-176-05_S3_C1 e117605...\n 56.5%       NZ_MIWF01000001.1 Escherichia coli strain AF7759-1 contig...\n 56.1%       NZ_MOJK01000001.1 Escherichia coli strain 469 Cleandata-B...\n 56.1%       NZ_MOGK01000001.1 Escherichia coli strain 676 BN4_676_1_(...\n 50.5%       NZ_KE700241.1 Escherichia coli HVH 147 (4-5893887) acYxy-...\n 50.3%       NZ_APWY01000001.1 Escherichia coli 178200 gec178200.conti...\n 48.8%       NZ_LVOV01000001.1 Escherichia coli strain swine72 swine72...\n 48.8%       NZ_MIWP01000001.1 Escherichia coli strain K6412 contig_00...\n 48.7%       NZ_AIGC01000068.1 Escherichia coli DEC7C gecDEC7C.contig....\n 48.2%       NZ_LQWB01000001.1 Escherichia coli strain GN03624 GCID_EC...\n 48.0%       NZ_CCQJ01000001.1 Escherichia coli strain E. coli, whole ...\n 47.3%       NZ_JHMG01000001.1 Escherichia coli O121:H19 str. 2010EL10...\n 47.2%       NZ_JHGJ01000001.1 Escherichia coli O45:H2 str. 2009C-4780...\n 46.5%       NZ_JHHE01000001.1 Escherichia coli O103:H2 str. 2009C-327...\n\n```\n\nidentifying what genome is in the signature. Some pretty good matches but nothing above %75. Why? What are some things we should think about when we're doing taxonomic classification? \n\n## What's in my metagenome?\n\nFirst, let's download and upack the database we'll use for classification\n```\ncd ~/sourmash_data\ncurl -L https://osf.io/4f8n3/download -o genbank-k31.lca.json.gz\ngunzip genbank-k31.lca.json.gz\n```\n\nThis database is a GenBank index of all\nthe microbial genomes\n-- this one contains sketches of all 87,000 microbial genomes (including viral and fungal). See\n[available sourmash databases](http://sourmash.rtfd.io/en/latest/databases.html)\nfor more information.\n\nAfter this database is unpacked, it produces a file\n`genbank-k31.lca.json`.\n\nNext, run the 'lca gather' command to see what's in your ecoli genome --\n```\nsourmash lca gather ecoli-genome.sig genbank-k31.lca.json\n```\n\nand you should get:\n\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nloaded query: /home/diblions/data/ecoliMG165... (k=31)\n\noverlap     p_query p_match \n---------   ------- --------\n4.9 Mbp     100.0%    2.3%      Escherichia coli\n\nQuery is completely assigned.\n```\n\nIn this case, the output is kind of boring because this is a single\ngenome.  But! You can use this on metagenomes (assembled and\nunassembled) as well; you've just got to make the signature files.\n\nTo see this in action, here is gather running on a signature generated\nfrom some sequences that assemble (but don't align to known genomes)\nfrom the\n[Shakya et al. 2013 mock metagenome paper](https://www.ncbi.nlm.nih.gov/pubmed/23387867).\n\n```\nwget https://github.com/sourmash-bio/sourmash/raw/master/doc/_static/shakya-unaligned-contigs.sig\nsourmash lca gather shakya-unaligned-contigs.sig genbank-k31.lca.json\n```\n\nThis should yield:\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nloaded query: mqc500.QC.AMBIGUOUS.99.unalign... (k=31)\n\noverlap     p_query p_match \n---------   ------- --------\n1.8 Mbp      14.6%    9.1%      Fusobacterium nucleatum\n1.0 Mbp       7.8%   16.3%      Proteiniclasticum ruminis\n1.0 Mbp       7.7%   25.9%      Haloferax volcanii\n0.9 Mbp       7.4%   11.8%      Nostoc sp. PCC 7120\n0.9 Mbp       7.0%    5.8%      Shewanella baltica\n0.8 Mbp       6.0%    8.6%      Desulfovibrio vulgaris\n0.6 Mbp       4.9%   12.6%      Thermus thermophilus\n0.6 Mbp       4.4%   11.2%      Ruegeria pomeroyi\n480.0 kbp     3.8%    7.6%      Herpetosiphon aurantiacus\n410.0 kbp     3.3%   10.5%      Sulfitobacter sp. NAS-14.1\n150.0 kbp     1.2%    4.5%      Deinococcus radiodurans (** 1 equal matches)\n150.0 kbp     1.2%    8.2%      Thermotoga sp. RQ2\n140.0 kbp     1.1%    4.1%      Sulfitobacter sp. EE-36\n130.0 kbp     1.0%    0.7%      Streptococcus agalactiae (** 1 equal matches)\n100.0 kbp     0.8%    0.3%      Salinispora arenicola (** 1 equal matches)\n100.0 kbp     0.8%    4.2%      Fusobacterium sp. OBRC1\n60.0 kbp      0.5%    0.7%      Paraburkholderia xenovorans\n50.0 kbp      0.4%    3.2%      Methanocaldococcus jannaschii (** 2 equal matches)\n50.0 kbp      0.4%    0.3%      Bacteroides vulgatus (** 1 equal matches)\n50.0 kbp      0.4%    2.6%      Sulfurihydrogenibium sp. YO3AOP1\n30.0 kbp      0.2%    0.7%      Fusobacterium hwasookii (** 3 equal matches)\n30.0 kbp      0.2%    0.0%      Pseudomonas aeruginosa (** 2 equal matches)\n30.0 kbp      0.2%    1.6%      Persephonella marina (** 1 equal matches)\n30.0 kbp      0.2%    0.4%      Zymomonas mobilis\n20.0 kbp      0.2%    1.1%      Sulfurihydrogenibium yellowstonense (** 6 equal matches)\n20.0 kbp      0.2%    0.5%      Ruminiclostridium thermocellum (** 5 equal matches)\n20.0 kbp      0.2%    0.1%      Streptococcus parasanguinis (** 4 equal matches)\n20.0 kbp      0.2%    0.8%      Fusobacterium sp. HMSC064B11 (** 2 equal matches)\n20.0 kbp      0.2%    0.4%      Chlorobium phaeobacteroides (** 1 equal matches)\n20.0 kbp      0.2%    0.7%      Caldicellulosiruptor bescii\n10.0 kbp      0.1%    0.0%      Achromobacter xylosoxidans (** 53 equal matches)\n10.0 kbp      0.1%    0.2%      Geobacter sulfurreducens (** 17 equal matches)\n10.0 kbp      0.1%    0.5%      Fusobacterium sp. HMSC065F01 (** 15 equal matches)\n10.0 kbp      0.1%    0.3%      Nitrosomonas europaea (** 14 equal matches)\n10.0 kbp      0.1%    0.5%      Wolinella succinogenes (** 13 equal matches)\n10.0 kbp      0.1%    0.5%      Thermotoga neapolitana (** 12 equal matches)\n10.0 kbp      0.1%    0.5%      Thermus amyloliquefaciens (** 10 equal matches)\n10.0 kbp      0.1%    0.1%      Desulfovibrio desulfuricans (** 9 equal matches)\n10.0 kbp      0.1%    0.4%      Fusobacterium sp. CM22 (** 8 equal matches)\n10.0 kbp      0.1%    0.2%      Desulfovibrio piger (** 7 equal matches)\n10.0 kbp      0.1%    0.5%      Thermus kawarayensis (** 6 equal matches)\n10.0 kbp      0.1%    0.5%      Pyrococcus furiosus (** 5 equal matches)\n10.0 kbp      0.1%    0.5%      Aciduliprofundum boonei (** 4 equal matches)\n10.0 kbp      0.1%    0.2%      Desulfovibrio sp. A2 (** 3 equal matches)\n10.0 kbp      0.1%    0.3%      Desulfocurvus vexinensis (** 2 equal matches)\n10.0 kbp      0.1%    0.0%      Enterococcus faecalis\n\n22.1% (2.8 Mbp) of hashes have no assignment.\n\n``` \n\nWhat do the columns here mean?\n\nWhy might some of things in a metagenome be unassigned?\n\n----\n\nIt is straightforward to build your own databases for use with\n`search` and `lca gather`; this is of interest if you have dozens or\nhundreds of sequencing data sets in your group. Ping us if you want us\nto write that up.\n\n## Final thoughts on sourmash\n\nThere are many tools like Kraken and Kaiju that can do taxonomic\nclassification of individual reads from metagenomes; these seem to\nperform well (albeit with high false positive rates) in situations\nwhere you don't necessarily have the genome sequences that are in the\nmetagenome.  Sourmash, by contrast, can estimate which known genomes are\nactually present, so that you can extract them and map/align to them.\nIt seems to have a very low false positive rate and is quite sensitive\nto strains.\n\nAbove, we've shown you a few things that you can use sourmash for.  Here\nis a (non-exclusive) list of other uses that we've been thinking about --\n\n* detect contamination in sequencing data;\n\n* index and search private sequencing collections;\n\n* search all of SRA for overlaps in metagenomes\n\n"
  },
  {
    "path": "doc/tutorials-lca.md",
    "content": "# Using sourmash LCA to do taxonomic classification\n\nThe `sourmash lca` sub-commands do k-mer classification using an\n\"lowest common ancestor\" approach.  See \"Some discussion\" below for\nlinks and details.\n\nThis tutorial should run without modification on Linux or Mac OS X,\nunder [Miniconda](https://docs.conda.io/en/latest/miniconda.html).\n\nYou'll need about 5 GB of free disk space to download the database,\nand about 5 GB of RAM to search it.  The tutorial should take about\n20 minutes total to run.\n\nNote, we have successfully tested it on\n[binder.pangeo.io](https://binder.pangeo.io/v2/gh/binder-examples/r-conda/master?urlpath=urlpath%3Drstudio)\nif you want to give it a try!\n\n## Install miniconda\n\nIf you don't have the `conda` command installed, you'll need to install\nminiconda for Python 3.x.\n\nOn Linux, this should work:\n```\nwget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh -b\necho export PATH=\"$HOME/miniconda3/bin:$PATH\" >> ~/.bash_profile\nsource ~/.bash_profile\n```\notherwise, follow\n[the miniconda install](https://docs.conda.io/en/latest/miniconda.html).\n\n## Enable [bioconda](https://bioconda.github.io/)\n\n```\nconda config --add channels defaults\nconda config --add channels bioconda\nconda config --add channels conda-forge\n```\n\n## Install sourmash\n\nTo install sourmash, create a new environment named `smash` and install sourmash:\n\n```\nconda create -y -n smash sourmash\n```\n\nand then activate:\n```\nconda activate smash\n```\n\nYou should now be able to use the `sourmash` command:\n\n```\nsourmash info\n```\n\n## Download some files\n\nNext, download a genbank LCA database for k=31:\n\n```\ncurl -L -o genbank-k31.lca.json.gz https://osf.io/4f8n3/download\n```\n\nDownload a random genome from genbank:\n```\ncurl -L -o some-genome.fa.gz https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/178/875/GCF_000178875.2_ASM17887v2/GCF_000178875.2_ASM17887v2_genomic.fna.gz\n```\n\nCreate a signature for this genome:\n```\nsourmash sketch dna -p scaled=1000,k=31 --name-from-first some-genome.fa.gz\n```\n\nNow, classify the signature with sourmash `lca classify`,\n```\nsourmash lca classify --db genbank-k31.lca.json.gz \\\n    --query some-genome.fa.gz.sig\n```\nand this will give you a taxonomic identification of your genome bin,\nclassified using all of the genbank microbial genomes:\n\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nfinding query signatures...\noutputting classifications to stdout\nID,status,superkingdom,phylum,class,order,family,genus,species,strain\n... classifying NC_016901.1 Shewanella baltica OS678, complete genome (file 1 of\"NC_016901.1 Shewanella baltica OS678, complete genome\",found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,\nclassified 1 signatures total\n```\n\nYou can also summarize the taxonomic distribution of the content with\n`lca summarize`:\n```\nsourmash lca summarize --db genbank-k31.lca.json.gz \\\n    --query some-genome.fa.gz.sig\n```\n\nwhich will show you:\n```\nloaded 1 LCA databases. ksize=31, scaled=10000\nfinding query signatures...\nloaded 1 signatures from 1 files total.\n97.9%   520   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella\n97.9%   520   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae\n97.9%   520   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\n99.6%   529   Bacteria;Proteobacteria;Gammaproteobacteria\n99.6%   529   Bacteria;Proteobacteria\n99.6%   529   Bacteria\n45.4%   241   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica\n```\n\nTo apply this to your own genome(s), replace `some-genome.fa.gz` above\nwith your own filename(s).\n\nYou can also specify multiple databases and multiple query signatures\non the command line; separate them with `--db` or `--query`.\n\n### Building your own LCA database\n\n(This is an abbreviated version of [this blog post](http://ivory.idyll.org/blog/2017-classify-genome-bins-with-custom-db-try-again.html), updated to use the `sourmash lca` commands.)\n\nDownload some pre-calculated signatures:\n\n```\ncurl -L https://osf.io/bw8d7/download -o delmont-subsample-sigs.tar.gz\ntar xzf delmont-subsample-sigs.tar.gz\n```\n\nNext, grab the associated taxonomy spreadsheet\n\n```\ncurl -O -L https://github.com/ctb/2017-sourmash-lca/raw/master/tara-delmont-SuppTable3.csv\n```\n\nBuild a sourmash LCA database named `delmont.lca.json`:\n\n```\nsourmash lca index -f tara-delmont-SuppTable3.csv delmont.lca.json delmont-subsample-sigs/*.sig\n```\n\n### Using the LCA database to classify signatures\n\nWe can now use `delmont.lca.json` to classify signatures with k-mers\naccording to the database we just created.  (Note, the database is\ncompletely self-contained at this point.)\n\nLet's classify a single signature:\n```\nsourmash lca classify --db delmont.lca.json \\\n    --query delmont-subsample-sigs/TARA_RED_MAG_00003.fa.gz.sig\n```\n\nand you should see:\n\n```\nloaded 1 databases for LCA use.\nksize=31 scaled=10000\noutputting classifications to stdout\nID,status,superkingdom,phylum,class,order,family,genus,species\nTARA_RED_MAG_00003,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\nclassified 1 signatures total\n```\n\nYou can classify a bunch of signatures and also specify an output\nlocation for the CSV:\n\n```\nsourmash lca classify --db delmont.lca.json \\\n    --query delmont-subsample-sigs/*.sig \\\n    -o out.csv\n```\n\nThe `lca classify` command supports multiple databases as well as\nmultiple queries; e.g. `sourmash lca classify --db delmont.lca.json\nother.lca.json` will classify based on the combination of taxonomies\nin the two databases.\n\n## Some discussion\n\nSourmash LCA is using k-mers to do taxonomic classification, using the\n\"lowest common ancestor\" approach (pioneered by\n[Kraken](http://ccb.jhu.edu/software/kraken/MANUAL.html), and described\n[here](http://ivory.idyll.org/blog/2017-something-about-kmers.html)),\nto identify each k-mer.  From this it can either find a consensus\ntaxonomy between all the k-mers (`sourmash classify`) or it can summarize\nthe mixture of k-mers present in one or more signatures (`sourmash summarize`).\n\nThe `sourmash lca index` command can be used to prepare custom taxonomy\ndatabases; sourmash will happily ingest any taxonomy, whether or not\nit matches NCBI. See\n[the spreadsheet from Delmont et al., 2017](https://github.com/ctb/2017-sourmash-lca/blob/master/tara-delmont-SuppTable3.csv)\nfor an example format.\n\n[Return to index][3]\n\n[0]:http://ivory.idyll.org/blog/2016-sourmash-sbt-more.html\n[1]:databases.md\n[2]:https://www.ncbi.nlm.nih.gov/pubmed/233877\n[3]:index.md\n"
  },
  {
    "path": "doc/tutorials.md",
    "content": "# sourmash tutorials and notebooks\n\n## The first three tutorials!\n\nThese tutorials are command line tutorials that should work on Mac OS\nX and Linux. They require about 5 GB of disk space and 5 GB of RAM.\n\n* [The first sourmash tutorial - making signatures, comparing, and searching](tutorial-basic.md)\n\n* [Using sourmash LCA to do taxonomic classification](tutorials-lca.md)\n\n* [Analyzing the genomic and taxonomic composition of an environmental genome using GTDB and sample-specific MAGs with sourmash](tutorial-lemonade.md)\n\n## Background and details\n\nThese next three tutorials are all notebooks that you can view, run\nyourself, or run interactively online via the\n[binder](https://mybinder.org) service.\n\n* [An introduction to k-mers for genome comparison and analysis.](kmers-and-minhash.ipynb)\n\n* [Some sourmash command line examples!](sourmash-examples.ipynb)\n\n* [Working with private collections of signatures.](sourmash-collections.ipynb)\n\n## Advanced tutorials and more information\n\nFor more information on analyzing sequencing data with sourmash, check out our [longer tutorial](tutorial-long.md).\n\nRead [using `sourmash taxonomy` with the  Life Identification Number (LIN) taxonomic framework](tutorial-lin-taxonomy.md) for some of our newer taxonomic features.\n\nIf you are a Python programmer, you might also be interested in our [API examples](api-example.md) as well as a short guide to [Using the `LCA_Database` API.](using-LCA-database-API.ipynb)\n\nIf you prefer R, we have [a short guide to using sourmash output with R](other-languages.md).\n\n## Customizing matrix and dendrogram plots in Python\n\nIf you're interested in customizing the output of `sourmash plot`,\nwhich produces comparison matrices and dendrograms, please see\n[Building plots from `sourmash compare` output](plotting-compare.ipynb).\n\n## Contents:\n\n```{toctree}\n:maxdepth: 2\n\ntutorial-basic\ntutorials-lca\nkmers-and-minhash\nsourmash-examples\nsourmash-collections\ntutorial-long\ntutorial-lemonade\napi-example\nusing-LCA-database-API\nother-languages\n```\n"
  },
  {
    "path": "doc/using-LCA-database-API.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using the `LCA_Database` API\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`LCA_Database` objects combine a fast in-memory storage of signatures\\n\",\n    \"indexed by their hash values, with taxonomic lineage storage.  They are\\n\",\n    \"limited to storing scaled DNA signatures with a single ksize; the scaled\\n\",\n    \"and ksize values are specified at creation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Running this notebook.\\n\",\n    \"\\n\",\n    \"You can run this notebook interactively via mybinder; click on this button:\\n\",\n    \"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dib-lab/sourmash/latest?labpath=doc%2Fusing-LCA-database-API.ipynb)\\n\",\n    \"\\n\",\n    \"A rendered version of this notebook is available at [sourmash.readthedocs.io](https://sourmash.readthedocs.io) under \\\"Tutorials and notebooks\\\".\\n\",\n    \"\\n\",\n    \"You can also get this notebook from the [doc/ subdirectory of the sourmash github repository](https://github.com/dib-lab/sourmash/tree/latest/doc). See [binder/environment.yaml](https://github.com/dib-lab/sourmash/blob/latest/binder/environment.yml) for installation dependencies.\\n\",\n    \"\\n\",\n    \"### What is this?\\n\",\n    \"\\n\",\n    \"This is a Jupyter Notebook using Python 3. If you are running this via [binder](https://mybinder.org), you can use Shift-ENTER to run cells, and double click on code cells to edit them.\\n\",\n    \"\\n\",\n    \"Contact: C. Titus Brown, ctbrown@ucdavis.edu. Please [file issues on GitHub](https://github.com/dib-lab/sourmash/issues/) if you have any questions or comments!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Creating an `LCA_Database` object\\n\",\n    \"\\n\",\n    \"Create an `LCA_Database` like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sourmash\\n\",\n    \"\\n\",\n    \"db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Create signatures for some genomes, load them, and add them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\r\",\n      \"\\u001b[K\\r\\n\",\n      \"== This is sourmash version 4.8.2. ==\\r\\n\",\n      \"\\r\",\n      \"\\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\\r\\n\",\n      \"\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kcomputing signatures for files: genomes/akkermansia.fa, genomes/shew_os185.fa, genomes/shew_os223.fa\\r\\n\",\n      \"\\r\",\n      \"\\u001b[KComputing a total of 1 signature(s) for each input.\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kskipping genomes/akkermansia.fa - already done\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kskipping genomes/shew_os185.fa - already done\\r\\n\",\n      \"\\r\",\n      \"\\u001b[Kskipping genomes/shew_os223.fa - already done\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!sourmash sketch dna -p k=31,scaled=1000 genomes/*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"sig1 = sourmash.load_one_signature(\\\"akkermansia.fa.sig\\\", ksize=31)\\n\",\n    \"sig2 = sourmash.load_one_signature(\\\"shew_os185.fa.sig\\\", ksize=31)\\n\",\n    \"sig3 = sourmash.load_one_signature(\\\"shew_os223.fa.sig\\\", ksize=31)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"490\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"db.insert(sig1, ident=\\\"akkermansia\\\")\\n\",\n    \"db.insert(sig2, ident=\\\"shew_os185\\\")\\n\",\n    \"db.insert(sig3, ident=\\\"shew_os223\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Run `search` and `gather` via the `Index` API\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[Result(score=1.0, signature=SourmashSignature('CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome', 6822e0b7), location=None)]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from pprint import pprint\\n\",\n    \"\\n\",\n    \"pprint(db.search(sig1, threshold=0.1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[Result(score=1.0, signature=SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', b47b13ef), location=None),\\n\",\n      \" Result(score=0.22846441947565543, signature=SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', ae6659f6), location=None)]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pprint(db.search(sig2, threshold=0.1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Result(score=1.0, signature=SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', ae6659f6), location=None)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pprint(db.best_containment(sig3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Retrieve all signatures with `signatures()`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\\n\",\n      \"NC_009665.1 Shewanella baltica OS185, complete genome\\n\",\n      \"NC_011663.1 Shewanella baltica OS223, complete genome\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for i in db.signatures():\\n\",\n    \"    print(i)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Access identifiers and names\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The list of (unique) identifiers in the database can be accessed via the attribute `ident_to_idx`, which maps to integer identifiers; identifiers can also retrieve full names, which are taken from `sig.name()` upon insertion.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"dict_keys(['akkermansia', 'shew_os185', 'shew_os223'])\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pprint(db._ident_to_idx.keys())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{'akkermansia': 'CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete '\\n\",\n      \"                'genome',\\n\",\n      \" 'shew_os185': 'NC_009665.1 Shewanella baltica OS185, complete genome',\\n\",\n      \" 'shew_os223': 'NC_011663.1 Shewanella baltica OS223, complete genome'}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pprint(db._ident_to_name)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Access hash values directly\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The attribute `_hashval_to_idx` contains a mapping from individual hash values to sets of `idx` indices.\\n\",\n    \"\\n\",\n    \"See the method `_find_signatures()` for an example of how this is used in `search` and `gather`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1300 hash values total in this database\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(f\\\"{len(db._hashval_to_idx)} hash values total in this database\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"belonging to signatures with idx {0, 1, 2}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"all_idx = set()\\n\",\n    \"for idx_set in db._hashval_to_idx.values():\\n\",\n    \"    all_idx.update(idx_set)\\n\",\n    \"print(f\\\"belonging to signatures with idx {all_idx}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"first_three_hashvals = list(db._hashval_to_idx)[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"hashval 17302105753387 belongs to idxs {0}\\n\",\n      \"hashval 95741036335406 belongs to idxs {0}\\n\",\n      \"hashval 165640715598232 belongs to idxs {0}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for hashval in first_three_hashvals:\\n\",\n    \"    print(f\\\"hashval {hashval} belongs to idxs {db._hashval_to_idx[hashval]}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"490 hashvals belong to query idx 2\\n\",\n      \"query idx 2 matches to ident shew_os223\\n\",\n      \"query idx 2 matches to name NC_011663.1 Shewanella baltica OS223, complete genome\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"query_idx = 2\\n\",\n    \"hashval_set = set()\\n\",\n    \"for hashval, idx_set in db._hashval_to_idx.items():\\n\",\n    \"    if query_idx in idx_set:\\n\",\n    \"        hashval_set.add(hashval)\\n\",\n    \"\\n\",\n    \"print(f\\\"{len(hashval_set)} hashvals belong to query idx {query_idx}\\\")\\n\",\n    \"\\n\",\n    \"ident = db._idx_to_ident[query_idx]\\n\",\n    \"print(f\\\"query idx {query_idx} matches to ident {ident}\\\")\\n\",\n    \"\\n\",\n    \"name = db._ident_to_name[ident]\\n\",\n    \"print(f\\\"query idx {query_idx} matches to name {name}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lineage storage and retrieval\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from sourmash.lca.lca_utils import LineagePair\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"superkingdom = LineagePair(\\\"superkingdom\\\", \\\"Bacteria\\\")\\n\",\n    \"phylum = LineagePair(\\\"phylum\\\", \\\"Verrucomicrobia\\\")\\n\",\n    \"klass = LineagePair(\\\"class\\\", \\\"Verrucomicrobiae\\\")\\n\",\n    \"\\n\",\n    \"lineage = (superkingdom, phylum, klass)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"499\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\\n\",\n    \"db.insert(sig1, lineage=lineage)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"ident 'CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome' has idx 0\\n\",\n      \"lid for idx 0 is 0\\n\",\n      \"lineage for lid 0 is Bacteria;Verrucomicrobia;Verrucomicrobiae\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# by default, the identifier is the signature name --\\n\",\n    \"ident = sig1.name\\n\",\n    \"idx = db._ident_to_idx[ident]\\n\",\n    \"print(f\\\"ident '{ident}' has idx {idx}\\\")\\n\",\n    \"\\n\",\n    \"lid = db._idx_to_lid[idx]\\n\",\n    \"print(f\\\"lid for idx {idx} is {lid}\\\")\\n\",\n    \"\\n\",\n    \"lineage = db._lid_to_lineage[lid]\\n\",\n    \"display = sourmash.lca.display_lineage(lineage)\\n\",\n    \"print(f\\\"lineage for lid {lid} is {display}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lineage manipulation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Default taxonomy ranks for lineages\\n\",\n    \"\\n\",\n    \"While sourmash lineage functions can work with any taxonomy ranks and any taxonomy names, both the NCBI and GTDB taxonomies use superkingdom/phylum/etc, so there is a hard coded list availalbe via `sourmash.lca.taxlist()`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['superkingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species', 'strain']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(list(sourmash.lca.taxlist()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given a taxonomy as a list, you can then construct a lineage like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[LineagePair(rank='superkingdom', name='Bacteria'),\\n\",\n      \" LineagePair(rank='phylum', name='Verrucomicrobia'),\\n\",\n      \" LineagePair(rank='class', name='Verrucomicrobiae'),\\n\",\n      \" LineagePair(rank='order', name='Verrucomicrobiales'),\\n\",\n      \" LineagePair(rank='family', name='Akkermansiaceae'),\\n\",\n      \" LineagePair(rank='genus', name='Akkermansia'),\\n\",\n      \" LineagePair(rank='species', name='Akkermansia muciniphila'),\\n\",\n      \" LineagePair(rank='strain', name='Akkermansia muciniphila ATCC BAA-835')]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"linstr1 = [\\n\",\n    \"    \\\"Bacteria\\\",\\n\",\n    \"    \\\"Verrucomicrobia\\\",\\n\",\n    \"    \\\"Verrucomicrobiae\\\",\\n\",\n    \"    \\\"Verrucomicrobiales\\\",\\n\",\n    \"    \\\"Akkermansiaceae\\\",\\n\",\n    \"    \\\"Akkermansia\\\",\\n\",\n    \"    \\\"Akkermansia muciniphila\\\",\\n\",\n    \"    \\\"Akkermansia muciniphila ATCC BAA-835\\\",\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"lineage1 = [LineagePair(*pair) for pair in zip(sourmash.lca.taxlist(), linstr1)]\\n\",\n    \"pprint(lineage1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila;Akkermansia muciniphila ATCC BAA-835'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# display lineages as strings with 'sourmash.lca.display_lineage()'\\n\",\n    \"sourmash.lca.display_lineage(lineage1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## sourmash lowest-common-ancestor functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The LCA functionality available in sourmash is built around some simple lineage manipulation functions -- `build_tree` and `find_lca`.\\n\",\n    \"\\n\",\n    \"First, let's define some more lineages --\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"lineage2 is Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS185\\n\",\n      \"lineage3 is Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"linstr2 = [\\n\",\n    \"    \\\"Bacteria\\\",\\n\",\n    \"    \\\"Proteobacteria\\\",\\n\",\n    \"    \\\"Gammaproteobacteria\\\",\\n\",\n    \"    \\\"Alteromonadales\\\",\\n\",\n    \"    \\\"Shewanellaceae\\\",\\n\",\n    \"    \\\"Shewanella\\\",\\n\",\n    \"    \\\"Shewanella baltica\\\",\\n\",\n    \"    \\\"Shewanella baltica OS185\\\",\\n\",\n    \"]\\n\",\n    \"lineage2 = [LineagePair(*pair) for pair in zip(sourmash.lca.taxlist(), linstr2)]\\n\",\n    \"\\n\",\n    \"linstr3 = [\\n\",\n    \"    \\\"Bacteria\\\",\\n\",\n    \"    \\\"Proteobacteria\\\",\\n\",\n    \"    \\\"Gammaproteobacteria\\\",\\n\",\n    \"    \\\"Alteromonadales\\\",\\n\",\n    \"    \\\"Shewanellaceae\\\",\\n\",\n    \"    \\\"Shewanella\\\",\\n\",\n    \"    \\\"Shewanella baltica\\\",\\n\",\n    \"    \\\"Shewanella baltica OS223\\\",\\n\",\n    \"]\\n\",\n    \"lineage3 = [LineagePair(*pair) for pair in zip(sourmash.lca.taxlist(), linstr3)]\\n\",\n    \"\\n\",\n    \"print(\\\"lineage2 is\\\", sourmash.lca.display_lineage(lineage2))\\n\",\n    \"print(\\\"lineage3 is\\\", sourmash.lca.display_lineage(lineage3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now, build a tree structure that collapses these lineages where it can, and run some LCA analyses. Lineages 1 and 2 collapse to superkingdom:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"((LineagePair(rank='superkingdom', name='Bacteria'),), 2)\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"tree = sourmash.lca.build_tree([lineage1, lineage2])\\n\",\n    \"sourmash.lca.find_lca(tree)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"while lineages 2 and 3 collapse to species:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"((LineagePair(rank='superkingdom', name='Bacteria'),\\n\",\n       \"  LineagePair(rank='phylum', name='Proteobacteria'),\\n\",\n       \"  LineagePair(rank='class', name='Gammaproteobacteria'),\\n\",\n       \"  LineagePair(rank='order', name='Alteromonadales'),\\n\",\n       \"  LineagePair(rank='family', name='Shewanellaceae'),\\n\",\n       \"  LineagePair(rank='genus', name='Shewanella'),\\n\",\n       \"  LineagePair(rank='species', name='Shewanella baltica')),\\n\",\n       \" 2)\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"tree = sourmash.lca.build_tree([lineage2, lineage3])\\n\",\n    \"sourmash.lca.find_lca(tree)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Convenience functions let you make use of LCA_Database stored lineages\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, let's create a database from 3 signatures, and this time we'll store lineages in there:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"490\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\\n\",\n    \"db.insert(sig1, lineage=lineage1)\\n\",\n    \"db.insert(sig2, lineage=lineage2)\\n\",\n    \"db.insert(sig3, lineage=lineage3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now, for any collection of hashes, you can retrieve all the lineage assignments into a dictionary:\\n\",\n    \"`{ hashval: set of lineages }`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"num hashvals: 494\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/var/folders/6s/_f373w1d6hdfjc2kjstq97s80000gp/T/ipykernel_3384/490137846.py:1: DeprecatedWarning: get_mins is deprecated as of 3.5 and will be removed in 5.0. Use .hashes property instead.\\n\",\n      \"  assignments = sourmash.lca.gather_assignments(sig2.minhash.get_mins(), [db])\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"assignments = sourmash.lca.gather_assignments(sig2.minhash.get_mins(), [db])\\n\",\n    \"print(\\\"num hashvals:\\\", len(assignments))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For example, this particular hashvalue belongs to two different lineages:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{(LineagePair(rank='superkingdom', name='Bacteria'),\\n\",\n       \"  LineagePair(rank='phylum', name='Proteobacteria'),\\n\",\n       \"  LineagePair(rank='class', name='Gammaproteobacteria'),\\n\",\n       \"  LineagePair(rank='order', name='Alteromonadales'),\\n\",\n       \"  LineagePair(rank='family', name='Shewanellaceae'),\\n\",\n       \"  LineagePair(rank='genus', name='Shewanella'),\\n\",\n       \"  LineagePair(rank='species', name='Shewanella baltica'),\\n\",\n       \"  LineagePair(rank='strain', name='Shewanella baltica OS185')),\\n\",\n       \" (LineagePair(rank='superkingdom', name='Bacteria'),\\n\",\n       \"  LineagePair(rank='phylum', name='Proteobacteria'),\\n\",\n       \"  LineagePair(rank='class', name='Gammaproteobacteria'),\\n\",\n       \"  LineagePair(rank='order', name='Alteromonadales'),\\n\",\n       \"  LineagePair(rank='family', name='Shewanellaceae'),\\n\",\n       \"  LineagePair(rank='genus', name='Shewanella'),\\n\",\n       \"  LineagePair(rank='species', name='Shewanella baltica'),\\n\",\n       \"  LineagePair(rank='strain', name='Shewanella baltica OS223'))}\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"assignments[196037984804395]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"sourmash also includes functions to summarize assignments by counting the number of\\n\",\n    \"times a particular lineage occurs; this is\\n\",\n    \"used by `sourmash lca classify` and `sourmash lca summarize`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"311 hashes have LCA: Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS185\\n\",\n      \"183 hashes have LCA: Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"counter = sourmash.lca.count_lca_for_assignments(assignments)\\n\",\n    \"\\n\",\n    \"# count_lca_for_assignments returns a collections.Counter object\\n\",\n    \"for lineage, count in counter.most_common():\\n\",\n    \"    print(f\\\"{count} hashes have LCA: {sourmash.lca.display_lineage(lineage)}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Other pointers\\n\",\n    \"\\n\",\n    \"[Sourmash: a practical guide](https://sourmash.readthedocs.io/en/latest/using-sourmash-a-guide.html)\\n\",\n    \"\\n\",\n    \"[Classifying signatures taxonomically](https://sourmash.readthedocs.io/en/latest/classifying-signatures.html)\\n\",\n    \"\\n\",\n    \"[Pre-built search databases](https://sourmash.readthedocs.io/en/latest/databases.html)\\n\",\n    \"\\n\",\n    \"## A full list of notebooks\\n\",\n    \"\\n\",\n    \"[An introduction to k-mers for genome comparison and analysis](kmers-and-minhash.ipynb)\\n\",\n    \"\\n\",\n    \"[Some sourmash command line examples!](sourmash-examples.ipynb)\\n\",\n    \"\\n\",\n    \"[Working with private collections of signatures.](sourmash-collections.ipynb)\\n\",\n    \"\\n\",\n    \"[Using the LCA_Database API.](using-LCA-database-API.ipynb)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"smash-notebooks\",\n   \"language\": \"python\",\n   \"name\": \"smash-notebooks\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.11.3\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "doc/using-sourmash-a-guide.md",
    "content": "# Using sourmash: a practical guide\n\n```{contents}\n   :depth: 2\n```\n\nSo! You've installed sourmash, run a few of the tutorials and commands,\nand now you actually want to *use* it.  This guide is here to answer some\nof your questions, and explain why we can't answer others.\n\n(If you have additional questions, please [file an issue!](https://github.com/sourmash-bio/sourmash/issues))\n\n## What k-mer size(s) should I use?\n\nYou can build signatures at a variety of k-mer sizes all at once, and\n(unless you are working with very large metagenomes) the resulting\nsignature files will still be quite small.  \n\nWe suggest including k=31 and k=51.  k=51 gives you the most stringent\nmatches, and has very few false positives. k=31 may be more sensitive\nat the genus level.\n\nWhy 31 and 51, specifically? To a large extent these numbers were\npicked out of a hat, based on our reading of papers like the\n[Metapalette paper (Koslicki and Falush, 2016](http://msystems.asm.org/content/1/3/e00020-16). You\ncould go with k=49 or k=53 and probably get very similar results to\nk=51.  The general rule is that longer k-mer sizes are less prone to\nfalse positives. But you can pick your own parameters.\n\nOne additional wrinkle is that we provide a number of\n[precalculated databases](databases.md) at k=21, k=31, and k=51.\nIt is often convenient to calculate signatures at these sizes so that\nyou can use these databases.\n\nYou'll notice that all of the above numbers are odd.  That is to avoid\noccasional minor complications from palindromes in numerical\ncalculations, where the forward and reverse complements of a k-mer are\nidentical.  This cannot happen if k is odd. It is not enforced by sourmash,\nhowever, and it probably doesn't really matter.\n\n(When we have blog posts or publications providing more formal\nguidance, we'll link to them here!)\n\n## What resolution should my signatures be and how should I create them?\n\nsourmash supports two ways of choosing the resolution or size of\nyour signatures: using `num` to specify the maximum number of hashes,\nor `scaled` to specify the compression ratio.  Which should you use?\n\nWe suggest calculating all your signatures using `-p scaled=1000`.\nThis will give you a compression ratio of 1000-to-1 while making it\npossible to detect regions of similarity in the 10kb range.\n\nFor comparison with more traditional MinHash approaches like `mash`,\nif you have a 5 Mbp genome and use `-p scaled=1000`, you will extract\napproximately 5000 hashes. So a scaled of 1000 is equivalent to using\n`-p num=5000` with mash on a 5 Mbp genome.\n\nThe difference between using `num` and `scaled` is in metagenome\nanalysis: fixing the number of hashes with `num` limits your ability to\ndetect rare organisms, or alternatively results in very large\nsignatures (e.g. if you use n larger than 10000).  `scaled` will scale\nyour resolution with the diversity of the metagenome.\n\nYou can read more about this in this blog post from the mash folk,\n[Mash Screen: What's in my sequencing run?](https://genomeinformatics.github.io/mash-screen/) What\nwe do with sourmash and `scaled` is similar to the 'modulo hash'\nmentioned in that blog post.\n\n(Again, when we have formal guidance on this based on benchmarks, we'll\nlink to it here.)\n\n## What kind of input data does sourmash work on?\n\nsourmash has been used most extensively with Illumina read data sets\nand assembled genomes, transcriptomes, and metagenomes.  The high error\nrate of PacBio and Nanopore sequencing is problematic for k-mer based\napproaches and we have not yet explored how to tune parameters for\nthis kind of sequencing.\n\nOn a more practical note, `sourmash sketch` will autodetect FASTA and\nFASTQ formats, whether they are uncompressed, gzipped, or bzip2-ed.\nNothing special needs to be done.\n\n## How should I prepare my data?\n\nRaw Illumina read data sets should be k-mer abundance trimmed to get rid of\nthe bulk of erroneous kmers. We suggest a command like the following,\nusing [trim-low-abund from the khmer project](https://peerj.com/preprints/890/) --\n\n```\ntrim-low-abund.py -C 3 -Z 18 -V -M 2e9 <all of your input read files>\n```\n\nThis is safe to use on genomes, metagenomes, and transcriptomes.  If you\nare working with large genomes or diverse metagenomes, you may need to\nincrease the `-M` parameter to use more memory.\n\nSee [the khmer docs for trim-low-abund.py](https://khmer.readthedocs.io/en/v2.1.2/user/scripts.html#trim-low-abund-py) and [the semi-streaming preprint](https://peerj.com/preprints/890/) for more information.\n\nFor high coverage genomic data, you can do very stringent trimming with\nan absolute cutoff, e.g.\n\n```\ntrim-low-abund.py -C 10 -M 2e9 <all of your input read files>\n```\n\nwill eliminate all k-mers that appear fewer than 10 times in your data\nset.  This kind of trimming will dramatically reduce your sensitivity\nwhen working with metagenomes and transcriptomes, however, where there\nare always real low-abundance k-mers present.\n\n## Could you just give us the !#%#!$ command line?\n\nSorry, yes! See below.\n\n### Calculating signatures for read files:\n\n```\ntrim-low-abund -C 3 -Z 18 -V -M 2e9 input-reads-1.fq input-reads-2.fq ...\nsourmash sketch dna -p scaled=1000,k=21,k=31,k=51 input-reads*.fq.abundtrim \\\n    --merge SOMENAME -o SOMENAME-reads.sig\n```\n\nThe first command trims off low-abundance k-mers from high-coverage\nreads; the second takes all the trimmed read files, subsamples k-mers\nfrom them at 1000:1, and outputs a single merged signature named\n'SOMENAME' into the file `SOMENAME-reads.sig`.\n\n### Calculating a combined signature for multiple read files\n\n```\nsourmash sketch dna -p scaled=1000,k=21,k=31,k=51 sample_*.fq.gz \\\n    --name \"combined sketch for sample\" -o sample.zip\n```\n\nThis will build combined sketches of all `*.fq.gz` files\nin the directory for three ksizes, k=21, k=31, and k=51. The three sketches\nwill be named `combined sketch for sample` and be saved to `sample.zip`.\n\n### Creating signatures for individual genome files:\n\n```\nsourmash sketch dna -p scaled=1000,k=21,k=31,k=51 *.fna.gz --name-from-first\n```\n\nThis command creates signatures for all `*.fna.gz` files, and names\neach signature based on the first FASTA header in each file (that's\nwhat the option `--name-from-first` does). The signatures will be placed\nin `*.fna.gz.sig`.\n\n### Creating signatures from a collection of genomes in a single file:\n\n```\nsourmash sketch dna -p scaled=1000,k=21,k=31,k=51 file.fa --singleton\n```\n\nThis creates signatures for all individual FASTA sequences in `file.fa`,\nnames them based on their FASTA headers, and places them all in a single\n`.sig` file, `file.fa.sig`.  (This behavior is triggered by the option\n`--singleton`, which tells sourmash to treat each individual sequence in\nthe file as an independent sequence.)\n\n## How do I store and search collections of signatures?\n\nsourmash supports a variety of signature loading and storage options for\nflexibility.  If you have only a few hundred signatures, here are some\noptions -\n\n* you can put all your signature files in a directory and search them all\n  using the path to the directory.\n* you can use `sourmash sig cat` to concatenate multiple signatures into a\n  single file.\n* you can compress any signature file using `gzip` and sourmash will\n  load them.\n\nIf you have more than a few hundred genome signatures that you\nregularly search, it might be worth creating an indexed database of\nthem that will support faster searches.\n\nsourmash supports two types of indexed databases: Sequence Bloom\nTrees, or SBTs; and reverse indices, or LCAs.  (You can read more\ndetail about their implementation and design considerations\n[in Chapter 2 of Dr. Luiz Irber's thesis, \"Efficient indexing of collections of signatures\"](https://github.com/luizirber/phd/releases/download/2020.09.28/thesis.pdf).)\n\n### Sequence Bloom Tree (SBT) indexed databases\n\nSequence Bloom Trees (SBTs) (see\n[Solomon and Kingsford, 2016](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4804353/))\nare on disk databases that support low-memory query of 10s-100s of\nthousands of signatures.  They can be created using `sourmash index`.\n\nSBTs are the lowest-memory way to run search or gather on a collection\nof signatures. The tradeoff is that they may be quite large on disk,\nbecause SBTs also contain intermediate nodes in the tree.  The default\nway to store SBTs is in a Zip file, named `.sbt.zip`, that can be\nbuilt and searched directly from the command line.\n\n### Reverse indexed (LCA) databases\n\nReverse indexed or LCA databases are *in-memory* databases that, once\nloaded from disk, support fast search and gather across 10s of thousands\nof signatures.  They can be created using `sourmash lca index` ([docs](command-line.md#sourmash-lca-index---build-an-lca-database))\n\nLCA databases are currently stored in JSON files (that can be gzipped).\nAs these files get larger, the time required to load them from disk\ncan be substantial.\n\nLCA databases are also currently (sourmash 2.0-4.0) the only databases\nthat support the inclusion of taxonomic information in the database,\nand there is an associated collection of commands\n[under `sourmash lca`](command-line.md#sourmash-lca-subcommands-for-in-memory-taxonomy-integration).\nHowever, they can also be used as regular indexed databases for search\nand gather as above.\n\n(These are called \"LCA databases\" because they originally were created\nto support \"lowest common ancestor\" taxonomic analyses, e.g. like\nKraken; their functionality has evolved a lot since, but their name\nhasn't changed to match!)\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n    utils.url = \"github:numtide/flake-utils\";\n\n    rust-overlay = {\n      url = \"github:oxalica/rust-overlay\";\n      inputs = {\n        nixpkgs.follows = \"nixpkgs\";\n      };\n    };\n  };\n\n  outputs =\n    {\n      self,\n      nixpkgs,\n      rust-overlay,\n      utils,\n    }:\n    utils.lib.eachDefaultSystem (\n      system:\n      let\n        overlays = [ (import rust-overlay) ];\n        pkgs = import nixpkgs {\n          inherit system overlays;\n        };\n        rustVersion = pkgs.rust-bin.stable.latest.default.override {\n          #extensions = [ \"rust-src\" ];\n          extensions = [ \"llvm-tools-preview\" ];\n          #targets = [ \"x86_64-unknown-linux-musl\" ];\n          targets = [\n            \"wasm32-unknown-unknown\"\n            \"wasm32-unknown-emscripten\"\n          ];\n        };\n        rustPlatform = pkgs.makeRustPlatform {\n          cargo = rustVersion;\n          rustc = rustVersion;\n        };\n\n        inherit (pkgs) lib;\n\n        python = pkgs.python314Packages;\n\n        commonArgs = {\n          src = ./.;\n          preConfigure = lib.optionalString pkgs.stdenv.isDarwin ''\n            export MACOSX_DEPLOYMENT_TARGET=10.14\n          '';\n\n          nativeBuildInputs = with rustPlatform; [\n            cargoSetupHook\n            maturinBuildHook\n            bindgenHook\n          ];\n        };\n\n      in\n\n      with pkgs;\n      {\n        packages = {\n\n          lib = rustPlatform.buildRustPackage (\n            commonArgs\n            // {\n              name = \"libsourmash\";\n              copyLibs = true;\n              cargoLock.lockFile = ./Cargo.lock;\n              nativeBuildInputs = with rustPlatform; [ bindgenHook ];\n            }\n          );\n\n          sourmash = python.buildPythonPackage (\n            commonArgs\n            // rec {\n              pname = \"sourmash\";\n              version = \"4.9.4\";\n              format = \"pyproject\";\n\n              cargoDeps = rustPlatform.importCargoLock {\n                lockFile = ./Cargo.lock;\n              };\n\n              propagatedBuildInputs = with python; [\n                cffi\n                deprecation\n                cachetools\n                bitstring\n                numpy\n                scipy\n                matplotlib\n                screed\n              ];\n            }\n          );\n\n          docker =\n            let\n              bin = self.defaultPackage.${system};\n            in\n            pkgs.dockerTools.buildLayeredImage {\n              name = bin.pname;\n              tag = bin.version;\n              contents = [ bin ];\n\n              config = {\n                Cmd = [ \"/bin/sourmash\" ];\n                WorkingDir = \"/\";\n              };\n            };\n        };\n\n        defaultPackage = self.packages.${system}.sourmash;\n\n        devShells.default = pkgs.mkShell (\n          commonArgs\n          // {\n            nativeBuildInputs = with rustPlatform; [ bindgenHook ];\n\n            buildInputs = [\n              rustVersion\n              openssl\n              pkg-config\n\n              git\n              pkgs.stdenv.cc.cc.lib\n              (python314.withPackages (\n                ps: with ps; [\n                  virtualenv\n                  tox\n                  cffi\n                ]\n              ))\n              (python313.withPackages (ps: with ps; [ virtualenv ]))\n              (python312.withPackages (ps: with ps; [ virtualenv ]))\n              (python311.withPackages (ps: with ps; [ virtualenv ]))\n\n              #rust-cbindgen\n              maturin\n\n              wasmtime\n              wasm-pack\n              nodejs_20\n              #emscripten\n\n              #py-spy\n              #heaptrack\n              cargo-all-features\n              cargo-watch\n              cargo-limit\n              cargo-outdated\n              cargo-udeps\n              cargo-deny\n              cargo-nextest\n              cargo-llvm-cov\n              cargo-component\n              cargo-codspeed\n              #cargo-semver-checks\n              nixpkgs-fmt\n            ];\n\n            shellHook = ''\n              export MACOSX_DEPLOYMENT_TARGET=10.14\n            '';\n\n            # Needed for matplotlib\n            LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib ];\n\n            # workaround for https://github.com/NixOS/nixpkgs/blob/48dfc9fa97d762bce28cc8372a2dd3805d14c633/doc/languages-frameworks/python.section.md#python-setuppy-bdist_wheel-cannot-create-whl\n            SOURCE_DATE_EPOCH = 315532800; # 1980\n\n            # exporting to fix doc building errors in sphinx\n            LC_ALL = \"C.utf8\";\n          }\n        );\n      }\n    );\n}\n"
  },
  {
    "path": "include/sourmash.h",
    "content": "/* c bindings to the sourmash library */\n\n#ifndef SOURMASH_H_INCLUDED\n#define SOURMASH_H_INCLUDED\n\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n\nenum HashFunctions {\n  HASH_FUNCTIONS_MURMUR64_DNA = 1,\n  HASH_FUNCTIONS_MURMUR64_PROTEIN = 2,\n  HASH_FUNCTIONS_MURMUR64_DAYHOFF = 3,\n  HASH_FUNCTIONS_MURMUR64_HP = 4,\n  HASH_FUNCTIONS_MURMUR64_SKIPM1N3 = 5,\n  HASH_FUNCTIONS_MURMUR64_SKIPM2N3 = 6,\n};\ntypedef uint32_t HashFunctions;\n\nenum SourmashErrorCode {\n  SOURMASH_ERROR_CODE_NO_ERROR = 0,\n  SOURMASH_ERROR_CODE_PANIC = 1,\n  SOURMASH_ERROR_CODE_INTERNAL = 2,\n  SOURMASH_ERROR_CODE_MSG = 3,\n  SOURMASH_ERROR_CODE_UNKNOWN = 4,\n  SOURMASH_ERROR_CODE_MISMATCH_K_SIZES = 101,\n  SOURMASH_ERROR_CODE_MISMATCH_DNA_PROT = 102,\n  SOURMASH_ERROR_CODE_MISMATCH_SCALED = 103,\n  SOURMASH_ERROR_CODE_MISMATCH_SEED = 104,\n  SOURMASH_ERROR_CODE_MISMATCH_SIGNATURE_TYPE = 105,\n  SOURMASH_ERROR_CODE_NON_EMPTY_MIN_HASH = 106,\n  SOURMASH_ERROR_CODE_MISMATCH_NUM = 107,\n  SOURMASH_ERROR_CODE_NEEDS_ABUNDANCE_TRACKING = 108,\n  SOURMASH_ERROR_CODE_CANNOT_UPSAMPLE_SCALED = 109,\n  SOURMASH_ERROR_CODE_NO_MIN_HASH_FOUND = 110,\n  SOURMASH_ERROR_CODE_EMPTY_SIGNATURE = 111,\n  SOURMASH_ERROR_CODE_MULTIPLE_SKETCHES_FOUND = 112,\n  SOURMASH_ERROR_CODE_EMPTY_RECORD = 113,\n  SOURMASH_ERROR_CODE_INVALID_DNA = 1101,\n  SOURMASH_ERROR_CODE_INVALID_PROT = 1102,\n  SOURMASH_ERROR_CODE_INVALID_CODON_LENGTH = 1103,\n  SOURMASH_ERROR_CODE_INVALID_HASH_FUNCTION = 1104,\n  SOURMASH_ERROR_CODE_INVALID_SKIPMER_FRAME = 1105,\n  SOURMASH_ERROR_CODE_INVALID_SKIPMER_SIZE = 1106,\n  SOURMASH_ERROR_CODE_INVALID_TRANSLATE_FRAME = 1107,\n  SOURMASH_ERROR_CODE_READ_DATA = 1201,\n  SOURMASH_ERROR_CODE_STORAGE = 1202,\n  SOURMASH_ERROR_CODE_HLL_PRECISION_BOUNDS = 1301,\n  SOURMASH_ERROR_CODE_ANI_ESTIMATION_ERROR = 1401,\n  SOURMASH_ERROR_CODE_IO = 100001,\n  SOURMASH_ERROR_CODE_UTF8_ERROR = 100002,\n  SOURMASH_ERROR_CODE_PARSE_INT = 100003,\n  SOURMASH_ERROR_CODE_SERDE_ERROR = 100004,\n  SOURMASH_ERROR_CODE_NIFFLER_ERROR = 100005,\n  SOURMASH_ERROR_CODE_CSV_ERROR = 100006,\n  SOURMASH_ERROR_CODE_ROCKS_DB_ERROR = 100007,\n  SOURMASH_ERROR_CODE_ZIP_ERROR = 100008,\n};\ntypedef uint32_t SourmashErrorCode;\n\ntypedef struct SourmashComputeParameters SourmashComputeParameters;\n\ntypedef struct SourmashDatasetPicklist SourmashDatasetPicklist;\n\ntypedef struct SourmashHyperLogLog SourmashHyperLogLog;\n\ntypedef struct SourmashKmerMinHash SourmashKmerMinHash;\n\ntypedef struct SourmashManifest SourmashManifest;\n\ntypedef struct SourmashManifestRowIter SourmashManifestRowIter;\n\ntypedef struct SourmashNodegraph SourmashNodegraph;\n\ntypedef struct SourmashRevIndex SourmashRevIndex;\n\ntypedef struct SourmashRevIndex_CounterGather SourmashRevIndex_CounterGather;\n\ntypedef struct SourmashSearchResult SourmashSearchResult;\n\ntypedef struct SourmashSignature SourmashSignature;\n\ntypedef struct SourmashZipStorage SourmashZipStorage;\n\ntypedef uint32_t ScaledType;\n\n/**\n * Represents a string.\n */\ntypedef struct {\n  /**\n   * Pointer to the UTF-8 encoded string data.\n   */\n  char *data;\n  /**\n   * The length of the string pointed to by `data`.\n   */\n  uintptr_t len;\n  /**\n   * Indicates that the string is owned and must be freed.\n   */\n  bool owned;\n} SourmashStr;\n\ntypedef struct {\n  uint32_t ksize;\n  bool with_abundance;\n  SourmashStr md5;\n  SourmashStr internal_location;\n  SourmashStr name;\n  SourmashStr moltype;\n  uintptr_t n_hashes;\n  uint32_t num;\n  uint32_t scaled;\n  SourmashStr filename;\n} SourmashManifestRow;\n\nbool computeparams_dayhoff(const SourmashComputeParameters *ptr);\n\nbool computeparams_dna(const SourmashComputeParameters *ptr);\n\nvoid computeparams_free(SourmashComputeParameters *ptr);\n\nbool computeparams_hp(const SourmashComputeParameters *ptr);\n\nconst uint32_t *computeparams_ksizes(const SourmashComputeParameters *ptr, uintptr_t *size);\n\nvoid computeparams_ksizes_free(uint32_t *ptr, uintptr_t insize);\n\nSourmashComputeParameters *computeparams_new(void);\n\nuint32_t computeparams_num_hashes(const SourmashComputeParameters *ptr);\n\nbool computeparams_protein(const SourmashComputeParameters *ptr);\n\nScaledType computeparams_scaled(const SourmashComputeParameters *ptr);\n\nuint64_t computeparams_seed(const SourmashComputeParameters *ptr);\n\nvoid computeparams_set_dayhoff(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_dna(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_hp(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_ksizes(SourmashComputeParameters *ptr,\n                              const uint32_t *ksizes_ptr,\n                              uintptr_t insize);\n\nvoid computeparams_set_num_hashes(SourmashComputeParameters *ptr, uint32_t num);\n\nvoid computeparams_set_protein(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_scaled(SourmashComputeParameters *ptr, uint32_t scaled);\n\nvoid computeparams_set_seed(SourmashComputeParameters *ptr, uint64_t new_seed);\n\nvoid computeparams_set_skipm1n3(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_skipm2n3(SourmashComputeParameters *ptr, bool v);\n\nvoid computeparams_set_track_abundance(SourmashComputeParameters *ptr, bool v);\n\nbool computeparams_skipm1n3(const SourmashComputeParameters *ptr);\n\nbool computeparams_skipm2n3(const SourmashComputeParameters *ptr);\n\nbool computeparams_track_abundance(const SourmashComputeParameters *ptr);\n\nvoid dataset_picklist_free(SourmashDatasetPicklist *ptr);\n\nconst SourmashDatasetPicklist *dataset_picklist_new_from_list(const uint32_t *dataset_idxs_ptr,\n                                                              uintptr_t insize);\n\nuint64_t hash_murmur(const char *kmer, uint64_t seed);\n\nvoid hll_add_hash(SourmashHyperLogLog *ptr, uint64_t hash);\n\nvoid hll_add_sequence(SourmashHyperLogLog *ptr, const char *sequence, uintptr_t insize, bool force);\n\nuintptr_t hll_cardinality(const SourmashHyperLogLog *ptr);\n\ndouble hll_containment(const SourmashHyperLogLog *ptr, const SourmashHyperLogLog *optr);\n\nvoid hll_free(SourmashHyperLogLog *ptr);\n\nSourmashHyperLogLog *hll_from_buffer(const char *ptr, uintptr_t insize);\n\nSourmashHyperLogLog *hll_from_path(const char *filename);\n\nuintptr_t hll_intersection_size(const SourmashHyperLogLog *ptr, const SourmashHyperLogLog *optr);\n\nuintptr_t hll_ksize(const SourmashHyperLogLog *ptr);\n\nuintptr_t hll_matches(const SourmashHyperLogLog *ptr, const SourmashKmerMinHash *mh_ptr);\n\nvoid hll_merge(SourmashHyperLogLog *ptr, const SourmashHyperLogLog *optr);\n\nSourmashHyperLogLog *hll_new(void);\n\nvoid hll_save(const SourmashHyperLogLog *ptr, const char *filename);\n\ndouble hll_similarity(const SourmashHyperLogLog *ptr, const SourmashHyperLogLog *optr);\n\nconst uint8_t *hll_to_buffer(const SourmashHyperLogLog *ptr, uintptr_t *size);\n\nvoid hll_update_mh(SourmashHyperLogLog *ptr, const SourmashKmerMinHash *optr);\n\nSourmashHyperLogLog *hll_with_error_rate(double error_rate, uintptr_t ksize);\n\nvoid kmerminhash_add_from(SourmashKmerMinHash *ptr, const SourmashKmerMinHash *other);\n\nvoid kmerminhash_add_hash(SourmashKmerMinHash *ptr, uint64_t h);\n\nvoid kmerminhash_add_hash_with_abundance(SourmashKmerMinHash *ptr, uint64_t h, uint64_t abundance);\n\nvoid kmerminhash_add_many(SourmashKmerMinHash *ptr, const uint64_t *hashes_ptr, uintptr_t insize);\n\nvoid kmerminhash_add_protein(SourmashKmerMinHash *ptr, const char *sequence);\n\nvoid kmerminhash_add_sequence(SourmashKmerMinHash *ptr, const char *sequence, bool force);\n\nvoid kmerminhash_add_word(SourmashKmerMinHash *ptr, const char *word);\n\ndouble kmerminhash_angular_similarity(const SourmashKmerMinHash *ptr,\n                                      const SourmashKmerMinHash *other);\n\nvoid kmerminhash_clear(SourmashKmerMinHash *ptr);\n\nuint64_t kmerminhash_count_common(const SourmashKmerMinHash *ptr,\n                                  const SourmashKmerMinHash *other,\n                                  bool downsample);\n\nbool kmerminhash_dayhoff(const SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_disable_abundance(SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_enable_abundance(SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_free(SourmashKmerMinHash *ptr);\n\nconst uint64_t *kmerminhash_get_abunds(SourmashKmerMinHash *ptr, uintptr_t *size);\n\nconst uint64_t *kmerminhash_get_mins(const SourmashKmerMinHash *ptr, uintptr_t *size);\n\nuintptr_t kmerminhash_get_mins_size(const SourmashKmerMinHash *ptr);\n\nHashFunctions kmerminhash_hash_function(const SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_hash_function_set(SourmashKmerMinHash *ptr, HashFunctions hash_function);\n\nbool kmerminhash_hp(const SourmashKmerMinHash *ptr);\n\nSourmashKmerMinHash *kmerminhash_intersection(const SourmashKmerMinHash *ptr,\n                                              const SourmashKmerMinHash *other);\n\nuint64_t kmerminhash_intersection_union_size(const SourmashKmerMinHash *ptr,\n                                             const SourmashKmerMinHash *other,\n                                             uint64_t *union_size);\n\nbool kmerminhash_is_compatible(const SourmashKmerMinHash *ptr, const SourmashKmerMinHash *other);\n\nbool kmerminhash_is_protein(const SourmashKmerMinHash *ptr);\n\ndouble kmerminhash_jaccard(const SourmashKmerMinHash *ptr, const SourmashKmerMinHash *other);\n\nuint32_t kmerminhash_ksize(const SourmashKmerMinHash *ptr);\n\nuint64_t kmerminhash_max_hash(const SourmashKmerMinHash *ptr);\n\nSourmashStr kmerminhash_md5sum(const SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_merge(SourmashKmerMinHash *ptr, const SourmashKmerMinHash *other);\n\nSourmashKmerMinHash *kmerminhash_new(uint32_t scaled,\n                                     uint32_t k,\n                                     HashFunctions hash_function,\n                                     uint64_t seed,\n                                     bool track_abundance,\n                                     uint32_t n);\n\nuint32_t kmerminhash_num(const SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_remove_from(SourmashKmerMinHash *ptr, const SourmashKmerMinHash *other);\n\nvoid kmerminhash_remove_hash(SourmashKmerMinHash *ptr, uint64_t h);\n\nvoid kmerminhash_remove_many(SourmashKmerMinHash *ptr,\n                             const uint64_t *hashes_ptr,\n                             uintptr_t insize);\n\nuint64_t kmerminhash_seed(const SourmashKmerMinHash *ptr);\n\nconst uint64_t *kmerminhash_seq_to_hashes(SourmashKmerMinHash *ptr,\n                                          const char *sequence,\n                                          uintptr_t insize,\n                                          bool force,\n                                          bool bad_kmers_as_zeroes,\n                                          bool is_protein,\n                                          uintptr_t *size);\n\nvoid kmerminhash_set_abundances(SourmashKmerMinHash *ptr,\n                                const uint64_t *hashes_ptr,\n                                const uint64_t *abunds_ptr,\n                                uintptr_t insize,\n                                bool clear);\n\ndouble kmerminhash_similarity(const SourmashKmerMinHash *ptr,\n                              const SourmashKmerMinHash *other,\n                              bool ignore_abundance,\n                              bool downsample);\n\nbool kmerminhash_skipm1n3(const SourmashKmerMinHash *ptr);\n\nbool kmerminhash_skipm2n3(const SourmashKmerMinHash *ptr);\n\nvoid kmerminhash_slice_free(uint64_t *ptr, uintptr_t insize);\n\nbool kmerminhash_track_abundance(const SourmashKmerMinHash *ptr);\n\nvoid manifest_free(SourmashManifest *ptr);\n\nSourmashManifestRowIter *manifest_rows(const SourmashManifest *ptr);\n\nconst SourmashManifestRow *manifest_rows_iter_next(SourmashManifestRowIter *ptr);\n\nvoid manifestrow_free(SourmashManifestRow *ptr);\n\nvoid nodegraph_buffer_free(uint8_t *ptr, uintptr_t insize);\n\nbool nodegraph_count(SourmashNodegraph *ptr, uint64_t h);\n\nbool nodegraph_count_kmer(SourmashNodegraph *ptr, const char *kmer);\n\ndouble nodegraph_expected_collisions(const SourmashNodegraph *ptr);\n\nvoid nodegraph_free(SourmashNodegraph *ptr);\n\nSourmashNodegraph *nodegraph_from_buffer(const char *ptr, uintptr_t insize);\n\nSourmashNodegraph *nodegraph_from_path(const char *filename);\n\nuintptr_t nodegraph_get(const SourmashNodegraph *ptr, uint64_t h);\n\nuintptr_t nodegraph_get_kmer(const SourmashNodegraph *ptr, const char *kmer);\n\nconst uint64_t *nodegraph_hashsizes(const SourmashNodegraph *ptr, uintptr_t *size);\n\nuintptr_t nodegraph_ksize(const SourmashNodegraph *ptr);\n\nuintptr_t nodegraph_matches(const SourmashNodegraph *ptr, const SourmashKmerMinHash *mh_ptr);\n\nSourmashNodegraph *nodegraph_new(void);\n\nuintptr_t nodegraph_noccupied(const SourmashNodegraph *ptr);\n\nuintptr_t nodegraph_ntables(const SourmashNodegraph *ptr);\n\nvoid nodegraph_save(const SourmashNodegraph *ptr, const char *filename);\n\nconst uint8_t *nodegraph_to_buffer(const SourmashNodegraph *ptr,\n                                   uint8_t compression,\n                                   uintptr_t *size);\n\nvoid nodegraph_update(SourmashNodegraph *ptr, const SourmashNodegraph *optr);\n\nvoid nodegraph_update_mh(SourmashNodegraph *ptr, const SourmashKmerMinHash *optr);\n\nSourmashNodegraph *nodegraph_with_tables(uintptr_t ksize,\n                                         uintptr_t starting_size,\n                                         uintptr_t n_tables);\n\nSourmashSignature *revindex_best_containment(const SourmashRevIndex *db_ptr,\n                                             const SourmashKmerMinHash *query_ptr,\n                                             uint64_t threshold_bp,\n                                             const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nvoid revindex_countergather_consume(SourmashRevIndex_CounterGather *cg_ptr,\n                                    const SourmashKmerMinHash *isect_ptr);\n\nconst SourmashKmerMinHash *revindex_countergather_found_hashes(SourmashRevIndex_CounterGather *cg_ptr,\n                                                               const SourmashKmerMinHash *template_ptr);\n\nvoid revindex_countergather_free(SourmashRevIndex_CounterGather *ptr);\n\nuint64_t revindex_countergather_len(SourmashRevIndex_CounterGather *cg_ptr);\n\nSourmashSignature *revindex_countergather_peek(const SourmashRevIndex_CounterGather *cg_ptr,\n                                               const SourmashRevIndex *db_ptr,\n                                               uint64_t threshold_bp);\n\nSourmashSignature **revindex_countergather_signatures(const SourmashRevIndex_CounterGather *cg_ptr,\n                                                      const SourmashRevIndex *db_ptr,\n                                                      uintptr_t *size);\n\nvoid revindex_disk_create(const SourmashSignature *const *sigs_ptr,\n                          uintptr_t insigs,\n                          const char *path_ptr);\n\nvoid revindex_free(SourmashRevIndex *ptr);\n\nuint32_t revindex_ksize(const SourmashRevIndex *ptr);\n\nuint64_t revindex_len(const SourmashRevIndex *ptr,\n                      const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nSourmashManifest *revindex_manifest(const SourmashRevIndex *ptr);\n\nSourmashRevIndex *revindex_mem_new_with_sigs(const SourmashSignature *const *search_sigs_ptr,\n                                             uintptr_t insigs,\n                                             const SourmashKmerMinHash *template_ptr);\n\nSourmashStr revindex_moltype(const SourmashRevIndex *ptr);\n\nSourmashRevIndex *revindex_new_from_rocksdb(const char *path_ptr);\n\nconst SourmashSearchResult *const *revindex_prefetch(const SourmashRevIndex *db_ptr,\n                                                     const SourmashSignature *query_ptr,\n                                                     uint64_t threshold_bp,\n                                                     uintptr_t *return_size,\n                                                     const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nSourmashRevIndex_CounterGather *revindex_prefetch_to_countergather(const SourmashRevIndex *db_ptr,\n                                                                   const SourmashSignature *query_ptr,\n                                                                   const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nuint32_t revindex_scaled(const SourmashRevIndex *ptr);\n\nconst SourmashSearchResult *const *revindex_search_jaccard(const SourmashRevIndex *ptr,\n                                                           const SourmashSignature *sig_ptr,\n                                                           double threshold,\n                                                           uintptr_t *size,\n                                                           const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nSourmashSignature **revindex_signatures(const SourmashRevIndex *ptr,\n                                        uintptr_t *size,\n                                        const SourmashDatasetPicklist *dataset_picklist_ptr);\n\nSourmashStr searchresult_filename(const SourmashSearchResult *ptr);\n\nvoid searchresult_free(SourmashSearchResult *ptr);\n\ndouble searchresult_score(const SourmashSearchResult *ptr);\n\nSourmashSignature *searchresult_signature(const SourmashSearchResult *ptr);\n\nvoid signature_add_protein(SourmashSignature *ptr, const char *sequence);\n\nvoid signature_add_sequence(SourmashSignature *ptr, const char *sequence, bool force);\n\nbool signature_eq(const SourmashSignature *ptr, const SourmashSignature *other);\n\nSourmashKmerMinHash *signature_first_mh(const SourmashSignature *ptr);\n\nvoid signature_free(SourmashSignature *ptr);\n\nSourmashSignature *signature_from_params(const SourmashComputeParameters *ptr);\n\nSourmashStr signature_get_filename(const SourmashSignature *ptr);\n\nSourmashStr signature_get_license(const SourmashSignature *ptr);\n\nSourmashKmerMinHash **signature_get_mhs(const SourmashSignature *ptr, uintptr_t *size);\n\nSourmashStr signature_get_name(const SourmashSignature *ptr);\n\nuintptr_t signature_len(const SourmashSignature *ptr);\n\nSourmashSignature *signature_new(void);\n\nvoid signature_push_mh(SourmashSignature *ptr, const SourmashKmerMinHash *other);\n\nSourmashStr signature_save_json(const SourmashSignature *ptr);\n\nvoid signature_set_filename(SourmashSignature *ptr, const char *name);\n\nvoid signature_set_mh(SourmashSignature *ptr, const SourmashKmerMinHash *other);\n\nvoid signature_set_name(SourmashSignature *ptr, const char *name);\n\nSourmashSignature **signatures_load_buffer(const char *ptr,\n                                           uintptr_t insize,\n                                           bool _ignore_md5sum,\n                                           uintptr_t ksize,\n                                           const char *select_moltype,\n                                           uintptr_t *size);\n\nSourmashSignature **signatures_load_path(const char *ptr,\n                                         bool _ignore_md5sum,\n                                         uintptr_t ksize,\n                                         const char *select_moltype,\n                                         uintptr_t *size);\n\nconst uint8_t *signatures_save_buffer(const SourmashSignature *const *ptr,\n                                      uintptr_t size,\n                                      uint8_t compression,\n                                      uintptr_t *osize);\n\nchar sourmash_aa_to_dayhoff(char aa);\n\nchar sourmash_aa_to_hp(char aa);\n\n/**\n * Clears the last error.\n */\nvoid sourmash_err_clear(void);\n\n/**\n * Returns the panic information as string.\n */\nSourmashStr sourmash_err_get_backtrace(void);\n\n/**\n * Returns the last error code.\n *\n * If there is no error, 0 is returned.\n */\nSourmashErrorCode sourmash_err_get_last_code(void);\n\n/**\n * Returns the last error message.\n *\n * If there is no error an empty string is returned.  This allocates new memory\n * that needs to be freed with `sourmash_str_free`.\n */\nSourmashStr sourmash_err_get_last_message(void);\n\n/**\n * Initializes the library\n */\nvoid sourmash_init(void);\n\n/**\n * Frees a sourmash str.\n *\n * If the string is marked as not owned then this function does not\n * do anything.\n */\nvoid sourmash_str_free(SourmashStr *s);\n\n/**\n * Creates a sourmash str from a c string.\n *\n * This sets the string to owned.  In case it's not owned you either have\n * to make sure you are not freeing the memory or you need to set the\n * owned flag to false.\n */\nSourmashStr sourmash_str_from_cstr(const char *s);\n\nchar sourmash_translate_codon(const char *codon);\n\nSourmashStr **zipstorage_filenames(const SourmashZipStorage *ptr, uintptr_t *size);\n\nvoid zipstorage_free(SourmashZipStorage *ptr);\n\nSourmashStr **zipstorage_list_sbts(const SourmashZipStorage *ptr, uintptr_t *size);\n\nconst uint8_t *zipstorage_load(const SourmashZipStorage *ptr,\n                               const char *path_ptr,\n                               uintptr_t insize,\n                               uintptr_t *size);\n\nSourmashZipStorage *zipstorage_new(const char *ptr, uintptr_t insize);\n\nSourmashStr zipstorage_path(const SourmashZipStorage *ptr);\n\nvoid zipstorage_set_subdir(SourmashZipStorage *ptr, const char *path_ptr, uintptr_t insize);\n\nSourmashStr zipstorage_subdir(const SourmashZipStorage *ptr);\n\n#endif  /* SOURMASH_H_INCLUDED */\n"
  },
  {
    "path": "matplotlibrc",
    "content": "backend : Agg\n"
  },
  {
    "path": "paper.bib",
    "content": "@article{Ondov:2015,\n  title={Fast genome and metagenome distance estimation using MinHash},\n  author={Ondov, Brian D and Treangen, Todd J and Mallonee, Adam B and Bergman, Nicholas H and Koren, Sergey and Phillippy, Adam M},\n  journal={bioRxiv},\n  pages={029827},\n  year={2015},\n  publisher={Cold Spring Harbor Labs Journals},\n  doi={10.1101/029827},\n  url={https://doi.org/10.1101/029827}\n}\n\n@article{Brown:2016,\n  doi = {10.21105/joss.00027},\n  url = {https://doi.org/10.21105/joss.00027},\n  year = {2016},\n  publisher = {The Open Journal},\n  volume = {1},\n  number = {5},\n  pages = {27},\n  author = {C. Titus Brown and Luiz Irber},\n  title = {sourmash: a library for MinHash sketching of DNA},\n  journal = {Journal of Open Source Software}\n}\n\n@article{Pierce:2019,\n  doi = {10.12688/f1000research.19675.1},\n  url = {https://doi.org/10.12688/f1000research.19675.1},\n  year = {2019},\n  month = jul,\n  publisher = {F1000 Research Ltd},\n  volume = {8},\n  pages = {1006},\n  author = {N. Tessa Pierce and Luiz Irber and Taylor Reiter and Phillip Brooks and C. Titus Brown},\n  title = {Large-scale sequence comparisons with sourmash},\n  journal = {F1000Research}\n}\n\n@article{gather,\n  doi = {10.1101/2022.01.11.475838},\n  url = {https://doi.org/10.1101/2022.01.11.475838},\n  title={Lightweight compositional analysis of metagenomes with FracMinHash and minimum metagenome covers},\n  author={Irber, Luiz Carlos and Brooks, Phillip T and Reiter, Taylor E and Pierce-Ward, N Tessa and Hera, Mahmudur Rahman and Koslicki, David and Brown, C Titus},\n  journal={bioRxiv},\n  year={2022},\n  publisher={Cold Spring Harbor Laboratory}\n}\n\n@article{branchwater,\n  doi = {10.1101/2022.11.02.514947},\n  url={https://doi.org/10.1101/2022.11.02.514947},\n  title={Sourmash Branchwater Enables Lightweight Petabyte-Scale Sequence Search},\n  author={Irber, Luiz Carlos and Pierce-Ward, N Tessa and Brown, C Titus},\n  journal={bioRxiv},\n  year={2022},\n  publisher={Cold Spring Harbor Laboratory}\n}\n\n@article{koslicki2019improving,\n  doi={10.1016/j.amc.2019.02.018},\n  url={https://doi.org/10.1016/j.amc.2019.02.018},\n  title={Improving minhash via the containment index with applications to metagenomic analysis},\n  author={Koslicki, David and Zabeti, Hooman},\n  journal={Applied Mathematics and Computation},\n  volume={354},\n  pages={206--215},\n  year={2019},\n  publisher={Elsevier}\n}\n\n@article{hera2023deriving,\n  doi={10.1101/gr.277651.123},\n  url={https://doi.org/10.1101/gr.277651.123},\n  title={Deriving confidence intervals for mutation rates across a wide range of evolutionary distances using FracMinHash},\n  author={Rahman Hera, Mahmudur and Pierce-Ward, N Tessa and Koslicki, David},\n  journal={Genome Research},\n  pages={gr--277651},\n  year={2023},\n  publisher={Cold Spring Harbor Lab}\n}\n\n@article{hera2023fast,\n  doi = {10.1101/2023.11.06.565843},\n  url = {https://doi.org/10.1101/2023.11.06.565843},\n  title={Fast, lightweight, and accurate metagenomic functional profiling using FracMinHash sketches},\n  author={Rahman Hera, Mahmudur and Liu, Shaopeng and Wei, Wei and Rodriguez, Judith S and Ma, Chunyu and Koslicki, David},\n  journal={bioRxiv},\n  pages={2023--11},\n  year={2023},\n  publisher={Cold Spring Harbor Laboratory}\n}\n\n@article{portik2022evaluation,\n  doi={10.1186/s12859-022-05103-0},\n  url={https://doi.org/10.1186/s12859-022-05103-0},\n  title={Evaluation of taxonomic profiling methods for long-read shotgun metagenomic sequencing datasets},\n  author={Portik, Daniel M and Brown, C Titus and Pierce-Ward, N Tessa},\n  journal={Bioinformatics},\n  year={2022}\n}\n"
  },
  {
    "path": "paper.md",
    "content": "---\ntitle: 'sourmash v4: A multitool to quickly search, compare, and analyze genomic\nand metagenomic data sets'\ntags:\n  - FracMinHash\n  - MinHash\n  - k-mers\n  - Python\n  - Rust\nauthors:\n - name: Luiz Irber\n   orcid: 0000-0003-4371-9659\n   equal-contrib: true\n   affiliation: 1\n - name: N. Tessa Pierce-Ward\n   orcid: 0000-0002-2942-5331\n   equal-contrib: true\n   affiliation: 1\n - name: Mohamed Abuelanin\n   orcid: 0000-0002-3419-4785\n   affiliation: 1\n - name: Harriet Alexander\n   orcid: 0000-0003-1308-8008\n   affiliation: 2\n - name: Abhishek Anant\n   orcid:  0000-0002-5751-2010\n   affiliation: 9\n - name: Keya Barve\n   orcid: 0000-0003-3241-2117\n   affiliation: 1\n - name: Colton Baumler\n   orcid: 0000-0002-5926-7792\n   affiliation: 1\n - name: Olga Botvinnik\n   orcid: 0000-0003-4412-7970\n   affiliation: 3\n - name: Phillip Brooks\n   orcid: 0000-0003-3987-244X\n   affiliation: 1\n - name: Daniel Dsouza\n   orcid: 0000-0001-7843-8596\n   affiliation: 9\n - name: Laurent Gautier\n   orcid: 0000-0003-0638-3391\n   affiliation: 9\n - name: Mahmudur Rahman Hera\n   orcid: 0000-0002-5992-9012\n   affiliation: 4\n - name: Hannah Eve Houts\n   orcid: 0000-0002-7954-4793\n   affiliation: 1\n - name: Lisa K. Johnson\n   orcid: 0000-0002-3600-7218\n   affiliation: 1\n - name: Fabian Klötzl\n   orcid: 0000-0002-6930-0592\n   affiliation: 5\n - name: David Koslicki\n   orcid: 0000-0002-0640-954X\n   affiliation: 4\n - name: Marisa Lim\n   orcid: 0000-0003-2097-8818\n   affiliation: 1\n - name: Ricky Lim\n   orcid: 0000-0003-1313-7076\n   affiliation: 9\n - name: Bradley Nelson\n   orcid: 0009-0001-1553-932X\n   affiliation: 9\n - name: Ivan Ogasawara\n   orcid: 0000-0001-5049-4289\n   affiliation: 9\n - name: Taylor Reiter\n   orcid: 0000-0002-7388-421X\n   affiliation: 1\n - name: Camille Scott\n   orcid: 0000-0001-8822-8779\n   affiliation: 1\n - name: Andreas Sjödin\n   orcid: 0000-0001-5350-4219\n   affiliation: 6\n - name: Daniel Standage\n   orcid: 0000-0003-0342-8531\n   affiliation: 7\n - name: S. Joshua Swamidass\n   orcid: 0000-0003-2191-0778\n   affiliation: 8\n - name: Connor Tiffany\n   orcid: 0000-0001-8188-7720\n   affiliation: 9\n - name: Pranathi Vemuri\n   orcid: 0000-0002-5748-9594\n   affiliation: 3\n - name: Erik Young\n   orcid: 0000-0002-9195-9801\n   affiliation: 1\n - name: C. Titus Brown\n   orcid: 0000-0001-6001-2677\n   corresponding: true\n   affiliation: 1\naffiliations:\n - name: University of California Davis, Davis, CA, United States of America\n   index: 1\n - name: Woods Hole Oceanic Institution, Woods Hole, MA, Unites States of America\n   index: 2\n - name: Chan-Zuckerberg Biohub, San Francisco, CA, United States of America\n   index: 3\n - name:  Pennsylvania State University, University Park, PA, United States of America\n   index: 4\n - name:  Max Planck Institute for Evolutionary Biology, Plön, Germany\n   index: 5\n - name: Swedish Defence Research Agency (FOI), Stockholm, Sweden\n   index: 6\n - name: National Bioforensic Analysis Center, Fort Detrick, MD, United States of America\n   index: 7\n - name: Washington University in St Louis, St Louis, MO, United States of America\n   index: 8\n - name: No affiliation\n   index: 9\n\ndate: 31 Jan 2024\nbibliography: paper.bib\n---\n\n# Summary\n\nsourmash is a command line tool and Python library for sketching collections\nof DNA, RNA, and amino acid k-mers for biological sequence search, comparison,\nand analysis [@Pierce:2019]. sourmash's FracMinHash sketching supports fast and\naccurate sequence comparisons between datasets of different sizes [@gather],\nincluding taxonomic profiling [@portik2022evaluation], functional profiling\n[@hera2023fast], and petabase-scale sequence search [@branchwater]. From\nrelease 4.x, sourmash is built on top of Rust and provides an experimental\nRust interface.\n\nFracMinHash sketching is a lossy compression approach that represents data\nsets using a \"fractional\" sketch containing $1/S$ of the original k-mers. Like\nother sequence sketching techniques (e.g. MinHash, [@Ondov:2015]), FracMinHash\nprovides a lightweight way to store representations of large DNA or RNA\nsequence collections for comparison and search. Sketches can be used to\nidentify samples, find similar samples, identify data sets with shared\nsequences, and build phylogenetic trees. FracMinHash sketching supports\nestimation of overlap, bidirectional containment, and Jaccard similarity\nbetween data sets and is accurate even for data sets of very different sizes.\n\nSince sourmash v1 was released in 2016 [@Brown:2016], sourmash has expanded\nto support new database types and many more command line functions.\nIn particular, sourmash now has robust support for both Jaccard similarity\nand Containment calculations, which enables analysis and comparison of data\nsets of different sizes, including large metagenomic samples. As of v4.4,\nsourmash can convert these to estimated Average Nucleotide Identity (ANI)\nvalues, which can provide improved biological context to sketch comparisons\n[@hera2023deriving].\n\n# Statement of Need\n\nLarge collections of genomes, transcriptomes, and raw sequencing data sets are\nreadily available in biology, and the field needs lightweight computational\nmethods for searching and summarizing the content of both public and private\ncollections. sourmash provides a flexible set of programmatic tools\nfor this purpose, together with a robust and well-tested command-line\ninterface. It has been used in over 350 publications (based on citations of\n@Brown:2016 and @Pierce:2019) and it continues to expand in functionality.\n\n# Acknowledgements\n\nThis work was funded in part by the Gordon and Betty Moore Foundation’s\nData-Driven Discovery Initiative [GBMF4551 to CTB]. It is also funded in\npart by the National Science Foundation [#2018522 to CTB] and PIG-PARADIGM\n(Preventing Infection in the Gut of developing Piglets–and thus Antimicrobial\nResistance – by disentAngling the interface of DIet, the host and the\nGastrointestinal Microbiome) from the Novo Nordisk Foundation to CTB.\n\nNotice: This manuscript has been authored by BNBI under Contract\nNo. HSHQDC-15-C-00064 with the DHS. The US Government retains and the\npublisher, by accepting the article for publication, acknowledges that the USG\nretains a non-exclusive, paid-up, irrevocable, world-wide license to publish\nor reproduce the published form of this manuscript, or allow others to do\nso, for USG purposes. Views and conclusions contained herein are those of\nthe authors and should not be interpreted to represent policies, expressed\nor implied, of the DHS.\n\n# References\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\n    \"maturin>=1,<1.14.0\",\n    \"cffi\",\n]\nbuild-backend = 'maturin'\n\n[project]\nname = \"sourmash\"\ndescription = \"tools for comparing biological sequences with k-mer sketches\"\nreadme = \"README.md\"\nversion = \"4.9.5-dev\"\nlicense = \"BSD-3-Clause\"\n\nauthors = [\n  { name=\"Luiz Irber\" },\n  { name=\"N. Tessa Pierce-Ward\" },\n  { name=\"Mohamed Abuelanin\" },\n  { name=\"Harriet Alexander\" },\n  { name=\"Abhishek Anant\" },\n  { name=\"Keya Barve\" },\n  { name=\"Colton Baumler\" },\n  { name=\"Olga Botvinnik\" },\n  { name=\"Phillip Brooks\" },\n  { name=\"Luca Cappelletti\" },\n  { name=\"Peter Cock\" },\n  { name=\"Daniel Dsouza\" },\n  { name=\"Jade Gardner\" },\n  { name=\"Laurent Gautier\" },\n  { name=\"Tim Head\" },\n  { name=\"Mahmudur Rahman Hera\" },\n  { name=\"Hannah Eve Houts\" },\n  { name=\"Lisa K. Johnson\" },\n  { name=\"Fabian Klötzl\" },\n  { name=\"David Koslicki\" },\n  { name=\"Katrin Leinweber\" },\n  { name=\"Marisa Lim\" },\n  { name=\"Ricky Lim\" },\n  { name=\"Chase Mateusiak\" },\n  { name=\"Bradley Nelson\" },\n  { name=\"Ivan Ogasawara\" },\n  { name=\"Aiden Pike\" },\n  { name=\"Taylor Reiter\" },\n  { name=\"Camille Scott\" },\n  { name=\"Andreas Sjödin\" },\n  { name=\"Connor T. Skennerton\" },\n  { name=\"Jason Stajich\" },\n  { name=\"Daniel Standage\" },\n  { name=\"S. Joshua Swamidass\" },\n  { name=\"Connor Tiffany\" },\n  { name=\"Pranathi Vemuri\" },\n  { name=\"Erik Young\" },\n  { name=\"Nick H\" },\n  { name=\"C. Titus Brown\" },\n]\n\nmaintainers = [\n  { name=\"Luiz C. Irber, Jr\", email=\"luiz@sourmash.bio\" },\n  { name=\"C. Titus Brown\", email=\"titus@idyll.org\" },\n  { name=\"N. Tessa Pierce-Ward\", email=\"ntpierce@ucdavis.edu\" },\n]\n\nclassifiers = [\n  \"Development Status :: 5 - Production/Stable\",\n  \"Environment :: Console\",\n  \"Environment :: MacOS X\",\n  \"Intended Audience :: Science/Research\",\n  \"Natural Language :: English\",\n  \"Operating System :: POSIX :: Linux\",\n  \"Operating System :: MacOS :: MacOS X\",\n  \"Programming Language :: Rust\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Topic :: Scientific/Engineering :: Bio-Informatics\",\n]\n\ndependencies = [\n  \"screed>=1.1.3,<2\",\n  \"cffi>=1.14.0\",\n  \"numpy\",\n  \"matplotlib\",\n  \"scipy\",\n  \"deprecation>=2.0.6\",\n  \"cachetools>=4,<8\",\n  \"bitstring>=3.1.9,<5\",\n]\n\nrequires-python = \">=3.11\"\n\n[tool.sourmash.metadata]\nauthors = [\n  { name=\"Luiz Irber\", orcid=\"0000-0003-4371-9659\" },\n  { name=\"N. Tessa Pierce-Ward\", orcid=\"0000-0002-2942-5331\" },\n  { name=\"Mohamed Abuelanin\", orcid=\"0000-0002-3419-4785\" },\n  { name=\"Harriet Alexander\", orcid=\"0000-0003-1308-8008\" },\n  { name=\"Abhishek Anant\", orcid=\"0000-0002-5751-2010\" },\n  { name=\"Keya Barve\", orcid=\"0000-0003-3241-2117\" },\n  { name=\"Colton Baumler\", orcid=\"0000-0002-5926-7792\" },\n  { name=\"Olga Botvinnik\", orcid=\"0000-0003-4412-7970\" },\n  { name=\"Phillip Brooks\", orcid=\"0000-0003-3987-244X\" },\n  { name=\"Luca Cappelletti\", orcid=\"0000-0002-1269-2038\" },\n  { name=\"Peter Cock\", orcid=\"0000-0001-9513-9993\" },\n  { name=\"Daniel Dsouza\", orcid=\"0000-0001-7843-8596\" },\n  { name=\"Jade Gardner\", orcid=\"0009-0005-0787-5752\" },\n  { name=\"Laurent Gautier\", orcid=\"0000-0002-5670-4512\" },\n  { name=\"Tim Head\", orcid=\"0000-0003-0931-3698\" },\n  { name=\"Mahmudur Rahman Hera\", orcid=\"0000-0002-5992-9012\" },\n  { name=\"Hannah Eve Houts\", orcid=\"0000-0002-7954-4793\" },\n  { name=\"Lisa K. Johnson\", orcid=\"0000-0002-3600-7218\" },\n  { name=\"Fabian Klötzl\", orcid=\"0000-0002-6930-0592\" },\n  { name=\"David Koslicki\", orcid=\"0000-0002-0640-954X\" },\n  { name=\"Katrin Leinweber\", orcid=\"0000-0001-5135-5758\" },\n  { name=\"Marisa Lim\", orcid=\"0000-0003-2097-8818\" },\n  { name=\"Ricky Lim\", orcid=\"0000-0003-1313-7076\" },\n  { name=\"Chase Mateusiak\", orcid=\"0000-0002-2890-4242\" },\n  { name=\"Bradley Nelson\", orcid=\"0009-0001-1553-932X\" },\n  { name=\"Ivan Ogasawara\", orcid=\"0000-0001-5049-4289\" },\n  { name=\"Aiden Pike\", orcid=\"0009-0002-1398-0207\"},\n  { name=\"Taylor Reiter\", orcid=\"0000-0002-7388-421X\" },\n  { name=\"Camille Scott\", orcid=\"0000-0001-8822-8779\" },\n  { name=\"Andreas Sjödin\", orcid=\"0000-0001-5350-4219\" },\n  { name=\"Connor T. Skennerton\", orcid=\"0000-0003-1320-4873\" },\n  { name=\"Jason Stajich\", orcid=\"0000-0002-7591-0020\" },\n  { name=\"Daniel Standage\", orcid=\"0000-0003-0342-8531\" },\n  { name=\"S. Joshua Swamidass\", orcid=\"0000-0003-2191-0778\" },\n  { name=\"Connor Tiffany\", orcid=\"0000-0001-8188-7720\" },\n  { name=\"Pranathi Vemuri\", orcid=\"0000-0002-5748-9594\"},\n  { name=\"Erik Young\", orcid=\"0000-0002-9195-9801\" },\n  { name=\"Nick H\", orcid=\"0000-0002-1685-302X\" },\n  { name=\"C. Titus Brown\", orcid=\"0000-0001-6001-2677\" },\n]\n\n\n[metadata]\nlicense = { text = \"BSD 3-Clause License\" }\n\n[project.urls]\n\"Homepage\" = \"https://sourmash.bio/\"\n\"Documentation\" = \"https://sourmash.readthedocs.io\"\n\"CI\" = \"https://github.com/sourmash-bio/sourmash/actions\"\n\"Source\" = \"https://github.com/sourmash-bio/sourmash\"\n\"Tracker\" = \"https://github.com/sourmash-bio/sourmash/issues\"\n\n[project.scripts]\n\"sourmash\" = \"sourmash.__main__:main\"\n\n[project.optional-dependencies]\ntest = [\n  \"pytest>=6.2.4,<9.1.0\",\n  \"pytest-cov>=4,<8.0\",\n  \"pytest-xdist>=3.1\",\n  \"pyyaml>=6,<7\",\n  \"diff-cover>=7.3\",\n  \"covdefaults>=2.2.2\",\n  \"recommonmark\",\n  \"hypothesis\",\n  \"build\",\n]\ndemo = [\n  \"jupyter\",\n  \"jupyter_client\",\n  \"ipython\",\n]\ndoc = [\n  \"sphinx>=6,<10\",\n  \"myst-parser\",\n  \"Jinja2\",\n  \"alabaster\",\n  \"sphinxcontrib-napoleon\",\n  \"nbsphinx\",\n  \"sphinx-design==0.7.0\",\n  \"ipython\",\n  \"sphinx-copybutton\",\n]\nstorage = [\n  \"ipfshttpclient>=0.4.13\",\n  \"redis\",\n]\n# hmm, I think this is a hack, but it works...\n# https://github.com/pypa/pip/issues/10393#issuecomment-941885429\nall = [\"sourmash[test,demo,doc,storage]\"]\n\n[tool.maturin]\npython-source = \"src\"\nmanifest-path = \"src/core/Cargo.toml\"\nbindings = \"cffi\"\ninclude = [\n  { path = \"include/sourmash.h\", format = [\"sdist\",\"wheel\"] },\n  { path = \"requirements.txt\", format = [\"sdist\"] },\n  { path = \"Cargo.*\", format = [\"sdist\"] },\n  { path = \"tests/**/*\", format = [\"sdist\"] },\n  { path = \"CITATION.cff\", format = [\"sdist\", \"wheel\"] },\n  { path = \"LICENSE\", format = [\"sdist\"] },\n]\nexclude = [\n  { path = \"**/__pycache__/*\", format = [\"sdist\", \"wheel\"] },\n]\nfeatures = [\"maturin\", \"branchwater\"]\nlocked = true\nmodule-name = \"sourmash._lowlevel\"\n\n# macOS deployment target SDK version\n[tool.maturin.target.x86_64-apple-darwin]\nmacos-deployment-target = \"10.14\"\n[tool.maturin.target.aarch64-apple-darwin]\nmacos-deployment-target = \"11.0\"\n\n[tool.ruff]\nextend-exclude = [\"*.ipynb\"]\n\n[tool.ruff.lint]\nextend-select = [\n  \"UP\",  # pyupgrade\n]\nignore = [\"F401\", \"E712\", \"E402\", \"F821\", \"E722\", \"E741\", \"F811\", \"F403\", \"F822\"]\n\n[tool.isort]\nknown_third_party = [\"deprecation\", \"hypothesis\", \"mmh3\", \"numpy\", \"pytest\", \"screed\", \"sourmash_tst_utils\"]\nmulti_line_output = 3 \ninclude_trailing_comma = true\nforce_grid_wrap = 0\nline_length = 88\nknown_first_party = [\"sourmash\"]\n\n[tool.cibuildwheel]\nbuild = \"cp311-*\"\nskip = \"*-win32 *-manylinux_i686 *-musllinux_* *-ppc64le *-s390x\"\nbefore-all = [\n  \"curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=stable\",\n  \"cargo update --dry-run\",\n]\nmacos.before-build = [\n  \"rustup target add aarch64-apple-darwin\",\n  \"rustup target add x86_64-apple-darwin\",\n]\nbuild-verbosity = 3\n\n[tool.cibuildwheel.environment]\nCARGO_REGISTRIES_CRATES_IO_PROTOCOL=\"sparse\"\nPATH=\"$HOME/.cargo/bin:$PATH\"\n\n[tool.cibuildwheel.linux]\nbefore-all = [\n  \"curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=stable\",\n  \"cargo update --dry-run\",\n  \"if [ -f /etc/system-release ]; then dnf -y install llvm-compat-libs; fi\",\n]\n\n[tool.cibuildwheel.pyodide.environment]\n# avoid needing a nightly compiler\nRUSTC_BOOTSTRAP=1\n\n[tool.cibuildwheel.pyodide]\nbefore-build = [\n  \"rustup target add wasm32-unknown-emscripten\"\n]\n\n[tool.cibuildwheel.linux.environment]\nCARGO_REGISTRIES_CRATES_IO_PROTOCOL=\"sparse\"\nPATH=\"$HOME/.cargo/bin:$PATH\"\nLIBCLANG_PATH=\"/usr/lib64/llvm17/lib\"\nLD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/opt/rh/gcc-toolset-14/root/usr/lib64\"\nC_INCLUDE_PATH=\"/opt/rh/gcc-toolset-14/root/usr/lib/gcc/x86_64-redhat-linux/14/include/:/opt/rh/gcc-toolset-14/root/usr/lib/gcc/aarch64-redhat-linux/14/include/\"\n\n[tool.pytest.ini_options]\naddopts = \"--doctest-glob='doc/*.md' --doctest-modules -n4\"\nnorecursedirs = [\n  \"utils\",\n  \"build\",\n  \"buildenv\",\n  \".tox\",\n  \".asv\",\n  \".eggs\",\n]\ntestpaths = [\n  \"tests\",\n  \"doc\",\n  \"src/sourmash\",\n]\n\n[tool.coverage]\nhtml.show_contexts = true\nhtml.skip_covered = false\npaths.source = [\n  \"src\",\n  \".tox*/*/lib/python*/site-packages\",\n  \".tox*/pypy*/site-packages\",\n  \".tox*\\\\*\\\\Lib\\\\site-packages\",\n  \"*/src\",\n  \"*\\\\src\",\n  \"*/tests\",\n  \"*\\tests\",\n]\nreport.fail_under = 88\nrun.parallel = true\nrun.plugins = [\"covdefaults\"]\n\n[tool.pixi.workspace]\nchannels = [\"conda-forge\", \"https://prefix.dev/github-releases\"]\nplatforms = [\"linux-64\", \"linux-aarch64\", \"osx-64\", \"osx-arm64\", \"win-64\"]\nrequires-pixi = \">=0.65.0\"\n\n[tool.pixi.feature.build.dependencies]\nclangdev = \">=16.0.6,<16.1\"\ncxx-compiler = \">=1.7.0,<1.8\"\nlibclang = \">=16.0.6,<16.1\"\n\n[tool.pixi.feature.msrv.dependencies]\nrust = \"~=1.85.0\"\n\n[tool.pixi.feature.msrv.tasks]\ncheck-msrv = \"cargo build --all-features\"\n\n[tool.pixi.feature.dev.dependencies]\ncargo-llvm-cov = \"~=0.6.15\"\ncargo-nextest = \"~=0.9.78\"\ngit = \"~=2.51.0\"\nmaturin = \"~=1.12.0\"\nrust = \"~=1.94.0\"\n\npandoc = \"3.1.3.*\"\npython = \"3.11.*\"\ntox = \">=4.11.0,<5\"\n\n# prefer conda deps over PyPI\nscreed = \">=1.1.2,<2\"\ncffi = \">=1.14.0\"\nnumpy = \"*\"\nmatplotlib = \"*\"\nscipy = \"*\"\ndeprecation = \">=2.0.6\"\ncachetools = \">=4,<8\"\nbitstring = \">=3.1.9,<5\"\nmake = \">=4.4.1,<5\"\nuv = \"*\"\n\n# install these from octoconda github-releases channel\ncargo-binstall = \"~=1.17.7\"\ncargo-semver-checks = \"~=0.47.0\"\nwasm-pack = \"~=0.14.0\"\n\n[tool.pixi.feature.dev.tasks.install-tools]\ncmd = \"cargo binstall -y cargo-feature-combinations && cargo binstall -y cbindgen --version 0.29.2\"\n\n[tool.pixi.feature.dev.tasks.semver-check]\ncmd = \"cargo semver-checks check-release --default-features --features branchwater\"\ndepends-on = \"install-tools\"\n\n[tool.pixi.feature.dev.tasks.cbindgen-generate]\ncmd = \"cbindgen -c cbindgen.toml . -o ../../include/sourmash.h\"\ncwd = \"src/core\"\nenv = { RUSTC_BOOTSTRAP = \"1\" }\ndepends-on = \"install-tools\"\ninputs = [\n  \"src/core/src/lib.rs\",\n  \"src/core/src/errors.rs\",\n  \"src/core/src/ffi/*.rs\",\n  \"src/core/cbindgen.toml\",\n]\noutputs = [\"include/sourmash.h\"]\n\n[tool.pixi.feature.dev.tasks.check-features]\ncmd = \"cargo fc nextest run\"\ndepends-on = \"install-tools\"\n\n[tool.pixi.feature.dev.tasks.coverage-rust]\ncmd = \"cargo llvm-cov nextest --all-features --lcov --output-path lcov.info\"\n\n[tool.pixi.feature.dev.tasks.rust-tests]\ncmd = \"cargo nextest run --all-features\"\n\n[tool.pixi.feature.dev.tasks.develop]\ncmd = \"maturin develop --uv\"\n\n[tool.pixi.feature.wasm.dependencies]\nrust-std-wasm32-unknown-unknown = \"*\"\nnodejs = \"~=20.0\"\n\n[tool.pixi.feature.wasm.tasks.build-wasm]\ncmd = \"wasm-pack build src/core -d ../../pkg -- --features 'niffler/wasm'\"\ndepends-on = [\"install-tools\"]\noutputs = [\n  \"pkg/package.json\",\n  \"pkg/README\",\n  \"pkg/sourmash_bg.js\",\n  \"pkg/sourmash_bg.wasm\",\n  \"pkg/sourmash_bg.wasm.d.ts\",\n  \"pkg/sourmash.d.ts\",\n  \"pkg/sourmash.js\",\n]\n\n[tool.pixi.feature.wasm.activation.env]\nCARGO_HOME = \"$CONDA_PREFIX/.cargo_cache\"\nPATH = \"$PATH:$CARGO_HOME/bin\"\n\n[tool.pixi.feature.wasm.tasks]\ntest-wasm = { cmd = \"wasm-pack test --node src/core -- --features 'niffler/wasm'\" , depends-on = [\"install-tools\"] }\npack-npm = { cmd = \"npm pack\" , depends-on = [\"build-wasm\"], cwd = \"pkg\", outputs = [\"pkg/sourmash-*.tgz\"] }\npublish-npm = { cmd = \"npm publish\" , depends-on = [\"pack-npm\"], cwd = \"pkg\" }\n\n[tool.pixi.environments]\ndefault = { features = [\"dev\", \"build\", \"test\", \"demo\", \"doc\", \"storage\", \"all\"], solve-group = \"default\" }\nmsrv = { features = [\"build\", \"msrv\"], solve-group = \"msrv\", no-default-feature = true }\nwasm = { features = [\"dev\", \"build\", \"wasm\"], solve-group = \"default\", no-default-feature = true }\n\n[tool.pixi.system-requirements]\nmacos = \"11.0\"\n\n[tool.pixi.activation.env]\nCARGO_HOME = \"$CONDA_PREFIX/.cargo_cache\"\nPATH = \"$PATH:$CARGO_HOME/bin\"\n\n[tool.pixi.target.win-64.activation.env]\nCARGO_HOME = \"%CONDA_PREFIX%/.cargo_cache\"\nPATH = \"%PATH%:%CARGO_HOME%/bin\"\n"
  },
  {
    "path": "requirements.txt",
    "content": "-e .[all]\n"
  },
  {
    "path": "shell.nix",
    "content": "(import\n  (\n    fetchTarball {\n      url = \"https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz\";\n      sha256 = \"0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2\";\n    }\n  )\n  {\n    src = ./.;\n  }).shellNix\n"
  },
  {
    "path": "src/core/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [unreleased]\n\n## [0.22.0] - 2026-04-04\n\nMSRV: 1.85\n\nChanges/additions:\n\n* Implement Select for Record and CollectionSet (#3800)\n\nUpdates:\n\n* Bump edition to 2024\n* Fix FFI to use `unsafe` explicitly (2024 edition requirement)\n* Bump outdated dependencies, now that our MSRV is higher\n* Use debian patch for `twox_hash` compatibility\n* Fix cbindgen to allow more recent versions, by avoiding parsing code that is not FFI-relevant\n* Remove lzma from niffler, it complicates build and we don't have any use reports\n* CI: use octoconda to install dependencies not available in conda-forge\n\n## [0.21.0] - 2025-06-28\n\nMSRV: 1.74\n\nChanges/additions:\n\n* make `RevIndex.len()` and `RevIndex.signatures()` use picklist, if set (#3647)\n* try fixing inline variables in rust `println!` (#3640)\n\nUpdates:\n\n* Build(deps): Bump cfg-if from 1.0.0 to 1.0.1 (#3689)\n* Build(deps): Bump roaring from 0.10.12 to 0.11.0 (#3702)\n* Build(deps): Bump getset from 0.1.5 to 0.1.6 (#3700)\n* Build(deps): Bump proptest from 1.6.0 to 1.7.0 (#3674)\n* Build(deps): Bump camino from 1.1.9 to 1.1.10 (#3669)\n* Build(deps): Bump criterion from 0.5.1 to 0.6.0 (#3655)\n* Build(deps): Bump tempfile from 3.19.1 to 3.20.0 (#3639)\n\n## [0.20.0] - 2025-05-06\n\nMSRV: 1.74\n\nChanges/additions:\n\n* make the RocksDB handle directly accessible to external code (#3468)\n* implement manifest retrieval from Rust via FFI for `RevIndex` (#3630)\n* fully support skip-mers at the Python level; provide documentation (#3627)\n* remove support for python 3.10 (#3606)\n* fix linear gather in Rust (#3605)\n* impl full mem-based `RevIndex` in Rust, and add Python support for mem- and disk-based `RevIndex` (#3545)\n* Minhash deserialize hashfunction errorhandling (#3560)\n* fix beta clippy errors (#3548)\n\nUpdates:\n\n* Bump rand from 0.9.0 to 0.9.1 (#3620)\n* Bump roaring from 0.10.10 to 0.10.12 (#3608)\n* Bump log from 0.4.26 to 0.4.27 (#3587)\n* Bump tempfile from 3.19.0 to 3.19.1 (#3588)\n* Bump tempfile from 3.18.0 to 3.19.0 (#3582)\n* Bump serde from 1.0.218 to 1.0.219 (#3576)\n* Bump tempfile from 3.17.1 to 3.18.0 (#3575)\n* Bump histogram from 0.11.2 to 0.11.3 (#3574)\n* Bump serde_json from 1.0.139 to 1.0.140 (#3566)\n* Bump getset from 0.1.4 to 0.1.5 (#3567)\n* Bump needletail from 0.6.1 to 0.6.3 (#3553)\n* Bump serde_json from 1.0.138 to 1.0.139 (#3552)\n* Bump serde from 1.0.217 to 1.0.218 (#3550)\n* Bump log from 0.4.25 to 0.4.26 (#3549)\n* Bump tempfile from 3.16.0 to 3.17.1 (#3539)\n\n## [0.19.0] - 2025-02-12\n\nMSRV: 1.74\n\nChanges/additions:\n\n* update MSRV to 1.74, niffler to 3.0.0 (#3530)\n* update to rocksdb 0.23 (#3456)\n* remove finch conversion, support zstd and lzma in wasm (#3521)\n\nUpdates:\n\n* Bump serde_json from 1.0.133 to 1.0.138 (#3453) (#3490) (#3500) (#3518)\n* Bump tempfile from 3.14.0 to 3.16.0 (#3472) (#3519)\n* Bump liblzma from 0.3.5 to 0.3.6 (#3526)\n* Bump rand from 0.8.5 to 0.9.0 (#3512)\n* Bump log from 0.4.22 to 0.4.25 (#3501)\n* Bump histogram from 0.11.1 to 0.11.2 (#3498)\n* Bump getset from 0.1.3 to 0.1.4 (#3499)\n* Bump roaring from 0.10.9 to 0.10.10 (#3489)\n* Bump ouroboros from 0.18.4 to 0.18.5 (#3491)\n* Bump itertools from 0.13.0 to 0.14.0 (#3471)\n* Bump serde from 1.0.216 to 1.0.217 (#3464)\n\n\n## [0.18.0] - 2024-12-20\n\nMSRV: 1.66\n\nChanges/additions:\n\n* add skipmer capacity to sourmash python layer via ffi (#3446)\n* add skipmers; switch to reading frame approach for translation, skipmers (#3395)\n* Refactor: Use to_writer/from_reader across the codebase (#3443)\n* adjust `Signature::name()` to return `Option<String>` instead of `filename()` and `md5sum()` (#3434)\n* propagate zipfile errors (#3431)\n\nUpdates:\n\n* Bump proptest from 1.5.0 to 1.6.0 (#3437)\n* Bump roaring from 0.10.8 to 0.10.9 (#3438)\n* Bump serde from 1.0.215 to 1.0.216 (#3436)\n* Bump statrs from 0.17.1 to 0.18.0 (#3426)\n* Bump roaring from 0.10.7 to 0.10.8 (#3423)\n* Bump needletail from 0.6.0 to 0.6.1 (#3427)\n* Bump web-sys from 0.3.72 to 0.3.74 (#3411)\n* Bump js-sys from 0.3.72 to 0.3.74 (#3412)\n* Bump roaring from 0.10.6 to 0.10.7 (#3413)\n* Bump serde_json from 1.0.132 to 1.0.133 (#3402)\n* Bump serde from 1.0.214 to 1.0.215 (#3403)\n\n## [0.17.2] - 2024-11-15\n\nMSRV: 1.66\n\nChanges/additions:\n\n* enforce a single scaled on a `CollectionSet` (#3397)\n* change `sig_from_record` to use scaled from `Record` to downsample (#3387)\n\nUpdates:\n\n* Upgrade rocksdb to 0.22.0, bump MSRV to 1.66  (#3383)\n* Bump thiserror from 1.0.68 to 2.0.3 (#3389)\n* Bump csv from 1.3.0 to 1.3.1 (#3390)\n* Bump tempfile from 3.13.0 to 3.14.0 (#3391)\n\n## [0.17.1] - 2024-11-11\n\nChanges/additions:\n* fix: Avoid re-calculating md5sum on clone and conversion to KmerMinHashBTree (#3385)\n* build: simplify Rust release (#3392)\n\n## [0.17.0] - 2024-11-05\n\nChanges/additions:\n* standardize on u32 for scaled, and introduce `ScaledType` (#3364)\n* panic when `FSStorage::load_sig` encounters more than one `Signature` in a JSON record (#3333)\n\nUpdates:\n\n* Bump needletail from 0.5.1 to 0.6.0 (#3376)\n* Bump histogram from 0.11.0 to 0.11.1 (#3377)\n* Bump serde from 1.0.210 to 1.0.214 (#3368)\n* Bump serde_json from 1.0.128 to 1.0.132 (#3358)\n* Fix clippy lints from 1.83 beta (#3357)\n\n## [0.16.0] - 2024-10-15\n\nMSRV: 1.65\n\nChanges/additions:\n\n* refactor `calculate_gather_stats` to disallow repeated downsampling (#3352)\n* improve downsampling behavior on `KmerMinHash`; fix `RevIndex::gather` bug around `scaled`. (#3342)\n* derive Hash for `HashFunctions` (#3344)\n\nUpdates:\n\n* Bump web-sys from 0.3.70 to 0.3.72 (#3354)\n* Bump tempfile from 3.12.0 to 3.13.0 (#3340)\n\n\n## [0.15.2] - 2024-09-25\n\nMSRV: 1.65\n\nChanges/additions:\n* add `Manifest::intersect_manifest` to Rust core (#3305)\n* propagate error from `RocksDB::open` on bad directory (#3306, #3307)\n\nUpdates:\n\n* Bump getset from 0.1.2 to 0.1.3 (#3328)\n* Bump memmap2 from 0.9.4 to 0.9.5 (#3326)\n* Bump codspeed-criterion-compat from 2.6.0 to 2.7.2 (#3324)\n* Bump serde_json from 1.0.127 to 1.0.128 (#3316)\n* Bump serde from 1.0.209 to 1.0.210 (#3318)\n* Bump serde from 1.0.208 to 1.0.209 (#3310)\n* Bump serde_json from 1.0.125 to 1.0.127 (#3309)\n\n## [0.15.1] - 2024-08-20\n\nMSRV: 1.65\n\nChanges/additions:\n\n* Misc Rust updates to core (#3297)\n* Implement resumability for revindex (#3275)\n* Resolve issue for high precision MLE estimation (#3296)\n* Added union method to HLL (#3293)\n\nUpdates:\n\n* Bump camino from 1.1.7 to 1.1.9 (#3301)\n* Bump web-sys from 0.3.69 to 0.3.70 (#3299)\n* Bump serde_json from 1.0.120 to 1.0.125 (#3288) (#3280) (#3267) (#3302)\n* Bump serde from 1.0.204 to 1.0.208 (#3289) (#3298)\n* Bump tempfile from 3.10.1 to 3.12.0 (#3279) (#3287)\n\n## [0.15.0] - 2024-07-27\n\nMSRV: 1.65\n\nChanges/additions:\n\n* RocksDB storage and self-contained RevIndex with internal storage #3250\n* Enable codspeed for Rust perf tracking (#3231)\n\nUpdates\n\n* Bump roaring from 0.10.5 to 0.10.6 (#3245)\n* Bump serde from 1.0.203 to 1.0.204 (#3244)\n* Bump counter from 0.5.7 to 0.6.0 (#3235)\n* Bump log from 0.4.21 to 0.4.22 (#3236)\n* Bump serde_json from 1.0.117 to 1.0.120 (#3234)\n* Bump proptest from 1.4.0 to 1.5.0 (#3222)\n\n## [0.14.1] - 2024-06-19\n\nMSRV: 1.65\n\nChanges/additions:\n\n* adjust how ANI is calculated in the revindex code. (#3218)\n\nUpdates:\n\n* Bump histogram from 0.10.2 to 0.11.0 (#3216)\n* Bump histogram from 0.10.1 to 0.10.2 (#3207)\n* Bump statrs from 0.16.1 to 0.17.1 (#3205)\n* Bump roaring from 0.10.4 to 0.10.5 (#3206)\n* Bump primal-check from 0.3.3 to 0.3.4 (#3208)\n* Bump niffler from 2.5.0 to 2.6.0 (#3204)\n\n## [0.14.0] - 2024-06-10\n\nMSRV: 1.65\n\nChanges/additions:\n\n* fix cargo fmt for updated `disk_revindex.rs` code (#3197)\n* fix RocksDB-based gather & other rust-based infelicities revealed by plugins (#3193)\n* use correct denominator in f_unique_to_query (#3138)\n* fix clippy warnings about max_value (#3146)\n* allow get/set record.filename (#3121)\n\nUpdates:\n\n* Bump statrs from 0.16.0 to 0.16.1 (#3186)\n* Bump serde from 1.0.202 to 1.0.203 (#3175)\n* Bump ouroboros from 0.18.3 to 0.18.4 (#3176)\n* Bump itertools from 0.12.1 to 0.13.0 (#3166)\n* Bump camino from 1.1.6 to 1.1.7 (#3169)\n* Bump serde from 1.0.201 to 1.0.202 (#3168)\n* Bump serde_json from 1.0.116 to 1.0.117 (#3159)\n* Bump serde from 1.0.200 to 1.0.201 (#3160)\n* Bump roaring from 0.10.3 to 0.10.4 (#3142)\n* Bump histogram from 0.10.0 to 0.10.1 (#3141)\n* Bump num-iter from 0.1.44 to 0.1.45 (#3140)\n* Bump serde from 1.0.199 to 1.0.200 (#3144)\n* Bump serde from 1.0.198 to 1.0.199 (#3130)\n* Bump serde_json from 1.0.115 to 1.0.116 (#3124)\n* Bump serde from 1.0.197 to 1.0.198 (#3122)\n* Bump histogram from 0.9.1 to 0.10.0 (#3109)\n* Bump enum_dispatch from 0.3.12 to 0.3.13 (#3102)\n* Bump serde_json from 1.0.114 to 1.0.115 (#3101)\n* Bump rayon from 1.9.0 to 1.10.0 (#3098)\n\n## [0.13.1] - 2024-03-23\n\nMSRV: 1.65\n\nChanges/additions:\n\n* Implement file parsing for webassembly (#3047)\n* fix `calculate_gather_stats` `threshold=0` bug (#3052)\n* fix clippy beta issues (#3088)\n\nUpdates:\n\n* Bump wasm-bindgen-test from 0.3.41 to 0.3.42 (#3063)\n* Bump web-sys from 0.3.68 to 0.3.69 (#3061)\n* Bump log from 0.4.20 to 0.4.21 (#3062)\n* Bump rayon from 1.8.1 to 1.9.0 (#3058)\n* Bump tempfile from 3.10.0 to 3.10.1 (#3059)\n* Bump serde_json from 1.0.113 to 1.0.114 (#3044)\n* Bump serde from 1.0.196 to 1.0.197 (#3045)\n* Bump itertools from 0.12.0 to 0.12.1 (#3043)\n\n## [0.13.0] - 2024-02-23\n\nMSRV: 1.65\n\nChanges/additions:\n\n* Calculate all gather stats in rust; use for rocksdb gather (#2943)\n* adjust protein ksize for record/manifest (#3019)\n* Allow changing storage location for a collection in RevIndex (#3015)\n* make core Manifest booleans python compatible (core) (#3007)\n\nUpdates:\n\n* Bump roaring from 0.10.2 to 0.10.3 (#3014)\n* Bump histogram from 0.9.0 to 0.9.1 (#3002)\n* Bump chrono from 0.4.33 to 0.4.34 (#3000)\n* Bump web-sys from 0.3.67 to 0.3.68 (#2998)\n* Bump num-iter from 0.1.43 to 0.1.44 (#2997)\n* Bump wasm-bindgen-test from 0.3.40 to 0.3.41 (#2996)\n\n## [0.12.1] - 2024-02-10\n\nMSRV: 1.65\n\nChanges/additions:\n\n* bump rust core version to r0.12.1 (#2988)\n* Clean up and refactor `KmerMinHash::merge` in core (#2973)\n* core: add scaled selection to manifest; add helper functions for collection and sig/sketch usage (#2948)\n* core: enable downsample within select (#2931)\n\nUpdates:\n\n* Deps: update typed-builder and histogram, bump MSRV to 1.65 (#2858)\n* Bump tempfile from 3.9.0 to 3.10.0 (#2979)\n* Bump rkyv from 0.7.43 to 0.7.44 (#2978)\n* Bump memmap2 from 0.9.3 to 0.9.4 (#2958)\n* Bump chrono from 0.4.31 to 0.4.33 (#2957)\n* Bump serde from 1.0.195 to 1.0.196 (#2956)\n* Bump serde_json from 1.0.111 to 1.0.113 (#2955)\n* Bump web-sys from 0.3.66 to 0.3.67 (#2939)\n* Bump wasm-bindgen-test from 0.3.39 to 0.3.40 (#2938)\n* Bump rayon from 1.8.0 to 1.8.1 (#2937)\n* Bump ouroboros from 0.18.2 to 0.18.3 (#2936)\n* Bump histogram from 0.8.4 to 0.9.0 (#2935)\n* Bump wasm-bindgen from 0.2.89 to 0.2.90 (#2925)\n* Bump histogram from 0.8.3 to 0.8.4 (#2923)\n* Bump serde_json from 1.0.110 to 1.0.111 (#2902)\n* Bump serde from 1.0.194 to 1.0.195 (#2901)\n* Bump serde_json from 1.0.108 to 1.0.110 (#2896)\n* Bump ouroboros from 0.18.1 to 0.18.2 (#2894)\n* Bump tempfile from 3.8.1 to 3.9.0 (#2893)\n* Bump memmap2 from 0.9.2 to 0.9.3 (#2889)\n* Bump memmap2 from 0.9.0 to 0.9.2 (#2882)\n* Bump rkyv from 0.7.42 to 0.7.43 (#2880)\n* Bump ouroboros from 0.18.0 to 0.18.1 (#2875)\n* Bump once_cell from 1.18.0 to 1.19.0 (#2874)\n* Bump rkyv from 0.7.40 to 0.7.42 (#2863)\n* Bump csv from 1.2.0 to 1.3.0 (#2862)\n* Bump roaring from 0.10.1 to 0.10.2 (#2865)\n* Bump web-sys from 0.3.65 to 0.3.66 (#2864)\n* Bump byteorder from 1.4.3 to 1.5.0 (#2866)\n* Bump proptest from 1.3.1 to 1.4.0 (#2837)\n\n## [0.12.0] - 2023-11-26\n\nMSRV: 1.64\n\nAdded:\n\n- Initial implementation for `Manifest`, `Selection`, and `Picklist` following\n  the Python API. (#2230)\n- `Collection` is a new abstraction for working with a set of signatures. A\n  collection needs a `Storage` for holding the signatures (on-disk, in-memory,\n  or remotely), and a `Manifest` to describe the metadata for each signature. (#2230)\n- Expose CSV parsing and RocksDB errors. (#2230)\n- New module `sourmash::index::revindex::disk_revindex` with the on-disk\n  RevIndex implementation based on RocksDB. (#2230)\n- Add `iter` and `iter_mut` methods for `Signature`. (#2230)\n- Add `load_sig` and `save_sig` methods to `Storage` trait for higher-level data\n  manipulation and caching. (#2230)\n- Add `spec` method to `Storage` to allow constructing a concrete `Storage` from\n  a string description. (#2230)\n- Add `InnerStorage` for synchronizing parallel access to `Storage`\n  implementations. (#2230)\n- Add `MemStorage` for keeping signatures in-memory (mostly for debugging and\n  testing). (#2230)\n- Add new `branchwater` feature (enabled by default), which can be disabled by\n  downstream projects to limit bringing heavy dependencies like rocksdb. (#2230)\n- Add new `rkyv` feature (disabled by default), making `MinHash` serializable\n  with the `rkyv` crate. (#2230)\n- Add semver checks for CI (so we bump versions accordingly, or avoid breaking\n  changes). (#2230)\n- Add cargo deny config. (#2724)\n- Benchmarks for seq_to_hashes in protein mode. (#1944)\n- Oxidize ZipStorage. (#1909)\n- Move greyhound-core into sourmash. (#1238)\n- add `MinHash.kmers_and_hashes(...)` and `sourmash sig kmers`. (#1695)\n- Produce list of hashes from a sequence. (#1653)\n\nChanged:\n\n- Rename `HashFunctions` variants to follow camel-case, so `Murmur64Protein`\n  instead of `murmur64_protein`. (#2230)\n- `LinearIndex` is now implemented as a thin layer on top of `Collection`. (#2230)\n- Move `GatherResult` to `sourmash::index` module. (#2230)\n- Move `sourmash::index::revindex` to `sourmash::index::mem_revindex` (this is\n  the Greyhound version of revindex, in-memory only). It was also refactored\n  internally to build a version of a `LinearIndex` that will be merged in the\n  future with `sourmash::index::LinearIndex`. (#2230)\n- Move `select` method from `Index` trait into a separate `Select` trait,\n  and implement it for `Signature` based on the new `Selection` API. (#2230)\n- Move `SigStore` into `sourmash::storage` module, and remove the generic. Now\n  it always stores `Signature`. Also implement `Select` for it. (#2230)\n- Disable `musllinux` wheels (need to figure out how to build rocksdb for it). (#2230)\n- Reorganize traits for easier wasm and native compilation. (#1836)\n- Adjust dayhoff and hp encodings to tolerate stop codons in the protein sequence. (#1673)\n\nFixed:\n\n- Reduce features combinations on Rust checks (takes much less time to run). (#2230)\n- Build: MSRV check for 1.64. (#2680)\n- maturin: move deprecated definition from Cargo.toml to pyproject.toml. (#2597)\n- Fix broken crates.io badge. (#2556)\n- Fix unnecessary typecasts in Rust. (#2366)\n- Fix `Signature.minhash` API during `sourmash sketch`. (#2329)\n- Return Err for angular_similarity when abundance tracking is off. (#2327)\n- Update various descriptions to talk about k-mers, not just DNA. (#2137)\n- Fix downsample_scaled in `core`. (#2108)\n- speed up `SeqToHashes` `translate`. (#1946)\n- Speed-up `SeqToHashes()`. (#1938)\n- Fix containment calculation for nodegraphs. (#1862)\n- Fix panic bug in `sourmash sketch` dna with bad input and `--check-sequence`. (#1702)\n- Fix Rust panic in `MinHash.seq_to_hashes`. (#1701)\n- Beta lints. (#2841 #2630 #2596 #2298 #1791 #1786 #1760)\n\nRemoved:\n\n- Remove BIGSI and SBT code. (#2732)\n\n## [0.11.0] - 2021-07-07\n\nAdded:\n\n- Add HyperLogLog implementation (#1223)\n\nChanged:\n\n- Update `MinHash.set_abundances` to remove hash if 0 abund; handle negative abundances. (#1575)\n- Improving `MinHash.remove_many(...)` performance (#1571)\n- Improved intersection and union calculations (#1475)\n- Bump MSRV to 1.42 (and other dep fixes) (#1461)\n- Rework the `find` functionality for `Index` classes (#1392)\n- Rationalize `SourmashSignature.name` and `str(sig)` (#1179)\n\nFixed:\n\n- Fix needless borrows as suggested by clippy (#1636)\n- Fix Rust 1.59 lints (#1600)\n- Clean up clippy lints from 1.52 (#1505)\n- Fix clippy lints introduced in 1.51 (#1407)\n- CI/Rust: update and fix cbindgen config (#1473)\n- pin needletail version to keep MSRV at 1.37 (#1393)\n- Update proptest requirement from 0.9.6 to 1.0.0 (#1344)\n- Fix clippy lints introduced in 1.50 and update nix configs (#1332)\n- Update finch requirement from 0.3.0 to 0.4.1 (#1290)\n- update rand for test, and activate \"js\" feature for getrandom (#1275)\n- Fix new clippy warnings from Rust 1.49 (#1267)\n- CI: small build fixes (#1252)\n\nRemoved:\n\n- Remove 10x support in compute (#1229)\n\n## [0.10.0] - 2020-10-08\n\nAdded:\n\n- Add `clear` option to set_abundances(...) method (#1046)\n\nChanged:\n\n- Replace mx by scaled (#1139)\n\nFixed:\n\n- Fix Rust panic error in signature creation (#1172)\n- Update typed-builder requirement from 0.6.0 to 0.7.0 (#1121)\n- update CI for latest branch name change (#1150)\n- Update typed-builder requirement from 0.6.0 to 0.7.0 (#1121)\n\n## [0.9.0] - 2020-07-13\n\nAdded:\n\n- Cache md5sum calculation (#1058)\n- Expose more of the API for wasm (signature and ComputeParameters) (#1058)\n- Getters and setters for ComputeParameters (#1058)\n\nChanged: \n\n- Migrate from failure to thiserror (#1058)\n- Bump MSRV to 1.37 (#1058)\n\nFixed: \n\n- Use the derive feature in serde instead of serde_derive (#1058)\n- Use nohash-hasher crate instead of previous NoHashHasher from finch.\n- Update typed-builder to 0.6.0 (#1058)\n- stricter niffler versions and add new gz feature to it (#1070)\n\n## [0.8.0] - 2020-06-26\n\nAdded:\n\n- compute-optimized MinHash (for small scaled or large cardinalities) (#1045)\n\n## [0.7.0] - 2020-05-12\n\nChanged:\n\n- Hide internal representation in core (#986)\n\nFixed: \n\n- update FFI and cbindgen (#986)\n\n## [0.6.0] - 2020-04-28\n\nAdded:\n\n- Nodegraph implementation based on khmer.Nodegraph (#799)\n\n## [0.5.0] - 2020-02-08\n\nAdded:\n\n- add_hash_with_abundance method in core library (#892)\n\nChanged:\n\n- More refactoring of MinHash comparison code (#882)\n- Replace mins_push and abunds_push with set_abundances (#887)\n\nFixed:\n\n- add_hash with num doesn't set abundances properly (#891)\n\n## [0.4.0] - 2020-01-26\n\nAdded:\n\n- Compute improvements: Parameter sets for defining signatures, add_protein implemented (#845)\n- add_many for faster insertion of multiple hashes (#826)\n\nChanged:\n\n- Compare/similarity now have a downsample argument (#856)\n\nFixed:\n\n- Improve sketching performance with lookup tables for complement and DNA validation (#861) (#865)\n- Use tarpaulin instead of grcov (#862)\n- set up publishing workflow for NPM and crates.io (#824)\n\n## [0.3.0] - 2020-01-05\n\nAdded:\n\n- Similarity with abundance method for MinHash (#808)\n- Experimental support for indices in Rust (#773)\n- Experimental SBT with MQF internal nodes in Rust (#772)\n\nChanged:\n\n- Make the sourmash crate library-only (#812)\n\nFixed:\n\n- Use once_cell instead of lazy_static and lazy-init (#815)\n- Fix mem leak in get_mins (#807)\n- Fixes for WASI and WASM compilation (#771) (#723)\n\n[unreleased]: https://github.com/sourmash-bio/sourmash/compare/r0.19.0...HEAD\n[0.19.0]: https://github.com/sourmash-bio/sourmash/compare/r0.18.0...r0.19.0\n[0.18.0]: https://github.com/sourmash-bio/sourmash/compare/r0.17.2...r0.18.0\n[0.17.2]: https://github.com/sourmash-bio/sourmash/compare/r0.17.1...r0.17.2\n[0.17.1]: https://github.com/sourmash-bio/sourmash/compare/r0.17.0...r0.17.1\n[0.17.0]: https://github.com/sourmash-bio/sourmash/compare/r0.16.0...r0.17.0\n[0.16.0]: https://github.com/sourmash-bio/sourmash/compare/r0.15.1...r0.16.0\n[0.15.1]: https://github.com/sourmash-bio/sourmash/compare/r0.15.0...r0.15.1\n[0.15.0]: https://github.com/sourmash-bio/sourmash/compare/r0.14.1...r0.15.0\n[0.14.1]: https://github.com/sourmash-bio/sourmash/compare/r0.14.0...r0.14.1\n[0.14.0]: https://github.com/sourmash-bio/sourmash/compare/r0.13.1...r0.14.0\n[0.13.1]: https://github.com/sourmash-bio/sourmash/compare/r0.13.0...r0.13.1\n[0.13.0]: https://github.com/sourmash-bio/sourmash/compare/r0.12.1...r0.13.0\n[0.12.1]: https://github.com/sourmash-bio/sourmash/compare/r0.12.0...r0.12.1\n[0.12.0]: https://github.com/sourmash-bio/sourmash/compare/r0.11.0...r0.12.0\n[0.11.0]: https://github.com/sourmash-bio/sourmash/compare/r0.10.0...r0.11.0\n[0.10.0]: https://github.com/sourmash-bio/sourmash/compare/r0.9.0...r0.10.0\n[0.9.0]: https://github.com/sourmash-bio/sourmash/compare/r0.9.0...r0.10.0\n[0.8.0]: https://github.com/sourmash-bio/sourmash/compare/r0.8.0...r0.9.0\n[0.7.0]: https://github.com/sourmash-bio/sourmash/compare/r0.7.0...r0.8.0\n[0.6.0]: https://github.com/sourmash-bio/sourmash/compare/r0.6.0...r0.7.0\n[0.5.0]: https://github.com/sourmash-bio/sourmash/compare/r0.5.0...r0.6.0\n[0.4.0]: https://github.com/sourmash-bio/sourmash/compare/r0.4.0...r0.5.0\n[0.3.0]: https://github.com/sourmash-bio/sourmash/compare/r0.3.0...r0.4.0\n"
  },
  {
    "path": "src/core/Cargo.toml",
    "content": "[package]\nname = \"sourmash\"\nversion = \"0.22.0\"\nauthors = [\"Luiz Irber <luiz@sourmash.bio>\", \"N. Tessa Pierce-Ward <tessa@sourmash.bio>\", \"C. Titus Brown <titus@idyll.org>\"]\ndescription = \"tools for comparing biological sequences with k-mer sketches\"\nrepository = \"https://github.com/sourmash-bio/sourmash\"\nkeywords = [\"minhash\", \"bioinformatics\"]\ncategories = [\"science\", \"algorithms\", \"data-structures\"]\nlicense = \"BSD-3-Clause\"\nedition = \"2024\"\nreadme = \"README.md\"\nautoexamples = false\nautobins = false\nrust-version = \"1.85.0\"\n\n[lib]\nname = \"sourmash\"\ncrate-type = [\"lib\", \"staticlib\", \"cdylib\"]\nbench = false\n\n[features]\nparallel = [\"dep:rayon\"]\nmaturin = []\nbranchwater = [\"dep:rocksdb\", \"parallel\"]\nrkyv = [\"dep:rkyv\"]\ndefault = []\n\n[dependencies]\naz = \"1.0.0\"\nbyteorder = \"1.4.3\"\ncamino = { version = \"1.2.2\", features = [\"serde1\"] }\ncfg-if = \"1.0\"\ncounter = \"0.6.0\"\ncsv = \"1.4.0\"\nenum_dispatch = \"0.3.13\"\nfixedbitset = \"0.4.0\"\ngetset = \"0.1.6\"\nhistogram = \"1.2.0\"\nitertools = \"0.14.0\"\nlog = \"0.4.29\"\nmd5 = \"0.8.0\"\nmemmap2 = \"0.9.9\"\nmurmurhash3 = \"0.0.5\"\nneedletail = { version = \"0.7.3\", default-features = false }\nniffler = { version = \"3.0.0\", default-features = false, features = [ \"gz\", \"zstd\" ] }\nnohash-hasher = \"0.2.0\"\nnum-iter = \"0.1.45\"\nonce_cell = \"1.18.0\"\nouroboros = \"0.18.5\"\npiz = \"0.5.0\"\nprimal-check = \"0.3.4\"\nrayon = { version = \"1.12.0\", optional = true }\nreplace_with = \"0.1.8\"\nrkyv = { version = \"0.8.15\", optional = true }\nroaring = \"0.11.0\"\nroots = \"0.0.8\"\nserde = { version = \"1.0.228\", features = [\"derive\"] }\nserde_json = \"1.0.149\"\nstatrs = \"0.18.0\"\nstreaming-stats = \"0.2.3\"\nthiserror = \"2.0\"\ntwox-hash = { version = \"2\", default-features = false, features = [\"xxhash3_128\", \"std\"] }\ntyped-builder = \"0.22.0\"  # 0.23 requires rust 1.88+\nvec-collections = \"0.4.3\"\n\n[dev-dependencies]\ncodspeed-criterion-compat = \"4.5.0\"\nproptest = { version = \"1.11.0\", default-features = false, features = [\"std\"]}\nrand = \"0.10.1\"\ntempfile = \"3.27.0\"\n\n[[bench]]\nname = \"compute\"\nharness = false\n\n[[bench]]\nname = \"nodegraph\"\nharness = false\n\n[[bench]]\nname = \"minhash\"\nharness = false\n\n[[bench]]\nname = \"gather\"\nharness = false\n\n[package.metadata.cargo-feature-combinations]\nskip_optional_dependencies = true\ndenylist = [\"maturin\"]\nskip_feature_sets = [\n    [\"branchwater\", \"parallel\"], # branchwater implies parallel\n]\n\n## Wasm section. Crates only used for WASM, as well as specific configurations\n\n[target.'cfg(all(target_arch = \"wasm32\", target_os=\"unknown\"))'.dependencies]\njs-sys = \"0.3.72\"\nweb-sys = { version = \"0.3.72\", features = [\"console\", \"File\", \"FileReaderSync\"] }\nwasm-bindgen = \"0.2.89\"\ngetrandom = { version = \"0.2\", features = [\"js\"] }\n\n[target.'cfg(all(target_arch = \"wasm32\"))'.dependencies]\nchrono = { version = \"0.4.32\", features = [\"wasmbind\"] }\n\n[target.'cfg(all(target_arch = \"wasm32\", target_os=\"unknown\"))'.dev-dependencies]\nwasm-bindgen-test = \"0.3.67\"\n\n### These crates don't compile on wasm\n[target.'cfg(not(target_arch = \"wasm32\"))'.dependencies.rocksdb]\nversion = \"0.24.0\"\noptional = true\ndefault-features = false\nfeatures = [ \"bindgen-runtime\", \"snappy\", \"zstd\" ]\n\n[target.'cfg(not(target_arch = \"wasm32\"))'.dev-dependencies]\ncriterion = \"0.8.2\"\n"
  },
  {
    "path": "src/core/README.md",
    "content": "<meta charset=\"utf-8\"/>\n\n# sourmash\n\n🦀\n[![](https://img.shields.io/crates/v/sourmash.svg)](https://crates.io/crates/sourmash)\n[![Rust API Documentation on docs.rs](https://docs.rs/sourmash/badge.svg)](https://docs.rs/sourmash)\n[![build-status]][github-actions]\n[![codecov](https://codecov.io/gh/sourmash-bio/sourmash/branch/latest/graph/badge.svg)](https://codecov.io/gh/sourmash-bio/sourmash)\n<a href=\"https://github.com/sourmash-bio/sourmash/blob/latest/LICENSE\"><img alt=\"License: 3-Clause BSD\" src=\"https://img.shields.io/badge/License-BSD%203--Clause-blue.svg\"></a>\n\n[build-status]: https://github.com/sourmash-bio/sourmash/workflows/Rust%20checks/badge.svg\n[github-actions]: https://github.com/sourmash-bio/sourmash/actions?query=workflow%3A%22Rust+checks%22\n\n----\n\nCompute MinHash signatures for nucleotide (DNA/RNA) and protein sequences.\n\nThis is the core library used by sourmash. It exposes a C API that can be\ncalled from FFI in other languages, and it is how we use it in Python for\nbuilding the sourmash application (CLI and Python API).\n\n----\n\nsourmash is a product of the\n[Lab for Data-Intensive Biology](http://ivory.idyll.org/lab/) at the\n[UC Davis School of Veterinary Medicine](http://www.vetmed.ucdavis.edu).\n\n## Support\n\nPlease ask questions and files issues\n[on Github](https://github.com/sourmash-bio/sourmash/issues).\n\n## Development\n\nDevelopment happens on github at\n[sourmash-bio/sourmash](https://github.com/sourmash-bio/sourmash).\n\n## Minimum supported Rust version\n\nCurrently the minimum supported Rust version is 1.85.0.\n"
  },
  {
    "path": "src/core/benches/compute.rs",
    "content": "use codspeed_criterion_compat::{Criterion, criterion_group, criterion_main};\n\nuse std::fs::File;\nuse std::io::{Cursor, Read};\n\nuse needletail::parse_fastx_reader;\nuse sourmash::cmd::ComputeParameters;\nuse sourmash::signature::Signature;\n\nfn add_sequence(c: &mut Criterion) {\n    let cp = ComputeParameters::default();\n    let template_sig = Signature::from_params(&cp);\n\n    let mut data: Vec<u8> = vec![];\n    let mut f = File::open(\"../../tests/test-data/ecoli.genes.fna\").unwrap();\n    let _ = f.read_to_end(&mut data);\n\n    let data = data.repeat(10);\n\n    let data_upper = data.to_ascii_uppercase();\n    let data_lower = data.to_ascii_lowercase();\n    let data_errors: Vec<u8> = data\n        .iter()\n        .enumerate()\n        .map(|(i, x)| if i % 89 == 1 { b'N' } else { *x })\n        .collect();\n\n    let mut group = c.benchmark_group(\"add_sequence\");\n    group.sample_size(10);\n\n    group.bench_function(\"valid\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_upper.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_sequence(&rec.unwrap().seq(), false).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"lowercase\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_lower.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_sequence(&rec.unwrap().seq(), false).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"invalid kmers\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_errors.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_sequence(&rec.unwrap().seq(), true).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"force with valid kmers\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_upper.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_sequence(&rec.unwrap().seq(), true).unwrap();\n            }\n        });\n    });\n}\n\nfn add_sequence_protein(c: &mut Criterion) {\n    let mut cp = ComputeParameters::default();\n    cp.set_protein(true);\n    cp.set_dna(false);\n    cp.set_scaled(200);\n    cp.set_ksizes(vec![30]);\n    let template_sig = Signature::from_params(&cp);\n\n    let mut data: Vec<u8> = vec![];\n    let (mut f, _) = niffler::from_path(\"../../tests/test-data/genome-s10.fa.gz\").unwrap();\n    let _ = f.read_to_end(&mut data);\n\n    let data = data.repeat(10);\n\n    let data_upper = data.to_ascii_uppercase();\n    let data_lower = data.to_ascii_lowercase();\n    let data_errors: Vec<u8> = data\n        .iter()\n        .enumerate()\n        .map(|(i, x)| if i % 89 == 1 { b'N' } else { *x })\n        .collect();\n\n    let mut group = c.benchmark_group(\"add_sequence_protein\");\n    group.sample_size(10);\n\n    group.bench_function(\"valid\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_upper.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_protein(&rec.unwrap().seq()).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"lowercase\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_lower.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_protein(&rec.unwrap().seq()).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"invalid kmers\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_errors.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_protein(&rec.unwrap().seq()).unwrap();\n            }\n        });\n    });\n\n    group.bench_function(\"force with valid kmers\", |b| {\n        b.iter(|| {\n            let fasta_data = Cursor::new(data_upper.clone());\n            let mut sig = template_sig.clone();\n            let mut parser = parse_fastx_reader(fasta_data).unwrap();\n            while let Some(rec) = parser.next() {\n                sig.add_protein(&rec.unwrap().seq()).unwrap();\n            }\n        });\n    });\n}\n\ncriterion_group!(compute, add_sequence, add_sequence_protein);\ncriterion_main!(compute);\n"
  },
  {
    "path": "src/core/benches/gather.rs",
    "content": "use std::fs::File;\nuse std::io::BufReader;\nuse std::path::PathBuf;\n\nuse sourmash::collection::Collection;\nuse sourmash::signature::Signature;\nuse sourmash::{index::calculate_gather_stats, storage::SigStore};\n\nuse codspeed_criterion_compat::{Criterion, black_box, criterion_group, criterion_main};\n\nfn gather_stats_benchmarks(c: &mut Criterion) {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/track_abund/47.fa.sig\");\n    let file = File::open(filename).unwrap();\n    let reader = BufReader::new(file);\n    let sig = Signature::from_reader(reader)\n        .expect(\"Loading error\")\n        .swap_remove(0);\n    let orig_query = sig.minhash().unwrap();\n    let query = orig_query.clone();\n    let total_weighted_hashes = orig_query.sum_abunds();\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/track_abund/63.fa.sig\");\n    // load collection to get sig in sigstore\n    let signatures = Signature::from_path(filename).expect(\"cant find file\");\n    let collection = Collection::from_sigs(signatures).expect(\"cant make collection\");\n    let match_sig: SigStore = collection.sig_for_dataset(0).expect(\"cant load sig\");\n    let test_cases = vec![(false, false), (true, false), (false, true), (true, true)];\n\n    let mut group = c.benchmark_group(\"gather_stats\");\n    for (calc_abund_stats, calc_ani_ci) in test_cases {\n        let test_name = format!(\n            \"abund{}_ani_ci{}\",\n            calc_abund_stats as u8, calc_ani_ci as u8\n        );\n        group.bench_function(&test_name, |b| {\n            b.iter(|| {\n                calculate_gather_stats(\n                    black_box(&orig_query),\n                    black_box(query.clone()),\n                    black_box(match_sig.clone()),\n                    black_box(42), // Example match_size\n                    black_box(1),  // Example gather_result_rank\n                    black_box(200),\n                    black_box(total_weighted_hashes.try_into().unwrap()),\n                    black_box(calc_abund_stats),\n                    black_box(calc_ani_ci),\n                    black_box(None), // don't set custom confidence intervals\n                )\n                .expect(\"error calculating gather stats\");\n            });\n        });\n    }\n    group.finish();\n}\n\ncriterion_group!(gather, gather_stats_benchmarks);\ncriterion_main!(gather);\n"
  },
  {
    "path": "src/core/benches/minhash.rs",
    "content": "use std::fs::File;\nuse std::io::BufReader;\nuse std::path::PathBuf;\n\nuse sourmash::signature::{Signature, SigsTrait};\nuse sourmash::sketch::Sketch;\nuse sourmash::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\n\nuse codspeed_criterion_compat::{Criterion, criterion_group, criterion_main};\n\nfn intersection(c: &mut Criterion) {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/gather-abund/genome-s10.fa.gz.sig\");\n    let file = File::open(filename).unwrap();\n    let reader = BufReader::new(file);\n    let mut sigs = Signature::from_reader(reader).expect(\"Loading error\");\n    let mh = if let Sketch::MinHash(mh) = &sigs.swap_remove(0).sketches()[0] {\n        mh.clone()\n    } else {\n        unimplemented!()\n    };\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/gather-abund/genome-s11.fa.gz.sig\");\n    let file = File::open(filename).unwrap();\n    let reader = BufReader::new(file);\n    let mut sigs = Signature::from_reader(reader).expect(\"Loading error\");\n    let mh2 = if let Sketch::MinHash(mh) = &sigs.swap_remove(0).sketches()[0] {\n        mh.clone()\n    } else {\n        unimplemented!()\n    };\n\n    let mut group = c.benchmark_group(\"minhash\");\n    group.sample_size(10);\n\n    group.bench_function(\"intersection\", |b| {\n        b.iter(|| {\n            mh.intersection(&mh2).unwrap();\n        });\n    });\n\n    group.bench_function(\"intersection_size\", |b| {\n        b.iter(|| {\n            mh.intersection_size(&mh2).unwrap();\n        });\n    });\n\n    let mut mh1 = KmerMinHash::builder()\n        .num(0)\n        .max_hash(1_000_000)\n        .ksize(21)\n        .build();\n    let mut mh2 = KmerMinHash::builder()\n        .num(0)\n        .max_hash(1_000_000)\n        .ksize(21)\n        .build();\n\n    let mut mh1_btree = KmerMinHashBTree::builder()\n        .num(0)\n        .max_hash(1_000_000)\n        .ksize(21)\n        .build();\n    let mut mh2_btree = KmerMinHashBTree::builder()\n        .num(0)\n        .max_hash(1_000_000)\n        .ksize(21)\n        .build();\n\n    for i in 0..=1_000_000 {\n        if i % 2 == 0 {\n            mh1.add_hash(i);\n            mh1_btree.add_hash(i);\n        }\n        if i % 45 == 0 {\n            mh2.add_hash(i);\n            mh2_btree.add_hash(i);\n        }\n    }\n\n    group.bench_function(\"large intersection\", |b| {\n        b.iter(|| {\n            mh1.intersection(&mh2).unwrap();\n        });\n    });\n\n    group.bench_function(\"large intersection_size\", |b| {\n        b.iter(|| {\n            mh1.intersection_size(&mh2).unwrap();\n        });\n    });\n\n    group.bench_function(\"large intersection btree\", |b| {\n        b.iter(|| {\n            mh1_btree.intersection(&mh2_btree).unwrap();\n        });\n    });\n\n    group.bench_function(\"large intersection_size btree\", |b| {\n        b.iter(|| {\n            mh1_btree.intersection_size(&mh2_btree).unwrap();\n        });\n    });\n}\n\ncriterion_group!(minhash, intersection);\ncriterion_main!(minhash);\n"
  },
  {
    "path": "src/core/benches/nodegraph.rs",
    "content": "use std::fs::File;\nuse std::io::{BufWriter, Cursor, Read};\n\nuse sourmash::sketch::nodegraph::Nodegraph;\n\nuse codspeed_criterion_compat::{Criterion, criterion_group, criterion_main};\n\nfn save_load(c: &mut Criterion) {\n    let mut data: Vec<u8> = vec![];\n    let mut f = File::open(\"../../tests/test-data/.sbt.v3/internal.0\").unwrap();\n    let _ = f.read_to_end(&mut data);\n\n    let mut group = c.benchmark_group(\"nodegraph\");\n    group.sample_size(10);\n\n    let mut reader = Cursor::new(data.clone());\n    let ng = Nodegraph::from_reader(&mut reader).unwrap();\n\n    group.bench_function(\"load nodegraph\", |b| {\n        b.iter(|| {\n            let mut reader = Cursor::new(data.clone());\n            let _ng = Nodegraph::from_reader(&mut reader).unwrap();\n        });\n    });\n\n    group.bench_function(\"save nodegraph\", |b| {\n        b.iter(|| {\n            let mut buf = Vec::new();\n            let mut writer = BufWriter::new(&mut buf);\n            ng.save_to_writer(&mut writer).unwrap();\n        });\n    });\n\n    group.bench_function(\"save compressed nodegraph\", |b| {\n        b.iter(|| {\n            let mut buf = Vec::new();\n            let mut writer = niffler::get_writer(\n                Box::new(&mut buf),\n                niffler::compression::Format::Gzip,\n                niffler::compression::Level::One,\n            )\n            .unwrap();\n\n            ng.save_to_writer(&mut writer).unwrap();\n        });\n    });\n}\n\ncriterion_group!(nodegraph, save_load);\ncriterion_main!(nodegraph);\n"
  },
  {
    "path": "src/core/build.rs",
    "content": "use std::env;\n\nfn main() {\n    let crate_dir = env::var(\"CARGO_MANIFEST_DIR\").unwrap();\n    copy_c_bindings(&crate_dir);\n}\n\n#[cfg(not(feature = \"maturin\"))]\nfn copy_c_bindings(_crate_dir: &str) {}\n\n#[cfg(feature = \"maturin\")]\nfn copy_c_bindings(crate_dir: &str) {\n    use std::path::{Path, PathBuf};\n\n    fn find_root_dir(crate_dir: &str) -> &Path {\n        let root_dir = Path::new(crate_dir);\n\n        if root_dir.join(\"pyproject.toml\").is_file() {\n            return root_dir;\n        }\n\n        let root_dir = Path::new(crate_dir).parent().unwrap().parent().unwrap();\n        if root_dir.join(\"pyproject.toml\").is_file() {\n            return root_dir;\n        }\n\n        panic!(\"Couldn't find pyproject.toml to determine root dir\");\n    }\n\n    fn find_target_dir(out_dir: &str) -> PathBuf {\n        use std::ffi::OsStr;\n\n        let mut components = Path::new(out_dir).iter();\n\n        while let Some(dir) = components.next_back() {\n            if dir == OsStr::new(\"target\") {\n                break;\n            }\n        }\n        let mut dir: PathBuf = components.collect();\n\n        if dir.as_os_str().is_empty() {\n            panic!(\"Couldn't find target dir based on OUT_DIR\");\n        } else {\n            dir.push(\"target\");\n            dir\n        }\n    }\n\n    let root_dir = find_root_dir(crate_dir);\n    let header_path = root_dir.join(\"include\").join(\"sourmash.h\");\n    let header = std::fs::read_to_string(header_path).expect(\"error reading header\");\n\n    // strip directives, not supported by the cffi C parser\n    let new_header: String = header\n        .lines()\n        .filter_map(|s| {\n            if s.starts_with('#') {\n                None\n            } else {\n                Some({\n                    let mut s = s.to_owned();\n                    s.push('\\n');\n                    s\n                })\n            }\n        })\n        .collect();\n\n    let out_dir = env::var(\"OUT_DIR\").unwrap();\n    let target_dir = find_target_dir(&out_dir);\n    std::fs::create_dir_all(&target_dir).expect(\"error creating target dir\");\n    let out_path = target_dir.join(\"header.h\");\n    std::fs::write(out_path, new_header).expect(\"error writing header\");\n}\n"
  },
  {
    "path": "src/core/cbindgen.toml",
    "content": "header = \"/* c bindings to the sourmash library */\"\ninclude_guard = \"SOURMASH_H_INCLUDED\"\nlanguage = \"C\"\nstyle = \"type\"\n\n[parse]\nclean = true\n\n[parse.expand]\ncrates = [\"sourmash\"]\nfeatures = [\"branchwater\"]\n\n[enum]\nrename_variants = \"QualifiedScreamingSnakeCase\"\n\n[export]\nexclude = [\"HLL\", \"NoHashHasher\", \"HashIntersection\"]\n\n[fn]\nsort_by = \"Name\"\n"
  },
  {
    "path": "src/core/examples/generate_mqfs.rs",
    "content": "use std::collections::HashMap;\nuse std::fs::File;\nuse std::io::BufReader;\nuse std::path::PathBuf;\nuse std::result::Result;\n\nuse mqf::MQF;\n\nuse sourmash::signature::Signature;\nuse sourmash::sketch::Sketch;\n\nfn main() {\n    let mh_paths: HashMap<u8, String> = {\n        [\n            (6, \"6d6e87e1154e95b279e5e7db414bc37b\".into()),\n            (7, \"60f7e23c24a8d94791cc7a8680c493f9\".into()),\n            (8, \"0107d767a345eff67ecdaed2ee5cd7ba\".into()),\n            (9, \"f71e78178af9e45e6f1d87a0c53c465c\".into()),\n            (10, \"f0c834bc306651d2b9321fb21d3e8d8f\".into()),\n            (11, \"4e94e60265e04f0763142e20b52c0da1\".into()),\n            (12, \"b59473c94ff2889eca5d7165936e64b3\".into()),\n        ]\n        .into_iter()\n        .cloned()\n        .collect()\n    };\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"tests/test-data/.sbt.v5_mhmt/\");\n\n    let mh_sigs: HashMap<u8, Signature> = mh_paths\n        .into_iter()\n        .map(|(k, v)| {\n            let mut mhpath = filename.clone();\n            mhpath.push(v);\n\n            let file = File::open(mhpath).unwrap();\n            let reader = BufReader::new(file);\n            let sig: Result<Vec<Signature>, _> = serde_json::from_reader(reader);\n            (k, sig.unwrap()[0].clone())\n        })\n        .collect();\n\n    let mut mqfs: HashMap<u8, MQF> = HashMap::default();\n\n    for i in (0..=5).rev() {\n        println!(\"Creating MQF {}\", i);\n        let mut mqf = MQF::new(1, 18);\n\n        let left = i * 2 + 1;\n        for child in left..=left + 1 {\n            if mh_sigs.contains_key(&child) {\n                println!(\"Loading values from MH {}\", child);\n                if let Sketch::MinHash(sig) = &mh_sigs[&child].signatures[0] {\n                    sig.mins()\n                        .iter()\n                        .map(|h| {\n                            dbg!(*h % u64::pow(2, 26));\n                            mqf.insert(*h % u64::pow(2, 26), 1)\n                            //mqf.insert(*h, 1)\n                        })\n                        .count();\n                };\n            } else if mqfs.contains_key(&child) {\n                let mut cmqf = mqfs.get_mut(&child).unwrap();\n                mqf.merge(&mut cmqf).expect(\"Error merging\");\n            } else {\n                // TODO: shouldn't happen...\n                unimplemented!()\n            }\n        }\n\n        println!(\"Save MQF {} for later\", i);\n        mqfs.insert(i, mqf);\n\n        println!(\"Saving MQFs to disk\");\n        let mut internal = filename.clone();\n        internal.push(format!(\"internal.{}\", i));\n        mqfs[&i].serialize(internal).unwrap();\n    }\n}\n"
  },
  {
    "path": "src/core/src/ani_utils.rs",
    "content": "// Streamlined set of utils for containment --> ANI estimation\n// Equations based off of: https://github.com/KoslickiLab/mutation-rate-ci-calculator\n// Reference: https://doi.org/10.1101/2022.01.11.475870\n\nuse roots::{SimpleConvergency, find_root_brent};\nuse statrs::distribution::{ContinuousCDF, Normal};\n\nuse crate::{Error, ScaledType};\n\nfn exp_n_mutated(l: f64, k: f64, r1: f64) -> f64 {\n    let q = r1_to_q(k, r1);\n    l * q\n}\n\nfn var_n_mutated(l: f64, k: f64, r1: f64, q: Option<f64>) -> Result<f64, Error> {\n    if r1 == 0.0 {\n        return Ok(0.0);\n    }\n\n    let q = q.unwrap_or_else(|| r1_to_q(k, r1));\n\n    let var_n = l * (1.0 - q) * (q * (2.0 * k + (2.0 / r1) - 1.0) - 2.0 * k)\n        + k * (k - 1.0) * (1.0 - q).powi(2)\n        + (2.0 * (1.0 - q) / (r1.powi(2))) * ((1.0 + (k - 1.0) * (1.0 - q)) * r1 - q);\n\n    if var_n < 0.0 {\n        Err(Error::ANIEstimationError {\n            message: \"varN is less than 0.0\".into(),\n        })\n    } else {\n        Ok(var_n)\n    }\n}\n\nfn exp_n_mutated_squared(l: f64, k: f64, p: f64) -> Result<f64, Error> {\n    let var_n = var_n_mutated(l, k, p, None)?;\n    let exp_n_squared = exp_n_mutated(l, k, p).powi(2);\n    Ok(var_n + exp_n_squared)\n}\n\nfn probit(p: f64) -> f64 {\n    Normal::new(0.0, 1.0).unwrap().inverse_cdf(p)\n}\n\nfn r1_to_q(k: f64, r1: f64) -> f64 {\n    1.0 - (1.0 - r1).powi(k as i32)\n}\n\n// prior versions of ani estimation also returned this value by default.\n// BUT, it's not really something we need to calculate for prefetch/gather,\n// since there will always be something in common (or comparison would not be happening)\n// I'm not sure where the right place to put this back in is.. perhaps add minhash.contained_ani()\n// and return this there.\n// Usage:\n// let prob_nothing_in_common =\n//     get_exp_probability_nothing_common(n_unique_kmers, ksize, point_estimate, f_scaled)?;\n// let prob_threshold = prob_threshold.unwrap_or(1e-3);\n#[allow(dead_code)]\nfn get_exp_probability_nothing_common(\n    ani_estimate: f64,\n    ksize: f64,\n    f_scaled: f64,\n    n_unique_kmers: f64,\n) -> Result<f64, Error> {\n    if ani_estimate == 0.0 || ani_estimate == 1.0 {\n        Ok(1.0 - ani_estimate)\n    } else {\n        // Calculate the expected log probability.\n        let exp_nmut = exp_n_mutated(n_unique_kmers, ksize, 1.0 - ani_estimate);\n        let mut expected_log_probability = (n_unique_kmers - exp_nmut) * (1.0 - f_scaled).ln();\n\n        if expected_log_probability.is_infinite() {\n            expected_log_probability = f64::NEG_INFINITY;\n        }\n        // Return the exponential of the expected log probability.\n        Ok(expected_log_probability.exp())\n    }\n}\n\n/// Streamlined function for ANI from containment.\n/// todo: report ANI as % in 5.0?\npub fn ani_from_containment(containment: f64, ksize: f64) -> f64 {\n    if containment == 0.0 {\n        0.0\n    } else if containment == 1.0 {\n        1.0\n    } else {\n        1.0 - (1.0 - containment.powf(1.0 / ksize))\n    }\n}\n\n// Calculate containment to ANI with confidence intervals\npub fn ani_ci_from_containment(\n    containment: f64,\n    ksize: f64,\n    scaled: ScaledType,\n    n_unique_kmers: u64,\n    confidence: Option<f64>,\n) -> Result<(f64, f64), Error> {\n    if containment == 0.0 {\n        return Ok((0.0, 0.0));\n    } else if containment == 1.0 {\n        return Ok((1.0, 1.0));\n    }\n    let confidence = confidence.unwrap_or(0.95);\n\n    // conversions needed throughout\n    let scaled_f64 = scaled as f64;\n    let f_scaled = 1.0 / scaled_f64;\n    let n_unique_kmers = n_unique_kmers as f64;\n    let alpha = 1.0 - confidence;\n\n    let z_alpha = probit(1.0 - alpha / 2.0);\n    let bias_factor = 1.0 - (1.0 - f_scaled).powi(n_unique_kmers as i32);\n    let term_1 = (1.0 - f_scaled) / (f_scaled * (n_unique_kmers).powi(3) * bias_factor.powi(2));\n    let term_2 = |pest: f64| {\n        n_unique_kmers * exp_n_mutated(n_unique_kmers, ksize, pest)\n            - exp_n_mutated_squared(n_unique_kmers, ksize, pest).unwrap_or(0.0)\n    };\n    let term_3 = |pest: f64| {\n        var_n_mutated(n_unique_kmers, ksize, pest, None).unwrap_or(0.0) / (n_unique_kmers).powi(2)\n    };\n\n    let var_direct = |pest: f64| term_1 * term_2(pest) + term_3(pest);\n\n    let f1 = |pest: f64| {\n        (1.0 - pest).powi(ksize as i32) + z_alpha * var_direct(pest).sqrt() - containment\n    };\n    let f2 = |pest: f64| {\n        (1.0 - pest).powi(ksize as i32) - z_alpha * var_direct(pest).sqrt() - containment\n    };\n\n    let mut convergency = SimpleConvergency {\n        eps: 1e-15,\n        max_iter: 1000,\n    };\n\n    let dist_sol1 =\n        find_root_brent(0.0000001, 0.9999999, &f1, &mut convergency).unwrap_or_default();\n    let dist_sol2 =\n        find_root_brent(0.0000001, 0.9999999, &f2, &mut convergency).unwrap_or_default();\n\n    Ok((1.0 - dist_sol1, 1.0 - dist_sol2))\n}\n\n#[cfg(test)]\nmod tests {\n\n    use super::*;\n    use std::f64::EPSILON;\n\n    #[test]\n    fn test_containment_to_ani_zero() {\n        let contain = 0.0;\n        let ksize = 21;\n        let scaled = 10;\n        let n_unique_kmers = 100;\n        let confidence = Some(0.95);\n        let res = ani_from_containment(contain, ksize as f64);\n        assert_eq!(res, 0.0);\n        let (ci_low, ci_high) =\n            ani_ci_from_containment(contain, ksize as f64, scaled, n_unique_kmers, confidence)\n                .unwrap();\n\n        eprintln!(\"{}\", ci_low);\n        eprintln!(\"{}\", ci_high);\n        assert_eq!(ci_low, 0.0);\n        assert_eq!(ci_high, 0.0);\n    }\n\n    #[test]\n    fn test_containment_to_ani_one() {\n        let contain = 1.0;\n        let ksize = 21;\n        let scaled = 10;\n        let n_unique_kmers = 100;\n        let confidence = None;\n        let res = ani_from_containment(contain, ksize as f64);\n        assert_eq!(res, 1.0);\n        let (ci_low, ci_high) =\n            ani_ci_from_containment(contain, ksize as f64, scaled, n_unique_kmers, confidence)\n                .unwrap();\n        assert_eq!(ci_low, 1.0);\n        assert_eq!(ci_high, 1.0);\n    }\n\n    #[test]\n    fn test_containment_to_ani_scaled1() {\n        let contain = 0.5;\n        let ksize = 21;\n        let scaled = 1;\n        let n_unique_kmers = 10000;\n        let confidence = None;\n        let ani = ani_from_containment(contain, ksize as f64);\n        assert!((ani - 0.9675317785238916) < EPSILON);\n        let (ci_low, ci_high) =\n            ani_ci_from_containment(contain, ksize as f64, scaled, n_unique_kmers, confidence)\n                .unwrap();\n        assert!((ci_low - 0.9635213980271021) < EPSILON);\n        assert!((ci_high - 0.9712900870335944) < EPSILON);\n    }\n\n    #[test]\n    fn test_containment_to_ani_scaled100() {\n        let contain = 0.1;\n        let ksize = 31;\n        let scaled = 100;\n        let n_unique_kmers = 10000;\n        let confidence = None;\n        let ani = ani_from_containment(contain, ksize as f64);\n        assert!((ani - 0.9284145445194744) < EPSILON);\n        let (ci_low, ci_high) =\n            ani_ci_from_containment(contain, ksize as f64, scaled, n_unique_kmers, confidence)\n                .unwrap();\n        assert!((ci_low - 0.9094445232754665) < EPSILON);\n        assert!((ci_high - 0.9467922076143345) < EPSILON);\n    }\n\n    #[test]\n    fn test_containment_to_ani_scaled100_2() {\n        let contain = 0.5;\n        let ksize = 21;\n        let scaled = 100;\n        let n_unique_kmers = 10000;\n        let confidence = None;\n        let ani = ani_from_containment(contain, ksize as f64);\n        assert!((ani - 0.9675317785238916) < EPSILON);\n        let (ci_low, ci_high) =\n            ani_ci_from_containment(contain, ksize as f64, scaled, n_unique_kmers, confidence)\n                .unwrap();\n        assert!((ci_low - 0.9569003945603415) < EPSILON);\n        assert!((ci_high - 0.9762879360833708) < EPSILON);\n    }\n\n    #[test]\n    fn test_var_n_mutated_zero() {\n        let r = 0.0;\n        let ksize = 31;\n        let nkmers = 200;\n        let var_n_mut = var_n_mutated(nkmers as f64, ksize as f64, r, None).unwrap(); // Assuming the function returns a Result\n        assert_eq!(var_n_mut, 0.0, \"Expected variance to be 0 for r=0\");\n    }\n\n    #[test]\n    fn test_var_n_mutated_value_error() {\n        let r = 10.0;\n        let ksize = 31;\n        let nkmers = 200;\n        match var_n_mutated(nkmers as f64, ksize as f64, r, None) {\n            Err(e) => assert_eq!(\n                e.to_string(),\n                \"error while calculating ANI confidence intervals: varN is less than 0.0\",\n                \"Unexpected error message\"\n            ),\n            Ok(_) => panic!(\"Expected an error, but got Ok\"),\n        }\n    }\n\n    #[test]\n    fn test_var_n_mutated_success() {\n        let r = 0.4;\n        let ksize = 31;\n        let nkmers = 200_000;\n        let var_n_mut = var_n_mutated(nkmers as f64, ksize as f64, r, None).unwrap(); // Assuming the function returns a Result\n        let expected = 0.10611425440741508;\n        assert!(\n            (var_n_mut - expected).abs() < f64::EPSILON,\n            \"Variance did not match expected value\"\n        );\n    }\n\n    #[test]\n    fn test_r1_to_q() {\n        let k = 2.0;\n        let r1 = 0.5;\n        let result = r1_to_q(k, r1);\n        let expected = 0.75;\n\n        assert!(\n            (result - expected).abs() < EPSILON,\n            \"The result of r1_to_q({}, {}) was {}, but {} was expected\",\n            k,\n            r1,\n            result,\n            expected\n        );\n    }\n\n    #[test]\n    fn test_exp_n_mutated() {\n        let l = 100.0;\n        let k = 2.0;\n        let r1 = 0.5;\n\n        // Calculate the expected result based on the inputs\n        let expected_q = r1_to_q(k, r1);\n        let expected_result = l * expected_q;\n\n        let result = exp_n_mutated(l, k, r1);\n\n        assert!(\n            (result - expected_result).abs() < EPSILON,\n            \"The result of exp_n_mutated({}, {}, {}) was {}, but {} was expected\",\n            l,\n            k,\n            r1,\n            result,\n            expected_result\n        );\n    }\n\n    #[test]\n    fn test_get_exp_probability_nothing_common_ani_zero() {\n        let ani_estimate = 0.0;\n        let ksize = 31.0;\n        let f_scaled = 0.1;\n        let n_unique_kmers = 1000.0;\n\n        let result =\n            get_exp_probability_nothing_common(ani_estimate, ksize, f_scaled, n_unique_kmers)\n                .unwrap();\n        assert_eq!(\n            result, 1.0,\n            \"Expected probability for ani_estimate of 0 to be 1.0\"\n        );\n    }\n\n    #[test]\n    fn test_get_exp_probability_nothing_common_ani_one() {\n        let ani_estimate = 1.0;\n        let ksize = 31.0;\n        let f_scaled = 0.1;\n        let n_unique_kmers = 1000.0;\n\n        let result =\n            get_exp_probability_nothing_common(ani_estimate, ksize, f_scaled, n_unique_kmers)\n                .unwrap();\n        assert_eq!(\n            result, 0.0,\n            \"Expected probability for ani_estimate of 1 to be 0.0\"\n        );\n    }\n\n    #[test]\n    fn test_get_exp_probability_nothing_common() {\n        let contain = 0.1;\n        let ksize = 31 as f64;\n        let scaled = 10;\n        let f_scaled = 1.0 / scaled as f64;\n        let n_unique_kmers = 1000;\n\n        let ani = ani_from_containment(contain, ksize);\n        let result =\n            get_exp_probability_nothing_common(ani, ksize, f_scaled, n_unique_kmers as f64)\n                .unwrap();\n        assert!(\n            result >= 0.0 && result <= 1.0,\n            \"The result should be a valid probability\"\n        );\n        assert!((result - 0.000026561398887587855) < EPSILON);\n    }\n}\n"
  },
  {
    "path": "src/core/src/cmd.rs",
    "content": "use getset::{CopyGetters, Getters, Setters};\nuse typed_builder::TypedBuilder;\n\nuse crate::encodings::HashFunctions;\nuse crate::signature::Signature;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::{KmerMinHashBTree, max_hash_for_scaled};\n\nimpl Signature {\n    pub fn from_params(params: &ComputeParameters) -> Signature {\n        let template = build_template(params);\n\n        Signature::builder()\n            .hash_function(\"0.murmur64\")\n            .name(params.merge.clone())\n            .filename(None)\n            .signatures(template)\n            .build()\n    }\n}\n\n#[allow(dead_code)]\n#[derive(TypedBuilder, CopyGetters, Getters, Setters)]\npub struct ComputeParameters {\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = vec![21, 31, 51])]\n    ksizes: Vec<u32>,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    check_sequence: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = true)]\n    dna: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    dayhoff: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    hp: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    skipm1n3: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    skipm2n3: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    singleton: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = 0u32)]\n    scaled: u32,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    force: bool,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = None)]\n    output: Option<String>, // TODO: check\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = 500u32)]\n    num_hashes: u32,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    protein: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    name_from_first: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = 42u64)]\n    seed: u64,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    input_is_protein: bool,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = None)]\n    merge: Option<String>,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    track_abundance: bool,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = false)]\n    randomize: bool,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = \"CC0\".into())]\n    license: String,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[builder(default = 2usize)]\n    processes: usize,\n}\n\nimpl Default for ComputeParameters {\n    fn default() -> Self {\n        Self::builder().build()\n    }\n}\n\npub fn build_template(params: &ComputeParameters) -> Vec<Sketch> {\n    let max_hash = max_hash_for_scaled(params.scaled);\n\n    params\n        .ksizes\n        .iter()\n        .flat_map(|k| {\n            let mut ksigs = vec![];\n\n            if params.protein {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Protein)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            if params.dayhoff {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Dayhoff)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            if params.hp {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Hp)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            if params.skipm1n3 {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Skipm1n3)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            if params.skipm2n3 {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Skipm2n3)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            if params.dna {\n                ksigs.push(Sketch::LargeMinHash(\n                    KmerMinHashBTree::builder()\n                        .num(params.num_hashes)\n                        .ksize(*k)\n                        .hash_function(HashFunctions::Murmur64Dna)\n                        .max_hash(max_hash)\n                        .seed(params.seed)\n                        .abunds(if params.track_abundance {\n                            Some(Default::default())\n                        } else {\n                            None\n                        })\n                        .build(),\n                ));\n            }\n\n            ksigs\n        })\n        .collect()\n}\n"
  },
  {
    "path": "src/core/src/collection.rs",
    "content": "use std::ops::{Deref, DerefMut};\n\nuse camino::Utf8Path as Path;\nuse camino::Utf8PathBuf as PathBuf;\n\nuse crate::encodings::Idx;\nuse crate::manifest::{Manifest, Record};\nuse crate::prelude::*;\nuse crate::storage::{FSStorage, InnerStorage, MemStorage, SigStore, ZipStorage};\nuse crate::{Error, Result, ScaledType};\n\n#[cfg(feature = \"parallel\")]\nuse rayon::prelude::*;\n\n/// a Manifest and Storage, combined. Can contain any collection of signatures.\n\n#[derive(Clone)]\npub struct Collection {\n    manifest: Manifest,\n    storage: InnerStorage,\n}\n\n/// A consistent collection of signatures. Can be created using `select`.\n\n#[derive(Clone)]\npub struct CollectionSet {\n    collection: Collection,\n}\n\nimpl Deref for CollectionSet {\n    type Target = Collection;\n\n    fn deref(&self) -> &Self::Target {\n        &self.collection\n    }\n}\n\nimpl DerefMut for CollectionSet {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.collection\n    }\n}\n\nimpl TryFrom<Collection> for CollectionSet {\n    type Error = crate::Error;\n\n    fn try_from(collection: Collection) -> Result<Self> {\n        let first = if let Some(first) = collection.manifest.first() {\n            first\n        } else {\n            // empty collection is consistent ¯\\_(ツ)_/¯\n            return Ok(Self { collection });\n        };\n\n        let (min_scaled, max_scaled) = collection.min_max_scaled().expect(\"empty collection!?\");\n        if min_scaled != max_scaled {\n            return Err(Error::MismatchScaled);\n        }\n\n        collection\n            .manifest\n            .iter()\n            .skip(1)\n            .try_for_each(|c| first.check_compatible(c))?;\n\n        Ok(Self { collection })\n    }\n}\n\nimpl Select for CollectionSet {\n    fn select(mut self, selection: &Selection) -> Result<Self> {\n        self.collection = self.collection.select(selection)?;\n        Ok(self)\n    }\n}\n\nimpl CollectionSet {\n    pub fn into_inner(self) -> Collection {\n        self.collection\n    }\n\n    pub fn selection(&self) -> Selection {\n        Selection::from_record(&self.manifest[0_usize])\n            .expect(\"Should always be able to extract a selection from a CollectionSet\")\n    }\n\n    /// Replace the storage with a new one.\n    ///\n    /// # Safety\n    ///\n    /// This method doesn't check if the manifest matches what is in the\n    /// storage (which can be expensive). It is up to the caller to\n    /// guarantee the manifest and storage are in sync.\n    pub unsafe fn set_storage_unchecked(&mut self, storage: InnerStorage) {\n        self.storage = storage;\n    }\n}\n\nimpl Collection {\n    pub fn new(manifest: Manifest, storage: InnerStorage) -> Self {\n        Self { manifest, storage }\n    }\n\n    pub fn iter(&self) -> impl Iterator<Item = (Idx, &Record)> {\n        self.manifest.iter().enumerate().map(|(i, r)| (i as Idx, r))\n    }\n\n    #[cfg(feature = \"parallel\")]\n    pub fn par_iter(&self) -> impl IndexedParallelIterator<Item = (Idx, &Record)> {\n        self.manifest\n            .par_iter()\n            .enumerate()\n            .map(|(i, r)| (i as Idx, r))\n    }\n\n    pub fn len(&self) -> usize {\n        self.manifest.len()\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.manifest.len() == 0\n    }\n\n    pub fn manifest(&self) -> &Manifest {\n        &self.manifest\n    }\n\n    pub fn storage(&self) -> &InnerStorage {\n        &self.storage\n    }\n\n    pub fn check_superset(&self, other: &Collection) -> Result<usize> {\n        self.iter()\n            .zip(other.iter())\n            .all(|((id1, rec1), (id2, rec2))| id1 == id2 && rec1 == rec2)\n            .then(|| self.len())\n            // TODO: right error here\n            .ok_or(Error::MismatchKSizes)\n    }\n\n    pub fn from_zipfile<P: AsRef<Path>>(zipfile: P) -> Result<Self> {\n        let storage = ZipStorage::from_file(zipfile)?;\n        // Load manifest from standard location in zipstorage\n        let manifest = Manifest::from_reader(storage.load(\"SOURMASH-MANIFEST.csv\")?.as_slice())?;\n        Ok(Self {\n            manifest,\n            storage: InnerStorage::new(storage),\n        })\n    }\n\n    #[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\n    pub fn from_rocksdb<P: AsRef<Path>>(dirname: P) -> Result<Self> {\n        use crate::index::revindex::{RevIndex, RevIndexOps};\n\n        let path = dirname.as_ref().as_str().to_string();\n        let index = RevIndex::open(path, true, None)?;\n        let collection: Collection = index.collection().clone().into_inner();\n\n        Ok(collection)\n    }\n\n    pub fn from_sigs(sigs: Vec<Signature>) -> Result<Self> {\n        let storage = MemStorage::new();\n\n        #[cfg(feature = \"parallel\")]\n        let iter = sigs.into_par_iter();\n\n        #[cfg(not(feature = \"parallel\"))]\n        let iter = sigs.into_iter();\n\n        let records: Vec<_> = iter\n            .enumerate()\n            .flat_map(|(i, sig)| {\n                let path = format!(\"{i}\");\n                let mut record = Record::from_sig(&sig, &path);\n                let path = storage.save_sig(&path, sig).expect(\"Error saving sig\");\n                record.iter_mut().for_each(|rec| {\n                    rec.set_internal_location(path.clone().into());\n                });\n                record\n            })\n            .collect();\n\n        Ok(Self {\n            manifest: records.into(),\n            storage: InnerStorage::new(storage),\n        })\n    }\n\n    pub fn from_paths(paths: &[PathBuf]) -> Result<Self> {\n        // TODO:\n        // - figure out if there is a common path between sigs for FSStorage?\n\n        Ok(Self {\n            manifest: paths.into(),\n            storage: InnerStorage::new(\n                FSStorage::builder()\n                    .fullpath(\"\".into())\n                    .subdir(\"\".into())\n                    .build(),\n            ),\n        })\n    }\n\n    pub fn record_for_dataset(&self, dataset_id: Idx) -> Result<&Record> {\n        Ok(&self.manifest[dataset_id as usize])\n    }\n\n    pub fn sig_for_dataset(&self, dataset_id: Idx) -> Result<SigStore> {\n        let match_path = if self.manifest.is_empty() {\n            \"\"\n        } else {\n            self.manifest[dataset_id as usize]\n                .internal_location()\n                .as_str()\n        };\n\n        let selection = Selection::from_record(&self.manifest[dataset_id as usize])?;\n        let sig = self.storage.load_sig(match_path)?.select(&selection)?;\n        assert_eq!(sig.signatures.len(), 1);\n        Ok(sig)\n    }\n\n    pub fn sig_from_record(&self, record: &Record) -> Result<SigStore> {\n        let match_path = record.internal_location().as_str();\n        let selection = Selection::from_record(record)?;\n        let sig = self.storage.load_sig(match_path)?.select(&selection)?;\n        assert_eq!(sig.signatures.len(), 1);\n        Ok(sig)\n    }\n\n    pub fn intersect_manifest(&mut self, mf: &Manifest) {\n        self.manifest = self.manifest.intersect_manifest(mf);\n    }\n\n    // CTB: question, should we do something about num here?\n    pub fn min_max_scaled(&self) -> Option<(&ScaledType, &ScaledType)> {\n        self.manifest.first().map(|first| {\n            self.manifest\n                .iter()\n                .fold((first.scaled(), first.scaled()), |f, r| {\n                    (f.0.min(r.scaled()), f.1.max(r.scaled()))\n                })\n        })\n    }\n}\n\nimpl Select for Collection {\n    fn select(mut self, selection: &Selection) -> Result<Self> {\n        self.manifest = self.manifest.select(selection)?;\n        Ok(self)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use camino::Utf8PathBuf as PathBuf;\n    use std::fs::File;\n    use std::io::BufReader;\n\n    use super::Collection;\n\n    #[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\n    use crate::Result;\n    use crate::encodings::HashFunctions;\n    use crate::manifest::Manifest;\n    use crate::prelude::Select;\n    use crate::selection::Selection;\n    use crate::signature::Signature;\n\n    #[test]\n    fn sigstore_selection_with_downsample() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(2000);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // count collection length\n        assert_eq!(cl.len(), 6);\n        for (idx, _rec) in cl.iter() {\n            // need to pass select again here so we actually downsample\n            let this_sig = cl.sig_for_dataset(idx).unwrap().select(&selection).unwrap();\n            let this_mh = this_sig.minhash().unwrap();\n            assert_eq!(this_mh.scaled(), 2000);\n        }\n    }\n\n    #[test]\n    fn sigstore_selection_with_downsample_too_low() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(500);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // no sigs should remain\n        assert_eq!(cl.len(), 0);\n    }\n\n    #[test]\n    fn sigstore_selection_scaled_handle_num_sig() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        // four num=500 sigs\n        filename.push(\"../../tests/test-data/genome-s11.fa.gz.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        assert_eq!(sigs.len(), 4);\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(1000);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // no sigs should remain\n        assert_eq!(cl.len(), 0);\n    }\n\n    #[test]\n    fn sigstore_selection_num() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        // four num=500 sigs\n        filename.push(\"../../tests/test-data/genome-s11.fa.gz.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        let sigs_copy = sigs.clone();\n        assert_eq!(sigs.len(), 4);\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_num(500);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // all sigs should remain\n        assert_eq!(cl.len(), 4);\n        //now select diff num and none should remain\n        selection.set_num(100);\n        let cl2 = Collection::from_sigs(sigs_copy)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        assert_eq!(cl2.len(), 0);\n    }\n\n    #[test]\n    fn sigstore_selection_num_handle_scaled_sig() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        // four num=500 sigs\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        assert_eq!(sigs.len(), 6);\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_num(500);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // no sigs should remain\n        assert_eq!(cl.len(), 0);\n    }\n\n    #[test]\n    fn collection_intersect_manifest() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        // four num=500 sigs\n        filename.push(\"../../tests/test-data/genome-s11.fa.gz.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        assert_eq!(sigs.len(), 4);\n        // load sigs into collection + select compatible signatures\n        let mut cl = Collection::from_sigs(sigs).unwrap();\n        // all sigs should remain\n        assert_eq!(cl.len(), 4);\n\n        // grab first record\n        let manifest = cl.manifest();\n        let record = manifest.iter().next().unwrap().clone();\n        let vr = vec![record];\n\n        // now intersect:\n        let manifest2 = Manifest::from(vr);\n        cl.intersect_manifest(&manifest2);\n        assert_eq!(cl.len(), 1);\n    }\n\n    #[test]\n    fn sigstore_sig_from_record() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(2000);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // no sigs should remain\n        assert_eq!(cl.len(), 6);\n        for (_idx, rec) in cl.iter() {\n            dbg!(\"record scaled is: {}\", rec.scaled());\n            let this_sig = cl.sig_from_record(rec).unwrap();\n            let this_mh = this_sig.minhash().unwrap();\n            assert_eq!(this_mh.scaled(), 2000);\n        }\n    }\n\n    #[test]\n    #[should_panic] // for now...\n    fn sigstore_sig_from_record_2() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/short.sig.gz\");\n        let v = [filename];\n        let collection = Collection::from_paths(&v).expect(\"no sigs!?\");\n\n        // pull off first record\n        let v: Vec<_> = collection.iter().collect();\n        let (_idx, rec) = v.first().expect(\"no records in collection?!\");\n\n        // this will panic with \"unimplemented\" because there are two\n        // sketches and that is not supported.\n        let _first_sig = collection.sig_from_record(rec).expect(\"no sig!?\");\n    }\n\n    #[test]\n    fn sigstore_selection_moltype_zip() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/prot/hp.zip\");\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(200);\n        selection.set_moltype(HashFunctions::Murmur64Hp);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_zipfile(&filename)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // count collection length\n        assert_eq!(cl.len(), 2);\n        for (idx, _rec) in cl.iter() {\n            let this_sig = cl.sig_for_dataset(idx).unwrap();\n            let this_mh = this_sig.minhash().unwrap();\n            assert_eq!(this_mh.scaled(), 200);\n        }\n    }\n\n    #[test]\n    fn sigstore_selection_moltype_sig() {\n        // load test sigs\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename\n            .push(\"../../tests/test-data/prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\");\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_moltype(HashFunctions::Murmur64Hp);\n        // load sigs into collection + select compatible signatures\n        let cl = Collection::from_sigs(sigs)\n            .unwrap()\n            .select(&selection)\n            .unwrap();\n        // count collection length\n        assert_eq!(cl.len(), 1);\n        for (idx, _rec) in cl.iter() {\n            // need to pass select again here so we actually downsample\n            let this_sig = cl.sig_for_dataset(idx).unwrap().select(&selection).unwrap();\n            let this_mh = this_sig.minhash().unwrap();\n            assert_eq!(this_mh.scaled(), 100);\n        }\n    }\n\n    #[test]\n    fn collection_from_collectionset() -> () {\n        use crate::collection::CollectionSet;\n\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![PathBuf::from(\"../../tests/test-data/prot/all.zip\")];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let collection = Collection::from_zipfile(&full_paths[0]).unwrap();\n\n        let mut selection = Selection::default();\n        selection.set_moltype(HashFunctions::Murmur64Protein);\n        selection.set_scaled(200);\n\n        let collection = collection.select(&selection).expect(\"should pass\");\n        let (min_scaled, max_scaled) = collection.min_max_scaled().expect(\"not empty\");\n        assert_eq!(*min_scaled, *max_scaled);\n        assert_eq!(*min_scaled, 200);\n        let _cs: CollectionSet = collection.try_into().expect(\"should pass\");\n    }\n\n    #[test]\n    fn collection_selection() -> () {\n        use crate::collection::CollectionSet;\n\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![PathBuf::from(\"../../tests/test-data/prot/all.zip\")];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let collection = Collection::from_zipfile(&full_paths[0]).unwrap();\n\n        let mut selection = Selection::default();\n        selection.set_moltype(HashFunctions::Murmur64Protein);\n        selection.set_scaled(200);\n\n        let collection = collection.select(&selection).expect(\"should pass\");\n        let (min_scaled, max_scaled) = collection.min_max_scaled().expect(\"not empty\");\n        assert_eq!(*min_scaled, *max_scaled);\n        assert_eq!(*min_scaled, 200);\n        let cs: CollectionSet = collection.try_into().expect(\"should pass\");\n\n        let new_selection = cs.selection();\n        assert_eq!(selection.moltype(), new_selection.moltype());\n        assert_eq!(selection.scaled(), new_selection.scaled());\n    }\n\n    #[test]\n    #[should_panic]\n    fn collection_from_collectionset_fail() -> () {\n        use crate::collection::CollectionSet;\n\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![PathBuf::from(\"../../tests/test-data/prot/all.zip\")];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let collection = Collection::from_zipfile(&full_paths[0]).unwrap();\n        let _cs: CollectionSet = collection.try_into().expect(\"should fail\");\n    }\n\n    #[test]\n    #[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\n    fn collection_from_rocksdb_storage() -> Result<()> {\n        use crate::index::revindex::{RevIndex, RevIndexOps};\n        use camino::Utf8PathBuf as PathBuf;\n        use tempfile::TempDir;\n\n        let basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let mut zip_collection = basedir.clone();\n        zip_collection.push(\"../../tests/test-data/track_abund/track_abund.zip\");\n\n        let outdir = TempDir::new()?;\n\n        let zip_copy = PathBuf::from(\n            outdir\n                .path()\n                .join(\"sigs.zip\")\n                .into_os_string()\n                .into_string()\n                .unwrap(),\n        );\n        std::fs::copy(zip_collection, zip_copy.as_path())?;\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let collection = Collection::from_zipfile(zip_copy.as_path())?.select(&selection)?;\n        let output: PathBuf = outdir.path().join(\"index\").try_into().unwrap();\n\n        // Step 1: create an index\n        let index = RevIndex::create(output.as_path(), collection.clone().try_into()?)?;\n\n        // Step 2: internalize the storage for the index\n        {\n            let mut index = index;\n            index\n                .internalize_storage()\n                .expect(\"Error internalizing storage\");\n        }\n\n        // Step 3: Create a new collection from rocksdb\n        let new_collection = Collection::from_rocksdb(output.as_path())?;\n\n        // Step 4: assert all content is the same\n        for (a, b) in collection.iter().zip(new_collection.iter()) {\n            assert_eq!(a, b);\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/core/src/encodings.rs",
    "content": "use serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::hash::{BuildHasher, BuildHasherDefault, Hash};\nuse std::str;\n\nuse nohash_hasher::BuildNoHashHasher;\nuse once_cell::sync::Lazy;\nuse vec_collections::AbstractVecSet;\n\nuse crate::Error;\n\n// To consider there: use a slab allocator for IdxTracker\n// https://twitter.com/tomaka17/status/1391052081272967170\n//   Pro-tip: you might be able to save a lot of hashmap lookups\n//   if you replace a `HashMap<K, V>` with a `HashMap<K, usize>`\n//   and a `Slab<V>`. This might be very useful if K is something\n//   heavy such as a `String`.\npub type Color = u64;\npub type Idx = u32;\ntype IdxTracker = (vec_collections::VecSet<[Idx; 8]>, u64);\ntype ColorToIdx = HashMap<Color, IdxTracker, BuildNoHashHasher<Color>>;\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\n#[non_exhaustive]\npub enum HashFunctions {\n    Murmur64Dna,\n    Murmur64Protein,\n    Murmur64Dayhoff,\n    Murmur64Hp,\n    Murmur64Skipm1n3,\n    Murmur64Skipm2n3,\n    Custom(String),\n}\n\nimpl HashFunctions {\n    pub fn dna(&self) -> bool {\n        *self == HashFunctions::Murmur64Dna\n    }\n\n    pub fn protein(&self) -> bool {\n        *self == HashFunctions::Murmur64Protein\n    }\n\n    pub fn dayhoff(&self) -> bool {\n        *self == HashFunctions::Murmur64Dayhoff\n    }\n\n    pub fn hp(&self) -> bool {\n        *self == HashFunctions::Murmur64Hp\n    }\n\n    pub fn skipm1n3(&self) -> bool {\n        *self == HashFunctions::Murmur64Skipm1n3\n    }\n\n    pub fn skipm2n3(&self) -> bool {\n        *self == HashFunctions::Murmur64Skipm2n3\n    }\n}\n\nimpl std::fmt::Display for HashFunctions {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            match self {\n                HashFunctions::Murmur64Dna => \"DNA\",\n                HashFunctions::Murmur64Protein => \"protein\",\n                HashFunctions::Murmur64Dayhoff => \"dayhoff\",\n                HashFunctions::Murmur64Hp => \"hp\",\n                HashFunctions::Murmur64Skipm1n3 => \"skipm1n3\",\n                HashFunctions::Murmur64Skipm2n3 => \"skipm2n3\",\n                HashFunctions::Custom(v) => v,\n            }\n        )\n    }\n}\n\nimpl TryFrom<&str> for HashFunctions {\n    type Error = Error;\n\n    fn try_from(moltype: &str) -> Result<Self, Self::Error> {\n        match moltype.to_lowercase().as_ref() {\n            \"dna\" => Ok(HashFunctions::Murmur64Dna),\n            \"dayhoff\" => Ok(HashFunctions::Murmur64Dayhoff),\n            \"hp\" => Ok(HashFunctions::Murmur64Hp),\n            \"protein\" => Ok(HashFunctions::Murmur64Protein),\n            \"skipm1n3\" => Ok(HashFunctions::Murmur64Skipm1n3),\n            \"skipm2n3\" => Ok(HashFunctions::Murmur64Skipm2n3),\n            v => Err(Error::InvalidHashFunction {\n                function: v.to_string(),\n            }),\n        }\n    }\n}\n\nconst COMPLEMENT: [u8; 256] = {\n    let mut lookup = [0; 256];\n    lookup[b'A' as usize] = b'T';\n    lookup[b'C' as usize] = b'G';\n    lookup[b'G' as usize] = b'C';\n    lookup[b'T' as usize] = b'A';\n    lookup[b'N' as usize] = b'N';\n    lookup\n};\n\n#[inline]\npub fn revcomp(seq: &[u8]) -> Vec<u8> {\n    seq.iter()\n        .rev()\n        .map(|nt| COMPLEMENT[*nt as usize])\n        .collect()\n}\n\nstatic CODONTABLE: Lazy<HashMap<&'static str, u8>> = Lazy::new(|| {\n    [\n        // F\n        (\"TTT\", b'F'),\n        (\"TTC\", b'F'),\n        // L\n        (\"TTA\", b'L'),\n        (\"TTG\", b'L'),\n        // S\n        (\"TCT\", b'S'),\n        (\"TCC\", b'S'),\n        (\"TCA\", b'S'),\n        (\"TCG\", b'S'),\n        (\"TCN\", b'S'),\n        // Y\n        (\"TAT\", b'Y'),\n        (\"TAC\", b'Y'),\n        // *\n        (\"TAA\", b'*'),\n        (\"TAG\", b'*'),\n        // *\n        (\"TGA\", b'*'),\n        // C\n        (\"TGT\", b'C'),\n        (\"TGC\", b'C'),\n        // W\n        (\"TGG\", b'W'),\n        // L\n        (\"CTT\", b'L'),\n        (\"CTC\", b'L'),\n        (\"CTA\", b'L'),\n        (\"CTG\", b'L'),\n        (\"CTN\", b'L'),\n        // P\n        (\"CCT\", b'P'),\n        (\"CCC\", b'P'),\n        (\"CCA\", b'P'),\n        (\"CCG\", b'P'),\n        (\"CCN\", b'P'),\n        // H\n        (\"CAT\", b'H'),\n        (\"CAC\", b'H'),\n        // Q\n        (\"CAA\", b'Q'),\n        (\"CAG\", b'Q'),\n        // R\n        (\"CGT\", b'R'),\n        (\"CGC\", b'R'),\n        (\"CGA\", b'R'),\n        (\"CGG\", b'R'),\n        (\"CGN\", b'R'),\n        // I\n        (\"ATT\", b'I'),\n        (\"ATC\", b'I'),\n        (\"ATA\", b'I'),\n        // M\n        (\"ATG\", b'M'),\n        // T\n        (\"ACT\", b'T'),\n        (\"ACC\", b'T'),\n        (\"ACA\", b'T'),\n        (\"ACG\", b'T'),\n        (\"ACN\", b'T'),\n        // N\n        (\"AAT\", b'N'),\n        (\"AAC\", b'N'),\n        // K\n        (\"AAA\", b'K'),\n        (\"AAG\", b'K'),\n        // S\n        (\"AGT\", b'S'),\n        (\"AGC\", b'S'),\n        // R\n        (\"AGA\", b'R'),\n        (\"AGG\", b'R'),\n        // V\n        (\"GTT\", b'V'),\n        (\"GTC\", b'V'),\n        (\"GTA\", b'V'),\n        (\"GTG\", b'V'),\n        (\"GTN\", b'V'),\n        // A\n        (\"GCT\", b'A'),\n        (\"GCC\", b'A'),\n        (\"GCA\", b'A'),\n        (\"GCG\", b'A'),\n        (\"GCN\", b'A'),\n        // D\n        (\"GAT\", b'D'),\n        (\"GAC\", b'D'),\n        // E\n        (\"GAA\", b'E'),\n        (\"GAG\", b'E'),\n        // G\n        (\"GGT\", b'G'),\n        (\"GGC\", b'G'),\n        (\"GGA\", b'G'),\n        (\"GGG\", b'G'),\n        (\"GGN\", b'G'),\n    ]\n    .iter()\n    .cloned()\n    .collect()\n});\n\n// Dayhoff table from\n// Peris, P., López, D., & Campos, M. (2008).\n// IgTM: An algorithm to predict transmembrane domains and topology in\n// proteins. BMC Bioinformatics, 9(1), 1029–11.\n// http://doi.org/10.1186/1471-2105-9-367\n//\n// Original source:\n// Dayhoff M. O., Schwartz R. M., Orcutt B. C. (1978).\n// A model of evolutionary change in proteins,\n// in Atlas of Protein Sequence and Structure,\n// ed Dayhoff M. O., editor.\n// (Washington, DC: National Biomedical Research Foundation; ), 345–352.\n//\n// | Amino acid    | Property              | Dayhoff |\n// |---------------|-----------------------|---------|\n// | C             | Sulfur polymerization | a       |\n// | A, G, P, S, T | Small                 | b       |\n// | D, E, N, Q    | Acid and amide        | c       |\n// | H, K, R       | Basic                 | d       |\n// | I, L, M, V    | Hydrophobic           | e       |\n// | F, W, Y       | Aromatic              | f       |\nstatic DAYHOFFTABLE: Lazy<HashMap<u8, u8>> = Lazy::new(|| {\n    [\n        // a\n        (b'C', b'a'),\n        // b\n        (b'A', b'b'),\n        (b'G', b'b'),\n        (b'P', b'b'),\n        (b'S', b'b'),\n        (b'T', b'b'),\n        // c\n        (b'D', b'c'),\n        (b'E', b'c'),\n        (b'N', b'c'),\n        (b'Q', b'c'),\n        // d\n        (b'H', b'd'),\n        (b'K', b'd'),\n        (b'R', b'd'),\n        // e\n        (b'I', b'e'),\n        (b'L', b'e'),\n        (b'M', b'e'),\n        (b'V', b'e'),\n        // e\n        (b'F', b'f'),\n        (b'W', b'f'),\n        (b'Y', b'f'),\n        // stop aa\n        (b'*', b'*'),\n    ]\n    .iter()\n    .cloned()\n    .collect()\n});\n\n// HP Hydrophobic/hydrophilic mapping\n// From: Phillips, R., Kondev, J., Theriot, J. (2008).\n// Physical Biology of the Cell. New York: Garland Science, Taylor & Francis Group. ISBN: 978-0815341635\n\n//\n// | Amino acid                            | HP\n// |---------------------------------------|---------|\n// | A, F, G, I, L, M, P, V, W, Y          | h       |\n// | N, C, S, T, D, E, R, H, K, Q          | p       |\nstatic HPTABLE: Lazy<HashMap<u8, u8>> = Lazy::new(|| {\n    [\n        // h\n        (b'A', b'h'),\n        (b'F', b'h'),\n        (b'G', b'h'),\n        (b'I', b'h'),\n        (b'L', b'h'),\n        (b'M', b'h'),\n        (b'P', b'h'),\n        (b'V', b'h'),\n        (b'W', b'h'),\n        (b'Y', b'h'),\n        // p\n        (b'N', b'p'),\n        (b'C', b'p'),\n        (b'S', b'p'),\n        (b'T', b'p'),\n        (b'D', b'p'),\n        (b'E', b'p'),\n        (b'R', b'p'),\n        (b'H', b'p'),\n        (b'K', b'p'),\n        (b'Q', b'p'),\n        // stop aa\n        (b'*', b'*'),\n    ]\n    .iter()\n    .cloned()\n    .collect()\n});\n\n#[inline]\npub fn translate_codon(codon: &[u8]) -> Result<u8, Error> {\n    if codon.len() == 1 {\n        return Ok(b'X');\n    }\n\n    if codon.len() == 2 {\n        let mut v = codon.to_vec();\n        v.push(b'N');\n        match CODONTABLE.get(str::from_utf8(v.as_slice()).unwrap()) {\n            Some(aa) => return Ok(*aa),\n            None => return Ok(b'X'),\n        }\n    }\n\n    if codon.len() == 3 {\n        match CODONTABLE.get(str::from_utf8(codon).unwrap()) {\n            Some(aa) => return Ok(*aa),\n            None => return Ok(b'X'),\n        }\n    }\n\n    Err(Error::InvalidCodonLength {\n        message: format!(\"{}\", codon.len()),\n    })\n}\n\n#[inline]\npub fn aa_to_dayhoff(aa: u8) -> u8 {\n    match DAYHOFFTABLE.get(&aa) {\n        Some(letter) => *letter,\n        None => b'X',\n    }\n}\n\npub fn aa_to_hp(aa: u8) -> u8 {\n    match HPTABLE.get(&aa) {\n        Some(letter) => *letter,\n        None => b'X',\n    }\n}\n\n#[inline]\npub fn to_aa(seq: &[u8], dayhoff: bool, hp: bool) -> Result<Vec<u8>, Error> {\n    let mut converted: Vec<u8> = Vec::with_capacity(seq.len() / 3);\n\n    for chunk in seq.chunks(3) {\n        if chunk.len() < 3 {\n            break;\n        }\n\n        let residue = translate_codon(chunk)?;\n        if dayhoff {\n            converted.push(aa_to_dayhoff(residue));\n        } else if hp {\n            converted.push(aa_to_hp(residue));\n        } else {\n            converted.push(residue);\n        }\n    }\n\n    Ok(converted)\n}\n\npub const VALID: [bool; 256] = {\n    let mut lookup = [false; 256];\n    lookup[b'A' as usize] = true;\n    lookup[b'C' as usize] = true;\n    lookup[b'G' as usize] = true;\n    lookup[b'T' as usize] = true;\n    lookup\n};\n\n#[derive(Serialize, Deserialize, Default)]\npub struct Colors {\n    colors: ColorToIdx,\n}\n\nimpl Colors {\n    pub fn new() -> Colors {\n        Default::default()\n    }\n\n    /// Given a color and a new idx, return an updated color\n    ///\n    /// This might create a new one, or find an already existing color\n    /// that contains the new_idx\n    ///\n    /// Future optimization: store a count for each color, so we can track\n    /// if there are extra colors that can be removed at the end.\n    /// (the count is decreased whenever a new color has to be created)\n    pub fn update<'a, I: IntoIterator<Item = &'a Idx>>(\n        &mut self,\n        current_color: Option<Color>,\n        new_idxs: I,\n    ) -> Result<Color, Error> {\n        if let Some(color) = current_color {\n            if let Some(idxs) = self.colors.get_mut(&color) {\n                let idx_to_add: Vec<_> = new_idxs\n                    .into_iter()\n                    .filter(|new_idx| !idxs.0.contains(new_idx))\n                    .collect();\n\n                if idx_to_add.is_empty() {\n                    // Easy case, it already has all the new_idxs, so just return this color\n                    idxs.1 += 1;\n                    Ok(color)\n                } else {\n                    // We need to either create a new color,\n                    // or find an existing color that have the same idxs\n\n                    let mut idxs = idxs.clone();\n                    idxs.0.extend(idx_to_add.into_iter().cloned());\n                    let new_color = Colors::compute_color(&idxs);\n\n                    if new_color != color {\n                        self.colors.get_mut(&color).unwrap().1 -= 1;\n                        if self.colors[&color].1 == 0 {\n                            self.colors.remove(&color);\n                        };\n                    };\n\n                    self.colors\n                        .entry(new_color)\n                        .and_modify(|old_idxs| {\n                            assert_eq!(old_idxs.0, idxs.0);\n                            old_idxs.1 += 1;\n                        })\n                        .or_insert_with(|| (idxs.0, 1));\n                    Ok(new_color)\n                }\n            } else {\n                unimplemented!(\n                    \"throw error, current_color must exist in order to be updated. current_color: {:?}, colors: {:#?}\",\n                    current_color,\n                    &self.colors\n                );\n            }\n        } else {\n            let mut idxs = IdxTracker::default();\n            idxs.0.extend(new_idxs.into_iter().cloned());\n            idxs.1 = 1;\n            let new_color = Colors::compute_color(&idxs);\n            self.colors\n                .entry(new_color)\n                .and_modify(|old_idxs| {\n                    assert_eq!(old_idxs.0, idxs.0);\n                    old_idxs.1 += 1;\n                })\n                .or_insert_with(|| (idxs.0, 1));\n            Ok(new_color)\n        }\n    }\n\n    fn compute_color(idxs: &IdxTracker) -> Color {\n        let s = BuildHasherDefault::<Xxh3Hash128>::default();\n        s.hash_one(&idxs.0)\n    }\n\n    pub fn len(&self) -> usize {\n        self.colors.len()\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.colors.is_empty()\n    }\n\n    pub fn contains(&self, color: Color, idx: Idx) -> bool {\n        if let Some(idxs) = self.colors.get(&color) {\n            idxs.0.contains(&idx)\n        } else {\n            false\n        }\n    }\n\n    pub fn indices(&self, color: &Color) -> Indices<'_> {\n        // TODO: what if color is not present?\n        Indices {\n            iter: self.colors.get(color).unwrap().0.iter(),\n        }\n    }\n\n    pub fn retain<F>(&mut self, f: F)\n    where\n        F: FnMut(&Color, &mut IdxTracker) -> bool,\n    {\n        self.colors.retain(f)\n    }\n}\n\npub struct Indices<'a> {\n    iter: vec_collections::VecSetIter<core::slice::Iter<'a, Idx>>,\n}\n\nimpl<'a> Iterator for Indices<'a> {\n    type Item = &'a Idx;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n}\n\n//compatibility struct to support twox_hash version 2\n#[derive(Default)]\npub(crate) struct Xxh3Hash128(twox_hash::XxHash3_128);\n\nimpl std::hash::Hasher for Xxh3Hash128 {\n    #[inline(always)]\n    fn finish(&self) -> u64 {\n        // this truncates the 128-bit value to 64-bits,\n        // which reflects what xxhash 1.x did.\n        self.0.finish_128() as u64\n    }\n\n    #[inline(always)]\n    fn write(&mut self, bytes: &[u8]) {\n        self.0.write(bytes)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use std::convert::TryFrom;\n\n    #[test]\n    fn colors_update() {\n        let mut colors = Colors::new();\n\n        let color = colors.update(None, &[1_u32]).unwrap();\n        assert_eq!(colors.len(), 1);\n\n        dbg!(\"update\");\n        let new_color = colors.update(Some(color), &[1_u32]).unwrap();\n        assert_eq!(colors.len(), 1);\n        assert_eq!(color, new_color);\n\n        dbg!(\"upgrade\");\n        let new_color = colors.update(Some(color), &[2_u32]).unwrap();\n        assert_eq!(colors.len(), 2);\n        assert_ne!(color, new_color);\n    }\n\n    #[test]\n    fn colors_retain() {\n        let mut colors = Colors::new();\n\n        let color1 = colors.update(None, &[1_u32]).unwrap();\n        assert_eq!(colors.len(), 1);\n        // used_colors:\n        //   color1: 1\n\n        dbg!(\"update\");\n        let same_color = colors.update(Some(color1), &[1_u32]).unwrap();\n        assert_eq!(colors.len(), 1);\n        assert_eq!(color1, same_color);\n        // used_colors:\n        //   color1: 2\n\n        dbg!(\"upgrade\");\n        let color2 = colors.update(Some(color1), &[2_u32]).unwrap();\n        assert_eq!(colors.len(), 2);\n        assert_ne!(color1, color2);\n        // used_colors:\n        //   color1: 1\n        //   color2: 1\n\n        dbg!(\"update\");\n        let same_color = colors.update(Some(color2), &[2_u32]).unwrap();\n        assert_eq!(colors.len(), 2);\n        assert_eq!(color2, same_color);\n        // used_colors:\n        //   color1: 1\n        //   color1: 2\n\n        dbg!(\"upgrade\");\n        let color3 = colors.update(Some(color1), &[3_u32]).unwrap();\n        assert_ne!(color1, color3);\n        assert_ne!(color2, color3);\n        // used_colors:\n        //   color1: 0\n        //   color2: 2\n        //   color3: 1\n\n        // This is the pre color-count tracker, where it is needed\n        // to call retain to maintain colors\n        //assert_eq!(colors.len(), 3);\n        //colors.retain(|c, _| [color2, color3].contains(c));\n\n        assert_eq!(colors.len(), 2);\n    }\n\n    #[test]\n    fn test_dna_method() {\n        assert!(HashFunctions::Murmur64Dna.dna());\n        assert!(!HashFunctions::Murmur64Protein.dna());\n        assert!(!HashFunctions::Murmur64Dayhoff.dna());\n    }\n\n    #[test]\n    fn test_protein_method() {\n        assert!(HashFunctions::Murmur64Protein.protein());\n        assert!(!HashFunctions::Murmur64Dna.protein());\n        assert!(!HashFunctions::Murmur64Dayhoff.protein());\n    }\n\n    #[test]\n    fn test_dayhoff_method() {\n        assert!(HashFunctions::Murmur64Dayhoff.dayhoff());\n        assert!(!HashFunctions::Murmur64Dna.dayhoff());\n        assert!(!HashFunctions::Murmur64Protein.dayhoff());\n    }\n\n    #[test]\n    fn test_hp_method() {\n        assert!(HashFunctions::Murmur64Hp.hp());\n        assert!(!HashFunctions::Murmur64Dna.hp());\n        assert!(!HashFunctions::Murmur64Protein.hp());\n    }\n\n    #[test]\n    fn test_skipm1n3_method() {\n        assert!(HashFunctions::Murmur64Skipm1n3.skipm1n3());\n        assert!(!HashFunctions::Murmur64Dna.skipm1n3());\n        assert!(!HashFunctions::Murmur64Protein.skipm1n3());\n    }\n\n    #[test]\n    fn test_skipm2n3_method() {\n        assert!(HashFunctions::Murmur64Skipm2n3.skipm2n3());\n        assert!(!HashFunctions::Murmur64Dna.skipm2n3());\n        assert!(!HashFunctions::Murmur64Protein.skipm2n3());\n    }\n\n    #[test]\n    fn test_display_hashfunctions() {\n        assert_eq!(HashFunctions::Murmur64Dna.to_string(), \"DNA\");\n        assert_eq!(HashFunctions::Murmur64Protein.to_string(), \"protein\");\n        assert_eq!(HashFunctions::Murmur64Dayhoff.to_string(), \"dayhoff\");\n        assert_eq!(HashFunctions::Murmur64Hp.to_string(), \"hp\");\n        assert_eq!(HashFunctions::Murmur64Skipm1n3.to_string(), \"skipm1n3\");\n        assert_eq!(HashFunctions::Murmur64Skipm2n3.to_string(), \"skipm2n3\");\n        assert_eq!(\n            HashFunctions::Custom(\"custom_string\".into()).to_string(),\n            \"custom_string\"\n        );\n    }\n\n    #[test]\n    fn test_try_from_str_valid() {\n        assert_eq!(\n            HashFunctions::try_from(\"dna\").unwrap(),\n            HashFunctions::Murmur64Dna\n        );\n        assert_eq!(\n            HashFunctions::try_from(\"protein\").unwrap(),\n            HashFunctions::Murmur64Protein\n        );\n        assert_eq!(\n            HashFunctions::try_from(\"dayhoff\").unwrap(),\n            HashFunctions::Murmur64Dayhoff\n        );\n        assert_eq!(\n            HashFunctions::try_from(\"hp\").unwrap(),\n            HashFunctions::Murmur64Hp\n        );\n        assert_eq!(\n            HashFunctions::try_from(\"skipm1n3\").unwrap(),\n            HashFunctions::Murmur64Skipm1n3\n        );\n        assert_eq!(\n            HashFunctions::try_from(\"skipm2n3\").unwrap(),\n            HashFunctions::Murmur64Skipm2n3\n        );\n    }\n\n    #[test]\n    fn test_try_from_str_invalid() {\n        let result = HashFunctions::try_from(\"unknown\");\n\n        // Ensure it returns an error instead of panicking\n        assert!(result.is_err());\n\n        // Extract and check the error message\n        let error_message = format!(\"{}\", result.unwrap_err());\n        assert!(error_message.contains(\"Invalid hash function\"));\n    }\n}\n"
  },
  {
    "path": "src/core/src/errors.rs",
    "content": "use thiserror::Error;\n\n#[derive(Debug, Error)]\n#[non_exhaustive]\npub enum SourmashError {\n    /// Raised for internal errors in the libraries.  Should not happen.\n    #[error(\"internal error: {message:?}\")]\n    Internal { message: String },\n\n    #[error(\"new scaled smaller than previous; cannot upsample\")]\n    CannotUpsampleScaled,\n\n    #[error(\"must have same num: {n1} != {n2}\")]\n    MismatchNum { n1: u32, n2: u32 },\n\n    #[error(\"different ksizes cannot be compared\")]\n    MismatchKSizes,\n\n    #[error(\"DNA/prot minhashes cannot be compared\")]\n    MismatchDNAProt,\n\n    #[error(\"mismatch in scaled; comparison fail\")]\n    MismatchScaled,\n\n    #[error(\"mismatch in seed; comparison fail\")]\n    MismatchSeed,\n\n    #[error(\"different signatures cannot be compared\")]\n    MismatchSignatureType,\n\n    #[error(\"sketch needs abundance for this operation\")]\n    NeedsAbundanceTracking,\n\n    #[error(\"Expected a MinHash sketch in this signature\")]\n    NoMinHashFound,\n\n    #[error(\"Empty signature\")]\n    EmptySignature,\n\n    #[error(\"Multiple sketches found, expected one\")]\n    MultipleSketchesFound,\n\n    #[error(\"Invalid hash function: {function:?}\")]\n    InvalidHashFunction { function: String },\n\n    #[error(\"Can only set {message:?} if the MinHash is empty\")]\n    NonEmptyMinHash { message: String },\n\n    #[error(\"invalid DNA character in input k-mer: {message}\")]\n    InvalidDNA { message: String },\n\n    #[error(\"invalid protein character in input: {message}\")]\n    InvalidProt { message: String },\n\n    #[error(\"Codon is invalid length: {message}\")]\n    InvalidCodonLength { message: String },\n\n    #[error(\"Skipmer ksize must be >= n ({n}), but got ksize: {ksize}\")]\n    InvalidSkipmerSize { ksize: usize, n: usize },\n\n    #[error(\"Skipmer frame number must be < n ({n}), but got start: {start}\")]\n    InvalidSkipmerFrame { start: usize, n: usize },\n\n    #[error(\"Frame number must be 0, 1, or 2, but got {frame_number}\")]\n    InvalidTranslateFrame { frame_number: usize },\n\n    #[error(\"Set error rate to a value smaller than 0.367696 and larger than 0.00203125\")]\n    HLLPrecisionBounds,\n\n    #[error(\"error while calculating ANI confidence intervals: {message}\")]\n    ANIEstimationError { message: String },\n\n    #[error(\"Empty record, failed to select any valid sketches: {record}\")]\n    EmptyRecord {\n        record: Box<crate::manifest::Record>,\n    },\n\n    #[error(transparent)]\n    ReadDataError(#[from] ReadDataError),\n\n    #[error(transparent)]\n    StorageError(#[from] crate::storage::StorageError),\n\n    #[error(transparent)]\n    SerdeError(#[from] serde_json::error::Error),\n\n    #[error(transparent)]\n    NifflerError(#[from] niffler::Error),\n\n    #[error(transparent)]\n    Utf8Error(#[from] std::str::Utf8Error),\n\n    #[error(transparent)]\n    IOError(#[from] std::io::Error),\n\n    #[error(transparent)]\n    CsvError(#[from] csv::Error),\n\n    #[cfg(not(all(target_arch = \"wasm32\", target_os = \"unknown\")))]\n    #[error(transparent)]\n    Panic(#[from] crate::ffi::utils::Panic),\n\n    #[cfg(not(target_arch = \"wasm32\"))]\n    #[cfg(feature = \"branchwater\")]\n    #[error(transparent)]\n    RocksDBError(#[from] rocksdb::Error),\n\n    #[error(transparent)]\n    ZipError(#[from] piz::result::ZipError),\n}\n\n#[derive(Debug, Error)]\npub enum ReadDataError {\n    #[error(\"Could not load data\")]\n    LoadError,\n}\n\n#[repr(u32)]\n#[non_exhaustive]\npub enum SourmashErrorCode {\n    // no error\n    NoError = 0,\n    // panics and internals\n    Panic = 1,\n    Internal = 2,\n    Msg = 3,\n    Unknown = 4,\n    // Compatibility errors\n    MismatchKSizes = 1_01,\n    MismatchDNAProt = 1_02,\n    MismatchScaled = 1_03,\n    MismatchSeed = 1_04,\n    MismatchSignatureType = 1_05,\n    NonEmptyMinHash = 1_06,\n    MismatchNum = 1_07,\n    NeedsAbundanceTracking = 1_08,\n    CannotUpsampleScaled = 1_09,\n    NoMinHashFound = 1_10,\n    EmptySignature = 1_11,\n    MultipleSketchesFound = 1_12,\n    EmptyRecord = 1_13,\n    // Input sequence errors\n    InvalidDNA = 11_01,\n    InvalidProt = 11_02,\n    InvalidCodonLength = 11_03,\n    InvalidHashFunction = 11_04,\n    InvalidSkipmerFrame = 11_05,\n    InvalidSkipmerSize = 11_06,\n    InvalidTranslateFrame = 11_07,\n    // index-related errors\n    ReadData = 12_01,\n    Storage = 12_02,\n    // HLL errors\n    HLLPrecisionBounds = 13_01,\n    // ANI errors\n    ANIEstimationError = 14_01,\n    // external errors\n    Io = 100_001,\n    Utf8Error = 100_002,\n    ParseInt = 100_003,\n    SerdeError = 100_004,\n    NifflerError = 100_005,\n    CsvError = 100_006,\n    RocksDBError = 100_007,\n    ZipError = 100_008,\n}\n\n#[cfg(not(all(target_arch = \"wasm32\", target_os = \"unknown\")))]\nimpl SourmashErrorCode {\n    pub fn from_error(error: &SourmashError) -> SourmashErrorCode {\n        match error {\n            SourmashError::Internal { .. } => SourmashErrorCode::Internal,\n            SourmashError::Panic { .. } => SourmashErrorCode::Panic,\n            SourmashError::CannotUpsampleScaled => SourmashErrorCode::CannotUpsampleScaled,\n            SourmashError::MismatchNum { .. } => SourmashErrorCode::MismatchNum,\n            SourmashError::NeedsAbundanceTracking => SourmashErrorCode::NeedsAbundanceTracking,\n            SourmashError::MismatchKSizes => SourmashErrorCode::MismatchKSizes,\n            SourmashError::MismatchDNAProt => SourmashErrorCode::MismatchDNAProt,\n            SourmashError::MismatchScaled => SourmashErrorCode::MismatchScaled,\n            SourmashError::MismatchSeed => SourmashErrorCode::MismatchSeed,\n            SourmashError::MismatchSignatureType => SourmashErrorCode::MismatchSignatureType,\n            SourmashError::NonEmptyMinHash { .. } => SourmashErrorCode::NonEmptyMinHash,\n            SourmashError::NoMinHashFound => SourmashErrorCode::NoMinHashFound,\n            SourmashError::EmptySignature => SourmashErrorCode::EmptySignature,\n            SourmashError::MultipleSketchesFound => SourmashErrorCode::MultipleSketchesFound,\n            SourmashError::InvalidDNA { .. } => SourmashErrorCode::InvalidDNA,\n            SourmashError::InvalidProt { .. } => SourmashErrorCode::InvalidProt,\n            SourmashError::InvalidCodonLength { .. } => SourmashErrorCode::InvalidCodonLength,\n            SourmashError::InvalidHashFunction { .. } => SourmashErrorCode::InvalidHashFunction,\n            SourmashError::InvalidSkipmerFrame { .. } => SourmashErrorCode::InvalidSkipmerFrame,\n            SourmashError::InvalidSkipmerSize { .. } => SourmashErrorCode::InvalidSkipmerSize,\n            SourmashError::InvalidTranslateFrame { .. } => SourmashErrorCode::InvalidTranslateFrame,\n            SourmashError::EmptyRecord { .. } => SourmashErrorCode::EmptyRecord,\n            SourmashError::ReadDataError { .. } => SourmashErrorCode::ReadData,\n            SourmashError::StorageError { .. } => SourmashErrorCode::Storage,\n            SourmashError::HLLPrecisionBounds => SourmashErrorCode::HLLPrecisionBounds,\n            SourmashError::ANIEstimationError { .. } => SourmashErrorCode::ANIEstimationError,\n            SourmashError::SerdeError { .. } => SourmashErrorCode::SerdeError,\n            SourmashError::IOError { .. } => SourmashErrorCode::Io,\n            SourmashError::NifflerError { .. } => SourmashErrorCode::NifflerError,\n            SourmashError::Utf8Error { .. } => SourmashErrorCode::Utf8Error,\n            SourmashError::CsvError { .. } => SourmashErrorCode::CsvError,\n\n            #[cfg(not(target_arch = \"wasm32\"))]\n            #[cfg(feature = \"branchwater\")]\n            SourmashError::RocksDBError { .. } => SourmashErrorCode::RocksDBError,\n\n            SourmashError::ZipError { .. } => SourmashErrorCode::ZipError,\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/src/ffi/cmd/compute.rs",
    "content": "use std::slice;\n\nuse crate::ScaledType;\nuse crate::cmd::ComputeParameters;\n\nuse crate::ffi::utils::ForeignObject;\n\npub struct SourmashComputeParameters;\n\nimpl ForeignObject for SourmashComputeParameters {\n    type RustObject = ComputeParameters;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_new() -> *mut SourmashComputeParameters {\n    unsafe { SourmashComputeParameters::from_rust(ComputeParameters::default()) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_free(ptr: *mut SourmashComputeParameters) {\n    unsafe { SourmashComputeParameters::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_seed(ptr: *const SourmashComputeParameters) -> u64 {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.seed()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_seed(\n    ptr: *mut SourmashComputeParameters,\n    new_seed: u64,\n) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_seed(new_seed);\n}\n\nffi_fn! {\nunsafe fn computeparams_ksizes(ptr: *const SourmashComputeParameters, size: *mut usize) -> Result<*const u32> {\n    let cp = SourmashComputeParameters::as_rust(ptr);\n    let output = cp.ksizes().clone();\n    *size = output.len();\n\n    // FIXME use a SourmashSlice_u32?\n    Ok(Box::into_raw(output.into_boxed_slice()) as *const u32)\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_ksizes_free(ptr: *mut u32, insize: usize) {\n    // FIXME use a SourmashSlice_u32?\n    if ptr.is_null() {\n        return;\n    }\n    unsafe { Vec::from_raw_parts(ptr, insize, insize) };\n}\n\nffi_fn! {\nunsafe fn computeparams_set_ksizes(\n    ptr: *mut SourmashComputeParameters,\n    ksizes_ptr: *const u32,\n    insize: usize,\n  ) -> Result<()> {\n    let cp = SourmashComputeParameters::as_rust_mut(ptr);\n\n    let ksizes = {\n        assert!(!ksizes_ptr.is_null());\n        slice::from_raw_parts(ksizes_ptr, insize)\n    };\n\n    cp.set_ksizes(ksizes.into());\n\n    Ok(())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_protein(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.protein()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_protein(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_protein(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_dayhoff(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.dayhoff()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_dayhoff(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_dayhoff(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_hp(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.hp()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_hp(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_hp(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_dna(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.dna()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_dna(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_dna(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_skipm1n3(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.skipm1n3()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_skipm1n3(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_skipm1n3(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_skipm2n3(ptr: *const SourmashComputeParameters) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.skipm2n3()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_skipm2n3(ptr: *mut SourmashComputeParameters, v: bool) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_skipm2n3(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_track_abundance(\n    ptr: *const SourmashComputeParameters,\n) -> bool {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.track_abundance()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_track_abundance(\n    ptr: *mut SourmashComputeParameters,\n    v: bool,\n) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_track_abundance(v);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_num_hashes(ptr: *const SourmashComputeParameters) -> u32 {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.num_hashes()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_num_hashes(\n    ptr: *mut SourmashComputeParameters,\n    num: u32,\n) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_num_hashes(num);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_scaled(ptr: *const SourmashComputeParameters) -> ScaledType {\n    let cp = unsafe { SourmashComputeParameters::as_rust(ptr) };\n    cp.scaled()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn computeparams_set_scaled(\n    ptr: *mut SourmashComputeParameters,\n    scaled: u32,\n) {\n    let cp = unsafe { SourmashComputeParameters::as_rust_mut(ptr) };\n    cp.set_scaled(scaled);\n}\n"
  },
  {
    "path": "src/core/src/ffi/cmd/mod.rs",
    "content": "pub mod compute;\n"
  },
  {
    "path": "src/core/src/ffi/hyperloglog.rs",
    "content": "use std::ffi::CStr;\nuse std::os::raw::c_char;\nuse std::slice;\n\nuse crate::prelude::*;\nuse crate::signature::SigsTrait;\nuse crate::sketch::hyperloglog::HyperLogLog;\n\nuse crate::ffi::minhash::SourmashKmerMinHash;\nuse crate::ffi::utils::ForeignObject;\n\npub struct SourmashHyperLogLog;\n\nimpl ForeignObject for SourmashHyperLogLog {\n    type RustObject = HyperLogLog;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_new() -> *mut SourmashHyperLogLog {\n    unsafe { SourmashHyperLogLog::from_rust(HyperLogLog::default()) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_free(ptr: *mut SourmashHyperLogLog) {\n    unsafe { SourmashHyperLogLog::drop(ptr) };\n}\n\nffi_fn! {\nunsafe fn hll_with_error_rate(\n    error_rate: f64,\n    ksize: usize,\n) -> Result<*mut SourmashHyperLogLog> {\n    let hll = HyperLogLog::with_error_rate(error_rate, ksize)?;\n    Ok(SourmashHyperLogLog::from_rust(hll))\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_ksize(ptr: *const SourmashHyperLogLog) -> usize {\n    unsafe { SourmashHyperLogLog::as_rust(ptr) }.ksize()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_cardinality(ptr: *const SourmashHyperLogLog) -> usize {\n    unsafe { SourmashHyperLogLog::as_rust(ptr) }.cardinality()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_similarity(\n    ptr: *const SourmashHyperLogLog,\n    optr: *const SourmashHyperLogLog,\n) -> f64 {\n    unsafe { SourmashHyperLogLog::as_rust(ptr).similarity(SourmashHyperLogLog::as_rust(optr)) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_containment(\n    ptr: *const SourmashHyperLogLog,\n    optr: *const SourmashHyperLogLog,\n) -> f64 {\n    unsafe { SourmashHyperLogLog::as_rust(ptr).containment(SourmashHyperLogLog::as_rust(optr)) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_intersection_size(\n    ptr: *const SourmashHyperLogLog,\n    optr: *const SourmashHyperLogLog,\n) -> usize {\n    unsafe { SourmashHyperLogLog::as_rust(ptr).intersection(SourmashHyperLogLog::as_rust(optr)) }\n}\n\nffi_fn! {\nunsafe fn hll_add_sequence(\n  ptr: *mut SourmashHyperLogLog,\n  sequence: *const c_char,\n  insize: usize,\n  force: bool\n) -> Result<()> {\n\n    let hll = SourmashHyperLogLog::as_rust_mut(ptr);\n\n    let buf = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(sequence as *mut u8, insize)\n    };\n\n    hll.add_sequence(buf, force)\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_add_hash(ptr: *mut SourmashHyperLogLog, hash: u64) {\n    let hll = unsafe { SourmashHyperLogLog::as_rust_mut(ptr) };\n    hll.add_hash(hash);\n}\n\nffi_fn! {\nunsafe fn hll_merge(\n    ptr: *mut SourmashHyperLogLog,\n    optr: *const SourmashHyperLogLog,\n) {\n    let hll = SourmashHyperLogLog::as_rust_mut(ptr);\n    let ohll = SourmashHyperLogLog::as_rust(optr);\n\n    // FIXME raise an exception properly\n    hll.merge(ohll)?;\n}\n}\n\nffi_fn! {\nunsafe fn hll_update_mh(\n    ptr: *mut SourmashHyperLogLog,\n    optr: *const SourmashKmerMinHash,\n) {\n    let hll = SourmashHyperLogLog::as_rust_mut(ptr);\n    let mh = SourmashKmerMinHash::as_rust(optr);\n\n    mh.update(hll)?\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hll_matches(\n    ptr: *const SourmashHyperLogLog,\n    mh_ptr: *const SourmashKmerMinHash,\n) -> usize {\n    unsafe {\n        let hll = SourmashHyperLogLog::as_rust(ptr);\n        let mh_hll = SourmashKmerMinHash::as_rust(mh_ptr).as_hll();\n\n        hll.intersection(&mh_hll)\n    }\n}\n\nffi_fn! {\nunsafe fn hll_from_path(filename: *const c_char) -> Result<*mut SourmashHyperLogLog> {\n    // FIXME use buffer + len instead of c_str\n    let c_str = {\n        assert!(!filename.is_null());\n\n        CStr::from_ptr(filename)\n    };\n\n    let (mut input, _) = niffler::from_path(c_str.to_str()?)?;\n    let hll = HyperLogLog::from_reader(&mut input)?;\n\n    Ok(SourmashHyperLogLog::from_rust(hll))\n}\n}\n\nffi_fn! {\nunsafe fn hll_from_buffer(ptr: *const c_char, insize: usize) -> Result<*mut SourmashHyperLogLog> {\n    // FIXME use SourmashSlice_u8?\n    let buf = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(ptr as *mut u8, insize)\n    };\n\n    let hll = HyperLogLog::from_reader(buf)?;\n\n    Ok(SourmashHyperLogLog::from_rust(hll))\n}\n}\n\nffi_fn! {\nunsafe fn hll_save(ptr: *const SourmashHyperLogLog, filename: *const c_char) -> Result<()> {\n    let hll = SourmashHyperLogLog::as_rust(ptr);\n\n    // FIXME use buffer + len instead of c_str\n    let c_str = {\n        assert!(!filename.is_null());\n\n        CStr::from_ptr(filename)\n    };\n\n    hll.save(c_str.to_str()?)?;\n\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn hll_to_buffer(ptr: *const SourmashHyperLogLog, size: *mut usize) -> Result<*const u8> {\n    let hll = SourmashHyperLogLog::as_rust(ptr);\n\n    // TODO: remove this\n    let compression = 1;\n\n    let mut buffer = vec![];\n    {\n      let mut writer = if compression > 0 {\n          let level = match compression {\n            1 => niffler::compression::Level::One,\n            2 => niffler::compression::Level::Two,\n            3 => niffler::compression::Level::Three,\n            4 => niffler::compression::Level::Four,\n            5 => niffler::compression::Level::Five,\n            6 => niffler::compression::Level::Six,\n            7 => niffler::compression::Level::Seven,\n            8 => niffler::compression::Level::Eight,\n            _ => niffler::compression::Level::Nine,\n          };\n\n          niffler::get_writer(Box::new(&mut buffer),\n                              niffler::compression::Format::Gzip,\n                              level)?\n      } else {\n          Box::new(&mut buffer)\n      };\n      hll.save_to_writer(&mut writer)?;\n    }\n\n    let b = buffer.into_boxed_slice();\n    *size = b.len();\n\n    // FIXME use SourmashSlice_u8?\n    Ok(Box::into_raw(b) as *const u8)\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/index/mod.rs",
    "content": "#[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\npub mod revindex;\n\nuse crate::signature::Signature;\n\nuse crate::ffi::signature::SourmashSignature;\nuse crate::ffi::utils::{ForeignObject, SourmashStr};\n\npub struct SourmashSearchResult;\n\nimpl ForeignObject for SourmashSearchResult {\n    type RustObject = (f64, Signature, String);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn searchresult_free(ptr: *mut SourmashSearchResult) {\n    unsafe { SourmashSearchResult::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn searchresult_score(ptr: *const SourmashSearchResult) -> f64 {\n    let result = unsafe { SourmashSearchResult::as_rust(ptr) };\n    result.0\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn searchresult_filename(ptr: *const SourmashSearchResult) -> SourmashStr {\n    let result = unsafe { SourmashSearchResult::as_rust(ptr) };\n    (result.2).clone().into()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn searchresult_signature(\n    ptr: *const SourmashSearchResult,\n) -> *mut SourmashSignature {\n    unsafe {\n        let result = SourmashSearchResult::as_rust(ptr);\n        SourmashSignature::from_rust((result.1).clone())\n    }\n}\n"
  },
  {
    "path": "src/core/src/ffi/index/revindex.rs",
    "content": "use std::ffi::CStr;\nuse std::os::raw::c_char;\nuse std::slice;\n\nuse crate::collection::{Collection, CollectionSet};\nuse crate::encodings::*;\nuse crate::ffi::index::SourmashSearchResult;\nuse crate::ffi::index::SourmashStr;\nuse crate::ffi::manifest::SourmashManifest;\nuse crate::ffi::minhash::SourmashKmerMinHash;\nuse crate::ffi::signature::SourmashSignature;\nuse crate::ffi::utils::ForeignObject;\nuse crate::index::revindex::disk_revindex;\nuse crate::index::revindex::mem_revindex;\nuse crate::index::revindex::{self as module, CounterGather, DatasetPicklist, RevIndexOps};\nuse crate::manifest::Record;\nuse crate::prelude::*;\nuse crate::signature::{Signature, SigsTrait};\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::KmerMinHash;\nuse std::collections::HashSet;\nuse std::path::Path;\n\n// FFI struct for base RevIndex struct & RevIndexOps trait\n\npub struct SourmashRevIndex;\nimpl ForeignObject for SourmashRevIndex {\n    type RustObject = module::RevIndex;\n}\n\n// FFI struct for RevIndex-specific picklist of Idx\n\npub struct SourmashDatasetPicklist;\nimpl ForeignObject for SourmashDatasetPicklist {\n    type RustObject = DatasetPicklist;\n}\n\n// FFI struct for CounterGather object to hold intermediate results for\n// gather.\n\n#[allow(non_camel_case_types)]\npub struct SourmashRevIndex_CounterGather;\nimpl ForeignObject for SourmashRevIndex_CounterGather {\n    type RustObject = CounterGather;\n}\n\npub unsafe fn retrieve_picklist(\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Option<DatasetPicklist> {\n    if dataset_picklist_ptr.is_null() {\n        None\n    } else {\n        let x = unsafe { SourmashDatasetPicklist::as_rust(dataset_picklist_ptr) };\n        Some(x.clone())\n    }\n}\n\n// Build new RevIndex struct from existing RocksDB/DiskRevIndex.\n\nffi_fn! {\nunsafe fn revindex_new_from_rocksdb(\n    path_ptr: *const c_char,\n) -> Result<*mut SourmashRevIndex> {\n    // FIXME use buffer + len instead of cstr\n    let rocksdb_path = {\n        assert!(!path_ptr.is_null());\n        CStr::from_ptr(path_ptr)\n    }.to_str()?;\n\n    let rocksdb = disk_revindex::DiskRevIndex::open(\n        rocksdb_path,\n        true,\n        None\n    )?;\n\n    Ok(SourmashRevIndex::from_rust(rocksdb))\n}\n}\n\n// Create new DiskRevIndex from list of signatures.\n\nffi_fn! {\nunsafe fn revindex_disk_create(\n    sigs_ptr: *const *const SourmashSignature,\n    insigs: usize,\n    path_ptr: *const c_char,\n) -> Result<()> {\n    let sigs: Vec<Signature> = {\n        assert!(!sigs_ptr.is_null());\n        slice::from_raw_parts(sigs_ptr, insigs)\n            .iter()\n            .map(|sig| SourmashSignature::as_rust(*sig))\n            .cloned()\n            .collect()\n    };\n\n    let coll = Collection::from_sigs(sigs).expect(\"cannot create Collection\");\n    let cs: CollectionSet = coll.try_into().expect(\"cannot convert to CollectionSet\");\n\n    let rocksdb_path = {\n        assert!(!path_ptr.is_null());\n        CStr::from_ptr(path_ptr)\n    }.to_str()?;\n\n    let rocksdb_path = Path::new(rocksdb_path);\n\n    let mut revindex = disk_revindex::DiskRevIndex::create(rocksdb_path, cs).expect(\"cannot create RocksDB\");\n    revindex.internalize_storage().expect(\"failed to internalize storage.\");\n    Ok(())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_free(ptr: *mut SourmashRevIndex) {\n    unsafe { SourmashRevIndex::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_countergather_free(ptr: *mut SourmashRevIndex_CounterGather) {\n    unsafe { SourmashRevIndex_CounterGather::drop(ptr) };\n}\n\n// create a DatasetPicklist from a collection of Idx (record references).\n\nffi_fn! {\nunsafe fn dataset_picklist_new_from_list(\n    dataset_idxs_ptr: *const u32,\n    insize: usize,\n) -> Result<*const SourmashDatasetPicklist> {\n    assert!(!dataset_idxs_ptr.is_null());\n    let dids = HashSet::from_iter(\n        slice::from_raw_parts(dataset_idxs_ptr as *mut u32, insize)\n            .iter().copied()\n    );\n\n    let ds = DatasetPicklist {\n        dataset_ids: dids\n    };\n\n    Ok(SourmashDatasetPicklist::from_rust(ds))\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn dataset_picklist_free(ptr: *mut SourmashDatasetPicklist) {\n    unsafe { SourmashDatasetPicklist::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_len(\n    ptr: *const SourmashRevIndex,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> u64 {\n    let revindex = unsafe { SourmashRevIndex::as_rust(ptr) };\n    let dataset_picklist = unsafe { retrieve_picklist(dataset_picklist_ptr) };\n\n    let coll = revindex.collection();\n\n    // filter by picklist\n    let records: Vec<(Idx, &Record)> = coll\n        .iter()\n        .filter_map(|(idx, record)| {\n            if let Some(pl) = &dataset_picklist {\n                if pl.dataset_ids.contains(&idx) {\n                    Some((idx, record))\n                } else {\n                    None\n                }\n            } else {\n                Some((idx, record))\n            }\n        })\n        .collect();\n\n    records.len() as u64\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_ksize(ptr: *const SourmashRevIndex) -> u32 {\n    let revindex = unsafe { SourmashRevIndex::as_rust(ptr) };\n\n    // note: here 'collection' is a CollectionSet, so all the same ksize.\n    revindex\n        .collection()\n        .manifest()\n        .first()\n        .expect(\"no records!?\")\n        .ksize()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_scaled(ptr: *const SourmashRevIndex) -> u32 {\n    let revindex = unsafe { SourmashRevIndex::as_rust(ptr) };\n\n    // note: here 'collection' is a CollectionSet, so all the same scaled.\n    let (_, scaled) = revindex\n        .collection()\n        .min_max_scaled()\n        .expect(\"no records!?\");\n    *scaled\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn revindex_moltype(ptr: *const SourmashRevIndex) -> SourmashStr {\n    let revindex = unsafe { SourmashRevIndex::as_rust(ptr) };\n\n    // note: here 'collection' is a CollectionSet, so all the same moltype.\n    let moltype = revindex\n        .collection()\n        .manifest()\n        .first()\n        .expect(\"no records!?\")\n        .moltype();\n    let moltype_str = moltype.to_string();\n    moltype_str.into()\n}\n\nffi_fn! {\nunsafe fn revindex_manifest(ptr: *const SourmashRevIndex) -> Result<*mut SourmashManifest> {\n    let revindex = SourmashRevIndex::as_rust(ptr);\n    let mf = revindex.collection().manifest().clone();\n\n    Ok(SourmashManifest::from_rust(mf))\n}\n}\n\nffi_fn! {\nunsafe fn revindex_signatures(\n    ptr: *const SourmashRevIndex,\n    size: *mut usize,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Result<*mut *mut SourmashSignature> {\n    let revindex = &SourmashRevIndex::as_rust(ptr);\n    let dataset_picklist = retrieve_picklist(dataset_picklist_ptr);\n\n    let coll = revindex.collection();\n\n    // filter by picklist\n    let records: Vec<(Idx, &Record)> = coll.iter()\n        .filter_map(|(idx, record)| {\n            if let Some(pl) = &dataset_picklist {\n                if pl.dataset_ids.contains(&idx) {\n                    Some((idx, record))\n                } else {\n                    None\n                }\n            } else {\n                Some((idx, record))\n            }\n        })\n        .collect();\n\n    // load sigs\n    let sigs: Vec<Signature> = records.iter()\n        .filter_map(|(_idx, record)| match coll.sig_from_record(record) {\n            Ok(sig) => Some(sig.into()),\n            Err(_) => None,\n        })\n        .collect();\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashSignature> = sigs\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(x)) as *mut SourmashSignature)\n        .collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashSignature)\n}\n}\n\n// prefetch/containment overlap -> all matches. Implement separately from\n// Jaccard, as this can be done efficiently on RevIndexes.\n\nffi_fn! {\nunsafe fn revindex_prefetch(\n    db_ptr: *const SourmashRevIndex,\n    query_ptr: *const SourmashSignature,\n    threshold_bp: u64,\n    return_size: *mut usize,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Result<*const *const SourmashSearchResult> {\n    let revindex = &SourmashRevIndex::as_rust(db_ptr);\n    let sig = SourmashSignature::as_rust(query_ptr);\n\n    // extract KmerMinHash for query\n    let query_mh: KmerMinHash = sig.clone()\n        .try_into().expect(\"cannot get kmerminhash\");\n    let scaled = query_mh.scaled();\n    let threshold_bp: u64 = threshold_bp as u64 / scaled as u64;\n\n    // picklist?\n    let dataset_picklist = retrieve_picklist(dataset_picklist_ptr);\n\n    // do search & get matches\n    let counter = revindex.counter_for_query(&query_mh, dataset_picklist);\n\n    // right now this iterates over all matches from 'counter.most_common()'.\n    // we could probably truncate the search here in some way, yes?\n    // but it would require changing this to a loop rather than using an\n    // iterator I think.\n    //\n    // we could also adjust 'counter_for_query' to respect a specific\n    // threshold...\n    let filename = revindex.location();\n    let results: Vec<(f64, Signature, String)> = counter\n        .most_common()\n        .into_iter()\n        .filter_map(|(dataset_id, size)| {\n            if size as u64 >= threshold_bp {\n                let sig: Signature = revindex\n                    .collection()\n                    .sig_for_dataset(dataset_id)\n                    .expect(\"dataset not found\")\n                    .into();\n                let f_cont = size as f64 / query_mh.size() as f64;\n\n                Some((f_cont, sig, filename.to_owned()))\n            } else {\n                None\n            }\n        })\n        .collect();\n\n    // convert to ffi.\n    let ptr_results: Vec<*const SourmashSearchResult> = results\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(x)) as *const SourmashSearchResult)\n        .collect();\n\n    let b = ptr_results.into_boxed_slice();\n    *return_size = b.len();\n    Ok(Box::into_raw(b) as *const *const SourmashSearchResult)\n}\n}\n\n// implement jaccard search separately from containment analysis, since\n// the latter can be done more efficiently on RevIndexes.\n\nffi_fn! {\nunsafe fn revindex_search_jaccard(\n    ptr: *const SourmashRevIndex,\n    sig_ptr: *const SourmashSignature,\n    threshold: f64,\n    size: *mut usize,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Result<*const *const SourmashSearchResult> {\n    let revindex = SourmashRevIndex::as_rust(ptr);\n    let sig = SourmashSignature::as_rust(sig_ptr);\n\n    // picklist?\n    let dataset_picklist = retrieve_picklist(dataset_picklist_ptr);\n\n    if sig.signatures.is_empty() {\n        *size = 0;\n        return Ok(std::ptr::null::<*const SourmashSearchResult>());\n    }\n\n    let mh = if let Sketch::MinHash(mh) = &sig.signatures[0] {\n        mh\n    } else {\n        // TODO: what if it is not a mh?\n        unimplemented!()\n    };\n\n    let results: Vec<(f64, Signature, String)> = revindex\n        .find_signatures(mh, threshold, dataset_picklist)?\n        .into_iter()\n        .collect();\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*const SourmashSearchResult> = results\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(x)) as *const SourmashSearchResult)\n        .collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *const *const SourmashSearchResult)\n}\n}\n// retrieve best match.\n\nffi_fn! {\nunsafe fn revindex_best_containment(\n    db_ptr: *const SourmashRevIndex,\n    query_ptr: *const SourmashKmerMinHash,\n    threshold_bp: u64,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Result<*mut SourmashSignature> {\n    let revindex = &SourmashRevIndex::as_rust(db_ptr);\n    let query_mh = SourmashKmerMinHash::as_rust(query_ptr);\n    let scaled = query_mh.scaled();\n    let threshold_bp: u64 = threshold_bp as u64 / scaled as u64;\n\n    // picklist?\n    let dataset_picklist = retrieve_picklist(dataset_picklist_ptr);\n\n    // do search & get first/best match\n    let counter = revindex.counter_for_query(query_mh, dataset_picklist);\n    if !counter.is_empty() {\n        let (dataset_id, size) = counter.k_most_common_ordered(1)[0];\n\n        if size as u64 >= threshold_bp {\n            // load into SigStore & convert to Signature.\n            let match_sig = revindex\n                .collection()\n                .sig_for_dataset(dataset_id)\n                .expect(\"cannot load signature\");\n            let match_sig: Signature = match_sig.into();\n\n            return Ok(SourmashSignature::from_rust(match_sig));\n        }\n    }\n\n    Ok(SourmashSignature::from_rust(Signature::default()))\n}\n}\n\n// return a CounterGather object with prefetch results\n\nffi_fn! {\nunsafe fn revindex_prefetch_to_countergather(\n    db_ptr: *const SourmashRevIndex,\n    query_ptr: *const SourmashSignature,\n    dataset_picklist_ptr: *const SourmashDatasetPicklist,\n) -> Result<*mut SourmashRevIndex_CounterGather> {\n    let revindex = &SourmashRevIndex::as_rust(db_ptr);\n    let sig = SourmashSignature::as_rust(query_ptr);\n\n    // extract KmerMinHash for query\n    let query_mh: KmerMinHash = sig.clone()\n        .try_into().expect(\"cannot get kmerminhash\");\n\n    // picklist?\n    let dataset_picklist = retrieve_picklist(dataset_picklist_ptr);\n\n    // do search & get matches\n    let counter = revindex.prepare_gather_counters(&query_mh, dataset_picklist);\n\n    Ok(SourmashRevIndex_CounterGather::from_rust(counter))\n}\n}\n\n// decrement counters appropriately.\n\nffi_fn! {\nunsafe fn revindex_countergather_consume(\n    cg_ptr: *mut SourmashRevIndex_CounterGather,\n    isect_ptr: *const SourmashKmerMinHash,\n) -> Result<()> {\n    let cg: &mut CounterGather = SourmashRevIndex_CounterGather::as_rust_mut(cg_ptr);\n    let isect_mh = SourmashKmerMinHash::as_rust(isect_ptr);\n\n    cg.consume(isect_mh);\n\n    Ok(())\n}\n}\n\n// retrieve top match.\n\nffi_fn! {\nunsafe fn revindex_countergather_peek(\n    cg_ptr: *const SourmashRevIndex_CounterGather,\n    db_ptr: *const SourmashRevIndex,\n    threshold_bp: u64,\n) -> Result<*mut SourmashSignature> {\n    let cg: &CounterGather = SourmashRevIndex_CounterGather::as_rust(cg_ptr);\n    let revindex = &SourmashRevIndex::as_rust(db_ptr);\n\n    let result = cg.peek(threshold_bp as usize);\n\n    if let Some((dataset_id, _match_size)) = result {\n        let match_sig = revindex\n            .collection()\n            .sig_for_dataset(dataset_id)\n            .expect(\"cannot load signature\");\n        Ok(SourmashSignature::from_rust(match_sig.into()))\n    } else {\n        Ok(SourmashSignature::from_rust(Signature::default()))\n    }\n}\n}\n\n// retrieve all signatures for a CounterGather.\n\nffi_fn! {\nunsafe fn revindex_countergather_signatures(\n    cg_ptr: *const SourmashRevIndex_CounterGather,\n    db_ptr: *const SourmashRevIndex,\n    size: *mut usize,\n) -> Result<*mut *mut SourmashSignature> {\n    let cg: &CounterGather = SourmashRevIndex_CounterGather::as_rust(cg_ptr);\n    let revindex = &SourmashRevIndex::as_rust(db_ptr);\n\n    let coll = revindex.collection();\n    let sigs: Vec<Signature> = cg\n        .dataset_ids()\n        .into_iter()\n        .map(|idx| { coll\n                     .sig_for_dataset(idx)\n                     .expect(\"cannot retrieve sig!?\")\n                     .into()\n        })\n        .collect();\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashSignature> = sigs\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(x)) as *mut SourmashSignature)\n        .collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashSignature)\n}\n}\n\n// retrieve all hashes present in a CounterGather. Can be done efficiently.\n\nffi_fn! {\nunsafe fn revindex_countergather_found_hashes(\n    cg_ptr: *mut SourmashRevIndex_CounterGather,\n    template_ptr: *const SourmashKmerMinHash,\n) -> Result<*const SourmashKmerMinHash> {\n    let cg: &CounterGather = SourmashRevIndex_CounterGather::as_rust_mut(cg_ptr);\n    let template_mh = SourmashKmerMinHash::as_rust(template_ptr);\n\n    let found_mh = cg.found_hashes(template_mh);\n    Ok(SourmashKmerMinHash::from_rust(found_mh))\n}\n}\n\nffi_fn! {\nunsafe fn revindex_countergather_len(\n    cg_ptr: *mut SourmashRevIndex_CounterGather,\n) -> Result<u64> {\n    let cg: &CounterGather = SourmashRevIndex_CounterGather::as_rust_mut(cg_ptr);\n\n    Ok(cg.len() as u64)\n}\n}\n\n// convert a sketch template into a Selection, for use by the Rust layer.\n// TODO: remove this when it is possible to pass Selection thru the FFI\n\npub fn from_template(template: &Sketch) -> Selection {\n    let (num, scaled) = match template {\n        Sketch::MinHash(mh) => (mh.num(), mh.scaled()),\n        Sketch::LargeMinHash(mh) => (mh.num(), mh.scaled()),\n        _ => unimplemented!(),\n    };\n\n    let (ksize, moltype) = match template {\n        Sketch::MinHash(mh) => (mh.ksize() as u32, mh.hash_function()),\n        Sketch::LargeMinHash(mh) => (mh.ksize() as u32, mh.hash_function()),\n        _ => unimplemented!(),\n    };\n\n    let adj_ksize: u32 = match moltype {\n        HashFunctions::Murmur64Dna => ksize,\n        HashFunctions::Murmur64Protein => ksize / 3,\n        HashFunctions::Murmur64Dayhoff => ksize / 3,\n        HashFunctions::Murmur64Hp => ksize / 3,\n        HashFunctions::Murmur64Skipm1n3 => ksize,\n        HashFunctions::Murmur64Skipm2n3 => ksize,\n        _ => ksize,\n    };\n\n    Selection::builder()\n        .ksize(adj_ksize)\n        .num(num)\n        .scaled(scaled)\n        .build()\n}\n\n// build a new MemRevIndex from a list of sigs.\n\nffi_fn! {\nunsafe fn revindex_mem_new_with_sigs(\n    search_sigs_ptr: *const *const SourmashSignature,\n    insigs: usize,\n    template_ptr: *const SourmashKmerMinHash,\n) -> Result<*mut SourmashRevIndex> {\n    let search_sigs: Vec<Signature> = {\n        assert!(!search_sigs_ptr.is_null());\n        slice::from_raw_parts(search_sigs_ptr, insigs)\n            .iter()\n            .map(|sig| SourmashSignature::as_rust(*sig))\n            .cloned()\n            .collect()\n    };\n\n    let template = {\n        assert!(!template_ptr.is_null());\n        //TODO: avoid clone here\n        Sketch::MinHash(SourmashKmerMinHash::as_rust(template_ptr).clone())\n    };\n\n    let selection = from_template(&template);\n    let revindex = mem_revindex::MemRevIndex::new_with_sigs(search_sigs, &selection, 0, None).expect(\"cannot create MemRevIndex\");\n    Ok(SourmashRevIndex::from_rust(revindex))\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/manifest.rs",
    "content": "use crate::manifest::{Manifest, Record};\n\nuse crate::ffi::utils::{ForeignObject, SourmashStr};\n\npub struct SourmashManifest;\n\nimpl ForeignObject for SourmashManifest {\n    type RustObject = Manifest;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn manifest_free(ptr: *mut SourmashManifest) {\n    unsafe {\n        SourmashManifest::drop(ptr);\n    }\n}\n\npub struct ManifestRowIterator {\n    iter: Box<dyn Iterator<Item = &'static Record>>,\n}\n\npub struct SourmashManifestRowIter;\n\nimpl ForeignObject for SourmashManifestRowIter {\n    type RustObject = ManifestRowIterator;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn manifest_rows_iter_next(\n    ptr: *mut SourmashManifestRowIter,\n) -> *const SourmashManifestRow {\n    let iterator = unsafe { SourmashManifestRowIter::as_rust_mut(ptr) };\n\n    match iterator.iter.next() {\n        Some(row) => unsafe { SourmashManifestRow::from_rust(row.into()) },\n        None => std::ptr::null(),\n    }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn manifest_rows(\n    ptr: *const SourmashManifest,\n) -> *mut SourmashManifestRowIter {\n    let manifest = unsafe { SourmashManifest::as_rust(ptr) };\n\n    let iter = Box::new(manifest.iter());\n    unsafe { SourmashManifestRowIter::from_rust(ManifestRowIterator { iter }) }\n}\n\n#[repr(C)]\npub struct SourmashManifestRow {\n    pub ksize: u32,\n    pub with_abundance: bool,\n    pub md5: SourmashStr,\n    pub internal_location: SourmashStr,\n    pub name: SourmashStr,\n    pub moltype: SourmashStr,\n    pub n_hashes: usize,\n    pub num: u32,\n    pub scaled: u32,\n    pub filename: SourmashStr,\n}\n\nimpl ForeignObject for SourmashManifestRow {\n    type RustObject = SourmashManifestRow;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn manifestrow_free(ptr: *mut SourmashManifestRow) {\n    unsafe {\n        SourmashManifestRow::drop(ptr);\n    }\n}\n\nimpl From<&Record> for SourmashManifestRow {\n    fn from(record: &Record) -> SourmashManifestRow {\n        Self {\n            ksize: record.ksize(),\n            with_abundance: record.with_abundance(),\n            md5: record.md5().clone().into(),\n            name: record.name().clone().into(),\n            moltype: record.moltype().to_string().into(),\n            internal_location: record.internal_location().to_string().into(),\n            n_hashes: *record.n_hashes(),\n            num: *record.num(),\n            scaled: *record.scaled(),\n            filename: record.filename().to_string().into(),\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/src/ffi/minhash.rs",
    "content": "use std::ffi::CStr;\nuse std::os::raw::c_char;\nuse std::slice;\n\nuse crate::encodings::{aa_to_dayhoff, aa_to_hp, translate_codon};\nuse crate::ffi::HashFunctions;\nuse crate::ffi::utils::{ForeignObject, SourmashStr};\nuse crate::signature::SeqToHashes;\nuse crate::signature::SigsTrait;\nuse crate::sketch::minhash::KmerMinHash;\n\npub struct SourmashKmerMinHash;\n\nimpl ForeignObject for SourmashKmerMinHash {\n    type RustObject = KmerMinHash;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_new(\n    scaled: u32,\n    k: u32,\n    hash_function: HashFunctions,\n    seed: u64,\n    track_abundance: bool,\n    n: u32,\n) -> *mut SourmashKmerMinHash {\n    let mh = KmerMinHash::new(scaled, k, hash_function.into(), seed, track_abundance, n);\n\n    unsafe { SourmashKmerMinHash::from_rust(mh) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_free(ptr: *mut SourmashKmerMinHash) {\n    unsafe { SourmashKmerMinHash::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_slice_free(ptr: *mut u64, insize: usize) {\n    // FIXME\n    if ptr.is_null() {\n        return;\n    }\n    unsafe { Vec::from_raw_parts(ptr, insize, insize) };\n}\n\nffi_fn! {\nunsafe fn kmerminhash_add_sequence(ptr: *mut SourmashKmerMinHash, sequence: *const c_char, force: bool) ->\n    Result<()> {\n\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n\n    // FIXME: take buffer and len instead of c_char\n    let c_str = {\n        assert!(!sequence.is_null());\n\n        CStr::from_ptr(sequence)\n    };\n\n    mh.add_sequence(c_str.to_bytes(), force)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_seq_to_hashes(ptr: *mut SourmashKmerMinHash, sequence: *const c_char, insize: usize, force: bool, bad_kmers_as_zeroes: bool, is_protein: bool, size: *mut usize) ->\nResult<*const u64> {\n\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n\n    let buf = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(sequence as *const u8, insize)\n    };\n\n    let mut output: Vec<u64> = Vec::with_capacity(insize);\n\n    // Call SeqToHashes::new and handle errors\n    let ready_hashes = SeqToHashes::new(\n        buf,\n        mh.ksize(),\n        force,\n        is_protein,\n        mh.hash_function(),\n        mh.seed(),\n    )?;\n\n\n    if force && bad_kmers_as_zeroes{\n        for hash_value in ready_hashes{\n            match hash_value{\n                Ok(x) => output.push(x),\n                Err(err) => return Err(err),\n            }\n        }\n    }else{\n        for hash_value in ready_hashes {\n            match hash_value{\n                Ok(0) => continue,\n                Ok(x) => output.push(x),\n                Err(err) => return Err(err),\n            }\n        }\n    }\n\n\n    *size = output.len();\n\n    // FIXME: make a SourmashSlice_u64 type?\n    Ok(Box::into_raw(output.into_boxed_slice()) as *const u64)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_add_protein(ptr: *mut SourmashKmerMinHash, sequence: *const c_char) ->\n    Result<()> {\n\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n\n    // FIXME: take buffer and len instead of c_char\n    let c_str = {\n        assert!(!sequence.is_null());\n\n        CStr::from_ptr(sequence)\n    };\n\n    mh.add_protein(c_str.to_bytes())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_clear(ptr: *mut SourmashKmerMinHash) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    mh.clear();\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_add_hash(ptr: *mut SourmashKmerMinHash, h: u64) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    mh.add_hash(h);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_add_hash_with_abundance(\n    ptr: *mut SourmashKmerMinHash,\n    h: u64,\n    abundance: u64,\n) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    mh.add_hash_with_abundance(h, abundance);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_add_word(ptr: *mut SourmashKmerMinHash, word: *const c_char) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    // FIXME: take buffer and len instead of c_char\n    let c_str = {\n        assert!(!word.is_null());\n\n        unsafe { CStr::from_ptr(word) }\n    };\n\n    mh.add_word(c_str.to_bytes());\n}\n\nffi_fn! {\nunsafe fn sourmash_translate_codon(codon: *const c_char) -> Result<c_char> {\n    // FIXME: take buffer and len instead of c_char\n    let c_str = {\n        assert!(!codon.is_null());\n\n        CStr::from_ptr(codon)\n    };\n\n    Ok(translate_codon(c_str.to_bytes())? as c_char)\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_aa_to_dayhoff(aa: c_char) -> c_char {\n    aa_to_dayhoff(aa as u8) as c_char\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_aa_to_hp(aa: c_char) -> c_char {\n    aa_to_hp(aa as u8) as c_char\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_remove_hash(ptr: *mut SourmashKmerMinHash, h: u64) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    mh.remove_hash(h);\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_remove_many(\n    ptr: *mut SourmashKmerMinHash,\n    hashes_ptr: *const u64,\n    insize: usize,\n) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n\n    // FIXME: make a SourmashSlice_u64 type?\n    let hashes = {\n        assert!(!hashes_ptr.is_null());\n        unsafe { slice::from_raw_parts(hashes_ptr as *mut u64, insize) }\n    };\n\n    // FIXME: proper exception here\n    mh.remove_many(hashes.iter().copied())\n        .expect(\"Hash removal error\");\n}\n\nffi_fn! {\nunsafe fn kmerminhash_get_mins(ptr: *const SourmashKmerMinHash, size: *mut usize) -> Result<*const u64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let output = mh.mins();\n    *size = output.len();\n\n    // FIXME: make a SourmashSlice_u64 type?\n    Ok(Box::into_raw(output.into_boxed_slice()) as *const u64)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_md5sum(ptr: *const SourmashKmerMinHash) -> Result<SourmashStr> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let output = mh.md5sum();\n\n    Ok(output.into())\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_add_many(\n    ptr: *mut SourmashKmerMinHash,\n    hashes_ptr: *const u64,\n    insize: usize,\n  ) -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n\n    // FIXME: make a SourmashSlice_u64 type?\n    let hashes = {\n        assert!(!hashes_ptr.is_null());\n        slice::from_raw_parts(hashes_ptr, insize)\n    };\n\n    for hash in hashes {\n      mh.add_hash(*hash);\n    }\n\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_get_abunds(ptr: *mut SourmashKmerMinHash, size: *mut usize) -> Result<*const u64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n\n    if let Some(abunds) = mh.abunds() {\n        *size = abunds.len();\n        Ok(Box::into_raw(abunds.into_boxed_slice()) as *const u64)\n    } else {\n        //throw error, can't get abund\n        unimplemented!()\n    }\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_get_mins_size(ptr: *const SourmashKmerMinHash) -> usize {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n\n    mh.size()\n}\n\nffi_fn! {\nunsafe fn kmerminhash_set_abundances(\n    ptr: *mut SourmashKmerMinHash,\n    hashes_ptr: *const u64,\n    abunds_ptr: *const u64,\n    insize: usize,\n    clear: bool,\n) -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n\n    // FIXME: make a SourmashSlice_u64 type?\n    let hashes = {\n        assert!(!hashes_ptr.is_null());\n        slice::from_raw_parts(hashes_ptr, insize)\n    };\n\n    // FIXME: make a SourmashSlice_u64 type?\n    let abunds = {\n        assert!(!abunds_ptr.is_null());\n        slice::from_raw_parts(abunds_ptr, insize)\n    };\n\n    let mut pairs: Vec<_> = hashes.iter().cloned().zip(abunds.iter().cloned()).collect();\n    pairs.sort_unstable();\n\n    // Reset the minhash\n    if clear {\n        mh.clear();\n    }\n\n    mh.add_many_with_abund(&pairs)?;\n\n    Ok(())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_is_protein(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.is_protein()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_dayhoff(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.dayhoff()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_hp(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.hp()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_skipm1n3(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.skipm1n3()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_skipm2n3(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.skipm2n3()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_seed(ptr: *const SourmashKmerMinHash) -> u64 {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.seed()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_track_abundance(ptr: *const SourmashKmerMinHash) -> bool {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.track_abundance()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_disable_abundance(ptr: *mut SourmashKmerMinHash) {\n    let mh = unsafe { SourmashKmerMinHash::as_rust_mut(ptr) };\n    mh.disable_abundance();\n}\n\nffi_fn! {\nunsafe fn kmerminhash_enable_abundance(ptr: *mut SourmashKmerMinHash) -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n    mh.enable_abundance()?;\n    Ok(())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_num(ptr: *const SourmashKmerMinHash) -> u32 {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.num()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_ksize(ptr: *const SourmashKmerMinHash) -> u32 {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.ksize() as u32\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_max_hash(ptr: *const SourmashKmerMinHash) -> u64 {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.max_hash()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_hash_function(\n    ptr: *const SourmashKmerMinHash,\n) -> HashFunctions {\n    let mh = unsafe { SourmashKmerMinHash::as_rust(ptr) };\n    mh.hash_function().into()\n}\n\nffi_fn! {\nunsafe fn kmerminhash_hash_function_set(ptr: *mut SourmashKmerMinHash, hash_function: HashFunctions) -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n    mh.set_hash_function(hash_function.into())\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_merge(ptr: *mut SourmashKmerMinHash, other: *const SourmashKmerMinHash) -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.merge(other_mh)?;\n    Ok(())\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn kmerminhash_is_compatible(\n    ptr: *const SourmashKmerMinHash,\n    other: *const SourmashKmerMinHash,\n) -> bool {\n    unsafe {\n        let mh = SourmashKmerMinHash::as_rust(ptr);\n        let other_mh = SourmashKmerMinHash::as_rust(other);\n        mh.check_compatible(other_mh).is_ok()\n    }\n}\n\nffi_fn! {\nunsafe fn kmerminhash_add_from(ptr: *mut SourmashKmerMinHash, other: *const SourmashKmerMinHash)\n    -> Result<()> {\n    let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.add_from(other_mh)\n}\n}\n\nffi_fn! {\n    unsafe fn kmerminhash_remove_from(ptr: *mut SourmashKmerMinHash, other: *const SourmashKmerMinHash)\n    -> Result<()> {\n        let mh = SourmashKmerMinHash::as_rust_mut(ptr);\n        let other_mh = SourmashKmerMinHash::as_rust(other);\n        mh.remove_from(other_mh)\n    }\n}\n\nffi_fn! {\nunsafe fn kmerminhash_count_common(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash, downsample: bool)\n    -> Result<u64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.count_common(other_mh, downsample)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_intersection(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash)\n    -> Result<*mut SourmashKmerMinHash> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n\n    let isect = mh.intersection(other_mh)?;\n    let mut new_mh = mh.clone();\n    new_mh.clear();\n    new_mh.add_many(&isect.0)?;\n\n    Ok(SourmashKmerMinHash::from_rust(new_mh))\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_intersection_union_size(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash, union_size: *mut u64)\n    -> Result<u64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n\n    if let Ok((common, union_s)) = mh.intersection_size(other_mh) {\n        *union_size = union_s;\n        return Ok(common);\n    }\n\n    *union_size = 0;\n    Ok(0)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_jaccard(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash)\n    -> Result<f64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.jaccard(other_mh)\n}\n}\n\nffi_fn! {\nunsafe fn kmerminhash_similarity(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash, ignore_abundance: bool, downsample: bool)\n    -> Result<f64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.similarity(other_mh, ignore_abundance, downsample)\n}\n}\nffi_fn! {\nunsafe fn kmerminhash_angular_similarity(ptr: *const SourmashKmerMinHash, other: *const SourmashKmerMinHash)\n                                         -> Result<f64> {\n    let mh = SourmashKmerMinHash::as_rust(ptr);\n    let other_mh = SourmashKmerMinHash::as_rust(other);\n    mh.angular_similarity(other_mh)\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/mod.rs",
    "content": "//! # Foreign Function Interface for calling sourmash from a C API\n//!\n//! Primary client for now is the Python version, using CFFI and maturin.\n#![allow(clippy::missing_safety_doc)]\n\n#[macro_use]\npub mod utils;\n\npub mod cmd;\npub mod hyperloglog;\npub mod index;\npub mod manifest;\npub mod minhash;\npub mod nodegraph;\npub mod signature;\npub mod storage;\n\nuse std::ffi::CStr;\nuse std::os::raw::c_char;\n\nuse crate::_hash_murmur;\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn hash_murmur(kmer: *const c_char, seed: u64) -> u64 {\n    let c_str = unsafe {\n        assert!(!kmer.is_null());\n\n        CStr::from_ptr(kmer)\n    };\n\n    _hash_murmur(c_str.to_bytes(), seed)\n}\n\n#[repr(u32)]\npub enum HashFunctions {\n    Murmur64Dna = 1,\n    Murmur64Protein = 2,\n    Murmur64Dayhoff = 3,\n    Murmur64Hp = 4,\n    Murmur64Skipm1n3 = 5,\n    Murmur64Skipm2n3 = 6,\n}\n\nimpl From<HashFunctions> for crate::encodings::HashFunctions {\n    fn from(v: HashFunctions) -> crate::encodings::HashFunctions {\n        use crate::encodings::HashFunctions::{\n            Murmur64Dayhoff, Murmur64Dna, Murmur64Hp, Murmur64Protein, Murmur64Skipm1n3,\n            Murmur64Skipm2n3,\n        };\n        match v {\n            HashFunctions::Murmur64Dna => Murmur64Dna,\n            HashFunctions::Murmur64Protein => Murmur64Protein,\n            HashFunctions::Murmur64Dayhoff => Murmur64Dayhoff,\n            HashFunctions::Murmur64Hp => Murmur64Hp,\n            HashFunctions::Murmur64Skipm1n3 => Murmur64Skipm1n3,\n            HashFunctions::Murmur64Skipm2n3 => Murmur64Skipm2n3,\n        }\n    }\n}\n\nimpl From<crate::encodings::HashFunctions> for HashFunctions {\n    fn from(v: crate::encodings::HashFunctions) -> HashFunctions {\n        use crate::encodings::HashFunctions::{\n            Murmur64Dayhoff, Murmur64Dna, Murmur64Hp, Murmur64Protein, Murmur64Skipm1n3,\n            Murmur64Skipm2n3,\n        };\n        match v {\n            Murmur64Dna => HashFunctions::Murmur64Dna,\n            Murmur64Protein => HashFunctions::Murmur64Protein,\n            Murmur64Dayhoff => HashFunctions::Murmur64Dayhoff,\n            Murmur64Hp => HashFunctions::Murmur64Hp,\n            Murmur64Skipm1n3 => HashFunctions::Murmur64Skipm1n3,\n            Murmur64Skipm2n3 => HashFunctions::Murmur64Skipm2n3,\n            _ => todo!(\"Not supported, probably custom\"),\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/src/ffi/nodegraph.rs",
    "content": "use std::ffi::CStr;\nuse std::os::raw::c_char;\nuse std::slice;\n\nuse crate::prelude::*;\nuse crate::sketch::nodegraph::Nodegraph;\n\nuse crate::ffi::minhash::SourmashKmerMinHash;\nuse crate::ffi::utils::ForeignObject;\n\npub struct SourmashNodegraph;\n\nimpl ForeignObject for SourmashNodegraph {\n    type RustObject = Nodegraph;\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_new() -> *mut SourmashNodegraph {\n    unsafe { SourmashNodegraph::from_rust(Nodegraph::default()) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_free(ptr: *mut SourmashNodegraph) {\n    unsafe { SourmashNodegraph::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_buffer_free(ptr: *mut u8, insize: usize) {\n    if ptr.is_null() {\n        return;\n    }\n    unsafe { Vec::from_raw_parts(ptr, insize, insize) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_with_tables(\n    ksize: usize,\n    starting_size: usize,\n    n_tables: usize,\n) -> *mut SourmashNodegraph {\n    let ng = Nodegraph::with_tables(starting_size, n_tables, ksize);\n    unsafe { SourmashNodegraph::from_rust(ng) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_count(ptr: *mut SourmashNodegraph, h: u64) -> bool {\n    let ng = unsafe { SourmashNodegraph::as_rust_mut(ptr) };\n    ng.count(h)\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_count_kmer(\n    ptr: *mut SourmashNodegraph,\n    kmer: *const c_char,\n) -> bool {\n    let ng = unsafe { SourmashNodegraph::as_rust_mut(ptr) };\n\n    // FIXME use buffer + len instead of cstr\n    let c_str = {\n        assert!(!kmer.is_null());\n\n        unsafe { CStr::from_ptr(kmer) }\n    };\n\n    ng.count_kmer(c_str.to_bytes())\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_get(ptr: *const SourmashNodegraph, h: u64) -> usize {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    ng.get(h)\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_get_kmer(\n    ptr: *const SourmashNodegraph,\n    kmer: *const c_char,\n) -> usize {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n\n    // FIXME use buffer + len instead of cstr\n    let c_str = {\n        assert!(!kmer.is_null());\n\n        unsafe { CStr::from_ptr(kmer) }\n    };\n\n    ng.get_kmer(c_str.to_bytes())\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_expected_collisions(ptr: *const SourmashNodegraph) -> f64 {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    ng.expected_collisions()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_ksize(ptr: *const SourmashNodegraph) -> usize {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    ng.ksize()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_hashsizes(\n    ptr: *const SourmashNodegraph,\n    size: *mut usize,\n) -> *const u64 {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    let st = ng.tablesizes();\n\n    let b = st.into_boxed_slice();\n    unsafe { *size = b.len() };\n\n    // FIXME: Use SourmashSlice_u64?\n    Box::into_raw(b) as *const u64\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_ntables(ptr: *const SourmashNodegraph) -> usize {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    ng.ntables()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_noccupied(ptr: *const SourmashNodegraph) -> usize {\n    let ng = unsafe { SourmashNodegraph::as_rust(ptr) };\n    ng.noccupied()\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_matches(\n    ptr: *const SourmashNodegraph,\n    mh_ptr: *const SourmashKmerMinHash,\n) -> usize {\n    unsafe {\n        let ng = SourmashNodegraph::as_rust(ptr);\n        let mh = SourmashKmerMinHash::as_rust(mh_ptr);\n        ng.matches(mh)\n    }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_update(\n    ptr: *mut SourmashNodegraph,\n    optr: *const SourmashNodegraph,\n) {\n    unsafe {\n        let ng = SourmashNodegraph::as_rust_mut(ptr);\n        let ong = SourmashNodegraph::as_rust(optr);\n\n        // FIXME raise an exception properly\n        ong.update(ng).unwrap();\n    }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn nodegraph_update_mh(\n    ptr: *mut SourmashNodegraph,\n    optr: *const SourmashKmerMinHash,\n) {\n    unsafe {\n        let ng = SourmashNodegraph::as_rust_mut(ptr);\n        let mh = SourmashKmerMinHash::as_rust(optr);\n        mh.update(ng).unwrap();\n    }\n}\n\nffi_fn! {\nunsafe fn nodegraph_from_path(filename: *const c_char) -> Result<*mut SourmashNodegraph> {\n    // FIXME use buffer + len instead of c_str\n    let c_str = {\n        assert!(!filename.is_null());\n\n        CStr::from_ptr(filename)\n    };\n\n    let (mut input, _) = niffler::from_path(c_str.to_str()?)?;\n    let ng = Nodegraph::from_reader(&mut input)?;\n\n    Ok(SourmashNodegraph::from_rust(ng))\n}\n}\n\nffi_fn! {\nunsafe fn nodegraph_from_buffer(ptr: *const c_char, insize: usize) -> Result<*mut SourmashNodegraph> {\n    // FIXME use SourmashSlice_u8?\n    let buf = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(ptr as *mut u8, insize)\n    };\n\n    let ng = Nodegraph::from_reader(buf)?;\n\n    Ok(SourmashNodegraph::from_rust(ng))\n}\n}\n\nffi_fn! {\nunsafe fn nodegraph_save(ptr: *const SourmashNodegraph, filename: *const c_char) -> Result<()> {\n    let ng = SourmashNodegraph::as_rust(ptr);\n\n    // FIXME use buffer + len instead of c_str\n    let c_str = {\n        assert!(!filename.is_null());\n\n        CStr::from_ptr(filename)\n    };\n\n    ng.save(c_str.to_str()?)?;\n\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn nodegraph_to_buffer(ptr: *const SourmashNodegraph, compression: u8, size: *mut usize) -> Result<*const u8> {\n    let ng = SourmashNodegraph::as_rust(ptr);\n\n    let mut buffer = vec![];\n    {\n      let mut writer = if compression > 0 {\n          let level = match compression {\n            1 => niffler::compression::Level::One,\n            2 => niffler::compression::Level::Two,\n            3 => niffler::compression::Level::Three,\n            4 => niffler::compression::Level::Four,\n            5 => niffler::compression::Level::Five,\n            6 => niffler::compression::Level::Six,\n            7 => niffler::compression::Level::Seven,\n            8 => niffler::compression::Level::Eight,\n            _ => niffler::compression::Level::Nine,\n          };\n\n          niffler::get_writer(Box::new(&mut buffer),\n                              niffler::compression::Format::Gzip,\n                              level)?\n      } else {\n          Box::new(&mut buffer)\n      };\n      ng.save_to_writer(&mut writer)?;\n    }\n\n    let b = buffer.into_boxed_slice();\n    *size = b.len();\n\n    // FIXME use SourmashSlice_u8?\n    Ok(Box::into_raw(b) as *const u8)\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/signature.rs",
    "content": "use std::convert::TryInto;\nuse std::ffi::CStr;\nuse std::io;\nuse std::os::raw::c_char;\nuse std::slice;\n\nuse crate::errors::SourmashError;\n\nuse crate::encodings::HashFunctions;\nuse crate::signature::Signature;\nuse crate::sketch::Sketch;\n\nuse crate::ffi::cmd::compute::SourmashComputeParameters;\nuse crate::ffi::minhash::SourmashKmerMinHash;\nuse crate::ffi::utils::{ForeignObject, SourmashStr};\nuse crate::prelude::ToWriter;\n\npub struct SourmashSignature;\n\nimpl ForeignObject for SourmashSignature {\n    type RustObject = Signature;\n}\n\n// Signature methods\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn signature_new() -> *mut SourmashSignature {\n    unsafe { SourmashSignature::from_rust(Signature::default()) }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn signature_from_params(\n    ptr: *const SourmashComputeParameters,\n) -> *mut SourmashSignature {\n    unsafe {\n        let params = SourmashComputeParameters::as_rust(ptr);\n        SourmashSignature::from_rust(Signature::from_params(params))\n    }\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn signature_free(ptr: *mut SourmashSignature) {\n    unsafe { SourmashSignature::drop(ptr) };\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn signature_len(ptr: *const SourmashSignature) -> usize {\n    let sig = unsafe { SourmashSignature::as_rust(ptr) };\n    sig.size()\n}\n\nffi_fn! {\nunsafe fn signature_add_sequence(ptr: *mut SourmashSignature, sequence: *const c_char, force: bool) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n\n    // FIXME replace with buffer + len\n    let c_str = {\n        assert!(!sequence.is_null());\n\n        CStr::from_ptr(sequence)\n    };\n\n    sig.add_sequence(c_str.to_bytes(), force)\n}\n}\n\nffi_fn! {\nunsafe fn signature_add_protein(ptr: *mut SourmashSignature, sequence: *const c_char) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n\n    // FIXME replace with buffer + len\n    let c_str = {\n        assert!(!sequence.is_null());\n\n        CStr::from_ptr(sequence)\n    };\n\n    sig.add_protein(c_str.to_bytes())\n}\n}\n\nffi_fn! {\nunsafe fn signature_set_name(ptr: *mut SourmashSignature, name: *const c_char) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n\n    // FIXME replace with buffer + len\n    let c_str = {\n        assert!(!name.is_null());\n\n        CStr::from_ptr(name)\n    };\n\n    if let Ok(name) = c_str.to_str() {\n        sig.set_name(name)\n    }\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn signature_set_filename(ptr: *mut SourmashSignature, name: *const c_char) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n\n    // FIXME replace with buffer + len\n    let c_str = {\n        assert!(!name.is_null());\n\n        CStr::from_ptr(name)\n    };\n\n    if let Ok(name) = c_str.to_str() {\n        sig.set_filename(name)\n    }\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn signature_push_mh(ptr: *mut SourmashSignature, other: *const SourmashKmerMinHash) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n    let mh = SourmashKmerMinHash::as_rust(other);\n    sig.push(Sketch::MinHash(mh.clone()));\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn signature_set_mh(ptr: *mut SourmashSignature, other: *const SourmashKmerMinHash) ->\n    Result<()> {\n    let sig = SourmashSignature::as_rust_mut(ptr);\n    let mh = SourmashKmerMinHash::as_rust(other);\n    sig.reset_sketches();\n    sig.push(Sketch::MinHash(mh.clone()));\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn signature_get_name(ptr: *const SourmashSignature) -> Result<SourmashStr> {\n    let sig = SourmashSignature::as_rust(ptr);\n\n    if let Some(ref name) = sig.name {\n        Ok(name.clone().into())\n    } else {\n        Ok(\"\".into())\n    }\n}\n}\n\nffi_fn! {\nunsafe fn signature_get_filename(ptr: *const SourmashSignature) -> Result<SourmashStr> {\n    let sig = SourmashSignature::as_rust(ptr);\n    Ok(sig.filename().into())\n}\n}\n\nffi_fn! {\nunsafe fn signature_get_license(ptr: *const SourmashSignature) -> Result<SourmashStr> {\n    let sig = SourmashSignature::as_rust(ptr);\n    Ok(sig.license().into())\n}\n}\n\nffi_fn! {\nunsafe fn signature_first_mh(ptr: *const SourmashSignature) -> Result<*mut SourmashKmerMinHash> {\n    let sig = SourmashSignature::as_rust(ptr);\n\n    match sig.signatures.first() {\n        Some(Sketch::MinHash(mh)) => {\n            Ok(SourmashKmerMinHash::from_rust(mh.clone()))\n        },\n        Some(Sketch::LargeMinHash(mh_btree)) => {\n            Ok(SourmashKmerMinHash::from_rust(mh_btree.into()))\n        },\n        _ => Err(SourmashError::Internal {\n            message: \"found unsupported sketch type\".to_string()\n        }),\n    }\n}\n}\n\nffi_fn! {\nunsafe fn signature_eq(ptr: *const SourmashSignature, other: *const SourmashSignature) -> Result<bool> {\n    let sig = SourmashSignature::as_rust(ptr);\n    let other_sig = SourmashSignature::as_rust(other);\n\n    Ok(sig == other_sig)\n}\n}\n\nffi_fn! {\nunsafe fn signature_save_json(ptr: *const SourmashSignature) -> Result<SourmashStr> {\n    let sig = SourmashSignature::as_rust(ptr);\n    let mut st: Vec<u8> = vec![];\n    sig.to_writer(&mut st)?;\n    Ok(SourmashStr::from_string(String::from_utf8_unchecked(st)))\n}\n}\n\nffi_fn! {\nunsafe fn signature_get_mhs(ptr: *const SourmashSignature, size: *mut usize) -> Result<*mut *mut SourmashKmerMinHash> {\n    let sig = SourmashSignature::as_rust(ptr);\n\n    let output = sig.sketches();\n\n    // FIXME: how to fit this into the ForeignObject trait?\n    let ptr_sigs: Vec<*mut Signature> = output.into_iter().map(|x| {\n      Box::into_raw(Box::new(x)) as *mut Signature\n    }).collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashKmerMinHash)\n}\n}\n\nffi_fn! {\nunsafe fn signatures_save_buffer(ptr: *const *const SourmashSignature, size: usize, compression: u8, osize: *mut usize) -> Result<*const u8> {\n    // FIXME: review this for ForeignObject\n\n    let sigs = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(ptr, size)\n    };\n\n    let rsigs: Vec<&Signature> = sigs.iter().map(|x| SourmashSignature::as_rust(*x)).collect();\n\n    let mut buffer = vec![];\n    {\n      let mut writer = if compression > 0 {\n          let level = match compression {\n            1 => niffler::compression::Level::One,\n            2 => niffler::compression::Level::Two,\n            3 => niffler::compression::Level::Three,\n            4 => niffler::compression::Level::Four,\n            5 => niffler::compression::Level::Five,\n            6 => niffler::compression::Level::Six,\n            7 => niffler::compression::Level::Seven,\n            8 => niffler::compression::Level::Eight,\n            _ => niffler::compression::Level::Nine,\n          };\n\n          niffler::get_writer(Box::new(&mut buffer),\n                              niffler::compression::Format::Gzip,\n                              level)?\n      } else {\n          Box::new(&mut buffer)\n      };\n      rsigs.to_writer(&mut writer)?;\n    }\n\n    let b = buffer.into_boxed_slice();\n    *osize = b.len();\n\n    Ok(Box::into_raw(b) as *const u8)\n}\n}\n\nffi_fn! {\nunsafe fn signatures_load_path(ptr: *const c_char,\n                               _ignore_md5sum: bool,\n                               ksize: usize,\n                               select_moltype: *const c_char,\n                               size: *mut usize) -> Result<*mut *mut SourmashSignature> {\n    // FIXME use buffer + len instead of cstr\n    let buf = {\n        assert!(!ptr.is_null());\n        CStr::from_ptr(ptr)\n    };\n\n    // FIXME take select_moltype as enum\n    let moltype: Option<HashFunctions> = if select_moltype.is_null() {\n          None\n        } else {\n          let mol = CStr::from_ptr(select_moltype).to_str()?;\n          Some(mol.try_into()?)\n    };\n\n    // TODO: implement ignore_md5sum\n\n    let k = match ksize {\n      0 => None,\n      x => Some(x)\n    };\n\n    let (mut input, _) = niffler::from_path(buf.to_str()?)?;\n    let filtered_sigs = Signature::load_signatures(&mut input, k, moltype, None)?;\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashSignature> = filtered_sigs.into_iter().map(|x| {\n      Box::into_raw(Box::new(x)) as *mut SourmashSignature\n    }).collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashSignature)\n}\n}\n\nffi_fn! {\nunsafe fn signatures_load_buffer(ptr: *const c_char,\n                                 insize: usize,\n                                 _ignore_md5sum: bool,\n                                 ksize: usize,\n                                 select_moltype: *const c_char,\n                                 size: *mut usize) -> Result<*mut *mut SourmashSignature> {\n    // FIXME use buffer + len instead of cstr\n    let buf = {\n        assert!(!ptr.is_null());\n        slice::from_raw_parts(ptr as *mut u8, insize)\n    };\n\n    // FIXME take select_moltype as enum\n    let moltype: Option<HashFunctions> = if select_moltype.is_null() {\n          None\n        } else {\n          let mol = CStr::from_ptr(select_moltype).to_str()?;\n          Some(mol.try_into()?)\n    };\n\n    let k = match ksize {\n      0 => None,\n      x => Some(x)\n    };\n\n    // TODO: implement ignore_md5sum\n\n    let mut reader = io::BufReader::new(buf);\n    let filtered_sigs = Signature::load_signatures(&mut reader, k, moltype, None)?;\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashSignature> = filtered_sigs.into_iter().map(|x| {\n      Box::into_raw(Box::new(x)) as *mut SourmashSignature\n    }).collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashSignature)\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/storage.rs",
    "content": "use std::os::raw::c_char;\nuse std::slice;\nuse std::sync::Arc;\n\nuse crate::ffi::utils::{ForeignObject, SourmashStr};\nuse crate::prelude::*;\nuse crate::storage::ZipStorage;\n\npub struct SourmashZipStorage;\n\nimpl ForeignObject for SourmashZipStorage {\n    type RustObject = Arc<ZipStorage>;\n}\n\nffi_fn! {\nunsafe fn zipstorage_new(ptr: *const c_char, insize: usize) -> Result<*mut SourmashZipStorage> {\n    let path = {\n        assert!(!ptr.is_null());\n        let path = slice::from_raw_parts(ptr as *mut u8, insize);\n        std::str::from_utf8(path)?\n    };\n    let zipstorage = ZipStorage::from_file(path)?;\n\n    Ok(SourmashZipStorage::from_rust(Arc::new(zipstorage)))\n}\n}\n\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn zipstorage_free(ptr: *mut SourmashZipStorage) {\n    unsafe { SourmashZipStorage::drop(ptr) };\n}\n\nffi_fn! {\nunsafe fn zipstorage_load(ptr: *const SourmashZipStorage,\n    path_ptr: *const c_char,\n    insize: usize,\n    size: *mut usize) -> Result<*const u8> {\n\n    let storage = SourmashZipStorage::as_rust(ptr);\n\n    let path = {\n        assert!(!path_ptr.is_null());\n        let path = slice::from_raw_parts(path_ptr as *mut u8, insize);\n        std::str::from_utf8(path)?\n    };\n\n    let buffer = storage.load(path)?;\n\n    let b = buffer.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *const u8)\n}\n}\n\nffi_fn! {\nunsafe fn zipstorage_list_sbts(\n    ptr: *const SourmashZipStorage,\n    size: *mut usize,\n) -> Result<*mut *mut SourmashStr> {\n    let storage = SourmashZipStorage::as_rust(ptr);\n\n    let sbts = storage.list_sbts()?;\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashStr> = sbts\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(SourmashStr::from_string(x))))\n        .collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashStr)\n}\n}\n\nffi_fn! {\nunsafe fn zipstorage_filenames(\n    ptr: *const SourmashZipStorage,\n    size: *mut usize,\n) -> Result<*mut *mut SourmashStr> {\n    let storage = SourmashZipStorage::as_rust(ptr);\n\n    let files = storage.filenames()?;\n\n    // FIXME: use the ForeignObject trait, maybe define new method there...\n    let ptr_sigs: Vec<*mut SourmashStr> = files\n        .into_iter()\n        .map(|x| Box::into_raw(Box::new(SourmashStr::from_string(x))))\n        .collect();\n\n    let b = ptr_sigs.into_boxed_slice();\n    *size = b.len();\n\n    Ok(Box::into_raw(b) as *mut *mut SourmashStr)\n}\n}\n\nffi_fn! {\nunsafe fn zipstorage_set_subdir(\n    ptr: *mut SourmashZipStorage,\n    path_ptr: *const c_char,\n    insize: usize,\n) -> Result<()> {\n    let storage = SourmashZipStorage::as_rust_mut(ptr);\n\n    let path = {\n        assert!(!path_ptr.is_null());\n        let path = slice::from_raw_parts(path_ptr as *mut u8, insize);\n        std::str::from_utf8(path)?\n    };\n\n    (*Arc::get_mut(storage).unwrap()).set_subdir(path.to_string());\n    Ok(())\n}\n}\n\nffi_fn! {\nunsafe fn zipstorage_path(ptr: *const SourmashZipStorage) -> Result<SourmashStr> {\n    let storage = SourmashZipStorage::as_rust(ptr);\n\n    if let Some(ref path) = storage.path() {\n        Ok(path.clone().into_string().into())\n    } else {\n        Ok(\"\".into())\n    }\n}\n}\n\nffi_fn! {\nunsafe fn zipstorage_subdir(ptr: *const SourmashZipStorage) -> Result<SourmashStr> {\n    let storage = SourmashZipStorage::as_rust(ptr);\n\n    if let Some(ref path) = storage.subdir() {\n        Ok(path.clone().into())\n    } else {\n        Ok(\"\".into())\n    }\n}\n}\n"
  },
  {
    "path": "src/core/src/ffi/utils.rs",
    "content": "use std::borrow::Cow;\nuse std::cell::RefCell;\nuse std::ffi::CStr;\nuse std::mem;\nuse std::os::raw::c_char;\nuse std::panic;\nuse std::ptr;\nuse std::slice;\nuse std::str;\nuse std::thread;\n\nuse thiserror::Error;\n\nuse crate::Error;\nuse crate::errors::SourmashErrorCode;\n\nthread_local! {\n    pub static LAST_ERROR: RefCell<Option<Error>> = const { RefCell::new(None) };\n}\n\n#[allow(clippy::wrong_self_convention)]\npub trait ForeignObject: Sized {\n    type RustObject;\n\n    #[inline]\n    unsafe fn from_rust(object: Self::RustObject) -> *mut Self {\n        Box::into_raw(Box::new(object)) as *mut Self\n    }\n\n    #[inline]\n    unsafe fn from_ref(object: &Self::RustObject) -> *const Self {\n        object as *const Self::RustObject as *const Self\n    }\n\n    #[inline]\n    unsafe fn as_rust<'a>(pointer: *const Self) -> &'a Self::RustObject {\n        unsafe { &*(pointer as *const Self::RustObject) }\n    }\n\n    #[inline]\n    unsafe fn as_rust_mut<'a>(pointer: *mut Self) -> &'a mut Self::RustObject {\n        unsafe { &mut *(pointer as *mut Self::RustObject) }\n    }\n\n    #[inline]\n    unsafe fn into_rust(pointer: *mut Self) -> Box<Self::RustObject> {\n        unsafe { Box::from_raw(pointer as *mut Self::RustObject) }\n    }\n\n    #[inline]\n    unsafe fn drop(pointer: *mut Self) {\n        if !pointer.is_null() {\n            unsafe { drop(Self::into_rust(pointer)) };\n        }\n    }\n}\n\nmacro_rules! ffi_fn {\n    // a function that catches panics and returns a result (err goes to tls)\n    (\n        $(#[$attr:meta])*\n        unsafe fn $name:ident($($aname:ident: $aty:ty),* $(,)*) -> Result<$rv:ty> $body:block\n    ) => {\n        #[unsafe(no_mangle)]\n        $(#[$attr])*\n        pub unsafe extern \"C\" fn $name($($aname: $aty,)*) -> $rv {\n            unsafe {$crate::ffi::utils::landingpad(|| $body)}\n        }\n    };\n\n    // a function that catches panics and returns nothing (err goes to tls)\n    (\n        $(#[$attr:meta])*\n        unsafe fn $name:ident($($aname:ident: $aty:ty),* $(,)*) $body:block\n    ) => {\n        #[unsafe(no_mangle)]\n        $(#[$attr])*\n        pub unsafe extern \"C\" fn $name($($aname: $aty,)*) {\n            // this silences panics and stuff\n            unsafe {$crate::ffi::utils::landingpad(|| { $body; Ok(0 as std::os::raw::c_int) })};\n        }\n    };\n}\n\n/// An error thrown by `landingpad` in place of panics.\n#[derive(Error, Debug)]\n#[error(\"sourmash panicked: {0}\")]\npub struct Panic(String);\n\n/// Returns the last error message.\n///\n/// If there is no error an empty string is returned.  This allocates new memory\n/// that needs to be freed with `sourmash_str_free`.\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_err_get_last_message() -> SourmashStr {\n    LAST_ERROR.with(|e| {\n        if let Some(ref err) = *e.borrow() {\n            let msg = err.to_string();\n            /* TODO: iter_causes is a failure method\n            for cause in err.iter_causes() {\n                write!(&mut msg, \"\\n  caused by: {}\", cause).ok();\n            }\n            */\n            SourmashStr::from_string(msg)\n        } else {\n            Default::default()\n        }\n    })\n}\n\n/// Returns the panic information as string.\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_err_get_backtrace() -> SourmashStr {\n    /* TODO: bring back when backtrace is available in std::error\n    LAST_ERROR.with(|e| {\n        if let Some(ref error) = *e.borrow() {\n            if let Some(backtrace) = error.backtrace() {\n                use std::fmt::Write;\n                let mut out = String::new();\n                write!(&mut out, \"stacktrace: {}\", backtrace.to_string()).ok();\n                SourmashStr::from_string(out)\n            } else {\n                Default::default()\n            }\n        } else {\n            Default::default()\n        }\n    })\n    */\n    SourmashStr::default()\n}\n\n/// Clears the last error.\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_err_clear() {\n    LAST_ERROR.with(|e| {\n        *e.borrow_mut() = None;\n    });\n}\n\n/// Initializes the library\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_init() {\n    unsafe {\n        set_panic_hook();\n    }\n}\n\n/// Returns the last error code.\n///\n/// If there is no error, 0 is returned.\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_err_get_last_code() -> SourmashErrorCode {\n    LAST_ERROR.with(|e| {\n        if let Some(ref err) = *e.borrow() {\n            SourmashErrorCode::from_error(err)\n        } else {\n            SourmashErrorCode::NoError\n        }\n    })\n}\n\nfn set_last_error(err: Error) {\n    LAST_ERROR.with(|e| {\n        *e.borrow_mut() = Some(err);\n    });\n}\n\npub unsafe fn set_panic_hook() {\n    panic::set_hook(Box::new(|info| {\n        let thread = thread::current();\n        let thread = thread.name().unwrap_or(\"unnamed\");\n\n        let message = match info.payload().downcast_ref::<&str>() {\n            Some(s) => *s,\n            None => match info.payload().downcast_ref::<String>() {\n                Some(s) => &**s,\n                None => \"Box<Any>\",\n            },\n        };\n\n        let description = match info.location() {\n            Some(location) => format!(\n                \"thread '{}' panicked with '{}' at {}:{}\",\n                thread,\n                message,\n                location.file(),\n                location.line()\n            ),\n            None => format!(\"thread '{thread}' panicked with '{message}'\"),\n        };\n\n        set_last_error(Panic(description).into())\n    }));\n}\n\npub unsafe fn landingpad<F, T>(f: F) -> T\nwhere\n    F: FnOnce() -> Result<T, Error> + panic::UnwindSafe,\n{\n    match panic::catch_unwind(f) {\n        Ok(Ok(result)) => result,\n        Ok(Err(err)) => {\n            set_last_error(err);\n            unsafe { mem::zeroed() }\n        }\n        Err(_) => unsafe { mem::zeroed() },\n    }\n}\n\n/// Represents a string.\n#[repr(C)]\npub struct SourmashStr {\n    /// Pointer to the UTF-8 encoded string data.\n    pub data: *mut c_char,\n    /// The length of the string pointed to by `data`.\n    pub len: usize,\n    /// Indicates that the string is owned and must be freed.\n    pub owned: bool,\n}\n\nimpl Default for SourmashStr {\n    fn default() -> SourmashStr {\n        SourmashStr {\n            data: ptr::null_mut(),\n            len: 0,\n            owned: false,\n        }\n    }\n}\n\nimpl SourmashStr {\n    pub fn new(s: &str) -> SourmashStr {\n        SourmashStr {\n            data: s.as_ptr() as *mut c_char,\n            len: s.len(),\n            owned: false,\n        }\n    }\n\n    pub fn from_string(mut s: String) -> SourmashStr {\n        s.shrink_to_fit();\n        let rv = SourmashStr {\n            data: s.as_ptr() as *mut c_char,\n            len: s.len(),\n            owned: true,\n        };\n        mem::forget(s);\n        rv\n    }\n\n    pub unsafe fn free(&mut self) {\n        if self.owned {\n            unsafe { String::from_raw_parts(self.data as *mut _, self.len, self.len) };\n            self.data = ptr::null_mut();\n            self.len = 0;\n            self.owned = false;\n        }\n    }\n\n    pub fn as_str(&self) -> &str {\n        unsafe { str::from_utf8_unchecked(slice::from_raw_parts(self.data as *const _, self.len)) }\n    }\n}\n\nimpl Drop for SourmashStr {\n    fn drop(&mut self) {\n        unsafe { self.free() }\n    }\n}\n\nimpl From<String> for SourmashStr {\n    fn from(string: String) -> SourmashStr {\n        SourmashStr::from_string(string)\n    }\n}\n\nimpl From<&str> for SourmashStr {\n    fn from(string: &str) -> SourmashStr {\n        SourmashStr::new(string)\n    }\n}\n\nimpl<'a> From<Cow<'a, str>> for SourmashStr {\n    fn from(cow: Cow<'a, str>) -> SourmashStr {\n        match cow {\n            Cow::Borrowed(string) => SourmashStr::new(string),\n            Cow::Owned(string) => SourmashStr::from_string(string),\n        }\n    }\n}\n\nffi_fn! {\n    /// Creates a sourmash str from a c string.\n    ///\n    /// This sets the string to owned.  In case it's not owned you either have\n    /// to make sure you are not freeing the memory or you need to set the\n    /// owned flag to false.\n    unsafe fn sourmash_str_from_cstr(s: *const c_char) -> Result<SourmashStr> {\n        let s = CStr::from_ptr(s).to_str()?;\n        Ok(SourmashStr {\n            data: s.as_ptr() as *mut _,\n            len: s.len(),\n            owned: true,\n        })\n    }\n}\n\n/// Frees a sourmash str.\n///\n/// If the string is marked as not owned then this function does not\n/// do anything.\n#[unsafe(no_mangle)]\npub unsafe extern \"C\" fn sourmash_str_free(s: *mut SourmashStr) {\n    if !s.is_null() {\n        unsafe { (*s).free() }\n    }\n}\n\nimpl ForeignObject for SourmashStr {\n    type RustObject = SourmashStr;\n}\n"
  },
  {
    "path": "src/core/src/index/linear.rs",
    "content": "use std::collections::HashSet;\nuse std::sync::atomic::{AtomicUsize, Ordering};\n\nuse camino::Utf8PathBuf as PathBuf;\nuse log::info;\n\n#[cfg(feature = \"parallel\")]\nuse rayon::prelude::*;\n\nuse crate::Result;\nuse crate::collection::CollectionSet;\nuse crate::encodings::Idx;\nuse crate::index::{GatherResult, Index, Selection, SigCounter};\nuse crate::selection::Select;\nuse crate::signature::SigsTrait;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\nuse crate::storage::SigStore;\n\n/// Supports parallel search without a particular index.\npub struct LinearIndex {\n    collection: CollectionSet,\n    template: Sketch,\n}\n\nimpl LinearIndex {\n    pub fn from_collection(collection: CollectionSet) -> Self {\n        let sig = collection.sig_for_dataset(0).unwrap();\n        let template = sig.sketches().swap_remove(0);\n        Self {\n            collection,\n            template,\n        }\n    }\n\n    pub fn sig_for_dataset(&self, dataset_id: Idx) -> Result<SigStore> {\n        self.collection.sig_for_dataset(dataset_id)\n    }\n\n    pub fn collection(&self) -> &CollectionSet {\n        &self.collection\n    }\n\n    pub fn template(&self) -> &Sketch {\n        &self.template\n    }\n\n    pub fn location(&self) -> Option<String> {\n        unimplemented!()\n    }\n\n    pub fn counter_for_query(&self, query: &KmerMinHash) -> SigCounter {\n        let processed_sigs = AtomicUsize::new(0);\n\n        let template = self.template();\n\n        #[cfg(feature = \"parallel\")]\n        let sig_iter = self.collection.par_iter();\n\n        #[cfg(not(feature = \"parallel\"))]\n        let sig_iter = self.collection.iter();\n\n        let counters = sig_iter.filter_map(|(dataset_id, record)| {\n            let filename = record.internal_location();\n\n            let i = processed_sigs.fetch_add(1, Ordering::SeqCst);\n            if i % 1000 == 0 {\n                info!(\"Processed {i} reference sigs\");\n            }\n\n            let search_sig = self\n                .collection\n                .sig_for_dataset(dataset_id)\n                .unwrap_or_else(|_| panic!(\"error loading {filename:?}\"));\n\n            let mut search_mh = None;\n            if let Some(Sketch::MinHash(mh)) = search_sig.select_sketch(template) {\n                search_mh = Some(mh);\n            };\n            let search_mh = search_mh.expect(\"Couldn't find a compatible MinHash\");\n\n            let (large_mh, small_mh) = if query.size() > search_mh.size() {\n                (query, search_mh)\n            } else {\n                (search_mh, query)\n            };\n\n            let (size, _) = small_mh\n                .intersection_size(large_mh)\n                .unwrap_or_else(|_| panic!(\"error computing intersection for {filename:?}\"));\n\n            if size == 0 {\n                None\n            } else {\n                let mut counter: SigCounter = Default::default();\n                counter[&(dataset_id as Idx)] += size as usize;\n                Some(counter)\n            }\n        });\n\n        let reduce_counters = |mut a: SigCounter, b: SigCounter| {\n            a.extend(&b);\n            a\n        };\n\n        #[cfg(feature = \"parallel\")]\n        let counter = counters.reduce(SigCounter::new, reduce_counters);\n\n        #[cfg(not(feature = \"parallel\"))]\n        let counter = counters.fold(SigCounter::new(), reduce_counters);\n\n        counter\n    }\n\n    pub fn search(\n        &self,\n        counter: SigCounter,\n        similarity: bool,\n        threshold: usize,\n    ) -> Result<Vec<String>> {\n        let mut matches = vec![];\n        if similarity {\n            unimplemented!(\"TODO: threshold correction\")\n        }\n\n        for (dataset_id, size) in counter.most_common() {\n            if size >= threshold {\n                matches.push(\n                    self.collection\n                        .record_for_dataset(dataset_id)?\n                        .internal_location()\n                        .to_string(),\n                );\n            } else {\n                break;\n            };\n        }\n        Ok(matches)\n    }\n\n    pub fn gather_round(\n        &self,\n        dataset_id: Idx,\n        match_size: usize,\n        query: &KmerMinHash,\n        round: usize,\n        orig_query: &KmerMinHash,\n    ) -> Result<GatherResult> {\n        let match_path = self\n            .collection\n            .record_for_dataset(dataset_id)?\n            .internal_location()\n            .into();\n        let match_sig = self.collection.sig_for_dataset(dataset_id)?;\n        let result = self.stats_for_match(\n            match_sig,\n            query,\n            match_size,\n            match_path,\n            round as u32,\n            orig_query,\n        )?;\n        Ok(result)\n    }\n\n    fn stats_for_match(\n        &self,\n        match_sig: SigStore,\n        query: &KmerMinHash,\n        match_size: usize,\n        match_path: PathBuf,\n        gather_result_rank: u32,\n        orig_query: &KmerMinHash,\n    ) -> Result<GatherResult> {\n        let template = self.template();\n\n        let mut match_mh = None;\n        if let Some(Sketch::MinHash(mh)) = match_sig.select_sketch(template) {\n            match_mh = Some(mh);\n        }\n        let match_mh = match_mh.expect(\"Couldn't find a compatible MinHash\");\n\n        // Calculate stats\n        let f_orig_query = match_size as f64 / query.size() as f64;\n        let f_match = match_size as f64 / match_mh.size() as f64;\n        let filename = match_path.into_string();\n        let name = match_sig.name();\n        let unique_intersect_bp = (match_mh.scaled() as usize * match_size) as u64;\n\n        let (intersect_hashes, _) = match_mh.intersection_size(query)?;\n        let intersect_bp: u64 = match_mh.scaled() as u64 * intersect_hashes;\n\n        let f_unique_to_query = intersect_hashes as f64 / orig_query.size() as f64;\n        let match_ = match_sig;\n\n        // TODO: all of these\n        let f_unique_weighted = 0.;\n        let average_abund = 0.;\n        let median_abund = 0.;\n        let std_abund = 0.;\n        let md5 = \"\".into();\n        let f_match_orig = 0.;\n        let remaining_bp = 0;\n        let total_weighted_hashes = 0;\n        let n_unique_weighted_found = 0;\n        let query_containment_ani = 0.0;\n        let match_containment_ani = 0.0;\n        let max_containment_ani = 0.0;\n        let average_containment_ani = 0.0;\n        let query_containment_ani_ci_low = None;\n        let query_containment_ani_ci_high = None;\n        let match_containment_ani_ci_low = None;\n        let match_containment_ani_ci_high = None;\n        let sum_weighted_found = 0;\n\n        Ok(GatherResult {\n            intersect_bp,\n            f_orig_query,\n            f_match,\n            f_unique_to_query,\n            f_unique_weighted,\n            average_abund,\n            median_abund,\n            std_abund,\n            filename,\n            name,\n            md5,\n            match_,\n            f_match_orig,\n            unique_intersect_bp,\n            gather_result_rank,\n            remaining_bp,\n            sum_weighted_found,\n            total_weighted_hashes,\n            n_unique_weighted_found,\n            query_containment_ani,\n            query_containment_ani_ci_low,\n            query_containment_ani_ci_high,\n            match_containment_ani,\n            match_containment_ani_ci_low,\n            match_containment_ani_ci_high,\n            max_containment_ani,\n            average_containment_ani,\n        })\n    }\n\n    pub fn gather(\n        &self,\n        mut counter: SigCounter,\n        threshold: usize,\n        orig_query: &KmerMinHash,\n    ) -> std::result::Result<Vec<GatherResult>, Box<dyn std::error::Error>> {\n        let mut query = KmerMinHashBTree::from(orig_query.clone());\n        let mut match_size = usize::MAX;\n        let mut matches = vec![];\n        let template = self.template();\n\n        // iterate over matches, progressively removing intersections from the\n        // counters.\n        while match_size > threshold && !counter.is_empty() {\n            let (dataset_id, size) = counter.most_common()[0];\n            if threshold == 0 && size == 0 {\n                break;\n            }\n\n            match_size = if size >= threshold {\n                size\n            } else {\n                break;\n            };\n\n            let query_mh = KmerMinHash::from(query.clone());\n            let result =\n                self.gather_round(dataset_id, match_size, &query_mh, matches.len(), orig_query)?;\n\n            // Prepare counter for finding the next match by decrementing\n            // all hashes found in the current match in other datasets\n            // TODO: maybe par_iter?\n            let mut to_remove: HashSet<Idx> = Default::default();\n            to_remove.insert(dataset_id);\n\n            // retrieve the match\n            let dataset_sig = self.collection.sig_for_dataset(dataset_id)?;\n            let mut match_mh = None;\n            if let Some(Sketch::MinHash(mh)) = dataset_sig.select_sketch(template) {\n                match_mh = Some(mh);\n            }\n            let match_mh = match_mh.expect(\"Couldn't find a compatible MinHash\");\n\n            let (isect_hashes, _) = match_mh.intersection(&query_mh)?;\n            let mut isect_mh = match_mh.clone();\n            isect_mh.clear();\n            let _ = isect_mh.add_many(&isect_hashes);\n\n            query.remove_many(isect_mh.iter_mins().copied())?;\n\n            // CTB: could redo this entire loop using a CounterGather-style\n            // struct, with peek/consume, I 'spose.\n            for (dataset, value) in counter.iter_mut() {\n                let dataset_sig = self.collection.sig_for_dataset(*dataset)?;\n                let mut match_mh = None;\n                if let Some(Sketch::MinHash(mh)) = dataset_sig.select_sketch(template) {\n                    match_mh = Some(mh);\n                }\n                let match_mh = match_mh.expect(\"Couldn't find a compatible MinHash\");\n\n                // take the intersection of this match with the best\n                // intersection & remove from counter.\n                let (matched_hashes, _) = isect_mh.intersection(match_mh)?;\n                let mut this_isect_mh = match_mh.clone();\n                this_isect_mh.clear();\n                this_isect_mh.add_many(&matched_hashes)?;\n\n                if this_isect_mh.size() > *value {\n                    to_remove.insert(*dataset);\n                } else {\n                    *value -= this_isect_mh.size();\n                };\n            }\n\n            to_remove.iter().for_each(|dataset_id| {\n                counter.remove(dataset_id);\n            });\n            matches.push(result);\n        }\n        Ok(matches)\n    }\n\n    pub fn signatures_iter(&self) -> impl Iterator<Item = SigStore> + '_ {\n        (0..self.collection.len()).map(move |dataset_id| {\n            self.collection\n                .sig_for_dataset(dataset_id as Idx)\n                .expect(\"error loading sig\")\n        })\n    }\n}\n\nimpl Select for LinearIndex {\n    fn select(self, selection: &Selection) -> Result<Self> {\n        let Self {\n            collection,\n            template,\n        } = self;\n        let collection = collection.into_inner().select(selection)?.try_into()?;\n\n        Ok(Self {\n            collection,\n            template,\n        })\n    }\n}\n\nimpl Index<'_> for LinearIndex {\n    type Item = SigStore;\n\n    fn insert(&mut self, _node: Self::Item) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn save<P: AsRef<std::path::Path>>(&self, _path: P) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn load<P: AsRef<std::path::Path>>(_path: P) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn len(&self) -> usize {\n        self.collection.len()\n    }\n\n    fn signatures(&self) -> Vec<Self::Item> {\n        self.collection()\n            .iter()\n            .map(|(i, p)| {\n                self.collection()\n                    .sig_for_dataset(i as Idx)\n                    .unwrap_or_else(|_| panic!(\"Error processing {}\", p.internal_location()))\n            })\n            .collect()\n    }\n\n    fn signature_refs(&self) -> Vec<&Self::Item> {\n        unimplemented!()\n    }\n}\n"
  },
  {
    "path": "src/core/src/index/mod.rs",
    "content": "//! # Indexing structures for fast similarity search\n//!\n//! An index organizes signatures to allow for fast similarity search.\n//! Some indices also support containment searches.\n\npub mod linear;\n\n#[cfg(not(target_arch = \"wasm32\"))]\n#[cfg(feature = \"branchwater\")]\npub mod revindex;\n\npub mod search;\n\nuse std::path::Path;\n\nuse getset::{CopyGetters, Getters, Setters};\nuse log::trace;\nuse serde::{Deserialize, Serialize};\nuse stats::{median, stddev};\nuse typed_builder::TypedBuilder;\n\nuse crate::Error::CannotUpsampleScaled;\nuse crate::Result;\nuse crate::ani_utils::{ani_ci_from_containment, ani_from_containment};\nuse crate::encodings::Idx;\nuse crate::index::search::{search_minhashes, search_minhashes_containment};\nuse crate::prelude::*;\nuse crate::selection::Selection;\nuse crate::signature::SigsTrait;\nuse crate::sketch::minhash::KmerMinHash;\nuse crate::storage::SigStore;\n\n#[derive(TypedBuilder, CopyGetters, Getters, Setters, Serialize, Deserialize, Debug, PartialEq)]\npub struct GatherResult {\n    #[getset(get_copy = \"pub\")]\n    intersect_bp: u64,\n\n    #[getset(get_copy = \"pub\")]\n    f_orig_query: f64,\n\n    #[getset(get_copy = \"pub\")]\n    f_match: f64,\n\n    #[getset(get_copy = \"pub\")]\n    f_unique_to_query: f64,\n\n    #[getset(get_copy = \"pub\")]\n    f_unique_weighted: f64,\n\n    #[getset(get_copy = \"pub\")]\n    average_abund: f64,\n\n    #[getset(get_copy = \"pub\")]\n    median_abund: f64,\n\n    #[getset(get_copy = \"pub\")]\n    std_abund: f64,\n\n    #[getset(get = \"pub\")]\n    filename: String,\n\n    #[getset(get = \"pub\")]\n    name: String,\n\n    #[getset(get = \"pub\")]\n    md5: String,\n\n    #[serde(skip)]\n    match_: SigStore,\n\n    #[getset(get_copy = \"pub\")]\n    f_match_orig: f64,\n\n    #[getset(get_copy = \"pub\")]\n    unique_intersect_bp: u64,\n\n    #[getset(get_copy = \"pub\")]\n    gather_result_rank: u32,\n\n    #[getset(get_copy = \"pub\")]\n    remaining_bp: u64,\n\n    #[getset(get_copy = \"pub\")]\n    n_unique_weighted_found: u64,\n\n    #[getset(get_copy = \"pub\")]\n    total_weighted_hashes: u64,\n\n    #[getset(get_copy = \"pub\")]\n    sum_weighted_found: u64,\n\n    #[getset(get_copy = \"pub\")]\n    query_containment_ani: f64,\n\n    #[getset(get_copy = \"pub\")]\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    query_containment_ani_ci_low: Option<f64>,\n\n    #[getset(get_copy = \"pub\")]\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    query_containment_ani_ci_high: Option<f64>,\n\n    #[getset(get_copy = \"pub\")]\n    match_containment_ani: f64,\n\n    #[getset(get_copy = \"pub\")]\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    match_containment_ani_ci_low: Option<f64>,\n\n    #[getset(get_copy = \"pub\")]\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    match_containment_ani_ci_high: Option<f64>,\n\n    #[getset(get_copy = \"pub\")]\n    average_containment_ani: f64,\n\n    #[getset(get_copy = \"pub\")]\n    max_containment_ani: f64,\n}\n\nimpl GatherResult {\n    pub fn get_match(&self) -> Signature {\n        self.match_.clone().into()\n    }\n}\n\ntype SigCounter = counter::Counter<Idx>;\n\npub trait Index<'a> {\n    type Item: Comparable<Self::Item>;\n    //type SignatureIterator: Iterator<Item = Self::Item>;\n\n    fn find<F>(&self, search_fn: F, sig: &Self::Item, threshold: f64) -> Result<Vec<&Self::Item>>\n    where\n        F: Fn(&dyn Comparable<Self::Item>, &Self::Item, f64) -> bool,\n    {\n        Ok(self\n            .signature_refs()\n            .into_iter()\n            .flat_map(|node| {\n                if search_fn(&node, sig, threshold) {\n                    Some(node)\n                } else {\n                    None\n                }\n            })\n            .collect())\n    }\n\n    fn search(\n        &self,\n        sig: &Self::Item,\n        threshold: f64,\n        containment: bool,\n    ) -> Result<Vec<&Self::Item>> {\n        if containment {\n            self.find(search_minhashes_containment, sig, threshold)\n        } else {\n            self.find(search_minhashes, sig, threshold)\n        }\n    }\n\n    //fn gather(&self, sig: &Self::Item, threshold: f64) -> Result<Vec<&Self::Item>>;\n\n    fn insert(&mut self, node: Self::Item) -> Result<()>;\n\n    fn batch_insert(&mut self, nodes: Vec<Self::Item>) -> Result<()> {\n        for node in nodes {\n            self.insert(node)?;\n        }\n\n        Ok(())\n    }\n\n    fn save<P: AsRef<Path>>(&self, path: P) -> Result<()>;\n\n    fn load<P: AsRef<Path>>(path: P) -> Result<()>;\n\n    fn signatures(&self) -> Vec<Self::Item>;\n\n    fn signature_refs(&self) -> Vec<&Self::Item>;\n\n    fn len(&self) -> usize {\n        self.signature_refs().len()\n    }\n\n    fn is_empty(&self) -> bool {\n        self.len() == 0\n    }\n\n    /*\n    fn iter_signatures(&self) -> Self::SignatureIterator;\n    */\n}\n\nimpl<N, L> Comparable<L> for &N\nwhere\n    N: Comparable<L>,\n{\n    fn similarity(&self, other: &L) -> f64 {\n        (*self).similarity(other)\n    }\n\n    fn containment(&self, other: &L) -> f64 {\n        (*self).containment(other)\n    }\n}\n\n#[allow(clippy::too_many_arguments)]\npub fn calculate_gather_stats(\n    orig_query: &KmerMinHash,\n    remaining_query: KmerMinHash,\n    match_sig: SigStore,\n    match_size: usize,\n    gather_result_rank: u32,\n    sum_weighted_found: u64,\n    total_weighted_hashes: u64,\n    calc_abund_stats: bool,\n    calc_ani_ci: bool,\n    confidence: Option<f64>,\n) -> Result<(GatherResult, (Vec<u64>, u64))> {\n    // get match_mh\n    let match_mh = match_sig.minhash().expect(\"cannot retrieve sketch\");\n\n    // it's ok to downsample match, but query is often big and repeated,\n    // so we do not allow downsampling of query in this function.\n    if match_mh.scaled() > remaining_query.scaled() {\n        return Err(CannotUpsampleScaled);\n    }\n\n    let match_mh = match_mh\n        .clone()\n        .downsample_scaled(remaining_query.scaled())\n        .expect(\"cannot downsample match\");\n\n    // calculate intersection\n    let isect = match_mh\n        .intersection(&remaining_query)\n        .expect(\"could not do intersection\");\n    let isect_size = isect.0.len();\n    trace!(\"isect_size: {isect_size}\");\n    trace!(\"query.size: {}\", remaining_query.size());\n\n    //bp remaining in subtracted query\n    let remaining_bp =\n        (remaining_query.size() - isect_size) as u64 * remaining_query.scaled() as u64;\n\n    // stats for this match vs original query\n    let (intersect_orig, _) = match_mh.intersection_size(orig_query).unwrap();\n    let intersect_bp = match_mh.scaled() as u64 * intersect_orig;\n    let f_orig_query = intersect_orig as f64 / orig_query.size() as f64;\n    let f_match_orig = intersect_orig as f64 / match_mh.size() as f64;\n\n    // stats for this match vs current (subtracted) query\n    let f_match = match_size as f64 / match_mh.size() as f64;\n    let unique_intersect_bp = match_mh.scaled() as u64 * isect_size as u64;\n    let f_unique_to_query = isect_size as f64 / orig_query.size() as f64;\n\n    // // get ANI values\n    let ksize = match_mh.ksize() as f64;\n    let query_containment_ani = ani_from_containment(f_orig_query, ksize);\n    let match_containment_ani = ani_from_containment(f_match_orig, ksize);\n    let mut query_containment_ani_ci_low = None;\n    let mut query_containment_ani_ci_high = None;\n    let mut match_containment_ani_ci_low = None;\n    let mut match_containment_ani_ci_high = None;\n\n    if calc_ani_ci {\n        let n_unique_kmers = match_mh.n_unique_kmers();\n        let (qani_low, qani_high) = ani_ci_from_containment(\n            f_unique_to_query,\n            ksize,\n            match_mh.scaled(),\n            n_unique_kmers,\n            confidence,\n        )?;\n        query_containment_ani_ci_low = Some(qani_low);\n        query_containment_ani_ci_high = Some(qani_high);\n\n        let (mani_low, mani_high) = ani_ci_from_containment(\n            f_match,\n            ksize,\n            match_mh.scaled(),\n            n_unique_kmers,\n            confidence,\n        )?;\n        match_containment_ani_ci_low = Some(mani_low);\n        match_containment_ani_ci_high = Some(mani_high);\n    }\n\n    let average_containment_ani = (query_containment_ani + match_containment_ani) / 2.0;\n    let max_containment_ani = f64::max(query_containment_ani, match_containment_ani);\n\n    // set up non-abundance weighted values\n    let mut f_unique_weighted = f_unique_to_query;\n    let mut average_abund = 1.0;\n    let mut median_abund = 1.0;\n    let mut std_abund = 0.0;\n    // should these default to the unweighted numbers?\n    let mut n_unique_weighted_found = 0;\n    let mut sum_total_weighted_found = 0;\n\n    // If abundance, calculate abund-related metrics (vs current query)\n    if calc_abund_stats {\n        // take abunds from subtracted query\n        let (abunds, unique_weighted_found) = match match_mh.inflated_abundances(&remaining_query) {\n            Ok((abunds, unique_weighted_found)) => (abunds, unique_weighted_found),\n            Err(e) => {\n                return Err(e);\n            }\n        };\n\n        n_unique_weighted_found = unique_weighted_found;\n        sum_total_weighted_found = sum_weighted_found + n_unique_weighted_found;\n        f_unique_weighted = n_unique_weighted_found as f64 / total_weighted_hashes as f64;\n\n        average_abund = n_unique_weighted_found as f64 / abunds.len() as f64;\n\n        // todo: try to avoid clone for these?\n        median_abund = median(abunds.iter().cloned()).unwrap();\n        std_abund = stddev(abunds.iter().cloned());\n    }\n\n    let result = GatherResult::builder()\n        .intersect_bp(intersect_bp)\n        .f_orig_query(f_orig_query)\n        .f_match(f_match)\n        .f_unique_to_query(f_unique_to_query)\n        .f_unique_weighted(f_unique_weighted)\n        .average_abund(average_abund)\n        .median_abund(median_abund)\n        .std_abund(std_abund)\n        .filename(match_sig.filename())\n        .name(match_sig.name())\n        .md5(match_sig.md5sum())\n        .match_(match_sig)\n        .f_match_orig(f_match_orig)\n        .unique_intersect_bp(unique_intersect_bp)\n        .gather_result_rank(gather_result_rank)\n        .remaining_bp(remaining_bp)\n        .n_unique_weighted_found(n_unique_weighted_found)\n        .query_containment_ani(query_containment_ani)\n        .query_containment_ani_ci_low(query_containment_ani_ci_low)\n        .query_containment_ani_ci_high(query_containment_ani_ci_high)\n        .match_containment_ani_ci_low(match_containment_ani_ci_low)\n        .match_containment_ani_ci_high(match_containment_ani_ci_high)\n        .match_containment_ani(match_containment_ani)\n        .average_containment_ani(average_containment_ani)\n        .max_containment_ani(max_containment_ani)\n        .sum_weighted_found(sum_total_weighted_found)\n        .total_weighted_hashes(total_weighted_hashes)\n        .build();\n    Ok((result, isect))\n}\n\n#[cfg(test)]\nmod test_calculate_gather_stats {\n    use super::*;\n    use crate::cmd::ComputeParameters;\n    use crate::encodings::HashFunctions;\n    use crate::signature::Signature;\n    use crate::sketch::Sketch;\n    use crate::sketch::minhash::KmerMinHash;\n    // use std::f64::EPSILON;\n    // TODO: use f64::EPSILON when we bump MSRV\n    const EPSILON: f64 = 0.01;\n\n    #[test]\n    fn test_calculate_gather_stats() {\n        let scaled = 10;\n        let params = ComputeParameters::builder()\n            .ksizes(vec![31])\n            .scaled(scaled)\n            .build();\n\n        let mut match_sig = Signature::from_params(&params);\n        // create two minhash\n        let mut match_mh = KmerMinHash::new(scaled, 31, HashFunctions::Murmur64Dna, 42, true, 0);\n        match_mh.add_hash_with_abundance(1, 5);\n        match_mh.add_hash_with_abundance(3, 3);\n        match_mh.add_hash_with_abundance(5, 2);\n        match_mh.add_hash_with_abundance(8, 2);\n        match_mh.add_hash_with_abundance(11, 2); // Non-matching hash\n\n        match_sig.reset_sketches();\n        match_sig.push(Sketch::MinHash(match_mh.clone()));\n        match_sig.set_filename(\"match-filename\");\n        match_sig.set_name(\"match-name\");\n\n        eprintln!(\"num_sketches: {:?}\", match_sig.size());\n        eprintln!(\"match_md5: {:?}\", match_sig.md5sum());\n\n        // Setup orig_query minhash with abundances and non-matching hash\n        let mut orig_query = KmerMinHash::new(scaled, 31, HashFunctions::Murmur64Dna, 42, true, 0);\n        orig_query.add_hash_with_abundance(1, 3);\n        orig_query.add_hash_with_abundance(3, 2);\n        orig_query.add_hash_with_abundance(5, 1);\n        orig_query.add_hash_with_abundance(6, 1); // Non-matching hash\n        orig_query.add_hash_with_abundance(8, 1);\n        orig_query.add_hash_with_abundance(10, 1); // Non-matching hash\n\n        let query = orig_query.clone();\n        let total_weighted_hashes = orig_query.sum_abunds();\n\n        let match_size = 4;\n        let gather_result_rank = 0;\n        let calc_abund_stats = true;\n        let calc_ani_ci = false;\n        let (result, _isect) = calculate_gather_stats(\n            &orig_query,\n            query,\n            match_sig.into(),\n            match_size,\n            gather_result_rank,\n            0,\n            total_weighted_hashes.try_into().unwrap(),\n            calc_abund_stats,\n            calc_ani_ci,\n            None,\n        )\n        .unwrap();\n\n        // first, print all results\n        assert_eq!(result.filename(), \"match-filename\");\n        assert_eq!(result.name(), \"match-name\");\n        assert_eq!(result.md5(), \"f54b271a62fb7e2856e7b8a33e741b6e\");\n        assert_eq!(result.gather_result_rank, 0);\n        assert_eq!(result.remaining_bp, 20);\n\n        // results from match vs current query\n        assert_eq!(result.f_match, 0.8);\n        assert_eq!(result.unique_intersect_bp, 40);\n        assert_eq!(result.f_unique_to_query, 4.0 / 6.0);\n        eprintln!(\"{}\", result.f_unique_weighted);\n        assert_eq!(result.f_unique_weighted, 7. / 9.);\n        assert_eq!(result.average_abund, 1.75);\n        assert_eq!(result.median_abund, 1.5);\n        assert_eq!(result.std_abund, 0.82915619758885);\n\n        // results from match vs orig_query\n        assert_eq!(result.intersect_bp, 40);\n        assert_eq!(result.f_orig_query, 4.0 / 6.0);\n        assert_eq!(result.f_match_orig, 4.0 / 5.0);\n\n        assert!((result.average_containment_ani - 0.98991665567826).abs() < EPSILON);\n        assert!((result.match_containment_ani - 0.9928276657672302).abs() < EPSILON);\n        assert!((result.query_containment_ani - 0.9870056455892898).abs() < EPSILON);\n        assert!((result.max_containment_ani - 0.9928276657672302).abs() < EPSILON);\n\n        assert_eq!(result.total_weighted_hashes, 9);\n        assert_eq!(result.n_unique_weighted_found, 7);\n        assert_eq!(result.sum_weighted_found, 7);\n    }\n}\n"
  },
  {
    "path": "src/core/src/index/revindex/disk_revindex.rs",
    "content": "use std::cmp::max;\nuse std::collections::HashSet;\nuse std::hash::{BuildHasher, BuildHasherDefault};\nuse std::path::Path;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, RwLock};\n\nuse byteorder::{LittleEndian, WriteBytesExt};\nuse log::{info, trace};\nuse rayon::prelude::*;\nuse rocksdb::MergeOperands;\n\nuse crate::Result;\nuse crate::collection::{Collection, CollectionSet};\nuse crate::encodings::{Color, Idx};\nuse crate::index::revindex::{\n    self as module, CounterGather, DatasetPicklist, Datasets, DbStats, QueryColors, RevIndexOps,\n    stats_for_cf,\n};\nuse crate::index::{GatherResult, SigCounter, calculate_gather_stats};\nuse crate::manifest::Manifest;\nuse crate::prelude::*;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\nuse crate::storage::{\n    InnerStorage, RocksDBStorage, Storage,\n    rocksdb::{ALL_CFS, DB, HASHES, METADATA, cf_descriptors, db_options},\n};\n\nconst DB_VERSION: u8 = 1;\n\n// DB metadata saved in the METADATA column family\nconst MANIFEST: &str = \"manifest\";\nconst STORAGE_SPEC: &str = \"storage_spec\";\nconst VERSION: &str = \"version\";\nconst PROCESSED: &str = \"processed\";\n\nfn compute_color(idxs: &Datasets) -> Color {\n    let s = BuildHasherDefault::<crate::encodings::Xxh3Hash128>::default();\n    s.hash_one(idxs)\n}\n\n#[derive(Clone)]\npub struct DiskRevIndex {\n    location: String,\n    db: Arc<DB>,\n    collection: Arc<CollectionSet>,\n    processed: Arc<RwLock<Datasets>>,\n}\n\npub(crate) fn merge_datasets(\n    _: &[u8],\n    existing_val: Option<&[u8]>,\n    operands: &MergeOperands,\n) -> Option<Vec<u8>> {\n    let mut datasets = match existing_val {\n        Some(val) => Datasets::from_slice(val).expect(\"cannot unpack slice\"),\n        None => Default::default(),\n    };\n\n    for op in operands {\n        let new_vals = Datasets::from_slice(op).unwrap();\n        datasets.union(new_vals);\n    }\n    // TODO: optimization! if nothing changed, skip as_bytes()\n    datasets.as_bytes()\n}\n\n/* TODO: need the repair_cf variant, not available in rocksdb-rust yet\npub fn repair(path: &Path) {\n    let opts = db_options();\n\n    DB::repair(&opts, path).unwrap()\n}\n*/\n\nimpl DiskRevIndex {\n    pub fn create(path: &Path, collection: CollectionSet) -> Result<module::RevIndex> {\n        let mut opts = db_options();\n        opts.create_if_missing(true);\n        opts.create_missing_column_families(true);\n\n        // prepare column family descriptors\n        let cfs = cf_descriptors();\n\n        let db = Arc::new(DB::open_cf_descriptors(&opts, path, cfs).unwrap());\n\n        let processed_sigs = AtomicUsize::new(0);\n\n        let collection = Arc::new(collection);\n        let processed = Arc::new(RwLock::new(Self::load_processed(\n            db.clone(),\n            collection.clone(),\n            true,\n        )?));\n\n        let index = Self {\n            location: String::from(path.to_str().expect(\"cannot extract path\")),\n            db,\n            collection,\n            processed: processed.clone(),\n        };\n\n        index.collection.par_iter().for_each(|(dataset_id, _)| {\n            // check if this dataset_id was processed already\n            // call map_hashes_colors only if not already processed\n            if !processed.read().unwrap().contains(&dataset_id) {\n                let i = processed_sigs.fetch_add(1, Ordering::SeqCst);\n                if i % 1000 == 0 {\n                    info!(\"Processed {} reference sigs\", i);\n                }\n\n                index.map_hashes_colors(dataset_id as Idx);\n\n                // if cached in a new field in the RevIndex,\n                // then update the cache too\n\n                processed.write().unwrap().extend([dataset_id]);\n            }\n        });\n\n        index.save_collection().expect(\"Error saving collection\");\n\n        info!(\"Compact SSTs\");\n        index.compact();\n        info!(\n            \"Done! Processed {} reference sigs\",\n            processed_sigs.into_inner()\n        );\n\n        Ok(module::RevIndex::Disk(index))\n    }\n\n    pub fn open<P: AsRef<Path>>(\n        path: P,\n        read_only: bool,\n        storage_spec: Option<&str>,\n    ) -> Result<module::RevIndex> {\n        let mut opts = db_options();\n        opts.create_if_missing(true);\n        opts.create_missing_column_families(true);\n\n        // prepare column family descriptors\n        let cfs = cf_descriptors();\n\n        let db = if read_only {\n            Arc::new(DB::open_cf_descriptors_read_only(\n                &opts,\n                path.as_ref(),\n                cfs,\n                false,\n            )?)\n        } else {\n            Arc::new(DB::open_cf_descriptors(&opts, path.as_ref(), cfs)?)\n        };\n\n        let collection = Arc::new(Self::load_collection_from_rocksdb(\n            db.clone(),\n            storage_spec,\n        )?);\n\n        let processed = Arc::new(RwLock::new(Self::load_processed(\n            db.clone(),\n            collection.clone(),\n            false,\n        )?));\n\n        Ok(module::RevIndex::Disk(Self {\n            location: String::from(path.as_ref().to_str().expect(\"cannot extract path\")),\n            db,\n            collection,\n            processed,\n        }))\n    }\n\n    /// Access to the DB is unsafe because RocksDB allows writing with\n    /// a regular Arc<DB> handle; it doesn't have to be mut.\n    ///\n    /// # Safety\n    ///\n    /// this is a escape hatch, avoid modifying the database and only use\n    /// as last resort.\n    pub unsafe fn db(&self) -> Arc<DB> {\n        self.db.clone()\n    }\n\n    fn load_processed(\n        db: Arc<DB>,\n        collection: Arc<CollectionSet>,\n        assume_empty: bool,\n    ) -> Result<Datasets> {\n        let cf_metadata = db.cf_handle(METADATA).unwrap();\n        if let Some(rdr) = db.get_pinned_cf(&cf_metadata, PROCESSED)? {\n            // convert rdr to Datasets\n            Datasets::from_slice(&rdr)\n        } else if assume_empty {\n            Ok(Datasets::default())\n        } else {\n            let all_datasets: Vec<_> = (0..collection.manifest().len()).map(|v| v as Idx).collect();\n            Ok(Datasets::new(&all_datasets))\n        }\n    }\n\n    fn load_collection_from_rocksdb(\n        db: Arc<DB>,\n        storage_spec: Option<&str>,\n    ) -> Result<CollectionSet> {\n        let cf_metadata = db.cf_handle(METADATA).unwrap();\n\n        let rdr = db.get_cf(&cf_metadata, VERSION)?.unwrap();\n        assert_eq!(rdr[0], DB_VERSION);\n\n        let rdr = db.get_cf(&cf_metadata, MANIFEST)?.unwrap();\n        let manifest = Manifest::from_reader(&rdr[..])?;\n\n        let spec = match storage_spec {\n            Some(spec) => spec.into(),\n            None => {\n                let db_spec = db.get_cf(&cf_metadata, STORAGE_SPEC)?;\n                String::from_utf8(db_spec.unwrap()).map_err(|e| e.utf8_error())?\n            }\n        };\n\n        let storage = if spec == \"rocksdb://\" {\n            InnerStorage::new(RocksDBStorage::from_db(db.clone()))\n        } else {\n            InnerStorage::from_spec(spec)?\n        };\n\n        Collection::new(manifest, storage).try_into()\n    }\n\n    fn save_collection(&self) -> Result<()> {\n        let cf_metadata = self.db.cf_handle(METADATA).unwrap();\n\n        // save DB version\n        // TODO: probably should go together with a more general\n        //       saving procedure used in create/update\n        self.db.put_cf(&cf_metadata, VERSION, [DB_VERSION])?;\n\n        // write manifest\n        let mut wtr = vec![];\n        {\n            self.collection.manifest().to_writer(&mut wtr)?;\n        }\n        self.db.put_cf(&cf_metadata, MANIFEST, &wtr[..])?;\n\n        // write storage spec\n        let spec = self.collection.storage().spec();\n\n        // TODO: check if spec if memstorage, would probably have to\n        // save into rocksdb in that case!\n\n        self.db.put_cf(&cf_metadata, STORAGE_SPEC, spec)?;\n\n        Ok(())\n    }\n\n    fn map_hashes_colors(&self, dataset_id: Idx) {\n        let search_sig = self\n            .collection\n            .sig_for_dataset(dataset_id)\n            .expect(\"Couldn't find a compatible Signature\");\n        let search_mh = &search_sig.sketches()[0];\n\n        let colors = Datasets::new(&[dataset_id]).as_bytes().unwrap();\n\n        let cf_hashes = self.db.cf_handle(HASHES).unwrap();\n\n        let hashes = match search_mh {\n            Sketch::MinHash(mh) => mh.mins(),\n            Sketch::LargeMinHash(mh) => mh.mins(),\n            _ => unimplemented!(),\n        };\n\n        let mut hash_bytes = [0u8; 8];\n        for hash in hashes {\n            (&mut hash_bytes[..])\n                .write_u64::<LittleEndian>(hash)\n                .expect(\"error writing bytes\");\n            self.db\n                .merge_cf(&cf_hashes, &hash_bytes[..], colors.as_slice())\n                .expect(\"error merging\");\n        }\n\n        // finished processing this dataset,\n        // do a merge_cf in the PROCESSED key in metadata\n        // to account for that.\n        let cf_metadata = self.db.cf_handle(METADATA).unwrap();\n        self.db\n            .merge_cf(&cf_metadata, PROCESSED, colors.as_slice())\n            .expect(\"error merging\");\n    }\n}\n\nimpl RevIndexOps for DiskRevIndex {\n    fn location(&self) -> &str {\n        self.location.as_str()\n    }\n\n    fn counter_for_query(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> SigCounter {\n        info!(\"Collecting hashes\");\n        let cf_hashes = self.db.cf_handle(HASHES).unwrap();\n        let hashes_iter = query.iter_mins().map(|hash| {\n            let mut v = vec![0_u8; 8];\n            (&mut v[..])\n                .write_u64::<LittleEndian>(*hash)\n                .expect(\"error writing bytes\");\n            (&cf_hashes, v)\n        });\n\n        info!(\"Multi get\");\n        self.db\n            .multi_get_cf(hashes_iter)\n            .into_iter()\n            .filter_map(|r| r.ok().unwrap_or(None))\n            .flat_map(|raw_datasets| {\n                let new_vals = Datasets::from_slice(&raw_datasets).unwrap();\n\n                // filter against picklist if need be.\n                if let Some(pl) = &picklist {\n                    let new_vals: HashSet<_> = new_vals\n                        .into_iter()\n                        .filter(|&i| pl.dataset_ids.contains(&i))\n                        .collect();\n                    Box::new(new_vals.into_iter())\n                } else {\n                    new_vals.into_iter()\n                }\n            })\n            .collect()\n    }\n\n    fn prepare_gather_counters(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> CounterGather {\n        let cf_hashes = self.db.cf_handle(HASHES).unwrap();\n        let hashes_iter = query.iter_mins().map(|hash| {\n            let mut v = vec![0_u8; 8];\n            (&mut v[..])\n                .write_u64::<LittleEndian>(*hash)\n                .expect(\"error writing bytes\");\n            (&cf_hashes, v)\n        });\n\n        /*\n         build a HashToColors for query,\n         and a QueryColors (Color -> Datasets) mapping.\n         Loading Datasets from rocksdb for every hash takes too long.\n        */\n        let mut query_colors: QueryColors = Default::default();\n        let mut counter: SigCounter = Default::default();\n\n        info!(\"Building hash_to_color and query_colors\");\n        let hash_to_color = query\n            .iter_mins()\n            .zip(self.db.multi_get_cf(hashes_iter))\n            .filter_map(|(k, r)| {\n                let raw: Option<Vec<u8>> = r.ok().unwrap_or(None);\n\n                if let Some(r) = raw {\n                    let mut new_vals = Datasets::from_slice(&r).unwrap();\n\n                    // filter by picklist?\n                    if let Some(pl) = &picklist {\n                        let val_set: Vec<Idx> = new_vals\n                            .into_iter()\n                            .filter(|&i| pl.dataset_ids.contains(&i))\n                            .collect();\n                        new_vals = Datasets::new(&val_set[..]);\n                    }\n\n                    if !new_vals.is_empty() {\n                        let color = compute_color(&new_vals);\n                        query_colors\n                            .entry(color)\n                            .or_insert_with(|| new_vals.clone());\n                        counter.update(new_vals);\n                        Some((*k, color))\n                    } else {\n                        None\n                    }\n                } else {\n                    None\n                }\n            })\n            .collect();\n\n        CounterGather {\n            counter,\n            query_colors,\n            hash_to_color,\n        }\n    }\n\n    fn gather(\n        &self,\n        mut cg: CounterGather,\n        threshold: usize,\n        orig_query: &KmerMinHash,\n        selection: Option<Selection>,\n    ) -> Result<Vec<GatherResult>> {\n        let match_size = usize::MAX;\n        let mut matches = vec![];\n        let mut query = KmerMinHashBTree::from(orig_query.clone());\n        let mut sum_weighted_found = 0;\n        let _selection = selection.unwrap_or_else(|| self.collection.selection());\n        let total_weighted_hashes = orig_query.sum_abunds();\n\n        // or set this with user --track-abundance?\n        let calc_abund_stats = orig_query.track_abundance();\n\n        // todo: let user pass these options in\n        let calc_ani_ci = false;\n        let ani_confidence_interval_fraction = None;\n\n        while match_size > threshold && !cg.is_empty() {\n            trace!(\"counter len: {}\", cg.len());\n            trace!(\"match size: {}\", match_size);\n\n            let result = cg.peek(threshold);\n            if result.is_none() {\n                break;\n            }\n            let (dataset_id, match_size) = result.unwrap();\n\n            let match_sig = self.collection.sig_for_dataset(dataset_id)?;\n            let match_mh = match_sig.minhash().unwrap().clone();\n\n            // make downsampled minhashes\n            let max_scaled = max(match_mh.scaled(), query.scaled());\n\n            let match_mh = match_mh\n                .downsample_scaled(max_scaled)\n                .expect(\"cannot downsample match\");\n\n            // repeatedly downsample query, then extract to KmerMinHash\n            // => calculate_gather_stats\n            query = query\n                .downsample_scaled(max_scaled)\n                .expect(\"cannot downsample query\");\n            let query_mh = KmerMinHash::from(query.clone());\n\n            // just calculate essentials here\n            let gather_result_rank = matches.len() as u32;\n\n            // grab the specific intersection:\n            // Calculate stats\n            let (gather_result, isect) = calculate_gather_stats(\n                orig_query,\n                query_mh,\n                match_sig,\n                match_size,\n                gather_result_rank,\n                sum_weighted_found,\n                total_weighted_hashes,\n                calc_abund_stats,\n                calc_ani_ci,\n                ani_confidence_interval_fraction,\n            )\n            .expect(\"could not calculate gather stats\");\n\n            // use intersection from calc_gather_stats to make a KmerMinHash.\n            let mut isect_mh = match_mh.clone();\n            isect_mh.clear();\n            isect_mh.add_many(&isect.0)?;\n\n            // keep track of the sum weighted found\n            sum_weighted_found = gather_result.sum_weighted_found();\n            matches.push(gather_result);\n\n            trace!(\"Preparing counter for next round\");\n            // Prepare counter for finding the next match by decrementing\n            // all hashes found in the current match in other datasets\n            // TODO: not used at the moment, so just skip.\n            query.remove_many(isect_mh.iter_mins().copied())?; // is there a better way?\n\n            cg.consume(&isect_mh);\n        }\n        Ok(matches)\n    }\n\n    fn update(mut self, collection: CollectionSet) -> Result<module::RevIndex> {\n        // TODO: verify new collection manifest is a superset of current one,\n        //       and the initial chunk is the same\n        self.collection.check_superset(&collection)?;\n        info!(\"sigs in the original index: {}\", self.collection.len());\n\n        self.collection = Arc::new(collection);\n        info!(\n            \"sigs in the new index once finished: {}\",\n            self.collection.len()\n        );\n\n        let processed = self.processed.clone();\n        info!(\n            \"sigs left to process: {}\",\n            self.collection.len() - processed.read().unwrap().len()\n        );\n\n        // process the remainder\n        let processed_sigs = AtomicUsize::new(0);\n\n        self.collection.par_iter().for_each(|(dataset_id, _)| {\n            // check if this dataset_id was processed already\n            // call map_hashes_colors only if not already processed\n            if !processed.read().unwrap().contains(&dataset_id) {\n                let i = processed_sigs.fetch_add(1, Ordering::SeqCst);\n                if i % 1000 == 0 {\n                    info!(\"Processed {} reference sigs\", i);\n                }\n\n                self.map_hashes_colors(dataset_id as Idx);\n\n                // if cached in a new field in the RevIndex,\n                // then update the cache too\n\n                processed.write().unwrap().extend([dataset_id]);\n            }\n        });\n\n        self.save_collection().expect(\"Error saving collection\");\n\n        info!(\"Compact SSTs\");\n        self.compact();\n\n        info!(\n            \"Processed additional {} reference sigs\",\n            processed_sigs.into_inner()\n        );\n\n        Ok(module::RevIndex::Disk(self))\n    }\n\n    fn check(&self, quick: bool) -> DbStats {\n        stats_for_cf(self.db.clone(), HASHES, true, quick)\n    }\n\n    fn compact(&self) {\n        for cf_name in ALL_CFS {\n            let cf = self.db.cf_handle(cf_name).unwrap();\n            self.db.compact_range_cf(&cf, None::<&[u8]>, None::<&[u8]>)\n        }\n    }\n\n    fn flush(&self) -> Result<()> {\n        self.db.flush_wal(true)?;\n\n        for cf_name in [HASHES, METADATA] {\n            let cf = self.db.cf_handle(cf_name).unwrap();\n            self.db.flush_cf(&cf)?;\n        }\n\n        Ok(())\n    }\n\n    fn collection(&self) -> &CollectionSet {\n        &self.collection\n    }\n\n    fn internalize_storage(&mut self) -> Result<()> {\n        // check if collection is already internal, if so return\n        if self.collection.storage().spec() == \"rocksdb://\" {\n            return Ok(());\n        }\n\n        // build new rocksdb storage from db\n        let new_storage = RocksDBStorage::from_db(self.db.clone());\n\n        // use manifest to copy from current storage to new one\n        self.collection()\n            .par_iter()\n            .try_for_each(|(_, record)| -> Result<()> {\n                let path = record.internal_location().as_str();\n                let sig_data = self.collection.storage().load(path).unwrap();\n                new_storage.save(path, &sig_data)?;\n                Ok(())\n            })?;\n\n        // Replace storage for collection.\n        // Using unchecked version because we just used the manifest\n        // above to make sure the storage is still consistent\n        unsafe {\n            if let Some(v) = Arc::get_mut(&mut self.collection) {\n                v.set_storage_unchecked(InnerStorage::new(new_storage))\n            }\n        }\n\n        // write storage spec\n        let cf_metadata = self.db.cf_handle(METADATA).unwrap();\n        let spec = \"rocksdb://\";\n        self.db.put_cf(&cf_metadata, STORAGE_SPEC, spec)?;\n\n        Ok(())\n    }\n\n    fn convert(&self, _output_db: module::RevIndex) -> Result<()> {\n        todo!()\n        /*\n        if let RevIndex::Color(db) = output_db {\n            let other_db = db.db;\n\n            let cf_hashes = self.db.cf_handle(HASHES).unwrap();\n\n            info!(\"start converting colors\");\n            let mut color_bytes = [0u8; 8];\n            let iter = self\n                .db\n                .iterator_cf(&cf_hashes, rocksdb::IteratorMode::Start);\n            for (key, value) in iter {\n                let datasets = Datasets::from_slice(&value).unwrap();\n                let new_idx: Vec<_> = datasets.into_iter().collect();\n                let new_color = Colors::update(other_db.clone(), None, new_idx.as_slice()).unwrap();\n\n                (&mut color_bytes[..])\n                    .write_u64::<LittleEndian>(new_color)\n                    .expect(\"error writing bytes\");\n                other_db\n                    .put_cf(&cf_hashes, &key[..], &color_bytes[..])\n                    .unwrap();\n            }\n            info!(\"finished converting colors\");\n\n            info!(\"copying sigs to output\");\n            let cf_sigs = self.db.cf_handle(SIGS).unwrap();\n            let iter = self.db.iterator_cf(&cf_sigs, rocksdb::IteratorMode::Start);\n            for (key, value) in iter {\n                other_db.put_cf(&cf_sigs, &key[..], &value[..]).unwrap();\n            }\n            info!(\"finished copying sigs to output\");\n\n            Ok(())\n        } else {\n            todo!()\n        }\n        */\n    }\n    fn find_signatures(\n        &self,\n        query_mh: &KmerMinHash,\n        threshold: f64,\n        picklist: Option<DatasetPicklist>,\n    ) -> Result<Vec<(f64, Signature, String)>> {\n        // do search\n        let counter = self.counter_for_query(query_mh, picklist);\n\n        // retrieve/convert matches. I don't think there's a simple way to\n        // truncate this without going through all the matches, so it's\n        // potentially (much) more expensive than prefetch.\n        let filename = self.location();\n        let results: Vec<(f64, Signature, String)> = counter\n            .most_common()\n            .into_iter()\n            .filter_map(|(dataset_id, _size)| {\n                let sig: Signature = self\n                    .collection()\n                    .sig_for_dataset(dataset_id)\n                    .expect(\"dataset not found\")\n                    .into();\n\n                let match_mh = sig.minhash().expect(\"cannot retrieve match\");\n\n                let f_match = if match_mh.scaled() != query_mh.scaled() {\n                    let match_ds = match_mh\n                        .clone()\n                        .downsample_scaled(query_mh.scaled())\n                        .expect(\"cannot downsample\");\n                    query_mh\n                        .jaccard(&match_ds)\n                        .expect(\"cannot calculate Jaccard\")\n                } else {\n                    query_mh\n                        .jaccard(match_mh)\n                        .expect(\"cannot calculate Jaccard\")\n                };\n\n                if f_match >= threshold {\n                    Some((f_match, sig, filename.to_owned()))\n                } else {\n                    None\n                }\n            })\n            .collect();\n\n        Ok(results)\n    }\n}\n"
  },
  {
    "path": "src/core/src/index/revindex/mem_revindex.rs",
    "content": "use std::sync::atomic::{AtomicUsize, Ordering};\n\nuse camino::Utf8Path as Path;\nuse camino::Utf8PathBuf as PathBuf;\nuse log::{debug, info};\n\n#[cfg(feature = \"parallel\")]\nuse rayon::prelude::*;\n\nuse crate::Result;\nuse crate::ScaledType;\nuse crate::collection::Collection;\nuse crate::collection::CollectionSet;\nuse crate::encodings::{Colors, Idx};\nuse crate::index::linear::LinearIndex;\nuse crate::index::revindex::{\n    self as module, CounterGather, DatasetPicklist, Datasets, DbStats, HashToColor, QueryColors,\n    RevIndexOps,\n};\nuse crate::index::{GatherResult, Index, SigCounter};\nuse crate::prelude::*;\nuse crate::signature::{Signature, SigsTrait};\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\n\npub struct MemRevIndex {\n    linear: LinearIndex,\n    hash_to_color: HashToColor,\n    colors: Colors,\n}\n\nimpl LinearIndex {\n    fn index(\n        self,\n        threshold: usize,\n        merged_query: Option<KmerMinHash>,\n        queries: Option<&[KmerMinHash]>,\n    ) -> MemRevIndex {\n        let processed_sigs = AtomicUsize::new(0);\n\n        #[cfg(feature = \"parallel\")]\n        let sig_iter = self.collection().par_iter();\n\n        #[cfg(not(feature = \"parallel\"))]\n        let sig_iter = self.collection().iter();\n\n        let filtered_sigs = sig_iter.enumerate().filter_map(|(dataset_id, _)| {\n            let i = processed_sigs.fetch_add(1, Ordering::SeqCst);\n            if i % 1000 == 0 {\n                info!(\"Processed {} reference sigs\", i);\n            }\n\n            let search_sig = self\n                .collection()\n                .sig_for_dataset(dataset_id as Idx)\n                .expect(\"Error loading sig\")\n                .into();\n\n            MemRevIndex::map_hashes_colors(\n                dataset_id as Idx,\n                &search_sig,\n                queries,\n                &merged_query,\n                threshold,\n                self.template(),\n            )\n        });\n\n        #[cfg(feature = \"parallel\")]\n        let (hash_to_color, colors) = filtered_sigs.reduce(\n            || (HashToColor::new(), Colors::default()),\n            HashToColor::reduce_hashes_colors,\n        );\n\n        #[cfg(not(feature = \"parallel\"))]\n        let (hash_to_color, colors) = filtered_sigs.fold(\n            (HashToColor::new(), Colors::default()),\n            HashToColor::reduce_hashes_colors,\n        );\n\n        MemRevIndex {\n            hash_to_color,\n            colors,\n            linear: self,\n        }\n    }\n}\n\nimpl MemRevIndex {\n    #[allow(clippy::new_ret_no_self)]\n    pub fn new(\n        search_sigs: &[PathBuf],\n        selection: &Selection,\n        threshold: usize,\n        queries: Option<&[KmerMinHash]>,\n    ) -> Result<module::RevIndex> {\n        // If threshold is zero, let's merge all queries and save time later\n        let merged_query = queries.and_then(|qs| Self::merge_queries(qs, threshold));\n\n        let collection = Collection::from_paths(search_sigs)?.select(selection)?;\n        let linear = LinearIndex::from_collection(collection.try_into()?);\n\n        let idx = linear.index(threshold, merged_query, queries);\n\n        Ok(module::RevIndex::Mem(idx))\n    }\n\n    pub fn from_zipfile<P: AsRef<Path>>(\n        zipfile: P,\n        selection: &Selection,\n        threshold: usize,\n        queries: Option<&[KmerMinHash]>,\n    ) -> Result<module::RevIndex> {\n        // If threshold is zero, let's merge all queries and save time later\n        let merged_query = queries.and_then(|qs| Self::merge_queries(qs, threshold));\n\n        let collection = Collection::from_zipfile(zipfile)?.select(selection)?;\n        let linear = LinearIndex::from_collection(collection.try_into()?);\n\n        let idx = linear.index(threshold, merged_query, queries);\n        Ok(module::RevIndex::Mem(idx))\n    }\n\n    fn merge_queries(qs: &[KmerMinHash], threshold: usize) -> Option<KmerMinHash> {\n        if threshold == 0 {\n            let mut merged = qs[0].clone();\n            for query in &qs[1..] {\n                merged.merge(query).unwrap();\n            }\n            Some(merged)\n        } else {\n            None\n        }\n    }\n\n    pub fn new_with_sigs(\n        search_sigs: Vec<Signature>,\n        selection: &Selection,\n        threshold: usize,\n        queries: Option<&[KmerMinHash]>,\n    ) -> Result<module::RevIndex> {\n        // If threshold is zero, let's merge all queries and save time later\n        let merged_query = queries.and_then(|qs| Self::merge_queries(qs, threshold));\n\n        let collection = Collection::from_sigs(search_sigs)?.select(selection)?;\n        let linear = LinearIndex::from_collection(collection.try_into()?);\n\n        let idx = linear.index(threshold, merged_query, queries);\n\n        Ok(module::RevIndex::Mem(idx))\n    }\n\n    fn map_hashes_colors(\n        dataset_id: Idx,\n        search_sig: &Signature,\n        queries: Option<&[KmerMinHash]>,\n        merged_query: &Option<KmerMinHash>,\n        threshold: usize,\n        template: &Sketch,\n    ) -> Option<(HashToColor, Colors)> {\n        let mut search_mh = None;\n        if let Some(Sketch::MinHash(mh)) = search_sig.select_sketch(template) {\n            search_mh = Some(mh);\n        }\n\n        let search_mh = search_mh.expect(\"Couldn't find a compatible MinHash\");\n        let mut hash_to_color = HashToColor::new();\n        let mut colors = Colors::default();\n\n        if let Some(qs) = queries {\n            if let Some(merged) = merged_query {\n                let (matched_hashes, intersection) = merged.intersection(search_mh).unwrap();\n                if !matched_hashes.is_empty() || intersection > threshold as u64 {\n                    hash_to_color.add_to(&mut colors, dataset_id, matched_hashes);\n                }\n            } else {\n                for query in qs {\n                    let (matched_hashes, intersection) = query.intersection(search_mh).unwrap();\n                    if !matched_hashes.is_empty() || intersection > threshold as u64 {\n                        hash_to_color.add_to(&mut colors, dataset_id, matched_hashes);\n                    }\n                }\n            }\n        } else {\n            let matched = search_mh.mins();\n            let size = matched.len() as u64;\n            if !matched.is_empty() || size > threshold as u64 {\n                hash_to_color.add_to(&mut colors, dataset_id, matched);\n            }\n        };\n\n        if hash_to_color.is_empty() {\n            None\n        } else {\n            Some((hash_to_color, colors))\n        }\n    }\n\n    pub fn search(\n        &self,\n        counter: SigCounter,\n        similarity: bool,\n        threshold: usize,\n    ) -> Result<Vec<String>> {\n        self.linear.search(counter, similarity, threshold)\n    }\n\n    pub fn template(&self) -> Sketch {\n        self.linear.template().clone()\n    }\n\n    pub fn scaled(&self) -> ScaledType {\n        if let Sketch::MinHash(mh) = self.linear.template() {\n            mh.scaled()\n        } else {\n            unimplemented!()\n        }\n    }\n}\n\nimpl RevIndexOps for MemRevIndex {\n    fn location(&self) -> &str {\n        \"\"\n    }\n\n    fn counter_for_query(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> SigCounter {\n        query\n            .iter_mins()\n            .filter_map(|hash| self.hash_to_color.get(hash))\n            .flat_map(|color| self.colors.indices(color))\n            .filter(|idx| {\n                picklist\n                    .as_ref()\n                    .map(|pl| pl.dataset_ids.contains(idx))\n                    .unwrap_or(true)\n            })\n            .cloned()\n            .collect()\n    }\n\n    /// build a CounterGather struct for a particular query\n    fn prepare_gather_counters(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> CounterGather {\n        let counter = self.counter_for_query(query, picklist);\n        let hash_to_color = self.hash_to_color.clone();\n\n        // restrict hash_to_color to hashes contained in query\n        let hash_to_color: HashToColor = query\n            .iter_mins()\n            .filter_map(|&hash| {\n                let color = hash_to_color.get(&hash);\n                color.map(|c| (hash, *c))\n            })\n            .collect();\n\n        // build a list of colors for the query\n        let query_colors: QueryColors = query\n            .iter_mins()\n            .filter_map(|hash| hash_to_color.get(hash))\n            .map(|color| (*color, self.colors.indices(color)))\n            .map(|(color, indices)| (color, indices.cloned().collect::<Vec<u32>>()))\n            // CTB: could we add a 'from' to Datasets for this?\n            .map(|(color, indices)| (color, Datasets::new(&indices)))\n            .collect();\n\n        //eprintln!(\"query_colors: {:?}\", query_colors);\n\n        CounterGather {\n            counter,\n            query_colors,\n            hash_to_color,\n        }\n    }\n\n    fn gather(\n        &self,\n        mut cg: CounterGather,\n        threshold: usize,\n        orig_query: &KmerMinHash,\n        _selection: Option<Selection>,\n    ) -> Result<Vec<GatherResult>> {\n        let match_size = usize::MAX;\n        let mut matches = vec![];\n\n        let mut running_query = KmerMinHashBTree::from(orig_query.clone());\n        while match_size > threshold && !cg.is_empty() {\n            let next_match = cg.peek(threshold);\n            if next_match.is_none() {\n                break;\n            }\n            let (dataset_id, match_size) = next_match.unwrap();\n\n            // eprintln!(\"dataset_id: {} {}\", dataset_id, match_size);\n\n            let query_mh = KmerMinHash::from(running_query.clone());\n            let result = self.linear.gather_round(\n                dataset_id,\n                match_size,\n                &query_mh,\n                matches.len(),\n                orig_query,\n            )?;\n            if let Some(Sketch::MinHash(match_mh)) =\n                result.match_.select_sketch(self.linear.template())\n            {\n                let (matched_hashes, _) = match_mh.intersection(&query_mh)?;\n                let mut isect_mh = match_mh.clone();\n                isect_mh.clear();\n                isect_mh.add_many(&matched_hashes)?;\n\n                cg.consume(&isect_mh);\n                matches.push(result);\n                running_query.remove_many(isect_mh.iter_mins().copied())?;\n            } else {\n                unimplemented!()\n            }\n        }\n        Ok(matches)\n    }\n\n    fn update(self, _collection: CollectionSet) -> Result<module::RevIndex> {\n        Ok(module::RevIndex::Mem(self))\n    }\n\n    fn check(&self, _quick: bool) -> DbStats {\n        unimplemented!()\n    }\n\n    fn compact(&self) {}\n\n    fn flush(&self) -> Result<()> {\n        Ok(())\n    }\n\n    fn collection(&self) -> &CollectionSet {\n        self.linear.collection()\n    }\n\n    fn internalize_storage(&mut self) -> Result<()> {\n        Ok(())\n    }\n\n    fn convert(&self, _output_db: module::RevIndex) -> Result<()> {\n        todo!()\n    }\n\n    fn find_signatures(\n        &self,\n        mh: &KmerMinHash,\n        threshold: f64,\n        picklist: Option<DatasetPicklist>,\n    ) -> Result<Vec<(f64, Signature, String)>> {\n        let index_scaled = self.scaled();\n        let query_scaled = mh.scaled();\n\n        let query_mh = if query_scaled < index_scaled {\n            mh.clone()\n                .downsample_scaled(index_scaled)\n                .expect(\"cannot downsample query\")\n        } else {\n            mh.clone()\n        };\n\n        let threshold: usize = (threshold * (query_mh.size() as f64)) as _;\n\n        let counter = self.counter_for_query(&query_mh, picklist);\n\n        debug!(\n            \"number of matching signatures for hashes: {}\",\n            counter.len()\n        );\n\n        let mut results = vec![];\n        for (dataset_id, size) in counter.most_common() {\n            if size < threshold {\n                break;\n            };\n\n            let match_sig = self.linear.sig_for_dataset(dataset_id)?;\n            let match_path = self.location();\n\n            let match_mh = match match_sig.select_sketch(self.linear.template()) {\n                Some(Sketch::MinHash(mh)) => mh,\n                _ => unimplemented!(),\n            };\n\n            if size >= threshold {\n                let score = query_mh\n                    .jaccard(match_mh)\n                    .expect(\"cannot calculate Jaccard\");\n\n                let filename = match_path.to_string();\n                let mut sig: Signature = match_sig.clone().into();\n                sig.reset_sketches();\n                sig.push(Sketch::MinHash(match_mh.clone()));\n                results.push((score, sig, filename));\n            } else {\n                break;\n            };\n        }\n        Ok(results)\n    }\n}\n\nimpl Index<'_> for MemRevIndex {\n    type Item = Signature;\n\n    fn insert(&mut self, _node: Self::Item) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn save<P: AsRef<std::path::Path>>(&self, _path: P) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn load<P: AsRef<std::path::Path>>(_path: P) -> Result<()> {\n        unimplemented!()\n    }\n\n    fn len(&self) -> usize {\n        self.linear.len()\n    }\n\n    fn signatures(&self) -> Vec<Self::Item> {\n        self.linear\n            .signatures()\n            .into_iter()\n            .map(|sig| sig.into())\n            .collect()\n    }\n\n    fn signature_refs(&self) -> Vec<&Self::Item> {\n        unimplemented!()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    use crate::Result;\n    use crate::index::revindex::prepare_query;\n\n    #[test]\n    fn mem_revindex_new() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let search_sigs = [\n            \"../../tests/test-data/gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\".into(),\n            \"../../tests/test-data/gather/GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\".into(),\n        ];\n        let index = MemRevIndex::new(&search_sigs, &selection, 0, None)?;\n\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        assert_eq!(index.colors.len(), 3);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_many() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let search_sigs = [\n            \"../../tests/test-data/gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\".into(),\n            \"../../tests/test-data/gather/GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\".into(),\n            \"../../tests/test-data/gather/GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\".into(),\n        ];\n\n        let index = MemRevIndex::new(&search_sigs, &selection, 0, None)?;\n        //dbg!(&index.linear.collection().manifest);\n        /*\n        dbg!(&index.colors.colors);\n         0: 86\n         1: 132\n         2: 91\n         (0, 1): 53\n         (0, 2): 90\n         (1, 2): 26\n         (0, 1, 2): 261\n         union: 739\n\n        */\n        //assert_eq!(index.colors.len(), 3);\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        assert_eq!(index.colors.len(), 7);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_from_sigs() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let search_sigs: Vec<Signature> = [\n            \"../../tests/test-data/gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"../../tests/test-data/gather/GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"../../tests/test-data/gather/GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n        ]\n        .into_iter()\n        .map(|path| Signature::from_path(path).unwrap().swap_remove(0))\n        .collect();\n\n        let index = MemRevIndex::new_with_sigs(search_sigs, &selection, 0, None)?;\n        /*\n         dbg!(&index.colors.colors);\n         0: 86\n         1: 132\n         2: 91\n         (0, 1): 53\n         (0, 2): 90\n         (1, 2): 26\n         (0, 1, 2): 261\n         union: 739\n        */\n        //assert_eq!(index.colors.len(), 3);\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        assert_eq!(index.colors.len(), 7);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_from_zipstorage() -> Result<()> {\n        let selection = Selection::builder()\n            .ksize(19)\n            .scaled(100)\n            .moltype(crate::encodings::HashFunctions::Murmur64Protein)\n            .build();\n        let index = MemRevIndex::from_zipfile(\n            \"../../tests/test-data/prot/protein.zip\",\n            &selection,\n            0,\n            None,\n        )\n        .expect(\"error building from ziptorage\");\n\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        assert_eq!(index.colors.len(), 3);\n\n        let query_sig = Signature::from_path(\n            \"../../tests/test-data/prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        )\n        .expect(\"Error processing query\")\n        .swap_remove(0)\n        .select(&selection)?;\n\n        let mut query_mh = None;\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query_mh = Some(q);\n        }\n        let query_mh = query_mh.expect(\"Couldn't find a compatible MinHash\");\n\n        let counter_rev = index.counter_for_query(&query_mh, None);\n        let counter_lin = index.linear.counter_for_query(&query_mh);\n\n        let results_rev = index.search(counter_rev, false, 0).unwrap();\n        let results_linear = index.linear.search(counter_lin, false, 0).unwrap();\n        assert_eq!(results_rev, results_linear);\n\n        let counter_rev = index.prepare_gather_counters(&query_mh, None);\n        let counter_lin = index.linear.counter_for_query(&query_mh);\n\n        let results_rev = index.gather(counter_rev, 0, &query_mh, None).unwrap();\n        let results_linear = index.linear.gather(counter_lin, 0, &query_mh).unwrap();\n        assert_eq!(results_rev.len(), 1);\n        assert_eq!(results_rev, results_linear);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_test_gather_2() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(100000).build();\n        let search_sigs: Vec<Signature> = [\n            \"../../tests/test-data/2.fa.sig\",\n            \"../../tests/test-data/47.fa.sig\",\n        ]\n        .into_iter()\n        .map(|path| Signature::from_path(path).unwrap().swap_remove(0))\n        .collect();\n\n        let query_sig = Signature::from_path(\"../../tests/test-data/63.fa.sig\")\n            .expect(\"error processing query\")\n            .swap_remove(0)\n            .select(&selection)\n            .expect(\"error getting compatible sig\");\n\n        let query_mh = prepare_query(query_sig, &selection).expect(\"can't get compatible MinHash\");\n\n        let index = MemRevIndex::new_with_sigs(search_sigs, &selection, 0, None)?;\n\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        let gather_cg = index.prepare_gather_counters(&query_mh, None);\n        // eprintln!(\"gather_cg: {:?}\", gather_cg);\n        let results = index.gather(gather_cg, 0, &query_mh, None).unwrap();\n\n        assert_eq!(results.len(), 1);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_test_gather_3() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(100000).build();\n        let search_sigs: Vec<Signature> = [\n            \"../../tests/test-data/2.fa.sig\",\n            \"../../tests/test-data/47.fa.sig\",\n            \"../../tests/test-data/63.fa.sig\",\n        ]\n        .into_iter()\n        .map(|path| Signature::from_path(path).unwrap().swap_remove(0))\n        .collect();\n\n        let query_sig = Signature::from_path(\"../../tests/test-data/SRR606249.sig.gz\")\n            .expect(\"error processing query\")\n            .swap_remove(0)\n            .select(&selection)\n            .expect(\"error getting compatible sig\");\n\n        let query_mh = prepare_query(query_sig, &selection).expect(\"can't get compatible MinHash\");\n\n        let index = MemRevIndex::new_with_sigs(search_sigs, &selection, 0, None)?;\n\n        let index = match index {\n            module::RevIndex::Mem(idx) => idx,\n            _ => unimplemented!(),\n        };\n\n        // run the CounterGather-style gather:\n        let gather_cg = index.prepare_gather_counters(&query_mh, None);\n        // eprintln!(\"gather_cg: {:?}\", gather_cg);\n        let results = index.gather(gather_cg, 0, &query_mh, None).unwrap();\n        assert_eq!(results.len(), 3);\n\n        // compare to linear gather.\n        let counter_lin = index.linear.counter_for_query(&query_mh);\n        let results_linear = index.linear.gather(counter_lin, 0, &query_mh).unwrap();\n        assert_eq!(results_linear.len(), 3);\n        assert_eq!(results, results_linear);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_load_and_gather_2() -> Result<()> {\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n            \"GCF_000009085.1_ASM908v1_genomic.fna.gz.sig\",\n            \"GCF_000009505.1_ASM950v1_genomic.fna.gz.sig\",\n            \"GCF_000009525.1_ASM952v1_genomic.fna.gz.sig\",\n            \"GCF_000011885.1_ASM1188v1_genomic.fna.gz.sig\",\n            \"GCF_000016045.1_ASM1604v1_genomic.fna.gz.sig\",\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<_> = against\n            .into_iter()\n            .map(|sig| {\n                let mut path = basedir.clone();\n                path.push(sig);\n                Signature::from_path(path).unwrap().swap_remove(0)\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let index = MemRevIndex::new_with_sigs(against, &selection, 0, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let matches = index.gather(\n            cg,\n            5, // 50kb threshold\n            &query,\n            Some(selection),\n        )?;\n\n        // should be 11, based on test_gather_metagenome_num_results\n        assert_eq!(matches.len(), 11);\n\n        fn round5(a: f64) -> f64 {\n            (a * 1e5).round() / 1e5\n        }\n\n        let match_ = &matches[0];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_003198.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.33219645));\n\n        let match_ = &matches[1];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_000853.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.13096862));\n\n        let match_ = &matches[2];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011978.1\");\n        assert_eq!(match_.f_match(), 0.898936170212766);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.115279));\n\n        let match_ = &matches[3];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_002163.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.10709413));\n\n        let match_ = &matches[4];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_003197.2\");\n        assert_eq!(round5(match_.f_match()), round5(0.31340206));\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.103683));\n\n        let match_ = &matches[5];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_009486.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.4842105));\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.0627557));\n\n        let match_ = &matches[6];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_006905.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.161016949152542));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0518417462482947)\n        );\n\n        let match_ = &matches[7];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011080.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.125799573560768));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.04024556616643930)\n        );\n\n        let match_ = &matches[8];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011274.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0919037199124727));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0286493860845839)\n        );\n\n        let match_ = &matches[9];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_006511.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0725995316159251));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.021145975443383400)\n        );\n\n        let match_ = &matches[10];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011294.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0148619957537155));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0047748976807639800)\n        );\n\n        Ok(())\n    }\n\n    #[test]\n    fn revindex_load_and_test_counter_gather() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n            \"GCF_000009085.1_ASM908v1_genomic.fna.gz.sig\",\n            \"GCF_000009505.1_ASM950v1_genomic.fna.gz.sig\",\n            \"GCF_000009525.1_ASM952v1_genomic.fna.gz.sig\",\n            \"GCF_000011885.1_ASM1188v1_genomic.fna.gz.sig\",\n            \"GCF_000016045.1_ASM1604v1_genomic.fna.gz.sig\",\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<PathBuf> = against\n            .iter()\n            .map(|sig| {\n                let mut filename = basedir.clone();\n                filename.push(sig);\n                filename.into()\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n\n        let index = MemRevIndex::new(&against[..], &selection, 0, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let idxlist = cg.dataset_ids();\n        assert_eq!(idxlist.len(), 12);\n\n        let found_mh = cg.found_hashes(&query);\n        assert_eq!(found_mh.size(), 1466);\n\n        Ok(())\n    }\n\n    #[test]\n    fn revindex_load_and_gather_picklist() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n            \"GCF_000009085.1_ASM908v1_genomic.fna.gz.sig\",\n            \"GCF_000009505.1_ASM950v1_genomic.fna.gz.sig\",\n            \"GCF_000009525.1_ASM952v1_genomic.fna.gz.sig\",\n            \"GCF_000011885.1_ASM1188v1_genomic.fna.gz.sig\",\n            \"GCF_000016045.1_ASM1604v1_genomic.fna.gz.sig\",\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<PathBuf> = against\n            .iter()\n            .map(|sig| {\n                let mut filename = basedir.clone();\n                filename.push(sig);\n                filename.into()\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n\n        let index = MemRevIndex::new(&against[..], &selection, 0, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        // build a picklist with only one match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![0].into_iter().collect(),\n        };\n\n        let cg = index.prepare_gather_counters(&query, Some(pl.clone()));\n\n        let matches = index.gather(\n            cg,\n            5, // 50kb threshold\n            &query,\n            Some(selection),\n        )?;\n\n        // should be 1, b/c of picklist.\n        assert_eq!(matches.len(), 1);\n\n        // also do a basic test of containment with picklists -\n        let counter = index.counter_for_query(&query, Some(pl.clone()));\n        let matches = index.matches_from_counter(counter, 0);\n        assert_eq!(matches, [(\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\".into(), 485)]);\n\n        let counter = index.counter_for_query(&query, Some(pl));\n        let records = index.records_from_counter(counter, 0);\n        assert_eq!(records.len(), 1);\n\n        Ok(())\n    }\n\n    #[test]\n    fn mem_revindex_find_signatures() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(100000).build();\n        let search_sigs: Vec<Signature> = [\n            \"../../tests/test-data/2.fa.sig\",\n            \"../../tests/test-data/47.fa.sig\",\n            \"../../tests/test-data/63.fa.sig\",\n        ]\n        .into_iter()\n        .map(|path| Signature::from_path(path).unwrap().swap_remove(0))\n        .collect();\n\n        let index = MemRevIndex::new_with_sigs(search_sigs, &selection, 0, None)?;\n\n        let query_sig = Signature::from_path(\"../../tests/test-data/63.fa.sig\")\n            .expect(\"error processing query\")\n            .swap_remove(0)\n            .select(&selection)\n            .expect(\"error getting compatible sig\");\n\n        let query_mh = prepare_query(query_sig, &selection).expect(\"can't get compatible MinHash\");\n\n        let results = index.find_signatures(&query_mh, 0.0, None)?;\n        assert_eq!(results.len(), 2);\n\n        let results = index.find_signatures(&query_mh, 1.0, None)?;\n        assert_eq!(results.len(), 1);\n\n        // build a picklist with only one Idx (2.fa) => no match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![0].into_iter().collect(),\n        };\n        let results = index.find_signatures(&query_mh, 0.0, Some(pl))?;\n        assert_eq!(results.len(), 0);\n\n        // build a picklist with only one Idx (47.fa) => one match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![1].into_iter().collect(),\n        };\n        let results = index.find_signatures(&query_mh, 0.0, Some(pl))?;\n        assert_eq!(results.len(), 1);\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/core/src/index/revindex/mod.rs",
    "content": "/// Reverse index data structures.\npub mod disk_revindex;\npub mod mem_revindex;\n\nuse std::collections::{HashMap, HashSet};\nuse std::hash::{Hash, Hasher};\nuse std::path::Path;\nuse std::sync::Arc;\n\nuse byteorder::{LittleEndian, WriteBytesExt};\nuse enum_dispatch::enum_dispatch;\nuse getset::{Getters, Setters};\nuse nohash_hasher::BuildNoHashHasher;\nuse roaring::RoaringBitmap;\nuse serde::{Deserialize, Serialize};\n\nuse crate::HashIntoType;\nuse crate::Result;\nuse crate::collection::CollectionSet;\nuse crate::encodings::{Color, Colors, Idx};\nuse crate::index::{GatherResult, SigCounter};\nuse crate::manifest::Record;\nuse crate::prelude::*;\nuse crate::signature::Signature;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::KmerMinHash;\nuse crate::storage::rocksdb::{COLORS, DB, db_options};\n\ntype QueryColors = HashMap<Color, Datasets>;\n\ntype HashToColorT = HashMap<HashIntoType, Color, BuildNoHashHasher<HashIntoType>>;\n\n#[derive(Serialize, Deserialize, Clone, Debug)]\npub struct HashToColor(HashToColorT);\n\n/// Struct to hold interim results of a containment analysis, supporting\n/// iterative peek/consume.\n#[derive(Debug)]\npub struct CounterGather {\n    counter: SigCounter,\n    query_colors: QueryColors,\n    hash_to_color: HashToColor,\n}\n\n#[enum_dispatch(RevIndexOps)]\npub enum RevIndex {\n    Disk(disk_revindex::DiskRevIndex),\n    Mem(mem_revindex::MemRevIndex),\n}\n\n#[derive(Clone)]\npub struct DatasetPicklist {\n    pub dataset_ids: HashSet<Idx>,\n}\n\n#[enum_dispatch]\npub trait RevIndexOps {\n    /* TODO: need the repair_cf variant, not available in rocksdb-rust yet\n      pub fn repair(index: &Path, colors: bool);\n    */\n\n    fn location(&self) -> &str;\n\n    fn len(&self) -> usize {\n        self.collection().len()\n    }\n\n    fn is_empty(&self) -> bool {\n        self.len() == 0\n    }\n\n    fn signatures(&self) -> Vec<Signature> {\n        let coll = self.collection();\n        coll.iter()\n            .filter_map(|(_idx, record)| match coll.sig_from_record(record) {\n                Ok(sig) => Some(sig.into()),\n                Err(_) => None,\n            })\n            .collect()\n    }\n\n    fn counter_for_query(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> SigCounter;\n\n    fn matches_from_counter(&self, counter: SigCounter, threshold: usize) -> Vec<(String, usize)> {\n        counter\n            .most_common()\n            .into_iter()\n            .filter_map(|(dataset_id, size)| {\n                if size >= threshold {\n                    let row = &self\n                        .collection()\n                        .record_for_dataset(dataset_id)\n                        .expect(\"dataset not found\");\n\n                    let name = [row.name(), row.filename(), row.md5()]\n                        .into_iter()\n                        .find(|v| !v.is_empty())\n                        .unwrap(); // guaranteed to succeed because `md5` always exists\n\n                    Some((name.into(), size))\n                } else {\n                    None\n                }\n            })\n            .collect()\n    }\n\n    fn records_from_counter(&self, counter: SigCounter, threshold: usize) -> Vec<&Record> {\n        counter\n            .most_common()\n            .into_iter()\n            .filter_map(|(dataset_id, size)| {\n                if size >= threshold {\n                    let row = self\n                        .collection()\n                        .record_for_dataset(dataset_id)\n                        .expect(\"dataset not found\");\n                    Some(row)\n                } else {\n                    None\n                }\n            })\n            .collect()\n    }\n\n    fn prepare_gather_counters(\n        &self,\n        query: &KmerMinHash,\n        picklist: Option<DatasetPicklist>,\n    ) -> CounterGather;\n\n    fn update(self, collection: CollectionSet) -> Result<RevIndex>\n    where\n        Self: Sized;\n\n    fn compact(&self);\n\n    fn flush(&self) -> Result<()>;\n\n    fn convert(&self, output_db: RevIndex) -> Result<()>;\n\n    fn check(&self, quick: bool) -> DbStats;\n\n    fn gather(\n        &self,\n        cg: CounterGather,\n        threshold: usize,\n        query: &KmerMinHash,\n        selection: Option<Selection>,\n    ) -> Result<Vec<GatherResult>>;\n\n    fn collection(&self) -> &CollectionSet;\n\n    fn internalize_storage(&mut self) -> Result<()>;\n\n    fn find_signatures(\n        &self,\n        mh: &KmerMinHash,\n        threshold: f64,\n        picklist: Option<DatasetPicklist>,\n    ) -> Result<Vec<(f64, Signature, String)>>;\n}\n\nimpl CounterGather {\n    pub fn is_empty(&self) -> bool {\n        self.counter.is_empty()\n    }\n\n    pub fn len(&self) -> usize {\n        self.counter.len()\n    }\n\n    // CTB: maybe use a KmerMinHashBTree?\n    pub fn found_hashes(&self, template: &KmerMinHash) -> KmerMinHash {\n        let mut found_mh = template.clone();\n        found_mh.clear();\n\n        for hash in self.hash_to_color.0.keys() {\n            found_mh.add_hash(*hash);\n        }\n\n        found_mh\n    }\n\n    pub fn peek(&self, threshold: usize) -> Option<(Idx, usize)> {\n        if self.counter.is_empty() {\n            return None;\n        }\n\n        let (dataset_id, size) = self.counter.k_most_common_ordered(1)[0];\n        if size > 0 && size >= threshold {\n            Some((dataset_id, size))\n        } else {\n            None\n        }\n    }\n\n    pub fn dataset_ids(&self) -> Vec<Idx> {\n        self.counter.keys().copied().collect()\n    }\n\n    /// consume: remove all hashes from intersect, and adjust counter\n    pub fn consume(&mut self, intersect_mh: &KmerMinHash) {\n        intersect_mh\n            .iter_mins()\n            .filter_map(|hash| self.hash_to_color.get(hash))\n            .flat_map(|color| {\n                // TODO: remove this clone\n                self.query_colors.get(color).unwrap().clone().into_iter()\n            })\n            .for_each(|dataset| {\n                // TODO: collect the flat_map into a Counter, and remove more\n                //       than one at a time...\n                self.counter.entry(dataset).and_modify(|e| *e -= 1);\n            });\n\n        // remove empty\n        let empty_keys = self\n            .counter\n            .clone()\n            .into_iter()\n            .filter_map(|(key, val)| if val == 0 { Some(key) } else { None });\n\n        for k in empty_keys.into_iter() {\n            self.counter.remove(&k);\n        }\n    }\n}\n\nimpl HashToColor {\n    fn new() -> Self {\n        HashToColor(HashMap::<\n            HashIntoType,\n            Color,\n            BuildNoHashHasher<HashIntoType>,\n        >::with_hasher(BuildNoHashHasher::default()))\n    }\n\n    fn get(&self, hash: &HashIntoType) -> Option<&Color> {\n        self.0.get(hash)\n    }\n\n    fn len(&self) -> usize {\n        self.0.len()\n    }\n\n    fn is_empty(&self) -> bool {\n        self.0.is_empty()\n    }\n\n    fn add_to(&mut self, colors: &mut Colors, dataset_id: Idx, matched_hashes: Vec<u64>) {\n        let mut color = None;\n\n        matched_hashes.into_iter().for_each(|hash| {\n            color = Some(colors.update(color, &[dataset_id]).unwrap());\n            self.0.insert(hash, color.unwrap());\n        });\n    }\n\n    fn reduce_hashes_colors(\n        a: (HashToColor, Colors),\n        b: (HashToColor, Colors),\n    ) -> (HashToColor, Colors) {\n        let ((small_hashes, small_colors), (mut large_hashes, mut large_colors)) =\n            if a.0.len() > b.0.len() {\n                (b, a)\n            } else {\n                (a, b)\n            };\n\n        small_hashes.0.into_iter().for_each(|(hash, color)| {\n            large_hashes\n                .0\n                .entry(hash)\n                .and_modify(|entry| {\n                    // Hash is already present.\n                    // Update the current color by adding the indices from\n                    // small_colors.\n                    let ids = small_colors.indices(&color);\n                    let new_color = large_colors.update(Some(*entry), ids).unwrap();\n                    *entry = new_color;\n                })\n                .or_insert_with(|| {\n                    // In this case, the hash was not present yet.\n                    // we need to create the same color from small_colors\n                    // into large_colors.\n                    let ids = small_colors.indices(&color);\n                    let new_color = large_colors.update(None, ids).unwrap();\n                    assert_eq!(new_color, color);\n                    new_color\n                });\n        });\n\n        (large_hashes, large_colors)\n    }\n}\n\nimpl FromIterator<(HashIntoType, Color)> for HashToColor {\n    fn from_iter<T>(iter: T) -> Self\n    where\n        T: IntoIterator<Item = (HashIntoType, Color)>,\n    {\n        HashToColor(HashToColorT::from_iter(iter))\n    }\n}\n\nimpl RevIndex {\n    /* TODO: need the repair_cf variant, not available in rocksdb-rust yet\n         pub fn repair(index: &Path, colors: bool) {\n            if colors {\n                color_revindex::repair(index);\n            } else {\n                disk_revindex::repair(index);\n            }\n        }\n    */\n    pub fn create<P: AsRef<Path>>(index: P, collection: CollectionSet) -> Result<Self> {\n        disk_revindex::DiskRevIndex::create(index.as_ref(), collection)\n    }\n\n    pub fn open<P: AsRef<Path>>(index: P, read_only: bool, spec: Option<&str>) -> Result<Self> {\n        let opts = db_options();\n        let cfs = DB::list_cf(&opts, index.as_ref())?;\n\n        if cfs.into_iter().any(|c| c == COLORS) {\n            // TODO: ColorRevIndex can't be read-only for now,\n            //       due to pending unmerged colors\n            todo!() //color_revindex::ColorRevIndex::open(index, false)\n        } else {\n            disk_revindex::DiskRevIndex::open(index, read_only, spec)\n        }\n    }\n}\n\npub fn prepare_query(search_sig: Signature, selection: &Selection) -> Option<KmerMinHash> {\n    let sig = search_sig.select(selection).ok();\n\n    sig.and_then(|sig| {\n        if let Sketch::MinHash(mh) = sig.sketches().swap_remove(0) {\n            Some(mh)\n        } else {\n            None\n        }\n    })\n}\n\n#[derive(Debug, Default, Clone)]\npub enum Datasets {\n    #[default]\n    Empty,\n    Unique(Idx),\n    Many(RoaringBitmap),\n}\n\nimpl Hash for Datasets {\n    fn hash<H>(&self, state: &mut H)\n    where\n        H: Hasher,\n    {\n        match self {\n            Self::Empty => todo!(),\n            Self::Unique(v) => v.hash(state),\n            Self::Many(v) => {\n                for value in v.iter() {\n                    value.hash(state);\n                }\n            }\n        }\n    }\n}\n\nimpl IntoIterator for Datasets {\n    type Item = Idx;\n    type IntoIter = Box<dyn Iterator<Item = Self::Item>>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        match self {\n            Self::Empty => Box::new(std::iter::empty()),\n            Self::Unique(v) => Box::new(std::iter::once(v)),\n            Self::Many(v) => Box::new(v.into_iter()),\n        }\n    }\n}\n\nimpl Extend<Idx> for Datasets {\n    fn extend<T>(&mut self, iter: T)\n    where\n        T: IntoIterator<Item = Idx>,\n    {\n        if let Self::Many(v) = self {\n            v.extend(iter);\n            return;\n        }\n\n        let mut it = iter.into_iter();\n        while let Some(value) = it.next() {\n            match self {\n                Self::Empty => *self = Datasets::Unique(value),\n                Self::Unique(v) => {\n                    if *v != value {\n                        *self = Self::Many([*v, value].iter().copied().collect());\n                    }\n                }\n                Self::Many(v) => {\n                    v.extend(it);\n                    return;\n                }\n            }\n        }\n    }\n}\n\nimpl Datasets {\n    pub fn new(vals: &[Idx]) -> Self {\n        if vals.is_empty() {\n            Self::Empty\n        } else if vals.len() == 1 {\n            Self::Unique(vals[0])\n        } else {\n            Self::Many(RoaringBitmap::from_sorted_iter(vals.iter().copied()).unwrap())\n        }\n    }\n\n    pub fn from_slice(slice: &[u8]) -> Result<Self> {\n        use byteorder::ReadBytesExt;\n\n        if slice.len() == 8 {\n            // Unique\n            Ok(Self::Unique(\n                (&slice[..]).read_u32::<LittleEndian>().unwrap(),\n            ))\n        } else if slice.len() == 1 {\n            // Empty\n            Ok(Self::Empty)\n        } else {\n            // Many\n            Ok(Self::Many(RoaringBitmap::deserialize_from(slice).unwrap()))\n        }\n    }\n\n    fn as_bytes(&self) -> Option<Vec<u8>> {\n        match self {\n            Self::Empty => Some(vec![42_u8]),\n            Self::Unique(v) => {\n                let mut buf = vec![0u8; 8];\n                (&mut buf[..])\n                    .write_u32::<LittleEndian>(*v)\n                    .expect(\"error writing bytes\");\n                Some(buf)\n            }\n            Self::Many(v) => {\n                let mut buf = vec![];\n                v.serialize_into(&mut buf).unwrap();\n                Some(buf)\n            }\n        }\n    }\n\n    fn union(&mut self, other: Datasets) {\n        match self {\n            Datasets::Empty => match other {\n                Datasets::Empty => (),\n                Datasets::Unique(_) | Datasets::Many(_) => *self = other,\n            },\n            Datasets::Unique(v) => match other {\n                Datasets::Empty => (),\n                Datasets::Unique(o) => {\n                    if *v != o {\n                        *self = Datasets::Many([*v, o].iter().copied().collect())\n                    }\n                }\n                Datasets::Many(mut o) => {\n                    o.extend([*v]);\n                    *self = Datasets::Many(o);\n                }\n            },\n            Datasets::Many(v) => v.extend(other),\n        }\n    }\n\n    pub fn is_empty(&self) -> bool {\n        matches!(self, Self::Empty)\n    }\n\n    pub fn len(&self) -> usize {\n        match self {\n            Self::Empty => 0,\n            Self::Unique(_) => 1,\n            Self::Many(v) => v.len() as usize,\n        }\n    }\n\n    fn contains(&self, value: &Idx) -> bool {\n        match self {\n            Self::Empty => false,\n            Self::Unique(v) => v == value,\n            Self::Many(v) => v.contains(*value),\n        }\n    }\n}\n\n#[derive(Getters, Setters, Debug)]\npub struct DbStats {\n    #[getset(get = \"pub\")]\n    total_datasets: usize,\n\n    #[getset(get = \"pub\")]\n    total_keys: usize,\n\n    #[getset(get = \"pub\")]\n    kcount: usize,\n\n    #[getset(get = \"pub\")]\n    vcount: usize,\n\n    #[getset(get = \"pub\")]\n    vcounts: histogram::Histogram,\n}\n\nfn stats_for_cf(db: Arc<DB>, cf_name: &str, deep_check: bool, quick: bool) -> DbStats {\n    use byteorder::ReadBytesExt;\n    use histogram::Histogram;\n\n    let cf = db.cf_handle(cf_name).unwrap();\n\n    let iter = db.iterator_cf(&cf, rocksdb::IteratorMode::Start);\n    let mut kcount = 0;\n    let mut vcount = 0;\n    // Using power values from https://docs.rs/histogram/0.8.3/histogram/struct.Config.html#resulting-size\n    let mut vcounts = Histogram::new(12, 64).expect(\"Error initializing histogram\");\n    let mut datasets: Datasets = Default::default();\n\n    for result in iter {\n        let (key, value) = result.unwrap();\n        let _k = (&key[..]).read_u64::<LittleEndian>().unwrap();\n        kcount += key.len();\n\n        //println!(\"Saw {} {:?}\", k, Datasets::from_slice(&value));\n        vcount += value.len();\n\n        if !quick && deep_check {\n            let v = Datasets::from_slice(&value).expect(\"Error with value\");\n            vcounts.increment(v.len() as u64).unwrap();\n            datasets.union(v);\n        }\n        //println!(\"Saw {} {:?}\", k, value);\n    }\n\n    DbStats {\n        total_datasets: datasets.len(),\n        total_keys: kcount / 8,\n        kcount,\n        vcount,\n        vcounts,\n    }\n}\n\n#[cfg(test)]\nmod test {\n    // CTB: should the disk_revindex tests be moved into disk_revindex.rs?\n    use camino::Utf8PathBuf as PathBuf;\n    use tempfile::TempDir;\n\n    use crate::Result;\n    use crate::collection::Collection;\n    use crate::encodings::*;\n    use crate::index::revindex::DatasetPicklist;\n    use crate::index::revindex::disk_revindex;\n    use crate::prelude::*;\n    use crate::selection::Selection;\n    use crate::signature::SigsTrait;\n    use crate::sketch::minhash::KmerMinHash;\n    use crate::storage::{InnerStorage, RocksDBStorage};\n\n    use super::{RevIndex, RevIndexOps, prepare_query};\n\n    #[test]\n    fn disk_revindex_index() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/scaled/\");\n\n        let siglist: Vec<_> = (10..=12)\n            .map(|i| {\n                let mut filename = basedir.clone();\n                filename.push(format!(\"genome-s{}.fa.gz.sig\", i));\n                filename\n            })\n            .collect();\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let mut query = None;\n        let query_sig = Signature::from_path(&siglist[0])?\n            .swap_remove(0)\n            .select(&selection)?;\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        let collection = Collection::from_paths(&siglist)?.select(&selection)?;\n        let index = RevIndex::create(output.path(), collection.try_into()?)?;\n        assert_eq!(\n            index.location(),\n            output.path().to_str().expect(\"cannot convert\")\n        );\n\n        let counter = index.counter_for_query(&query, None);\n        let matches = index.matches_from_counter(counter, 0);\n\n        assert_eq!(matches, [(\"../genome-s10.fa.gz\".into(), 48)]);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_update() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/scaled/\");\n\n        let siglist: Vec<_> = (10..=11)\n            .map(|i| {\n                let mut filename = basedir.clone();\n                filename.push(format!(\"genome-s{}.fa.gz.sig\", i));\n                filename\n            })\n            .collect();\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let mut new_siglist = siglist.clone();\n        {\n            let collection = Collection::from_paths(&siglist)?.select(&selection)?;\n            RevIndex::create(output.path(), collection.try_into()?)?;\n        }\n\n        let mut filename = basedir.clone();\n        filename.push(\"genome-s12.fa.gz.sig\");\n        new_siglist.push(filename);\n\n        let mut query = None;\n        let query_sig = Signature::from_path(&new_siglist[2])?\n            .swap_remove(0)\n            .select(&selection)?;\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let q = query.unwrap();\n\n        let new_collection = Collection::from_paths(&new_siglist)?.select(&selection)?;\n        let index =\n            RevIndex::open(output.path(), false, None)?.update(new_collection.try_into()?)?;\n\n        let counter = index.counter_for_query(&q, None);\n        let matches = index.matches_from_counter(counter, 0);\n\n        assert!(matches[0].0.ends_with(\"/genome-s12.fa.gz\"));\n        assert_eq!(matches[0].1, 45);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_load_and_gather() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/scaled/\");\n\n        let siglist: Vec<_> = (10..=12)\n            .map(|i| {\n                let mut filename = basedir.clone();\n                filename.push(format!(\"genome-s{}.fa.gz.sig\", i));\n                filename\n            })\n            .collect();\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let mut query = None;\n        let query_sig = Signature::from_path(&siglist[0])?\n            .swap_remove(0)\n            .select(&selection)?;\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        {\n            let collection = Collection::from_paths(&siglist)?.select(&selection)?;\n            let _index = RevIndex::create(output.path(), collection.try_into()?);\n        }\n\n        let index = RevIndex::open(output.path(), true, None)?;\n\n        let cg = index.prepare_gather_counters(&query, None);\n        assert_eq!(cg.len(), 1);\n        assert_eq!(cg.is_empty(), false);\n\n        let matches = index.gather(cg, 0, &query, Some(selection))?;\n\n        assert_eq!(matches.len(), 1);\n        assert_eq!(matches[0].name(), \"\"); // signature name is empty\n        assert_eq!(matches[0].f_match(), 1.0);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_load_and_gather_2() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n            \"GCF_000009085.1_ASM908v1_genomic.fna.gz.sig\",\n            \"GCF_000009505.1_ASM950v1_genomic.fna.gz.sig\",\n            \"GCF_000009525.1_ASM952v1_genomic.fna.gz.sig\",\n            \"GCF_000011885.1_ASM1188v1_genomic.fna.gz.sig\",\n            \"GCF_000016045.1_ASM1604v1_genomic.fna.gz.sig\",\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<_> = against\n            .iter()\n            .map(|sig| {\n                let mut filename = basedir.clone();\n                filename.push(sig);\n                filename\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let collection = Collection::from_paths(&against)?.select(&selection)?;\n        let _index = RevIndex::create(output.path(), collection.try_into()?);\n\n        let index = RevIndex::open(output.path(), true, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let matches = index.gather(\n            cg,\n            5, // 50kb threshold\n            &query,\n            Some(selection),\n        )?;\n\n        // should be 11, based on test_gather_metagenome_num_results\n        assert_eq!(matches.len(), 11);\n\n        fn round5(a: f64) -> f64 {\n            (a * 1e5).round() / 1e5\n        }\n\n        let match_ = &matches[0];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_003198.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.33219645));\n\n        let match_ = &matches[1];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_000853.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.13096862));\n\n        let match_ = &matches[2];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011978.1\");\n        assert_eq!(match_.f_match(), 0.898936170212766);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.115279));\n\n        let match_ = &matches[3];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_002163.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.10709413));\n\n        let match_ = &matches[4];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_003197.2\");\n        assert_eq!(round5(match_.f_match()), round5(0.31340206));\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.103683));\n\n        let match_ = &matches[5];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_009486.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.4842105));\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.0627557));\n\n        let match_ = &matches[6];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_006905.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.161016949152542));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0518417462482947)\n        );\n\n        let match_ = &matches[7];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011080.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.125799573560768));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.04024556616643930)\n        );\n\n        let match_ = &matches[8];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011274.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0919037199124727));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0286493860845839)\n        );\n\n        let match_ = &matches[9];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_006511.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0725995316159251));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.021145975443383400)\n        );\n\n        let match_ = &matches[10];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011294.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.0148619957537155));\n        assert_eq!(\n            round5(match_.f_unique_to_query()),\n            round5(0.0047748976807639800)\n        );\n\n        Ok(())\n    }\n\n    #[test]\n    // a more detailed/focused version of revindex_load_and_gather_2,\n    // added in sourmash#3193 for debugging purposes.\n    fn disk_revindex_load_and_gather_3() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<_> = against\n            .iter()\n            .map(|sig| {\n                let mut filename = basedir.clone();\n                filename.push(sig);\n                filename\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let collection = Collection::from_paths(&against)?.select(&selection)?;\n        let _index = RevIndex::create(output.path(), collection.try_into()?);\n\n        let index = RevIndex::open(output.path(), true, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let matches = index.gather(cg, 0, &query, Some(selection))?;\n\n        // should be 3.\n        // see sourmash#3193.\n        assert_eq!(matches.len(), 3);\n\n        fn round5(a: f64) -> f64 {\n            (a * 1e5).round() / 1e5\n        }\n\n        let match_ = &matches[0];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_000853.1\");\n        assert_eq!(match_.f_match(), 1.0);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.13096862));\n        assert_eq!(match_.unique_intersect_bp, 1920000);\n        assert_eq!(match_.remaining_bp, 12740000);\n        assert_eq!(round5(match_.query_containment_ani()), round5(0.90773763));\n\n        let match_ = &matches[1];\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_011978.1\");\n        assert_eq!(match_.f_match(), 0.898936170212766);\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.115279));\n        assert_eq!(match_.unique_intersect_bp, 1690000);\n        assert_eq!(match_.remaining_bp, 11050000);\n        assert_eq!(round5(match_.query_containment_ani()), round5(0.9068280));\n\n        let match_ = &matches[2];\n        dbg!(match_);\n        let names: Vec<&str> = match_.name().split(' ').take(1).collect();\n        assert_eq!(names[0], \"NC_009486.1\");\n        assert_eq!(round5(match_.f_match()), round5(0.4842105));\n        assert_eq!(round5(match_.f_unique_to_query()), round5(0.0627557));\n        assert_eq!(match_.unique_intersect_bp, 920000);\n        assert_eq!(match_.remaining_bp, 10130000);\n        assert_eq!(round5(match_.query_containment_ani()), round5(0.90728512));\n\n        Ok(())\n    }\n\n    #[test]\n    fn revindex_load_and_gather_picklist() -> Result<()> {\n        let mut basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        basedir.push(\"../../tests/test-data/gather/\");\n\n        let against = vec![\n            \"GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\",\n            \"GCF_000007545.1_ASM754v1_genomic.fna.gz.sig\",\n            \"GCF_000008105.1_ASM810v1_genomic.fna.gz.sig\",\n            \"GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\",\n            \"GCF_000009085.1_ASM908v1_genomic.fna.gz.sig\",\n            \"GCF_000009505.1_ASM950v1_genomic.fna.gz.sig\",\n            \"GCF_000009525.1_ASM952v1_genomic.fna.gz.sig\",\n            \"GCF_000011885.1_ASM1188v1_genomic.fna.gz.sig\",\n            \"GCF_000016045.1_ASM1604v1_genomic.fna.gz.sig\",\n            \"GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\",\n            \"GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\",\n            \"GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\",\n        ];\n        let against: Vec<_> = against\n            .iter()\n            .map(|sig| {\n                let mut filename = basedir.clone();\n                filename.push(sig);\n                filename\n            })\n            .collect();\n\n        // build 'against' sketches into a revindex\n        let selection = Selection::builder().ksize(21).scaled(10000).build();\n        let output = TempDir::new()?;\n\n        let collection = Collection::from_paths(&against)?.select(&selection)?;\n        let _index = RevIndex::create(output.path(), collection.try_into()?);\n\n        let index = RevIndex::open(output.path(), true, None)?;\n\n        let mut query = None;\n        let mut query_filename = basedir.clone();\n        query_filename.push(\"combined.sig\");\n        let query_sig = Signature::from_path(query_filename)?\n            .swap_remove(0)\n            .select(&selection)?;\n\n        if let Some(q) = prepare_query(query_sig, &selection) {\n            query = Some(q);\n        }\n        let query = query.unwrap();\n\n        // build a picklist with only one match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![0].into_iter().collect(),\n        };\n\n        let cg = index.prepare_gather_counters(&query, Some(pl.clone()));\n\n        let matches = index.gather(\n            cg,\n            5, // 50kb threshold\n            &query,\n            Some(selection),\n        )?;\n\n        // should be 1, b/c of picklist.\n        assert_eq!(matches.len(), 1);\n\n        // also do a basic test of containment with picklists -\n        let counter = index.counter_for_query(&query, Some(pl.clone()));\n        let matches = index.matches_from_counter(counter, 0);\n        assert_eq!(matches, [(\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\".into(), 485)]);\n\n        let counter = index.counter_for_query(&query, Some(pl));\n        let records = index.records_from_counter(counter, 0);\n        assert_eq!(records.len(), 1);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_find_signatures() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(100000).build();\n        let search_sigs: Vec<PathBuf> = vec![\n            \"../../tests/test-data/2.fa.sig\".into(),\n            \"../../tests/test-data/47.fa.sig\".into(),\n            \"../../tests/test-data/63.fa.sig\".into(),\n        ];\n\n        let output = TempDir::new()?;\n        let collection = Collection::from_paths(&search_sigs[..])?.select(&selection)?;\n        let index = RevIndex::create(output.path(), collection.try_into()?)?;\n\n        assert!(!index.is_empty());\n        assert_eq!(index.len(), 3);\n        let sigs = index.signatures();\n        assert_eq!(sigs.len(), 3);\n\n        let query_sig = Signature::from_path(\"../../tests/test-data/63.fa.sig\")\n            .expect(\"error processing query\")\n            .swap_remove(0)\n            .select(&selection)\n            .expect(\"error getting compatible sig\");\n\n        let query_mh = prepare_query(query_sig, &selection).expect(\"can't get compatible MinHash\");\n\n        let results = index.find_signatures(&query_mh, 0.0, None)?;\n        assert_eq!(results.len(), 2);\n\n        let results = index.find_signatures(&query_mh, 1.0, None)?;\n        assert_eq!(results.len(), 1);\n\n        // build a picklist with only one Idx (2.fa) => no match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![0].into_iter().collect(),\n        };\n        let results = index.find_signatures(&query_mh, 0.0, Some(pl))?;\n        assert_eq!(results.len(), 0);\n\n        // build a picklist with only one Idx (47.fa) => one match\n        let pl = DatasetPicklist {\n            dataset_ids: vec![1].into_iter().collect(),\n        };\n        let results = index.find_signatures(&query_mh, 0.0, Some(pl))?;\n        assert_eq!(results.len(), 1);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_move() -> Result<()> {\n        let basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let mut zip_collection = basedir.clone();\n        zip_collection.push(\"../../tests/test-data/track_abund/track_abund.zip\");\n\n        let outdir = TempDir::new()?;\n\n        let zip_copy = PathBuf::from(\n            outdir\n                .path()\n                .join(\"sigs.zip\")\n                .into_os_string()\n                .into_string()\n                .unwrap(),\n        );\n        std::fs::copy(zip_collection, zip_copy.as_path())?;\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let collection = Collection::from_zipfile(zip_copy.as_path())?.select(&selection)?;\n        let output = outdir.path().join(\"index\");\n\n        let query = prepare_query(collection.sig_for_dataset(0)?.into(), &selection).unwrap();\n\n        {\n            RevIndex::create(output.as_path(), collection.try_into()?)?;\n        }\n\n        {\n            let index = RevIndex::open(output.as_path(), false, None)?;\n\n            let counter = index.counter_for_query(&query, None);\n            let matches = index.matches_from_counter(counter, 0);\n\n            assert!(matches[0].0.starts_with(\"NC_009665.1\"));\n            assert_eq!(matches[0].1, 514);\n        }\n\n        let new_zip = outdir\n            .path()\n            .join(\"new_sigs.zip\")\n            .into_os_string()\n            .into_string()\n            .unwrap();\n        std::fs::rename(zip_copy, &new_zip)?;\n\n        // RevIndex can't know where the new sigs are\n        assert!(RevIndex::open(output.as_path(), false, None).is_err());\n\n        let index = RevIndex::open(output.as_path(), false, Some(&format!(\"zip://{}\", new_zip)))?;\n\n        let counter = index.counter_for_query(&query, None);\n        let matches = index.matches_from_counter(counter, 0);\n\n        assert!(matches[0].0.starts_with(\"NC_009665.1\"));\n        assert_eq!(matches[0].1, 514);\n\n        Ok(())\n    }\n\n    #[test]\n    fn disk_revindex_internalize_storage() -> Result<()> {\n        let basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let mut zip_collection = basedir.clone();\n        zip_collection.push(\"../../tests/test-data/track_abund/track_abund.zip\");\n\n        let outdir = TempDir::new()?;\n\n        let zip_copy = PathBuf::from(\n            outdir\n                .path()\n                .join(\"sigs.zip\")\n                .into_os_string()\n                .into_string()\n                .unwrap(),\n        );\n        std::fs::copy(zip_collection, zip_copy.as_path())?;\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let collection = Collection::from_zipfile(zip_copy.as_path())?.select(&selection)?;\n        let output = outdir.path().join(\"index\");\n\n        let query = prepare_query(collection.sig_for_dataset(0)?.into(), &selection).unwrap();\n\n        let index = RevIndex::create(output.as_path(), collection.try_into()?)?;\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let matches_external = index\n            .gather(cg, 0, &query, Some(selection.clone()))\n            .expect(\"failed to gather!\");\n\n        {\n            let mut index = index;\n            index\n                .internalize_storage()\n                .expect(\"Error internalizing storage\");\n\n            let cg = index.prepare_gather_counters(&query, None);\n\n            let matches_internal = index.gather(cg, 0, &query, Some(selection.clone()))?;\n            assert_eq!(matches_external, matches_internal);\n        }\n        let new_path = outdir.path().join(\"new_index_path\");\n        std::fs::rename(output.as_path(), new_path.as_path())?;\n\n        let index = RevIndex::open(new_path, false, None)?;\n\n        let cg = index.prepare_gather_counters(&query, None);\n\n        let matches_moved = index.gather(cg, 0, &query, Some(selection.clone()))?;\n        assert_eq!(matches_external, matches_moved);\n\n        Ok(())\n    }\n\n    #[test]\n    fn rocksdb_storage_from_path() -> Result<()> {\n        let basedir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let mut zip_collection = basedir.clone();\n        zip_collection.push(\"../../tests/test-data/track_abund/track_abund.zip\");\n\n        let outdir = TempDir::new()?;\n\n        let zip_copy = PathBuf::from(\n            outdir\n                .path()\n                .join(\"sigs.zip\")\n                .into_os_string()\n                .into_string()\n                .unwrap(),\n        );\n        std::fs::copy(zip_collection, zip_copy.as_path())?;\n\n        let selection = Selection::builder().ksize(31).scaled(10000).build();\n        let collection = Collection::from_zipfile(zip_copy.as_path())?.select(&selection)?;\n        let output = outdir.path().join(\"index\");\n\n        // Step 1: create an index\n        let index = RevIndex::create(output.as_path(), collection.try_into()?)?;\n\n        // Step 2: internalize the storage for the index\n        {\n            let mut index = index;\n            index\n                .internalize_storage()\n                .expect(\"Error internalizing storage\");\n        }\n\n        // Step 3: load rocksdb storage from path\n        // should have the same content as zipfile\n\n        // Iter thru collection, make sure all records are present\n        let collection = Collection::from_zipfile(zip_copy.as_path())?.select(&selection)?;\n        assert_eq!(collection.len(), 2);\n        let col_storage = collection.storage();\n\n        let spec;\n        {\n            let rdb_storage = RocksDBStorage::from_path(output.as_os_str().to_str().unwrap());\n            spec = rdb_storage.spec();\n            collection.iter().for_each(|(_, r)| {\n                assert_eq!(\n                    rdb_storage.load(r.internal_location().as_str()).unwrap(),\n                    col_storage.load(r.internal_location().as_str()).unwrap()\n                );\n            });\n        }\n\n        // Step 4: verify rocksdb storage spec\n        assert_eq!(\n            spec,\n            format!(\"rocksdb://{}\", output.as_os_str().to_str().unwrap())\n        );\n\n        let storage = InnerStorage::from_spec(spec)?;\n        collection.iter().for_each(|(_, r)| {\n            assert_eq!(\n                storage.load(r.internal_location().as_str()).unwrap(),\n                col_storage.load(r.internal_location().as_str()).unwrap()\n            );\n        });\n\n        Ok(())\n    }\n\n    #[test]\n    fn rocksdb_storage_fail_bad_directory() -> Result<()> {\n        let testdir = TempDir::new()?;\n\n        match RevIndex::open(testdir, true, None) {\n            Err(_) => Ok(()),\n            Ok(_) => panic!(\"test should not reach here\"),\n        }\n    }\n\n    #[test]\n    fn countergather_basic() -> Result<()> {\n        let selection = Selection::builder().ksize(31).scaled(100000).build();\n\n        let db = disk_revindex::DiskRevIndex::open(\n            \"../../tests/test-data/3sigs.branch_0913.rocksdb\",\n            true,\n            None,\n        )\n        .expect(\"cannot open rocksdb\");\n\n        let query_sig = Signature::from_path(\"../../tests/test-data/SRR606249.sig.gz\")\n            .expect(\"error processing query\")\n            .swap_remove(0)\n            .select(&selection)\n            .expect(\"error getting compatible sig\");\n\n        let mut query_mh =\n            prepare_query(query_sig, &selection).expect(\"can't get compatible MinHash\");\n\n        let compute_isect = |a: &KmerMinHash, b: &KmerMinHash| -> KmerMinHash {\n            let isect = a.intersection(&b).expect(\"intersection failed\");\n            let mut isect_mh = a.clone();\n            isect_mh.clear();\n            isect_mh.add_many(&isect.0[..]).expect(\"add many failed\");\n            isect_mh\n        };\n\n        let load_sig = |db: &RevIndex, dataset_id: &Idx, selection: &Selection| -> KmerMinHash {\n            let m1: Signature = db\n                .collection()\n                .sig_for_dataset(*dataset_id)\n                .expect(\"cannot load dataset_id\")\n                .into();\n            let m1 = m1.select(selection).expect(\"cannot find compatible sig\");\n            m1.try_into().expect(\"cannot extract minhash\")\n        };\n\n        let mut cg = db.prepare_gather_counters(&query_mh, None);\n\n        let (dataset_id, size) = cg.peek(0).unwrap();\n\n        // match 1:\n        let m1 = load_sig(&db, &dataset_id, &selection);\n        let isect_mh = compute_isect(&m1, &query_mh);\n        assert_eq!(isect_mh.size(), size);\n\n        cg.consume(&isect_mh);\n        query_mh\n            .remove_many(isect_mh.mins())\n            .expect(\"cannot remove_many\");\n\n        let (dataset_id, size) = cg.peek(0).unwrap();\n\n        // match 2:\n        let m2 = load_sig(&db, &dataset_id, &selection);\n        let isect_mh = compute_isect(&m2, &query_mh);\n        assert_eq!(isect_mh.size(), size);\n\n        cg.consume(&isect_mh);\n        query_mh\n            .remove_many(isect_mh.mins())\n            .expect(\"cannot remove_many\");\n\n        let (dataset_id, size) = cg.peek(0).unwrap();\n\n        // match 3:\n        let m3 = load_sig(&db, &dataset_id, &selection);\n        let isect_mh = compute_isect(&m3, &query_mh);\n        assert_eq!(isect_mh.size(), size);\n\n        cg.consume(&isect_mh);\n\n        let r4 = cg.peek(0);\n        assert_eq!(r4, None);\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/core/src/index/search.rs",
    "content": "use crate::index::Comparable;\n\npub fn search_minhashes<L>(node: &dyn Comparable<L>, query: &L, threshold: f64) -> bool {\n    node.similarity(query) > threshold\n}\n\npub fn search_minhashes_containment<L>(\n    node: &dyn Comparable<L>,\n    query: &L,\n    threshold: f64,\n) -> bool {\n    node.containment(query) > threshold\n}\n\npub fn search_minhashes_find_best<L>() -> fn(&dyn Comparable<L>, &L, f64) -> bool {\n    /* TODO: implement the proper function, as a closure that modifies `best_so_far`\n    let mut _best_so_far = 0.;\n\n    move |node, query, threshold| {\n        let sim = node.similarity(query);\n        if sim > best_so_far {\n            best_so_far = sim;\n            true\n        } else {\n            if sim > threshold {\n                true\n            } else {\n                false\n            }\n        }\n    }\n    */\n    unimplemented!();\n}\n"
  },
  {
    "path": "src/core/src/lib.rs",
    "content": "//! # Compute, compare and search signatures for nucleotide (DNA/RNA) and protein sequences.\n//!\n//! sourmash is a command-line tool and Python library for computing\n//! [MinHash sketches][0] from DNA sequences, comparing them to each other,\n//! and plotting the results.\n//! This allows you to estimate sequence similarity between even very\n//! large data sets quickly and accurately.\n//!\n//! [0]: https://en.wikipedia.org/wiki/MinHash\n//!\n//! sourmash can be used to quickly search large databases of genomes\n//! for matches to query genomes and metagenomes.\n//!\n//! sourmash also includes k-mer based taxonomic exploration and\n//! classification routines for genome and metagenome analysis. These\n//! routines can use the NCBI taxonomy but do not depend on it in any way.\n//! Documentation and further examples for each module can be found in the module descriptions below.\n\n// TODO: remove this line and update all the appropriate type names for 1.0\n#![allow(clippy::upper_case_acronyms)]\n\npub mod errors;\npub use errors::SourmashError as Error;\npub type Result<T> = std::result::Result<T, Error>;\n\npub mod prelude;\n\n// All the cbindgen:ignore comments below are for avoiding parsing errors when\n// running cbindgen (mostly because tuples are not supported).\n// None of these influence the generated C header, because only items defined\n// in the `ffi` module are actually exported.\n// Note: these tuple errors tend to show up in `Builder` structs, which are\n// generated by typed-builder.\n\n/// cbindgen:ignore\npub mod cmd;\n\npub mod ani_utils;\npub mod collection;\npub mod encodings;\n/// cbindgen:ignore\npub mod index;\npub mod manifest;\n/// cbindgen:ignore\npub mod selection;\n/// cbindgen:ignore\npub mod signature;\n/// cbindgen:ignore\npub mod sketch;\n/// cbindgen:ignore\npub mod storage;\n\nuse cfg_if::cfg_if;\nuse murmurhash3::murmurhash3_x64_128;\n\ncfg_if! {\n    if #[cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))] {\n        // Explicitly keeping emscripten and wasi out of this\n        /// cbindgen:ignore\n        pub mod wasm;\n    } else {\n        pub mod ffi;\n    }\n}\n\ntype HashIntoType = u64;\npub type ScaledType = u32;\n\npub fn _hash_murmur(kmer: &[u8], seed: u64) -> u64 {\n    murmurhash3_x64_128(kmer, seed).0\n}\n"
  },
  {
    "path": "src/core/src/manifest.rs",
    "content": "use std::collections::HashSet;\nuse std::fs::File;\nuse std::hash::{Hash, Hasher};\nuse std::io::{BufRead, BufReader, Read, Write};\nuse std::ops::Deref;\n\nuse camino::Utf8PathBuf as PathBuf;\nuse getset::{CopyGetters, Getters, Setters};\n#[cfg(feature = \"parallel\")]\nuse rayon::prelude::*;\nuse serde::de;\nuse serde::{Deserialize, Serialize};\n\nuse crate::encodings::HashFunctions;\nuse crate::prelude::*;\nuse crate::signature::SigsTrait;\nuse crate::sketch::Sketch;\nuse crate::{Result, ScaledType};\n\n/// Individual manifest record, containing information about sketches.\n\n#[derive(Debug, Serialize, Deserialize, Clone, CopyGetters, Getters, Setters)]\npub struct Record {\n    #[getset(get = \"pub\", set = \"pub\")]\n    internal_location: PathBuf,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    md5: String,\n\n    md5short: String,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    ksize: u32,\n\n    moltype: String,\n\n    #[getset(get = \"pub\")]\n    num: u32,\n\n    #[getset(get = \"pub\")]\n    scaled: ScaledType,\n\n    #[getset(get = \"pub\")]\n    n_hashes: usize,\n\n    #[getset(get_copy = \"pub\", set = \"pub\")]\n    #[serde(serialize_with = \"intbool\", deserialize_with = \"to_bool\")]\n    with_abundance: bool,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    name: String,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    filename: String,\n}\n\nfn intbool<S>(x: &bool, s: S) -> std::result::Result<S::Ok, S::Error>\nwhere\n    S: serde::Serializer,\n{\n    if *x {\n        s.serialize_i32(1)\n    } else {\n        s.serialize_i32(0)\n    }\n}\n\nfn to_bool<'de, D>(deserializer: D) -> std::result::Result<bool, D::Error>\nwhere\n    D: de::Deserializer<'de>,\n{\n    match String::deserialize(deserializer)?\n        .to_ascii_lowercase()\n        .as_ref()\n    {\n        \"0\" | \"false\" | \"False\" => Ok(false),\n        \"1\" | \"true\" | \"True\" => Ok(true),\n        other => Err(de::Error::invalid_value(\n            de::Unexpected::Str(other),\n            &\"0/1, true/false, True/False are the only supported values\",\n        )),\n    }\n}\n\nimpl std::fmt::Display for Record {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {\n        write!(fmt, \"{:?}\", self)\n    }\n}\n\n/// A description of a collection of sketches.\n\n#[derive(Debug, Default, Serialize, Deserialize, Clone)]\npub struct Manifest {\n    records: Vec<Record>,\n}\n\nimpl Record {\n    /// Build a Record from a Signature\n    pub fn from_sig(sig: &Signature, path: &str) -> Vec<Self> {\n        sig.iter()\n            .map(|sketch| {\n                let (mut ksize, md5, with_abundance, moltype, n_hashes, num, scaled, hash_function) = match sketch\n                {\n                    Sketch::MinHash(mh) => (\n                        mh.ksize() as u32,\n                        mh.md5sum(),\n                        mh.track_abundance(),\n                        mh.hash_function(),\n                        mh.size(),\n                        mh.num(),\n                        mh.scaled(),\n                        mh.hash_function(),\n                    ),\n                    Sketch::LargeMinHash(mh) => (\n                        mh.ksize() as u32,\n                        mh.md5sum(),\n                        mh.track_abundance(),\n                        mh.hash_function(),\n                        mh.size(),\n                        mh.num(),\n                        mh.scaled(),\n                        mh.hash_function(),\n                    ),\n                    _ => unimplemented!(),\n                };\n\n                let md5short = md5[0..8].into();\n\n                ksize = match hash_function {\n                    HashFunctions::Murmur64Protein | HashFunctions::Murmur64Dayhoff | HashFunctions::Murmur64Hp => ksize / 3,\n                    _ => ksize,\n                };\n\n                Self {\n                    internal_location: path.into(),\n                    moltype: moltype.to_string(),\n                    name: sig.name_str(),\n                    ksize,\n                    md5,\n                    md5short,\n                    with_abundance,\n                    filename: sig.filename(),\n                    n_hashes,\n                    num,\n                    scaled,\n                }\n            })\n            .collect()\n    }\n\n    pub fn moltype(&self) -> HashFunctions {\n        self.moltype.as_str().try_into().unwrap()\n    }\n\n    pub fn check_compatible(&self, other: &Record) -> Result<()> {\n        /*\n        if self.num != other.num {\n            return Err(Error::MismatchNum {\n                n1: self.num,\n                n2: other.num,\n            }\n            .into());\n        }\n        */\n        use crate::Error;\n\n        if self.ksize() != other.ksize() {\n            return Err(Error::MismatchKSizes);\n        }\n        if self.moltype() != other.moltype() {\n            // TODO: fix this error\n            return Err(Error::MismatchDNAProt);\n        }\n        /*\n        if self.scaled() < other.scaled() {\n            return Err(Error::MismatchScaled);\n        }\n        if self.seed() != other.seed() {\n            return Err(Error::MismatchSeed);\n        }\n        */\n        Ok(())\n    }\n}\n\nimpl PartialEq for Record {\n    // match everything but internal_location\n    fn eq(&self, other: &Self) -> bool {\n        self.md5 == other.md5\n            && self.ksize == other.ksize\n            && self.moltype == other.moltype\n            && self.scaled == other.scaled\n            && self.num == other.num\n            && self.n_hashes == other.n_hashes\n            && self.with_abundance == other.with_abundance\n            && self.name == other.name\n            && self.filename == other.filename\n    }\n}\n\nimpl Eq for Record {}\n\nimpl Hash for Record {\n    fn hash<H: Hasher>(&self, state: &mut H) {\n        self.md5.hash(state);\n        self.ksize.hash(state);\n        self.moltype.hash(state);\n        self.scaled.hash(state);\n        self.num.hash(state);\n        self.n_hashes.hash(state);\n        self.with_abundance.hash(state);\n        self.name.hash(state);\n        self.filename.hash(state);\n    }\n}\n\nimpl Manifest {\n    pub fn from_reader<R: Read>(rdr: R) -> Result<Self> {\n        let mut records = vec![];\n\n        let mut rdr = csv::ReaderBuilder::new()\n            .comment(Some(b'#'))\n            .from_reader(rdr);\n        for result in rdr.deserialize() {\n            let record: Record = result?;\n            records.push(record);\n        }\n        Ok(Manifest { records })\n    }\n\n    pub fn to_writer<W: Write>(&self, mut wtr: W) -> Result<()> {\n        wtr.write_all(b\"# SOURMASH-MANIFEST-VERSION: 1.0\\n\")?;\n\n        let mut wtr = csv::Writer::from_writer(wtr);\n\n        for record in &self.records {\n            wtr.serialize(record)?;\n        }\n\n        Ok(())\n    }\n\n    pub fn internal_locations(&self) -> impl Iterator<Item = &str> {\n        self.records.iter().map(|r| r.internal_location.as_str())\n    }\n\n    pub fn iter(&self) -> impl Iterator<Item = &Record> {\n        self.records.iter()\n    }\n\n    pub fn intersect_manifest(&self, other: &Manifest) -> Self {\n        // extract tuples from other mf:\n        let pairs: HashSet<_> = other.iter().collect();\n\n        let records = self\n            .records\n            .iter()\n            .filter(|row| pairs.contains(row))\n            .cloned()\n            .collect();\n\n        Self { records }\n    }\n}\n\nimpl Select for Record {\n    // select only a record if it satisfy selection conditions; also update\n    // scaled value to match.\n    fn select(self, selection: &Selection) -> Result<Self> {\n        let mut row = self;\n\n        let mut valid = true;\n        valid = if let Some(ksize) = selection.ksize() {\n            row.ksize == ksize\n        } else {\n            valid\n        };\n        valid = if let Some(abund) = selection.abund() {\n            valid && row.with_abundance() == abund\n        } else {\n            valid\n        };\n        valid = if let Some(moltype) = selection.moltype() {\n            valid && row.moltype() == moltype\n        } else {\n            valid\n        };\n        valid = if let Some(num) = selection.num() {\n            valid && row.num == num\n        } else {\n            valid\n        };\n\n        valid = if let Some(scaled) = selection.scaled() {\n            // num sigs have row.scaled = 0, don't include them\n            let v = valid && row.scaled != 0 && row.scaled <= scaled;\n            // if scaled is set, update!\n            if v {\n                row.scaled = scaled\n            };\n            v\n        } else {\n            valid\n        };\n\n        if valid {\n            Ok(row)\n        } else {\n            Err(crate::Error::EmptyRecord {\n                record: Box::new(row),\n            })\n        }\n    }\n}\n\nimpl Select for Manifest {\n    // select only records that satisfy selection conditions; also update\n    // scaled value to match.\n    fn select(self, selection: &Selection) -> Result<Self> {\n        use replace_with::replace_with_or_abort_and_return;\n\n        let Manifest { mut records } = self;\n\n        records.retain_mut(|row| {\n            replace_with_or_abort_and_return(row, |new_row| match new_row.select(selection) {\n                Ok(record) => (true, record),\n                Err(crate::Error::EmptyRecord { record }) => (false, *record),\n                Err(_) => todo!(\"unknown error\"),\n            })\n        });\n\n        Ok(Manifest { records })\n    }\n}\n\nimpl From<Vec<Record>> for Manifest {\n    fn from(records: Vec<Record>) -> Self {\n        Manifest { records }\n    }\n}\n\nimpl From<&[PathBuf]> for Manifest {\n    fn from(paths: &[PathBuf]) -> Self {\n        #[cfg(feature = \"parallel\")]\n        let iter = paths.par_iter();\n\n        #[cfg(not(feature = \"parallel\"))]\n        let iter = paths.iter();\n\n        let records: Vec<Record> = iter\n            .flat_map(|p| {\n                let recs: Vec<Record> = Signature::from_path(p)\n                    .unwrap_or_else(|_| panic!(\"Error processing {p:?}\"))\n                    .into_iter()\n                    .flat_map(|v| Record::from_sig(&v, p.as_str()))\n                    .collect();\n                recs\n            })\n            .collect();\n\n        Manifest { records }\n    }\n}\n\nimpl From<&PathBuf> for Manifest {\n    fn from(pathlist: &PathBuf) -> Self {\n        let file = File::open(pathlist).unwrap_or_else(|_| panic!(\"Failed to open {pathlist:?}\"));\n        let reader = BufReader::new(file);\n\n        let paths: Vec<PathBuf> = reader\n            .lines()\n            .map(|line| line.unwrap_or_else(|_| panic!(\"Failed to read line from {pathlist:?}\")))\n            .map(PathBuf::from)\n            .collect();\n\n        paths.as_slice().into()\n    }\n}\n\nimpl Deref for Manifest {\n    type Target = Vec<Record>;\n\n    fn deref(&self) -> &Self::Target {\n        &self.records\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use camino::Utf8PathBuf as PathBuf;\n    use std::fs::File;\n    use std::io::Write;\n    use tempfile::TempDir;\n\n    use super::Manifest;\n    use crate::collection::Collection;\n    use crate::encodings::HashFunctions;\n    use crate::selection::{Select, Selection};\n\n    #[test]\n    fn manifest_from_pathlist() {\n        let temp_dir = TempDir::new().unwrap();\n        let utf8_output = PathBuf::from_path_buf(temp_dir.path().to_path_buf())\n            .expect(\"Path should be valid UTF-8\");\n        let mut filename = utf8_output.join(\"sig-pathlist.txt\");\n        //convert to camino utf8pathbuf\n        filename = PathBuf::from(filename);\n        // build sig filenames\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        let test_sigs = vec![\n            \"../../tests/test-data/47.fa.sig\",\n            \"../../tests/test-data/63.fa.sig\",\n        ];\n\n        let full_paths: Vec<_> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        // write a file in test directory with a filename on each line\n        let mut pathfile = File::create(&filename).unwrap();\n        for sigfile in &full_paths {\n            writeln!(pathfile, \"{}\", sigfile).unwrap();\n        }\n\n        // load into manifest\n        let manifest = Manifest::from(&filename);\n        assert_eq!(manifest.len(), 2);\n    }\n\n    #[test]\n    #[should_panic(expected = \"Failed to open \\\"no-exist\\\"\")]\n    fn manifest_from_pathlist_nonexistent_file() {\n        let filename = PathBuf::from(\"no-exist\");\n        let _manifest = Manifest::from(&filename);\n    }\n\n    #[test]\n    #[should_panic]\n    fn manifest_from_pathlist_badfile() {\n        let temp_dir = TempDir::new().unwrap();\n        let utf8_output = PathBuf::from_path_buf(temp_dir.path().to_path_buf())\n            .expect(\"Path should be valid UTF-8\");\n        let mut filename = utf8_output.join(\"sig-pathlist.txt\");\n        //convert to camino utf8pathbuf\n        filename = PathBuf::from(filename);\n\n        let mut pathfile = File::create(&filename).unwrap();\n        writeln!(pathfile, \"Valid line\").unwrap();\n        pathfile.write_all(&[0xED, 0xA0, 0x80]).unwrap(); // invalid UTF-8\n\n        // load into manifest\n        let _manifest = Manifest::from(&filename);\n    }\n\n    #[test]\n    #[should_panic]\n    fn manifest_from_paths_badpath() {\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        let test_sigs = vec![\n            PathBuf::from(\"no-exist\"),\n            PathBuf::from(\"../../tests/test-data/63.fa.sig\"),\n        ];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        // load into manifest\n        let _manifest = Manifest::from(&full_paths[..]); // pass full_paths as a slice\n    }\n\n    #[test]\n    fn manifest_to_writer_bools() {\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![\n            PathBuf::from(\"../../tests/test-data/47.fa.sig\"),\n            PathBuf::from(\"../../tests/test-data/track_abund/63.fa.sig\"),\n        ];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let manifest = Manifest::from(&full_paths[..]); // pass full_paths as a slice\n\n        let temp_dir = TempDir::new().unwrap();\n        let utf8_output = PathBuf::from_path_buf(temp_dir.path().to_path_buf())\n            .expect(\"Path should be valid UTF-8\");\n\n        let filename = utf8_output.join(\"sigs.manifest.csv\");\n        let mut wtr = File::create(&filename).expect(\"Failed to create file\");\n\n        manifest.to_writer(&mut wtr).unwrap();\n\n        // check that we can reopen the file as a manifest + properly check abund\n        let infile = File::open(&filename).expect(\"Failed to open file\");\n        let m2 = Manifest::from_reader(&infile).unwrap();\n        for record in m2.iter() {\n            eprintln!(\"{:?}\", record.name());\n            if record.name().contains(\"OS185\") {\n                assert_eq!(record.with_abundance(), false)\n            } else {\n                assert_eq!(record.with_abundance(), true)\n            }\n        }\n    }\n\n    #[test]\n    fn manifest_to_writer_moltype_dna() {\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![PathBuf::from(\"../../tests/test-data/47.fa.sig\")];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let manifest = Manifest::from(&full_paths[..]); // pass full_paths as a slice\n\n        let temp_dir = TempDir::new().unwrap();\n        let utf8_output = PathBuf::from_path_buf(temp_dir.path().to_path_buf())\n            .expect(\"Path should be valid UTF-8\");\n\n        let filename = utf8_output.join(\"sigs.manifest.csv\");\n        let mut wtr = File::create(&filename).expect(\"Failed to create file\");\n\n        manifest.to_writer(&mut wtr).unwrap();\n\n        // check that we can reopen the file as a manifest + properly check abund\n        let infile = File::open(&filename).expect(\"Failed to open file\");\n        let m2 = Manifest::from_reader(&infile).unwrap();\n        for record in m2.iter() {\n            eprintln!(\"{:?} {}\", record.name(), record.moltype());\n            assert_eq!(record.moltype().to_string(), \"DNA\");\n        }\n    }\n\n    #[test]\n    fn manifest_selection() {\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n        let test_sigs = vec![PathBuf::from(\"../../tests/test-data/prot/all.zip\")];\n\n        let full_paths: Vec<PathBuf> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let collection = Collection::from_zipfile(&full_paths[0]).unwrap();\n        let manifest = collection.manifest().clone();\n\n        // check selection on manifest works\n        let mut selection = Selection::default();\n        selection.set_ksize(19);\n        let prot_collect = manifest.select(&selection).unwrap();\n        // eprintln!(\"{}\", &prot_collect);\n        assert_eq!(prot_collect.len(), 6);\n        selection.set_moltype(HashFunctions::Murmur64Protein);\n\n        let manifest = collection.manifest().clone();\n        let protein_only = manifest.select(&selection).unwrap();\n        assert_eq!(protein_only.len(), 2);\n\n        let manifest = collection.manifest().clone();\n        selection = Selection::default();\n        selection.set_scaled(100);\n        let scaled100 = manifest.select(&selection).unwrap();\n        assert_eq!(scaled100.len(), 6);\n\n        // check that 'scaled' is updated\n        let manifest = collection.manifest().clone();\n        selection = Selection::default();\n        selection.set_scaled(400);\n        let scaled400 = manifest.select(&selection).unwrap();\n        assert_eq!(scaled400.len(), 6);\n        let max_scaled = scaled400\n            .iter()\n            .map(|r| r.scaled())\n            .max()\n            .expect(\"no records?!\");\n        assert_eq!(*max_scaled, 400);\n    }\n\n    #[test]\n    fn manifest_intersect() {\n        let temp_dir = TempDir::new().unwrap();\n        let utf8_output = PathBuf::from_path_buf(temp_dir.path().to_path_buf())\n            .expect(\"Path should be valid UTF-8\");\n        let filename = utf8_output.join(\"sig-pathlist.txt\");\n        // build sig filenames\n        let base_path = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        let test_sigs = vec![\n            \"../../tests/test-data/47.fa.sig\",\n            \"../../tests/test-data/63.fa.sig\",\n        ];\n\n        let full_paths: Vec<_> = test_sigs\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        // write a file in test directory with a filename on each line\n        let mut pathfile = File::create(&filename).unwrap();\n        for sigfile in &full_paths {\n            writeln!(pathfile, \"{}\", sigfile).unwrap();\n        }\n\n        // load into manifest\n        let manifest = Manifest::from(&filename);\n        assert_eq!(manifest.len(), 2);\n\n        // now do just one sketch -\n        let test_sigs2 = vec![\"../../tests/test-data/63.fa.sig\"];\n\n        let filename2 = utf8_output.join(\"sig-pathlist-single.txt\");\n\n        let full_paths: Vec<_> = test_sigs2\n            .into_iter()\n            .map(|sig| base_path.join(sig))\n            .collect();\n\n        let mut pathfile2 = File::create(&filename2).unwrap();\n        for sigfile in &full_paths {\n            writeln!(pathfile2, \"{}\", sigfile).unwrap();\n        }\n\n        // load into another manifest\n        let manifest2 = Manifest::from(&filename2);\n        assert_eq!(manifest2.len(), 1);\n\n        // intersect with itself => same.\n        let new_mf = manifest2.intersect_manifest(&manifest);\n        assert_eq!(new_mf.len(), 1);\n\n        // intersect with other => single.\n        let new_mf = manifest.intersect_manifest(&manifest2);\n        assert_eq!(new_mf.len(), 1);\n    }\n}\n"
  },
  {
    "path": "src/core/src/prelude.rs",
    "content": "use std::io::Write;\n\nuse crate::Result;\n\npub use crate::selection::{Select, Selection};\npub use crate::signature::Signature;\npub use crate::storage::Storage;\n\npub trait ToWriter {\n    fn to_writer<W>(&self, writer: &mut W) -> Result<()>\n    where\n        W: Write;\n}\n\npub trait Update<O> {\n    fn update(&self, other: &mut O) -> Result<()>;\n}\n\npub trait FromFactory<N> {\n    fn factory(&self, name: &str) -> Result<N>;\n}\n\n/// Implemented by anything that wants to read specific data from a storage.\npub trait ReadData<D> {\n    fn data(&self) -> Result<&D>;\n}\n\n// TODO: split into two traits, Similarity and Containment?\npub trait Comparable<O> {\n    fn similarity(&self, other: &O) -> f64;\n    fn containment(&self, other: &O) -> f64;\n}\n"
  },
  {
    "path": "src/core/src/selection.rs",
    "content": "use getset::{CopyGetters, Getters, Setters};\nuse typed_builder::TypedBuilder;\n\nuse crate::encodings::HashFunctions;\nuse crate::manifest::Record;\nuse crate::{Result, ScaledType};\n\n#[derive(Default, Debug, TypedBuilder, Clone)]\npub struct Selection {\n    #[builder(default, setter(strip_option))]\n    ksize: Option<u32>,\n\n    #[builder(default, setter(strip_option))]\n    abund: Option<bool>,\n\n    #[builder(default, setter(strip_option))]\n    num: Option<u32>,\n\n    #[builder(default, setter(strip_option))]\n    scaled: Option<ScaledType>,\n\n    #[builder(default, setter(strip_option))]\n    containment: Option<bool>,\n\n    #[builder(default, setter(strip_option))]\n    moltype: Option<HashFunctions>,\n\n    #[builder(default, setter(strip_option))]\n    picklist: Option<Picklist>,\n}\n\n#[derive(Default, TypedBuilder, CopyGetters, Getters, Setters, Clone, Debug)]\npub struct Picklist {\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = \"\".into())]\n    coltype: String,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = \"\".into())]\n    pickfile: String,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder(default = \"\".into())]\n    column_name: String,\n\n    #[getset(get = \"pub\", set = \"pub\")]\n    #[builder]\n    pickstyle: PickStyle,\n}\n\n#[derive(Clone, Default, Debug)]\n#[repr(u32)]\npub enum PickStyle {\n    #[default]\n    Include = 1,\n    Exclude = 2,\n}\n\npub trait Select {\n    fn select(self, selection: &Selection) -> Result<Self>\n    where\n        Self: Sized;\n}\n\nimpl Selection {\n    pub fn ksize(&self) -> Option<u32> {\n        self.ksize\n    }\n\n    pub fn set_ksize(&mut self, ksize: u32) {\n        self.ksize = Some(ksize);\n    }\n\n    pub fn abund(&self) -> Option<bool> {\n        self.abund\n    }\n\n    pub fn set_abund(&mut self, value: bool) {\n        self.abund = Some(value);\n    }\n\n    pub fn num(&self) -> Option<u32> {\n        self.num\n    }\n\n    pub fn set_num(&mut self, num: u32) {\n        self.num = Some(num);\n    }\n\n    pub fn scaled(&self) -> Option<ScaledType> {\n        self.scaled\n    }\n\n    pub fn set_scaled(&mut self, scaled: ScaledType) {\n        self.scaled = Some(scaled);\n    }\n\n    pub fn containment(&self) -> Option<bool> {\n        self.containment\n    }\n\n    pub fn set_containment(&mut self, containment: bool) {\n        self.containment = Some(containment);\n    }\n\n    pub fn moltype(&self) -> Option<HashFunctions> {\n        self.moltype.clone()\n    }\n\n    pub fn set_moltype(&mut self, value: HashFunctions) {\n        self.moltype = Some(value);\n    }\n\n    pub fn picklist(&self) -> Option<Picklist> {\n        self.picklist.clone()\n    }\n\n    pub fn set_picklist(&mut self, value: Picklist) {\n        self.picklist = Some(value);\n    }\n\n    pub fn from_record(row: &Record) -> Result<Self> {\n        Ok(Self {\n            ksize: Some(row.ksize()),\n            abund: Some(row.with_abundance()),\n            moltype: Some(row.moltype()),\n            num: None,\n            scaled: Some(*row.scaled()),\n            containment: None,\n            picklist: None,\n        })\n    }\n}\n"
  },
  {
    "path": "src/core/src/signature.rs",
    "content": "//! # Compressed representations of genomic data\n//!\n//! A signature is a collection of sketches for a genomic dataset.\n\nuse core::iter::FusedIterator;\n\nuse std::fs::File;\nuse std::io;\nuse std::path::Path;\nuse std::str;\n\nuse cfg_if::cfg_if;\nuse itertools::Itertools;\n#[cfg(feature = \"parallel\")]\nuse rayon::prelude::*;\nuse serde::{Deserialize, Serialize};\nuse typed_builder::TypedBuilder;\n\nuse crate::Error;\nuse crate::HashIntoType;\nuse crate::encodings::{HashFunctions, VALID, aa_to_dayhoff, aa_to_hp, revcomp, to_aa};\nuse crate::errors::SourmashError;\nuse crate::prelude::*;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::KmerMinHash;\n\n// TODO: this is the behavior expected from Sketch, but that name is already\n// used. Sketchable?\npub trait SigsTrait {\n    fn size(&self) -> usize;\n    fn to_vec(&self) -> Vec<u64>;\n    fn ksize(&self) -> usize;\n    fn check_compatible(&self, other: &Self) -> Result<(), Error>;\n    fn seed(&self) -> u64;\n\n    fn hash_function(&self) -> HashFunctions;\n\n    fn add_hash(&mut self, hash: HashIntoType);\n\n    fn add_sequence(&mut self, seq: &[u8], force: bool) -> Result<(), Error> {\n        let ready_hashes = SeqToHashes::new(\n            seq,\n            self.ksize(),\n            force,\n            false,\n            self.hash_function(),\n            self.seed(),\n        )?;\n\n        for hash_value in ready_hashes {\n            match hash_value {\n                Ok(0) => continue,\n                Ok(x) => self.add_hash(x),\n                Err(err) => return Err(err),\n            }\n        }\n\n        // Should be always ok\n        Ok(())\n    }\n\n    fn add_protein(&mut self, seq: &[u8]) -> Result<(), Error> {\n        let ready_hashes = SeqToHashes::new(\n            seq,\n            self.ksize(),\n            false,\n            true,\n            self.hash_function(),\n            self.seed(),\n        )?;\n\n        for hash_value in ready_hashes {\n            match hash_value {\n                Ok(0) => continue,\n                Ok(x) => self.add_hash(x),\n                Err(err) => return Err(err),\n            }\n        }\n\n        // Should be always ok\n        Ok(())\n    }\n}\n\nimpl SigsTrait for Sketch {\n    fn size(&self) -> usize {\n        match *self {\n            Sketch::MinHash(ref mh) => mh.size(),\n            Sketch::LargeMinHash(ref mh) => mh.size(),\n            Sketch::HyperLogLog(ref hll) => hll.size(),\n        }\n    }\n\n    fn to_vec(&self) -> Vec<u64> {\n        match *self {\n            Sketch::MinHash(ref mh) => mh.to_vec(),\n            Sketch::LargeMinHash(ref mh) => mh.to_vec(),\n            Sketch::HyperLogLog(ref hll) => hll.to_vec(),\n        }\n    }\n\n    fn ksize(&self) -> usize {\n        match *self {\n            Sketch::MinHash(ref mh) => mh.ksize(),\n            Sketch::LargeMinHash(ref mh) => mh.ksize(),\n            Sketch::HyperLogLog(ref hll) => hll.ksize(),\n        }\n    }\n\n    fn seed(&self) -> u64 {\n        match *self {\n            Sketch::MinHash(ref mh) => mh.seed(),\n            Sketch::LargeMinHash(ref mh) => mh.seed(),\n            Sketch::HyperLogLog(ref hll) => hll.seed(),\n        }\n    }\n\n    fn hash_function(&self) -> HashFunctions {\n        match *self {\n            Sketch::MinHash(ref mh) => mh.hash_function(),\n            Sketch::LargeMinHash(ref mh) => mh.hash_function(),\n            Sketch::HyperLogLog(ref hll) => hll.hash_function(),\n        }\n    }\n\n    fn add_hash(&mut self, hash: HashIntoType) {\n        match *self {\n            Sketch::MinHash(ref mut mh) => mh.add_hash(hash),\n            Sketch::LargeMinHash(ref mut mh) => mh.add_hash(hash),\n            Sketch::HyperLogLog(ref mut hll) => hll.add_hash(hash),\n        }\n    }\n\n    fn check_compatible(&self, other: &Self) -> Result<(), Error> {\n        match *self {\n            Sketch::MinHash(ref mh) => match other {\n                Sketch::MinHash(ot) => mh.check_compatible(ot),\n                _ => Err(Error::MismatchSignatureType),\n            },\n            Sketch::LargeMinHash(ref mh) => match other {\n                Sketch::LargeMinHash(ot) => mh.check_compatible(ot),\n                _ => Err(Error::MismatchSignatureType),\n            },\n            Sketch::HyperLogLog(ref hll) => match other {\n                Sketch::HyperLogLog(ot) => hll.check_compatible(ot),\n                _ => Err(Error::MismatchSignatureType),\n            },\n        }\n    }\n\n    fn add_sequence(&mut self, seq: &[u8], force: bool) -> Result<(), Error> {\n        match *self {\n            Sketch::MinHash(ref mut mh) => mh.add_sequence(seq, force),\n            Sketch::LargeMinHash(ref mut mh) => mh.add_sequence(seq, force),\n            Sketch::HyperLogLog(_) => unimplemented!(),\n        }\n    }\n\n    fn add_protein(&mut self, seq: &[u8]) -> Result<(), Error> {\n        match *self {\n            Sketch::MinHash(ref mut mh) => mh.add_protein(seq),\n            Sketch::LargeMinHash(ref mut mh) => mh.add_protein(seq),\n            Sketch::HyperLogLog(_) => unimplemented!(),\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub enum ReadingFrame {\n    DNA {\n        fw: Vec<u8>,\n        rc: Vec<u8>,\n        len: usize, // len gives max_index for kmer iterator\n    },\n    Protein {\n        fw: Vec<u8>,\n        len: usize,\n    },\n}\n\nimpl std::fmt::Display for ReadingFrame {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            ReadingFrame::DNA { fw, rc, len } => {\n                let fw_str = String::from_utf8_lossy(fw).to_string();\n                let rc_str = String::from_utf8_lossy(rc).to_string();\n                write!(\n                    f,\n                    \"Type: DNA ({len}bp), Forward: {fw_str}, Reverse Complement: {rc_str}\"\n                )\n            }\n            ReadingFrame::Protein { fw, len } => {\n                let fw_str = String::from_utf8_lossy(fw).to_string();\n                write!(f, \"Type: Protein ({len}aa), Forward: {fw_str}\")\n            }\n        }\n    }\n}\n\nimpl ReadingFrame {\n    pub fn new_dna(sequence: &[u8]) -> Self {\n        let fw = sequence.to_ascii_uppercase();\n        let rc = revcomp(&fw);\n        let len = sequence.len();\n        ReadingFrame::DNA { fw, rc, len }\n    }\n\n    pub fn new_protein(sequence: &[u8], dayhoff: bool, hp: bool) -> Self {\n        let seq = sequence.to_ascii_uppercase();\n        let fw: Vec<u8> = if dayhoff {\n            seq.iter().map(|&aa| aa_to_dayhoff(aa)).collect()\n        } else if hp {\n            seq.iter().map(|&aa| aa_to_hp(aa)).collect()\n        } else {\n            seq\n        };\n\n        let len = fw.len();\n        ReadingFrame::Protein { fw, len }\n    }\n\n    pub fn new_skipmer(\n        sequence: &[u8],\n        start: usize,\n        m: usize,\n        n: usize,\n    ) -> Result<Self, SourmashError> {\n        let seq = sequence.to_ascii_uppercase();\n        if start >= n {\n            return Err(SourmashError::InvalidSkipmerFrame { start, n });\n        }\n        // do we need to round up? (+1)\n        let mut fw = Vec::with_capacity(((seq.len() * m) + 1) / n);\n        seq.iter().skip(start).enumerate().for_each(|(i, &base)| {\n            if i % n < m {\n                fw.push(base.to_ascii_uppercase());\n            }\n        });\n\n        let len = fw.len();\n        let rc = revcomp(&fw);\n        Ok(ReadingFrame::DNA { fw, rc, len })\n    }\n\n    // this is the only one that doesn't uppercase in here b/c more efficient to uppercase externally :/\n    pub fn new_translated(\n        sequence: &[u8],\n        frame_number: usize,\n        dayhoff: bool,\n        hp: bool,\n    ) -> Result<Self, SourmashError> {\n        if frame_number > 2 {\n            return Err(SourmashError::InvalidTranslateFrame { frame_number });\n        }\n\n        // Translate sequence into amino acids\n        let mut fw = Vec::with_capacity(sequence.len() / 3);\n        // NOTE: b/c of chunks(3), we only process full codons and ignore leftover bases (e.g. 1 or 2 at end of frame)\n        sequence\n            .iter()\n            .skip(frame_number) // Skip the initial bases for the frame\n            .take(sequence.len() - frame_number) // Adjust length based on skipped bases\n            .chunks(3) // Group into codons (triplets) using itertools\n            .into_iter()\n            .filter_map(|chunk| {\n                let codon: Vec<u8> = chunk.cloned().collect(); // Collect the chunk into a Vec<u8>\n                to_aa(&codon, dayhoff, hp).ok() // Translate the codon\n            })\n            .for_each(|aa| fw.extend(aa)); // Extend `fw` with amino acids\n\n        let len = fw.len();\n\n        // return protein reading frame\n        Ok(ReadingFrame::Protein { fw, len })\n    }\n\n    /// Get the forward sequence.\n    #[inline]\n    pub fn fw(&self) -> &[u8] {\n        match self {\n            ReadingFrame::DNA { fw, .. } => fw,\n            ReadingFrame::Protein { fw, .. } => fw,\n        }\n    }\n\n    /// Get the reverse complement sequence (if DNA).\n    #[inline]\n    pub fn rc(&self) -> &[u8] {\n        match self {\n            ReadingFrame::DNA { rc, .. } => rc,\n            _ => panic!(\"Reverse complement is only available for DNA frames\"),\n        }\n    }\n\n    #[inline]\n    pub fn length(&self) -> usize {\n        match self {\n            ReadingFrame::DNA { len, .. } => *len,\n            ReadingFrame::Protein { len, .. } => *len,\n        }\n    }\n\n    /// Get the type of the frame as a string.\n    pub fn frame_type(&self) -> &'static str {\n        match self {\n            ReadingFrame::DNA { .. } => \"DNA\",\n            ReadingFrame::Protein { .. } => \"Protein\",\n        }\n    }\n}\n\npub struct SeqToHashes {\n    k_size: usize,\n    force: bool,\n    seed: u64,\n    frames: Vec<ReadingFrame>,\n    frame_index: usize,         // Index of the current frame\n    kmer_index: usize,          // Current k-mer index within the frame\n    last_position_check: usize, // Index of last base we validated\n}\n\nimpl SeqToHashes {\n    pub fn new(\n        seq: &[u8],\n        k_size: usize,\n        force: bool,\n        is_protein: bool,\n        hash_function: HashFunctions,\n        seed: u64,\n    ) -> Result<Self, SourmashError> {\n        let mut ksize: usize = k_size;\n\n        // Adjust kmer size for protein-based hash functions\n        if is_protein || hash_function.protein() || hash_function.dayhoff() || hash_function.hp() {\n            ksize = k_size / 3;\n        }\n\n        // Generate frames based on sequence type and hash function\n        let frames = if hash_function.dna() {\n            Self::dna_frames(seq)\n        } else if is_protein {\n            Self::protein_frames(seq, &hash_function)\n        } else if hash_function.protein() || hash_function.dayhoff() || hash_function.hp() {\n            Self::translated_frames(seq, &hash_function)?\n        } else if hash_function.skipm1n3() || hash_function.skipm2n3() {\n            Self::skipmer_frames(seq, &hash_function, ksize)?\n        } else {\n            return Err(SourmashError::InvalidHashFunction {\n                function: format!(\"{hash_function:?}\"),\n            });\n        };\n\n        Ok(SeqToHashes {\n            k_size: ksize,\n            force,\n            seed,\n            frames,\n            frame_index: 0,\n            kmer_index: 0,\n            last_position_check: 0,\n        })\n    }\n\n    /// generate frames from DNA: 1 DNA frame (fw+rc)\n    fn dna_frames(seq: &[u8]) -> Vec<ReadingFrame> {\n        vec![ReadingFrame::new_dna(seq)]\n    }\n\n    /// generate frames from protein: 1 protein frame\n    fn protein_frames(seq: &[u8], hash_function: &HashFunctions) -> Vec<ReadingFrame> {\n        vec![ReadingFrame::new_protein(\n            seq,\n            hash_function.dayhoff(),\n            hash_function.hp(),\n        )]\n    }\n\n    /// generate translated frames: 6 protein frames\n    fn translated_frames(\n        seq: &[u8],\n        hash_function: &HashFunctions,\n    ) -> Result<Vec<ReadingFrame>, SourmashError> {\n        // since we need to revcomp BEFORE making ReadingFrames, uppercase the sequence here\n        let sequence = seq.to_ascii_uppercase();\n        let revcomp_sequence = revcomp(&sequence);\n        let frames = (0..3)\n            .flat_map(|frame_number| {\n                vec![\n                    ReadingFrame::new_translated(\n                        &sequence,\n                        frame_number,\n                        hash_function.dayhoff(),\n                        hash_function.hp(),\n                    ),\n                    ReadingFrame::new_translated(\n                        &revcomp_sequence,\n                        frame_number,\n                        hash_function.dayhoff(),\n                        hash_function.hp(),\n                    ),\n                ]\n            })\n            .collect::<Result<Vec<_>, _>>()?;\n\n        Ok(frames)\n    }\n\n    /// generate skipmer frames: 3 DNA frames (each with fw+rc)\n    fn skipmer_frames(\n        seq: &[u8],\n        hash_function: &HashFunctions,\n        ksize: usize,\n    ) -> Result<Vec<ReadingFrame>, SourmashError> {\n        let (m, n) = if hash_function.skipm1n3() {\n            (1, 3)\n        } else {\n            (2, 3)\n        };\n        if ksize < n {\n            return Err(SourmashError::InvalidSkipmerSize { ksize, n });\n        }\n        let frames = (0..3)\n            .flat_map(|frame_number| vec![ReadingFrame::new_skipmer(seq, frame_number, m, n)])\n            .collect::<Result<Vec<_>, _>>()?;\n\n        Ok(frames)\n    }\n\n    fn out_of_bounds(&self, frame: &ReadingFrame) -> bool {\n        self.kmer_index + self.k_size > frame.length()\n    }\n}\n\nimpl Iterator for SeqToHashes {\n    type Item = Result<u64, Error>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        while self.frame_index < self.frames.len() {\n            let frame = &self.frames[self.frame_index];\n\n            // Do we need to move to the next frame?\n            if self.out_of_bounds(frame) {\n                self.frame_index += 1;\n                self.kmer_index = 0; // Reset for the next frame\n                self.last_position_check = 0;\n                continue;\n            }\n\n            let result = match frame {\n                ReadingFrame::DNA { .. } => {\n                    let kmer = &frame.fw()[self.kmer_index..self.kmer_index + self.k_size];\n                    let rc = frame.rc();\n\n                    // Validate k-mer bases\n                    for j in std::cmp::max(self.kmer_index, self.last_position_check)\n                        ..self.kmer_index + self.k_size\n                    {\n                        if !VALID[frame.fw()[j] as usize] {\n                            if !self.force {\n                                // Return an error if force is false\n                                return Some(Err(Error::InvalidDNA {\n                                    message: String::from_utf8(kmer.to_vec()).unwrap(),\n                                }));\n                            } else {\n                                // Skip the invalid k-mer\n                                self.kmer_index += 1;\n                                return Some(Ok(0));\n                            }\n                        }\n                        self.last_position_check += 1;\n                    }\n\n                    // Compute canonical hash\n                    //   For a ksize = 3, and a sequence AGTCGT (len = 6):\n                    //                   +-+---------+---------------+-------+\n                    //   seq      RC     |i|i + ksize|len - ksize - i|len - i|\n                    //  AGTCGT   ACGACT  +-+---------+---------------+-------+\n                    //  +->         +->  |0|    2    |       3       |   6   |\n                    //   +->       +->   |1|    3    |       2       |   5   |\n                    //    +->     +->    |2|    4    |       1       |   4   |\n                    //     +->   +->     |3|    5    |       0       |   3   |\n                    //                   +-+---------+---------------+-------+\n                    // (leaving this table here because I had to draw to\n                    //  get the indices correctly)\n                    let krc = &rc[frame.length() - self.k_size - self.kmer_index\n                        ..frame.length() - self.kmer_index];\n                    let hash = crate::_hash_murmur(std::cmp::min(kmer, krc), self.seed);\n                    Ok(hash)\n                }\n                ReadingFrame::Protein { .. } => {\n                    let kmer = &frame.fw()[self.kmer_index..self.kmer_index + self.k_size];\n                    Ok(crate::_hash_murmur(kmer, self.seed))\n                }\n            };\n\n            self.kmer_index += 1; // Advance k-mer index for valid k-mers\n            return Some(result);\n        }\n        None // No more frames or k-mers\n    }\n}\n\n#[derive(Serialize, Deserialize, Debug, Clone, TypedBuilder)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\npub struct Signature {\n    #[serde(default = \"default_class\")]\n    #[builder(default = default_class())]\n    class: String,\n\n    #[serde(default)]\n    #[builder(default)]\n    email: String,\n\n    #[builder(setter(into))]\n    hash_function: String,\n\n    #[builder(default)]\n    filename: Option<String>,\n\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub(crate) name: Option<String>,\n\n    #[serde(default = \"default_license\")]\n    #[builder(default = default_license())]\n    license: String,\n\n    pub(crate) signatures: Vec<Sketch>,\n\n    #[serde(default = \"default_version\")]\n    #[builder(default = default_version())]\n    version: f64,\n}\n\nfn default_license() -> String {\n    \"CC0\".to_string()\n}\n\nfn default_class() -> String {\n    \"sourmash_signature\".to_string()\n}\n\nfn default_version() -> f64 {\n    0.4\n}\n\nimpl Signature {\n    pub fn name(&self) -> Option<String> {\n        self.name.clone()\n    }\n\n    /// return name, if not None; or \"\" if None.\n    pub fn name_str(&self) -> String {\n        self.name().unwrap_or(\"\".into())\n    }\n\n    pub fn set_name(&mut self, name: &str) {\n        self.name = Some(name.into())\n    }\n\n    pub fn filename(&self) -> String {\n        if let Some(filename) = &self.filename {\n            filename.clone()\n        } else {\n            \"\".into()\n        }\n    }\n\n    pub fn set_filename(&mut self, name: &str) {\n        self.filename = Some(name.into())\n    }\n\n    pub fn size(&self) -> usize {\n        self.signatures.len()\n    }\n\n    pub fn sketches(&self) -> Vec<Sketch> {\n        self.signatures.clone()\n    }\n\n    pub fn reset_sketches(&mut self) {\n        self.signatures = vec![];\n    }\n\n    pub fn push(&mut self, sketch: Sketch) {\n        self.signatures.push(sketch);\n    }\n\n    pub fn license(&self) -> String {\n        self.license.clone()\n    }\n\n    pub fn class(&self) -> String {\n        self.class.clone()\n    }\n\n    pub fn hash_function(&self) -> String {\n        self.hash_function.clone()\n    }\n\n    pub fn email(&self) -> String {\n        self.email.clone()\n    }\n\n    pub fn md5sum(&self) -> String {\n        if self.signatures.len() == 1 {\n            match &self.signatures[0] {\n                Sketch::MinHash(mh) => mh.md5sum(),\n                Sketch::LargeMinHash(mh) => mh.md5sum(),\n                Sketch::HyperLogLog(_) => unimplemented!(),\n            }\n        } else {\n            // TODO: select the correct signature\n            unimplemented!()\n        }\n    }\n\n    pub fn select_sketch(&self, sketch: &Sketch) -> Option<&Sketch> {\n        if let Sketch::MinHash(template) = sketch {\n            for sk in &self.signatures {\n                if let Sketch::MinHash(mh) = sk {\n                    if mh.check_compatible(template).is_ok() {\n                        return Some(sk);\n                    }\n                } else {\n                    unimplemented!()\n                }\n            }\n        } else {\n            unimplemented!()\n        }\n        None\n    }\n\n    // return single corresponding sketch\n    pub fn get_sketch(&self) -> Option<&Sketch> {\n        if self.signatures.len() != 1 {\n            if self.signatures.len() > 1 {\n                todo!(\"Multiple sketches found! Please run select first.\");\n            }\n            return None;\n        }\n        self.signatures.iter().find(|sk| {\n            matches!(\n                sk,\n                Sketch::MinHash(_) | Sketch::LargeMinHash(_) | Sketch::HyperLogLog(_)\n            )\n        })\n    }\n\n    // return minhash directly\n    pub fn minhash(&self) -> Option<&KmerMinHash> {\n        if self.signatures.len() != 1 {\n            if self.signatures.len() > 1 {\n                todo!(\"Multiple sketches found! Please run select first.\");\n            }\n            return None;\n        }\n        self.signatures.iter().find_map(|sk| {\n            if let Sketch::MinHash(mh) = sk {\n                Some(mh)\n            } else {\n                None\n            }\n        })\n    }\n\n    pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Vec<Signature>, Error> {\n        let mut reader = io::BufReader::new(File::open(path)?);\n        Signature::from_reader(&mut reader)\n    }\n\n    pub fn from_reader<R>(rdr: R) -> Result<Vec<Signature>, Error>\n    where\n        R: io::Read,\n    {\n        let (rdr, _format) = niffler::get_reader(Box::new(rdr))?;\n\n        let sigs: Vec<Signature> = serde_json::from_reader(rdr)?;\n        Ok(sigs)\n    }\n\n    pub fn load_signatures<R>(\n        buf: R,\n        ksize: Option<usize>,\n        moltype: Option<HashFunctions>,\n        _scaled: Option<u64>,\n    ) -> Result<Vec<Signature>, Error>\n    where\n        R: io::Read,\n    {\n        let orig_sigs = Signature::from_reader(buf)?;\n\n        let flat_sigs = orig_sigs.into_iter().flat_map(|s| {\n            s.signatures\n                .iter()\n                .map(|mh| {\n                    let mut new_s = s.clone();\n                    new_s.signatures = vec![mh.clone()];\n                    new_s\n                })\n                .collect::<Vec<Signature>>()\n        });\n\n        let filtered_sigs = flat_sigs.filter_map(|mut sig| {\n            let good_mhs: Vec<Sketch> = sig\n                .signatures\n                .into_iter()\n                .filter(|sig| {\n                    match sig {\n                        Sketch::MinHash(mh) => {\n                            if let Some(k) = ksize {\n                                if k != mh.ksize() {\n                                    return false;\n                                }\n                            };\n\n                            match &moltype {\n                                Some(x) => {\n                                    if mh.hash_function() == *x {\n                                        return true;\n                                    }\n                                }\n                                None => return true, // TODO: match previous behavior\n                            };\n                        }\n                        Sketch::LargeMinHash(mh) => {\n                            if let Some(k) = ksize {\n                                if k != mh.ksize() {\n                                    return false;\n                                }\n                            };\n\n                            match &moltype {\n                                Some(x) => {\n                                    if mh.hash_function() == *x {\n                                        return true;\n                                    }\n                                }\n                                None => return true, // TODO: match previous behavior\n                            };\n                        }\n                        Sketch::HyperLogLog(_) => unimplemented!(),\n                    };\n                    false\n                })\n                .collect();\n\n            if good_mhs.is_empty() {\n                return None;\n            };\n\n            sig.signatures = good_mhs;\n            Some(sig)\n        });\n\n        Ok(filtered_sigs.collect())\n    }\n\n    pub fn add_sequence(&mut self, seq: &[u8], force: bool) -> Result<(), Error> {\n        cfg_if! {\n        if #[cfg(feature = \"parallel\")] {\n            self.signatures\n                .par_iter_mut()\n                .try_for_each(|sketch| {\n                    sketch.add_sequence(seq, force) }\n                )?;\n        } else {\n            for sketch in self.signatures.iter_mut(){\n                sketch.add_sequence(seq, force)?;\n            }\n        }\n        }\n\n        Ok(())\n    }\n\n    pub fn add_protein(&mut self, seq: &[u8]) -> Result<(), Error> {\n        cfg_if! {\n        if #[cfg(feature = \"parallel\")] {\n            self.signatures\n                .par_iter_mut()\n                .try_for_each(|sketch| {\n                    sketch.add_protein(seq) }\n                )?;\n        } else {\n            self.signatures\n                .iter_mut()\n                .try_for_each(|sketch| {\n                    sketch.add_protein(seq) }\n                )?;\n        }\n        }\n\n        Ok(())\n    }\n\n    pub fn iter_mut(&mut self) -> IterMut<'_> {\n        let length = self.signatures.len();\n        IterMut {\n            iter: self.signatures.iter_mut(),\n            length,\n        }\n    }\n\n    pub fn iter(&self) -> Iter<'_> {\n        let length = self.signatures.len();\n        Iter {\n            iter: self.signatures.iter(),\n            length,\n        }\n    }\n}\n\npub struct IterMut<'a> {\n    iter: std::slice::IterMut<'a, Sketch>,\n    length: usize,\n}\n\nimpl<'a> IntoIterator for &'a mut Signature {\n    type Item = &'a mut Sketch;\n    type IntoIter = IterMut<'a>;\n\n    fn into_iter(self) -> IterMut<'a> {\n        self.iter_mut()\n    }\n}\n\nimpl<'a> Iterator for IterMut<'a> {\n    type Item = &'a mut Sketch;\n\n    fn next(&mut self) -> Option<&'a mut Sketch> {\n        if self.length == 0 {\n            None\n        } else {\n            self.length -= 1;\n            self.iter.next()\n        }\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.length, Some(self.length))\n    }\n}\n\npub struct Iter<'a> {\n    iter: std::slice::Iter<'a, Sketch>,\n    length: usize,\n}\n\nimpl<'a> Iterator for Iter<'a> {\n    type Item = &'a Sketch;\n\n    fn next(&mut self) -> Option<&'a Sketch> {\n        if self.length == 0 {\n            None\n        } else {\n            self.length -= 1;\n            self.iter.next()\n        }\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.length, Some(self.length))\n    }\n}\n\nimpl FusedIterator for Iter<'_> {}\n\nimpl ExactSizeIterator for Iter<'_> {\n    fn len(&self) -> usize {\n        self.length\n    }\n}\n\nimpl Clone for Iter<'_> {\n    fn clone(&self) -> Self {\n        Iter {\n            iter: self.iter.clone(),\n            length: self.length,\n        }\n    }\n}\n\nimpl ToWriter for Signature {\n    fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        serde_json::to_writer(writer, &vec![&self])?;\n        Ok(())\n    }\n}\n\nimpl ToWriter for Vec<&Signature> {\n    fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        serde_json::to_writer(writer, &self)?;\n        Ok(())\n    }\n}\n\nimpl Select for Signature {\n    fn select(mut self, selection: &Selection) -> Result<Self, Error> {\n        self.signatures.retain(|s| {\n            let mut valid = true;\n            valid = if let Some(ksize) = selection.ksize() {\n                let k = s.ksize() as u32;\n                let adjusted_ksize = match s.hash_function() {\n                    HashFunctions::Murmur64Protein\n                    | HashFunctions::Murmur64Dayhoff\n                    | HashFunctions::Murmur64Hp => ksize * 3,\n                    _ => ksize,\n                };\n                k == adjusted_ksize\n            } else {\n                valid\n            };\n            // keep compatible scaled if applicable\n            valid = if let Some(sel_scaled) = selection.scaled() {\n                match s {\n                    Sketch::MinHash(mh) => valid && mh.scaled() <= sel_scaled,\n                    // TODO: test LargeMinHash\n                    // Sketch::LargeMinHash(lmh) => valid && lmh.scaled() <= sel_scaled as u64,\n                    _ => valid, // other sketch types or invalid cases\n                }\n            } else {\n                valid // if selection.scaled() is None, keep prior valid\n            };\n            /*\n            valid = if let Some(abund) = selection.abund() {\n                valid && *s.with_abundance() == abund\n            } else {\n                valid\n            };\n            valid = if let Some(moltype) = selection.moltype() {\n                valid && s.moltype() == moltype\n            } else {\n                valid\n            };\n            */\n\n            valid\n        });\n\n        // downsample the retained sketches if needed.\n        if let Some(sel_scaled) = selection.scaled() {\n            for sketch in self.signatures.iter_mut() {\n                // TODO: also account for LargeMinHash\n                if let Sketch::MinHash(mh) = sketch {\n                    if mh.scaled() < sel_scaled {\n                        *sketch = Sketch::MinHash(mh.clone().downsample_scaled(sel_scaled)?);\n                    }\n                }\n            }\n        }\n        Ok(self)\n    }\n}\n\nimpl Default for Signature {\n    fn default() -> Signature {\n        Signature {\n            class: default_class(),\n            email: \"\".to_string(),\n            hash_function: \"0.murmur64\".to_string(),\n            license: default_license(),\n            filename: None,\n            name: None,\n            signatures: Vec::<Sketch>::new(),\n            version: default_version(),\n        }\n    }\n}\n\nimpl PartialEq for Signature {\n    fn eq(&self, other: &Signature) -> bool {\n        let metadata = self.class == other.class\n            && self.email == other.email\n            && self.hash_function == other.hash_function\n            && self.filename == other.filename\n            && self.name == other.name;\n\n        // TODO: find the right signature\n        // as long as we have a matching\n        if let Sketch::MinHash(mh) = &self.signatures[0] {\n            if let Sketch::MinHash(other_mh) = &other.signatures[0] {\n                return metadata && (mh == other_mh);\n            }\n        } else {\n            unimplemented!()\n        }\n        metadata\n    }\n}\n\nimpl TryInto<KmerMinHash> for Signature {\n    type Error = Error;\n\n    fn try_into(self) -> Result<KmerMinHash, Error> {\n        match self.signatures.len() {\n            1 => self\n                .signatures\n                .into_iter()\n                .find_map(|sk| {\n                    if let Sketch::MinHash(mh) = sk {\n                        Some(mh)\n                    } else {\n                        None\n                    }\n                })\n                .ok_or(Error::NoMinHashFound),\n            0 => Err(Error::EmptySignature),\n            _ => Err(Error::MultipleSketchesFound),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n\n    use std::fs::File;\n    use std::io::{BufReader, Read};\n    use std::path::PathBuf;\n\n    use needletail::parse_fastx_reader;\n\n    use crate::cmd::ComputeParameters;\n    use crate::encodings::HashFunctions;\n    use crate::signature::{ReadingFrame, SeqToHashes, SigsTrait};\n\n    use super::Signature;\n\n    use crate::prelude::Select;\n    use crate::selection::Selection;\n    use crate::sketch::Sketch;\n\n    #[test]\n    fn load_sig() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/.sbt.v3/60f7e23c24a8d94791cc7a8680c493f9\");\n\n        let mut reader = BufReader::new(File::open(filename).unwrap());\n        let sigs = Signature::load_signatures(\n            &mut reader,\n            Some(31),\n            Some(\"DNA\".try_into().unwrap()),\n            None,\n        )\n        .unwrap();\n        let _sig_data = sigs[0].clone();\n        // TODO: check sig_data\n    }\n\n    #[test]\n    fn load_signature() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/genome-s10+s11.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        assert_eq!(sigs.len(), 4);\n\n        let sig = sigs.get(0).unwrap();\n        assert_eq!(sig.class, \"sourmash_signature\");\n        assert_eq!(sig.email, \"\");\n        if let Some(ref filename) = sig.filename {\n            assert_eq!(filename, \"-\");\n        }\n        assert_eq!(sig.hash_function, \"0.murmur64\");\n        if let Some(ref name) = sig.name {\n            assert_eq!(name, \"genome-s10+s11\");\n        }\n        assert_eq!(sig.signatures.len(), 1);\n    }\n\n    #[test]\n    fn signature_from_computeparams() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![2, 3, 4])\n            .num_hashes(3u32)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_sequence(b\"ATGC\", false).unwrap();\n\n        assert_eq!(sig.signatures.len(), 3);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 3);\n        assert_eq!(sig.signatures[1].size(), 2);\n        assert_eq!(sig.signatures[2].size(), 1);\n\n        assert_eq!(sig.name_str(), \"\");\n    }\n\n    #[test]\n    fn signature_slow_path() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![2, 3, 4, 5])\n            .num_hashes(3u32)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_sequence(b\"ATGCTN\", true).unwrap();\n\n        assert_eq!(sig.signatures.len(), 4);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 3);\n        assert_eq!(sig.signatures[1].size(), 3);\n        assert_eq!(sig.signatures[2].size(), 2);\n        assert_eq!(sig.signatures[3].size(), 1);\n    }\n\n    #[test]\n    fn signature_add_sequence_protein() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![3, 6])\n            .num_hashes(3u32)\n            .protein(true)\n            .dna(false)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_sequence(b\"ATGCAT\", false).unwrap();\n\n        assert_eq!(sig.signatures.len(), 2);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 3);\n        assert_eq!(sig.signatures[1].size(), 1);\n    }\n\n    #[test]\n    fn signature_add_protein() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![3, 6])\n            .num_hashes(3u32)\n            .protein(true)\n            .dna(false)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_protein(b\"AGY\").unwrap();\n\n        assert_eq!(sig.signatures.len(), 2);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 3);\n        assert_eq!(sig.signatures[1].size(), 2);\n    }\n\n    #[test]\n    fn signature_skipm2n3_add_sequence() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![3, 4, 5, 6])\n            .num_hashes(3u32)\n            .dna(false)\n            .skipm2n3(true)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_sequence(b\"ATGCATGA\", false).unwrap();\n\n        assert_eq!(sig.signatures.len(), 4);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 3);\n        assert_eq!(sig.signatures[1].size(), 3);\n        eprintln!(\"{:?}\", sig.signatures[2]);\n        assert_eq!(sig.signatures[2].size(), 3);\n        assert_eq!(sig.signatures[3].size(), 1);\n    }\n\n    #[test]\n    fn signature_skipm1n3_add_sequence() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![3, 4, 5, 6])\n            .num_hashes(10u32)\n            .dna(false)\n            .skipm1n3(true)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        sig.add_sequence(b\"ATGCATGAATGAC\", false).unwrap();\n\n        assert_eq!(sig.signatures.len(), 4);\n        dbg!(&sig.signatures);\n        assert_eq!(sig.signatures[0].size(), 5);\n        assert_eq!(sig.signatures[1].size(), 4);\n        assert_eq!(sig.signatures[2].size(), 1);\n        assert_eq!(sig.signatures[3].size(), 0);\n    }\n\n    #[test]\n    fn signature_skipm2n3_add_sequence_too_small() {\n        let ksize = 2;\n        let params = ComputeParameters::builder()\n            .ksizes(vec![ksize])\n            .num_hashes(10u32)\n            .dna(false)\n            .skipm2n3(true)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        let result = sig.add_sequence(b\"ATGCATGA\", false);\n\n        match result {\n            Err(error) => {\n                // Convert the error to a string and check the message\n                let error_message = format!(\"{}\", error);\n                assert_eq!(\n                    error_message,\n                    \"Skipmer ksize must be >= n (3), but got ksize: 2\"\n                );\n            }\n            _ => panic!(\"Expected SourmashError::InvalidSkipmerSize\"),\n        }\n    }\n\n    #[test]\n    fn signature_skipm1n3_add_sequence_too_small() {\n        let params = ComputeParameters::builder()\n            .ksizes(vec![2])\n            .num_hashes(10u32)\n            .dna(false)\n            .skipm1n3(true)\n            .build();\n\n        let mut sig = Signature::from_params(&params);\n        let result = sig.add_sequence(b\"ATGCATGA\", false);\n\n        match result {\n            Err(error) => {\n                // Convert the error to a string and check the message\n                let error_message = format!(\"{}\", error);\n                assert_eq!(\n                    error_message,\n                    \"Skipmer ksize must be >= n (3), but got ksize: 2\"\n                );\n            }\n            _ => panic!(\"Expected SourmashError::InvalidSkipmerSize\"),\n        }\n    }\n\n    #[test]\n    fn signature_add_sequence_cp() {\n        let mut cp = ComputeParameters::default();\n        cp.set_dayhoff(true);\n        cp.set_protein(true);\n        cp.set_hp(true);\n        cp.set_dna(true);\n\n        let mut sig = Signature::from_params(&cp);\n\n        let mut data: Vec<u8> = vec![];\n        let mut f = File::open(\"../../tests/test-data/ecoli.genes.fna\").unwrap();\n        let _ = f.read_to_end(&mut data);\n\n        let mut parser = parse_fastx_reader(&data[..]).unwrap();\n        while let Some(record) = parser.next() {\n            let record = record.unwrap();\n            sig.add_sequence(&record.seq(), false).unwrap();\n        }\n\n        assert_eq!(sig.size(), 12);\n        for sk in sig.iter() {\n            assert_eq!(sk.size(), 500);\n        }\n    }\n\n    #[test]\n    fn load_minhash_from_signature() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47.fa.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        assert_eq!(sigs.len(), 1);\n\n        let sig = sigs.get(0).unwrap();\n        let mh = sig.minhash().unwrap();\n        assert_eq!(mh.scaled(), 1000);\n    }\n\n    #[test]\n    fn load_single_sketch_from_signature() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47.fa.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        assert_eq!(sigs.len(), 1);\n\n        let sig = sigs.get(0).unwrap();\n        let mhdirect = sig.minhash().unwrap();\n        let sketch = sig.get_sketch().unwrap();\n        if let Sketch::MinHash(mh) = sketch {\n            assert_eq!(mh.scaled(), 1000);\n            assert_eq!(mhdirect, mh); // should be the same\n        } else {\n            // error\n            assert!(false);\n        }\n    }\n\n    #[test]\n    #[should_panic]\n    fn get_sketch_multisketch_panic() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47.fa.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        assert_eq!(sigs.len(), 1);\n\n        let sig = sigs.get(0).unwrap();\n        let mut mhdirect = sig.minhash().unwrap().clone();\n        // change slightly and push into new_sig\n        mhdirect.add_sequence(b\"ATGGA\", false).unwrap();\n        let new_sketch = Sketch::MinHash(mhdirect.clone());\n        let mut new_sig = sig.clone();\n        new_sig.push(new_sketch);\n        // check there are now two sketches in new_sig\n        assert_eq!(new_sig.signatures.len(), 2);\n\n        let _ = new_sig.get_sketch();\n    }\n\n    #[test]\n    #[should_panic]\n    fn load_minhash_multisketch_panic() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47.fa.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        assert_eq!(sigs.len(), 1);\n\n        let sig = sigs.get(0).unwrap();\n        let mut mhdirect = sig.minhash().unwrap().clone();\n        // change slightly and push into new_sig\n        mhdirect.add_sequence(b\"ATGGA\", false).unwrap();\n        let new_sketch = Sketch::MinHash(mhdirect.clone());\n        let mut new_sig = sig.clone();\n        new_sig.push(new_sketch);\n        // check there are now two sketches in new_sig\n        assert_eq!(new_sig.signatures.len(), 2);\n\n        let _ = new_sig.minhash();\n    }\n\n    #[test]\n    fn selection_with_downsample() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(2000);\n        // iterate and check scaled\n        for sig in &sigs {\n            let modified_sig = sig.clone().select(&selection).unwrap();\n            for sketch in modified_sig.iter() {\n                if let Sketch::MinHash(mh) = sketch {\n                    dbg!(\"scaled: {:?}\", mh.scaled());\n                    assert_eq!(mh.scaled(), 2000);\n                }\n            }\n        }\n    }\n\n    #[test]\n    fn selection_protein() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\n            \"../../tests/test-data/prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        );\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        let prot_ksize = 19;\n        selection.set_ksize(prot_ksize);\n        let selected_sig = sigs[0].clone().select(&selection).unwrap();\n        let mh = selected_sig.minhash().unwrap();\n        assert_eq!(mh.ksize(), prot_ksize as usize * 3);\n    }\n\n    #[test]\n    fn selection_dayhoff() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\n            \"../../tests/test-data/prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        );\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        let prot_ksize = 19;\n        selection.set_ksize(prot_ksize);\n        selection.set_moltype(crate::encodings::HashFunctions::Murmur64Dayhoff);\n        let selected_sig = sigs[0].clone().select(&selection).unwrap();\n        let mh = selected_sig.minhash().unwrap();\n        assert_eq!(mh.ksize(), prot_ksize as usize * 3);\n    }\n\n    #[test]\n    fn selection_hp() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename\n            .push(\"../../tests/test-data/prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        let prot_ksize = 19;\n        selection.set_ksize(prot_ksize);\n        selection.set_moltype(crate::encodings::HashFunctions::Murmur64Hp);\n        let selected_sig = sigs[0].clone().select(&selection).unwrap();\n        let mh = selected_sig.minhash().unwrap();\n        assert_eq!(mh.ksize(), prot_ksize as usize * 3);\n    }\n\n    #[test]\n    fn selection_protein2() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\n            \"../../tests/test-data/prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        );\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        let prot_ksize = 19;\n        selection.set_ksize(prot_ksize * 3);\n        let selected_sig = sigs[0].clone().select(&selection).unwrap();\n        let mh = selected_sig.minhash();\n        assert!(mh.is_none());\n    }\n\n    #[test]\n    fn selection_scaled_too_low() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/47+63-multisig.sig\");\n\n        let file = File::open(filename).unwrap();\n        let reader = BufReader::new(file);\n        let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n        // create Selection object\n        let mut selection = Selection::default();\n        selection.set_scaled(100);\n        // iterate and check no sigs are returned (original scaled is 1000)\n        for sig in &sigs {\n            let modified_sig = sig.clone().select(&selection).unwrap();\n            assert_eq!(modified_sig.size(), 0);\n        }\n    }\n\n    #[test]\n    fn test_readingframe_dna() {\n        let sequence = b\"AGTCGT\";\n        let frame = ReadingFrame::new_dna(sequence);\n\n        assert_eq!(frame.fw(), sequence.as_slice());\n        assert_eq!(frame.rc(), b\"ACGACT\".as_slice());\n    }\n\n    #[test]\n    fn test_fw_dna() {\n        let dna_frame = ReadingFrame::DNA {\n            fw: b\"ATCG\".to_vec(),\n            rc: b\"CGAT\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(dna_frame.fw(), b\"ATCG\");\n    }\n\n    #[test]\n    fn test_rc_dna() {\n        let dna_frame = ReadingFrame::DNA {\n            fw: b\"ATCG\".to_vec(),\n            rc: b\"CGAT\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(dna_frame.rc(), b\"CGAT\");\n    }\n\n    #[test]\n    fn test_length_dna() {\n        let dna_frame = ReadingFrame::DNA {\n            fw: b\"ATCG\".to_vec(),\n            rc: b\"CGAT\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(dna_frame.length(), 4);\n    }\n\n    #[test]\n    fn test_frame_type_dna() {\n        let dna_frame = ReadingFrame::DNA {\n            fw: b\"ATCG\".to_vec(),\n            rc: b\"CGAT\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(dna_frame.frame_type(), \"DNA\");\n    }\n\n    #[test]\n    fn test_fw_protein() {\n        let protein_frame = ReadingFrame::Protein {\n            fw: b\"MVHL\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(protein_frame.fw(), b\"MVHL\");\n    }\n\n    #[test]\n    #[should_panic(expected = \"Reverse complement is only available for DNA frames\")]\n    fn test_rc_protein_panics() {\n        let protein_frame = ReadingFrame::Protein {\n            fw: b\"MVHL\".to_vec(),\n            len: 4,\n        };\n        protein_frame.rc();\n    }\n\n    #[test]\n    fn test_length_protein() {\n        let protein_frame = ReadingFrame::Protein {\n            fw: b\"MVHL\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(protein_frame.length(), 4);\n    }\n\n    #[test]\n    fn test_frame_type_protein() {\n        let protein_frame = ReadingFrame::Protein {\n            fw: b\"MVHL\".to_vec(),\n            len: 4,\n        };\n        assert_eq!(protein_frame.frame_type(), \"Protein\");\n    }\n\n    #[test]\n    fn test_readingframe_display_protein() {\n        // Create a Protein ReadingFrame\n        let protein_frame = ReadingFrame::Protein {\n            fw: b\"MVHLK\".to_vec(),\n            len: 5,\n        };\n\n        let output = format!(\"{}\", protein_frame);\n        // Assert the output matches the expected format\n        assert_eq!(output, \"Type: Protein (5aa), Forward: MVHLK\");\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_dna() {\n        let sequence = b\"AGTCGT\";\n        let hash_function = HashFunctions::Murmur64Dna;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        assert_eq!(frames.len(), 1);\n        assert_eq!(frames[0].fw(), sequence.as_slice());\n        assert_eq!(frames[0].rc(), b\"ACGACT\".as_slice());\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_is_protein() {\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = true;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        assert_eq!(frames.len(), 1);\n        assert_eq!(frames[0].fw(), sequence.as_slice());\n    }\n\n    #[test]\n    fn test_readingframe_protein() {\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let frame =\n            ReadingFrame::new_protein(sequence, hash_function.dayhoff(), hash_function.hp());\n\n        assert_eq!(frame.fw(), sequence.as_slice());\n    }\n\n    #[test]\n    #[should_panic]\n    fn test_seqtohashes_frames_is_protein_try_access_rc() {\n        // test panic if trying to access rc\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = true;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        // protein frame doesn't have rc; this should panic\n        eprintln!(\"{:?}\", frames[0].rc());\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_is_protein_dayhoff() {\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let dayhoff_seq = b\"eeebbbcdbcedbbf\";\n        let hash_function = HashFunctions::Murmur64Dayhoff;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = true;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        assert_eq!(frames.len(), 1);\n        assert_eq!(frames[0].fw(), dayhoff_seq.as_slice());\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_is_protein_hp() {\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let hp_seq = b\"hhhphhpppphphhh\";\n        let hash_function = HashFunctions::Murmur64Hp;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = true;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        assert_eq!(frames.len(), 1);\n        assert_eq!(frames[0].fw(), hp_seq.as_slice());\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_translate_protein() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        assert_eq!(frames[0].fw(), b\"SRRA\".as_slice());\n        assert_eq!(frames[1].fw(), b\"SSTT\".as_slice());\n        assert_eq!(frames[2].fw(), b\"VVE\".as_slice());\n        assert_eq!(frames[3].fw(), b\"ARR\".as_slice());\n        assert_eq!(frames[4].fw(), b\"SSS\".as_slice());\n        assert_eq!(frames[5].fw(), b\"LDD\".as_slice());\n    }\n\n    #[test]\n    fn test_readingframe_translate() {\n        let sequence = b\"AGTCGT\";\n        let frame_start = 3; // four frames but translate can only\n\n        let result = ReadingFrame::new_translated(sequence, frame_start, false, false);\n\n        match result {\n            Err(error) => {\n                // Convert the error to a string and check the message\n                let error_message = format!(\"{}\", error);\n                assert_eq!(error_message, \"Frame number must be 0, 1, or 2, but got 3\");\n            }\n            _ => panic!(\"Expected SourmashError::InvalidTranslateFrame\"),\n        }\n    }\n\n    #[test]\n    fn test_readingframe_skipmer() {\n        let sequence = b\"AGTCGT\";\n        let m = 2;\n        let n = 3;\n        let num_frames = 4; // four frames but n is only 3\n\n        let result = ReadingFrame::new_skipmer(sequence, num_frames, m, n);\n\n        match result {\n            Err(error) => {\n                // Convert the error to a string and check the message\n                let error_message = format!(\"{}\", error);\n                assert_eq!(\n                    error_message,\n                    \"Skipmer frame number must be < n (3), but got start: 4\"\n                );\n            }\n            _ => panic!(\"Expected SourmashError::InvalidSkipmerFrame\"),\n        }\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_skipmer_m1n3() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Skipm1n3; // Represents m=1, n=3\n        let k_size = 3; // K-mer size is not directly relevant for skipmer frame validation\n        let seed = 42; // Seed is also irrelevant for frame structure\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n\n        eprintln!(\"Frames: {:?}\", frames);\n\n        assert_eq!(frames.len(), 3); // Three skipmer frames\n\n        // Expected skipmer sequences for m=1, n=3 (keep-1, skip-2)\n        assert_eq!(frames[0].fw(), b\"ACCG\".as_slice());\n        assert_eq!(frames[0].rc(), b\"CGGT\".as_slice());\n\n        assert_eq!(frames[1].fw(), b\"GGGC\".as_slice());\n        assert_eq!(frames[1].rc(), b\"GCCC\".as_slice());\n\n        assert_eq!(frames[2].fw(), b\"TTAT\".as_slice());\n        assert_eq!(frames[2].rc(), b\"ATAA\".as_slice());\n    }\n\n    #[test]\n    fn test_seqtohashes_frames_skipmer_m2n3() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Skipm2n3;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames;\n        eprintln!(\"Frames: {:?}\", frames);\n\n        assert_eq!(frames.len(), 3); // Three skipmer frames\n\n        // Expected skipmer sequences for m=1, n=3 (keep-1, skip-2)\n        assert_eq!(frames[0].fw(), b\"AGCGCGGC\".as_slice());\n        assert_eq!(frames[0].rc(), b\"GCCGCGCT\".as_slice());\n\n        assert_eq!(frames[1].fw(), b\"GTGTGACT\".as_slice());\n        assert_eq!(frames[1].rc(), b\"AGTCACAC\".as_slice());\n\n        assert_eq!(frames[2].fw(), b\"TCTCAGT\".as_slice());\n        assert_eq!(frames[2].rc(), b\"ACTGAGA\".as_slice());\n    }\n\n    #[test]\n    fn test_seqtohashes_dna() {\n        let sequence = b\"AGTCGT\";\n        let hash_function = HashFunctions::Murmur64Dna;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n\n        // Expected k-mers from the forward and reverse complement sequence\n        let expected_kmers = vec![\n            (b\"AGT\".to_vec(), b\"ACT\".to_vec()),\n            (b\"GTC\".to_vec(), b\"GAC\".to_vec()),\n            (b\"TCG\".to_vec(), b\"CGA\".to_vec()),\n            (b\"CGT\".to_vec(), b\"ACG\".to_vec()),\n        ];\n\n        // Compute expected hashes from expected kmers\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|(fw_kmer, rc_kmer)| crate::_hash_murmur(std::cmp::min(fw_kmer, rc_kmer), seed))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(\n            sth_hashes, expected_hashes,\n            \"Hashes do not match in order for SeqToHashes\"\n        );\n    }\n\n    #[test]\n    fn test_seqtohashes_dna_2() {\n        let sequence = b\"AGTCGTCA\";\n        let k_size = 7;\n        let seed = 42;\n        let force = true; // Force skip over invalid bases if needed\n        let is_protein = false;\n        // Initialize SeqToHashes iterator using the new constructor\n        let mut seq_to_hashes = SeqToHashes::new(\n            sequence,\n            k_size,\n            force,\n            is_protein,\n            HashFunctions::Murmur64Dna,\n            seed,\n        )\n        .unwrap();\n\n        // Define expected hashes for the kmer configuration.\n        let expected_kmers = [\"AGTCGTC\", \"GTCGTCA\"];\n        let expected_krc = [\"GACGACT\", \"TGACGAC\"];\n\n        // Compute expected hashes by hashing each k-mer with its reverse complement\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .zip(expected_krc.iter())\n            .map(|(kmer, krc)| {\n                // Convert both kmer and krc to byte slices and pass to _hash_murmur\n                crate::_hash_murmur(std::cmp::min(kmer.as_bytes(), krc.as_bytes()), seed)\n            })\n            .collect();\n\n        // Compare each produced hash from the iterator with the expected hash\n        for expected_hash in expected_hashes {\n            let hash = seq_to_hashes.next().unwrap().ok().unwrap();\n            assert_eq!(hash, expected_hash, \"Mismatch in DNA hash\");\n        }\n    }\n\n    #[test]\n    fn test_seqtohashes_is_protein() {\n        let sequence = b\"MVLSPADKTNVKAAW\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let k_size = 3;\n        let seed = 42;\n        let force = false;\n        let is_protein = true;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size * 3, force, is_protein, hash_function, seed).unwrap();\n\n        // Expected k-mers for protein sequence\n        let expected_kmers = vec![\n            b\"MVL\".to_vec(),\n            b\"VLS\".to_vec(),\n            b\"LSP\".to_vec(),\n            b\"SPA\".to_vec(),\n            b\"PAD\".to_vec(),\n            b\"ADK\".to_vec(),\n            b\"DKT\".to_vec(),\n            b\"KTN\".to_vec(),\n            b\"TNV\".to_vec(),\n            b\"NVK\".to_vec(),\n            b\"VKA\".to_vec(),\n            b\"KAA\".to_vec(),\n            b\"AAW\".to_vec(),\n        ];\n\n        // Compute hashes for expected k-mers\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|fw_kmer| crate::_hash_murmur(fw_kmer, 42))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(sth_hashes, expected_hashes, \"Hashes do not match in order\");\n    }\n\n    #[test]\n    fn test_seqtohashes_translate() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Protein;\n        let k_size = 9; // needs to be *3 for protein\n        let seed = 42;\n        let force = false;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n\n        let expected_kmers = vec![\n            b\"SRR\".as_slice(),\n            b\"RRA\".as_slice(),\n            b\"SST\".as_slice(),\n            b\"STT\".as_slice(),\n            b\"VVE\".as_slice(),\n            b\"ARR\".as_slice(),\n            b\"SSS\".as_slice(),\n            b\"LDD\".as_slice(),\n        ];\n\n        // Compute expected hashes\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|fw_kmer| crate::_hash_murmur(fw_kmer, seed))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(\n            sth_hashes, expected_hashes,\n            \"Hashes do not match in order for SeqToHashes\"\n        );\n    }\n\n    #[test]\n    fn test_seqtohashes_skipm1n3() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Skipm1n3;\n        let k_size = 3;\n        let is_protein = false;\n        let seed = 42;\n        let force = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        // Expected k-mers for skipmer (m=1, n=3) across all frames\n        let expected_kmers = vec![\n            (b\"ACC\".as_slice(), b\"GGT\".as_slice()),\n            (b\"CCG\".as_slice(), b\"CGG\".as_slice()),\n            (b\"GGG\".as_slice(), b\"CCC\".as_slice()),\n            (b\"GGC\".as_slice(), b\"GCC\".as_slice()),\n            (b\"TTA\".as_slice(), b\"TAA\".as_slice()),\n            (b\"TAT\".as_slice(), b\"ATA\".as_slice()),\n        ];\n\n        // Compute expected hashes\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|(fw_kmer, rc_kmer)| crate::_hash_murmur(std::cmp::min(fw_kmer, rc_kmer), seed))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(\n            sth_hashes, expected_hashes,\n            \"Hashes do not match in order for SeqToHashes\"\n        );\n    }\n\n    #[test]\n    fn test_seq2hashes_skipm2n3() {\n        let sequence = b\"AGTCGTCGAGCT\";\n        let hash_function = HashFunctions::Murmur64Skipm2n3;\n        let k_size = 7;\n        let is_protein = false;\n        let seed = 42;\n        let force = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n\n        // Expected k-mers for skipmer (m=2, n=3)\n        let expected_kmers = vec![\n            (b\"AGCGCGG\".as_slice(), b\"CCGCGCT\".as_slice()),\n            (b\"GCGCGGC\".as_slice(), b\"GCCGCGC\".as_slice()),\n            (b\"GTGTGAC\".as_slice(), b\"GTCACAC\".as_slice()),\n            (b\"TGTGACT\".as_slice(), b\"AGTCACA\".as_slice()),\n            (b\"TCTCAGT\".as_slice(), b\"ACTGAGA\".as_slice()),\n        ];\n\n        // Compute expected hashes\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|(fw_kmer, rc_kmer)| crate::_hash_murmur(std::cmp::min(fw_kmer, rc_kmer), seed))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(\n            sth_hashes, expected_hashes,\n            \"Hashes do not match in order for SeqToHashes\"\n        );\n    }\n\n    #[test]\n    fn test_seqtohashes_skipm2n3_2() {\n        let sequence = b\"AGTCGTCA\";\n        let hash_function = HashFunctions::Murmur64Skipm2n3;\n        let k_size = 5;\n        let seed = 42;\n        let force = true;\n        let is_protein = false;\n\n        let sth =\n            SeqToHashes::new(sequence, k_size, force, is_protein, hash_function, seed).unwrap();\n        let frames = sth.frames.clone();\n        for fr in frames {\n            eprintln!(\"{}\", fr);\n        }\n\n        let expected_kmers = vec![\n            (b\"AGCGC\".as_slice(), b\"GCGCT\".as_slice()),\n            (b\"GCGCA\".as_slice(), b\"TGCGC\".as_slice()),\n            (b\"GTGTA\".as_slice(), b\"TACAC\".as_slice()),\n        ];\n\n        // Compute expected hashes\n        let expected_hashes: Vec<u64> = expected_kmers\n            .iter()\n            .map(|(fw_kmer, rc_kmer)| crate::_hash_murmur(std::cmp::min(fw_kmer, rc_kmer), seed))\n            .collect();\n\n        // Collect hashes from SeqToHashes\n        let sth_hashes: Vec<u64> = sth.map(|result| result.unwrap()).collect();\n        eprintln!(\"SeqToHashes hashes: {:?}\", sth_hashes);\n\n        // Check that SeqToHashes matches expected hashes in order\n        assert_eq!(\n            sth_hashes, expected_hashes,\n            \"Hashes do not match in order for SeqToHashes\"\n        );\n    }\n}\n"
  },
  {
    "path": "src/core/src/sketch/hyperloglog/estimators.rs",
    "content": "use core::{\n    cmp,\n    ops::{Add, AddAssign, Shl, Sub, SubAssign},\n};\n\npub type CounterType = u8;\n\n/// Trait for types that can be used as multiplicity integers.\npub trait MultiplicityInteger:\n    Shl<usize, Output = Self>\n    + Copy\n    + AddAssign\n    + SubAssign\n    + Eq\n    + Sub<Self, Output = Self>\n    + Add<Self, Output = Self>\n    + TryFrom<usize>\n    + Ord\n{\n    /// The zero value.\n    const ZERO: Self;\n    /// The one value.\n    const ONE: Self;\n\n    /// Convert the value to a `f64`.\n    fn to_f64(self) -> f64;\n}\n\nmacro_rules! impl_multiplicity_integer {\n    ($($t:ty),*) => {\n        $(\n            impl MultiplicityInteger for $t {\n                const ONE: Self = 1;\n                const ZERO: Self = 0;\n\n                fn to_f64(self) -> f64 {\n                    self as f64\n                }\n            }\n        )*\n    };\n}\n\nimpl_multiplicity_integer!(u8, u16, u32);\n\npub fn counts<M: MultiplicityInteger>(registers: &[CounterType], q: usize) -> Vec<M> {\n    let mut counts = vec![M::ZERO; q + 2];\n\n    for k in registers {\n        counts[*k as usize] += M::ONE;\n    }\n\n    counts\n}\n\n#[allow(clippy::many_single_char_names)]\npub fn mle<M: MultiplicityInteger>(counts: &[M], p: usize, q: usize, relerr: f64) -> f64 {\n    let m: M = M::ONE << p;\n\n    // If all of the registers are equal to zero, then we return zero.\n    if counts[0] == m {\n        return 0.0;\n    }\n\n    // If all of the registers are equal to the maximal possible value\n    // that a register may have, then we return infinity.\n    if counts[q + 1] == m {\n        return f64::INFINITY;\n    }\n\n    let (k_min, _) = counts\n        .iter()\n        .enumerate()\n        .find(|(_, v)| **v != M::ZERO)\n        .unwrap();\n    let k_min_prime = cmp::max(1, k_min);\n\n    let (k_max, _) = counts\n        .iter()\n        .enumerate()\n        .rev()\n        .find(|(_, v)| **v != M::ZERO)\n        .unwrap();\n    let k_max_prime = cmp::min(q, k_max);\n\n    let mut z = 0.;\n    for i in num_iter::range_step_inclusive(k_max_prime as i32, k_min_prime as i32, -1) {\n        z = 0.5 * z + counts[i as usize].to_f64();\n    }\n\n    // ldexp(x, i) = x * (2 ** i)\n    z *= 2f64.powi(-(k_min_prime as i32));\n\n    let mut c_prime = counts[q + 1];\n    if q >= 1 {\n        c_prime += counts[k_max_prime];\n    }\n\n    let mut g_prev = 0.;\n    let a = z + (counts[0].to_f64());\n    let b = z + (counts[q + 1].to_f64()) * 2f64.powi(-(q as i32));\n    let m_prime = (m - counts[0]).to_f64();\n\n    let mut x = if b <= 1.5 * a {\n        // weak lower bound (47)\n        m_prime / (0.5 * b + a)\n    } else {\n        // strong lower bound (46)\n        m_prime / (b * (1. + b / a).ln())\n    };\n\n    let mut delta_x = x;\n    let del = relerr / m.to_f64().sqrt();\n    while delta_x > x * del {\n        // secant method iteration\n\n        let kappa: usize = az::saturating_cast(2. + x.log2().floor());\n\n        // x_prime in [0, 0.25]\n        let mut x_prime = x * 2f64.powi(-(cmp::max(k_max_prime, kappa) as i32) - 1);\n        let x_pp = x_prime * x_prime;\n\n        // Taylor approximation (58)\n        let mut h = x_prime - (x_pp / 3.) + (x_pp * x_pp) * (1. / 45. - x_pp / 472.5);\n\n        // Calculate h(x/2^k), see (56), at this point x_prime = x / (2^(k+2))\n        for _k in num_iter::range_step_inclusive(kappa as i32 - 1, k_max_prime as i32, -1) {\n            let h_prime = 1. - h;\n            h = (x_prime + h * h_prime) / (x_prime + h_prime);\n            x_prime += x_prime;\n        }\n\n        // compare (53)\n        let mut g = c_prime.to_f64() * h;\n\n        for k in num_iter::range_step_inclusive(k_max_prime as i32 - 1, k_min_prime as i32, -1) {\n            let h_prime = 1. - h;\n            // Calculate h(x/2^k), see (56), at this point x_prime = x / (2^(k+2))\n            h = (x_prime + h * h_prime) / (x_prime + h_prime);\n            g += counts[k as usize].to_f64() * h;\n            x_prime += x_prime;\n        }\n\n        g += x * a;\n        delta_x = if (g > g_prev) | (m_prime >= g) {\n            // see (54)\n            delta_x * (m_prime - g) / (g - g_prev)\n        } else {\n            0.\n        };\n\n        x += delta_x;\n        g_prev = g\n    }\n\n    m.to_f64() * x\n}\n\n/// Calculate the joint maximum likelihood of A and B.\n///\n/// Returns a tuple (only in A, only in B, intersection)\npub fn joint_mle(\n    k1: &[CounterType],\n    k2: &[CounterType],\n    p: usize,\n    q: usize,\n) -> (usize, usize, usize) {\n    if p < 8 {\n        joint_mle_dispatch::<u8>(k1, k2, p, q)\n    } else if p < 16 {\n        joint_mle_dispatch::<u16>(k1, k2, p, q)\n    } else {\n        assert!(p == 16 || p == 17 || p == 18);\n        joint_mle_dispatch::<u32>(k1, k2, p, q)\n    }\n}\n\n/// Calculate the joint maximum likelihood of A and B.\n///\n/// Returns a tuple (only in A, only in B, intersection)\nfn joint_mle_dispatch<M: MultiplicityInteger>(\n    k1: &[CounterType],\n    k2: &[CounterType],\n    p: usize,\n    q: usize,\n) -> (usize, usize, usize)\nwhere\n    <M as TryFrom<usize>>::Error: std::fmt::Debug,\n{\n    let mut c1 = vec![M::ZERO; q + 2];\n    let mut c2 = vec![M::ZERO; q + 2];\n    let mut cu = vec![M::ZERO; q + 2];\n    let mut cg1 = vec![M::ZERO; q + 2];\n    let mut cg2 = vec![M::ZERO; q + 2];\n    let mut ceq = vec![M::ZERO; q + 2];\n\n    for (k1_, k2_) in k1.iter().zip(k2.iter()) {\n        match k1_.cmp(k2_) {\n            cmp::Ordering::Less => {\n                c1[*k1_ as usize] += M::ONE;\n                cg2[*k2_ as usize] += M::ONE;\n            }\n            cmp::Ordering::Greater => {\n                cg1[*k1_ as usize] += M::ONE;\n                c2[*k2_ as usize] += M::ONE;\n            }\n            cmp::Ordering::Equal => {\n                ceq[*k1_ as usize] += M::ONE;\n            }\n        }\n        cu[*cmp::max(k1_, k2_) as usize] += M::ONE;\n    }\n\n    for (i, (&v, &u)) in cg1.iter().zip(ceq.iter()).enumerate() {\n        c1[i] += v + u;\n    }\n\n    for (i, (&v, &u)) in cg2.iter().zip(ceq.iter()).enumerate() {\n        c2[i] += v + u;\n    }\n\n    let c_ax = mle(&c1, p, q, 0.01);\n    let c_bx = mle(&c2, p, q, 0.01);\n    let c_abx = mle(&cu, p, q, 0.01);\n\n    let mut counts_axb_half = vec![M::ZERO; q + 2];\n    let mut counts_bxa_half = vec![M::ZERO; q + 2];\n\n    counts_axb_half[q] = M::try_from(k1.len()).unwrap();\n    counts_bxa_half[q] = M::try_from(k2.len()).unwrap();\n\n    for _q in 0..q {\n        counts_axb_half[_q] = cg1[_q] + ceq[_q] + cg2[_q + 1];\n        debug_assert!(counts_axb_half[q] >= counts_axb_half[_q]);\n        let multiplicity_q = counts_axb_half[_q];\n        counts_axb_half[q] -= multiplicity_q;\n\n        counts_bxa_half[_q] = cg2[_q] + ceq[_q] + cg1[_q + 1];\n        debug_assert!(counts_bxa_half[q] >= counts_bxa_half[_q]);\n        let multiplicity_q = counts_bxa_half[_q];\n        counts_bxa_half[q] -= multiplicity_q;\n    }\n\n    let c_axb_half = mle(&counts_axb_half, p, q - 1, 0.01);\n    let c_bxa_half = mle(&counts_bxa_half, p, q - 1, 0.01);\n\n    let cx1 = 1.5 * c_bx + 1.5 * c_ax - c_bxa_half - c_axb_half;\n    let cx2 = 2. * (c_bxa_half + c_axb_half) - 3. * c_abx;\n\n    (\n        (c_abx - c_bx) as usize,\n        (c_abx - c_ax) as usize,\n        cmp::max(0, (0.5 * (cx1 + cx2)) as usize),\n    )\n}\n"
  },
  {
    "path": "src/core/src/sketch/hyperloglog/mod.rs",
    "content": "/*\nBased on the HyperLogLog implementations in khmer\n  https://github.com/dib-lab/khmer/blob/fb65d21eaedf0d397d49ae3debc578897f9d6eb4/src/oxli/hllcounter.cc\nusing the maximum likelihood estimators from\n  https://oertl.github.io/hyperloglog-sketch-estimation-paper/paper/paper.pdf\nfirst implemented for genomics in dashing\n  https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1875-0\n*/\n\nuse std::cmp;\nuse std::fs::File;\nuse std::io;\nuse std::path::Path;\n\nuse byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};\nuse serde::{Deserialize, Serialize};\n\nuse crate::Error;\nuse crate::HashIntoType;\nuse crate::encodings::HashFunctions;\nuse crate::prelude::*;\nuse crate::signature::SigsTrait;\nuse crate::sketch::KmerMinHash;\n\npub mod estimators;\nuse estimators::CounterType;\n\n#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\npub struct HyperLogLog {\n    registers: Vec<CounterType>,\n    p: usize,\n    q: usize,\n    ksize: usize,\n}\n\nimpl HyperLogLog {\n    pub fn with_error_rate(error_rate: f64, ksize: usize) -> Result<HyperLogLog, Error> {\n        let p = f64::ceil(f64::log2(f64::powi(1.04 / error_rate, 2)));\n        HyperLogLog::new(p as usize, ksize)\n    }\n\n    pub fn new(p: usize, ksize: usize) -> Result<HyperLogLog, Error> {\n        if !(4..=18).contains(&p) {\n            return Err(Error::HLLPrecisionBounds);\n        }\n\n        let size = (1_usize) << p;\n        let registers = vec![0; size];\n\n        Ok(HyperLogLog {\n            registers,\n            ksize,\n            p,\n            q: 64 - p, // FIXME: allow setting q explicitly\n        })\n    }\n\n    pub fn merge(&mut self, other: &HyperLogLog) -> Result<(), Error> {\n        self.check_compatible(other)?;\n        self.registers\n            .iter_mut()\n            .zip(other.registers.iter())\n            .for_each(|(a, b)| *a = cmp::max(*a, *b));\n        Ok(())\n    }\n\n    pub fn add_word(&mut self, word: &[u8]) {\n        let hash = crate::_hash_murmur(word, 42); // TODO: decide on seed\n        self.add_hash(hash);\n    }\n\n    pub fn add_many(&mut self, hashes: &[HashIntoType]) -> Result<(), Error> {\n        for min in hashes {\n            self.add_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn cardinality(&self) -> usize {\n        if self.p < 8 {\n            estimators::mle(\n                &estimators::counts::<u8>(&self.registers, self.q),\n                self.p,\n                self.q,\n                0.01,\n            ) as usize\n        } else if self.p < 16 {\n            estimators::mle(\n                &estimators::counts::<u16>(&self.registers, self.q),\n                self.p,\n                self.q,\n                0.05,\n            ) as usize\n        } else {\n            assert!(self.p == 16 || self.p == 17 || self.p == 18);\n            estimators::mle(\n                &estimators::counts::<u32>(&self.registers, self.q),\n                self.p,\n                self.q,\n                0.1,\n            ) as usize\n        }\n    }\n\n    pub fn union(&self, other: &HyperLogLog) -> usize {\n        let (only_a, only_b, intersection) =\n            estimators::joint_mle(&self.registers, &other.registers, self.p, self.q);\n\n        only_a + only_b + intersection\n    }\n\n    pub fn similarity(&self, other: &HyperLogLog) -> f64 {\n        let (only_a, only_b, intersection) =\n            estimators::joint_mle(&self.registers, &other.registers, self.p, self.q);\n\n        intersection as f64 / (only_a + only_b + intersection) as f64\n    }\n\n    pub fn containment(&self, other: &HyperLogLog) -> f64 {\n        let (only_a, _, intersection) =\n            estimators::joint_mle(&self.registers, &other.registers, self.p, self.q);\n\n        intersection as f64 / (only_a + intersection) as f64\n    }\n\n    pub fn intersection(&self, other: &HyperLogLog) -> usize {\n        let (_, _, intersection) =\n            estimators::joint_mle(&self.registers, &other.registers, self.p, self.q);\n\n        intersection\n    }\n\n    // save\n    pub fn save<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {\n        // TODO: if it ends with gz, open a compressed file\n        // might use get_output here?\n        self.save_to_writer(&mut File::create(path)?)?;\n        Ok(())\n    }\n\n    pub fn save_to_writer<W>(&self, wtr: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        wtr.write_all(b\"HLL\")?;\n        wtr.write_u8(1)?; // version\n        wtr.write_u8(self.p as u8)?; // number of bits used for indexing\n        wtr.write_u8(self.q as u8)?; // number of bits used for counting leading zeroes\n        wtr.write_u8(self.ksize as u8)?; // ksize\n        wtr.write_all(self.registers.as_slice())?;\n\n        Ok(())\n    }\n\n    pub fn from_reader<R>(rdr: R) -> Result<HyperLogLog, Error>\n    where\n        R: io::Read,\n    {\n        let (mut rdr, _format) = niffler::get_reader(Box::new(rdr))?;\n\n        let signature = rdr.read_u24::<BigEndian>()?;\n        assert_eq!(signature, 0x484c4c);\n\n        let version = rdr.read_u8()?;\n        assert_eq!(version, 1);\n\n        let p = rdr.read_u8()? as usize;\n        let q = rdr.read_u8()? as usize;\n\n        let ksize = rdr.read_u8()? as usize;\n        let n_registers = 1 << p;\n\n        let mut registers = vec![0u8; n_registers];\n        rdr.read_exact(&mut registers)?;\n\n        Ok(HyperLogLog {\n            registers,\n            p,\n            q,\n            ksize,\n        })\n    }\n\n    pub fn from_path<P: AsRef<Path>>(path: P) -> Result<HyperLogLog, Error> {\n        let mut reader = io::BufReader::new(File::open(path)?);\n        HyperLogLog::from_reader(&mut reader)\n    }\n}\n\nimpl SigsTrait for HyperLogLog {\n    fn size(&self) -> usize {\n        self.registers.len()\n    }\n\n    fn to_vec(&self) -> Vec<u64> {\n        self.registers.iter().map(|x| *x as u64).collect()\n    }\n\n    fn ksize(&self) -> usize {\n        self.ksize\n    }\n\n    fn seed(&self) -> u64 {\n        // TODO: support other seeds\n        42\n    }\n\n    fn hash_function(&self) -> HashFunctions {\n        //TODO support other hash functions\n        HashFunctions::Murmur64Dna\n    }\n\n    fn add_hash(&mut self, hash: HashIntoType) {\n        let value = hash >> self.p;\n        let index = (hash - (value << self.p)) as usize;\n\n        let leftmost = value.leading_zeros() + 1 - (self.p as u32);\n\n        let old_value = self.registers[index];\n        self.registers[index] = cmp::max(old_value, leftmost as CounterType);\n    }\n\n    fn check_compatible(&self, other: &HyperLogLog) -> Result<(), Error> {\n        if self.ksize() != other.ksize() {\n            Err(Error::MismatchKSizes)\n        } else if self.size() != other.size() {\n            // TODO: create new error\n            Err(Error::MismatchNum {\n                n1: self.size() as u32,\n                n2: other.size() as u32,\n            })\n        } else {\n            Ok(())\n        }\n    }\n}\n\nimpl Update<HyperLogLog> for KmerMinHash {\n    fn update(&self, other: &mut HyperLogLog) -> Result<(), Error> {\n        for h in self.mins() {\n            other.add_hash(h);\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use std::collections::HashSet;\n    use std::hash::Hasher;\n    use std::hash::{DefaultHasher, Hash};\n    use std::io::{BufReader, BufWriter, Read};\n    use std::path::PathBuf;\n\n    use crate::signature::SigsTrait;\n    use needletail::{Sequence, parse_fastx_file, parse_fastx_reader};\n\n    use super::HyperLogLog;\n\n    // TODO: pull more tests from khmer HLL\n\n    #[test]\n    fn hll_add() {\n        const ERR_RATE: f64 = 0.01;\n        const N_UNIQUE: usize = 3356;\n        const KSIZE: u8 = 21;\n\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/ecoli.genes.fna\");\n\n        let mut hll = HyperLogLog::with_error_rate(ERR_RATE, KSIZE as usize).unwrap();\n        let mut counter: HashSet<Vec<u8>> = HashSet::new();\n\n        let mut parser = parse_fastx_file(filename).unwrap();\n        while let Some(record) = parser.next() {\n            let record = record.unwrap();\n            let norm_seq = record.normalize(false);\n            let rc = norm_seq.reverse_complement();\n\n            hll.add_sequence(&norm_seq, false).unwrap();\n            for (_, kmer, _) in norm_seq.canonical_kmers(KSIZE, &rc) {\n                counter.insert(kmer.into());\n            }\n        }\n\n        assert_eq!(counter.len(), N_UNIQUE);\n\n        let abs_error = (1. - (hll.cardinality() as f64 / N_UNIQUE as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n    }\n\n    #[test]\n    fn hll_joint_mle() {\n        const ERR_RATE: f64 = 0.01;\n        const KSIZE: u8 = 21;\n\n        const N_UNIQUE_H1: usize = 500741;\n        const N_UNIQUE_H2: usize = 995845;\n        const N_UNIQUE_U: usize = 995845;\n        const INTERSECTION: usize = 500838;\n\n        const SIMILARITY: f64 = 0.502783;\n        const CONTAINMENT_H1: f64 = 1.;\n        const CONTAINMENT_H2: f64 = 0.502783;\n\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/genome-s10.fa.gz\");\n\n        let mut hll1 = HyperLogLog::with_error_rate(ERR_RATE, KSIZE as usize).unwrap();\n        let mut hll2 = HyperLogLog::with_error_rate(ERR_RATE, KSIZE as usize).unwrap();\n        let mut hllu = HyperLogLog::with_error_rate(ERR_RATE, KSIZE as usize).unwrap();\n\n        let mut buf = vec![];\n        let (mut reader, _) = niffler::from_path(filename).unwrap();\n        reader.read_to_end(&mut buf).unwrap();\n\n        let mut parser = parse_fastx_reader(&buf[..]).unwrap();\n        while let Some(record) = parser.next() {\n            let record = record.unwrap();\n            let norm_seq = record.normalize(false);\n\n            hll1.add_sequence(&norm_seq, false).unwrap();\n            hllu.add_sequence(&norm_seq, false).unwrap();\n        }\n\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/genome-s10+s11.fa.gz\");\n\n        let mut buf = vec![];\n        let (mut reader, _) = niffler::from_path(filename).unwrap();\n        reader.read_to_end(&mut buf).unwrap();\n\n        let mut parser = parse_fastx_reader(&buf[..]).unwrap();\n        while let Some(record) = parser.next() {\n            let record = record.unwrap();\n            let norm_seq = record.normalize(false);\n\n            hll2.add_sequence(&norm_seq, false).unwrap();\n            hllu.add_sequence(&norm_seq, false).unwrap();\n        }\n\n        let abs_error = (1. - (hll1.cardinality() as f64 / N_UNIQUE_H1 as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let abs_error = (1. - (hll2.cardinality() as f64 / N_UNIQUE_H2 as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let abs_error = (1. - (hll1.union(&hll2) as f64 / N_UNIQUE_U as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let similarity = hll1.similarity(&hll2);\n        let abs_error = (1. - (similarity / SIMILARITY)).abs();\n        assert!(abs_error < ERR_RATE, \"{} {}\", similarity, SIMILARITY);\n\n        let containment = hll1.containment(&hll2);\n        let abs_error = (1. - (containment / CONTAINMENT_H1)).abs();\n        assert!(abs_error < ERR_RATE, \"{} {}\", containment, CONTAINMENT_H1);\n\n        let containment = hll2.containment(&hll1);\n        let abs_error = (1. - (containment / CONTAINMENT_H2)).abs();\n        assert!(abs_error < ERR_RATE, \"{} {}\", containment, CONTAINMENT_H2);\n\n        let intersection = hll1.intersection(&hll2) as f64;\n        let abs_error = (1. - (intersection / INTERSECTION as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{} {}\", intersection, INTERSECTION);\n\n        hll1.merge(&hll2).unwrap();\n\n        let abs_error = (1. - (hllu.similarity(&hll1) / 1.)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let abs_error = (1. - (hllu.containment(&hll1) / 1.)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let abs_error = (1. - (hll1.containment(&hllu) / 1.)).abs();\n        assert!(abs_error < ERR_RATE, \"{}\", abs_error);\n\n        let intersection = hll1.intersection(&hllu) as f64;\n        let abs_error = (1. - (intersection / N_UNIQUE_U as f64)).abs();\n        assert!(abs_error < ERR_RATE, \"{} {}\", intersection, N_UNIQUE_U);\n    }\n\n    #[test]\n    fn save_load_hll() {\n        let mut hll = HyperLogLog::with_error_rate(0.01, 1).expect(\"error building HLL\");\n        for i in 1..5000 {\n            hll.add_hash(i)\n        }\n\n        let mut buf = Vec::new();\n        {\n            let mut writer = BufWriter::new(&mut buf);\n            hll.save_to_writer(&mut writer).unwrap();\n        }\n\n        let mut reader = BufReader::new(&buf[..]);\n        let hll_new: HyperLogLog = HyperLogLog::from_reader(&mut reader).expect(\"Loading error\");\n\n        assert_eq!(hll_new.p, hll.p);\n        assert_eq!(hll_new.q, hll.q);\n        assert_eq!(hll_new.registers, hll.registers);\n        assert_eq!(hll_new.ksize, hll.ksize);\n    }\n\n    #[test]\n    /// Test to cover corner cases in the MLE calculation\n    /// that may happen at resolutions 16, 17 or 18, i.e.\n    /// cases with 2^16 == 65536, 2^17 == 131072, 2^18 == 262144.\n    ///\n    /// In such cases, the MLE multiplicities which were earlier\n    /// implemented always using a u16 type, may overflow.\n    fn test_mle_corner_cases() {\n        for precision in [16, 17, 18] {\n            let mut hll = HyperLogLog::new(precision, 21).unwrap();\n            for i in 1..5000 {\n                let mut hasher = DefaultHasher::new();\n                i.hash(&mut hasher);\n                let hash = hasher.finish();\n                hll.add_hash(hash)\n            }\n\n            let cardinality = hll.cardinality();\n\n            assert!(cardinality > 4500 && cardinality < 5500);\n\n            // We build a second hll to check whether the union of the two\n            // hlls is consistent with the cardinality of the union.\n            let mut hll2 = HyperLogLog::new(precision, 21).unwrap();\n\n            for i in 5000..10000 {\n                let mut hasher = DefaultHasher::new();\n                i.hash(&mut hasher);\n                let hash = hasher.finish();\n                hll2.add_hash(hash)\n            }\n\n            let mut hll_union = hll.clone();\n            hll_union.merge(&hll2).unwrap();\n            let cardinality_union = hll_union.cardinality();\n\n            assert!(\n                cardinality_union > 9500 && cardinality_union < 10500,\n                \"precision: {}, cardinality_union: {}\",\n                precision,\n                cardinality_union\n            );\n\n            let intersection = hll.intersection(&hll2);\n\n            assert!(intersection < 500);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/src/sketch/minhash.rs",
    "content": "use std::cmp::Ordering;\nuse std::collections::{BTreeMap, BTreeSet};\nuse std::f64::consts::PI;\nuse std::fmt::Write;\nuse std::io;\nuse std::iter::Peekable;\nuse std::str;\nuse std::sync::Mutex;\n\nuse itertools::Itertools;\nuse serde::de::Deserializer;\nuse serde::ser::{SerializeStruct, Serializer};\nuse serde::{Deserialize, Serialize};\nuse typed_builder::TypedBuilder;\n\nuse crate::_hash_murmur;\nuse crate::Error;\nuse crate::ScaledType;\nuse crate::encodings::HashFunctions;\nuse crate::prelude::ToWriter;\nuse crate::signature::SigsTrait;\nuse crate::sketch::hyperloglog::HyperLogLog;\n\npub fn max_hash_for_scaled(scaled: ScaledType) -> u64 {\n    match scaled {\n        0 => 0, // scaled == 0 indicates this is a num minhash\n        1 => u64::MAX,\n        _ => (u64::MAX as f64 / scaled as f64) as u64,\n    }\n}\n\npub fn scaled_for_max_hash(max_hash: u64) -> ScaledType {\n    match max_hash {\n        0 => 0, // scaled == 0 indicates this is a num minhash\n        _ => (u64::MAX as f64 / max_hash as f64) as ScaledType,\n    }\n}\n\n#[derive(Debug, TypedBuilder)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\npub struct KmerMinHash {\n    num: u32,\n    ksize: u32,\n\n    #[builder(setter(into), default = HashFunctions::Murmur64Dna)]\n    hash_function: HashFunctions,\n\n    #[builder(default = 42u64)]\n    seed: u64,\n\n    #[builder(default = u64::MAX)]\n    max_hash: u64,\n\n    #[builder(default)]\n    mins: Vec<u64>,\n\n    #[builder(default)]\n    abunds: Option<Vec<u64>>,\n\n    #[builder(default)]\n    #[cfg_attr(feature = \"rkyv\", rkyv(with = rkyv::with::Skip))]\n    md5sum: Mutex<Option<String>>,\n}\n\nimpl PartialEq for KmerMinHash {\n    fn eq(&self, other: &KmerMinHash) -> bool {\n        // TODO: check all other fields?\n        self.md5sum() == other.md5sum()\n    }\n}\n\nimpl Clone for KmerMinHash {\n    fn clone(&self) -> Self {\n        KmerMinHash {\n            num: self.num,\n            ksize: self.ksize,\n            hash_function: self.hash_function.clone(),\n            seed: self.seed,\n            max_hash: self.max_hash,\n            mins: self.mins.clone(),\n            abunds: self.abunds.clone(),\n            md5sum: Mutex::new(Some(self.md5sum())),\n        }\n    }\n}\n\nimpl Default for KmerMinHash {\n    fn default() -> KmerMinHash {\n        KmerMinHash {\n            num: 1000,\n            ksize: 21,\n            hash_function: HashFunctions::Murmur64Dna,\n            seed: 42,\n            max_hash: 0,\n            mins: Vec::with_capacity(1000),\n            abunds: None,\n            md5sum: Mutex::new(None),\n        }\n    }\n}\n\nimpl Serialize for KmerMinHash {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let n_fields = match &self.abunds {\n            Some(_) => 8,\n            _ => 7,\n        };\n\n        let mut partial = serializer.serialize_struct(\"KmerMinHash\", n_fields)?;\n        partial.serialize_field(\"num\", &self.num)?;\n        partial.serialize_field(\"ksize\", &self.ksize)?;\n        partial.serialize_field(\"seed\", &self.seed)?;\n        partial.serialize_field(\"max_hash\", &self.max_hash)?;\n        partial.serialize_field(\"mins\", &self.mins)?;\n        partial.serialize_field(\"md5sum\", &self.md5sum())?;\n\n        if let Some(abunds) = &self.abunds {\n            partial.serialize_field(\"abundances\", abunds)?;\n        }\n\n        partial.serialize_field(\"molecule\", &self.hash_function.to_string())?;\n\n        partial.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for KmerMinHash {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        struct TempSig {\n            num: u32,\n            ksize: u32,\n            seed: u64,\n            max_hash: u64,\n            md5sum: String,\n            mins: Vec<u64>,\n            abundances: Option<Vec<u64>>,\n            molecule: String,\n        }\n\n        let tmpsig = TempSig::deserialize(deserializer)?;\n\n        let num = if tmpsig.max_hash != 0 { 0 } else { tmpsig.num };\n\n        // Set the hash function based on the molecule string. This will panic if\n        // the molecule string is not a valid.\n        let hash_function =\n            HashFunctions::try_from(tmpsig.molecule.as_str()).map_err(serde::de::Error::custom)?;\n\n        // This shouldn't be necessary, but at some point we\n        // created signatures with unordered mins =(\n        let (mins, abunds) = if let Some(abunds) = tmpsig.abundances {\n            let mut values: Vec<(_, _)> = tmpsig.mins.iter().zip(abunds.iter()).collect();\n            values.sort();\n            let mins = values.iter().map(|(v, _)| **v).collect();\n            let abunds = values.iter().map(|(_, v)| **v).collect();\n            (mins, Some(abunds))\n        } else {\n            let mut values: Vec<_> = tmpsig.mins.into_iter().collect();\n            values.sort_unstable();\n            (values, None)\n        };\n\n        Ok(KmerMinHash {\n            num,\n            ksize: tmpsig.ksize,\n            seed: tmpsig.seed,\n            max_hash: tmpsig.max_hash,\n            md5sum: Mutex::new(Some(tmpsig.md5sum)),\n            mins,\n            abunds,\n            hash_function,\n        })\n    }\n}\n\nimpl ToWriter for KmerMinHash {\n    fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        serde_json::to_writer(writer, &self)?;\n        Ok(())\n    }\n}\n\nimpl KmerMinHash {\n    pub fn new(\n        scaled: ScaledType,\n        ksize: u32,\n        hash_function: HashFunctions,\n        seed: u64,\n        track_abundance: bool,\n        num: u32,\n    ) -> KmerMinHash {\n        let mins = if num > 0 {\n            Vec::with_capacity(num as usize)\n        } else {\n            Vec::with_capacity(1000)\n        };\n\n        let abunds = if track_abundance {\n            Some(Vec::with_capacity(mins.capacity()))\n        } else {\n            None\n        };\n\n        let max_hash = max_hash_for_scaled(scaled);\n\n        KmerMinHash {\n            num,\n            ksize,\n            hash_function,\n            seed,\n            max_hash,\n            mins,\n            abunds,\n            md5sum: Mutex::new(None),\n        }\n    }\n\n    pub fn num(&self) -> u32 {\n        self.num\n    }\n\n    pub fn is_protein(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Protein\n    }\n\n    pub fn max_hash(&self) -> u64 {\n        self.max_hash\n    }\n\n    pub fn scaled(&self) -> ScaledType {\n        scaled_for_max_hash(self.max_hash)\n    }\n\n    pub fn clear(&mut self) {\n        self.mins.clear();\n        if let Some(ref mut abunds) = self.abunds {\n            abunds.clear();\n        }\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.mins.is_empty()\n    }\n\n    pub fn set_hash_function(&mut self, h: HashFunctions) -> Result<(), Error> {\n        if self.hash_function == h {\n            return Ok(());\n        }\n\n        if !self.is_empty() {\n            return Err(Error::NonEmptyMinHash {\n                message: \"hash_function\".into(),\n            });\n        }\n\n        self.hash_function = h;\n        Ok(())\n    }\n\n    pub fn track_abundance(&self) -> bool {\n        self.abunds.is_some()\n    }\n\n    pub fn enable_abundance(&mut self) -> Result<(), Error> {\n        if !self.mins.is_empty() {\n            return Err(Error::NonEmptyMinHash {\n                message: \"track_abundance=True\".into(),\n            });\n        }\n\n        self.abunds = Some(vec![]);\n\n        Ok(())\n    }\n\n    pub fn disable_abundance(&mut self) {\n        self.abunds = None;\n    }\n\n    fn reset_md5sum(&self) {\n        let mut data = self.md5sum.lock().unwrap();\n        if data.is_some() {\n            *data = None;\n        }\n    }\n\n    pub fn md5sum(&self) -> String {\n        let mut data = self.md5sum.lock().unwrap();\n        if data.is_none() {\n            let mut buffer = String::with_capacity(20);\n\n            let mut md5_ctx = md5::Context::new();\n            write!(&mut buffer, \"{}\", self.ksize()).unwrap();\n            md5_ctx.consume(&buffer);\n            buffer.clear();\n            for x in &self.mins {\n                write!(&mut buffer, \"{x}\").unwrap();\n                md5_ctx.consume(&buffer);\n                buffer.clear();\n            }\n            *data = Some(format!(\"{:x}\", md5_ctx.finalize()));\n        }\n        data.clone().unwrap()\n    }\n\n    pub fn add_hash(&mut self, hash: u64) {\n        self.add_hash_with_abundance(hash, 1);\n    }\n\n    pub fn add_hash_with_abundance(&mut self, hash: u64, abundance: u64) {\n        let current_max = match self.mins.last() {\n            Some(&x) => x,\n            None => u64::MAX,\n        };\n\n        if hash > self.max_hash && self.max_hash != 0 {\n            // This is a scaled minhash, and we don't need to add the new hash\n            return;\n        }\n\n        if self.num == 0 && self.max_hash == 0 {\n            // why did you create this minhash? it will always be empty...\n            return;\n        }\n\n        if abundance == 0 {\n            self.remove_hash(hash);\n            return;\n        }\n\n        // From this point on, hash is within scaled (or no scaled specified).\n\n        // empty mins? add it.\n        if self.mins.is_empty() {\n            self.mins.push(hash);\n            if let Some(ref mut abunds) = self.abunds {\n                abunds.push(abundance);\n                self.reset_md5sum();\n            }\n            return;\n        }\n\n        if hash <= self.max_hash || hash <= current_max || (self.mins.len() as u32) < self.num {\n            // \"good\" hash - within range, smaller than current entry, or\n            // still have space available\n            let pos = match self.mins.binary_search(&hash) {\n                Ok(p) => p,\n                Err(p) => p,\n            };\n\n            if pos == self.mins.len() {\n                // at end - must still be growing, we know the list won't\n                // get too long\n                self.mins.push(hash);\n                self.reset_md5sum();\n                if let Some(ref mut abunds) = self.abunds {\n                    abunds.push(abundance);\n                }\n            } else if self.mins[pos] != hash {\n                // didn't find hash in mins, so inserting somewhere\n                // in the middle; shrink list if needed.\n                self.mins.insert(pos, hash);\n                if let Some(ref mut abunds) = self.abunds {\n                    abunds.insert(pos, abundance);\n                }\n\n                // is it too big now?\n                if self.num != 0 && self.mins.len() > (self.num as usize) {\n                    self.mins.pop();\n                    if let Some(ref mut abunds) = self.abunds {\n                        abunds.pop();\n                    }\n                }\n                self.reset_md5sum();\n            } else if let Some(ref mut abunds) = self.abunds {\n                // pos == hash: hash value already in mins, inc count by abundance\n                abunds[pos] += abundance;\n            }\n        }\n    }\n\n    pub fn set_hash_with_abundance(&mut self, hash: u64, abundance: u64) {\n        let mut found = false;\n        if let Ok(pos) = self.mins.binary_search(&hash) {\n            if self.mins[pos] == hash {\n                found = true;\n                if let Some(ref mut abunds) = self.abunds {\n                    abunds[pos] = abundance;\n                }\n            }\n        }\n\n        if !found {\n            self.add_hash_with_abundance(hash, abundance);\n        }\n    }\n\n    pub fn add_word(&mut self, word: &[u8]) {\n        let hash = _hash_murmur(word, self.seed);\n        self.add_hash(hash);\n    }\n\n    pub fn remove_hash(&mut self, hash: u64) {\n        if let Ok(pos) = self.mins.binary_search(&hash) {\n            if self.mins[pos] == hash {\n                self.mins.remove(pos);\n                self.reset_md5sum();\n                if let Some(ref mut abunds) = self.abunds {\n                    abunds.remove(pos);\n                }\n            }\n        };\n    }\n\n    pub fn remove_from(&mut self, other: &KmerMinHash) -> Result<(), Error> {\n        for min in &other.mins {\n            self.remove_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn remove_many<T: IntoIterator<Item = u64>>(&mut self, hashes: T) -> Result<(), Error> {\n        for min in hashes {\n            self.remove_hash(min);\n        }\n        Ok(())\n    }\n\n    pub fn merge(&mut self, other: &KmerMinHash) -> Result<(), Error> {\n        self.check_compatible(other)?;\n        let max_size = self.mins.len() + other.mins.len();\n\n        let mut merged: Vec<u64> = Vec::with_capacity(max_size);\n        let mut merged_abunds: Option<Vec<u64>> = if self.abunds.is_some() && other.abunds.is_some()\n        {\n            Some(Vec::with_capacity(max_size))\n        } else {\n            None\n        };\n\n        let mut self_iter = self.mins.iter();\n        let mut other_iter = other.mins.iter();\n\n        let mut self_abunds_iter = self.abunds.iter().flatten();\n        let mut other_abunds_iter = other.abunds.iter().flatten();\n\n        let mut self_value = self_iter.next();\n        let mut other_value = other_iter.next();\n        while self_value.is_some() {\n            let value = self_value.unwrap();\n            match other_value {\n                None => {\n                    merged.push(*value);\n                    merged.extend(self_iter);\n                    if let Some(v) = merged_abunds.as_mut() {\n                        v.extend(self_abunds_iter)\n                    }\n                    break;\n                }\n                Some(x) if x < value => {\n                    merged.push(*x);\n                    other_value = other_iter.next();\n                    if let Some(v) = other_abunds_iter.next() {\n                        if let Some(n) = merged_abunds.as_mut() {\n                            n.push(*v)\n                        }\n                    }\n                }\n                Some(x) if x == value => {\n                    merged.push(*x);\n                    other_value = other_iter.next();\n                    self_value = self_iter.next();\n\n                    if let (Some(v), Some(s)) = (other_abunds_iter.next(), self_abunds_iter.next())\n                    {\n                        if let Some(n) = merged_abunds.as_mut() {\n                            n.push(*v + *s)\n                        }\n                    }\n                }\n                Some(x) if x > value => {\n                    merged.push(*value);\n                    self_value = self_iter.next();\n\n                    if let Some(v) = self_abunds_iter.next() {\n                        if let Some(n) = merged_abunds.as_mut() {\n                            n.push(*v)\n                        }\n                    }\n                }\n                Some(_) => {}\n            }\n        }\n        if let Some(value) = other_value {\n            merged.push(*value);\n        }\n        merged.extend(other_iter);\n        if let Some(n) = merged_abunds.as_mut() {\n            n.extend(other_abunds_iter)\n        }\n\n        if merged.len() > (self.num as usize) && (self.num as usize) != 0 {\n            merged.truncate(self.num as usize);\n            if let Some(v) = merged_abunds.as_mut() {\n                v.truncate(self.num as usize)\n            }\n        }\n        self.mins = merged;\n        self.abunds = merged_abunds;\n\n        self.reset_md5sum();\n        Ok(())\n    }\n\n    pub fn add_from(&mut self, other: &KmerMinHash) -> Result<(), Error> {\n        for min in &other.mins {\n            self.add_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn add_many(&mut self, hashes: &[u64]) -> Result<(), Error> {\n        for min in hashes {\n            self.add_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn add_many_with_abund(&mut self, hashes: &[(u64, u64)]) -> Result<(), Error> {\n        for item in hashes {\n            self.add_hash_with_abundance(item.0, item.1);\n        }\n        Ok(())\n    }\n\n    pub fn count_common(&self, other: &KmerMinHash, downsample: bool) -> Result<u64, Error> {\n        if downsample && self.scaled() != other.scaled() {\n            let (first, second) = if self.scaled() > other.scaled() {\n                (self, other)\n            } else {\n                (other, self)\n            };\n            let downsampled_mh = second.clone().downsample_scaled(first.scaled())?;\n            first.count_common(&downsampled_mh, false)\n        } else {\n            self.check_compatible(other)?;\n            let iter = if self.size() < other.size() {\n                Intersection::new(self.mins.iter(), other.mins.iter())\n            } else {\n                Intersection::new(other.mins.iter(), self.mins.iter())\n            };\n\n            Ok(iter.count() as u64)\n        }\n    }\n\n    pub fn intersection(&self, other: &KmerMinHash) -> Result<(Vec<u64>, u64), Error> {\n        self.check_compatible(other)?;\n\n        if self.num != 0 {\n            // Intersection for regular MinHash sketches\n            let mut combined_mh = KmerMinHash::new(\n                self.scaled(),\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n\n            combined_mh.merge(self)?;\n            combined_mh.merge(other)?;\n\n            let it1 = Intersection::new(self.mins.iter(), other.mins.iter());\n\n            // TODO: there is probably a way to avoid this Vec here,\n            // and pass the it1 as left in it2.\n            let i1: Vec<u64> = it1.cloned().collect();\n            let it2 = Intersection::new(i1.iter(), combined_mh.mins.iter());\n\n            let common: Vec<u64> = it2.cloned().collect();\n            Ok((common, combined_mh.mins.len() as u64))\n        } else {\n            Ok(intersection(self.mins.iter(), other.mins.iter()))\n        }\n    }\n\n    // FIXME: intersection_size and count_common should be the same?\n    // (for scaled minhashes)\n    pub fn intersection_size(&self, other: &KmerMinHash) -> Result<(u64, u64), Error> {\n        self.check_compatible(other)?;\n\n        if self.num != 0 {\n            // Intersection for regular MinHash sketches\n            let mut combined_mh = KmerMinHash::new(\n                self.scaled(),\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n\n            combined_mh.merge(self)?;\n            combined_mh.merge(other)?;\n\n            let it1 = Intersection::new(self.mins.iter(), other.mins.iter());\n\n            // TODO: there is probably a way to avoid this Vec here,\n            // and pass the it1 as left in it2.\n            let i1: Vec<u64> = it1.cloned().collect();\n            let it2 = Intersection::new(i1.iter(), combined_mh.mins.iter());\n\n            Ok((it2.count() as u64, combined_mh.mins.len() as u64))\n        } else {\n            Ok(intersection_size(self.mins.iter(), other.mins.iter()))\n        }\n    }\n\n    // calculate Jaccard similarity, ignoring abundance.\n    pub fn jaccard(&self, other: &KmerMinHash) -> Result<f64, Error> {\n        self.check_compatible(other)?;\n        if let Ok((common, size)) = self.intersection_size(other) {\n            Ok(common as f64 / u64::max(1, size) as f64)\n        } else {\n            Ok(0.0)\n        }\n    }\n\n    // compare two minhashes, with abundance;\n    // calculate their angular similarity.\n    pub fn angular_similarity(&self, other: &KmerMinHash) -> Result<f64, Error> {\n        self.check_compatible(other)?;\n\n        if self.abunds.is_none() || other.abunds.is_none() {\n            return Err(Error::NeedsAbundanceTracking);\n        }\n\n        // TODO: check which one is smaller, swap around if needed\n\n        let abunds = self.abunds.as_ref().unwrap();\n        let other_abunds = other.abunds.as_ref().unwrap();\n\n        let mut prod = 0;\n        let mut other_iter = other.mins.iter().enumerate();\n        let mut next_hash = other_iter.next();\n        let a_sq: u64 = abunds.iter().map(|a| a * a).sum();\n        let b_sq: u64 = other_abunds.iter().map(|a| a * a).sum();\n\n        for (i, hash) in self.mins.iter().enumerate() {\n            while let Some((j, k)) = next_hash {\n                match k.cmp(hash) {\n                    Ordering::Less => next_hash = other_iter.next(),\n                    Ordering::Equal => {\n                        // Calling `get_unchecked` here is safe since\n                        // both `i` and `j` are valid indices\n                        // (`i` and `j` came from valid iterator calls)\n                        unsafe {\n                            prod += abunds.get_unchecked(i) * other_abunds.get_unchecked(j);\n                        }\n                        break;\n                    }\n                    Ordering::Greater => break,\n                }\n            }\n        }\n\n        let norm_a = (a_sq as f64).sqrt();\n        let norm_b = (b_sq as f64).sqrt();\n\n        if norm_a == 0. || norm_b == 0. {\n            return Ok(0.0);\n        }\n        let prod = f64::min(prod as f64 / (norm_a * norm_b), 1.);\n        let distance = 2. * prod.acos() / PI;\n        Ok(1. - distance)\n    }\n\n    pub fn similarity(\n        &self,\n        other: &KmerMinHash,\n        ignore_abundance: bool,\n        downsample: bool,\n    ) -> Result<f64, Error> {\n        if downsample && self.scaled() != other.scaled() {\n            // downsample to larger of two scaled\n            let (first, second) = if self.scaled() > other.scaled() {\n                (self, other)\n            } else {\n                (other, self)\n            };\n            let downsampled_mh = second.clone().downsample_scaled(first.scaled())?;\n            first.similarity(&downsampled_mh, ignore_abundance, false)\n        } else if ignore_abundance || self.abunds.is_none() || other.abunds.is_none() {\n            self.jaccard(other)\n        } else {\n            self.angular_similarity(other)\n        }\n    }\n\n    pub fn dayhoff(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Dayhoff\n    }\n\n    pub fn hp(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Hp\n    }\n\n    pub fn skipm1n3(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Skipm1n3\n    }\n\n    pub fn skipm2n3(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Skipm2n3\n    }\n\n    pub fn mins(&self) -> Vec<u64> {\n        self.mins.clone()\n    }\n\n    pub fn iter_mins(&self) -> impl Iterator<Item = &u64> {\n        self.mins.iter()\n    }\n\n    pub fn abunds(&self) -> Option<Vec<u64>> {\n        self.abunds.clone()\n    }\n\n    // create a downsampled copy of self\n    pub fn downsample_max_hash(self, max_hash: u64) -> Result<KmerMinHash, Error> {\n        if self.max_hash == 0 {\n            // CTB: this is a num minhash. Should we just blithely return?\n            Ok(self)\n        } else {\n            let scaled = scaled_for_max_hash(max_hash);\n            self.downsample_scaled(scaled)\n        }\n    }\n\n    pub fn sum_abunds(&self) -> u64 {\n        if let Some(abunds) = &self.abunds {\n            abunds.iter().sum()\n        } else {\n            self.size() as u64\n        }\n    }\n\n    pub fn to_vec_abunds(&self) -> Vec<(u64, u64)> {\n        if let Some(abunds) = &self.abunds {\n            self.mins\n                .iter()\n                .cloned()\n                .zip(abunds.iter().cloned())\n                .collect()\n        } else {\n            self.mins\n                .iter()\n                .cloned()\n                .zip(std::iter::repeat(1))\n                .collect()\n        }\n    }\n\n    pub fn as_hll(&self) -> HyperLogLog {\n        let mut hll = HyperLogLog::with_error_rate(0.01, self.ksize()).unwrap();\n\n        for h in &self.mins {\n            hll.add_hash(*h)\n        }\n\n        hll\n    }\n\n    // Approximate total number of kmers\n    // this could be improved by generating an HLL estimate while sketching instead\n    // (for scaled minhashes)\n    pub fn n_unique_kmers(&self) -> u64 {\n        self.size() as u64 * self.scaled() as u64 // + (self.ksize - 1) for bp estimation\n    }\n\n    // create a downsampled copy of self\n    pub fn downsample_scaled(self, scaled: ScaledType) -> Result<KmerMinHash, Error> {\n        if self.scaled() == scaled || self.scaled() == 0 {\n            Ok(self)\n        } else if self.scaled() > scaled {\n            Err(Error::CannotUpsampleScaled)\n        } else {\n            let mut new_mh = KmerMinHash::new(\n                scaled,\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n            if self.abunds.is_some() {\n                new_mh.add_many_with_abund(&self.to_vec_abunds())?;\n            } else {\n                new_mh.add_many(&self.mins)?;\n            }\n            Ok(new_mh)\n        }\n    }\n\n    pub fn inflate(&mut self, abunds_from: &KmerMinHash) -> Result<(), Error> {\n        self.check_compatible(abunds_from)?;\n\n        // check that abunds_from has abundances\n        if abunds_from.abunds.is_none() {\n            return Err(Error::NeedsAbundanceTracking);\n        }\n\n        let self_iter = self.mins.iter();\n        let abunds_iter = abunds_from.abunds.as_ref().unwrap().iter();\n        let abunds_from_iter = abunds_from.mins.iter().zip(abunds_iter);\n\n        let (mins, abunds): (Vec<u64>, Vec<u64>) = self_iter\n            .merge_join_by(abunds_from_iter, |&self_val, &(other_val, _)| {\n                self_val.cmp(other_val)\n            })\n            .filter_map(|either| match either {\n                itertools::EitherOrBoth::Both(self_val, (_other_val, &other_abund)) => {\n                    Some((self_val, other_abund))\n                }\n                _ => None,\n            })\n            .unzip();\n\n        self.mins = mins;\n        self.abunds = Some(abunds);\n\n        self.reset_md5sum();\n        Ok(())\n    }\n\n    pub fn inflated_abundances(&self, abunds_from: &KmerMinHash) -> Result<(Vec<u64>, u64), Error> {\n        self.check_compatible(abunds_from)?;\n        // check that abunds_from has abundances\n        if abunds_from.abunds.is_none() {\n            return Err(Error::NeedsAbundanceTracking);\n        }\n\n        let self_iter = self.mins.iter();\n        let abunds_iter = abunds_from.abunds.as_ref().unwrap().iter();\n        let abunds_from_iter = abunds_from.mins.iter().zip(abunds_iter);\n\n        let (abundances, total_abundance): (Vec<u64>, u64) = self_iter\n            .merge_join_by(abunds_from_iter, |&self_val, &(other_val, _)| {\n                self_val.cmp(other_val)\n            })\n            .filter_map(|either| match either {\n                itertools::EitherOrBoth::Both(_self_val, (_other_val, other_abund)) => {\n                    Some(*other_abund)\n                }\n                _ => None,\n            })\n            .fold((Vec::new(), 0u64), |(mut acc_vec, acc_sum), abund| {\n                acc_vec.push(abund);\n                (acc_vec, acc_sum + abund)\n            });\n\n        Ok((abundances, total_abundance))\n    }\n\n    pub fn from_reader<R>(rdr: R) -> Result<KmerMinHash, Error>\n    where\n        R: std::io::Read,\n    {\n        let (rdr, _format) = niffler::get_reader(Box::new(rdr))?;\n\n        let mh: KmerMinHash = serde_json::from_reader(rdr)?;\n        Ok(mh)\n    }\n}\n\nimpl SigsTrait for KmerMinHash {\n    fn size(&self) -> usize {\n        self.mins.len()\n    }\n\n    fn to_vec(&self) -> Vec<u64> {\n        self.mins.clone()\n    }\n\n    fn ksize(&self) -> usize {\n        self.ksize as usize\n    }\n\n    fn seed(&self) -> u64 {\n        self.seed\n    }\n\n    fn hash_function(&self) -> HashFunctions {\n        self.hash_function.clone()\n    }\n\n    fn add_hash(&mut self, hash: u64) {\n        self.add_hash_with_abundance(hash, 1);\n    }\n\n    fn check_compatible(&self, other: &KmerMinHash) -> Result<(), Error> {\n        /*\n        if self.num != other.num {\n            return Err(Error::MismatchNum {\n                n1: self.num,\n                n2: other.num,\n            }\n            .into());\n        }\n        */\n        if self.ksize != other.ksize {\n            return Err(Error::MismatchKSizes);\n        }\n        if self.hash_function != other.hash_function {\n            // TODO: fix this error\n            return Err(Error::MismatchDNAProt);\n        }\n        // TODO: if supporting downsampled to be compatible\n        //if self.max_hash < other.max_hash {\n        if self.max_hash != other.max_hash {\n            return Err(Error::MismatchScaled);\n        }\n        if self.seed != other.seed {\n            return Err(Error::MismatchSeed);\n        }\n        Ok(())\n    }\n}\n\nstruct Intersection<T, I: Iterator<Item = T>> {\n    iter: Peekable<I>,\n    other: Peekable<I>,\n}\n\nimpl<T, I: Iterator<Item = T>> Intersection<T, I> {\n    pub fn new(left: I, right: I) -> Self {\n        Intersection {\n            iter: left.peekable(),\n            other: right.peekable(),\n        }\n    }\n}\n\nimpl<T: Ord, I: Iterator<Item = T>> Iterator for Intersection<T, I> {\n    type Item = T;\n\n    fn next(&mut self) -> Option<T> {\n        loop {\n            let res = match (self.iter.peek(), self.other.peek()) {\n                (Some(ref left_key), Some(ref right_key)) => left_key.cmp(right_key),\n                _ => return None,\n            };\n\n            match res {\n                Ordering::Less => {\n                    self.iter.next();\n                }\n                Ordering::Greater => {\n                    self.other.next();\n                }\n                Ordering::Equal => {\n                    self.other.next();\n                    return self.iter.next();\n                }\n            }\n        }\n    }\n}\n\n//#############\n// A MinHash implementation for low scaled or large cardinalities\n\n#[derive(Debug, TypedBuilder)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\npub struct KmerMinHashBTree {\n    num: u32,\n    ksize: u32,\n\n    #[builder(setter(into), default = HashFunctions::Murmur64Dna)]\n    hash_function: HashFunctions,\n\n    #[builder(default = 42u64)]\n    seed: u64,\n\n    #[builder(default = u64::MAX)]\n    max_hash: u64,\n\n    #[builder(default)]\n    mins: BTreeSet<u64>,\n\n    #[builder(default)]\n    abunds: Option<BTreeMap<u64, u64>>,\n\n    #[builder(default = 0u64)]\n    current_max: u64,\n\n    #[builder(default)]\n    #[cfg_attr(feature = \"rkyv\", rkyv(with = rkyv::with::Skip))]\n    md5sum: Mutex<Option<String>>,\n}\n\nimpl PartialEq for KmerMinHashBTree {\n    fn eq(&self, other: &KmerMinHashBTree) -> bool {\n        // TODO: check all other fields?\n        self.md5sum() == other.md5sum()\n    }\n}\n\nimpl Clone for KmerMinHashBTree {\n    fn clone(&self) -> Self {\n        KmerMinHashBTree {\n            num: self.num,\n            ksize: self.ksize,\n            hash_function: self.hash_function.clone(),\n            seed: self.seed,\n            max_hash: self.max_hash,\n            mins: self.mins.clone(),\n            abunds: self.abunds.clone(),\n            current_max: self.current_max,\n            md5sum: Mutex::new(self.md5sum.lock().unwrap().clone()),\n        }\n    }\n}\n\nimpl Default for KmerMinHashBTree {\n    fn default() -> KmerMinHashBTree {\n        KmerMinHashBTree {\n            num: 1000,\n            ksize: 21,\n            hash_function: HashFunctions::Murmur64Dna,\n            seed: 42,\n            max_hash: 0,\n            mins: Default::default(),\n            abunds: None,\n            current_max: 0,\n            md5sum: Mutex::new(None),\n        }\n    }\n}\n\nimpl Serialize for KmerMinHashBTree {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let n_fields = match &self.abunds {\n            Some(_) => 8,\n            _ => 7,\n        };\n\n        let mut partial = serializer.serialize_struct(\"KmerMinHashBTree\", n_fields)?;\n        partial.serialize_field(\"num\", &self.num)?;\n        partial.serialize_field(\"ksize\", &self.ksize)?;\n        partial.serialize_field(\"seed\", &self.seed)?;\n        partial.serialize_field(\"max_hash\", &self.max_hash)?;\n        partial.serialize_field(\"mins\", &self.mins)?;\n        partial.serialize_field(\"md5sum\", &self.md5sum())?;\n\n        if let Some(abunds) = &self.abunds {\n            let abs: Vec<u64> = abunds.values().cloned().collect();\n            partial.serialize_field(\"abundances\", &abs)?;\n        }\n\n        partial.serialize_field(\"molecule\", &self.hash_function.to_string())?;\n\n        partial.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for KmerMinHashBTree {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        struct TempSig {\n            num: u32,\n            ksize: u32,\n            seed: u64,\n            max_hash: u64,\n            md5sum: String,\n            mins: Vec<u64>,\n            abundances: Option<Vec<u64>>,\n            molecule: String,\n        }\n\n        let tmpsig = TempSig::deserialize(deserializer)?;\n\n        let num = if tmpsig.max_hash != 0 { 0 } else { tmpsig.num };\n        let hash_function = match tmpsig.molecule.to_lowercase().as_ref() {\n            \"protein\" => HashFunctions::Murmur64Protein,\n            \"dayhoff\" => HashFunctions::Murmur64Dayhoff,\n            \"hp\" => HashFunctions::Murmur64Hp,\n            \"dna\" => HashFunctions::Murmur64Dna,\n            _ => unimplemented!(), // TODO: throw error here\n        };\n\n        let current_max;\n        // This shouldn't be necessary, but at some point we\n        // created signatures with unordered mins =(\n        let (mins, abunds) = if let Some(abunds) = tmpsig.abundances {\n            let mut values: Vec<(_, _)> = tmpsig.mins.iter().zip(abunds.iter()).collect();\n            values.sort();\n            let mins: BTreeSet<_> = values.iter().map(|(v, _)| **v).collect();\n            let abunds = values.into_iter().map(|(v, x)| (*v, *x)).collect();\n            current_max = *mins.iter().next_back().unwrap_or(&0);\n            (mins, Some(abunds))\n        } else {\n            current_max = 0;\n            (tmpsig.mins.into_iter().collect(), None)\n        };\n\n        Ok(KmerMinHashBTree {\n            num,\n            ksize: tmpsig.ksize,\n            seed: tmpsig.seed,\n            max_hash: tmpsig.max_hash,\n            md5sum: Mutex::new(Some(tmpsig.md5sum)),\n            mins,\n            abunds,\n            hash_function,\n            current_max,\n        })\n    }\n}\n\nimpl ToWriter for KmerMinHashBTree {\n    fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        serde_json::to_writer(writer, &self)?;\n        Ok(())\n    }\n}\n\nimpl KmerMinHashBTree {\n    pub fn new(\n        scaled: ScaledType,\n        ksize: u32,\n        hash_function: HashFunctions,\n        seed: u64,\n        track_abundance: bool,\n        num: u32,\n    ) -> KmerMinHashBTree {\n        let mins = Default::default();\n\n        let abunds = if track_abundance {\n            Some(Default::default())\n        } else {\n            None\n        };\n\n        let max_hash = max_hash_for_scaled(scaled);\n\n        KmerMinHashBTree {\n            num,\n            ksize,\n            hash_function,\n            seed,\n            max_hash,\n            mins,\n            abunds,\n            current_max: 0,\n            md5sum: Mutex::new(None),\n        }\n    }\n\n    pub fn num(&self) -> u32 {\n        self.num\n    }\n\n    pub fn is_protein(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Protein\n    }\n\n    pub fn max_hash(&self) -> u64 {\n        self.max_hash\n    }\n\n    pub fn scaled(&self) -> ScaledType {\n        scaled_for_max_hash(self.max_hash)\n    }\n\n    pub fn clear(&mut self) {\n        self.mins.clear();\n        if let Some(ref mut abunds) = self.abunds {\n            abunds.clear();\n        }\n        self.current_max = 0;\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.mins.is_empty()\n    }\n\n    pub fn set_hash_function(&mut self, h: HashFunctions) -> Result<(), Error> {\n        if self.hash_function == h {\n            return Ok(());\n        }\n\n        if !self.is_empty() {\n            return Err(Error::NonEmptyMinHash {\n                message: \"hash_function\".into(),\n            });\n        }\n\n        self.hash_function = h;\n        Ok(())\n    }\n\n    pub fn track_abundance(&self) -> bool {\n        self.abunds.is_some()\n    }\n\n    pub fn enable_abundance(&mut self) -> Result<(), Error> {\n        if !self.mins.is_empty() {\n            return Err(Error::NonEmptyMinHash {\n                message: \"track_abundance=True\".into(),\n            });\n        }\n\n        self.abunds = Some(Default::default());\n\n        Ok(())\n    }\n\n    pub fn disable_abundance(&mut self) {\n        self.abunds = None;\n    }\n\n    fn reset_md5sum(&self) {\n        let mut data = self.md5sum.lock().unwrap();\n        if data.is_some() {\n            *data = None;\n        }\n    }\n\n    pub fn md5sum(&self) -> String {\n        let mut data = self.md5sum.lock().unwrap();\n        if data.is_none() {\n            let mut buffer = String::with_capacity(20);\n\n            let mut md5_ctx = md5::Context::new();\n            write!(&mut buffer, \"{}\", self.ksize()).unwrap();\n            md5_ctx.consume(&buffer);\n            buffer.clear();\n            for x in &self.mins {\n                write!(&mut buffer, \"{x}\").unwrap();\n                md5_ctx.consume(&buffer);\n                buffer.clear();\n            }\n            *data = Some(format!(\"{:x}\", md5_ctx.finalize()));\n        }\n        data.clone().unwrap()\n    }\n\n    pub fn add_hash_with_abundance(&mut self, hash: u64, abundance: u64) {\n        if hash > self.max_hash && self.max_hash != 0 {\n            // This is a scaled minhash, and we don't need to add the new hash\n            return;\n        }\n\n        if self.num == 0 && self.max_hash == 0 {\n            // why did you create this minhash? it will always be empty...\n            return;\n        }\n\n        if abundance == 0 {\n            // well, don't add it.\n            return;\n        }\n\n        // From this point on, hash is within scaled (or no scaled specified).\n\n        // empty mins? add it.\n        if self.mins.is_empty() {\n            self.mins.insert(hash);\n            self.reset_md5sum();\n            if let Some(ref mut abunds) = self.abunds {\n                abunds.insert(hash, abundance);\n            }\n            self.current_max = hash;\n            return;\n        }\n\n        if hash <= self.max_hash || hash <= self.current_max || (self.mins.len() as u32) < self.num\n        {\n            // \"good\" hash - within range, smaller than current entry, or\n            // still have space available\n            if self.mins.insert(hash) {\n                self.reset_md5sum();\n                if hash > self.current_max {\n                    self.current_max = hash;\n                }\n            }\n            if let Some(ref mut abunds) = self.abunds {\n                *abunds.entry(hash).or_insert(0) += abundance;\n            }\n\n            // is it too big now?\n            if self.num != 0 && self.mins.len() > (self.num as usize) {\n                let last = *self.mins.iter().next_back().unwrap();\n                self.mins.remove(&last);\n                self.reset_md5sum();\n                if let Some(ref mut abunds) = self.abunds {\n                    abunds.remove(&last);\n                }\n                self.current_max = *self.mins.iter().next_back().unwrap();\n            }\n        }\n    }\n\n    pub fn add_word(&mut self, word: &[u8]) {\n        let hash = _hash_murmur(word, self.seed);\n        self.add_hash(hash);\n    }\n\n    pub fn remove_hash(&mut self, hash: u64) {\n        if self.mins.remove(&hash) {\n            self.reset_md5sum();\n            if let Some(ref mut abunds) = self.abunds {\n                abunds.remove(&hash);\n            }\n        }\n        if hash == self.current_max {\n            self.current_max = *self.mins.iter().next_back().unwrap_or(&0);\n        }\n    }\n\n    pub fn remove_many<T: IntoIterator<Item = u64>>(&mut self, hashes: T) -> Result<(), Error> {\n        for min in hashes {\n            self.remove_hash(min);\n        }\n        Ok(())\n    }\n\n    pub fn merge(&mut self, other: &KmerMinHashBTree) -> Result<(), Error> {\n        self.check_compatible(other)?;\n        let union = self.mins.union(&other.mins);\n\n        let to_take = if self.num == 0 {\n            usize::MAX\n        } else {\n            self.num as usize\n        };\n\n        self.mins = union.take(to_take).cloned().collect();\n\n        if let Some(abunds) = &self.abunds {\n            if let Some(oabunds) = &other.abunds {\n                let mut new_abunds = BTreeMap::new();\n\n                for hash in &self.mins {\n                    *new_abunds.entry(*hash).or_insert(0) +=\n                        abunds.get(hash).unwrap_or(&0) + oabunds.get(hash).unwrap_or(&0);\n                }\n                self.abunds = Some(new_abunds)\n            }\n        }\n        // Better safe than sorry, but could check in other places to avoid\n        // always resetting\n        self.reset_md5sum();\n\n        Ok(())\n    }\n\n    pub fn add_from(&mut self, other: &KmerMinHashBTree) -> Result<(), Error> {\n        for min in &other.mins {\n            self.add_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn add_many(&mut self, hashes: &[u64]) -> Result<(), Error> {\n        for min in hashes {\n            self.add_hash(*min);\n        }\n        Ok(())\n    }\n\n    pub fn add_many_with_abund(&mut self, hashes: &[(u64, u64)]) -> Result<(), Error> {\n        for item in hashes {\n            self.add_hash_with_abundance(item.0, item.1);\n        }\n        Ok(())\n    }\n\n    pub fn count_common(&self, other: &KmerMinHashBTree, downsample: bool) -> Result<u64, Error> {\n        if downsample && self.scaled() != other.scaled() {\n            // downsample to the larger of the two scaled values\n            let (first, second) = if self.scaled() > other.scaled() {\n                (self, other)\n            } else {\n                (other, self)\n            };\n            let downsampled_mh = second.clone().downsample_scaled(first.scaled())?;\n            first.count_common(&downsampled_mh, false)\n        } else {\n            self.check_compatible(other)?;\n            let iter = if self.size() < other.size() {\n                Intersection::new(self.mins.iter(), other.mins.iter())\n            } else {\n                Intersection::new(other.mins.iter(), self.mins.iter())\n            };\n\n            Ok(iter.count() as u64)\n        }\n    }\n\n    pub fn intersection(&self, other: &KmerMinHashBTree) -> Result<(Vec<u64>, u64), Error> {\n        self.check_compatible(other)?;\n\n        if self.num != 0 {\n            let mut combined_mh = KmerMinHashBTree::new(\n                self.scaled(),\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n\n            combined_mh.merge(self)?;\n            combined_mh.merge(other)?;\n\n            let it1 = Intersection::new(self.mins.iter(), other.mins.iter());\n\n            // TODO: there is probably a way to avoid this Vec here,\n            // and pass the it1 as left in it2.\n            let i1: Vec<u64> = it1.cloned().collect();\n            let i2: Vec<u64> = combined_mh.mins.iter().cloned().collect();\n            let it2 = Intersection::new(i1.iter(), i2.iter());\n\n            let common: Vec<u64> = it2.cloned().collect();\n            Ok((common, combined_mh.mins.len() as u64))\n        } else {\n            // Intersection for scaled MinHash sketches\n            Ok(intersection(self.mins.iter(), other.mins.iter()))\n        }\n    }\n\n    pub fn intersection_size(&self, other: &KmerMinHashBTree) -> Result<(u64, u64), Error> {\n        self.check_compatible(other)?;\n\n        if self.num != 0 {\n            let mut combined_mh = KmerMinHashBTree::new(\n                self.scaled(),\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n\n            combined_mh.merge(self)?;\n            combined_mh.merge(other)?;\n\n            let it1 = Intersection::new(self.mins.iter(), other.mins.iter());\n\n            // TODO: there is probably a way to avoid this Vec here,\n            // and pass the it1 as left in it2.\n            let i1: Vec<u64> = it1.cloned().collect();\n            let i2: Vec<u64> = combined_mh.mins.iter().cloned().collect();\n            let it2 = Intersection::new(i1.iter(), i2.iter());\n\n            Ok((it2.count() as u64, combined_mh.mins.len() as u64))\n        } else {\n            Ok(intersection_size(self.mins.iter(), other.mins.iter()))\n        }\n    }\n\n    // calculate Jaccard similarity, ignoring abundance.\n    pub fn jaccard(&self, other: &KmerMinHashBTree) -> Result<f64, Error> {\n        self.check_compatible(other)?;\n        if let Ok((common, size)) = self.intersection_size(other) {\n            Ok(common as f64 / u64::max(1, size) as f64)\n        } else {\n            Ok(0.0)\n        }\n    }\n\n    // compare two minhashes, with abundance;\n    // calculate their angular similarity.\n    pub fn angular_similarity(&self, other: &KmerMinHashBTree) -> Result<f64, Error> {\n        self.check_compatible(other)?;\n\n        if self.abunds.is_none() || other.abunds.is_none() {\n            return Err(Error::NeedsAbundanceTracking);\n        }\n\n        let abunds = self.abunds.as_ref().unwrap();\n        let other_abunds = other.abunds.as_ref().unwrap();\n\n        let mut prod = 0;\n        let a_sq: u64 = abunds.values().map(|a| a * a).sum();\n        let b_sq: u64 = other_abunds.values().map(|a| a * a).sum();\n\n        for (hash, value) in abunds.iter() {\n            if let Some(oa) = other_abunds.get(hash) {\n                prod += value * oa\n            }\n        }\n\n        let norm_a = (a_sq as f64).sqrt();\n        let norm_b = (b_sq as f64).sqrt();\n\n        if norm_a == 0. || norm_b == 0. {\n            return Ok(0.0);\n        }\n        let prod = f64::min(prod as f64 / (norm_a * norm_b), 1.);\n        let distance = 2. * prod.acos() / PI;\n        Ok(1. - distance)\n    }\n\n    pub fn similarity(\n        &self,\n        other: &KmerMinHashBTree,\n        ignore_abundance: bool,\n        downsample: bool,\n    ) -> Result<f64, Error> {\n        if downsample && self.scaled() != other.scaled() {\n            // downsample to larger of two scaled\n            let (first, second) = if self.scaled() > other.scaled() {\n                (self, other)\n            } else {\n                (other, self)\n            };\n            let downsampled_mh = second.clone().downsample_scaled(first.scaled())?;\n            first.similarity(&downsampled_mh, ignore_abundance, false)\n        } else if ignore_abundance || self.abunds.is_none() || other.abunds.is_none() {\n            self.jaccard(other)\n        } else {\n            self.angular_similarity(other)\n        }\n    }\n\n    pub fn dayhoff(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Dayhoff\n    }\n\n    pub fn hp(&self) -> bool {\n        self.hash_function == HashFunctions::Murmur64Hp\n    }\n\n    pub fn hash_function(&self) -> HashFunctions {\n        self.hash_function.clone()\n    }\n\n    pub fn mins(&self) -> Vec<u64> {\n        self.mins.iter().cloned().collect()\n    }\n\n    pub fn iter_mins(&self) -> impl Iterator<Item = &u64> {\n        self.mins.iter()\n    }\n\n    pub fn abunds(&self) -> Option<Vec<u64>> {\n        self.abunds\n            .as_ref()\n            .map(|abunds| abunds.values().cloned().collect())\n    }\n\n    // create a downsampled copy of self\n    pub fn downsample_max_hash(self, max_hash: u64) -> Result<KmerMinHashBTree, Error> {\n        if self.max_hash == 0 {\n            // CTB: this is a num minhash. Just blithely return.\n            Ok(self)\n        } else {\n            let scaled = scaled_for_max_hash(max_hash);\n            self.downsample_scaled(scaled)\n        }\n    }\n\n    // create a downsampled copy of self\n    pub fn downsample_scaled(self, scaled: ScaledType) -> Result<KmerMinHashBTree, Error> {\n        if self.scaled() == scaled || self.scaled() == 0 {\n            Ok(self)\n        } else if self.scaled() > scaled {\n            Err(Error::CannotUpsampleScaled)\n        } else {\n            let mut new_mh = KmerMinHashBTree::new(\n                scaled,\n                self.ksize,\n                self.hash_function.clone(),\n                self.seed,\n                self.abunds.is_some(),\n                self.num,\n            );\n            if self.abunds.is_some() {\n                new_mh.add_many_with_abund(&self.to_vec_abunds())?;\n            } else {\n                new_mh.add_many(&self.mins())?;\n            }\n            Ok(new_mh)\n        }\n    }\n\n    pub fn to_vec_abunds(&self) -> Vec<(u64, u64)> {\n        if let Some(abunds) = &self.abunds {\n            abunds.iter().map(|(a, b)| (*a, *b)).collect()\n        } else {\n            self.mins\n                .iter()\n                .cloned()\n                .zip(std::iter::repeat(1))\n                .collect()\n        }\n    }\n\n    pub fn sum_abunds(&self) -> u64 {\n        if let Some(abunds) = &self.abunds {\n            abunds.values().sum()\n        } else {\n            self.size() as u64\n        }\n    }\n\n    pub fn from_reader<R>(rdr: R) -> Result<KmerMinHashBTree, Error>\n    where\n        R: std::io::Read,\n    {\n        let (rdr, _format) = niffler::get_reader(Box::new(rdr))?;\n\n        let mh: KmerMinHashBTree = serde_json::from_reader(rdr)?;\n        Ok(mh)\n    }\n}\n\nimpl SigsTrait for KmerMinHashBTree {\n    fn size(&self) -> usize {\n        self.mins.len()\n    }\n\n    fn to_vec(&self) -> Vec<u64> {\n        self.mins()\n    }\n\n    fn ksize(&self) -> usize {\n        self.ksize as usize\n    }\n\n    fn seed(&self) -> u64 {\n        self.seed\n    }\n\n    fn hash_function(&self) -> HashFunctions {\n        self.hash_function.clone()\n    }\n\n    fn add_hash(&mut self, hash: u64) {\n        self.add_hash_with_abundance(hash, 1);\n    }\n\n    fn check_compatible(&self, other: &KmerMinHashBTree) -> Result<(), Error> {\n        /*\n        if self.num != other.num {\n            return Err(Error::MismatchNum {\n                n1: self.num,\n                n2: other.num,\n            }\n            .into());\n        }\n        */\n        if self.ksize != other.ksize {\n            return Err(Error::MismatchKSizes);\n        }\n        if self.hash_function != other.hash_function {\n            // TODO: fix this error\n            return Err(Error::MismatchDNAProt);\n        }\n        if self.max_hash != other.max_hash {\n            return Err(Error::MismatchScaled);\n        }\n        if self.seed != other.seed {\n            return Err(Error::MismatchSeed);\n        }\n        Ok(())\n    }\n}\n\nimpl From<KmerMinHashBTree> for KmerMinHash {\n    fn from(other: KmerMinHashBTree) -> KmerMinHash {\n        let mut new_mh = KmerMinHash::new(\n            other.scaled(),\n            other.ksize() as u32,\n            other.hash_function(),\n            other.seed(),\n            other.track_abundance(),\n            other.num(),\n        );\n\n        let mins = other.mins.into_iter().collect();\n        let abunds = other\n            .abunds\n            .map(|abunds| abunds.values().cloned().collect());\n\n        new_mh.mins = mins;\n        new_mh.abunds = abunds;\n\n        new_mh.md5sum = other.md5sum;\n\n        new_mh\n    }\n}\n\nimpl From<&KmerMinHashBTree> for KmerMinHash {\n    fn from(other: &KmerMinHashBTree) -> KmerMinHash {\n        let mut new_mh = KmerMinHash::new(\n            other.scaled(),\n            other.ksize() as u32,\n            other.hash_function(),\n            other.seed(),\n            other.track_abundance(),\n            other.num(),\n        );\n\n        let mins = other.mins.iter().copied().collect();\n        let abunds = other\n            .abunds\n            .as_ref()\n            .map(|abunds| abunds.values().cloned().collect());\n\n        new_mh.mins = mins;\n        new_mh.abunds = abunds;\n\n        new_mh.md5sum = Mutex::new(other.md5sum.lock().unwrap().clone());\n\n        new_mh\n    }\n}\n\nimpl From<KmerMinHash> for KmerMinHashBTree {\n    fn from(other: KmerMinHash) -> KmerMinHashBTree {\n        let mut new_mh = KmerMinHashBTree::new(\n            other.scaled(),\n            other.ksize() as u32,\n            other.hash_function(),\n            other.seed(),\n            other.track_abundance(),\n            other.num(),\n        );\n\n        let mins: BTreeSet<u64> = other.mins.into_iter().collect();\n        let abunds = other\n            .abunds\n            .map(|abunds| mins.iter().cloned().zip(abunds).collect());\n\n        new_mh.mins = mins;\n        new_mh.abunds = abunds;\n\n        new_mh.md5sum = other.md5sum;\n\n        new_mh\n    }\n}\n\nfn intersection<'a>(\n    me_iter: impl Iterator<Item = &'a u64>,\n    other_iter: impl Iterator<Item = &'a u64>,\n) -> (Vec<u64>, u64) {\n    let mut me = me_iter.peekable();\n    let mut other = other_iter.peekable();\n    let mut common: Vec<u64> = vec![];\n    let mut union_size = 0;\n\n    loop {\n        match (me.peek(), other.peek()) {\n            (Some(ref left_key), Some(ref right_key)) => {\n                let res = left_key.cmp(right_key);\n                match res {\n                    Ordering::Less => {\n                        me.next();\n                        union_size += 1;\n                    }\n                    Ordering::Greater => {\n                        other.next();\n                        union_size += 1;\n                    }\n                    Ordering::Equal => {\n                        other.next();\n                        common.push(***left_key);\n                        me.next();\n                        union_size += 1;\n                    }\n                };\n            }\n            (None, Some(_)) => {\n                other.next();\n                union_size += 1;\n            }\n            (Some(_), None) => {\n                me.next();\n                union_size += 1;\n            }\n            _ => break,\n        };\n    }\n    (common, union_size as u64)\n}\n\nfn intersection_size<'a>(\n    me_iter: impl Iterator<Item = &'a u64>,\n    other_iter: impl Iterator<Item = &'a u64>,\n) -> (u64, u64) {\n    let mut me = me_iter.peekable();\n    let mut other = other_iter.peekable();\n    let mut common = 0;\n    let mut union_size = 0;\n\n    loop {\n        match (me.peek(), other.peek()) {\n            (Some(ref left_key), Some(ref right_key)) => {\n                let res = left_key.cmp(right_key);\n                match res {\n                    Ordering::Less => {\n                        me.next();\n                        union_size += 1;\n                    }\n                    Ordering::Greater => {\n                        other.next();\n                        union_size += 1;\n                    }\n                    Ordering::Equal => {\n                        other.next();\n                        me.next();\n                        common += 1;\n                        union_size += 1;\n                    }\n                };\n            }\n            (None, Some(_)) => {\n                other.next();\n                union_size += 1;\n            }\n            (Some(_), None) => {\n                me.next();\n                union_size += 1;\n            }\n            _ => break,\n        };\n    }\n    (common as u64, union_size as u64)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use serde_json;\n\n    #[test]\n    /// Test that a valid KmerMinHash json can be deserialized correctly\n    fn test_deserialize_valid() {\n        let json_data = r#\"\n        {\n            \"num\": 1000,\n            \"ksize\": 21,\n            \"seed\": 42,\n            \"max_hash\": 0,\n            \"md5sum\": \"test_md5\",\n            \"mins\": [1, 2, 3, 4, 5],\n            \"abundances\": [10, 20, 30, 40, 50],\n            \"molecule\": \"dna\"\n        }\n        \"#;\n\n        let deserialized: KmerMinHash =\n            serde_json::from_str(json_data).expect(\"Failed to deserialize\");\n\n        assert_eq!(deserialized.num, 1000);\n        assert_eq!(deserialized.ksize, 21);\n        assert_eq!(deserialized.seed, 42);\n        assert_eq!(deserialized.hash_function, HashFunctions::Murmur64Dna);\n        assert_eq!(deserialized.mins, vec![1, 2, 3, 4, 5]);\n        assert!(deserialized.abunds.is_some());\n    }\n\n    #[test]\n    /// Test that a invalid molecule type panics!\n    fn test_deserialize_invalid_molecule() {\n        let json_data = r#\"\n        {\n            \"num\": 1000,\n            \"ksize\": 21,\n            \"seed\": 42,\n            \"max_hash\": 0,\n            \"md5sum\": \"test_md5\",\n            \"mins\": [1, 2, 3, 4, 5],\n            \"molecule\": \"unknown_type\"\n        }\n        \"#;\n\n        let result: Result<KmerMinHash, _> = serde_json::from_str(json_data);\n\n        // Assert that the result is an error\n        assert!(result.is_err());\n\n        // Extract and check the error message\n        let error_message = format!(\"{}\", result.unwrap_err());\n        assert!(error_message.contains(\"Invalid hash function\"));\n    }\n}\n"
  },
  {
    "path": "src/core/src/sketch/mod.rs",
    "content": "pub mod hyperloglog;\npub mod minhash;\n\npub mod nodegraph;\n\nuse serde::{Deserialize, Serialize};\n\nuse crate::sketch::hyperloglog::HyperLogLog;\nuse crate::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\n#[serde(untagged)]\n#[cfg_attr(\n    feature = \"rkyv\",\n    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)\n)]\npub enum Sketch {\n    MinHash(KmerMinHash),\n    LargeMinHash(KmerMinHashBTree),\n    HyperLogLog(HyperLogLog),\n}\n"
  },
  {
    "path": "src/core/src/sketch/nodegraph.rs",
    "content": "use std::fs::File;\nuse std::io;\nuse std::path::Path;\nuse std::slice;\n\nuse byteorder::{BigEndian, ByteOrder, LittleEndian, ReadBytesExt, WriteBytesExt};\nuse fixedbitset::FixedBitSet;\n\nuse crate::Error;\nuse crate::HashIntoType;\nuse crate::prelude::*;\nuse crate::sketch::minhash::{KmerMinHash, KmerMinHashBTree};\n\n#[derive(Debug, Default, Clone)]\npub struct Nodegraph {\n    bs: Vec<FixedBitSet>,\n    ksize: usize,\n    occupied_bins: usize,\n    unique_kmers: usize,\n}\n\n// TODO: not checking for unique_kmers,\n// since it is not saved in a khmer nodegraph\nimpl PartialEq for Nodegraph {\n    fn eq(&self, other: &Nodegraph) -> bool {\n        self.bs == other.bs\n            && self.occupied_bins == other.occupied_bins\n            && self.ksize == other.ksize\n    }\n}\n\nimpl Update<Nodegraph> for Nodegraph {\n    fn update(&self, other: &mut Nodegraph) -> Result<(), Error> {\n        other.occupied_bins = other\n            .bs\n            .iter_mut()\n            .zip(&self.bs)\n            .enumerate()\n            .map(|(i, (bs, bs_me))| {\n                bs.union_with(bs_me);\n                if i == 0 { bs.count_ones(..) } else { 0 }\n            })\n            .sum();\n        Ok(())\n    }\n}\n\nimpl Update<Nodegraph> for KmerMinHash {\n    fn update(&self, other: &mut Nodegraph) -> Result<(), Error> {\n        for h in self.mins() {\n            other.count(h);\n        }\n        Ok(())\n    }\n}\n\nimpl Update<Nodegraph> for KmerMinHashBTree {\n    fn update(&self, other: &mut Nodegraph) -> Result<(), Error> {\n        for h in self.mins() {\n            other.count(h);\n        }\n        Ok(())\n    }\n}\n\nimpl Nodegraph {\n    pub fn new(tablesizes: &[usize], ksize: usize) -> Nodegraph {\n        let mut bs = Vec::with_capacity(tablesizes.len());\n        for size in tablesizes.iter() {\n            bs.push(FixedBitSet::with_capacity(*size));\n        }\n\n        Nodegraph {\n            bs,\n            ksize,\n            occupied_bins: 0,\n            unique_kmers: 0,\n        }\n    }\n\n    pub fn with_tables(tablesize: usize, n_tables: usize, ksize: usize) -> Nodegraph {\n        let mut tablesizes = Vec::with_capacity(n_tables);\n\n        let mut i = u64::max((tablesize - 1) as u64, 2);\n        if i % 2 == 0 {\n            i -= 1\n        }\n\n        while tablesizes.len() != n_tables {\n            if primal_check::miller_rabin(i) {\n                tablesizes.push(i as usize);\n            }\n            if i == 1 {\n                break;\n            }\n            i -= 2;\n        }\n\n        Nodegraph::new(tablesizes.as_slice(), ksize)\n    }\n\n    pub(crate) fn count_kmer(&mut self, kmer: &[u8]) -> bool {\n        let h = _hash(kmer);\n        self.count(h)\n    }\n\n    pub fn count(&mut self, hash: HashIntoType) -> bool {\n        let mut is_new_kmer = false;\n\n        for (i, bitset) in self.bs.iter_mut().enumerate() {\n            let bin = hash % bitset.len() as u64;\n            if !bitset.put(bin as usize) {\n                if i == 0 {\n                    self.occupied_bins += 1;\n                }\n                is_new_kmer = true;\n            }\n        }\n\n        if is_new_kmer {\n            self.unique_kmers += 1\n        }\n        is_new_kmer\n    }\n\n    pub fn get(&self, hash: HashIntoType) -> usize {\n        for bitset in &self.bs {\n            let bin = hash % bitset.len() as u64;\n            if !bitset.contains(bin as usize) {\n                return 0;\n            }\n        }\n        1\n    }\n\n    pub(crate) fn get_kmer(&self, kmer: &[u8]) -> usize {\n        let h = _hash(kmer);\n        self.get(h)\n    }\n\n    pub fn expected_collisions(&self) -> f64 {\n        let min_size = self.bs.iter().map(|x| x.len()).min().unwrap();\n        let n_ht = self.bs.len();\n        let occupancy = self.occupied_bins;\n\n        let fp_one = occupancy as f64 / min_size as f64;\n        f64::powf(fp_one, n_ht as f64)\n    }\n\n    pub fn tablesize(&self) -> usize {\n        self.bs.iter().map(|x| x.len()).sum()\n    }\n\n    pub fn noccupied(&self) -> usize {\n        self.occupied_bins\n    }\n\n    pub fn matches(&self, mh: &KmerMinHash) -> usize {\n        mh.iter_mins().filter(|x| self.get(**x) == 1).count()\n    }\n\n    pub fn ntables(&self) -> usize {\n        self.bs.len()\n    }\n\n    pub fn ksize(&self) -> usize {\n        self.ksize\n    }\n\n    pub fn into_bitsets(self) -> Vec<FixedBitSet> {\n        self.bs\n    }\n\n    // save\n    pub fn save<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {\n        // TODO: if it ends with gz, open a compressed file\n        // might use get_output here?\n        self.save_to_writer(&mut File::create(path)?)?;\n        Ok(())\n    }\n\n    pub fn save_to_writer<W>(&self, wtr: &mut W) -> Result<(), Error>\n    where\n        W: io::Write,\n    {\n        wtr.write_all(b\"OXLI\")?;\n        wtr.write_u8(4)?; // version\n        wtr.write_u8(2)?; // ht_type\n        wtr.write_u32::<LittleEndian>(self.ksize as u32)?; // ksize\n        wtr.write_u8(self.bs.len() as u8)?; // n_tables\n        wtr.write_u64::<LittleEndian>(self.occupied_bins as u64)?; // n_occupied\n        for count in &self.bs {\n            let tablesize = count.len();\n            wtr.write_u64::<LittleEndian>(tablesize as u64)?;\n\n            let byte_size = tablesize / 8 + 1;\n            let (div, rem) = (byte_size / 4, byte_size % 4);\n\n            // Once this issue and PR are solved, this is a one liner:\n            // https://github.com/BurntSushi/byteorder/issues/155\n            // https://github.com/BurntSushi/byteorder/pull/166\n            //wtr.write_u32_from::<LittleEndian>(&count.as_slice()[..div])?;\n            let slice = &count.as_slice()[..div];\n            let buf = unsafe {\n                let len = std::mem::size_of_val(slice);\n                slice::from_raw_parts(slice.as_ptr() as *const u8, len)\n            };\n            wtr.write_all(buf)?;\n            // Replace when byteorder PR is released\n\n            if rem != 0 {\n                let mut cursor = [0u8; 4];\n                LittleEndian::write_u32(&mut cursor, count.as_slice()[div]);\n                for item in cursor.iter().take(rem) {\n                    wtr.write_u8(*item)?;\n                }\n            }\n        }\n        Ok(())\n    }\n\n    pub fn from_reader<R>(rdr: R) -> Result<Nodegraph, Error>\n    where\n        R: io::Read,\n    {\n        let (mut rdr, _format) = niffler::get_reader(Box::new(rdr))?;\n\n        let signature = rdr.read_u32::<BigEndian>()?;\n        assert_eq!(signature, 0x4f58_4c49);\n\n        let version = rdr.read_u8()?;\n        assert_eq!(version, 0x04);\n\n        let ht_type = rdr.read_u8()?;\n        assert_eq!(ht_type, 0x02);\n\n        let ksize = rdr.read_u32::<LittleEndian>()?;\n        let n_tables = rdr.read_u8()?;\n        let occupied_bins = rdr.read_u64::<LittleEndian>()? as usize;\n\n        let mut bs = Vec::with_capacity(n_tables as usize);\n        for _i in 0..n_tables {\n            let tablesize: usize = rdr.read_u64::<LittleEndian>()? as usize;\n            let byte_size = tablesize / 8 + 1;\n\n            let rem = byte_size % 4;\n            let blocks: Vec<u32> = {\n                let mut blocks = vec![0; byte_size / 4];\n                rdr.read_u32_into::<LittleEndian>(&mut blocks)?;\n                if rem != 0 {\n                    let mut values = [0u8; 4];\n                    for item in values.iter_mut().take(rem) {\n                        let byte = rdr.read_u8().expect(\"error reading bins\");\n                        *item = byte;\n                    }\n                    let mut block = vec![0u32; 1];\n                    LittleEndian::read_u32_into(&values, &mut block);\n                    blocks.push(block[0]);\n                }\n                blocks\n            };\n\n            let counts = FixedBitSet::with_capacity_and_blocks(tablesize, blocks);\n            bs.push(counts);\n        }\n\n        Ok(Nodegraph {\n            bs,\n            ksize: ksize as usize,\n            occupied_bins,\n            unique_kmers: 0, // This is a khmer issue, it doesn't save unique_kmers\n        })\n    }\n\n    pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Nodegraph, Error> {\n        let mut reader = io::BufReader::new(File::open(path)?);\n        Nodegraph::from_reader(&mut reader)\n    }\n\n    pub fn tablesizes(&self) -> Vec<u64> {\n        self.bs.iter().map(|x| x.len() as u64).collect()\n    }\n\n    pub fn n_occupied_bins(&self) -> usize {\n        self.occupied_bins\n    }\n\n    pub fn unique_kmers(&self) -> usize {\n        self.unique_kmers\n    }\n\n    pub fn similarity(&self, other: &Nodegraph) -> f64 {\n        let result: usize = self\n            .bs\n            .iter()\n            .zip(&other.bs)\n            .map(|(bs, bs_other)| bs.intersection(bs_other).count())\n            .sum();\n        let size: usize = self\n            .bs\n            .iter()\n            .zip(&other.bs)\n            .map(|(bs, bs_other)| bs.union(bs_other).count())\n            .sum();\n        result as f64 / size as f64\n    }\n\n    pub fn containment(&self, other: &Nodegraph) -> f64 {\n        let result: usize = self\n            .bs\n            .iter()\n            .zip(&other.bs)\n            .map(|(bs, bs_other)| bs.intersection(bs_other).count())\n            .sum();\n        let size: usize = self.bs.iter().map(|bs| bs.count_ones(..)).sum();\n        result as f64 / size as f64\n    }\n}\n\nfn twobit_repr(a: u8) -> HashIntoType {\n    match a as char {\n        'A' => 0,\n        'C' => 2,\n        'G' => 3,\n        'T' => 1,\n        _ => unimplemented!(),\n    }\n}\n\nfn twobit_comp(a: u8) -> HashIntoType {\n    match a as char {\n        'A' => 1,\n        'C' => 3,\n        'G' => 2,\n        'T' => 0,\n        _ => unimplemented!(),\n    }\n}\n\nfn uniqify_rc(f: HashIntoType, r: HashIntoType) -> HashIntoType {\n    if f < r { f } else { r }\n}\n\nfn _hash(kmer: &[u8]) -> HashIntoType {\n    let ksize = kmer.len();\n    let mut hash = 0;\n    let mut rev = 0;\n\n    hash |= twobit_repr(kmer[0]);\n    rev |= twobit_comp(kmer[ksize - 1]);\n\n    let mut i = 1;\n    let mut j: isize = (ksize - 2) as isize;\n\n    while i < ksize {\n        hash <<= 2;\n        rev <<= 2;\n\n        hash |= twobit_repr(kmer[i]);\n        rev |= twobit_comp(kmer[j as usize]);\n\n        i += 1;\n        j -= 1;\n    }\n\n    uniqify_rc(hash, rev)\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use std::io::{BufReader, BufWriter};\n    use std::path::PathBuf;\n\n    use proptest::collection::vec;\n    use proptest::num::u64;\n    use proptest::proptest;\n\n    // Generate with khmer:\n    // >>> a = khmer.Nodegraph(3, 23, 6)\n    // >>> a.count(\"ACG\")\n    // >>> a.count(\"TTA\")\n    // >>> a.count(\"CGA\")\n    // >>> a.save(\"test.ng\")\n    // and dumping test.ng with xxd:\n    // $ xxd -i test.ng\n    static RAW_DATA: &[u8] = &[\n        0x4f, 0x58, 0x4c, 0x49, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01,\n        0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x0d, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x0a, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,\n        0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x06,\n    ];\n\n    static COMPRESSED_RAW_DATA: &[u8] = &[\n        0x1f, 0x8b, 0x08, 0x08, 0x73, 0x88, 0x9f, 0x5e, 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e,\n        0x6e, 0x67, 0x00, 0xf3, 0x8f, 0xf0, 0xf1, 0x64, 0x61, 0x62, 0x66, 0x60, 0x60, 0x60, 0x03,\n        0x11, 0x20, 0x20, 0x0c, 0xa5, 0x19, 0x38, 0x19, 0x05, 0x61, 0x4c, 0x1e, 0x46, 0x5e, 0x28,\n        0x8b, 0x8b, 0x83, 0x1b, 0xca, 0x52, 0x64, 0x60, 0x87, 0xb2, 0x42, 0x58, 0xa1, 0x0c, 0x36,\n        0x00, 0x8d, 0xf0, 0xa9, 0x8b, 0x4f, 0x00, 0x00, 0x00,\n    ];\n\n    proptest! {\n      #[test]\n      fn count_and_get(hashes in vec(u64::ANY, 1..500)) {\n          let mut ng: Nodegraph = Nodegraph::new(&[1000], 3);\n          for hash in hashes {\n              ng.count(hash);\n              assert_eq!(ng.get(hash), 1);\n          }\n      }\n    }\n\n    #[test]\n    fn load_compressed() {\n        let mut reader = BufReader::new(COMPRESSED_RAW_DATA);\n\n        let ng: Nodegraph = Nodegraph::from_reader(&mut reader).expect(\"Loading error\");\n        assert_eq!(ng.tablesizes(), &[19, 17, 13, 11, 7, 5]);\n        assert_eq!(ng.ksize(), 3);\n        assert_eq!(ng.get_kmer(b\"ACG\"), 1);\n        assert_eq!(ng.get_kmer(b\"TTA\"), 1);\n        assert_eq!(ng.get_kmer(b\"CGA\"), 1);\n    }\n\n    #[test]\n    fn count_and_get_nodegraph() {\n        let mut ng: Nodegraph = Nodegraph::new(&[10], 3);\n\n        ng.count(801084876663808);\n\n        assert_eq!(ng.get(801084876663808), 1);\n        assert_eq!(ng.unique_kmers(), 1);\n    }\n\n    #[test]\n    fn containment() {\n        let mut ng1: Nodegraph = Nodegraph::new(&[31], 3);\n        let mut ng2: Nodegraph = Nodegraph::new(&[31], 3);\n\n        (0..20).for_each(|i| {\n            if i % 2 == 0 {\n                ng1.count(i);\n            };\n            ng2.count(i);\n        });\n\n        assert_eq!(ng1.containment(&ng2), 1.0);\n        assert_eq!(ng1.similarity(&ng2), 0.5);\n        assert_eq!(ng1.unique_kmers(), 10);\n        assert_eq!(ng2.unique_kmers(), 20);\n    }\n\n    #[test]\n    fn load_save_nodegraph() {\n        let mut datadir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        datadir.push(\"../../tests/test-data/.sbt.v3/\");\n\n        for i in 0..=5 {\n            let mut filename = datadir.clone();\n            filename.push(format!(\"internal.{}\", i));\n            let data = std::fs::read(filename).unwrap();\n\n            let mut reader = BufReader::new(&data[..]);\n\n            let ng: Nodegraph = Nodegraph::from_reader(&mut reader).expect(\"Loading error\");\n\n            let mut buf = Vec::new();\n            {\n                let mut writer = BufWriter::new(&mut buf);\n                ng.save_to_writer(&mut writer).unwrap();\n            }\n\n            let chunk_size = 8;\n            for (c1, c2) in data.to_vec().chunks(chunk_size).zip(buf.chunks(chunk_size)) {\n                assert_eq!(c1, c2);\n            }\n            assert_eq!(data.len(), buf.len());\n        }\n    }\n\n    #[test]\n    fn binary_repr_load() {\n        let mut reader = BufReader::new(RAW_DATA);\n        let khmer_ng: Nodegraph = Nodegraph::from_reader(&mut reader).expect(\"Loading error\");\n        assert_eq!(khmer_ng.tablesizes(), &[19, 17, 13, 11, 7, 5]);\n        assert_eq!(khmer_ng.ksize(), 3);\n        assert_eq!(khmer_ng.get_kmer(b\"ACG\"), 1);\n        assert_eq!(khmer_ng.get_kmer(b\"TTA\"), 1);\n        assert_eq!(khmer_ng.get_kmer(b\"CGA\"), 1);\n\n        let mut ng = Nodegraph::with_tables(23, 6, 3);\n        ng.count_kmer(b\"ACG\");\n        ng.count_kmer(b\"TTA\");\n        ng.count_kmer(b\"CGA\");\n\n        let mut buf = Vec::new();\n        {\n            let mut writer = BufWriter::new(&mut buf);\n            ng.save_to_writer(&mut writer).unwrap();\n        }\n        assert_eq!(buf.len(), 79);\n        assert_eq!(&RAW_DATA, &buf.as_slice());\n    }\n\n    #[test]\n    fn binary_repr_save() {\n        let mut ng = Nodegraph::with_tables(23, 6, 3);\n        ng.count_kmer(b\"ACG\");\n        ng.count_kmer(b\"TTA\");\n        ng.count_kmer(b\"CGA\");\n\n        let mut buf = Vec::new();\n        {\n            let mut writer = BufWriter::new(&mut buf);\n            ng.save_to_writer(&mut writer).unwrap();\n        }\n        let mut reader = BufReader::new(&buf[..]);\n        let new_ng: Nodegraph = Nodegraph::from_reader(&mut reader).expect(\"Loading error\");\n        assert_eq!(new_ng.tablesizes(), &[19, 17, 13, 11, 7, 5]);\n        assert_eq!(new_ng.ksize(), 3);\n        assert_eq!(new_ng.get_kmer(b\"ACG\"), 1);\n        assert_eq!(new_ng.get_kmer(b\"TTA\"), 1);\n        assert_eq!(new_ng.get_kmer(b\"CGA\"), 1);\n\n        assert_eq!(buf.len(), 79);\n        assert_eq!(&RAW_DATA, &buf.as_slice());\n    }\n\n    #[test]\n    fn update_nodegraph() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/.sbt.v3/internal.0\");\n\n        let ng_parent: Nodegraph = Nodegraph::from_path(filename).expect(\"Loading error\");\n\n        filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/.sbt.v3/internal.1\");\n\n        let ng_1: Nodegraph = Nodegraph::from_path(filename).expect(\"Loading error\");\n\n        filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/.sbt.v3/internal.2\");\n\n        let ng_2: Nodegraph = Nodegraph::from_path(filename).expect(\"Loading error\");\n\n        let mut ng_0: Nodegraph = Nodegraph::new(&[99991, 99989, 99971, 99961], 1);\n        ng_1.update(&mut ng_0).expect(\"Error in update\");\n        ng_2.update(&mut ng_0).expect(\"Error in update\");\n        assert_eq!(ng_0.bs, ng_parent.bs);\n        //assert_eq!(ng_0.occupied_bins, ng_parent.occupied_bins);\n    }\n\n    #[test]\n    fn update_nodegraph_many() -> Result<(), Box<dyn std::error::Error>> {\n        let mut leaf1 = Nodegraph::with_tables(100, 3, 5);\n        for kmer in &[\"AAAAA\", \"AAAAT\", \"AAAAC\"] {\n            leaf1.count(_hash(kmer.as_bytes()));\n        }\n\n        let mut leaf2 = Nodegraph::with_tables(100, 3, 5);\n        for kmer in &[\"AAAAA\", \"AAAAT\", \"AAAAG\"] {\n            leaf2.count(_hash(kmer.as_bytes()));\n        }\n\n        let mut leaf3 = Nodegraph::with_tables(100, 3, 5);\n        for kmer in &[\"AAAAA\", \"AAAAT\", \"CAAAA\"] {\n            leaf3.count(_hash(kmer.as_bytes()));\n        }\n\n        let mut leaf4 = Nodegraph::with_tables(100, 3, 5);\n        for kmer in &[\"AAAAA\", \"CAAAA\", \"GAAAA\"] {\n            leaf4.count(_hash(kmer.as_bytes()));\n        }\n\n        let mut leaf5 = Nodegraph::with_tables(100, 3, 5);\n        for kmer in &[\"AAAAA\", \"AAAAT\", \"GAAAA\"] {\n            leaf5.count(_hash(kmer.as_bytes()));\n        }\n\n        let h = _hash(b\"AAAAT\");\n        for leaf in &[leaf1, leaf2, leaf3, leaf5] {\n            assert_eq!(leaf.get(h), 1);\n        }\n\n        assert_eq!(leaf4.get(h), 0);\n\n        Ok(())\n    }\n\n    #[test]\n    fn load_nodegraph() {\n        let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n        filename.push(\"../../tests/test-data/.sbt.v3/internal.0\");\n\n        //let data = include_bytes!(\"data/internal.0\");\n\n        let ng: Nodegraph = Nodegraph::from_path(filename).expect(\"Loading error\");\n\n        assert_eq!(ng.tablesizes(), [99991, 99989, 99971, 99961]);\n        assert_eq!(ng.n_occupied_bins(), 2416);\n        assert_eq!(ng.get(1877811740), 0);\n        for h in [\n            1877811749,\n            1339603207230,\n            5641354835174,\n            10502027926594,\n            11550845136154,\n            12183113567732,\n            14062071191653,\n            14580861632266,\n            18722876140337,\n            20714320729467,\n            22732389403804,\n            24134363957219,\n            30606147678309,\n            30841792132441,\n            31130970675642,\n            32760645340554,\n            33190965408032,\n            33960067474598,\n            35413666412010,\n            37166860055638,\n            38008340488610,\n            38631948370393,\n            38946626358857,\n            39177463395973,\n            39396232170068,\n            40000457533067,\n            41548684950793,\n            42975853122398,\n            43119393989323,\n            43377695911881,\n            49367718187361,\n            49468277378328,\n            50266038601832,\n            51636068122286,\n            56622962479482,\n            58428533496606,\n            58971444597606,\n            59372670276820,\n            59452528403612,\n            61074441390615,\n            62130354354877,\n            62702978264830,\n            64430859773984,\n            65419869837915,\n            65663647257358,\n            67872638217057,\n            68827108109263,\n            69134145403133,\n            70436552236751,\n            70880519905358,\n            78004711377952,\n            81502993782978,\n            84636365982041,\n            85239629151685,\n            94266407193778,\n            98142256300701,\n            98837920540443,\n            99930975216128,\n            100653760748845,\n            102082282949673,\n            102530908835648,\n            103010972337870,\n            103329805967682,\n            103652023867250,\n            104130252812879,\n            112760650992638,\n            114779375695317,\n            115796389594898,\n            117864921668170,\n            119763283100790,\n            120285237540732,\n            121866736124647,\n            122140892054804,\n            122995254140976,\n            123065069359489,\n            123405856681590,\n            128261346941417,\n            130618284885748,\n            131310062444107,\n            133580282506938,\n            139762252968300,\n            148434659896290,\n            150472163116319,\n            151610888790844,\n            151736593364935,\n            152145317861349,\n            154119208822262,\n            154803963303860,\n            164146490870545,\n            166146331478050,\n            166719940886532,\n            173367021064967,\n            173503876669758,\n            173949973069402,\n            175345218226732,\n            175559849681044,\n            177057739236298,\n            182134979074863,\n            185526639726849,\n            186188120396587,\n            191078441509481,\n            191784713609488,\n            196150349451960,\n            196584209022550,\n            196853921592387,\n            197752504251580,\n            198597053692927,\n            200567230796156,\n            201179164742411,\n            202960515626517,\n            203378213499023,\n            210822710165852,\n            211915017282095,\n            213613291536686,\n            215418355892998,\n            216444054660744,\n            216772483699428,\n            218586803538885,\n            219619606513837,\n            221322641419906,\n            221692515333150,\n            222646058515199,\n            223103766020907,\n            223436957406949,\n            225216425962890,\n            225962923363564,\n            227026140769845,\n            227790244540446,\n            228251083676258,\n            231710804058239,\n            233288106176435,\n            235385609463388,\n            235438505061770,\n            238869764444344,\n            239420157045937,\n            241121021240187,\n            241671335688938,\n            242838856557679,\n            244786468497109,\n            247140303430449,\n            248336783901894,\n            250357693564448,\n            253975323975963,\n            256375919657769,\n            259301238714261,\n            265736169322750,\n            265781739304017,\n            266725362494513,\n            267345873524094,\n            271342665825792,\n            274876788032658,\n            275360996806051,\n            275711441656065,\n            276221877341287,\n            277115529175674,\n            277862338800417,\n            280967669495427,\n            281817613252845,\n            281897628539431,\n            282200323162036,\n            284620358398045,\n            284881057128884,\n            285925400570356,\n            289038917997203,\n            289724862541255,\n            290309864993733,\n            294086384353867,\n            295503963521838,\n            296966685834878,\n            299005107402724,\n            300199234365396,\n            300617258525997,\n            301443933468348,\n            302667628736144,\n            305781540735975,\n            308107503975413,\n            308473366560206,\n            311148974624393,\n            311393227334671,\n            312856558437716,\n            314634385460120,\n            315140251773348,\n            316147818305256,\n            317314266550052,\n            318043998368340,\n            319121931997971,\n            324333149672473,\n            324779561826125,\n            326855577904572,\n            327646715321140,\n            332098363218169,\n            333944737799563,\n            334160175766170,\n            335584394916553,\n            335971123608722,\n            336472954791992,\n            338443948117005,\n            338762957149102,\n            341091055062112,\n            341724341043975,\n            343240684449173,\n            344010897833199,\n            345196014534640,\n            347580313704916,\n            348815216366639,\n            348987115477673,\n            350399163507829,\n            357535517122796,\n            358595265377108,\n            358821394913517,\n            359452645935849,\n            362124977362793,\n            366354200059782,\n            366535672236781,\n            369474755519844,\n            370249620342175,\n            372037414685096,\n            373949557068914,\n            374319819178480,\n            374609596539290,\n            374615513078797,\n            375780195152331,\n            379102542404949,\n            379241504134406,\n            379468459802010,\n            379661395441316,\n            382035531157070,\n            383008100523152,\n            383135333541903,\n            383850900061929,\n            384049466048679,\n            386263487549463,\n            389141313731258,\n            390332660259608,\n            393516543506060,\n            400967959890432,\n            401487977714282,\n            403579902131163,\n            406955472999822,\n            408962716867059,\n            409903018669983,\n            410861197839878,\n            414355853800959,\n            416580890530128,\n            418934773149726,\n            419642123579295,\n            421963163293847,\n            423404494960378,\n            424303224424616,\n            424596150389604,\n            427230335237565,\n            429952924284227,\n            430664272577516,\n            432630098291297,\n            434623968464695,\n            435267549331128,\n            435277763415865,\n            435874505125675,\n            437654980371254,\n            438061138128325,\n            438738288109196,\n            439177016005977,\n            445344075816835,\n            445802335759252,\n            446710003143163,\n            447467518423055,\n            449641727299803,\n            450058424424520,\n            450112320572118,\n            450125274173050,\n            452241247094714,\n            452829154656306,\n            454813132622585,\n            456174765596578,\n            456493632715805,\n            456717723773303,\n            461156956524045,\n            462211497323948,\n            463604028403361,\n            465228093393002,\n            466250095735125,\n            469687793491358,\n            471922058927200,\n            472039595540269,\n            472566025949945,\n            472595419353109,\n            472977022618999,\n            473018780652067,\n            473772140307174,\n            474570287539184,\n            474912397870603,\n            476325119891604,\n            476526896773980,\n            476855560317170,\n            480232815782455,\n            484291524803718,\n            485278877010947,\n            487732314724511,\n            491715999174683,\n            494276065129917,\n            495846359323641,\n            506531113930798,\n            507871334392190,\n            508031302306958,\n            508934816424512,\n            509939413858428,\n            510737910464301,\n            512514768813167,\n            513350289212553,\n            517460246914282,\n            523321188654478,\n            524296526109332,\n            525762219690878,\n            526111205078257,\n            527062179866457,\n            527591752682839,\n            527920198105606,\n            530316966667021,\n            532977797373940,\n            533221992957154,\n            533383900955463,\n            537527309474265,\n            538136383284668,\n            538939534540869,\n            539777176029418,\n            539873986742508,\n            543935720187395,\n            545273268128445,\n            549484636278027,\n            551381720133873,\n            553977959695484,\n            555321949850378,\n            555828795847874,\n            557285930201258,\n            558008777268240,\n            558433475619762,\n            558892016080993,\n            559199414492426,\n            560748186311107,\n            561604684739024,\n            562789967643507,\n            563343385252253,\n            563775395645616,\n            564616206473372,\n            565020390122451,\n            568901431510366,\n            572526115602502,\n            573767900523468,\n            573851852316852,\n            576624529060777,\n            576874504697497,\n            578856083248351,\n            579395263040626,\n            579656586099131,\n            584217116139474,\n            587458649504773,\n            591009756408904,\n            592792708776319,\n            592997432856726,\n            594482884410814,\n            596004492939074,\n            596726606390901,\n            597875929908982,\n            600179982751750,\n            601000534535072,\n            601440269988372,\n            601603906866038,\n            602082770371066,\n            604883041984487,\n            605545396594434,\n            606419362199228,\n            607833403537880,\n            609555580824872,\n            609609500753196,\n            611579272742038,\n            612206643585093,\n            612640334623643,\n            612821302220884,\n            617021904160724,\n            617244669177560,\n            617309228629787,\n            618709483466270,\n            620059729516362,\n            620849299055244,\n            621083126852990,\n            622843084945666,\n            623088556560813,\n            627738708322473,\n            628002002108775,\n            628967244202734,\n            630034340392901,\n            632757066611488,\n            634340585739407,\n            634691502028135,\n            635939425862264,\n            637603178700210,\n            637880811482435,\n            644557275230225,\n            644935615624623,\n            645793929303122,\n            646731502743275,\n            646973138978211,\n            647900742708077,\n            649351154360370,\n            653652775436966,\n            655230244020599,\n            668170744538822,\n            670595660720839,\n            671785773373187,\n            672641554971634,\n            672821857332020,\n            673587502056476,\n            676044446355190,\n            677295740685782,\n            679716691783353,\n            682874745971459,\n            682963108550465,\n            683897063771844,\n            685246440558482,\n            686035384279530,\n            687129162879229,\n            687440351836027,\n            688990372747831,\n            690608944213791,\n            691680901171966,\n            694851976547107,\n            694869046270466,\n            700054088308311,\n            701010566680671,\n            701156706346414,\n            702431887238370,\n            702728791577749,\n            703127461004015,\n            703460523248065,\n            705302678110381,\n            707793984897058,\n            707799855432305,\n            707962189637436,\n            707993631271976,\n            708854130532070,\n            710403353214581,\n            710927468728191,\n            711091480855740,\n            712661928452840,\n            715334925158742,\n            715763419567022,\n            715896323316677,\n            717568681000032,\n            717790011003345,\n            719139881875323,\n            722537026567926,\n            722774506110892,\n            723332805980528,\n            724621545164802,\n            724746920000049,\n            727030394121071,\n            727262050490847,\n            728279662753580,\n            730854175545196,\n            731361512976697,\n            734622692371860,\n            736290151677476,\n            737921635760471,\n            738115824615020,\n            739389456325310,\n            742704052187442,\n            746469097917429,\n            748064810280445,\n            749144352424687,\n            753113822684627,\n            753423569783277,\n            755196264392026,\n            758186007844395,\n            758543555642030,\n            759083903793759,\n            761260029175908,\n            767230586289375,\n            770167973924874,\n            770328708409334,\n            772165475523258,\n            772947318346532,\n            774312511311396,\n            774365323868051,\n            774964429534347,\n            775558532281404,\n            779330069525835,\n            781344931111517,\n            787747218685488,\n            788027556261557,\n            790211243959626,\n            790890494413778,\n            792003960897692,\n            792629819473398,\n            797511060014001,\n            797622366845781,\n            799257433888961,\n            800060479182618,\n            801084876663808,\n            802340523858506,\n            803596407436267,\n        ]\n        .iter()\n        {\n            assert_eq!(ng.get(*h), 1);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/src/storage/mod.rs",
    "content": "use std::collections::{BTreeMap, HashMap};\nuse std::ffi::OsStr;\nuse std::fs::{DirBuilder, File};\nuse std::io::{BufReader, BufWriter, Read, Write};\nuse std::ops::Deref;\nuse std::sync::{Arc, RwLock};\n\nuse camino::Utf8Path as Path;\nuse camino::Utf8PathBuf as PathBuf;\nuse cfg_if::cfg_if;\nuse once_cell::sync::OnceCell;\nuse serde::{Deserialize, Serialize};\nuse thiserror::Error;\nuse typed_builder::TypedBuilder;\n\nuse crate::errors::ReadDataError;\nuse crate::prelude::*;\nuse crate::signature::SigsTrait;\nuse crate::sketch::Sketch;\nuse crate::sketch::minhash::KmerMinHash;\nuse crate::{Error, Result};\n\n/// An abstraction for any place where we can store data.\npub trait Storage {\n    /// Save bytes into path\n    fn save(&self, path: &str, content: &[u8]) -> Result<String>;\n\n    /// Load bytes from path\n    fn load(&self, path: &str) -> Result<Vec<u8>>;\n\n    /// Args for initializing a new Storage\n    fn args(&self) -> StorageArgs;\n\n    /// Load signature from internal path\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        let raw = self.load(path)?;\n        let mut vs = Signature::from_reader(&mut &raw[..])?;\n        if vs.len() > 1 {\n            unimplemented!(\"only one Signature currently allowed\");\n        }\n        let sig = vs.swap_remove(0);\n\n        Ok(sig.into())\n    }\n\n    /// Return a spec for creating/opening a storage\n    fn spec(&self) -> String;\n\n    /// Save signature to internal path\n    fn save_sig(&self, path: &str, sig: Signature) -> Result<String> {\n        let mut buffer = vec![];\n        {\n            sig.to_writer(&mut buffer).unwrap();\n        }\n        self.save(path, &buffer)\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Error)]\npub enum StorageError {\n    #[error(\"Path can't be empty\")]\n    EmptyPathError,\n\n    #[error(\"Path not found: {0}\")]\n    PathNotFoundError(String),\n\n    #[error(\"Error reading data from {0}\")]\n    DataReadError(String),\n\n    #[error(\"Storage for path {1} requires the '{0}' feature to be enabled\")]\n    MissingFeature(String, String),\n}\n\n/// InnerStorage: a catch-all type that allows using any Storage in\n/// parallel contexts.\n///\n/// Arc allows ref counting to share it between threads;\n/// RwLock makes sure there is only one writer possible (and a lot of readers);\n/// dyn Storage so we can init with anything that implements the Storage trait.\n\n// Send + Sync + 'static is kind of a cheat to avoid lifetimes issues: we\n//    should get rid of that 'static if possible... -- Luiz.\n\n#[derive(Clone)]\npub struct InnerStorage(Arc<RwLock<dyn Storage + Send + Sync + 'static>>);\n\n#[derive(TypedBuilder, Default, Clone)]\npub struct SigStore {\n    #[builder(setter(into))]\n    filename: String,\n\n    #[builder(setter(into))]\n    name: String,\n\n    #[builder(setter(into))]\n    metadata: String,\n\n    storage: Option<InnerStorage>,\n\n    #[builder(setter(into), default)]\n    data: OnceCell<Signature>,\n}\n\nimpl PartialEq for SigStore {\n    fn eq(&self, other: &Self) -> bool {\n        self.filename == other.filename\n            && self.name == other.name\n            && self.metadata == other.metadata\n            && self.data == other.data\n    }\n}\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\n#[serde(untagged)]\npub enum StorageArgs {\n    FSStorage { path: String },\n}\n\n/// Store files locally into a directory\n#[derive(TypedBuilder, Debug, Clone, Default)]\npub struct FSStorage {\n    /// absolute path for the directory where data is saved.\n    fullpath: PathBuf,\n    subdir: String,\n}\n\n/// Store files in a zip file.\n#[ouroboros::self_referencing]\npub struct ZipStorage {\n    mapping: Option<memmap2::Mmap>,\n\n    #[borrows(mapping)]\n    #[covariant]\n    archive: piz::ZipArchive<'this>,\n\n    subdir: Option<String>,\n    path: Option<PathBuf>,\n\n    #[borrows(archive)]\n    #[covariant]\n    metadata: Metadata<'this>,\n}\n\n/// Store data in memory (no permanent storage)\n#[derive(TypedBuilder, Debug, Clone, Default)]\npub struct MemStorage {\n    //store: HashMap<String, Vec<u8>>,\n    sigs: Arc<RwLock<HashMap<String, SigStore>>>,\n}\n\n#[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\npub mod rocksdb;\n\n#[cfg(all(feature = \"branchwater\", not(target_arch = \"wasm32\")))]\npub use self::rocksdb::RocksDBStorage;\n\npub type Metadata<'a> = BTreeMap<&'a OsStr, &'a piz::read::FileMetadata<'a>>;\n\n// =========================================\n\nimpl InnerStorage {\n    pub fn new(inner: impl Storage + Send + Sync + 'static) -> InnerStorage {\n        InnerStorage(Arc::new(RwLock::new(inner)))\n    }\n\n    pub fn from_spec(spec: String) -> Result<Self> {\n        Ok(match spec {\n            x if x.starts_with(\"fs\") => {\n                let path = x.split(\"://\").last().expect(\"not a valid path\");\n                InnerStorage::new(FSStorage::new(\"\", path))\n            }\n            x if x.starts_with(\"memory\") => InnerStorage::new(MemStorage::new()),\n            x if x.starts_with(\"rocksdb\") => {\n                let path = x.split(\"://\").last().expect(\"not a valid path\");\n\n                cfg_if! {\n                    if #[cfg(all( feature = \"branchwater\", not(target_arch = \"wasm32\")))] {\n                        InnerStorage::new(RocksDBStorage::from_path(path))\n                    } else {\n                        return Err(StorageError::MissingFeature(\"branchwater\".into(), path.into()).into())\n                    }\n                }\n            }\n            x if x.starts_with(\"zip\") => {\n                let path = x.split(\"://\").last().expect(\"not a valid path\");\n                InnerStorage::new(ZipStorage::from_file(path)?)\n            }\n            _ => todo!(\"storage not supported, throw error\"),\n        })\n    }\n}\n\nimpl Storage for InnerStorage {\n    fn save(&self, path: &str, content: &[u8]) -> Result<String> {\n        self.0.save(path, content)\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        self.0.load(path)\n    }\n\n    fn args(&self) -> StorageArgs {\n        self.0.args()\n    }\n\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        let mut store = self.0.load_sig(path)?;\n        store.storage = Some(self.clone());\n        Ok(store)\n    }\n\n    fn spec(&self) -> String {\n        self.0.spec()\n    }\n}\n\nimpl From<&StorageArgs> for FSStorage {\n    fn from(other: &StorageArgs) -> FSStorage {\n        match other {\n            StorageArgs::FSStorage { path } => {\n                let mut fullpath = PathBuf::new();\n                fullpath.push(\".\");\n                fullpath.push(path);\n\n                FSStorage {\n                    fullpath,\n                    subdir: path.clone(),\n                }\n            }\n        }\n    }\n}\n\nimpl<L> Storage for RwLock<L>\nwhere\n    L: ?Sized + Storage,\n{\n    fn save(&self, path: &str, content: &[u8]) -> Result<String> {\n        self.read().unwrap().save(path, content)\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        self.read().unwrap().load(path)\n    }\n\n    fn args(&self) -> StorageArgs {\n        self.read().unwrap().args()\n    }\n\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        self.read().unwrap().load_sig(path)\n    }\n\n    fn spec(&self) -> String {\n        self.read().unwrap().spec()\n    }\n}\n\nimpl FSStorage {\n    pub fn new(location: &str, subdir: &str) -> FSStorage {\n        let mut fullpath = PathBuf::new();\n        fullpath.push(location);\n        fullpath.push(subdir);\n\n        FSStorage {\n            fullpath,\n            subdir: subdir.into(),\n        }\n    }\n\n    pub fn set_base(&mut self, location: &str) {\n        let mut fullpath = PathBuf::new();\n        fullpath.push(location);\n        fullpath.push(&self.subdir);\n        self.fullpath = fullpath;\n    }\n}\n\nimpl Storage for FSStorage {\n    fn save(&self, path: &str, content: &[u8]) -> Result<String> {\n        if path.is_empty() {\n            return Err(StorageError::EmptyPathError.into());\n        }\n\n        let fpath = self.fullpath.join(path);\n        DirBuilder::new()\n            .recursive(true)\n            .create(fpath.parent().unwrap())?;\n\n        let file = File::create(&fpath)?;\n        let mut buf_writer = BufWriter::new(file);\n        buf_writer.write_all(content)?;\n        Ok(path.into())\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        let path = self.fullpath.join(path);\n        let file = File::open(path)?;\n        let mut buf_reader = BufReader::new(file);\n        let mut contents = Vec::new();\n        buf_reader.read_to_end(&mut contents)?;\n        Ok(contents)\n    }\n\n    fn args(&self) -> StorageArgs {\n        StorageArgs::FSStorage {\n            path: self.subdir.clone(),\n        }\n    }\n\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        let raw = self.load(path)?;\n\n        let mut vs = Signature::from_reader(&mut &raw[..])?;\n        if vs.len() > 1 {\n            unimplemented!(\"only one Signature currently allowed when using 'load_sig'\");\n        }\n        let sig = vs.swap_remove(0);\n\n        Ok(sig.into())\n    }\n\n    fn spec(&self) -> String {\n        format!(\"fs://{}\", self.subdir)\n    }\n}\n\nfn lookup<'a, P: AsRef<Path>>(\n    metadata: &'a Metadata,\n    path: P,\n) -> Result<&'a piz::read::FileMetadata<'a>> {\n    let path = path.as_ref();\n    metadata\n        .get(&path.as_os_str())\n        .ok_or_else(|| StorageError::PathNotFoundError(path.to_string()).into())\n        .copied()\n}\n\nfn find_subdirs<'a>(archive: &'a piz::ZipArchive<'a>) -> Result<Option<String>> {\n    let subdirs: Vec<_> = archive\n        .entries()\n        .iter()\n        .filter(|entry| entry.is_dir())\n        .collect();\n    if subdirs.len() == 1 {\n        Ok(Some(subdirs[0].path.as_str().into()))\n    } else {\n        Ok(None)\n    }\n}\n\nimpl Storage for ZipStorage {\n    fn save(&self, _path: &str, _content: &[u8]) -> Result<String> {\n        unimplemented!();\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        let metadata = self.borrow_metadata();\n\n        let entry = lookup(metadata, path).or_else(|_| {\n            if let Some(subdir) = self.borrow_subdir() {\n                lookup(metadata, subdir.to_owned() + path)\n                    .map_err(|_| StorageError::PathNotFoundError(path.into()))\n            } else {\n                Err(StorageError::PathNotFoundError(path.into()))\n            }\n        })?;\n\n        let mut reader = BufReader::new(\n            self.borrow_archive()\n                .read(entry)\n                .map_err(|_| StorageError::DataReadError(path.into()))?,\n        );\n        let mut contents = Vec::new();\n        reader.read_to_end(&mut contents)?;\n\n        Ok(contents)\n    }\n\n    fn args(&self) -> StorageArgs {\n        unimplemented!();\n    }\n\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        let raw = self.load(path)?;\n        let mut vs = Signature::from_reader(&mut &raw[..])?;\n        if vs.len() > 1 {\n            unimplemented!(\"only one Signature currently allowed\");\n        }\n        let sig = vs.swap_remove(0);\n\n        Ok(sig.into())\n    }\n\n    fn spec(&self) -> String {\n        format!(\"zip://{}\", self.path().unwrap_or_else(|| \"\".into()))\n    }\n}\n\nimpl ZipStorage {\n    pub fn from_file<P: AsRef<Path>>(location: P) -> Result<Self> {\n        let zip_file = File::open(location.as_ref())?;\n        let mapping = unsafe { memmap2::Mmap::map(&zip_file)? };\n\n        let mut storage = ZipStorageTryBuilder {\n            mapping: Some(mapping),\n            archive_builder: |mapping: &Option<memmap2::Mmap>| {\n                piz::ZipArchive::new(mapping.as_ref().unwrap())\n            },\n            metadata_builder: |archive: &piz::ZipArchive| {\n                Ok(archive\n                    .entries()\n                    .iter()\n                    .map(|entry| (entry.path.as_os_str(), entry))\n                    .collect())\n            },\n            subdir: None,\n            path: Some(location.as_ref().into()),\n        }\n        .try_build()?;\n\n        let subdir = find_subdirs(storage.borrow_archive())?;\n        storage.with_mut(|fields| *fields.subdir = subdir);\n\n        Ok(storage)\n    }\n\n    pub fn path(&self) -> Option<PathBuf> {\n        self.borrow_path().clone()\n    }\n\n    pub fn subdir(&self) -> Option<String> {\n        self.borrow_subdir().clone()\n    }\n\n    pub fn set_subdir(&mut self, path: String) {\n        self.with_mut(|fields| *fields.subdir = Some(path))\n    }\n\n    pub fn list_sbts(&self) -> Result<Vec<String>> {\n        Ok(self\n            .borrow_archive()\n            .entries()\n            .iter()\n            .filter_map(|entry| {\n                let path = entry.path.as_str();\n                if path.ends_with(\".sbt.json\") {\n                    Some(path.into())\n                } else {\n                    None\n                }\n            })\n            .collect())\n    }\n\n    pub fn filenames(&self) -> Result<Vec<String>> {\n        Ok(self\n            .borrow_archive()\n            .entries()\n            .iter()\n            .map(|entry| entry.path.as_str().into())\n            .collect())\n    }\n}\n\nimpl SigStore {\n    pub fn new_with_storage(sig: Signature, storage: InnerStorage) -> Self {\n        let name = sig.name_str();\n        let filename = sig.filename();\n\n        SigStore::builder()\n            .name(name)\n            .filename(filename)\n            .data(sig)\n            .metadata(\"\")\n            .storage(Some(storage))\n            .build()\n    }\n\n    pub fn name(&self) -> String {\n        self.name.clone()\n    }\n}\n\nimpl Select for SigStore {\n    fn select(mut self, selection: &Selection) -> Result<Self> {\n        // TODO: find better error\n        let sig = self.data.take().ok_or(Error::MismatchKSizes)?;\n        self.data = OnceCell::with_value(sig.select(selection)?);\n        Ok(self)\n    }\n}\n\nimpl std::fmt::Debug for SigStore {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"SigStore [filename: {}, name: {}, metadata: {}]\",\n            self.filename, self.name, self.metadata\n        )\n    }\n}\n\nimpl ReadData<Signature> for SigStore {\n    fn data(&self) -> Result<&Signature> {\n        if let Some(sig) = self.data.get() {\n            Ok(sig)\n        } else if let Some(storage) = &self.storage {\n            let sig = self.data.get_or_init(|| {\n                let raw = storage.load(&self.filename).unwrap();\n                Signature::from_reader(&mut &raw[..])\n                    .unwrap()\n                    // TODO: select the right sig?\n                    .swap_remove(0)\n            });\n\n            Ok(sig)\n        } else {\n            Err(ReadDataError::LoadError.into())\n        }\n    }\n}\n\nimpl SigStore {\n    pub fn save(&self, path: &str) -> Result<String> {\n        if let Some(storage) = &self.storage {\n            if let Some(data) = self.data.get() {\n                let mut buffer = Vec::new();\n                data.to_writer(&mut buffer)?;\n\n                Ok(storage.save(path, &buffer)?)\n            } else {\n                unimplemented!()\n            }\n        } else {\n            unimplemented!()\n        }\n    }\n}\n\nimpl From<SigStore> for Signature {\n    fn from(other: SigStore) -> Signature {\n        other.data.get().unwrap().to_owned()\n    }\n}\n\nimpl Deref for SigStore {\n    type Target = Signature;\n\n    fn deref(&self) -> &Signature {\n        self.data.get().unwrap()\n    }\n}\n\nimpl From<Signature> for SigStore {\n    fn from(other: Signature) -> SigStore {\n        let name = other.name_str();\n        let filename = other.filename();\n\n        SigStore::builder()\n            .name(name)\n            .filename(filename)\n            .data(other)\n            .metadata(\"\")\n            .storage(None)\n            .build()\n    }\n}\n\nimpl TryInto<KmerMinHash> for SigStore {\n    type Error = crate::Error;\n\n    fn try_into(self) -> std::result::Result<KmerMinHash, Self::Error> {\n        let sig: Signature = self.into();\n        sig.try_into()\n    }\n}\n\nimpl Comparable<SigStore> for SigStore {\n    fn similarity(&self, other: &SigStore) -> f64 {\n        let ng: &Signature = self.data().unwrap();\n        let ong: &Signature = other.data().unwrap();\n\n        // TODO: select the right signatures...\n        // TODO: better matching here, what if it is not a mh?\n        if let Sketch::MinHash(mh) = &ng.signatures[0] {\n            if let Sketch::MinHash(omh) = &ong.signatures[0] {\n                return mh.similarity(omh, true, false).unwrap();\n            }\n        }\n\n        unimplemented!()\n    }\n\n    fn containment(&self, other: &SigStore) -> f64 {\n        let ng: &Signature = self.data().unwrap();\n        let ong: &Signature = other.data().unwrap();\n\n        // TODO: select the right signatures...\n        // TODO: better matching here, what if it is not a mh?\n        if let Sketch::MinHash(mh) = &ng.signatures[0] {\n            if let Sketch::MinHash(omh) = &ong.signatures[0] {\n                let common = mh.count_common(omh, false).unwrap();\n                let size = mh.size();\n                return common as f64 / size as f64;\n            }\n        }\n        unimplemented!()\n    }\n}\n\n#[derive(Serialize, Deserialize, Debug)]\npub struct DatasetInfo {\n    pub filename: String,\n    pub name: String,\n    pub metadata: String,\n}\nimpl From<DatasetInfo> for SigStore {\n    fn from(other: DatasetInfo) -> SigStore {\n        SigStore {\n            filename: other.filename,\n            name: other.name,\n            metadata: other.metadata,\n            storage: None,\n            data: OnceCell::new(),\n        }\n    }\n}\n\nimpl Comparable<Signature> for Signature {\n    fn similarity(&self, other: &Signature) -> f64 {\n        // TODO: select the right signatures...\n        // TODO: better matching here, what if it is not a mh?\n        if let Sketch::MinHash(mh) = &self.signatures[0] {\n            if let Sketch::MinHash(omh) = &other.signatures[0] {\n                return mh.similarity(omh, true, false).unwrap();\n            }\n        }\n        unimplemented!()\n    }\n\n    fn containment(&self, other: &Signature) -> f64 {\n        // TODO: select the right signatures...\n        // TODO: better matching here, what if it is not a mh?\n        if let Sketch::MinHash(mh) = &self.signatures[0] {\n            if let Sketch::MinHash(omh) = &other.signatures[0] {\n                let common = mh.count_common(omh, false).unwrap();\n                let size = mh.size();\n                return common as f64 / size as f64;\n            }\n        }\n        unimplemented!()\n    }\n}\n\nimpl MemStorage {\n    pub fn new() -> Self {\n        Self {\n            sigs: Arc::new(RwLock::new(HashMap::default())),\n        }\n    }\n}\n\nimpl Storage for MemStorage {\n    fn save(&self, _path: &str, _content: &[u8]) -> Result<String> {\n        unimplemented!()\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        let store = self.sigs.read().unwrap();\n        let sig = store.get(path).unwrap();\n\n        let mut buffer = vec![];\n        {\n            sig.to_writer(&mut buffer).unwrap();\n        }\n\n        Ok(buffer)\n    }\n\n    fn args(&self) -> StorageArgs {\n        unimplemented!()\n    }\n\n    fn load_sig(&self, path: &str) -> Result<SigStore> {\n        Ok(self.sigs.read().unwrap().get(path).unwrap().clone())\n    }\n\n    fn save_sig(&self, path: &str, sig: Signature) -> Result<String> {\n        // side-step saving to store\n        let sig_store: SigStore = sig.into();\n        self.sigs.write().unwrap().insert(path.into(), sig_store);\n        Ok(path.into())\n    }\n\n    fn spec(&self) -> String {\n        \"memory://\".into()\n    }\n}\n"
  },
  {
    "path": "src/core/src/storage/rocksdb.rs",
    "content": "use std::sync::Arc;\n\nuse rocksdb::{ColumnFamilyDescriptor, Options};\n\nuse crate::Result;\nuse crate::storage::{Storage, StorageArgs, StorageError};\n\n// Column families\npub(crate) const HASHES: &str = \"hashes\";\npub(crate) const COLORS: &str = \"colors\";\npub(crate) const METADATA: &str = \"metadata\";\n\n// Column family for using rocksdb as a Storage\npub(crate) const STORAGE: &str = \"storage\";\n\npub(crate) const ALL_CFS: [&str; 3] = [HASHES, METADATA, STORAGE];\n\npub type DB = rocksdb::DBWithThreadMode<rocksdb::MultiThreaded>;\n\n/// Store data in RocksDB\n#[derive(Debug, Clone)]\npub struct RocksDBStorage {\n    db: Arc<DB>,\n}\n\nimpl RocksDBStorage {\n    pub fn from_path(path: &str) -> Self {\n        let mut opts = db_options();\n        opts.create_if_missing(true);\n        opts.create_missing_column_families(true);\n        opts.prepare_for_bulk_load();\n\n        // prepare column family descriptors\n        let cfs = cf_descriptors();\n\n        let db = Arc::new(DB::open_cf_descriptors(&opts, path, cfs).unwrap());\n\n        Self { db }\n    }\n\n    pub fn from_db(db: Arc<DB>) -> Self {\n        Self { db: db.clone() }\n    }\n}\n\nimpl Storage for RocksDBStorage {\n    fn save(&self, path: &str, content: &[u8]) -> Result<String> {\n        let cf_storage = self.db.cf_handle(STORAGE).unwrap();\n        // TODO(lirber): deal with conflict for path?\n        self.db.put_cf(&cf_storage, path.as_bytes(), content)?;\n        Ok(path.into())\n    }\n\n    fn load(&self, path: &str) -> Result<Vec<u8>> {\n        let cf_storage = self.db.cf_handle(STORAGE).unwrap();\n        let data = self.db.get_cf(&cf_storage, path.as_bytes())?;\n        data.ok_or_else(|| StorageError::DataReadError(path.into()).into())\n    }\n\n    fn args(&self) -> StorageArgs {\n        unimplemented!()\n    }\n\n    fn spec(&self) -> String {\n        format!(\"rocksdb://{}\", self.db.path().display())\n    }\n}\n\npub(crate) fn cf_descriptors() -> Vec<ColumnFamilyDescriptor> {\n    let mut cfopts = Options::default();\n    cfopts.set_max_write_buffer_number(16);\n    cfopts.set_merge_operator_associative(\n        \"datasets operator\",\n        crate::index::revindex::disk_revindex::merge_datasets,\n    );\n    cfopts.set_min_write_buffer_number_to_merge(10);\n\n    // Updated default from\n    // https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning#other-general-options\n    cfopts.set_level_compaction_dynamic_level_bytes(true);\n\n    let cf_hashes = ColumnFamilyDescriptor::new(HASHES, cfopts);\n\n    let mut cfopts = Options::default();\n    cfopts.set_max_write_buffer_number(16);\n    cfopts.set_merge_operator_associative(\n        \"datasets operator\",\n        crate::index::revindex::disk_revindex::merge_datasets,\n    );\n    // Updated default\n    cfopts.set_level_compaction_dynamic_level_bytes(true);\n\n    let cf_metadata = ColumnFamilyDescriptor::new(METADATA, cfopts);\n\n    let mut cfopts = Options::default();\n    cfopts.set_max_write_buffer_number(16);\n    // Updated default\n    cfopts.set_level_compaction_dynamic_level_bytes(true);\n\n    let cf_storage = ColumnFamilyDescriptor::new(STORAGE, cfopts);\n\n    let mut cfopts = Options::default();\n    cfopts.set_max_write_buffer_number(16);\n    // Updated default\n    cfopts.set_level_compaction_dynamic_level_bytes(true);\n\n    vec![cf_hashes, cf_metadata, cf_storage]\n}\n\npub(crate) fn db_options() -> rocksdb::Options {\n    let mut opts = rocksdb::Options::default();\n    opts.set_max_open_files(500);\n\n    // Updated defaults from\n    // https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning#other-general-options\n    opts.set_bytes_per_sync(1048576);\n    let mut block_opts = rocksdb::BlockBasedOptions::default();\n    block_opts.set_block_size(16 * 1024);\n    block_opts.set_cache_index_and_filter_blocks(true);\n    block_opts.set_pin_l0_filter_and_index_blocks_in_cache(true);\n    block_opts.set_format_version(6);\n    opts.set_block_based_table_factory(&block_opts);\n    // End of updated defaults\n\n    opts.increase_parallelism(rayon::current_num_threads() as i32);\n    //opts.max_background_jobs = 6;\n    // opts.optimize_level_style_compaction();\n    // opts.optimize_universal_style_compaction();\n\n    opts\n}\n"
  },
  {
    "path": "src/core/src/wasm.rs",
    "content": "use needletail::parse_fastx_reader;\nuse wasm_bindgen::prelude::*;\n\nuse crate::ScaledType;\nuse crate::cmd::ComputeParameters as _ComputeParameters;\nuse crate::encodings::HashFunctions;\nuse crate::prelude::ToWriter;\nuse crate::signature::Signature as _Signature;\nuse crate::signature::SigsTrait;\nuse crate::sketch::minhash::KmerMinHash as _KmerMinHash;\n\n#[wasm_bindgen]\npub struct KmerMinHash(_KmerMinHash);\n\n#[wasm_bindgen]\npub struct Signature(_Signature);\n\n#[wasm_bindgen]\npub struct ComputeParameters(_ComputeParameters);\n\n#[wasm_bindgen]\nimpl KmerMinHash {\n    #[wasm_bindgen(constructor)]\n    pub fn new_with_scaled(\n        num: u32,\n        ksize: u32,\n        is_protein: bool,\n        dayhoff: bool,\n        hp: bool,\n        seed: u32,\n        scaled: ScaledType,\n        track_abundance: bool,\n    ) -> KmerMinHash {\n        // TODO: at most one of (prot, dayhoff, hp) should be true\n\n        let hash_function = if dayhoff {\n            HashFunctions::Murmur64Dayhoff\n        } else if hp {\n            HashFunctions::Murmur64Hp\n        } else if is_protein {\n            HashFunctions::Murmur64Protein\n        } else {\n            HashFunctions::Murmur64Dna\n        };\n\n        KmerMinHash(_KmerMinHash::new(\n            scaled,\n            ksize,\n            hash_function,\n            seed as u64,\n            track_abundance,\n            num,\n        ))\n    }\n\n    #[wasm_bindgen]\n    pub fn add_sequence_js(&mut self, buf: &str) -> Result<(), JsErrors> {\n        self.0.add_sequence(buf.as_bytes(), true)?;\n        Ok(())\n    }\n\n    #[wasm_bindgen]\n    pub fn to_json(&mut self) -> Result<String, JsErrors> {\n        let mut st: Vec<u8> = vec![];\n        self.0.to_writer(&mut st)?;\n        Ok(unsafe { String::from_utf8_unchecked(st) })\n    }\n}\n\n#[wasm_bindgen]\nimpl ComputeParameters {\n    #[wasm_bindgen(constructor)]\n    pub fn new_with_params() -> ComputeParameters {\n        let params = _ComputeParameters::default();\n        ComputeParameters(params)\n    }\n\n    #[wasm_bindgen]\n    pub fn set_ksizes(&mut self, ksizes: Vec<u32>) {\n        self.0.set_ksizes(ksizes);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_scaled(&mut self, scaled: ScaledType) {\n        self.0.set_scaled(scaled);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_num(&mut self, num: u32) {\n        self.0.set_num_hashes(num);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_protein(&mut self, is_protein: bool) {\n        self.0.set_protein(is_protein);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_dayhoff(&mut self, dayhoff: bool) {\n        self.0.set_dayhoff(dayhoff);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_hp(&mut self, hp: bool) {\n        self.0.set_hp(hp);\n    }\n\n    #[wasm_bindgen]\n    pub fn set_track_abundance(&mut self, track: bool) {\n        self.0.set_track_abundance(track);\n    }\n    #[wasm_bindgen]\n    pub fn set_seed(&mut self, seed: u32) {\n        self.0.set_seed(seed.into());\n    }\n}\n\n#[wasm_bindgen]\nimpl Signature {\n    #[wasm_bindgen(constructor)]\n    pub fn new_from_params(params: &ComputeParameters) -> Signature {\n        //let params = ComputeParameters::default();\n\n        Signature(_Signature::from_params(&params.0))\n    }\n\n    #[wasm_bindgen]\n    pub fn add_sequence_js(&mut self, buf: &str) -> Result<(), JsErrors> {\n        self.0.add_sequence(buf.as_bytes(), true)?;\n\n        Ok(())\n    }\n\n    #[wasm_bindgen]\n    pub fn add_from_file(\n        &mut self,\n        fp: web_sys::File,\n        callback: Option<js_sys::Function>,\n    ) -> Result<(), JsErrors> {\n        let wf = SyncFile::new(fp, callback);\n\n        let (rdr, _format) = niffler::send::get_reader(Box::new(wf))?;\n\n        let mut parser = parse_fastx_reader(std::io::BufReader::with_capacity(\n            1024 << 14, // 16 MiB\n            rdr,\n        ))?;\n\n        while let Some(record) = parser.next() {\n            let record = record?;\n            self.0.add_sequence(&record.seq(), true)?;\n        }\n\n        Ok(())\n    }\n\n    #[wasm_bindgen]\n    pub fn to_json(&mut self) -> Result<String, JsErrors> {\n        let mut st: Vec<u8> = vec![];\n        self.0.to_writer(&mut st)?;\n        Ok(unsafe { String::from_utf8_unchecked(st) })\n    }\n\n    pub fn size(&self) -> usize {\n        self.0.size()\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum JsErrors {\n    #[error(transparent)]\n    SourmashError(#[from] crate::Error),\n\n    #[error(transparent)]\n    SerdeError(#[from] serde_json::error::Error),\n\n    #[error(transparent)]\n    NifflerError(#[from] niffler::Error),\n\n    #[error(transparent)]\n    NeedletailError(#[from] needletail::errors::ParseError),\n}\n\nimpl Into<JsValue> for JsErrors {\n    fn into(self) -> JsValue {\n        let error = js_sys::Error::new(&self.to_string());\n        error.into()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use wasm_bindgen_test::*;\n\n    #[wasm_bindgen_test]\n    fn wasm_test() {\n        let mut params = ComputeParameters::new_with_params();\n        params.set_ksizes(vec![19, 29, 49]);\n        let sig = Signature::new_from_params(&params);\n        assert_eq!(sig.size(), 3);\n    }\n}\n\n// ==============================\n\nuse js_sys::Number;\nuse js_sys::Uint8Array;\nuse once_cell::sync::Lazy;\nuse web_sys::FileReaderSync;\n\nthread_local! {\n    static FILE_READER_SYNC: Lazy<FileReaderSync> = Lazy::new(|| {\n      FileReaderSync::new().expect(\"Failed to create FileReaderSync. Is it running in a web worker context?\")\n    });\n}\n\n/// Wrapper around a `web_sys::File` that implements `Read` and `Seek`.\npub struct SyncFile {\n    file: web_sys::File,\n    pos: u64,\n    cb: Option<js_sys::Function>,\n}\n\n/// Because this needs to be initialized in a Web Worker, it is safe to make it Send.\n/// (hopefully. I don't think they can be sent across Web Workers, nor accessed from other WW)\nunsafe impl Send for SyncFile {}\n\nimpl SyncFile {\n    pub fn new(file: web_sys::File, cb: Option<js_sys::Function>) -> Self {\n        Self { file, pos: 0, cb }\n    }\n\n    /// File size in bytes.\n    pub fn size(&self) -> u64 {\n        let size = self.file.size();\n        if size <= Number::MAX_SAFE_INTEGER {\n            return size as u64;\n        } else {\n            panic!(\"size is not safe to convert to integer from float\")\n        }\n    }\n\n    fn set_pos(&mut self, pos: u64) {\n        self.pos = pos;\n        self.cb.as_ref().map(|f| {\n            let arr = js_sys::Array::new_with_length(1);\n            arr.set(0, self.progress().into());\n            f.apply(&JsValue::null(), &arr)\n                .expect(\"Error calling progress callback\");\n        });\n    }\n\n    /// Current progress on the file\n    pub fn progress(&self) -> f64 {\n        self.pos as f64 / self.file.size()\n    }\n}\n\nimpl std::io::Read for SyncFile {\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> {\n        let current_offset = self.pos;\n        let new_offset_f64 = current_offset as f64;\n        let new_offset_end_f64 = current_offset.saturating_add(\n            u64::try_from(buf.len()).map_err(|_| std::io::Error::other(\"Can't convert to u64\"))?,\n        ) as f64;\n\n        let blob = self\n            .file\n            .slice_with_f64_and_f64(new_offset_f64, new_offset_end_f64)\n            .map_err(|_| std::io::Error::other(\"failed to slice file\"))?;\n        let array_buffer = FILE_READER_SYNC\n            .with(|frs| frs.read_as_array_buffer(&blob))\n            .map_err(|_| std::io::Error::other(\"failed to read as array buffer\"))?;\n\n        let array = Uint8Array::new(&array_buffer);\n        let read_bytes = usize::try_from(array.byte_length())\n            .map_err(|_| std::io::Error::other(\"read too many bytes at once\"))?;\n\n        // Copy to output buffer\n        array.copy_to(&mut buf[..read_bytes]);\n\n        // Update position\n        self.set_pos(\n            current_offset\n                .checked_add(read_bytes as u64)\n                .ok_or_else(|| std::io::Error::other(\"new position too large\"))?,\n        );\n\n        Ok(read_bytes)\n    }\n}\n"
  },
  {
    "path": "src/core/tests/dedicated_worker.rs",
    "content": "#![cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))]\n\nuse wasm_bindgen_test::wasm_bindgen_test_configure;\n\nwasm_bindgen_test_configure!(run_in_dedicated_worker);\n"
  },
  {
    "path": "src/core/tests/finch.rs",
    "content": "\n"
  },
  {
    "path": "src/core/tests/minhash.rs",
    "content": "use std::fs::File;\nuse std::io::BufReader;\nuse std::path::PathBuf;\n\nuse proptest::collection::vec;\nuse proptest::num::u64;\nuse proptest::proptest;\nuse sourmash::ScaledType;\nuse sourmash::encodings::HashFunctions;\nuse sourmash::prelude::ToWriter;\nuse sourmash::signature::SeqToHashes;\nuse sourmash::signature::{Signature, SigsTrait};\nuse sourmash::sketch::Sketch;\nuse sourmash::sketch::minhash::{\n    KmerMinHash, KmerMinHashBTree, max_hash_for_scaled, scaled_for_max_hash,\n};\n\n// TODO: use f64::EPSILON when we bump MSRV\nconst EPSILON: f64 = 0.01;\n\n#[test]\nfn throws_error() {\n    let mut mh = KmerMinHash::new(0, 4, HashFunctions::Murmur64Dna, 42, false, 1);\n\n    assert!(\n        mh.add_sequence(b\"ATGR\", false).is_err(),\n        \"R is not a valid DNA character\"\n    );\n}\n\n#[test]\nfn merge() {\n    let mut a = KmerMinHash::new(0, 10, HashFunctions::Murmur64Dna, 42, false, 20);\n    let mut b = KmerMinHash::new(0, 10, HashFunctions::Murmur64Dna, 42, false, 20);\n\n    a.add_sequence(b\"TGCCGCCCAGCA\", false).unwrap();\n    b.add_sequence(b\"TGCCGCCCAGCA\", false).unwrap();\n\n    a.add_sequence(b\"GTCCGCCCAGTGA\", false).unwrap();\n    b.add_sequence(b\"GTCCGCCCAGTGG\", false).unwrap();\n\n    a.merge(&b).unwrap();\n    assert_eq!(\n        a.to_vec(),\n        vec![\n            2996412506971915891,\n            4448613756639084635,\n            8373222269469409550,\n            9390240264282449587,\n            11085758717695534616,\n            11668188995231815419,\n            11760449009842383350,\n            14682565545778736889,\n        ]\n    );\n}\n\n#[test]\nfn invalid_dna() {\n    let mut a = KmerMinHash::new(0, 3, HashFunctions::Murmur64Dna, 42, false, 20);\n\n    a.add_sequence(b\"AAANNCCCTN\", true).unwrap();\n    assert_eq!(a.mins().len(), 3);\n\n    let mut b = KmerMinHash::new(0, 3, HashFunctions::Murmur64Dna, 42, false, 20);\n    b.add_sequence(b\"NAAA\", true).unwrap();\n    assert_eq!(b.mins().len(), 1);\n}\n\n#[test]\nfn similarity() -> Result<(), Box<dyn std::error::Error>> {\n    let mut a = KmerMinHash::new(0, 20, HashFunctions::Murmur64Hp, 42, true, 5);\n    let mut b = KmerMinHash::new(0, 20, HashFunctions::Murmur64Hp, 42, true, 5);\n\n    a.add_hash(1);\n    b.add_hash(1);\n    b.add_hash(2);\n\n    assert!((a.similarity(&a, false, false)? - 1.0).abs() < EPSILON);\n    assert!((a.similarity(&b, false, false)? - 0.5).abs() < EPSILON);\n\n    Ok(())\n}\n\n#[test]\nfn similarity_2() -> Result<(), Box<dyn std::error::Error>> {\n    let mut a = KmerMinHash::new(0, 5, HashFunctions::Murmur64Dna, 42, true, 5);\n    let mut b = KmerMinHash::new(0, 5, HashFunctions::Murmur64Dna, 42, true, 5);\n\n    a.add_sequence(b\"ATGGA\", false)?;\n    a.add_sequence(b\"GGACA\", false)?;\n\n    a.add_sequence(b\"ATGGA\", false)?;\n    b.add_sequence(b\"ATGGA\", false)?;\n\n    assert!(\n        (a.similarity(&b, false, false)? - 0.705).abs() < EPSILON,\n        \"{}\",\n        a.similarity(&b, false, false)?\n    );\n\n    Ok(())\n}\n\n#[test]\nfn similarity_3() -> Result<(), Box<dyn std::error::Error>> {\n    let mut a = KmerMinHash::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, true, 5);\n    let mut b = KmerMinHash::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, true, 5);\n\n    a.add_hash(1);\n    a.add_hash(1);\n    a.add_hash(5);\n    a.add_hash(5);\n\n    b.add_hash(1);\n    b.add_hash(2);\n    b.add_hash(3);\n    b.add_hash(4);\n\n    assert!((a.similarity(&a, false, false)? - 1.0).abs() < EPSILON);\n    assert!((a.similarity(&b, false, false)? - 0.23).abs() < EPSILON);\n\n    assert!((a.similarity(&a, true, false)? - 1.0).abs() < EPSILON);\n    assert!((a.similarity(&b, true, false)? - 0.2).abs() < EPSILON);\n\n    Ok(())\n}\n\n#[test]\nfn angular_similarity_requires_abundance() -> Result<(), Box<dyn std::error::Error>> {\n    let mut a = KmerMinHash::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, false, 5);\n    let mut b = KmerMinHash::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, false, 5);\n\n    a.add_hash(1);\n    b.add_hash(1);\n\n    assert!(a.angular_similarity(&b).is_err());\n\n    Ok(())\n}\n\n#[test]\nfn angular_similarity_btree_requires_abundance() -> Result<(), Box<dyn std::error::Error>> {\n    let mut a = KmerMinHashBTree::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, false, 5);\n    let mut b = KmerMinHashBTree::new(0, 20, HashFunctions::Murmur64Dayhoff, 42, false, 5);\n\n    a.add_hash(1);\n    b.add_hash(1);\n\n    assert!(a.angular_similarity(&b).is_err());\n\n    Ok(())\n}\n\n#[test]\nfn dayhoff() {\n    let mut a = KmerMinHash::new(0, 6, HashFunctions::Murmur64Dayhoff, 42, false, 10);\n    let mut b = KmerMinHash::new(0, 6, HashFunctions::Murmur64Protein, 42, false, 10);\n\n    a.add_sequence(b\"ACTGAC\", false).unwrap();\n    b.add_sequence(b\"ACTGAC\", false).unwrap();\n\n    assert_eq!(a.size(), 2);\n    assert_eq!(b.size(), 2);\n}\n\n#[test]\nfn hp() {\n    let mut a = KmerMinHash::new(0, 6, HashFunctions::Murmur64Hp, 42, false, 10);\n    let mut b = KmerMinHash::new(0, 6, HashFunctions::Murmur64Protein, 42, false, 10);\n\n    a.add_sequence(b\"ACTGAC\", false).unwrap();\n    b.add_sequence(b\"ACTGAC\", false).unwrap();\n\n    assert_eq!(a.size(), 2);\n    assert_eq!(b.size(), 2);\n}\n\n#[test]\nfn max_for_scaled() {\n    assert_eq!(max_hash_for_scaled(100), 184467440737095520);\n}\n\nproptest! {\n#[test]\nfn oracle_mins(hashes in vec(u64::ANY, 1..10000)) {\n    let mut a = KmerMinHash::new(0, 21, HashFunctions::Murmur64Protein, 42, true, 1000);\n    let mut b = KmerMinHashBTree::new(0, 21, HashFunctions::Murmur64Protein, 42, true, 1000);\n\n    let mut c: KmerMinHash = Default::default();\n    c.set_hash_function(HashFunctions::Murmur64Protein).unwrap();\n    c.enable_abundance().unwrap();\n\n    let mut d: KmerMinHashBTree = Default::default();\n    d.set_hash_function(HashFunctions::Murmur64Protein).unwrap();\n    d.enable_abundance().unwrap();\n\n    let mut to_remove = vec![];\n    for hash in &hashes {\n        a.add_hash(*hash);\n        b.add_hash(*hash);\n\n        if hash % 2 == 0 {\n            to_remove.push(*hash);\n        }\n    }\n\n    c.add_from(&a).unwrap();\n    c.remove_many(to_remove.iter().copied()).unwrap();\n\n    d.add_from(&b).unwrap();\n    d.remove_many(to_remove.iter().copied()).unwrap();\n\n    assert_eq!(a.mins(), b.mins());\n    assert_eq!(c.mins(), d.mins());\n\n    assert_eq!(a.count_common(&c, false).unwrap(), b.count_common(&d, false).unwrap());\n    assert_eq!(a.count_common(&c, true).unwrap(), b.count_common(&d, true).unwrap());\n\n    assert_eq!(a.abunds(), b.abunds());\n    assert_eq!(c.abunds(), d.abunds());\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n}\n}\n\nproptest! {\n#[test]\nfn oracle_mins_scaled(hashes in vec(u64::ANY, 1..10000)) {\n    let scaled = 100;\n    let mut a = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    let mut c = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut d = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    let mut to_remove = vec![];\n    for hash in &hashes {\n        a.add_hash(*hash);\n        b.add_hash(*hash);\n\n        if hash % 2 == 0 {\n            to_remove.push(*hash);\n        }\n    }\n\n    c.add_many(&hashes).unwrap();\n    d.add_many(&hashes).unwrap();\n\n    c.remove_many(to_remove.iter().copied()).unwrap();\n    d.remove_many(to_remove.iter().copied()).unwrap();\n\n    a.remove_hash(hashes[0]);\n    b.remove_hash(hashes[0]);\n\n    assert_eq!(a.mins(), b.mins());\n    assert_eq!(c.mins(), d.mins());\n\n    assert_eq!(a.md5sum(), b.md5sum());\n    assert_eq!(c.md5sum(), d.md5sum());\n\n    assert_eq!(a.is_protein(), b.is_protein());\n    assert_eq!(a.num(), b.num());\n    assert_eq!(a.seed(), b.seed());\n    assert_eq!(a.ksize(), b.ksize());\n    assert_eq!(a.scaled(), b.scaled());\n    assert_eq!(a.track_abundance(), b.track_abundance());\n    assert_eq!(a.hash_function(), b.hash_function());\n\n    assert_eq!(a.abunds(), b.abunds());\n    assert_eq!(c.abunds(), d.abunds());\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n    assert!((c.similarity(&a, false, false).unwrap() - d.similarity(&b, false, false).unwrap()).abs() < EPSILON);\n    assert!((a.similarity(&c, true, false).unwrap() - b.similarity(&d, true, false).unwrap()).abs() < EPSILON);\n    assert!((c.similarity(&a, true, false).unwrap() - d.similarity(&b, true, false).unwrap()).abs() < EPSILON);\n\n    assert_eq!(a.count_common(&c, false).unwrap(), b.count_common(&d, false).unwrap());\n    assert_eq!(c.count_common(&a, false).unwrap(), d.count_common(&b, false).unwrap());\n    assert_eq!(a.count_common(&c, true).unwrap(), b.count_common(&d, true).unwrap());\n    assert_eq!(c.count_common(&a, true).unwrap(), d.count_common(&b, true).unwrap());\n\n    let mut e = a.downsample_max_hash(100).unwrap();\n    let scaled = scaled_for_max_hash(100);\n    let mut f = b.downsample_scaled(scaled).unwrap();\n    assert_eq!(f.scaled(), scaled);\n\n    // Can't compare different scaled without explicit downsample\n    assert!(c.similarity(&e, false, false).is_err());\n    assert!(d.similarity(&f, false, false).is_err());\n    assert!(c.similarity(&e, true, false).is_err());\n    assert!(d.similarity(&f, true, false).is_err());\n\n    assert!((c.similarity(&e, true, true).unwrap() - d.similarity(&f, true, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, true, true).unwrap() - f.similarity(&d, true, true).unwrap()).abs() < EPSILON);\n    assert!((c.similarity(&e, false, true).unwrap() - d.similarity(&f, false, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, false, true).unwrap() - f.similarity(&d, false, true).unwrap()).abs() < EPSILON);\n\n    // Can't compare different scaled without explicit downsample\n    assert!(e.count_common(&c, false).is_err());\n    assert!(f.count_common(&d, false).is_err());\n\n    assert_eq!(e.count_common(&c, true).unwrap(), f.count_common(&d, true).unwrap());\n    assert_eq!(c.count_common(&e, true).unwrap(), d.count_common(&f, true).unwrap());\n\n    // disable abundances\n    e.disable_abundance();\n    f.disable_abundance();\n\n    // Can't compare different scaled without explicit downsample\n    assert!(c.similarity(&e, false, false).is_err());\n    assert!(d.similarity(&f, false, false).is_err());\n    assert!(c.similarity(&e, true, false).is_err());\n    assert!(d.similarity(&f, true, false).is_err());\n\n    assert!((c.similarity(&e, true, true).unwrap() - d.similarity(&f, true, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, true, true).unwrap() - f.similarity(&d, true, true).unwrap()).abs() < EPSILON);\n    assert!((c.similarity(&e, false, true).unwrap() - d.similarity(&f, false, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, false, true).unwrap() - f.similarity(&d, false, true).unwrap()).abs() < EPSILON);\n\n    // Can't compare different scaled without explicit downsample\n    assert!(e.count_common(&c, false).is_err());\n    assert!(f.count_common(&d, false).is_err());\n\n    assert_eq!(e.count_common(&c, true).unwrap(), f.count_common(&d, true).unwrap());\n    assert_eq!(c.count_common(&e, true).unwrap(), d.count_common(&f, true).unwrap());\n}\n}\n\nproptest! {\n#[test]\nfn prop_merge(seq1 in \"[ACGT]{6,100}\", seq2 in \"[ACGT]{6,200}\") {\n    let scaled: ScaledType = 10;\n    let mut a = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    let mut c = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut d = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    a.add_sequence(seq1.as_bytes(), false).unwrap();\n    b.add_sequence(seq1.as_bytes(), false).unwrap();\n\n    c.add_sequence(seq2.as_bytes(), false).unwrap();\n    d.add_sequence(seq2.as_bytes(), false).unwrap();\n\n    a.merge(&c).unwrap();\n    b.merge(&d).unwrap();\n\n    assert_eq!(a.mins(), b.mins());\n    assert_eq!(c.mins(), d.mins());\n\n    assert_eq!(a.abunds(), b.abunds());\n    assert_eq!(c.abunds(), d.abunds());\n\n    assert_eq!(a.intersection_size(&c).unwrap(), b.intersection_size(&d).unwrap());\n    assert_eq!(c.intersection(&a).unwrap(), d.intersection(&b).unwrap());\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n    assert!((a.similarity(&c, true, false).unwrap() - b.similarity(&d, true, false).unwrap()).abs() < EPSILON);\n\n    let mut e = a.downsample_max_hash(100).unwrap();\n    let scaled = scaled_for_max_hash(100);\n    let mut f = b.downsample_scaled(scaled).unwrap();\n\n    assert!((e.similarity(&c, false, true).unwrap() - f.similarity(&d, false, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, true, true).unwrap() - f.similarity(&d, true, true).unwrap()).abs() < EPSILON);\n\n    e.disable_abundance();\n    f.disable_abundance();\n\n    assert!((e.similarity(&c, false, true).unwrap() - f.similarity(&d, false, true).unwrap()).abs() < EPSILON);\n    assert!((e.similarity(&c, true, true).unwrap() - f.similarity(&d, true, true).unwrap()).abs() < EPSILON);\n\n    e.clear();\n    f.clear();\n\n    assert!(e.is_empty());\n    assert!(f.is_empty());\n}\n}\n\n#[test]\nfn load_save_minhash_sketches() {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/genome-s10+s11.sig\");\n\n    let file = File::open(filename).unwrap();\n    let reader = BufReader::new(file);\n    let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n    let sig = sigs.get(0).unwrap();\n    let sketches = sig.sketches();\n    let mut buffer = vec![];\n\n    if let Sketch::MinHash(mh) = &sketches[0] {\n        let bmh: KmerMinHashBTree = mh.clone().into();\n        {\n            bmh.to_writer(&mut buffer).unwrap();\n        }\n\n        let new_mh = KmerMinHash::from_reader(&buffer[..]).unwrap();\n        let new_bmh = KmerMinHashBTree::from_reader(&buffer[..]).unwrap();\n\n        assert_eq!(mh.md5sum(), new_mh.md5sum());\n        assert_eq!(bmh.md5sum(), new_bmh.md5sum());\n        assert_eq!(bmh.md5sum(), new_mh.md5sum());\n        assert_eq!(mh.md5sum(), new_bmh.md5sum());\n\n        assert_eq!(mh.mins(), new_mh.mins());\n        assert_eq!(bmh.mins(), new_bmh.mins());\n        assert_eq!(bmh.mins(), new_mh.mins());\n        assert_eq!(mh.mins(), new_bmh.mins());\n\n        assert_eq!(mh.abunds(), new_mh.abunds());\n        assert_eq!(bmh.abunds(), new_bmh.abunds());\n        assert_eq!(bmh.abunds(), new_mh.abunds());\n        assert_eq!(mh.abunds(), new_bmh.abunds());\n\n        assert!(\n            (mh.similarity(&new_mh, false, false).unwrap()\n                - bmh.similarity(&new_bmh, false, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        assert!(\n            (mh.similarity(&new_mh, true, false).unwrap()\n                - bmh.similarity(&new_bmh, true, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        buffer.clear();\n        let imh: KmerMinHash = bmh.clone().into();\n        {\n            imh.to_writer(&mut buffer).unwrap();\n        }\n\n        let new_mh = KmerMinHash::from_reader(&buffer[..]).unwrap();\n        let new_bmh = KmerMinHashBTree::from_reader(&buffer[..]).unwrap();\n\n        assert_eq!(mh.md5sum(), new_mh.md5sum());\n        assert_eq!(bmh.md5sum(), new_bmh.md5sum());\n        assert_eq!(bmh.md5sum(), new_mh.md5sum());\n        assert_eq!(mh.md5sum(), new_bmh.md5sum());\n\n        assert_eq!(mh.mins(), new_mh.mins());\n        assert_eq!(bmh.mins(), new_bmh.mins());\n        assert_eq!(bmh.mins(), new_mh.mins());\n        assert_eq!(mh.mins(), new_bmh.mins());\n\n        assert_eq!(mh.abunds(), new_mh.abunds());\n        assert_eq!(bmh.abunds(), new_bmh.abunds());\n        assert_eq!(bmh.abunds(), new_mh.abunds());\n        assert_eq!(mh.abunds(), new_bmh.abunds());\n\n        assert_eq!(mh.to_vec(), new_mh.to_vec());\n        assert_eq!(bmh.to_vec(), new_bmh.to_vec());\n        assert_eq!(bmh.to_vec(), new_mh.to_vec());\n        assert_eq!(mh.to_vec(), new_bmh.to_vec());\n\n        assert_eq!(mh.to_vec_abunds(), new_mh.to_vec_abunds());\n        assert_eq!(bmh.to_vec_abunds(), new_bmh.to_vec_abunds());\n        assert_eq!(bmh.to_vec_abunds(), new_mh.to_vec_abunds());\n        assert_eq!(mh.to_vec_abunds(), new_bmh.to_vec_abunds());\n\n        assert!(\n            (mh.similarity(&new_mh, false, false).unwrap()\n                - bmh.similarity(&new_bmh, false, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        assert!(\n            (mh.similarity(&new_mh, true, false).unwrap()\n                - bmh.similarity(&new_bmh, true, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n    }\n}\n\n#[test]\nfn load_save_minhash_sketches_abund() {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/gather-abund/reads-s10-s11.sig\");\n\n    let file = File::open(filename).unwrap();\n    let reader = BufReader::new(file);\n    let sigs = Signature::from_reader(reader).expect(\"Loading error\");\n\n    let sig = sigs.get(0).unwrap();\n    let sketches = sig.sketches();\n    let mut buffer = vec![];\n\n    if let Sketch::MinHash(mh) = &sketches[0] {\n        let bmh: KmerMinHashBTree = mh.clone().into();\n        {\n            bmh.to_writer(&mut buffer).unwrap();\n        }\n\n        let new_mh = KmerMinHash::from_reader(&buffer[..]).unwrap();\n        let new_bmh = KmerMinHashBTree::from_reader(&buffer[..]).unwrap();\n\n        assert_eq!(mh.md5sum(), new_mh.md5sum());\n        assert_eq!(bmh.md5sum(), new_bmh.md5sum());\n        assert_eq!(bmh.md5sum(), new_mh.md5sum());\n        assert_eq!(mh.md5sum(), new_bmh.md5sum());\n\n        assert_eq!(mh.mins(), new_mh.mins());\n        assert_eq!(bmh.mins(), new_bmh.mins());\n        assert_eq!(bmh.mins(), new_mh.mins());\n        assert_eq!(mh.mins(), new_bmh.mins());\n\n        assert_eq!(mh.abunds(), new_mh.abunds());\n        assert_eq!(bmh.abunds(), new_bmh.abunds());\n        assert_eq!(bmh.abunds(), new_mh.abunds());\n        assert_eq!(mh.abunds(), new_bmh.abunds());\n\n        assert_eq!(mh.to_vec(), new_mh.to_vec());\n        assert_eq!(bmh.to_vec(), new_bmh.to_vec());\n        assert_eq!(bmh.to_vec(), new_mh.to_vec());\n        assert_eq!(mh.to_vec(), new_bmh.to_vec());\n\n        assert_eq!(mh.to_vec_abunds(), new_mh.to_vec_abunds());\n        assert_eq!(bmh.to_vec_abunds(), new_bmh.to_vec_abunds());\n        assert_eq!(bmh.to_vec_abunds(), new_mh.to_vec_abunds());\n        assert_eq!(mh.to_vec_abunds(), new_bmh.to_vec_abunds());\n\n        assert!(\n            (mh.similarity(&new_mh, false, false).unwrap()\n                - bmh.similarity(&new_bmh, false, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        assert!(\n            (mh.similarity(&new_mh, true, false).unwrap()\n                - bmh.similarity(&new_bmh, true, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        buffer.clear();\n        let imh: KmerMinHash = bmh.clone().into();\n        {\n            imh.to_writer(&mut buffer).unwrap();\n        }\n\n        let new_mh = KmerMinHash::from_reader(&buffer[..]).unwrap();\n        let new_bmh = KmerMinHashBTree::from_reader(&buffer[..]).unwrap();\n\n        assert_eq!(mh.md5sum(), new_mh.md5sum());\n        assert_eq!(bmh.md5sum(), new_bmh.md5sum());\n        assert_eq!(bmh.md5sum(), new_mh.md5sum());\n        assert_eq!(mh.md5sum(), new_bmh.md5sum());\n\n        assert_eq!(mh.mins(), new_mh.mins());\n        assert_eq!(bmh.mins(), new_bmh.mins());\n        assert_eq!(bmh.mins(), new_mh.mins());\n        assert_eq!(mh.mins(), new_bmh.mins());\n\n        assert_eq!(mh.abunds(), new_mh.abunds());\n        assert_eq!(bmh.abunds(), new_bmh.abunds());\n        assert_eq!(bmh.abunds(), new_mh.abunds());\n        assert_eq!(mh.abunds(), new_bmh.abunds());\n\n        assert!(\n            (mh.similarity(&new_mh, false, false).unwrap()\n                - bmh.similarity(&new_bmh, false, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n\n        assert!(\n            (mh.similarity(&new_mh, true, false).unwrap()\n                - bmh.similarity(&new_bmh, true, false).unwrap())\n            .abs()\n                < EPSILON\n        );\n    }\n}\n\n#[test]\nfn merge_empty_scaled() {\n    let scaled = 10;\n    let mut a = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    let c = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n    let d = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    a.merge(&c).unwrap();\n    b.merge(&d).unwrap();\n\n    assert!(a.is_empty());\n    assert!(b.is_empty());\n\n    a.add_hash_with_abundance(0, 0);\n    assert!(a.is_empty());\n    b.add_hash_with_abundance(0, 0);\n    assert!(b.is_empty());\n\n    a.clear();\n    assert!(a.is_empty());\n    b.clear();\n    assert!(b.is_empty());\n}\n\n#[test]\nfn check_errors() {\n    let scaled = 10;\n    let mut a = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 42, false, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 42, false, 0);\n\n    // sequence too short: OK\n    assert!(a.add_sequence(b\"AC\", false).is_ok());\n    assert!(b.add_sequence(b\"AC\", false).is_ok());\n\n    // invalid base, throw error\n    assert!(a.add_sequence(b\"ACTGNN\", false).is_err());\n    assert!(b.add_sequence(b\"ACTGNN\", false).is_err());\n\n    a.add_hash(1);\n    b.add_hash(1);\n\n    // Can't set abundance after something was inserted\n    assert!(a.enable_abundance().is_err());\n    assert!(b.enable_abundance().is_err());\n\n    // Can't change hash function after insertion\n    assert!(a.set_hash_function(HashFunctions::Murmur64Hp).is_err());\n    assert!(b.set_hash_function(HashFunctions::Murmur64Hp).is_err());\n\n    // setting to the same hash function is fine\n    assert!(a.set_hash_function(HashFunctions::Murmur64Dna).is_ok());\n    assert!(b.set_hash_function(HashFunctions::Murmur64Dna).is_ok());\n\n    let c = KmerMinHash::new(scaled, 7, HashFunctions::Murmur64Dna, 42, true, 0);\n    let d = KmerMinHashBTree::new(scaled, 7, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    // different ksize\n    assert!(a.check_compatible(&c).is_err());\n    assert!(b.check_compatible(&d).is_err());\n\n    let c = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Protein, 42, true, 0);\n    let d = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Protein, 42, true, 0);\n\n    // different hash_function\n    assert!(a.check_compatible(&c).is_err());\n    assert!(b.check_compatible(&d).is_err());\n\n    let c = KmerMinHash::new(scaled, 6, HashFunctions::Murmur64Dna, 31, true, 0);\n    let d = KmerMinHashBTree::new(scaled, 6, HashFunctions::Murmur64Dna, 31, true, 0);\n\n    // different seed\n    assert!(a.check_compatible(&c).is_err());\n    assert!(b.check_compatible(&d).is_err());\n}\n\n//fn prop_merge(seq1 in \"[ACGT]{6,100}\", seq2 in \"[ACGT]{6,200}\") {\n\nproptest! {\n#[test]\nfn load_save_minhash_dayhoff(seq in \"FLYS*CWLPGQRMTHINKVADER{0,1000}\") {\n    let scaled = 10;\n    let mut a = KmerMinHash::new(scaled, 3, HashFunctions::Murmur64Dayhoff, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 3, HashFunctions::Murmur64Dayhoff, 42, true, 0);\n\n    a.add_protein(seq.as_bytes()).unwrap();\n    b.add_protein(seq.as_bytes()).unwrap();\n\n    let mut buffer_a = vec![];\n    let mut buffer_b = vec![];\n\n    {\n        a.to_writer(&mut buffer_a).unwrap();\n        b.to_writer(&mut buffer_b).unwrap();\n    }\n\n    assert_eq!(buffer_a, buffer_b);\n\n    let c = KmerMinHash::from_reader(&buffer_b[..]).unwrap();\n    let d = KmerMinHashBTree::from_reader(&buffer_a[..]).unwrap();\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n    assert!((a.similarity(&c, true, false).unwrap() - b.similarity(&d, true, false).unwrap()).abs() < EPSILON);\n}\n}\n\nproptest! {\n#[test]\nfn load_save_minhash_hp(seq in \"FLYS*CWLPGQRMTHINKVADER{0,1000}\") {\n    let scaled = 10;\n    let mut a = KmerMinHash::new(scaled, 3, HashFunctions::Murmur64Hp, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 3, HashFunctions::Murmur64Hp, 42, true, 0);\n\n    a.add_protein(seq.as_bytes()).unwrap();\n    b.add_protein(seq.as_bytes()).unwrap();\n\n    let mut buffer_a = vec![];\n    let mut buffer_b = vec![];\n\n    {\n        a.to_writer(&mut buffer_a).unwrap();\n        b.to_writer(&mut buffer_b).unwrap();\n    }\n\n    assert_eq!(buffer_a, buffer_b);\n\n    let c = KmerMinHash::from_reader(&buffer_b[..]).unwrap();\n    let d = KmerMinHashBTree::from_reader(&buffer_a[..]).unwrap();\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n    assert!((a.similarity(&c, true, false).unwrap() - b.similarity(&d, true, false).unwrap()).abs() < EPSILON);\n}\n}\n\nproptest! {\n#[test]\nfn load_save_minhash_dna(seq in \"ACGTN{0,1000}\") {\n    let scaled = 10;\n    let mut a = KmerMinHash::new(scaled, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n    let mut b = KmerMinHashBTree::new(scaled, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    a.add_sequence(seq.as_bytes(), true).unwrap();\n    b.add_sequence(seq.as_bytes(), true).unwrap();\n\n    let mut buffer_a = vec![];\n    let mut buffer_b = vec![];\n\n    {\n        a.to_writer(&mut buffer_a).unwrap();\n        b.to_writer(&mut buffer_b).unwrap();\n    }\n\n    assert_eq!(buffer_a, buffer_b);\n\n    let c = KmerMinHash::from_reader(&buffer_b[..]).unwrap();\n    let d = KmerMinHashBTree::from_reader(&buffer_a[..]).unwrap();\n\n    assert!((a.similarity(&c, false, false).unwrap() - b.similarity(&d, false, false).unwrap()).abs() < EPSILON);\n    assert!((a.similarity(&c, true, false).unwrap() - b.similarity(&d, true, false).unwrap()).abs() < EPSILON);\n}\n}\n\nproptest! {\n#[test]\nfn seq_to_hashes(seq in \"ACGTGTAGCTAGACACTGACTGACTGAC\") {\n\n    let scaled = 1;\n    let mut mh = KmerMinHash::new(scaled, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n    mh.add_sequence(seq.as_bytes(), false)?; // .unwrap();\n\n    let mut hashes: Vec<u64> = Vec::new();\n\n    let ready_hashes = SeqToHashes::new(seq.as_bytes(), mh.ksize(), false, false, mh.hash_function(), mh.seed())?;\n\n    for hash_value in ready_hashes{\n        match hash_value{\n            Ok(0) => continue,\n            Ok(x) => hashes.push(x),\n            Err(_) => (),\n        }\n    }\n\n    mh.mins().sort_unstable();\n    hashes.sort_unstable();\n    assert_eq!(mh.mins(), hashes);\n\n}\n\n#[test]\nfn seq_to_hashes_2(seq in \"QRMTHINK\") {\n\n    let scaled = 1;\n    let mut mh = KmerMinHash::new(scaled, 3, HashFunctions::Murmur64Protein, 42, true, 0);\n    mh.add_protein(seq.as_bytes())?; // .unwrap();\n\n    let mut hashes: Vec<u64> = Vec::new();\n\n    let ready_hashes = SeqToHashes::new(seq.as_bytes(), mh.ksize(), false, true, mh.hash_function(), mh.seed())?;\n\n    for hash_value in ready_hashes {\n        match hash_value{\n            Ok(0) => continue,\n            Ok(x) => hashes.push(x),\n            Err(_) => (),\n        }\n    }\n\n    mh.mins().sort_unstable();\n    hashes.sort_unstable();\n    assert_eq!(mh.mins(), hashes);\n\n}\n\n}\n\n#[test]\nfn test_inflate() {\n    // Setup minhash_a with some mins but no abundances\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Hp, 42, true, 0);\n    a.add_hash(10);\n    a.add_hash(20);\n    a.add_hash(30);\n\n    // Setup minhash_b with mins, some of which match a, and with abundances\n    let mut b = KmerMinHash::new(5, 3, HashFunctions::Murmur64Hp, 42, true, 0);\n    b.add_hash_with_abundance(10, 2);\n    b.add_hash_with_abundance(20, 4);\n    b.add_hash_with_abundance(40, 6); // Non-matching hash\n\n    // Attempt to inflate minhash_a using minhash_b's abundances\n    assert!(a.inflate(&b).is_ok());\n\n    a.inflate(&b).unwrap();\n    eprintln!(\"{:?}\", a.to_vec_abunds());\n    assert_eq!(a.to_vec_abunds(), vec![(10, 2), (20, 4)]);\n}\n\n#[test]\nfn test_inflated_abundances() {\n    // Setup minhash_a with some mins but no abundances\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Hp, 42, false, 0);\n    a.add_hash(10);\n    a.add_hash(20);\n    a.add_hash(30);\n\n    // Setup minhash_b with mins, some of which match a, and with abundances\n    let mut b = KmerMinHash::new(5, 3, HashFunctions::Murmur64Hp, 42, true, 0);\n    b.add_hash_with_abundance(10, 2);\n    b.add_hash_with_abundance(20, 4);\n    b.add_hash_with_abundance(40, 9); // Non-matching hash\n\n    // Attempt to inflate minhash_a using minhash_b's abundances\n    assert!(a.inflate(&b).is_ok());\n\n    let (abunds, total_abund) = a.inflated_abundances(&b).unwrap();\n    assert_eq!(abunds, vec![2, 4]);\n    assert_eq!(total_abund, 6);\n}\n\n#[test]\nfn test_inflate_noabund() {\n    // Setup minhash a with some mins but no abundances\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Dna, 42, false, 0);\n    a.add_hash(10);\n    a.add_hash(20);\n    a.add_hash(30);\n    let b = a.clone();\n    let result = a.inflate(&b);\n    assert!(matches!(\n        result,\n        Err(sourmash::Error::NeedsAbundanceTracking)\n    ));\n}\n\n#[test]\nfn test_inflated_abunds_noabund() {\n    // Setup minhash a with some mins but no abundances\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Dna, 42, false, 0);\n    a.add_hash(10);\n    a.add_hash(20);\n    a.add_hash(30);\n    let result = a.inflated_abundances(&a);\n    assert!(matches!(\n        result,\n        Err(sourmash::Error::NeedsAbundanceTracking)\n    ));\n}\n\n#[test]\nfn test_sum_abunds() {\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Dna, 42, true, 0);\n    a.add_hash_with_abundance(10, 2);\n    a.add_hash_with_abundance(20, 4);\n    a.add_hash_with_abundance(40, 9);\n    assert_eq!(a.sum_abunds(), 15);\n}\n\n#[test]\nfn test_sum_abunds_noabund() {\n    let mut a = KmerMinHash::new(5, 3, HashFunctions::Murmur64Dna, 42, false, 0);\n    a.add_hash(10);\n    a.add_hash(20);\n    a.add_hash(30);\n    assert_eq!(a.sum_abunds(), 3);\n}\n\n#[test]\nfn test_n_unique_kmers() {\n    let mut mh = KmerMinHash::new(10, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n    mh.add_hash(10);\n    mh.add_hash(20);\n    mh.add_hash(30);\n    assert_eq!(mh.n_unique_kmers(), 30)\n}\n\n#[test]\nfn test_scaled_downsampling_kmerminhash() {\n    let mh = KmerMinHash::new(10, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    // downsampling to same scaled is OK:\n    let new_mh = mh.clone().downsample_scaled(10).unwrap();\n    assert_eq!(new_mh.scaled(), 10);\n\n    // downsampling is OK:\n    let new_mh = mh.clone().downsample_scaled(100).unwrap();\n    assert_eq!(new_mh.scaled(), 100);\n\n    // upsampling not ok\n    let e = mh.clone().downsample_scaled(1).unwrap_err();\n    assert!(matches!(e, sourmash::Error::CannotUpsampleScaled));\n}\n\n#[test]\nfn test_scaled_downsampling_kmerminhashbtree() {\n    let mh = KmerMinHashBTree::new(10, 21, HashFunctions::Murmur64Dna, 42, true, 0);\n\n    // downsampling to same scaled is OK:\n    let new_mh = mh.clone().downsample_scaled(10).unwrap();\n    assert_eq!(new_mh.scaled(), 10);\n\n    // downsampling is OK:\n    let new_mh = mh.clone().downsample_scaled(100).unwrap();\n    assert_eq!(new_mh.scaled(), 100);\n\n    // upsampling not ok\n    let e = mh.clone().downsample_scaled(1).unwrap_err();\n    assert!(matches!(e, sourmash::Error::CannotUpsampleScaled));\n}\n"
  },
  {
    "path": "src/core/tests/node.rs",
    "content": "#![cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))]\n\nuse wasm_bindgen_test::*;\n\n#[wasm_bindgen_test]\nfn pass() {\n    assert_eq!(1, 1);\n}\n"
  },
  {
    "path": "src/core/tests/service_worker.rs",
    "content": "#![cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))]\n\nuse wasm_bindgen_test::wasm_bindgen_test_configure;\n\nwasm_bindgen_test_configure!(run_in_service_worker);\n"
  },
  {
    "path": "src/core/tests/shared_worker.rs",
    "content": "#![cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))]\n\nuse wasm_bindgen_test::wasm_bindgen_test_configure;\n\nwasm_bindgen_test_configure!(run_in_shared_worker);\n"
  },
  {
    "path": "src/core/tests/storage.rs",
    "content": "use std::path::PathBuf;\n\nuse tempfile::TempDir;\n\nuse sourmash::signature::Signature;\nuse sourmash::storage::{FSStorage, InnerStorage, Storage, StorageArgs, ZipStorage};\n\n#[test]\nfn zipstorage_load_file() -> Result<(), Box<dyn std::error::Error>> {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/v6.sbt.zip\");\n\n    let zs = ZipStorage::from_file(filename.to_str().unwrap())?;\n\n    let data = zs.load(\"v6.sbt.json\")?;\n\n    let description: serde_json::Value = serde_json::from_slice(&data[..])?;\n    assert_eq!(description[\"version\"], 6);\n\n    Ok(())\n}\n\n#[test]\nfn zipstorage_load_manifest() -> Result<(), Box<dyn std::error::Error>> {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/prot/protein.sbt.zip\");\n\n    let zs = ZipStorage::from_file(filename.to_str().unwrap())?;\n\n    let _data = zs.load(\"protein.manifest.csv\").expect(\"error loading file\");\n\n    Ok(())\n}\n\n#[test]\nfn zipstorage_list_sbts() -> Result<(), Box<dyn std::error::Error>> {\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/v6.sbt.zip\");\n\n    let zs = ZipStorage::from_file(filename.to_str().unwrap())?;\n\n    let sbts = zs.list_sbts()?;\n\n    assert_eq!(sbts.len(), 1);\n\n    Ok(())\n}\n\n#[cfg(feature = \"parallel\")]\n#[test]\nfn zipstorage_parallel_access() -> Result<(), Box<dyn std::error::Error>> {\n    use rayon::prelude::*;\n    use sourmash::signature::SigsTrait;\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/v6.sbt.zip\");\n\n    let zs = ZipStorage::from_file(filename.to_str().unwrap())?;\n\n    let total_hashes: usize = [\n        \".sbt.v3/f71e78178af9e45e6f1d87a0c53c465c\",\n        \".sbt.v3/f0c834bc306651d2b9321fb21d3e8d8f\",\n        \".sbt.v3/4e94e60265e04f0763142e20b52c0da1\",\n        \".sbt.v3/6d6e87e1154e95b279e5e7db414bc37b\",\n        \".sbt.v3/0107d767a345eff67ecdaed2ee5cd7ba\",\n        \".sbt.v3/b59473c94ff2889eca5d7165936e64b3\",\n        \".sbt.v3/60f7e23c24a8d94791cc7a8680c493f9\",\n    ]\n    .par_iter()\n    .map(|path| {\n        let data = zs.load(path).unwrap();\n        let sigs = Signature::from_reader(&data[..]).expect(\"Loading error\");\n        sigs.iter()\n            .map(|v| v.sketches().iter().map(|mh| mh.size()).sum::<usize>())\n            .sum::<usize>()\n    })\n    .sum();\n\n    assert_eq!(total_hashes, 3500);\n\n    Ok(())\n}\n\n#[test]\nfn innerstorage_save_sig() -> Result<(), Box<dyn std::error::Error>> {\n    let output = TempDir::new()?;\n\n    let fst = FSStorage::new(\"\".into(), output.path().as_os_str().to_str().unwrap());\n\n    let instorage = InnerStorage::new(fst);\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/genome-s10.fa.gz.sig\");\n\n    let sig = Signature::from_path(filename)?.swap_remove(0);\n    let new_path = instorage.save_sig(\"test\", sig.clone())?;\n    dbg!(new_path);\n\n    let loaded_sig = instorage.load_sig(\"test\")?;\n\n    assert_eq!(sig.name_str(), loaded_sig.name());\n    assert_eq!(sig.md5sum(), loaded_sig.md5sum());\n\n    Ok(())\n}\n\n#[test]\nfn innerstorage_load() -> Result<(), Box<dyn std::error::Error>> {\n    let output = TempDir::new()?;\n\n    let fst = FSStorage::new(\"\".into(), output.path().as_os_str().to_str().unwrap());\n\n    let instorage = InnerStorage::new(fst);\n\n    let mut filename = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n    filename.push(\"../../tests/test-data/genome-s10.fa.gz.sig\");\n\n    let sig = Signature::from_path(filename)?.swap_remove(0);\n    let new_path = instorage.save_sig(\"test\", sig.clone())?;\n    dbg!(new_path);\n\n    let raw_data = instorage.load(\"test\")?;\n    let loaded_sig = Signature::from_reader(raw_data.as_slice())?.swap_remove(0);\n\n    assert_eq!(sig.name(), loaded_sig.name());\n    assert_eq!(sig.md5sum(), loaded_sig.md5sum());\n\n    Ok(())\n}\n\n#[test]\nfn innerstorage_args() -> Result<(), Box<dyn std::error::Error>> {\n    let output = TempDir::new()?;\n    let path = output.path().as_os_str().to_str().unwrap();\n\n    let fst = FSStorage::new(\"\".into(), path);\n\n    let instorage = InnerStorage::new(fst);\n\n    let args = instorage.args();\n\n    assert!(matches!(args, StorageArgs::FSStorage { .. }));\n    let StorageArgs::FSStorage { path: p } = args;\n    assert_eq!(p, path);\n\n    Ok(())\n}\n\n#[test]\nfn innerstorage_from_args() -> Result<(), Box<dyn std::error::Error>> {\n    let output = TempDir::new()?;\n    let path = output.path().as_os_str().to_str().unwrap();\n\n    let fst = FSStorage::new(\"\".into(), path);\n    let args = fst.args();\n\n    let instorage = InnerStorage::new(FSStorage::from(&args));\n    let inargs = instorage.args();\n\n    assert!(matches!(inargs, StorageArgs::FSStorage { .. }));\n    let StorageArgs::FSStorage { path: p1 } = inargs;\n    assert_eq!(p1, path);\n\n    assert!(matches!(args, StorageArgs::FSStorage { .. }));\n    let StorageArgs::FSStorage { path: p2 } = args;\n    assert_eq!(p2, path);\n\n    Ok(())\n}\n"
  },
  {
    "path": "src/core/tests/test.rs",
    "content": "#[test]\nfn test_murmur() {\n    assert_eq!(sourmash::_hash_murmur(b\"ACG\", 42), 1731421407650554201)\n}\n"
  },
  {
    "path": "src/core/tests/web.rs",
    "content": "#![cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))]\n\nuse wasm_bindgen_test::wasm_bindgen_test_configure;\n\nwasm_bindgen_test_configure!(run_in_browser);\n"
  },
  {
    "path": "src/sourmash/__init__.py",
    "content": "\"\"\"A library for creating k-mer sketches from biological sequences, comparing\nthem to each other, and working with the results.\n\nPublic API:\n\n    load_file_as_signatures(...) - load `[SourmashSignature, ]` from filename\n    load_file_as_index(...) - load collections of `SourmashSignature`s\n    save_signatures(...) - save `[SourmashSignature, ]`\n\n    class SourmashSignature - one or more hash sketches\n    class MinHash - hash sketch class\n\nPlease see https://sourmash.readthedocs.io/en/latest/api.html for API docs.\n\nThe sourmash code is available at github.com/sourmash-bio/sourmash/ under the\nBSD 3-Clause license.\n\"\"\"\n\nfrom deprecation import deprecated\nfrom importlib.metadata import version\n\n__all__ = [\n    \"MinHash\",\n    \"SourmashSignature\",\n    \"load_one_signature\",\n    \"SourmashSignature\",\n    \"load_file_as_index\",\n    \"load_file_as_signatures\",\n    \"save_signatures\",\n    \"create_sbt_index\",\n    \"load_signatures\",  # deprecated - remove in 5.0\n    \"load_sbt_index\",  # deprecated - remove in 5.0\n    \"search_sbt_index\",  # deprecated - remove in 5.0\n]\n\nfrom ._lowlevel import ffi, lib\n\nffi.init_once(lib.sourmash_init, \"init\")\n\nVERSION = version(__name__)\n\nfrom .minhash import MinHash, get_minhash_default_seed, get_minhash_max_hash\n\nDEFAULT_SEED = get_minhash_default_seed()\nMAX_HASH = get_minhash_max_hash()\n\nfrom .signature import (\n    load_signatures_from_json,\n    load_one_signature_from_json,\n    SourmashSignature,\n    save_signatures_to_json,\n)\n\n\n@deprecated(\n    deprecated_in=\"3.5.1\",\n    removed_in=\"5.0\",\n    current_version=VERSION,\n    details=\"Use load_file_as_signatures instead.\",\n)\ndef load_signatures(*args, **kwargs):\n    \"\"\"Load a JSON string with signatures into classes.\n\n    Returns list of SourmashSignature objects.\n\n    Note, the order is not necessarily the same as what is in the source file.\n\n    This function has been deprecated as of 3.5.1; please use\n    'load_file_as_signatures' instead. Note that in 4.0, the 'quiet' argument\n    has been removed and the function no longer outputs to stderr.\n    Moreover, do_raise is now True by default.\n    \"\"\"\n    return load_signatures_from_json(*args, **kwargs)\n\n\n@deprecated(\n    deprecated_in=\"4.8.9\",\n    removed_in=\"5.0\",\n    current_version=VERSION,\n    details=\"Use load_file_as_signatures instead.\",\n)\ndef load_one_signature(*args, **kwargs):\n    \"\"\"Load a JSON string with signatures into classes.\n\n    Returns list of SourmashSignature objects.\n\n    Note, the order is not necessarily the same as what is in the source file.\n    \"\"\"\n    return load_one_signature_from_json(*args, **kwargs)\n\n\n@deprecated(\n    deprecated_in=\"4.8.9\",\n    removed_in=\"5.0\",\n    current_version=VERSION,\n    details=\"use sourmash_args.SaveSignaturesToLocation instead.\",\n)\ndef save_signatures(*args, **kwargs):\n    return save_signatures_to_json(*args, **kwargs)\n\n\nfrom .sbtmh import load_sbt_index as load_sbt_index_private\nfrom .sbtmh import search_sbt_index as search_sbt_index_private\n\n\n@deprecated(\n    deprecated_in=\"3.5.1\",\n    removed_in=\"5.0\",\n    current_version=VERSION,\n    details=\"Use load_file_as_index instead.\",\n)\ndef load_sbt_index(*args, **kwargs):\n    \"\"\"Load and return an SBT index.\n\n    This function has been deprecated as of 3.5.1; please use\n    'load_file_as_index' instead.\n    \"\"\"\n    return load_sbt_index_private(*args, **kwargs)\n\n\n@deprecated(\n    deprecated_in=\"3.5.1\",\n    removed_in=\"5.0\",\n    current_version=VERSION,\n    details=\"Use the new Index API instead.\",\n)\ndef search_sbt_index(*args, **kwargs):\n    \"\"\"\\\n    Search an SBT index `tree` with signature `query` for matches above\n    `threshold`.\n\n    Usage:\n\n        for match_sig, similarity in search_sbt_index(tree, query, threshold):\n           ...\n\n    This function has been deprecated as of 3.5.1; please use\n    'idx = load_file_as_index(...); idx.search(query, threshold=...)' instead.\n    \"\"\"\n    return search_sbt_index_private(*args, **kwargs)\n\n\nfrom .sbtmh import create_sbt_index\nfrom . import lca\nfrom . import tax\nfrom . import sbt\nfrom . import sbtmh\nfrom . import sbt_storage\nfrom . import signature\nfrom . import sig\nfrom . import cli\nfrom . import commands\nfrom .sourmash_args import load_file_as_index\nfrom .sourmash_args import load_file_as_signatures\n"
  },
  {
    "path": "src/sourmash/__main__.py",
    "content": "\"\"\"\nThe main entry point for sourmash, defined in pyproject.toml.\n\nCan also be executed as 'python -m sourmash'.\n\"\"\"\n\n\ndef main(arglist=None):\n    import sourmash\n\n    args = sourmash.cli.parse_args(arglist)\n    if hasattr(args, \"subcmd\"):\n        mod = getattr(sourmash.cli, args.cmd)\n        submod = getattr(mod, args.subcmd)\n        mainmethod = getattr(submod, \"main\")\n    else:\n        mod = getattr(sourmash.cli, args.cmd)\n        mainmethod = getattr(mod, \"main\")\n\n    retval = mainmethod(args)\n    raise SystemExit(retval)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "src/sourmash/cli/.gitignore",
    "content": "__pycache__/\n"
  },
  {
    "path": "src/sourmash/cli/__init__.py",
    "content": "\"\"\"Define the top-level command line interface for sourmash\n\nThis module handles user input when sourmash is invoked from the command line.\nA top-level parser is defined for the `sourmash` command, and subparsers are\ndefined for each subcommand. Some sourmash operations are grouped together\nusing the `sourmash <subcmd> <subsubcmd>` pattern, and these are organized in\ntheir own CLI submodules, each with a dedicated directory.\n\"\"\"\n\nfrom argparse import ArgumentParser, RawDescriptionHelpFormatter, SUPPRESS\nimport os\nimport sys\n\nimport sourmash\n\nfrom . import utils\n\n# Commands\nfrom . import categorize\nfrom . import compare\nfrom . import compute\nfrom . import gather\nfrom . import import_csv\nfrom . import info\nfrom . import index\nfrom . import migrate\nfrom . import multigather\nfrom . import plot\nfrom . import prefetch\nfrom . import sbt_combine\nfrom . import search\nfrom . import watch\n\n# Subcommand groups\nfrom . import lca\nfrom . import sig\nfrom . import sig as signature\nfrom . import sketch\nfrom . import storage\nfrom . import tax\nfrom . import scripts\n\n\nclass SourmashParser(ArgumentParser):\n    _citation_printed = False\n\n    def __init__(self, citation=True, **kwargs):\n        super().__init__(**kwargs)\n        self.citation = citation\n\n    @classmethod\n    def print_citation(cls):\n        if cls._citation_printed:\n            return\n        from sourmash.logging import notify\n\n        notify(f\"\\n== This is sourmash version {sourmash.VERSION}. ==\")\n        notify(\"== Please cite Irber et. al (2024), doi:10.21105/joss.06830. ==\\n\")\n        cls._citation_printed = True\n\n    def _subparser_from_name(self, name):\n        \"\"\"Given a name, get the subparser instance registered with this parser.\"\"\"\n        container = self._actions\n        if name is None:\n            return None\n        for action in container:\n            if action.choices is None:\n                continue\n            elif name in action.choices:\n                return action.choices[name]\n\n    def print_help(self):\n        self.print_citation()\n        super().print_help()\n\n    def parse_args(self, args=None, namespace=None):\n        if (args is None and len(sys.argv) == 1) or (\n            args is not None and len(args) == 0\n        ):\n            self.print_help()\n            raise SystemExit(1)\n        args = super().parse_args(args=args, namespace=namespace)\n        if (\"quiet\" not in args or not args.quiet) and self.citation:\n            self.print_citation()\n\n        if \"subcmd\" in args and args.subcmd is None:\n            self._subparser_from_name(args.cmd).print_help()\n            raise SystemExit(1)\n\n        # BEGIN: dirty hacks to simultaneously support new and previous interface\n        if hasattr(args, \"subcmd\") and args.subcmd == \"import\":\n            args.subcmd = \"ingest\"\n        # END: dirty hacks to simultaneously support new and previous interface\n        return args\n\n\ndef get_parser():\n    module_descs = {\n        \"tax\": 'Integrate taxonomy information based on \"gather\" results',\n        \"lca\": \"Taxonomic operations\",\n        \"sketch\": \"Create signatures\",\n        \"sig\": \"Manipulate signature files\",\n        \"storage\": \"Operations on storage\",\n        \"scripts\": \"Plug-ins\",\n    }\n    alias = {\n        \"sig\": \"signature\",\n        \"ext\": \"scripts\",\n    }\n    expert = set(\n        [\"categorize\", \"import_csv\", \"migrate\", \"multigather\", \"sbt_combine\", \"watch\"]\n    )\n\n    clidir = os.path.dirname(__file__)\n    basic_ops = utils.command_list(clidir)\n\n    # provide a list of the basic operations - not expert, not submodules.\n    user_ops = [op for op in basic_ops if op not in expert and op not in module_descs]\n    usage = \"    Basic operations\\n\"\n    for op in user_ops:\n        docstring = getattr(sys.modules[__name__], op).__doc__\n        helpstring = f\"sourmash {op:s} --help\"\n        usage += f\"        {helpstring:25s} {docstring:s}\\n\"\n    # next, all the subcommand ones - dive into subdirectories.\n    cmd_group_dirs = next(os.walk(clidir))[1]\n    cmd_group_dirs = filter(utils.opfilter, cmd_group_dirs)\n    cmd_group_dirs = sorted(cmd_group_dirs)\n\n    cmd_group_usage = [cmd for cmd in cmd_group_dirs if cmd not in alias.values()]\n    for dirpath in cmd_group_usage:\n        usage += \"\\n    \" + module_descs[dirpath] + \"\\n\"\n        usage += f\"        sourmash {dirpath:s} --help\\n\"\n        if dirpath in alias:\n            usage += f\"        sourmash {alias[dirpath]:s} --help\\n\"\n\n    desc = (\n        \"Create, compare, and manipulate k-mer sketches of biological sequences.\\n\\nUsage instructions:\\n\"\n        + usage\n    )\n    parser = SourmashParser(\n        prog=\"sourmash\",\n        description=desc,\n        formatter_class=RawDescriptionHelpFormatter,\n        usage=SUPPRESS,\n    )\n    parser._optionals.title = \"Options\"\n    parser.add_argument(\n        \"-v\", \"--version\", action=\"version\", version=\"sourmash \" + sourmash.VERSION\n    )\n    parser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"don't print citation information\"\n    )\n    sub = parser.add_subparsers(\n        title=\"Instructions\",\n        dest=\"cmd\",\n        metavar=\"cmd\",\n        help=SUPPRESS,\n    )\n    for op in basic_ops + cmd_group_dirs:\n        getattr(sys.modules[__name__], op).subparser(sub)\n    parser._action_groups.reverse()\n    return parser\n\n\ndef parse_args(arglist=None):\n    \"\"\"\n    Return an argparse 'args' object from parsing arglist.\n\n    By default pulls arguments from sys.argv.\n\n    Example usage:\n\n    ```\n    args = parse_args(['sig', 'filter', '-m', '10'])\n\n    sourmash.sig.filter.__main__.filter(args)\n    ```\n    \"\"\"\n    return get_parser().parse_args(arglist)\n"
  },
  {
    "path": "src/sourmash/cli/categorize.py",
    "content": "\"'sourmash categorize' - query an SBT for bes match, with many signatures.\"\n\nfrom sourmash.cli.utils import add_ksize_arg, add_moltype_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"categorize\")\n    subparser.add_argument(\n        \"database\", help=\"location of signature collection/database to load\"\n    )\n    subparser.add_argument(\n        \"queries\", nargs=\"+\", help=\"locations of signatures to categorize\"\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    add_ksize_arg(subparser)\n    subparser.add_argument(\n        \"--threshold\",\n        default=0.08,\n        type=float,\n        help=\"minimum threshold for reporting matches; default=0.08\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"do NOT use k-mer abundances if present\",\n    )\n    add_moltype_args(subparser)\n\n    # TODO: help messages in these\n    subparser.add_argument(\"--csv\", help=\"output summary CSV to this file\")\n    subparser.add_argument(\"--load-csv\", default=None)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.categorize(args)\n"
  },
  {
    "path": "src/sourmash/cli/compare.py",
    "content": "\"\"\"create a similarity matrix comparing many samples\"\"\"\n\nusage = \"\"\"\n\nThe `compare` subcommand compares one or more signatures (created with\n`sketch`) using estimated Jaccard index [1] or (if signatures are\ncreated with `-p abund`) the angular similarity [2]).\n\nThe default output is a text display of a similarity matrix where each\nentry `[i, j]` contains the estimated Jaccard index between input\nsignature `i` and input signature `j`.  The output matrix can be saved\nto a file with `--output <outfile.mat>` and used with the `sourmash\nplot` subcommand (or loaded with `numpy.load(...)`.  Using `--csv\n<outfile.csv>` will output a CSV file that can be loaded into other\nlanguages than Python, such as R.\n\nCommand line usage:\n```\nsourmash compare file1.sig [ file2.sig ... ]\n```\n\n**Note:** compare by default produces a symmetric similarity matrix that can be used as an input to clustering. With `--containment`, however, this matrix is no longer symmetric and cannot formally be used for clustering.\n\n[1] https://en.wikipedia.org/wiki/Jaccard_index\n[2] https://en.wikipedia.org/wiki/Cosine_similarity#Angular_distance_and_similarity\n\n---\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_ksize_arg,\n    add_moltype_args,\n    add_picklist_args,\n    add_pattern_args,\n    add_scaled_arg,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"compare\", description=__doc__, usage=usage)\n    subparser.add_argument(\n        \"signatures\", nargs=\"*\", help=\"list of signatures to compare\", default=[]\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"F\",\n        help=\"save comparison matrix in numpy binary format to this file\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"do NOT use k-mer abundances even if present\",\n    )\n    subparser.add_argument(\n        \"--containment\",\n        action=\"store_true\",\n        help=\"calculate containment instead of similarity\",\n    )\n    subparser.add_argument(\n        \"--max-containment\",\n        action=\"store_true\",\n        help=\"calculate max containment instead of similarity\",\n    )\n    subparser.add_argument(\n        \"--avg-containment\",\n        \"--average-containment\",\n        action=\"store_true\",\n        help=\"calculate average containment instead of similarity\",\n    )\n    subparser.add_argument(\n        \"--estimate-ani\",\n        \"--ANI\",\n        \"--ani\",\n        action=\"store_true\",\n        help=\"return ANI estimated from jaccard, containment, average containment, or max containment; see https://doi.org/10.1101/2022.01.11.475870\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in file loading\",\n    )\n    subparser.add_argument(\n        \"--csv\",\n        metavar=\"F\",\n        help=\"write matrix to specified file in CSV format (with column headers)\",\n    )\n    subparser.add_argument(\n        \"--labels-to\",\n        \"--labels-save\",\n        help=\"a CSV file containing label information\",\n    )\n    subparser.add_argument(\n        \"-p\",\n        \"--processes\",\n        metavar=\"N\",\n        type=int,\n        default=None,\n        help=\"Number of processes to use to calculate similarity\",\n    )\n    subparser.add_argument(\n        \"--distance-matrix\",\n        action=\"store_true\",\n        help=\"output a distance matrix, instead of a similarity matrix\",\n    )\n    subparser.add_argument(\n        \"--similarity-matrix\",\n        action=\"store_false\",\n        dest=\"distance_matrix\",\n        help=\"output a similarity matrix; this is the default\",\n    )\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_pattern_args(subparser)\n    add_scaled_arg(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.compare(args)\n"
  },
  {
    "path": "src/sourmash/cli/compute.py",
    "content": "\"\"\"compute sequence signatures for inputs\"\"\"\n\nusage = \"\"\"\n\n** WARNING: the sourmash compute command is DEPRECATED as of 4.0 and\n** will be removed in 5.0. Please see the 'sourmash sketch' command instead.\n\n   sourmash compute -k 21,31,51 *.fa *.fq\n\nCreate MinHash sketches at k-mer sizes of 21, 31 and 51, for\nall FASTA and FASTQ files in the current directory, and save them in\nsignature files ending in '.sig'. You can rapidly compare these files\nwith `compare` and query them with `search`, among other operations;\nsee the full documentation at http://sourmash.rtfd.io/.\n\nThe key options for compute are:\n\n * `-k/--ksize <int>[, <int>]: k-mer size(s) to use, e.g. -k 21,31,51\n * `-n/--num <int>` or `--scaled <int>`: set size or resolution of sketches\n * `--track-abundance`: track abundances of hashes (default False)\n * `--dna or --protein`: nucleotide and/or protein signatures (default `--dna`)\n * `--merge <name>`: compute a merged signature across all inputs.\n * `--singleton`: compute individual signatures for each sequence.\n * `--name-from-first`: set name of signature from first sequence in file.\n * `-o/--output`: save all computed signatures to this file.\n\nPlease see -h for all of the options as well as more detailed help.\n\n---\n\"\"\"\n\nfrom sourmash.minhash import get_minhash_default_seed\nfrom sourmash.cli.utils import add_construct_moltype_args, add_num_arg\n\n\ndef ksize_parser(ksizes):\n    # get list of k-mer sizes for which to compute sketches\n    if \",\" in ksizes:\n        ksizes = ksizes.split(\",\")\n        ksizes = list(map(int, ksizes))\n    else:\n        ksizes = [int(ksizes)]\n\n    return ksizes\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"compute\", description=__doc__, usage=usage)\n\n    sketch_args = subparser.add_argument_group(\"Sketching options\")\n    sketch_args.add_argument(\n        \"-k\",\n        \"--ksizes\",\n        default=\"21,31,51\",\n        type=ksize_parser,\n        help=\"comma-separated list of k-mer sizes; default=%(default)s\",\n    )\n    sketch_args.add_argument(\n        \"--track-abundance\",\n        action=\"store_true\",\n        help=\"track k-mer abundances in the generated signature\",\n    )\n    sketch_args.add_argument(\n        \"--scaled\",\n        type=float,\n        default=0,\n        help=\"choose number of hashes as 1 in FRACTION of input k-mers\",\n    )\n    add_construct_moltype_args(sketch_args)\n    sketch_args.add_argument(\n        \"--input-is-protein\",\n        action=\"store_true\",\n        help=\"Consume protein sequences - no translation needed.\",\n    )\n    sketch_args.add_argument(\n        \"--seed\",\n        type=int,\n        default=get_minhash_default_seed(),\n        help=\"seed used by MurmurHash; default=%(default)i\",\n    )\n\n    file_args = subparser.add_argument_group(\"File handling options\")\n    file_args.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"recompute signatures even if the file exists\",\n    )\n    file_args.add_argument(\n        \"-o\", \"--output\", help=\"output computed signatures to this file\"\n    )\n    file_args.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output computed signatures to this directory\",\n    )\n    file_args.add_argument(\n        \"--singleton\",\n        action=\"store_true\",\n        help=\"compute a signature for each sequence record individually\",\n    )\n    file_args.add_argument(\n        \"--merge\",\n        \"--name\",\n        type=str,\n        default=\"\",\n        metavar=\"FILE\",\n        help=\"merge all input files into one signature file with the specified name\",\n    )\n    file_args.add_argument(\n        \"--name-from-first\",\n        action=\"store_true\",\n        help=\"name the signature generated from each file after the first \"\n        \"record in the file\",\n    )\n    file_args.add_argument(\n        \"--randomize\",\n        action=\"store_true\",\n        help=\"shuffle the list of input filenames randomly\",\n    )\n\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"--check-sequence\",\n        action=\"store_true\",\n        help=\"complain if input sequence is invalid\",\n    )\n    subparser.add_argument(\n        \"--license\",\n        default=\"CC0\",\n        type=str,\n        help=\"signature license. Currently only CC0 is supported.\",\n    )\n\n    subparser.add_argument(\"filenames\", nargs=\"+\", help=\"file(s) of sequences\")\n    subparser._positionals.title = \"Required arguments\"\n    subparser._optionals.title = \"Miscellaneous options\"\n    add_num_arg(sketch_args, 500)\n\n\ndef main(args):\n    from sourmash.command_compute import compute\n    from sourmash.logging import notify\n\n    notify(\n        \"\"\"\\\n** WARNING: the sourmash compute command is DEPRECATED as of 4.0 and\n** will be removed in 5.0. Please see the 'sourmash sketch' command instead.\n\"\"\"\n    )\n    return compute(args)\n"
  },
  {
    "path": "src/sourmash/cli/gather.py",
    "content": "\"\"\"search a metagenome signature against dbs\"\"\"\n\nusage = \"\"\"\n\nThe `gather` subcommand selects the best reference genomes to use for\na metagenome analysis, by finding the smallest set of non-overlapping\nmatches to the query in a database.  This is specifically meant for\nmetagenome and genome bin analysis.  (See \"Classifying Signatures\" [1]\nin the command line documentation for more information on the\ndifferent approaches that can be used here.)\n\nIf the input signature was created with `-p abund`, output\nwill be abundance weighted (unless `--ignore-abundances` is\nspecified).  `-o/--output` will create a CSV file containing the\nmatches.\n\n`gather`, like `search`, will load all of provided signatures into\nmemory.  You can use `sourmash index` to create a Sequence Bloom Tree\n(SBT) that can be quickly searched on disk; this is the same format in\nwhich we provide GenBank and other databases.\n\nCommand line usage:\n```\nsourmash gather query.sig [ list of signatures or SBTs ]\n```\n\nExample output for an unweighted/noabund query:\n```\noverlap     p_query p_match\n---------   ------- --------\n1.4 Mbp      11.0%%  58.0%%     JANA01000001.1 Fusobacterium sp. OBRC...\n1.0 Mbp       7.7%%  25.9%%     CP001957.1 Haloferax volcanii DS2 pla...\n0.9 Mbp       7.4%%  11.8%%     BA000019.2 Nostoc sp. PCC 7120 DNA, c...\n0.7 Mbp       5.9%%  23.0%%     FOVK01000036.1 Proteiniclasticum rumi...\n0.7 Mbp       5.3%%  17.6%%     AE017285.1 Desulfovibrio vulgaris sub...\n```\n\nExample output for a weighted query:\n```\noverlap     p_query p_match avg_abund\n---------   ------- ------- ---------\n9.3 Mbp        0.8%%   97.5%%       6.7    NC_007951.1 Burkholderia xenovorans ...\n7.3 Mbp        2.3%%   99.9%%      23.9    NC_003272.1 Nostoc sp. PCC 7120 DNA,...\n7.0 Mbp        8.9%%  100.0%%      94.5    BX119912.1 Rhodopirellula baltica SH...\n6.6 Mbp        1.4%%  100.0%%      16.3    NC_009972.1 Herpetosiphon aurantiacu...\n...\n```\n\nThe command line option `--threshold-bp` sets the threshold below\nwhich matches are no longer reported; by default, this is set to\n50kb. see the Appendix in Classifying Signatures [1] for details.\n\nNote:\n\nUse `sourmash gather` to classify a metagenome against a collection of\ngenomes with no (or incomplete) taxonomic information.  Use `sourmash\nlca summarize` to classify a metagenome using a collection of genomes\nwith taxonomic information.\n\n[1] https://sourmash.readthedocs.io/en/latest/classifying-signatures.html\n\n---\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_ksize_arg,\n    add_moltype_args,\n    add_picklist_args,\n    add_scaled_arg,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"gather\", description=__doc__, usage=usage)\n    subparser.add_argument(\"query\", help=\"query signature\")\n    subparser.add_argument(\n        \"databases\",\n        nargs=\"+\",\n        help=\"signatures/SBTs to search\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\"-d\", \"--debug\", action=\"store_true\")\n    subparser.add_argument(\n        \"-n\",\n        \"--num-results\",\n        default=None,\n        type=int,\n        metavar=\"N\",\n        help=\"number of results to report (default: terminate at --threshold-bp)\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output CSV containing matches to this file\",\n    )\n    subparser.add_argument(\n        \"--save-matches\",\n        metavar=\"FILE\",\n        help=\"save gather matched signatures from the database to the specified file\",\n    )\n    subparser.add_argument(\n        \"--save-prefetch\",\n        metavar=\"FILE\",\n        help=\"save all prefetch-matched signatures from the databases to the \"\n        \"specified file or directory\",\n    )\n    subparser.add_argument(\n        \"--save-prefetch-csv\",\n        metavar=\"FILE\",\n        help=\"save a csv with information from all prefetch-matched signatures \"\n        \"to the specified file\",\n    )\n    subparser.add_argument(\n        \"--threshold-bp\",\n        metavar=\"REAL\",\n        type=float,\n        default=5e4,\n        help=\"reporting threshold (in bp) for estimated overlap with remaining query (default=50kb)\",\n    )\n    subparser.add_argument(\n        \"--output-unassigned\",\n        metavar=\"FILE\",\n        help=\"output unassigned portions of the query as a signature to the \"\n        \"specified file\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"do NOT use k-mer abundances if present\",\n    )\n    subparser.add_argument(\n        \"--md5\", default=None, help=\"select the signature with this md5 as query\"\n    )\n    subparser.add_argument(\n        \"--cache-size\",\n        default=0,\n        type=int,\n        metavar=\"N\",\n        help=\"number of internal SBT nodes to cache in memory (default: 0, cache all nodes)\",\n    )\n\n    # advanced parameters\n    subparser.add_argument(\n        \"--linear\",\n        dest=\"linear\",\n        action=\"store_true\",\n        help=\"force a low-memory but maybe slower database search\",\n    )\n    subparser.add_argument(\n        \"--no-linear\",\n        dest=\"linear\",\n        action=\"store_false\",\n    )\n    subparser.add_argument(\n        \"--no-prefetch\",\n        dest=\"prefetch\",\n        action=\"store_false\",\n        help=\"do not use prefetch before gather; see documentation\",\n    )\n    subparser.add_argument(\n        \"--prefetch\",\n        dest=\"prefetch\",\n        action=\"store_true\",\n        help=\"use prefetch before gather; see documentation\",\n    )\n    subparser.add_argument(\n        \"--estimate-ani-ci\",\n        action=\"store_true\",\n        help=\"also output confidence intervals for ANI estimates\",\n    )\n    subparser.add_argument(\n        \"--fail-on-empty-database\",\n        action=\"store_true\",\n        help=\"stop at databases that contain no compatible signatures\",\n    )\n    subparser.add_argument(\n        \"--no-fail-on-empty-database\",\n        action=\"store_false\",\n        dest=\"fail_on_empty_database\",\n        help=\"continue past databases that contain no compatible signatures\",\n    )\n    subparser.set_defaults(fail_on_empty_database=True)\n    subparser.add_argument(\n        \"--create-empty-results\",\n        action=\"store_true\",\n        help=\"create an empty results file even if no matches.\",\n    )\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_pattern_args(subparser)\n    add_scaled_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.gather(args)\n"
  },
  {
    "path": "src/sourmash/cli/import_csv.py",
    "content": "\"\"\"'sourmash import_csv' description goes here\"\"\"\n\nfrom sourmash.logging import notify\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"import_csv\")\n    subparser.add_argument(\"mash_csvfile\", help=\"CSV file with mash sketches\")\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        help=\"save signature generated from data to this file (default stdout)\",\n    )\n\n\ndef main(args):\n    import sourmash\n\n    notify(\"** WARNING: 'import_csv' is deprecated as of sourmash 4.0, and will\")\n    notify(\"**    be removed in sourmash 5.0; use 'sourmash sig import --csv' instead.\")\n    notify(\"\")\n    return sourmash.commands.import_csv(args)\n"
  },
  {
    "path": "src/sourmash/cli/index.py",
    "content": "\"\"\"index signatures for rapid search\"\"\"\n\nusage = \"\"\"\n\n   sourmash index -k 31 dbname *.sig -F dbtype\n\nCreate an on-disk database of signatures that can be searched quickly\n& in low memory. All signatures must be scaled, and must be the same\nk-mer size and molecule type; the standard signature selectors\n(-k/--ksize, --scaled, --dna/--protein) choose which signatures to be\nadded.\n\nThe key options for index are:\n\n * `-k/--ksize <int>`: k-mer size to select\n * `--dna` or --protein`: nucleotide or protein signatures (default `--dna`)\n * `-F <dbtype>`: 'SBT' (default), 'rocksdb', or 'zip'. 'rocksdb' is recommended and will be come the default in sourmash v5.\n\n---\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_ksize_arg,\n    add_moltype_args,\n    add_picklist_args,\n    add_scaled_arg,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"index\", description=__doc__, usage=usage)\n    subparser.add_argument(\n        \"-F\",\n        \"--index-type\",\n        help=\"type of index to build (default: SBT)\",\n        choices=[\"SBT\", \"rocksdb\", \"zip\"],\n        default=\"SBT\",\n    )\n\n    subparser.add_argument(\n        \"name\",\n        help=\"name to save index under; defaults to {name}.sbt.zip\",\n    )\n    subparser.add_argument(\"signatures\", nargs=\"*\", help=\"signatures to load into SBT\")\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\",\n        \"--n_children\",\n        metavar=\"D\",\n        type=int,\n        default=2,\n        help=\"number of children for internal nodes; default=2\",\n    )\n    subparser.add_argument(\n        \"--append\",\n        action=\"store_true\",\n        default=False,\n        help=\"add signatures to an existing SBT\",\n    )\n    subparser.add_argument(\n        \"-x\",\n        \"--bf-size\",\n        metavar=\"S\",\n        type=float,\n        default=1e5,\n        help=\"Bloom filter size used for internal nodes\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help='try loading *all* files in provided subdirectories, not just .sig files\"',\n    )\n    subparser.add_argument(\n        \"-s\",\n        \"--sparseness\",\n        metavar=\"FLOAT\",\n        type=float,\n        default=0.0,\n        help=\"What percentage of internal nodes will not be saved; ranges \"\n        \"from 0.0 (save all nodes) to 1.0 (no nodes saved)\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_scaled_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.index(args)\n"
  },
  {
    "path": "src/sourmash/cli/info.py",
    "content": "\"\"\"display sourmash version and other information\"\"\"\n\nimport os\nimport screed\nimport sourmash\nfrom sourmash.logging import notify\nfrom sourmash.plugins import list_all_plugins\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"info\")\n    subparser.add_argument(\n        \"-v\",\n        \"--verbose\",\n        action=\"store_true\",\n        help=\"report versions of khmer and screed\",\n    )\n\n\ndef info(verbose=False):\n    \"Report sourmash version + version of installed dependencies.\"\n    notify(f\"sourmash version {sourmash.VERSION}\")\n    notify(f\"- loaded from path: {os.path.dirname(__file__)}\")\n    notify(\"\")\n\n    if verbose:\n        notify(\"khmer version: None (internal Nodegraph)\")\n        notify(\"\")\n\n        notify(f\"screed version {screed.__version__}\")\n        notify(f\"- loaded from path: {os.path.dirname(screed.__file__)}\")\n\n        list_all_plugins()\n\n\ndef main(args):\n    info(verbose=args.verbose)\n"
  },
  {
    "path": "src/sourmash/cli/lca/__init__.py",
    "content": "\"\"\"Define the command line interface for sourmash lca\n\nThe top level CLI is defined in ../__init__.py. This module defines the CLI for\n`sourmash lca` operations.\n\"\"\"\n\nfrom . import classify\nfrom . import compare_csv\nfrom . import index\nfrom . import rankinfo\nfrom . import summarize\nfrom ..utils import command_list\nfrom argparse import SUPPRESS, RawDescriptionHelpFormatter\nimport os\nimport sys\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"lca\", formatter_class=RawDescriptionHelpFormatter, usage=SUPPRESS\n    )\n    desc = \"Operations\\n\"\n    clidir = os.path.dirname(__file__)\n    ops = command_list(clidir)\n    for subcmd in ops:\n        docstring = getattr(sys.modules[__name__], subcmd).__doc__\n        helpstring = f\"sourmash lca {subcmd:s} --help\"\n        desc += f\"        {helpstring:33s} {docstring:s}\\n\"\n    s = subparser.add_subparsers(\n        title=\"Taxonomic utilities\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=SUPPRESS,\n        description=desc,\n    )\n    for subcmd in ops:\n        getattr(sys.modules[__name__], subcmd).subparser(s)\n    subparser._action_groups.reverse()\n    subparser._optionals.title = \"Options\"\n"
  },
  {
    "path": "src/sourmash/cli/lca/classify.py",
    "content": "\"\"\"classify genomes\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"classify\")\n    subparser.add_argument(\n        \"--db\", nargs=\"+\", action=\"append\", help=\"databases to use to classify\"\n    )\n    subparser.add_argument(\n        \"--query\",\n        nargs=\"*\",\n        default=[],\n        action=\"append\",\n        help=\"query signatures to classify\",\n    )\n    subparser.add_argument(\n        \"--query-from-file\", help=\"file containing list of signature files to query\"\n    )\n    subparser.add_argument(\n        \"--threshold\",\n        metavar=\"T\",\n        type=int,\n        default=5,\n        help=\"minimum number of hashes needed for a taxonomic classification (default: 5)\",\n    )\n    subparser.add_argument(\n        \"--majority\",\n        action=\"store_true\",\n        help=\"use majority vote classification instead of lca\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debugging output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output CSV to the specified file; by default output to stdout\",\n    )\n    subparser.add_argument(\"--scaled\", type=float)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.lca.command_classify.classify(args)\n"
  },
  {
    "path": "src/sourmash/cli/lca/compare_csv.py",
    "content": "\"\"\"compare spreadsheets\"\"\"\n\n\ndef subparser(subparsers):\n    # Dirty hack to simultaneously support new and previous interface\n    # If desired, this function can be removed with a major version bump.\n    for cmd in (\"compare\", \"compare_csv\"):\n        subparser = subparsers.add_parser(cmd)\n        subparser.add_argument(\"csv1\", help=\"taxonomy spreadsheet output by classify\")\n        subparser.add_argument(\"csv2\", help=\"custom taxonomy spreadsheet\")\n        subparser.add_argument(\n            \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n        )\n        subparser.add_argument(\n            \"-d\", \"--debug\", action=\"store_true\", help=\"output debugging output\"\n        )\n        subparser.add_argument(\n            \"-C\",\n            \"--start-column\",\n            metavar=\"C\",\n            default=2,\n            type=int,\n            help=\"column at which taxonomic assignments start; default=2\",\n        )\n        subparser.add_argument(\n            \"--tabs\",\n            action=\"store_true\",\n            help=\"input spreadsheet is tab-delimited; default is commas\",\n        )\n        subparser.add_argument(\n            \"--no-headers\",\n            action=\"store_true\",\n            help=\"no headers present in taxonomy spreadsheet\",\n        )\n        subparser.add_argument(\"-f\", \"--force\", action=\"store_true\")\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.lca.command_compare_csv.compare_csv(args)\n"
  },
  {
    "path": "src/sourmash/cli/lca/index.py",
    "content": "\"\"\"create LCA database\"\"\"\n\nfrom sourmash.cli.utils import add_ksize_arg, add_moltype_args, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"index\")\n    subparser.add_argument(\"csv\", help=\"taxonomy spreadsheet\")\n    subparser.add_argument(\"lca_db_out\", help=\"output database name\")\n    subparser.add_argument(\n        \"signatures\",\n        nargs=\"*\",\n        help=\"signatures or directory of signatures to index (optional if provided via --from-file)\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\"--scaled\", metavar=\"S\", default=10000, type=float)\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debugging output\"\n    )\n    subparser.add_argument(\n        \"-C\",\n        \"--start-column\",\n        metavar=\"C\",\n        default=2,\n        type=int,\n        help=\"column at which taxonomic assignments start; default=2\",\n    )\n    subparser.add_argument(\n        \"--tabs\",\n        action=\"store_true\",\n        help=\"input spreadsheet is tab-delimited; default is commas\",\n    )\n    subparser.add_argument(\n        \"--no-headers\",\n        action=\"store_true\",\n        help=\"no headers present in taxonomy spreadsheet\",\n    )\n    subparser.add_argument(\n        \"--split-identifiers\",\n        action=\"store_true\",\n        help=\"split names in signatures on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"do not remove accession versions\",\n    )\n    subparser.add_argument(\"-f\", \"--force\", action=\"store_true\")\n    subparser.add_argument(\"--report\", help=\"output a report on anomalies, if any\")\n    subparser.add_argument(\n        \"--require-taxonomy\",\n        action=\"store_true\",\n        help=\"ignore signatures with no taxonomy entry\",\n    )\n    subparser.add_argument(\n        \"--fail-on-missing-taxonomy\",\n        action=\"store_true\",\n        help=\"fail quickly if taxonomy is not available for an identifier\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--database-format\",\n        help=\"format of output database; default is 'json')\",\n        default=\"json\",\n        choices=[\"json\", \"sql\"],\n    )\n\n    add_ksize_arg(subparser, default=31)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.lca.command_index.index(args)\n"
  },
  {
    "path": "src/sourmash/cli/lca/rankinfo.py",
    "content": "\"\"\"database rank info\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"rankinfo\")\n    subparser.add_argument(\"db\", nargs=\"+\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debugging output\"\n    )\n    subparser.add_argument(\"--scaled\", metavar=\"FLOAT\", type=float)\n    subparser.add_argument(\n        \"--minimum-num\",\n        type=int,\n        default=0,\n        help=\"Minimum number of different lineages a k-mer must be in to be counted\",\n    )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.lca.command_rankinfo.rankinfo_main(args)\n"
  },
  {
    "path": "src/sourmash/cli/lca/summarize.py",
    "content": "\"\"\"summarize mixture\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"summarize\")\n    subparser.add_argument(\n        \"--db\", nargs=\"+\", action=\"append\", help=\"one or more LCA databases to use\"\n    )\n    subparser.add_argument(\n        \"--query\",\n        nargs=\"*\",\n        default=[],\n        action=\"append\",\n        help=\"one or more signature files to use as queries\",\n    )\n    subparser.add_argument(\n        \"--query-from-file\", help=\"file containing list of signature files to query\"\n    )\n    subparser.add_argument(\n        \"--threshold\",\n        metavar=\"T\",\n        type=int,\n        default=5,\n        help=\"minimum number of hashes to require for a match\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"file to which CSV output will be written\",\n    )\n    subparser.add_argument(\n        \"--scaled\", metavar=\"FLOAT\", type=float, help=\"scaled value to downsample to\"\n    )\n\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"ignore hash abundances in query signatures do not weight results\",\n    )\n\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debugging output\"\n    )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.lca.command_summarize.summarize_main(args)\n"
  },
  {
    "path": "src/sourmash/cli/migrate.py",
    "content": "\"'sourmash migrate' - migrate an SBT database to the latest version.\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"migrate\")\n    subparser.add_argument(\"sbt_name\", help=\"name to save SBT into\")\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.migrate(args)\n"
  },
  {
    "path": "src/sourmash/cli/multigather.py",
    "content": "\"'sourmash multigather' - gather many signatures against multiple databases.\"\n\nusage = \"\"\"\n\nThe `multigather` subcommand runs 'gather' for multiple query sequences\nagainst the same collection of sequences.  The main use for multigather\nis to amortize the cost of loading databases over many gather queries,\nso it is most useful when searching against databases that are slow to load.\n\nUsage:\n```\nsourmash multigather --query <query1.sig> [<query2.sig> ...] --db <db1> <db2>\n```\n\nFor each query signature, the following output files are created in the\ncurrent working directory:\n\n* <base>.csv - 'gather' CSV output, same as 'gather -o'\n* <base>.matches.sig - 'gather' matching sigs, same as 'gather --save-matches'\n* <base>.unassigned.sig - 'gather' unassigned hashes, same as\n       'gather --output-unassigned'\n\nwhere 'base' is the basename of the 'source file' from the query, or,\nif empty, the md5sum from the signature - use `sourmash sig describe` to\nretrieve these.\n\nThe following commands:\n```\nsourmash gather query1.sig db1\nsourmash gather query2.sig db1\n```\ncan be turned into a multigather command like so:\n```\nsourmash multigather --query query1.sig query2.sig --db db1\n```\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_ksize_arg, add_moltype_args, add_scaled_arg\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"multigather\")\n    subparser.add_argument(\n        \"--query\", nargs=\"*\", default=[], action=\"append\", help=\"query signature\"\n    )\n    subparser.add_argument(\n        \"--query-from-file\", help=\"file containing list of signature files to query\"\n    )\n    subparser.add_argument(\n        \"--db\",\n        nargs=\"+\",\n        action=\"append\",\n        help=\"signatures/SBTs to search\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\"-d\", \"--debug\", action=\"store_true\")\n    subparser.add_argument(\n        \"--threshold-bp\",\n        metavar=\"REAL\",\n        type=float,\n        default=5e4,\n        help=\"threshold (in bp) for reporting results (default=50,000)\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"do NOT use k-mer abundances if present\",\n    )\n    subparser.add_argument(\n        \"--estimate-ani-ci\",\n        action=\"store_true\",\n        help=\"also output confidence intervals for ANI estimates\",\n    )\n    subparser.add_argument(\n        \"--fail-on-empty-database\",\n        action=\"store_true\",\n        help=\"stop at databases that contain no compatible signatures\",\n    )\n    subparser.add_argument(\n        \"--force-allow-overwrite-output\",\n        action=\"store_true\",\n        help=\"allow output files to be overwritten\",\n    )\n    subparser.add_argument(\n        \"--no-fail-on-empty-database\",\n        action=\"store_false\",\n        dest=\"fail_on_empty_database\",\n        help=\"continue past databases that contain no compatible signatures\",\n    )\n    subparser.set_defaults(fail_on_empty_database=True)\n\n    subparser.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output CSV results to this directory\",\n    )\n    subparser.add_argument(\n        \"-U\",\n        \"--output-add-query-md5sum\",\n        action=\"store_true\",\n        help=\"add md5sum of each query to ensure unique output file names\",\n    )\n    subparser.add_argument(\n        \"-E\",\n        \"--extension\",\n        type=str,\n        default=\".sig\",\n        help=\"write signature files with this extension ('.sig' by default)\",\n    )\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_scaled_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.multigather(args)\n"
  },
  {
    "path": "src/sourmash/cli/plot.py",
    "content": "\"\"\"plot distance matrix made by 'compare'\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"plot\")\n    subparser.add_argument(\"distances\", help='output from \"sourmash compare\"')\n    subparser.add_argument(\n        \"--pdf\", action=\"store_true\", help=\"output PDF; default is PNG\"\n    )\n    subparser.add_argument(\n        \"--labels\",\n        action=\"store_true\",\n        default=None,\n        help=\"show sample labels on dendrogram/matrix\",\n    )\n    subparser.add_argument(\n        \"--no-labels\",\n        action=\"store_false\",\n        dest=\"labels\",\n        help=\"do not show sample labels\",\n    )\n    subparser.add_argument(\n        \"--labeltext\",\n        help=\"filename containing list of labels (overrides signature names); implies --labels\",\n    )\n    subparser.add_argument(\n        \"--indices\",\n        action=\"store_true\",\n        default=None,\n        help=\"show sample indices but not labels; overridden by --labels\",\n    )\n    subparser.add_argument(\n        \"--no-indices\",\n        action=\"store_false\",\n        dest=\"indices\",\n        help=\"do not show sample indices\",\n    )\n    subparser.add_argument(\n        \"--vmin\",\n        default=0.0,\n        type=float,\n        help=\"lower limit of heatmap scale; default=%(default)f\",\n    )\n    subparser.add_argument(\n        \"--vmax\",\n        default=1.0,\n        type=float,\n        help=\"upper limit of heatmap scale; default=%(default)f\",\n    )\n    subparser.add_argument(\n        \"--subsample\",\n        type=int,\n        metavar=\"N\",\n        help=\"randomly downsample to this many samples, max\",\n    )\n    subparser.add_argument(\n        \"--subsample-seed\",\n        type=int,\n        default=1,\n        metavar=\"S\",\n        help=\"random seed for --subsample; default=1\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"forcibly plot non-distance matrices\"\n    )\n    subparser.add_argument(\n        \"--output-dir\", metavar=\"DIR\", help=\"directory for output plots\"\n    )\n    subparser.add_argument(\n        \"--csv\",\n        metavar=\"F\",\n        help=\"write clustered matrix and labels out in CSV format (with column\"\n        \" headers) to this file\",\n    )\n    subparser.add_argument(\n        \"--labels-from\",\n        \"--labels-load\",\n        help=\"a CSV file containing label information to use on plot; implies --labels\",\n    )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.plot(args)\n"
  },
  {
    "path": "src/sourmash/cli/prefetch.py",
    "content": "\"\"\"search a signature against dbs, find all overlaps\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_ksize_arg,\n    add_moltype_args,\n    add_picklist_args,\n    add_scaled_arg,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"prefetch\")\n    subparser.add_argument(\"query\", help=\"query signature\")\n    subparser.add_argument(\n        \"databases\",\n        nargs=\"*\",\n        help=\"one or more databases to search\",\n    )\n    subparser.add_argument(\n        \"--db-from-file\",\n        default=None,\n        help=\"list of paths containing signatures to search\",\n    )\n    subparser.add_argument(\n        \"--linear\",\n        action=\"store_true\",\n        help=\"force linear traversal of indexes to minimize loading time and memory use\",\n    )\n    subparser.add_argument(\n        \"--no-linear\",\n        dest=\"linear\",\n        action=\"store_false\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\"-d\", \"--debug\", action=\"store_true\")\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output CSV containing matches to this file\",\n    )\n    subparser.add_argument(\n        \"--save-matches\",\n        metavar=\"FILE\",\n        help=\"save all matching signatures from the databases to the \"\n        \"specified file or directory\",\n    )\n    subparser.add_argument(\n        \"--threshold-bp\",\n        metavar=\"REAL\",\n        type=float,\n        default=5e4,\n        help=\"reporting threshold (in bp) for estimated overlap with remaining query hashes (default=50kb)\",\n    )\n    subparser.add_argument(\n        \"--save-unmatched-hashes\",\n        metavar=\"FILE\",\n        help=\"output unmatched query hashes as a signature to the specified file\",\n    )\n    subparser.add_argument(\n        \"--save-matching-hashes\",\n        metavar=\"FILE\",\n        help=\"output matching query hashes as a signature to the specified file\",\n    )\n    subparser.add_argument(\n        \"--md5\", default=None, help=\"select the signature with this md5 as query\"\n    )\n    subparser.add_argument(\n        \"--estimate-ani-ci\",\n        action=\"store_true\",\n        help=\"also output confidence intervals for ANI estimates\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_pattern_args(subparser)\n    add_scaled_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.prefetch(args)\n"
  },
  {
    "path": "src/sourmash/cli/sbt_combine.py",
    "content": "\"\"\"combine multiple Sequence Bloom Trees\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"sbt_combine\")\n    subparser.add_argument(\"sbt_name\", help=\"name to save SBT into\")\n    subparser.add_argument(\"sbts\", nargs=\"+\", help=\"SBTs to combine to form a new SBT\")\n    subparser.add_argument(\"-x\", \"--bf-size\", metavar=\"S\", type=float, default=1e5)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.sbt_combine(args)\n"
  },
  {
    "path": "src/sourmash/cli/scripts/__init__.py",
    "content": "\"\"\"Provide a mechanism to add CLI plugins to sourmash.\n\nSee https://sourmash.readthedocs.io/en/latest/dev_plugins.html for docs,\nsrc/sourmash/plugins.py for core sourmash implementation code, and\nhttps://github.com/sourmash-bio/sourmash_plugin_template for a template repo\nfor making new plugins.\n\"\"\"\n\n# CTB TODO:\n# * provide suggestions for documentation & metadata for authors:\n# * provide guidance on how to test your CLI plugin at the CLI\n#   (minimal testing regime: sourmash scripts, look for description etc.)\n\nimport argparse\nimport sourmash\n\n# Here, we decorate this module with the various extension objects\n# e.g. 'sourmash scripts foo' will look up attribute 'scripts.foo'\n# and we will return the extension class object, which will then\n# be run by sourmash.__main__. This dictionary is loaded below\n# by sourmash.plugins.add_cli_scripts.\n_extension_dict = {}\n\n\ndef __getattr__(name):\n    if name in _extension_dict:\n        return _extension_dict[name]\n    raise AttributeError(name)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"scripts\",\n        usage=argparse.SUPPRESS,\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n        aliases=[\"ext\"],\n    )\n\n    # get individual help strings:\n    descrs = list(sourmash.plugins.get_cli_scripts_descriptions())\n    if descrs:\n        description = \"\\n\".join(descrs)\n    else:\n        description = \"(No script plugins detected!)\"\n\n    s = subparser.add_subparsers(\n        title=\"available plugin/extension commands\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=argparse.SUPPRESS,\n        description=description,\n    )\n\n    _extension_dict.update(sourmash.plugins.add_cli_scripts(s))\n"
  },
  {
    "path": "src/sourmash/cli/search.py",
    "content": "\"\"\"search a signature against other signatures\"\"\"\n\nusage = \"\"\"\n\nThe `search` subcommand searches a collection of signatures or SBTs\nfor matches to the query signature.  It can search for matches with\neither high Jaccard similarity [1] or containment; the default is to\nuse Jaccard similarity, unless `--containment` is specified.\n`-o/--output` will create a CSV file containing the matches.\n\n`search` will load all of provided signatures into memory, which can\nbe slow and somewhat memory intensive for large collections.  You can\nuse `sourmash index` to create a Sequence Bloom Tree (SBT) that can be\nquickly searched on disk; this is the same format in which we provide\nGenBank and other databases.\n\nCommand line usage:\n```\nsourmash search query.sig [ list of signatures or SBTs ]\n```\n\nExample output:\n\n```\n49 matches; showing first 20:\nsimilarity   match\n----------   -----\n 75.4%%      NZ_JMGW01000001.1 Escherichia coli 1-176-05_S4_C2 e117605...\n 72.2%%      NZ_GG774190.1 Escherichia coli MS 196-1 Scfld2538, whole ...\n 71.4%%      NZ_JMGU01000001.1 Escherichia coli 2-011-08_S3_C2 e201108...\n 70.1%%      NZ_JHRU01000001.1 Escherichia coli strain 100854 100854_1...\n 69.0%%      NZ_JH659569.1 Escherichia coli M919 supercont2.1, whole g...\n...  \n```\n\n[1] https://en.wikipedia.org/wiki/Jaccard_index\n\nWhen `--containment` is provided, the containment of the query in each\nof the search signatures or databases is reported.\n\n---\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_ksize_arg,\n    add_moltype_args,\n    add_picklist_args,\n    add_scaled_arg,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"search\", description=__doc__, usage=usage)\n    subparser.add_argument(\"query\", help=\"query signature\")\n    subparser.add_argument(\n        \"databases\",\n        nargs=\"+\",\n        help=\"signatures/SBTs to search\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debug information\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--threshold\",\n        metavar=\"T\",\n        default=0.08,\n        type=float,\n        help=\"minimum threshold for reporting matches; default=0.08\",\n    )\n    subparser.add_argument(\n        \"--save-matches\",\n        metavar=\"FILE\",\n        help=\"output matching signatures to the specified file\",\n    )\n    subparser.add_argument(\n        \"--best-only\",\n        action=\"store_true\",\n        help=\"report only the best match (with greater speed)\",\n    )\n    subparser.add_argument(\n        \"-n\",\n        \"--num-results\",\n        default=3,\n        type=int,\n        metavar=\"N\",\n        help=\"number of results to display to user; 0 to report all\",\n    )\n    subparser.add_argument(\n        \"--containment\",\n        action=\"store_true\",\n        help=\"score based on containment rather than similarity\",\n    )\n    subparser.add_argument(\n        \"--max-containment\",\n        action=\"store_true\",\n        help=\"score based on max containment rather than similarity\",\n    )\n    subparser.add_argument(\n        \"--estimate-ani-ci\",\n        action=\"store_true\",\n        help=\"for containment searches, also output confidence intervals for ANI estimates\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundance\",\n        action=\"store_true\",\n        help=\"do NOT use k-mer abundances if present; note: has no effect if \"\n        \"--containment or --max-containment is specified\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output CSV containing matches to this file\",\n    )\n    subparser.add_argument(\n        \"--md5\", default=None, help=\"select the signature with this md5 as query\"\n    )\n    subparser.add_argument(\n        \"--fail-on-empty-database\",\n        action=\"store_true\",\n        help=\"stop at databases that contain no compatible signatures\",\n    )\n    subparser.add_argument(\n        \"--no-fail-on-empty-database\",\n        action=\"store_false\",\n        dest=\"fail_on_empty_database\",\n        help=\"continue past databases that contain no compatible signatures\",\n    )\n    subparser.set_defaults(fail_on_empty_database=True)\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_pattern_args(subparser)\n    add_scaled_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.search(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/__init__.py",
    "content": "\"\"\"Define the command line interface for sourmash sig\n\nThe top level CLI is defined in ../__init__.py. This module defines the CLI for\n`sourmash sig` operations.\n\"\"\"\n\nfrom . import cat\nfrom . import split\nfrom . import describe\nfrom . import downsample\nfrom . import extract\nfrom . import filter\nfrom . import flatten\nfrom . import fileinfo\nfrom . import fileinfo as summarize\nfrom . import grep\nfrom . import kmers\nfrom . import check\nfrom . import collect\nfrom . import intersect\nfrom . import inflate\nfrom . import manifest\nfrom . import merge\nfrom . import rename\nfrom . import subtract\nfrom . import ingest\nfrom . import export\nfrom . import overlap\nfrom ..utils import command_list\nfrom argparse import SUPPRESS, RawDescriptionHelpFormatter\nimport os\nimport sys\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"sig\",\n        formatter_class=RawDescriptionHelpFormatter,\n        usage=SUPPRESS,\n        aliases=[\"signature\"],\n    )\n    desc = \"Operations\\n\"\n    clidir = os.path.dirname(__file__)\n    ops = command_list(clidir)\n    for subcmd in ops:\n        docstring = getattr(sys.modules[__name__], subcmd).__doc__\n        helpstring = f\"sourmash sig {subcmd:s} --help\"\n        desc += f\"        {helpstring:33s} {docstring:s}\\n\"\n    s = subparser.add_subparsers(\n        title=\"Manipulate signature files\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=SUPPRESS,\n        description=desc,\n    )\n    for subcmd in ops:\n        getattr(sys.modules[__name__], subcmd).subparser(s)\n    subparser._action_groups.reverse()\n    subparser._optionals.title = \"Options\"\n"
  },
  {
    "path": "src/sourmash/cli/sig/cat.py",
    "content": "\"\"\"concatenate signature files\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature cat` - concatenate multiple signatures together\n\nConcatenate signature files.\n\nFor example,\n\nsourmash signature cat file1.sig file2.sig -o all.sig\n\nwill combine all signatures in `file1.sig` and `file2.sig` and put them\nin the file `all.sig`.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    # working on this\n    subparser = subparsers.add_parser(\"cat\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"provide debugging output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"-u\",\n        \"--unique\",\n        action=\"store_true\",\n        help=\"keep only distinct signatures, removing duplicates (based on md5sum)\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_pattern_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.cat(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/check.py",
    "content": "\"\"\"check signature collections against a picklist\"\"\"\n\nusage = \"\"\"\n\n    sourmash sig check <filenames> --picklist ... -o miss.csv -m manifest.csv\n\nThis will check the signature contents of <filenames> against the given\npicklist, optionally outputting the unmatched picklist rows to 'miss.csv'\nand optionally outputting a manifest of the matched signatures to\n'manifest.csv'.\n\nBy default, 'sig check' requires a pre-existing manifest for collections;\nthis prevents potentially slow manifest rebuilding. You\ncan turn this check off with '--no-require-manifest'.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n    add_v5_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"check\", usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"provide debugging output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output-missing\",\n        metavar=\"FILE\",\n        help=\"output picklist with remaining unmatched entries to this file\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-m\",\n        \"--save-manifest-matching\",\n        help=\"save a manifest of the matching entries to this file.\",\n    )\n    subparser.add_argument(\n        \"--fail-if-missing\",\n        action=\"store_true\",\n        help=\"exit with an error code (-1) if there are any missing picklist values.\",\n    )\n    subparser.add_argument(\n        \"--no-require-manifest\",\n        help=\"do not require a manifest; generate dynamically if needed\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--manifest-format\",\n        help=\"format of manifest output file; default is 'csv')\",\n        default=\"csv\",\n        choices=[\"csv\", \"sql\"],\n    )\n    subparser.add_argument(\n        \"--abspath\",\n        \"--use-absolute-paths\",\n        help=\"convert all locations to absolute paths\",\n        action=\"store_true\",\n        default=None,\n    )\n    subparser.add_argument(\n        \"--no-abspath\",\n        help=\"do not convert all locations to absolute paths\",\n        action=\"store_false\",\n        dest=\"abspath\",\n    )\n    subparser.add_argument(\n        \"--relpath\",\n        \"--use-relative-paths\",\n        help=\"convert all locations to paths relative to the output manifest\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"--no-relpath\",\n        help=\"do not convert all locations to paths relative to the output manifest\",\n        action=\"store_false\",\n        dest=\"relpath\",\n    )\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_pattern_args(subparser)\n    add_picklist_args(subparser)\n    add_v5_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.check(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/collect.py",
    "content": "\"\"\"collect manifest information across many files\"\"\"\n\nusage = \"\"\"\n\n    sourmash sig collect <filenames> -o all.sqlmf\n\nThis will collect manifests from across many files and save the information\ninto a standalone manifest database.\n\nBy default, 'sig collect' requires a pre-existing manifest for collections;\nthis prevents potentially slow manifest rebuilding. You\ncan turn this check off with '--no-require-manifest'.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n    add_v5_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"collect\", usage=usage)\n    subparser.add_argument(\"locations\", nargs=\"*\", help=\"locations of input signatures\")\n    subparser.add_argument(\"-o\", \"--output\", help=\"manifest output file\", required=True)\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"provide debugging output\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"--no-require-manifest\",\n        help=\"do not require a manifest; generate dynamically if needed\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--manifest-format\",\n        help=\"format of manifest output file; default is 'csv')\",\n        default=\"sql\",\n        choices=[\"csv\", \"sql\"],\n    )\n\n    subparser.add_argument(\n        \"--merge-previous\",\n        action=\"store_true\",\n        help=\"merge new manifests into existing\",\n    )\n    subparser.add_argument(\n        \"--abspath\",\n        \"--use-absolute-paths\",\n        help=\"convert all locations to absolute paths\",\n        action=\"store_true\",\n        default=None,  # None: not user specified, so can switch v4/v5\n    )\n    subparser.add_argument(\n        \"--no-abspath\",\n        help=\"do not convert all locations to absolute paths\",\n        action=\"store_false\",\n        dest=\"abspath\",\n    )\n    subparser.add_argument(\n        \"--relpath\",\n        \"--use-relative-paths\",\n        help=\"convert all locations to paths relative to the output manifest\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"--no-relpath\",\n        help=\"do not convert all locations to paths relative to the output manifest\",\n        action=\"store_false\",\n        dest=\"relpath\",\n    )\n\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_v5_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.collect(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/describe.py",
    "content": "\"\"\"show details of signature\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature describe` - display detailed information about signatures\n\nDisplay signature details.\n\nFor example,\n\nsourmash sig describe tests/test-data/47.fa.sig\n\nwill display:\n\nsignature filename: tests/test-data/47.fa.sig\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"describe\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"provide debugging output\"\n    )\n    subparser.add_argument(\n        \"--csv\", metavar=\"FILE\", help=\"output information to a CSV file\"\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_pattern_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.describe(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/downsample.py",
    "content": "\"\"\"downsample one or more signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature downsample` - decrease the size of a signature\n\nDownsample one or more signatures.\n\nWith `downsample`, you can --\n\n* increase the `scaled` value for a signature created with `-p scaled=SCALED`, shrinking it in size;\n* decrease the `num` value for a traditional num MinHash, shrinking it in size;\n* try to convert a `scaled` signature to a `num` signature;\n* try to convert a `num` signature to a `scaled` signature.\n\nFor example,\n\nsourmash signature downsample file1.sig file2.sig --scaled 100000 -o downsampled.sig\n\nwill output each signature, downsampled to a scaled value of 100000, to\n`downsampled.sig`; and\n\nsourmash signature downsample --num 500 scaled_file.sig -o downsampled.sig\n\nwill try to convert a scaled MinHash to a num MinHash.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_num_arg,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"downsample\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"--scaled\", type=int, default=0, help=\"scaled value to downsample to\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output signature to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n    add_num_arg(subparser, 0)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.downsample(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/export.py",
    "content": "\"\"\"export a signature, e.g. to mash\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature export` - export signatures to mash.\n\nExport signatures from sourmash format. Currently only supports\nmash dump format.\n\nFor example,\n\nsourmash signature export filename.sig -o filename.sig.msh.json\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_ksize_arg, add_moltype_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"export\", description=__doc__, usage=usage)\n    subparser.add_argument(\"filename\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"--md5\", default=None, help=\"select the signature with this md5 as query\"\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.export(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/extract.py",
    "content": "\"\"\"extract one or more signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature extract` - extract signatures from a collection\n\nExtract the specified signature(s) from a collection of signatures.\n\nFor example,\n\nsourmash signature extract *.sig -k 21 --dna -o extracted.sig\n\nwill extract all nucleotide signatures calculated at k=21 from all\n.sig files in the current directory.\n\nThere are currently two other useful selectors for `extract`: you can specify\n(part of) an md5sum, as output in the CSVs produced by `search` and `gather`;\nand you can specify (part of) a name.\n\nFor example,\n\nsourmash signature extract tests/test-data/*.fa.sig --md5 09a0869\n\nwill extract the signature from `47.fa.sig` which has an md5sum of\n`09a08691ce52952152f0e866a59f6261`; and \n\nsourmash signature extract tests/test-data/*.fa.sig --name NC_009665\n\nwill extract the same signature, which has an accession number of\n`NC_009665.1`.\n\n#### Using picklists with `sourmash sig extract`\n\nAs of sourmash 4.2.0, `extract` also supports picklists, a feature by\nwhich you can select signatures based on values in a CSV file. See\n[the command line docs](https://sourmash.readthedocs.io/en/latest/command-line.html) for more information.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"extract\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output signature to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"--md5\",\n        default=None,\n        help=\"select signatures whose md5 contains this substring\",\n    )\n    subparser.add_argument(\n        \"--name\",\n        default=None,\n        help=\"select signatures whose name contains this substring\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_pattern_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.extract(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/fileinfo.py",
    "content": "\"\"\"provide summary information on the given file\"\"\"\n\nusage = \"\"\"\n\n    sourmash sig fileinfo <filename>\n\nThis will provide a summary of the sketch contents in the given file.\n\nJSON output can be generated in place of the normal human-readable output\nwith '--json-out'.\n\n'sig summarize' and 'sig fileinfo' are aliases for the same command.\n\n\"\"\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"fileinfo\", aliases=[\"summarize\"], usage=usage)\n    subparser.add_argument(\"path\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debug information\"\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--rebuild-manifest\", help=\"forcibly rebuild the manifest\", action=\"store_true\"\n    )\n    subparser.add_argument(\n        \"--json-out\", help=\"output information in JSON format only\", action=\"store_true\"\n    )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.fileinfo(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/filter.py",
    "content": "\"\"\"filter k-mers on abundance\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature filter` - remove hashes based on abundance\n\nFilter the hashes in the specified signature(s) by abundance, by either\n`-m/--min-abundance` or `-M/--max-abundance` or both. Abundance selection is\ninclusive, so `-m 2 -M 5` will select hashes with abundance greater than\nor equal to 2, and less than or equal to 5.\n\nFor example,\n\nsourmash signature -m 2 *.sig\n\n\nwill output new signatures containing only hashes that occur two or\nmore times in each signature.\n\nThe `filter` command accepts the same selectors as `extract`.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"filter\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"+\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output signature to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"--md5\",\n        type=str,\n        default=None,\n        help=\"select signatures whose md5 contains this substring\",\n    )\n    subparser.add_argument(\n        \"--name\",\n        type=str,\n        default=None,\n        help=\"select signatures whose name contains this substring\",\n    )\n    subparser.add_argument(\n        \"-m\",\n        \"--min-abundance\",\n        type=int,\n        default=1,\n        help=\"keep hashes >= this minimum abundance\",\n    )\n    subparser.add_argument(\n        \"-M\",\n        \"--max-abundance\",\n        type=int,\n        default=None,\n        help=\"keep hashes <= this maximum abundance\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.filter(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/flatten.py",
    "content": "\"\"\"remove abundances\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature flatten` - remove abundance information from signatures\n\nFlatten the specified signature(s), removing abundances and setting\ntrack_abundance to False.\n\nFor example,\n\nsourmash signature flatten *.sig -o flattened.sig\n\nwill remove all abundances from all of the .sig files in the current\ndirectory.\n\nThe `flatten` command accepts the same selectors as `extract`.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"flatten\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output signature to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"--md5\",\n        default=None,\n        help=\"select signatures whose md5 contains this substring\",\n    )\n    subparser.add_argument(\n        \"--name\",\n        default=None,\n        help=\"select signatures whose name contains this substring\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.flatten(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/grep.py",
    "content": "\"\"\"extract one or more signatures by substr/regex match\"\"\"\n\nusage = \"\"\"\n    sourmash sig grep <pattern> <filename> [... <filenames>]\n\nThis will search for the provided pattern in the files or databases,\nusing the signature metadata, and output matching signatures.\nCurrently 'grep' searches the 'name', 'filename', and 'md5' fields as\ndisplayed by `sig describe`.\n\n'pattern' can be a string or a regular expression.\n\n'sig grep' uses the built-in Python regexp module, 're', to implement\nregexp searching. See https://docs.python.org/3/howto/regex.html and\nhttps://docs.python.org/3/library/re.html for details.\n\nThe '-v' (exclude), '-i' (case-insensitive), and `-c` (count) options\nof 'grep' are supported.\n\n'-o/--output' can be used to output matching signatures to a specific\nlocation.\n\nBy default, 'sig grep' requires a pre-existing manifest for collections;\nthis prevents potentially slow manifest rebuilding. You\ncan turn this check off with '--no-require-manifest'.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"grep\", usage=usage)\n    subparser.add_argument(\"pattern\", help=\"search pattern (string/regex)\")\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debug information\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output matching signatures to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"try to load all files as signatures, independent of filename\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-v\",\n        \"--invert-match\",\n        help=\"select non-matching signatures\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-i\",\n        \"--ignore-case\",\n        help=\"ignore case distinctions (search lower and upper case both)\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"--no-require-manifest\",\n        help=\"do not require a manifest; generate dynamically if needed\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"--csv\",\n        \"--save-picklist\",\n        help=\"save CSV file containing signature data in manifest format; can be used as a picklist\",\n    )\n    subparser.add_argument(\n        \"--no-sigs\",\n        \"--silent\",\n        \"--no-signatures-output\",\n        help=\"do not output signatures\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-c\",\n        \"--count\",\n        help=\"only output a count of discovered signatures; implies --no-sigs\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-l\",\n        \"--print-matched-names\",\n        help=\"output the full names of matched signatures; implies --no-sigs\",\n        action=\"store_true\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash.sig.grep\n\n    return sourmash.sig.grep.main(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/inflate.py",
    "content": "\"\"\"borrow abundances from one signature => one or more other signatures\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"inflate\")\n    subparser.add_argument(\"signature_from\")\n    subparser.add_argument(\"other_sigs\", nargs=\"+\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.inflate(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/ingest.py",
    "content": "\"\"\"ingest/import a mash or other signature\"\"\"\n\nusage = \"\"\"\n\n   sourmash sig ingest --csv <input filename> [ <more inputs> ] -o <output>\n\nIngest num sketches from a simple CSV format, or alternatively a JSON\nformatproduced by 'mash info -d'.  The CSV file should contain one\nline per sketch, with the first column containing 'murmur64', the\nsecond being '42', the third and fourth being the k-mer size and the\nname, and the remaining columns being the hashes.\n\n\"\"\"\n\n\ndef subparser(subparsers):\n    # Dirty hack to simultaneously support new and previous interface\n    # If desired, this function can be removed with a major version bump.\n    for cmd in (\"ingest\", \"import\"):\n        subparser = subparsers.add_parser(cmd, usage=usage)\n        subparser.add_argument(\n            \"--csv\", action=\"store_true\", help=\"import in Mash CSV format\"\n        )\n        subparser.add_argument(\"filenames\", nargs=\"+\")\n        subparser.add_argument(\n            \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n        )\n        subparser.add_argument(\n            \"-o\",\n            \"--output\",\n            metavar=\"FILE\",\n            default=\"-\",\n            help=\"output signature to this file (default stdout)\",\n        )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.ingest(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/intersect.py",
    "content": "\"\"\"intersect two or more signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature intersect` - intersect two (or more) signatures\n\nOutput the intersection of the hash values in multiple signature files.\n\nFor example,\n\n\nsourmash signature intersect file1.sig file2.sig file3.sig -o intersect.sig\n\nwill output the intersection of all the hashes in those three files to\n`intersect.sig`.\n\nThe `intersect` command flattens all signatures, i.e. the abundances\nin any signatures will be ignored and the output signature will have\n`track_abundance` turned off. See `sourmash signature flatten` for more details.\n\nNote: `intersect` only creates one output file, with one signature in it.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"intersect\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"-A\",\n        \"--abundances-from\",\n        metavar=\"FILE\",\n        help=\"intersect with & take abundances from this signature\",\n    )\n    subparser.add_argument(\"--set-name\", help=\"set name for output signature\")\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.intersect(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/kmers.py",
    "content": "\"\"\"show k-mers/sequences matching the signature hashes\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature kmers` - extract k-mers and/or sequences that match to signatures\n\nGiven one or more compatible sketches and some sequence files, extract\nthe k-mers and/or sequences corresponding to the hash values in the\nsketch. Because the sourmash hash function is one-way, this requires\nFASTA or FASTQ sequence files in addition to the sketch.\n\nFor example,\n\nsourmash sig kmers --signatures sig1.sig --sequences seqfile.fasta \\\n    --save-sequences matches.fasta --save-kmers kmer-matches.csv\n\nwill search `seqfile.fasta` for matching sequences and k-mers,\nand produce two files. The file `matches.fasta` will contain FASTA\nsequences that match the hashes in the input signature, while the\nfile `kmer-matches.csv` provides the matching k-mers and hash values,\ntogether with their originating filename and sequence name.\n\nIf the sketch is a protein sketch (protein, dayhoff, or hp), then\nthe input sequences are assumed to be protein. To search DNA sequences\nfor translated protein hashes, provide the `--translate` flag to `sig kmers`.\n\n`--save-sequences` and `--save-kmers` are both optional.  If neither are\ngiven, basic statistics on k-mer matching are given.\n\nPlease note that `--save-kmers` can be very slow on large files!\n\nThe input sketches are the source of the input hashes.  So, for example,\nIf `--scaled=1` sketches are provided, `sig kmers` can be used to\nyield all the k-mers and their matching hashes.  Likewise, if the\nsketch is built from the intersection of two other sketches, only\nthe k-mers and hash values present in both sketches will be used.\n\nLikewise, the input sequences are used for matching; they do not need\nto be the same sequences that were used to create the sketches.\nInput sequences can be in FASTA or FASTQ format, and either flat text\nor compressed with gzip or bzip2; formats are auto-detected.\n\nBy default, `sig kmers` ignores bad k-mers (e.g. non-ACGT characters\nin DNA). If `--check-sequence` is provided, `sig kmers` will error\nexit on the first bad k-mer.  If `--check-sequence --force` is provided,\n`sig kmers` will provide error messages (and skip bad sequences), but\nwill continue processing input sequences.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"kmers\", description=__doc__, usage=usage)\n    subparser.add_argument(\"--signatures\", nargs=\"*\", default=[])\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n    subparser.add_argument(\n        \"--sequences\",\n        nargs=\"+\",\n        required=True,\n        help=\"FASTA/FASTQ/bz2/gz files with sequences\",\n    )\n\n    subparser.add_argument(\n        \"--save-kmers\", help=\"save k-mers and hash values to a CSV file\"\n    )\n    subparser.add_argument(\n        \"--save-sequences\", help=\"save sequences with matching hashes to a FASTA file\"\n    )\n    subparser.add_argument(\n        \"--translate\",\n        action=\"store_true\",\n        help=\"translate DNA k-mers into amino acids (for protein, dayhoff, and hp sketches)\",\n    )\n    subparser.add_argument(\n        \"--check-sequence\",\n        action=\"store_true\",\n        help=\"complain if input sequence is invalid (NOTE: only checks DNA)\",\n    )\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.kmers(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/manifest.py",
    "content": "\"\"\"create a manifest for a collection of signatures\"\"\"\n\nusage = \"\"\"\n\n    sourmash sig manifest <filename> -o manifest.csv\n\nThis will output a sourmash manifest in CSV format. This manifest\ncan be used as a picklist with --picklist manifest.csv::manifest.\n\nThe manifest will be rebuilt by iterating over the signatures in the\nfile unless --no-rebuild-manifest is specified; for large\ncollections, rebuilding the manifest can take a long time!\n\nSee also the 'describe' and 'fileinfo' commands under 'sourmash sig'.\n\n\"\"\"\nfrom sourmash.cli.utils import add_v5_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"manifest\", usage=usage)\n    subparser.add_argument(\"location\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"output debug information\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        \"--csv\",\n        metavar=\"FILE\",\n        help=\"output information to a CSV file\",\n        required=True,\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--rebuild-manifest\",\n        help=\"force rebuilding manifest if available\",\n        action=\"store_true\",\n        default=None,  # default: not user specified\n    )\n    subparser.add_argument(\n        \"--no-rebuild-manifest\",\n        help=\"use existing manifest if available\",\n        action=\"store_false\",\n        dest=\"rebuild_manifest\",\n    )\n\n    subparser.add_argument(\n        \"-F\",\n        \"--manifest-format\",\n        help=\"format of manifest output file; default is 'csv')\",\n        default=\"csv\",\n        choices=[\"csv\", \"sql\"],\n    )\n\n    add_v5_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.manifest(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/merge.py",
    "content": "\"\"\"merge one or more signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature merge` - merge two or more signatures into one\n\nMerge two (or more) signatures.\n\nFor example,\n\nsourmash signature merge file1.sig file2.sig -o merged.sig\n\nwill output the union of all the hashes in `file1.sig` and `file2.sig`\nto `merged.sig`.\n\nAll of the signatures passed to merge must either have been created\nwith `-p abund`, or not.  If they have `track_abundance` on,\nthen the merged signature will have the sum of all abundances across\nthe individual signatures.  The `--flatten` flag will override this\nbehavior and allow merging of mixtures by removing all abundances.\n\nNote: `merge` only creates one output file, with one signature in it,\nin the JSON `.sig` format.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"merge\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"--flatten\", action=\"store_true\", help=\"remove abundances from all signatures\"\n    )\n    subparser.add_argument(\"--set-name\", \"--name\", help=\"rename merged signature\")\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.merge(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/overlap.py",
    "content": "\"\"\"see detailed comparison of signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature overlap` - detailed comparison of two signatures' overlap\n\nDisplay a detailed comparison of two signatures. This calculates the\nJaccard similarity (as in `sourmash compare` or `sourmash search`) and\nthe Jaccard containment in both directions (as with `--containment`).\nIt also displays the number of hash values in the union and\nintersection of the two signatures, as well as the number of disjoint\nhash values in each signature.\n\nThis command has two uses - first, it is helpful for understanding how\nsimilarity and containment are calculated, and second, it is useful for\nanalyzing signatures with very small overlaps, where the similarity\nand/or containment might be very close to zero.\n\nFor example,\n\nsourmash signature overlap file1.sig file2.sig\n\nwill display the detailed comparison of `file1.sig` and `file2.sig`.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"overlap\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signature1\")\n    subparser.add_argument(\"signature2\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.overlap(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/rename.py",
    "content": "\"\"\"rename signature\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature rename` - rename a signature\n\nRename the display name for one or more signatures - this is the name\noutput for matches in `compare`, `search`, `gather`, etc.\n\nFor example,\n\nsourmash signature rename file1.sig \"new name\" -o renamed.sig\n\nwill place a renamed copy of the hashes in `file1.sig` in the file\n`renamed.sig`. If you provide multiple signatures, all will be renamed\nto the same name.\n\n\"\"\"\n\nfrom sourmash.cli.utils import (\n    add_moltype_args,\n    add_ksize_arg,\n    add_picklist_args,\n    add_pattern_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"rename\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\"name\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-d\", \"--debug\", action=\"store_true\", help=\"print debugging output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        help=\"output renamed signature to this file (default stdout)\",\n        default=\"-\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_pattern_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.rename(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/split.py",
    "content": "\"\"\"split signature files\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature split` - split signatures into individual files\n\nSplit each signature in the input file(s) into individual files, with\nstandardized names.\n\nFor example,\n\nsourmash signature split tests/test-data/2.fa.sig\n\nwill create 3 files,\n\n`f372e478.k=21.scaled=1000.DNA.dup=0.2.fa.sig`,\n`f3a90d4e.k=31.scaled=1000.DNA.dup=0.2.fa.sig`, and\n`43f3b48e.k=51.scaled=1000.DNA.dup=0.2.fa.sig`, representing the three\ndifferent DNA signatures at different ksizes created from the input file\n`2.fa`.\n\nThe format of the names of the output files is standardized and stable\nfor major versions of sourmash: currently, they are period-separated\nwith fields:\n\n* `md5sum` - a unique hash value based on the contents of the signature.\n* `k=<ksize>` - k-mer size.\n* `scaled=<scaled>` or `num=<num>` - scaled or num value for MinHash.\n* `<moltype>` - the molecule type (DNA, protein, dayhoff, or hp)\n* `dup=<n>` - a non-negative integer that prevents duplicate signatures from colliding.\n* `basename` - basename of first input file used to create signature; if none provided, or stdin, this is `none`.\n\nIf `--outdir` is specified, all of the signatures are placed in outdir.\n\nNote: `split` only saves files in the JSON `.sig` format.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg, add_picklist_args\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"split\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signatures\", nargs=\"*\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output signatures to this directory\",\n    )\n    subparser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", help=\"try to load all files as signatures\"\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        help=\"a text file containing a list of files to load signatures from\",\n    )\n    subparser.add_argument(\n        \"-E\",\n        \"--extension\",\n        type=str,\n        default=\".sig\",\n        help=\"write files with this extension ('.sig' by default)\",\n    )\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n    add_picklist_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.split(args)\n"
  },
  {
    "path": "src/sourmash/cli/sig/subtract.py",
    "content": "\"\"\"subtract one or more signatures\"\"\"\n\nusage = \"\"\"\n\n### `sourmash signature subtract` - subtract other signatures from a signature\n\nSubtract all of the hash values from one signature that are in one or more\nof the others.\n\nFor example,\n\n\nsourmash signature subtract file1.sig file2.sig file3.sig -o subtracted.sig\n\nwill subtract all of the hashes in `file2.sig` and `file3.sig` from\n`file1.sig`, and save the new signature to `subtracted.sig`.\n\nTo use `subtract` on signatures calculated with\n`-p abund`, you must specify `--flatten`.\n\nNote: `subtract` only creates one output file, with one signature in it.\n\n\"\"\"\n\nfrom sourmash.cli.utils import add_moltype_args, add_ksize_arg\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"subtract\", description=__doc__, usage=usage)\n    subparser.add_argument(\"signature_from\")\n    subparser.add_argument(\"subtraction_sigs\", nargs=\"+\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        metavar=\"FILE\",\n        default=\"-\",\n        help=\"output signature to this file (default stdout)\",\n    )\n    subparser.add_argument(\n        \"--flatten\",\n        action=\"store_true\",\n        help=\"remove abundance from signatures before subtracting\",\n    )\n    subparser.add_argument(\n        \"-A\",\n        \"--abundances-from\",\n        metavar=\"FILE\",\n        help=\"intersect with & take abundances from this signature\",\n    )\n    subparser.add_argument(\"--set-name\", help=\"set name for output signature\")\n    add_ksize_arg(subparser)\n    add_moltype_args(subparser)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sig.__main__.subtract(args)\n"
  },
  {
    "path": "src/sourmash/cli/sketch/__init__.py",
    "content": "\"\"\"Define the command line interface for sourmash sketch\n\nThe top level CLI is defined in ../__init__.py. This module defines the CLI for\n`sourmash sketch` operations.\n\"\"\"\n\nfrom . import dna\nfrom . import dna as rna\nfrom . import protein\nfrom . import protein as aa\nfrom . import protein as prot\nfrom . import translate\nfrom . import fromfile\nfrom ..utils import command_list\nfrom argparse import SUPPRESS, RawDescriptionHelpFormatter\nimport os\nimport sys\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"sketch\", formatter_class=RawDescriptionHelpFormatter, usage=SUPPRESS\n    )\n    desc = \"Operations\\n\"\n    clidir = os.path.dirname(__file__)\n    ops = command_list(clidir)\n    for subcmd in ops:\n        docstring = getattr(sys.modules[__name__], subcmd).__doc__\n        helpstring = f\"sourmash sketch {subcmd:s} --help\"\n        desc += f\"        {helpstring:33s} {docstring:s}\\n\"\n    s = subparser.add_subparsers(\n        title=\"Create signatures\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=SUPPRESS,\n        description=desc,\n    )\n    for subcmd in ops:\n        getattr(sys.modules[__name__], subcmd).subparser(s)\n    subparser._action_groups.reverse()\n    subparser._optionals.title = \"Options\"\n"
  },
  {
    "path": "src/sourmash/cli/sketch/dna.py",
    "content": "\"\"\"create DNA signatures\"\"\"\n\nusage = \"\"\"\n\n    sourmash sketch dna data/*.fna.gz\n\nThe 'sketch dna' command reads in DNA sequences and outputs DNA\nsketches.\n\nBy default, 'sketch dna' uses the parameter string 'k=31,scaled=1000,noabund'.\n\nThis creates sketches with a k-mer size of 31, a scaled factor of\n1000, and no abundance tracking of k-mers.  You can specify one or\nmore parameter strings of your own with -p, e.g.  'sourmash sketch dna\n-p k=31,noabund -p k=21,scaled=100,abund'. Note that a single `-p` parameter string can contain multiple ksize values, but only a single scaled value or abundance value, e.g. -p k=21,k=31,abund\n\n'sourmash sketch' takes input sequences in FASTA and FASTQ,\nuncompressed or gz/bz2 compressed.\n\nPlease see the 'sketch' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/sourmash-sketch.html\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\nfrom sourmash import command_sketch\n\nassert command_sketch.DEFAULTS[\"dna\"] == \"k=31,scaled=1000,noabund\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"dna\", aliases=[\"rna\", \"nucleotide\", \"nt\"], usage=usage\n    )\n    subparser.add_argument(\n        \"--license\",\n        default=\"CC0\",\n        type=str,\n        help=\"signature license. Currently only CC0 is supported.\",\n    )\n    subparser.add_argument(\n        \"--check-sequence\",\n        action=\"store_true\",\n        help=\"complain if input sequence is invalid DNA\",\n    )\n    subparser.add_argument(\n        \"-p\",\n        \"--param-string\",\n        default=[],\n        help=\"signature parameters to use.\",\n        action=\"append\",\n    )\n\n    subparser.add_argument(\"filenames\", nargs=\"*\", help=\"file(s) of sequences\")\n    file_args = subparser.add_argument_group(\"File handling options\")\n    file_args.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"recompute signatures even if the file exists\",\n    )\n    subparser.add_argument(\n        \"--from-file\", help=\"a text file containing a list of sequence files to load\"\n    )\n    file_args.add_argument(\n        \"-o\", \"--output\", help=\"output computed signatures to this file\"\n    )\n    file_args.add_argument(\n        \"--set-name\",\n        \"--name\",\n        \"--merge\",\n        dest=\"merge\",\n        type=str,\n        default=\"\",\n        metavar=\"FILE\",\n        help=\"name the output sketch as specified; note, merges all input \"\n        \"files while sketching\",\n    )\n    file_args.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output computed signatures to this directory\",\n    )\n    file_args.add_argument(\n        \"--singleton\",\n        action=\"store_true\",\n        help=\"compute a signature for each sequence record individually\",\n    )\n    file_args.add_argument(\n        \"--name-from-first\",\n        action=\"store_true\",\n        help=\"name the signature generated from each file after the first \"\n        \"record in the file\",\n    )\n    file_args.add_argument(\n        \"--randomize\",\n        action=\"store_true\",\n        help=\"shuffle the list of input filenames randomly\",\n    )\n\n\ndef main(args):\n    import sourmash.command_sketch\n\n    return sourmash.command_sketch.dna(args)\n"
  },
  {
    "path": "src/sourmash/cli/sketch/fromfile.py",
    "content": "\"\"\"create signatures from a CSV file\"\"\"\n\nusage = \"\"\"\n\n    sourmash sketch fromfile <csv file> --output-signatures <location> -p <...>\n\nThe 'sketch fromfile' command takes in a CSV file with list of names\nand filenames to be used for building signatures. It is intended for\nbatch use, when building large collections of signatures.\n\nOne or more parameter strings must be specified with '-p'.\n\nOne or more existing collections of signatures can be provided via\n'--already-done' and already-existing signatures (based on name and\nsketch type) will not be recalculated or output.\n\nIf a location is provided via '--output-signatures', signatures will be saved\nto that location.\n\nPlease see the 'sketch' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/sourmash-sketch.html\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\nfrom sourmash import command_sketch\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"fromfile\", usage=usage)\n    subparser.add_argument(\n        \"csvs\",\n        nargs=\"+\",\n        help=\"input CSVs providing 'name', 'genome_filename', and 'protein_filename'\",\n    )\n    subparser.add_argument(\n        \"-p\",\n        \"--param-string\",\n        default=[],\n        help=\"signature parameters to use.\",\n        action=\"append\",\n    )\n    subparser.add_argument(\n        \"--already-done\",\n        nargs=\"+\",\n        default=[],\n        help=\"one or more collections of existing signatures to avoid recalculating\",\n    )\n    subparser.add_argument(\n        \"--license\",\n        default=\"CC0\",\n        type=str,\n        help=\"signature license. Currently only CC0 is supported.\",\n    )\n    subparser.add_argument(\n        \"--check-sequence\",\n        action=\"store_true\",\n        help=\"complain if input sequence is invalid (NOTE: only checks DNA)\",\n    )\n    file_args = subparser.add_argument_group(\"File handling options\")\n    file_args.add_argument(\n        \"-o\",\n        \"--output-signatures\",\n        help=\"output computed signatures to this file\",\n    )\n    file_args.add_argument(\n        \"--force-output-already-exists\",\n        action=\"store_true\",\n        help=\"overwrite/append to --output-signatures location\",\n    )\n    file_args.add_argument(\n        \"--ignore-missing\",\n        action=\"store_true\",\n        help=\"proceed with building possible signatures, even if some input files are missing\",\n    )\n    file_args.add_argument(\n        \"--output-csv-info\",\n        help=\"output information about what signatures need to be generated\",\n    )\n    file_args.add_argument(\n        \"--output-manifest-matching\",\n        help=\"output a manifest file of already-existing signatures\",\n    )\n    file_args.add_argument(\n        \"--report-duplicated\", action=\"store_true\", help=\"report duplicated names\"\n    )\n\n\ndef main(args):\n    import sourmash.command_sketch\n\n    return sourmash.command_sketch.fromfile(args)\n"
  },
  {
    "path": "src/sourmash/cli/sketch/protein.py",
    "content": "\"\"\"create protein signatures\"\"\"\n\nusage = \"\"\"\n\n    sourmash sketch protein data/*.fna.gz\n\nThe 'sketch protein' command reads in protein sequences and outputs protein\nsketches.\n\nBy default, 'sketch protein' uses the parameter string\n'k=10,scaled=200,noabund'.\n\nThis corresponds to an amino-acid k-mer size of 10, a scaled factor\nof 200, and no abundance tracking of k-mers. You can specify one or\nmore parameter strings of your own with -p, e.g. 'sourmash sketch\nprotein -p k=11,noabund -p k=12,scaled=100,abund'. Note that a single `-p` parameter string can contain multiple ksize values, but only a single scaled value or abundance value e.g. -p k=11,k=12,scaled=100,abund.\n\n'sourmash sketch' takes input sequences in FASTA and FASTQ,\nuncompressed or gz/bz2 compressed.\n\nPlease see the 'sketch' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/sourmash-sketch.html\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\nfrom sourmash import command_sketch\n\nassert command_sketch.DEFAULTS[\"protein\"] == \"k=10,scaled=200,noabund\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"protein\", aliases=[\"aa\", \"prot\"], usage=usage)\n    subparser.add_argument(\n        \"--license\",\n        default=\"CC0\",\n        type=str,\n        help=\"signature license. Currently only CC0 is supported.\",\n    )\n    subparser.add_argument(\n        \"-p\",\n        \"--param-string\",\n        default=[],\n        help=\"signature parameters to use.\",\n        action=\"append\",\n    )\n\n    subparser.add_argument(\"filenames\", nargs=\"*\", help=\"file(s) of sequences\")\n    file_args = subparser.add_argument_group(\"File handling options\")\n    file_args.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"recompute signatures even if the file exists\",\n    )\n    file_args.add_argument(\n        \"-o\", \"--output\", help=\"output computed signatures to this file\"\n    )\n    subparser.add_argument(\n        \"--from-file\", help=\"a text file containing a list of sequence files to load\"\n    )\n    file_args.add_argument(\n        \"--set-name\",\n        \"--name\",\n        \"--merge\",\n        dest=\"merge\",\n        type=str,\n        default=\"\",\n        metavar=\"FILE\",\n        help=\"name the output sketch as specified; note, merges all input \"\n        \"files while sketching\",\n    )\n    file_args.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output computed signatures to this directory\",\n    )\n    file_args.add_argument(\n        \"--singleton\",\n        action=\"store_true\",\n        help=\"compute a signature for each sequence record individually\",\n    )\n    file_args.add_argument(\n        \"--name-from-first\",\n        action=\"store_true\",\n        help=\"name the signature generated from each file after the first \"\n        \"record in the file\",\n    )\n    file_args.add_argument(\n        \"--randomize\",\n        action=\"store_true\",\n        help=\"shuffle the list of input filenames randomly\",\n    )\n    file_args.add_argument(\n        \"--dayhoff\",\n        action=\"store_true\",\n        help=\"compute sketches using the dayhoff alphabet instead\",\n    )\n    file_args.add_argument(\n        \"--hp\",\n        action=\"store_true\",\n        help=\"compute sketches using the dayhoff alphabet instead\",\n    )\n\n\ndef main(args):\n    import sourmash.command_sketch\n\n    return sourmash.command_sketch.protein(args)\n"
  },
  {
    "path": "src/sourmash/cli/sketch/translate.py",
    "content": "\"\"\"create protein signature from DNA/RNA sequence\"\"\"\n\nusage = \"\"\"\n\n    sourmash sketch translate data/*.fna.gz\n\nThe 'sketch translate' command reads in DNA sequences and outputs protein\nsketches.\n\nBy default, 'sketch translate' uses the parameter string\n'k=10,scaled=200,noabund'.\n\nThis corresponds to a DNA k-mer size of 30 (and an amino-acid k-mer size\nof 10), a scaled factor of 200, and no abundance tracking of\nk-mers. You can specify one or more parameter strings of your own with\n-p, e.g. 'sourmash sketch translate -p k=11,noabund -p\nk=12,scaled=100,abund'.\n\n'sourmash sketch' takes input sequences in FASTA and FASTQ,\nuncompressed or gz/bz2 compressed.\n\nPlease see the 'sketch' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/sourmash-sketch.html\n\"\"\"\n\nfrom sourmash import command_sketch\n\nassert command_sketch.DEFAULTS[\"protein\"] == \"k=10,scaled=200,noabund\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"translate\", usage=usage)\n    subparser.add_argument(\n        \"--license\",\n        default=\"CC0\",\n        type=str,\n        help=\"signature license. Currently only CC0 is supported.\",\n    )\n    subparser.add_argument(\n        \"--check-sequence\",\n        action=\"store_true\",\n        help=\"complain if input sequence is invalid DNA\",\n    )\n    subparser.add_argument(\n        \"-p\",\n        \"--param-string\",\n        default=[],\n        help=\"signature parameters to use.\",\n        action=\"append\",\n    )\n\n    subparser.add_argument(\"filenames\", nargs=\"*\", help=\"file(s) of sequences\")\n    file_args = subparser.add_argument_group(\"File handling options\")\n    file_args.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"recompute signatures even if the file exists\",\n    )\n    file_args.add_argument(\n        \"-o\", \"--output\", help=\"output computed signatures to this file\"\n    )\n    subparser.add_argument(\n        \"--from-file\", help=\"a text file containing a list of sequence files to load\"\n    )\n    file_args.add_argument(\n        \"--set-name\",\n        \"--name\",\n        \"--merge\",\n        dest=\"merge\",\n        type=str,\n        default=\"\",\n        metavar=\"FILE\",\n        help=\"name the output sketch as specified; note, merges all input \"\n        \"files while sketching\",\n    )\n    file_args.add_argument(\n        \"--output-dir\",\n        \"--outdir\",\n        help=\"output computed signatures to this directory\",\n    )\n    file_args.add_argument(\n        \"--singleton\",\n        action=\"store_true\",\n        help=\"compute a signature for each sequence record individually\",\n    )\n    file_args.add_argument(\n        \"--name-from-first\",\n        action=\"store_true\",\n        help=\"name the signature generated from each file after the first \"\n        \"record in the file\",\n    )\n    file_args.add_argument(\n        \"--randomize\",\n        action=\"store_true\",\n        help=\"shuffle the list of input filenames randomly\",\n    )\n    file_args.add_argument(\n        \"--dayhoff\",\n        action=\"store_true\",\n        help=\"compute sketches using the dayhoff alphabet instead\",\n    )\n    file_args.add_argument(\n        \"--hp\",\n        action=\"store_true\",\n        help=\"compute sketches using the dayhoff alphabet instead\",\n    )\n\n\ndef main(args):\n    import sourmash.command_sketch\n\n    return sourmash.command_sketch.translate(args)\n"
  },
  {
    "path": "src/sourmash/cli/storage/__init__.py",
    "content": "\"\"\"Define the command line interface for sourmash storage\n\nThe top level CLI is defined in ../__init__.py. This module defines the CLI for\n`sourmash storage` operations.\n\"\"\"\n\nfrom . import convert\nfrom ..utils import command_list\nfrom argparse import SUPPRESS, RawDescriptionHelpFormatter\nimport os\nimport sys\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"storage\", formatter_class=RawDescriptionHelpFormatter, usage=SUPPRESS\n    )\n    desc = \"Operations\\n\"\n    clidir = os.path.dirname(__file__)\n    ops = command_list(clidir)\n    for subcmd in ops:\n        docstring = getattr(sys.modules[__name__], subcmd).__doc__\n        helpstring = f\"sourmash storage {subcmd:s} --help\"\n        desc += f\"        {helpstring:33s} {docstring:s}\\n\"\n    s = subparser.add_subparsers(\n        title=\"Storage utilities\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=SUPPRESS,\n        description=desc,\n    )\n    for subcmd in ops:\n        getattr(sys.modules[__name__], subcmd).subparser(s)\n    subparser._action_groups.reverse()\n    subparser._optionals.title = \"Options\"\n"
  },
  {
    "path": "src/sourmash/cli/storage/convert.py",
    "content": "\"'sourmash storage convert' - convert an SBT to use a different back end.\"\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"convert\")\n    subparser.add_argument(\"sbt\", help=\"name to save SBT into\")\n    subparser.add_argument(\"-b\", \"--backend\", type=str, help=\"Backend to convert to\")\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.sbt.convert_cmd(args.sbt, args.backend)\n"
  },
  {
    "path": "src/sourmash/cli/tax/__init__.py",
    "content": "\"\"\"Define the command line interface for sourmash tax\n\nThe top level CLI is defined in ../__init__.py. This module defines the CLI for\n`sourmash tax` operations.\n\"\"\"\n\nfrom . import metagenome\nfrom . import genome\nfrom . import annotate\nfrom . import prepare\nfrom . import grep\nfrom . import summarize\n\nfrom ..utils import command_list\nfrom argparse import SUPPRESS, RawDescriptionHelpFormatter\nimport os\nimport sys\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\n        \"tax\",\n        formatter_class=RawDescriptionHelpFormatter,\n        usage=SUPPRESS,\n        aliases=[\"taxonomy\"],\n    )\n    desc = \"Operations\\n\"\n    clidir = os.path.dirname(__file__)\n    ops = command_list(clidir)\n    for subcmd in ops:\n        docstring = getattr(sys.modules[__name__], subcmd).__doc__\n        helpstring = f\"sourmash tax {subcmd:s} --help\"\n        desc += f\"        {helpstring:33s} {docstring:s}\\n\"\n    s = subparser.add_subparsers(\n        title=\"Integrate taxonomy information based on 'gather' results\",\n        dest=\"subcmd\",\n        metavar=\"subcmd\",\n        help=SUPPRESS,\n        description=desc,\n    )\n    for subcmd in ops:\n        getattr(sys.modules[__name__], subcmd).subparser(s)\n    subparser._action_groups.reverse()\n    subparser._optionals.title = \"Options\"\n"
  },
  {
    "path": "src/sourmash/cli/tax/annotate.py",
    "content": "\"\"\"annotate gather results with taxonomy information\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax annotate --gather-csv <gather_csv> [ ... ] --taxonomy-csv <taxonomy_csv> [ ... ]\n\nThe 'tax annotate' command reads in gather results CSVs and annotates them\n with taxonomic information.\n\nBy default, 'tax annotate' produces a gather CSV with an additional 'lineage'\n column containing the taxonomic information for each database match.\n\nPlease see the 'tax annotate' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-annotate-annotates-gather-output-with-taxonomy\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"annotate\", aliases=[\"annotate\"], usage=usage)\n    subparser.add_argument(\n        \"-g\",\n        \"--gather-csv\",\n        nargs=\"*\",\n        default=[],\n        action=\"extend\",\n        help=\"CSV output files from sourmash gather\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        metavar=\"FILE\",\n        default=None,\n        help=\"input many gather results as a text file, with one gather CSV per line\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--taxonomy-csv\",\n        \"--taxonomy\",\n        metavar=\"FILE\",\n        nargs=\"*\",\n        required=True,\n        action=\"extend\",\n        help=\"database lineages CSV\",\n    )\n    subparser.add_argument(\n        \"-o\", \"--output-dir\", default=\"\", help=\"directory for output files\"\n    )\n    subparser.add_argument(\n        \"--keep-full-identifiers\",\n        action=\"store_true\",\n        help=\"do not split identifiers on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"after splitting identifiers, do not remove accession versions\",\n    )\n    subparser.add_argument(\n        \"--fail-on-missing-taxonomy\",\n        action=\"store_true\",\n        help=\"fail quickly if taxonomy is not available for an identifier\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in file and taxonomy loading\",\n    )\n    subparser.add_argument(\n        \"--lins\",\n        \"--lin-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use LIN taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain LIN lineage information.\",\n    )\n    subparser.add_argument(\n        \"--ictv\",\n        \"--ictv-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use ICTV taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain ICTV ranks.\",\n    )\n\n\ndef main(args):\n    if not args.gather_csv and not args.from_file:\n        raise ValueError(\n            \"No gather CSVs found! Please input via '-g' or '--from-file'.\"\n        )\n    return sourmash.tax.__main__.annotate(args)\n"
  },
  {
    "path": "src/sourmash/cli/tax/genome.py",
    "content": "\"\"\"classify genomes from gather results\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax genome --gather-csv <gather_csv> [ ... ] --taxonomy-csv <taxonomy-csv> [ ... ]\n\nThe 'tax genome' command reads in genome gather result CSVs and reports likely\nclassification for each query genome.\n\nBy default, classification uses a containment threshold of 0.1,\nmeaning at least 10 percent of the query was covered by matches with\nthe reported taxonomic rank and lineage.  You can specify an alternate\nclassification threshold or force classification by taxonomic rank\ninstead, e.g. at species or genus-level.\n\nThe default output format consists of five columns,\n 'query_name,status,rank,fraction,lineage', where 'fraction' is the fraction\n of the query matched to the reported rank and lineage. The 'status' column\n provides additional information on the classification, and can be:\n  - 'match' - this query was classified\n  - 'nomatch'- this query could not be classified\n  - 'below_threshold' - this query was classified at the specified rank,\n     but the query fraction matched was below the containment threshold\n\nUse '-F human' to display human-readable output instead.\n\nOptionally, you can report classifications in 'krona' format, but note\nthat this forces classification by rank, rather than containment threshold.\n\nPlease see the 'tax genome' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-genome-classify-a-genome-using-gather-results\n\"\"\"\n\nimport argparse\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\nfrom sourmash.cli.utils import (\n    add_tax_threshold_arg,\n    check_rank,\n    check_tax_outputs,\n    add_rank_arg,\n    add_v5_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"genome\", aliases=[\"classify\"], usage=usage)\n    subparser.add_argument(\n        \"-g\",\n        \"--gather-csv\",\n        action=\"extend\",\n        nargs=\"*\",\n        default=[],\n        help=\"CSVs output by sourmash gather for this sample\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        metavar=\"FILE\",\n        default=None,\n        help=\"input many gather results as a text file, with one gather CSV per line\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--taxonomy-csv\",\n        \"--taxonomy\",\n        metavar=\"FILE\",\n        nargs=\"*\",\n        required=True,\n        action=\"extend\",\n        help=\"database lineages CSV\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output-base\",\n        default=\"-\",\n        help=\"base filepath for output file(s) (default stdout)\",\n    )\n    subparser.add_argument(\n        \"--output-dir\", default=\"\", help=\"directory for output files\"\n    )\n    subparser.add_argument(\n        \"--keep-full-identifiers\",\n        action=\"store_true\",\n        help=\"do not split identifiers on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"after splitting identifiers, do not remove accession versions\",\n    )\n    subparser.add_argument(\n        \"--fail-on-missing-taxonomy\",\n        action=\"store_true\",\n        help=\"fail quickly if taxonomy is not available for an identifier\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--output-format\",\n        default=[],\n        nargs=\"*\",\n        action=\"extend\",\n        choices=[\"csv_summary\", \"krona\", \"human\", \"lineage_csv\"],\n        help=\"choose output format(s)\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past survivable errors in loading taxonomy database or gather results\",\n    )\n    subparser.add_argument(\n        \"--lins\",\n        \"--lin-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use LIN taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain 'lin' lineage information.\",\n    )\n    subparser.add_argument(\n        \"--lingroup\",\n        \"--lingroups\",\n        metavar=\"FILE\",\n        default=None,\n        help=\"CSV containing 'name', 'lin' columns, where 'lin' is the lingroup prefix. Will restrict classification to these groups.\",\n    )\n    subparser.add_argument(\n        \"--ictv\",\n        \"--ictv-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use ICTV taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain ICTV ranks.\",\n    )\n    add_tax_threshold_arg(subparser, 0.1)\n    add_rank_arg(subparser)\n    add_v5_args(subparser)\n\n\ndef main(args):\n    try:\n        if not args.gather_csv and not args.from_file:\n            raise ValueError(\n                \"No gather CSVs found! Please input via '-g' or '--from-file'.\"\n            )\n        if args.rank:\n            args.rank = check_rank(args)\n        args.output_format = check_tax_outputs(args, rank_required=[\"krona\"])\n\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        import sys\n\n        sys.exit(-1)\n\n    return sourmash.tax.__main__.genome(args)\n"
  },
  {
    "path": "src/sourmash/cli/tax/grep.py",
    "content": "\"\"\"search taxonomies and output picklists.\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax grep <term> --taxonomy-csv <taxonomy_file> [ ... ]\n\n`sourmash tax grep` searches taxonomies for matching strings,\noptionally restricting the string search to a specific taxonomic rank.\nIt creates new files containing matching taxonomic entries; these new\nfiles can serve as taxonomies and can also be used as picklists.\n\n`tax grep` only searches taxonomic ranks, not identifier strings.\nUse `sig grep` to search for identifiers in sketch collections.\n\nPlease see the 'tax grep' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-grep-subset-taxonomies-and-create-picklists-based-on-taxonomy-string-matches\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"grep\", usage=usage)\n    subparser.add_argument(\"pattern\")\n    subparser.add_argument(\n        \"-r\",\n        \"--rank\",\n        help=\"search only this rank\",\n        choices=[\n            \"superkingdom\",\n            \"phylum\",\n            \"class\",\n            \"order\",\n            \"family\",\n            \"genus\",\n            \"species\",\n        ],\n    )\n    subparser.add_argument(\n        \"-v\", \"--invert-match\", help=\"select non-matching lineages\", action=\"store_true\"\n    )\n    subparser.add_argument(\n        \"-i\",\n        \"--ignore-case\",\n        help=\"ignore case distinctions (search lower and upper case both)\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"--silent\",\n        \"--no-picklist-output\",\n        help=\"do not output picklist\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-c\",\n        \"--count\",\n        help=\"only output a count of discovered lineages; implies --silent\",\n        action=\"store_true\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--taxonomy-csv\",\n        \"--taxonomy\",\n        metavar=\"FILE\",\n        nargs=\"+\",\n        required=True,\n        action=\"extend\",\n        help=\"database lineages\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        default=\"-\",\n        help=\"output file (defaults to stdout)\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in file and taxonomy loading\",\n    )\n\n\ndef main(args):\n    return sourmash.tax.__main__.grep(args)\n"
  },
  {
    "path": "src/sourmash/cli/tax/metagenome.py",
    "content": "\"\"\"summarize metagenome gather results\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax metagenome --gather-csv <gather_csv> [ ... ] --taxonomy-csv <taxonomy-csv> [ ... ]\n\nThe 'tax metagenome' command reads in metagenome gather result CSVs and\nsummarizes by taxonomic lineage.\n\nThe default output format consists of four columns,\n 'query_name,rank,fraction,lineage', where 'fraction' is the fraction\n of the query matched to that reported rank and lineage. The summarization\n is reported for each taxonomic rank.\n\nAlternatively, you can output results at a specific rank (e.g. species)\nin 'krona', 'lineage_summary', and 'human' formats.\n\nUse '-F human' to display human-readable output.\n\nPlease see the 'tax metagenome' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-metagenome-summarize-metagenome-content-from-gather-results\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\nfrom sourmash.cli.utils import (\n    add_rank_arg,\n    check_rank,\n    check_tax_outputs,\n    add_v5_args,\n)\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"metagenome\", usage=usage)\n    subparser.add_argument(\n        \"-g\",\n        \"--gather-csv\",\n        action=\"extend\",\n        nargs=\"*\",\n        default=[],\n        help=\"CSVs from sourmash gather\",\n    )\n    subparser.add_argument(\n        \"--from-file\",\n        metavar=\"FILE\",\n        default=None,\n        help=\"input many gather results as a text file, with one gather CSV per line\",\n    )\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output-base\",\n        default=\"-\",\n        help=\"base filepath for output file(s) (default stdout)\",\n    )\n    subparser.add_argument(\n        \"--output-dir\", default=\"\", help=\"directory for output files\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--taxonomy-csv\",\n        \"--taxonomy\",\n        metavar=\"FILE\",\n        action=\"extend\",\n        nargs=\"+\",\n        required=True,\n        help=\"database lineages CSV\",\n    )\n    subparser.add_argument(\n        \"--keep-full-identifiers\",\n        action=\"store_true\",\n        help=\"do not split identifiers on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"after splitting identifiers, do not remove accession versions\",\n    )\n    subparser.add_argument(\n        \"--fail-on-missing-taxonomy\",\n        action=\"store_true\",\n        help=\"fail quickly if taxonomy is not available for an identifier\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--output-format\",\n        default=[],\n        nargs=\"*\",\n        action=\"extend\",\n        choices=[\n            \"human\",\n            \"csv_summary\",\n            \"krona\",\n            \"lineage_summary\",\n            \"kreport\",\n            \"lingroup\",\n            \"bioboxes\",\n        ],\n        help=\"choose output format(s)\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in taxonomy database loading\",\n    )\n    subparser.add_argument(\n        \"--lins\",\n        \"--lin-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use LIN taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain 'lin' lineage information.\",\n    )\n    subparser.add_argument(\n        \"--lingroup\",\n        \"--lingroups\",\n        metavar=\"FILE\",\n        default=None,\n        help=\"CSV containing 'name', 'lin' columns, where 'lin' is the lingroup prefix. For 'tax metagenome' runs with a single 'gather' file (single query), providing this file will allow us to output a 'lingroup' report containing taxonomic summarization for each group. For multiple queries, we recommend the 'csv_summary' output format.\",\n    )\n    subparser.add_argument(\n        \"--ictv\",\n        \"--ictv-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use ICTV taxonomy in place of standard taxonomic ranks. Note that the taxonomy CSV must contain ICTV ranks.\",\n    )\n    add_rank_arg(subparser)\n\n    subparser.add_argument(\n        \"--use-abundances\",\n        action=\"store_true\",\n        dest=\"use_abund\",\n        default=None,  # default: not user specified\n        help=\"use abundances from sketches if available (for krona and lineage_summary)\",\n    )\n    subparser.add_argument(\n        \"--ignore-abundances\",\n        \"--no-abundances\",\n        dest=\"use_abund\",\n        action=\"store_false\",\n        help=\"ignore abundances from sketches even if available\",\n    )\n\n    add_v5_args(subparser)\n\n\ndef main(args):\n    try:\n        if not args.gather_csv and not args.from_file:\n            raise ValueError(\n                \"No gather CSVs found! Please input via '-g' or '--from-file'.\"\n            )\n        if args.rank:\n            args.rank = check_rank(args)\n        args.output_format = check_tax_outputs(\n            args,\n            rank_required=[\"krona\", \"lineage_summary\"],\n            incompatible_with_lins=[\"bioboxes\", \"kreport\"],\n            use_lingroup_format=True,\n        )\n\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        import sys\n\n        sys.exit(-1)\n\n    return sourmash.tax.__main__.metagenome(args)\n"
  },
  {
    "path": "src/sourmash/cli/tax/prepare.py",
    "content": "\"\"\"combine multiple taxonomy databases into one.\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax prepare --taxonomy-csv <taxonomy_file> [ ... ] -o <output>\n\nThe 'tax prepare' command reads in one or more taxonomy databases\nand saves them into a new database. It can be used to combine databases\nin the desired order, as well as output different database formats.\n\nPlease see the 'tax prepare' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#sourmash-tax-prepare-prepare-and-or-combine-taxonomy-files\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"prepare\", usage=usage)\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-t\",\n        \"--taxonomy-csv\",\n        \"--taxonomy\",\n        metavar=\"FILE\",\n        nargs=\"+\",\n        required=True,\n        action=\"extend\",\n        help=\"database lineages\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output\",\n        required=True,\n        help=\"output file\",\n    )\n    subparser.add_argument(\n        \"-F\",\n        \"--database-format\",\n        help=\"format of output file; default is 'sql')\",\n        default=\"sql\",\n        choices=[\"csv\", \"sql\"],\n    )\n    subparser.add_argument(\n        \"--keep-full-identifiers\",\n        action=\"store_true\",\n        help=\"do not split identifiers on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"after splitting identifiers, do not remove accession versions\",\n    )\n    subparser.add_argument(\n        \"--fail-on-missing-taxonomy\",\n        action=\"store_true\",\n        help=\"fail quickly if taxonomy is not available for an identifier\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in file and taxonomy loading\",\n    )\n\n\ndef main(args):\n    return sourmash.tax.__main__.prepare(args)\n"
  },
  {
    "path": "src/sourmash/cli/tax/summarize.py",
    "content": "\"\"\"summarize taxonomy/lineage information\"\"\"\n\nusage = \"\"\"\n\n    sourmash tax summarize <taxonomy_file> [ <more files> ... ]\n\nThe 'tax summarize' command reads in one or more taxonomy databases\nor lineage files (produced by 'tax annotate'), combines them,\nand produces a human readable summary.\n\nPlease see the 'tax summarize' documentation for more details:\n  https://sourmash.readthedocs.io/en/latest/command-line.html#command-line.html#sourmash-tax-summarize-print-summary-information-for-lineage-spreadsheets-or-taxonomy-databases\n\n\"\"\"\n\nimport sourmash\nfrom sourmash.logging import notify, print_results, error\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"summarize\", usage=usage)\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"taxonomy_files\",\n        metavar=\"FILE\",\n        nargs=\"+\",\n        action=\"extend\",\n        help=\"database lineages\",\n    )\n    subparser.add_argument(\n        \"-o\",\n        \"--output-lineage-information\",\n        help=\"output a CSV file containing individual lineage counts\",\n    )\n    subparser.add_argument(\n        \"--keep-full-identifiers\",\n        action=\"store_true\",\n        help=\"do not split identifiers on whitespace\",\n    )\n    subparser.add_argument(\n        \"--keep-identifier-versions\",\n        action=\"store_true\",\n        help=\"after splitting identifiers, do not remove accession versions\",\n    )\n    subparser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        help=\"continue past errors in file and taxonomy loading\",\n    )\n    subparser.add_argument(\n        \"--lins\",\n        \"--lin-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use LIN taxonomy in place of standard taxonomic ranks.\",\n    )\n    subparser.add_argument(\n        \"--ictv\",\n        \"--ictv-taxonomy\",\n        action=\"store_true\",\n        default=False,\n        help=\"use ICTV taxonomy in place of standard taxonomic ranks.  Note that the taxonomy CSV must contain ICTV ranks.\",\n    )\n\n\ndef main(args):\n    return sourmash.tax.__main__.summarize(args)\n"
  },
  {
    "path": "src/sourmash/cli/utils.py",
    "content": "from glob import glob\nimport os\nimport argparse\nfrom sourmash.logging import notify\nfrom sourmash.sourmash_args import check_scaled_bounds, check_num_bounds\n\n\ndef add_moltype_args(parser):\n    parser.add_argument(\n        \"--protein\",\n        dest=\"protein\",\n        action=\"store_true\",\n        help=\"choose a protein signature; by default, a nucleotide signature is used\",\n    )\n    parser.add_argument(\n        \"--no-protein\",\n        dest=\"protein\",\n        action=\"store_false\",\n        help=\"do not choose a protein signature\",\n    )\n    parser.set_defaults(protein=False)\n\n    parser.add_argument(\n        \"--dayhoff\",\n        dest=\"dayhoff\",\n        action=\"store_true\",\n        help=\"choose Dayhoff-encoded amino acid signatures\",\n    )\n    parser.add_argument(\n        \"--no-dayhoff\",\n        dest=\"dayhoff\",\n        action=\"store_false\",\n        help=\"do not choose Dayhoff-encoded amino acid signatures\",\n    )\n    parser.set_defaults(dayhoff=False)\n\n    parser.add_argument(\n        \"--hp\",\n        \"--hydrophobic-polar\",\n        dest=\"hp\",\n        action=\"store_true\",\n        help=\"choose hydrophobic-polar-encoded amino acid signatures\",\n    )\n    parser.add_argument(\n        \"--no-hp\",\n        \"--no-hydrophobic-polar\",\n        dest=\"hp\",\n        action=\"store_false\",\n        help=\"do not choose hydrophobic-polar-encoded amino acid signatures\",\n    )\n    parser.set_defaults(hp=False)\n\n    parser.add_argument(\n        \"--skipm1n3\",\n        \"--skipmer-m1n3\",\n        dest=\"skipm1n3\",\n        action=\"store_true\",\n        help=\"choose skipmer (m1n3) signatures\",\n    )\n\n    parser.add_argument(\n        \"--no-skipm1n3\",\n        \"--no-skipmer-m1n3\",\n        dest=\"skipm1n3\",\n        action=\"store_false\",\n        help=\"do not choose skipmer (m1n3) signatures\",\n    )\n    parser.set_defaults(skipm1n3=False)\n\n    parser.add_argument(\n        \"--skipm2n3\",\n        \"--skipmer-m2n3\",\n        dest=\"skipm2n3\",\n        action=\"store_true\",\n        help=\"choose skipmer (m2n3) signatures\",\n    )\n    parser.add_argument(\n        \"--no-skipm2n3\",\n        \"--no-skipmer-m2n3\",\n        dest=\"skipm2n3\",\n        action=\"store_false\",\n        help=\"do not choose skipmer (m2n3) signatures\",\n    )\n    parser.set_defaults(skipm2n3=False)\n\n    parser.add_argument(\n        \"--dna\",\n        \"--rna\",\n        \"--nucleotide\",\n        dest=\"dna\",\n        default=None,\n        action=\"store_true\",\n        help=\"choose a nucleotide signature (default: True)\",\n    )\n    parser.add_argument(\n        \"--no-dna\",\n        \"--no-rna\",\n        \"--no-nucleotide\",\n        dest=\"dna\",\n        action=\"store_false\",\n        help=\"do not choose a nucleotide signature\",\n    )\n    parser.set_defaults(dna=None)\n\n\ndef add_construct_moltype_args(parser):\n    add_moltype_args(parser)\n    parser.set_defaults(dna=True)\n\n\ndef add_ksize_arg(parser, *, default=None):\n    \"Add -k/--ksize to argparse parsers, with specified default.\"\n    if default:\n        message = f\"k-mer size to select; default={default}\"\n    else:\n        message = \"k-mer size to select; no default.\"\n\n    parser.add_argument(\n        \"-k\",\n        \"--ksize\",\n        metavar=\"K\",\n        default=default,\n        type=int,\n        help=message,\n    )\n\n\ndef add_v5_args(parser):\n    parser.add_argument(\n        \"--v4\",\n        dest=\"cli_version\",\n        action=\"store_const\",\n        const=\"v4\",\n        default=\"v4\",\n        help=\"use sourmash v4 command-line behavior (default)\",\n    )\n    parser.add_argument(\n        \"--v5\",\n        dest=\"cli_version\",\n        action=\"store_const\",\n        const=\"v5\",\n        help=\"use sourmash v5 command-line behavior\",\n    )\n\n\n# https://stackoverflow.com/questions/55324449/how-to-specify-a-minimum-or-maximum-float-value-with-argparse#55410582\ndef range_limited_float_type(arg):\n    \"\"\"Type function for argparse - a float within some predefined bounds\"\"\"\n    min_val = 0\n    max_val = 1\n    try:\n        f = float(arg)\n    except ValueError:\n        raise argparse.ArgumentTypeError(\"\\n\\tERROR: Must be a floating point number.\")\n    if f < min_val or f > max_val:\n        raise argparse.ArgumentTypeError(\n            f\"\\n\\tERROR: Argument must be >{str(min_val)} and <{str(max_val)}.\"\n        )\n    return f\n\n\ndef add_tax_threshold_arg(parser, containment_default=0.1, ani_default=None):\n    parser.add_argument(\n        \"--containment-threshold\",\n        default=containment_default,\n        type=range_limited_float_type,\n        help=f\"minimum containment threshold for classification; default={containment_default}\",\n    )\n    parser.add_argument(\n        \"--ani-threshold\",\n        \"--aai-threshold\",\n        default=ani_default,\n        type=range_limited_float_type,\n        help=f\"minimum ANI threshold (nucleotide gather) or AAI threshold (protein gather) for classification; default={ani_default}\",\n    )\n\n\ndef add_picklist_args(parser):\n    parser.add_argument(\n        \"--picklist\",\n        default=None,\n        help=\"select signatures based on a picklist, i.e. 'file.csv:colname:coltype'\",\n    )\n    parser.add_argument(\n        \"--picklist-require-all\",\n        default=False,\n        action=\"store_true\",\n        help=\"require that all picklist values be found or else fail\",\n    )\n\n\ndef add_pattern_args(parser):\n    parser.add_argument(\n        \"--include-db-pattern\",\n        default=None,\n        help=\"search only signatures that match this pattern in name, filename, or md5\",\n    )\n    parser.add_argument(\n        \"--exclude-db-pattern\",\n        default=None,\n        help=\"search only signatures that do not match this pattern in name, filename, or md5\",\n    )\n\n\ndef opfilter(path):\n    return not path.startswith(\"__\") and path not in [\"utils\"]\n\n\ndef command_list(dirpath):\n    paths = glob(os.path.join(dirpath, \"*.py\"))\n    filenames = [os.path.basename(path) for path in paths]\n    basenames = [\n        os.path.splitext(path)[0] for path in filenames if not path.startswith(\"__\")\n    ]\n    basenames = filter(opfilter, basenames)\n    return sorted(basenames)\n\n\ndef add_scaled_arg(parser, default=None):\n    parser.add_argument(\n        \"--scaled\",\n        metavar=\"FLOAT\",\n        type=check_scaled_bounds,\n        default=default,\n        help=\"downsample to this scaled; value should be between 100 and 1e6\",\n    )\n\n\ndef add_num_arg(parser, default=0):\n    parser.add_argument(\n        \"-n\",\n        \"--num-hashes\",\n        \"--num\",\n        metavar=\"N\",\n        type=check_num_bounds,\n        default=default,\n        help=\"num value should be between 50 and 50000\",\n    )\n\n\ndef check_rank(args):\n    \"\"\"Check '--rank'/'--position'/'--lin-position' argument matches selected taxonomy.\"\"\"\n    standard_ranks = [\n        \"strain\",\n        \"species\",\n        \"genus\",\n        \"family\",\n        \"order\",\n        \"class\",\n        \"phylum\",\n        \"superkingdom\",\n    ]\n    if args.lins:\n        if args.rank.isdigit():\n            return str(args.rank)\n        raise argparse.ArgumentTypeError(\n            f\"Invalid '--rank'/'--position' input: '{args.rank}'. '--lins' is specified. Rank must be an integer corresponding to a LIN position.\"\n        )\n    elif args.rank in standard_ranks:\n        return args.rank\n    else:\n        raise argparse.ArgumentTypeError(\n            f\"Invalid '--rank'/'--position' input: '{args.rank}'. Please choose: 'strain', 'species', 'genus', 'family', 'order', 'class', 'phylum', 'superkingdom'\"\n        )\n\n\ndef add_rank_arg(parser):\n    parser.add_argument(\n        \"-r\",\n        \"--rank\",\n        \"--position\",\n        \"--lin-position\",\n        help=\"For non-default output formats. Classify to this rank (tax genome) or summarize taxonomy at this rank and above (tax metagenome). \\\n              Note that the taxonomy CSV must contain lineage information at this rank, and that LIN positions start at 0. \\\n              Choices: 'strain', 'species', 'genus', 'family', 'order', 'class', 'phylum', 'superkingdom' or an integer LIN position\",\n    )\n\n\ndef check_tax_outputs(\n    args,\n    rank_required=[\"krona\"],\n    incompatible_with_lins=None,\n    use_lingroup_format=False,\n):\n    \"Handle ouput format combinations\"\n    # check that rank is passed for formats requiring rank.\n    if not args.rank:\n        if any(x in rank_required for x in args.output_format):\n            raise ValueError(\n                f\"Rank (--rank) is required for {', '.join(rank_required)} output formats.\"\n            )\n\n    if args.lins:\n        # check for outputs incompatible with lins\n        if incompatible_with_lins:\n            if any(x in args.output_format for x in incompatible_with_lins):\n                raise ValueError(\n                    f\"The following outputs are incompatible with '--lins': : {', '.join(incompatible_with_lins)}\"\n                )\n        # check that lingroup file exists if needed\n        if args.lingroup:\n            if use_lingroup_format and \"lingroup\" not in args.output_format:\n                args.output_format.append(\"lingroup\")\n        elif \"lingroup\" in args.output_format:\n            raise ValueError(\n                \"Must provide lingroup csv via '--lingroup' in order to output a lingroup report.\"\n            )\n    elif args.lingroup or \"lingroup\" in args.output_format:\n        raise ValueError(\n            \"Must enable LIN taxonomy via '--lins' in order to use lingroups.\"\n        )\n\n    # check that only one output format is specified if writing to stdout\n    if len(args.output_format) > 1:\n        if args.output_base == \"-\":\n            raise ValueError(\n                f\"Writing to stdout is incompatible with multiple output formats {args.output_format}\"\n            )\n    elif not args.output_format:\n        if args.cli_version == \"v5\":\n            args.output_format = [\"human\"]\n        else:\n            args.output_format = [\"csv_summary\"]\n\n    return args.output_format\n"
  },
  {
    "path": "src/sourmash/cli/watch.py",
    "content": "\"\"\"classify a stream of sequences\"\"\"\n\nfrom sourmash.cli.utils import add_ksize_arg, add_moltype_args, add_num_arg\n\n\ndef subparser(subparsers):\n    subparser = subparsers.add_parser(\"watch\")\n    subparser.add_argument(\"sbt_name\", help=\"name of SBT to search\")\n    subparser.add_argument(\"inp_file\", nargs=\"?\", default=\"/dev/stdin\")\n    subparser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n    )\n    subparser.add_argument(\n        \"-o\", \"--output\", help=\"save signature generated from data here\"\n    )\n    subparser.add_argument(\n        \"--threshold\",\n        metavar=\"T\",\n        default=0.05,\n        type=float,\n        help=\"minimum threshold for matches (default=0.05)\",\n    )\n    subparser.add_argument(\n        \"--input-is-protein\",\n        action=\"store_true\",\n        help=\"Consume protein sequences - no translation needed\",\n    )\n    add_moltype_args(subparser)\n    subparser.add_argument(\n        \"--name\", type=str, default=\"stdin\", help=\"name to use for generated signature\"\n    )\n    add_ksize_arg(subparser)\n    add_num_arg(subparser, 500)\n\n\ndef main(args):\n    import sourmash\n\n    return sourmash.commands.watch(args)\n"
  },
  {
    "path": "src/sourmash/command_compute.py",
    "content": "\"\"\"\nFunctions implementing the 'compute' command and related functions.\n\"\"\"\n\nimport os\nimport os.path\nimport sys\nimport random\nimport screed\n\nfrom . import sourmash_args\nfrom .signature import SourmashSignature\nfrom .logging import notify, error, set_quiet\nfrom .utils import RustObject\nfrom ._lowlevel import ffi, lib\n\n\nfrom .command_sketch import (\n    _compute_individual,\n    _compute_merged,\n    ComputeParameters,\n    add_seq,\n    set_sig_name,\n    DEFAULT_MMHASH_SEED,\n)\n\n\ndef compute(args):\n    \"\"\"Compute the signature for one or more files.\n\n    Use cases:\n        sourmash compute multiseq.fa              => multiseq.fa.sig, etc.\n        sourmash compute genome.fa --singleton    => genome.fa.sig\n        sourmash compute file1.fa file2.fa -o file.sig\n            => creates one output file file.sig, with one signature for each\n               input file.\n        sourmash compute file1.fa file2.fa --merge merged -o file.sig\n            => creates one output file file.sig, with all sequences from\n               file1.fa and file2.fa combined into one signature.\n    \"\"\"\n    set_quiet(args.quiet)\n\n    if args.license != \"CC0\":\n        error(\"error: sourmash only supports CC0-licensed signatures. sorry!\")\n        sys.exit(-1)\n\n    if args.input_is_protein and args.dna:\n        notify(\"WARNING: input is protein, turning off nucleotide hashing\")\n        args.dna = False\n        args.protein = True\n\n    if args.scaled:\n        if args.scaled < 1:\n            error(\"ERROR: --scaled value must be >= 1\")\n            sys.exit(-1)\n        if args.scaled != round(args.scaled, 0):\n            error(\"ERROR: --scaled value must be integer value\")\n            sys.exit(-1)\n        if args.scaled >= 1e9:\n            notify(\"WARNING: scaled value is nonsensical!? Continuing anyway.\")\n\n        if args.num_hashes != 0:\n            notify(\"setting num_hashes to 0 because --scaled is set\")\n            args.num_hashes = 0\n\n    notify(\"computing signatures for files: {}\", \", \".join(args.filenames))\n\n    if args.randomize:\n        notify(\"randomizing file list because of --randomize\")\n        random.shuffle(args.filenames)\n\n    # get list of k-mer sizes for which to compute sketches\n    ksizes = args.ksizes\n\n    notify(\"Computing signature for ksizes: {}\", str(ksizes))\n    num_sigs = 0\n    if args.dna and args.protein:\n        notify(\"Computing both nucleotide and protein signatures.\")\n        num_sigs = 2 * len(ksizes)\n    elif args.dna and args.dayhoff:\n        notify(\"Computing both nucleotide and Dayhoff-encoded protein signatures.\")\n        num_sigs = 2 * len(ksizes)\n    elif args.dna and args.hp:\n        notify(\"Computing both nucleotide and hp-encoded protein signatures.\")\n        num_sigs = 2 * len(ksizes)\n    elif args.dna:\n        notify(\"Computing only nucleotide (and not protein) signatures.\")\n        num_sigs = len(ksizes)\n    elif args.protein:\n        notify(\"Computing only protein (and not nucleotide) signatures.\")\n        num_sigs = len(ksizes)\n    elif args.dayhoff:\n        notify(\n            \"Computing only Dayhoff-encoded protein (and not nucleotide) signatures.\"\n        )\n        num_sigs = len(ksizes)\n    elif args.hp:\n        notify(\"Computing only hp-encoded protein (and not nucleotide) signatures.\")\n        num_sigs = len(ksizes)\n\n    if args.protein or args.dayhoff or args.hp:\n        notify(\"\")\n        notify(\n            \"WARNING: you are using 'compute' to make a protein/dayhoff/hp signature,\"\n        )\n        notify(\"WARNING: but the meaning of ksize has changed in 4.0. Please see the\")\n        notify(\"WARNING: migration guide to sourmash v4.0 at http://sourmash.rtfd.io/\")\n        notify(\"\")\n        bad_ksizes = [str(k) for k in ksizes if k % 3 != 0]\n        if bad_ksizes:\n            error(\"protein ksizes must be divisible by 3, sorry!\")\n            error(\"bad ksizes: {}\", \", \".join(bad_ksizes))\n            sys.exit(-1)\n\n    notify(\"Computing a total of {} signature(s) for each input.\", num_sigs)\n\n    if num_sigs == 0:\n        error(\"...nothing to calculate!? Exiting!\")\n        sys.exit(-1)\n\n    if args.merge and not args.output:\n        error(\"ERROR: must specify -o with --merge\")\n        sys.exit(-1)\n\n    if args.output and args.output_dir:\n        error(\"ERROR: --output-dir doesn't make sense with -o/--output\")\n        sys.exit(-1)\n\n    if args.track_abundance:\n        notify(\"Tracking abundance of input k-mers.\")\n\n    signatures_factory = _signatures_for_compute_factory(args)\n\n    if args.merge:  # single name specified - combine all\n        _compute_merged(args, signatures_factory)\n    else:  # compute individual signatures\n        _compute_individual(args, signatures_factory)\n\n\nclass _signatures_for_compute_factory:\n    \"Build signatures on demand, based on args input to 'compute'.\"\n\n    def __init__(self, args):\n        self.args = args\n\n    def __call__(self):\n        args = self.args\n        params = ComputeParameters(\n            ksizes=args.ksizes,\n            seed=args.seed,\n            protein=args.protein,\n            dayhoff=args.dayhoff,\n            hp=args.hp,\n            dna=args.dna,\n            num_hashes=args.num_hashes,\n            track_abundance=args.track_abundance,\n            scaled=args.scaled,\n        )\n        sig = SourmashSignature.from_params(params)\n        return [sig]\n\n\ndef _compute_individual(args, signatures_factory):\n    # this is where output signatures will go.\n    save_sigs = None\n\n    # track: is this the first file? in cases where we have empty inputs,\n    # we don't want to open any outputs.\n    first_file_for_output = True\n\n    # if args.output is set, we are aggregating all output to a single file.\n    # do not open a new output file for each input.\n    open_output_each_time = True\n    if args.output:\n        open_output_each_time = False\n\n    for filename in args.filenames:\n        if open_output_each_time:\n            # for each input file, construct output filename\n            sigfile = os.path.basename(filename) + \".sig\"\n            if args.output_dir:\n                sigfile = os.path.join(args.output_dir, sigfile)\n\n            # does it already exist? skip if so.\n            if os.path.exists(sigfile) and not args.force:\n                notify(\"skipping {} - already done\", filename)\n                continue  # go on to next file.\n\n            # nope? ok, let's save to it.\n            assert not save_sigs\n            save_sigs = sourmash_args.SaveSignaturesToLocation(sigfile)\n\n        #\n        # calculate signatures!\n        #\n\n        # now, set up to iterate over sequences.\n        with screed.open(filename) as screed_iter:\n            if not screed_iter:\n                notify(f\"no sequences found in '{filename}'?!\")\n                continue\n\n            # open output for signatures\n            if open_output_each_time:\n                save_sigs.open()\n            # or... is this the first time to write something to args.output?\n            elif first_file_for_output:\n                save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n                save_sigs.open()\n                first_file_for_output = False\n\n            # make a new signature for each sequence?\n            if args.singleton:\n                n_calculated = 0\n                for n, record in enumerate(screed_iter):\n                    sigs = signatures_factory()\n                    try:\n                        add_seq(\n                            sigs,\n                            record.sequence,\n                            args.input_is_protein,\n                            args.check_sequence,\n                        )\n                    except ValueError as exc:\n                        error(f\"ERROR when reading from '{filename}' - \")\n                        error(str(exc))\n                        sys.exit(-1)\n\n                    n_calculated += len(sigs)\n                    set_sig_name(sigs, filename, name=record.name)\n                    save_sigs_to_location(sigs, save_sigs)\n\n                notify(\n                    \"calculated {} signatures for {} sequences in {}\",\n                    n_calculated,\n                    n + 1,\n                    filename,\n                )\n\n            # nope; make a single sig for the whole file\n            else:\n                sigs = signatures_factory()\n\n                # consume & calculate signatures\n                notify(f\"... reading sequences from {filename}\")\n                name = None\n                for n, record in enumerate(screed_iter):\n                    if n % 10000 == 0:\n                        if n:\n                            notify(\"\\r...{} {}\", filename, n, end=\"\")\n                        elif args.name_from_first:\n                            name = record.name\n\n                    try:\n                        add_seq(\n                            sigs,\n                            record.sequence,\n                            args.input_is_protein,\n                            args.check_sequence,\n                        )\n                    except ValueError as exc:\n                        error(f\"ERROR when reading from '{filename}' - \")\n                        error(str(exc))\n                        sys.exit(-1)\n\n                notify(\"...{} {} sequences\", filename, n, end=\"\")\n\n                set_sig_name(sigs, filename, name)\n                save_sigs_to_location(sigs, save_sigs)\n\n                notify(\n                    f\"calculated {len(sigs)} signatures for {n + 1} sequences in {filename}\"\n                )\n\n        # if not args.output, close output for every input filename.\n        if open_output_each_time:\n            save_sigs.close()\n            notify(\n                f\"saved {len(save_sigs)} signature(s) to '{save_sigs.location}'. Note: signature license is CC0.\"\n            )\n            save_sigs = None\n\n    # if --output-dir specified, all collected signatures => args.output,\n    # and we need to close here.\n    if args.output and save_sigs is not None:\n        save_sigs.close()\n        notify(\n            f\"saved {len(save_sigs)} signature(s) to '{save_sigs.location}'. Note: signature license is CC0.\"\n        )\n\n\ndef _compute_merged(args, signatures_factory):\n    # make a signature for the whole file\n    sigs = signatures_factory()\n\n    total_seq = 0\n    for filename in args.filenames:\n        # consume & calculate signatures\n        notify(\"... reading sequences from {}\", filename)\n\n        n = None\n        with screed.open(filename) as f:\n            for n, record in enumerate(f):\n                if n % 10000 == 0 and n:\n                    notify(\"\\r... {} {}\", filename, n, end=\"\")\n\n                add_seq(\n                    sigs, record.sequence, args.input_is_protein, args.check_sequence\n                )\n        if n is not None:\n            notify(\"... {} {} sequences\", filename, n + 1)\n            total_seq += n + 1\n        else:\n            notify(f\"no sequences found in '{filename}'?!\")\n\n    if total_seq:\n        set_sig_name(sigs, filename, name=args.merge)\n        notify(\n            \"calculated 1 signature for {} sequences taken from {} files\",\n            total_seq,\n            len(args.filenames),\n        )\n\n        # at end, save!\n        save_siglist(sigs, args.output)\n\n\ndef add_seq(sigs, seq, input_is_protein, check_sequence):\n    for sig in sigs:\n        if input_is_protein:\n            sig.add_protein(seq)\n        else:\n            sig.add_sequence(seq, not check_sequence)\n\n\ndef set_sig_name(sigs, filename, name=None):\n    if filename == \"-\":  # if stdin, set filename to empty.\n        filename = \"\"\n    for sig in sigs:\n        if name is not None:\n            sig._name = name\n\n        sig.filename = filename\n\n\ndef save_siglist(siglist, sigfile_name):\n    \"Save multiple signatures to a filename.\"\n\n    # save!\n    with sourmash_args.SaveSignaturesToLocation(sigfile_name) as save_sig:\n        for ss in siglist:\n            save_sig.add(ss)\n\n        notify(f\"saved {len(save_sig)} signature(s) to '{save_sig.location}'\")\n\n\ndef save_sigs_to_location(siglist, save_sig):\n    \"Save multiple signatures to an already-open location.\"\n    import sourmash\n\n    for ss in siglist:\n        save_sig.add(ss)\n\n\nclass ComputeParameters(RustObject):\n    __dealloc_func__ = lib.computeparams_free\n\n    def __init__(\n        self,\n        *,\n        ksizes=(21, 31, 51),\n        seed=42,\n        protein=False,\n        dayhoff=False,\n        hp=False,\n        dna=True,\n        num_hashes=500,\n        track_abundance=False,\n        scaled=0,\n    ):\n        self._objptr = lib.computeparams_new()\n\n        self.seed = seed\n        self.ksizes = ksizes\n        self.protein = protein\n        self.dayhoff = dayhoff\n        self.hp = hp\n        self.dna = dna\n        self.num_hashes = num_hashes\n        self.track_abundance = track_abundance\n        self.scaled = scaled\n\n    @classmethod\n    def from_manifest_row(cls, row):\n        \"convert a CollectionManifest row into a ComputeParameters object\"\n        is_dna = is_protein = is_dayhoff = is_hp = False\n        if row[\"moltype\"] == \"DNA\":\n            is_dna = True\n        elif row[\"moltype\"] == \"protein\":\n            is_protein = True\n        elif row[\"moltype\"] == \"hp\":\n            is_hp = True\n        elif row[\"moltype\"] == \"dayhoff\":\n            is_dayhoff = True\n        else:\n            assert 0\n\n        if is_dna:\n            ksize = row[\"ksize\"]\n        else:\n            ksize = row[\"ksize\"] * 3\n\n        p = cls(\n            ksizes=[ksize],\n            seed=DEFAULT_MMHASH_SEED,\n            protein=is_protein,\n            dayhoff=is_dayhoff,\n            hp=is_hp,\n            dna=is_dna,\n            num_hashes=row[\"num\"],\n            track_abundance=row[\"with_abundance\"],\n            scaled=row[\"scaled\"],\n        )\n\n        return p\n\n    def to_param_str(self):\n        \"Convert object to equivalent params str.\"\n        pi = []\n\n        if self.dna:\n            pi.append(\"dna\")\n        elif self.protein:\n            pi.append(\"protein\")\n        elif self.hp:\n            pi.append(\"hp\")\n        elif self.dayhoff:\n            pi.append(\"dayhoff\")\n        else:\n            assert 0  # must be one of the previous\n\n        if self.dna:\n            kstr = [f\"k={k}\" for k in self.ksizes]\n        else:\n            # for protein, divide ksize by three.\n            kstr = [f\"k={k // 3}\" for k in self.ksizes]\n        assert kstr\n        pi.extend(kstr)\n\n        if self.num_hashes != 0:\n            pi.append(f\"num={self.num_hashes}\")\n        elif self.scaled != 0:\n            pi.append(f\"scaled={self.scaled}\")\n        else:\n            assert 0\n\n        if self.track_abundance:\n            pi.append(\"abund\")\n        # noabund is default\n\n        if self.seed != DEFAULT_MMHASH_SEED:\n            pi.append(f\"seed={self.seed}\")\n        # self.seed\n\n        return \",\".join(pi)\n\n    def __repr__(self):\n        return f\"ComputeParameters(ksizes={self.ksizes}, seed={self.seed}, protein={self.protein}, dayhoff={self.dayhoff}, hp={self.hp}, dna={self.dna}, num_hashes={self.num_hashes}, track_abundance={self.track_abundance}, scaled={self.scaled})\"\n\n    def __eq__(self, other):\n        return (\n            self.ksizes == other.ksizes\n            and self.seed == other.seed\n            and self.protein == other.protein\n            and self.dayhoff == other.dayhoff\n            and self.hp == other.hp\n            and self.dna == other.dna\n            and self.num_hashes == other.num_hashes\n            and self.track_abundance == other.track_abundance\n            and self.scaled == other.scaled\n        )\n\n    @staticmethod\n    def from_args(args):\n        ptr = lib.computeparams_new()\n        ret = ComputeParameters._from_objptr(ptr)\n\n        for arg, value in vars(args).items():\n            try:\n                getattr(type(ret), arg).fset(ret, value)\n            except AttributeError:\n                pass\n\n        return ret\n\n    @property\n    def seed(self):\n        return self._methodcall(lib.computeparams_seed)\n\n    @seed.setter\n    def seed(self, v):\n        return self._methodcall(lib.computeparams_set_seed, v)\n\n    @property\n    def ksizes(self):\n        size = ffi.new(\"uintptr_t *\")\n        ksizes_ptr = self._methodcall(lib.computeparams_ksizes, size)\n        size = size[0]\n        ksizes = ffi.unpack(ksizes_ptr, size)\n        lib.computeparams_ksizes_free(ksizes_ptr, size)\n        return ksizes\n\n    @ksizes.setter\n    def ksizes(self, v):\n        return self._methodcall(lib.computeparams_set_ksizes, list(v), len(v))\n\n    @property\n    def protein(self):\n        return self._methodcall(lib.computeparams_protein)\n\n    @protein.setter\n    def protein(self, v):\n        return self._methodcall(lib.computeparams_set_protein, v)\n\n    @property\n    def dayhoff(self):\n        return self._methodcall(lib.computeparams_dayhoff)\n\n    @dayhoff.setter\n    def dayhoff(self, v):\n        return self._methodcall(lib.computeparams_set_dayhoff, v)\n\n    @property\n    def hp(self):\n        return self._methodcall(lib.computeparams_hp)\n\n    @hp.setter\n    def hp(self, v):\n        return self._methodcall(lib.computeparams_set_hp, v)\n\n    @property\n    def dna(self):\n        return self._methodcall(lib.computeparams_dna)\n\n    @dna.setter\n    def dna(self, v):\n        return self._methodcall(lib.computeparams_set_dna, v)\n\n    @property\n    def moltype(self):\n        if self.dna:\n            moltype = \"DNA\"\n        elif self.protein:\n            moltype = \"protein\"\n        elif self.hp:\n            moltype = \"hp\"\n        elif self.dayhoff:\n            moltype = \"dayhoff\"\n        else:\n            assert 0\n\n        return moltype\n\n    @property\n    def num_hashes(self):\n        return self._methodcall(lib.computeparams_num_hashes)\n\n    @num_hashes.setter\n    def num_hashes(self, v):\n        return self._methodcall(lib.computeparams_set_num_hashes, v)\n\n    @property\n    def track_abundance(self):\n        return self._methodcall(lib.computeparams_track_abundance)\n\n    @track_abundance.setter\n    def track_abundance(self, v):\n        return self._methodcall(lib.computeparams_set_track_abundance, v)\n\n    @property\n    def scaled(self):\n        return self._methodcall(lib.computeparams_scaled)\n\n    @scaled.setter\n    def scaled(self, v):\n        return self._methodcall(lib.computeparams_set_scaled, int(v))\n"
  },
  {
    "path": "src/sourmash/command_sketch.py",
    "content": "\"\"\"\nFunctions implementing the 'sketch' subcommands and related functions.\n\"\"\"\n\nimport sys\nimport os\nfrom collections import defaultdict, Counter\nimport csv\nimport shlex\n\nimport screed\n\nimport sourmash\nfrom .signature import SourmashSignature\nfrom .logging import notify, error, set_quiet, print_results\nfrom sourmash import sourmash_args\nfrom sourmash.sourmash_args import check_scaled_bounds, check_num_bounds\nfrom sourmash.sig.__main__ import _summarize_manifest, _SketchInfo\nfrom sourmash.manifest import CollectionManifest\nfrom .utils import RustObject\nfrom ._lowlevel import ffi, lib\n\nDEFAULT_MMHASH_SEED = 42\n\nDEFAULTS = dict(\n    dna=\"k=31,scaled=1000,noabund\",\n    protein=\"k=10,scaled=200,noabund\",\n    dayhoff=\"k=16,scaled=200,noabund\",\n    hp=\"k=42,scaled=200,noabund\",\n    skipm1n3=\"k=21,scaled=1000,noabund\",\n    skipm2n3=\"k=21,scaled=1000,noabund\",\n)\n\n\ndef _parse_params_str(params_str):\n    \"Parse a parameter string of the form 'k=ks,num=num,scaled=scaled,abund'.\"\n    moltype = None\n    params = {}\n    params[\"ksize\"] = []\n    items = params_str.split(\",\")\n    for item in items:\n        if item == \"abund\":\n            params[\"track_abundance\"] = True\n        elif item == \"noabund\":\n            params[\"track_abundance\"] = False\n        elif item.startswith(\"k\"):\n            if len(item) < 3 or item[1] != \"=\":\n                raise ValueError(\"k takes a parameter, e.g. 'k=31'\")\n            params[\"ksize\"].append(int(item[2:]))\n        elif item.startswith(\"num\"):\n            if len(item) < 5 or item[3] != \"=\":\n                raise ValueError(\"num takes a parameter, e.g. 'num=500'\")\n            if params.get(\"scaled\"):\n                raise ValueError(\"cannot set both num and scaled in a single minhash\")\n            try:\n                num = item[4:]\n                num = int(num)\n            except ValueError:\n                raise ValueError(f\"cannot parse num='{num}' as a number\")\n\n            num = check_num_bounds(num)\n\n            params[\"num\"] = int(item[4:])\n            params[\"scaled\"] = 0\n        elif item.startswith(\"scaled\"):\n            if len(item) < 8 or item[6] != \"=\":\n                raise ValueError(\"scaled takes a parameter, e.g. 'scaled=1000'\")\n            if params.get(\"num\"):\n                raise ValueError(\"cannot set both num and scaled in a single minhash\")\n            try:\n                scaled = item[7:]\n                scaled = int(scaled)\n            except ValueError:\n                raise ValueError(f\"cannot parse scaled='{scaled}' as an integer\")\n\n            scaled = check_scaled_bounds(scaled)\n\n            params[\"scaled\"] = scaled\n            params[\"num\"] = 0\n        elif item.startswith(\"seed\"):\n            if len(item) < 6 or item[4] != \"=\":\n                raise ValueError(\"seed takes a parameter, e.g. 'seed=42'\")\n            params[\"seed\"] = int(item[5:])\n        elif item in (\"protein\", \"dayhoff\", \"hp\", \"dna\"):\n            moltype = item\n        elif item in (\"skipm1n3\", \"skipm2n3\"):\n            moltype = item\n        else:\n            raise ValueError(f\"unknown component '{item}' in params string\")\n\n    return moltype, params\n\n\nclass _signatures_for_sketch_factory:\n    \"Build sigs on demand, based on args input to 'sketch'.\"\n\n    def __init__(self, params_str_list, default_moltype):\n        # first, set up defaults per-moltype\n        defaults = {}\n        for moltype, pstr in DEFAULTS.items():\n            mt, d = _parse_params_str(pstr)\n            assert mt is None  # defaults cannot have moltype set!\n            defaults[moltype] = d\n        self.defaults = defaults\n\n        # next, fill out params_list\n        self.params_list = []\n        self.mult_ksize_by_3 = True\n\n        if params_str_list:\n            # parse each params_str passed in, using default_moltype if none\n            # provided.\n            for params_str in params_str_list:\n                moltype, params = _parse_params_str(params_str)\n                if (\n                    moltype\n                    and moltype not in (\"dna\", \"skipm1n3\", \"skipm2n3\")\n                    and default_moltype == \"dna\"\n                ):\n                    raise ValueError(\n                        f\"Incompatible sketch type ({default_moltype}) and parameter override ({moltype}) in '{params_str}'; maybe use 'sketch translate'?\"\n                    )\n                elif (\n                    moltype == \"dna\"\n                    and default_moltype\n                    and default_moltype not in (\"dna\", \"skipm1n3\", \"skipm2n3\")\n                ):\n                    raise ValueError(\n                        f\"Incompatible sketch type ({default_moltype}) and parameter override ({moltype}) in '{params_str}'\"\n                    )\n                elif moltype is None:\n                    if default_moltype is None:\n                        raise ValueError(\n                            \"No default moltype and none specified in param string\"\n                        )\n                    moltype = default_moltype\n\n                self.params_list.append((moltype, params))\n        else:\n            if default_moltype is None:\n                raise ValueError(\n                    \"No default moltype and none specified in param string\"\n                )\n            # no params str? default to a single sig, using default_moltype.\n            self.params_list.append((default_moltype, {}))\n\n    def get_compute_params(self, *, split_ksizes=False):\n        for moltype, params_d in self.params_list:\n            # get defaults for this moltype from self.defaults:\n            default_params = self.defaults[moltype]\n            def_seed = default_params.get(\"seed\", DEFAULT_MMHASH_SEED)\n            def_num = default_params.get(\"num\", 0)\n            def_abund = default_params[\"track_abundance\"]\n            def_scaled = default_params.get(\"scaled\", 0)\n            def_dna = default_params.get(\"is_dna\", moltype == \"dna\")\n            def_protein = default_params.get(\"is_protein\", moltype == \"protein\")\n            def_dayhoff = default_params.get(\"is_dayhoff\", moltype == \"dayhoff\")\n            def_hp = default_params.get(\"is_hp\", moltype == \"hp\")\n            def_skipm1n3 = default_params.get(\"skipm1n3\", moltype == \"skipm1n3\")\n            def_skipm2n3 = default_params.get(\"skipm2n3\", moltype == \"skipm2n3\")\n\n            # handle ksize specially, for now - multiply by three?\n            def_ksizes = default_params[\"ksize\"]\n            ksizes = params_d.get(\"ksize\")\n            if not ksizes:\n                ksizes = def_ksizes\n\n            # 'command sketch' adjusts k-mer sizes by 3 if non-DNA sketch.\n            if self.mult_ksize_by_3 and not def_dna:\n                ksizes = [k * 3 for k in ksizes]\n\n            def make_param(ksizes):\n                return ComputeParameters(\n                    ksizes=ksizes,\n                    seed=params_d.get(\"seed\", def_seed),\n                    protein=def_protein,\n                    dayhoff=def_dayhoff,\n                    hp=def_hp,\n                    dna=def_dna,\n                    skipm1n3=def_skipm1n3,\n                    skipm2n3=def_skipm2n3,\n                    num_hashes=params_d.get(\"num\", def_num),\n                    track_abundance=params_d.get(\"track_abundance\", def_abund),\n                    scaled=params_d.get(\"scaled\", def_scaled),\n                )\n\n            if split_ksizes:\n                for ksize in ksizes:\n                    params_obj = make_param([ksize])\n                    yield params_obj\n            else:\n                params_obj = make_param(ksizes)\n                yield params_obj\n\n    def __call__(self, *, split_ksizes=False):\n        \"Produce a new set of signatures built to match the param strings.\"\n        sigs = []\n        for params in self.get_compute_params(split_ksizes=split_ksizes):\n            sig = SourmashSignature.from_params(params)\n            sigs.append(sig)\n\n        return sigs\n\n\ndef _add_from_file_to_filenames(args):\n    \"Add filenames from --from-file to args.filenames\"\n    from .sourmash_args import load_pathlist_from_file\n\n    if args.from_file:\n        file_list = load_pathlist_from_file(args.from_file)\n        args.filenames.extend(file_list)\n\n\ndef _execute_sketch(args, signatures_factory):\n    \"Once configured, run 'sketch' the same way underneath.\"\n    set_quiet(args.quiet)\n\n    if not args.filenames:\n        error(\"error: no input filenames provided! nothing to do - exiting.\")\n        sys.exit(-1)\n\n    if args.license != \"CC0\":\n        error(\"error: sourmash only supports CC0-licensed signatures. sorry!\")\n        sys.exit(-1)\n\n    notify(f\"computing signatures for files: {', '.join(args.filenames)}\")\n\n    if args.merge and not args.output:\n        error(\"ERROR: must specify -o with --merge\")\n        sys.exit(-1)\n\n    if args.output and args.output_dir:\n        error(\"ERROR: --output-dir doesn't make sense with -o/--output\")\n        sys.exit(-1)\n\n    # get number of output sigs:\n    num_sigs = len(signatures_factory.params_list)\n    notify(f\"Computing a total of {num_sigs} signature(s) for each input.\")\n\n    if num_sigs == 0:\n        error(\"...nothing to calculate!? Exiting!\")\n        sys.exit(-1)\n\n    if args.merge:  # single name specified - combine all\n        _compute_merged(args, signatures_factory)\n    else:  # compute individual signatures\n        _compute_individual(args, signatures_factory)\n\n\ndef dna(args):\n    \"\"\"Compute a DNA signature for one or more files.\n\n    CTB: make usable via Python?\n    \"\"\"\n    # for dna:\n    args.input_is_protein = False\n\n    try:\n        signatures_factory = _signatures_for_sketch_factory(args.param_string, \"dna\")\n    except ValueError as e:\n        error(f\"Error creating signatures: {str(e)}\")\n        sys.exit(-1)\n\n    _add_from_file_to_filenames(args)\n    _execute_sketch(args, signatures_factory)\n\n\ndef protein(args):\n    \"\"\"Compute a protein signature for one or more files.\n\n    CTB: make usable via Python?\n    \"\"\"\n    # for protein:\n    args.input_is_protein = True\n    args.check_sequence = False\n\n    # provide good defaults for dayhoff/hp/protein!\n    if args.dayhoff and args.hp:\n        raise ValueError(\"cannot set both --dayhoff and --hp\")\n    if args.dayhoff:\n        moltype = \"dayhoff\"\n    elif args.hp:\n        moltype = \"hp\"\n    else:\n        moltype = \"protein\"\n\n    try:\n        signatures_factory = _signatures_for_sketch_factory(args.param_string, moltype)\n    except ValueError as e:\n        error(f\"Error creating signatures: {str(e)}\")\n        sys.exit(-1)\n\n    _add_from_file_to_filenames(args)\n    _execute_sketch(args, signatures_factory)\n\n\ndef translate(args):\n    \"\"\"Compute protein signatures from DNA/RNA, for one or more files.\n\n    CTB: make usable via Python?\n    \"\"\"\n    # for translate:\n    args.input_is_protein = False\n\n    # provide good defaults for dayhoff/hp/protein!\n    if args.dayhoff and args.hp:\n        raise ValueError(\"cannot set both --dayhoff and --hp\")\n    if args.dayhoff:\n        moltype = \"dayhoff\"\n    elif args.hp:\n        moltype = \"hp\"\n    else:\n        moltype = \"protein\"\n\n    try:\n        signatures_factory = _signatures_for_sketch_factory(args.param_string, moltype)\n    except ValueError as e:\n        error(f\"Error creating signatures: {str(e)}\")\n        sys.exit(-1)\n\n    _add_from_file_to_filenames(args)\n    _execute_sketch(args, signatures_factory)\n\n\ndef _compute_sigs(to_build, output, *, check_sequence=False):\n    \"actually build the signatures in 'to_build' and output them to 'output'\"\n    save_sigs = sourmash_args.SaveSignaturesToLocation(output)\n    save_sigs.open()\n\n    for (name, filename), param_objs in to_build.items():\n        assert param_objs\n\n        # now, set up to iterate over sequences.\n        with screed.open(filename) as screed_iter:\n            if not screed_iter:\n                error(f\"ERROR: no sequences found in '{filename}'?!\")\n                sys.exit(-1)\n\n            # build the set of empty sigs\n            sigs = []\n\n            is_dna = param_objs[0].dna\n            for p in param_objs:\n                if p.dna:\n                    assert is_dna\n                sig = SourmashSignature.from_params(p)\n                sigs.append(sig)\n\n            input_is_protein = not is_dna\n\n            # read sequence records & sketch\n            notify(f\"... reading sequences from {filename}\")\n            for n, record in enumerate(screed_iter):\n                if n % 10000 == 0:\n                    if n:\n                        notify(\"\\r...{} {}\", filename, n, end=\"\")\n\n                try:\n                    add_seq(sigs, record.sequence, input_is_protein, check_sequence)\n                except ValueError as exc:\n                    error(f\"ERROR when reading from '{filename}' - \")\n                    error(str(exc))\n                    sys.exit(-1)\n\n            notify(\"...{} {} sequences\", filename, n, end=\"\")\n\n            set_sig_name(sigs, filename, name)\n            for sig in sigs:\n                save_sigs.add(sig)\n\n            notify(\n                f\"calculated {len(sigs)} signatures for {n + 1} sequences in {filename}\"\n            )\n\n    save_sigs.close()\n    notify(\n        f\"saved {len(save_sigs)} signature(s) to '{save_sigs.location}'. Note: signature license is CC0.\"\n    )\n\n\ndef _output_csv_info(filename, sigs_to_build):\n    \"output information about what signatures to build, in CSV format\"\n    output_n = 0\n    with sourmash_args.FileOutputCSV(filename) as csv_fp:\n        w = csv.DictWriter(\n            csv_fp,\n            fieldnames=[\"filename\", \"sketchtype\", \"output_index\", \"name\", \"param_strs\"],\n        )\n        w.writeheader()\n\n        output_n = 0\n        for (name, filename), param_objs in sigs_to_build.items():\n            param_strs = []\n\n            # should all be the same!\n            if param_objs[0].dna:\n                assert all(p.dna for p in param_objs)\n                sketchtype = \"dna\"\n            else:\n                assert not any(p.dna for p in param_objs)\n                sketchtype = \"protein\"\n\n            for p in param_objs:\n                param_strs.append(p.to_param_str())\n\n            row = dict(\n                filename=filename,\n                sketchtype=sketchtype,\n                param_strs=\"-p \" + \" -p \".join(param_strs),\n                name=name,\n                output_index=output_n,\n            )\n\n            w.writerow(row)\n\n            output_n += 1\n\n\ndef fromfile(args):\n    if args.license != \"CC0\":\n        error(\"error: sourmash only supports CC0-licensed signatures. sorry!\")\n        sys.exit(-1)\n\n    if args.output_signatures and os.path.exists(args.output_signatures):\n        if not args.force_output_already_exists:\n            error(\n                f\"** ERROR: output location '{args.output_signatures}' already exists!\"\n            )\n            error(\"** Not overwriting/appending.\")\n            error(\n                \"** Use --force-output-already-exists if you want to overwrite/append.\"\n            )\n            sys.exit(-1)\n\n    # now, create the set of desired sketch specs.\n    try:\n        # omit a default moltype - must be provided in param string.\n        sig_factory = _signatures_for_sketch_factory(args.param_string, None)\n    except ValueError as e:\n        error(f\"Error creating signatures: {str(e)}\")\n        sys.exit(-1)\n\n    # take the signatures factory => convert into a bunch of ComputeParameters\n    # objects.\n    build_params = list(sig_factory.get_compute_params(split_ksizes=True))\n\n    # confirm that they do not adjust seed, which is not supported in\n    # 'fromfile' b/c we don't store that info in manifests. (see #1849)\n    for p in build_params:\n        if p.seed != DEFAULT_MMHASH_SEED:\n            error(\"** ERROR: cannot set 'seed' in 'sketch fromfile'\")\n            sys.exit(-1)\n\n    # cross-product all of the names in the input CSV file\n    # with the sketch spec(s) provided on the command line.\n\n    to_build = defaultdict(list)\n    all_names = {}\n    total_rows = 0\n    skipped_sigs = 0\n    n_missing_name = 0\n    n_duplicate_name = 0\n    duplicate_names = set()\n\n    for csvfile in args.csvs:\n        with sourmash_args.FileInputCSV(csvfile) as r:\n            for row in r:\n                name = row[\"name\"]\n                if not name:\n                    n_missing_name += 1\n                    continue\n\n                genome = row[\"genome_filename\"]\n                proteome = row[\"protein_filename\"]\n                total_rows += 1\n\n                if name in all_names:\n                    n_duplicate_name += 1\n                    duplicate_names.add(name)\n                else:\n                    all_names[name] = (genome, proteome)\n\n    fail_exit = False\n    if n_duplicate_name:\n        if args.report_duplicated:\n            notify(\"duplicated:\\n\" + \"\\n\".join(sorted(duplicate_names)))\n        error(\n            f\"** ERROR: {n_duplicate_name} entries have duplicate 'name' records. Exiting!\"\n        )\n        fail_exit = True\n\n    if n_missing_name:\n        error(f\"** ERROR: {n_missing_name} entries have blank 'name's? Exiting!\")\n        fail_exit = True\n\n    if fail_exit:\n        sys.exit(-1)\n\n    # load manifests from '--already-done' databases => turn into\n    # ComputeParameters objects, indexed by name.\n\n    already_done = defaultdict(list)\n    already_done_rows = []\n    for filename in args.already_done:\n        idx = sourmash.load_file_as_index(filename)\n        manifest = idx.manifest\n        assert manifest\n\n        # for each manifest row,\n        for row in manifest.rows:\n            name = row[\"name\"]\n            if name:\n                # build a ComputeParameters object for later comparison\n                p = ComputeParameters.from_manifest_row(row)\n\n                # add to list for this name\n                already_done[name].append(p)\n\n                # matching name? check if we already have sig. if so, store!\n                if name in all_names:\n                    if p in build_params:\n                        already_done_rows.append(row)\n\n    already_done_manifest = CollectionManifest(already_done_rows)\n    if args.already_done:\n        notify(f\"Loaded {len(already_done)} pre-existing names from manifest(s)\")\n        notify(f\"collected {len(already_done_rows)} rows for already-done signatures.\")\n\n    ## now check which are already done and track only those that are\n    ## need to be done.\n\n    total_sigs = 0\n    missing = defaultdict(list)\n    missing_count = 0\n    for name, (genome, proteome) in all_names.items():\n        plist = already_done.get(name, [])\n\n        # check list of already done against build parameters\n        for p in build_params:\n            total_sigs += 1\n\n            # does this signature already exist?\n            if p not in plist:\n                # nope - figure out genome/proteome needed\n                filename = genome if p.dna else proteome\n                filetype = \"genome\" if p.dna else \"proteome\"\n\n                if filename:\n                    # add to build list\n                    to_build[(name, filename)].append(p)\n                else:\n                    notify(f\"WARNING: fromfile entry '{name}' is missing a {filetype}\")\n                    missing[name].append(p)\n                    missing_count += 1\n            else:\n                skipped_sigs += 1\n\n    ## we now have 'to_build' which contains the things we can build,\n    ## and 'missing', which contains anything we cannot build. Report!\n\n    notify(f\"Read {total_rows} rows, requesting that {total_sigs} signatures be built.\")\n\n    if already_done_manifest:\n        info_d = _summarize_manifest(already_done_manifest)\n        print_results(\"---\")\n        print_results(\"summary of already-done sketches:\")\n\n        for ski in info_d[\"sketch_info\"]:\n            mh_type = f\"num={ski['num']}\" if ski[\"num\"] else f\"scaled={ski['scaled']}\"\n            mh_abund = \", abund\" if ski[\"abund\"] else \"\"\n\n            sketch_str = f\"{ski['count']} sketches with {ski['moltype']}, k={ski['ksize']}, {mh_type}{mh_abund}\"\n\n            print_results(f\"   {sketch_str: <50} {ski['n_hashes']} total hashes\")\n\n        print_results(\"---\")\n\n    if args.output_manifest_matching:\n        already_done_manifest.write_to_filename(args.output_manifest_matching)\n        notify(\n            f\"output {len(already_done_manifest)} already-done signatures to '{args.output_manifest_matching}' in manifest format.\"\n        )\n\n    if missing:\n        error(\"** ERROR: we cannot build some of the requested signatures.\")\n        error(\n            f\"** {missing_count} total signatures (for {len(missing)} names) cannot be built.\"\n        )\n        if args.ignore_missing:\n            error(\"** (continuing past this error because --ignore-missing was set)\")\n        else:\n            sys.exit(-1)\n\n    notify(\n        f\"** {total_sigs - skipped_sigs} new signatures to build from {len(to_build)} files;\"\n    )\n    if not to_build:\n        notify(\"** Nothing to build. Exiting!\")\n        sys.exit(0)\n\n    if skipped_sigs:\n        notify(f\"** {skipped_sigs} already exist, so skipping those.\")\n    else:\n        notify(\"** we found no pre-existing signatures that match.\")\n\n    ## first, print out a summary of to_build:\n\n    print_results(\"---\")\n    print_results(\"summary of sketches to build:\")\n\n    counter = Counter()\n    for filename, param_objs in to_build.items():\n        for p in param_objs:\n            assert len(p.ksizes) == 1\n            ksize = p.ksizes[0]\n            if not p.dna:\n                ksize //= 3\n\n            ski = _SketchInfo(\n                ksize=ksize,\n                moltype=p.moltype,\n                scaled=p.scaled,\n                num=p.num_hashes,\n                abund=p.track_abundance,\n            )\n            counter[ski] += 1\n\n    for ski, count in counter.items():\n        mh_type = f\"num={ski.num}\" if ski.num else f\"scaled={ski.scaled}\"\n        mh_abund = \", abund\" if ski.abund else \"\"\n\n        sketch_str = (\n            f\"{count} sketches with {ski.moltype}, k={ski.ksize}, {mh_type}{mh_abund}\"\n        )\n\n        print_results(f\"   {sketch_str: <50}\")\n\n    print_results(\"---\")\n\n    ## now, onward ho - do we build anything, or output stuff, or just exit?\n\n    if args.output_signatures:  # actually compute\n        _compute_sigs(\n            to_build, args.output_signatures, check_sequence=args.check_sequence\n        )\n\n    if args.output_csv_info:  # output info necessary to construct\n        _output_csv_info(args.output_csv_info, to_build)\n\n    notify(\n        f\"** {total_sigs} total requested; output {total_sigs - skipped_sigs}, skipped {skipped_sigs}\"\n    )\n\n\nclass _signatures_for_compute_factory:\n    \"Build signatures on demand, based on args input to 'compute'.\"\n\n    def __init__(self, args):\n        self.args = args\n\n    def __call__(self):\n        args = self.args\n        params = ComputeParameters(\n            ksizes=args.ksizes,\n            seed=args.seed,\n            protein=args.protein,\n            dayhoff=args.dayhoff,\n            hp=args.hp,\n            dna=args.dna,\n            skipm1n3=args.skipm1n3,\n            skipm2n3=args.skipm2n3,\n            num_hashes=args.num_hashes,\n            track_abundance=args.track_abundance,\n            scaled=args.scaled,\n        )\n        sig = SourmashSignature.from_params(params)\n        return [sig]\n\n\ndef _compute_individual(args, signatures_factory):\n    # this is where output signatures will go.\n    save_sigs = None\n\n    # track: is this the first file? in cases where we have empty inputs,\n    # we don't want to open any outputs.\n    first_file_for_output = True\n\n    # if args.output is set, we are aggregating all output to a single file.\n    # do not open a new output file for each input.\n    open_output_each_time = True\n    if args.output:\n        open_output_each_time = False\n\n    for filename in args.filenames:\n        if open_output_each_time:\n            # for each input file, construct output filename\n            sigfile = os.path.basename(filename) + \".sig\"\n            if args.output_dir:\n                sigfile = os.path.join(args.output_dir, sigfile)\n\n            # does it already exist? skip if so.\n            if os.path.exists(sigfile) and not args.force:\n                notify(\"skipping {} - already done\", filename)\n                continue  # go on to next file.\n\n            # nope? ok, let's save to it.\n            assert not save_sigs\n            save_sigs = sourmash_args.SaveSignaturesToLocation(sigfile)\n\n        #\n        # calculate signatures!\n        #\n\n        # now, set up to iterate over sequences.\n        with screed.open(filename) as screed_iter:\n            if not screed_iter:\n                notify(f\"no sequences found in '{filename}'?!\")\n                continue\n\n            # open output for signatures\n            if open_output_each_time:\n                save_sigs.open()\n            # or... is this the first time to write something to args.output?\n            elif first_file_for_output:\n                save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n                save_sigs.open()\n                first_file_for_output = False\n\n            # make a new signature for each sequence?\n            if args.singleton:\n                n_calculated = 0\n                for n, record in enumerate(screed_iter):\n                    sigs = signatures_factory()\n                    try:\n                        add_seq(\n                            sigs,\n                            record.sequence,\n                            args.input_is_protein,\n                            args.check_sequence,\n                        )\n                    except ValueError as exc:\n                        error(f\"ERROR when reading from '{filename}' - \")\n                        error(str(exc))\n                        sys.exit(-1)\n\n                    n_calculated += len(sigs)\n                    set_sig_name(sigs, filename, name=record.name)\n                    save_sigs_to_location(sigs, save_sigs)\n\n                notify(\n                    \"calculated {} signatures for {} sequences in {}\",\n                    n_calculated,\n                    n + 1,\n                    filename,\n                )\n\n            # nope; make a single sig for the whole file\n            else:\n                sigs = signatures_factory()\n\n                # consume & calculate signatures\n                notify(f\"... reading sequences from {filename}\")\n                name = None\n                for n, record in enumerate(screed_iter):\n                    if n % 10000 == 0:\n                        if n:\n                            notify(\"\\r...{} {}\", filename, n, end=\"\")\n                        elif args.name_from_first:\n                            name = record.name\n\n                    try:\n                        add_seq(\n                            sigs,\n                            record.sequence,\n                            args.input_is_protein,\n                            args.check_sequence,\n                        )\n                    except ValueError as exc:\n                        error(f\"ERROR when reading from '{filename}' - \")\n                        error(str(exc))\n                        sys.exit(-1)\n\n                notify(\"...{} {} sequences\", filename, n, end=\"\")\n\n                set_sig_name(sigs, filename, name)\n                save_sigs_to_location(sigs, save_sigs)\n\n                notify(\n                    f\"calculated {len(sigs)} signatures for {n + 1} sequences in {filename}\"\n                )\n\n        # if not args.output, close output for every input filename.\n        if open_output_each_time:\n            save_sigs.close()\n            notify(\n                f\"saved {len(save_sigs)} signature(s) to '{save_sigs.location}'. Note: signature license is CC0.\"\n            )\n            save_sigs = None\n\n    # if --output-dir specified, all collected signatures => args.output,\n    # and we need to close here.\n    if args.output and save_sigs is not None:\n        save_sigs.close()\n        notify(\n            f\"saved {len(save_sigs)} signature(s) to '{save_sigs.location}'. Note: signature license is CC0.\"\n        )\n\n\ndef _compute_merged(args, signatures_factory):\n    # make a signature for the whole file\n    sigs = signatures_factory()\n\n    total_seq = 0\n    for filename in args.filenames:\n        # consume & calculate signatures\n        notify(\"... reading sequences from {}\", filename)\n\n        n = None\n        with screed.open(filename) as f:\n            for n, record in enumerate(f):\n                if n % 10000 == 0 and n:\n                    notify(\"\\r... {} {}\", filename, n, end=\"\")\n\n                add_seq(\n                    sigs, record.sequence, args.input_is_protein, args.check_sequence\n                )\n        if n is not None:\n            notify(\"... {} {} sequences\", filename, n + 1)\n            total_seq += n + 1\n        else:\n            notify(f\"no sequences found in '{filename}'?!\")\n\n    if total_seq:\n        set_sig_name(sigs, filename, name=args.merge)\n        notify(\n            \"calculated 1 signature for {} sequences taken from {} files\",\n            total_seq,\n            len(args.filenames),\n        )\n\n        # at end, save!\n        save_siglist(sigs, args.output)\n\n\ndef add_seq(sigs, seq, input_is_protein, check_sequence):\n    for sig in sigs:\n        if input_is_protein:\n            sig.add_protein(seq)\n        else:\n            sig.add_sequence(seq, not check_sequence)\n\n\ndef set_sig_name(sigs, filename, name=None):\n    if filename == \"-\":  # if stdin, set filename to empty.\n        filename = \"\"\n    for sig in sigs:\n        if name is not None:\n            sig._name = name\n\n        sig.filename = filename\n\n\ndef save_siglist(siglist, sigfile_name):\n    \"Save multiple signatures to a filename.\"\n\n    # save!\n    with sourmash_args.SaveSignaturesToLocation(sigfile_name) as save_sig:\n        for ss in siglist:\n            save_sig.add(ss)\n\n        notify(f\"saved {len(save_sig)} signature(s) to '{save_sig.location}'\")\n\n\ndef save_sigs_to_location(siglist, save_sig):\n    \"Save multiple signatures to an already-open location.\"\n    import sourmash\n\n    for ss in siglist:\n        save_sig.add(ss)\n\n\nclass ComputeParameters(RustObject):\n    __dealloc_func__ = lib.computeparams_free\n\n    def __init__(\n        self,\n        *,\n        ksizes=(21, 31, 51),\n        seed=42,\n        protein=False,\n        dayhoff=False,\n        hp=False,\n        dna=True,\n        skipm1n3=False,\n        skipm2n3=False,\n        num_hashes=500,\n        track_abundance=False,\n        scaled=0,\n    ):\n        self._objptr = lib.computeparams_new()\n\n        self.seed = seed\n        self.ksizes = ksizes\n        self.protein = protein\n        self.dayhoff = dayhoff\n        self.hp = hp\n        self.dna = dna\n        self.skipm1n3 = skipm1n3\n        self.skipm2n3 = skipm2n3\n        self.num_hashes = num_hashes\n        self.track_abundance = track_abundance\n        self.scaled = scaled\n\n    @classmethod\n    def from_manifest_row(cls, row):\n        \"convert a CollectionManifest row into a ComputeParameters object\"\n        is_dna = is_protein = is_dayhoff = is_hp = False\n        is_skipm1n3 = is_skipm2n3 = False\n\n        if row[\"moltype\"] == \"DNA\":\n            is_dna = True\n        elif row[\"moltype\"] == \"protein\":\n            is_protein = True\n        elif row[\"moltype\"] == \"hp\":\n            is_hp = True\n        elif row[\"moltype\"] == \"dayhoff\":\n            is_dayhoff = True\n        elif row[\"moltype\"] == \"skipm1n3\":\n            is_skipm1n3 = True\n        elif row[\"moltype\"] == \"skipm2n3\":\n            is_skipm2n3 = True\n        else:\n            assert 0, row[\"moltype\"]\n\n        if is_dna:\n            ksize = row[\"ksize\"]\n        else:\n            ksize = row[\"ksize\"] * 3\n\n        p = cls(\n            ksizes=[ksize],\n            seed=DEFAULT_MMHASH_SEED,\n            protein=is_protein,\n            dayhoff=is_dayhoff,\n            hp=is_hp,\n            dna=is_dna,\n            skipm1n3=is_skipm1n3,\n            skipm2n3=is_skipm2n3,\n            num_hashes=row[\"num\"],\n            track_abundance=row[\"with_abundance\"],\n            scaled=row[\"scaled\"],\n        )\n\n        return p\n\n    def to_param_str(self):\n        \"Convert object to equivalent params str.\"\n        pi = []\n\n        if self.dna:\n            pi.append(\"dna\")\n        elif self.protein:\n            pi.append(\"protein\")\n        elif self.hp:\n            pi.append(\"hp\")\n        elif self.dayhoff:\n            pi.append(\"dayhoff\")\n        elif self.skipm1n3:\n            pi.append(\"skipm1n3\")\n        elif self.skipm2n3:\n            pi.append(\"skipm2n3\")\n        else:\n            assert 0  # must be one of the previous\n\n        if self.dna:\n            kstr = [f\"k={k}\" for k in self.ksizes]\n        else:\n            # for protein, divide ksize by three.\n            kstr = [f\"k={k // 3}\" for k in self.ksizes]\n        assert kstr\n        pi.extend(kstr)\n\n        if self.num_hashes != 0:\n            pi.append(f\"num={self.num_hashes}\")\n        elif self.scaled != 0:\n            pi.append(f\"scaled={self.scaled}\")\n        else:\n            assert 0\n\n        if self.track_abundance:\n            pi.append(\"abund\")\n        # noabund is default\n\n        if self.seed != DEFAULT_MMHASH_SEED:\n            pi.append(f\"seed={self.seed}\")\n        # self.seed\n\n        return \",\".join(pi)\n\n    def __repr__(self):\n        return f\"ComputeParameters(ksizes={self.ksizes}, seed={self.seed}, protein={self.protein}, dayhoff={self.dayhoff}, hp={self.hp}, dna={self.dna}, skipm1n3={self.skipm1n3}, skipm2n3={self.skipm2n3}, num_hashes={self.num_hashes}, track_abundance={self.track_abundance}, scaled={self.scaled})\"\n\n    def __eq__(self, other):\n        return (\n            self.ksizes == other.ksizes\n            and self.seed == other.seed\n            and self.protein == other.protein\n            and self.dayhoff == other.dayhoff\n            and self.hp == other.hp\n            and self.dna == other.dna\n            and self.skipm1n3 == other.skipm1n3\n            and self.skipm2n3 == other.skipm2n3\n            and self.num_hashes == other.num_hashes\n            and self.track_abundance == other.track_abundance\n            and self.scaled == other.scaled\n        )\n\n    @staticmethod\n    def from_args(args):\n        ptr = lib.computeparams_new()\n        ret = ComputeParameters._from_objptr(ptr)\n\n        for arg, value in vars(args).items():\n            try:\n                getattr(type(ret), arg).fset(ret, value)\n            except AttributeError:\n                pass\n\n        return ret\n\n    @property\n    def seed(self):\n        return self._methodcall(lib.computeparams_seed)\n\n    @seed.setter\n    def seed(self, v):\n        return self._methodcall(lib.computeparams_set_seed, v)\n\n    @property\n    def ksizes(self):\n        size = ffi.new(\"uintptr_t *\")\n        ksizes_ptr = self._methodcall(lib.computeparams_ksizes, size)\n        size = size[0]\n        ksizes = ffi.unpack(ksizes_ptr, size)\n        lib.computeparams_ksizes_free(ksizes_ptr, size)\n        return ksizes\n\n    @ksizes.setter\n    def ksizes(self, v):\n        return self._methodcall(lib.computeparams_set_ksizes, list(v), len(v))\n\n    @property\n    def protein(self):\n        return self._methodcall(lib.computeparams_protein)\n\n    @protein.setter\n    def protein(self, v):\n        return self._methodcall(lib.computeparams_set_protein, v)\n\n    @property\n    def dayhoff(self):\n        return self._methodcall(lib.computeparams_dayhoff)\n\n    @dayhoff.setter\n    def dayhoff(self, v):\n        return self._methodcall(lib.computeparams_set_dayhoff, v)\n\n    @property\n    def hp(self):\n        return self._methodcall(lib.computeparams_hp)\n\n    @hp.setter\n    def hp(self, v):\n        return self._methodcall(lib.computeparams_set_hp, v)\n\n    @property\n    def dna(self):\n        return self._methodcall(lib.computeparams_dna)\n\n    @dna.setter\n    def dna(self, v):\n        return self._methodcall(lib.computeparams_set_dna, v)\n\n    @property\n    def skipm1n3(self):\n        return self._methodcall(lib.computeparams_skipm1n3)\n\n    @skipm1n3.setter\n    def skipm1n3(self, v):\n        return self._methodcall(lib.computeparams_set_skipm1n3, v)\n\n    @property\n    def skipm2n3(self):\n        return self._methodcall(lib.computeparams_skipm2n3)\n\n    @skipm2n3.setter\n    def skipm2n3(self, v):\n        return self._methodcall(lib.computeparams_set_skipm2n3, v)\n\n    @property\n    def moltype(self):\n        if self.dna:\n            moltype = \"DNA\"\n        elif self.protein:\n            moltype = \"protein\"\n        elif self.hp:\n            moltype = \"hp\"\n        elif self.dayhoff:\n            moltype = \"dayhoff\"\n        elif self.skipm1n3:\n            moltype = \"skipm1n3\"\n        elif self.skipm2n3:\n            moltype = \"skipm2n3\"\n        else:\n            assert 0\n\n        return moltype\n\n    @property\n    def num_hashes(self):\n        return self._methodcall(lib.computeparams_num_hashes)\n\n    @num_hashes.setter\n    def num_hashes(self, v):\n        return self._methodcall(lib.computeparams_set_num_hashes, v)\n\n    @property\n    def track_abundance(self):\n        return self._methodcall(lib.computeparams_track_abundance)\n\n    @track_abundance.setter\n    def track_abundance(self, v):\n        return self._methodcall(lib.computeparams_set_track_abundance, v)\n\n    @property\n    def scaled(self):\n        return self._methodcall(lib.computeparams_scaled)\n\n    @scaled.setter\n    def scaled(self, v):\n        return self._methodcall(lib.computeparams_set_scaled, int(v))\n"
  },
  {
    "path": "src/sourmash/commands.py",
    "content": "\"\"\"\nFunctions implementing the main command-line subcommands.\n\"\"\"\n\nimport csv\nimport os\nimport os.path\nimport sys\nimport shutil\nimport io\nimport enum\n\nimport screed\nfrom .compare import (\n    compare_all_pairs,\n    compare_serial_containment,\n    compare_serial_max_containment,\n    compare_serial_avg_containment,\n)\nfrom . import MinHash\nfrom .sbtmh import load_sbt_index, create_sbt_index\nfrom . import signature as sig\nfrom . import sourmash_args\nfrom .logging import notify, error, print_results, set_quiet\nfrom .sourmash_args import FileOutput, FileOutputCSV, SaveSignaturesToLocation\nfrom .search import prefetch_database, PrefetchResult\nfrom .index import LazyLinearIndex\nfrom sourmash.index.revindex import DiskRevIndex\n\n\nWATERMARK_SIZE = 10000\n\n\nclass EnumIndexType(enum.StrEnum):  # used in 'index'\n    SBT = \"SBT\"\n    ROCKSDB = \"rocksdb\"\n    ZIP = \"zip\"\n\n\ndef _get_screen_width():\n    # default fallback is 80x24\n    (col, rows) = shutil.get_terminal_size()\n\n    return col\n\n\ndef compare(args):\n    \"Compare multiple signature files and create a distance matrix.\"\n    import numpy\n\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n\n    inp_files = list(args.signatures)\n    if args.from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.from_file)\n        inp_files.extend(more_files)\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    # load in the various signatures\n    siglist = []\n    ksizes = set()\n    moltypes = set()\n    size_may_be_inaccurate = False\n    for filename in inp_files:\n        notify(f\"loading '{filename}'\", end=\"\\r\")\n        loaded = sourmash_args.load_file_as_signatures(\n            filename,\n            ksize=args.ksize,\n            select_moltype=moltype,\n            picklist=picklist,\n            yield_all_files=args.force,\n            progress=progress,\n            pattern=pattern_search,\n        )\n        loaded = list(loaded)\n        if not loaded:\n            notify(\n                f\"\\nwarning: no signatures loaded at given ksize/molecule type/picklist from {filename}\"\n            )\n\n        # add to siglist; track ksizes/moltypes\n        s = None\n        for s in loaded:\n            siglist.append((s, filename))\n            ksizes.add(s.minhash.ksize)\n            moltypes.add(sourmash_args.get_moltype(s))\n\n        if s is None:\n            notify(\n                f\"\\nwarning: no signatures loaded at given ksize/molecule type/picklist from {filename}\"\n            )\n\n        # error out while loading if we have more than one ksize/moltype\n        if len(ksizes) > 1 or len(moltypes) > 1:\n            break\n\n    if not siglist:\n        error(\"no signatures found! exiting.\")\n        sys.exit(-1)\n\n    # check ksizes and type\n    if len(ksizes) > 1:\n        error(\"multiple k-mer sizes loaded; please specify one with -k.\")\n        ksizes = sorted(ksizes)\n        error(\"(saw k-mer sizes {})\".format(\", \".join(map(str, ksizes))))\n        sys.exit(-1)\n\n    if len(moltypes) > 1:\n        error(\"multiple molecule types loaded; please specify --dna, --protein\")\n        sys.exit(-1)\n\n    notify(\" \" * 79, end=\"\\r\")\n    notify(f\"loaded {format(len(siglist))} signatures total.\")\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    # check to make sure they're potentially compatible - either using\n    # scaled, or not.\n    scaled_sigs = [s.minhash.scaled for (s, _) in siglist]\n    is_scaled = all(scaled_sigs)\n    is_scaled_2 = any(scaled_sigs)\n\n    # complain if it's not all one or the other\n    if is_scaled != is_scaled_2:\n        error(\"ERROR: cannot mix scaled signatures with num signatures\")\n        sys.exit(-1)\n\n    is_containment = False\n    if args.containment or args.max_containment or args.avg_containment:\n        is_containment = True\n\n        containment_args = [\n            args.containment,\n            args.max_containment,\n            args.avg_containment,\n        ]\n        if sum(containment_args) > 1:\n            notify(\"ERROR: cannot specify more than one containment argument!\")\n            sys.exit(-1)\n\n    # complain if --containment and not is_scaled\n    if is_containment and not is_scaled:\n        error(\n            \"must use scaled signatures with --containment, --max-containment, and --avg-containment\"\n        )\n        sys.exit(-1)\n\n    # complain if --ani and not is_scaled\n    return_ani = False\n    if args.estimate_ani:\n        return_ani = True\n\n    if return_ani and not is_scaled:\n        error(\"must use scaled signatures with --estimate-ani\")\n        sys.exit(-1)\n\n    # notify about implicit --ignore-abundance:\n    if is_containment or return_ani:\n        track_abundances = any(s.minhash.track_abundance for s, _ in siglist)\n        if track_abundances:\n            notify(\n                \"NOTE: --containment, --max-containment, --avg-containment, and --estimate-ani ignore signature abundances.\"\n            )\n\n    # CTB: note, up to this point, we could do everything with manifests\n    # w/o actually loading any signatures. I'm not sure the manifest\n    # API allows it tho.\n\n    # if using scaled sketches or --scaled, downsample to common max scaled.\n    printed_scaled_msg = False\n    if is_scaled:\n        max_scaled = max(s.minhash.scaled for s, _ in siglist)\n        if args.scaled:\n            args.scaled = int(args.scaled)\n\n            max_scaled = max(max_scaled, args.scaled)\n            if max_scaled > args.scaled:\n                notify(\n                    f\"WARNING: --scaled specified {args.scaled}, but max scaled of sketches is {max_scaled}\"\n                )\n                notify(f\"WARNING: continuing with scaled value of {max_scaled}.\")\n\n        new_siglist = []\n        for s, filename in siglist:\n            if not size_may_be_inaccurate and not s.minhash.size_is_accurate():\n                size_may_be_inaccurate = True\n            if s.minhash.scaled != max_scaled:\n                if not printed_scaled_msg:\n                    notify(\n                        f\"NOTE: downsampling to scaled value of {format(max_scaled)}\"\n                    )\n                    printed_scaled_msg = True\n                with s.update() as s:\n                    s.minhash = s.minhash.downsample(scaled=max_scaled)\n                new_siglist.append((s, filename))\n            else:\n                new_siglist.append((s, filename))\n        siglist = new_siglist\n    elif args.scaled is not None:\n        error(\"ERROR: cannot specify --scaled with non-scaled signatures.\")\n        sys.exit(-1)\n\n    if len(siglist) == 0:\n        error(\"no signatures!\")\n        sys.exit(-1)\n\n    notify(\"\")\n\n    # build the distance matrix\n    numpy.set_printoptions(precision=3, suppress=True)\n\n    # do all-by-all calculation\n\n    labeltext = [str(ss) for ss, _ in siglist]\n    sigsonly = [ss for ss, _ in siglist]\n    if args.containment:\n        similarity = compare_serial_containment(sigsonly, return_ani=return_ani)\n    elif args.max_containment:\n        similarity = compare_serial_max_containment(sigsonly, return_ani=return_ani)\n    elif args.avg_containment:\n        similarity = compare_serial_avg_containment(sigsonly, return_ani=return_ani)\n    else:\n        similarity = compare_all_pairs(\n            sigsonly,\n            args.ignore_abundance,\n            n_jobs=args.processes,\n            return_ani=return_ani,\n        )\n\n    # if distance matrix desired, switch to 1-similarity\n    if args.distance_matrix:\n        matrix = 1 - similarity\n    else:\n        matrix = similarity\n\n    if len(siglist) < 30:\n        for i, (ss, filename) in enumerate(siglist):\n            # for small matrices, pretty-print some output\n            name_num = f\"{i}-{str(ss)}\"\n            if len(name_num) > 20:\n                name_num = name_num[:17] + \"...\"\n            print_results(\n                \"{:20s}\\t{}\".format(\n                    name_num,\n                    matrix[\n                        i,\n                        :,\n                    ],\n                )\n            )\n\n    if args.distance_matrix:\n        print_results(\"max distance in matrix: {:.3f}\", numpy.max(matrix))\n    else:\n        print_results(\"min similarity in matrix: {:.3f}\", numpy.min(matrix))\n\n    # shall we output a matrix to stdout?\n    if args.output:\n        labeloutname = args.output + \".labels.txt\"\n        notify(f\"saving labels to: {labeloutname}\")\n        with open(labeloutname, \"w\") as fp:\n            fp.write(\"\\n\".join(labeltext))\n\n        notify(f\"saving comparison matrix to: {args.output}\")\n        with open(args.output, \"wb\") as fp:\n            numpy.save(fp, matrix)\n\n    # output labels information via --labels-to?\n    if args.labels_to:\n        labeloutname = args.labels_to\n        notify(f\"saving labels to: {labeloutname}\")\n        with sourmash_args.FileOutputCSV(labeloutname) as fp:\n            w = csv.writer(fp)\n            w.writerow(\n                [\"sort_order\", \"md5\", \"label\", \"name\", \"filename\", \"signature_file\"]\n            )\n\n            for n, (ss, location) in enumerate(siglist):\n                md5 = ss.md5sum()\n                sigfile = location\n                label = str(ss)\n                name = ss.name\n                filename = ss.filename\n\n                w.writerow([str(n + 1), md5, label, name, filename, sigfile])\n\n    # output CSV?\n    if args.csv:\n        with FileOutputCSV(args.csv) as csv_fp:\n            w = csv.writer(csv_fp)\n            w.writerow(labeltext)\n\n            for i in range(len(labeltext)):\n                y = []\n                for j in range(len(labeltext)):\n                    y.append(str(matrix[i][j]))\n                w.writerow(y)\n\n    if size_may_be_inaccurate:\n        if args.distance_matrix:\n            notify(\n                \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI distances will be set to 1 for these comparisons.\"\n            )\n        else:\n            notify(\n                \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will be set to 1 for these comparisons.\"\n            )\n\n\ndef plot(args):\n    \"Produce a clustering matrix and plot.\"\n    import matplotlib as mpl\n\n    mpl.use(\"Agg\")\n    import numpy\n    import pylab\n    import scipy.cluster.hierarchy as sch\n    from . import fig as sourmash_fig\n\n    # load files\n    D_filename = args.distances\n\n    notify(f\"loading comparison matrix from {D_filename}...\")\n    with open(D_filename, \"rb\") as f:\n        D = numpy.load(f)\n    # not sure how to change this to use f-strings\n    notify(\"...got {} x {} matrix.\", *D.shape)\n\n    # see sourmash#2790 for details :)\n    if args.labeltext or args.labels or args.labels_from:\n        if args.labeltext and args.labels_from:\n            notify(\"ERROR: cannot supply both --labeltext and --labels-from\")\n            sys.exit(-1)\n        display_labels = True\n        args.labels = True  # override => labels always true\n    elif args.labels is None and not args.indices:\n        # default to labels\n        args.labels = True\n        display_labels = True\n    elif args.indices or (not args.labels and args.indices is None):\n        # turn on indices only, not label names\n        args.indices = True\n        display_labels = True\n    else:\n        display_labels = False\n\n    if args.labels_from:\n        labelfilename = args.labels_from\n        notify(f\"loading labels from CSV file '{labelfilename}'\")\n\n        labeltext = []\n        with sourmash_args.FileInputCSV(labelfilename) as r:\n            for row in r:\n                order, label = row[\"sort_order\"], row[\"label\"]\n                labeltext.append((int(order), label))\n        labeltext.sort()\n        labeltext = [t[1] for t in labeltext]\n    elif args.labels:\n        if args.labeltext:\n            labelfilename = args.labeltext\n        else:\n            labelfilename = D_filename + \".labels.txt\"\n\n        notify(f\"loading labels from text file '{labelfilename}'\")\n        with open(labelfilename) as f:\n            labeltext = [x.strip() for x in f]\n\n        if len(labeltext) != D.shape[0]:\n            error(\"{} labels != matrix size, exiting\", len(labeltext))\n            sys.exit(-1)\n    elif args.indices:\n        # construct integer labels\n        labeltext = [str(i + 1) for i in range(D.shape[0])]\n    else:\n        assert not display_labels\n        labeltext = [\"\"] * D.shape[0]\n\n    if args.pdf:\n        ext = \".pdf\"\n    else:\n        ext = \".png\"\n\n    # build filenames, decide on PDF/PNG output\n    dendrogram_out = os.path.basename(D_filename) + \".dendro\" + ext\n    matrix_out = os.path.basename(D_filename) + \".matrix\" + ext\n    hist_out = os.path.basename(D_filename) + \".hist\" + ext\n\n    # output to a different directory?\n    if args.output_dir:\n        if not os.path.isdir(args.output_dir):\n            os.mkdir(args.output_dir)\n        dendrogram_out = os.path.join(args.output_dir, dendrogram_out)\n        matrix_out = os.path.join(args.output_dir, matrix_out)\n        hist_out = os.path.join(args.output_dir, hist_out)\n\n    # make the histogram\n    notify(f\"saving histogram of matrix values => {hist_out}\")\n    fig = pylab.figure(figsize=(8, 5))\n    pylab.hist(numpy.array(D.flat), bins=100)\n    fig.savefig(hist_out)\n\n    ### make the dendrogram:\n    fig = pylab.figure(figsize=(8, 5))\n    ax1 = fig.add_axes([0.1, 0.1, 0.7, 0.8])\n    ax1.set_xticks([])\n    ax1.set_yticks([])\n\n    # subsample?\n    if args.subsample:\n        numpy.random.seed(args.subsample_seed)\n\n        sample_idx = list(range(len(labeltext)))\n        numpy.random.shuffle(sample_idx)\n        sample_idx = sample_idx[: args.subsample]\n\n        np_idx = numpy.array(sample_idx)\n        D = D[numpy.ix_(np_idx, np_idx)]\n        labeltext = [labeltext[idx] for idx in sample_idx]\n\n    ### do clustering\n    Y = sch.linkage(D, method=\"single\")\n    sch.dendrogram(\n        Y, orientation=\"right\", labels=labeltext, no_labels=not display_labels\n    )\n    fig.savefig(dendrogram_out)\n    notify(f\"wrote dendrogram to: {dendrogram_out}\")\n\n    ### make the dendrogram+matrix:\n    (fig, rlabels, rmat) = sourmash_fig.plot_composite_matrix(\n        D,\n        labeltext,\n        show_labels=display_labels,\n        vmin=args.vmin,\n        vmax=args.vmax,\n        force=args.force,\n    )\n    fig.savefig(matrix_out)\n    notify(f\"wrote numpy distance matrix to: {matrix_out}\")\n\n    if len(labeltext) < 30:\n        # for small matrices, print out sample numbering for FYI.\n        for i, name in enumerate(labeltext):\n            print_results(\"{}\\t{}\", i, name)\n\n    # write out re-ordered matrix and labels\n    if args.csv:\n        with FileOutputCSV(args.csv) as csv_fp:\n            w = csv.writer(csv_fp)\n            w.writerow(rlabels)\n\n            for i in range(len(rlabels)):\n                y = []\n                for j in range(len(rlabels)):\n                    y.append(f\"{rmat[i][j]}\")\n                w.writerow(y)\n        notify(f\"Wrote clustered matrix and labels out to {args.csv}\")\n\n\ndef import_csv(args):\n    \"Import a CSV file full of signatures/hashes.\"\n\n    with open(args.mash_csvfile, newline=\"\") as fp:\n        reader = csv.reader(fp)\n        siglist = []\n        for row in reader:\n            hashfn = row[0]\n            hashseed = int(row[1])\n\n            # only support a limited import type, for now ;)\n            assert hashfn == \"murmur64\"\n            assert hashseed == 42\n\n            _, _, ksize, name, hashes = row\n            ksize = int(ksize)\n\n            hashes = hashes.strip()\n            hashes = list(map(int, hashes.split(\" \")))\n\n            e = MinHash(len(hashes), ksize)\n            e.add_many(hashes)\n            s = sig.SourmashSignature(e, filename=name)\n            siglist.append(s)\n            notify(f\"loaded signature: {name} {s.md5sum()[:8]}\")\n\n        notify(f\"saving {len(siglist)} signatures to JSON\")\n        with SaveSignaturesToLocation(args.output) as save_sig:\n            save_sig.add_many(siglist)\n\n\ndef sbt_combine(args):\n    inp_files = list(args.sbts)\n    notify(f\"combining {len(inp_files)} SBTs\")\n\n    tree = load_sbt_index(inp_files.pop(0))\n\n    for f in inp_files:\n        new_tree = load_sbt_index(f)\n        # TODO: check if parameters are the same for both trees!\n        tree.combine(new_tree)\n\n    notify(f'saving SBT under \"{args.sbt_name}\".')\n    tree.save(args.sbt_name)\n\n\ndef index(args):\n    \"\"\"\n    Build an on-disk index of the given signatures. Currently supports\n    SBT and RocksDB inverted indices.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n\n    index_type = args.index_type\n    add_sketch = None\n    output_name = args.name\n\n    # check input options\n    if index_type != \"SBT\":\n        if args.append:\n            error(\"cannot only use --append with an SBT index type\")\n            sys.exit(-1)\n        if args.sparseness > 0.0:\n            error(\"cannot use use --sparseness with an SBT index type\")\n            sys.exit(-1)\n\n    # open writing\n    match index_type:\n        case EnumIndexType.SBT:\n            if args.sparseness < 0 or args.sparseness > 1.0:\n                error(\"sparseness must be in range [0.0, 1.0].\")\n                sys.exit(-1)\n\n            if args.append:\n                tree = load_sbt_index(args.name)\n            else:\n                tree = create_sbt_index(args.bf_size, n_children=args.n_children)\n\n            def add_sketch(sigobj):\n                tree.insert(sigobj)\n        case EnumIndexType.ZIP:\n            save_sigs = sourmash_args.SaveSignaturesToLocation(output_name)\n            save_sigs.open()\n\n            def add_sketch(sigobj):\n                save_sigs.add(sigobj)\n        case EnumIndexType.ROCKSDB:\n            full_siglist = []\n\n            def add_sketch(sigobj):\n                full_siglist.append(sigobj)\n        case _:\n            error(f\"ERROR: unknown index type '{index_type}'; quitting.\")\n            sys.exit(-1)\n\n    if args.scaled:\n        args.scaled = int(args.scaled)\n        notify(f\"downsampling signatures to scaled={args.scaled}\")\n\n    inp_files = list(args.signatures)\n    if args.from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.from_file)\n        inp_files.extend(more_files)\n\n    if not inp_files:\n        error(\"ERROR: no files to index!? Supply on command line or use --from-file\")\n        sys.exit(-1)\n\n    notify(f\"loading {len(inp_files)} files into {index_type} index\")\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    n = 0\n    ksizes = set()\n    moltypes = set()\n    nums = set()\n    scaleds = set()\n    full_siglist = []\n    for f in inp_files:\n        siglist = sourmash_args.load_file_as_signatures(\n            f,\n            ksize=args.ksize,\n            select_moltype=moltype,\n            yield_all_files=args.force,\n            picklist=picklist,\n            progress=progress,\n        )\n\n        # load all matching signatures in this file\n        ss = None\n        for ss in siglist:\n            ksizes.add(ss.minhash.ksize)\n            moltypes.add(sourmash_args.get_moltype(ss))\n            nums.add(ss.minhash.num)\n\n            with ss.update() as ss:\n                if args.scaled:\n                    ss.minhash = ss.minhash.downsample(scaled=args.scaled)\n                if ss.minhash.track_abundance:\n                    ss.minhash = ss.minhash.flatten()\n\n            scaleds.add(ss.minhash.scaled)\n\n            add_sketch(ss)\n            n += 1\n\n        if not ss:\n            continue\n\n        # check to make sure we aren't loading incompatible signatures\n        if len(ksizes) > 1 or len(moltypes) > 1:\n            error(\"multiple k-mer sizes or molecule types present; fail.\")\n            error(\"specify --dna/--protein and --ksize as necessary\")\n            error(\n                \"ksizes: {}; moltypes: {}\",\n                \", \".join(map(str, ksizes)),\n                \", \".join(moltypes),\n            )\n            sys.exit(-1)\n\n        if nums == {0} and len(scaleds) == 1:\n            pass  # good\n        elif scaleds == {0} and len(nums) == 1:\n            pass  # also good\n        else:\n            error(\"trying to build an index with incompatible signatures.\")\n            error(\"nums = {}; scaleds = {}\", repr(nums), repr(scaleds))\n            sys.exit(-1)\n\n    notify(\"\")\n\n    # did we load any!?\n    if n == 0:\n        error(\"no signatures found to load into index!? failing.\")\n        sys.exit(-1)\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    match index_type:\n        case EnumIndexType.SBT:\n            notify(f'loaded {n} sigs; saving SBT under \"{output_name}\"')\n            tree.save(output_name, sparseness=args.sparseness)\n            if tree.storage:\n                tree.storage.close()\n        case EnumIndexType.ZIP:\n            notify(f'loaded {n} sigs; saving zip file under \"{output_name}\"')\n            save_sigs.close()\n        case EnumIndexType.ROCKSDB:\n            notify(f'loaded {n} sigs; saving rocksdb index under \"{output_name}\"')\n            DiskRevIndex.create_from_sigs(full_siglist, output_name)\n\n\ndef search(args):\n    from .search import (\n        search_databases_with_flat_query,\n        search_databases_with_abund_query,\n    )\n\n    set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n\n    # set up the query.\n    query = sourmash_args.load_query_signature(\n        args.query, ksize=args.ksize, select_moltype=moltype, select_md5=args.md5\n    )\n    notify(\n        f\"loaded query: {str(query)[:30]}... (k={query.minhash.ksize}, {sourmash_args.get_moltype(query)})\"\n    )\n\n    if args.scaled:\n        if not query.minhash.scaled:\n            error(\"cannot downsample a signature not created with --scaled\")\n            sys.exit(-1)\n        if args.scaled != query.minhash.scaled:\n            notify(\n                f\"downsampling query from scaled={query.minhash.scaled} to {int(args.scaled)}\"\n            )\n            with query.update() as query:\n                query.minhash = query.minhash.downsample(scaled=args.scaled)\n\n    # set up the search databases\n    is_containment = args.containment or args.max_containment\n    if is_containment:\n        if args.containment and args.max_containment:\n            notify(\"ERROR: cannot specify both --containment and --max-containment!\")\n            sys.exit(-1)\n\n    databases = sourmash_args.load_dbs_and_sigs(\n        args.databases,\n        query,\n        not is_containment,\n        picklist=picklist,\n        pattern=pattern_search,\n        fail_on_empty_database=args.fail_on_empty_database,\n    )\n\n    # handle signatures with abundance\n    if query.minhash.track_abundance:\n        if args.ignore_abundance:\n            if query.minhash.track_abundance:\n                # abund sketch + ignore abundance => flatten sketch.\n                with query.update() as query:\n                    query.minhash = query.minhash.flatten()\n        elif args.containment or args.max_containment:\n            # abund sketch + keep abundance => no containment searches\n            notify(\n                \"ERROR: cannot do containment searches on an abund signature; maybe specify --ignore-abundance?\"\n            )\n            sys.exit(-1)\n    else:\n        # forcibly ignore abundances if query has no abundances\n        args.ignore_abundance = True\n\n    # do the actual search\n    if query.minhash.track_abundance:\n        try:\n            results = search_databases_with_abund_query(\n                query,\n                databases,\n                threshold=args.threshold,\n                do_containment=args.containment,\n                do_max_containment=args.max_containment,\n                best_only=args.best_only,\n                unload_data=True,\n            )\n        except TypeError as exc:\n            error(f\"ERROR: {str(exc)}\")\n            sys.exit(-1)\n    else:\n        results = search_databases_with_flat_query(\n            query,\n            databases,\n            threshold=args.threshold,\n            do_containment=args.containment,\n            do_max_containment=args.max_containment,\n            best_only=args.best_only,\n            unload_data=True,\n            estimate_ani_ci=args.estimate_ani_ci,\n        )\n\n    n_matches = len(results)\n    if args.best_only:\n        args.num_results = 1\n\n    if not args.num_results or n_matches <= args.num_results:\n        print_results(f\"{len(results)} matches above threshold {args.threshold:0.3f}:\")\n    else:\n        print_results(\n            f\"{len(results)} matches above threshold {args.threshold:0.3f}; showing first {args.num_results}:\"\n        )\n\n        n_matches = args.num_results\n\n    size_may_be_inaccurate = False\n    jaccard_ani_untrustworthy = False\n\n    # output!\n    print_results(\"similarity   match\")\n    print_results(\"----------   -----\")\n    for sr in results[:n_matches]:\n        pct = f\"{sr.similarity * 100:.1f}%\"\n        name = sr.match._display_name(60)\n        print_results(\"{:>6}       {}\", pct, name)\n        if sr.cmp_scaled is not None:\n            if not size_may_be_inaccurate and sr.size_may_be_inaccurate:\n                size_may_be_inaccurate = True\n            if not is_containment and sr.cmp.jaccard_ani_untrustworthy:\n                jaccard_ani_untrustworthy = True\n\n    if args.best_only:\n        notify(\"** reporting only one match because --best-only was set\")\n\n    writer = None\n    if args.output:\n        with FileOutputCSV(args.output) as fp:\n            for sr in results:\n                # if this is the first result we're writing, initialize the csv, return writer\n                if writer is None:\n                    writer = sr.init_dictwriter(fp)\n                sr.write(writer)\n\n    # save matching signatures upon request\n    if args.save_matches:\n        notify(f'saving all matched signatures to \"{args.save_matches}\"')\n\n        with SaveSignaturesToLocation(args.save_matches) as save_sig:\n            for sr in results:\n                save_sig.add(sr.match)\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    if size_may_be_inaccurate:\n        notify(\n            \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will not be reported for these comparisons.\"\n        )\n    if jaccard_ani_untrustworthy:\n        notify(\n            \"WARNING: Jaccard estimation for at least one of these comparisons is likely inaccurate. Could not estimate ANI for these comparisons.\"\n        )\n\n\ndef categorize(args):\n    \"Use a database to find the best match to many signatures.\"\n    from .index import MultiIndex\n    from .search import make_jaccard_search_query\n\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n\n    # eliminate names we've already categorized\n    already_names = set()\n    if args.load_csv:\n        with open(args.load_csv, newline=\"\") as fp:\n            r = csv.reader(fp)\n            for row in r:\n                already_names.add(row[0])\n\n    # load search database\n    db = sourmash_args.load_file_as_index(args.database)\n    if args.ksize or moltype:\n        db = db.select(ksize=args.ksize, moltype=moltype)\n\n    # utility function to load & select relevant signatures.\n    def _yield_all_sigs(queries, ksize, moltype):\n        for filename in queries:\n            mi = MultiIndex.load_from_path(filename, False)\n            mi = mi.select(ksize=ksize, moltype=moltype)\n            yield from mi.signatures_with_location()\n\n    csv_w = None\n    csv_fp = None\n    if args.csv:\n        csv_fp = open(args.csv, \"w\", newline=\"\")\n        csv_w = csv.writer(csv_fp)\n\n    search_obj = make_jaccard_search_query(threshold=args.threshold)\n    for orig_query, loc in _yield_all_sigs(args.queries, args.ksize, moltype):\n        # skip if we've already done signatures from this file.\n        if loc in already_names:\n            continue\n\n        notify(\n            f\"loaded query: {str(orig_query)[:30]}... (k={orig_query.minhash.ksize}, {orig_query.minhash.moltype})\"\n        )\n\n        if args.ignore_abundance and orig_query.minhash.track_abundance:\n            query = orig_query.copy()\n            with query.update() as query:\n                query.minhash = query.minhash.flatten()\n        else:\n            if orig_query.minhash.track_abundance:\n                notify(\n                    \"ERROR: this search cannot be done on signatures calculated with abundance.\"\n                )\n                notify(\"ERROR: please specify --ignore-abundance.\")\n                sys.exit(-1)\n\n            query = orig_query.copy()\n\n        results = []\n        for sr in db.find(search_obj, query):\n            match = sr.signature\n            if match.md5sum() != query.md5sum():  # ignore self.\n                results.append((orig_query.similarity(match), match))\n\n        if results:\n            results.sort(key=lambda x: -x[0])  # reverse sort on similarity\n            best_hit_sim, best_hit_query = results[0]\n            notify(f\"for {query}, found: {best_hit_sim:.2f} {best_hit_query}\")\n            best_hit_query_name = best_hit_query.name\n            if csv_w:\n                csv_w.writerow([loc, query, best_hit_query_name, best_hit_sim])\n        else:\n            notify(f\"for {query}, no match found\")\n\n    if csv_fp:\n        csv_fp.close()\n\n\ndef gather(args):\n    from .search import GatherDatabases, format_bp\n\n    set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n\n    # load the query signature & figure out all the things\n    query = sourmash_args.load_query_signature(\n        args.query, ksize=args.ksize, select_moltype=moltype, select_md5=args.md5\n    )\n    notify(\n        f\"loaded query: {str(query)[:30]}... (k={query.minhash.ksize}, {sourmash_args.get_moltype(query)})\"\n    )\n\n    # verify signature was computed right.\n    if not query.minhash.scaled:\n        error(\"query signature needs to be created with --scaled\")\n        sys.exit(-1)\n\n    if args.scaled and args.scaled != query.minhash.scaled:\n        notify(\n            f\"downsampling query from scaled={query.minhash.scaled} to {int(args.scaled)}\"\n        )\n        with query.update() as query:\n            query.minhash = query.minhash.downsample(scaled=args.scaled)\n\n    # empty?\n    if not len(query.minhash):\n        error(\"no query hashes!? exiting.\")\n        sys.exit(-1)\n\n    # set up the search databases\n    cache_size = args.cache_size\n    if args.cache_size == 0:\n        cache_size = None\n    databases = sourmash_args.load_dbs_and_sigs(\n        args.databases,\n        query,\n        False,\n        cache_size=cache_size,\n        picklist=picklist,\n        pattern=pattern_search,\n        fail_on_empty_database=args.fail_on_empty_database,\n    )\n\n    if args.linear:  # force linear traversal?\n        databases = [LazyLinearIndex(db) for db in databases]\n\n    size_may_be_inaccurate = False\n    if args.prefetch:  # note: on by default!\n        notify(\"Starting prefetch sweep across databases.\")\n        prefetch_query = query.copy()\n        if prefetch_query.minhash.track_abundance:\n            with prefetch_query.update() as prefetch_query:\n                prefetch_query.minhash = prefetch_query.minhash.flatten()\n\n        noident_mh = prefetch_query.minhash.to_mutable()\n        total_prefetch = 0\n        save_prefetch = SaveSignaturesToLocation(args.save_prefetch)\n        save_prefetch.open()\n        # set up prefetch CSV output\n        prefetch_csvout_fp = None\n        prefetch_csvout_w = None\n        if args.save_prefetch_csv:\n            prefetch_csvout_fp = FileOutputCSV(args.save_prefetch_csv).open()\n\n            query_mh = prefetch_query.minhash\n            scaled = query_mh.scaled\n\n        counters = []\n        ident_mh = noident_mh.copy_and_clear()\n        for db in databases:\n            counter = None\n            try:\n                counter = db.counter_gather(prefetch_query, args.threshold_bp)\n            except ValueError:\n                # catch \"no signatures to search\" ValueError if empty db.\n                continue\n\n            total_prefetch += len(counter)\n            if args.save_prefetch:\n                save_prefetch.add_many(counter.signatures())\n\n            # update found/not found hashes from the union/intersection of\n            # found.\n            union_found = counter.union_found\n            ident_mh.add_many(union_found)\n            noident_mh.remove_many(union_found)\n\n            # optionally calculate and output prefetch info to csv\n            if prefetch_csvout_fp:\n                for found_sig in counter.signatures():\n                    # calculate intersection stats and info\n                    prefetch_result = PrefetchResult(\n                        prefetch_query,\n                        found_sig,\n                        cmp_scaled=scaled,\n                        threshold_bp=args.threshold_bp,\n                        estimate_ani_ci=args.estimate_ani_ci,\n                    )\n                    if prefetch_csvout_w is None:\n                        prefetch_csvout_w = prefetch_result.init_dictwriter(\n                            prefetch_csvout_fp\n                        )\n                    prefetch_result.write(prefetch_csvout_w)\n\n            counters.append(counter)\n\n            # flush csvout so that things get saved progressively\n            if prefetch_csvout_fp:\n                prefetch_csvout_fp.flush()\n\n        display_bp = format_bp(args.threshold_bp)\n        notify(\n            f\"Prefetch found {total_prefetch} signatures with overlap >= {display_bp}.\"\n        )\n        save_prefetch.close()\n        if prefetch_csvout_fp:\n            prefetch_csvout_fp.close()\n    else:\n        counters = databases\n        # we can't track unidentified hashes w/o prefetch\n        noident_mh = None\n        ident_mh = None\n\n    ## ok! now do gather -\n    notify(\"Doing gather to generate minimum metagenome cover.\")\n\n    found = 0\n    is_abundance = query.minhash.track_abundance and not args.ignore_abundance\n    orig_query_mh = query.minhash\n    if not orig_query_mh.size_is_accurate():\n        size_may_be_inaccurate = True\n    gather_iter = GatherDatabases(\n        query,\n        counters,\n        threshold_bp=args.threshold_bp,\n        ignore_abundance=args.ignore_abundance,\n        noident_mh=noident_mh,\n        ident_mh=ident_mh,\n        estimate_ani_ci=args.estimate_ani_ci,\n    )\n\n    screen_width = _get_screen_width()\n    sum_f_uniq_found = 0.0\n    result = None\n\n    ### open output handles as needed for (1) saving CSV (2) saving matches\n\n    # save matching signatures?\n    if args.save_matches:\n        notify(f\"saving all matches to '{args.save_matches}'\")\n        save_sig_obj = SaveSignaturesToLocation(args.save_matches)\n        save_sig = save_sig_obj.__enter__()\n    else:\n        save_sig_obj = None\n        save_sig = None\n\n    # save CSV?\n    csv_outfp = io.StringIO()\n    csv_writer = None\n\n    try:\n        for result in gather_iter:\n            found += 1\n            sum_f_uniq_found += result.f_unique_to_query\n\n            if found == 1:  # first result? print header.\n                if is_abundance:\n                    print_results(\"\")\n                    print_results(\"overlap     p_query p_match avg_abund\")\n                    print_results(\"---------   ------- ------- ---------\")\n                else:\n                    print_results(\"\")\n                    print_results(\"overlap     p_query p_match\")\n                    print_results(\"---------   ------- -------\")\n\n            # print interim result & save in `found` list for later use\n            pct_query = f\"{result.f_unique_weighted * 100:.1f}%\"\n            pct_genome = f\"{result.f_match * 100:.1f}%\"\n\n            if is_abundance:\n                name = result.match._display_name(screen_width - 41)\n                average_abund = f\"{result.average_abund:.1f}\"\n                print_results(\n                    \"{:9}   {:>7} {:>7} {:>9}    {}\",\n                    format_bp(result.intersect_bp),\n                    pct_query,\n                    pct_genome,\n                    average_abund,\n                    name,\n                )\n            else:\n                name = result.match._display_name(screen_width - 31)\n                print_results(\n                    \"{:9}   {:>7} {:>7}    {}\",\n                    format_bp(result.intersect_bp),\n                    pct_query,\n                    pct_genome,\n                    name,\n                )\n\n            # write out CSV\n            if args.output:\n                if csv_writer is None:\n                    csv_writer = result.init_dictwriter(csv_outfp)\n                result.write(csv_writer)\n\n            # save matches?\n            if save_sig is not None:\n                save_sig.add(result.match)\n\n            if args.num_results and found >= args.num_results:\n                break\n    finally:\n        if save_sig_obj:\n            save_sig_obj.close()\n            save_sig_obj = None\n            save_sig = None\n\n    # report on thresholding -\n    if gather_iter.query:\n        # if still a query, then we failed the threshold.\n        notify(f\"found less than {format_bp(args.threshold_bp)} in common. => exiting\")\n\n    # basic reporting:\n    if found:\n        print_results(f\"\\nfound {found} matches total;\")\n        if found == args.num_results:\n            print_results(\n                f\"(truncated gather because --num-results={args.num_results})\"\n            )\n    else:\n        display_bp = format_bp(args.threshold_bp)\n        notify(f\"\\nNo matches found for --threshold-bp at {display_bp}.\")\n\n    if found:\n        if is_abundance and result:\n            p_covered = result.sum_weighted_found / result.total_weighted_hashes\n            p_covered *= 100\n            print_results(\n                f\"the recovered matches hit {p_covered:.1f}% of the abundance-weighted query.\"\n            )\n\n        print_results(\n            f\"the recovered matches hit {sum_f_uniq_found * 100:.1f}% of the query k-mers (unweighted).\"\n        )\n\n    print_results(\"\")\n    if gather_iter.scaled != query.minhash.scaled:\n        print_results(\n            f\"WARNING: final scaled was {gather_iter.scaled}, vs query scaled of {query.minhash.scaled}\"\n        )\n\n    # save CSV?\n    if (found and args.output) or args.create_empty_results:\n        with FileOutputCSV(args.output) as fp:\n            fp.write(csv_outfp.getvalue())\n\n    # save unassigned hashes?\n    if args.output_unassigned:\n        remaining_query = gather_iter.query\n        if not (remaining_query.minhash or noident_mh):\n            notify(\"no unassigned hashes to save with --output-unassigned!\")\n        else:\n            notify(f\"saving unassigned hashes to '{args.output_unassigned}'\")\n\n            if noident_mh:\n                remaining_mh = remaining_query.minhash.to_mutable()\n                remaining_mh += noident_mh\n                remaining_query.minhash = remaining_mh\n\n            if is_abundance:\n                abund_query_mh = remaining_query.minhash.inflate(orig_query_mh)\n                remaining_query.minhash = abund_query_mh\n\n            with SaveSignaturesToLocation(args.output_unassigned) as save_sig:\n                save_sig.add(remaining_query)\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    if size_may_be_inaccurate:\n        notify(\n            \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will not be reported for these comparisons.\"\n        )\n    # DONE w/gather function.\n\n\ndef multigather(args):\n    \"Gather many signatures against multiple databases.\"\n    from .search import GatherDatabases, format_bp\n\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n\n    if not args.db:\n        error(\"Error! must specify at least one database with --db\")\n        sys.exit(-1)\n\n    if not args.query and not args.query_from_file:\n        error(\"Error! must specify at least one query signature with --query\")\n        sys.exit(-1)\n\n    scaled = int(args.scaled) if args.scaled else None\n\n    # flatten --db and --query\n    args.db = [item for sublist in args.db for item in sublist]\n    inp_files = [item for sublist in args.query for item in sublist]\n    if args.query_from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.query_from_file)\n        inp_files.extend(more_files)\n\n    # need a query to get ksize, moltype for db loading\n    query = next(\n        iter(\n            sourmash_args.load_file_as_signatures(\n                inp_files[0],\n                ksize=args.ksize,\n                select_moltype=moltype,\n                scaled=scaled,\n            )\n        )\n    )\n\n    if scaled and scaled != query.minhash.scaled:\n        notify(\n            f\"downsampling query from scaled={query.minhash.scaled} to {int(scaled)}\"\n        )\n        with query.update() as query:\n            query.minhash = query.minhash.downsample(scaled=scaled)\n\n    notify(\n        f\"loaded first query: {str(query)[:30]}... (k={query.minhash.ksize}, {sourmash_args.get_moltype(query)}, scaled={query.minhash.scaled})\"\n    )\n\n    databases = sourmash_args.load_dbs_and_sigs(\n        args.db, query, False, fail_on_empty_database=args.fail_on_empty_database\n    )\n\n    # run gather on all the queries.\n    n = 0\n    size_may_be_inaccurate = False\n    output_base_tracking = set()  # make sure we are not reusing 'output_base'\n    for queryfile in inp_files:\n        # load the query signature(s) & figure out all the things\n        for query in sourmash_args.load_file_as_signatures(\n            queryfile, ksize=args.ksize, select_moltype=moltype, scaled=scaled\n        ):\n            notify(\n                f\"loaded query: {str(query)[:30]}... (k={query.minhash.ksize}, {sourmash_args.get_moltype(query)}, scaled={query.minhash.scaled})\"\n            )\n\n            # verify signature was computed right.\n            if not query.minhash.scaled:\n                error(\"query signature needs to be created with --scaled; skipping\")\n                continue\n\n            if scaled and scaled != query.minhash.scaled:\n                notify(\n                    f\"downsampling query from scaled={query.minhash.scaled} to {int(scaled)}\"\n                )\n                with query.update() as query:\n                    query.minhash = query.minhash.downsample(scaled=scaled)\n\n            # empty?\n            if not len(query.minhash):\n                error(\"no query hashes!? skipping to next..\")\n                continue\n\n            counters = []\n            prefetch_query = query.copy()\n            if prefetch_query.minhash.track_abundance:\n                with prefetch_query.update() as prefetch_query:\n                    prefetch_query.minhash = prefetch_query.minhash.flatten()\n\n            ident_mh = prefetch_query.minhash.copy_and_clear()\n            noident_mh = prefetch_query.minhash.to_mutable()\n\n            counters = []\n            for db in databases:\n                try:\n                    counter = db.counter_gather(prefetch_query, args.threshold_bp)\n                except ValueError:\n                    # catch \"no signatures to search\" ValueError if empty db.\n                    continue\n                counters.append(counter)\n\n                # track found/not found hashes\n                union_found = counter.union_found\n                noident_mh.remove_many(union_found)\n                ident_mh.add_many(union_found)\n\n            found = 0\n            is_abundance = query.minhash.track_abundance and not args.ignore_abundance\n            orig_query_mh = query.minhash\n            gather_iter = GatherDatabases(\n                query,\n                counters,\n                threshold_bp=args.threshold_bp,\n                ignore_abundance=args.ignore_abundance,\n                noident_mh=noident_mh,\n                ident_mh=ident_mh,\n            )\n\n            screen_width = _get_screen_width()\n            sum_f_uniq_found = 0.0\n            result = None\n\n            query_filename = query.filename\n            if not query_filename or query_filename == \"-\":\n                # use md5sum if query.filename not properly set\n                output_base = query.md5sum()\n            elif args.output_add_query_md5sum:\n                # Uniquify the output file if all signatures were made from the same file (e.g. with --singleton)\n                assert query_filename and query_filename != \"-\"  # first branch\n                output_base = os.path.basename(query_filename) + \".\" + query.md5sum()\n            else:\n                output_base = os.path.basename(query_filename)\n\n            if args.output_dir:\n                output_base = os.path.join(args.output_dir, output_base)\n\n            # track overwrites of output files!\n            if output_base in output_base_tracking:\n                error(\n                    f\"ERROR: detected overwritten outputs! '{output_base}' has already been used. Failing.\"\n                )\n                if args.force_allow_overwrite_output:\n                    error(\"continuing because --force-allow-overwrite was specified\")\n                else:\n                    error(\n                        \"Consider using '-U/--output-add-query-md5sum' to build unique outputs\"\n                    )\n                    error(\"and/or '--force-allow-overwrite-output'\")\n                    sys.exit(-1)\n\n            output_base_tracking.add(output_base)\n\n            output_matches = output_base + \".matches.sig\"\n            save_sig_obj = SaveSignaturesToLocation(output_matches)\n            save_sig = save_sig_obj.__enter__()\n            notify(f\"saving all matching signatures to '{output_matches}'\")\n\n            # write out basic CSV file\n            output_csv = output_base + \".csv\"\n            notify(f'saving all CSV matches to \"{output_csv}\"')\n            csv_out_obj = FileOutputCSV(output_csv)\n            csv_outfp = csv_out_obj.__enter__()\n            csv_writer = None\n\n            for result in gather_iter:\n                found += 1\n                sum_f_uniq_found += result.f_unique_to_query\n                if found == 1:  # first result? print header.\n                    if is_abundance:\n                        print_results(\"\")\n                        print_results(\"overlap     p_query p_match avg_abund\")\n                        print_results(\"---------   ------- ------- ---------\")\n                    else:\n                        print_results(\"\")\n                        print_results(\"overlap     p_query p_match\")\n                        print_results(\"---------   ------- -------\")\n\n                # print interim result & save in a list for later use\n                pct_query = f\"{result.f_unique_weighted * 100:.1f}%\"\n                pct_genome = f\"{result.f_match * 100:.1f}%\"\n\n                if is_abundance:\n                    name = result.match._display_name(screen_width - 41)\n                    average_abund = f\"{result.average_abund:.1f}\"\n                    print_results(\n                        \"{:9}   {:>7} {:>7} {:>9}    {}\",\n                        format_bp(result.intersect_bp),\n                        pct_query,\n                        pct_genome,\n                        average_abund,\n                        name,\n                    )\n                else:\n                    name = result.match._display_name(screen_width - 31)\n                    print_results(\n                        \"{:9}   {:>7} {:>7}    {}\",\n                        format_bp(result.intersect_bp),\n                        pct_query,\n                        pct_genome,\n                        name,\n                    )\n\n                if csv_writer is None:\n                    csv_writer = result.init_dictwriter(csv_outfp)\n                result.write(csv_writer)\n\n                save_sig.add(result.match)\n\n                # check for size estimation accuracy, which impacts ANI estimation\n                if not size_may_be_inaccurate and result.size_may_be_inaccurate:\n                    size_may_be_inaccurate = True\n\n            # report on thresholding -\n            if gather_iter.query.minhash:\n                # if still a query, then we failed the threshold.\n                notify(\n                    f\"found less than {format_bp(args.threshold_bp)} in common. => exiting\"\n                )\n\n            # basic reporting\n            print_results(\"\\nfound {} matches total;\", found)\n\n            # close saving etc.\n            save_sig_obj.close()\n            save_sig_obj = save_sig = None\n\n            csv_out_obj.close()\n            csv_out_obj = csv_outfp = csv_writer = None\n\n            if is_abundance and result:\n                p_covered = result.sum_weighted_found / result.total_weighted_hashes\n                p_covered *= 100\n                print_results(\n                    f\"the recovered matches hit {p_covered:.1f}% of the abundance-weighted query.\"\n                )\n\n            print_results(\n                f\"the recovered matches hit {sum_f_uniq_found * 100:.1f}% of the query k-mers (unweighted).\"\n            )\n            print_results(\"\")\n\n            if found == 0:\n                notify(\"nothing found... skipping.\")\n                continue\n\n            output_unassigned = output_base + f\".unassigned{args.extension}\"\n            remaining_query = gather_iter.query\n            if noident_mh:\n                remaining_mh = remaining_query.minhash.to_mutable()\n                remaining_mh += noident_mh.downsample(scaled=remaining_mh.scaled)\n                remaining_query.minhash = remaining_mh\n\n            if is_abundance:\n                abund_query_mh = remaining_query.minhash.inflate(orig_query_mh)\n                remaining_query.minhash = abund_query_mh\n\n            if found == 0:\n                notify(\"nothing found - entire query signature unassigned.\")\n            elif not remaining_query:\n                notify(\"no unassigned hashes! not saving.\")\n            else:\n                notify(f'saving unassigned hashes to \"{output_unassigned}\"')\n\n            with SaveSignaturesToLocation(output_unassigned) as save_sig:\n                save_sig.add(remaining_query)\n\n            n += 1\n\n        # fini, next query!\n\n    # done! report at end.\n    notify(f\"\\nconducted gather searches on {n} signatures\")\n    if size_may_be_inaccurate:\n        notify(\n            \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will not be reported for these comparisons.\"\n        )\n\n\ndef watch(args):\n    \"Build a signature from raw FASTA/FASTQ coming in on stdin, search.\"\n    set_quiet(args.quiet)\n\n    if args.input_is_protein and args.dna:\n        notify(\"WARNING: input is protein, turning off nucleotide hashing.\")\n        args.dna = False\n        args.protein = True\n\n    if args.dna and args.protein:\n        notify('ERROR: cannot use \"watch\" with both nucleotide and protein.')\n\n    if args.dna:\n        moltype = \"DNA\"\n        is_protein = False\n        dayhoff = False\n        hp = False\n    elif args.protein:\n        moltype = \"protein\"\n        is_protein = True\n        dayhoff = False\n        hp = False\n    elif args.dayhoff:\n        moltype = \"dayhoff\"\n        is_protein = True\n        dayhoff = True\n        hp = False\n    else:\n        moltype = \"hp\"\n        is_protein = True\n        dayhoff = False\n        hp = True\n\n    tree = load_sbt_index(args.sbt_name)\n\n    # check ksize from the SBT we are loading\n    ksize = args.ksize\n    if ksize is None:\n        leaf = next(iter(tree.leaves()))\n        tree_mh = leaf.data.minhash\n        ksize = tree_mh.ksize\n\n    E = MinHash(\n        ksize=ksize, n=args.num_hashes, is_protein=is_protein, dayhoff=dayhoff, hp=hp\n    )\n\n    notify(f\"Computing signature for k={ksize}, {moltype} from stdin\")\n\n    def do_search():\n        results = []\n        streamsig = sig.SourmashSignature(E, filename=\"stdin\", name=args.name)\n        for similarity, match, _ in tree.search(\n            streamsig,\n            threshold=args.threshold,\n            best_only=True,\n            ignore_abundance=True,\n            do_containment=False,\n        ):\n            results.append((similarity, match))\n\n        return results\n\n    notify(\"reading sequences from stdin\")\n    watermark = WATERMARK_SIZE\n\n    # iterate over input records\n    n = 0\n    with screed.open(args.inp_file) as screed_iter:\n        for n, record in enumerate(screed_iter):\n            # at each watermark, print status & check cardinality\n            if n >= watermark:\n                notify(f\"\\r... read {n} sequences\", end=\"\")\n                watermark += WATERMARK_SIZE\n\n                if do_search():\n                    break\n\n            if args.input_is_protein:\n                E.add_protein(record.sequence)\n            else:\n                E.add_sequence(record.sequence, False)\n\n    results = do_search()\n    if not results:\n        notify(f\"... read {n} sequences, no matches found.\")\n    else:\n        results.sort(key=lambda x: -x[0])  # take best\n        similarity, found_sig = results[0]\n        print_results(\"FOUND: {}, at {:.3f}\", found_sig, similarity)\n\n    if args.output:\n        notify(f\"saving signature to '{args.output}'\")\n        streamsig = sig.SourmashSignature(E, filename=\"stdin\", name=args.name)\n        with SaveSignaturesToLocation(args.output) as save_sig:\n            save_sig.add(streamsig)\n\n\ndef migrate(args):\n    \"Migrate an SBT database to the latest version.\"\n    tree = load_sbt_index(args.sbt_name, print_version_warning=False)\n\n    notify(f'saving SBT under \"{args.sbt_name}\".')\n    tree.save(args.sbt_name, structure_only=True)\n\n\ndef prefetch(args):\n    \"Output the 'raw' results of a containment/overlap search.\"\n\n    # load databases from files, too.\n    if args.db_from_file:\n        more_db = sourmash_args.load_pathlist_from_file(args.db_from_file)\n        args.databases.extend(more_db)\n\n    if not args.databases:\n        notify(\"ERROR: no databases or signatures to search!?\")\n        sys.exit(-1)\n\n    if not (\n        args.save_unmatched_hashes\n        or args.save_matching_hashes\n        or args.save_matches\n        or args.output\n    ):\n        notify(\n            \"WARNING: no output(s) specified! Nothing will be saved from this prefetch!\"\n        )\n\n    # figure out what k-mer size and molecule type we're looking for here\n    ksize = args.ksize\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n\n    # load the query signature & figure out all the things\n    query = sourmash_args.load_query_signature(\n        args.query, ksize=args.ksize, select_moltype=moltype, select_md5=args.md5\n    )\n    notify(\n        f\"loaded query: {str(query)[:30]}... (k={query.minhash.ksize}, {sourmash_args.get_moltype(query)})\"\n    )\n\n    # verify signature was computed with scaled.\n    if not query.minhash.scaled:\n        error(\"query signature needs to be created with --scaled\")\n        sys.exit(-1)\n\n    # if with track_abund, flatten me\n    query_mh = query.minhash\n    orig_query_mh = query_mh\n    if query_mh.track_abundance:\n        query_mh = query_mh.flatten()\n\n    if args.scaled and args.scaled != query_mh.scaled:\n        notify(\n            f\"downsampling query from scaled={query_mh.scaled} to {int(args.scaled)}\"\n        )\n        query_mh = query_mh.downsample(scaled=args.scaled)\n\n    notify(\n        f\"query sketch has scaled={query_mh.scaled}; will be dynamically downsampled as needed.\"\n    )\n    common_scaled = query_mh.scaled\n\n    # empty?\n    if not len(query_mh):\n        error(\"no query hashes!? exiting.\")\n        sys.exit(-1)\n\n    with query.update() as query:\n        query.minhash = query_mh\n    ksize = query_mh.ksize\n\n    # set up CSV output, write headers, etc.\n    csvout_fp = None\n    csvout_w = None\n    if args.output:\n        csvout_fp = FileOutputCSV(args.output).open()\n\n    # track & maybe save matches progressively\n    matches_out = SaveSignaturesToLocation(args.save_matches)\n    matches_out.open()\n    if args.save_matches:\n        notify(f\"saving all matching database signatures to '{args.save_matches}'\")\n\n    # iterate over signatures in db one at a time, for each db;\n    # find those with sufficient overlap\n    ident_mh = query_mh.copy_and_clear()\n    noident_mh = query_mh.to_mutable()\n\n    did_a_search = False  # track whether we did _any_ search at all!\n    size_may_be_inaccurate = False\n    total_signatures_loaded = 0\n    sum_signatures_after_select = 0\n    for dbfilename in args.databases:\n        notify(f\"loading signatures from '{dbfilename}'\", end=\"\\r\")\n\n        db = sourmash_args.load_file_as_index(dbfilename)\n        total_signatures_loaded += len(db)\n\n        # force linear traversal?\n        if args.linear:\n            db = LazyLinearIndex(db)\n\n        db = db.select(ksize=ksize, moltype=moltype, containment=True)\n\n        sum_signatures_after_select += len(db)\n\n        db = sourmash_args.apply_picklist_and_pattern(db, picklist, pattern_search)\n\n        if not db:\n            notify(f\"...no compatible signatures in '{dbfilename}'; skipping\")\n            continue\n\n        for result in prefetch_database(\n            query, db, args.threshold_bp, estimate_ani_ci=args.estimate_ani_ci\n        ):\n            match = result.match\n\n            # ensure we're all on the same page wrt scaled resolution:\n            common_scaled = max(\n                match.minhash.scaled, query.minhash.scaled, common_scaled\n            )\n\n            query_mh = query.minhash.downsample(scaled=common_scaled)\n            match_mh = match.minhash.downsample(scaled=common_scaled)\n\n            if ident_mh.scaled != common_scaled:\n                ident_mh = ident_mh.downsample(scaled=common_scaled)\n            if noident_mh.scaled != common_scaled:\n                noident_mh = noident_mh.downsample(scaled=common_scaled)\n\n            # track found & \"untouched\" hashes.\n            ident_mh += query_mh & match_mh.flatten()\n            noident_mh.remove_many(match_mh)\n\n            # output match info as we go\n            if csvout_fp:\n                if csvout_w is None:\n                    csvout_w = result.init_dictwriter(csvout_fp)\n                result.write(csvout_w)\n\n            # output match signatures as we go (maybe)\n            matches_out.add(match)\n\n            if matches_out.count % 10 == 0:\n                notify(\n                    f\"total of {matches_out.count} matching signatures so far.\",\n                    end=\"\\r\",\n                )\n\n            # keep track of inaccurate size estimation\n            if not size_may_be_inaccurate and result.size_may_be_inaccurate:\n                size_may_be_inaccurate = True\n\n        did_a_search = True\n\n        # flush csvout so that things get saved progressively\n        if csvout_fp:\n            csvout_fp.flush()\n\n        # delete db explicitly ('cause why not)\n        del db\n\n    notify(\"--\")\n    notify(\n        f\"loaded {total_signatures_loaded} total signatures from {len(args.databases)} locations.\"\n    )\n    notify(\n        f\"after selecting signatures compatible with search, {sum_signatures_after_select} remain.\"\n    )\n\n    if not did_a_search:\n        notify(\n            \"ERROR in prefetch: after picklists and patterns, no signatures to search!?\"\n        )\n        sys.exit(-1)\n\n    notify(\"--\")\n    notify(f\"total of {matches_out.count} matching signatures.\")\n    matches_out.close()\n\n    if csvout_fp:\n        notify(f\"saved {matches_out.count} matches to CSV file '{args.output}'\")\n        csvout_fp.close()\n\n    assert len(query_mh) == len(ident_mh) + len(noident_mh)\n    notify(\n        f\"of {len(query_mh)} distinct query hashes, {len(ident_mh)} were found in matches above threshold.\"\n    )\n    notify(f\"a total of {len(noident_mh)} query hashes remain unmatched.\")\n    notify(f\"final scaled value (max across query and all matches) is {common_scaled}\")\n\n    if args.save_matching_hashes:\n        filename = args.save_matching_hashes\n        notify(f\"saving {len(ident_mh)} matched hashes to '{filename}'\")\n\n        sig_name = \"\"\n        if query.name:\n            sig_name = f\"{query.name}-known\"\n\n        # restore abundances, if present in original query\n        if orig_query_mh.track_abundance:\n            ident_mh = ident_mh.inflate(orig_query_mh)\n\n        ss = sig.SourmashSignature(ident_mh, name=sig_name)\n        with SaveSignaturesToLocation(filename) as save_sig:\n            save_sig.add(ss)\n\n    if args.save_unmatched_hashes:\n        filename = args.save_unmatched_hashes\n\n        sig_name = \"\"\n        if query.name:\n            sig_name = f\"{query.name}-unknown\"\n\n        notify(f\"saving {len(noident_mh)} unmatched hashes to '{filename}'\")\n\n        # restore abundances, if present in original query\n        if orig_query_mh.track_abundance:\n            noident_mh = noident_mh.inflate(orig_query_mh)\n\n        ss = sig.SourmashSignature(noident_mh, name=sig_name)\n        with SaveSignaturesToLocation(filename) as save_sig:\n            save_sig.add(ss)\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    if size_may_be_inaccurate:\n        notify(\n            \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will not be reported for these comparisons.\"\n        )\n\n    return 0\n"
  },
  {
    "path": "src/sourmash/compare.py",
    "content": "\"\"\"Functionality for comparing many signatures, used in sourmash compare.\"\"\"\n\nimport itertools\nfrom functools import partial\nimport time\nimport multiprocessing\n\nfrom sourmash.sketchcomparison import FracMinHashComparison\n\nfrom .logging import notify\nfrom sourmash.np_utils import to_memmap\n\n\ndef compare_serial(siglist, ignore_abundance, *, downsample=False, return_ani=False):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of similarities. Processes combinations serially on a single\n    process. Best to use when there is few signatures.\n\n    :param list siglist: list of signatures to compare\n    :param boolean ignore_abundance\n        If the sketches are not abundance weighted, or ignore_abundance=True,\n        compute Jaccard similarity.\n\n        If the sketches are abundance weighted, calculate the angular\n        similarity.\n    :param boolean downsample by scaled if True\n    :return: np.array similarity matrix\n    \"\"\"\n    import numpy as np\n\n    n = len(siglist)\n    jaccard_ani_untrustworthy = False\n    potential_false_negatives = False\n\n    # Combinations makes all unique sets of pairs, e.g. (A, B) but not (B, A)\n    iterator = itertools.combinations(range(n), 2)\n\n    similarities = np.ones((n, n))\n\n    for i, j in iterator:\n        if return_ani:\n            ani_result = siglist[i].jaccard_ani(siglist[j], downsample=downsample)\n            if not potential_false_negatives and ani_result.p_exceeds_threshold:\n                potential_false_negatives = True\n            if not jaccard_ani_untrustworthy and ani_result.je_exceeds_threshold:\n                jaccard_ani_untrustworthy = True\n            ani = ani_result.ani\n            if ani is None:\n                ani = 0.0\n            similarities[i][j] = similarities[j][i] = ani\n        else:\n            similarities[i][j] = similarities[j][i] = siglist[i].similarity(\n                siglist[j], ignore_abundance=ignore_abundance, downsample=downsample\n            )\n\n    if jaccard_ani_untrustworthy:\n        notify(\n            \"WARNING: Jaccard estimation for at least one of these comparisons is likely inaccurate. Could not estimate ANI for these comparisons.\"\n        )\n    if potential_false_negatives:\n        notify(\n            \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        )\n    return similarities\n\n\ndef compare_serial_containment(siglist, *, downsample=False, return_ani=False):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of containments. Processes combinations serially on a single\n    process. Best to only use when there are few signatures.\n\n    :param list siglist: list of signatures to compare\n    :param boolean downsample by scaled if True\n    :return: np.array similarity matrix\n    \"\"\"\n    import numpy as np\n\n    n = len(siglist)\n    potential_false_negatives = False\n\n    containments = np.ones((n, n))\n    for i in range(n):\n        for j in range(n):\n            if i == j:\n                containments[i][j] = 1\n            elif return_ani:\n                ani_result = siglist[j].containment_ani(\n                    siglist[i], downsample=downsample\n                )\n                ani = ani_result.ani\n                if not potential_false_negatives and ani_result.p_exceeds_threshold:\n                    potential_false_negatives = True\n                if ani is None:\n                    ani = 0.0\n                containments[i][j] = ani\n            else:\n                containments[i][j] = siglist[j].contained_by(\n                    siglist[i], downsample=downsample\n                )\n\n    if potential_false_negatives:\n        notify(\n            \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        )\n\n    return containments\n\n\ndef compare_serial_max_containment(siglist, *, downsample=False, return_ani=False):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of max_containments. Processes combinations serially on a single\n    process. Best to only use when there are few signatures.\n\n    :param list siglist: list of signatures to compare\n    :param boolean downsample by scaled if True\n    :return: np.array similarity matrix\n    \"\"\"\n    import numpy as np\n\n    n = len(siglist)\n    potential_false_negatives = False\n    # Combinations makes all unique sets of pairs, e.g. (A, B) but not (B, A)\n    iterator = itertools.combinations(range(n), 2)\n\n    containments = np.ones((n, n))\n\n    for i, j in iterator:\n        if return_ani:\n            ani_result = siglist[j].max_containment_ani(\n                siglist[i], downsample=downsample\n            )\n            ani = ani_result.ani\n            if not potential_false_negatives and ani_result.p_exceeds_threshold:\n                potential_false_negatives = True\n            if ani is None:\n                ani = 0.0\n            containments[i][j] = containments[j][i] = ani\n        else:\n            containments[i][j] = containments[j][i] = siglist[j].max_containment(\n                siglist[i], downsample=downsample\n            )\n    if potential_false_negatives:\n        notify(\n            \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        )\n\n    return containments\n\n\ndef compare_serial_avg_containment(siglist, *, downsample=False, return_ani=False):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of avg_containments. Processes combinations serially on a single\n    process. Best to only use when there are few signatures.\n\n    :param list siglist: list of signatures to compare\n    :param boolean downsample by scaled if True\n    :return: np.array similarity matrix\n    \"\"\"\n    import numpy as np\n\n    n = len(siglist)\n    potential_false_negatives = False\n    # Combinations makes all unique sets of pairs, e.g. (A, B) but not (B, A)\n    iterator = itertools.combinations(range(n), 2)\n\n    containments = np.ones((n, n))\n\n    for i, j in iterator:\n        if return_ani:\n            cmp = FracMinHashComparison(siglist[j].minhash, siglist[i].minhash)\n            ani = cmp.avg_containment_ani\n            if ani is None:\n                ani = 0.0\n            if not potential_false_negatives and cmp.potential_false_negative:\n                potential_false_negatives = True\n            containments[i][j] = containments[j][i] = ani\n        else:\n            containments[i][j] = containments[j][i] = siglist[j].avg_containment(\n                siglist[i], downsample=downsample\n            )\n\n    if potential_false_negatives:\n        notify(\n            \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        )\n\n    return containments\n\n\ndef similarity_args_unpack(args, ignore_abundance, *, downsample, return_ani=False):\n    \"\"\"Helper function to unpack the arguments. Written to use in pool.imap\n    as it can only be given one argument.\"\"\"\n    sig1, sig2 = args\n    if return_ani:\n        ani = sig1.jaccard_ani(sig2, downsample=downsample).ani\n        if ani is None:\n            ani = 0.0\n        return ani\n    else:\n        return sig1.similarity(\n            sig2, ignore_abundance=ignore_abundance, downsample=downsample\n        )\n\n\ndef get_similarities_at_index(\n    index, ignore_abundance, downsample, siglist, *, return_ani=False\n):\n    \"\"\"Returns similarities of all the combinations of signature at index in\n    the siglist with the rest of the indices starting at index + 1. Doesn't\n    redundantly calculate signatures with all the other indices prior to\n    index - 1\n\n    :param int index: generate masks from this image\n    :param boolean ignore_abundance\n        If the sketches are not abundance weighted, or ignore_abundance=True,\n        compute Jaccard similarity.\n\n        If the sketches are abundance weighted, calculate the angular\n        similarity.\n    :param boolean downsample by scaled if True\n    :param siglist list of signatures\n    :return: list of similarities for the combinations of signature at index\n        with rest of the signatures from index+1\n    \"\"\"\n    startt = time.time()\n    sig_iterator = itertools.product([siglist[index]], siglist[index + 1 :])\n    func = partial(\n        similarity_args_unpack,\n        ignore_abundance=ignore_abundance,\n        downsample=downsample,\n        return_ani=return_ani,\n    )\n    similarity_list = list(map(func, sig_iterator))\n    notify(\n        f\"comparison for index {index} done in {time.time() - startt:.5f} seconds\",\n        end=\"\\r\",\n    )\n    return similarity_list\n\n\ndef compare_parallel(\n    siglist, ignore_abundance, downsample, n_jobs, *, return_ani=False\n):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of similarities. Processes combinations parallely on number of processes\n    given by n_jobs\n\n    :param list siglist: list of signatures to compare\n    :param boolean ignore_abundance\n        If the sketches are not abundance weighted, or ignore_abundance=True,\n        compute Jaccard similarity.\n\n        If the sketches are abundance weighted, calculate the angular\n        similarity.\n    :param boolean downsample by scaled if True\n    :param int n_jobs number of processes to run the similarity calculations on\n    :return: np.array similarity matrix\n    \"\"\"\n    import numpy as np\n\n    # Starting time - calculate time to keep track in case of lengthy siglist\n    start_initial = time.time()\n\n    # Create a memory map of the siglist using numpy to avoid memory burden\n    # while accessing small parts in it\n    siglist, _ = to_memmap(np.array(siglist))\n    notify(\"Created memmapped siglist\")\n\n    # Check that length of combinations can result in a square similarity matrix\n    length_siglist = len(siglist)\n\n    # Initialize with ones in the diagonal as the similarity of a signature with\n    # itself is one\n    similarities = np.eye(length_siglist, dtype=np.float64)\n    memmap_similarities, filename = to_memmap(similarities)\n    notify(\"Initialized memmapped similarities matrix\")\n\n    # Initialize the function using func.partial with the common arguments like\n    # siglist, ignore_abundance, downsample, for computing all the signatures\n    # The only changing parameter that will be mapped from the pool is the index\n    func = partial(\n        get_similarities_at_index,\n        siglist=siglist,\n        ignore_abundance=ignore_abundance,\n        downsample=downsample,\n        return_ani=return_ani,\n    )\n    notify(\"Created similarity func\")\n\n    # Initialize multiprocess.pool\n    pool = multiprocessing.Pool(processes=n_jobs)\n\n    # Calculate chunk size, by default pool.imap chunk size is 1\n    chunksize, extra = divmod(length_siglist, n_jobs)\n    if extra:\n        chunksize += 1\n    notify(\"Calculated chunk size for multiprocessing\")\n\n    # This will not generate the results yet, since pool.imap returns a generator\n    result = pool.imap(func, range(length_siglist), chunksize=chunksize)\n    notify(\"Initialized multiprocessing pool.imap\")\n\n    # Enumerate and calculate similarities at each of the indices\n    # and set the results at the appropriate combination coordinate\n    # locations inside the similarity matrix\n    for index, l in enumerate(result):\n        startt = time.time()\n        col_idx = index + 1\n        for idx_condensed, item in enumerate(l):\n            memmap_similarities[index, col_idx + idx_condensed] = memmap_similarities[\n                idx_condensed + col_idx, index\n            ] = item\n        notify(\n            f\"Setting similarities matrix for index {index} done in {time.time() - startt:.5f} seconds\",\n            end=\"\\r\",\n        )\n    notify(\"Setting similarities completed\")\n\n    pool.close()\n    pool.join()\n\n    notify(\n        f\"Time taken to compare all pairs parallely is {time.time() - start_initial:.5f} seconds \"\n    )\n    return np.memmap(filename, dtype=np.float64, shape=(length_siglist, length_siglist))\n\n\ndef compare_all_pairs(\n    siglist, ignore_abundance, downsample=False, n_jobs=None, return_ani=False\n):\n    \"\"\"Compare all combinations of signatures and return a matrix\n    of similarities. Processes combinations either serially or\n    based on parallely on number of processes given by n_jobs\n\n    :param list siglist: list of signatures to compare\n    :param boolean ignore_abundance\n        If the sketches are not abundance weighted, or ignore_abundance=True,\n        compute Jaccard similarity.\n\n        If the sketches are abundance weighted, calculate the angular\n        similarity.\n    :param boolean downsample by scaled if True\n    :param int n_jobs number of processes to run the similarity calculations on,\n    if number of jobs is None or 1, compare serially, otherwise parallely.\n    :return: np.array similarity matrix\n    \"\"\"\n    if n_jobs is None or n_jobs == 1:\n        similarities = compare_serial(\n            siglist,\n            ignore_abundance=ignore_abundance,\n            downsample=downsample,\n            return_ani=return_ani,\n        )\n    else:\n        similarities = compare_parallel(\n            siglist, ignore_abundance, downsample, n_jobs, return_ani=return_ani\n        )\n    return similarities\n"
  },
  {
    "path": "src/sourmash/distance_utils.py",
    "content": "\"\"\"\nUtilities for jaccard/containment --> distance estimation\nEquations from: https://github.com/KoslickiLab/mutation-rate-ci-calculator\nReference: https://doi.org/10.1101/2022.01.11.475870\n\"\"\"\n\nfrom dataclasses import dataclass, field\nfrom scipy.optimize import brentq\nfrom scipy.stats import norm as scipy_norm\nfrom scipy.stats import binom\nimport numpy as np\nfrom math import log, exp\n\nfrom .logging import notify\n\n\ndef check_distance(dist):\n    if not 0 <= dist <= 1:\n        raise ValueError(f\"Error: distance value {dist:.4f} is not between 0 and 1!\")\n    else:\n        return dist\n\n\ndef check_prob_threshold(val, threshold=1e-3):\n    \"\"\"\n    Check likelihood of no shared hashes based on chance alone (false neg).\n    If too many exceed threshold, recommend user lower their scaled value.\n    # !! when using this, keep count and recommend user lower scaled val\n    \"\"\"\n    exceeds_threshold = False\n    if threshold is not None and val > threshold:\n        exceeds_threshold = True\n    return val, exceeds_threshold\n\n\ndef check_jaccard_error(val, threshold=1e-4):\n    exceeds_threshold = False\n    if threshold is not None and val > threshold:\n        exceeds_threshold = True\n    return val, exceeds_threshold\n\n\n@dataclass\nclass ANIResult:\n    \"\"\"Base class for distance/ANI from k-mer containment.\"\"\"\n\n    dist: float\n    p_nothing_in_common: float\n    p_threshold: float = 1e-3\n    size_is_inaccurate: bool = False\n    p_exceeds_threshold: bool = field(init=False)\n\n    def check_dist_and_p_threshold(self):\n        # check values\n        self.dist = check_distance(self.dist)\n        self.p_nothing_in_common, self.p_exceeds_threshold = check_prob_threshold(\n            self.p_nothing_in_common, self.p_threshold\n        )\n\n    def __post_init__(self):\n        self.check_dist_and_p_threshold()\n\n    @property\n    def ani(self):\n        if self.size_is_inaccurate:\n            return None\n        return 1 - self.dist\n\n\n@dataclass\nclass jaccardANIResult(ANIResult):\n    \"\"\"Class for distance/ANI from jaccard (includes jaccard_error).\"\"\"\n\n    jaccard_error: float = None\n    je_threshold: float = 1e-4\n\n    def __post_init__(self):\n        # check values\n        self.check_dist_and_p_threshold()\n        # check jaccard error\n        if self.jaccard_error is not None:\n            self.jaccard_error, self.je_exceeds_threshold = check_jaccard_error(\n                self.jaccard_error, self.je_threshold\n            )\n        else:\n            raise ValueError(\"Error: jaccard_error cannot be None.\")\n\n    @property\n    def ani(self):\n        # if jaccard error is too high (exceeds threshold), do not trust ANI estimate\n        if self.je_exceeds_threshold or self.size_is_inaccurate:\n            return None\n        return 1 - self.dist\n\n\n@dataclass\nclass ciANIResult(ANIResult):\n    \"\"\"\n    Class for distance/ANI from containment: with confidence intervals.\n\n    Set CI defaults to None, just in case CI can't be estimated for given sample.\n    \"\"\"\n\n    dist_low: float = None\n    dist_high: float = None\n\n    def __post_init__(self):\n        # check values\n        self.check_dist_and_p_threshold()\n\n        if self.dist_low is not None and self.dist_high is not None:\n            self.dist_low = check_distance(self.dist_low)\n            self.dist_high = check_distance(self.dist_high)\n\n    @property\n    def ani_low(self):\n        if self.dist_high is None or self.size_is_inaccurate:\n            return None\n        return 1 - self.dist_high\n\n    @property\n    def ani_high(self):\n        if self.dist_low is None or self.size_is_inaccurate:\n            return None\n        return 1 - self.dist_low\n\n\ndef r1_to_q(k, r1):\n    r1 = float(r1)\n    q = 1 - (1 - r1) ** k\n    return float(q)\n\n\ndef var_n_mutated(L, k, r1, *, q=None):\n    # there are computational issues in the variance formula that we solve here\n    # by the use of higher-precision arithmetic; the problem occurs when r is\n    # very small; for example, with L=10,k=2,r1=1e-6 standard precision\n    # gives varN<0 which is nonsense; by using the mpf type, we get the correct\n    # answer which is about 0.000038.\n    if r1 == 0:\n        return 0.0\n    r1 = float(r1)\n    if q is None:  # we assume that if q is provided, it is correct for r1\n        q = r1_to_q(k, r1)\n    varN = (\n        L * (1 - q) * (q * (2 * k + (2 / r1) - 1) - 2 * k)\n        + k * (k - 1) * (1 - q) ** 2\n        + (2 * (1 - q) / (r1**2)) * ((1 + (k - 1) * (1 - q)) * r1 - q)\n    )\n    if varN < 0.0:  # this seems to happen only with super tiny test data\n        raise ValueError(\"Error: varN <0.0!\")\n    return float(varN)\n\n\ndef exp_n_mutated(L, k, r1):\n    q = r1_to_q(k, r1)\n    return L * q\n\n\ndef exp_n_mutated_squared(L, k, p):\n    return var_n_mutated(L, k, p) + exp_n_mutated(L, k, p) ** 2\n\n\ndef probit(p):\n    return scipy_norm.ppf(p)\n\n\ndef handle_seqlen_nkmers(ksize, *, sequence_len_bp=None, n_unique_kmers=None):\n    if n_unique_kmers is not None:\n        return n_unique_kmers\n    elif sequence_len_bp is None:\n        # both are None, raise ValueError\n        raise ValueError(\n            \"Error: distance estimation requires input of either 'sequence_len_bp' or 'n_unique_kmers'\"\n        )\n    else:\n        n_unique_kmers = sequence_len_bp - (ksize - 1)\n        return n_unique_kmers\n\n\ndef set_size_chernoff(set_size, scaled, *, relative_error=0.05):\n    \"\"\"\n    Computes the probability that the estimate: sketch_size * scaled deviates from the true\n    set_size by more than relative_error. This relies on the fact that the sketch_size\n    is binomially distributed with parameters sketch_size and 1/scale. The two-sided Chernoff\n    bounds are used. This is depreciated in favor of set_size_exact_prob due to the later\n    being accurate even for very small set sizes\n    @param set_size: The number of distinct k-mers in the given set\n    @param relative_error: the desired relative error (defaults to 5%)\n    @return: float (the upper bound probability)\n    \"\"\"\n    upper_bound = 1 - 2 * np.exp(-(relative_error**2) * set_size / (scaled * 3))\n    return upper_bound\n\n\ndef set_size_exact_prob(set_size, scaled, *, relative_error=0.05):\n    \"\"\"\n    Computes the exact probability that the estimate: sketch_size * scaled deviates from the true\n    set_size by more than relative_error. This relies on the fact that the sketch_size\n    is binomially distributed with parameters sketch_size and 1/scale. The CDF of the binomial distribution\n    is used.\n    @param set_size: The number of distinct k-mers in the given set\n    @param relative_error: the desired relative error (defaults to 5%)\n    @return: float (the upper bound probability)\n    \"\"\"\n    # Need to check if the edge case is an integer or not. If not, don't include it in the equation\n    pmf_arg = -set_size / scaled * (relative_error - 1)\n    if pmf_arg == int(pmf_arg):\n        prob = (\n            binom.cdf(set_size / scaled * (relative_error + 1), set_size, 1 / scaled)\n            - binom.cdf(-set_size / scaled * (relative_error - 1), set_size, 1 / scaled)\n            + binom.pmf(-set_size / scaled * (relative_error - 1), set_size, 1 / scaled)\n        )\n    else:\n        prob = binom.cdf(\n            set_size / scaled * (relative_error + 1), set_size, 1 / scaled\n        ) - binom.cdf(-set_size / scaled * (relative_error - 1), set_size, 1 / scaled)\n    return prob\n\n\ndef get_expected_log_probability(n_unique_kmers, ksize, mutation_rate, scaled_fraction):\n    \"\"\"helper function\n    Note that scaled here needs to be between 0 and 1\n    (e.g. scaled 1000 --> scaled_fraction 0.001)\n    \"\"\"\n    exp_nmut = exp_n_mutated(n_unique_kmers, ksize, mutation_rate)\n    try:\n        return (n_unique_kmers - exp_nmut) * log(1.0 - scaled_fraction)\n    except:\n        return float(\"-inf\")\n\n\ndef get_exp_probability_nothing_common(\n    mutation_rate, ksize, scaled, *, n_unique_kmers=None, sequence_len_bp=None\n):\n    \"\"\"\n    Given parameters, calculate the expected probability that nothing will be common\n    between a fracminhash sketch of a original sequence and a fracminhash sketch of a mutated\n    sequence. If this is above a threshold, we should suspect that the two sketches may have\n    nothing in common. The threshold needs to be set with proper insights.\n\n    Arguments: n_unique_kmers, ksize, mutation_rate, scaled\n    Returns: float - expected likelihood that nothing is common between sketches\n    \"\"\"\n    n_unique_kmers = handle_seqlen_nkmers(\n        ksize, sequence_len_bp=sequence_len_bp, n_unique_kmers=n_unique_kmers\n    )\n    f_scaled = 1.0 / float(scaled)\n    if mutation_rate == 1.0:\n        return 1.0\n    elif mutation_rate == 0.0:\n        return 0.0\n    return exp(\n        get_expected_log_probability(n_unique_kmers, ksize, mutation_rate, f_scaled)\n    )\n\n\ndef containment_to_distance(\n    containment,\n    ksize,\n    scaled,\n    *,\n    n_unique_kmers=None,\n    sequence_len_bp=None,\n    confidence=0.95,\n    estimate_ci=False,\n    prob_threshold=1e-3,\n):\n    \"\"\"\n    Containment --> distance CI (one step)\n    \"\"\"\n    sol1, sol2, point_estimate = None, None, None\n    n_unique_kmers = handle_seqlen_nkmers(\n        ksize, sequence_len_bp=sequence_len_bp, n_unique_kmers=n_unique_kmers\n    )\n    if containment == 0:\n        # point_estimate = 1.0\n        point_estimate = sol1 = sol2 = 1.0\n    elif containment == 1:\n        # point_estimate = 0.0\n        point_estimate = sol1 = sol2 = 0.0\n    else:\n        point_estimate = 1.0 - containment ** (1.0 / ksize)\n        if estimate_ci:\n            try:\n                alpha = 1 - confidence\n                z_alpha = probit(1 - alpha / 2)\n                f_scaled = (\n                    1.0 / scaled\n                )  # these use scaled as a fraction between 0 and 1\n\n                bias_factor = 1 - (1 - f_scaled) ** n_unique_kmers\n\n                term_1 = (1.0 - f_scaled) / (\n                    f_scaled * n_unique_kmers**3 * bias_factor**2\n                )\n\n                def term_2(pest):\n                    return n_unique_kmers * exp_n_mutated(\n                        n_unique_kmers, ksize, pest\n                    ) - exp_n_mutated_squared(n_unique_kmers, ksize, pest)\n\n                def term_3(pest):\n                    return (\n                        var_n_mutated(n_unique_kmers, ksize, pest) / n_unique_kmers**2\n                    )\n\n                def var_direct(pest):\n                    return term_1 * term_2(pest) + term_3(pest)\n\n                def f1(pest):\n                    return (\n                        (1 - pest) ** ksize\n                        + z_alpha * np.sqrt(var_direct(pest))\n                        - containment\n                    )\n\n                def f2(pest):\n                    return (\n                        (1 - pest) ** ksize\n                        - z_alpha * np.sqrt(var_direct(pest))\n                        - containment\n                    )\n\n                sol1 = brentq(f1, 0.0000001, 0.9999999)\n                sol2 = brentq(f2, 0.0000001, 0.9999999)\n\n            except ValueError as exc:\n                # afaict, this only happens with extremely small test data\n                notify(\n                    \"WARNING: Cannot estimate ANI confidence intervals from containment. Do your sketches contain enough hashes?\"\n                )\n                notify(str(exc))\n                sol1 = sol2 = None\n\n    # Do this here, so that we don't need to reconvert distance <--> identity later.\n    prob_nothing_in_common = get_exp_probability_nothing_common(\n        point_estimate, ksize, scaled, n_unique_kmers=n_unique_kmers\n    )\n    return ciANIResult(\n        point_estimate,\n        prob_nothing_in_common,\n        dist_low=sol2,\n        dist_high=sol1,\n        p_threshold=prob_threshold,\n    )\n\n\ndef jaccard_to_distance(\n    jaccard,\n    ksize,\n    scaled,\n    *,\n    n_unique_kmers=None,\n    sequence_len_bp=None,\n    prob_threshold=1e-3,\n    err_threshold=1e-4,\n):\n    \"\"\"\n    Given parameters, calculate point estimate for mutation rate from jaccard index.\n    Uses formulas derived mathematically to compute the point estimate. The formula uses\n    approximations, therefore a tiny error is associated with it. A lower bound of that error\n    is also returned. A high error indicates that the point estimate cannot be trusted.\n    Threshold of the error is open to interpretation, but suggested that > 10^-4 should be\n    handled with caution.\n\n    Note that the error is NOT a mutation rate, and therefore cannot be considered in\n    something like mut.rate +/- error.\n\n    Arguments: jaccard, ksize, scaled, n_unique_kmers\n    # Returns: tuple (point_estimate_of_mutation_rate, lower_bound_of_error)\n\n    # Returns: JaccardANIResult\n\n    Note: point estimate does not consider impact of scaled, but p_nothing_in_common can be\n    useful for determining whether scaled is sufficient for these comparisons.\n    \"\"\"\n    error_lower_bound = None\n    n_unique_kmers = handle_seqlen_nkmers(\n        ksize, sequence_len_bp=sequence_len_bp, n_unique_kmers=n_unique_kmers\n    )\n    if jaccard == 0:\n        point_estimate = 1.0\n        error_lower_bound = 0.0\n    elif jaccard == 1:\n        point_estimate = 0.0\n        error_lower_bound = 0.0\n    else:\n        point_estimate = 1.0 - (2.0 * jaccard / float(1 + jaccard)) ** (\n            1.0 / float(ksize)\n        )\n\n        exp_n_mut = exp_n_mutated(n_unique_kmers, ksize, point_estimate)\n        var_n_mut = var_n_mutated(n_unique_kmers, ksize, point_estimate)\n        error_lower_bound = (\n            1.0 * n_unique_kmers * var_n_mut / (n_unique_kmers + exp_n_mut) ** 3\n        )\n    prob_nothing_in_common = get_exp_probability_nothing_common(\n        point_estimate, ksize, scaled, n_unique_kmers=n_unique_kmers\n    )\n    return jaccardANIResult(\n        point_estimate,\n        prob_nothing_in_common,\n        jaccard_error=error_lower_bound,\n        p_threshold=prob_threshold,\n        je_threshold=err_threshold,\n    )\n"
  },
  {
    "path": "src/sourmash/exceptions.py",
    "content": "from ._lowlevel import lib\n\n\n__all__ = [\"SourmashError\"]\nexceptions_by_code = {}\n\n\nclass SourmashError(Exception):\n    code = None\n\n    def __init__(self, msg):\n        Exception.__init__(self)\n        self.message = msg\n        self.rust_info = None\n\n    def __str__(self):\n        rv = self.message\n        if self.rust_info is not None:\n            return f\"{rv}\\n\\n{self.rust_info}\"\n        return rv\n\n\nclass IndexNotSupported(SourmashError):\n    def __init__(self):\n        SourmashError.__init__(\n            self, \"This index format is not supported in this version of sourmash\"\n        )\n\n\nclass IndexNotLoaded(SourmashError):\n    def __init__(self, msg):\n        SourmashError.__init__(self, f\"Cannot load sourmash index: {str(msg)}\")\n\n\ndef _make_error(error_name, base=SourmashError, code=None):\n    class Exc(base):\n        pass\n\n    Exc.__name__ = Exc.__qualname__ = error_name\n    if code is not None:\n        Exc.code = code\n    globals()[Exc.__name__] = Exc\n    __all__.append(Exc.__name__)\n    return Exc\n\n\ndef _get_error_base(error_name):\n    pieces = error_name.split(\"Error\", 1)\n    if len(pieces) == 2 and pieces[0] and pieces[1]:\n        base_error_name = pieces[0] + \"Error\"\n        base_class = globals().get(base_error_name)\n        if base_class is None:\n            base_class = _make_error(base_error_name)\n        return base_class\n    return SourmashError\n\n\ndef _make_exceptions():\n    for attr in dir(lib):\n        if not attr.startswith(\"SOURMASH_ERROR_CODE_\"):\n            continue\n\n        code = getattr(lib, attr)\n        if code == 1104:\n            exceptions_by_code[code] = ValueError\n        elif code < 100 or code > 10000:\n            error_name = attr[20:].title().replace(\"_\", \"\")\n            base = _get_error_base(error_name)\n            exc = _make_error(error_name, base=base, code=getattr(lib, attr))\n            exceptions_by_code[exc.code] = exc\n        else:\n            exceptions_by_code[code] = ValueError\n\n\n_make_exceptions()\n"
  },
  {
    "path": "src/sourmash/fig.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nMake plots using the distance matrix+labels output by `sourmash compare`.\n\"\"\"\n\nfrom .logging import error, notify\n\ntry:\n    import numpy\n    import pylab\n    import scipy.cluster.hierarchy as sch\nexcept (RuntimeError, ImportError):\n    pass\n\n\ndef load_matrix_and_labels(basefile):\n    \"\"\"Load the comparison matrix and associated labels.\n\n    Returns a square numpy matrix & list of labels.\n    \"\"\"\n    D = numpy.load(open(basefile, \"rb\"))\n    labeltext = [x.strip() for x in open(basefile + \".labels.txt\")]\n    return (D, labeltext)\n\n\ndef plot_composite_matrix(\n    D, labeltext, show_labels=True, vmax=1.0, vmin=0.0, force=False\n):\n    \"\"\"Build a composite plot showing dendrogram + distance matrix/heatmap.\n\n    Returns a matplotlib figure.\n\n    If show_labels is True, display labels. Otherwise, no labels are\n    shown on the plot.\n    \"\"\"\n    if D.max() > 1.0 or D.min() < 0.0:\n        error(\n            \"This matrix doesn't look like a distance matrix - min value {}, max value {}\",\n            D.min(),\n            D.max(),\n        )\n        if not force:\n            raise ValueError(\"not a distance matrix\")\n        else:\n            notify(\"force is set; scaling to [0, 1]\")\n            D -= D.min()\n            D /= D.max()\n\n    if show_labels:\n        pass\n\n    fig = pylab.figure(figsize=(11, 8))\n    ax1 = fig.add_axes([0.09, 0.1, 0.2, 0.6])\n\n    # plot dendrogram\n    Y = sch.linkage(D, method=\"single\")  # centroid\n\n    Z1 = sch.dendrogram(\n        Y,\n        orientation=\"left\",\n        labels=labeltext,\n        no_labels=not show_labels,\n        get_leaves=True,\n    )\n    ax1.set_xticks([])\n\n    xstart = 0.45\n    width = 0.45\n    if not show_labels:\n        xstart = 0.315\n    scale_xstart = xstart + width + 0.01\n\n    # re-order labels along rows, top to bottom\n    idx1 = Z1[\"leaves\"]\n    reordered_labels = [labeltext[i] for i in idx1]\n\n    # reorder D by the clustering in the dendrogram\n    D = D[idx1, :]\n    D = D[:, idx1]\n\n    # show matrix\n    axmatrix = fig.add_axes([xstart, 0.1, width, 0.6])\n\n    im = axmatrix.matshow(\n        D, aspect=\"auto\", origin=\"lower\", cmap=pylab.cm.YlGnBu, vmin=vmin, vmax=vmax\n    )\n    axmatrix.set_xticks([])\n    axmatrix.set_yticks([])\n\n    # Plot colorbar.\n    axcolor = fig.add_axes([scale_xstart, 0.1, 0.02, 0.6])\n    pylab.colorbar(im, cax=axcolor)\n\n    return fig, reordered_labels, D\n"
  },
  {
    "path": "src/sourmash/hll.py",
    "content": "# -*- coding: UTF-8 -*-\n\nimport sys\nfrom tempfile import NamedTemporaryFile\n\nfrom ._lowlevel import ffi, lib\nfrom .utils import RustObject, rustcall, decode_str\nfrom .exceptions import SourmashError\nfrom .minhash import to_bytes, MinHash\n\n\nclass HLL(RustObject):\n    __dealloc_func__ = lib.hll_free\n\n    def __init__(self, error_rate, ksize):\n        self._objptr = lib.hll_with_error_rate(error_rate, ksize)\n\n    def __len__(self):\n        return self.cardinality()\n\n    def cardinality(self):\n        return self._methodcall(lib.hll_cardinality)\n\n    @property\n    def ksize(self):\n        return self._methodcall(lib.hll_ksize)\n\n    def add_sequence(self, sequence, force=False):\n        \"Add a sequence into the sketch.\"\n        self._methodcall(lib.hll_add_sequence, to_bytes(sequence), len(sequence), force)\n\n    def add_kmer(self, kmer):\n        \"Add a kmer into the sketch.\"\n        if len(kmer) != self.ksize:\n            raise ValueError(f\"kmer to add is not {self.ksize} in length\")\n        self.add_sequence(kmer)\n\n    def add(self, h):\n        if isinstance(h, str):\n            return self.add_kmer(h)\n        return self._methodcall(lib.hll_add_hash, h)\n\n    def update(self, other):\n        if isinstance(other, HLL):\n            return self._methodcall(lib.hll_merge, other._objptr)\n        elif isinstance(other, MinHash):\n            return self._methodcall(lib.hll_update_mh, other._objptr)\n        else:\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise TypeError(\"Must be a HyperLogLog or MinHash\")\n\n    def similarity(self, other):\n        if isinstance(other, HLL):\n            return self._methodcall(lib.hll_similarity, other._objptr)\n        else:\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise TypeError(\"other must be a HyperLogLog\")\n\n    def containment(self, other):\n        if isinstance(other, HLL):\n            return self._methodcall(lib.hll_containment, other._objptr)\n        else:\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise TypeError(\"other must be a HyperLogLog\")\n\n    def intersection(self, other):\n        if isinstance(other, HLL):\n            return self._methodcall(lib.hll_intersection_size, other._objptr)\n        else:\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise TypeError(\"other must be a HyperLogLog\")\n\n    @staticmethod\n    def load(filename):\n        hll_ptr = rustcall(lib.hll_from_path, to_bytes(filename))\n        return HLL._from_objptr(hll_ptr)\n\n    @staticmethod\n    def from_buffer(buf):\n        hll_ptr = rustcall(lib.hll_from_buffer, buf, len(buf))\n        return HLL._from_objptr(hll_ptr)\n\n    def save(self, filename):\n        self._methodcall(lib.hll_save, to_bytes(filename))\n\n    def to_bytes(self, compression=1):\n        size = ffi.new(\"uintptr_t *\")\n        rawbuf = self._methodcall(lib.hll_to_buffer, size)\n        size = size[0]\n\n        rawbuf = ffi.gc(rawbuf, lambda o: lib.nodegraph_buffer_free(o, size), size)\n        buf = ffi.buffer(rawbuf, size)\n\n        return buf\n\n    def count(self, h):\n        self.add(h)\n\n    def get(self, h):\n        raise NotImplementedError(\"HLL doesn't support membership query\")\n\n    def matches(self, mh):\n        if not isinstance(mh, MinHash):\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise ValueError(\"mh must be a MinHash\")\n\n        return self._methodcall(lib.hll_matches, mh._objptr)\n"
  },
  {
    "path": "src/sourmash/index/__init__.py",
    "content": "\"\"\"An Abstract Base Class for collections of signatures, plus implementations.\n\nAPIs and functionality\n----------------------\n\nIndex classes support three sets of API functionality -\n\n'select(...)', which selects subsets of signatures based on ksize, moltype,\nand other criteria, including picklists.\n\n'find(...)', and the 'search', 'gather', and 'counter_gather' implementations\nbuilt on top of 'find', which search for signatures that match a query.\n\n'signatures()', which yields all signatures in the Index subject to the\nselection criteria.\n\nClasses defined in this file\n----------------------------\n\nIndex - abstract base class for all Index objects.\n\nLinearIndex - simple in-memory storage of signatures.\n\nLazyLinearIndex - lazy selection and linear search of signatures.\n\nZipFileLinearIndex - simple on-disk storage of signatures.\n\nMultiIndex - in-memory storage and selection of signatures from multiple\nindex objects, using manifests. All signatures are kept in memory.\n\nStandaloneManifestIndex - load manifests directly, and do lazy loading of\nsignatures on demand. No signatures are kept in memory.\n\nCounterGather - an ancillary class returned by the 'counter_gather()' method.\n\"\"\"\n\nimport os\nimport sourmash\nfrom abc import abstractmethod, ABC\nfrom collections import namedtuple, Counter\n\nfrom sourmash.search import (\n    make_jaccard_search_query,\n    make_containment_query,\n    calc_threshold_from_bp,\n)\nfrom sourmash.manifest import CollectionManifest\nfrom sourmash.logging import debug_literal\nfrom sourmash.signature import load_signatures_from_json, save_signatures_to_json\n\nfrom sourmash.minhash import (\n    flatten_and_downsample_scaled,\n    flatten_and_downsample_num,\n    flatten_and_intersect_scaled,\n)\n\n# generic return tuple for Index.search and Index.gather\nIndexSearchResult = namedtuple(\"Result\", \"score, signature, location\")\n\n\nclass Index(ABC):\n    # this will be removed soon; see sourmash#1894.\n    is_database = False\n\n    # 'manifest', when set, implies efficient selection and direct\n    # access to signatures. Signatures may be stored in the manifest\n    # or loaded on demand from disk depending on the class, however.\n    manifest = None\n\n    @abstractmethod\n    def __len__(self):\n        \"Return the number of signatures in this Index object.\"\n\n    @property\n    def location(self):\n        \"Return a resolvable location for this index, if possible.\"\n        return None\n\n    @abstractmethod\n    def signatures(self):\n        \"Return an iterator over all signatures in the Index object.\"\n\n    def signatures_with_location(self):\n        \"Return an iterator over tuples (signature, location) in the Index.\"\n        for ss in self.signatures():\n            yield ss, self.location\n\n    def _signatures_with_internal(self):\n        \"\"\"Return an iterator of tuples (ss, internal_location).\n\n        Unlike 'signatures_with_location()', this iterator should return\n        _all_ signatures in the object, not just those that remain after\n        selection/filtering.\n\n        This is an internal API for use in generating manifests, and may\n        change without warning.\n\n        This method should be implemented separately for each Index object.\n        \"\"\"\n        raise NotImplementedError\n\n    @abstractmethod\n    def insert(self, signature):\n        \"\"\" \"\"\"\n\n    @abstractmethod\n    def save(self, path, storage=None, sparseness=0.0, structure_only=False):\n        \"\"\" \"\"\"\n\n    @classmethod\n    @abstractmethod\n    def load(cls, location, leaf_loader=None, storage=None, print_version_warning=True):\n        \"\"\" \"\"\"\n\n    def find(self, search_fn, query, **kwargs):\n        \"\"\"Use search_fn to find matching signatures in the index.\n\n        search_fn follows the protocol in JaccardSearch objects.\n\n        Generator. Returns 0 or more IndexSearchResult objects.\n        \"\"\"\n        # first: is this query compatible with this search?\n        search_fn.check_is_compatible(query)\n\n        # ok! continue!\n\n        # this set of signatures may be heterogenous in scaled/num values;\n        # define some processing functions to downsample appropriately.\n        query_mh = query.minhash\n        assert not query_mh.track_abundance\n        if query_mh.scaled:\n            # make query and subject compatible w/scaled.\n            query_scaled = query_mh.scaled\n\n            def prepare_subject(subj_mh):\n                return flatten_and_downsample_scaled(subj_mh, query_scaled)\n\n            def prepare_query(query_mh, subj_mh):\n                return flatten_and_downsample_scaled(query_mh, subj_mh.scaled)\n\n        else:  # num\n            query_num = query_mh.num\n\n            def prepare_subject(subj_mh):\n                return flatten_and_downsample_num(subj_mh, query_num)\n\n            def prepare_query(query_mh, subj_mh):\n                return flatten_and_downsample_num(query_mh, subj_mh.num)\n\n        # now, do the search!\n        for subj, location in self.signatures_with_location():\n            subj_mh = prepare_subject(subj.minhash)\n            # note: we run prepare_query here on the original query minhash.\n            query_mh = prepare_query(query.minhash, subj_mh)\n\n            assert not query_mh.track_abundance\n            assert not subj_mh.track_abundance\n\n            shared_size, total_size = query_mh.intersection_and_union_size(subj_mh)\n\n            query_size = len(query_mh)\n            subj_size = len(subj_mh)\n\n            score = search_fn.score_fn(query_size, shared_size, subj_size, total_size)\n\n            if search_fn.passes(score):\n                # note: here we yield the original signature, not the\n                # downsampled minhash.\n                if search_fn.collect(score, subj):\n                    yield IndexSearchResult(score, subj, location)\n\n    def search_abund(self, query, *, threshold=None, **kwargs):\n        \"\"\"Return list of IndexSearchResult with angular similarity above 'threshold'.\n\n        Results will be sorted by similarity, highest to lowest.\n        \"\"\"\n        if not query.minhash.track_abundance:\n            raise TypeError(\n                \"'search_abund' requires query signature with abundance information\"\n            )\n\n        # check arguments\n        if threshold is None:\n            raise TypeError(\"'search_abund' requires 'threshold'\")\n        threshold = float(threshold)\n\n        # do the actual search:\n        matches = []\n        for subj, loc in self.signatures_with_location():\n            if not subj.minhash.track_abundance:\n                raise TypeError(\n                    \"'search_abund' requires subject signatures with abundance information\"\n                )\n            score = query.similarity(subj, downsample=True)\n            if score >= threshold:\n                matches.append(IndexSearchResult(score, subj, loc))\n\n        # sort!\n        matches.sort(key=lambda x: -x.score)\n        return matches\n\n    def search(\n        self,\n        query,\n        *,\n        threshold=None,\n        do_containment=False,\n        do_max_containment=False,\n        best_only=False,\n        **kwargs,\n    ):\n        \"\"\"Return list of IndexSearchResult with similarity above 'threshold'.\n\n        Results will be sorted by similarity, highest to lowest.\n\n        Optional arguments accepted by all Index subclasses:\n          * do_containment: default False. If True, use Jaccard containment.\n          * best_only: default False. If True, allow optimizations that\n            may. May discard matches better than threshold, but first match\n            is guaranteed to be best.\n        \"\"\"\n        # check arguments\n        if threshold is None:\n            raise TypeError(\"'search' requires 'threshold'\")\n        threshold = float(threshold)\n\n        search_obj = make_jaccard_search_query(\n            do_containment=do_containment,\n            do_max_containment=do_max_containment,\n            best_only=best_only,\n            threshold=threshold,\n        )\n\n        # do the actual search:\n        matches = list(self.find(search_obj, query, **kwargs))\n\n        # sort!\n        matches.sort(key=lambda x: -x.score)\n        return matches\n\n    def prefetch(self, query, threshold_bp, **kwargs):\n        \"\"\"Return all matches with minimum overlap.\n\n        Generator. Returns 0 or more IndexSearchResult namedtuples.\n        \"\"\"\n        if not self:  # empty database? quit.\n            raise ValueError(\"no signatures to search\")\n\n        # default best_only to False\n        best_only = kwargs.get(\"best_only\", False)\n\n        search_fn = make_containment_query(\n            query.minhash, threshold_bp, best_only=best_only\n        )\n\n        yield from self.find(search_fn, query, **kwargs)\n\n    def best_containment(self, query, threshold_bp=None, **kwargs):\n        \"\"\"Return the match with the best Jaccard containment in the Index.\n\n        Returns an IndexSearchResult namedtuple or None.\n        \"\"\"\n\n        results = self.prefetch(query, threshold_bp, best_only=True, **kwargs)\n        results = sorted(results, key=lambda x: (-x.score, x.signature.md5sum()))\n\n        try:\n            return next(iter(results))\n        except StopIteration:\n            return None\n\n    def peek(self, query_mh, *, threshold_bp=0):\n        \"\"\"Mimic CounterGather.peek() on top of Index.\n\n        This is implemented for situations where we don't want to use\n        'prefetch' functionality. It is a light wrapper around the\n        'best_containment(...)' method.\n        \"\"\"\n        from sourmash import SourmashSignature\n\n        # build a signature to use with self.gather...\n        query_ss = SourmashSignature(query_mh)\n\n        # run query!\n        try:\n            result = self.best_containment(query_ss, threshold_bp=threshold_bp)\n        except ValueError:\n            result = None\n\n        if not result:\n            return []\n\n        # if matches, calculate intersection & return.\n        intersect_mh = flatten_and_intersect_scaled(result.signature.minhash, query_mh)\n\n        return [result, intersect_mh]\n\n    def consume(self, intersect_mh):\n        \"Mimic CounterGather.consume on top of Index. Yes, this is backwards.\"\n        pass\n\n    def counter_gather(self, query, threshold_bp, **kwargs):\n        \"\"\"Returns an object that permits 'gather' on top of the\n        current contents of this Index.\n\n        The default implementation uses `prefetch` underneath, and returns\n        the results in a `CounterGather` object. However, alternate\n        implementations need only return an object that meets the\n        public `CounterGather` interface, of course.\n        \"\"\"\n        with query.update() as prefetch_query:\n            prefetch_query.minhash = prefetch_query.minhash.flatten()\n\n        # find all matches and construct a CounterGather object.\n        counter = CounterGather(prefetch_query)\n        for result in self.prefetch(prefetch_query, threshold_bp, **kwargs):\n            counter.add(result.signature, location=result.location)\n\n        # tada!\n        return counter\n\n    @abstractmethod\n    def select(\n        self,\n        ksize=None,\n        moltype=None,\n        scaled=None,\n        num=None,\n        abund=None,\n        containment=None,\n    ):\n        \"\"\"Return Index containing only signatures that match requirements.\n\n        Current arguments can be any or all of:\n        * ksize\n        * moltype\n        * scaled\n        * num\n        * containment\n\n        'select' will raise ValueError if the requirements are incompatible\n        with the Index subclass.\n\n        'select' may return an empty object or None if no matches can be\n        found.\n        \"\"\"\n\n\ndef select_signature(\n    ss,\n    *,\n    ksize=None,\n    moltype=None,\n    scaled=0,\n    num=0,\n    containment=False,\n    abund=None,\n    picklist=None,\n):\n    \"Check that the given signature matches the specified requirements.\"\n    # ksize match?\n    if ksize and ksize != ss.minhash.ksize:\n        return False\n\n    # moltype match?\n    if moltype and moltype != ss.minhash.moltype:\n        return False\n\n    # containment requires scaled; similarity does not.\n    if containment:\n        if not scaled:\n            raise ValueError(\"'containment' requires 'scaled' in Index.select'\")\n        if not ss.minhash.scaled:\n            return False\n\n    # 'scaled' and 'num' are incompatible\n    if scaled:\n        if ss.minhash.num:\n            return False\n    if num:\n        # note, here we check if 'num' is identical; this can be\n        # changed later.\n        if ss.minhash.scaled or num != ss.minhash.num:\n            return False\n\n    if abund:\n        # note: minhash w/abund can always be flattened\n        if not ss.minhash.track_abundance:\n            return False\n\n    if picklist is not None and ss not in picklist:\n        return False\n\n    return True\n\n\nclass LinearIndex(Index):\n    \"\"\"An Index for a collection of signatures. Can load from a .sig file.\n\n    Note: See MultiIndex for an in-memory class that uses manifests.\n\n    Concrete class; signatures held in memory; does not use manifests.\n    \"\"\"\n\n    def __init__(self, _signatures=None, filename=None):\n        self._signatures = []\n        if _signatures:\n            self._signatures = list(_signatures)\n        self.filename = filename\n\n    @property\n    def location(self):\n        return self.filename\n\n    def signatures(self):\n        return iter(self._signatures)\n\n    def __bool__(self):\n        return bool(self._signatures)\n\n    def __len__(self):\n        return len(self._signatures)\n\n    def insert(self, node):\n        self._signatures.append(node)\n\n    def save(self, path):\n        with open(path, \"w\") as fp:\n            save_signatures_to_json(self.signatures(), fp)\n\n    @classmethod\n    def load(cls, location, filename=None):\n        \"Load signatures from a JSON signature file.\"\n        si = load_signatures_from_json(location, do_raise=True)\n\n        if filename is None:\n            filename = location\n        lidx = LinearIndex(si, filename=filename)\n        return lidx\n\n    def select(self, **kwargs):\n        \"\"\"Return new LinearIndex containing only signatures that match req's.\n\n        Does not raise ValueError, but may return an empty Index.\n        \"\"\"\n        _check_select_parameters(**kwargs)\n\n        siglist = []\n        for ss in self._signatures:\n            if select_signature(ss, **kwargs):\n                siglist.append(ss)\n\n        return LinearIndex(siglist, self.location)\n\n\nclass LazyLinearIndex(Index):\n    \"\"\"An Index for lazy linear search of another database.\n\n    Wrapper class; does not use manifests.\n\n    One of the main purposes of this class is to _force_ linear 'find'\n    on index objects. So if this class wraps an SBT, for example, the\n    SBT find method will be overriden with the linear 'find' from the\n    base class. There are very few situations where this is an improvement,\n    so use this class wisely!\n\n    A few notes:\n    * selection criteria defined by 'select' are only executed when\n      signatures are actually requested (hence, 'lazy').\n    * this class stores the provided index 'db' in memory. If you need\n      a class that does lazy loading of signatures from disk and does not\n      store signatures in memory, see StandaloneManifestIndex.\n    * if you want efficient manifest-based selection, consider\n      MultiIndex (signatures in memory).\n    \"\"\"\n\n    def __init__(self, db, selection_dict={}):\n        self.db = db\n        self.selection_dict = dict(selection_dict)\n\n    def signatures(self):\n        \"Return the selected signatures.\"\n        db = self.db.select(**self.selection_dict)\n        yield from db.signatures()\n\n    def signatures_with_location(self):\n        \"Return the selected signatures, with a location.\"\n        db = self.db.select(**self.selection_dict)\n        yield from db.signatures_with_location()\n\n    def __bool__(self):\n        try:\n            next(iter(self.signatures()))\n            return True\n        except StopIteration:\n            return False\n\n    def __len__(self):\n        db = self.db.select(**self.selection_dict)\n        return len(db)\n\n    def insert(self, node):\n        raise NotImplementedError\n\n    def save(self, path):\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, path):\n        raise NotImplementedError\n\n    def select(self, **kwargs):\n        \"\"\"Return new object yielding only signatures that match req's.\n\n        Does not raise ValueError, but may return an empty Index.\n        \"\"\"\n        _check_select_parameters(**kwargs)\n\n        selection_dict = dict(self.selection_dict)\n        for k, v in kwargs.items():\n            if k in selection_dict:\n                if selection_dict[k] != v:\n                    raise ValueError(f\"cannot select on two different values for {k}\")\n            selection_dict[k] = v\n\n        return LazyLinearIndex(self.db, selection_dict)\n\n\nclass ZipFileLinearIndex(Index):\n    \"\"\"\\\n    A read-only collection of signatures in a zip file.\n\n    Does not support `insert` or `save`.\n\n    Concrete class; signatures dynamically loaded from disk; uses manifests.\n    \"\"\"\n\n    is_database = True\n\n    def __init__(\n        self,\n        storage,\n        *,\n        selection_dict=None,\n        traverse_yield_all=False,\n        manifest=None,\n        use_manifest=True,\n    ):\n        self.storage = storage\n        self.selection_dict = selection_dict\n        self.traverse_yield_all = traverse_yield_all\n        self.use_manifest = use_manifest\n\n        # do we have a manifest already? if not, try loading.\n        if use_manifest:\n            if manifest is not None:\n                debug_literal(\"ZipFileLinearIndex using passed-in manifest\")\n                self.manifest = manifest\n            else:\n                self._load_manifest()\n        else:\n            self.manifest = None\n\n        if self.manifest is not None:\n            assert not self.selection_dict, self.selection_dict\n        if self.selection_dict:\n            assert self.manifest is None\n\n    def _load_manifest(self):\n        \"Load a manifest if one exists\"\n        try:\n            manifest_data = self.storage.load(\"SOURMASH-MANIFEST.csv\")\n        except (KeyError, FileNotFoundError):\n            self.manifest = None\n        else:\n            debug_literal(f\"found manifest on load for {self.storage.path}\")\n\n            # load manifest!\n            from io import StringIO\n\n            manifest_data = manifest_data.decode(\"utf-8\")\n            manifest_fp = StringIO(manifest_data)\n            self.manifest = CollectionManifest.load_from_csv(manifest_fp)\n\n    def __bool__(self):\n        \"Are there any matching signatures in this zipfile? Avoid calling len.\"\n        try:\n            next(iter(self.signatures()))\n        except StopIteration:\n            return False\n\n        return True\n\n    def __len__(self):\n        \"calculate number of signatures.\"\n\n        # use manifest, if available.\n        m = self.manifest\n        if self.manifest is not None:\n            return len(m)\n\n        # otherwise, iterate across all signatures.\n        n = 0\n        for _ in self.signatures():\n            n += 1\n        return n\n\n    @property\n    def location(self):\n        return self.storage.path\n\n    def insert(self, signature):\n        raise NotImplementedError\n\n    def save(self, path):\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, location, traverse_yield_all=False, use_manifest=True):\n        \"Class method to load a zipfile.\"\n        from ..sbt_storage import ZipStorage\n\n        # we can only load from existing zipfiles in this method.\n        if not os.path.exists(location):\n            raise FileNotFoundError(location)\n\n        storage = ZipStorage(location)\n        return cls(\n            storage, traverse_yield_all=traverse_yield_all, use_manifest=use_manifest\n        )\n\n    def _signatures_with_internal(self):\n        \"\"\"Return an iterator of tuples (ss, internal_location).\n\n        Note: does not limit signatures to subsets.\n        \"\"\"\n        # list all the files, without using the Storage interface; currently,\n        # 'Storage' does not provide a way to list all the files, so :shrug:.\n        for filename in self.storage._filenames():\n            # should we load this file? if it ends in .sig OR we are forcing:\n            if (\n                filename.endswith(\".sig\")\n                or filename.endswith(\".sig.gz\")\n                or self.traverse_yield_all\n            ):\n                sig_data = self.storage.load(filename)\n                for ss in load_signatures_from_json(sig_data):\n                    yield ss, filename\n\n    def signatures(self):\n        \"Load all signatures in the zip file.\"\n        selection_dict = self.selection_dict\n        manifest = None\n        if self.manifest is not None:\n            manifest = self.manifest\n            assert not selection_dict\n\n            # yield all signatures found in manifest\n            for filename in manifest.locations():\n                data = self.storage.load(filename)\n                for ss in load_signatures_from_json(data):\n                    # in case multiple signatures are in the file, check\n                    # to make sure we want to return each one.\n                    if ss in manifest:\n                        yield ss\n\n        # no manifest! iterate.\n        else:\n            storage = self.storage\n            # if no manifest here, break Storage class encapsulation\n            # and go for all the files. (This is necessary to support\n            # ad-hoc zipfiles that have no manifests.)\n            for filename in storage._filenames():\n                # should we load this file? if it ends in .sig OR force:\n                if (\n                    filename.endswith(\".sig\")\n                    or filename.endswith(\".sig.gz\")\n                    or self.traverse_yield_all\n                ):\n                    if selection_dict:\n\n                        def select(x):\n                            return select_signature(x, **selection_dict)\n                    else:\n\n                        def select(x):\n                            return True\n\n                    data = self.storage.load(filename)\n                    for ss in load_signatures_from_json(data):\n                        if select(ss):\n                            yield ss\n\n    def select(self, **kwargs):\n        \"Select signatures in zip file based on ksize/moltype/etc.\"\n        _check_select_parameters(**kwargs)\n\n        # if we have a manifest, run 'select' on the manifest.\n        manifest = self.manifest\n        traverse_yield_all = self.traverse_yield_all\n\n        if manifest is not None:\n            manifest = manifest.select_to_manifest(**kwargs)\n            return ZipFileLinearIndex(\n                self.storage,\n                selection_dict=None,\n                traverse_yield_all=traverse_yield_all,\n                manifest=manifest,\n                use_manifest=True,\n            )\n        else:\n            # no manifest? just pass along all the selection kwargs to\n            # the new ZipFileLinearIndex.\n\n            assert manifest is None\n            if self.selection_dict:\n                # combine selects...\n                d = dict(self.selection_dict)\n                for k, v in kwargs.items():\n                    if k in d:\n                        if d[k] is not None and d[k] != v:\n                            raise ValueError(f\"incompatible select on '{k}'\")\n                    d[k] = v\n                kwargs = d\n\n            return ZipFileLinearIndex(\n                self.storage,\n                selection_dict=kwargs,\n                traverse_yield_all=traverse_yield_all,\n                manifest=None,\n                use_manifest=False,\n            )\n\n\nclass CounterGather:\n    \"\"\"This is an ancillary class that is used to implement \"fast\n    gather\", post-prefetch. It tracks and summarize matches for\n    efficient min-set-cov/'gather'.\n\n    The class constructor takes a query MinHash that must be scaled, and\n    then takes signatures that have overlaps with the query (via 'add').\n\n    After all overlapping signatures have been loaded, the 'peek'\n    method is then used at each stage of the 'gather' procedure to\n    find the best match, and the 'consume' method is used to remove\n    a match from this counter.\n\n    This particular implementation maintains a collections.Counter that\n    is used to quickly find the best match when 'peek' is called, but\n    other implementations are possible ;).\n\n    Note that redundant matches (SourmashSignature objects) with\n    duplicate md5s are collapsed inside the class, because we use the\n    md5sum as a key into the dictionary used to store matches.\n    \"\"\"\n\n    def __init__(self, query):\n        \"Constructor - takes a query SourmashSignature.\"\n        query_mh = query.minhash\n        if not query_mh.scaled:\n            raise ValueError(\"gather requires scaled signatures\")\n\n        # track query\n        self.orig_query_mh = query_mh.copy().flatten()\n        self.scaled = query_mh.scaled\n\n        # use these to track loaded matches & their locations\n        self.siglist = {}\n        self.locations = {}\n\n        # ...and also track overlaps with the progressive query\n        self.counter = Counter()\n\n        # fence to make sure we do add matches once query has started.\n        self.query_started = 0\n\n    def add(self, ss, *, location=None, require_overlap=True):\n        \"Add this signature in as a potential match.\"\n        if self.query_started:\n            raise ValueError(\"cannot add more signatures to counter after peek/consume\")\n\n        # upon insertion, count & track overlap with the specific query.\n        overlap = self.orig_query_mh.count_common(ss.minhash, True)\n        if overlap:\n            md5 = ss.md5sum()\n\n            self.counter[md5] = overlap\n            self.siglist[md5] = ss\n            self.locations[md5] = location\n\n            # note: scaled will be max of all matches.\n            self.downsample(ss.minhash.scaled)\n        elif require_overlap:\n            raise ValueError(\"no overlap between query and signature!?\")\n\n    def downsample(self, scaled):\n        \"Track highest scaled across all possible matches.\"\n        if scaled > self.scaled:\n            self.scaled = scaled\n        return self.scaled\n\n    def __len__(self):\n        return len(self.siglist)\n\n    def signatures(self):\n        \"Return all signatures.\"\n        yield from self.siglist.values()\n\n    @property\n    def union_found(self):\n        \"\"\"Return a MinHash containing all found hashes in the query.\n\n        This calculates the union of the found matches, intersected\n        with the original query.\n        \"\"\"\n        orig_query_mh = self.orig_query_mh\n\n        # create empty MinHash from orig query\n        found_mh = orig_query_mh.copy_and_clear()\n\n        # for each match, intersect match with query & then add to found_mh.\n        for ss in self.siglist.values():\n            intersect_mh = flatten_and_intersect_scaled(ss.minhash, orig_query_mh)\n            found_mh.add_many(intersect_mh)\n\n        return found_mh\n\n    def peek(self, cur_query_mh, *, threshold_bp=0):\n        \"Get next 'gather' result for this database, w/o changing counters.\"\n        self.query_started = 1\n\n        # empty? nothing to search.\n        counter = self.counter\n        if not counter:\n            return []\n\n        siglist = self.siglist\n        assert siglist\n\n        scaled = self.downsample(cur_query_mh.scaled)\n        cur_query_mh = cur_query_mh.downsample(scaled=scaled)\n\n        if not cur_query_mh:  # empty query? quit.\n            return []\n\n        # CTB: could probably remove this check unless debug requested.\n        if cur_query_mh.contained_by(self.orig_query_mh, downsample=True) < 1:\n            raise ValueError(\"current query not a subset of original query\")\n\n        # are we setting a threshold?\n        try:\n            x = calc_threshold_from_bp(threshold_bp, scaled, len(cur_query_mh))\n            threshold, n_threshold_hashes = x\n        except ValueError:\n            # too high to ever match => exit\n            return []\n\n        # Find the best match using the internal Counter.\n        most_common = counter.most_common()\n        dataset_id, match_size = most_common[0]\n\n        # below threshold? no match!\n        if match_size < n_threshold_hashes:\n            return []\n\n        ## at this point, we have a legitimate match above threshold!\n\n        # pull match and location.\n        match = siglist[dataset_id]\n\n        # calculate containment\n        # CTB: this check is probably redundant with intersect_mh calc, below.\n        cont = cur_query_mh.contained_by(match.minhash, downsample=True)\n        assert cont\n        assert cont >= threshold\n\n        # calculate intersection of this \"best match\" with query.\n        match_mh = match.minhash.downsample(scaled=scaled).flatten()\n        intersect_mh = cur_query_mh & match_mh\n        location = self.locations[dataset_id]\n\n        # build result & return intersection\n        return (IndexSearchResult(cont, match, location), intersect_mh)\n\n    def consume(self, intersect_mh):\n        \"Maintain the internal counter by removing the given hashes.\"\n        self.query_started = 1\n\n        if not intersect_mh:\n            return\n\n        siglist = self.siglist\n        counter = self.counter\n\n        most_common = counter.most_common()\n\n        # Prepare counter for finding the next match by decrementing\n        # all hashes found in the current match in other datasets;\n        # remove empty datasets from counter, too.\n        for dataset_id, _ in most_common:\n            # CTB: note, remaining_mh may not be at correct scaled here.\n            # this means that counters that _should_ be empty might not\n            # _be_ empty in some situations.  This does not\n            # lead to incorrect results, merely potentially overfull\n            # 'counter' objects. The tradeoffs to fixing this would\n            # need to be examined! (This could be fixed in self.downsample().)\n            remaining_mh = siglist[dataset_id].minhash\n            intersect_count = intersect_mh.count_common(remaining_mh, downsample=True)\n            if intersect_count:\n                counter[dataset_id] -= intersect_count\n                if counter[dataset_id] == 0:\n                    del counter[dataset_id]\n\n\nclass MultiIndex(Index):\n    \"\"\"\n    Load a collection of signatures, and retain their original locations.\n\n    One specific use for this is when loading signatures from a directory;\n    MultiIndex will record which specific files provided which\n    signatures.\n\n    Creates a manifest on load.\n\n    Note: this is an in-memory collection, and does not do lazy loading:\n    all signatures are loaded upon instantiation and kept in memory.\n\n    There are a variety of loading functions:\n    * `load` takes a list of already-loaded Index objects,\n      together with a list of their locations.\n    * `load_from_directory` traverses a directory to load files within.\n    * `load_from_path` takes an arbitrary pathname and tries to load it\n      as a directory, or as a .sig file.\n    * `load_from_pathlist` takes a text file full of pathnames and tries\n      to load them all.\n\n    Concrete class; signatures held in memory; builds and uses manifests.\n    \"\"\"\n\n    def __init__(self, manifest, parent, *, prepend_location=False):\n        \"\"\"Constructor; takes manifest containing signatures, together with\n        the top-level location.\n        \"\"\"\n        self.manifest = manifest\n        self.parent = parent\n        self.prepend_location = prepend_location\n\n        if prepend_location and self.parent is None:\n            raise ValueError(\"must set 'parent' if 'prepend_location' is set\")\n\n    @property\n    def location(self):\n        return self.parent\n\n    def signatures(self):\n        for row in self.manifest.rows:\n            yield row[\"signature\"]\n\n    def signatures_with_location(self):\n        for row in self.manifest.rows:\n            loc = row[\"internal_location\"]\n            # here, 'parent' may have been removed from internal_location\n            # for directories; if so, add it back in.\n            if self.prepend_location:\n                loc = os.path.join(self.parent, loc)\n            yield row[\"signature\"], loc\n\n    def _signatures_with_internal(self):\n        \"\"\"Return an iterator of tuples (ss, location)\n\n        CTB note: here, 'internal_location' is the source file for the\n        index. This is a special feature of this (in memory) class.\n        \"\"\"\n        for row in self.manifest.rows:\n            yield row[\"signature\"], row[\"internal_location\"]\n\n    def __len__(self):\n        if self.manifest is None:\n            return 0\n\n        return len(self.manifest)\n\n    def insert(self, *args):\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, index_list, source_list, parent, *, prepend_location=False):\n        \"\"\"Create a MultiIndex from already-loaded indices.\n\n        Takes two arguments: a list of Index objects, and a matching list\n        of source strings (filenames, etc.)  If the source is not None,\n        then it will be used to override the location provided by the\n        matching Index object.\n        \"\"\"\n        assert len(index_list) == len(source_list)\n\n        # yield all signatures + locations\n        def sigloc_iter():\n            for idx, iloc in zip(index_list, source_list):\n                # override internal location if location is explicitly provided\n                if iloc is None:\n                    iloc = idx.location\n                for ss in idx.signatures():\n                    yield ss, iloc\n\n        # build manifest; note, ALL signatures are stored in memory.\n        # CTB: could do this on demand?\n        # CTB: should we use get_manifest functionality?\n        # CTB: note here that the manifest is created by iteration\n        # *even if it already exists.* This could be changed to be more\n        # efficient... but for now, use StandaloneManifestIndex if you\n        # want to avoid this when loading from multiple files.\n        manifest = CollectionManifest.create_manifest(sigloc_iter())\n\n        # create!\n        return cls(manifest, parent, prepend_location=prepend_location)\n\n    @classmethod\n    def load_from_directory(cls, pathname, *, force=False):\n        \"\"\"Create a MultiIndex from a directory.\n\n        Takes directory path plus optional boolean 'force'. Attempts to\n        load all files ending in .sig or .sig.gz, by default; if 'force' is\n        True, will attempt to load _all_ files, ignoring errors.\n\n        Will not load anything other than JSON signature files.\n        \"\"\"\n        from ..sourmash_args import traverse_find_sigs\n\n        if not os.path.isdir(pathname):\n            raise ValueError(f\"'{pathname}' must be a directory.\")\n\n        index_list = []\n        source_list = []\n\n        traversal = traverse_find_sigs([pathname], yield_all_files=force)\n        for thisfile in traversal:\n            try:\n                idx = LinearIndex.load(thisfile)\n                index_list.append(idx)\n\n                rel = os.path.relpath(thisfile, pathname)\n                source_list.append(rel)\n            except (OSError, sourmash.exceptions.SourmashError) as exc:\n                if force:\n                    continue  # ignore error\n                else:\n                    raise ValueError(exc)  # stop loading!\n\n        # did we load anything? if not, error\n        if not index_list:\n            raise ValueError(f\"no signatures to load under directory '{pathname}'\")\n\n        return cls.load(index_list, source_list, pathname, prepend_location=True)\n\n    @classmethod\n    def load_from_path(cls, pathname, force=False):\n        \"\"\"\n        Create a MultiIndex from a path (filename or directory).\n\n        Note: this only uses LinearIndex.load(...), so will only load\n        signature JSON files.\n        \"\"\"\n        if not os.path.exists(pathname):\n            raise ValueError(f\"'{pathname}' must exist.\")\n\n        if os.path.isdir(pathname):  # traverse\n            return cls.load_from_directory(pathname, force=force)\n\n        # load as a .sig/JSON file\n        index_list = []\n        source_list = []\n        try:\n            idx = LinearIndex.load(pathname)\n            index_list = [idx]\n            source_list = [pathname]\n        except (OSError, sourmash.exceptions.SourmashError):\n            if not force:\n                raise ValueError(f\"no signatures to load from '{pathname}'\")\n            return None\n\n        return cls.load(index_list, source_list, pathname)\n\n    @classmethod\n    def load_from_pathlist(cls, filename):\n        \"\"\"Create a MultiIndex from all files listed in a text file.\n\n        Note: this will attempt to load signatures from each file,\n        including zip collections, etc; it uses 'load_file_as_index'\n        underneath.\n        \"\"\"\n        from ..sourmash_args import load_pathlist_from_file, load_file_as_index\n\n        idx_list = []\n        src_list = []\n\n        file_list = load_pathlist_from_file(filename)\n        for fname in file_list:\n            idx = load_file_as_index(fname)\n            src = fname\n\n            idx_list.append(idx)\n            src_list.append(src)\n\n        return cls.load(idx_list, src_list, filename)\n\n    def save(self, *args):\n        raise NotImplementedError\n\n    def select(self, **kwargs):\n        \"Run 'select' on the manifest.\"\n        _check_select_parameters(**kwargs)\n        new_manifest = self.manifest.select_to_manifest(**kwargs)\n        return MultiIndex(\n            new_manifest, self.parent, prepend_location=self.prepend_location\n        )\n\n\nclass StandaloneManifestIndex(Index):\n    \"\"\"Load a standalone manifest as an Index.\n\n    This class is useful for the situation where you have a directory\n    with many signature collections underneath it, and you don't want to load\n    every collection each time you run sourmash.\n\n    Instead, you can run 'sourmash sig collect <directory> -o <manifest>' to\n    output a manifest and then use this class to load <manifest> directly.\n    Sketch type selection, picklists, and pattern matching will all work\n    directly on the manifest and will load signatures only upon demand.\n\n    One feature of this class is that external paths to sketches in\n    the 'internal_location' field of the manifests will be loaded\n    properly.  This permits manifests to be constructed for various\n    collections of signatures that reside elsewhere, and not just\n    below a single directory prefix. By default paths are interpreted\n    relative to the location of the manifest, unless an absolute path\n    is provided in the 'internal_location' field.\n\n    StandaloneManifestIndex does _not_ store signatures in memory.\n\n    This class also overlaps in concept with MultiIndex when\n    MultiIndex.load_from_pathlist is used to load other Index\n    objects. However, this class does not store any signatures in\n    memory, unlike MultiIndex.\n\n    \"\"\"\n\n    is_database = True\n\n    def __init__(self, manifest, location, *, prefix=None):\n        \"\"\"Create object. 'location' is path of manifest file, 'prefix' is\n        prepended to signature paths when loading non-abspaths.\"\"\"\n        assert manifest is not None\n        self.manifest = manifest\n        self._location = location\n        self.prefix = prefix\n\n    @classmethod\n    def load(cls, location, *, prefix=None):\n        \"\"\"Load manifest file from given location.\n\n        If prefix is None (default), it is automatically set from dirname.\n        Set prefix='' to avoid this, or provide an explicit prefix.\n        \"\"\"\n        if not os.path.isfile(location):\n            raise ValueError(f\"provided manifest location '{location}' is not a file\")\n\n        m = CollectionManifest.load_from_filename(location)\n\n        if prefix is None:\n            # by default, calculate paths relative to manifest location.\n            prefix = os.path.dirname(location)\n\n        return cls(m, location, prefix=prefix)\n\n    @property\n    def location(self):\n        \"Return the path to this manifest.\"\n        return self._location\n\n    def signatures_with_location(self):\n        \"Return an iterator over all signatures and their locations.\"\n        yield from self._signatures_with_internal()\n\n    def signatures(self):\n        \"Return an iterator over all signatures.\"\n        for ss, loc in self._signatures_with_internal():\n            yield ss\n\n    def _signatures_with_internal(self):\n        \"\"\"Return an iterator over all sigs of (sig, internal_location)\n\n        Note that this is implemented differently from most Index\n        objects in that it only lists subselected parts of the\n        manifest, and not the original manifest. This was done out of\n        convenience: we don't currently have access to the original\n        manifest in this class.\n        \"\"\"\n        # collect all internal locations\n        picklist = self.manifest.to_picklist()\n        for iloc in self.manifest.locations():\n            # prepend location with prefix?\n            if not iloc.startswith(\"/\") and self.prefix:\n                iloc = os.path.join(self.prefix, iloc)\n\n            idx = sourmash.load_file_as_index(iloc)\n            idx = idx.select(picklist=picklist)\n            for ss in idx.signatures():\n                yield ss, iloc\n\n    def __len__(self):\n        \"Number of signatures in this manifest (after any select).\"\n        return len(self.manifest)\n\n    def __bool__(self):\n        \"Is this manifest empty?\"\n        return bool(self.manifest)\n\n    def save(self, *args):\n        raise NotImplementedError\n\n    def insert(self, *args):\n        raise NotImplementedError\n\n    def select(self, **kwargs):\n        \"Run 'select' on the manifest.\"\n        _check_select_parameters(**kwargs)\n        new_manifest = self.manifest.select_to_manifest(**kwargs)\n        return StandaloneManifestIndex(new_manifest, self._location, prefix=self.prefix)\n\n\ndef _check_select_parameters(**kw):\n    \"Check 'select' parameters for types/conversion.\"\n    params = set(kw)\n    params -= {\"ksize\", \"num\", \"moltype\", \"scaled\", \"abund\", \"picklist\", \"containment\"}\n    if params:\n        raise ValueError(f\"unknown 'select' parameters: {params}\")\n\n    ksize = kw.get(\"ksize\")\n    if ksize is not None:\n        if not isinstance(ksize, int):\n            raise ValueError(\n                f\"ksize value '{ksize}' must be an integer, is: {type(ksize)}\"\n            )\n\n    moltype = kw.get(\"moltype\")\n    if moltype is not None:\n        if moltype not in [\"DNA\", \"protein\", \"dayhoff\", \"hp\", \"skipm1n3\", \"skipm2n3\"]:\n            raise ValueError(f\"unknown moltype: {moltype}\")\n\n    scaled = kw.get(\"scaled\")\n    if scaled is not None:\n        if not isinstance(scaled, int):\n            raise ValueError(\n                f\"scaled value '{scaled}' must be an integer, is: {type(scaled)}\"\n            )\n\n    containment = kw.get(\"containment\")\n    if containment is not None:\n        if not isinstance(containment, bool):\n            raise ValueError(\n                f\"containment value '{containment}' must be a bool, is: {type(containment)}\"\n            )\n\n    abund = kw.get(\"abund\")\n    if abund is not None:\n        if not isinstance(abund, bool):\n            raise ValueError(f\"abund value '{abund}' must be a bool, is: {type(abund)}\")\n\n    num = kw.get(\"num\")\n    if num is not None:\n        if not isinstance(num, int):\n            raise ValueError(f\"num value '{num}' must be an integer, is: {type(num)}\")\n"
  },
  {
    "path": "src/sourmash/index/revindex.py",
    "content": "\"\"\"\nRevIndex and DiskRevIndex - Rust-based reverse indexes by hashes.\n\"\"\"\n\nimport os\nimport weakref\n\nfrom sourmash.index import Index, IndexSearchResult, _check_select_parameters\nfrom sourmash.minhash import MinHash, flatten_and_intersect_scaled\nfrom sourmash.signature import SourmashSignature\nfrom sourmash._lowlevel import ffi, lib\nfrom sourmash.utils import RustObject, rustcall, decode_str, encode_str\nimport sourmash._lowlevel\nfrom sourmash.minhash import flatten_and_intersect_scaled\nfrom sourmash.manifest import CollectionManifest\n\n\nclass RevIndex(RustObject, Index):\n    \"\"\"\n    Base class for both MemRevIndex and DiskRevIndex.\n\n    Provides core FFI functionality to connect to Rust code, and implements\n    basic RevIndex functionality based on RevIndexOps trait.\n    \"\"\"\n\n    __dealloc_func__ = lib.revindex_free\n    is_database = True\n    location = None\n\n    def __init__(self):\n        self._objptr = ffi.NULL\n        self._idx_picklist = None\n\n    @property\n    def _ffi_idx_picklist(self):\n        if self._idx_picklist is None:\n            return ffi.NULL\n        return self._idx_picklist._objptr\n\n    @property\n    def manifest(self):\n        self._init_inner()\n        mf_objptr = rustcall(lib.revindex_manifest, self._objptr)\n        return CollectionManifest._from_rust(mf_objptr)\n\n    def _generate_idx_picklist_from_manifest(self, mf):\n        # grab internal indices\n        idx_list = [int(row[\"internal_location\"]) for row in mf.rows]\n        self._idx_picklist = RevIndex_DatasetPicklist(idx_list)\n\n    def signatures(self, *, use_picklist=True):\n        self._init_inner()\n\n        size = ffi.new(\"uintptr_t *\")\n        if use_picklist:\n            picklist_objptr = self._ffi_idx_picklist\n        else:\n            picklist_objptr = ffi.NULL\n\n        sigs_ptr = self._methodcall(lib.revindex_signatures, size, picklist_objptr)\n\n        size = size[0]\n\n        for i in range(size):\n            sig = SourmashSignature._from_objptr(sigs_ptr[i])\n            yield sig\n\n    def signatures_with_location(self):\n        for ss in self.signatures():\n            yield ss, self.location\n\n    def _signatures_with_internal(self):\n        # CTB note: this should return _all_ signatures, independent of\n        # picklist.\n        for n, ss in enumerate(self.signatures(use_picklist=False)):\n            yield ss, n\n\n    def __len__(self):\n        self._init_inner()\n        return self._methodcall(lib.revindex_len, self._ffi_idx_picklist)\n\n    @property\n    def scaled(self):\n        scaled = self._methodcall(lib.revindex_scaled)\n        return scaled\n\n    def save(self, path):\n        raise NotImplementedException\n\n    @classmethod\n    def load(cls, location):\n        raise NotImplementedException\n\n    def search(\n        self,\n        query_ss,\n        *,\n        threshold=None,\n        do_containment=False,\n        do_max_containment=False,\n        best_only=False,\n        ignore_abundance=False,\n        **kwargs,\n    ):\n        \"\"\"Return set of matches with similarity above 'threshold'.\n\n        Results will be sorted by similarity, highest to lowest.\n\n        Optional arguments:\n          * do_containment: default False. If True, use Jaccard containment\n            instead of Jaccard similarity.\n          * ignore_abundance: default False. If True, and query signature\n            and database support k-mer abundances, ignore those abundances.\n        \"\"\"\n        # CTB note: could optimize for best_only, I 'spose. But only makes a\n        # difference for RevIndex when searching with containment.\n\n        if not query_ss.minhash:\n            raise ValueError(\"empty query\")\n\n        if threshold is None:\n            raise TypeError(\"'search' requires 'threshold'\")\n\n        self._init_inner()\n\n        size = ffi.new(\"uintptr_t *\")\n        if do_containment:\n            # calculate threshold_bp from threshold\n            query_mh = query_ss.minhash\n            threshold_bp = int(round(threshold * len(query_mh) * query_mh.scaled))\n            results_ptr = self._methodcall(\n                lib.revindex_prefetch,\n                query_ss._get_objptr(),\n                threshold_bp,\n                size,\n                self._ffi_idx_picklist,\n            )\n        elif do_max_containment:\n            raise NotImplementedError(\"max_containment is not available on RevIndex\")\n        else:  # jaccard similarity\n            results_ptr = self._methodcall(\n                lib.revindex_search_jaccard,\n                query_ss._get_objptr(),\n                threshold,\n                size,\n                self._ffi_idx_picklist,\n            )\n\n        # retrieve results => SearchResult\n        size = size[0]\n\n        matches = []\n        for i in range(size):\n            match = SearchResult._from_objptr(results_ptr[i])\n            matches.append(match)\n\n        return matches\n\n    def best_containment(self, query_ss, *, threshold_bp=0, **kwargs):\n        \"\"\"\n        Return a SearchResult tuple for the sketch with the highest\n        containment of the query.\n        \"\"\"\n        if not query_ss.minhash:\n            raise ValueError(\"empty query\")\n\n        self._init_inner()\n        threshold_bp = int(threshold_bp)\n        query_mh = query_ss.minhash\n\n        ss_ptr = self._methodcall(\n            lib.revindex_best_containment,\n            query_mh._get_objptr(),\n            threshold_bp,\n            self._ffi_idx_picklist,\n        )\n\n        match_ss = SourmashSignature._from_objptr(ss_ptr)\n        if not match_ss:\n            raise ValueError(\"no match\")\n\n        containment = query_ss.contained_by(match_ss)\n\n        return IndexSearchResult(containment, match_ss, self.location)\n\n    def peek(self, query_mh, *, threshold_bp=0):\n        \"\"\"\n        Return the best containment match for the query MinHash,\n        plus the intersected hashes between the query and the match.\n\n        Used for CounterGather functionality.\n        \"\"\"\n        self._init_inner()\n        ss_ptr = self._methodcall(\n            lib.revindex_best_containment,\n            query_mh._get_objptr(),\n            int(threshold_bp),\n            self._ffi_idx_picklist,\n        )\n\n        match_ss = SourmashSignature._from_objptr(ss_ptr)\n        if not match_ss:\n            return []\n\n        # calculate the intersection\n        match_mh = match_ss.minhash\n        common_scaled = max(match_mh.scaled, query_mh.scaled)\n        query_mh = query_mh.flatten().downsample(scaled=common_scaled)\n        match_mh = match_mh.flatten().downsample(scaled=common_scaled)\n        intersect_mh = query_mh & match_mh\n        containment = query_mh.contained_by(intersect_mh)\n\n        return (IndexSearchResult(containment, match_ss, self.location), intersect_mh)\n\n    def consume(self, intersect_mh):\n        \"\"\"\n        Provide CounterGather API - does nothing, in this case.\n        \"\"\"\n        pass\n\n    def counter_gather(self, query_ss, threshold_bp=0, **kwargs):\n        \"\"\"\n        Return a CounterGather object that holds interim results for a\n        'gather', and can be used to get iterative results.\n        \"\"\"\n        if not query_ss.minhash:\n            raise ValueError(\"empty query\")\n\n        self._init_inner()\n        cg_ptr = self._methodcall(\n            lib.revindex_prefetch_to_countergather,\n            query_ss._get_objptr(),\n            self._ffi_idx_picklist,\n        )\n\n        return RevIndex_CounterGather_Colors(cg_ptr, query_ss, self)\n\n    def prefetch(self, query_ss, threshold_bp=0, **kwargs):\n        \"\"\"\n        Return all containment matches above threshold for the query.\n        \"\"\"\n        if not query_ss.minhash:\n            raise ValueError(\"empty query\")\n\n        self._init_inner()\n        threshold_bp = int(threshold_bp)\n\n        size = ffi.new(\"uintptr_t *\")\n        results_ptr = self._methodcall(\n            lib.revindex_prefetch,\n            query_ss._get_objptr(),\n            threshold_bp,\n            size,\n            self._ffi_idx_picklist,\n        )\n        size = size[0]\n\n        matches = []\n        for i in range(size):\n            match = SearchResult._from_objptr(results_ptr[i])\n            matches.append(match)\n        return matches\n\n    def select(\n        self,\n        ksize=None,\n        moltype=None,\n        scaled=None,\n        num=None,\n        abund=None,\n        containment=None,\n        picklist=None,\n        **kwargs,\n    ):\n        \"\"\"\n        Implement selection protocol, including picklists.\n\n        Since RevIndex have fixed ksize and moltype and scaled, this\n        mostly just checks to see that the desired ksize and moltype match,\n        and the desired scaled is greater than the RevIndex scaled.\n\n        Also does picklist matching using RevIndex-specific Idx.\n        \"\"\"\n        _check_select_parameters(\n            ksize=ksize,\n            moltype=moltype,\n            scaled=scaled,\n            num=num,\n            abund=abund,\n            containment=containment,\n            picklist=picklist,\n            **kwargs,\n        )\n        self._init_inner()\n\n        assert not abund\n        assert num is None or num == 0\n        # ignore containment!\n\n        my_ksize = self._methodcall(lib.revindex_ksize)\n        my_scaled = self._methodcall(lib.revindex_scaled)\n        my_moltype = decode_str(self._methodcall(lib.revindex_moltype))\n\n        if ksize is not None:\n            if ksize != my_ksize:\n                raise ValueError(f\"revindex ksize is {my_ksize}, not {ksize}\")\n        if scaled is not None and scaled < my_scaled:\n            raise ValueError(f\"revindex scaled is {my_scaled}, not {scaled}\")\n        if moltype is not None and moltype != my_moltype:\n            raise ValueError(f\"revindex moltype is {my_moltype}, not {moltype}\")\n\n        if picklist is not None:\n            if self._idx_picklist is not None:\n                raise Exception(\"cannot use picklists multiple times, sorry\")\n\n            # select matching entries from our manifest:\n            m = self.manifest.select_to_manifest(picklist=picklist)\n\n            # build the internal picklist sing the internal Idx identifiers.\n            self._idx_picklist = RevIndex_DatasetPicklist.from_manifest(m)\n\n        return self\n\n\nclass SearchResult(RustObject):\n    \"\"\"\n    Hold SearchResults from Rust.\n    \"\"\"\n\n    __dealloc_func__ = lib.searchresult_free\n\n    def __repr__(self):\n        return f\"SearchResult({self.score}, {self.signature}, {self.location})\"\n\n    def __iter__(self):\n        return iter((self.score, self.signature, self.location))\n\n    def __getitem__(self, i):\n        return list(self)[i]\n\n    @property\n    def score(self):\n        return self._methodcall(lib.searchresult_score)\n\n    @property\n    def signature(self):\n        sig_ptr = self._methodcall(lib.searchresult_signature)\n        return SourmashSignature._from_objptr(sig_ptr)\n\n    @property\n    def location(self):\n        result = decode_str(self._methodcall(lib.searchresult_filename))\n        if result == \"\":\n            return None\n        return result\n\n\nclass MemRevIndex(RevIndex):\n    \"\"\"\n    Memory-based RevIndex.\n    \"\"\"\n\n    def __init__(self, *, template=None):\n        \"\"\"\n        Create an empty MemRevIndex, holding sketches that match the template.\n        \"\"\"\n        super().__init__()\n        assert template is not None\n        assert isinstance(template, MinHash)\n        if template.num != 0:\n            raise ValueError(\"must use scaled sketches\")\n        self.template = template.copy_and_clear()\n        self._scaled = template.scaled\n        self._signatures = []  # hold sketches _prior_ to construction\n        self._orig_signatures = {}\n\n    def _check_not_init(self, *, do_raise=True):\n        \"Confirm that this object is not initialized, optionally raising exc.\"\n        if self._objptr != ffi.NULL:\n            if do_raise:\n                raise Exception(\"already initialized\")\n            return False\n        return True\n\n    def _init_inner(self):\n        \"\"\"\n        Initialize the MemRevIndex from all signatures in self._signatures.\n        \"\"\"\n        if self._objptr != ffi.NULL:\n            # Already initialized\n            return\n\n        if not self._signatures and self._objptr == ffi.NULL:\n            raise ValueError(\"No signatures provided\")\n\n        if self.template.scaled < self._scaled:\n            self.template = self.template.downsample(scaled=self._scaled)\n\n        # prepare FFI call\n        template_ptr = self.template._get_objptr()\n\n        search_sigs_ptr = ffi.NULL\n        sigs_size = 0\n        collected = []\n        for sig in self._signatures:\n            collected.append(sig._get_objptr())\n            search_sigs_ptr = ffi.new(\"SourmashSignature*[]\", collected)\n            sigs_size = len(self._signatures)\n\n        self._objptr = rustcall(\n            lib.revindex_mem_new_with_sigs,\n            search_sigs_ptr,\n            sigs_size,\n            template_ptr,\n        )\n\n        # provide a mapping between original signatures, and potentially\n        # downsampled signatures stored in this object, based on md5sum\n        # See https://github.com/sourmash-bio/sourmash/issues/3601.\n        for n, (orig_ss, stored_ss) in enumerate(\n            zip(self._signatures, self.signatures())\n        ):\n            self._orig_signatures[stored_ss.md5sum()] = orig_ss\n\n    def insert(self, sig):\n        \"Add signature to internal list, tracking max scaled along way.\"\n        self._check_not_init()\n\n        if sig.minhash.scaled > self._scaled:\n            self._scaled = sig.minhash.scaled\n        self._signatures.append(sig)\n\n    def search(self, *args, **kwargs):\n        \"\"\"\n        Implement a search that returns the original signatures, not\n        just the indexed ones.\n\n        See also https://github.com/sourmash-bio/sourmash/issues/3601.\n        \"\"\"\n        results = super().search(*args, **kwargs)\n        results2 = []\n        for match in results:\n            match_md5 = match.signature.md5sum()\n            orig_ss = self._orig_signatures[match_md5]\n            results2.append(IndexSearchResult(match.score, orig_ss, match.location))\n        return results2\n\n\nclass DiskRevIndex(RevIndex):\n    \"\"\"\n    RocksDB-based low-memory on disk inverted index, implemented in Rust.\n    \"\"\"\n\n    __dealloc_func__ = lib.revindex_free\n    is_database = True\n\n    def __init__(self, path):\n        \"\"\"\n        Initialize based on a pre-existing RocksDB.\n        \"\"\"\n        super().__init__()\n        check_file = os.path.join(path, \"CURRENT\")\n        if not os.path.exists(check_file):\n            raise ValueError(\"not a RocksDB\")\n\n        # create via FFI\n        path_b = path.encode(\"utf-8\")\n        self._objptr = rustcall(lib.revindex_new_from_rocksdb, path_b)\n\n        # store location\n        self._path = path\n\n    def _init_inner(self):\n        pass\n\n    @property\n    def location(self):\n        return self._path\n\n    def insert(self, *args, **kwargs):\n        raise NotImplementedError\n\n    @classmethod\n    def create_from_sigs(self, siglist, path):\n        \"\"\"\n        Create a _new_ DiskRevIndex based on a list of signatures.\n        \"\"\"\n        path_b = path.encode(\"utf-8\")\n\n        collected = []\n        for ss in siglist:\n            rv = ss._get_objptr()\n            collected.append(rv)\n\n        sigs_ptr = ffi.new(\"SourmashSignature*[]\", collected)\n        sig_size = len(collected)\n\n        _ = rustcall(lib.revindex_disk_create, sigs_ptr, sig_size, path_b)\n\n        return DiskRevIndex(path)\n\n\nclass RevIndex_CounterGather:\n    \"\"\"\n    Simple implementation of CounterGather API that tracks matches\n    while passing most calls back to the parent RevIndex.\n\n    CTB note: This is not used in the code base currently, but _is_\n    tested in test_index_protocol, so I'm leaving it in for now.\n    \"\"\"\n\n    def __init__(self, query, db, threshold_bp, *, allow_insert=False):\n        \"\"\"\n        Initialize a CounterGather obj.\n\n        Here, 'db' can be either a RevIndex or a DiskRevIndex.\n        \"\"\"\n        self.query = query\n        self.orig_query_mh = query.minhash.copy().flatten()\n        self.found_mh = query.minhash.copy_and_clear().to_mutable()\n        self.db = db\n        self.threshold_bp = threshold_bp\n        self.allow_insert = allow_insert\n        self.locations = {}\n\n    def __len__(self):\n        return len(self.db)\n\n    @property\n    def scaled(self):\n        return self.db.scaled\n\n    def add(self, match_ss, *, location=None, require_overlap=True):\n        if self.allow_insert:\n            if self.db._check_not_init(do_raise=False):\n                self.db.insert(match_ss)\n            else:\n                raise ValueError\n\n        self.locations[match_ss.md5sum()] = location\n\n        query_mh = self.orig_query_mh\n        match_mh = match_ss.minhash\n        intersect_mh = flatten_and_intersect_scaled(query_mh, match_mh)\n        if require_overlap and not intersect_mh:\n            raise ValueError(\"require overlap\")\n\n        if self.found_mh.scaled < intersect_mh.scaled:\n            self.found_mh = self.found_mh.downsample(scaled=intersect_mh.scaled)\n\n        self.found_mh += intersect_mh\n\n    def peek(self, query_mh, *, threshold_bp=0):\n        \"\"\"\n        CounterGather API: return best matching minhash, plus intersection.\n        \"\"\"\n        if not query_mh:\n            return []\n\n        if query_mh.contained_by(self.orig_query_mh, True) != 1.0:\n            raise ValueError\n        # assert threshold_bp is not None\n\n        res = self.db.peek(query_mh, threshold_bp=threshold_bp)\n        if not res:\n            return []\n\n        sr, intersect_mh = res\n        sr_ss = sr.signature\n        sr_score = sr.score\n        new_sr = IndexSearchResult(sr_score, sr_ss, self.locations.get(sr_ss.md5sum()))\n        return new_sr, intersect_mh\n\n    def consume(self, intersect_mh):\n        \"CounterGather API: track found sketches.\"\n        self.db._init_inner()\n\n        if self.found_mh.scaled < intersect_mh.scaled:\n            self.found_mh = self.found_mh.downsample(scaled=intersect_mh.scaled)\n        elif self.found_mh.scaled > intersect_mh.scaled:\n            intersect_mh = intersect_mh.downsample(scaled=self.found_mh.scaled)\n\n        # CTB: is this right?\n        self.found_mh += intersect_mh\n\n    @property\n    def union_found(self):\n        \"Return all hashes found.\"\n        return self.found_mh\n\n    def signatures(self):\n        # don't track actual signatures - go back to RevIndex\n        # this is probably overkill.\n        for sr in self.db.prefetch(self.query):\n            yield sr.signature\n\n\nclass RevIndex_CounterGather_Colors(RustObject):\n    \"\"\"\n    Implementation of CounterGather using RevIndex color-based counters.\n    \"\"\"\n\n    __dealloc_func__ = lib.revindex_countergather_free\n\n    def __init__(self, objptr, query_ss, db):\n        \"\"\"\n        Track originating query & RevIndex.\n        \"\"\"\n        self._objptr = objptr\n        assert isinstance(db, RevIndex)\n        self.db = db\n        query_mh = query_ss.minhash\n        self._scaled = query_mh.scaled\n\n        if len(self) == 0:\n            raise ValueError(\"no matches found\")\n\n        empty_mh = query_mh.copy_and_clear()\n\n        # track found hashes:\n        found_mh_ptr = self._methodcall(\n            lib.revindex_countergather_found_hashes,\n            empty_mh._objptr,\n        )\n        self.found_mh = MinHash._from_objptr(found_mh_ptr)\n\n    @property\n    def scaled(self):\n        return self._scaled\n\n    def add(self, match_ss, *, location=None, require_overlap=True):\n        raise NotImplementedError\n\n    def peek(self, query_mh, *, threshold_bp=0):\n        \"\"\"\n        CounterGather API: return matching SearchResult + intersecting minhash.\n        \"\"\"\n        threshold_hashes = int(threshold_bp / query_mh.scaled)\n        match_ss_ptr = self._methodcall(\n            lib.revindex_countergather_peek,\n            self.db._objptr,\n            threshold_hashes,\n        )\n\n        # empty SourmashSignature => nothing found.\n        match_ss = SourmashSignature._from_objptr(match_ss_ptr)\n        if not match_ss:\n            return []\n\n        match_mh = match_ss.minhash\n        intersect_mh = flatten_and_intersect_scaled(query_mh, match_mh)\n        containment = len(intersect_mh) / len(query_mh)\n\n        return (\n            IndexSearchResult(containment, match_ss, self.db.location),\n            intersect_mh,\n        )\n\n    def consume(self, intersect_mh):\n        \"CounterGather API: decrement counters.\"\n        _ = self._methodcall(lib.revindex_countergather_consume, intersect_mh._objptr)\n\n    @property\n    def union_found(self):\n        \"Return all found hashes.\"\n        return self.found_mh\n\n    def __len__(self):\n        \"Return number of distinct matching signatures remaining.\"\n        return self._methodcall(lib.revindex_countergather_len)\n\n    def signatures(self):\n        \"Return all signatures found.\"\n        size = ffi.new(\"uintptr_t *\")\n        sigs_ptr = self._methodcall(\n            lib.revindex_countergather_signatures, self.db._objptr, size\n        )\n        size = size[0]\n\n        for i in range(size):\n            sig = SourmashSignature._from_objptr(sigs_ptr[i])\n            yield sig\n\n\nclass RevIndex_DatasetPicklist(RustObject):\n    \"\"\"\n    Intermediate class for holding lists of Idx, internal identifiers\n    used by RevIndex structs in Rust.\n    \"\"\"\n\n    __dealloc_func__ = lib.dataset_picklist_free\n\n    def __init__(self, idxs):\n        idx_list = list(idxs)\n        idx_list_size = len(idx_list)\n\n        # CTB do some validation on Idx?\n        self._objptr = rustcall(\n            lib.dataset_picklist_new_from_list, idx_list, idx_list_size\n        )\n\n    @classmethod\n    def from_manifest(cls, mf):\n        idx_list = [int(row[\"internal_location\"]) for row in mf.rows]\n        return cls(idx_list)\n"
  },
  {
    "path": "src/sourmash/index/sqlite_index.py",
    "content": "\"\"\"sqlite3 based Index, CollectionManifest, and LCA_Database\nimplementations.\n\nThese classes support a variety of flexible and fast on-disk storage,\nsearch, and retrieval functions.\n\nSqliteIndex stores full scaled signatures; sketches are stored as\nreverse-indexed collections of hashes. Search is optimized via the\nreverse index. Num and abund sketches are not supported. All scaled\nvalues must be the same upon insertion. Multiple moltypes _are_\nsupported.\n\nSqliteCollectionManifest provides a full implementation of the\nmanifest API. It can store details for all signature types. When used\nas part of a SqliteIndex database, it does not support independent\ninsertion.\n\nLCA_SqliteDatabase builds on top of SqliteIndex and LineageDB_Sqlite\n(in the tax submodule) to provide a full on-disk implementation of\nLCA_Database.\n\nUsing these classes\n-------------------\n\nThese classes are fully integrated into sourmash loading.\n\nInternally, use `sqlite_index.load_sqlite_index(...)` to load a specific\nfile; this will return the appropriate SqliteIndex, StandaloneManifestIndex,\nor LCA_Database object.\n\nUse `CollectionManifest.load_from_filename(...)` to load the manifest\ndirectly as a manifest object.\n\nImplementation Details\n----------------------\n\nSqliteIndex:\n\n* Hashes with values above MAX_SQLITE_INT=2**63-1 are transformed into\n  signed long longs upon insertion, and then back into ulong longs upon\n  retrieval.\n\n* Hash overlap is calculated via a SELECT.\n\n* SqliteIndex relies on SqliteCollectionManifest for manifest functionality,\n  including signature selection and picklists.\n\nSqliteCollectionManifest:\n\n* each object maintains info about whether it is being \"managed\" by a\n  SqliteIndex class or not. If it is, `_insert_row(...)` cannot be\n  called directly.\n\n* `select(...)` operates directly with SQL queries, except for\n  picklist selection, which involves inspect each manifest row in\n  Python. In addition to being (much) simpler, this ends up being\n  faster in some important real world situations, even for millions of\n  rows!\n\n* filter_on_rows and filter_on_columns also both operate in Python,\n  not SQL.\n\n* for this reason, the `locations()` method returns a superset of\n  locations.  This is potentially very significant if you do a select\n  with a picklist that ignores most sketches - the `locations()`\n  method will ignore the picklist.\n\nLimitations:\n\n* all of these classes share a single connection object, and it could\n  get confusing quickly if you simultaneously insert and query. We suggest\n  separating creation and insertion. That having been said, these databases\n  should work fine for many simultaneous queries; just don't write :).\n\n\"\"\"\n\nimport time\nimport os\nimport sqlite3\nfrom collections import defaultdict\nimport itertools\n\nfrom bitstring import BitArray\n\nfrom sourmash.index import Index, _check_select_parameters\nfrom sourmash.exceptions import IndexNotSupported\nfrom sourmash import MinHash, SourmashSignature\nfrom sourmash.index import IndexSearchResult, StandaloneManifestIndex\nfrom sourmash.picklist import SignaturePicklist\nfrom sourmash.logging import debug_literal\nfrom sourmash import sqlite_utils\n\nfrom sourmash.lca.lca_db import cached_property\nfrom sourmash.manifest import BaseCollectionManifest\n\n# converters for unsigned 64-bit ints: if over MAX_SQLITE_INT,\n# convert to signed int.\n\nMAX_SQLITE_INT = 2**63 - 1\n\n\ndef convert_hash_to(x):\n    return BitArray(uint=x, length=64).int if x > MAX_SQLITE_INT else x\n\n\ndef convert_hash_from(x):\n    return BitArray(int=x, length=64).uint if x < 0 else x\n\n\ndef load_sqlite_index(filename, *, request_manifest=False):\n    \"\"\"Load a SqliteIndex, SqliteCollectionManifest, or LCA_SqliteDatabase.\n\n    This is the main top-level API for loading an Index-like object. The logic\n    is roughly:\n\n    * does this database have both index and lineage tables? If so,\n      return an LCA_SqliteDatabase.\n    * if it only has an index, return a SqliteIndex.\n    * if it only has a manifest, return a StandaloneManifestIndex.\n\n    If you would like only a manifest, specify 'request_manifest=True'.\n    \"\"\"\n    conn = sqlite_utils.open_sqlite_db(filename)\n\n    if conn is None:\n        debug_literal(\"load_sqlite_index: conn is None.\")\n        return\n\n    c = conn.cursor()\n    internal_d = sqlite_utils.get_sourmash_internal(c)\n\n    is_index = False\n    is_manifest = False\n    is_lca_db = False\n\n    if \"SqliteIndex\" in internal_d:\n        v = internal_d[\"SqliteIndex\"]\n        if v != \"1.0\":\n            raise IndexNotSupported\n        is_index = True\n        debug_literal(\"load_sqlite_index: it's an index!\")\n\n    if is_index and \"SqliteLineage\" in internal_d:\n        v = internal_d[\"SqliteLineage\"]\n        if v != \"1.0\":\n            raise IndexNotSupported\n\n        is_lca_db = True\n        debug_literal(\"load_sqlite_index: it's got a lineage table!\")\n\n    if \"SqliteManifest\" in internal_d:\n        v = internal_d[\"SqliteManifest\"]\n        if v != \"1.0\":\n            raise IndexNotSupported\n        is_manifest = True\n        debug_literal(\n            f\"load_sqlite_index: it's a manifest! request_manifest: {request_manifest}\"\n        )\n\n    # every Index is a Manifest!\n    if is_index or is_lca_db:\n        assert is_manifest\n\n    idx = None\n    if is_index and not request_manifest:\n        conn.close()\n\n        if is_lca_db:\n            debug_literal(\"load_sqlite_index: returning LCA_SqliteDatabase\")\n            idx = LCA_SqliteDatabase.load(filename)\n        else:\n            debug_literal(\"load_sqlite_index: returning SqliteIndex\")\n            idx = SqliteIndex(filename)\n    elif is_manifest:\n        managed_by_index = False\n        if is_index:\n            assert request_manifest\n            managed_by_index = True\n\n        prefix = os.path.dirname(filename)\n        mf = SqliteCollectionManifest(conn, managed_by_index=managed_by_index)\n        idx = StandaloneManifestIndex(mf, filename, prefix=prefix)\n        debug_literal(\"load_sqlite_index: returning StandaloneManifestIndex\")\n\n    return idx\n\n\nclass SqliteIndex(Index):\n    is_database = True\n\n    # NOTE: we do not need _signatures_with_internal for this class\n    # because it supplies a manifest directly :tada:.\n\n    def __init__(self, dbfile, *, sqlite_manifest=None, conn=None):\n        \"Constructor. 'dbfile' should be valid filename or ':memory:'.\"\n        self.dbfile = dbfile\n\n        # no connection? connect and/or create!\n        if conn is None:\n            conn = self._open(dbfile)\n\n        # build me a SQLite manifest class to use for selection.\n        if sqlite_manifest is None:\n            sqlite_manifest = SqliteCollectionManifest(conn, managed_by_index=True)\n        self.manifest = sqlite_manifest\n        self.conn = conn\n\n        # set 'scaled'.\n        c = self.conn.cursor()\n        c.execute(\"SELECT DISTINCT scaled FROM sourmash_sketches\")\n        scaled_vals = c.fetchall()\n        if len(scaled_vals) > 1:\n            raise ValueError(\n                \"this database has multiple scaled values, which is not currently allowed\"\n            )\n\n        if scaled_vals:\n            self.scaled = scaled_vals[0][0]\n        else:\n            self.scaled = None\n\n    @classmethod\n    def _open(cls, dbfile, *, empty_ok=True):\n        \"Connect to existing SQLite database or create new.\"\n        try:\n            conn = sqlite3.connect(dbfile)\n            c = conn.cursor()\n\n            c.execute(\"PRAGMA cache_size=10000000\")\n            c.execute(\"PRAGMA synchronous = OFF\")\n            c.execute(\"PRAGMA journal_mode = MEMORY\")\n            c.execute(\"PRAGMA temp_store = MEMORY\")\n\n            if not empty_ok:\n                c.execute(\"SELECT * FROM sourmash_hashes LIMIT 1\")\n                c.fetchone()\n        except (sqlite3.OperationalError, sqlite3.DatabaseError):\n            raise ValueError(f\"cannot open '{dbfile}' as SqliteIndex database\")\n\n        return conn\n\n    @classmethod\n    def load(self, dbfile):\n        \"Load an existing SqliteIndex from dbfile.\"\n        return SqliteIndex(dbfile)\n\n    @classmethod\n    def create(cls, dbfile, *, append=False):\n        \"Create a new SqliteIndex in dbfile.\"\n        conn = cls._open(dbfile, empty_ok=True)\n        cls._create_tables(conn.cursor(), ignore_exists=append)\n        conn.commit()\n\n        return cls(dbfile, conn=conn)\n\n    @classmethod\n    def _create_tables(cls, c, *, ignore_exists=False):\n        \"Create sqlite tables for SqliteIndex\"\n        try:\n            sqlite_utils.add_sourmash_internal(c, \"SqliteIndex\", \"1.0\")\n            SqliteCollectionManifest._create_tables(c)\n\n            c.execute(\n                \"\"\"\n            CREATE TABLE IF NOT EXISTS sourmash_hashes (\n               hashval INTEGER NOT NULL,\n               sketch_id INTEGER NOT NULL,\n               FOREIGN KEY (sketch_id) REFERENCES sourmash_sketches (id)\n            )\n            \"\"\"\n            )\n            c.execute(\n                \"\"\"\n            CREATE INDEX IF NOT EXISTS sourmash_hashval_idx ON sourmash_hashes (\n               hashval,\n               sketch_id\n            )\n            \"\"\"\n            )\n            c.execute(\n                \"\"\"\n            CREATE INDEX IF NOT EXISTS sourmash_hashval_idx2 ON sourmash_hashes (\n               hashval\n            )\n            \"\"\"\n            )\n            c.execute(\n                \"\"\"\n            CREATE INDEX IF NOT EXISTS sourmash_sketch_idx ON sourmash_hashes (\n               sketch_id\n            )\n            \"\"\"\n            )\n        except (sqlite3.OperationalError, sqlite3.DatabaseError):\n            if not ignore_exists:\n                raise ValueError(\"cannot create SqliteIndex tables\")\n\n        return c\n\n    def cursor(self):\n        return self.conn.cursor()\n\n    def close(self):\n        self.conn.close()\n\n    def commit(self):\n        self.conn.commit()\n\n    def __len__(self):\n        return len(self.manifest)\n\n    def insert(self, ss, *, cursor=None, commit=True):\n        \"\"\"\n        Insert a signature into the sqlite database.\n\n        If a cursor object is supplied, use that cursor instead of\n        generating a new one.\n\n        If 'commit' is True, commit after add; otherwise, do not.\n        \"\"\"\n        if cursor:\n            c = cursor\n        else:\n            c = self.conn.cursor()\n\n        if ss.minhash.num:\n            raise ValueError(\"cannot store 'num' signatures in SqliteIndex\")\n        if ss.minhash.track_abundance:\n            raise ValueError(\"cannot store signatures with abundance in SqliteIndex\")\n\n        if self.scaled is not None and self.scaled != ss.minhash.scaled:\n            raise ValueError(\n                f\"this database can only store scaled values={self.scaled}\"\n            )\n        elif self.scaled is None:\n            self.scaled = ss.minhash.scaled\n\n        # ok, first create and insert a manifest row\n        row = BaseCollectionManifest.make_manifest_row(\n            ss, None, include_signature=False\n        )\n        self.manifest._insert_row(c, row, call_is_from_index=True)\n\n        # retrieve ID of row for retrieving hashes:\n        c.execute(\"SELECT last_insert_rowid()\")\n        (sketch_id,) = c.fetchone()\n\n        # insert all the hashes\n        hashes_to_sketch = []\n        for h in ss.minhash.hashes:\n            hh = convert_hash_to(h)\n            hashes_to_sketch.append((hh, sketch_id))\n\n        c.executemany(\n            \"INSERT INTO sourmash_hashes (hashval, sketch_id) VALUES (?, ?)\",\n            hashes_to_sketch,\n        )\n\n        if commit:\n            self.conn.commit()\n\n    @property\n    def location(self):\n        return self.dbfile\n\n    def signatures(self):\n        \"Return an iterator over all signatures in the Index object.\"\n        for ss, loc in self.signatures_with_location():\n            yield ss\n\n    def signatures_with_location(self):\n        \"Return an iterator over tuples (signature, location) in the Index.\"\n        c = self.conn.cursor()\n\n        for ss, loc, iloc in self._load_sketches(c):\n            yield ss, loc\n\n    def save(self, *args, **kwargs):\n        raise NotImplementedError\n\n    def find(self, search_fn, query, **kwargs):\n        search_fn.check_is_compatible(query)\n\n        # check compatibility, etc.\n        query_mh = query.minhash\n        if self.scaled > query_mh.scaled:\n            query_mh = query_mh.downsample(scaled=self.scaled)\n\n        picklist = None\n        if self.manifest.selection_dict:\n            picklist = self.manifest.selection_dict.get(\"picklist\")\n\n        c1 = self.conn.cursor()\n        c2 = self.conn.cursor()\n\n        debug_literal(\"running _get_matching_sketches...\")\n        t0 = time.time()\n        xx = self._get_matching_sketches(c1, query_mh.hashes, query_mh._max_hash)\n        for sketch_id, n_matching_hashes in xx:\n            debug_literal(\n                f\"...got sketch {sketch_id}, with {n_matching_hashes} matching hashes in {time.time() - t0:.2f}\"\n            )\n            #\n            # first, estimate sketch size using sql results.\n            #\n            query_size = len(query_mh)\n            subj_size = self._load_sketch_size(c2, sketch_id, query_mh._max_hash)\n            total_size = query_size + subj_size - n_matching_hashes\n            shared_size = n_matching_hashes\n\n            score = search_fn.score_fn(query_size, shared_size, subj_size, total_size)\n\n            debug_literal(\n                f\"APPROX RESULT: score={score} qsize={query_size}, ssize={subj_size} total={total_size} overlap={shared_size}\"\n            )\n\n            # do we pass?\n            if not search_fn.passes(score):\n                debug_literal(f\"FAIL score={score}\")\n\n            # CTB if we are doing containment only, we could break loop here.\n            # but for Jaccard, we must continue.\n            # see 'test_sqlite_jaccard_ordering'\n\n            if search_fn.passes(score):\n                subj = self._load_sketch(c2, sketch_id)\n                if search_fn.collect(score, subj):\n                    if picklist is None or subj in picklist:\n                        yield IndexSearchResult(score, subj, self.location)\n\n    def _select(self, *, num=0, track_abundance=False, **kwargs):\n        _check_select_parameters(**kwargs)\n\n        \"Run a select! This just modifies the manifest.\"\n        # check SqliteIndex specific conditions on the 'select'\n        if num:\n            raise ValueError(\"cannot select on 'num' in SqliteIndex\")\n        if track_abundance:\n            raise ValueError(\"cannot store or search signatures with abundance\")\n        # create manifest if needed\n        manifest = self.manifest\n        if manifest is None:\n            manifest = SqliteCollectionManifest(self.conn, managed_by_index=True)\n\n        # modify manifest\n        manifest = manifest.select_to_manifest(**kwargs)\n\n        return manifest\n\n    def select(self, *args, **kwargs):\n        sqlite_manifest = self._select(*args, **kwargs)\n\n        # return a new SqliteIndex with a new manifest, but same old conn.\n        return SqliteIndex(self.dbfile, sqlite_manifest=sqlite_manifest, conn=self.conn)\n\n    #\n    # Actual SQL queries, etc.\n    #\n\n    def _load_sketch_size(self, c1, sketch_id, max_hash):\n        \"Get sketch size for given sketch, downsampled by max_hash.\"\n        if max_hash <= MAX_SQLITE_INT:\n            c1.execute(\n                \"\"\"\n            SELECT COUNT(hashval) FROM sourmash_hashes\n            WHERE sketch_id=? AND hashval >= 0 AND hashval <= ?\"\"\",\n                (sketch_id, max_hash),\n            )\n        else:\n            c1.execute(\n                \"SELECT COUNT(hashval) FROM sourmash_hashes WHERE sketch_id=?\",\n                (sketch_id,),\n            )\n\n        (n_hashes,) = c1.fetchone()\n        return n_hashes\n\n    def _load_sketch(self, c, sketch_id, *, match_scaled=None):\n        \"Load an individual sketch. If match_scaled is set, downsample.\"\n\n        start = time.time()\n        c.execute(\n            \"\"\"\n        SELECT id, name, scaled, ksize, filename, moltype, seed\n        FROM sourmash_sketches WHERE id=?\"\"\",\n            (sketch_id,),\n        )\n        debug_literal(\n            f\"load sketch {sketch_id}: got sketch info in {time.time() - start:.2f}\"\n        )\n\n        sketch_id, name, scaled, ksize, filename, moltype, seed = c.fetchone()\n        if match_scaled is not None:\n            scaled = max(scaled, match_scaled)\n\n        is_protein = 1 if moltype == \"protein\" else 0\n        is_dayhoff = 1 if moltype == \"dayhoff\" else 0\n        is_hp = 1 if moltype == \"hp\" else 0\n\n        mh = MinHash(\n            n=0,\n            ksize=ksize,\n            scaled=scaled,\n            seed=seed,\n            is_protein=is_protein,\n            dayhoff=is_dayhoff,\n            hp=is_hp,\n        )\n\n        template_values = [sketch_id]\n\n        hash_constraint_str = \"\"\n        max_hash = mh._max_hash\n        if max_hash <= MAX_SQLITE_INT:\n            hash_constraint_str = (\n                \"sourmash_hashes.hashval >= 0 AND sourmash_hashes.hashval <= ? AND\"\n            )\n            template_values.insert(0, max_hash)\n        else:\n            debug_literal(\"NOT EMPLOYING hash_constraint_str\")\n\n        debug_literal(\n            f\"finding hashes for sketch {sketch_id} in {time.time() - start:.2f}\"\n        )\n        c.execute(\n            f\"SELECT hashval FROM sourmash_hashes WHERE {hash_constraint_str} sourmash_hashes.sketch_id=?\",\n            template_values,\n        )\n\n        debug_literal(\n            f\"loading hashes for sketch {sketch_id} in {time.time() - start:.2f}\"\n        )\n        for (hashval,) in c:\n            hh = convert_hash_from(hashval)\n            mh.add_hash(hh)\n\n        debug_literal(f\"done loading sketch {sketch_id} {time.time() - start:.2f})\")\n\n        return SourmashSignature(mh, name=name, filename=filename)\n\n    def _load_sketches(self, c):\n        \"Load sketches based on manifest _id column.\"\n        for row in self.manifest.rows:\n            sketch_id = row[\"_id\"]\n            assert row[\"num\"] == 0\n\n            moltype = row[\"moltype\"]\n            is_protein = 1 if moltype == \"protein\" else 0\n            is_dayhoff = 1 if moltype == \"dayhoff\" else 0\n            is_hp = 1 if moltype == \"hp\" else 0\n\n            ksize = row[\"ksize\"]\n            scaled = row[\"scaled\"]\n            seed = row[\"seed\"]\n\n            mh = MinHash(\n                n=0,\n                ksize=ksize,\n                scaled=scaled,\n                seed=seed,\n                is_protein=is_protein,\n                dayhoff=is_dayhoff,\n                hp=is_hp,\n            )\n\n            c.execute(\n                \"SELECT hashval FROM sourmash_hashes WHERE sketch_id=?\", (sketch_id,)\n            )\n\n            for (hashval,) in c:\n                mh.add_hash(convert_hash_from(hashval))\n\n            ss = SourmashSignature(mh, name=row[\"name\"], filename=row[\"filename\"])\n            yield ss, self.dbfile, sketch_id\n\n    def _get_matching_sketches(self, c, hashes, max_hash):\n        \"\"\"\n        For hashvals in 'hashes', retrieve all matching sketches,\n        together with the number of overlapping hashes for each sketch.\n\n        CTB: we do not use sqlite manifest conditions on this select,\n        because it slows things down in practice.\n        \"\"\"\n        c.execute(\"DROP TABLE IF EXISTS sourmash_hash_query\")\n        c.execute(\n            \"CREATE TEMPORARY TABLE sourmash_hash_query (hashval INTEGER PRIMARY KEY)\"\n        )\n\n        hashvals = [(convert_hash_to(h),) for h in hashes]\n        c.executemany(\n            \"INSERT OR IGNORE INTO sourmash_hash_query (hashval) VALUES (?)\", hashvals\n        )\n\n        #\n        # set up SELECT conditions\n        #\n\n        conditions = []\n        template_values = []\n\n        # downsample? => add to conditions\n        max_hash = min(max_hash, max(hashes))\n        if max_hash <= MAX_SQLITE_INT:\n            select_str = \"sourmash_hashes.hashval >= 0 AND sourmash_hashes.hashval <= ?\"\n            conditions.append(select_str)\n            template_values.append(max_hash)\n\n        # format conditions\n        conditions.append(\"sourmash_hashes.hashval=sourmash_hash_query.hashval\")\n        conditions = \" AND \".join(conditions)\n\n        c.execute(\n            f\"\"\"\n        SELECT DISTINCT sourmash_hashes.sketch_id,COUNT(sourmash_hashes.hashval) as CNT\n        FROM sourmash_hashes, sourmash_hash_query\n        WHERE {conditions}\n        GROUP BY sourmash_hashes.sketch_id ORDER BY CNT DESC\n        \"\"\",\n            template_values,\n        )\n\n        return c\n\n\nclass SqliteCollectionManifest(BaseCollectionManifest):\n    \"\"\"\n    A SQLite-based manifest, used both for SqliteIndex and as a standalone\n    manifest class.\n\n    This class serves two purposes:\n    * first, it is a fast, on-disk manifest that can be used in place of\n      CollectionManifest.\n    * second, it can be included within a SqliteIndex (which stores hashes\n      too). In this case, however, new entries must be inserted by SqliteIndex\n      rather than directly in this class.\n\n    In the latter case, the SqliteCollectionManifest is created with\n    managed_by_index set to True.\n    \"\"\"\n\n    def __init__(self, conn, *, selection_dict=None, managed_by_index=False):\n        \"\"\"\n        Here, 'conn' should already be connected and configured.\n\n        Use 'create(filename)' to create a new database.\n\n        Use 'create_from_manifest(filename, manifest) to create a new db\n        from an existing manifest object.\n\n        Use 'load_from_filename' to load from file.\n        \"\"\"\n        assert conn is not None\n        self.conn = conn\n        self.selection_dict = selection_dict\n        self.managed_by_index = managed_by_index\n        self._num_rows = None\n\n    @classmethod\n    def create(cls, filename):\n        \"Connect to 'filename' and create the tables as a standalone manifest.\"\n        conn = sqlite3.connect(filename)\n        cursor = conn.cursor()\n        cls._create_tables(cursor)\n        return cls(conn)\n\n    @classmethod\n    def create_or_open(cls, filename):\n        \"Connect to 'filename' and create tables if not exist.\"\n        conn = sqlite3.connect(filename)\n        cursor = conn.cursor()\n        try:\n            cls._create_tables(cursor)\n        except sqlite3.OperationalError:\n            pass\n        return cls(conn)\n\n    @classmethod\n    def load_from_manifest(cls, manifest, *, dbfile=\":memory:\", append=False):\n        \"Create a new sqlite manifest from an existing manifest object.\"\n        return cls._create_manifest_from_rows(\n            manifest.rows, location=dbfile, append=append\n        )\n\n    @classmethod\n    def create_manifest(cls, locations_iter, *, include_signature=False):\n        \"\"\"Create a manifest from an iterator that yields (ss, location)\n\n        Stores signatures in manifest rows by default.\n\n        Note: do NOT catch exceptions here, so this passes through load excs.\n        Note: this method ignores 'include_signature'.\n        \"\"\"\n\n        def rows_iter():\n            for ss, location in locations_iter:\n                row = cls.make_manifest_row(ss, location, include_signature=False)\n                yield row\n\n        return cls._create_manifest_from_rows(rows_iter())\n\n    @classmethod\n    def _create_tables(cls, cursor):\n        \"Create the manifest table.\"\n        # this is a class method so that it can be used by SqliteIndex to\n        # create manifest-compatible tables.\n\n        sqlite_utils.add_sourmash_internal(cursor, \"SqliteManifest\", \"1.0\")\n        cursor.execute(\n            \"\"\"\n        CREATE TABLE sourmash_sketches\n          (id INTEGER PRIMARY KEY,\n           name TEXT,\n           num INTEGER NOT NULL,\n           scaled INTEGER NOT NULL,\n           ksize INTEGER NOT NULL,\n           filename TEXT,\n           moltype TEXT NOT NULL,\n           with_abundance BOOLEAN NOT NULL,\n           md5sum TEXT NOT NULL,\n           seed INTEGER NOT NULL,\n           n_hashes INTEGER NOT NULL,\n           internal_location TEXT,\n        UNIQUE(internal_location, md5sum)\n        )\n        \"\"\"\n        )\n\n    def add_row(self, row):\n        c = self.conn.cursor()\n        self._insert_row(c, row)\n\n    def _insert_row(self, cursor, row, *, call_is_from_index=False):\n        \"Insert a new manifest row.\"\n        # check - is this manifest managed by SqliteIndex? If so, prevent\n        # insertions unless SqliteIndex is the one calling it.\n        if self.managed_by_index and not call_is_from_index:\n            raise Exception(\"must use SqliteIndex.insert to add to this manifest\")\n\n        row = dict(row)\n        if \"seed\" not in row:\n            row[\"seed\"] = 42\n\n        cursor.execute(\n            \"\"\"\n        INSERT OR IGNORE INTO sourmash_sketches\n          (name, num, scaled, ksize, filename, md5sum, moltype,\n           seed, n_hashes, with_abundance, internal_location)\n        VALUES (:name, :num, :scaled, :ksize, :filename, :md5,\n                :moltype, :seed, :n_hashes, :with_abundance,\n                :internal_location)\"\"\",\n            row,\n        )\n\n        self._num_rows = None  # reset cache\n\n    def __bool__(self):\n        \"Is this manifest empty?\"\n        if self._num_rows is not None:\n            return bool(self._num_rows)\n\n        try:\n            next(iter(self.rows))\n            return True\n        except StopIteration:\n            return False\n\n    def __eq__(self, other):\n        \"Check equality on a row-by-row basis. May fail on out-of-order rows.\"\n        for a, b in itertools.zip_longest(self.rows, other.rows):\n            # ignore non-required keys.\n            for k in self.required_keys:\n                if a[k] != b[k]:\n                    return False\n\n        return True\n\n    def __len__(self):\n        \"Number of rows.\"\n\n        # can we use cached value?\n        if self._num_rows is not None:\n            return self._num_rows\n\n        # self.rows is a generator, so can't use 'len'\n        self._num_rows = sum(1 for _ in self.rows)\n        return self._num_rows\n\n    def __iadd__(self, other):\n        c = self.conn.cursor()\n        for row in other.rows:\n            self._insert_row(c, row)\n        return self\n\n    def __add__(self, other):\n        new_mf = self.create(\":memory:\")\n        new_mf += self\n        new_mf += other\n        return new_mf\n\n    def close(self):\n        self.conn.commit()\n\n    def _make_select(self):\n        \"\"\"Build a set of SQL SELECT conditions and matching value tuple\n        that can be used to select the right sketches from the\n        database.\n\n        Returns a triple 'conditions', 'values', and 'picklist'.\n        'conditions' is a list that should be joined with 'AND'.\n\n        The picklist is simply retrieved from the selection dictionary.\n        \"\"\"\n        conditions = []\n        values = []\n        picklist = None\n        if self.selection_dict:\n            select_d = self.selection_dict\n            if \"ksize\" in select_d and select_d[\"ksize\"]:\n                conditions.append(\"sourmash_sketches.ksize = ?\")\n                values.append(select_d[\"ksize\"])\n            if \"num\" in select_d and select_d[\"num\"] > 0:\n                conditions.append(\"sourmash_sketches.num > 0\")\n            if \"scaled\" in select_d and select_d[\"scaled\"] and select_d[\"scaled\"] > 0:\n                conditions.append(\"sourmash_sketches.scaled > 0\")\n            if \"containment\" in select_d and select_d[\"containment\"]:\n                conditions.append(\"sourmash_sketches.scaled > 0\")\n            if \"moltype\" in select_d and select_d[\"moltype\"] is not None:\n                moltype = select_d[\"moltype\"]\n                assert moltype in (\"DNA\", \"protein\", \"dayhoff\", \"hp\"), moltype\n                conditions.append(f\"sourmash_sketches.moltype = '{moltype}'\")\n\n            picklist = select_d.get(\"picklist\")\n\n        return conditions, values, picklist\n\n    def select_to_manifest(self, **kwargs):\n        \"Create a new SqliteCollectionManifest with the given select args.\"\n        # Pass along all the selection kwargs to a new instance\n        if self.selection_dict:\n            debug_literal(\"sqlite manifest: merging selection dicts\")\n            # combine selects...\n            d = dict(self.selection_dict)\n            for k, v in kwargs.items():\n                if k in d:\n                    if d[k] is not None and d[k] != v:\n                        raise ValueError(f\"incompatible select on '{k}'\")\n                d[k] = v\n            kwargs = d\n\n        new_mf = SqliteCollectionManifest(self.conn, selection_dict=kwargs)\n\n        # if picklist, make sure we fill in 'found'.\n        picklist = kwargs.get(\"picklist\")\n        if picklist is not None:\n            debug_literal(\"sqlite manifest: iterating through picklist\")\n            _ = len(self)  # this forces iteration through rows.\n\n        return new_mf\n\n    @property\n    def rows(self):\n        \"Return rows that match the selection.\"\n        c1 = self.conn.cursor()\n\n        conditions, values, picklist = self._make_select()\n        if conditions:\n            conditions = conditions = \"WHERE \" + \" AND \".join(conditions)\n        else:\n            conditions = \"\"\n\n        debug_literal(f\"sqlite manifest rows: executing select with '{conditions}'\")\n        c1.execute(\n            f\"\"\"\n        SELECT id, name, md5sum, num, scaled, ksize, filename, moltype,\n        seed, n_hashes, internal_location FROM sourmash_sketches {conditions}\n        \"\"\",\n            values,\n        )\n\n        debug_literal(\"sqlite manifest: entering row yield loop\")\n        for (\n            _id,\n            name,\n            md5sum,\n            num,\n            scaled,\n            ksize,\n            filename,\n            moltype,\n            seed,\n            n_hashes,\n            iloc,\n        ) in c1:\n            row = dict(\n                num=num,\n                scaled=scaled,\n                name=name,\n                filename=filename,\n                n_hashes=n_hashes,\n                with_abundance=False,\n                ksize=ksize,\n                md5=md5sum,\n                internal_location=iloc,\n                moltype=moltype,\n                md5short=md5sum[:8],\n                seed=seed,\n                _id=_id,\n            )\n            if picklist is None or picklist.matches_manifest_row(row):\n                yield row\n\n    def filter_rows(self, row_filter_fn):\n        \"\"\"Create a new manifest filtered through row_filter_fn.\n\n        This is done in memory, inserting each row one at a time.\n        \"\"\"\n\n        def rows_iter():\n            for row in self.rows:\n                if row_filter_fn(row):\n                    yield row\n\n        return self._create_manifest_from_rows(rows_iter())\n\n    def filter_on_columns(self, col_filter_fn, col_names):\n        \"Create a new manifest based on column matches.\"\n\n        def row_filter_fn(row):\n            x = [row[col] for col in col_names if row[col] is not None]\n            return col_filter_fn(x)\n\n        return self.filter_rows(row_filter_fn)\n\n    def locations(self):\n        \"\"\"Return all possible locations for signatures.\n\n        CTB: this may be a (big) superset of locations, if picklists are used.\n        See test_sqlite_manifest_locations.\n\n        Use set(row['internal_locations'] for row in self.rows)\n        if you want an exact set of locations; will be slow for big manifests\n        tho.\n        \"\"\"\n        c1 = self.conn.cursor()\n\n        conditions, values, picklist = self._make_select()\n        if conditions:\n            conditions = conditions = \"WHERE \" + \" AND \".join(conditions)\n        else:\n            conditions = \"\"\n\n        c1.execute(\n            f\"\"\"\n        SELECT DISTINCT internal_location FROM sourmash_sketches {conditions}\n        \"\"\",\n            values,\n        )\n\n        return (iloc for (iloc,) in c1)\n\n    def __contains__(self, ss):\n        \"Check to see if signature 'ss' is in this manifest.\"\n        md5 = ss.md5sum()\n\n        c = self.conn.cursor()\n        c.execute(\"SELECT COUNT(*) FROM sourmash_sketches WHERE md5sum=?\", (md5,))\n        (val,) = c.fetchone()\n\n        if bool(val):\n            picklist = self.picklist\n            return picklist is None or ss in self.picklist\n        return False\n\n    @property\n    def picklist(self):\n        \"Return the picklist, if any.\"\n        if self.selection_dict:\n            return self.selection_dict.get(\"picklist\")\n        return None\n\n    def to_picklist(self):\n        \"Convert this manifest to a picklist.\"\n        pl = SignaturePicklist(\"manifest\")\n        pl.pickset = {pl._get_value_for_manifest_row(row) for row in self.rows}\n        return pl\n\n    @classmethod\n    def _create_manifest_from_rows(\n        cls, rows_iter, *, location=\":memory:\", append=False\n    ):\n        \"\"\"Create a SqliteCollectionManifest from a rows iterator.\n\n        Internal utility function.\n\n        CTB: should enable converting in-memory sqlite db to on-disk,\n        probably with sqlite3 'conn.backup(...)' function.\n        \"\"\"\n        try:\n            mf = cls.create(location)\n        except (sqlite3.OperationalError, sqlite3.DatabaseError) as exc:\n            if not append:\n                raise Exception(\n                    f\"cannot create sqlite3 db at '{location}'; exception: {str(exc)}\"\n                )\n            db = load_sqlite_index(location, request_manifest=True)\n            mf = db.manifest\n\n        cursor = mf.conn.cursor()\n\n        for row in rows_iter:\n            mf._insert_row(cursor, row)\n\n        mf.conn.commit()\n        return mf\n\n\nclass LCA_SqliteDatabase(SqliteIndex):\n    \"\"\"\n    A wrapper class for SqliteIndex + lineage db => LCA_Database functionality.\n    \"\"\"\n\n    is_database = True\n\n    def __init__(self, dbfile, *, lineage_db=None, sqlite_manifest=None):\n        # CTB note: we need to let SqliteIndex open dbfile here, so can't\n        # just pass in a conn.\n        super().__init__(dbfile, sqlite_manifest=sqlite_manifest)\n\n        c = self.conn.cursor()\n\n        c.execute(\"SELECT DISTINCT ksize, moltype FROM sourmash_sketches\")\n        res = list(c)\n        if len(res) > 1:\n            raise TypeError(\n                \"can only have one ksize & moltype in an LCA_SqliteDatabase\"\n            )\n        if len(res) == 0:\n            raise ValueError(\"cannot load an LCA_SqliteDatabase\")\n\n        self.ksize, self.moltype = res[0]\n        debug_literal(f\"setting ksize and moltype to {self.ksize}, {self.moltype}\")\n\n        if lineage_db is not None:\n            self.lineage_db = lineage_db\n\n            ## the below is done once, but could be implemented as something\n            ## ~dynamic.\n            self._build_index()\n\n    @classmethod\n    def load(cls, filename):\n        \"Load LCA_SqliteDatabase from a single file.\"\n        from sourmash.tax.tax_utils import LineageDB_Sqlite\n\n        # first, load the SqliteIndex:\n        try:\n            debug_literal(\"sqlite_index: loading LCA_SqliteDatabase as SqliteIndex.\")\n            obj = cls(filename)\n        except sqlite3.OperationalError:\n            raise ValueError(f\"cannot open '{filename}' as a SQLite index.\")\n\n        # now, toss in the lineage DB.\n        lineage_db = LineageDB_Sqlite(obj.conn)\n        obj.lineage_db = lineage_db\n        obj._build_index()\n\n        return obj\n\n    @classmethod\n    def create(cls, filename, idx, lineage_db):\n        \"Create a LCA_SqliteDatabase in a single file from existing idx/ldb.\"\n        from sourmash.tax.tax_utils import MultiLineageDB\n\n        # first, save/create signatures...\n        sqlidx = SqliteIndex.create(filename)\n\n        for ss in idx.signatures():\n            sqlidx.insert(ss)\n\n        # now, save the lineage_db into the same database\n        out_lineage_db = MultiLineageDB()\n        out_lineage_db.add(lineage_db)\n        out_lineage_db._save_sqlite(None, conn=sqlidx.conn)\n\n        # and voila! return, I guess?\n        return cls.load(filename)\n\n    def _build_index(self):\n        \"Rebuild the mappings that support identifier <-> lineage.\"\n        mf = self.manifest\n        lineage_db = self.lineage_db\n\n        ident_to_idx = {}\n        next_lid = 0\n        idx_to_lid = {}\n        lineage_to_lid = {}\n        lid_to_lineage = {}\n\n        for row in mf.rows:\n            name = row[\"name\"]\n            if name:\n                # this is a bit of a hack. we try identifiers _with_ and\n                # _without_ versions, and take whichever works. There is\n                # definitely a better way to do this, but I can't think\n                # of one right now.\n                ident = name.split(\" \")[0]\n\n                lineage = lineage_db.get(ident)  # try with identifier version\n                if lineage is None:  # nope - remove version.x\n                    ident = name.split(\".\")[0]\n                    lineage = lineage_db.get(ident)\n\n                idx = row[\"_id\"]  # this is only present in sqlite manifests.\n                ident_to_idx[ident] = idx\n\n                if lineage:\n                    lid = lineage_to_lid.get(lineage)\n\n                    # manufacture new lid?\n                    if lid is None:\n                        lid = next_lid\n                        next_lid += 1\n\n                        lineage_to_lid[lineage] = lid\n                        lid_to_lineage[lid] = lineage\n\n                    # assign idx <-> lid\n                    idx_to_lid[idx] = lid\n\n        self.ident_to_idx = ident_to_idx\n        self.idx_to_lid = idx_to_lid\n        self.lid_to_lineage = lid_to_lineage\n\n    # prevent insertions\n    def insert(self, *args, **kwargs):\n        raise NotImplementedError\n\n    # return correct type on select\n    def select(self, *args, **kwargs):\n        sqlite_manifest = self._select(*args, **kwargs)\n\n        return LCA_SqliteDatabase(\n            self.dbfile, sqlite_manifest=sqlite_manifest, lineage_db=self.lineage_db\n        )\n\n    ### LCA_Database API/protocol.\n\n    def downsample_scaled(self, scaled):\n        \"Downsample the scaled for querying.\"\n        if scaled < self.scaled:\n            raise ValueError(f\"cannot decrease scaled from {self.scaled} to {scaled}\")\n\n        # CTB: maybe return a new LCA_Database? Right now this isn't how\n        # the lca_db protocol works tho.\n        self.scaled = scaled\n\n    def get_lineage_assignments(self, hashval, *, min_num=None):\n        \"\"\"\n        Get a list of lineages for this hashval.\n        \"\"\"\n        x = []\n\n        idx_list = self.hashval_to_idx.get(hashval, [])\n        if min_num is None or len(idx_list) >= min_num:\n            for idx in idx_list:\n                lid = self.idx_to_lid.get(idx, None)\n                if lid is not None:\n                    lineage = self.lid_to_lineage[lid]\n                    x.append(lineage)\n\n        return x\n\n    @cached_property\n    def idx_to_ident(self):\n        \"Map individual idx to ident.\"\n        d = defaultdict(set)\n        for ident, idx in self.ident_to_idx.items():\n            assert idx not in d\n            d[idx] = ident\n        return d\n\n    @property\n    def hashval_to_idx(self):\n        \"Dynamically interpret the SQL 'hashes' table like it's a dict.\"\n        return _SqliteIndexHashvalToIndex(self)\n\n    @property\n    def hashvals(self):\n        \"Return all hashvals\"\n        return iter(_SqliteIndexHashvalToIndex(self))\n\n    def get_identifiers_for_hashval(self, hashval):\n        \"Return identifiers associated with this hashval\"\n        idxlist = self.hashval_to_idx[hashval]\n        for idx in idxlist:\n            yield self.idx_to_ident[idx]\n\n\nclass _SqliteIndexHashvalToIndex:\n    \"\"\"\n    Internal wrapper class to retrieve keys and key/value pairs for\n    hashval -> [ list of idx ].\n    \"\"\"\n\n    def __init__(self, sqlidx):\n        self.sqlidx = sqlidx\n\n    def __iter__(self):\n        \"Get all hashvals.\"\n        c = self.sqlidx.conn.cursor()\n        c.execute(\"SELECT DISTINCT hashval FROM sourmash_hashes\")\n        for (hashval,) in c:\n            yield hashval\n\n    def get(self, key, dv=None):\n        \"Retrieve idxlist for a given hash.\"\n        sqlidx = self.sqlidx\n        c = sqlidx.cursor()\n\n        hh = convert_hash_to(key)\n\n        c.execute(\"SELECT sketch_id FROM sourmash_hashes WHERE hashval=?\", (hh,))\n\n        x = [convert_hash_from(h) for (h,) in c]\n        return x or dv\n\n    def __getitem__(self, key):\n        \"Retrieve idxlist for a given hash; raise KeyError if not present.\"\n        v = self.get(key)\n        if v is None:\n            raise KeyError(key)\n        return v\n"
  },
  {
    "path": "src/sourmash/lca/__init__.py",
    "content": "\"LCA and reverse index utilities.\"\n\nfrom .lca_db import LCA_Database\nfrom .lca_utils import (\n    taxlist,\n    zip_lineage,\n    build_tree,\n    find_lca,\n    gather_assignments,\n    display_lineage,\n    count_lca_for_assignments,\n)\n\nfrom .command_index import index\nfrom .command_classify import classify\nfrom .command_summarize import summarize_main\nfrom .command_rankinfo import rankinfo_main\nfrom .__main__ import main\n"
  },
  {
    "path": "src/sourmash/lca/__main__.py",
    "content": "\"\"\"\nCommand-line entry point for 'python -m sourmash.lca'\n\"\"\"\n\nimport sys\nimport argparse\n\nfrom . import classify, index, summarize_main, rankinfo_main\nfrom .command_compare_csv import compare_csv\nfrom ..logging import set_quiet, error\n\nusage = \"\"\"\nsourmash lca <command> [<args>] - work with taxonomic information.\n\n** Commands can be:\n\nindex <taxonomy.csv> <output_db name> <signature [...]>  - create LCA database\nclassify --db <db_name [...]> --query <signature [...]>  - classify genomes\nsummarize --db <db_name [...]> --query <signature [...]> - summarize mixture\nrankinfo <db_name [...]>                                 - database rank info\ncompare_csv <csv1> <csv2>                                - compare spreadsheets\n\n** Use '-h' to get subcommand-specific help, e.g.\n\nsourmash lca index -h\n\"\"\"\n\n\ndef main(arglist=None):\n    args = sourmash.cli.get_parser().parse_args(arglist)\n    submod = getattr(sourmash.cli.sig, args.subcmd)\n    mainmethod = getattr(submod, \"main\")\n    return mainmethod(args)\n\n\nif __name__ == \"__main__\":\n    main(sys.argv)\n"
  },
  {
    "path": "src/sourmash/lca/command_classify.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nClassify individual signature files down to deepest possible node.\n\"\"\"\n\nimport sys\nimport csv\n\nfrom .. import sourmash_args\nfrom ..sourmash_args import load_file_as_signatures\nfrom ..logging import notify, error, debug, set_quiet\nfrom . import lca_utils\nfrom .lca_utils import check_files_exist\n\nDEFAULT_THRESHOLD = 5  # how many counts of a taxid at min\n\n\ndef classify_signature(query_sig, dblist, threshold, majority):\n    \"\"\"\n    Classify 'query_sig' using the given list of databases.\n\n    Insist on at least 'threshold' counts of a given lineage before taking\n    it seriously.\n\n    Return (lineage, status) where 'lineage' is a tuple of LineagePairs\n    and 'status' is either 'nomatch', 'found', or 'disagree'.\n\n    This function proceeds in two stages:\n\n       * first, build a list of assignments for all the lineages for each\n         hashval.  (For e.g. kraken, this is done in the database preparation\n         step; here, we do it dynamically each time.\n       * then, across all the hashvals, count the number of times each linage\n         shows up, and filter out low-abundance ones (under threshold).\n         Then, determine the LCA of all of those.\n\n    \"\"\"\n    # gather assignments from across all the databases\n    assignments = lca_utils.gather_assignments(query_sig.minhash.hashes, dblist)\n\n    # now convert to trees -> do LCA & counts\n    counts = lca_utils.count_lca_for_assignments(assignments)\n    debug(counts.most_common())\n\n    # ok, we now have the LCAs for each hashval, and their number of\n    # counts. Now build a tree across \"significant\" LCAs - those above\n    # threshold.\n\n    tree = {}\n\n    if counts and majority:\n        majority_vote, count = counts.most_common()[0]\n        if count > threshold:\n            lca_utils.build_tree([majority_vote], tree)\n    else:\n        for lca, count in counts.most_common():\n            if count < threshold:\n                break\n            # update tree with this set of assignments\n            lca_utils.build_tree([lca], tree)\n\n    status = \"nomatch\"\n    if not tree:\n        return [], status\n\n    # now find lowest-common-ancestor of the resulting tree.\n    lca, reason = lca_utils.find_lca(tree)\n    if reason == 0:  # leaf node\n        debug(\"END\", lca)\n        status = \"found\"\n    else:  # internal node => disagreement\n        debug(\"MULTI\", lca)\n        status = \"disagree\"\n\n    debug(\"lineage is:\", lca)\n\n    return lca, status\n\n\ndef classify(args):\n    \"\"\"\n    main single-genome classification function.\n    \"\"\"\n    if not args.db:\n        error(\"Error! must specify at least one LCA database with --db\")\n        sys.exit(-1)\n\n    set_quiet(args.quiet, args.debug)\n\n    # flatten --db and --query\n    args.db = [item for sublist in args.db for item in sublist]\n    args.query = [item for sublist in args.query for item in sublist]\n\n    if not check_files_exist(*args.db):\n        sys.exit(-1)\n\n    # load all the databases\n    dblist, ksize, scaled = lca_utils.load_databases(args.db, args.scaled)\n\n    # find all the queries\n    notify(\"finding query signatures...\")\n    inp_files = list(args.query)\n    if args.query_from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.query_from_file)\n        inp_files.extend(more_files)\n\n    if not check_files_exist(*inp_files):\n        sys.exit(-1)\n\n    if not inp_files:\n        error(\n            \"Error! must specify at least one query signature with --query or --query-from-file\"\n        )\n        sys.exit(-1)\n\n    # set up output\n    csvfp = csv.writer(sys.stdout)\n    notify(f\"outputting classifications to {args.output}\")\n    with sourmash_args.FileOutputCSV(args.output) as outfp:\n        csvfp = csv.writer(outfp)\n\n        csvfp.writerow([\"ID\", \"status\"] + list(lca_utils.taxlist()))\n\n        # for each query, gather all the matches across databases\n        total_count = 0\n        n = 0\n        total_n = len(inp_files)\n        for query_filename in inp_files:\n            n += 1\n            for query_sig in load_file_as_signatures(query_filename, ksize=ksize):\n                notify(\"\\r\\033[K\", end=\"\")\n                notify(f\"... classifying {query_sig} (file {n} of {total_n})\", end=\"\\r\")\n                debug(\"classifying\", query_sig)\n                total_count += 1\n\n                # make sure we're looking at the same scaled value as database\n                if query_sig.minhash.scaled != scaled:\n                    with query_sig.update() as query_sig:\n                        downsample_mh = query_sig.minhash.downsample(scaled=scaled)\n                        query_sig.minhash = downsample_mh\n\n                # do the classification\n                lineage, status = classify_signature(\n                    query_sig, dblist, args.threshold, args.majority\n                )\n                debug(lineage)\n\n                # output each classification to the spreadsheet\n                row = [str(query_sig), status]\n                row += lca_utils.zip_lineage(lineage)\n\n                # when outputting to stdout, make output intelligible\n                if not args.output:\n                    notify(\"\\r\\033[K\", end=\"\")\n                csvfp.writerow(row)\n\n        notify(\"\\r\\033[K\", end=\"\")\n        notify(f\"classified {total_count} signatures total\")\n\n\nif __name__ == \"__main__\":\n    sys.exit(classify(sys.argv[1:]))\n"
  },
  {
    "path": "src/sourmash/lca/command_compare_csv.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nCompare two taxonomy spreadsheets.\n\"\"\"\n\nimport sys\nfrom collections import defaultdict\n\nfrom ..logging import notify, error, print_results, set_quiet\nfrom . import lca_utils\nfrom .lca_utils import zip_lineage\nfrom .command_index import load_taxonomy_assignments\n\n\ndef compare_csv(args):\n    if args.start_column < 2:\n        error(\"error, --start-column cannot be less than 2\")\n        sys.exit(-1)\n\n    set_quiet(args.quiet, args.debug)\n\n    # first, load classify-style spreadsheet\n    notify(f\"loading classify output from: {args.csv1}\")\n    assignments0, num_rows0 = load_taxonomy_assignments(\n        args.csv1, start_column=3, force=args.force\n    )\n\n    notify(\n        f\"loaded {len(set(assignments0.values()))} distinct lineages, {num_rows0} rows\"\n    )\n    notify(\"----\")\n\n    # next, load custom taxonomy spreadsheet\n    delimiter = \",\"\n    if args.tabs:\n        delimiter = \"\\t\"\n\n    notify(f\"loading custom spreadsheet from: {args.csv2}\")\n    assignments, num_rows = load_taxonomy_assignments(\n        args.csv2,\n        delimiter=delimiter,\n        start_column=args.start_column,\n        use_headers=not args.no_headers,\n        force=args.force,\n    )\n    notify(\n        f\"loaded {len(set(assignments.values()))} distinct lineages, {num_rows} rows\"\n    )\n\n    # now, compute basic differences:\n    missing_1 = set(assignments0.keys()) - set(assignments.keys())\n    missing_2 = set(assignments.keys()) - set(assignments0.keys())\n    if missing_2:\n        notify(f\"missing {len(missing_2)} assignments in classify spreadsheet.\")\n    if missing_1:\n        notify(f\"missing {len(missing_1)} assignments in custom spreadsheet.\")\n    if missing_1 or missing_2:\n        notify(\"(these will not be evaluated any further)\")\n    else:\n        notify(\"note: all IDs are in both spreadsheets!\")\n\n    # next, look at differences in lineages\n    common = set(assignments0.keys())\n    common.intersection_update(assignments.keys())\n\n    n_total = 0\n    n_different = 0\n    n_compat = 0\n    n_incompat = 0\n    incompat_rank = defaultdict(int)\n    for k in common:\n        n_total += 1\n        v0 = assignments0[k]\n        v1 = assignments[k]\n        if v0 != v1:\n            n_different += 1\n            tree = lca_utils.build_tree([v0])\n            lca_utils.build_tree([v1], tree)\n\n            lca, reason = lca_utils.find_lca(tree)\n            if reason == 0:  # compatible lineages\n                n_compat += 1\n                print_results(\"{},compatible,{}\", k, \";\".join(zip_lineage(lca)))\n            else:\n                n_incompat += 1\n                print_results(\"{},incompatible,{}\", k, \";\".join(zip_lineage(lca)))\n                rank = next(iter(lca_utils.taxlist()))\n                if lca:\n                    rank = lca[-1].rank\n                incompat_rank[rank] += 1\n\n    notify(f\"{n_total} total assignments, {n_different} differ between spreadsheets.\")\n    notify(f\"{n_compat} are compatible (one lineage is ancestor of another.\")\n    notify(f\"{n_incompat} are incompatible (there is a disagreement in the trees).\")\n\n    if n_incompat:\n        for rank in lca_utils.taxlist():\n            notify(f\"{incompat_rank[rank]} incompatible at rank {rank}\")\n\n\nif __name__ == \"__main__\":\n    sys.exit(compare_csv(sys.argv[1:]))\n"
  },
  {
    "path": "src/sourmash/lca/command_index.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nBuild a lowest-common-ancestor database with given taxonomy and genome sigs.\n\"\"\"\n\nimport sys\nimport csv\nimport os\nfrom collections import defaultdict\n\nfrom sourmash import sourmash_args\nfrom sourmash.sourmash_args import load_file_as_signatures\nfrom sourmash.logging import notify, error, debug, set_quiet\nfrom . import lca_utils\nfrom .lca_db import LCA_Database\nfrom sourmash.sourmash_args import DEFAULT_LOAD_K\n\n\ndef load_taxonomy_assignments(\n    filename,\n    *,\n    delimiter=\",\",\n    start_column=2,\n    use_headers=True,\n    force=False,\n    split_identifiers=False,\n    keep_identifier_versions=False,\n):\n    \"\"\"\n    Load a taxonomy assignment spreadsheet into a dictionary.\n\n    The 'assignments' dictionary that's returned maps identifiers to\n    lineage tuples.\n    \"\"\"\n    from sourmash.tax.tax_utils import LineagePair\n\n    # parse spreadsheet!\n    # CTB note: can't easily switch to FileInputCSV, because of\n    # janky way we do/don't handle headers here. See issue #2198.\n    fp = open(filename, newline=\"\")\n    r = csv.reader(fp, delimiter=delimiter)\n    row_headers = [\"identifiers\"]\n    row_headers += [\"_skip_\"] * (start_column - 2)\n    row_headers += list(lca_utils.taxlist())\n\n    # first check that headers are interpretable.\n    if use_headers:\n        notify(\"examining spreadsheet headers...\")\n        first_row = next(iter(r))\n\n        n_disagree = 0\n        for column, value in zip(row_headers, first_row):\n            if column == \"_skip_\":\n                continue\n\n            if column.lower() != value.lower():\n                notify(f\"** assuming column '{value}' is {column} in spreadsheet\")\n                n_disagree += 1\n                if n_disagree > 2:\n                    error(\"whoa, too many assumptions. are the headers right?\")\n                    error(\"expecting {}\", \",\".join(row_headers))\n                    if not force:\n                        sys.exit(-1)\n                    notify(\"...continue, because --force was specified.\")\n\n    # convert into a lineage pair\n    assignments = {}\n    num_rows = 0\n    n_species = 0\n    n_strains = 0\n    for row in r:\n        if row and row[0].strip():  # want non-empty row\n            num_rows += 1\n            lineage = list(zip(row_headers, row))\n            lineage = [x for x in lineage if x[0] != \"_skip_\"]\n\n            ident = lineage[0][1]\n            lineage = lineage[1:]\n\n            # fold, spindle, and mutilate ident?\n            if split_identifiers:\n                ident = ident.split(\" \")[0]\n\n                if not keep_identifier_versions:\n                    ident = ident.split(\".\")[0]\n\n            # clean lineage of null names, replace with 'unassigned'\n            lineage = [(a, lca_utils.filter_null(b)) for (a, b) in lineage]\n            lineage = [LineagePair(a, b) for (a, b) in lineage]\n\n            # remove end nulls\n            while lineage and lineage[-1].name == \"unassigned\":\n                lineage = lineage[:-1]\n\n            # store lineage tuple\n            if lineage:\n                # check duplicates\n                if ident in assignments:\n                    if assignments[ident] != tuple(lineage):\n                        if not force:\n                            raise Exception(f\"multiple lineages for identifier {ident}\")\n                else:\n                    assignments[ident] = tuple(lineage)\n\n                    if lineage[-1].rank == \"species\":\n                        n_species += 1\n                    elif lineage[-1].rank == \"strain\":\n                        n_species += 1\n                        n_strains += 1\n\n    fp.close()\n\n    # this is to guard against a bug that happened once and I can't find\n    # any more, when building a large GTDB-based database :) --CTB\n    if len(assignments) * 0.2 > n_species and len(assignments) > 50:\n        if not force:\n            error(\"\")\n            error(\"ERROR: fewer than 20% of lineages have species-level resolution!?\")\n            error(\n                \"({} species assignments found, of {} assignments total)\",\n                n_species,\n                len(assignments),\n            )\n            error(\"** If this is intentional, re-run the command with -f.\")\n            sys.exit(-1)\n\n    return assignments, num_rows\n\n\ndef generate_report(\n    record_duplicates,\n    record_no_lineage,\n    record_remnants,\n    unused_lineages,\n    unused_identifiers,\n    filename,\n):\n    \"\"\"\n    Output a report of anomalies from building the index.\n    \"\"\"\n    with open(filename, \"w\") as fp:\n        print(f\"Duplicate signatures: {len(record_duplicates)}\", file=fp)\n        fp.write(\"\\n\".join(record_duplicates))\n        fp.write(\"\\n\")\n        print(f\"----\\nUnused identifiers: {len(unused_identifiers)}\", file=fp)\n        fp.write(\"\\n\".join(unused_identifiers))\n        fp.write(\"\\n\")\n        print(\n            f\"----\\nNo lineage provided for these identifiers: {len(record_no_lineage)}\",\n            file=fp,\n        )\n        fp.write(\"\\n\".join(record_no_lineage))\n        fp.write(\"\\n\")\n        print(\n            f\"----\\nNo signatures found for these identifiers: {len(record_remnants)}\",\n            file=fp,\n        )\n        fp.write(\"\\n\".join(record_remnants))\n        fp.write(\"\\n\")\n        print(f\"----\\nUnused lineages: {len(unused_lineages)}\", file=fp)\n        for lineage in unused_lineages:\n            fp.write(\";\".join(lca_utils.zip_lineage(lineage)))\n            fp.write(\"\\n\")\n\n\ndef index(args):\n    \"\"\"\n    main function for building an LCA database.\n    \"\"\"\n    if args.start_column < 2:\n        error(\"error, --start-column cannot be less than 2\")\n        sys.exit(-1)\n\n    set_quiet(args.quiet, args.debug)\n\n    args.scaled = int(args.scaled)\n\n    if args.ksize is None:\n        args.ksize = DEFAULT_LOAD_K\n\n    moltype = sourmash_args.calculate_moltype(args, default=\"DNA\")\n    picklist = sourmash_args.load_picklist(args)\n\n    db_outfile = args.lca_db_out\n    if args.database_format == \"json\":\n        if not (\n            db_outfile.endswith(\".lca.json\") or db_outfile.endswith(\".lca.json.gz\")\n        ):  # logic -> db.save\n            db_outfile += \".lca.json\"\n    else:\n        assert args.database_format == \"sql\"\n        if not db_outfile.endswith(\".lca.sql\"):\n            db_outfile += \".lca.sql\"\n\n    if os.path.exists(db_outfile):\n        error(f\"ERROR: output file {db_outfile} already exists. Not overwriting.\")\n        sys.exit(-1)\n\n    notify(f\"saving to LCA DB: {format(db_outfile)}\")\n\n    notify(\n        f\"Building LCA database with ksize={args.ksize} scaled={args.scaled} moltype={moltype}.\"\n    )\n\n    # first, load taxonomy spreadsheet\n    delimiter = \",\"\n    if args.tabs:\n        delimiter = \"\\t\"\n    assignments, num_rows = load_taxonomy_assignments(\n        args.csv,\n        delimiter=delimiter,\n        start_column=args.start_column,\n        use_headers=not args.no_headers,\n        force=args.force,\n        split_identifiers=args.split_identifiers,\n        keep_identifier_versions=args.keep_identifier_versions,\n    )\n\n    notify(\n        f\"{len(assignments)} distinct identities in spreadsheet out of {num_rows} rows.\"\n    )\n    notify(\n        f\"{len(set(assignments.values()))} distinct lineages in spreadsheet out of {num_rows} rows.\"\n    )\n\n    db = LCA_Database(args.ksize, args.scaled, moltype)\n\n    inp_files = list(args.signatures)\n    if args.from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.from_file)\n        inp_files.extend(more_files)\n\n    # track duplicates\n    md5_to_name = {}\n\n    #\n    # main loop, connecting lineage ID to signature.\n    #\n\n    n = 0\n    total_n = len(inp_files)\n    record_duplicates = set()\n    record_no_lineage = []\n    record_remnants = set(assignments)\n    record_used_lineages = set()\n    record_used_idents = set()\n    n_skipped = 0\n    for filename in inp_files:\n        n += 1\n        it = load_file_as_signatures(\n            filename,\n            ksize=args.ksize,\n            select_moltype=moltype,\n            picklist=picklist,\n            yield_all_files=args.force,\n        )\n        for sig in it:\n            notify(\"\\r\\033[K\", end=\"\")\n            notify(\n                f\"\\r... loading signature {str(sig)[:30]} ({n} of {total_n}); skipped {n_skipped} so far\",\n                end=\"\",\n            )\n            debug(filename, sig)\n\n            # block off duplicates.\n            if sig.md5sum() in md5_to_name:\n                debug(\n                    \"WARNING: in file {}, duplicate md5sum: {}; skipping\",\n                    filename,\n                    sig.md5sum(),\n                )\n                record_duplicates.add(sig.name)\n                continue\n\n            md5_to_name[sig.md5sum()] = str(sig)\n\n            # parse identifier, potentially with splitting\n            if sig.name:\n                ident = sig.name\n            else:\n                ident = sig.filename\n\n            orig_ident = ident\n            if args.split_identifiers:  # hack for NCBI-style names, etc.\n                # split on space...\n                ident = ident.split(\" \")[0]\n\n                if not args.keep_identifier_versions:\n                    # ...and on period.\n                    ident = ident.split(\".\")[0]\n\n            lineage = assignments.get(ident)\n\n            # punt if no lineage and --require-taxonomy\n            if lineage is None and args.require_taxonomy:\n                if args.fail_on_missing_taxonomy:\n                    notify(f\"ERROR: no taxonomy found for identifier '{ident}'\")\n                    if args.split_identifiers:\n                        notify(f\"(Identifier extracted from name: '{orig_ident})')\")\n                    sys.exit(-1)\n                debug(\"(skipping, because --require-taxonomy was specified)\")\n                n_skipped += 1\n                continue\n\n            # add the signature into the database.\n            try:\n                db.insert(sig, ident=ident, lineage=lineage)\n            except ValueError as e:\n                error(\n                    \"ERROR: cannot insert signature '{}' (md5 {}, loaded from '{}') into database.\",\n                    sig,\n                    sig.md5sum()[:8],\n                    filename,\n                )\n                error(\"ERROR: {}\", str(e))\n                sys.exit(-1)\n\n            if lineage:\n                # remove from our list of remaining ident -> lineage\n                record_remnants.remove(ident)\n\n                # track ident as used\n                record_used_idents.add(ident)\n                record_used_lineages.add(lineage)\n\n            # track lineage info - either no lineage, or this lineage used.\n            else:\n                debug(\"WARNING: no lineage assignment for {}.\", ident)\n                record_no_lineage.append(ident)\n\n    # end main add signatures loop\n\n    if n_skipped:\n        notify(\n            f\"... loaded {total_n} signatures; skipped {n_skipped} because of --require-taxonomy.\"\n        )\n    else:\n        notify(f\"... loaded {total_n} signatures.\")\n\n    # check -- did we find any signatures?\n    if n == 0:\n        error(\"ERROR: no signatures found. ??\")\n        sys.exit(1)\n\n    # check -- did the signatures we found have any hashes?\n    if not db.hashvals:\n        error(\"ERROR: no hash values found - are there any signatures?\")\n        sys.exit(1)\n    notify(\n        f\"loaded {len(db.hashvals)} hashes at ksize={args.ksize} scaled={args.scaled}\"\n    )\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    # summarize:\n    notify(\n        f\"{len(record_used_lineages)} assigned lineages out of {len(set(assignments.values()))} distinct lineages in spreadsheet.\"\n    )\n    unused_lineages = set(assignments.values()) - record_used_lineages\n\n    notify(\n        f\"{len(record_used_idents)} identifiers used out of {len(set(assignments))} distinct identifiers in spreadsheet.\"\n    )\n\n    assert record_used_idents.issubset(set(assignments))\n    unused_identifiers = set(assignments) - record_used_idents\n\n    # now, save!\n    db.save(db_outfile, format=args.database_format)\n\n    ## done!\n\n    # output a record of stuff if requested/available:\n    if record_duplicates or record_no_lineage or record_remnants or unused_lineages:\n        if record_duplicates:\n            notify(f\"WARNING: {len(record_duplicates)} duplicate signatures.\")\n        if record_no_lineage:\n            notify(\n                f\"WARNING: no lineage provided for {len(record_no_lineage)} signatures.\"\n            )\n        if record_remnants:\n            notify(\n                f\"WARNING: no signatures for {len(record_remnants)} spreadsheet rows.\"\n            )\n        if unused_lineages:\n            notify(f\"WARNING: {len(unused_lineages)} unused lineages.\")\n\n        if unused_identifiers:\n            notify(f\"WARNING: {len(unused_identifiers)} unused identifiers.\")\n\n        if args.report:\n            notify(f\"generating a report and saving in '{args.report}'\")\n            generate_report(\n                record_duplicates,\n                record_no_lineage,\n                record_remnants,\n                unused_lineages,\n                unused_identifiers,\n                args.report,\n            )\n        else:\n            notify(\"(You can use --report to generate a detailed report.)\")\n\n\nif __name__ == \"__main__\":\n    sys.exit(index(sys.argv[1:]))\n"
  },
  {
    "path": "src/sourmash/lca/command_rankinfo.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nSummarize rank-specific information from LCAs in one or more databases.\n\"\"\"\n\nimport sys\nfrom collections import defaultdict\n\nfrom ..logging import error, debug, set_quiet, notify\nfrom . import lca_utils\n\n\ndef make_lca_counts(dblist, min_num=0):\n    \"\"\"\n    Collect counts of all the LCAs in the list of databases.\n\n    CTB this could usefully be converted to a generator function.\n    \"\"\"\n\n    # gather all hashvalue assignments from across all the databases\n    assignments = defaultdict(set)\n    for lca_db in dblist:\n        for hashval in lca_db.hashvals:\n            lineages = lca_db.get_lineage_assignments(hashval, min_num=min_num)\n            if lineages:\n                assignments[hashval].update(lineages)\n\n    # now convert to trees -> do LCA & counts\n    counts = defaultdict(int)\n    for hashval, lineages in assignments.items():\n        # for each list of tuple_info [(rank, name), ...] build\n        # a tree that lets us discover lowest-common-ancestor.\n        debug(lineages)\n        tree = lca_utils.build_tree(lineages)\n\n        # now find either a leaf or the first node with multiple\n        # children; that's our lowest-common-ancestor node.\n        lca, reason = lca_utils.find_lca(tree)\n        counts[lca] += 1\n\n    return counts\n\n\ndef rankinfo_main(args):\n    \"\"\"\n    rankinfo!\n    \"\"\"\n    if not args.db:\n        error(\"Error! must specify at least one LCA database with --db\")\n        sys.exit(-1)\n\n    set_quiet(args.quiet, args.debug)\n\n    if args.scaled:\n        args.scaled = int(args.scaled)\n\n    # load all the databases\n    dblist, ksize, scaled = lca_utils.load_databases(args.db, args.scaled)\n\n    # count all the LCAs across these databases\n    counts = make_lca_counts(dblist, args.minimum_num)\n\n    # collect counts across all ranks\n    counts_by_rank = defaultdict(int)\n    for lineage, count in counts.items():\n        if lineage:\n            lineage_tup = lineage[-1]\n            counts_by_rank[lineage_tup.rank] += count\n\n    # output!\n    total = float(sum(counts_by_rank.values()))\n    if total == 0:\n        notify(\"(no hashvals with lineages found)\")\n    else:\n        for rank in lca_utils.taxlist():\n            count = counts_by_rank.get(rank, 0)\n            print(f\"{rank}: {count} ({count / total * 100.0:.1f}%)\")\n\n\nif __name__ == \"__main__\":\n    sys.exit(rankinfo_main(sys.argv[1:]))\n"
  },
  {
    "path": "src/sourmash/lca/command_summarize.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nSummarize the taxonomic content of the given signatures, combined.\n\"\"\"\n\nimport sys\nimport csv\nfrom collections import defaultdict\n\nfrom .. import sourmash_args\nfrom ..logging import notify, error, print_results, set_quiet, debug\nfrom . import lca_utils\nfrom .lca_utils import check_files_exist\nfrom sourmash.index import MultiIndex\n\n\nDEFAULT_THRESHOLD = 5\n\n\ndef summarize(hashvals, dblist, threshold, ignore_abundance):\n    \"\"\"\n    Classify 'hashvals' using the given list of databases.\n\n    Insist on at least 'threshold' counts of a given lineage before taking\n    it seriously.\n\n    Return (lineage, counts) where 'lineage' is a tuple of LineagePairs.\n    \"\"\"\n\n    # gather assignments from across all the databases\n    assignments = lca_utils.gather_assignments(hashvals, dblist)\n\n    # now convert to trees -> do LCA & counts\n    if not ignore_abundance:\n        counts = lca_utils.count_lca_for_assignments(assignments, hashvals)\n    else:  # flatten\n        counts = lca_utils.count_lca_for_assignments(assignments, None)\n    debug(counts.most_common())\n\n    # ok, we now have the LCAs for each hashval, and their number\n    # of counts. Now aggregate counts across the tree, going up from\n    # the leaves.\n    aggregated_counts = defaultdict(int)\n    for lca, count in counts.most_common():\n        if count < threshold:\n            break\n\n        if not lca:\n            aggregated_counts[lca] += count\n\n        # climb from the lca to the root.\n        while lca:\n            aggregated_counts[lca] += count\n            lca = lca[:-1]\n\n    debug(aggregated_counts)\n\n    return aggregated_counts\n\n\ndef load_singletons_and_count(filenames, ksize, scaled, ignore_abundance):\n    \"Load individual signatures and count them individually.\"\n    total_count = 0\n    n = 0\n\n    total_n = len(filenames)\n    for filename in filenames:\n        n += 1\n        idx = sourmash_args.load_file_as_index(filename)\n        idx = idx.select(ksize=ksize)\n\n        for query_sig, query_filename in idx.signatures_with_location():\n            notify(\"\\r\\033[K\", end=\"\")\n            notify(\n                f\"... loading {query_sig} (file {n} of {total_n})\", total_n, end=\"\\r\"\n            )\n            total_count += 1\n\n            if ignore_abundance and query_sig.minhash.track_abundance:\n                notify(\"NOTE: discarding abundances in query, since --ignore-abundance\")\n\n            # rebuild hashvals individually\n            hashvals = defaultdict(int)\n            count_signature(query_sig, scaled, hashvals)\n            yield query_filename, query_sig, hashvals\n\n    notify(\"\\r\\033[K\", end=\"\")\n    notify(f\"loaded {total_count} signatures from {n} files total.\")\n\n\ndef count_signature(sig, scaled, hashvals):\n    \"Downsample sig to given scaled, count hashvalues.\"\n    mh = sig.minhash.downsample(scaled=scaled)\n\n    if mh.track_abundance:\n        abunds = mh.hashes\n        for hashval, count in abunds.items():\n            hashvals[hashval] += count\n    else:\n        for hashval in mh.hashes:\n            hashvals[hashval] += 1\n\n\ndef output_results(lineage_counts, total_counts, filename=None, sig=None):\n    \"\"\"\\\n    Output results in ~human-readable format.\n    \"\"\"\n\n    for lineage, count in lineage_counts.items():\n        if lineage:\n            lineage = lca_utils.zip_lineage(lineage, truncate_empty=True)\n            lineage = \";\".join(lineage)\n        else:\n            lineage = \"(root)\"\n\n        p = count / total_counts * 100.0\n        p = f\"{p:.1f}%\"\n\n        print_results(\n            f\"{p:5} {count:>5}   {lineage}   {filename}:{sig.md5sum()[:8]} {sig}\"\n        )\n\n\ndef output_csv(lineage_counts, total_counts, csv_fp, filename, sig, write_header=True):\n    \"\"\"\\\n    Output results in CSV.\n    \"\"\"\n\n    w = csv.writer(csv_fp)\n    if write_header:\n        headers = [\"count\"] + list(lca_utils.taxlist())\n        headers += [\"filename\", \"sig_name\", \"sig_md5\", \"total_counts\"]\n        w.writerow(headers)\n\n    for lineage, count in lineage_counts.items():\n        debug(\"lineage:\", lineage)\n        row = [count] + lca_utils.zip_lineage(lineage, truncate_empty=False)\n        row += [filename, sig.name, sig.md5sum(), total_counts]\n        w.writerow(row)\n\n\ndef summarize_main(args):\n    \"\"\"\n    main summarization function.\n    \"\"\"\n    if not args.db:\n        error(\"Error! must specify at least one LCA database with --db\")\n        sys.exit(-1)\n\n    set_quiet(args.quiet, args.debug)\n\n    if args.scaled:\n        args.scaled = int(args.scaled)\n\n    ignore_abundance = args.ignore_abundance\n\n    # flatten --db and --query lists\n    args.db = [item for sublist in args.db for item in sublist]\n    args.query = [item for sublist in args.query for item in sublist]\n\n    if not check_files_exist(*args.db):\n        sys.exit(-1)\n\n    # load all the databases\n    dblist, ksize, scaled = lca_utils.load_databases(args.db, args.scaled)\n    if ignore_abundance:\n        notify(\n            \"Ignoring any k-mer abundances in query, since --ignore-abundance given.\"\n        )\n\n    # find all the queries\n    notify(\"finding query signatures...\")\n    inp_files = args.query\n\n    if args.query_from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.query_from_file)\n        inp_files.extend(more_files)\n\n    if not inp_files:\n        error(\"Error! must specify at least one query signature with --query\")\n        sys.exit(-1)\n\n    if not check_files_exist(*inp_files):\n        sys.exit(-1)\n\n    # summarize each signature individually\n    csv_fp = None\n    write_header = True\n    if args.output:\n        csv_fp = open(args.output, \"w\", newline=\"\")\n\n    try:\n        for filename, sig, hashvals in load_singletons_and_count(\n            inp_files, ksize, scaled, ignore_abundance\n        ):\n            # get the full counted list of lineage counts in this signature\n            lineage_counts = summarize(\n                hashvals, dblist, args.threshold, ignore_abundance\n            )\n            if not ignore_abundance:\n                total = float(sum(hashvals.values()))\n            else:\n                total = float(len(hashvals))\n\n            output_results(lineage_counts, total, filename=filename, sig=sig)\n\n            if csv_fp:\n                output_csv(\n                    lineage_counts,\n                    total,\n                    csv_fp,\n                    filename,\n                    sig,\n                    write_header=write_header,\n                )\n                write_header = False\n    finally:\n        if csv_fp:\n            csv_fp.close()\n\n\nif __name__ == \"__main__\":\n    sys.exit(summarize_main(sys.argv[1:]))\n"
  },
  {
    "path": "src/sourmash/lca/lca_db.py",
    "content": "\"LCA database class and utilities.\"\n\nimport os\nimport json\nimport gzip\nfrom collections import OrderedDict, defaultdict, Counter\nimport functools\n\nimport sourmash\nfrom sourmash.minhash import _get_max_hash_for_scaled\nfrom sourmash.logging import notify, error, debug\nfrom sourmash.index import Index, IndexSearchResult, _check_select_parameters\nfrom sourmash.picklist import passes_all_picklists\n\n\ndef cached_property(fun):\n    \"\"\"A memoize decorator for class properties.\"\"\"\n\n    @functools.wraps(fun)\n    def get(self):\n        try:\n            return self._cache[fun]\n        except AttributeError:\n            self._cache = {}\n        except KeyError:\n            pass\n        ret = self._cache[fun] = fun(self)\n        return ret\n\n    return property(get)\n\n\nclass LCA_Database(Index):\n    \"\"\"\n    An in-memory database that indexes signatures by hash, and provides\n    optional taxonomic lineage classification.\n\n    Follows the `Index` API for `insert`, `search`, `gather`, and `signatures`.\n\n    Identifiers `ident` must be unique, and are taken by default as the\n    entire signature name upon insertion. This can be overridden with\n    the `ident` keyword argument in `insert`.\n\n    Integer `idx` indices can be used as keys in dictionary attributes:\n    * `_idx_to_lid`, to get an (optional) lineage index.\n    * `_idx_to_ident`, to retrieve the unique string identifier for that `idx`.\n\n    Integer `lid` indices can be used as keys in dictionary attributes:\n    * `_lid_to_idx`, to get a set of `idx` with that lineage.\n    * `_lid_to_lineage`, to get a lineage for that `lid`.\n\n    `_lineage_to_lid` is a dictionary with tuples of LineagePair as keys,\n    `lid` as values.\n\n    `_ident_to_name` is a dictionary from unique str identifer to a name.\n\n    `_ident_to_idx` is a dictionary from unique str identifer to integer `idx`.\n\n    `_hashval_to_idx` is a dictionary from individual hash values to sets of\n    `idx`.\n    \"\"\"\n\n    is_database = True\n\n    # we set manifest to None to avoid implication of fast on-disk access to\n    # sketches. This may be revisited later.\n    manifest = None\n\n    def __init__(self, ksize, scaled, moltype=\"DNA\"):\n        self.ksize = int(ksize)\n        self.scaled = int(scaled)\n        self.filename = None\n        self.moltype = moltype\n\n        self._next_index = 0\n        self._next_lid = 0\n        self._ident_to_name = {}\n        self._ident_to_idx = {}\n        self._idx_to_lid = {}\n        self._lineage_to_lid = {}\n        self._lid_to_lineage = {}\n        self._hashval_to_idx = defaultdict(set)\n        self.picklists = []\n\n    @property\n    def location(self):\n        \"\"\"Return source filename.\n\n        Part of the Index protocol.\n        \"\"\"\n        return self.filename\n\n    def __len__(self):\n        \"\"\"Return number of sketches.\n\n        Part of the Index protocol.\n        \"\"\"\n        return self._next_index\n\n    def _invalidate_cache(self):\n        \"\"\"Force rebuild of signatures after an 'insert'.\n\n        Internal method.\n        \"\"\"\n        if hasattr(self, \"_cache\"):\n            del self._cache\n\n    def _get_ident_index(self, ident, fail_on_duplicate=False):\n        \"\"\"Get (create if necessary) a unique int idx, for each identifier.\n\n        Internal method.\n        \"\"\"\n        idx = self._ident_to_idx.get(ident)\n        if fail_on_duplicate:\n            assert idx is None  # should be no duplicate identities\n\n        if idx is None:\n            idx = self._next_index\n            self._next_index += 1\n\n            self._ident_to_idx[ident] = idx\n\n        return idx\n\n    def _get_lineage_id(self, lineage):\n        \"\"\"Get (create if necessary) a unique lineage ID for each\n        LineagePair tuples.\"\n\n        Internal method of this class.\n        \"\"\"\n        # does one exist already?\n        lid = self._lineage_to_lid.get(lineage)\n\n        # nope - create one. Increment next_lid.\n        if lid is None:\n            lid = self._next_lid\n            self._next_lid += 1\n\n            # build mappings\n            self._lineage_to_lid[lineage] = lid\n            self._lid_to_lineage[lid] = lineage\n\n        return lid\n\n    def insert(self, sig, ident=None, lineage=None):\n        \"\"\"Add a new signature into the LCA database.\n\n        Takes optional arguments 'ident' and 'lineage'.\n\n        'ident' must be a unique string identifer across this database;\n        if not specified, the signature name (sig.name) is used.\n\n        'lineage', if specified, must contain a tuple of LineagePair objects.\n\n        Method unique to this class.\n        \"\"\"\n        minhash = sig.minhash\n\n        if minhash.ksize != self.ksize:\n            raise ValueError(\n                f\"cannot insert signature with ksize {minhash.ksize} into DB (ksize {self.ksize})\"\n            )\n\n        if minhash.moltype != self.moltype:\n            raise ValueError(\n                f\"cannot insert signature with moltype {minhash.moltype} into DB (moltype {self.moltype})\"\n            )\n\n        # downsample to specified scaled; this has the side effect of\n        # making sure they're all at the same scaled value!\n        try:\n            minhash = minhash.downsample(scaled=self.scaled)\n        except ValueError:\n            raise ValueError(\"cannot downsample signature; is it a scaled signature?\")\n\n        if not ident:\n            ident = str(sig)\n\n        if ident in self._ident_to_name:\n            raise ValueError(f\"signature '{ident}' is already in this LCA db.\")\n\n        # before adding, invalide any caching from @cached_property\n        self._invalidate_cache()\n\n        # store full name\n        self._ident_to_name[ident] = sig.name\n\n        # identifier -> integer index (idx)\n        idx = self._get_ident_index(ident, fail_on_duplicate=True)\n        if lineage:\n            try:\n                lineage = tuple(lineage)\n\n                # (LineagePairs*) -> integer lineage ids (lids)\n                lid = self._get_lineage_id(lineage)\n\n                # map idx to lid as well.\n                self._idx_to_lid[idx] = lid\n            except TypeError:\n                raise ValueError(\"lineage cannot be used as a key?!\")\n\n        for hashval in minhash.hashes:\n            self._hashval_to_idx[hashval].add(idx)\n\n        return len(minhash)\n\n    def __repr__(self):\n        if self.filename is None:\n            return \"LCA_Database()\"\n        return f\"LCA_Database('{self.filename}')\"\n\n    def signatures(self):\n        \"\"\"Return all of the signatures in this LCA database.\n\n        Part of the Index protocol.\n        \"\"\"\n        from sourmash import SourmashSignature\n\n        if self.picklists:\n            pl = self.picklists\n            for v in self._signatures.values():\n                if passes_all_picklists(v, pl):\n                    yield v\n        else:\n            for v in self._signatures.values():\n                yield v\n\n    def _signatures_with_internal(self):\n        \"\"\"Return all of the signatures in this LCA database.\n\n        Part of the Index protocol; used for buulding manifests.\n        \"\"\"\n\n        for idx, ss in self._signatures.items():\n            yield ss, idx\n\n    def select(\n        self,\n        ksize=None,\n        moltype=None,\n        num=0,\n        scaled=0,\n        abund=None,\n        containment=False,\n        picklist=None,\n        **kwargs,\n    ):\n        \"\"\"Select a subset of signatures to search.\n\n        As with SBTs, queries with higher scaled values than the database\n        can still be used for containment search, but not for similarity\n        search. See SBT.select(...) for details, and _find_signatures for\n        implementation.\n\n        Will always raise ValueError if a requirement cannot be met.\n        \"\"\"\n        _check_select_parameters(\n            ksize=ksize,\n            num=num,\n            moltype=moltype,\n            scaled=scaled,\n            containment=containment,\n            abund=abund,\n            picklist=picklist,\n            **kwargs,\n        )\n\n        if num:\n            raise ValueError(\"cannot use 'num' MinHashes to search LCA database\")\n\n        if scaled and scaled > self.scaled and not containment:\n            raise ValueError(\n                f\"cannot use scaled={scaled} on this database (scaled={self.scaled})\"\n            )\n\n        if ksize is not None and self.ksize != ksize:\n            raise ValueError(\n                f\"ksize on this database is {self.ksize}; this is different from requested ksize of {ksize}\"\n            )\n        if moltype is not None and moltype != self.moltype:\n            raise ValueError(\n                f\"moltype on this database is {self.moltype}; this is different from requested moltype of {moltype}\"\n            )\n\n        if abund:\n            raise ValueError(\"LCA databases do not support sketches with abund=True\")\n\n        if picklist is not None:\n            self.picklists.append(picklist)\n            if len(self.picklists) > 1:\n                raise ValueError(\n                    \"we do not (yet) support multiple picklists for LCA databases\"\n                )\n\n        return self\n\n    @classmethod\n    def load(cls, db_name):\n        \"\"\"Load LCA_Database from a JSON file.\n\n        Method specific to this class.\n        \"\"\"\n        from .lca_utils import taxlist\n        from sourmash.tax.tax_utils import LineagePair\n\n        if not os.path.isfile(db_name):\n            raise ValueError(\n                f\"'{db_name}' is not a file and cannot be loaded as an LCA database\"\n            )\n\n        try:\n            from sourmash.index.sqlite_index import LCA_SqliteDatabase\n\n            return LCA_SqliteDatabase.load(db_name)\n        except ValueError:\n            pass\n\n        xopen = open\n        if db_name.endswith(\".gz\"):\n            xopen = gzip.open\n\n        with xopen(db_name, \"rt\") as fp:\n            try:\n                first_ch = fp.read(1)\n            except ValueError:\n                first_ch = \"X\"\n            if not first_ch or first_ch[0] != \"{\":\n                raise ValueError(f\"'{db_name}' is not an LCA database file.\")\n\n            fp.seek(0)\n\n            load_d = {}\n            try:\n                load_d = json.load(fp)\n            except json.decoder.JSONDecodeError:\n                pass\n\n            if not load_d:\n                raise ValueError(\n                    \"cannot parse database file '{}' as JSON; invalid format.\"\n                )\n\n            version = None\n            db_type = None\n            try:\n                version = load_d.get(\"version\")\n                db_type = load_d.get(\"type\")\n            except AttributeError:\n                pass\n\n            if db_type != \"sourmash_lca\":\n                raise ValueError(f\"database file '{db_name}' is not an LCA db.\")\n\n            version = float(version)\n            if version < 2.0 or \"lid_to_lineage\" not in load_d:\n                raise ValueError(\n                    \"Error! This is an old-style LCA DB. You'll need to rebuild or download a newer one.\"\n                )\n\n            ksize = int(load_d[\"ksize\"])\n            scaled = int(load_d[\"scaled\"])\n            moltype = load_d.get(\"moltype\", \"DNA\")\n            if moltype != \"DNA\":\n                assert ksize % 3 == 0\n                ksize = int(ksize / 3)\n\n            db = cls(ksize, scaled, moltype)\n\n            # convert lineage_dict to proper lineages (tuples of LineagePairs)\n            lid_to_lineage_2 = load_d[\"lid_to_lineage\"]\n            lid_to_lineage = {}\n            lineage_to_lid = {}\n            for k, v in lid_to_lineage_2.items():\n                v = dict((x[0], x[1]) for x in v)\n                vv = []\n                for rank in taxlist():\n                    name = v.get(rank, \"\")\n                    vv.append(LineagePair(rank, name))\n\n                vv = tuple(vv)\n                lid_to_lineage[int(k)] = vv\n                lineage_to_lid[vv] = int(k)\n            db._lid_to_lineage = lid_to_lineage\n            db._lineage_to_lid = lineage_to_lid\n\n            # convert hashval -> lineage index keys to integers (looks like\n            # JSON doesn't have a 64 bit type so stores them as strings)\n            hashval_to_idx_2 = load_d[\"hashval_to_idx\"]\n            hashval_to_idx = {}\n\n            for k, v in hashval_to_idx_2.items():\n                hashval_to_idx[int(k)] = v\n            db._hashval_to_idx = hashval_to_idx\n\n            db._ident_to_name = load_d[\"ident_to_name\"]\n            db._ident_to_idx = load_d[\"ident_to_idx\"]\n\n            db._idx_to_lid = {}\n            for k, v in load_d[\"idx_to_lid\"].items():\n                db._idx_to_lid[int(k)] = v\n\n        if db._ident_to_idx:\n            db._next_index = max(db._ident_to_idx.values()) + 1\n        else:\n            db._next_index = 0\n        if db._idx_to_lid:\n            db._next_lid = max(db._idx_to_lid.values()) + 1\n        else:\n            db._next_lid = 0\n\n        db.filename = db_name\n\n        return db\n\n    def save(self, db_name, *, format=\"json\"):\n        if format == \"sql\":\n            self.save_to_sql(db_name)\n        else:\n            assert format == \"json\"\n            self.save_to_json(db_name)\n\n    def save_to_json(self, db_name):\n        \"\"\"Save LCA_Database to a JSON file.\n\n        Method specific to this class.\n        \"\"\"\n        if os.path.exists(db_name):\n            raise ValueError(\n                f\"LCA database {db_name} already exists; not overwriting or appending\"\n            )\n\n        xopen = open\n        if db_name.endswith(\".gz\"):\n            xopen = gzip.open\n\n        with xopen(db_name, \"wt\") as fp:\n            # use an OrderedDict to preserve output order\n            save_d = OrderedDict()\n            save_d[\"version\"] = \"2.1\"\n            save_d[\"type\"] = \"sourmash_lca\"\n            save_d[\"license\"] = \"CC0\"\n\n            if self.moltype != \"DNA\":\n                ksize = self.ksize * 3\n            else:\n                ksize = self.ksize\n            save_d[\"ksize\"] = ksize\n            save_d[\"scaled\"] = self.scaled\n            save_d[\"moltype\"] = self.moltype\n\n            # convert lineage internals from tuples to dictionaries\n            d = OrderedDict()\n            for k, v in self._lid_to_lineage.items():\n                d[k] = dict([(vv.rank, vv.name) for vv in v])\n            save_d[\"lid_to_lineage\"] = d\n\n            # convert values from sets to lists, so that JSON knows how to save\n            save_d[\"hashval_to_idx\"] = dict(\n                (k, list(v)) for (k, v) in self._hashval_to_idx.items()\n            )\n\n            save_d[\"ident_to_name\"] = self._ident_to_name\n            save_d[\"ident_to_idx\"] = self._ident_to_idx\n            save_d[\"idx_to_lid\"] = self._idx_to_lid\n            save_d[\"lid_to_lineage\"] = self._lid_to_lineage\n\n            json.dump(save_d, fp)\n\n    def save_to_sql(self, dbname):\n        \"Save this LCA_Database into an LCA_SqliteDatabase\"\n        from sourmash.index.sqlite_index import LCA_SqliteDatabase\n        from sourmash.tax.tax_utils import LineageDB\n\n        if os.path.exists(dbname):\n            raise ValueError(\n                f\"LCA database {dbname} already exists; not overwriting or appending\"\n            )\n\n        # create a new in-memory lineage db...\n        assignments = {}\n        available_ranks = set()  # track ranks, too\n        for ident, idx in self._ident_to_idx.items():\n            lid = self._idx_to_lid.get(idx)\n            if lid is not None:\n                lineage = self._lid_to_lineage[lid]\n                assignments[ident] = lineage\n                for pair in lineage:\n                    available_ranks.add(pair.rank)\n\n        ldb = LineageDB(assignments, available_ranks)\n\n        # ...and pass over to create, using 'self' as index.\n        LCA_SqliteDatabase.create(dbname, self, ldb)\n\n    def downsample_scaled(self, scaled):\n        \"\"\"\n        Downsample to the provided scaled value, i.e. eliminate all hashes\n        that don't fall in the required range.\n\n        This applies to this database in place.\n\n        Method specific to LCA databases.\n        \"\"\"\n        if scaled == self.scaled:\n            return\n        elif scaled < self.scaled:\n            raise ValueError(f\"cannot decrease scaled from {self.scaled} to {scaled}\")\n\n        self._invalidate_cache()\n\n        max_hash = _get_max_hash_for_scaled(scaled)\n\n        # filter out all hashes over max_hash in value.\n        new_hashvals = defaultdict(set)\n        for k, v in self._hashval_to_idx.items():\n            if k < max_hash:\n                new_hashvals[k] = v\n        self._hashval_to_idx = new_hashvals\n        self.scaled = scaled\n\n    @property\n    def hashvals(self):\n        \"Return all hashvals stored in this database.\"\n        return self._hashval_to_idx.keys()\n\n    def get_lineage_assignments(self, hashval, min_num=None):\n        \"\"\"Get a list of lineages for this hashval.\n\n        Method specific to LCA Databases.\n        \"\"\"\n        x = []\n\n        idx_list = self._hashval_to_idx.get(hashval, [])\n\n        if min_num and len(idx_list) < min_num:\n            return []\n\n        for idx in idx_list:\n            lid = self._idx_to_lid.get(idx, None)\n            if lid is not None:\n                lineage = self._lid_to_lineage[lid]\n                x.append(lineage)\n\n        return x\n\n    def get_identifiers_for_hashval(self, hashval):\n        \"\"\"\n        Get a list of identifiers for signatures containing this hashval\n        \"\"\"\n        idx_list = self._hashval_to_idx.get(hashval, [])\n\n        for idx in idx_list:\n            yield self._idx_to_ident[idx]\n\n    @cached_property\n    def _signatures(self):\n        \"\"\"Create a _signatures member dictionary that contains {idx: sigobj}.\n\n        Internal method of this class.\n        \"\"\"\n        from sourmash import MinHash, SourmashSignature\n\n        is_protein = False\n        is_hp = False\n        is_dayhoff = False\n        if self.moltype == \"protein\":\n            is_protein = True\n        elif self.moltype == \"hp\":\n            is_hp = True\n        elif self.moltype == \"dayhoff\":\n            is_dayhoff = True\n\n        minhash = MinHash(\n            n=0,\n            ksize=self.ksize,\n            scaled=self.scaled,\n            is_protein=is_protein,\n            hp=is_hp,\n            dayhoff=is_dayhoff,\n        )\n\n        debug(\"creating signatures for LCA DB...\")\n        mhd = defaultdict(minhash.copy_and_clear)\n        temp_vals = defaultdict(list)\n\n        # invert the hashval_to_idx dictionary\n        for hashval, idlist in self._hashval_to_idx.items():\n            for idx in idlist:\n                temp_hashes = temp_vals[idx]\n                temp_hashes.append(hashval)\n\n                # 50 is an arbitrary number. If you really want\n                # to micro-optimize, list is resized and grow in this pattern:\n                # 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...\n                # (from https://github.com/python/cpython/blob/b2b4a51f7463a0392456f7772f33223e57fa4ccc/Objects/listobject.c#L57)\n                if len(temp_hashes) > 50:\n                    mhd[idx].add_many(temp_hashes)\n\n                    # Sigh, python 2... when it goes away,\n                    # we can do `temp_hashes.clear()` instead.\n                    del temp_vals[idx]\n\n        # We loop temp_vals again to add any remainder hashes\n        # (each list of hashes is smaller than 50 items)\n        for sig, vals in temp_vals.items():\n            mhd[sig].add_many(vals)\n\n        sigd = {}\n        for idx, mh in mhd.items():\n            ident = self._idx_to_ident[idx]\n            name = self._ident_to_name[ident]\n            ss = SourmashSignature(mh, name=name)\n            ss.into_frozen()\n\n            if passes_all_picklists(ss, self.picklists):\n                sigd[idx] = ss\n\n        debug(\"=> {} signatures!\", len(sigd))\n        return sigd\n\n    def find(self, search_fn, query, **kwargs):\n        \"\"\"\n        Do a Jaccard similarity or containment search, yield results.\n\n        Here 'search_fn' should be an instance of 'JaccardSearch'.\n\n        As with SBTs, queries with higher scaled values than the database\n        can still be used for containment search, but not for similarity\n        search. See SBT.select(...) for details.\n\n        Part of the Index protocol.\n        \"\"\"\n        search_fn.check_is_compatible(query)\n\n        # make sure we're looking at the same scaled value as database\n        query_mh = query.minhash\n        query_scaled = query_mh.scaled\n        if self.scaled > query_scaled:\n            query_mh = query_mh.downsample(scaled=self.scaled)\n            query_scaled = query_mh.scaled\n\n            def prepare_subject(x):\n                return x  # identity\n        else:\n\n            def prepare_subject(subj):\n                return subj.downsample(scaled=query_scaled)\n\n        # collect matching hashes for the query:\n        c = Counter()\n        query_hashes = set(query_mh.hashes)\n        for hashval in query_hashes:\n            idx_list = self._hashval_to_idx.get(hashval, [])\n            for idx in idx_list:\n                c[idx] += 1\n\n        debug(\"number of matching signatures for hashes: {}\", len(c))\n\n        # for each match, in order of largest overlap,\n        for idx, count in c.most_common():\n            # pull in the hashes. This reconstructs & caches all input\n            # minhashes, which is kinda memory intensive...!\n            # NOTE: one future low-mem optimization could be to support doing\n            # this piecemeal by iterating across all the hashes, instead.\n\n            subj = self._signatures.get(idx)\n            if subj is None:  # must be because of a picklist exclusion\n                assert self.picklists\n                continue\n\n            subj_mh = prepare_subject(subj.minhash)\n\n            # all numbers calculated after downsampling --\n            query_size = len(query_mh)\n            subj_size = len(subj_mh)\n            shared_size = query_mh.count_common(subj_mh)\n            total_size = len(query_mh + subj_mh)\n\n            score = search_fn.score_fn(query_size, shared_size, subj_size, total_size)\n\n            # CTB note to self: even with JaccardSearchBestOnly, this will\n            # still iterate over & score all signatures. We should come\n            # up with a protocol by which the JaccardSearch object can\n            # signal that it is done, or something.\n            # For example, see test_lca_jaccard_ordering, where\n            # for containment we could be done early, but for Jaccard we\n            # cannot.\n            if search_fn.passes(score):\n                if search_fn.collect(score, subj):\n                    if passes_all_picklists(subj, self.picklists):\n                        yield IndexSearchResult(score, subj, self.location)\n\n    @cached_property\n    def _lid_to_idx(self):\n        \"\"\"Connect lineage id lid (int) to idx set (set of ints).\"\"\n\n        Method specific to LCA databases.\n        \"\"\"\n        d = defaultdict(set)\n        for idx, lid in self._idx_to_lid.items():\n            d[lid].add(idx)\n        return d\n\n    @cached_property\n    def _idx_to_ident(self):\n        \"\"\"Connect idx (int) to ident (str).\n\n        Method specific to LCA databases.\n        \"\"\"\n        d = defaultdict(set)\n        for ident, idx in self._ident_to_idx.items():\n            assert idx not in d\n            d[idx] = ident\n        return d\n\n\ndef load_single_database(filename, verbose=False):\n    \"Load a single LCA database; return (db, ksize, scaled)\"\n    dblist, ksize, scaled = load_databases([filename], verbose=verbose)\n    return dblist[0], ksize, scaled\n\n\ndef load_databases(filenames, scaled=None, verbose=True):\n    \"Load multiple LCA databases; return (dblist, ksize, scaled)\"\n    ksize_vals = set()\n    scaled_vals = set()\n    moltype_vals = set()\n    dblist = []\n\n    # load all the databases\n    for db_name in filenames:\n        if verbose:\n            notify(\"\\r\\033[K\", end=\"\")\n            notify(f\"... loading database {format(db_name)}\", end=\"\\r\")\n\n        lca_db = LCA_Database.load(db_name)\n\n        ksize_vals.add(lca_db.ksize)\n        if len(ksize_vals) > 1:\n            raise Exception(\"multiple ksizes, quitting\")\n\n        if scaled and scaled > lca_db.scaled:\n            lca_db.downsample_scaled(scaled)\n        scaled_vals.add(lca_db.scaled)\n\n        moltype_vals.add(lca_db.moltype)\n        if len(moltype_vals) > 1:\n            raise Exception(\"multiple moltypes, quitting\")\n\n        dblist.append(lca_db)\n\n    ksize = ksize_vals.pop()\n    scaled = scaled_vals.pop()\n    moltype = moltype_vals.pop()\n\n    if verbose:\n        notify(\"\\r\\033[K\", end=\"\")\n        notify(\n            f\"loaded {len(dblist)} LCA databases. ksize={ksize}, scaled={scaled} moltype={moltype}\"\n        )\n\n    return dblist, ksize, scaled\n"
  },
  {
    "path": "src/sourmash/lca/lca_utils.py",
    "content": "\"\"\"\nUtility functions for lowest-common-ancestor analysis tools.\n\"\"\"\n\nfrom os.path import exists\nfrom collections import namedtuple, defaultdict, Counter\n\nfrom .lca_db import LCA_Database, load_single_database, load_databases\n\n\n__all__ = [\n    \"taxlist\",\n    \"zip_lineage\",\n    \"build_tree\",\n    \"find_lca\",\n    \"load_single_database\",\n    \"load_databases\",\n    \"gather_assignments\",\n    \"count_lca_for_assignments\",\n    \"LineagePair\",\n    \"display_lineage\",\n    \"make_lineage\",\n    \"pop_to_rank\",\n    \"is_lineage_match\",\n]\n\ntry:  # py2/py3 compat\n    from itertools import zip_longest\nexcept ImportError:\n    from itertools import izip_longest as zip_longest\n\nfrom sourmash.logging import notify, error, debug\n\n# type to store an element in a taxonomic lineage\nLineagePair = namedtuple(\"LineagePair\", [\"rank\", \"name\"])\n\n\ndef check_files_exist(*files):\n    ret = True\n    not_found = []\n    for f in files:\n        if not exists(f):\n            not_found.append(f)\n            ret = False\n\n    if len(not_found):\n        error(\n            \"Error! Could not find the following files.\"\n            \" Make sure the file paths are specified correctly.\\n{}\".format(\n                \"\\n\".join(not_found)\n            )\n        )\n\n    return ret\n\n\n# ordered list of taxonomic ranks\ndef taxlist(include_strain=True):\n    \"\"\"\n    Provide an ordered list of taxonomic ranks.\n    \"\"\"\n    yield from [\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n    ]\n    if include_strain:\n        yield \"strain\"\n\n\n# produce an ordered list of tax names from lineage\ndef zip_lineage(lineage, include_strain=True, truncate_empty=False):\n    \"\"\"\n    Given an iterable of LineagePair objects, return list of lineage names.\n\n    This utility function handles species/strain and empty lineage entries\n    gracefully.\n\n    >>> x = [ LineagePair('superkingdom', 'a'), LineagePair('phylum', 'b') ]\n    >>> zip_lineage(x)\n    ['a', 'b', '', '', '', '', '', '']\n\n    >>> x = [ LineagePair('superkingdom', 'a'), LineagePair(None, ''), LineagePair('class', 'c') ]\n    >>> zip_lineage(x)\n    ['a', '', 'c', '', '', '', '', '']\n    \"\"\"\n\n    empty = LineagePair(None, \"\")\n\n    pairs = zip_longest(\n        taxlist(include_strain=include_strain), lineage, fillvalue=empty\n    )\n    pairs = list(pairs)\n\n    # eliminate empty if so requested\n    if truncate_empty:\n        last_lineage_tup = pairs[-1][1]\n        while pairs and last_lineage_tup == empty:\n            pairs.pop(-1)\n            if pairs:\n                last_lineage_tup = pairs[-1][1]\n\n    row = []\n    for taxrank, lineage_tup in pairs:\n        # validate non-empty tax, e.g. superkingdom/phylum/class in order.\n        if lineage_tup != empty and lineage_tup.rank != taxrank:\n            raise ValueError(\n                f\"incomplete lineage at {taxrank} - is {lineage_tup.rank} instead\"\n            )\n\n        row.append(lineage_tup.name)\n    return row\n\n\ndef display_lineage(lineage, include_strain=True, truncate_empty=True):\n    return \";\".join(\n        zip_lineage(\n            lineage, include_strain=include_strain, truncate_empty=truncate_empty\n        )\n    )\n\n\n# filter function toreplace blank/na/null with 'unassigned'\ndef filter_null(x):\n    return (\n        \"unassigned\" if x is None or x.strip() in (\"[Blank]\", \"na\", \"null\", \"\") else x\n    )\n\n\nnull_names = set([\"[Blank]\", \"na\", \"null\"])\n\n\ndef build_tree(assignments, initial=None):\n    \"\"\"\n    Builds a tree of dictionaries from lists of LineagePair objects\n    in 'assignments'.  This tree can then be used to find lowest common\n    ancestor agreements/confusion.\n    \"\"\"\n    if initial is None:\n        tree = {}\n    else:\n        tree = initial\n\n    if not assignments:\n        raise ValueError(\"empty assignment passed to build_tree\")\n\n    for assignment in assignments:\n        node = tree\n\n        for lineage_tup in assignment:\n            if lineage_tup.name:\n                child = node.get(lineage_tup, {})\n                node[lineage_tup] = child\n\n                # shift -> down in tree\n                node = child\n\n    return tree\n\n\ndef find_lca(tree):\n    \"\"\"\n    Given a tree produced by 'build_tree', find the first node with multiple\n    children, OR the only leaf in the tree.  Return (lineage_tup, reason),\n    where 'reason' is the number of children of the returned node, i.e.\n    0 if it's a leaf and > 1 if it's an internal node.\n    \"\"\"\n\n    node = tree\n    lineage = []\n    while 1:\n        if len(node) == 1:  # descend to only child; track path\n            lineage_tup = next(iter(node.keys()))\n            lineage.append(lineage_tup)\n            node = node[lineage_tup]\n        elif len(node) == 0:  # at leaf; end\n            return tuple(lineage), 0\n        else:  # len(node) > 1 => confusion!!\n            return tuple(lineage), len(node)\n\n\ndef gather_assignments(hashvals, dblist):\n    \"\"\"\n    Gather assignments from across all the databases for all the hashvals.\n\n    Ignores counts of the hashvals.\n    \"\"\"\n    assignments = defaultdict(set)\n    for hashval in hashvals:\n        for lca_db in dblist:\n            lineages = lca_db.get_lineage_assignments(hashval)\n            if lineages:\n                assignments[hashval].update(lineages)\n\n    return assignments\n\n\ndef count_lca_for_assignments(assignments, hashval_counts=None):\n    \"\"\"\n    For each hashval, count the LCA across its assignments.\n\n    If hashval_counts is not None, it must be a dictionary that maps\n    { hashval: hashval_count }; this is then used to weight the counts.\n    \"\"\"\n    counts = Counter()\n    for hashval in assignments:\n        # for each list of tuple_info [(rank, name), ...] build\n        # a tree that lets us discover lowest-common-ancestor.\n        lineages = assignments[hashval]\n        tree = build_tree(lineages)\n\n        # now find either a leaf or the first node with multiple\n        # children; that's our lowest-common-ancestor node.\n        lca, reason = find_lca(tree)\n\n        if hashval_counts:\n            counts[lca] += hashval_counts[hashval]\n        else:\n            counts[lca] += 1\n\n    return counts\n\n\ndef is_lineage_match(lin_a, lin_b, rank):\n    \"\"\"\n    check to see if two lineages are a match down to given rank.\n    \"\"\"\n    for a, b in zip(lin_a, lin_b):\n        assert a.rank == b.rank\n        if a.rank == rank:\n            if a == b:\n                return 1\n        if a != b:\n            return 0\n\n    return 0\n\n\ndef pop_to_rank(lin, rank):\n    \"Remove lineage tuples from given lineage `lin` until `rank` is reached.\"\n    lin = list(lin)\n\n    txl = taxlist()\n    before_rank = []\n    for txl_rank in txl:\n        if txl_rank != rank:\n            before_rank.append(txl_rank)\n        else:\n            break\n\n    # are we already above rank?\n    if lin and lin[-1].rank in before_rank:\n        return tuple(lin)\n\n    while lin and lin[-1].rank != rank:\n        lin.pop()\n\n    return tuple(lin)\n\n\ndef make_lineage(lineage):\n    \"Turn a ; or ,-separated set of lineages into a tuple of LineagePair objs.\"\n    from sourmash.tax.tax_utils import LineagePair\n\n    lin = lineage.split(\";\")\n    if len(lin) == 1:\n        lin = lineage.split(\",\")\n    lin = [LineagePair(rank, n) for (rank, n) in zip(taxlist(), lin)]\n    lin = tuple(lin)\n\n    return lin\n"
  },
  {
    "path": "src/sourmash/logging.py",
    "content": "import sys\nfrom io import StringIO\n\n_quiet = False\n_debug = False\n\n\ndef set_quiet(val, print_debug=False):\n    global _quiet, _debug\n    _quiet = bool(val)\n    _debug = bool(print_debug)\n\n\ndef print_results(s, *args, **kwargs):\n    if _quiet:\n        return\n\n    print(s.format(*args, **kwargs), file=sys.stdout)\n    sys.stdout.flush()\n\n\ndef notify(s, *args, **kwargs):\n    \"A simple logging function => stderr.\"\n    if _quiet:\n        return\n\n    print(\"\\r\\033[K\", end=\"\", file=sys.stderr)\n    print(s.format(*args, **kwargs), file=sys.stderr, end=kwargs.get(\"end\", \"\\n\"))\n    if kwargs.get(\"flush\"):\n        sys.stderr.flush()\n\n\ndef debug(s, *args, **kwargs):\n    \"A debug logging function => stderr.\"\n    if _quiet or not _debug:\n        return\n\n    print(\"\\r\\033[K\", end=\"\", file=sys.stderr)\n    print(s.format(*args, **kwargs), file=sys.stderr, end=kwargs.get(\"end\", \"\\n\"))\n    if kwargs.get(\"flush\"):\n        sys.stderr.flush()\n\n\ndef debug_literal(s, *args, **kwargs):\n    \"A debug logging function => stderr.\"\n    if _quiet or not _debug:\n        return\n\n    print(\"\\r\\033[K\", end=\"\", file=sys.stderr)\n    print(s, file=sys.stderr, end=kwargs.get(\"end\", \"\\n\"))\n    if kwargs.get(\"flush\"):\n        sys.stderr.flush()\n\n\ndef error(s, *args, **kwargs):\n    \"A simple error logging function => stderr.\"\n    print(\"\\r\\033[K\", end=\"\", file=sys.stderr)\n    print(s.format(*args, **kwargs), file=sys.stderr)\n    if kwargs.get(\"flush\"):\n        sys.stderr.flush()\n\n\ndef test_notify():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = False\n        notify(\"hello, world\")\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\\n\" in saveerr.getvalue()\n\n\ndef test_notify_flush():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = False\n        notify(\"hello, world\", flush=True)\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\" in saveerr.getvalue()\n\n\ndef test_notify_end():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = False\n        notify(\"hello, world\", end=\"FOO\")\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, worldFOO\" in saveerr.getvalue()\n\n\ndef test_notify_quiet():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = True\n        notify(\"hello, world\")\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\" not in saveerr.getvalue()\n\n\ndef test_error():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = False\n        error(\"hello, world\")\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\\n\" in saveerr.getvalue()\n\n\ndef test_error_flush():\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = False\n        error(\"hello, world\", flush=True)\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\" in saveerr.getvalue()\n\n\ndef test_error_quiet():\n    # error should still output even if _quiet is True\n    global _quiet\n\n    qsave = _quiet\n    saveerr, sys.stderr = sys.stderr, StringIO()\n    try:\n        _quiet = True\n        error(\"hello, world\")\n    finally:\n        _quiet = qsave\n        saveerr, sys.stderr = sys.stderr, saveerr\n\n    print(type(saveerr))\n    assert \"hello, world\" in saveerr.getvalue()\n"
  },
  {
    "path": "src/sourmash/manifest.py",
    "content": "\"\"\"\nManifests for collections of signatures.\n\"\"\"\n\nimport csv\nimport ast\nimport gzip\nimport os.path\nfrom abc import abstractmethod\nimport itertools\n\nfrom sourmash import picklist, index\n\n\nclass BaseCollectionManifest:\n    \"\"\"Signature metadata for a collection of signatures.\n\n    Manifests support selection and rapid lookup of signatures.\n\n    * 'select_to_manifest(...)' matches the Index selector protocol\n    * 'rows' is a public iterable that can be used to iterate over the manifest\n       contents.\n    * 'locations()' returns all distinct locations for e.g. lazy loading\n    * supports container protocol for signatures, e.g. 'if ss in manifest: ...'\n\n    See 'required_keys' and 'make_manifest_row' for the current\n    minimal definition of what actually needs to be in a row...\n    \"\"\"\n\n    # each manifest row must have the following, although they may be empty.\n    required_keys = (\n        \"internal_location\",\n        \"md5\",\n        \"md5short\",\n        \"ksize\",\n        \"moltype\",\n        \"num\",\n        \"scaled\",\n        \"n_hashes\",\n        \"with_abundance\",\n        \"name\",\n        \"filename\",\n    )\n\n    @classmethod\n    @abstractmethod\n    def load_from_manifest(cls, manifest, **kwargs):\n        \"Load this manifest from another manifest object.\"\n\n    @classmethod\n    def load_from_filename(cls, filename):\n        # SQLite db?\n        db = cls.load_from_sql(filename)\n        if db is not None:\n            return db\n\n        # not a SQLite db? CTB: fix this to actually try loading this as .gz...\n        if filename.endswith(\".gz\"):\n            xopen = gzip.open\n        else:\n            xopen = open\n\n        with xopen(filename, \"rt\", newline=\"\") as fp:\n            return cls.load_from_csv(fp)\n\n    @classmethod\n    def load_from_csv(cls, fp):\n        \"load a manifest from a CSV file.\"\n        manifest_list = []\n        firstline = fp.readline().rstrip()\n        if not firstline.startswith(\"# SOURMASH-MANIFEST-VERSION: \"):\n            raise ValueError(\"manifest is missing version header\")\n\n        version = firstline[len(\"# SOURMASH-MANIFEST-VERSION: \") :]\n        if float(version) != 1.0:\n            raise ValueError(f\"unknown manifest version number {version}\")\n\n        r = csv.DictReader(fp)\n        if not r.fieldnames:\n            raise ValueError(\"missing column headers in manifest\")\n\n        for k in cls.required_keys:\n            if k not in r.fieldnames:\n                raise ValueError(f\"missing column '{k}' in manifest.\")\n\n        row = None\n\n        # do row type conversion\n        introws = (\"num\", \"scaled\", \"ksize\", \"n_hashes\")\n        boolrows = (\"with_abundance\",)\n\n        for row in r:\n            for k in introws:\n                row[k] = int(row[k])\n            for k in boolrows:\n                row[k] = bool(ast.literal_eval(str(row[k])))\n            row[\"signature\"] = None\n            manifest_list.append(row)\n\n        return CollectionManifest(manifest_list)\n\n    @classmethod\n    def load_from_sql(cls, filename):\n        from sourmash.index.sqlite_index import load_sqlite_index\n\n        db = load_sqlite_index(filename, request_manifest=True)\n        if db is not None:\n            return db.manifest\n\n        return None\n\n    def write_to_filename(self, filename, *, database_format=\"csv\", ok_if_exists=False):\n        if database_format == \"csv\":\n            from .sourmash_args import FileOutputCSV\n\n            if ok_if_exists or not os.path.exists(filename):\n                with FileOutputCSV(filename) as fp:\n                    return self.write_to_csv(fp, write_header=True)\n            elif os.path.exists(filename) and not ok_if_exists:\n                raise Exception(\"output manifest already exists\")\n\n        elif database_format == \"sql\":\n            from sourmash.index.sqlite_index import SqliteCollectionManifest\n\n            SqliteCollectionManifest.load_from_manifest(\n                self, dbfile=filename, append=ok_if_exists\n            )\n\n    @classmethod\n    def write_csv_header(cls, fp):\n        \"write header for manifest CSV format\"\n        fp.write(\"# SOURMASH-MANIFEST-VERSION: 1.0\\n\")\n        w = csv.DictWriter(fp, fieldnames=cls.required_keys)\n        w.writeheader()\n\n    def write_to_csv(self, fp, write_header=False):\n        \"write manifest CSV to specified file handle\"\n        w = csv.DictWriter(fp, fieldnames=self.required_keys, extrasaction=\"ignore\")\n\n        if write_header:\n            self.write_csv_header(fp)\n\n        for row in self.rows:\n            # don't write signature!\n            if \"signature\" in row:\n                del row[\"signature\"]\n            w.writerow(row)\n\n    @classmethod\n    def make_manifest_row(cls, ss, location, *, include_signature=True):\n        \"make a manifest row dictionary.\"\n        mh = ss.minhash\n\n        row = {}\n        row[\"md5\"] = ss.md5sum()\n        row[\"md5short\"] = row[\"md5\"][:8]\n        row[\"ksize\"] = int(mh.ksize)\n        row[\"moltype\"] = mh.moltype\n        row[\"num\"] = int(mh.num)\n        row[\"scaled\"] = int(mh.scaled)\n        row[\"n_hashes\"] = len(mh)\n        row[\"with_abundance\"] = mh.track_abundance\n        row[\"name\"] = ss.name\n        row[\"filename\"] = ss.filename\n        row[\"internal_location\"] = location\n\n        assert set(row.keys()) == set(cls.required_keys)\n\n        # if requested, include the signature in the manifest.\n        if include_signature:\n            row[\"signature\"] = ss\n        return row\n\n    @classmethod\n    def create_manifest(cls, locations_iter, *, include_signature=True):\n        \"\"\"Create a manifest from an iterator that yields (ss, location)\n\n        Stores signatures in manifest rows by default.\n\n        Note: do NOT catch exceptions here, so this passes through load excs.\n        \"\"\"\n        manifest_list = []\n        for ss, location in locations_iter:\n            row = cls.make_manifest_row(\n                ss, location, include_signature=include_signature\n            )\n            manifest_list.append(row)\n\n        return cls(manifest_list)\n\n    ## implement me\n    @abstractmethod\n    def __add__(self, other):\n        \"Add two manifests\"\n\n    @abstractmethod\n    def __bool__(self):\n        \"Test if manifest is empty\"\n\n    @abstractmethod\n    def __len__(self):\n        \"Get number of entries in manifest\"\n\n    @abstractmethod\n    def __eq__(self, other):\n        \"Check for equality of manifest based on rows\"\n\n    @abstractmethod\n    def select_to_manifest(self, **kwargs):\n        \"Select compatible signatures\"\n\n    @abstractmethod\n    def filter_rows(self, row_filter_fn):\n        \"Filter rows based on a pattern matching function.\"\n\n    @abstractmethod\n    def filter_on_columns(self, col_filter_fn, col_names):\n        \"Filter on column values.\"\n\n    @abstractmethod\n    def locations(self):\n        \"Return a list of distinct locations\"\n\n    @abstractmethod\n    def __contains__(self, ss):\n        \"Determine if a particular SourmashSignature is in this manifest.\"\n\n    @abstractmethod\n    def to_picklist(self):\n        \"Convert manifest to a picklist.\"\n\n    def _check_row_values(self):\n        \"check that manifest rows have legit types/values.\"\n        for row in self.rows:\n            index._check_select_parameters(\n                num=row[\"num\"],\n                ksize=row[\"ksize\"],\n                moltype=row[\"moltype\"],\n                scaled=row[\"scaled\"],\n                abund=row[\"with_abundance\"],\n            )\n\n\nclass CollectionManifest(BaseCollectionManifest):\n    \"\"\"\n    An in-memory manifest that simply stores the rows in a list.\n    \"\"\"\n\n    def __init__(self, rows=[]):\n        \"Initialize from an iterable of metadata dictionaries.\"\n        self.rows = []\n        self._md5_set = set()\n\n        self._add_rows(rows)\n\n    @classmethod\n    def load_from_manifest(cls, manifest, **kwargs):\n        \"Load this manifest from another manifest object.\"\n        return cls(manifest.rows)\n\n    @staticmethod\n    def _from_rust(value):\n        from ._lowlevel import ffi, lib\n        from .utils import rustcall, decode_str\n\n        iterator = rustcall(lib.manifest_rows, value)\n\n        rows = []\n        next_row = rustcall(lib.manifest_rows_iter_next, iterator)\n        idx = 0\n        while next_row != ffi.NULL:\n            row = {}\n            row[\"md5\"] = decode_str(next_row.md5)\n            row[\"md5short\"] = row[\"md5\"][:8]\n            row[\"ksize\"] = next_row.ksize\n            row[\"moltype\"] = decode_str(next_row.moltype)\n            row[\"num\"] = next_row.num\n            row[\"scaled\"] = next_row.scaled\n            row[\"n_hashes\"] = next_row.n_hashes\n            row[\"with_abundance\"] = next_row.with_abundance\n            row[\"name\"] = decode_str(next_row.name)\n            row[\"filename\"] = decode_str(next_row.filename)\n\n            # don't use the true internal location, use the Idx for RevIndex.\n            # Ideally this would be done in Rust by the RevIndex itself,\n            # but that seems surprisingly difficult to do. So, for now,\n            # track Idx in Python.\n            # row[\"internal_location\"] = decode_str(next_row.internal_location)\n            row[\"internal_location\"] = idx\n            rows.append(row)\n\n            idx += 1\n\n            rustcall(lib.manifestrow_free, next_row)\n            next_row = rustcall(lib.manifest_rows_iter_next, iterator)\n\n        # free manifest\n        rustcall(lib.manifest_free, value)\n        return CollectionManifest(rows)\n\n    def add_row(self, row):\n        self._add_rows([row])\n\n    def _add_rows(self, rows):\n        md5set = self._md5_set\n\n        # only iterate once, in case it's a generator\n        for row in rows:\n            self.rows.append(row)\n            md5set.add(row[\"md5\"])\n\n    def __iadd__(self, other):\n        if self is other:\n            raise Exception(\"cannot directly add manifest to itself\")\n        self._add_rows(other.rows)\n        return self\n\n    def __add__(self, other):\n        mf = CollectionManifest(self.rows)\n        mf._add_rows(other.rows)\n        return mf\n\n    def __bool__(self):\n        return bool(self.rows)\n\n    def __len__(self):\n        return len(self.rows)\n\n    def __eq__(self, other):\n        \"Check equality on a row-by-row basis. May fail on out-of-order rows.\"\n        for a, b in itertools.zip_longest(self.rows, other.rows):\n            if a is None or b is None:\n                return False\n\n            # ignore non-required keys.\n            for k in self.required_keys:\n                if a[k] != b[k]:\n                    return False\n\n        return True\n\n    def _select(\n        self,\n        *,\n        ksize=None,\n        moltype=None,\n        scaled=0,\n        num=0,\n        containment=False,\n        abund=None,\n        picklist=None,\n    ):\n        \"\"\"Yield manifest rows for sigs that match the specified requirements.\n\n        Internal method; call `select_to_manifest` instead.\n        \"\"\"\n        index._check_select_parameters(\n            ksize=ksize, num=num, abund=abund, moltype=moltype, scaled=scaled\n        )\n\n        matching_rows = self.rows\n        if ksize:\n            matching_rows = (row for row in matching_rows if row[\"ksize\"] == ksize)\n        if moltype:\n            matching_rows = (row for row in matching_rows if row[\"moltype\"] == moltype)\n        if scaled or containment:\n            matching_rows = (\n                row for row in matching_rows if row[\"scaled\"] and not row[\"num\"]\n            )\n        if num:\n            matching_rows = (\n                row for row in matching_rows if row[\"num\"] and not row[\"scaled\"]\n            )\n\n        if abund:\n            # only need to concern ourselves if abundance is _required_\n            matching_rows = (row for row in matching_rows if row[\"with_abundance\"])\n\n        if picklist:\n            matching_rows = (\n                row for row in matching_rows if picklist.matches_manifest_row(row)\n            )\n\n        # return only the internal filenames!\n        yield from matching_rows\n\n    def select_to_manifest(self, **kwargs):\n        \"Do a 'select' and return a new CollectionManifest object.\"\n        new_rows = self._select(**kwargs)\n        return CollectionManifest(new_rows)\n\n    def filter_rows(self, row_filter_fn):\n        \"Create a new manifest filtered through row_filter_fn.\"\n        new_rows = [row for row in self.rows if row_filter_fn(row)]\n\n        return CollectionManifest(new_rows)\n\n    def filter_on_columns(self, col_filter_fn, col_names):\n        \"Create a new manifest based on column matches.\"\n\n        def row_filter_fn(row):\n            x = [row[col] for col in col_names if row[col] is not None]\n            return col_filter_fn(x)\n\n        return self.filter_rows(row_filter_fn)\n\n    def locations(self):\n        \"Return all distinct locations.\"\n        seen = set()\n        for row in self.rows:\n            loc = row[\"internal_location\"]\n\n            # track/remove duplicates\n            if loc not in seen:\n                seen.add(loc)\n                yield loc\n\n    def __contains__(self, ss):\n        \"Does this manifest contain this signature?\"\n        md5 = ss.md5sum()\n        return md5 in self._md5_set\n\n    def to_picklist(self):\n        \"Convert this manifest to a picklist.\"\n        pl = picklist.SignaturePicklist(\"manifest\")\n\n        pl.pickset = {pl._get_value_for_manifest_row(row) for row in self.rows}\n\n        return pl\n"
  },
  {
    "path": "src/sourmash/minhash.py",
    "content": "\"\"\"\nsourmash submodule that provides MinHash class and utility functions.\n\nclass MinHash - core MinHash class.\nclass FrozenMinHash - read-only MinHash class.\n\"\"\"\n\nfrom .distance_utils import (\n    jaccard_to_distance,\n    containment_to_distance,\n    set_size_exact_prob,\n)\nfrom .logging import notify\n\nimport numpy as np\n\n\n__all__ = [\n    \"get_minhash_default_seed\",\n    \"get_minhash_max_hash\",\n    \"hash_murmur\",\n    \"MinHash\",\n    \"FrozenMinHash\",\n]\n\nfrom collections.abc import Mapping\n\nfrom . import VERSION\nfrom ._lowlevel import ffi, lib\nfrom .utils import RustObject, rustcall\nfrom .exceptions import SourmashError\nfrom deprecation import deprecated\n\n# default MurmurHash seed\nMINHASH_DEFAULT_SEED = 42\n\n\ndef get_minhash_default_seed():\n    \"Return the default seed value used for the MurmurHash hashing function.\"\n    return MINHASH_DEFAULT_SEED\n\n\n# we use the 64-bit hash space of MurmurHash only\n# this is 2 ** 64 - 1 in hexadecimal\nMINHASH_MAX_HASH = 0xFFFFFFFFFFFFFFFF\n\n\ndef get_minhash_max_hash():\n    \"Return the maximum hash value.\"\n    return MINHASH_MAX_HASH\n\n\ndef _get_max_hash_for_scaled(scaled):\n    \"Convert a 'scaled' value into a 'max_hash' value.\"\n    if scaled == 0:\n        return 0\n    elif scaled == 1:\n        return get_minhash_max_hash()\n\n    return min(int(round(get_minhash_max_hash() / scaled, 0)), MINHASH_MAX_HASH)\n\n\ndef _get_scaled_for_max_hash(max_hash):\n    \"Convert a 'max_hash' value into a 'scaled' value.\"\n    if max_hash == 0:\n        return 0\n    return min(int(round(get_minhash_max_hash() / max_hash, 0)), MINHASH_MAX_HASH)\n\n\ndef to_bytes(s):\n    # Allow for strings, bytes or int\n    # Single item of byte string = int\n\n    if isinstance(s, bytes):\n        return s\n\n    if not isinstance(s, str | bytes | int):\n        raise TypeError(\"Requires a string-like sequence\")\n\n    if isinstance(s, str):\n        s = s.encode(\"utf-8\")\n    elif isinstance(s, int):\n        s = bytes([s])\n\n    return s\n\n\ndef hash_murmur(kmer, seed=MINHASH_DEFAULT_SEED):\n    \"hash_murmur(string, [,seed])\\n\\n\"\n    \"Compute a hash for a string, optionally using a seed (an integer). \"\n    \"The current default seed is returned by hash_seed().\"\n\n    return lib.hash_murmur(to_bytes(kmer), seed)\n\n\ndef translate_codon(codon):\n    \"Translate a codon into an amino acid.\"\n    try:\n        return rustcall(lib.sourmash_translate_codon, to_bytes(codon)).decode(\"utf-8\")\n    except SourmashError as e:\n        raise ValueError(e.message)\n\n\ndef flatten_and_downsample_scaled(mh, *scaled_vals):\n    \"Flatten MinHash object and downsample to max of scaled values.\"\n    assert mh.scaled\n    assert all(x > 0 for x in scaled_vals)\n\n    mh = mh.flatten()\n    scaled = max(scaled_vals)\n    if scaled > mh.scaled:\n        return mh.downsample(scaled=scaled)\n    return mh\n\n\ndef flatten_and_downsample_num(mh, *num_vals):\n    \"Flatten MinHash object and downsample to min of num values.\"\n    assert mh.num\n    assert all(x > 0 for x in num_vals)\n\n    mh = mh.flatten()\n    num = min(num_vals)\n    if num < mh.num:\n        return mh.downsample(num=num)\n    return mh\n\n\ndef flatten_and_intersect_scaled(mh1, mh2):\n    \"Flatten and downsample two scaled MinHash objs, then return intersection.\"\n    scaled = max(mh1.scaled, mh2.scaled)\n    mh1 = mh1.flatten().downsample(scaled=scaled)\n    mh2 = mh2.flatten().downsample(scaled=scaled)\n\n    return mh1 & mh2\n\n\nclass _HashesWrapper(Mapping):\n    \"A read-only view of the hashes contained by a MinHash object.\"\n\n    def __init__(self, h):\n        self._data = h\n\n    def __getitem__(self, key):\n        return self._data[key]\n\n    def __repr__(self):\n        return repr(self._data)\n\n    def __len__(self):\n        return len(self._data)\n\n    def __iter__(self):\n        return iter(self._data)\n\n    def __eq__(self, other):\n        return list(self.items()) == list(other.items())\n\n    def __setitem__(self, k, v):\n        raise RuntimeError(\"cannot modify hashes directly; use 'add' methods\")\n\n\nclass MinHash(RustObject):\n    \"\"\"\\\n    The core sketch object for sourmash.\n\n    MinHash objects store and provide functionality for subsampled hash values\n    from DNA, RNA, and amino acid sequences. MinHash also supports both the\n    standard MinHash behavior (bounded size or ``num``) and a non-standard\n    MinHash, called \"modulo hash\" behavior, or ``scaled``. Please see\n    the API examples at\n\n        https://sourmash.readthedocs.io/en/latest/api-example.html#sourmash-minhash-objects-and-manipulations\n\n    for more information.\n\n    Basic usage:\n\n    >>> from sourmash import MinHash\n    >>> mh1 = MinHash(n=20, ksize=3)\n    >>> mh1.add_sequence('ATGAGAGACGATAGACAGATGAC')\n\n    >>> mh2 = MinHash(n=20, ksize=3)\n    >>> mh2.add_sequence('ATGAGActCGATAGaCAGATGAC')\n\n    >>> round(mh1.similarity(mh2), 2)\n    0.85\n    \"\"\"\n\n    __dealloc_func__ = lib.kmerminhash_free\n\n    def __init__(\n        self,\n        n,\n        ksize,\n        *,\n        is_protein=False,\n        dayhoff=False,\n        hp=False,\n        skipm1n3=False,\n        skipm2n3=False,\n        track_abundance=False,\n        seed=MINHASH_DEFAULT_SEED,\n        max_hash=0,\n        mins=None,\n        scaled=0,\n    ):\n        \"\"\"\\\n        Create a sourmash.MinHash object.\n\n        To create a standard (``num``) MinHash, use:\n           ``MinHash(<num>, <ksize>, ...)``\n\n        To create a ``scaled`` MinHash, use\n            ``MinHash(0, <ksize>, scaled=<int>, ...)``\n\n        Optional arguments:\n           * is_protein (default False) - aa k-mers\n           * dayhoff (default False) - dayhoff encoding\n           * hp (default False) - hydrophilic/hydrophobic aa\n           * skipm1n3 (default False) - skipmer (m1n3)\n           * skipm2n3 (default False) - skipmer (m2n3)\n           * track_abundance (default False) - track hash multiplicity\n           * mins (default None) - list of hashvals, or (hashval, abund) pairs\n           * seed (default 42) - murmurhash seed\n        \"\"\"\n        # support max_hash in constructor, for now.\n        if max_hash:\n            if scaled:\n                raise ValueError(\"cannot set both max_hash and scaled\")\n            scaled = _get_scaled_for_max_hash(max_hash)\n\n        if scaled and n:\n            raise ValueError(\"cannot set both n and max_hash\")\n\n        if not n and not scaled:\n            raise ValueError(\"cannot omit both n and scaled\")\n\n        if dayhoff or hp:\n            is_protein = False\n\n        if dayhoff:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_DAYHOFF\n            ksize = ksize * 3\n        elif hp:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_HP\n            ksize = ksize * 3\n        elif is_protein:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_PROTEIN\n            ksize = ksize * 3\n        elif skipm1n3:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_SKIPM1N3\n        elif skipm2n3:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_SKIPM2N3\n        else:\n            hash_function = lib.HASH_FUNCTIONS_MURMUR64_DNA\n\n        self._objptr = lib.kmerminhash_new(\n            scaled, ksize, hash_function, seed, track_abundance, n\n        )\n\n        if mins:\n            if track_abundance:\n                self.set_abundances(mins)\n            else:\n                self.add_many(mins)\n\n    def __copy__(self):\n        \"Create a new copy of this MinHash.\"\n        a = MinHash(\n            self.num,\n            self.ksize,\n            is_protein=self.is_protein,\n            dayhoff=self.dayhoff,\n            hp=self.hp,\n            skipm1n3=self.skipm1n3,\n            skipm2n3=self.skipm2n3,\n            track_abundance=self.track_abundance,\n            seed=self.seed,\n            max_hash=self._max_hash,\n        )\n        a.merge(self)\n        return a\n\n    copy = __copy__\n\n    def __getstate__(self):\n        \"support pickling via __getstate__/__setstate__\"\n\n        # note: we multiple ksize by 3 here so that\n        # pickle protocols that bypass __setstate__ <coff numpy coff>\n        # get a ksize that makes sense to the Rust layer. See #2262.\n        # CTB/NTP note: if you add things below, you might want to put\n        # them at the end, because we use internal indexes in a few places.\n        # see especially `_set_num_scaled()` in sig/__main__.my.\n        # My apologies.\n        return (\n            self.num,\n            self.ksize\n            if self.is_dna or self.skipm1n3 or self.skipm2n3\n            else self.ksize * 3,\n            self.is_protein,\n            self.dayhoff,\n            self.hp,\n            self.skipm1n3,\n            self.skipm2n3,\n            self.hashes,\n            None,\n            self.track_abundance,\n            self._max_hash,\n            self.seed,\n        )\n\n    def __setstate__(self, tup):\n        \"support pickling via __getstate__/__setstate__\"\n        (\n            n,\n            ksize,\n            is_protein,\n            dayhoff,\n            hp,\n            skipm1n3,\n            skipm2n3,\n            mins,\n            _,\n            track_abundance,\n            max_hash,\n            seed,\n        ) = tup\n\n        self.__del__()\n\n        hash_function = (\n            lib.HASH_FUNCTIONS_MURMUR64_DAYHOFF\n            if dayhoff\n            else lib.HASH_FUNCTIONS_MURMUR64_HP\n            if hp\n            else lib.HASH_FUNCTIONS_MURMUR64_PROTEIN\n            if is_protein\n            else lib.HASH_FUNCTIONS_MURMUR64_SKIPM1N3\n            if skipm1n3\n            else lib.HASH_FUNCTIONS_MURMUR64_SKIPM2N3\n            if skipm2n3\n            else lib.HASH_FUNCTIONS_MURMUR64_DNA\n        )\n\n        scaled = _get_scaled_for_max_hash(max_hash)\n        self._objptr = lib.kmerminhash_new(\n            scaled, ksize, hash_function, seed, track_abundance, n\n        )\n        if track_abundance:\n            self.set_abundances(mins)\n        else:\n            self.add_many(mins)\n\n    def __eq__(self, other):\n        \"equality testing via ==\"\n        return self.__getstate__() == other.__getstate__()\n\n    def copy_and_clear(self):\n        \"Create an empty copy of this MinHash.\"\n        a = MinHash(\n            self.num,\n            self.ksize,\n            is_protein=self.is_protein,\n            dayhoff=self.dayhoff,\n            hp=self.hp,\n            skipm1n3=self.skipm1n3,\n            skipm2n3=self.skipm2n3,\n            track_abundance=self.track_abundance,\n            seed=self.seed,\n            max_hash=self._max_hash,\n        )\n        return a\n\n    def add_sequence(self, sequence, force=False):\n        \"Add a sequence into the sketch.\"\n        self._methodcall(lib.kmerminhash_add_sequence, to_bytes(sequence), force)\n\n    def seq_to_hashes(\n        self, sequence, *, force=False, bad_kmers_as_zeroes=False, is_protein=False\n    ):\n        \"\"\"Convert sequence to hashes without adding to the sketch.\n\n        If input sequence is DNA and this is a protein, dayhoff, or hp\n        MinHash, translate the DNA appropriately before hashing.\n\n        If input sequence is protein, set is_protein=True.\n\n        If `force = True` and `bad_kmers_as_zeroes = True`,\n        invalid kmers hashes will be represented as `0`.\n        \"\"\"\n\n        if is_protein and self.moltype not in (\"protein\", \"dayhoff\", \"hp\"):\n            raise ValueError(\"cannot add protein sequence to DNA MinHash\")\n\n        if bad_kmers_as_zeroes and not force:\n            raise ValueError(\n                \"cannot represent invalid kmers as 0 while force is not set to True\"\n            )\n\n        size = ffi.new(\"uintptr_t *\")\n        hashes_ptr = self._methodcall(\n            lib.kmerminhash_seq_to_hashes,\n            to_bytes(sequence),\n            len(sequence),\n            force,\n            bad_kmers_as_zeroes,\n            is_protein,\n            size,\n        )\n        size = size[0]\n\n        try:\n            return ffi.unpack(hashes_ptr, size)\n\n        finally:\n            lib.kmerminhash_slice_free(hashes_ptr, size)\n\n    def kmers_and_hashes(self, sequence, *, force=False, is_protein=False):\n        \"\"\"Convert sequence into (k-mer, hashval) tuples without adding\n        it to the sketch.\n\n        If input sequence is DNA and this is a protein, dayhoff, or hp\n        MinHash, translate the DNA appropriately before hashing.\n\n        If input sequence is protein, set is_protein=True.\n\n        If 'force' is True, invalid k-mers will be represented with 'None'.\n        \"\"\"\n        import screed\n\n        bad_kmers_as_zeroes = False\n        if force:\n            bad_kmers_as_zeroes = True\n\n        sequence = sequence.upper()\n        hashvals = self.seq_to_hashes(\n            sequence,\n            force=force,\n            is_protein=is_protein,\n            bad_kmers_as_zeroes=bad_kmers_as_zeroes,\n        )\n\n        if bad_kmers_as_zeroes:\n            hashvals = [None if h == 0 else h for h in hashvals]\n\n        ksize = self.ksize\n        translate = False\n        if self.moltype == \"DNA\":\n            pass\n        elif is_protein:\n            pass\n        else:  # translate input DNA sequence => aa\n            assert self.moltype in (\"protein\", \"dayhoff\", \"hp\")\n            translate = True\n            ksize = self.ksize * 3\n\n        # special code for translation -\n        if translate:\n            # forward AND reverse complement => twice the k-mers\n            n_kmers = (len(sequence) - ksize + 1) * 2\n            assert n_kmers == len(hashvals)\n\n            # generate reverse complement of sequence\n            seqrc = screed.rc(sequence)\n\n            hash_i = 0\n            for frame in (0, 1, 2):\n                # get forward k-mers\n                for start in range(0, len(sequence) - ksize + 1 - frame, 3):\n                    kmer = sequence[start + frame : start + frame + ksize]\n                    yield kmer, hashvals[hash_i]\n                    hash_i += 1\n\n                # get rc k-mers\n                for start in range(0, len(seqrc) - ksize + 1 - frame, 3):\n                    kmer = seqrc[start + frame : start + frame + ksize]\n                    yield kmer, hashvals[hash_i]\n                    hash_i += 1\n        else:\n            # otherwise, all very straightforward :)\n            n_kmers = len(sequence) - ksize + 1\n            assert n_kmers == len(hashvals)\n            for i, hashval in zip(range(0, n_kmers), hashvals):\n                kmer = sequence[i : i + ksize]\n                yield kmer, hashval\n\n    def add_kmer(self, kmer):\n        \"Add a kmer into the sketch.\"\n        if self.is_dna or self.skipm1n3 or self.skipm2n3:\n            if len(kmer) != self.ksize:\n                raise ValueError(f\"kmer to add is not {self.ksize} in length\")\n        else:\n            if len(kmer) != self.ksize * 3:\n                raise ValueError(f\"kmer to add is not {self.ksize * 3} in length\")\n        self.add_sequence(kmer)\n\n    def add_many(self, hashes):\n        \"\"\"Add many hashes to the sketch at once.\n\n        ``hashes`` can be either an iterable (list, set, etc.), or another\n        ``MinHash`` object.\n        \"\"\"\n        if isinstance(hashes, MinHash):\n            self._methodcall(lib.kmerminhash_add_from, hashes._objptr)\n        else:\n            self._methodcall(lib.kmerminhash_add_many, list(hashes), len(hashes))\n\n    def remove_many(self, hashes):\n        \"\"\"Remove many hashes from a sketch at once.\n\n        ``hashes`` can be either an iterable (list, set, etc.), or another\n        ``MinHash`` object.\n        \"\"\"\n        if isinstance(hashes, MinHash):\n            self._methodcall(lib.kmerminhash_remove_from, hashes._objptr)\n        else:\n            self._methodcall(lib.kmerminhash_remove_many, list(hashes), len(hashes))\n\n    def __len__(self):\n        \"Number of hashes.\"\n        return self._methodcall(lib.kmerminhash_get_mins_size)\n\n    @deprecated(\n        deprecated_in=\"3.5\",\n        removed_in=\"5.0\",\n        current_version=VERSION,\n        details=\"Use .hashes property instead.\",\n    )\n    def get_mins(self, with_abundance=False):\n        \"\"\"Return list of hashes or if ``with_abundance`` a list\n        of (hash, abund).\n        \"\"\"\n        mins = self.hashes\n        if not with_abundance:\n            return mins.keys()\n        return mins\n\n    @deprecated(\n        deprecated_in=\"3.5\",\n        removed_in=\"5.0\",\n        current_version=VERSION,\n        details=\"Use .hashes property instead.\",\n    )\n    def get_hashes(self):\n        \"Return the list of hashes.\"\n        return self.hashes.keys()\n\n    @property\n    def hashes(self):\n        size = ffi.new(\"uintptr_t *\")\n        mins_ptr = self._methodcall(lib.kmerminhash_get_mins, size)\n        size = size[0]\n\n        try:\n            if self.track_abundance:\n                size_abunds = ffi.new(\"uintptr_t *\")\n                abunds_ptr = self._methodcall(lib.kmerminhash_get_abunds, size_abunds)\n                size_abunds = size_abunds[0]\n                assert size == size_abunds\n                result = dict(\n                    zip(ffi.unpack(mins_ptr, size), ffi.unpack(abunds_ptr, size))\n                )\n                lib.kmerminhash_slice_free(abunds_ptr, size)\n                return _HashesWrapper(result)\n            else:\n                d = ffi.unpack(mins_ptr, size)\n                return _HashesWrapper({k: 1 for k in d})\n\n        finally:\n            lib.kmerminhash_slice_free(mins_ptr, size)\n\n    @property\n    def seed(self):\n        return self._methodcall(lib.kmerminhash_seed)\n\n    @property\n    def num(self):\n        return self._methodcall(lib.kmerminhash_num)\n\n    @property\n    def scaled(self):\n        mx = self._methodcall(lib.kmerminhash_max_hash)\n        if mx:\n            return _get_scaled_for_max_hash(mx)\n        return 0\n\n    @property\n    def is_dna(self):\n        return not (\n            self.is_protein or self.dayhoff or self.hp or self.skipm1n3 or self.skipm2n3\n        )\n\n    @property\n    def is_protein(self):\n        return self._methodcall(lib.kmerminhash_is_protein)\n\n    @property\n    def dayhoff(self):\n        return self._methodcall(lib.kmerminhash_dayhoff)\n\n    @property\n    def hp(self):\n        return self._methodcall(lib.kmerminhash_hp)\n\n    @property\n    def skipm1n3(self):\n        return self._methodcall(lib.kmerminhash_skipm1n3)\n\n    @property\n    def skipm2n3(self):\n        return self._methodcall(lib.kmerminhash_skipm2n3)\n\n    @property\n    def ksize(self):\n        k = self._methodcall(lib.kmerminhash_ksize)\n        if not self.is_dna and not self.skipm1n3 and not self.skipm2n3:\n            assert k % 3 == 0\n            k = int(k / 3)\n        return k\n\n    @property\n    @deprecated(\n        deprecated_in=\"3.5\",\n        removed_in=\"5.0\",\n        current_version=VERSION,\n        details=\"Use scaled instead.\",\n    )\n    def max_hash(self):\n        return self._methodcall(lib.kmerminhash_max_hash)\n\n    # a non-deprecated `max_hash` property for internal testing purposes only\n    @property\n    def _max_hash(self):\n        return self._methodcall(lib.kmerminhash_max_hash)\n\n    @property\n    def track_abundance(self):\n        return self._methodcall(lib.kmerminhash_track_abundance)\n\n    @track_abundance.setter\n    def track_abundance(self, b):\n        if self.track_abundance == b:\n            return\n\n        if b is False:\n            self._methodcall(lib.kmerminhash_disable_abundance)\n        elif len(self) > 0:\n            raise RuntimeError(\n                \"Can only set track_abundance=True if the MinHash is empty\"\n            )\n        else:\n            self._methodcall(lib.kmerminhash_enable_abundance)\n\n    def add_hash(self, h):\n        \"Add a single hash value.\"\n        return self._methodcall(lib.kmerminhash_add_hash, h)\n\n    def add_hash_with_abundance(self, h, a):\n        \"Add a single hash value with an abundance.\"\n        if self.track_abundance:\n            return self._methodcall(lib.kmerminhash_add_hash_with_abundance, h, a)\n        else:\n            raise RuntimeError(\n                \"Use track_abundance=True when constructing \"\n                \"the MinHash to use add_hash_with_abundance.\"\n            )\n\n    def clear(self):\n        \"Clears all hashes and abundances.\"\n        return self._methodcall(lib.kmerminhash_clear)\n\n    def count_common(self, other, downsample=False):\n        \"\"\"\\\n        Return the number of hashes in common between ``self`` and ``other``.\n\n        Optionally downsample ``scaled`` objects to highest ``scaled`` value.\n        \"\"\"\n        if not isinstance(other, MinHash):\n            raise TypeError(\"Must be a MinHash!\")\n        return self._methodcall(\n            lib.kmerminhash_count_common, other._get_objptr(), downsample\n        )\n\n    def intersection_and_union_size(self, other):\n        \"Calculate intersection and union sizes between `self` and `other`.\"\n        if not isinstance(other, MinHash):\n            raise TypeError(\"Must be a MinHash!\")\n        if not self.is_compatible(other):\n            raise TypeError(\"incompatible MinHash objects\")\n\n        usize = ffi.new(\"uint64_t *\")\n        common = self._methodcall(\n            lib.kmerminhash_intersection_union_size, other._get_objptr(), usize\n        )\n\n        usize = ffi.unpack(usize, 1)[0]\n        return common, usize\n\n    def downsample(self, *, num=None, scaled=None):\n        \"\"\"Copy this object and downsample new object to either `num` or\n        `scaled`.\n        \"\"\"\n        # first, evaluate provided parameters --\n\n        # at least one must be specified!\n        if num is None and scaled is None:\n            raise ValueError(\"must specify either num or scaled to downsample\")\n\n        # both cannot be specified\n        if num is not None and scaled is not None:\n            raise ValueError(\"cannot specify both num and scaled\")\n\n        if num is not None:\n            # cannot downsample a scaled MinHash with num:\n            if self.scaled:\n                raise ValueError(\"cannot downsample a scaled MinHash using num\")\n            # cannot upsample\n            if self.num < num:\n                raise ValueError(\"new sample num is higher than current sample num\")\n\n            # acceptable num value? make sure to set max_hash to 0.\n            max_hash = 0\n\n        elif scaled is not None:\n            # cannot downsample a num MinHash with scaled\n            if self.num:\n                raise ValueError(\"cannot downsample a num MinHash using scaled\")\n            if self.scaled > scaled:\n                raise ValueError(\n                    f\"new scaled {scaled} is lower than current sample scaled {self.scaled}\"\n                )\n\n            # acceptable scaled value? reconfigure max_hash, keep num 0.\n            max_hash = _get_max_hash_for_scaled(scaled)\n            num = 0\n\n        # end checks! create new object:\n        a = MinHash(\n            num,\n            self.ksize,\n            is_protein=self.is_protein,\n            dayhoff=self.dayhoff,\n            hp=self.hp,\n            skipm1n3=self.skipm1n3,\n            skipm2n3=self.skipm2n3,\n            track_abundance=self.track_abundance,\n            seed=self.seed,\n            max_hash=max_hash,\n        )\n        # copy over hashes:\n        if self.track_abundance:\n            a.set_abundances(self.hashes)\n        else:\n            a.add_many(self)\n\n        return a\n\n    def flatten(self):\n        \"\"\"If track_abundance=True, return a new flattened MinHash.\"\"\"\n        if self.track_abundance:\n            # create new object:\n            a = MinHash(\n                self.num,\n                self.ksize,\n                is_protein=self.is_protein,\n                dayhoff=self.dayhoff,\n                hp=self.hp,\n                skipm1n3=self.skipm1n3,\n                skipm2n3=self.skipm2n3,\n                track_abundance=False,\n                seed=self.seed,\n                max_hash=self._max_hash,\n            )\n            a.add_many(self)\n\n            return a\n        return self\n\n    def jaccard(self, other, downsample=False):\n        \"Calculate Jaccard similarity of two MinHash objects.\"\n        if self.num != other.num:\n            err = f\"must have same num: {self.num} != {other.num}\"\n            raise TypeError(err)\n        return self._methodcall(\n            lib.kmerminhash_similarity, other._get_objptr(), True, downsample\n        )\n\n    def jaccard_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        jaccard=None,\n        prob_threshold=1e-3,\n        err_threshold=1e-4,\n    ):\n        \"Use jaccard to estimate ANI between two MinHash objects.\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\"Error: can only calculate ANI for scaled MinHashes\")\n        self_mh = self\n        other_mh = other\n        scaled = self.scaled\n        if downsample:\n            scaled = max(self_mh.scaled, other_mh.scaled)\n            self_mh = self.downsample(scaled=scaled)\n            other_mh = other.downsample(scaled=scaled)\n        if jaccard is None:\n            jaccard = self_mh.similarity(other_mh, ignore_abundance=True)\n        avg_sketch_kmers = (len(self_mh) + len(other_mh)) / 2\n        avg_n_kmers = round(\n            avg_sketch_kmers * scaled\n        )  # would be better if hll estimate - see #1798\n        j_aniresult = jaccard_to_distance(\n            jaccard,\n            self_mh.ksize,\n            scaled,\n            n_unique_kmers=avg_n_kmers,\n            prob_threshold=prob_threshold,\n            err_threshold=err_threshold,\n        )\n        # null out ANI if either mh size estimation is inaccurate\n        if not self.size_is_accurate() or not other.size_is_accurate():\n            j_aniresult.size_is_inaccurate = True\n        return j_aniresult\n\n    def similarity(self, other, ignore_abundance=False, downsample=False):\n        \"\"\"Calculate similarity of two sketches.\n\n        If the sketches are not abundance weighted, or ignore_abundance=True,\n        compute Jaccard similarity.\n\n        If the sketches are abundance weighted, calculate the angular\n        similarity, a distance metric based on the cosine similarity.\n\n        Note, because the term frequencies (tf-idf weights) cannot be negative,\n        the angle will never be < 0deg or > 90deg.\n\n        See https://en.wikipedia.org/wiki/Cosine_similarity\n        \"\"\"\n        return self._methodcall(\n            lib.kmerminhash_similarity,\n            other._get_objptr(),\n            ignore_abundance,\n            downsample,\n        )\n\n    def angular_similarity(self, other, downsample=False):\n        \"Calculate the angular similarity.\"\n        if not (self.track_abundance and other.track_abundance):\n            raise TypeError(\n                \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            )\n        # return self._methodcall(lib.kmerminhash_angular_similarity, other._get_objptr())\n        # use similarity so we can downsample\n        return self._methodcall(\n            lib.kmerminhash_similarity, other._get_objptr(), False, downsample\n        )\n\n    def is_compatible(self, other):\n        return self._methodcall(lib.kmerminhash_is_compatible, other._get_objptr())\n\n    def contained_by(self, other, downsample=False):\n        \"\"\"\n        Calculate how much of self is contained by other.\n        \"\"\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\n                \"Error: can only calculate containment for scaled MinHashes\"\n            )\n        denom = len(self)\n        if not denom:\n            return 0.0\n        total_denom = float(\n            denom * self.scaled\n        )  # would be better if hll estimate - see #1798\n        bias_factor = 1.0 - (1.0 - 1.0 / self.scaled) ** total_denom\n        containment = self.count_common(other, downsample) / (denom * bias_factor)\n        # debiasing containment can lead to vals outside of 0-1 range. constrain.\n        if containment >= 1:\n            return 1.0\n        elif containment <= 0:\n            return 0.0\n        else:\n            return containment\n\n    def contained_by_weighted(self, other):\n        \"\"\"\n        Calculate how much of self is contained by other; weight by self.\n        Note: automatically downsamples as needed -- is this ok?\n        \"\"\"\n        # should we debias this like standard containment?\n        if not (self.scaled and other.scaled):\n            raise TypeError(\n                \"Error: can only calculate containment for scaled MinHashes\"\n            )\n        self_mh = self.copy()\n        self_ds = self_mh.downsample(scaled=other.scaled)\n        self_mh = self_ds.flatten()\n        other_mh = flatten_and_downsample_scaled(other, self.scaled)\n\n        intersect_mh = other_mh.inflate(self)\n        weighted_common = intersect_mh.sum_abundances\n        weighted_total = self_ds.sum_abundances\n        return weighted_common / weighted_total\n\n    def containment_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        containment=None,\n        confidence=0.95,\n        estimate_ci=False,\n        prob_threshold=1e-3,\n    ):\n        \"Use self contained by other to estimate ANI between two MinHash objects.\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\"Error: can only calculate ANI for scaled MinHashes\")\n        self_mh = self\n        other_mh = other\n        scaled = self.scaled\n        if downsample:\n            scaled = max(self_mh.scaled, other_mh.scaled)\n            self_mh = self.downsample(scaled=scaled)\n            other_mh = other.downsample(scaled=scaled)\n        if containment is None:\n            containment = self_mh.contained_by(other_mh)\n        n_kmers = len(self_mh) * scaled  # would be better if hll estimate - see #1798\n\n        c_aniresult = containment_to_distance(\n            containment,\n            self_mh.ksize,\n            self_mh.scaled,\n            n_unique_kmers=n_kmers,\n            confidence=confidence,\n            estimate_ci=estimate_ci,\n            prob_threshold=prob_threshold,\n        )\n        # null out ANI if either mh size estimation is inaccurate\n        if not self.size_is_accurate() or not other.size_is_accurate():\n            c_aniresult.size_is_inaccurate = True\n        return c_aniresult\n\n    def max_containment(self, other, downsample=False):\n        \"\"\"\n        Calculate maximum containment.\n        \"\"\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\n                \"Error: can only calculate containment for scaled MinHashes\"\n            )\n        min_denom = min((len(self), len(other)))\n        if not min_denom:\n            return 0.0\n        total_denom = float(\n            min_denom * self.scaled\n        )  # would be better if hll estimate - see #1798\n        bias_factor = 1.0 - (1.0 - 1.0 / self.scaled) ** total_denom\n        max_containment = self.count_common(other, downsample) / (\n            min_denom * bias_factor\n        )\n        # debiasing containment can lead to vals outside of 0-1 range. constrain.\n        if max_containment >= 1:\n            return 1.0\n        elif max_containment <= 0:\n            return 0.0\n        else:\n            return max_containment\n\n    def max_containment_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        max_containment=None,\n        confidence=0.95,\n        estimate_ci=False,\n        prob_threshold=1e-3,\n    ):\n        \"Use max_containment to estimate ANI between two MinHash objects.\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\"Error: can only calculate ANI for scaled MinHashes\")\n        self_mh = self\n        other_mh = other\n        scaled = self.scaled\n        if downsample:\n            scaled = max(self_mh.scaled, other_mh.scaled)\n            self_mh = self.downsample(scaled=scaled)\n            other_mh = other.downsample(scaled=scaled)\n        if max_containment is None:\n            max_containment = self_mh.max_containment(other_mh)\n        min_n_kmers = min(len(self_mh), len(other_mh))\n        n_kmers = min_n_kmers * scaled  # would be better if hll estimate - see #1798\n\n        c_aniresult = containment_to_distance(\n            max_containment,\n            self_mh.ksize,\n            scaled,\n            n_unique_kmers=n_kmers,\n            confidence=confidence,\n            estimate_ci=estimate_ci,\n            prob_threshold=prob_threshold,\n        )\n        # null out ANI if either mh size estimation is inaccurate\n        if not self.size_is_accurate() or not other.size_is_accurate():\n            c_aniresult.size_is_inaccurate = True\n        return c_aniresult\n\n    def avg_containment(self, other, *, downsample=False):\n        \"\"\"\n        Calculate average containment.\n        Note: this is average of the containments, *not* count_common/ avg_denom\n        \"\"\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\n                \"Error: can only calculate containment for scaled MinHashes\"\n            )\n\n        c1 = self.contained_by(other, downsample)\n        c2 = other.contained_by(self, downsample)\n\n        return (c1 + c2) / 2\n\n    def avg_containment_ani(self, other, *, downsample=False, prob_threshold=1e-3):\n        \"\"\"\n        Calculate average containment ANI.\n        Note: this is average of the containment ANI's, *not* ANI using count_common/ avg_denom\n        \"\"\"\n        if not (self.scaled and other.scaled):\n            raise TypeError(\"Error: can only calculate ANI for scaled MinHashes\")\n        a1 = self.containment_ani(\n            other, downsample=downsample, prob_threshold=prob_threshold\n        ).ani\n        a2 = other.containment_ani(\n            self, downsample=downsample, prob_threshold=prob_threshold\n        ).ani\n        if any([a1 is None, a2 is None]):\n            return None\n        return (a1 + a2) / 2\n\n    def __add__(self, other):\n        if not isinstance(other, MinHash):\n            raise TypeError(\"can only add MinHash objects to MinHash objects!\")\n\n        if self.num and other.num:\n            if self.num != other.num:\n                raise TypeError(\n                    f\"incompatible num values: self={self.num} other={other.num}\"\n                )\n\n        new_obj = self.to_mutable()\n        new_obj += other\n        return new_obj\n\n    __or__ = __add__\n\n    def __iadd__(self, other):\n        if not isinstance(other, MinHash):\n            raise TypeError(\"can only add MinHash objects to MinHash objects!\")\n        self._methodcall(lib.kmerminhash_merge, other._get_objptr())\n        return self\n\n    def merge(self, other):\n        if not isinstance(other, MinHash):\n            raise TypeError(\"can only add MinHash objects to MinHash objects!\")\n        self._methodcall(lib.kmerminhash_merge, other._get_objptr())\n\n    def intersection(self, other):\n        if not isinstance(other, MinHash):\n            raise TypeError(\"can only intersect MinHash objects\")\n        if self.track_abundance or other.track_abundance:\n            raise TypeError(\"can only intersect flat MinHash objects\")\n\n        ptr = self._methodcall(lib.kmerminhash_intersection, other._get_objptr())\n        return MinHash._from_objptr(ptr)\n\n    __and__ = intersection\n\n    def set_abundances(self, values, clear=True):\n        \"\"\"Set abundances for hashes from ``values``, where\n        ``values[hash] = abund``\n\n        If ``abund`` value is set to zero, the ``hash`` will be removed from the sketch.\n        ``abund`` cannot be set to a negative value.\n        \"\"\"\n        if self.track_abundance:\n            hashes = []\n            abunds = []\n\n            for h, v in values.items():\n                hashes.append(h)\n                if v < 0:\n                    raise ValueError(\"Abundance cannot be set to a negative value.\")\n                abunds.append(v)\n\n            self._methodcall(\n                lib.kmerminhash_set_abundances, hashes, abunds, len(hashes), clear\n            )\n        else:\n            raise RuntimeError(\n                \"Use track_abundance=True when constructing \"\n                \"the MinHash to use set_abundances.\"\n            )\n\n    def add_protein(self, sequence):\n        \"Add a protein sequence.\"\n        self._methodcall(lib.kmerminhash_add_protein, to_bytes(sequence))\n\n    @property\n    def moltype(self):  # TODO: test in minhash tests\n        if self.is_protein:\n            return \"protein\"\n        elif self.dayhoff:\n            return \"dayhoff\"\n        elif self.hp:\n            return \"hp\"\n        elif self.skipm1n3:\n            return \"skipm1n3\"\n        elif self.skipm2n3:\n            return \"skipm2n3\"\n        else:\n            return \"DNA\"\n\n    def to_mutable(self):\n        \"Return a copy of this MinHash that can be changed.\"\n        return self.__copy__()\n\n    def to_frozen(self):\n        \"Return a frozen copy of this MinHash that cannot be changed.\"\n        new_mh = self.__copy__()\n        new_mh.into_frozen()\n        return new_mh\n\n    def into_frozen(self):\n        \"Freeze this MinHash, preventing any changes.\"\n        self.__class__ = FrozenMinHash\n\n    def inflate(self, from_mh):\n        \"\"\"return a new MinHash object with abundances taken from 'from_mh'\n\n        note that this implicitly does an intersection: hashes that have\n        no abundance in 'from_mh' are set to abundance 0 and removed from\n        'self'.\n        \"\"\"\n        if not self.track_abundance and from_mh.track_abundance:\n            orig_abunds = from_mh.hashes\n            abunds = {h: orig_abunds.get(h, 0) for h in self.hashes}\n\n            abund_mh = from_mh.copy_and_clear()\n\n            abund_mh.downsample(scaled=self.scaled)\n            abund_mh.set_abundances(abunds)\n\n            return abund_mh\n        else:\n            raise ValueError(\n                \"inflate operates on a flat MinHash and takes a MinHash object with track_abundance=True\"\n            )\n\n    @property\n    def sum_abundances(self):\n        if self.track_abundance:\n            return sum(v for v in self.hashes.values())\n        return None\n\n    @property\n    def mean_abundance(self):\n        if self.track_abundance:\n            return np.mean(list(self.hashes.values()))\n        return None\n\n    @property\n    def median_abundance(self):\n        if self.track_abundance:\n            return np.median(list(self.hashes.values()))\n        return None\n\n    @property\n    def std_abundance(self):\n        if self.track_abundance:\n            return np.std(list(self.hashes.values()))\n        return None\n\n    @property\n    def unique_dataset_hashes(self):\n        \"\"\"\n        Approximate total number of hashes (num_hashes *scaled).\n        \"\"\"\n        if not self.scaled:\n            raise TypeError(\n                \"can only approximate unique_dataset_hashes for scaled MinHashes\"\n            )\n        # TODO: replace set_size with HLL estimate when that gets implemented\n        return len(self) * self.scaled  # + (self.ksize - 1) for bp estimation\n\n    def size_is_accurate(self, relative_error=0.20, confidence=0.95):\n        \"\"\"\n        Computes the probability that the estimate: sketch_size * scaled deviates from the true\n        set_size by more than relative_error. This relies on the fact that the sketch_size\n        is binomially distributed with parameters sketch_size and 1/scaled. The two-sided Chernoff\n        bounds are used.\n        Returns True if probability is greater than or equal to the desired confidence.\n        \"\"\"\n        if not self.scaled:\n            raise TypeError(\n                \"Error: can only estimate dataset size for scaled MinHashes\"\n            )\n        if any([not (0 <= relative_error <= 1), not (0 <= confidence <= 1)]):\n            raise ValueError(\n                \"Error: relative error and confidence values must be between 0 and 1.\"\n            )\n        # to do: replace unique_dataset_hashes with HLL estimation when it gets implemented\n        probability = set_size_exact_prob(\n            self.unique_dataset_hashes, self.scaled, relative_error=relative_error\n        )\n        return probability >= confidence\n\n\nclass FrozenMinHash(MinHash):\n    def add_sequence(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def add_kmer(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def add_many(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def remove_many(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def add_hash(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def add_hash_with_abundance(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def clear(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def set_abundances(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def add_protein(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def downsample(self, *, num=None, scaled=None):\n        if scaled and self.scaled == scaled:\n            return self\n        if num and self.num == num:\n            return self\n\n        down_mh = MinHash.downsample(self, num=num, scaled=scaled)\n        down_mh.into_frozen()\n        return down_mh\n\n    def flatten(self):\n        if not self.track_abundance:\n            return self\n        flat_mh = MinHash.flatten(self)\n        flat_mh.into_frozen()\n        return flat_mh\n\n    def __iadd__(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def merge(self, *args, **kwargs):\n        raise TypeError(\"FrozenMinHash does not support modification\")\n\n    def to_mutable(self):\n        \"Return a copy of this MinHash that can be changed.\"\n        mut = MinHash.__new__(MinHash)\n        state_tup = self.__getstate__()\n\n        mut.__setstate__(state_tup)\n        return mut\n\n    def to_frozen(self):\n        \"Return a frozen copy of this MinHash that cannot be changed.\"\n        return self\n\n    def into_frozen(self):\n        \"Freeze this MinHash, preventing any changes.\"\n        pass\n\n    def __setstate__(self, tup):\n        \"support pickling via __getstate__/__setstate__\"\n        (\n            n,\n            ksize,\n            is_protein,\n            dayhoff,\n            hp,\n            skipm1n3,\n            skipm2n3,\n            mins,\n            _,\n            track_abundance,\n            max_hash,\n            seed,\n        ) = tup\n\n        self.__del__()\n\n        hash_function = (\n            lib.HASH_FUNCTIONS_MURMUR64_DAYHOFF\n            if dayhoff\n            else lib.HASH_FUNCTIONS_MURMUR64_HP\n            if hp\n            else lib.HASH_FUNCTIONS_MURMUR64_PROTEIN\n            if is_protein\n            else lib.HASH_FUNCTIONS_MURMUR64_SKIPM1N3\n            if skipm1n3\n            else lib.HASH_FUNCTIONS_MURMUR64_SKIPM2N3\n            if skipm2n3\n            else lib.HASH_FUNCTIONS_MURMUR64_DNA\n        )\n\n        scaled = _get_scaled_for_max_hash(max_hash)\n        self._objptr = lib.kmerminhash_new(\n            scaled, ksize, hash_function, seed, track_abundance, n\n        )\n        if track_abundance:\n            MinHash.set_abundances(self, mins)\n        else:\n            MinHash.add_many(self, mins)\n\n    def __copy__(self):\n        return self\n\n    copy = __copy__\n"
  },
  {
    "path": "src/sourmash/nodegraph.py",
    "content": "# -*- coding: UTF-8 -*-\n\nfrom struct import pack, unpack\nimport sys\nfrom tempfile import NamedTemporaryFile\n\nfrom ._lowlevel import ffi, lib\nfrom .minhash import to_bytes, MinHash\nfrom .utils import RustObject, rustcall, decode_str\nfrom .exceptions import SourmashError\n\n\nclass Nodegraph(RustObject):\n    __dealloc_func__ = lib.nodegraph_free\n\n    def __init__(self, ksize, starting_size, n_tables):\n        self._objptr = lib.nodegraph_with_tables(ksize, int(starting_size), n_tables)\n\n    @staticmethod\n    def load(filename):\n        ng_ptr = rustcall(lib.nodegraph_from_path, to_bytes(filename))\n        return Nodegraph._from_objptr(ng_ptr)\n\n    @staticmethod\n    def from_buffer(buf):\n        ng_ptr = rustcall(lib.nodegraph_from_buffer, buf, len(buf))\n        return Nodegraph._from_objptr(ng_ptr)\n\n    def save(self, filename):\n        self._methodcall(lib.nodegraph_save, to_bytes(filename))\n\n    def to_bytes(self, compression=1):\n        size = ffi.new(\"uintptr_t *\")\n        rawbuf = self._methodcall(lib.nodegraph_to_buffer, compression, size)\n        size = size[0]\n\n        rawbuf = ffi.gc(rawbuf, lambda o: lib.nodegraph_buffer_free(o, size), size)\n        buf = ffi.buffer(rawbuf, size)\n\n        return buf\n\n    def update(self, other):\n        if isinstance(other, Nodegraph):\n            return self._methodcall(lib.nodegraph_update, other._objptr)\n        elif isinstance(other, MinHash):\n            return self._methodcall(lib.nodegraph_update_mh, other._objptr)\n        else:\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise TypeError(\"Must be a Nodegraph or MinHash\")\n\n    def count(self, h):\n        if isinstance(h, str):\n            return self._methodcall(lib.nodegraph_count_kmer, to_bytes(h))\n        return self._methodcall(lib.nodegraph_count, h)\n\n    def get(self, h):\n        if isinstance(h, str):\n            return self._methodcall(lib.nodegraph_get_kmer, to_bytes(h))\n        return self._methodcall(lib.nodegraph_get, h)\n\n    def n_occupied(self):\n        return self._methodcall(lib.nodegraph_noccupied)\n\n    def ksize(self):\n        return self._methodcall(lib.nodegraph_ksize)\n\n    def hashsizes(self):\n        size = ffi.new(\"uintptr_t *\")\n        ptr = self._methodcall(lib.nodegraph_hashsizes, size)\n        size = size[0]\n        hashsizes = ffi.unpack(ptr, size)\n        lib.kmerminhash_slice_free(ptr, size)\n\n        return hashsizes\n\n    @property\n    def expected_collisions(self):\n        return self._methodcall(lib.nodegraph_expected_collisions)\n\n    def matches(self, mh):\n        \"return number of matches between MinHash and nodegraph\"\n        if not isinstance(mh, MinHash):\n            # FIXME: we could take sets here too (or anything that can be\n            # converted to a list of ints...)\n            raise ValueError(\"mh must be a MinHash\")\n\n        return self._methodcall(lib.nodegraph_matches, mh._objptr)\n\n    def to_khmer_nodegraph(self):\n        import khmer\n\n        try:\n            load_nodegraph = khmer.load_nodegraph\n        except AttributeError:\n            load_nodegraph = khmer.Nodegraph.load\n\n        with NamedTemporaryFile() as f:\n            self.save(f.name)\n            f.file.flush()\n            f.file.seek(0)\n            return load_nodegraph(f.name)\n\n\ndef extract_nodegraph_info(filename):\n    \"\"\"Open the given nodegraph file and return a tuple of information.\n\n    Returns: the k-mer size, the table size, the number of tables, the version\n    of the table format, and the type of table flag.\n\n    Keyword argument:\n    filename -- the name of the nodegraph file to inspect\n    \"\"\"\n    ksize = None\n    n_tables = None\n    table_size = None\n    signature = None\n    version = None\n    ht_type = None\n    occupied = None\n\n    uint_size = len(pack(\"I\", 0))\n    uchar_size = len(pack(\"B\", 0))\n    ulonglong_size = len(pack(\"Q\", 0))\n\n    try:\n        with open(filename, \"rb\") as nodegraph:\n            (signature,) = unpack(\"4s\", nodegraph.read(4))\n            (version,) = unpack(\"B\", nodegraph.read(1))\n            (ht_type,) = unpack(\"B\", nodegraph.read(1))\n            (ksize,) = unpack(\"I\", nodegraph.read(uint_size))\n            (n_tables,) = unpack(\"B\", nodegraph.read(uchar_size))\n            (occupied,) = unpack(\"Q\", nodegraph.read(ulonglong_size))\n            (table_size,) = unpack(\"Q\", nodegraph.read(ulonglong_size))\n        if signature != b\"OXLI\":\n            raise ValueError(\n                f\"Node graph '{filename}' is missing file type \"\n                \"signature\" + str(signature)\n            )\n    except:\n        raise ValueError(f\"Node graph '{filename}' is corrupt \")\n\n    return ksize, round(table_size, -2), n_tables, version, ht_type, occupied\n\n\ndef calc_expected_collisions(graph, force=False, max_false_pos=0.2):\n    fp_all = graph.expected_collisions\n\n    if fp_all > max_false_pos:\n        print(\"**\", file=sys.stderr)\n        print(\"** ERROR: the graph structure is too small for \", file=sys.stderr)\n        print(\"** this data set.  Increase data structure size.\", file=sys.stderr)\n        print(\"** Do not use these results!!\", file=sys.stderr)\n        print(\"**\", file=sys.stderr)\n        print(\n            f\"** (estimated false positive rate of {fp_all:.3f};\",\n            file=sys.stderr,\n            end=\" \",\n        )\n        print(f\"max recommended {max_false_pos:.3f})\", file=sys.stderr)\n        print(\"**\", file=sys.stderr)\n\n        if not force:\n            raise SystemExit(1)\n\n    return fp_all\n"
  },
  {
    "path": "src/sourmash/np_utils.py",
    "content": "import tempfile\n\n\ndef to_memmap(array):\n    \"\"\"Write a memory mapped array\n    Create a memory-map to an array stored in a binary file on disk.\n    Memory-mapped files are used for accessing small segments of\n    large files on disk, without reading the entire file into memory.\n    :param np.array array to memory map\n    :return: np.array large_memmap memory mapped array\n    :return: str filename name of the file that memory mapped array is written to\n    \"\"\"\n    import numpy as np\n\n    filename = tempfile.NamedTemporaryFile(\n        prefix=\"array\", suffix=\".mmap\", delete=False\n    ).name\n    shape = array.shape\n    f = np.memmap(filename, mode=\"w+\", shape=shape, dtype=array.dtype)\n    f[:] = array[:]\n    del f\n    large_memmap = np.memmap(filename, dtype=array.dtype, shape=shape)\n    return large_memmap, filename\n"
  },
  {
    "path": "src/sourmash/picklist.py",
    "content": "\"\"\"Picklist code for extracting subsets of signatures.\n\nPicklists serve as a central inclusion/exclusion mechanism for sketches.\nEach picklist object operates on a particular type of value, and uses\nvalues specified by the user (if using an external picklist) or works with\nthe output of sourmash (manifests or search/prefetch/gather output).\n\nTwo key features of picklists is that they can be passed into Index.select\nand operate efficiently on manifests, so when used with e.g. zipfiles,\nonly the selected sketches are loaded.\n\"\"\"\n\nimport csv\nimport os\nfrom enum import Enum\n\n# set up preprocessing functions for column stuff\npreprocess = {}\n\n# exact matches\npreprocess[\"name\"] = lambda x: x\npreprocess[\"md5\"] = lambda x: x\n\n\n# identifier matches/prefix foo - space delimited identifiers\npreprocess[\"identprefix\"] = lambda x: x.split(\" \")[0].split(\".\")[0]\npreprocess[\"ident\"] = lambda x: x.split(\" \")[0]\n\n# match 8 characters\npreprocess[\"md5prefix8\"] = lambda x: x[:8]\npreprocess[\"md5short\"] = lambda x: x[:8]\n\n\n# all meta-coltypes use the same preprocessing of tuple => (ident, md5short)\ndef combine_ident_md5(x):\n    \"preprocess (name, md5) tup into (ident, md5short) tup\"\n    name, md5 = x\n    ident = name.split(\" \")[0]\n    md5 = md5[:8]\n    return (ident, md5)\n\n\npreprocess[\"manifest\"] = combine_ident_md5\npreprocess[\"prefetch\"] = combine_ident_md5\npreprocess[\"gather\"] = combine_ident_md5\npreprocess[\"search\"] = combine_ident_md5\n\n\nclass PickStyle(Enum):\n    INCLUDE = 1\n    EXCLUDE = 2\n\n\nclass SignaturePicklist:\n    \"\"\"Picklist class for subsetting collections of signatures.\n\n    Initialize using ``SignaturePicklist.from_picklist_args(argstr)``,\n    which takes an argument str like so: 'pickfile:column:coltype'.\n\n    Here, 'pickfile' is the path to a CSV file; 'column' is the name of\n    the column to select from the CSV file; and 'coltype' is the type of\n    matching to do on that column.\n\n    'coltype's that are currently supported:\n    * 'name' - exact match to signature's name\n    * 'md5' - exact match to signature's md5sum\n    * 'md5prefix8' - match to 8-character prefix of signature's md5sum\n    * 'md5short' - same as md5prefix8\n    * 'ident' - exact match to signature's identifier\n    * 'identprefix' - match to signature's identifier, before '.'\n\n    Identifiers are constructed by using the first space delimited word in\n    the signature name.\n\n    You can also use 'gather', 'prefetch', 'search', and 'manifest' as\n    column types; these take the CSV output of 'gather', 'prefetch',\n    'search', and 'manifest' as picklists. 'column' must be left\n    blank in this case: e.g. use 'pickfile.csv::gather'. These \"meta-coltypes\"\n    use composite selection on (ident, md5short) tuples.\n    \"\"\"\n\n    meta_coltypes = (\"manifest\", \"gather\", \"prefetch\", \"search\")\n    supported_coltypes = (\n        \"md5\",\n        \"md5prefix8\",\n        \"md5short\",\n        \"name\",\n        \"ident\",\n        \"identprefix\",\n    )\n\n    def __init__(\n        self, coltype, *, pickfile=None, column_name=None, pickstyle=PickStyle.INCLUDE\n    ):\n        \"create a picklist of column type 'coltype'.\"\n\n        # first, check coltype...\n        valid_coltypes = set(self.meta_coltypes)\n        valid_coltypes.update(self.supported_coltypes)\n        if coltype not in valid_coltypes:\n            raise ValueError(f\"invalid picklist column type '{coltype}'\")\n        self.orig_coltype = coltype\n        self.orig_colname = column_name\n\n        # if we're using gather, prefetch, manifest, or search, set column_name\n        # automatically (after checks).\n        if coltype in self.meta_coltypes:\n            if column_name:\n                raise ValueError(f\"no column name allowed for coltype '{coltype}'\")\n\n            if coltype == \"prefetch\":\n                column_name = \"(match_name, match_md5)\"\n            else:\n                column_name = \"(name, md5)\"\n\n        self.coltype = coltype\n        self.pickfile = pickfile\n        self.column_name = column_name\n        self.pickstyle = pickstyle\n\n        self.preprocess_fn = preprocess[coltype]\n        self.pickset = None\n        self.found = set()\n        self.n_queries = 0\n\n    @classmethod\n    def from_picklist_args(cls, argstr):\n        \"load a picklist from an argument string 'pickfile:col:coltype:style'\"\n        picklist = argstr.split(\":\")\n        pickstyle = PickStyle.INCLUDE\n\n        # pickstyle specified?\n        if len(picklist) == 4:\n            pickstyle_str = picklist.pop()\n            if pickstyle_str == \"include\":\n                pickstyle = PickStyle.INCLUDE\n            elif pickstyle_str == \"exclude\":\n                pickstyle = PickStyle.EXCLUDE\n            else:\n                raise ValueError(\n                    f\"invalid picklist 'pickstyle' argument 4: '{pickstyle_str}' must be 'include' or 'exclude'\"\n                )\n\n        if len(picklist) != 3:\n            raise ValueError(f\"invalid picklist argument '{argstr}'\")\n\n        assert len(picklist) == 3\n        pickfile, column, coltype = picklist\n\n        return cls(coltype, pickfile=pickfile, column_name=column, pickstyle=pickstyle)\n\n    def _get_sig_attribute(self, ss):\n        \"for a given SourmashSignature, return relevant picklist value.\"\n        coltype = self.coltype\n        if coltype in self.meta_coltypes:  # gather, prefetch, search, manifest\n            q = (ss.name, ss.md5sum())\n        elif coltype in (\"md5\", \"md5prefix8\", \"md5short\"):\n            q = ss.md5sum()\n        elif coltype in (\"name\", \"ident\", \"identprefix\"):\n            q = ss.name\n        else:\n            raise ValueError(\n                f\"picklist get_sig_attribute {coltype} has unhandled branch\"\n            )\n\n        return q\n\n    def _get_value_for_manifest_row(self, row):\n        \"return the picklist value from a manifest row\"\n        if self.coltype in self.meta_coltypes:  # gather, prefetch, search, manifest\n            q = (row[\"name\"], row[\"md5\"])\n        else:\n            if self.coltype == \"md5\":\n                colkey = \"md5\"\n            elif self.coltype in (\"md5prefix8\", \"md5short\"):\n                colkey = \"md5short\"\n            elif self.coltype in (\"name\", \"ident\", \"identprefix\"):\n                colkey = \"name\"\n            else:\n                raise ValueError(\n                    f\"picklist get_value_for_row {colkey} has unhandled branch\"\n                )\n\n            q = row.get(colkey)\n\n        assert q\n        q = self.preprocess_fn(q)\n\n        return q\n\n    def _get_value_for_csv_row(self, row):\n        \"return the picklist value from a CSV pickfile row - supplied by user, typically\"\n\n        # customize for each type of meta_coltypes\n        if self.coltype == \"manifest\":\n            q = (row[\"name\"], row[\"md5\"])\n        elif self.coltype == \"prefetch\":\n            q = (row[\"match_name\"], row[\"match_md5\"])\n        elif self.coltype in (\"gather\", \"search\"):\n            q = (row[\"name\"], row[\"md5\"])\n        else:\n            q = row[self.column_name]\n\n        if q:\n            q = self.preprocess_fn(q)\n\n        return q\n\n    def init(self, values=[]):\n        \"initialize a Picklist object with given values.\"\n        if self.pickset is not None:\n            raise ValueError(\"already initialized?\")\n        self.pickset = set(values)\n        return self.pickset\n\n    def load(self, *, allow_empty=False):\n        \"load pickset, return num empty vals, and set of duplicate vals.\"\n        from . import sourmash_args\n\n        pickset = self.init()\n\n        pickfile = self.pickfile\n        coltype = self.coltype\n        column_name = self.column_name\n\n        if not os.path.exists(pickfile) or not os.path.isfile(pickfile):\n            raise ValueError(f\"pickfile '{pickfile}' must exist and be a regular file\")\n\n        n_empty_val = 0\n        dup_vals = set()\n\n        # CTB note: for zipfiles, not clear to me what a good \"default\" name would be for a\n        # picklist CSV inside a zip (default_csv_name for FileInputCSV).\n        with sourmash_args.FileInputCSV(pickfile) as r:\n            self.pickfile = pickfile\n            if not r.fieldnames:\n                if not allow_empty:\n                    raise ValueError(\n                        f\"empty or improperly formatted pickfile '{pickfile}'\"\n                    )\n                else:\n                    return 0, 0\n\n            if not (column_name in r.fieldnames or coltype in self.meta_coltypes):\n                raise ValueError(f\"column '{column_name}' not in pickfile '{pickfile}'\")\n\n            for row in r:\n                col = self._get_value_for_csv_row(row)\n                if not col:\n                    n_empty_val += 1\n                    continue\n\n                # look for duplicate values or empty values\n                if col in pickset:\n                    dup_vals.add(col)\n                else:\n                    self.add(col)\n\n        return n_empty_val, dup_vals\n\n    def add(self, value):\n        \"Add a value to this picklist.\"\n        self.pickset.add(value)\n\n    def __contains__(self, ss):\n        \"does this signature match anything in the picklist?\"\n        # pull out the relevant signature attribute\n        q = self._get_sig_attribute(ss)\n\n        # mangle into the kinds of values we support here\n        q = self.preprocess_fn(q)\n\n        # add to the number of queries performed,\n        self.n_queries += 1\n\n        # determine if ok or not.\n        if self.pickstyle == PickStyle.INCLUDE:\n            if q in self.pickset:\n                self.found.add(q)\n                return True\n        elif self.pickstyle == PickStyle.EXCLUDE:\n            if q not in self.pickset:\n                self.found.add(q)\n                return True\n        return False\n\n    def matches_manifest_row(self, row):\n        \"does the given manifest row match this picklist?\"\n        q = self._get_value_for_manifest_row(row)\n        self.n_queries += 1\n\n        if self.pickstyle == PickStyle.INCLUDE:\n            if q in self.pickset:\n                self.found.add(q)\n                return True\n        elif self.pickstyle == PickStyle.EXCLUDE:\n            if q not in self.pickset:\n                self.found.add(q)\n                return True\n        return False\n\n    def matched_csv_row(self, row):\n        \"\"\"did the given CSV row object match this picklist?\n\n        This is used for examining matches/nomatches to original picklist file.\n        \"\"\"\n        q = self._get_value_for_csv_row(row)\n        self.n_queries += 1\n\n        if q in self.found:\n            return True\n        return False\n\n    def filter(self, it):\n        \"yield all signatures in the given iterator that are in the picklist\"\n        for ss in it:\n            if self.__contains__(ss):\n                yield ss\n\n\ndef passes_all_picklists(ss, picklists):\n    \"does the signature 'ss' pass all of the picklists?\"\n    for picklist in picklists:\n        if ss not in picklist:\n            return False\n    return True\n"
  },
  {
    "path": "src/sourmash/plugins.py",
    "content": "\"\"\"\nSupport for plugins to sourmash via importlib.metadata entrypoints.\n\nPlugin entry point names:\n* 'sourmash.load_from' - Index class loading.\n* 'sourmash.save_to' - Signature saving.\n* 'sourmash.cli_script' - command-line extension.\n\nCTB TODO:\n\n* consider using something other than 'name' for loader fn name. Maybe __doc__?\n* try implement picklist plugin?\n\"\"\"\n\nDEFAULT_LOAD_FROM_PRIORITY = 99\nDEFAULT_SAVE_TO_PRIORITY = 99\n\nimport itertools\nimport argparse\n\nfrom .logging import debug_literal, error, notify, set_quiet\n\n# cover for older versions of Python that don't support selection on load\n# (the 'group=' below).\nfrom importlib.metadata import entry_points\n\n# load 'load_from' entry points. NOTE: this executes on import of this module.\ntry:\n    _plugin_load_from = entry_points(group=\"sourmash.load_from\")\nexcept TypeError:\n    from importlib_metadata import entry_points\n\n    _plugin_load_from = entry_points(group=\"sourmash.load_from\")\n\n# load 'save_to' entry points as well.\n_plugin_save_to = entry_points(group=\"sourmash.save_to\")\n\n# aaaaand CLI entry points:\n_plugin_cli = entry_points(group=\"sourmash.cli_script\")\n_plugin_cli_once = False\n\n###\n\n\ndef get_load_from_functions():\n    \"Load the 'load_from' plugins and yield tuples (priority, name, fn).\"\n    debug_literal(f\"load_from plugins: {_plugin_load_from}\")\n\n    # Load each plugin,\n    for plugin in _plugin_load_from:\n        try:\n            loader_fn = plugin.load()\n        except (ModuleNotFoundError, AttributeError) as e:\n            debug_literal(\n                f\"plugins.load_from_functions: got error loading {plugin.name}: {str(e)}\"\n            )\n            continue\n\n        # get 'priority' if it is available\n        priority = getattr(loader_fn, \"priority\", DEFAULT_LOAD_FROM_PRIORITY)\n\n        # retrieve name (which is specified by plugin?)\n        name = plugin.name\n        debug_literal(f\"plugins.load_from_functions: got '{name}', priority={priority}\")\n        yield priority, name, loader_fn\n\n\ndef get_save_to_functions():\n    \"Load the 'save_to' plugins and yield tuples (priority, fn).\"\n    debug_literal(f\"save_to plugins: {_plugin_save_to}\")\n\n    # Load each plugin,\n    for plugin in _plugin_save_to:\n        try:\n            save_cls = plugin.load()\n        except (ModuleNotFoundError, AttributeError) as e:\n            debug_literal(\n                f\"plugins.load_from_functions: got error loading {plugin.name}: {str(e)}\"\n            )\n            continue\n\n        # get 'priority' if it is available\n        priority = getattr(save_cls, \"priority\", DEFAULT_SAVE_TO_PRIORITY)\n\n        # retrieve name (which is specified by plugin?)\n        name = plugin.name\n        debug_literal(f\"plugins.save_to_functions: got '{name}', priority={priority}\")\n        yield priority, save_cls\n\n\nclass CommandLinePlugin:\n    \"\"\"\n    Provide some minimal common CLI functionality - -q and -d.\n\n    Subclasses should call super().__init__(parser) and super().main(args).\n    \"\"\"\n\n    command = None\n    description = None\n\n    def __init__(self, parser):\n        parser.add_argument(\n            \"-q\", \"--quiet\", action=\"store_true\", help=\"suppress non-error output\"\n        )\n        parser.add_argument(\n            \"-d\", \"--debug\", action=\"store_true\", help=\"provide debugging output\"\n        )\n\n    def main(self, args):\n        set_quiet(args.quiet, args.debug)\n\n\ndef get_cli_script_plugins():\n    global _plugin_cli_once\n\n    x = []\n    for plugin in _plugin_cli:\n        name = plugin.name\n        mod = plugin.module\n        try:\n            script_cls = plugin.load()\n        except (ModuleNotFoundError, AttributeError):\n            if _plugin_cli_once is False:\n                error(\n                    f\"ERROR: cannot find or load module for cli_script plugin '{name}'\"\n                )\n            continue\n\n        command = getattr(script_cls, \"command\", None)\n        if command is None:\n            # print error message only once...\n            if _plugin_cli_once is False:\n                error(\n                    f\"ERROR: no command provided by cli_script plugin '{name}' from {mod}; skipping\"\n                )\n        else:\n            x.append(plugin)\n\n    _plugin_cli_once = True\n    return x\n\n\ndef get_cli_scripts_descriptions():\n    \"Build the descriptions for command-line plugins.\"\n    for plugin in get_cli_script_plugins():\n        name = plugin.name\n        script_cls = plugin.load()\n\n        command = getattr(script_cls, \"command\")\n        description = getattr(script_cls, \"description\", \"\")\n        if description:\n            description = description.splitlines()[0]\n        if not description:\n            description = f\"(no description provided by plugin '{name}')\"\n\n        yield f\"sourmash scripts {command:16s} - {description}\"\n\n\ndef add_cli_scripts(parser):\n    \"Configure parsing for command-line plugins.\"\n    d = {}\n\n    for plugin in get_cli_script_plugins():\n        name = plugin.name\n        script_cls = plugin.load()\n\n        usage = getattr(script_cls, \"usage\", None)\n        description = getattr(script_cls, \"description\", None)\n        epilog = getattr(script_cls, \"epilog\", None)\n        formatter_class = getattr(script_cls, \"formatter_class\", argparse.HelpFormatter)\n\n        subparser = parser.add_parser(\n            script_cls.command,\n            usage=usage,\n            description=description,\n            epilog=epilog,\n            formatter_class=formatter_class,\n        )\n        debug_literal(\n            f\"cls_script plugin '{name}' adding command '{script_cls.command}'\"\n        )\n        obj = script_cls(subparser)\n        d[script_cls.command] = obj\n\n    return d\n\n\ndef list_all_plugins():\n    plugins = itertools.chain(_plugin_load_from, _plugin_save_to, _plugin_cli)\n    plugins = list(plugins)\n\n    if not plugins:\n        notify(\"\\n(no plugins detected)\\n\")\n\n    notify(\"\")\n    notify(\"the following plugins are installed:\")\n    notify(\"\")\n    notify(\n        f\"{'plugin type':<20s} {'from python module':<30s} {'v':<5s} {'entry point name':<20s}\"\n    )\n    notify(f\"{'-' * 20} {'-' * 30} {'-' * 5} {'-' * 20}\")\n\n    for plugin in plugins:\n        name = plugin.name\n        mod = plugin.module\n        version = plugin.dist.version\n        group = plugin.group\n\n        notify(f\"{group:<20s} {mod:<30s} {version:<5s} {name:<20s}\")\n"
  },
  {
    "path": "src/sourmash/save_load.py",
    "content": "\"\"\"\nIndex object/sigfile loading and signature saving code.\n\nThis is the middleware code responsible for loading and saving signatures\nin a variety of ways.\n\n---\n\nCommand-line functionality goes in sourmash_args.py.\n\nLow-level JSON reading/writing is in signature.py.\n\nIndex objects are implemented in the index submodule.\n\nPublic API:\n\n* load_file_as_index(filename, ...) -- load a sourmash.Index class\n* SaveSignaturesToLocation(filename) - bulk signature output\n\nAPIs for plugins to use:\n\n* class Base_SaveSignaturesToLocation - to implement a new output method.\n\nCTB TODO:\n* consider replacing ValueError with IndexNotLoaded in the future.\n\"\"\"\n\nimport sys\nimport os\nimport gzip\nfrom io import StringIO\nimport zipfile\nimport itertools\nimport traceback\n\nimport screed\nimport sourmash\n\nfrom . import plugins as sourmash_plugins\nfrom .logging import notify, debug_literal\nfrom .exceptions import IndexNotLoaded\n\nfrom .index.sqlite_index import load_sqlite_index, SqliteIndex\nfrom .index.revindex import DiskRevIndex\nfrom .sbtmh import load_sbt_index\nfrom .lca.lca_db import load_single_database\nfrom . import signature as sigmod\nfrom .index import LinearIndex, ZipFileLinearIndex, MultiIndex\nfrom .manifest import CollectionManifest\n\n\ndef load_file_as_index(filename, *, yield_all_files=False):\n    \"\"\"Load 'filename' as a database; generic database loader.\n\n    If 'filename' contains an SBT or LCA indexed database, or a regular\n    Zip file, will return the appropriate objects. If a Zip file and\n    yield_all_files=True, will try to load all files within zip, not just\n    .sig files.\n\n    If 'filename' is a JSON file containing one or more signatures, will\n    return an Index object containing those signatures.\n\n    If 'filename' is a directory, will load *.sig underneath\n    this directory into an Index object. If yield_all_files=True, will\n    attempt to load all files.\n    \"\"\"\n    return _load_database(filename, yield_all_files)\n\n\ndef SaveSignaturesToLocation(location):\n    \"\"\"\n    Provides a context manager that saves signatures in various output formats.\n\n    Usage:\n\n    with SaveSignaturesToLocation(filename_or_location) as save_sigs:\n       save_sigs.add(sig_obj)\n    \"\"\"\n    save_list = itertools.chain(_save_classes, sourmash_plugins.get_save_to_functions())\n    for priority, cls in sorted(save_list, key=lambda x: x[0]):\n        debug_literal(f\"trying to match save function {cls}, priority={priority}\")\n\n        if cls.matches(location):\n            debug_literal(f\"{cls} is a match!\")\n            return cls(location)\n\n    raise Exception(\n        f\"cannot determine how to open location {location} for saving; this should never happen!?\"\n    )\n\n\n### Implementation machinery for _load_databases\n\n\ndef _load_database(filename, traverse_yield_all, *, cache_size=None):\n    \"\"\"Load file as a database - list of signatures, LCA, SBT, etc.\n\n    Return Index object.\n\n    This is an internal function used by other functions in sourmash_args.\n    \"\"\"\n    loaded = False\n\n    # load plugins\n    plugin_fns = sourmash_plugins.get_load_from_functions()\n\n    # aggregate with default load_from functions & sort by priority\n    load_from_functions = sorted(itertools.chain(_loader_functions, plugin_fns))\n\n    # iterate through loader functions, sorted by priority; try them all.\n    # Catch ValueError & IndexNotLoaded but nothing else.\n    for priority, desc, load_fn in load_from_functions:\n        db = None\n        try:\n            debug_literal(\n                f\"_load_databases: trying loader fn - priority {priority} - '{desc}'\"\n            )\n            db = load_fn(\n                filename, traverse_yield_all=traverse_yield_all, cache_size=cache_size\n            )\n        except (ValueError, IndexNotLoaded):\n            debug_literal(f\"_load_databases: FAIL with ValueError: on fn {desc}.\")\n            debug_literal(traceback.format_exc())\n            debug_literal(\"(continuing past exception)\")\n\n        if db is not None:\n            loaded = True\n            debug_literal(\"_load_databases: success!\")\n            break\n\n    if loaded:\n        assert db is not None\n        return db\n\n    raise ValueError(f\"Error while reading signatures from '{filename}'.\")\n\n\n_loader_functions = []\n\n\ndef add_loader(name, priority):\n    \"decorator to add name/priority to _loader_functions\"\n\n    def dec_priority(func):\n        _loader_functions.append((priority, name, func))\n        return func\n\n    return dec_priority\n\n\n@add_loader(\"load from stdin\", 10)\ndef _load_stdin(filename, **kwargs):\n    \"Load collection from .sig file streamed in via stdin\"\n    db = None\n    if filename == \"-\":\n        # load as LinearIndex, then pass into MultiIndex to generate a\n        # manifest.\n        lidx = LinearIndex.load(sys.stdin, filename=\"-\")\n        db = MultiIndex.load((lidx,), (None,), parent=\"-\")\n\n    return db\n\n\n@add_loader(\"load from standalone manifest\", 30)\ndef _load_standalone_manifest(filename, **kwargs):\n    from sourmash.index import StandaloneManifestIndex\n\n    try:\n        idx = StandaloneManifestIndex.load(filename)\n    except gzip.BadGzipFile as exc:\n        raise IndexNotLoaded(exc)\n\n    return idx\n\n\n@add_loader(\"load from list of paths\", 50)\ndef _multiindex_load_from_pathlist(filename, **kwargs):\n    \"Load collection from a list of signature/database files\"\n    db = MultiIndex.load_from_pathlist(filename)\n\n    return db\n\n\n@add_loader(\"load from path (file or directory)\", 40)\ndef _multiindex_load_from_path(filename, **kwargs):\n    \"Load collection from a directory.\"\n    traverse_yield_all = kwargs[\"traverse_yield_all\"]\n    db = MultiIndex.load_from_path(filename, traverse_yield_all)\n\n    return db\n\n\n@add_loader(\"load SBT\", 60)\ndef _load_sbt(filename, **kwargs):\n    \"Load collection from an SBT.\"\n    cache_size = kwargs.get(\"cache_size\")\n\n    try:\n        db = load_sbt_index(filename, cache_size=cache_size)\n    except (FileNotFoundError, TypeError) as exc:\n        raise IndexNotLoaded(exc)\n\n    return db\n\n\n@add_loader(\"load revindex\", 70)\ndef _load_revindex(filename, **kwargs):\n    \"Load collection from an LCA database/reverse index.\"\n    db, _, _ = load_single_database(filename)\n    return db\n\n\n@add_loader(\"load collection from sqlitedb\", 20)\ndef _load_sqlite_db(filename, **kwargs):\n    return load_sqlite_index(filename)\n\n\n@add_loader(\"load collection from rocksdb\", 20)\ndef _load_disk_revindex(filename, **kwargs):\n    return DiskRevIndex(filename)\n\n\n@add_loader(\"load collection from zipfile\", 80)\ndef _load_zipfile(filename, **kwargs):\n    \"Load collection from a .zip file.\"\n    db = None\n    if filename.endswith(\".zip\"):\n        traverse_yield_all = kwargs[\"traverse_yield_all\"]\n        try:\n            db = ZipFileLinearIndex.load(\n                filename, traverse_yield_all=traverse_yield_all\n            )\n        except FileNotFoundError as exc:\n            # turn this into an IndexNotLoaded => proper exception handling by\n            # _load_database.\n            raise IndexNotLoaded(exc)\n\n    return db\n\n\n@add_loader(\"catch FASTA/FASTQ files and error\", 1000)\ndef _error_on_fastaq(filename, **kwargs):\n    \"This is a tail-end loader that checks for FASTA/FASTQ sequences => err.\"\n    success = False\n    try:\n        with screed.open(filename) as it:\n            _ = next(it)\n\n            success = True\n    except:\n        pass\n\n    if success:\n        raise Exception(\n            f\"Error while reading signatures from '{filename}' - got sequences instead! Is this a FASTA/FASTQ file?\"\n        )\n\n\n### Implementation machinery for SaveSignaturesToLocation\n\n\nclass Base_SaveSignaturesToLocation:\n    \"Base signature saving class. Track location (if any) and count.\"\n\n    def __init__(self, location):\n        self.location = location\n        self.count = 0\n\n    @classmethod\n    def matches(cls, location):\n        \"returns True when this class should handle a specific location\"\n        raise NotImplementedError\n\n    def __repr__(self):\n        raise NotImplementedError\n\n    def __len__(self):\n        return self.count\n\n    def open(self):\n        pass\n\n    def close(self):\n        pass\n\n    def __enter__(self):\n        \"provide context manager functionality\"\n        self.open()\n        return self\n\n    def __exit__(self, type, value, traceback):\n        \"provide context manager functionality\"\n        self.close()\n\n    def add(self, ss):\n        self.count += 1\n\n    def add_many(self, sslist):\n        for ss in sslist:\n            self.add(ss)\n\n\ndef _get_signatures_from_rust(siglist):\n    # this function deals with a disconnect between the way Rust\n    # and Python handle signatures; Python expects one\n    # minhash (and hence one md5sum) per signature, while\n    # Rust supports multiple. For now, go through serializing\n    # and deserializing the signature! See issue #1167 for more.\n    json_str = sigmod.save_signatures_to_json(siglist)\n    yield from sigmod.load_signatures_from_json(json_str)\n\n\nclass SaveSignatures_NoOutput(Base_SaveSignaturesToLocation):\n    \"Do not save signatures.\"\n\n    def __repr__(self):\n        return \"SaveSignatures_NoOutput()\"\n\n    @classmethod\n    def matches(cls, location):\n        return location is None\n\n    def open(self):\n        pass\n\n    def close(self):\n        pass\n\n\nclass SaveSignatures_Directory(Base_SaveSignaturesToLocation):\n    \"Save signatures within a directory, using md5sum names.\"\n\n    def __init__(self, location):\n        super().__init__(location)\n\n    def __repr__(self):\n        return f\"SaveSignatures_Directory('{self.location}')\"\n\n    @classmethod\n    def matches(cls, location):\n        \"anything ending in /\"\n        if location:\n            return location.endswith(\"/\")\n\n    def close(self):\n        pass\n\n    def open(self):\n        try:\n            os.mkdir(self.location)\n        except FileExistsError:\n            pass\n        except:\n            notify(f\"ERROR: cannot create signature output directory '{self.location}'\")\n            sys.exit(-1)\n\n    def add(self, ss):\n        super().add(ss)\n        md5 = ss.md5sum()\n\n        # don't overwrite even if duplicate md5sum\n        outname = os.path.join(self.location, f\"{md5}.sig.gz\")\n        if os.path.exists(outname):\n            i = 0\n            while 1:\n                outname = os.path.join(self.location, f\"{md5}_{i}.sig.gz\")\n                if not os.path.exists(outname):\n                    break\n                i += 1\n\n        with open(outname, \"wb\") as fp:\n            sigmod.save_signatures_to_json([ss], fp, compression=1)\n\n\nclass SaveSignatures_SqliteIndex(Base_SaveSignaturesToLocation):\n    \"Save signatures within a directory, using md5sum names.\"\n\n    def __init__(self, location):\n        super().__init__(location)\n        self.location = location\n        self.idx = None\n        self.cursor = None\n\n    @classmethod\n    def matches(cls, location):\n        \"anything ending in .sqldb\"\n        if location:\n            return location.endswith(\".sqldb\")\n\n    def __repr__(self):\n        return f\"SaveSignatures_SqliteIndex('{self.location}')\"\n\n    def close(self):\n        self.idx.commit()\n        self.cursor.execute(\"VACUUM\")\n        self.idx.close()\n\n    def open(self):\n        self.idx = SqliteIndex.create(self.location, append=True)\n        self.cursor = self.idx.cursor()\n\n    def add(self, add_sig):\n        for ss in _get_signatures_from_rust([add_sig]):\n            super().add(ss)\n            self.idx.insert(ss, cursor=self.cursor, commit=False)\n\n            # commit every 1000 signatures.\n            if self.count % 1000 == 0:\n                self.idx.commit()\n\n\nclass SaveSignatures_SigFile(Base_SaveSignaturesToLocation):\n    \"Save signatures to a .sig JSON file.\"\n\n    def __init__(self, location):\n        super().__init__(location)\n        self.keep = []\n        self.compress = 0\n        if self.location.endswith(\".gz\"):\n            self.compress = 1\n\n    @classmethod\n    def matches(cls, location):\n        # match anything that is not None or \"\"\n        return bool(location)\n\n    def __repr__(self):\n        return f\"SaveSignatures_SigFile('{self.location}')\"\n\n    def open(self):\n        pass\n\n    def close(self):\n        if self.location == \"-\":\n            sigmod.save_signatures_to_json(self.keep, sys.stdout)\n        else:\n            # text mode? encode in utf-8\n            mode = \"w\"\n            encoding = \"utf-8\"\n\n            # compressed? bytes & binary.\n            if self.compress:\n                encoding = None\n                mode = \"wb\"\n\n            with open(self.location, mode, encoding=encoding) as fp:\n                sigmod.save_signatures_to_json(self.keep, fp, compression=self.compress)\n\n    def add(self, ss):\n        super().add(ss)\n        self.keep.append(ss)\n\n\nclass SaveSignatures_ZipFile(Base_SaveSignaturesToLocation):\n    \"Save compressed signatures in an uncompressed Zip file.\"\n\n    def __init__(self, location):\n        super().__init__(location)\n        self.storage = None\n\n    @classmethod\n    def matches(cls, location):\n        \"anything ending in .zip\"\n        if location:\n            return location.endswith(\".zip\")\n\n    def __repr__(self):\n        return f\"SaveSignatures_ZipFile('{self.location}')\"\n\n    def close(self):\n        # finish constructing manifest object & save\n        manifest = CollectionManifest(self.manifest_rows)\n        manifest_name = \"SOURMASH-MANIFEST.csv\"\n\n        manifest_fp = StringIO()\n        manifest.write_to_csv(manifest_fp, write_header=True)\n        manifest_data = manifest_fp.getvalue().encode(\"utf-8\")\n\n        self.storage.save(manifest_name, manifest_data, overwrite=True, compress=True)\n\n        self.storage.flush()\n        self.storage.close()\n\n    def open(self):\n        from .sbt_storage import ZipStorage\n\n        do_create = True\n        if os.path.exists(self.location):\n            do_create = False\n\n        storage = None\n        try:\n            storage = ZipStorage(self.location, mode=\"w\")\n        except zipfile.BadZipFile:\n            pass\n\n        if storage is None:\n            raise ValueError(f\"File '{self.location}' cannot be opened as a zip file.\")\n\n        if not storage.subdir:\n            storage.subdir = \"signatures\"\n\n        # now, try to load manifest\n        try:\n            manifest_data = storage.load(\"SOURMASH-MANIFEST.csv\")\n        except (FileNotFoundError, KeyError):\n            # if file already exists must have manifest...\n            if not do_create:\n                raise ValueError(\n                    f\"Cannot add to existing zipfile '{self.location}' without a manifest\"\n                )\n            self.manifest_rows = []\n        else:\n            # success! decode manifest_data, create manifest rows => append.\n            manifest_data = manifest_data.decode(\"utf-8\")\n            manifest_fp = StringIO(manifest_data)\n            manifest = CollectionManifest.load_from_csv(manifest_fp)\n            self.manifest_rows = list(manifest._select())\n\n        self.storage = storage\n\n    def _exists(self, name):\n        try:\n            self.storage.load(name)\n            return True\n        except KeyError:\n            return False\n\n    def add(self, add_sig):\n        if not self.storage:\n            raise ValueError(\"this output is not open\")\n\n        for ss in _get_signatures_from_rust([add_sig]):\n            buf = sigmod.save_signatures_to_json([ss], compression=1)\n            md5 = ss.md5sum()\n\n            storage = self.storage\n            path = f\"{storage.subdir}/{md5}.sig.gz\"\n            location = storage.save(path, buf)\n\n            # update manifest\n            row = CollectionManifest.make_manifest_row(\n                ss, location, include_signature=False\n            )\n            self.manifest_rows.append(row)\n            super().add(ss)\n\n\n_save_classes = [\n    (10, SaveSignatures_NoOutput),\n    (20, SaveSignatures_Directory),\n    (30, SaveSignatures_ZipFile),\n    (40, SaveSignatures_SqliteIndex),\n    (1000, SaveSignatures_SigFile),\n]\n"
  },
  {
    "path": "src/sourmash/sbt.py",
    "content": "#!/usr/bin/env python\n\"\"\"\nAn implementation of sequence bloom trees, Solomon & Kingsford, 2015.\n\"\"\"\n\nfrom collections import namedtuple, Counter\nfrom collections.abc import Mapping\n\nfrom copy import copy\nimport json\nimport math\nimport os\nfrom random import randint, random\nimport sys\nfrom tempfile import NamedTemporaryFile\nfrom cachetools import Cache\nfrom io import StringIO\n\nfrom .exceptions import IndexNotSupported\nfrom .sbt_storage import FSStorage, IPFSStorage, RedisStorage, ZipStorage\nfrom .logging import error, notify, debug\nfrom .index import (\n    Index,\n    IndexSearchResult,\n    CollectionManifest,\n    _check_select_parameters,\n)\nfrom .picklist import passes_all_picklists\n\nfrom .nodegraph import Nodegraph, extract_nodegraph_info, calc_expected_collisions\n\nSTORAGES = {\n    \"FSStorage\": FSStorage,\n    \"IPFSStorage\": IPFSStorage,\n    \"RedisStorage\": RedisStorage,\n    \"ZipStorage\": ZipStorage,\n}\n\n\nNodePos = namedtuple(\"NodePos\", [\"pos\", \"node\"])\n\n\nclass GraphFactory:\n    \"\"\"Build new nodegraphs (Bloom filters) of a specific (fixed) size.\n\n    Parameters\n    ----------\n    ksize: int\n        k-mer size.\n    starting_size: int\n        size (in bytes) for each nodegraph table.\n    n_tables: int\n        number of nodegraph tables to be used.\n    \"\"\"\n\n    def __init__(self, ksize, starting_size, n_tables):\n        self.ksize = ksize\n        self.starting_size = starting_size\n        self.n_tables = n_tables\n\n    def __call__(self):\n        return Nodegraph(self.ksize, self.starting_size, self.n_tables)\n\n    def init_args(self):\n        return (self.ksize, self.starting_size, self.n_tables)\n\n\nclass _NodesCache(Cache):\n    \"\"\"A cache for SBT nodes that calls .unload() when the node is removed from cache.\n\n    This is adapted from the LFU cache in https://github.com/tkem/cachetools,\n    but removing the largest node ids first (those near the bottom/leaves of\n    the SBT).\n    \"\"\"\n\n    def __init__(self, maxsize, getsizeof=None):\n        Cache.__init__(self, maxsize, getsizeof)\n        self.__counter = Counter()\n\n    def __getitem__(self, key, cache_getitem=Cache.__getitem__):\n        value = cache_getitem(self, key)\n        self.__counter[key] -= 1\n        return value\n\n    def __setitem__(self, key, value, cache_setitem=Cache.__setitem__):\n        cache_setitem(self, key, value)\n        self.__counter[key] -= 1\n\n    def __delitem__(self, key, cache_delitem=Cache.__delitem__):\n        cache_delitem(self, key)\n        del self.__counter[key]\n\n    def popitem(self):\n        \"\"\"Remove and return the `(key, value)` pair least recently used.\"\"\"\n        try:\n            # Select least frequently used keys,\n            # limit to 50 items to avoid dealing with huge lists\n            common = self.__counter.most_common()[:50]\n\n            # common might include different values, so let's use\n            # only keys that have the same value as the first one\n            # (all those with the same count are least frequently used items)\n            count = common[0][1]\n\n            # we want to remove the item closest to the leaves,\n            # and since node ids increase as they get farther from the root\n            # we just need to select the maximum key/node id\n            (key, _) = max(c for c in common if c[1] == count)\n        except IndexError:\n            msg = f\"{self.__class__.__name__} is empty\"\n            raise KeyError(msg) from None\n        else:\n            value = self.pop(key)\n            value.unload()\n            return (key, value)\n\n\nclass SBT(Index):\n    \"\"\"A Sequence Bloom Tree implementation allowing generic internal nodes and leaves.\n\n    The default node and leaf format is a Bloom Filter (like the original implementation),\n    but we also provide a MinHash leaf class (in the sourmash.sbtmh.SigLeaf class)\n\n    Parameters\n    ----------\n    factory: Factory\n        Callable for generating new datastores for internal nodes.\n    d: int\n        Number of children for each internal node. Defaults to 2 (a binary tree)\n    storage: Storage, default: None\n        A Storage is any place where we can save and load data for the nodes.\n        If set to None, will use a FSStorage.\n    cache_size: int, default None\n        Number of internal nodes to cache in memory.\n        If set to None, will not remove any nodes from memory\n        (cache grows without bounds).\n\n    Notes\n    -----\n    We use two dicts to store the tree structure: One for the internal nodes,\n    and another for the leaves (datasets).\n    \"\"\"\n\n    is_database = True\n\n    def __init__(self, factory, *, d=2, storage=None, cache_size=None):\n        self.factory = factory\n        self._nodes = {}\n        self._missing_nodes = set()\n        self._leaves = {}\n        self.d = d\n        self.next_node = 0\n        self.storage = storage\n        if cache_size is None:\n            cache_size = sys.maxsize\n        self._nodescache = _NodesCache(maxsize=cache_size)\n        self._location = None\n        self.picklists = []\n        self.manifest = None\n\n    @property\n    def location(self):\n        return self._location\n\n    def signatures(self):\n        if self.manifest:\n            # if manifest, use it & load using direct path to storage.\n            # this will be faster when using picklists.\n            from .signature import load_one_signature_from_json\n\n            manifest = self.manifest\n\n            # iteratively select picklists; no other selection criteria\n            # apply to SBTs, since ksize etc are fixed as part of indexing.\n            for picklist in self.picklists:\n                manifest = manifest.select_to_manifest(picklist=picklist)\n\n            for loc in manifest.locations():\n                buf = self.storage.load(loc)\n                # if more than one signature can be in a file, we need\n                # to recheck picklists here.\n                ss = load_one_signature_from_json(buf)\n                yield ss\n        else:\n            # no manifest? iterate over all leaves.\n            for k in self.leaves():\n                ss = k.data\n                if passes_all_picklists(ss, self.picklists):\n                    yield ss\n\n    def _signatures_with_internal(self):\n        \"\"\"Return an iterator of tuples (ss, storage_path, internal_location).\n\n        Note: does not limit signatures to subsets.\n        \"\"\"\n        for k in self.leaves():\n            ss = k.data\n            yield ss, k._path\n\n    def select(\n        self,\n        ksize=None,\n        moltype=None,\n        num=0,\n        scaled=0,\n        containment=False,\n        abund=None,\n        picklist=None,\n        **kwargs,\n    ):\n        \"\"\"Make sure this database matches the requested requirements.\n\n        Will always raise ValueError if a requirement cannot be met.\n\n        The only tricky bit here is around downsampling: if the scaled\n        value being requested is higher than the signatures in the\n        SBT, we can use the SBT for containment but not for\n        similarity. This is because:\n\n        * if we are doing containment searches, the intermediate nodes\n          can still be used for calculating containment of signatures\n          with higher scaled values. This is because only hashes that match\n          in the higher range are used for containment scores.\n        * however, for similarity, _all_ hashes are used, and we cannot\n          implicitly downsample or necessarily estimate similarity if\n          the scaled values differ.\n        \"\"\"\n        _check_select_parameters(\n            ksize=ksize,\n            num=num,\n            moltype=moltype,\n            scaled=scaled,\n            containment=containment,\n            abund=abund,\n            picklist=picklist,\n            **kwargs,\n        )\n\n        # pull out a signature from this collection -\n        first_sig = next(iter(self.signatures()))\n        db_mh = first_sig.minhash\n\n        # check ksize.\n        if ksize is not None and db_mh.ksize != ksize:\n            raise ValueError(\n                f\"search ksize {ksize} is different from database ksize {db_mh.ksize}\"\n            )\n\n        # check moltype.\n        if moltype is not None and db_mh.moltype != moltype:\n            raise ValueError(\n                f\"search moltype {moltype} is different from database moltype {db_mh.moltype}\"\n            )\n\n        # containment requires 'scaled'.\n        if containment:\n            if not db_mh.scaled:\n                raise ValueError(\n                    \"cannot search this SBT for containment; signatures are not calculated with scaled\"\n                )\n\n        # 'num' and 'scaled' do not mix.\n        if num:\n            if not db_mh.num:\n                raise ValueError(\n                    \"this database was created with 'scaled' MinHash sketches, not 'num'\"\n                )\n            if num != db_mh.num:\n                raise ValueError(f\"num mismatch for SBT: num={num}, {db_mh.num}\")\n\n        if scaled:\n            if not db_mh.scaled:\n                raise ValueError(\n                    \"this database was created with 'num' MinHash sketches, not 'scaled'\"\n                )\n\n            # we can downsample SBTs for containment operations.\n            if scaled > db_mh.scaled and not containment:\n                raise ValueError(\n                    f\"search scaled value {scaled} is less than database scaled value of {db_mh.scaled}\"\n                )\n\n        if abund:\n            raise ValueError(\"SBT indices do not support sketches with abund=True\")\n\n        if picklist is not None:\n            self.picklists.append(picklist)\n            if len(self.picklists) > 1:\n                raise ValueError(\"we do not (yet) support multiple picklists for SBTs\")\n\n        return self\n\n    def new_node_pos(self, node):\n        # note: node is not actually used in this function! CTB\n        if not self._nodes:\n            self.next_node = 1\n            return 0\n\n        if not self._leaves:\n            self.next_node = 2\n            return 1\n\n        min_leaf = min(self._leaves.keys())\n\n        next_internal_node = None\n        if self.next_node <= min_leaf:\n            for i in range(min_leaf):\n                if all(\n                    (\n                        i not in self._nodes,\n                        i not in self._leaves,\n                        i not in self._missing_nodes,\n                    )\n                ):\n                    next_internal_node = i\n                    break\n\n        if next_internal_node is None:\n            self.next_node = max(self._leaves.keys()) + 1\n        else:\n            self.next_node = next_internal_node\n\n        return self.next_node\n\n    def insert(self, signature):\n        \"Add a new SourmashSignature in to the SBT.\"\n        from .sbtmh import SigLeaf\n\n        leaf = SigLeaf(signature.md5sum(), signature)\n        self.add_node(leaf)\n\n    def add_node(self, node):\n        pos = self.new_node_pos(node)\n\n        if pos == 0:  # empty tree; initialize w/node.\n            n = Node(self.factory, name=\"internal.\" + str(pos))\n            self._nodes[0] = n\n            pos = self.new_node_pos(node)\n\n        # Cases:\n        # 1) parent is a Leaf (already covered)\n        # 2) parent is a Node (with empty position available)\n        #    - add Leaf, update parent\n        # 3) parent is a Node (no position available)\n        #    - this is covered by case 1\n        # 4) parent is None\n        #    this can happen with d != 2, in this case create the parent node\n        p = self.parent(pos)\n        if isinstance(p.node, Leaf):\n            # Create a new internal node\n            # node and parent are children of new internal node\n            n = Node(self.factory, name=\"internal.\" + str(p.pos))\n            self._nodes[p.pos] = n\n\n            c1, c2 = self.children(p.pos)[:2]\n\n            self._leaves[c1.pos] = p.node\n            self._leaves[c2.pos] = node\n            del self._leaves[p.pos]\n\n            for child in (p.node, node):\n                child.update(n)\n        elif isinstance(p.node, Node):\n            self._leaves[pos] = node\n            node.update(p.node)\n        elif p.node is None:\n            n = Node(self.factory, name=\"internal.\" + str(p.pos))\n            self._nodes[p.pos] = n\n            c1 = self.children(p.pos)[0]\n            self._leaves[c1.pos] = node\n            node.update(n)\n        else:\n            # this branch should never be reached; put guard in to make sure!\n            assert 0\n\n        # update all parents!\n        p = self.parent(p.pos)\n        while p:\n            self._rebuild_node(p.pos)\n            node.update(self._nodes[p.pos])\n            p = self.parent(p.pos)\n\n    def _find_nodes(self, search_fn, *args, **kwargs):\n        \"Search the tree using `search_fn`.\"\n\n        unload_data = kwargs.get(\"unload_data\", True)\n\n        # initialize search queue with top node of tree\n        matches = []\n        visited, queue = set(), [0]\n\n        # while the queue is not empty, load each node and apply search\n        # function.\n        while queue:\n            node_p = queue.pop(0)\n\n            # repair while searching.\n            node_g = self._leaves.get(node_p, None)\n            if node_g is None:\n                if node_p in self._nodescache:\n                    node_g = self._nodescache[node_p]\n                else:\n                    node_g = self._nodes.get(node_p, None)\n                    if node_g is None:\n                        if node_p in self._missing_nodes:\n                            self._rebuild_node(node_p)\n                            node_g = self._nodes[node_p]\n                        else:\n                            continue\n                    self._nodescache[node_p] = node_g\n\n            # if we have not visited this node before,\n            if node_p not in visited:\n                visited.add(node_p)\n\n                # apply search fn. If return false, truncate search.\n                if search_fn(node_g, *args):\n                    # leaf node? it's a match!\n                    if isinstance(node_g, Leaf):\n                        matches.append(node_g)\n                    # internal node? descend.\n                    elif isinstance(node_g, Node):\n                        if kwargs.get(\"dfs\", True):  # defaults search to dfs\n                            for c in self.children(node_p):\n                                queue.insert(0, c.pos)\n                        else:  # bfs\n                            queue.extend(c.pos for c in self.children(node_p))\n\n                if unload_data:\n                    node_g.unload()\n\n        return matches\n\n    def find(self, search_fn, query, **kwargs):\n        \"\"\"\n        Do a Jaccard similarity or containment search, yield results.\n\n        Here 'search_fn' should be an instance of 'JaccardSearch'.\n\n        Queries with higher scaled values than the database\n        can still be used for containment search, but not for similarity\n        search. See SBT.select(...) for details.\n        \"\"\"\n        from .sbtmh import SigLeaf\n\n        search_fn.check_is_compatible(query)\n\n        query_mh = query.minhash\n\n        # figure out downsampling using the first leaf in the tree --\n        a_leaf = next(iter(self.leaves()))\n        tree_scaled = a_leaf.data.minhash.scaled\n\n        # scaled?\n        if tree_scaled:\n            assert query_mh.scaled\n\n            # pick the larger scaled of the query & node\n            scaled = max(query_mh.scaled, tree_scaled)\n            if query_mh.scaled < tree_scaled:\n                query_mh = query_mh.downsample(scaled=tree_scaled)\n\n            # provide function to downsample leaf_node as well\n            if scaled == tree_scaled:\n\n                def downsample_node(x):\n                    return x\n            else:\n\n                def downsample_node(node_mh):\n                    return node_mh.downsample(scaled=scaled)\n        else:\n            assert query_mh.num\n\n            # pick the smaller num of the query & node\n            min_num = min(query_mh.num, a_leaf.data.minhash.num)\n\n            # downsample query once:\n            if query_mh.num > min_num:\n                query_mh = query_mh.downsample(num=min_num)\n\n            # provide function to downsample leaf nodes.\n            if min_num == a_leaf.data.minhash.num:\n\n                def downsample_node(x):\n                    return x\n            else:\n\n                def downsample_node(node_mh):\n                    return node_mh.downsample(num=min_num)\n\n        query_size = len(query_mh)\n\n        # store scores here so we don't need to recalculate\n        results = {}\n\n        # construct a function to pass into ._find_nodes; this function\n        # will be used to prune tree searches based on internal node scores,\n        # in addition to finding leaf nodes.\n        def node_search(node, *args, **kwargs):\n            is_leaf = False\n\n            # leaf node? downsample so we can do signature comparison.\n            if isinstance(node, SigLeaf):\n                is_leaf = True\n\n                subj_mh = downsample_node(node.data.minhash)\n                subj_size = len(subj_mh)\n                subj_mh = subj_mh.flatten()\n\n                assert not subj_mh.track_abundance\n\n                shared_size, total_size = query_mh.intersection_and_union_size(subj_mh)\n            else:  # Node / Nodegraph by minhash comparison\n                # no downsampling needed --\n                shared_size = node.data.matches(query_mh)\n                subj_size = node.metadata.get(\"min_n_below\", -1)\n                if subj_size == -1:\n                    raise ValueError(\n                        \"ERROR: no min_n_below on this tree, cannot search.\"\n                    )\n                total_size = subj_size  # approximate; do not collect\n\n            # calculate score (exact, if leaf; approximate, if not)\n            score = search_fn.score_fn(query_size, shared_size, subj_size, total_size)\n\n            if search_fn.passes(score):\n                if is_leaf:  # terminal node? keep.\n                    if search_fn.collect(score, node.data):\n                        results[node.data] = score\n                        return True\n                else:  # it's a good internal node, keep.\n                    return True\n\n            return False\n\n        # & execute!\n        for n in self._find_nodes(node_search, **kwargs):\n            ss = n.data\n\n            # filter on picklists\n            if passes_all_picklists(ss, self.picklists):\n                yield IndexSearchResult(results[ss], ss, self.location)\n\n    def _rebuild_node(self, pos=0):\n        \"\"\"Recursively rebuilds an internal node (if it is not present).\n\n        Parameters\n        ----------\n        pos: int\n            node to be rebuild. Any internal node under it will be rebuild too.\n            If you want to rebuild all missing internal nodes you can use pos=0\n            (the default).\n        \"\"\"\n\n        node = self._nodes.get(pos, None)\n        if node is not None:\n            # this node was already build, skip\n            return\n\n        node = Node(self.factory, name=f\"internal.{pos}\")\n        self._nodes[pos] = node\n        for c in self.children(pos):\n            if c.pos in self._missing_nodes or isinstance(c.node, Leaf):\n                cnode = c.node\n                if cnode is None:\n                    self._rebuild_node(c.pos)\n                    cnode = self._nodes[c.pos]\n                cnode.update(node)\n\n    def parent(self, pos):\n        \"\"\"Return the parent of the node at position ``pos``.\n\n        If it is the root node (position 0), returns None.\n\n        Parameters\n        ----------\n        pos: int\n            Position of the node in the tree.\n\n        Returns\n        -------\n        NodePos :\n            A NodePos namedtuple with the position and content of the parent node.\n        \"\"\"\n\n        if pos == 0:\n            return None\n        p = int(math.floor((pos - 1) / self.d))\n        if p in self._leaves:\n            return NodePos(p, self._leaves[p])\n\n        node = self._nodes.get(p, None)\n        return NodePos(p, node)\n\n    def children(self, pos):\n        \"\"\"Return all children nodes for node at position ``pos``.\n\n        Parameters\n        ----------\n        pos: int\n            Position of the node in the tree.\n\n        Returns\n        -------\n        list of NodePos\n            A list of NodePos namedtuples with the position and content of all\n            children nodes.\n        \"\"\"\n        return [self.child(pos, c) for c in range(self.d)]\n\n    def child(self, parent, pos):\n        \"\"\"Return a child node at position ``pos`` under the ``parent`` node.\n\n        Parameters\n        ----------\n        parent: int\n            Parent node position in the tree.\n        pos: int\n            Position of the child one under the parent. Ranges from\n            [0, arity - 1], where arity is the arity of the SBT\n            (usually it is 2, a binary tree).\n\n        Returns\n        -------\n        NodePos\n            A NodePos namedtuple with the position and content of the\n            child node.\n        \"\"\"\n        cd = self.d * parent + pos + 1\n        if cd in self._leaves:\n            return NodePos(cd, self._leaves[cd])\n\n        node = self._nodes.get(cd, None)\n        return NodePos(cd, node)\n\n    def save(self, path, storage=None, sparseness=0.0, structure_only=False):\n        \"\"\"Saves an SBT description locally and node data to a storage.\n\n        Parameters\n        ----------\n        path : str\n            path to where the SBT description should be saved.\n        storage : Storage, optional\n            Storage to be used for saving node data.\n            Defaults to FSStorage (a hidden directory at the same level of path)\n        sparseness : float\n            How much of the internal nodes should be saved.\n            Defaults to 0.0 (save all internal nodes data),\n            can go up to 1.0 (don't save any internal nodes data)\n        structure_only: boolean\n            Write only the index schema and metadata, but not the data.\n            Defaults to False (save data too)\n\n        Returns\n        -------\n        str\n            full path to the new SBT description\n        \"\"\"\n        info = {}\n        info[\"d\"] = self.d\n        info[\"version\"] = 6\n        info[\"index_type\"] = self.__class__.__name__  # TODO: check\n\n        # choose between ZipStorage and FS (file system/directory) storage.\n        # default to ZipStorage, unless .sbt.json is specified in filename.\n        kind = None\n        if not path.endswith(\".sbt.json\"):\n            kind = \"Zip\"\n            if not path.endswith(\".sbt.zip\"):\n                path += \".sbt.zip\"\n            storage = ZipStorage(path, mode=\"w\")\n            backend = \"FSStorage\"\n\n            assert path[-8:] == \".sbt.zip\"\n            name = os.path.basename(path[:-8])\n\n            # align the storage prefix with what we do for FSStorage, below.\n            subdir = f\".sbt.{name}\"\n            storage_args = FSStorage(\"\", subdir, make_dirs=False).init_args()\n            storage.save(subdir + \"/\", b\"\")\n            storage.subdir = subdir\n            index_filename = os.path.abspath(path)\n        else:  # path.endswith('.sbt.json')\n            assert path.endswith(\".sbt.json\")\n            name = os.path.basename(path)\n            name = name[:-9]\n            index_filename = os.path.abspath(path)\n\n            if storage is None:\n                kind = \"FS\"\n                # default storage\n                location = os.path.dirname(index_filename)\n\n                # align subdir names with what we do above for ZipStorage\n                subdir = f\".sbt.{name}\"\n\n                # when we go to default of FSStorage, use full location for\n                # storage, e.g. location/.sbt.{name}/\n                storage = FSStorage(location, subdir)\n                index_filename = os.path.join(location, index_filename)\n\n            backend = [k for (k, v) in STORAGES.items() if v is type(storage)][0]\n            storage_args = storage.init_args()\n\n        info[\"storage\"] = {\"backend\": backend, \"args\": storage_args}\n        info[\"factory\"] = {\n            \"class\": GraphFactory.__name__,\n            \"args\": self.factory.init_args(),\n        }\n\n        nodes = {}\n        leaves = {}\n\n        internal_nodes = set(self._nodes).union(self._missing_nodes)\n        total_nodes = len(self) + len(internal_nodes)\n\n        manifest_rows = []\n        for n, (i, node) in enumerate(self):\n            if node is None:\n                continue\n\n            if isinstance(node, Node):\n                if random() - sparseness <= 0:\n                    continue\n\n            data = {\n                # TODO: start using md5sum instead?\n                \"filename\": os.path.basename(node.name),\n                \"name\": node.name,\n            }\n\n            try:\n                node.metadata.pop(\"max_n_below\")\n            except (AttributeError, KeyError):\n                pass\n\n            data[\"metadata\"] = node.metadata\n\n            if structure_only is False:\n                # trigger data loading before saving to the new place\n                node.data\n\n                node.storage = storage\n\n                if kind == \"Zip\":\n                    new_name = node.save(os.path.join(subdir, data[\"filename\"]))\n                    assert new_name.startswith(subdir + \"/\")\n\n                    # strip off prefix\n                    new_name = new_name[len(subdir) + 1 :]\n                    data[\"filename\"] = new_name\n                else:\n                    data[\"filename\"] = node.save(data[\"filename\"])\n\n            if isinstance(node, Node):\n                nodes[i] = data\n            else:\n                leaves[i] = data\n\n                row = node.make_manifest_row(data[\"filename\"])\n                if row:\n                    manifest_rows.append(row)\n\n            if n % 100 == 0:\n                notify(\n                    f\"{format(n + 1)} of {format(total_nodes)} nodes saved\", end=\"\\r\"\n                )\n\n        # now, save the index file and manifests.\n        #\n        # for zipfiles, they get saved in the zip file.\n        # for FSStorage, we use the storage.save function.\n        #\n        # for everything else (Redis, IPFS), the index gets saved locally.\n        # the nodes/leaves are saved/loaded from the datatabase, and\n        # the index is used to get their names for loading.\n        # (CTB: manifests are not yet supported for Redis and IPFS)\n        #\n        notify(\"Finished saving nodes, now saving SBT index file.\")\n        info[\"nodes\"] = nodes\n        info[\"signatures\"] = leaves\n\n        # finish constructing manifest object & save\n        manifest = CollectionManifest(manifest_rows)\n        manifest_name = f\"{name}.manifest.csv\"\n\n        manifest_fp = StringIO()\n        manifest.write_to_csv(manifest_fp, write_header=True)\n        manifest_data = manifest_fp.getvalue().encode(\"utf-8\")\n\n        if kind == \"Zip\":\n            manifest_name = os.path.join(storage.subdir, manifest_name)\n            manifest_path = storage.save(\n                manifest_name, manifest_data, overwrite=True, compress=True\n            )\n        elif kind == \"FS\":\n            manifest_name = manifest_name\n            manifest_path = storage.save(manifest_name, manifest_data, overwrite=True)\n        else:\n            manifest_path = None\n\n        if manifest_path:\n            info[\"manifest_path\"] = manifest_path\n\n        # now, save index.\n        tree_data = json.dumps(info).encode(\"utf-8\")\n\n        if kind == \"Zip\":\n            save_path = f\"{name}.sbt.json\"\n            storage.save(save_path, tree_data, overwrite=True)\n            storage.flush()\n        elif kind == \"FS\":\n            storage.save(index_filename, tree_data, overwrite=True)\n        else:\n            # save tree locally.\n            with open(index_filename, \"wb\") as tree_fp:\n                tree_fp.write(tree_data)\n\n        notify(f\"Finished saving SBT index, available at {format(index_filename)}\\n\")\n\n        return path\n\n    @classmethod\n    def load(\n        cls,\n        location,\n        *,\n        leaf_loader=None,\n        storage=None,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        \"\"\"Load an SBT description from a file.\n\n        Parameters\n        ----------\n        location : str\n            path to the SBT description.\n        leaf_loader : function, optional\n            function to load leaf nodes. Defaults to ``Leaf.load``.\n        storage : Storage, optional\n            Storage to be used for saving node data.\n            Defaults to FSStorage (a hidden directory at the same level of path)\n\n        Returns\n        -------\n        SBT\n            the SBT tree built from the description.\n        \"\"\"\n        tempfile = None\n        sbt_name = None\n        tree_data = None\n\n        if storage is None:\n            if ZipStorage.can_open(location):\n                storage = ZipStorage(location)\n            else:\n                if not location.endswith(\".sbt.zip\"):\n                    location2 = location + \".sbt.zip\"\n                    if ZipStorage.can_open(location2):\n                        storage = ZipStorage(location2)\n\n        if storage:\n            sbts = storage.list_sbts()\n            if len(sbts) == 1:\n                tree_data = storage.load(sbts[0])\n\n                tempfile = NamedTemporaryFile()\n\n                tempfile.write(tree_data)\n                tempfile.flush()\n\n                dirname = os.path.dirname(tempfile.name)\n                sbt_name = os.path.basename(tempfile.name)\n\n        if sbt_name is None:\n            dirname = os.path.dirname(os.path.abspath(location))\n            sbt_name = os.path.basename(location)\n            if sbt_name.endswith(\".sbt.json\"):\n                sbt_name = sbt_name[:-9]\n\n        sbt_fn = os.path.join(dirname, sbt_name)\n        if not sbt_fn.endswith(\".sbt.json\") and tempfile is None:\n            sbt_fn += \".sbt.json\"\n\n        try:\n            with open(sbt_fn) as fp:\n                jnodes = json.load(fp)\n        except NotADirectoryError as exc:\n            raise ValueError(str(exc))\n\n        if tempfile is not None:\n            tempfile.close()\n\n        version = 1\n        if isinstance(jnodes, Mapping):\n            version = jnodes[\"version\"]\n\n        if leaf_loader is None:\n            leaf_loader = Leaf.load\n\n        loaders = {\n            1: cls._load_v1,\n            2: cls._load_v2,\n            3: cls._load_v3,\n            4: cls._load_v4,\n            5: cls._load_v5,\n            6: cls._load_v6,\n        }\n\n        try:\n            loader = loaders[version]\n        except KeyError:\n            raise IndexNotSupported()\n\n        # if version >= 6:\n        #    if jnodes.get(\"index_type\", \"SBT\") == \"LocalizedSBT\":\n        #        loaders[6] = LocalizedSBT._load_v6\n\n        if version < 3 and storage is None:\n            storage = FSStorage(dirname, f\".sbt.{sbt_name}\")\n        elif storage is None:\n            klass = STORAGES[jnodes[\"storage\"][\"backend\"]]\n            if jnodes[\"storage\"][\"backend\"] == \"FSStorage\":\n                storage = FSStorage(dirname, jnodes[\"storage\"][\"args\"][\"path\"])\n            elif storage is None:\n                storage = klass(**jnodes[\"storage\"][\"args\"])\n\n        obj = loader(\n            jnodes,\n            leaf_loader,\n            dirname,\n            storage,\n            print_version_warning=print_version_warning,\n            cache_size=cache_size,\n        )\n        obj._location = location\n\n        if \"manifest_path\" in jnodes:\n            manifest_path = jnodes[\"manifest_path\"]\n            manifest_data = storage.load(manifest_path)\n            manifest_data = manifest_data.decode(\"utf-8\")\n            manifest_fp = StringIO(manifest_data)\n            obj.manifest = CollectionManifest.load_from_csv(manifest_fp)\n        else:\n            obj.manifest = None\n\n        return obj\n\n    @staticmethod\n    def _load_v1(\n        jnodes,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        if jnodes[0] is None:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        sample_bf = os.path.join(dirname, jnodes[0][\"filename\"])\n        ksize, tablesize, ntables = extract_nodegraph_info(sample_bf)[:3]\n        factory = GraphFactory(ksize, tablesize, ntables)\n\n        for i, jnode in enumerate(jnodes):\n            if jnode is None:\n                continue\n\n            jnode[\"filename\"] = os.path.join(dirname, jnode[\"filename\"])\n\n            if \"internal\" in jnode[\"name\"]:\n                jnode[\"factory\"] = factory\n                sbt_node = Node.load(jnode, storage)\n                sbt_nodes[i] = sbt_node\n            else:\n                sbt_node = leaf_loader(jnode, storage)\n                sbt_leaves[i] = sbt_node\n\n        tree = SBT(factory, cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n\n        return tree\n\n    @classmethod\n    def _load_v2(\n        cls,\n        info,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        nodes = {int(k): v for (k, v) in info[\"nodes\"].items()}\n\n        if nodes[0] is None:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        sample_bf = os.path.join(dirname, nodes[0][\"filename\"])\n        k, size, ntables = extract_nodegraph_info(sample_bf)[:3]\n        factory = GraphFactory(k, size, ntables)\n\n        for k, node in nodes.items():\n            if node is None:\n                continue\n\n            node[\"filename\"] = os.path.join(dirname, node[\"filename\"])\n\n            if \"internal\" in node[\"name\"]:\n                node[\"factory\"] = factory\n                sbt_node = Node.load(node, storage)\n                sbt_nodes[k] = sbt_node\n            else:\n                sbt_node = leaf_loader(node, storage)\n                sbt_leaves[k] = sbt_node\n\n        tree = cls(factory, d=info[\"d\"], cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n\n        return tree\n\n    @classmethod\n    def _load_v3(\n        cls,\n        info,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        nodes = {int(k): v for (k, v) in info[\"nodes\"].items()}\n\n        if not nodes:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        factory = GraphFactory(*info[\"factory\"][\"args\"])\n\n        max_node = 0\n        for k, node in nodes.items():\n            if node is None:\n                continue\n\n            if \"internal\" in node[\"name\"]:\n                node[\"factory\"] = factory\n                sbt_node = Node.load(node, storage)\n                sbt_nodes[k] = sbt_node\n            else:\n                sbt_node = leaf_loader(node, storage)\n                sbt_leaves[k] = sbt_node\n\n            max_node = max(max_node, k)\n\n        tree = cls(factory, d=info[\"d\"], storage=storage, cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n        tree._missing_nodes = {\n            i for i in range(max_node) if i not in sbt_nodes and i not in sbt_leaves\n        }\n\n        if print_version_warning:\n            error(\n                \"WARNING: this is an old index version, please run `sourmash migrate` to update it.\"\n            )\n            error(\n                \"WARNING: proceeding with execution, but it will take longer to finish!\"\n            )\n\n        tree._fill_min_n_below()\n\n        return tree\n\n    @classmethod\n    def _load_v4(\n        cls,\n        info,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        nodes = {int(k): v for (k, v) in info[\"nodes\"].items()}\n\n        if not nodes:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        factory = GraphFactory(*info[\"factory\"][\"args\"])\n\n        max_node = 0\n        for k, node in nodes.items():\n            if \"internal\" in node[\"name\"]:\n                node[\"factory\"] = factory\n                sbt_node = Node.load(node, storage)\n                sbt_nodes[k] = sbt_node\n            else:\n                sbt_node = leaf_loader(node, storage)\n                sbt_leaves[k] = sbt_node\n\n            max_node = max(max_node, k)\n\n        tree = cls(factory, d=info[\"d\"], storage=storage, cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n        tree._missing_nodes = {\n            i for i in range(max_node) if i not in sbt_nodes and i not in sbt_leaves\n        }\n\n        tree.next_node = max_node\n\n        return tree\n\n    @classmethod\n    def _load_v5(\n        cls,\n        info,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        nodes = {int(k): v for (k, v) in info[\"nodes\"].items()}\n        leaves = {int(k): v for (k, v) in info[\"leaves\"].items()}\n\n        if not leaves:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        if storage is None:\n            klass = STORAGES[info[\"storage\"][\"backend\"]]\n            if info[\"storage\"][\"backend\"] == \"FSStorage\":\n                storage = FSStorage(dirname, info[\"storage\"][\"args\"][\"path\"])\n            elif storage is None:\n                storage = klass(**info[\"storage\"][\"args\"])\n\n        factory = GraphFactory(*info[\"factory\"][\"args\"])\n\n        max_node = 0\n        for k, node in nodes.items():\n            node[\"factory\"] = factory\n            sbt_node = Node.load(node, storage)\n\n            sbt_nodes[k] = sbt_node\n            max_node = max(max_node, k)\n\n        for k, node in leaves.items():\n            sbt_leaf = leaf_loader(node, storage)\n            sbt_leaves[k] = sbt_leaf\n            max_node = max(max_node, k)\n\n        tree = cls(factory, d=info[\"d\"], storage=storage, cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n        tree._missing_nodes = {\n            i for i in range(max_node) if i not in sbt_nodes and i not in sbt_leaves\n        }\n\n        return tree\n\n    @classmethod\n    def _load_v6(\n        cls,\n        info,\n        leaf_loader,\n        dirname,\n        storage,\n        *,\n        print_version_warning=True,\n        cache_size=None,\n    ):\n        nodes = {int(k): v for (k, v) in info[\"nodes\"].items()}\n        leaves = {int(k): v for (k, v) in info[\"signatures\"].items()}\n\n        if not leaves:\n            raise ValueError(\"Empty tree!\")\n\n        sbt_nodes = {}\n        sbt_leaves = {}\n\n        if storage is None:\n            klass = STORAGES[info[\"storage\"][\"backend\"]]\n            if info[\"storage\"][\"backend\"] == \"FSStorage\":\n                storage = FSStorage(dirname, info[\"storage\"][\"args\"][\"path\"])\n            elif storage is None:\n                storage = klass(**info[\"storage\"][\"args\"])\n\n        factory = GraphFactory(*info[\"factory\"][\"args\"])\n\n        max_node = 0\n        for k, node in nodes.items():\n            node[\"factory\"] = factory\n            sbt_node = Node.load(node, storage)\n\n            sbt_nodes[k] = sbt_node\n            max_node = max(max_node, k)\n\n        for k, node in leaves.items():\n            sbt_leaf = leaf_loader(node, storage)\n            sbt_leaves[k] = sbt_leaf\n            max_node = max(max_node, k)\n\n        tree = cls(factory, d=info[\"d\"], storage=storage, cache_size=cache_size)\n        tree._nodes = sbt_nodes\n        tree._leaves = sbt_leaves\n        tree._missing_nodes = {\n            i for i in range(max_node) if i not in sbt_nodes and i not in sbt_leaves\n        }\n\n        return tree\n\n    def _fill_min_n_below(self):\n        \"\"\"\\\n        Propagate the smallest hash size below each node up the tree from\n        the leaves.\n        \"\"\"\n\n        def fill_min_n_below(node, *args, **kwargs):\n            original_min_n_below = node.metadata.get(\"min_n_below\", sys.maxsize)\n            min_n_below = original_min_n_below\n\n            children = kwargs[\"children\"]\n            for child in children:\n                if child.node is not None:\n                    if isinstance(child.node, Leaf):\n                        min_n_below = min(len(child.node.data.minhash), min_n_below)\n                    else:\n                        child_n = child.node.metadata.get(\"min_n_below\", sys.maxsize)\n                        min_n_below = min(child_n, min_n_below)\n\n            if min_n_below == 0:\n                min_n_below = 1\n\n            node.metadata[\"min_n_below\"] = min_n_below\n            return original_min_n_below != min_n_below\n\n        self._fill_up(fill_min_n_below)\n\n    def _fill_internal(self):\n        def fill_nodegraphs(node, *args, **kwargs):\n            children = kwargs[\"children\"]\n            for child in children:\n                if child.node is not None:\n                    child.node.update(node)\n            return True\n\n        self._fill_up(fill_nodegraphs)\n\n    def _fill_up(self, search_fn, *args, **kwargs):\n        visited, queue = set(), list(reversed(sorted(self._leaves.keys())))\n        debug(\"started filling up\")\n        processed = 0\n        while queue:\n            node_p = queue.pop(0)\n\n            parent = self.parent(node_p)\n            if parent is None:\n                # we are in the root, no more nodes available to search\n                assert len(queue) == 0\n                return\n\n            was_missing = False\n            if parent.node is None:\n                if parent.pos in self._missing_nodes:\n                    self._rebuild_node(parent.pos)\n                    parent = self.parent(node_p)\n                    was_missing = True\n                else:\n                    continue\n\n            siblings = self.children(parent.pos)\n\n            if node_p not in visited:\n                visited.add(node_p)\n                for sibling in siblings:\n                    visited.add(sibling.pos)\n                    try:\n                        queue.remove(sibling.pos)\n                    except ValueError:\n                        pass\n\n                if search_fn(parent.node, children=siblings, *args) or was_missing:\n                    queue.append(parent.pos)\n\n            processed += 1\n            if processed % 100 == 0:\n                debug(\"processed {}, in queue {}\", processed, len(queue), sep=\"\\r\")\n\n    def __len__(self):\n        return len(self._leaves)\n\n    def print_dot(self):\n        print(\n            \"\"\"\n        digraph G {\n        nodesep=0.3;\n        ranksep=0.2;\n        margin=0.1;\n        node [shape=ellipse];\n        edge [arrowsize=0.8];\n        \"\"\"\n        )\n\n        for i, node in self._nodes.items():\n            if isinstance(node, Node):\n                print(f'\"{node.name}\" [shape=box fillcolor=gray style=filled]')\n                for j, child in self.children(i):\n                    if child is not None:\n                        print(f'\"{node.name}\" -> \"{child.name}\"')\n        print(\"}\")\n\n    def print(self):\n        visited, stack = set(), [0]\n        while stack:\n            node_p = stack.pop()\n            node_g = self._nodes.get(node_p, None)\n            if node_p not in visited and node_g is not None:\n                visited.add(node_p)\n                depth = int(math.floor(math.log(node_p + 1, self.d)))\n                print(\" \" * 4 * depth, node_g)\n                if isinstance(node_g, Node):\n                    stack.extend(\n                        c.pos for c in self.children(node_p) if c.pos not in visited\n                    )\n\n    def __iter__(self):\n        for i, node in self._nodes.items():\n            yield (i, node)\n        for i, node in self._leaves.items():\n            yield (i, node)\n\n    def _parents(self, pos=0):\n        if pos == 0:\n            yield None\n        else:\n            p = self.parent(pos)\n            while p is not None:\n                yield p.pos\n                p = self.parent(p.pos)\n\n    def leaves(self, with_pos=False, unload_data=True):\n        for pos, data in self._leaves.items():\n            if with_pos:\n                yield (pos, data)\n            else:\n                yield data\n            if unload_data:\n                data.unload()\n\n    def combine(self, other):\n        larger, smaller = self, other\n        if len(other) > len(self):\n            larger, smaller = other, self\n\n        n = Node(self.factory, name=\"internal.0\", storage=self.storage)\n        larger._nodes[0].update(n)\n        smaller._nodes[0].update(n)\n        new_nodes = {}\n        new_nodes[0] = n\n\n        new_leaves = {}\n\n        levels = int(math.ceil(math.log(len(larger), self.d))) + 1\n        current_pos = 1\n        n_previous = 0\n        n_next = 1\n        for level in range(1, levels + 1):\n            for tree in (larger, smaller):\n                for pos in range(n_previous, n_next):\n                    if tree._nodes.get(pos, None) is not None:\n                        new_node = copy(tree._nodes[pos])\n                        new_node.name = f\"internal.{current_pos}\"\n                        new_nodes[current_pos] = new_node\n                    elif tree._leaves.get(pos, None) is not None:\n                        new_node = copy(tree._leaves[pos])\n                        new_leaves[current_pos] = new_node\n                    current_pos += 1\n            n_previous = n_next\n            n_next = n_previous + int(self.d**level)\n            current_pos = n_next\n\n        # TODO: do we want to return a new tree, or merge into this one?\n        self._nodes = new_nodes\n        self._leaves = new_leaves\n        return self\n\n\nclass Node:\n    \"Internal node of SBT.\"\n\n    def __init__(self, factory, name=None, path=None, storage=None):\n        self.name = name\n        self.storage = storage\n        self._factory = factory\n        self._data = None\n        self._path = path\n        self.metadata = {}\n\n    def __str__(self):\n        return f\"*Node:{self.name} [occupied: {self.data.n_occupied()}, fpr: {calc_expected_collisions(self.data, True, 1.1):.2}]\"\n\n    def save(self, path):\n        buf = self.data.to_bytes(compression=1)\n        return self.storage.save(path, buf, overwrite=True)\n\n    @property\n    def data(self):\n        if self._data is None:\n            if self._path is None:\n                self._data = self._factory()\n            else:\n                data = self.storage.load(self._path)\n                self._data = Nodegraph.from_buffer(data)\n        return self._data\n\n    @data.setter\n    def data(self, new_data):\n        self._data = new_data\n\n    def unload(self):\n        if self.storage:\n            # Don't unload data if there is no Storage\n            # TODO: Check that data is actually in the storage?\n            self._data = None\n\n    @staticmethod\n    def load(info, storage=None):\n        new_node = Node(\n            info[\"factory\"], name=info[\"name\"], path=info[\"filename\"], storage=storage\n        )\n        new_node.metadata = info.get(\"metadata\", {})\n        return new_node\n\n    def update(self, parent):\n        parent.data.update(self.data)\n        if \"min_n_below\" in self.metadata:\n            min_n_below = min(\n                parent.metadata.get(\"min_n_below\", sys.maxsize),\n                self.metadata.get(\"min_n_below\"),\n            )\n            if min_n_below == 0:\n                min_n_below = 1\n            parent.metadata[\"min_n_below\"] = min_n_below\n\n\nclass Leaf:\n    def __init__(self, metadata, data=None, name=None, storage=None, path=None):\n        self.metadata = metadata\n\n        if name is None:\n            name = metadata\n        self.name = name\n\n        self.storage = storage\n\n        self._data = data\n        self._path = path\n\n    def __str__(self):\n        return f\"**Leaf:{self.name} [occupied: {self.data.n_occupied()}, fpr: {calc_expected_collisions(self.data, True, 1.1):.2}] -> {self.metadata}\"\n\n    def make_manifest_row(self, location):\n        return None\n\n    @property\n    def data(self):\n        if self._data is None:\n            data = self.storage.load(self._path)\n            self._data = Nodegraph.from_buffer(data)\n        return self._data\n\n    @data.setter\n    def data(self, new_data):\n        self._data = new_data\n\n    def unload(self):\n        if self.storage:\n            # Don't unload data if there is no Storage\n            # TODO: Check that data is actually in the storage?\n            self._data = None\n\n    def save(self, path):\n        buf = self.data.to_bytes(compression=1)\n        return self.storage.save(path, buf)\n\n    def update(self, parent):\n        parent.data.update(self.data)\n\n    @classmethod\n    def load(cls, info, storage=None):\n        return cls(\n            info[\"metadata\"], name=info[\"name\"], path=info[\"filename\"], storage=storage\n        )\n\n\ndef filter_distance(filter_a, filter_b, n=1000):\n    \"\"\"\n    Compute a heuristic distance per bit between two Bloom filters.\n\n    Parameters\n    ----------\n    filter_a : Nodegraph\n    filter_b : Nodegraph\n    n        : int\n        Number of positions to compare (in groups of 8)\n\n    Returns\n    -------\n    float\n        The distance between both filters (from 0.0 to 1.0)\n    \"\"\"\n    from numpy import array\n\n    A = filter_a.graph.get_raw_tables()\n    B = filter_b.graph.get_raw_tables()\n    distance = 0\n    for q, p in zip(A, B):\n        a = array(q, copy=False)\n        b = array(p, copy=False)\n        for i in map(lambda x: randint(0, len(a)), range(n)):\n            distance += sum(\n                map(\n                    int,\n                    [\n                        not bool((a[i] >> j) & 1) ^ bool((b[i] >> j) & 1)\n                        for j in range(8)\n                    ],\n                )\n            )\n    return distance / (8.0 * len(A) * n)\n\n\ndef convert_cmd(name, backend):\n    \"Convert an SBT to use a different back end.\"\n    from .sbtmh import SigLeaf\n\n    options = backend.split(\"(\")\n    backend = options.pop(0)\n    backend = backend.lower().strip(\"'\")\n\n    kwargs = {}\n\n    if options:\n        print(options)\n        options = options[0].split(\")\")\n        options = [options.pop(0)]\n        # options = {}\n    else:\n        options = []\n\n    if backend.lower() in (\"ipfs\", \"ipfsstorage\"):\n        backend = IPFSStorage\n    elif backend.lower() in (\"redis\", \"redisstorage\"):\n        backend = RedisStorage\n    elif backend.lower() in (\"zip\", \"zipstorage\"):\n        backend = ZipStorage\n        kwargs[\"mode\"] = \"w\"\n    elif backend.lower() in (\"fs\", \"fsstorage\"):\n        backend = FSStorage\n        if options:\n            options = [os.path.dirname(options[0]), os.path.basename(options[0])]\n        else:\n            # this is the default for SBT v2\n            tag = \".sbt.\" + os.path.basename(name)\n            if tag.endswith(\".sbt.json\"):\n                tag = tag[:-9]\n            path = os.path.dirname(name)\n            options = [path, tag]\n\n    else:\n        error(f\"backend not recognized: {backend}\")\n\n    with backend(*options, **kwargs) as storage:\n        sbt = SBT.load(name, leaf_loader=SigLeaf.load)\n        sbt.save(name, storage=storage)\n"
  },
  {
    "path": "src/sourmash/sbt_storage.py",
    "content": "import abc\nfrom io import BytesIO\nimport os\nimport shutil\nimport sys\nimport tarfile\nfrom tempfile import NamedTemporaryFile\nimport zipfile\nfrom abc import ABC\nfrom pathlib import Path\nimport warnings\n\nfrom ._lowlevel import ffi, lib\nfrom .utils import RustObject, rustcall, decode_str\nfrom .minhash import to_bytes\n\n\nclass Storage(ABC):\n    @abc.abstractmethod\n    def save(self, path, content, *, overwrite=False):\n        pass\n\n    @abc.abstractmethod\n    def load(self, path):\n        pass\n\n    def list_sbts(self):\n        return []\n\n    def init_args(self):\n        return {}\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, type, value, traceback):\n        self.close()\n\n    def close(self):\n        pass\n\n    def can_open(self, location):\n        return False\n\n\nclass FSStorage(Storage):\n    def __init__(self, location, subdir, make_dirs=True):\n        self.location = location\n        self.subdir = subdir\n\n        if make_dirs:\n            fullpath = os.path.join(location, subdir)\n            if not os.path.exists(fullpath):\n                os.makedirs(fullpath)\n\n    def init_args(self):\n        return {\"path\": self.subdir}\n\n    def save(self, path, content, overwrite=False):\n        \"Save a node/leaf.\"\n        newpath = path\n        fullpath = os.path.join(self.location, self.subdir, path)\n\n        if os.path.exists(fullpath):\n            # check for content, if same return path,\n            with open(fullpath, \"rb\") as f:\n                old_content = f.read()\n                if old_content == content:\n                    return path\n\n            if overwrite:\n                pass  #  fine to overwrite file!\n            else:\n                # different content, need to find new path to save\n                newpath = None\n                n = 0\n                while newpath is None:\n                    testpath = f\"{fullpath}_{n}\"\n                    if os.path.exists(testpath):\n                        n += 1\n                    else:\n                        # testpath is available, use it as newpath\n                        newpath = f\"{path}_{n}\"\n\n        fullpath = os.path.join(self.location, self.subdir, newpath)\n        with open(fullpath, \"wb\") as f:\n            f.write(content)\n\n        return newpath\n\n    def load(self, path):\n        path = Path(self.location) / self.subdir / path\n        return path.read_bytes()\n\n\nclass ZipStorage(RustObject, Storage):\n    __dealloc_func__ = lib.zipstorage_free\n\n    def __init__(self, path, *, mode=\"r\"):\n        if mode == \"w\":\n            self.__inner = _RwZipStorage(path)\n        else:\n            self.__inner = None\n            path = os.path.abspath(path)\n            self._objptr = rustcall(lib.zipstorage_new, to_bytes(path), len(path))\n\n    @staticmethod\n    def can_open(location):\n        return zipfile.is_zipfile(location)\n\n    @property\n    def path(self):\n        if self.__inner:\n            return self.__inner.path\n        return decode_str(self._methodcall(lib.zipstorage_path))\n\n    @property\n    def subdir(self):\n        if self.__inner:\n            return self.__inner.subdir\n        return decode_str(self._methodcall(lib.zipstorage_subdir))\n\n    @subdir.setter\n    def subdir(self, value):\n        if self.__inner:\n            self.__inner.subdir = value\n        else:\n            self._methodcall(lib.zipstorage_set_subdir, to_bytes(value), len(value))\n\n    def _filenames(self):\n        if not self._objptr:\n            return self.__inner._filenames()\n\n        size = ffi.new(\"uintptr_t *\")\n        paths_ptr = self._methodcall(lib.zipstorage_filenames, size)\n        size = size[0]\n\n        paths = []\n        for i in range(size):\n            path = decode_str(paths_ptr[i][0])\n            paths.append(path)\n\n        return paths\n\n    def save(self, path, content, *, overwrite=False, compress=False):\n        if self.__inner:\n            return self.__inner.save(\n                path, content, overwrite=overwrite, compress=compress\n            )\n        raise NotImplementedError()\n\n    def load(self, path):\n        if not self._objptr:\n            return self.__inner.load(path)\n\n        try:\n            size = ffi.new(\"uintptr_t *\")\n            rawbuf = self._methodcall(\n                lib.zipstorage_load, to_bytes(path), len(path), size\n            )\n            size = size[0]\n\n            rawbuf = ffi.gc(rawbuf, lambda o: lib.nodegraph_buffer_free(o, size), size)\n            buf = ffi.buffer(rawbuf, size)\n\n            # TODO: maybe avoid the [:] here, it triggers a copy...\n            return buf[:]\n        except ValueError:\n            raise FileNotFoundError(path)\n\n    def list_sbts(self):\n        if self.__inner:\n            return self.__inner.list_sbts()\n\n        size = ffi.new(\"uintptr_t *\")\n        paths_ptr = self._methodcall(lib.zipstorage_list_sbts, size)\n        size = size[0]\n\n        paths = []\n        for i in range(size):\n            path = decode_str(paths_ptr[i][0])\n            paths.append(path)\n\n        return paths\n\n    def init_args(self):\n        return {\"path\": self.path}\n\n    def flush(self):\n        if self.__inner:\n            self.__inner.flush()\n\n    def close(self):\n        if self.__inner:\n            self.__inner.close()\n\n    @staticmethod\n    def can_open(location):\n        return zipfile.is_zipfile(location)\n\n\nclass _RwZipStorage(Storage):\n    def __init__(self, path):\n        self.path = os.path.abspath(path)\n\n        dirname = os.path.dirname(self.path)\n        if not os.path.exists(dirname):\n            os.makedirs(dirname)\n\n        self.bufferzip = None\n\n        # Turns out we can't delete/modify an entry in a zipfile easily,\n        # so we need to check some things:\n        if not os.path.exists(self.path):\n            # If the file doesn't exist open it in write mode.\n            self.zipfile = zipfile.ZipFile(\n                path, mode=\"w\", compression=zipfile.ZIP_STORED\n            )\n        else:\n            # If it exists, open it in read mode and prepare a buffer for\n            # new/duplicated items. During close() there are checks to see\n            # how the original file needs to be updated (append new items,\n            # deal with duplicates, and so on)\n            self.zipfile = zipfile.ZipFile(path, \"r\")\n            self.bufferzip = zipfile.ZipFile(BytesIO(), mode=\"w\")\n\n        self.subdir = \"\"\n        subdirs = [f for f in self.zipfile.namelist() if f.endswith(\"/\")]\n        if len(subdirs) == 1:\n            self.subdir = subdirs[0]\n\n    def _filenames(self):\n        return [info.filename for info in self.zipfile.infolist()]\n\n    def _content_matches(self, zf, path, content):\n        info = zf.getinfo(path)\n        entry_content = zf.read(info)\n        if entry_content == content:\n            return True\n        return False\n\n    def _generate_filename(self, zf, path, content):\n        try:\n            matches = self._content_matches(zf, path, content)\n            if matches:\n                return path, False\n        except KeyError:\n            # entry not there yet, use that path\n            return path, True\n\n        # content does not match - generate new path based on path\n        newpath = None\n        n = 0\n        while newpath is None:\n            testpath = f\"{path}_{n}\"\n            try:\n                matches = self._content_matches(zf, testpath, content)\n                if matches:\n                    return testpath, False\n                else:\n                    n += 1\n            except KeyError:\n                return testpath, True\n\n        assert 0  # should never get here!\n\n    def _write_to_zf(self, zf, path, content, *, compress=False):\n        compress_type = zipfile.ZIP_STORED\n        if compress:\n            compress_type = zipfile.ZIP_DEFLATED\n\n        # save to zipfile\n        zf.writestr(path, content, compress_type=compress_type)\n\n        # set permissions\n        zi = zf.getinfo(path)\n        perms = 0o444 << 16  # give a+r access\n        if path.endswith(\"/\"):\n            perms = 0o755 << 16  # directories get u+rwx, a+rx\n        zi.external_attr = perms\n\n    def save(self, path, content, *, overwrite=False, compress=False):\n        # ignore UserWarnings for duplicate filenames.\n        with warnings.catch_warnings():\n            warnings.simplefilter(\"ignore\")\n\n            # First try to save to self.zipfile, if it is not writable\n            # or would introduce duplicates then try to save it in the buffer\n            if overwrite:\n                newpath = path\n                do_write = True\n            else:\n                newpath, do_write = self._generate_filename(self.zipfile, path, content)\n            if do_write:\n                try:\n                    self._write_to_zf(self.zipfile, newpath, content, compress=compress)\n                except (ValueError, RuntimeError):\n                    # Can't write in the zipfile, write in buffer instead\n                    # CTB: do we need to generate a new filename wrt to the\n                    # bufferzip, too? Not sure this code is working as intended...\n                    if self.bufferzip:\n                        self._write_to_zf(\n                            self.bufferzip, newpath, content, compress=compress\n                        )\n                    else:\n                        # Throw error, can't write the data\n                        raise ValueError(\"can't write data\")\n\n        return newpath\n\n    def _load_from_zf(self, zf, path):\n        # we repeat these steps for self.zipfile and self.bufferzip,\n        # so better to have an auxiliary method\n        try:\n            return zf.read(path)\n        except KeyError:\n            path = os.path.join(self.subdir, path)\n            return zf.read(path)\n\n    def load(self, path):\n        try:\n            return self._load_from_zf(self.zipfile, path)\n        except KeyError:\n            if self.bufferzip:\n                return self._load_from_zf(self.bufferzip, path)\n            else:\n                raise FileNotFoundError(path)\n\n    def close(self):\n        # TODO: this is not ideal; checking for zipfile.fp is looking at\n        # internal implementation details from CPython...\n\n        # might not have self.zipfile if was invalid zipfile and __init__\n        # failed.\n        if hasattr(self, \"zipfile\"):\n            if self.zipfile is not None or self.bufferzip is not None:\n                self.flush(keep_closed=True)\n                self.zipfile.close()\n                self.zipfile = None\n\n    def flush(self, *, keep_closed=False):\n        # This is a bit complicated, but we have to deal with new data\n        # (if the original zipfile is read-only) and possible duplicates.\n\n        if self.bufferzip is None:\n            # The easy case: close (to force flushing) and reopen the zipfile\n            if self.zipfile is not None:\n                self.zipfile.close()\n                if not keep_closed:\n                    self.zipfile = zipfile.ZipFile(\n                        self.path, mode=\"a\", compression=zipfile.ZIP_STORED\n                    )\n        else:\n            # The complicated one. Need to consider:\n            # - Is there data in the buffer?\n            # - If there is, is any of it\n            #    * duplicated?\n            #    * new data?\n            buffer_names = set(self.bufferzip.namelist())\n            zf_names = set(self.zipfile.namelist())\n            if buffer_names:\n                new_data = buffer_names - zf_names\n                duplicated = buffer_names & zf_names\n\n                if duplicated:\n                    # bad news, need to create new file...\n                    # create a temporary file to write the final version,\n                    # which will be copied to the right place later.\n                    tempfile = NamedTemporaryFile(delete=False)\n                    final_file = zipfile.ZipFile(tempfile, mode=\"w\")\n                    all_data = buffer_names.union(zf_names)\n\n                    for item in all_data:\n                        if item in duplicated or item in buffer_names:\n                            # we prioritize writing data from the buffer to the\n                            # final file\n                            self._write_to_zf(\n                                final_file, item, self.bufferzip.read(item)\n                            )\n                        else:\n                            # it is only in the zipfile, so write from it\n                            self._write_to_zf(final_file, item, self.zipfile.read(item))\n\n                    # close the files, remove the old one and copy the final\n                    # file to the right place.\n                    self.zipfile.close()\n                    final_file.close()\n                    os.unlink(self.path)\n                    shutil.move(tempfile.name, self.path)\n                    if not keep_closed:\n                        self.zipfile = zipfile.ZipFile(\n                            self.path, mode=\"a\", compression=zipfile.ZIP_STORED\n                        )\n                elif new_data:\n                    # Since there is no duplicated data, we can\n                    # reopen self.zipfile in append mode and write the new data\n                    self.zipfile.close()\n                    if keep_closed:\n                        raise Exception(\"unexpected error\")\n                    else:\n                        zf = zipfile.ZipFile(\n                            self.path, mode=\"a\", compression=zipfile.ZIP_STORED\n                        )\n                    for item in new_data:\n                        self._write_to_zf(zf, item, self.bufferzip.read(item))\n                    self.zipfile = zf\n            # finally, close the buffer and release memory\n            self.bufferzip.close()\n            self.bufferzip = None\n\n    def list_sbts(self):\n        return [f for f in self.zipfile.namelist() if f.endswith(\".sbt.json\")]\n\n    def __del__(self):\n        self.close()\n\n\nclass IPFSStorage(Storage):\n    def __init__(self, pin_on_add=True, **kwargs):\n        import ipfshttpclient\n\n        self.ipfs_args = kwargs\n        self.pin_on_add = pin_on_add\n        self.api = ipfshttpclient.connect(**self.ipfs_args)\n\n    def save(self, path, content, *, overwrite=False):\n        new_obj = self.api.add_bytes(content)\n        if self.pin_on_add:\n            self.api.pin.add(new_obj)\n        return new_obj\n\n        # TODO: the above solution is quick and dirty.\n        # we actually want something more organized,\n        # like putting all the generated objects inside the same dir.\n        # Check this call using the files API for an example.\n        # api.files_write(\"/test/file\", io.BytesIO(b\"hi\"), create=True)\n        #\n        # This is also required to bring the IPFSStorage closer to what the\n        # ZipStorage is doing now.\n\n    def load(self, path):\n        return self.api.cat(path)\n\n    def init_args(self):\n        return self.ipfs_args\n\n    def __exit__(self, type, value, traceback):\n        # TODO: do nothing for now,\n        # but we actually want something more organized,\n        # like putting all the generated objects inside the same dir.\n        # Use the files API,\n        # add files without flush(),\n        # and then flush it here?\n        pass\n\n\nclass RedisStorage(Storage):\n    def __init__(self, **kwargs):\n        import redis\n\n        self.redis_args = kwargs\n        self.conn = redis.Redis(**self.redis_args)\n\n    def save(self, path, content, *, overwrite=False):\n        if not isinstance(content, bytes):\n            content = bytes(content)\n        self.conn.set(path, content)\n        return path\n\n    def load(self, path):\n        return self.conn.get(path)\n\n    def init_args(self):\n        # TODO: do we want to remove stuff like password from here?\n        return self.redis_args\n\n    def __exit__(self, type, value, traceback):\n        pass\n"
  },
  {
    "path": "src/sourmash/sbtmh.py",
    "content": "from io import BytesIO\nimport sys\n\nfrom .sbt import Leaf, SBT, GraphFactory\nfrom . import signature\n\n\ndef load_sbt_index(filename, *, print_version_warning=True, cache_size=None):\n    \"Load and return an SBT index.\"\n    return SBT.load(\n        filename,\n        leaf_loader=SigLeaf.load,\n        print_version_warning=print_version_warning,\n        cache_size=cache_size,\n    )\n\n\ndef create_sbt_index(bloom_filter_size=1e5, n_children=2):\n    \"Create an empty SBT index.\"\n    factory = GraphFactory(1, bloom_filter_size, 4)\n    tree = SBT(factory, d=n_children)\n    return tree\n\n\ndef search_sbt_index(tree, query, threshold):\n    \"\"\"\\\n    Search an SBT index `tree` with signature `query` for matches above\n    `threshold`.\n\n    Usage:\n\n        for match_sig, similarity in search_sbt_index(tree, query, threshold):\n           ...\n    \"\"\"\n    for score, match, _ in tree.search(query, threshold=threshold, unload_data=True):\n        yield match, score\n\n\nclass SigLeaf(Leaf):\n    def __str__(self):\n        return f\"**Leaf:{self.name} -> {self.metadata}\"\n\n    def make_manifest_row(self, loc):\n        from .index import CollectionManifest\n\n        row = CollectionManifest.make_manifest_row(self.data, loc, include_signature=0)\n        return row\n\n    def save(self, path):\n        # this is here only for triggering the property load\n        # before we reopen the file (and overwrite the previous\n        # content...)\n        self.data\n\n        buf = signature.save_signatures_to_json([self.data], compression=1)\n        return self.storage.save(path, buf)\n\n    def update(self, parent):\n        mh = self.data.minhash\n        parent.data.update(mh)\n        min_n_below = parent.metadata.get(\"min_n_below\", sys.maxsize)\n        min_n_below = min(len(mh), min_n_below)\n\n        if min_n_below == 0:\n            min_n_below = 1\n\n        parent.metadata[\"min_n_below\"] = min_n_below\n\n    @property\n    def data(self):\n        if self._data is None:\n            buf = BytesIO(self.storage.load(self._path))\n            self._data = signature.load_one_signature_from_json(buf)\n        return self._data\n\n    @data.setter\n    def data(self, new_data):\n        self._data = new_data\n"
  },
  {
    "path": "src/sourmash/search.py",
    "content": "\"\"\"\nCode for searching collections of signatures.\n\"\"\"\n\nimport csv\nimport numpy as np\nfrom enum import Enum\nfrom dataclasses import dataclass\n\nfrom .minhash import MinHash\nfrom .signature import SourmashSignature\nfrom .sketchcomparison import FracMinHashComparison, NumMinHashComparison\n\n\ndef calc_threshold_from_bp(threshold_bp, scaled, query_size):\n    \"\"\"\n    Convert threshold_bp (threshold in estimated bp) to\n    fraction of query & minimum number of hashes needed.\n    \"\"\"\n    threshold = 0.0\n    n_threshold_hashes = 0\n\n    if threshold_bp:\n        if threshold_bp < 0:\n            raise TypeError(\"threshold_bp must be non-negative\")\n\n        # if we have a threshold_bp of N, then that amounts to N/scaled\n        # hashes:\n        n_threshold_hashes = float(threshold_bp) / scaled\n\n        # that then requires the following containment:\n        threshold = n_threshold_hashes / query_size\n\n        # is it too high to ever match?\n        if threshold > 1.0:\n            raise ValueError(\"requested threshold_bp is unattainable with this query\")\n    return threshold, n_threshold_hashes\n\n\nclass SearchType(Enum):\n    JACCARD = 1\n    CONTAINMENT = 2\n    MAX_CONTAINMENT = 3\n\n\ndef make_jaccard_search_query(\n    *, do_containment=False, do_max_containment=False, best_only=False, threshold=None\n):\n    \"\"\"\\\n    Make a \"flat\" search object for Jaccard search & containment.\n    \"\"\"\n    if do_containment and do_max_containment:\n        raise TypeError(\"'do_containment' and 'do_max_containment' cannot both be True\")\n\n    # configure search - containment? ignore abundance? best only?\n    search_cls = JaccardSearch\n    if best_only:\n        search_cls = JaccardSearchBestOnly\n\n    if do_containment:\n        search_obj = search_cls(SearchType.CONTAINMENT, threshold)\n    elif do_max_containment:\n        search_obj = search_cls(SearchType.MAX_CONTAINMENT, threshold)\n    else:\n        search_obj = search_cls(SearchType.JACCARD, threshold)\n\n    return search_obj\n\n\ndef make_containment_query(query_mh, threshold_bp, *, best_only=True):\n    \"Make a search object for containment, with threshold_bp.\"\n    if not query_mh:\n        raise ValueError(\"query is empty!?\")\n\n    scaled = query_mh.scaled\n    if not scaled:\n        raise TypeError(\"query signature must be calculated with scaled\")\n\n    # are we setting a threshold?\n    threshold, _ = calc_threshold_from_bp(threshold_bp, scaled, len(query_mh))\n\n    if best_only:\n        search_obj = JaccardSearchBestOnly(SearchType.CONTAINMENT, threshold=threshold)\n    else:\n        search_obj = JaccardSearch(SearchType.CONTAINMENT, threshold=threshold)\n\n    return search_obj\n\n\nclass JaccardSearch:\n    \"\"\"\n    A class used by Index classes for searching/gathering.\n    \"\"\"\n\n    def __init__(self, search_type, threshold=None):\n        \"Constructor. Takes type of search, and optional threshold.\"\n        score_fn = None\n        require_scaled = False\n\n        if search_type == SearchType.JACCARD:\n            score_fn = self.score_jaccard\n        elif search_type == SearchType.CONTAINMENT:\n            score_fn = self.score_containment\n            require_scaled = True\n        elif search_type == SearchType.MAX_CONTAINMENT:\n            score_fn = self.score_max_containment\n            require_scaled = True\n        self.score_fn = score_fn\n        self.require_scaled = require_scaled\n\n        if threshold is None:\n            threshold = 0\n        self.threshold = float(threshold)\n\n    def check_is_compatible(self, sig):\n        \"\"\"\n        Is this query compatible with this type of search? Raise TypeError\n        if not.\n        \"\"\"\n        if self.require_scaled:\n            if not sig.minhash.scaled:\n                raise TypeError(\"this search requires a scaled signature\")\n\n        if sig.minhash.track_abundance:\n            raise TypeError(\"this search cannot be done with an abund signature\")\n\n    def passes(self, score):\n        \"\"\"Return True if this score meets or exceeds the threshold.\n\n        Note: this can be used whenever a score or estimate is available\n        (e.g. internal nodes on an SBT). `collect(...)`, below, decides\n        whether a particular signature should be collected, and/or can\n        update the threshold (used for BestOnly behavior).\n        \"\"\"\n        if score and score >= self.threshold:\n            return True\n        return False\n\n    def collect(self, score, match_sig):\n        \"Return True if this match should be collected.\"\n        return True\n\n    def score_jaccard(self, query_size, shared_size, subject_size, total_size):\n        \"Calculate Jaccard similarity.\"\n        if total_size == 0:\n            return 0\n        return shared_size / total_size\n\n    def score_containment(self, query_size, shared_size, subject_size, total_size):\n        \"Calculate Jaccard containment.\"\n        if query_size == 0:\n            return 0\n        return shared_size / query_size\n\n    def score_max_containment(self, query_size, shared_size, subject_size, total_size):\n        \"Calculate Jaccard max containment.\"\n        min_denom = min(query_size, subject_size)\n        if min_denom == 0:\n            return 0\n        return shared_size / min_denom\n\n\nclass JaccardSearchBestOnly(JaccardSearch):\n    \"A subclass of JaccardSearch that implements best-only.\"\n\n    def collect(self, score, match):\n        \"Raise the threshold to the best match found so far.\"\n        self.threshold = max(self.threshold, score)\n        return True\n\n\n@dataclass\nclass BaseResult:\n    \"\"\"\n    Base class for sourmash search results.\n    Since we need some additional info (scaled vs num minhashes) to\n    properly initialize a SketchComparison, this class doesn't actually do\n    anything other than define some functions needed by *Result classes.\n    \"\"\"\n\n    query: SourmashSignature\n    match: SourmashSignature\n    filename: str = None\n    ignore_abundance: bool = False  # optionally ignore abundances\n    # need these for scaled result comparisons\n    estimate_ani_ci: bool = False\n    ani_confidence: float = 0.95\n    threshold_bp: int = None\n    cmp_scaled: int = None\n    write_cols: list = None\n    potential_false_negative: bool = False\n\n    def init_result(self):\n        self.mh1 = self.query.minhash\n        self.mh2 = self.match.minhash\n\n    def build_fracminhashcomparison(self):\n        self.cmp = FracMinHashComparison(\n            self.mh1,\n            self.mh2,\n            cmp_scaled=self.cmp_scaled,\n            threshold_bp=self.threshold_bp,\n            ignore_abundance=self.ignore_abundance,\n            estimate_ani_ci=self.estimate_ani_ci,\n            ani_confidence=self.ani_confidence,\n        )\n        self.cmp_scaled = self.cmp.cmp_scaled\n        self.query_scaled = self.mh1.scaled\n        self.match_scaled = self.mh2.scaled\n        self.size_may_be_inaccurate = self.cmp.size_may_be_inaccurate\n\n    def build_numminhashcomparison(self, cmp_num=None):\n        self.cmp = NumMinHashComparison(\n            self.mh1, self.mh2, cmp_num=cmp_num, ignore_abundance=self.ignore_abundance\n        )\n        self.cmp_num = self.cmp.cmp_num\n        self.query_num = self.mh1.num\n        self.match_num = self.mh2.num\n        self.size_may_be_inaccurate = self.cmp.size_may_be_inaccurate\n\n    def get_cmpinfo(self):\n        # grab signature /minhash metadata\n        # note, with so few columns written for current SearchResult, we could move these to PrefetchResult initialization\n        # I've left here for now because I think at some point we want to output more info from search..\n        self.ksize = self.mh1.ksize\n        self.moltype = self.mh1.moltype\n        self.query_name = self.query.name\n        self.query_filename = self.query.filename\n        self.query_md5 = self.query.md5sum()\n        self.match_name = self.match.name\n        self.match_filename = self.match.filename\n        # sometimes filename is not set in sig (match_filename is None),\n        # and `search` is able to pass in the filename.\n        if self.filename is None and self.match_filename is not None:\n            self.filename = self.match_filename\n        self.match_md5 = self.match.md5sum()\n        # set these from self.match_*\n        self.md5 = self.match_md5\n        self.name = self.match_name\n        # could define in PrefetchResult instead, same reasoning as above\n        self.query_abundance = self.mh1.track_abundance\n        self.match_abundance = self.mh2.track_abundance\n        self.query_n_hashes = len(self.mh1)\n        self.match_n_hashes = len(self.mh2)\n\n    @property\n    def pass_threshold(self):\n        return self.cmp.pass_threshold\n\n    def shorten_md5(self, md5):\n        return md5[:8]\n\n    def to_write(self, columns=[]):\n        # convert comparison attrs into a dictionary\n        # that can be used by csv dictwriter\n        info = {\n            k: v for k, v in self.__dict__.items() if k in columns and v is not None\n        }\n        return info\n\n    def init_dictwriter(self, csv_handle):\n        # initialize the csv, return writer (do once)\n        w = csv.DictWriter(csv_handle, fieldnames=self.write_cols)\n        w.writeheader()\n        return w\n\n    def prep_result(self):\n        # shorten or modify any columns that need modifying\n        self.query_md5 = self.shorten_md5(self.query_md5)\n\n    def write(self, w):\n        # write result dictionary using csv dictwriter\n        self.prep_result()\n        w.writerow(self.to_write(columns=w.fieldnames))\n\n    @property\n    def resultdict(self):\n        # instead of writing, just return dictionary of what we want to write\n        self.prep_result()\n        return self.to_write(columns=self.write_cols)\n\n\n@dataclass\nclass SearchResult(BaseResult):\n    \"\"\"\n    SearchResult class supports 'sourmash search' operations.\n    \"\"\"\n\n    similarity: float = None\n    cmp_num: int = None\n    searchtype: SearchType = None\n\n    # columns for standard SearchResult output\n    search_write_cols = [\n        \"similarity\",\n        \"md5\",\n        \"filename\",\n        \"name\",  # here we use 'filename'\n        \"query_filename\",\n        \"query_name\",\n        \"query_md5\",\n        \"ani\",\n    ]\n\n    ci_cols = [\"ani_low\", \"ani_high\"]\n\n    search_write_cols_ci = search_write_cols + ci_cols\n\n    def init_sigcomparison(self):\n        self.init_result()\n        if any([self.mh1.scaled, self.mh2.scaled]):\n            self.build_fracminhashcomparison()\n        elif any([self.mh1.num, self.mh2.num]):\n            self.build_numminhashcomparison(cmp_num=self.cmp_num)\n        self.get_cmpinfo()  # grab comparison metadata\n\n    def __post_init__(self):\n        self.init_sigcomparison()  # build sketch comparison\n        self.check_similarity()\n        if self.cmp_scaled is not None and self.searchtype is not None:\n            self.estimate_search_ani()\n        # define columns we want to write\n        self.write_cols = self.search_write_cols\n        if self.estimate_ani_ci:\n            self.write_cols = self.search_write_cols_ci\n\n    def check_similarity(self):\n        # for now, require similarity for SearchResult\n        # future: consider returning SearchResult *during* search, and passing SearchType in.\n        # then allow similarity to be calculated here according to SearchType.\n        if self.similarity is None:\n            raise ValueError(\"Error: Must provide 'similarity' for SearchResult.\")\n\n    def estimate_search_ani(self):\n        # future: could estimate ANI from abund searches if we want (use query containment?)\n        if self.cmp_scaled is None:\n            raise TypeError(\"Error: ANI can only be estimated from scaled signatures.\")\n        if self.searchtype == SearchType.CONTAINMENT:\n            self.cmp.estimate_ani_from_mh1_containment_in_mh2(\n                containment=self.similarity\n            )\n            self.ani = self.cmp.ani_from_mh1_containment_in_mh2\n            if self.estimate_ani_ci:\n                self.ani_low = self.cmp.ani_from_mh1_containment_in_mh2_low\n                self.ani_high = self.cmp.ani_from_mh1_containment_in_mh2_high\n        elif self.searchtype == SearchType.MAX_CONTAINMENT:\n            self.cmp.estimate_max_containment_ani()\n            self.ani = self.cmp.max_containment_ani\n            if self.estimate_ani_ci:\n                self.ani_low = self.cmp.max_containment_ani_low\n                self.ani_high = self.cmp.max_containment_ani_high\n        elif self.searchtype == SearchType.JACCARD:\n            self.cmp.estimate_jaccard_ani(jaccard=self.similarity)\n            self.jaccard_ani_untrustworthy = self.cmp.jaccard_ani_untrustworthy\n            self.ani = self.cmp.jaccard_ani\n        # this can be set from any of the above\n        self.potential_false_negative = self.cmp.potential_false_negative\n\n\n@dataclass\nclass PrefetchResult(BaseResult):\n    \"\"\"\n    PrefetchResult class supports 'sourmash prefetch' operations.\n    \"\"\"\n\n    # current prefetch columns\n    prefetch_write_cols = [\n        \"intersect_bp\",\n        \"jaccard\",\n        \"max_containment\",\n        \"f_query_match\",\n        \"f_match_query\",\n        \"match_filename\",\n        \"match_name\",  # here we use 'match_filename'\n        \"match_md5\",\n        \"match_bp\",\n        \"query_filename\",\n        \"query_name\",\n        \"query_md5\",\n        \"query_bp\",\n        \"ksize\",\n        \"moltype\",\n        \"scaled\",\n        \"query_n_hashes\",\n        \"query_abundance\",\n        \"query_containment_ani\",\n        \"match_containment_ani\",\n        \"average_containment_ani\",\n        \"max_containment_ani\",\n        \"potential_false_negative\",\n    ]  #'match_abundance'\n\n    ci_cols = [\n        \"query_containment_ani_low\",\n        \"query_containment_ani_high\",\n        \"match_containment_ani_low\",\n        \"match_containment_ani_high\",\n    ]\n\n    prefetch_write_cols_ci = prefetch_write_cols + ci_cols\n\n    def init_sigcomparison(self):\n        # shared prefetch/gather initialization\n        self.init_result()\n        if all([self.mh1.scaled, self.mh2.scaled]):\n            self.build_fracminhashcomparison()\n        else:\n            raise TypeError(\n                \"Error: prefetch and gather results must be between scaled signatures.\"\n            )\n        self.get_cmpinfo()  # grab comparison metadata\n        self.intersect_bp = self.cmp.total_unique_intersect_hashes\n        self.max_containment = self.cmp.max_containment\n        self.query_bp = self.mh1.unique_dataset_hashes\n        self.match_bp = self.mh2.unique_dataset_hashes\n        self.threshold = self.threshold_bp\n        self.estimate_containment_ani()\n\n    def estimate_containment_ani(self):\n        self.cmp.estimate_all_containment_ani()\n        self.query_containment_ani = self.cmp.ani_from_mh1_containment_in_mh2\n        self.match_containment_ani = self.cmp.ani_from_mh2_containment_in_mh1\n        self.average_containment_ani = self.cmp.avg_containment_ani\n        self.max_containment_ani = self.cmp.max_containment_ani\n        self.potential_false_negative = self.cmp.potential_false_negative\n        if self.estimate_ani_ci:\n            self.handle_ani_ci()\n\n    def handle_ani_ci(self):\n        self.query_containment_ani_low = self.cmp.ani_from_mh1_containment_in_mh2_low\n        self.query_containment_ani_high = self.cmp.ani_from_mh1_containment_in_mh2_high\n        self.match_containment_ani_low = self.cmp.ani_from_mh2_containment_in_mh1_low\n        self.match_containment_ani_high = self.cmp.ani_from_mh2_containment_in_mh1_high\n\n    def build_prefetch_result(self):\n        # unique prefetch values\n        self.jaccard = self.cmp.jaccard\n        self.f_query_match = (\n            self.cmp.mh2_containment_in_mh1\n        )  # db_mh.contained_by(query_mh)\n        self.f_match_query = (\n            self.cmp.mh1_containment_in_mh2\n        )  # query_mh.contained_by(db_mh)\n        # set write columns for prefetch result\n        self.write_cols = self.prefetch_write_cols\n        if self.estimate_ani_ci:\n            self.write_cols = self.prefetch_write_cols_ci\n\n    def __post_init__(self):\n        self.init_sigcomparison()\n        self.build_prefetch_result()\n\n    def prep_prefetch_result(self):\n        # explicitly name so we can use this within GatherResult too\n        self.scaled = self.cmp_scaled\n        # in prefetch, we shorten all md5's\n        self.query_md5 = self.shorten_md5(self.query_md5)\n        self.md5 = self.shorten_md5(self.md5)\n        self.match_md5 = self.shorten_md5(self.match_md5)\n\n    def prep_result(self):\n        # overwrite base prep_result\n        self.prep_prefetch_result()\n\n    @property\n    def prefetchresultdict(self):\n        # just return dictionary of what we want to write\n        self.prep_prefetch_result()\n        return self.to_write(columns=self.write_cols)\n\n\n@dataclass\nclass GatherResult(PrefetchResult):\n    gather_querymh: MinHash = None\n    gather_result_rank: int = None\n    orig_query_len: int = None\n    orig_query_abunds: list = None\n    sum_weighted_found: int = None\n    total_weighted_hashes: int = None\n    noident_len: int = 0\n\n    gather_write_cols = [\n        \"intersect_bp\",\n        \"f_orig_query\",\n        \"f_match\",\n        \"f_unique_to_query\",\n        \"f_unique_weighted\",\n        \"average_abund\",\n        \"median_abund\",\n        \"std_abund\",\n        \"filename\",\n        \"name\",\n        \"md5\",\n        \"f_match_orig\",\n        \"unique_intersect_bp\",\n        \"gather_result_rank\",\n        \"remaining_bp\",\n        \"query_filename\",\n        \"query_name\",\n        \"query_md5\",\n        \"query_bp\",\n        \"ksize\",\n        \"moltype\",\n        \"scaled\",\n        \"query_n_hashes\",\n        \"query_abundance\",\n        \"query_containment_ani\",\n        \"match_containment_ani\",\n        \"average_containment_ani\",\n        \"max_containment_ani\",\n        \"potential_false_negative\",\n        \"n_unique_weighted_found\",\n        \"sum_weighted_found\",\n        \"total_weighted_hashes\",\n    ]\n\n    ci_cols = [\n        \"query_containment_ani_low\",\n        \"query_containment_ani_high\",\n        \"match_containment_ani_low\",\n        \"match_containment_ani_high\",\n    ]\n\n    gather_write_cols_ci = gather_write_cols + ci_cols\n\n    def init_gathersketchcomparison(self):\n        # compare remaining gather hashes with match. Force at cmp_scaled. Force match flatten(), bc we don't need abunds.\n        self.gather_comparison = FracMinHashComparison(\n            self.gather_querymh, self.match.minhash.flatten()\n        )\n\n    def check_gatherresult_input(self):\n        # check we have what we need:\n        if self.cmp_scaled is None:\n            raise ValueError(\n                \"Error: must provide comparison scaled value ('cmp_scaled') for GatherResult\"\n            )\n        if self.gather_querymh is None:\n            raise ValueError(\n                \"Error: must provide current gather sketch (remaining hashes) for GatherResult\"\n            )\n        if self.gather_result_rank is None:\n            raise ValueError(\"Error: must provide 'gather_result_rank' to GatherResult\")\n        if not self.total_weighted_hashes:  # catch total_weighted_hashes = 0 as well\n            raise ValueError(\n                \"Error: must provide sum of all abundances ('total_weighted_hashes') to GatherResult\"\n            )\n        if not self.orig_query_abunds:\n            raise ValueError(\n                \"Error: must provide original query abundances ('orig_query_abunds') to GatherResult\"\n            )\n\n    def build_gather_result(self):\n        # build gather-specific attributes\n\n        # the 'query' that is passed into gather is all _matched_ hashes, after subtracting noident_mh\n        # this affects estimation of original query information, and requires us to pass in orig_query_len and orig_query_abunds.\n        # we also need to overwrite self.query_bp, self.query_n_hashes, and self.query_abundance\n        # todo: find a better solution?\n        self.query_bp = self.orig_query_len * self.query.minhash.scaled\n        self.query_n_hashes = self.orig_query_len\n\n        # calculate intersection with query hashes:\n        self.unique_intersect_bp = self.gather_comparison.total_unique_intersect_hashes\n\n        # calculate fraction of subject match with orig query\n        self.f_match_orig = self.cmp.mh2_containment_in_mh1\n\n        # calculate fractions wrt first denominator - genome size\n        self.f_match = (\n            self.gather_comparison.mh2_containment_in_mh1\n        )  # unique match containment\n        self.f_orig_query = len(self.cmp.intersect_mh) / self.orig_query_len\n        assert (\n            self.gather_comparison.intersect_mh.contained_by(\n                self.gather_comparison.mh1_cmp\n            )\n            == 1.0\n        )\n\n        # calculate fractions wrt second denominator - metagenome size\n        assert (\n            self.gather_comparison.intersect_mh.contained_by(\n                self.gather_comparison.mh2_cmp\n            )\n            == 1.0\n        )\n        self.f_unique_to_query = (\n            len(self.gather_comparison.intersect_mh) / self.orig_query_len\n        )\n\n        # here, need to make sure to use the mh1_cmp (bc was downsampled to cmp_scaled)\n        self.remaining_bp = (\n            self.noident_len\n            + self.gather_comparison.mh1_cmp.unique_dataset_hashes\n            - self.gather_comparison.total_unique_intersect_hashes\n        )\n\n        # calculate stats on abundances, if desired.\n        self.average_abund, self.median_abund, self.std_abund = None, None, None\n        if not self.ignore_abundance:\n            self.query_weighted_unique_intersection = (\n                self.gather_comparison.weighted_intersection(\n                    from_abundD=self.orig_query_abunds\n                )\n            )\n            self.average_abund = self.query_weighted_unique_intersection.mean_abundance\n            self.median_abund = self.query_weighted_unique_intersection.median_abundance\n            self.std_abund = self.query_weighted_unique_intersection.std_abundance\n            # 'query' will be flattened by default. reset track abundance if we have abunds\n            self.query_abundance = (\n                self.query_weighted_unique_intersection.track_abundance\n            )\n            # calculate scores weighted by abundances\n            self.n_unique_weighted_found = (\n                self.query_weighted_unique_intersection.sum_abundances\n            )\n            self.f_unique_weighted = (\n                self.n_unique_weighted_found / self.total_weighted_hashes\n            )\n        else:\n            self.f_unique_weighted = self.f_unique_to_query\n            self.query_abundance = False\n\n    def __post_init__(self):\n        self.check_gatherresult_input()\n        self.init_sigcomparison()  # initialize original sketch vs match sketch comparison (inherited from PrefetchResult)\n        self.init_gathersketchcomparison()  # initialize remaining gather sketch vs match sketch comparison\n        self.build_gather_result()  # build gather-specific attributes\n        # set write columns for prefetch result\n        self.write_cols = self.gather_write_cols\n        if self.estimate_ani_ci:\n            self.write_cols = self.gather_write_cols_ci\n\n    def prep_gather_result(self):\n        # for gather, we only shorten the query_md5\n        self.scaled = self.cmp_scaled\n        self.query_md5 = self.shorten_md5(self.query_md5)\n\n    def prep_result(self):\n        # overwrite base prep_result\n        self.prep_gather_result()\n\n    @property\n    def gatherresultdict(self):\n        # just return dictionary of what we want to write\n        self.prep_gather_result()\n        return self.to_write(columns=self.write_cols)\n\n    @property\n    def prefetchresultdict(self):\n        # get all prefetch cols from gatherresult\n        prefetch_cols = self.prefetch_write_cols\n        if self.estimate_ani_ci:\n            prefetch_cols = self.prefetch_write_cols_ci\n        self.jaccard = self.cmp.jaccard\n        self.f_query_match = (\n            self.cmp.mh2_containment_in_mh1\n        )  # db_mh.contained_by(query_mh)\n        self.f_match_query = (\n            self.cmp.mh1_containment_in_mh2\n        )  # query_mh.contained_by(db_mh)\n        self.prep_prefetch_result()\n        return self.to_write(columns=prefetch_cols)\n\n\ndef format_bp(bp):\n    \"Pretty-print bp information.\"\n    bp = float(bp)\n    if bp < 500:\n        return f\"{bp:.0f} bp\"\n    elif bp <= 500e3:\n        return f\"{round(bp / 1e3, 1):.1f} kbp\"\n    elif bp < 500e6:\n        return f\"{round(bp / 1e6, 1):.1f} Mbp\"\n    elif bp < 500e9:\n        return f\"{round(bp / 1e9, 1):.1f} Gbp\"\n    return \"???\"\n\n\ndef search_databases_with_flat_query(query, databases, **kwargs):\n    results = []\n    found_md5 = set()\n\n    for db in databases:\n        search_iter = db.search(query, **kwargs)\n        for score, match, filename in search_iter:\n            md5 = match.md5sum()\n            if md5 not in found_md5:\n                results.append((score, match, filename))\n                found_md5.add(md5)\n\n    # sort results on similarity (reverse)\n    results.sort(key=lambda x: -x[0])\n\n    # redefine searchtype and pass in here\n    # repetitive/not optimal - would it be better to produce SearchResult from db.search?\n    estimate_ani_ci = False\n    search_type = SearchType.JACCARD\n    if kwargs.get(\"do_containment\"):\n        search_type = SearchType.CONTAINMENT\n        if kwargs.get(\"estimate_ani_ci\"):\n            estimate_ani_ci = True\n    elif kwargs.get(\"do_max_containment\"):\n        search_type = SearchType.MAX_CONTAINMENT\n        if kwargs.get(\"estimate_ani_ci\"):\n            estimate_ani_ci = True\n\n    x = []\n    for score, match, filename in results:\n        x.append(\n            SearchResult(\n                query,\n                match,\n                similarity=score,\n                filename=filename,\n                searchtype=search_type,\n                estimate_ani_ci=estimate_ani_ci,\n            )\n        )\n    return x\n\n\ndef search_databases_with_abund_query(query, databases, **kwargs):\n    results = []\n    found_md5 = set()\n\n    if kwargs.get(\"do_containment\") or kwargs.get(\"do_max_containment\"):\n        raise TypeError(\"containment searches cannot be done with abund sketches\")\n\n    for db in databases:\n        search_iter = db.search_abund(\n            query, **kwargs\n        )  # could return SearchResult here instead of tuple?\n        for score, match, filename in search_iter:\n            md5 = match.md5sum()\n            if md5 not in found_md5:\n                results.append((score, match, filename))\n                found_md5.add(md5)\n\n    # sort results on similarity (reverse)\n    results.sort(key=lambda x: -x[0])\n\n    x = []\n    for score, match, filename in results:\n        x.append(SearchResult(query, match, similarity=score, filename=filename))\n    return x\n\n\n###\n### gather code\n###\n\n\ndef _find_best(counters, query, threshold_bp):\n    \"\"\"\n    Search for the best containment, return precisely one match.\n    \"\"\"\n    best_result = None\n    best_intersect_mh = None\n\n    # find the best score across multiple counters, without consuming\n    for counter in counters:\n        result = counter.peek(query.minhash, threshold_bp=threshold_bp)\n        if result:\n            (sr, intersect_mh) = result\n\n            if best_result is None or sr.score > best_result.score:\n                best_result = sr\n                best_intersect_mh = intersect_mh\n\n    if best_result:\n        # remove the best result from each counter\n        for counter in counters:\n            counter.consume(best_intersect_mh)\n\n        # and done!\n        return best_result, best_intersect_mh\n    return None, None\n\n\nclass GatherDatabases:\n    \"Iterator object for doing gather/min-set-cov.\"\n\n    def __init__(\n        self,\n        query,\n        counters,\n        *,\n        threshold_bp=0,\n        ignore_abundance=False,\n        noident_mh=None,\n        ident_mh=None,\n        estimate_ani_ci=False,\n    ):\n        # track original query information for later usage?\n        track_abundance = query.minhash.track_abundance and not ignore_abundance\n        self.orig_query = query\n        self.orig_query_bp = query.minhash.unique_dataset_hashes\n        self.orig_query_filename = query.filename\n        self.orig_query_name = query.name\n        self.orig_query_md5 = query.md5sum()[:8]\n\n        # do we pay attention to abundances?\n        query_mh = query.minhash\n        query_hashes = query_mh.hashes\n        if track_abundance:\n            orig_query_abunds = query_hashes\n        else:\n            orig_query_abunds = {k: 1 for k in query_hashes}\n\n        # adjust for not found...\n        if noident_mh is None:  # create empty\n            noident_mh = query_mh.copy_and_clear()\n        self.noident_mh = noident_mh.to_frozen()\n\n        if ident_mh is None:\n            query_mh = query_mh.to_mutable()\n            query_mh.remove_many(noident_mh)\n        else:\n            query_mh = ident_mh.to_mutable()\n\n        orig_query_mh = query_mh.flatten()\n\n        # query.minhash will be assigned to repeatedly in gather; make mutable.\n        query = query.to_mutable()\n        query.minhash = orig_query_mh\n\n        cmp_scaled = query.minhash.scaled  # initialize with resolution of query\n\n        self.result_n = 0\n        self.query = query\n        self.counters = counters\n        self.threshold_bp = threshold_bp\n\n        self.track_abundance = track_abundance\n        self.orig_query_mh = orig_query_mh\n        self.orig_query_abunds = orig_query_abunds\n\n        self.cmp_scaled = 0  # initialize with something very low!\n        self._update_scaled(cmp_scaled)\n\n        self.estimate_ani_ci = (\n            estimate_ani_ci  # by default, do not report ANI confidence intervals\n        )\n\n    def _update_scaled(self, scaled):\n        max_scaled = max(self.cmp_scaled, scaled)\n        if self.cmp_scaled != max_scaled:\n            self.cmp_scaled = max_scaled\n\n            # CTB note: this can be expensive\n            self.orig_query_mh = self.orig_query_mh.downsample(scaled=scaled)\n            self.noident_mh = self.noident_mh.downsample(scaled=scaled)\n\n            # NOTE: orig_query_abunds can be used w/o downsampling\n            orig_query_abunds = self.orig_query_abunds\n            self.noident_query_sum_abunds = sum(\n                orig_query_abunds[k] for k in self.noident_mh.hashes\n            )\n            self.total_weighted_hashes = sum(\n                orig_query_abunds[k] for k in self.orig_query_mh.hashes\n            )\n            self.total_weighted_hashes += self.noident_query_sum_abunds\n\n        if max_scaled != scaled:\n            return max_scaled\n        return max_scaled\n\n    @property\n    def scaled(self):\n        return self.cmp_scaled\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        query = self.query\n        if not self.query.minhash:\n            raise StopIteration\n\n        # may be changed:\n        counters = self.counters\n\n        # will not be changed::\n        threshold_bp = self.threshold_bp\n        orig_query_abunds = self.orig_query_abunds\n\n        # find the best match!\n        best_result, intersect_mh = _find_best(counters, query, threshold_bp)\n\n        if not best_result:  # no matches at all for this cutoff!\n            raise StopIteration\n\n        best_match = best_result.signature\n        filename = best_result.location\n\n        # Is the best match computed with scaled? Die if not.\n        match_scaled = best_match.minhash.scaled\n        assert match_scaled\n\n        # pick the highest scaled / lowest resolution.\n        scaled = self._update_scaled(match_scaled)\n        # CTB note: this means that if a high scaled/low res signature is\n        # found early on, resolution will be low from then on.\n\n        # retrieve various saved things, after potential downsampling\n        orig_query_mh = self.orig_query_mh\n        total_weighted_hashes = self.total_weighted_hashes\n        noident_mh = self.noident_mh\n        orig_query_len = len(orig_query_mh) + len(noident_mh)\n\n        # eliminate hashes under this new resolution.\n        query_mh = query.minhash.downsample(scaled=scaled)\n        found_mh = best_match.minhash.downsample(scaled=scaled).flatten()\n\n        # construct a new query, subtracting hashes found in previous one.\n        new_query_mh = query_mh.to_mutable()\n        new_query_mh.remove_many(found_mh)\n        new_query = SourmashSignature(new_query_mh)\n\n        # compute weighted information for remaining query hashes\n        query_hashes = set(new_query_mh.hashes)\n        n_weighted_missed = sum(orig_query_abunds[k] for k in query_hashes)\n        n_weighted_missed += self.noident_query_sum_abunds\n        sum_weighted_found = total_weighted_hashes - n_weighted_missed\n\n        # build a GatherResult\n        result = GatherResult(\n            self.orig_query,\n            best_match,\n            cmp_scaled=scaled,\n            filename=filename,\n            gather_result_rank=self.result_n,\n            gather_querymh=query.minhash,\n            ignore_abundance=not self.track_abundance,\n            threshold_bp=threshold_bp,\n            orig_query_len=orig_query_len,\n            orig_query_abunds=self.orig_query_abunds,\n            estimate_ani_ci=self.estimate_ani_ci,\n            sum_weighted_found=sum_weighted_found,\n            total_weighted_hashes=total_weighted_hashes,\n            noident_len=len(self.noident_mh) * self.noident_mh.scaled,\n        )\n\n        self.result_n += 1\n        self.query = new_query\n\n        return result\n\n\n###\n### prefetch code\n###\n\n\ndef prefetch_database(query, database, threshold_bp, *, estimate_ani_ci=False):\n    \"\"\"\n    Find all matches to `query_mh` >= `threshold_bp` in `database`.\n    \"\"\"\n    scaled = query.minhash.scaled\n    assert scaled\n    # iterate over all signatures in database, find matches\n    for result in database.prefetch(\n        query, threshold_bp\n    ):  # future: could return PrefetchResult directly here\n        result = PrefetchResult(\n            query,\n            result.signature,\n            threshold_bp=threshold_bp,\n            estimate_ani_ci=estimate_ani_ci,\n        )\n        assert result.pass_threshold\n        yield result\n"
  },
  {
    "path": "src/sourmash/sig/__init__.py",
    "content": "from .__main__ import *  # bring all functions into top-level\nfrom . import grep\n"
  },
  {
    "path": "src/sourmash/sig/__main__.py",
    "content": "\"\"\"\nCommand-line entry point for 'python -m sourmash.sig'\n\"\"\"\n\n__all__ = [\n    \"cat\",\n    \"split\",\n    \"describe\",\n    \"manifest\",\n    \"overlap\",\n    \"merge\",\n    \"intersect\",\n    \"inflate\",\n    \"subtract\",\n    \"rename\",\n    \"extract\",\n    \"filter\",\n    \"flatten\",\n    \"downsample\",\n    \"ingest\",\n    \"export\",\n    \"kmers\",\n    \"fileinfo\",\n    \"check\",\n    \"collect\",\n]\n\nimport sys\nimport csv\nimport json\nimport os\nfrom collections import defaultdict, namedtuple, Counter\nimport re\n\nimport screed\nimport sourmash\nfrom sourmash.sourmash_args import FileOutput\n\nfrom sourmash.logging import (\n    set_quiet,\n    error,\n    notify,\n    print_results,\n    debug,\n    debug_literal,\n    _debug,\n)\nfrom sourmash import sourmash_args\nfrom sourmash.minhash import _get_max_hash_for_scaled\nfrom sourmash.manifest import CollectionManifest\n\n\nusage = \"\"\"\nsourmash signature <command> [<args>] - manipulate/work with signature files.\n\n** Commands can be:\n\ncat <signature> [<signature> ... ]        - concatenate all signatures\ndescribe <signature> [<signature> ... ]   - show details of signature\ndownsample <signature> [<signature> ... ] - downsample one or more signatures\nextract <signature> [<signature> ... ]    - extract one or more signatures\nfilter <signature> [<signature> ... ]     - filter k-mers on abundance\nflatten <signature> [<signature> ... ]    - remove abundances\nintersect <signature> [<signature> ...]   - intersect one or more signatures\nmanifest <sig/db>                         - build a manifest\nmerge <signature> [<signature> ...]       - merge one or more signatures\nrename <signature> <name>                 - rename signature\nsplit <signatures> [<signature> ...]      - split signatures into single files\nsubtract <signature> <other_sig> [...]    - subtract one or more signatures\nimport [ ... ]                            - import a mash or other signature\nexport <signature>                        - export a signature, e.g. to mash\noverlap <signature1> <signature2>         - see detailed comparison of sigs\ncheck <locations> --picklist ...          - check picklist against (many) sigs\ncollect <locations> -o manifest.sqlmf     - collect sigs metadata into manifest\n\n** Use '-h' to get subcommand-specific help, e.g.\n\nsourmash signature merge -h\n\"\"\"\n\n\ndef _check_abundance_compatibility(sig1, sig2):\n    if sig1.minhash.track_abundance != sig2.minhash.track_abundance:\n        raise ValueError(\n            f\"incompatible signatures: track_abundance is {sig1.minhash.track_abundance} in first sig, {sig2.minhash.track_abundance} in second\"\n        )\n\n\ndef _extend_signatures_with_from_file(args, *, target_attr=\"signatures\"):\n    # extend input signatures with --from-file\n    if args.from_file:\n        more_files = sourmash_args.load_pathlist_from_file(args.from_file)\n\n        sigs = list(getattr(args, target_attr))\n        sigs.extend(more_files)\n        setattr(args, target_attr, sigs)\n\n\ndef _set_num_scaled(mh, num, scaled):\n    \"set num and scaled values on a MinHash object\"\n    mh_params = list(mh.__getstate__())\n    # Number of hashes is 0th parameter\n    mh_params[0] = num\n    # Scale is 10th parameter\n    mh_params[10] = _get_max_hash_for_scaled(scaled)\n    mh.__setstate__(mh_params)\n    assert mh.num == num\n    assert mh.scaled == scaled\n\n\n##### actual command line functions\n\n\ndef cat(args):\n    \"\"\"\n    concatenate all signatures into one file.\n    \"\"\"\n    set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n\n    encountered_md5sums = defaultdict(int)  # used by --unique\n\n    # open output for saving sigs\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    _extend_signatures_with_from_file(args)\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n        pattern=pattern_search,\n    )\n    for ss, sigloc in loader:\n        md5 = ss.md5sum()\n        encountered_md5sums[md5] += 1\n        if args.unique and encountered_md5sums[md5] > 1:\n            continue\n\n        save_sigs.add(ss)\n\n    notify(f\"loaded {len(save_sigs)} signatures total.\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    save_sigs.close()\n\n    notify(f\"output {len(save_sigs)} signatures\")\n\n    multiple_md5 = [1 for cnt in encountered_md5sums.values() if cnt > 1]\n    if multiple_md5:\n        notify(f\"encountered {sum(multiple_md5)} MinHashes multiple times\")\n        if args.unique:\n            notify(\"...and removed the duplicates, because --unique was specified.\")\n\n\ndef split(args):\n    \"\"\"\n    split all signatures into individual files\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    output_names = set()\n    output_scaled_template = (\n        \"{md5sum}.k={ksize}.scaled={scaled}.{moltype}.dup={dup}.{basename}\"\n        + args.extension\n    )\n    output_num_template = (\n        \"{md5sum}.k={ksize}.num={num}.{moltype}.dup={dup}.{basename}\" + args.extension\n    )\n\n    if args.output_dir:\n        if not os.path.exists(args.output_dir):\n            notify(f\"Creating --output-dir {args.output_dir}\")\n            os.mkdir(args.output_dir)\n\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n\n    for sig, sigloc in loader:\n        # save each file individually --\n        md5sum = sig.md5sum()[:8]\n        minhash = sig.minhash\n        basename = os.path.basename(sig.filename)\n        if not basename or basename == \"-\":\n            basename = \"none\"\n\n        params = dict(\n            basename=basename,\n            md5sum=md5sum,\n            scaled=minhash.scaled,\n            ksize=minhash.ksize,\n            num=minhash.num,\n            moltype=minhash.moltype,\n        )\n\n        if minhash.scaled:\n            output_template = output_scaled_template\n        else:  # num\n            assert minhash.num\n            output_template = output_num_template\n\n        # figure out if this is duplicate, build unique filename\n        n = 0\n        params[\"dup\"] = n\n        output_name = output_template.format(**params)\n        while output_name in output_names:\n            params[\"dup\"] = n\n            output_name = output_template.format(**params)\n            n += 1\n\n        output_names.add(output_name)\n\n        if args.output_dir:\n            output_name = os.path.join(args.output_dir, output_name)\n\n        if os.path.exists(output_name):\n            notify(f\"** overwriting existing file {format(output_name)}\")\n\n        # save!\n        with sourmash_args.SaveSignaturesToLocation(output_name) as save_sigs:\n            save_sigs.add(sig)\n            notify(f\"writing sig to {output_name}\")\n\n    notify(f\"loaded and split {len(progress)} signatures total.\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef describe(args):\n    \"\"\"\n    provide basic info on signatures\n    \"\"\"\n    set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    _extend_signatures_with_from_file(args)\n\n    # write CSV?\n    w = None\n    csv_obj = None\n    if args.csv:\n        csv_obj = sourmash_args.FileOutputCSV(args.csv)\n        csv_fp = csv_obj.open()\n\n        w = csv.DictWriter(\n            csv_fp,\n            [\n                \"signature_file\",\n                \"md5\",\n                \"ksize\",\n                \"moltype\",\n                \"num\",\n                \"scaled\",\n                \"n_hashes\",\n                \"seed\",\n                \"with_abundance\",\n                \"name\",\n                \"filename\",\n                \"license\",\n                \"sum_hashes\",\n            ],\n            extrasaction=\"ignore\",\n        )\n        w.writeheader()\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n        pattern=pattern_search,\n    )\n\n    for sig, location in loader:\n        # extract info, write as appropriate.\n        signature_file = location\n        mh = sig.minhash\n        ksize = mh.ksize\n        moltype = mh.moltype\n        scaled = mh.scaled\n        num = mh.num\n        seed = mh.seed\n        n_hashes = len(mh)\n        sum_hashes = sum(mh.hashes.values())\n        with_abundance = 0\n        if mh.track_abundance:\n            with_abundance = 1\n        md5 = sig.md5sum()\n        name = sig.name\n        p_name = name or \"** no name **\"\n        filename = sig.filename\n        p_filename = filename or \"** no name **\"\n        license = sig.license\n\n        if w:\n            w.writerow(locals())\n\n        print_results(\n            \"\"\"\\\n---\nsignature filename: {location}\nsignature: {p_name}\nsource file: {p_filename}\nmd5: {md5}\nk={ksize} molecule={moltype} num={num} scaled={scaled} seed={seed} track_abundance={with_abundance}\nsize: {n_hashes}\nsum hashes: {sum_hashes}\nsignature license: {license}\n\"\"\",\n            **locals(),\n        )\n\n    if csv_obj:\n        csv_obj.close()\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef manifest(args):\n    \"\"\"\n    build a signature manifest\n    \"\"\"\n    set_quiet(args.quiet, args.debug)\n\n    try:\n        loader = sourmash_args.load_file_as_index(\n            args.location, yield_all_files=args.force\n        )\n    except ValueError:\n        error(f\"Cannot open '{args.location}' as a sourmash signature collection.\")\n        error(\"Use -d/--debug for details.\")\n        sys.exit(-1)\n\n    # behavior switch: in v4, manifests were rebuilt by default; in v5, not.\n    if args.cli_version == \"v4\":\n        rebuild = True\n\n        # was --no-rebuild-manifest specified?\n        if args.rebuild_manifest is False:\n            debug(\"sig manifest: not forcing rebuild.\")\n            rebuild = False\n        else:\n            # either left as default (None) or set (True) - rebuild\n            debug(\"sig manifest: forcing rebuild.\")\n    else:  # args.cli_version == 'v5':\n        rebuild = False\n        if args.rebuild_manifest:\n            debug(\"sig manifest: forcing rebuild.\")\n            rebuild = True\n\n    manifest = sourmash_args.get_manifest(loader, require=True, rebuild=rebuild)\n    manifest._check_row_values()\n\n    manifest.write_to_filename(\n        args.output, database_format=args.manifest_format, ok_if_exists=args.force\n    )\n    notify(f\"manifest contains {len(manifest)} signatures total.\")\n    notify(f\"wrote manifest to '{args.output}' ({args.manifest_format})\")\n\n\ndef overlap(args):\n    \"\"\"\n    provide detailed comparison of two signatures\n    \"\"\"\n    set_quiet(args.quiet)\n\n    moltype = sourmash_args.calculate_moltype(args)\n\n    sig1 = sourmash_args.load_one_signature(\n        args.signature1, ksize=args.ksize, select_moltype=moltype\n    )\n    sig2 = sourmash_args.load_one_signature(\n        args.signature2, ksize=args.ksize, select_moltype=moltype\n    )\n\n    notify(f\"loaded one signature each from {args.signature1} and {args.signature2}\")\n\n    try:\n        jaccard = sig1.jaccard(sig2)\n    except ValueError:\n        raise\n\n    # --- conditional containment info ---\n    if sig1.minhash.scaled > 0 and sig2.minhash.scaled > 0:\n        cont1 = sig1.contained_by(sig2)\n        cont2 = sig2.contained_by(sig1)\n\n        cANI_result = sig1.containment_ani(sig2)\n        size_estimate_inaccurate = cANI_result.size_is_inaccurate\n        print(\"size_estimate_inaccurate:\", size_estimate_inaccurate)\n        if size_estimate_inaccurate:\n            similarity_info = f\"\"\"\\\n--- Similarity measures ---\njaccard similarity:          {jaccard:.5f}\nfirst contained in second:   {cont1:.5f}\nsecond contained in first:   {cont2:.5f}\n\nNote: cANI values not reported. One or more sketches contains too few hashes for accurate size estimation.\n\"\"\"\n        else:\n            cANI1 = cANI_result.ani\n            cANI2 = sig2.containment_ani(sig1).ani\n            avg_cANI = (cANI1 + cANI2) / 2\n\n            similarity_info = f\"\"\"\\\n--- Similarity measures ---\njaccard similarity:          {jaccard:.5f}\nfirst contained in second:   {cont1:.5f} (cANI: {cANI1:.5f})\nsecond contained in first:   {cont2:.5f} (cANI: {cANI2:.5f})\naverage containment ANI:     {avg_cANI:.5f}\n\n\"\"\"\n    else:\n        similarity_info = f\"\"\"\\\n--- Similarity measures ---\njaccard similarity:          {jaccard:.5f}\ncontainment and ANI not available (one or both signatures are not scaled)\n\n\"\"\"\n\n    # --- hash counts and overlaps ---\n    hashes_1 = set(sig1.minhash.hashes)\n    hashes_2 = set(sig2.minhash.hashes)\n\n    size1 = len(hashes_1)\n    size2 = len(hashes_2)\n    num_common = len(hashes_1 & hashes_2)\n    disjoint_1 = len(hashes_1 - hashes_2)\n    disjoint_2 = len(hashes_2 - hashes_1)\n    num_union = len(hashes_1.union(hashes_2))\n\n    hash_counts_info = f\"\"\"\\\n--- Hash overlap summary ---\nnumber of hashes in first:   {size1}\nnumber of hashes in second:  {size2}\n\nnumber of hashes in common:  {num_common}\nonly in first:               {disjoint_1}\nonly in second:              {disjoint_2}\ntotal (union):               {num_union}\n\n\"\"\"\n\n    # --- conditional abundance info ---\n    abundance_info = \"\"\n    if sig1.minhash.track_abundance and sig2.minhash.track_abundance:\n        angular_similarity = sig1.angular_similarity(sig2)\n        sum_hashes1 = sum(sig1.minhash.hashes.values())\n        sum_hashes2 = sum(sig2.minhash.hashes.values())\n        weighted_containment1 = sig1.contained_by_weighted(sig2)\n        weighted_containment2 = sig2.contained_by_weighted(sig1)\n        abundance_info = f\"\"\"\\\n--- Abundance-weighted similarity: ---\nangular similarity:          {angular_similarity:.5f}\nfirst contained in second (weighted): {weighted_containment1:.5f}\nsecond contained in first (weighted): {weighted_containment2:.5f}\n\nnumber of hashes in first (weighted): {sum_hashes1}\nnumber of hashes in second (weighted): {sum_hashes2}\n    \"\"\"\n    # --- output ---\n    print(\"first signature:\")\n    sig1.display(args.signature1)\n    print(\"second signature:\")\n    sig2.display(args.signature2)\n\n    print(\n        f\"\"\"\\\n\n{similarity_info}\n{hash_counts_info}\n{abundance_info}\n\"\"\"\n    )\n\n\ndef merge(args):\n    \"\"\"\n    merge one or more signatures.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    first_sig = None\n    mh = None\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n\n    for sigobj, sigloc in loader:\n        # first signature? initialize a bunch of stuff\n        if first_sig is None:\n            first_sig = sigobj\n            mh = first_sig.minhash.copy_and_clear()\n\n            # forcibly remove abundance?\n            if args.flatten:\n                mh.track_abundance = False\n\n        try:\n            sigobj_mh = sigobj.minhash\n            if not args.flatten:\n                _check_abundance_compatibility(first_sig, sigobj)\n            else:\n                sigobj_mh.track_abundance = False\n\n            mh.merge(sigobj_mh)\n        except (TypeError, ValueError) as exc:\n            error(\n                \"ERROR when merging signature '{}' ({}) from file {}\",\n                sigobj,\n                sigobj.md5sum()[:8],\n                sigloc,\n            )\n            error(str(exc))\n            sys.exit(-1)\n\n    if not len(progress):\n        error(\"no signatures to merge!?\")\n        sys.exit(-1)\n\n    merged_sigobj = sourmash.SourmashSignature(mh, name=args.set_name)\n\n    with sourmash_args.SaveSignaturesToLocation(args.output) as save_sigs:\n        save_sigs.add(merged_sigobj)\n\n    notify(f\"loaded and merged {len(progress)} signatures\")\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef intersect(args):\n    \"\"\"\n    intersect one or more signatures by taking the intersection of hashes.\n\n    This function always removes abundances unless -A specified.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    first_sig = None\n    mins = None\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n\n    for sigobj, sigloc in loader:\n        if first_sig is None:\n            first_sig = sigobj\n            mins = set(sigobj.minhash.hashes)\n        else:\n            # check signature compatibility -- if no ksize/moltype specified\n            # 'first_sig' may be incompatible with later sigs.\n            if not sigobj.minhash.is_compatible(first_sig.minhash):\n                error(\"incompatible minhashes; specify -k and/or molecule type.\")\n                sys.exit(-1)\n\n        mins.intersection_update(sigobj.minhash.hashes)\n\n    if first_sig is None:\n        notify(\"no signatures provided to intersect!?\")\n        sys.exit(-1)\n\n    # forcibly turn off track_abundance, unless --abundances-from set.\n    intersect_mh = first_sig.minhash.copy_and_clear().flatten()\n    intersect_mh.add_many(mins)\n\n    # borrow abundances from a signature?\n    if args.abundances_from:\n        notify(f\"loading signature from {args.abundances_from}, keeping abundances\")\n        abund_sig = sourmash_args.load_one_signature(\n            args.abundances_from, ksize=args.ksize, select_moltype=moltype\n        )\n        if not abund_sig.minhash.track_abundance:\n            error(\"--track-abundance not set on loaded signature?! exiting.\")\n            sys.exit(-1)\n\n        intersect_mh = intersect_mh.inflate(abund_sig.minhash)\n\n    intersect_sigobj = sourmash.SourmashSignature(intersect_mh, name=args.set_name)\n\n    with sourmash_args.SaveSignaturesToLocation(args.output) as save_sigs:\n        save_sigs.add(intersect_sigobj)\n\n    notify(f\"loaded and intersected {len(progress)} signatures\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef inflate(args):\n    \"\"\"\n    inflate one or more other signatures from the first.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n\n    inflate_sig = sourmash_args.load_query_signature(\n        args.signature_from, ksize=args.ksize, select_moltype=moltype\n    )\n    inflate_from_mh = inflate_sig.minhash\n    ksize = inflate_from_mh.ksize\n    moltype = inflate_from_mh.moltype\n\n    if not inflate_from_mh.track_abundance:\n        error(f\"ERROR: signature '{inflate_sig.name}' from \")\n        error(f\"file '{args.signature_from}' has no abundances.\")\n        sys.exit(-1)\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.other_sigs,\n        ksize=ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n\n    with sourmash_args.SaveSignaturesToLocation(args.output) as save_sigs:\n        for sigobj, sigloc in loader:\n            inflated_mh = sigobj.minhash.inflate(inflate_from_mh)\n            inflated_sigobj = sourmash.SourmashSignature(inflated_mh, name=sigobj.name)\n\n            save_sigs.add(inflated_sigobj)\n\n    if len(progress) == 0:\n        error(\"no signatures to inflate!?\")\n        sys.exit(-1)\n\n    notify(f\"loaded and intersected {len(save_sigs)} signatures\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef subtract(args):\n    \"\"\"\n    subtract one or more signatures from another\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n\n    from_sigobj = sourmash_args.load_one_signature(\n        args.signature_from, ksize=args.ksize, select_moltype=moltype\n    )\n\n    if args.abundances_from:  # it's ok to work with abund signatures if -A.\n        args.flatten = True\n\n    from_mh = from_sigobj.minhash\n    if from_mh.track_abundance and not args.flatten:\n        error(\"Cannot use subtract on signatures with abundance tracking, sorry!\")\n        sys.exit(1)\n\n    subtract_mins = set(from_mh.hashes)\n\n    notify(f\"loaded signature from {args.signature_from}...\", end=\"\\r\")\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    for sigfile in args.subtraction_sigs:\n        for sigobj in sourmash_args.load_file_as_signatures(\n            sigfile, ksize=args.ksize, select_moltype=moltype, progress=progress\n        ):\n            if not sigobj.minhash.is_compatible(from_mh):\n                error(\"incompatible minhashes; specify -k and/or molecule type.\")\n                sys.exit(-1)\n\n            if sigobj.minhash.track_abundance and not args.flatten:\n                error(\n                    \"Cannot use subtract on signatures with abundance tracking, sorry!\"\n                )\n                sys.exit(1)\n\n            subtract_mins -= set(sigobj.minhash.hashes)\n\n            notify(f\"loaded and subtracted signatures from {sigfile}...\", end=\"\\r\")\n\n    if not len(progress):\n        error(\"no signatures to subtract!?\")\n        sys.exit(-1)\n\n    # build new minhash with new mins\n    subtract_mh = from_sigobj.minhash.copy_and_clear().flatten()\n    subtract_mh.add_many(subtract_mins)\n\n    # borrow abundances from somewhere?\n    if args.abundances_from:\n        notify(f\"loading signature from {args.abundances_from}, keeping abundances\")\n        abund_sig = sourmash_args.load_one_signature(\n            args.abundances_from, ksize=args.ksize, select_moltype=moltype\n        )\n\n        if not abund_sig.minhash.track_abundance:\n            error(\"--track-abundance not set on loaded signature?! exiting.\")\n            sys.exit(-1)\n\n        subtract_mh = subtract_mh.inflate(abund_sig.minhash)\n\n    subtract_sigobj = sourmash.SourmashSignature(subtract_mh, name=args.set_name)\n\n    with sourmash_args.SaveSignaturesToLocation(args.output) as save_sigs:\n        save_sigs.add(subtract_sigobj)\n\n    notify(f\"loaded and subtracted {len(progress)} signatures\")\n\n\ndef rename(args):\n    \"\"\"\n    rename one or more signatures.\n    \"\"\"\n    set_quiet(args.quiet, args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    _extend_signatures_with_from_file(args)\n\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n        pattern=pattern_search,\n    )\n\n    for sigobj, sigloc in loader:\n        sigobj = sigobj.to_mutable()\n        sigobj._name = args.name\n        save_sigs.add(sigobj)\n\n    save_sigs.close()\n\n    notify(f\"set name to '{args.name}' on {len(save_sigs)} signatures\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef extract(args):\n    \"\"\"\n    extract signatures.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    _extend_signatures_with_from_file(args)\n\n    # further filtering on md5 or name?\n    filter_fn = None\n    if args.md5 is not None or args.name is not None:\n\n        def filter_fn(row):\n            # match?\n            keep = False\n            if args.name:\n                name = row[\"name\"] or row[\"filename\"]\n                if args.name in name:\n                    keep = True\n            if args.md5 and args.md5 in row[\"md5\"]:\n                keep = True\n\n            return keep\n\n    # ok! filtering defined, let's go forward\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    # start loading!\n    total_rows_examined = 0\n    for filename in args.signatures:\n        idx = sourmash_args.load_file_as_index(filename, yield_all_files=args.force)\n\n        idx = idx.select(ksize=args.ksize, moltype=moltype)\n\n        idx = sourmash_args.apply_picklist_and_pattern(idx, picklist, pattern_search)\n\n        manifest = sourmash_args.get_manifest(idx)\n        total_rows_examined += len(manifest)\n\n        # do the extra pattern matching on name/md5 that is part of 'extract'.\n        # CTB: This should be deprecated and removed at some point, since\n        # --include/--exclude now do the same thing.\n        if filter_fn and not pattern_search:\n            sub_manifest = manifest.filter_rows(filter_fn)\n            sub_picklist = sub_manifest.to_picklist()\n\n            try:\n                idx = idx.select(picklist=sub_picklist)\n            except ValueError:\n                error(\n                    \"** This input collection doesn't support 'extract' with picklists or patterns.\"\n                )\n                error(\"** EXITING.\")\n                error(\"**\")\n                error(\"** You can use 'sourmash sig cat' with a picklist or pattern,\")\n                error(\"** and then pipe the output to 'sourmash sig extract\")\n                sys.exit(-1)\n\n        for ss in idx.signatures():\n            save_sigs.add(ss)\n\n    notify(f\"loaded {total_rows_examined} total that matched ksize & molecule type\")\n    save_sigs.close()\n\n    if not save_sigs:\n        error(\"no matching signatures to save!\")\n        sys.exit(-1)\n\n    notify(f\"extracted {len(save_sigs)} signatures from {len(args.signatures)} file(s)\")\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef filter(args):\n    \"\"\"\n    filter hashes by abundance in all of the signatures\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    for filename in args.signatures:\n        siglist = sourmash_args.load_file_as_signatures(\n            filename, ksize=args.ksize, select_moltype=moltype, progress=progress\n        )\n        siglist = list(siglist)\n\n        # select!\n        if args.md5 is not None:\n            siglist = [ss for ss in siglist if args.md5 in ss.md5sum()]\n        if args.name is not None:\n            siglist = [ss for ss in siglist if args.name in str(ss)]\n\n        for ss in siglist:\n            mh = ss.minhash\n            if not mh.track_abundance:\n                notify(f\"ignoring signature {ss} - track_abundance not set.\")\n                continue\n\n            abunds = mh.hashes\n            abunds2 = {}\n            for k, v in abunds.items():\n                if v >= args.min_abundance:\n                    if args.max_abundance is None or v <= args.max_abundance:\n                        abunds2[k] = v\n\n            filtered_mh = mh.copy_and_clear()\n            filtered_mh.set_abundances(abunds2)\n\n            ss = ss.to_mutable()\n            ss.minhash = filtered_mh\n\n            save_sigs.add(ss)\n\n    save_sigs.close()\n\n    notify(f\"loaded {len(progress)} total that matched ksize & molecule type\")\n    notify(f\"extracted {len(save_sigs)} signatures from {len(args.signatures)} file(s)\")\n\n\ndef flatten(args):\n    \"\"\"\n    flatten one or more signatures, removing abundances.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n    for ss, sigloc in loader:\n        # select!\n        if args.md5 is not None:\n            if args.md5 not in ss.md5sum():\n                continue  #  skip\n\n        if args.name is not None:\n            if args.name not in ss.name:\n                continue  # skip\n\n        ss = ss.to_mutable()\n        ss.minhash = ss.minhash.flatten()\n        save_sigs.add(ss)\n\n    save_sigs.close()\n\n    notify(f\"loaded {len(progress)} total that matched ksize & molecule type\")\n    notify(f\"extracted {len(save_sigs)} signatures from {len(args.signatures)} file(s)\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef downsample(args):\n    \"\"\"\n    downsample num and scaled signatures, and also interconvert.\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    if not args.num_hashes and not args.scaled:\n        error(\"ERROR: must specify either --num or --scaled value\")\n        sys.exit(-1)\n\n    if args.num_hashes and args.scaled:\n        error(\"ERROR: cannot specify both --num and --scaled\")\n        sys.exit(-1)\n\n    # open output for saving sigs\n    save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n    save_sigs.open()\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n    for ss, sigloc in loader:\n        sigobj = ss.to_mutable()\n        mh = sigobj.minhash\n\n        if args.scaled:\n            # downsample scaled to scaled? straightforward.\n            if mh.scaled:\n                mh_new = mh.downsample(scaled=args.scaled)\n            # try to turn a num into a scaled - trickier.\n            else:\n                # first check: can we?\n                max_hash = _get_max_hash_for_scaled(args.scaled)\n                mins = mh.hashes\n                if max(mins) < max_hash:\n                    raise ValueError(\n                        \"this num MinHash does not have enough hashes to convert it into a scaled MinHash.\"\n                    )\n\n                mh_new = mh.copy()\n                _set_num_scaled(mh_new, 0, args.scaled)\n        elif args.num_hashes:\n            # downsample num to num? straightforward.\n            if mh.num:\n                mh_new = mh.downsample(num=args.num_hashes)\n            # try to turn a scaled into a num - trickier.\n            else:\n                # first check: can we?\n                if len(mh) < args.num_hashes:\n                    raise ValueError(f\"this scaled MinHash has only {len(mh)} hashes\")\n\n                mh_new = mh.copy()\n                _set_num_scaled(mh_new, args.num_hashes, 0)\n\n        sigobj.minhash = mh_new\n        save_sigs.add(sigobj)\n\n    save_sigs.close()\n\n    notify(f\"loaded {len(progress)} signatures\")\n    notify(f\"output {len(save_sigs)} downsampled signatures\", len(save_sigs))\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n\ndef ingest(args):\n    \"\"\"\n    import a signature into sourmash format.\n    \"\"\"\n    set_quiet(args.quiet)\n\n    siglist = []\n    if args.csv:\n        for filename in args.filenames:\n            with open(filename, newline=\"\") as csv_fp:\n                reader = csv.reader(csv_fp)\n                siglist = []\n                for row in reader:\n                    hashfn = row[0]\n                    hashseed = int(row[1])\n\n                    # only support a limited import type, for now ;)\n                    assert hashfn == \"murmur64\"\n                    assert hashseed == 42\n\n                    _, _, ksize, name, hashes = row\n                    ksize = int(ksize)\n\n                    hashes = hashes.strip()\n                    hashes = list(map(int, hashes.split(\" \")))\n\n                    e = sourmash.MinHash(len(hashes), ksize)\n                    e.add_many(hashes)\n                    s = sourmash.SourmashSignature(e, filename=name)\n                    siglist.append(s)\n                    notify(f\"loaded signature: {name} {s.md5sum()[:8]}\")\n    else:\n        for filename in args.filenames:\n            with open(filename) as fp:\n                x = json.loads(fp.read())\n\n            ksize = x[\"kmer\"]\n            num = x[\"sketchSize\"]\n\n            assert x[\"hashType\"] == \"MurmurHash3_x64_128\"\n            assert x[\"hashBits\"] == 64\n            assert x[\"hashSeed\"] == 42\n\n            xx = x[\"sketches\"][0]\n            hashes = xx[\"hashes\"]\n\n            mh = sourmash.MinHash(ksize=ksize, n=num, is_protein=False)\n            mh.add_many(hashes)\n\n            s = sourmash.SourmashSignature(mh, filename=filename)\n            siglist.append(s)\n\n    notify(f\"saving {len(siglist)} signatures to JSON\")\n    with sourmash_args.SaveSignaturesToLocation(args.output) as save_sigs:\n        save_sigs.add_many(siglist)\n\n\ndef export(args):\n    \"\"\"\n    export a signature to mash format\n    \"\"\"\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n\n    query = sourmash_args.load_query_signature(\n        args.filename, ksize=args.ksize, select_moltype=moltype, select_md5=args.md5\n    )\n    mh = query.minhash\n\n    x = {}\n    x[\"kmer\"] = mh.ksize\n    x[\"sketchSize\"] = len(mh)\n\n    x[\"hashType\"] = \"MurmurHash3_x64_128\"\n    x[\"hashBits\"] = 64\n    x[\"hashSeed\"] = mh.seed\n\n    ll = list(mh.hashes)\n    x[\"sketches\"] = [{\"hashes\": ll}]\n\n    with FileOutput(args.output, \"wt\") as fp:\n        print(json.dumps(x), file=fp)\n    notify(f\"exported signature {query} ({query.md5sum()[:8]})\")\n\n\ndef kmers(args):\n    \"\"\"\n    retrieve k-mers and/or sequences contained by the minhashes\n    \"\"\"\n    from sourmash.search import format_bp\n\n    set_quiet(args.quiet)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    first_sig = None\n    query_mh = None\n\n    # start loading!\n    progress = sourmash_args.SignatureLoadingProgress()\n    loader = sourmash_args.load_many_signatures(\n        args.signatures,\n        ksize=args.ksize,\n        moltype=moltype,\n        picklist=picklist,\n        progress=progress,\n        yield_all_files=args.force,\n        force=args.force,\n    )\n\n    for sigobj, sigloc in loader:\n        # first signature? initialize a bunch of stuff\n        if first_sig is None:\n            first_sig = sigobj\n            query_mh = first_sig.minhash.copy_and_clear()\n\n            # remove abundance as it has no purpose here --\n            query_mh.track_abundance = False\n\n        try:\n            sigobj_mh = sigobj.minhash\n            sigobj_mh.track_abundance = False\n\n            query_mh.merge(sigobj_mh)\n        except (TypeError, ValueError) as exc:\n            error(\n                \"ERROR when merging signature '{}' ({}) from file {}\",\n                sigobj,\n                sigobj.md5sum()[:8],\n                sigloc,\n            )\n            error(str(exc))\n            sys.exit(-1)\n\n    if not len(progress):\n        error(\"no signatures in query!?\")\n        sys.exit(-1)\n\n    notify(f\"loaded and merged {len(progress)} signatures\")\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n\n    is_protein = False\n    if query_mh.moltype == \"DNA\":\n        if args.translate:\n            error(\"ERROR: cannot use --translate with DNA sketches.\")\n            sys.exit(-1)\n    else:\n        is_protein = True\n        if args.translate:  # input sequence is DNA\n            is_protein = False\n\n    if not query_mh:\n        notify(\"ERROR: no hashes in query signature!?\")\n        sys.exit(-1)\n\n    notify(\"\")\n    notify(\"merged signature has the following properties:\")\n    notify(\n        f\"k={query_mh.ksize} molecule={query_mh.moltype} num={query_mh.num} scaled={query_mh.scaled} seed={query_mh.seed}\"\n    )\n    notify(f\"total hashes in merged signature: {len(query_mh)}\")\n    notify(\"\")\n    notify(\"now processing sequence files for matches!\")\n\n    found_mh = query_mh.copy_and_clear()\n\n    # open outputs...\n    save_kmers = None\n    kmer_w = None\n    if args.save_kmers:\n        save_kmers = sourmash_args.FileOutputCSV(args.save_kmers)\n        save_kmers.open()\n        kmer_w = csv.DictWriter(\n            save_kmers.fp,\n            fieldnames=[\"sequence_file\", \"sequence_name\", \"kmer\", \"hashval\"],\n        )\n        kmer_w.writeheader()\n\n    save_seqs = None\n    if args.save_sequences:\n        save_seqs = sourmash_args.FileOutput(args.save_sequences)\n        save_seqs.open()\n\n    # figure out protein vs dna\n    is_protein = False\n    if query_mh.moltype != \"DNA\":\n        if not args.translate:\n            is_protein = True\n\n    n_files_searched = 0\n    n_sequences_searched = 0\n    n_bp_searched = 0\n    n_kmers_found = 0\n    n_sequences_found = 0\n    n_bp_saved = 0\n\n    progress_threshold = 1e6\n    progress_interval = 1e6\n    for filename in args.sequences:\n        notify(f\"opening sequence file '{filename}'\")\n        n_files_searched += 1\n\n        with screed.open(filename) as f:\n            for record in f:\n                seq_mh = query_mh.copy_and_clear()\n\n                # protein? dna?\n                if is_protein:\n                    seq_mh.add_protein(record.sequence)\n                else:\n                    try:\n                        seq_mh.add_sequence(record.sequence, not args.check_sequence)\n                    except ValueError as exc:\n                        seqname = record.name\n                        if len(seqname) > 40:\n                            seqname = seqname[:37] + \"...\"\n                        notify(f\"ERROR in sequence '{seqname}', file '{filename}'\")\n                        notify(str(exc))\n                        if args.force:\n                            notify(\"(continuing)\")\n                            continue\n                        else:\n                            sys.exit(-1)\n\n                if seq_mh.intersection(query_mh):\n                    # match!\n\n                    # output matching sequences:\n                    if save_seqs:\n                        save_seqs.fp.write(f\">{record.name}\\n{record.sequence}\\n\")\n                        n_sequences_found += 1\n                        n_bp_saved += len(record.sequence)\n\n                    # output matching k-mers:\n                    if kmer_w:\n                        seq = record.sequence\n                        kh_iter = seq_mh.kmers_and_hashes(\n                            seq, force=False, is_protein=is_protein\n                        )\n                        for kmer, hashval in kh_iter:\n                            if hashval in query_mh.hashes:\n                                found_mh.add_hash(hashval)\n                                n_kmers_found += 1\n                                d = dict(\n                                    sequence_file=filename,\n                                    sequence_name=record.name,\n                                    kmer=kmer,\n                                    hashval=hashval,\n                                )\n                                kmer_w.writerow(d)\n\n                    # add seq_mh to found_mh\n                    found_mh += seq_mh.intersection(query_mh)\n\n                # provide progress indicator based on bp...\n                n_sequences_searched += 1\n                n_bp_searched += len(record.sequence)\n\n                if n_bp_searched >= progress_threshold:\n                    notify(\n                        f\"... searched {n_bp_searched} from {n_files_searched} files so far\"\n                    )\n                    while n_bp_searched >= progress_threshold:\n                        progress_threshold += progress_interval\n\n    # END major for loop. Now, clean up!\n    if save_kmers:\n        save_kmers.close()\n\n    if save_seqs:\n        save_seqs.close()\n\n    if not n_sequences_searched:\n        notify(\"ERROR: no sequences searched!?\")\n        sys.exit(-1)\n\n    # ...and report!\n    notify(\"DONE.\")\n    notify(\n        f\"searched {n_sequences_searched} sequences from {n_files_searched} files, containing a total of {format_bp(n_bp_searched)}.\"\n    )\n\n    if save_seqs:\n        notify(\n            f\"matched and saved a total of {n_sequences_found} sequences with {format_bp(n_bp_saved)}.\"\n        )\n\n    if kmer_w:\n        notify(f\"matched and saved a total of {n_kmers_found} k-mers.\")\n\n    # calculate overlap, even for num minhashes which ordinarily don't\n    # permit it, because here we are interested in knowing how many\n    # of the expected hashes we found.\n    query_hashes = set(query_mh.hashes)\n    found_hashes = set(found_mh.hashes)\n    cont = len(query_hashes.intersection(found_hashes)) / len(query_hashes)\n\n    notify(f\"found {len(found_mh)} distinct matching hashes ({cont * 100:.1f}%)\")\n\n    if not kmer_w and not save_seqs:\n        notify(\"NOTE: see --save-kmers or --save-sequences for output options.\")\n\n\n_SketchInfo = namedtuple(\"_SketchInfo\", \"ksize, moltype, scaled, num, abund\")\n\n\ndef _summarize_manifest(manifest):\n    info_d = {}\n\n    # use a namedtuple to track counts of distinct sketch types and n hashes\n    total_size = 0\n    counter = Counter()\n    hashcounts = Counter()\n    for row in manifest.rows:\n        ski = _SketchInfo(\n            ksize=row[\"ksize\"],\n            moltype=row[\"moltype\"],\n            scaled=row[\"scaled\"],\n            num=row[\"num\"],\n            abund=row[\"with_abundance\"],\n        )\n        counter[ski] += 1\n        hashcounts[ski] += row[\"n_hashes\"]\n        total_size += row[\"n_hashes\"]\n\n    # store in info_d\n    info_d[\"total_hashes\"] = total_size\n    sketch_info = []\n    for ski, count in counter.items():\n        sketch_d = dict(ski._asdict())\n        sketch_d[\"count\"] = count\n        sketch_d[\"n_hashes\"] = hashcounts[ski]\n        sketch_info.append(sketch_d)\n    info_d[\"sketch_info\"] = sketch_info\n\n    return info_d\n\n\n# NOTE: also aliased as 'summarize'\ndef fileinfo(args):\n    \"\"\"\n    provide summary information on the given path (collection, index, etc.)\n    \"\"\"\n    set_quiet(args.quiet, args.debug)\n\n    text_out = False\n    if not args.json_out:\n        text_out = True\n\n    # load as index!\n    try:\n        notify(f\"** loading from '{args.path}'\")\n        idx = sourmash_args.load_file_as_index(args.path, yield_all_files=args.force)\n    except ValueError:\n        error(f\"Cannot open '{args.path}' as a sourmash signature collection.\")\n        error(\"Use -d/--debug for details.\")\n        sys.exit(-1)\n\n    def print_bool(x):\n        return \"yes\" if x else \"no\"\n\n    info_d = {}\n    info_d[\"path_filetype\"] = type(idx).__name__\n    info_d[\"location\"] = \"\" if not idx.location else idx.location\n    info_d[\"is_database\"] = bool(idx.is_database)\n    info_d[\"has_manifest\"] = bool(idx.manifest)\n    info_d[\"num_sketches\"] = len(idx)\n\n    if text_out:\n        print_results(f\"path filetype: {info_d['path_filetype']}\")\n        print_results(f\"location: {info_d['location']}\")\n        print_results(f\"is database? {print_bool(info_d['is_database'])}\")\n        print_results(f\"has manifest? {print_bool(info_d['has_manifest'])}\")\n        print_results(f\"num signatures: {info_d['num_sketches']}\")\n\n    # also have arg to fileinfo to force recalculation\n    notify(\"** examining manifest...\")\n\n    manifest = sourmash_args.get_manifest(\n        idx, rebuild=args.rebuild_manifest, require=False\n    )\n    manifest._check_row_values()\n\n    if manifest is None:\n        # actually can't find any file type to trigger this, but leaving it\n        # in for future eventualities, I guess?\n        notify(\"** no manifest and cannot be generated; exiting.\")\n        sys.exit(0)\n\n    info_d.update(_summarize_manifest(manifest))\n\n    if text_out:\n        print_results(f\"total hashes: {info_d['total_hashes']}\")\n        print_results(\"summary of sketches:\")\n\n        for ski in info_d[\"sketch_info\"]:\n            mh_type = f\"num={ski['num']}\" if ski[\"num\"] else f\"scaled={ski['scaled']}\"\n            mh_abund = \", abund\" if ski[\"abund\"] else \"\"\n\n            sketch_str = f\"{ski['count']} sketches with {ski['moltype']}, k={ski['ksize']}, {mh_type}{mh_abund}\"\n\n            print_results(f\"   {sketch_str: <50} {ski['n_hashes']} total hashes\")\n\n    else:\n        assert args.json_out\n        print(json.dumps(info_d))\n\n\ndef check(args):\n    \"\"\"\n    check signature db(s) against a picklist.\n    \"\"\"\n    from sourmash.picklist import PickStyle\n\n    if args.cli_version == \"v5\":\n        if args.abspath is None:  # not set by user\n            args.relpath = True\n\n    set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    sourmash_args.load_include_exclude_db_patterns(args)\n    _extend_signatures_with_from_file(args)\n\n    if not picklist:\n        error(\"** No picklist provided?! Exiting.\")\n        sys.exit(-1)\n\n    if picklist.pickstyle == PickStyle.EXCLUDE and args.output_missing:\n        error(\"** ERROR: Cannot use an 'exclude' picklist with '-o/--output-missing'\")\n        sys.exit(-1)\n\n    # require manifests?\n    require_manifest = True\n    if args.no_require_manifest:\n        require_manifest = False\n        debug(\"sig check: manifest will not be required\")\n    else:\n        debug(\"sig check: manifest required\")\n\n    # abspath/relpath checks\n    if args.abspath and args.relpath:\n        error(\"** Cannot specify both --abspath and --relpath; pick one!\")\n        sys.exit(-1)\n\n    if args.relpath or args.abspath and not args.save_manifest_matching:\n        notify(\n            \"** WARNING: --abspath and --relpath only have effects when saving a manifest\"\n        )\n\n    relpath = \".\"\n    if args.relpath and args.save_manifest_matching:\n        output_manifest_dir = os.path.dirname(args.save_manifest_matching)\n        relpath = os.path.relpath(os.curdir, output_manifest_dir)\n\n    total_manifest_rows = CollectionManifest([])\n\n    # start loading!\n    total_rows_examined = 0\n    for filename in args.signatures:\n        # if saving a manifest, think about how to rewrite locations.\n        if args.abspath:\n            # convert to abspath\n            new_iloc = os.path.abspath(filename)\n        elif args.relpath:\n            # interpret paths relative to manifest directory.\n            if filename.startswith(\"/\"):\n                notify(\n                    f\"** WARNING: cannot convert abspath {filename} into relative path.\"\n                )\n            new_iloc = os.path.join(relpath, filename)\n        else:\n            # default: paths are relative to cwd. This breaks when sketches\n            # are in subdirectories; will be deprecated for v5.\n            new_iloc = filename\n\n        idx = sourmash_args.load_file_as_index(filename, yield_all_files=args.force)\n\n        idx = idx.select(ksize=args.ksize, moltype=moltype)\n\n        if idx.manifest is None and require_manifest:\n            error(f\"ERROR on filename '{filename}'.\")\n            error(\"sig check requires a manifest by default, but no manifest present.\")\n            error(\"specify --no-require-manifest to dynamically generate one.\")\n            sys.exit(-1)\n\n        # has manifest, or ok to build (require_manifest=False) - continue!\n        new_manifest = sourmash_args.get_manifest(idx, require=True)\n        sub_manifest = new_manifest.select_to_manifest(picklist=picklist)\n        total_rows_examined += len(new_manifest)\n\n        # rewrite locations so that each signature can be found by filename\n        # of its container; this follows `sig collect` logic.\n        for row in sub_manifest.rows:\n            row[\"internal_location\"] = new_iloc\n            total_manifest_rows.add_row(row)\n\n        # the len(sub_manifest) here should only be run when needed :)\n        if _debug:\n            debug_literal(\n                f\"examined {len(new_manifest)} new rows, found {len(sub_manifest)} matching rows\"\n            )\n\n    notify(f\"loaded {total_rows_examined} signatures.\")\n\n    sourmash_args.report_picklist(args, picklist)\n\n    # output picklist of non-matching in same format as input picklist\n    n_missing = len(picklist.pickset - picklist.found)\n    if args.output_missing and n_missing:\n        pickfile = picklist.pickfile\n\n        # go through the input file and pick out missing rows.\n        n_input = 0\n        n_output = 0\n\n        with sourmash_args.FileInputCSV(pickfile) as r:\n            with open(args.output_missing, \"w\", newline=\"\") as outfp:\n                w = csv.DictWriter(outfp, fieldnames=r.fieldnames)\n                w.writeheader()\n\n                for row in r:\n                    n_input += 1\n                    if not picklist.matched_csv_row(row):\n                        n_output += 1\n                        w.writerow(row)\n        notify(\n            f\"saved {n_output} non-matching rows of {n_input} picklist rows to '{args.output_missing}'\"\n        )\n    elif args.output_missing:\n        notify(\n            f\"(no remaining picklist entries; not saving to '{args.output_missing}')\"\n        )\n\n    # save manifest of matching!\n    if args.save_manifest_matching and total_manifest_rows:\n        mf = total_manifest_rows\n        mf.write_to_filename(\n            args.save_manifest_matching, database_format=args.manifest_format\n        )\n        notify(\n            f\"wrote {len(mf)} matching manifest rows to '{args.save_manifest_matching}'\"\n        )\n    elif args.save_manifest_matching:\n        notify(\n            f\"(not saving matching manifest to '{args.save_manifest_matching}' because no matches)\"\n        )\n\n    if args.fail_if_missing and n_missing:\n        error(\"** ERROR: missing values, and --fail-if-missing requested. Exiting.\")\n        sys.exit(-1)\n\n\ndef collect(args):\n    \"Collect signature metadata across many locations, save to manifest\"\n    set_quiet(False, args.debug)\n\n    if args.cli_version == \"v5\":\n        if args.abspath is None:  # not set by user\n            args.relpath = True\n\n    if os.path.exists(args.output):\n        if args.merge_previous:\n            pass\n        else:\n            error(f\"ERROR: '{args.output}' already exists!\")\n            error(\"ERROR: please remove it, or use --merge-previous to merge\")\n            sys.exit(-1)\n    elif args.merge_previous:\n        notify(\n            f\"WARNING: --merge-previous specified, but output file '{args.output}' does not already exist?\"\n        )\n\n    # abspath/relpath checks\n    if args.abspath and args.relpath:\n        error(\"** Cannot specify both --abspath and --relpath; pick one!\")\n        sys.exit(-1)\n\n    # load previous manifest for --merge-previous. This gets tricky with\n    # mismatched manifest types, which we forbid.\n    try:\n        if args.manifest_format == \"sql\":\n            # create on-disk manifest\n            from sourmash.index.sqlite_index import SqliteCollectionManifest\n\n            if args.merge_previous:\n                collected_mf = SqliteCollectionManifest.create_or_open(args.output)\n            else:\n                collected_mf = SqliteCollectionManifest.create(args.output)\n        else:\n            # create in-memory manifest that will be saved as CSV\n            assert args.manifest_format == \"csv\"\n\n            if args.merge_previous and os.path.exists(args.output):\n                collected_mf = CollectionManifest.load_from_filename(args.output)\n            else:\n                collected_mf = CollectionManifest()\n\n            if not isinstance(collected_mf, CollectionManifest):\n                raise Exception\n    except:\n        error(\n            f\"ERROR loading '{args.output}' with --merge-previous. Is it of type {args.manifest_format}?\"\n        )\n        sys.exit(-1)\n\n    if args.merge_previous:\n        notify(f\"merging new locations with {len(collected_mf)} previous rows.\")\n\n    # require manifests? yes by default, since generating can be slow.\n    require_manifest = True\n    if args.no_require_manifest:\n        require_manifest = False\n        debug(\"sig check: manifest will not be required\")\n    else:\n        debug(\"sig check: manifest required\")\n\n    n_files = 0\n\n    # load from_file\n    _extend_signatures_with_from_file(args, target_attr=\"locations\")\n\n    relpath = None\n    if args.relpath:\n        output_manifest_dir = os.path.dirname(args.output)\n        relpath = os.path.relpath(os.curdir, output_manifest_dir)\n\n    # iterate through, loading all the manifests from all the locations.\n    for n_files, loc in enumerate(args.locations):\n        notify(f\"Loading signature information from {loc}.\")\n\n        if n_files and n_files % 100 == 0:\n            notify(f\"... loaded {len(collected_mf)} sigs from {n_files} files\")\n        idx = sourmash.load_file_as_index(loc)\n        if idx.manifest is None and require_manifest:\n            error(f\"ERROR on location '{loc}'\")\n            error(\n                \"sig collect requires a manifest by default, but no manifest present.\"\n            )\n            error(\"specify --no-require-manifest to dynamically generate one.\")\n            sys.exit(-1)\n\n        mf = sourmash_args.get_manifest(idx)\n\n        # decide how to rewrite locations to container:\n        if args.abspath:\n            # convert to abspath\n            new_iloc = os.path.abspath(loc)\n        elif args.relpath:\n            # interpret paths relative to manifest directory\n            if loc.startswith(\"/\"):\n                notify(f\"** WARNING: cannot convert abspath {loc} into relative path.\")\n            new_iloc = os.path.join(relpath, loc)\n        else:\n            # default: paths are relative to cwd. This breaks when sketches\n            # are in subdirectories; will be deprecated for v5.\n            new_iloc = loc\n\n        for row in mf.rows:\n            row[\"internal_location\"] = new_iloc\n            collected_mf.add_row(row)\n\n    if args.manifest_format == \"csv\":\n        collected_mf.write_to_filename(\n            args.output, database_format=\"csv\", ok_if_exists=args.merge_previous\n        )\n    else:\n        collected_mf.close()\n\n    notify(f\"saved {len(collected_mf)} manifest rows to '{args.output}'\")\n\n    return 0\n\n\ndef main(arglist=None):\n    args = sourmash.cli.get_parser().parse_args(arglist)\n    submod = getattr(sourmash.cli.sig, args.subcmd)\n    mainmethod = getattr(submod, \"main\")\n    return mainmethod(args)\n\n\nif __name__ == \"__main__\":\n    main(sys.argv)\n"
  },
  {
    "path": "src/sourmash/sig/grep.py",
    "content": "\"\"\"\nCommand-line entry point for 'python -m sourmash.sig grep'\n\"\"\"\n\nimport sys\nimport re\n\nfrom sourmash import logging, sourmash_args\nfrom sourmash.logging import notify, error, debug, print_results\nfrom sourmash.manifest import CollectionManifest\nfrom .__main__ import _extend_signatures_with_from_file\n\n\ndef main(args):\n    \"\"\"\n    extract signatures by pattern match.\n    \"\"\"\n    # basic argument parsing\n    logging.set_quiet(args.quiet, args.debug)\n    moltype = sourmash_args.calculate_moltype(args)\n    picklist = sourmash_args.load_picklist(args)\n    _extend_signatures_with_from_file(args)\n\n    # build the search pattern\n    pattern = args.pattern\n    if args.ignore_case:\n        pattern = re.compile(pattern, re.IGNORECASE)\n    else:\n        pattern = re.compile(pattern)\n\n    if args.invert_match:\n\n        def search_pattern(vals):\n            return all(not pattern.search(val) for val in vals)\n    else:\n\n        def search_pattern(vals):\n            return any(pattern.search(val) for val in vals)\n\n    # require manifests?\n    require_manifest = True\n    if args.no_require_manifest:\n        require_manifest = False\n        debug(\"sig grep: manifest will not be required\")\n    else:\n        debug(\"sig grep: manifest required\")\n\n    # are we doing --count? if so, enforce --no-sigs so no sigs are printed.\n    if args.count or args.print_matched_names:\n        args.no_sigs = True\n\n    # define output type: signatures, or no?\n    if args.no_sigs:\n        notify(\n            \"(no signatures will be saved because of --no-sigs/--count/--print-matched-names)\"\n        )\n        save_sigs = sourmash_args.SaveSignaturesToLocation(None)\n    else:\n        notify(f\"saving matching signatures to '{args.output}'\")\n        save_sigs = sourmash_args.SaveSignaturesToLocation(args.output)\n        save_sigs.open()\n\n    # are we outputting a CSV? if so, initialize that, too.\n    csv_obj = None\n    if args.csv:\n        csv_obj = sourmash_args.FileOutputCSV(args.csv)\n        csv_fp = csv_obj.open()\n        CollectionManifest.write_csv_header(csv_fp)\n\n    # start loading!\n    total_rows_examined = 0\n    seen = set()\n    for filename in args.signatures:\n        idx = sourmash_args.load_file_as_index(filename, yield_all_files=args.force)\n\n        idx = idx.select(ksize=args.ksize, moltype=moltype, picklist=picklist)\n\n        # get (and maybe generate) the manifest.\n        manifest = idx.manifest\n        if manifest is None:\n            if require_manifest:\n                error(f\"ERROR on filename '{filename}'.\")\n                error(\n                    \"sig grep requires a manifest by default, but no manifest present.\"\n                )\n                error(\"specify --no-require-manifest to dynamically generate one.\")\n                sys.exit(-1)\n            else:\n                manifest = sourmash_args.get_manifest(idx, require=False)\n\n        # find all matching rows.\n        sub_manifest = manifest.filter_on_columns(\n            search_pattern, [\"name\", \"filename\", \"md5\"]\n        )\n        total_rows_examined += len(manifest)\n\n        # write out to CSV, if desired.\n        if args.csv:\n            sub_manifest.write_to_csv(csv_fp)\n\n        # just print out number of matches?\n        if args.count:\n            print_results(f\"{len(sub_manifest)} matches: {filename}\")\n        elif args.print_matched_names:\n            for row in sub_manifest.rows:\n                name = row[\"name\"]\n                if name not in seen:\n                    print_results(name)\n                    seen.add(name)\n        elif not args.no_sigs:\n            # nope - do output signatures. convert manifest to picklist, apply.\n            sub_picklist = sub_manifest.to_picklist()\n\n            try:\n                idx = idx.select(picklist=sub_picklist)\n            except ValueError:\n                error(\"** This input collection doesn't support 'grep' with picklists.\")\n                error(\"** EXITING.\")\n                error(\"**\")\n                error(\"** You can use 'sourmash sig cat' with a picklist,\")\n                error(\"** and then pipe the output to 'sourmash sig grep -\")\n                sys.exit(-1)\n\n            # save!\n            for ss in idx.signatures():\n                save_sigs.add(ss)\n    # done with the big loop over all indexes!\n\n    if args.no_sigs:\n        pass\n    else:\n        notify(f\"loaded {total_rows_examined} total that matched ksize & molecule type\")\n\n        if save_sigs:\n            notify(\n                f\"extracted {len(save_sigs)} signatures from {len(args.signatures)} file(s)\"\n            )\n            save_sigs.close()\n        else:\n            error(\"no matching signatures found!\")\n            sys.exit(-1)\n\n    if args.csv:\n        notify(f\"wrote manifest containing all matches to CSV file '{args.csv}'\")\n        csv_obj.close()\n\n    if picklist:\n        sourmash_args.report_picklist(args, picklist)\n"
  },
  {
    "path": "src/sourmash/signature.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nSave and load MinHash sketches in a JSON format, along with some metadata.\n\"\"\"\n\nimport sys\nimport os\nimport weakref\nfrom enum import Enum\nimport contextlib\n\nfrom .logging import error\nfrom . import MinHash\nfrom .minhash import to_bytes, FrozenMinHash\nfrom ._lowlevel import ffi, lib\nfrom .utils import RustObject, rustcall, decode_str\n\n\nSIGNATURE_VERSION = 0.4\n\n\nclass SigInput(Enum):\n    FILE_LIKE = 1\n    PATH = 2\n    BUFFER = 3\n    UNKNOWN = 4\n\n\nclass SourmashSignature(RustObject):\n    \"Main class for signature information.\"\n\n    __dealloc_func__ = lib.signature_free\n\n    def __init__(self, minhash, name=\"\", filename=\"\"):\n        self._objptr = lib.signature_new()\n\n        if name:\n            self.name = name\n        if filename:\n            self.filename = filename\n\n        self.minhash = minhash\n\n    @property\n    def minhash(self):\n        return FrozenMinHash._from_objptr(self._methodcall(lib.signature_first_mh))\n\n    @minhash.setter\n    def minhash(self, value):\n        # TODO: validate value is a MinHash\n        self._methodcall(lib.signature_set_mh, value._objptr)\n\n    def __hash__(self):\n        return hash(self.md5sum())\n\n    def __str__(self):\n        return self._display_name()\n\n    def __repr__(self):\n        name = self.name\n        md5pref = self.md5sum()[:8]\n        if name == md5pref:\n            return f\"SourmashSignature({md5pref})\"\n        else:  # name != md5pref:\n            return f\"SourmashSignature('{name}', {md5pref})\"\n\n    # def minhashes(self):\n    #    size = ffi.new(\"uintptr_t *\")\n    #    mhs_ptr = self._methodcall(lib.signature_get_mhs, size)\n    #    size = ffi.unpack(size, 1)[0]\n    #\n    #    mhs = []\n    #    for i in range(size):\n    #        mh = MinHash._from_objptr(mhs_ptr[i])\n    #        mhs.append(mh)\n    #\n    #    return mhs\n\n    def md5sum(self):\n        \"Calculate md5 hash of the bottom sketch, specifically.\"\n        return decode_str(self.minhash._methodcall(lib.kmerminhash_md5sum))\n\n    def __eq__(self, other):\n        return self._methodcall(lib.signature_eq, other._objptr)\n\n    @property\n    def _name(self):\n        return decode_str(self._methodcall(lib.signature_get_name))\n\n    @_name.setter\n    def _name(self, value):\n        self._methodcall(lib.signature_set_name, to_bytes(value))\n\n    @property\n    def name(self):\n        return decode_str(self._methodcall(lib.signature_get_name))\n\n    @name.setter\n    def name(self, value):\n        self._methodcall(lib.signature_set_name, to_bytes(value))\n\n    def __ne__(self, other):\n        return not self == other\n\n    @property\n    def filename(self):\n        return decode_str(self._methodcall(lib.signature_get_filename))\n\n    @filename.setter\n    def filename(self, value):\n        self._methodcall(lib.signature_set_filename, to_bytes(value))\n\n    @property\n    def license(self):\n        return decode_str(self._methodcall(lib.signature_get_license))\n\n    def _display_name(self, max_length=0):\n        name = self._name\n        filename = self.filename\n\n        if name:\n            if max_length and len(name) > max_length:\n                name = name[: max_length - 3] + \"...\"\n        elif filename:\n            name = filename\n            if max_length and len(name) > max_length:\n                name = \"...\" + name[-max_length + 3 :]\n        else:\n            name = self.md5sum()[:8]\n        assert not max_length or len(name) <= max_length\n        return name\n\n    def display(self, location=None):\n        \"Print a summary of this signature.\"\n        mh = self.minhash\n        sum_hashes = sum(mh.hashes.values())\n\n        print(\n            f\"\"\"\\\n  signature filename: {location or \"N/A\"}\n  signature name: {self.name}\n  source filename: {self.filename or \"N/A\"}\n  md5: {self.md5sum()}\n  k={mh.ksize} molecule={mh.moltype} num={mh.num} scaled={mh.scaled} track_abundance={mh.track_abundance}\n  size: {len(mh)}\n  sum hashes: {sum_hashes}\n  signature license: {self.license}\n\"\"\"\n        )\n\n    def similarity(self, other, ignore_abundance=False, downsample=False):\n        \"Compute similarity with the other signature.\"\n        return self.minhash.similarity(\n            other.minhash, ignore_abundance=ignore_abundance, downsample=downsample\n        )\n\n    def jaccard(self, other, downsample=False):\n        \"Compute Jaccard similarity with the other MinHash signature.\"\n        return self.minhash.similarity(\n            other.minhash, ignore_abundance=True, downsample=downsample\n        )\n\n    def jaccard_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        jaccard=None,\n        prob_threshold=1e-3,\n        err_threshold=1e-4,\n    ):\n        \"Use jaccard to estimate ANI between two FracMinHash signatures.\"\n        return self.minhash.jaccard_ani(\n            other.minhash,\n            downsample=downsample,\n            jaccard=jaccard,\n            prob_threshold=prob_threshold,\n            err_threshold=err_threshold,\n        )\n\n    def angular_similarity(self, other, downsample=False):\n        \"Compute angular similarity with the other signature.\"\n        return self.minhash.angular_similarity(other.minhash, downsample=downsample)\n\n    def contained_by(self, other, downsample=False):\n        \"Compute containment by the other signature. Note: ignores abundance.\"\n        return self.minhash.contained_by(other.minhash, downsample=downsample)\n\n    def contained_by_weighted(self, other):\n        \"Compute containment by the other signature. Weight by abundance in self.\"\n        return self.minhash.contained_by_weighted(other.minhash)\n\n    def containment_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        containment=None,\n        confidence=0.95,\n        estimate_ci=False,\n    ):\n        \"Use containment to estimate ANI between two FracMinHash signatures.\"\n        return self.minhash.containment_ani(\n            other.minhash,\n            downsample=downsample,\n            containment=containment,\n            confidence=confidence,\n            estimate_ci=estimate_ci,\n        )\n\n    def max_containment(self, other, downsample=False):\n        \"Compute max containment w/other signature. Note: ignores abundance.\"\n        return self.minhash.max_containment(other.minhash, downsample=downsample)\n\n    def max_containment_ani(\n        self,\n        other,\n        *,\n        downsample=False,\n        max_containment=None,\n        confidence=0.95,\n        estimate_ci=False,\n    ):\n        \"Use max containment to estimate ANI between two FracMinHash signatures.\"\n        return self.minhash.max_containment_ani(\n            other.minhash,\n            downsample=downsample,\n            max_containment=max_containment,\n            confidence=confidence,\n            estimate_ci=estimate_ci,\n        )\n\n    def avg_containment(self, other, downsample=False):\n        \"\"\"\n        Calculate average containment.\n        Note: this is average of the containments, *not* count_common/ avg_denom\n        \"\"\"\n        return self.minhash.avg_containment(other.minhash, downsample=downsample)\n\n    def avg_containment_ani(self, other, *, downsample=False):\n        \"\"\"\n        Calculate average containment ANI.\n        Note: this is average of the containment ANI's, *not* ANI using count_common/ avg_denom\n        \"\"\"\n        return self.minhash.avg_containment_ani(other.minhash, downsample=downsample)\n\n    def add_sequence(self, sequence, force=False):\n        self._methodcall(lib.signature_add_sequence, to_bytes(sequence), force)\n\n    def add_protein(self, sequence):\n        self._methodcall(lib.signature_add_protein, to_bytes(sequence))\n\n    @staticmethod\n    def from_params(params):\n        ptr = rustcall(lib.signature_from_params, params._get_objptr())\n        return SourmashSignature._from_objptr(ptr)\n\n    def __len__(self):\n        return self._methodcall(lib.signature_len)\n\n    def __getstate__(self):  # enable pickling\n        return (\n            self.minhash,\n            self.name,\n            self.filename,\n        )\n\n    def __setstate__(self, tup):\n        (mh, name, filename) = tup\n        self.__del__()\n\n        self._objptr = lib.signature_new()\n        if name:\n            self.name = name\n        if filename:\n            self.filename = filename\n        self.minhash = mh\n\n    def __reduce__(self):\n        return (\n            SourmashSignature,\n            (self.minhash, self.name, self.filename),\n        )\n\n    def __copy__(self):\n        a = SourmashSignature(\n            self.minhash,\n            name=self.name,\n            filename=self.filename,\n        )\n        return a\n\n    copy = __copy__\n\n    def to_frozen(self):\n        \"Return a frozen copy of this signature.\"\n        new_ss = self.copy()\n        new_ss.__class__ = FrozenSourmashSignature\n        return new_ss\n\n    def to_mutable(self):\n        \"Return a mutable copy of this signature.\"\n        return self.copy()\n\n    def into_frozen(self):\n        \"Freeze this signature, preventing attribute changes.\"\n        # this will always be the case b/c minhash property returns FrozenMH:\n        # assert isinstance(self.minhash, FrozenMinHash)\n        self.__class__ = FrozenSourmashSignature\n\n\nclass FrozenSourmashSignature(SourmashSignature):\n    \"Frozen (immutable) signature class.\"\n\n    @SourmashSignature.minhash.setter\n    def minhash(self, value):\n        raise ValueError(\"cannot set .minhash on FrozenSourmashSignature\")\n\n    @SourmashSignature._name.setter\n    def _name(self, value):\n        raise ValueError(\"cannot set ._name on FrozenSourmashSignature\")\n\n    @SourmashSignature.name.setter\n    def name(self, value):\n        raise ValueError(\"cannot set .name on FrozenSourmashSignature\")\n\n    @SourmashSignature.filename.setter\n    def filename(self, value):\n        raise ValueError(\"cannot set .filename on FrozenSourmashSignature\")\n\n    def add_sequence(self, sequence, force=False):\n        raise ValueError(\"cannot add sequence data to FrozenSourmashSignature\")\n\n    def add_protein(self, sequence):\n        raise ValueError(\"cannot add protein sequence to FrozenSourmashSignature\")\n\n    def __copy__(self):\n        return self\n\n    copy = __copy__\n\n    def to_frozen(self):\n        \"Return a frozen copy of this signature.\"\n        return self\n\n    def to_mutable(self):\n        \"Turn this object into a mutable object.\"\n        mut = SourmashSignature.__new__(SourmashSignature)\n        state_tup = self.__getstate__()\n        mut.__setstate__(state_tup)\n        return mut\n\n    def into_frozen(self):\n        \"Freeze this signature, preventing attribute changes.\"\n        self.__class__ = FrozenSourmashSignature\n\n    @contextlib.contextmanager\n    def update(self):\n        \"\"\"Make a mutable copy of this signature for modification, then freeze.\n\n        This is a context manager that implements:\n\n        new_sig = this_sig.copy()\n        new_sig.to_mutable()\n        # modify new_sig\n        new_sig.into_frozen()\n\n        This could be made more efficient by _not_ copying the signature,\n        but that is non-intuitive and leads to hard-to-find bugs.\n        \"\"\"\n        new_copy = self.to_mutable()\n        yield new_copy\n        new_copy.into_frozen()\n\n\ndef _detect_input_type(data):\n    \"\"\"\\\n    Determine how to load input from `data`. Returns SigInput enum.\n\n    Checks for:\n     - Python file-like objects\n     - JSON text (uncompressed sigs)\n     - Compressed memory buffers\n     - filename\n    \"\"\"\n    if (\n        hasattr(data, \"read\") or hasattr(data, \"fileno\") or hasattr(data, \"mode\")\n    ):  # file-like object\n        return SigInput.FILE_LIKE\n    elif hasattr(data, \"find\"):  # check if it is uncompressed sig\n        try:\n            if data.find(\"sourmash_signature\") > 0:\n                return SigInput.BUFFER\n        except TypeError:\n            if data.find(b\"sourmash_signature\") > 0:\n                return SigInput.BUFFER\n            elif data.startswith(b\"\\x1f\\x8b\"):  # gzip compressed\n                return SigInput.BUFFER\n\n    try:\n        if os.path.exists(data):  # filename\n            return SigInput.PATH\n    except (ValueError, TypeError):  # No idea...\n        return SigInput.UNKNOWN\n\n    return SigInput.UNKNOWN\n\n\ndef load_signatures_from_json(\n    data,\n    ksize=None,\n    select_moltype=None,\n    ignore_md5sum=False,\n    do_raise=False,\n):\n    \"\"\"Load a JSON string with signatures into classes.\n\n    Returns iterator over SourmashSignature objects.\n\n    Note, the order is not necessarily the same as what is in the source file.\n    \"\"\"\n    if ksize is not None:\n        ksize = int(ksize)\n    else:\n        ksize = 0\n\n    if not data:\n        return\n\n    if select_moltype is None:\n        select_moltype = ffi.NULL\n    else:\n        try:\n            select_moltype = select_moltype.encode(\"utf-8\")\n        except AttributeError:\n            pass\n\n    input_type = _detect_input_type(data)\n    if input_type == SigInput.UNKNOWN:\n        if do_raise:\n            raise ValueError(\n                \"Error in parsing signature; quitting. Cannot open file or invalid signature\"\n            )\n        return\n\n    size = ffi.new(\"uintptr_t *\")\n\n    try:\n        if input_type == SigInput.FILE_LIKE:\n            if (\n                hasattr(data, \"mode\") and \"t\" in data.mode\n            ):  # need to reopen handler as binary\n                data = data.buffer\n\n            buf = data.read()\n            data.close()\n            data = buf\n            input_type = SigInput.BUFFER\n\n        elif input_type == SigInput.PATH:\n            sigs_ptr = rustcall(\n                lib.signatures_load_path,\n                data.encode(\"utf-8\"),\n                ignore_md5sum,\n                ksize,\n                select_moltype,\n                size,\n            )\n\n        if input_type == SigInput.BUFFER:\n            if hasattr(data, \"encode\"):\n                data = data.encode(\"utf-8\")\n\n            sigs_ptr = rustcall(\n                lib.signatures_load_buffer,\n                data,\n                len(data),\n                ignore_md5sum,\n                ksize,\n                select_moltype,\n                size,\n            )\n\n        size = size[0]\n\n        sigs = []\n        for i in range(size):\n            sig = SourmashSignature._from_objptr(sigs_ptr[i])\n            sigs.append(sig)\n\n        for sig in sigs:\n            yield sig.to_frozen()\n\n    except Exception:\n        if do_raise:\n            raise\n\n\ndef load_one_signature_from_json(\n    data, ksize=None, select_moltype=None, ignore_md5sum=False\n):\n    sigiter = load_signatures_from_json(\n        data, ksize=ksize, select_moltype=select_moltype, ignore_md5sum=ignore_md5sum\n    )\n\n    try:\n        first_sig = next(sigiter)\n    except StopIteration:\n        raise ValueError(\"no signatures to load\")\n\n    try:\n        next(sigiter)\n    except StopIteration:\n        return first_sig\n\n    raise ValueError(\"expected to load exactly one signature\")\n\n\ndef save_signatures_to_json(siglist, fp=None, compression=0):\n    \"Save multiple signatures into a JSON string (or into file handle 'fp')\"\n    attached_refs = weakref.WeakKeyDictionary()\n\n    # get list of rust objects\n    collected = []\n    for obj in siglist:\n        rv = obj._get_objptr()\n        attached_refs[rv] = obj\n        collected.append(rv)\n    siglist_c = ffi.new(\"SourmashSignature*[]\", collected)\n\n    size = ffi.new(\"uintptr_t *\")\n\n    # save signature into a string (potentially compressed)\n    rawbuf = rustcall(\n        lib.signatures_save_buffer, siglist_c, len(collected), compression, size\n    )\n    size = size[0]\n\n    # associate a finalizer with rawbuf so that it gets freed\n    buf = ffi.gc(rawbuf, lambda o: lib.nodegraph_buffer_free(o, size), size)\n    if compression:\n        result = ffi.buffer(buf, size)[:]\n    else:\n        result = ffi.string(buf, size)\n\n    if fp is None:  # return string\n        return result\n    else:\n        try:  # write to file\n            fp.write(result)\n        except TypeError:\n            fp.write(result.decode(\"utf-8\"))\n        return None\n"
  },
  {
    "path": "src/sourmash/sketchcomparison.py",
    "content": "\"\"\"\nSketch Comparison Classes\n\"\"\"\n\nimport numpy as np\nfrom dataclasses import dataclass\n\nfrom .minhash import MinHash\n\n\n@dataclass\nclass BaseMinHashComparison:\n    \"\"\"Class for standard comparison between two MinHashes\"\"\"\n\n    mh1: MinHash\n    mh2: MinHash\n    ignore_abundance: bool = False  # optionally ignore abundances\n    jaccard_ani_untrustworthy: bool = False\n\n    def downsample_and_handle_ignore_abundance(self, cmp_num=None, cmp_scaled=None):\n        \"\"\"\n        Downsample and/or flatten minhashes for comparison\n        \"\"\"\n        if self.ignore_abundance:\n            self.mh1_cmp = self.mh1.flatten()\n            self.mh2_cmp = self.mh2.flatten()\n        else:\n            self.mh1_cmp = self.mh1\n            self.mh2_cmp = self.mh2\n        if cmp_scaled is not None:\n            self.mh1_cmp = self.mh1_cmp.downsample(scaled=cmp_scaled)\n            self.mh2_cmp = self.mh2_cmp.downsample(scaled=cmp_scaled)\n        elif cmp_num is not None:\n            self.mh1_cmp = self.mh1_cmp.downsample(num=cmp_num)\n            self.mh2_cmp = self.mh2_cmp.downsample(num=cmp_num)\n        else:\n            raise ValueError(\"Error: must pass in a comparison scaled or num value.\")\n\n    def check_compatibility_and_downsample(self, cmp_num=None, cmp_scaled=None):\n        if not any(\n            [(self.mh1.num and self.mh2.num), (self.mh1.scaled and self.mh2.scaled)]\n        ):\n            raise TypeError(\"Error: Both sketches must be 'num' or 'scaled'.\")\n\n        # need to downsample first because is_compatible checks scaled (though does not check num)\n        self.downsample_and_handle_ignore_abundance(\n            cmp_num=cmp_num, cmp_scaled=cmp_scaled\n        )\n        if not self.mh1_cmp.is_compatible(self.mh2_cmp):\n            raise TypeError(\"Error: Cannot compare incompatible sketches.\")\n        self.ksize = self.mh1.ksize\n        self.moltype = self.mh1.moltype\n\n    @property\n    def intersect_mh(self):\n        # flatten and intersect\n        return self.mh1_cmp.flatten().intersection(self.mh2_cmp.flatten())\n\n    @property\n    def jaccard(self):\n        return self.mh1_cmp.jaccard(self.mh2_cmp)\n\n    def estimate_jaccard_ani(self, jaccard=None):\n        jinfo = self.mh1_cmp.jaccard_ani(self.mh2_cmp, jaccard=jaccard)\n        # propagate params\n        self.jaccard_ani = jinfo.ani\n        if jinfo.p_exceeds_threshold:\n            self.potential_false_negative = True\n        self.jaccard_ani_untrustworthy = jinfo.je_exceeds_threshold\n\n    @property\n    def angular_similarity(self):\n        # Note: this currently throws TypeError if self.ignore_abundance.\n        return self.mh1_cmp.angular_similarity(self.mh2_cmp)\n\n    @property\n    def cosine_similarity(self):\n        return self.angular_similarity\n\n\n@dataclass\nclass NumMinHashComparison(BaseMinHashComparison):\n    \"\"\"Class for standard comparison between two num minhashes\"\"\"\n\n    cmp_num: int = None\n\n    def __post_init__(self):\n        \"Initialize NumMinHashComparison using values from provided MinHashes\"\n        if self.cmp_num is None:  # record the num we're doing this comparison on\n            self.cmp_num = min(self.mh1.num, self.mh2.num)\n        self.check_compatibility_and_downsample(cmp_num=self.cmp_num)\n\n    @property\n    def size_may_be_inaccurate(self):\n        return False  # not using size estimation, can ignore\n\n\n@dataclass\nclass FracMinHashComparison(BaseMinHashComparison):\n    \"\"\"Class for standard comparison between two scaled minhashes\"\"\"\n\n    cmp_scaled: int = None  # optionally force scaled value for this comparison\n    threshold_bp: int = 0\n    estimate_ani_ci: bool = False\n    ani_confidence: float = 0.95\n    #    pfn_threshold: float = 1e-3\n\n    def __post_init__(self):\n        \"Initialize ScaledComparison using values from provided FracMinHashes\"\n        if self.cmp_scaled is None:\n            # comparison scaled defaults to maximum scaled between the two sigs\n            self.cmp_scaled = max(self.mh1.scaled, self.mh2.scaled)\n        self.check_compatibility_and_downsample(cmp_scaled=self.cmp_scaled)\n        self.potential_false_negative = False\n\n    @property\n    def pass_threshold(self):\n        return self.total_unique_intersect_hashes >= self.threshold_bp\n\n    @property\n    def size_may_be_inaccurate(self):\n        # if either size estimation may be inaccurate\n        # NOTE: do we want to do this at original scaled instead?\n        if not self.mh1_cmp.size_is_accurate() or not self.mh2_cmp.size_is_accurate():\n            return True\n        return False\n\n    @property\n    def total_unique_intersect_hashes(self):\n        \"\"\"\n        approx equal to intersect_bp\n        To get true bp estimates, we would need to add `(k-1)`. However, this complicates\n        the iterative gather algorithm, so let's stick with hashes.\n        \"\"\"\n        return (\n            len(self.intersect_mh) * self.cmp_scaled\n        )  # + (ksize-1) #for bp estimation\n\n    @property\n    def mh1_containment_in_mh2(self):\n        return self.mh1_cmp.contained_by(self.mh2_cmp)\n\n    def estimate_ani_from_mh1_containment_in_mh2(self, containment=None):\n        # build result once\n        m1_cani = self.mh1_cmp.containment_ani(\n            self.mh2_cmp,\n            containment=containment,\n            confidence=self.ani_confidence,\n            estimate_ci=self.estimate_ani_ci,\n        )\n        #                                            prob_threshold=self.pfn_threshold)\n        # propagate params\n        self.ani_from_mh1_containment_in_mh2 = m1_cani.ani\n        if m1_cani.p_exceeds_threshold:\n            # only update if True\n            self.potential_false_negative = True\n        if self.estimate_ani_ci:\n            self.ani_from_mh1_containment_in_mh2_low = m1_cani.ani_low\n            self.ani_from_mh1_containment_in_mh2_high = m1_cani.ani_high\n\n    @property\n    def mh2_containment_in_mh1(self):\n        return self.mh2_cmp.contained_by(self.mh1_cmp)\n\n    def estimate_ani_from_mh2_containment_in_mh1(self, containment=None):\n        m2_cani = self.mh2_cmp.containment_ani(\n            self.mh1_cmp,\n            containment=containment,\n            confidence=self.ani_confidence,\n            estimate_ci=self.estimate_ani_ci,\n        )\n        #                                            prob_threshold=self.pfn_threshold)\n        self.ani_from_mh2_containment_in_mh1 = m2_cani.ani\n        if m2_cani.p_exceeds_threshold:\n            self.potential_false_negative = True\n        if self.estimate_ani_ci:\n            self.ani_from_mh2_containment_in_mh1_low = m2_cani.ani_low\n            self.ani_from_mh2_containment_in_mh1_high = m2_cani.ani_high\n\n    @property\n    def max_containment(self):\n        return self.mh1_cmp.max_containment(self.mh2_cmp)\n\n    def estimate_max_containment_ani(self, max_containment=None):\n        mc_ani_info = self.mh1_cmp.max_containment_ani(\n            self.mh2_cmp,\n            max_containment=max_containment,\n            confidence=self.ani_confidence,\n            estimate_ci=self.estimate_ani_ci,\n        )\n        #                                                prob_threshold=self.pfn_threshold)\n        # propagate params\n        self.max_containment_ani = mc_ani_info.ani\n        if mc_ani_info.p_exceeds_threshold:\n            self.potential_false_negative = True\n        if self.estimate_ani_ci:\n            self.max_containment_ani_low = mc_ani_info.ani_low\n            self.max_containment_ani_high = mc_ani_info.ani_high\n\n    @property\n    def avg_containment(self):\n        return self.mh1_cmp.avg_containment(self.mh2_cmp)\n\n    @property\n    def avg_containment_ani(self):\n        \"Returns single average_containment_ani value. Sets self.potential_false_negative internally.\"\n        self.estimate_ani_from_mh1_containment_in_mh2()\n        self.estimate_ani_from_mh2_containment_in_mh1()\n        if any(\n            [\n                self.ani_from_mh1_containment_in_mh2 is None,\n                self.ani_from_mh2_containment_in_mh1 is None,\n            ]\n        ):\n            return None\n        else:\n            return (\n                self.ani_from_mh1_containment_in_mh2\n                + self.ani_from_mh2_containment_in_mh1\n            ) / 2\n\n    def estimate_all_containment_ani(self):\n        \"Estimate all containment ANI values.\"\n        self.estimate_ani_from_mh1_containment_in_mh2()\n        self.estimate_ani_from_mh2_containment_in_mh1()\n        if any(\n            [\n                self.ani_from_mh1_containment_in_mh2 is None,\n                self.ani_from_mh2_containment_in_mh1 is None,\n            ]\n        ):\n            #            self.estimate_max_containment_ani()\n            self.max_containment_ani = None\n        else:\n            self.max_containment_ani = max(\n                [\n                    self.ani_from_mh1_containment_in_mh2,\n                    self.ani_from_mh2_containment_in_mh1,\n                ]\n            )\n\n    def weighted_intersection(self, from_mh=None, from_abundD={}):\n        # map abundances to all intersection hashes.\n        abund_mh = self.intersect_mh.copy_and_clear()\n        abund_mh.track_abundance = True\n        # if from_mh is provided, it takes precedence over from_abund dict\n        if from_mh is not None and from_mh.track_abundance:\n            from_abundD = from_mh.hashes\n        if from_abundD:\n            # this sets any hash not present in abundD to 1. Is that desired? Or should we return 0?\n            abunds = {k: from_abundD.get(k, 1) for k in self.intersect_mh.hashes}\n            abund_mh.set_abundances(abunds)\n            return abund_mh\n        # if no abundances are passed in, return intersect_mh\n        # future note: do we want to return 1 as abundance instead?\n        return self.intersect_mh\n"
  },
  {
    "path": "src/sourmash/sourmash_args.py",
    "content": "\"\"\"\nUtility functions for sourmash CLI commands.\n\nThe sourmash_args submodule contains functions that help with various\ncommand-line functions. Library functions in this module often directly\nsend output to stdout/stderr in support of the CLI, and/or call\nsys.exit to exit.\n\nargparse functionality:\n\n* check_scaled_bounds(args) -- check that --scaled is reasonable\n* check_num_bounds(args) -- check that --num is reasonable\n* get_moltype(args) -- verify that moltype selected is legit\n* calculate_moltype(args) -- confirm that only one moltype was selected\n* load_picklist(args) -- create a SignaturePicklist from --picklist args\n* report_picklist(args, picklist) -- report on picklist value usage/matches\n* load_include_exclude_db_patterns(args) -- load --include-db-pattern / --exclude-db-pattern\n* apply_picklist_and_pattern(db, ...) -- subselect db on picklist and pattern\n\nsignature/database loading functionality:\n\n* load_query_signature(filename, ...) -- load a single signature for query\n* traverse_find_sigs(filenames, ...) -- find all .sig and .sig.gz files\n* load_dbs_and_sigs(filenames, query, ...) -- load databases & signatures\n* load_pathlist_from_file(filename) -- load a list of paths from a file\n* load_many_signatures(locations) -- load many signatures from many files\n* get_manifest(idx) -- retrieve or build a manifest from an Index\n* class SignatureLoadingProgress - signature loading progress bar\n* load_file_as_signatures(filename, ...) -- load a list of signatures\n\nsignature and file output functionality:\n\n* class FileOutput - file output context manager that deals w/stdout well\n* class FileOutputCSV - file output context manager for CSV files\n\nmisc support:\n* FileInputCSV - context manager for reading CSVs\n\"\"\"\n\nimport sys\nimport os\nimport csv\nimport gzip\nfrom io import TextIOWrapper\nimport re\nimport zipfile\nimport contextlib\nimport argparse\n\nfrom .logging import notify, error, debug_literal\n\nfrom .index import LinearIndex\nfrom .picklist import SignaturePicklist, PickStyle\nfrom .manifest import CollectionManifest\nfrom .save_load import SaveSignaturesToLocation, load_file_as_index, _load_database\n\n\nDEFAULT_LOAD_K = 31\n\n\ndef check_scaled_bounds(arg):\n    f = float(arg)\n\n    if f < 0:\n        raise argparse.ArgumentTypeError(\"ERROR: scaled value must be positive\")\n    if f < 100:\n        notify(\"WARNING: scaled value should be >= 100. Continuing anyway.\")\n    if f > 1e6:\n        notify(\"WARNING: scaled value should be <= 1e6. Continuing anyway.\")\n    return f\n\n\ndef check_num_bounds(arg):\n    f = int(arg)\n\n    if f < 0:\n        raise argparse.ArgumentTypeError(\"ERROR: num value must be positive\")\n    if f < 50:\n        notify(\"WARNING: num value should be >= 50. Continuing anyway.\")\n    if f > 50000:\n        notify(\"WARNING: num value should be <= 50000. Continuing anyway.\")\n    return f\n\n\ndef get_moltype(sig, require=False):\n    mh = sig.minhash\n    if mh.moltype in (\"DNA\", \"dayhoff\", \"hp\", \"protein\", \"skipm1n3\", \"skipm2n3\"):\n        moltype = mh.moltype\n    else:\n        raise ValueError(f\"unknown molecule type for sig {sig}\")\n\n    return moltype\n\n\ndef calculate_moltype(args, default=None):\n    moltype = default\n\n    n = 0\n    if args.dna:\n        moltype = \"DNA\"\n        n += 1\n    if args.dayhoff:\n        moltype = \"dayhoff\"\n        n += 1\n    if args.hp:\n        moltype = \"hp\"\n        n += 1\n    if args.protein:\n        moltype = \"protein\"\n        n += 1\n\n    if args.skipm1n3:\n        moltype = \"skipm1n3\"\n\n    if args.skipm2n3:\n        moltype = \"skipm2n3\"\n\n    if n > 1:\n        error(\n            \"cannot specify more than one of --dna/--rna/--nucleotide/--protein/--hp/--dayhoff/--skipm1n3/--skipm2n3\"\n        )\n        sys.exit(-1)\n\n    return moltype\n\n\ndef load_picklist(args):\n    \"Load a SignaturePicklist from --picklist arguments.\"\n    picklist = None\n    if args.picklist:\n        try:\n            picklist = SignaturePicklist.from_picklist_args(args.picklist)\n\n            notify(\n                f\"picking column '{picklist.column_name}' of type '{picklist.coltype}' from '{picklist.pickfile}'\"\n            )\n\n            n_empty_val, dup_vals = picklist.load()\n        except ValueError as exc:\n            error(\"ERROR: could not load picklist.\")\n            error(str(exc))\n            sys.exit(-1)\n\n        notify(f\"loaded {len(picklist.pickset)} distinct values into picklist.\")\n        if n_empty_val:\n            notify(\n                f\"WARNING: {n_empty_val} empty values in column '{picklist.column_name}' in picklist file\"\n            )\n        if dup_vals:\n            notify(\n                f\"WARNING: {len(dup_vals)} values in picklist column '{picklist.column_name}' were not distinct\"\n            )\n\n    return picklist\n\n\ndef report_picklist(args, picklist):\n    if picklist.pickstyle == PickStyle.INCLUDE:\n        notify(\n            f\"for given picklist, found {len(picklist.found)} matches to {len(picklist.pickset)} distinct values\"\n        )\n        n_missing = len(picklist.pickset - picklist.found)\n    elif picklist.pickstyle == PickStyle.EXCLUDE:\n        notify(\n            f\"for given picklist, found {len(picklist.found)} matches by excluding {len(picklist.pickset)} distinct values\"\n        )\n        n_missing = 0\n    if n_missing:\n        notify(f\"WARNING: {n_missing} missing picklist values.\")\n        # Note - picklist_require_all is currently only relevant for PickStyle.INCLUDE\n        if args.picklist_require_all:\n            error(\"ERROR: failing because --picklist-require-all was set\")\n            sys.exit(-1)\n\n\ndef load_include_exclude_db_patterns(args):\n    if args.picklist and (args.include_db_pattern or args.exclude_db_pattern):\n        error(\n            \"ERROR: --picklist and --include-db-pattern/--exclude cannot be used together.\"\n        )\n        sys.exit(-1)\n\n    if args.include_db_pattern and args.exclude_db_pattern:\n        error(\n            \"ERROR: --include-db-pattern and --exclude-db-pattern cannot be used together.\"\n        )\n        sys.exit(-1)\n\n    if args.include_db_pattern:\n        pattern = re.compile(args.include_db_pattern, re.IGNORECASE)\n\n        def search_pattern(vals):\n            return any(pattern.search(val) for val in vals)\n\n    elif args.exclude_db_pattern:\n        pattern = re.compile(args.exclude_db_pattern, re.IGNORECASE)\n\n        def search_pattern(vals):\n            return all(not pattern.search(val) for val in vals)\n\n    else:\n        search_pattern = None\n\n    return search_pattern\n\n\ndef apply_picklist_and_pattern(db, picklist, pattern):\n    assert not (picklist and pattern)\n    if picklist:\n        db = db.select(picklist=picklist)\n    elif pattern:\n        manifest = db.manifest\n        if manifest is None:\n            error(f\"ERROR on filename '{db.location}'.\")\n            error(\"--include-db-pattern/--exclude-db-pattern require a manifest.\")\n            sys.exit(-1)\n\n        manifest = manifest.filter_on_columns(pattern, [\"name\", \"filename\", \"md5\"])\n        pattern_picklist = manifest.to_picklist()\n        db = db.select(picklist=pattern_picklist)\n\n    return db\n\n\ndef load_query_signature(filename, ksize, select_moltype, select_md5=None):\n    \"\"\"Load a single signature to use as a query.\n\n    Uses load_file_as_signatures underneath, so can load from collections\n    and indexed databases.\n    \"\"\"\n    try:\n        sl = load_file_as_signatures(\n            filename, ksize=ksize, select_moltype=select_moltype\n        )\n        sl = list(sl)\n    except (OSError, ValueError):\n        error(f\"Cannot open query file '{filename}'\")\n        sys.exit(-1)\n\n    if len(sl) and select_md5:\n        found_sig = None\n        for sig in sl:\n            sig_md5 = sig.md5sum()\n            if sig_md5.startswith(select_md5.lower()):\n                # make sure we pick only one --\n                if found_sig is not None:\n                    error(f\"Error! Multiple signatures start with md5 '{select_md5}'\")\n                    error(\"Please use a longer --md5 selector.\")\n                    sys.exit(-1)\n                else:\n                    found_sig = sig\n\n            sl = [found_sig]\n\n    if len(sl) and ksize is None:\n        ksizes = set([ss.minhash.ksize for ss in sl])\n        if len(ksizes) == 1:\n            ksize = ksizes.pop()\n            sl = [ss for ss in sl if ss.minhash.ksize == ksize]\n            notify(f\"select query k={ksize} automatically.\")\n        elif DEFAULT_LOAD_K in ksizes:\n            sl = [ss for ss in sl if ss.minhash.ksize == DEFAULT_LOAD_K]\n            notify(f\"selecting default query k={DEFAULT_LOAD_K}.\")\n    elif ksize:\n        notify(f\"selecting specified query k={ksize}\")\n\n    if len(sl) != 1:\n        error(f\"When loading query from '{filename}'\", filename)\n        error(f\"{len(sl)} signatures matching ksize and molecule type;\")\n        error(\"need exactly one. Specify --ksize or --dna, --rna, or --protein.\")\n        sys.exit(-1)\n\n    return sl[0]\n\n\ndef _check_suffix(filename, endings):\n    for ending in endings:\n        if filename.endswith(ending):\n            return True\n    return False\n\n\ndef traverse_find_sigs(filenames, yield_all_files=False):\n    \"\"\"Find all .sig and .sig.gz files in & beneath 'filenames'.\n\n    By default, this function returns files with .sig and .sig.gz extensions.\n    If 'yield_all_files' is True, this will return _all_ files\n    (but not directories).\n    \"\"\"\n    endings = (\".sig\", \".sig.gz\")\n    for filename in filenames:\n        # check for files in filenames:\n        if os.path.isfile(filename):\n            if yield_all_files or _check_suffix(filename, endings):\n                yield filename\n\n        # filename is a directory -- traverse beneath!\n        elif os.path.isdir(filename):\n            for root, dirs, files in os.walk(filename):\n                for name in sorted(files):\n                    fullname = os.path.join(root, name)\n                    if yield_all_files or _check_suffix(fullname, endings):\n                        yield fullname\n\n\ndef load_dbs_and_sigs(\n    filenames,\n    query,\n    is_similarity_query,\n    *,\n    cache_size=None,\n    picklist=None,\n    pattern=None,\n    fail_on_empty_database=False,\n):\n    \"\"\"\n    Load one or more Index objects to search - databases, etc.\n\n    'select' on compatibility with query, and apply picklists & patterns.\n    \"\"\"\n    query_mh = query.minhash\n\n    # set selection parameter for containment\n    containment = True\n    if is_similarity_query:\n        containment = False\n\n    databases = []\n    total_signatures_loaded = 0\n    sum_signatures_after_select = 0\n    for filename in filenames:\n        notify(f\"loading from '{filename}'...\", end=\"\\r\")\n\n        try:\n            db = _load_database(filename, False, cache_size=cache_size)\n        except ValueError as e:\n            # cannot load database!\n            notify(f\"ERROR on loading from '{filename}':\")\n            notify(str(e))\n            sys.exit(-1)\n\n        total_signatures_loaded += len(db)\n\n        # get compatible signatures - moltype/ksize/num/scaled\n        try:\n            db = db.select(\n                moltype=query_mh.moltype,\n                ksize=query_mh.ksize,\n                num=query_mh.num,\n                scaled=query_mh.scaled,\n                containment=containment,\n            )\n        except ValueError as exc:\n            # incompatible collection specified!\n            notify(f\"ERROR: cannot use '{filename}' for this query.\")\n            notify(str(exc))\n            if fail_on_empty_database:\n                sys.exit(-1)\n            else:\n                db = LinearIndex([])\n\n        # 'select' returns nothing => all signatures filtered out. fail!\n        if not db:\n            notify(f\"no compatible signatures found in '{filename}'\")\n            if fail_on_empty_database:\n                sys.exit(-1)\n\n        sum_signatures_after_select += len(db)\n\n        # last but not least, apply picklist!\n        db = apply_picklist_and_pattern(db, picklist, pattern)\n\n        databases.append(db)\n\n    # display num loaded/num selected\n    notify(\"--\")\n    notify(\n        f\"loaded {total_signatures_loaded} total signatures from {len(databases)} locations.\"\n    )\n    notify(\n        f\"after selecting signatures compatible with search, {sum_signatures_after_select} remain.\"\n    )\n    print(\"\")\n\n    return databases\n\n\ndef load_pathlist_from_file(filename):\n    \"Load a list-of-files text file.\"\n    try:\n        with open(filename) as fp:\n            file_list = [x.rstrip(\"\\r\\n\") for x in fp]\n        file_list = set(file_list)\n        if not file_list:\n            raise ValueError(\"pathlist is empty\")\n        for checkfile in file_list:\n            if not os.path.exists(checkfile):\n                raise ValueError(\n                    f\"file '{checkfile}' inside the pathlist does not exist\"\n                )\n    except OSError:\n        raise ValueError(f\"pathlist file '{filename}' does not exist\")\n    except OSError:\n        raise ValueError(f\"cannot open file '{filename}'\")\n    except UnicodeDecodeError:\n        raise ValueError(f\"cannot parse file '{filename}' as list of filenames\")\n    return file_list\n\n\nclass FileOutput:\n    \"\"\"A context manager for file outputs that handles sys.stdout gracefully.\n\n    Usage:\n\n       with FileOutput(filename, mode) as fp:\n          ...\n\n    does what you'd expect, but it handles the situation where 'filename'\n    is '-' or None. This makes it nicely compatible with argparse usage,\n    e.g.\n\n    p = argparse.ArgumentParser()\n    p.add_argument('--output')\n    args = p.parse_args()\n    ...\n    with FileOutput(args.output, 'wt') as fp:\n       ...\n\n    will properly handle no argument or '-' as sys.stdout.\n    \"\"\"\n\n    def __init__(self, filename, mode=\"wt\", *, newline=None, encoding=\"utf-8\"):\n        self.filename = filename\n        self.mode = mode\n        self.fp = None\n        self.newline = newline\n        self.encoding = encoding\n\n    def open(self):\n        if self.filename == \"-\" or self.filename is None:\n            return sys.stdout\n        self.fp = open(\n            self.filename, self.mode, newline=self.newline, encoding=self.encoding\n        )\n        return self.fp\n\n    def close(self):\n        if self.fp is not None:  # in case of stdout\n            self.fp.close()\n\n    def __enter__(self):\n        return self.open()\n\n    def __exit__(self, type, value, traceback):\n        # do we need to handle exceptions here?\n        if self.fp:\n            self.fp.close()\n\n        return False\n\n\nclass FileOutputCSV(FileOutput):\n    \"\"\"A context manager for CSV file outputs.\n\n    Usage:\n\n       with FileOutputCSV(filename) as fp:\n          ...\n\n    does what you'd expect, but it handles the situation where 'filename'\n    is '-' or None. This makes it nicely compatible with argparse usage,\n    e.g.\n\n    p = argparse.ArgumentParser()\n    p.add_argument('--output')\n    args = p.parse_args()\n    ...\n    with FileOutputCSV(args.output) as w:\n       ...\n\n    will properly handle no argument or '-' as sys.stdout.\n    \"\"\"\n\n    def __init__(self, filename):\n        self.filename = filename\n        self.fp = None\n\n    def open(self):\n        if self.filename == \"-\" or self.filename is None:\n            return sys.stdout\n        if self.filename.endswith(\".gz\"):\n            self.fp = gzip.open(self.filename, \"wt\", newline=\"\")\n        else:\n            self.fp = open(self.filename, \"w\", newline=\"\")\n        return self.fp\n\n\nclass _DictReader_with_version:\n    \"\"\"A version of csv.DictReader that allows a comment line with a version,\n    e.g.\n\n    # SOURMASH-MANIFEST-VERSION: 1.0\n\n    The version is stored as a 2-tuple in the 'version_info' attribute.\n    \"\"\"\n\n    def __init__(self, textfp, *, delimiter=\",\"):\n        self.version_info = []\n\n        # is there a '#' in the raw buffer pos 0?\n        ch = textfp.buffer.peek(1)\n\n        try:\n            ch = ch.decode(\"utf-8\")\n        except UnicodeDecodeError:\n            raise csv.Error(\"unable to read CSV file\")\n\n        # yes - read a line from the text buffer => parse\n        if ch.startswith(\"#\"):\n            line = textfp.readline()\n            assert line.startswith(\"# \"), line\n\n            # note, this can set version_info to lots of different things.\n            # revisit later, I guess. CTB.\n            self.version_info = line[2:].strip().split(\": \", 2)\n\n        # build a DictReader from the remaining stream\n        self.reader = csv.DictReader(textfp, delimiter=delimiter)\n        self.fieldnames = self.reader.fieldnames\n\n    def __iter__(self):\n        yield from self.reader\n\n\n@contextlib.contextmanager\ndef FileInputCSV(\n    filename,\n    *,\n    encoding=\"utf-8\",\n    default_csv_name=None,\n    zipfile_obj=None,\n    delimiter=\",\",\n):\n    \"\"\"A context manager for reading in CSV files in gzip, zip or text format.\n\n    Assumes comma delimiter, and uses csv.DictReader.\n\n    Note: does not support stdin.\n\n    Note: it seems surprisingly hard to write code that generically handles\n    any file handle being passed in; the manifest loading code, in particular,\n    uses ZipStorage.load => StringIO obj, which doesn't support peek etc.\n    So for now, this context manager is focused on situations where it owns\n    the file handle (opens/closes the file).\n    \"\"\"\n    fp = None\n\n    if zipfile_obj and not default_csv_name:\n        raise ValueError(\"must provide default_csv_name with a zipfile_obj\")\n\n    # first, try to load 'default_csv_name' from a zipfile:\n    if default_csv_name:\n        # were we given a zipfile obj?\n        if zipfile_obj:\n            try:\n                zi = zipfile_obj.getinfo(default_csv_name)\n                with zipfile_obj.open(zi) as fp:\n                    textfp = TextIOWrapper(fp, encoding=encoding, newline=\"\")\n                    r = _DictReader_with_version(textfp, delimiter=delimiter)\n                    yield r\n            except (zipfile.BadZipFile, KeyError):\n                pass  # uh oh, we were given a zipfile_obj and it FAILED.\n\n            # no matter what, if given zipfile_obj don't try .gz or regular csv\n            return\n        else:\n            try:\n                with zipfile.ZipFile(filename, \"r\") as zip_fp:\n                    zi = zip_fp.getinfo(default_csv_name)\n                    with zip_fp.open(zi) as fp:\n                        textfp = TextIOWrapper(fp, encoding=encoding, newline=\"\")\n                        r = _DictReader_with_version(textfp, delimiter=delimiter)\n                        yield r\n\n                # if we got this far with no exceptions, we found\n                # the CSV in the zip file. exit generator!\n                return\n            except (zipfile.BadZipFile, KeyError):\n                # no zipfile_obj => it's ok to continue onwards to .gz\n                # and regular CSV.\n                pass\n\n    # ok, not a zip file - try .gz:\n    try:\n        with gzip.open(filename, \"rt\", newline=\"\", encoding=encoding) as fp:\n            fp.buffer.peek(1)  # force exception if not a gzip file\n            r = _DictReader_with_version(fp, delimiter=delimiter)\n            yield r\n        return\n    except gzip.BadGzipFile:\n        pass\n\n    # neither zip nor gz; regular file!\n    with open(filename, newline=\"\", encoding=encoding) as fp:\n        r = _DictReader_with_version(fp, delimiter=delimiter)\n        yield r\n\n\nclass SignatureLoadingProgress:\n    \"\"\"A wrapper for signature loading progress reporting.\n\n    Instantiate this class once, and then pass it to load_file_as_signatures\n    with progress=<obj>.\n\n    Alternatively, call obj.start_file(location, iter) each time you\n    start loading signatures from a new file via iter.\n\n    You can optionally notify of reading a file with `.notify(location)`.\n    \"\"\"\n\n    def __init__(self, reporting_interval=10):\n        self.n_sig = 0\n        self.interval = reporting_interval\n        self.screen_width = 79\n\n    def __len__(self):\n        return self.n_sig\n\n    def short_notify(self, msg_template, *args, **kwargs):\n        \"\"\"Shorten the notification message so that it fits on one line.\n\n        Good for repeating notifications with end='\\r' especially...\n        \"\"\"\n\n        msg = msg_template.format(*args, **kwargs)\n        end = kwargs.get(\"end\", \"\\n\")\n        w = self.screen_width\n\n        if len(msg) > w:\n            truncate_len = len(msg) - w + 3\n            msg = \"<<<\" + msg[truncate_len:]\n\n        notify(msg, end=end)\n\n    def notify(self, location):\n        self.short_notify(\n            f\"...{self.n_sig} sigs so far. Now reading from file '{location}'\", end=\"\\r\"\n        )\n\n    def start_file(self, location, loader):\n        n_this = 0\n        n_before = self.n_sig\n\n        try:\n            for result in loader:\n                # track n from this file, as well as total n\n                n_this += 1\n                n_total = n_before + n_this\n                if n_this and n_total % self.interval == 0:\n                    self.short_notify(\n                        \"...loading from '{}' / {} sigs total\",\n                        location,\n                        n_total,\n                        end=\"\\r\",\n                    )\n\n                yield result\n        except KeyboardInterrupt:\n            # might as well nicely handle CTRL-C while we're at it!\n            notify(\"\\n(CTRL-C received! quitting.)\")\n            sys.exit(-1)\n        finally:\n            self.n_sig += n_this\n\n        self.short_notify(f\"Loaded {n_this} sigs from '{location}'\", end=\"\\r\")\n\n\ndef load_many_signatures(\n    locations,\n    progress,\n    *,\n    yield_all_files=False,\n    ksize=None,\n    moltype=None,\n    picklist=None,\n    force=False,\n    pattern=None,\n):\n    \"\"\"\n    Load many signatures from multiple files, with progress indicators.\n\n    Takes ksize, moltype, and picklist selectors.\n\n    If 'yield_all_files=True' then tries to load all files in specified\n    directories.\n\n    If 'force=True' then continues past survivable errors.\n\n    Yields (sig, location) tuples.\n    \"\"\"\n    for loc in locations:\n        try:\n            # open index,\n            idx = load_file_as_index(loc, yield_all_files=yield_all_files)\n            idx = idx.select(ksize=ksize, moltype=moltype)\n\n            idx = apply_picklist_and_pattern(idx, picklist, pattern)\n\n            # start up iterator,\n            loader = idx.signatures_with_location()\n\n            # go!\n            n = 0  # count signatures loaded\n            for sig, sigloc in progress.start_file(loc, loader):\n                yield sig, sigloc\n                n += 1\n            notify(f\"loaded {n} signatures from '{loc}'\", end=\"\\r\")\n        except ValueError as exc:\n            # trap expected errors, and either power through or display + exit.\n            if force:\n                notify(f\"ERROR: {str(exc)}\")\n                notify(\"(continuing)\")\n                continue\n            else:\n                notify(f\"ERROR: {str(exc)}\")\n                sys.exit(-1)\n        except KeyboardInterrupt:\n            notify(\"Received CTRL-C - exiting.\")\n            sys.exit(-1)\n\n    n_files = len(locations)\n    notify(f\"loaded {len(progress)} signatures total, from {n_files} files\")\n\n\ndef get_manifest(idx, *, require=True, rebuild=False):\n    \"\"\"\n    Retrieve a manifest for this idx, loaded with `load_file_as_index`.\n\n    Even if a manifest exists and `rebuild` is True, rebuild the manifest.\n    If a manifest does not exist or `rebuild` is True, try to build one.\n    If a manifest cannot be built and `require` is True, error exit.\n\n    In the case where `require=False` and a manifest cannot be built,\n    may return None. Otherwise always returns a manifest.\n    \"\"\"\n    m = idx.manifest\n\n    # has one, and don't want to rebuild? easy! return!\n    if m is not None and not rebuild:\n        debug_literal(\"get_manifest: found manifest\")\n        return m\n\n    debug_literal(f\"get_manifest: no manifest found / rebuild={rebuild}\")\n\n    # need to build one...\n    try:\n        notify(\"Generating a manifest...\")\n        m = CollectionManifest.create_manifest(\n            idx._signatures_with_internal(), include_signature=False\n        )\n        debug_literal(\"get_manifest: rebuilt manifest.\")\n    except NotImplementedError:\n        if require:\n            error(f\"ERROR: manifests cannot be generated for {idx.location}\")\n            sys.exit(-1)\n        else:\n            debug_literal(\"get_manifest: cannot build manifest, not req'd\")\n            return None\n\n    return m\n\n\ndef load_file_as_signatures(\n    filename,\n    *,\n    select_moltype=None,\n    ksize=None,\n    scaled=None,\n    picklist=None,\n    yield_all_files=False,\n    progress=None,\n    pattern=None,\n    _use_manifest=True,\n):\n    \"\"\"Load 'filename' as a collection of signatures. Return an iterable.\n\n    If 'filename' contains an SBT or LCA indexed database, or a regular\n    Zip file, will return a signatures() generator. If a Zip file and\n    yield_all_files=True, will try to load all files within zip, not just\n    .sig files.\n\n    If 'filename' is a JSON file containing one or more signatures, will\n    return a list of those signatures.\n\n    If 'filename' is a directory, will load *.sig\n    underneath this directory into a list of signatures. If\n    yield_all_files=True, will attempt to load all files.\n\n    Applies selector function if select_moltype, ksize or picklist are given.\n\n    'pattern' is a function that returns True on matching values.\n    \"\"\"\n    if progress:\n        progress.notify(filename)\n\n    db = _load_database(filename, yield_all_files)\n\n    # test fixture ;)\n    if not _use_manifest and db.manifest:\n        db.manifest = None\n\n    db = db.select(moltype=select_moltype, ksize=ksize, scaled=scaled)\n\n    # apply pattern search & picklist\n    db = apply_picklist_and_pattern(db, picklist, pattern)\n\n    loader = db.signatures()\n\n    if progress is not None:\n        return progress.start_file(filename, loader)\n    else:\n        return loader\n\n\ndef load_one_signature(\n    filename,\n    *,\n    select_moltype=None,\n    ksize=None,\n    picklist=None,\n    yield_all_files=False,\n    pattern=None,\n):\n    db = _load_database(filename, yield_all_files)\n\n    db = db.select(moltype=select_moltype, ksize=ksize)\n\n    # apply pattern search & picklist\n    db = apply_picklist_and_pattern(db, picklist, pattern)\n\n    loader = db.signatures()\n\n    # load exactly one!\n    try:\n        ss = next(iter(loader))\n    except StopIteration:\n        raise ValueError(f\"no signatures in '{filename}'? expected exactly one.\")\n\n    # make sure there's not a second one...\n    try:\n        _ = next(iter(loader))\n\n        raise ValueError(\n            f\"more than one signature in '{filename}'; expected exactly one\"\n        )\n    except StopIteration:\n        pass\n\n    return ss\n"
  },
  {
    "path": "src/sourmash/sqlite_utils.py",
    "content": "\"\"\"\nCommon utility functions for handling sqlite3 databases.\n\"\"\"\n\nimport os\nimport sqlite3\nfrom .logging import debug_literal\n\n\ndef open_sqlite_db(filename):\n    \"\"\"\n    Is this a pre-existing sqlite3 database? Return connection object if so.\n\n    Otherwise, return None.\n    \"\"\"\n    debug_literal(\"open_sqlite_db: started\")\n    # does it already exist/is it non-zero size?\n\n    # note: sqlite3.connect creates the file if it doesn't exist, which\n    # we don't want in this function.\n    if not os.path.exists(filename) or os.path.getsize(filename) == 0:\n        debug_literal(\"open_sqlite_db: no file/zero sized file\")\n        return None\n\n    # can we connect to it?\n    try:\n        conn = sqlite3.connect(filename)\n    except (sqlite3.OperationalError, sqlite3.DatabaseError):\n        debug_literal(\"open_sqlite_db: cannot connect.\")\n        return None\n\n    # check for the 'sourmash_internal' table.\n    cursor = conn.cursor()\n    try:\n        cursor.execute(\"SELECT DISTINCT key, value FROM sourmash_internal\")\n    except (sqlite3.OperationalError, sqlite3.DatabaseError):\n        debug_literal(\"open_sqlite_db: cannot read sourmash_internal.\")\n\n        # is this a taxonomy DB?\n        try:\n            cursor.execute(\"SELECT * FROM taxonomy LIMIT 1\")\n        except (sqlite3.OperationalError, sqlite3.DatabaseError):\n            debug_literal(\"open_sqlite_db: cannot read 'taxonomy', either.\")\n            return None\n\n    return conn\n\n\ndef add_sourmash_internal(cursor, use_type, version):\n    \"\"\"\n    Add use_type/version to sourmash_internal table.\n    \"\"\"\n    cursor.execute(\n        \"\"\"\n    CREATE TABLE IF NOT EXISTS sourmash_internal (\n       key TEXT UNIQUE,\n       value TEXT\n    )\n    \"\"\"\n    )\n\n    d = get_sourmash_internal(cursor)\n\n    val = d.get(use_type)\n    if val is not None:\n        # do version compatibility foo here?\n        if version != val:\n            raise Exception(\n                f\"sqlite problem: for {use_type}, want version {version}, got version {val}\"\n            )\n    else:\n        cursor.execute(\n            \"\"\"\n        INSERT INTO sourmash_internal (key, value) VALUES (?, ?)\n        \"\"\",\n            (use_type, version),\n        )\n\n\ndef get_sourmash_internal(cursor):\n    \"\"\"\n    Retrieve a key/value dictionary from sourmash_internal.\n    \"\"\"\n    cursor.execute(\"SELECT DISTINCT key, value FROM sourmash_internal\")\n    d = dict(cursor)\n\n    return d\n"
  },
  {
    "path": "src/sourmash/tax/__init__.py",
    "content": "from .__main__ import main\n"
  },
  {
    "path": "src/sourmash/tax/__main__.py",
    "content": "\"\"\"\nCommand-line entry point for 'python -m sourmash.tax'\n\"\"\"\n\nimport sys\nimport csv\nimport os\nfrom collections import defaultdict, Counter\nfrom dataclasses import asdict, fields\nimport re\n\nimport sourmash\nfrom ..sourmash_args import FileOutputCSV, FileInputCSV, FileOutput\nfrom sourmash.logging import set_quiet, error, notify, print_results\n\nfrom . import tax_utils\nfrom .tax_utils import (\n    MultiLineageDB,\n    RankLineageInfo,\n    LINLineageInfo,\n    AnnotateTaxResult,\n    ICTVRankLineageInfo,\n)\n\nusage = \"\"\"\nsourmash taxonomy <command> [<args>] - manipulate/work with taxonomy information.\nor\nsourmash tax <command> [<args>]\n\n\n** Commands can be:\n\nannotate -g <gather_csv> [<gather_csv> ... ] -t [<taxonomy_csv> ...]      - annotate gather CSVs with taxonomic lineages\ngenome -g <gather_csv> [<gather_csv> ... ] -t [<taxonomy_csv> ...]        - taxonomic classification of genomes from gather results\nmetagenome -g <gather_csv> [<gather_csv> ... ] -t [<taxonomy_csv> ...]    - summarize taxonomic information for metagenome gather results\n\n** Use '-h' to get subcommand-specific help, e.g.\n\nsourmash taxonomy metagenome -h\n\"\"\"\n\n# outfile utils\n_output_type_to_ext = {\n    \"csv_summary\": \".summarized.csv\",\n    \"classification\": \".classifications.csv\",\n    \"krona\": \".krona.tsv\",\n    \"lineage_summary\": \".lineage_summary.tsv\",\n    \"annotate\": \".with-lineages.csv\",\n    \"human\": \".human.txt\",\n    \"lineage_csv\": \".lineage.csv\",\n    \"kreport\": \".kreport.txt\",\n    \"lingroup\": \".lingroup.tsv\",\n    \"bioboxes\": \".bioboxes.profile\",\n}\n\n\ndef make_outfile(base, output_type, *, output_dir=\"\"):\n    limit_float_decimals = False\n    if base == \"-\":\n        limit_float_decimals = True\n        return base, limit_float_decimals\n\n    ext = _output_type_to_ext[output_type]\n\n    fname = base + ext\n    if output_dir:\n        fname = os.path.join(output_dir, fname)\n    notify(f\"saving '{output_type}' output to '{fname}'.\")\n    return fname, limit_float_decimals\n\n\n##### taxonomy command line functions\ndef metagenome(args):\n    \"\"\"\n    summarize taxonomic information for metagenome gather results\n    \"\"\"\n    set_quiet(args.quiet)\n\n    # first, load taxonomic_assignments\n    try:\n        tax_assign = MultiLineageDB.load(\n            args.taxonomy_csv,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            force=args.force,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n        available_ranks = tax_assign.available_ranks\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        sys.exit(-1)\n\n    if not tax_assign:\n        error(\n            f\"ERROR: No taxonomic assignments loaded from {','.join(args.taxonomy_csv)}. Exiting.\"\n        )\n        sys.exit(-1)\n\n    if args.rank and args.rank not in available_ranks:\n        error(\n            f\"ERROR: No taxonomic information provided for rank {args.rank}: cannot summarize at this rank\"\n        )\n        sys.exit(-1)\n\n    # next, collect and load gather results\n    gather_csvs = tax_utils.collect_gather_csvs(\n        args.gather_csv, from_file=args.from_file\n    )\n    try:\n        query_gather_results = tax_utils.check_and_load_gather_csvs(\n            gather_csvs,\n            tax_assign,\n            force=args.force,\n            fail_on_missing_taxonomy=args.fail_on_missing_taxonomy,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        sys.exit(-1)\n\n    if not query_gather_results:\n        notify(\"No gather results loaded. Exiting.\")\n        sys.exit(-1)\n\n    # check for abundance weighting and output formats in first 10 of first 10\n    use_abund = args.use_abund\n    found_abund = False\n    for vv, _ in zip(query_gather_results, range(10)):\n        for v, _ in zip(vv.raw_taxresults, range(10)):\n            if v.f_unique_weighted != v.f_unique_to_query:\n                found_abund = True\n                break\n\n    if args.cli_version == \"v4\":\n        # not intentionally set? => warn in v4\n        if not found_abund and use_abund is None:\n            notify(\"** WARNING: no abundances found in gather results.\")\n            notify(\"** This is likely because the metagenome sketch was not\")\n            notify(\"** created with '-p abund'.\")\n            notify(\"** As a result, the output of 'tax metagenome' will\")\n            notify(\"** not be abundance-weighted. This is probably not what you want!\")\n            notify(\"** Specify '--no-abundances' to silence this warning.\")\n\n        if (\n            found_abund\n            and use_abund is None\n            and (\n                \"lineage_summary\" in args.output_format or \"krona\" in args.output_format\n            )\n        ):\n            notify(\"** WARNING: abundances in gather results are not being\")\n            notify(\"** used for 'krona' and 'lineage_summary' outputs.\")\n            notify(\"** This is because the default in sourmash v4 is to not use them.\")\n            notify(\"** As a result, the output of 'tax metagenome' will\")\n            notify(\"** not be abundance-weighted. This is probably not what you want!\")\n            notify(\"** Specify '--use-abundances' to use abundances, or\")\n            notify(\"** '--no-abundances' to silence this warning.\")\n\n    # set use_abund defaults in v4 (False)/v5 (True). Look, it works, ok?\n    use_abund_unset = True\n\n    if use_abund is None:\n        use_abund_unset = True\n        match args.cli_version:\n            case \"v4\":\n                use_abund = False\n            case \"v5\":\n                use_abund = True\n    elif not use_abund:\n        use_abund_unset = False\n\n    if use_abund and not found_abund:\n        error(\"** ERROR: no abundances found in gather results.\")\n        error(\"** This is likely because the metagenome sketch was not\")\n        error(\"** created with '-p abund'.\")\n        error(\"** This is an error in sourmash v5 and greater.\")\n        error(\"** Specify '--no-abundances' to bypass this error.\")\n        sys.exit(-1)\n\n    single_query_output_formats = [\"kreport\", \"lingroup\", \"bioboxes\"]\n    desired_single_outputs = []\n    if len(query_gather_results) > 1:  # working with multiple queries\n        desired_single_outputs = [\n            x for x in args.output_format if x in single_query_output_formats\n        ]\n        if desired_single_outputs:\n            notify(\n                f\"WARNING: found results for multiple gather queries. Can only output multi-query result formats: skipping {', '.join(desired_single_outputs)}\"\n            )\n        # remove single query outputs from output format\n        args.output_format = [\n            x for x in args.output_format if x not in single_query_output_formats\n        ]\n        if (\n            not args.output_format\n        ):  # or do we want to insert `human` here so we always report something?\n            error(\"ERROR: No output formats remaining.\")\n            sys.exit(-1)\n\n    # for each queryResult, actually summarize at rank, reporting any errors that occur.\n    for queryResult in query_gather_results:\n        try:\n            queryResult.build_summarized_result()\n        except ValueError as exc:\n            error(f\"ERROR: {str(exc)}\")\n            sys.exit(-1)\n\n    # if lingroup file is passed in, read it\n    lingroups = None\n    if args.lingroup is not None:\n        try:\n            lingroups = tax_utils.read_lingroups(args.lingroup)\n        except ValueError as exc:\n            error(f\"ERROR: {str(exc)}\")\n            sys.exit(-1)\n\n    # write summarized output in human-readable format\n    if \"lineage_summary\" in args.output_format:\n        lineage_outfile, limit_float = make_outfile(\n            args.output_base, \"lineage_summary\", output_dir=args.output_dir\n        )\n\n        ## aggregate by lineage by query\n        lineageD, query_names = tax_utils.aggregate_by_lineage_at_rank(\n            query_gather_results=query_gather_results,\n            rank=args.rank,\n            by_query=True,\n            use_abund=use_abund,\n        )\n\n        with FileOutputCSV(lineage_outfile) as out_fp:\n            tax_utils.write_lineage_sample_frac(query_names, lineageD, out_fp, sep=\"\\t\")\n\n    # write summarized --> krona output tsv\n    if \"krona\" in args.output_format:\n        krona_results, header = tax_utils.format_for_krona(\n            query_gather_results,\n            rank=args.rank,\n            use_abund=use_abund,\n        )\n\n        krona_outfile, limit_float = make_outfile(\n            args.output_base, \"krona\", output_dir=args.output_dir\n        )\n        with FileOutputCSV(krona_outfile) as out_fp:\n            tax_utils.write_krona(header, krona_results, out_fp)\n\n    if \"human\" in args.output_format:\n        summary_outfile, limit_float = make_outfile(\n            args.output_base, \"human\", output_dir=args.output_dir\n        )\n\n        with FileOutput(summary_outfile) as out_fp:\n            human_display_rank = args.rank or \"species\"\n            if args.lins and not args.rank:\n                human_display_rank = query_gather_results[0].ranks[-1]  # lowest rank\n\n            tax_utils.write_human_summary(\n                query_gather_results,\n                out_fp,\n                human_display_rank,\n                use_abund=use_abund_unset,\n            )\n\n    # write summarized output csv\n    single_query_results = query_gather_results[0]\n    if \"csv_summary\" in args.output_format:\n        summary_outfile, limit_float = make_outfile(\n            args.output_base, \"csv_summary\", output_dir=args.output_dir\n        )\n        with FileOutputCSV(summary_outfile) as out_fp:\n            tax_utils.write_summary(\n                query_gather_results,\n                out_fp,\n                limit_float_decimals=limit_float,\n                lingroups=lingroups,\n                use_abund=use_abund,\n            )\n\n    # write summarized --> kreport output tsv\n    if \"kreport\" in args.output_format:\n        kreport_outfile, limit_float = make_outfile(\n            args.output_base, \"kreport\", output_dir=args.output_dir\n        )\n\n        with FileOutputCSV(kreport_outfile) as out_fp:\n            header, kreport_results = single_query_results.make_kreport_results(\n                use_abund=use_abund_unset\n            )\n            tax_utils.write_output(\n                header, kreport_results, out_fp, sep=\"\\t\", write_header=False\n            )\n\n    # write summarized --> LINgroup output tsv\n    if \"lingroup\" in args.output_format and lingroups is not None:\n        lingroupfile, limit_float = make_outfile(\n            args.output_base, \"lingroup\", output_dir=args.output_dir\n        )\n\n        with FileOutputCSV(lingroupfile) as out_fp:\n            header, lgreport_results = single_query_results.make_lingroup_results(\n                LINgroupsD=lingroups\n            )\n            tax_utils.write_output(\n                header, lgreport_results, out_fp, sep=\"\\t\", write_header=True\n            )\n\n    # write cami bioboxes format\n    if \"bioboxes\" in args.output_format:\n        bbfile, limit_float = make_outfile(\n            args.output_base, \"bioboxes\", output_dir=args.output_dir\n        )\n\n        with FileOutputCSV(bbfile) as out_fp:\n            header_lines, bb_results = single_query_results.make_cami_bioboxes()\n            tax_utils.write_bioboxes(header_lines, bb_results, out_fp, sep=\"\\t\")\n\n\ndef genome(args):\n    \"\"\"\n    taxonomic classification of genomes from gather results\n    \"\"\"\n    set_quiet(args.quiet)\n\n    # first, load taxonomic_assignments\n    try:\n        tax_assign = MultiLineageDB.load(\n            args.taxonomy_csv,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            force=args.force,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n        available_ranks = tax_assign.available_ranks\n\n        lg_ranks = None\n        all_lgs = None\n        if args.lingroup:\n            lingroups = tax_utils.read_lingroups(args.lingroup)\n            lg_ranks, all_lgs = tax_utils.parse_lingroups(lingroups)\n\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        sys.exit(-1)\n\n    if not tax_assign:\n        error(\n            f\"ERROR: No taxonomic assignments loaded from {','.join(args.taxonomy_csv)}. Exiting.\"\n        )\n        sys.exit(-1)\n\n    if args.rank and args.rank not in available_ranks:\n        error(\n            f\"ERROR: No taxonomic information provided for rank {args.rank}: cannot classify at this rank\"\n        )\n        sys.exit(-1)\n\n    # get gather_csvs from args\n    gather_csvs = tax_utils.collect_gather_csvs(\n        args.gather_csv, from_file=args.from_file\n    )\n\n    try:\n        query_gather_results = tax_utils.check_and_load_gather_csvs(\n            gather_csvs,\n            tax_assign,\n            force=args.force,\n            fail_on_missing_taxonomy=args.fail_on_missing_taxonomy,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        sys.exit(-1)\n\n    if not query_gather_results:\n        notify(\"No results for classification. Exiting.\")\n        sys.exit(-1)\n\n    # for each queryResult, summarize at rank and classify according to thresholds, reporting any errors that occur.\n    n_total = len(query_gather_results)\n    classified_results = []\n    found_error = False\n    for queryResult in query_gather_results:\n        try:\n            queryResult.build_classification_result(\n                rank=args.rank,\n                ani_threshold=args.ani_threshold,\n                containment_threshold=args.containment_threshold,\n                lingroup_ranks=lg_ranks,\n                lingroups=all_lgs,\n            )\n            classified_results.append(queryResult)\n\n        except ValueError as exc:\n            found_error = True\n            notify(f\"ERROR: {str(exc)}\")\n\n    n_classified = len(classified_results)\n    if n_classified == 0:\n        notify(\"No queries could be classified. Exiting.\")\n        sys.exit(-1)\n    else:\n        classif_perc = (float(n_classified) / float(n_total)) * 100\n        notify(\n            f\"classified {n_classified}/{n_total} queries ({classif_perc:.2f}%). Writing results\"\n        )\n\n    # write outputs\n    if \"csv_summary\" in args.output_format:\n        summary_outfile, limit_float = make_outfile(\n            args.output_base, \"classification\", output_dir=args.output_dir\n        )\n        with FileOutputCSV(summary_outfile) as out_fp:\n            tax_utils.write_summary(\n                classified_results,\n                out_fp,\n                limit_float_decimals=limit_float,\n                classification=True,\n                use_abund=False,\n            )\n\n    # write summarized output in human-readable format\n    if \"human\" in args.output_format:\n        summary_outfile, limit_float = make_outfile(\n            args.output_base, \"human\", output_dir=args.output_dir\n        )\n\n        with FileOutput(summary_outfile) as out_fp:\n            tax_utils.write_human_summary(\n                query_gather_results,\n                out_fp,\n                args.rank or \"species\",\n                classification=True,\n            )\n\n    # The following require a single rank:\n    # note: interactive krona can handle mult ranks, do we want to enable?\n    if \"krona\" in args.output_format:\n        krona_results, header = tax_utils.format_for_krona(\n            query_gather_results=query_gather_results,\n            rank=args.rank,\n            classification=True,\n        )\n        krona_outfile, limit_float = make_outfile(\n            args.output_base, \"krona\", output_dir=args.output_dir\n        )\n        with FileOutputCSV(krona_outfile) as out_fp:\n            tax_utils.write_krona(header, krona_results, out_fp)\n\n    if \"lineage_csv\" in args.output_format:\n        lineage_outfile, _ = make_outfile(\n            args.output_base, \"lineage_csv\", output_dir=args.output_dir\n        )\n        lineage_results = []\n        header = None\n        for q_res in query_gather_results:\n            if not header:\n                ranks = list(q_res.ranks)\n                if (\n                    \"strain\" in ranks\n                ):  # maintains prior functionality.. but we could keep strain now, i think?\n                    ranks.remove(\"strain\")\n                header = [\"ident\", *ranks]\n            lineageD = q_res.classification_result.as_lineage_dict(\n                q_res.query_info, ranks\n            )\n            lineage_results.append(lineageD)\n        with FileOutputCSV(lineage_outfile) as out_fp:\n            tax_utils.write_output(header, lineage_results, out_fp)\n\n    # if there was a classification error, exit with err code\n    if found_error:\n        if not args.force:\n            sys.exit(-1)\n\n\ndef annotate(args):\n    \"\"\"\n    Annotate gather results with taxonomic lineage for each match.\n\n    Produces gather csv with lineage information as the final column.\n    \"\"\"\n\n    set_quiet(args.quiet)\n\n    try:\n        # first, load taxonomic_assignments\n        tax_assign = MultiLineageDB.load(\n            args.taxonomy_csv,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            force=args.force,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n\n    except ValueError as exc:\n        error(f\"ERROR: {str(exc)}\")\n        sys.exit(-1)\n\n    if not tax_assign:\n        error(\n            f\"ERROR: No taxonomic assignments loaded from {','.join(args.taxonomy_csv)}. Exiting.\"\n        )\n        sys.exit(-1)\n\n    # get csv from args\n    input_csvs = tax_utils.collect_gather_csvs(\n        args.gather_csv, from_file=args.from_file\n    )\n\n    # handle each gather csv separately\n    for n, in_csv in enumerate(input_csvs):\n        try:\n            # Check for a column we can use to find lineage information:\n            with FileInputCSV(in_csv) as r:\n                header = r.fieldnames\n                # check for empty file\n                if not header:\n                    raise ValueError(f\"Cannot read from '{in_csv}'. Is file empty?\")\n\n                # look for the column to match with taxonomic identifier\n                id_col = None\n                col_options = [\"name\", \"match_name\", \"ident\", \"accession\"]\n                for colname in col_options:\n                    if colname in header:\n                        id_col = colname\n                        break\n\n                if not id_col:\n                    raise ValueError(\n                        f\"Cannot find taxonomic identifier column in '{in_csv}'. Tried: {', '.join(col_options)}\"\n                    )\n\n                notify(\n                    f\"Starting annotation on '{in_csv}'. Using ID column: '{id_col}'\"\n                )\n\n                # make output file for this input\n                out_base = os.path.basename(in_csv.rsplit(\".csv\")[0])\n                this_outfile, _ = make_outfile(\n                    out_base, \"annotate\", output_dir=args.output_dir\n                )\n\n                out_header = header + [\"lineage\"]\n\n                with FileOutputCSV(this_outfile) as out_fp:\n                    w = csv.DictWriter(out_fp, out_header)\n                    w.writeheader()\n\n                    n = 0\n                    n_missed = 0\n                    for n, row in enumerate(r):\n                        # find lineage and write annotated row\n                        taxres = AnnotateTaxResult(\n                            raw=row,\n                            id_col=id_col,\n                            lins=args.lins,\n                            ictv=args.ictv,\n                            keep_full_identifiers=args.keep_full_identifiers,\n                            keep_identifier_versions=args.keep_identifier_versions,\n                        )\n                        taxres.get_match_lineage(\n                            tax_assignments=tax_assign,\n                            fail_on_missing_taxonomy=args.fail_on_missing_taxonomy,\n                        )\n\n                        if taxres.missed_ident:  # could not assign taxonomy\n                            n_missed += 1\n                        w.writerow(taxres.row_with_lineages())\n\n                    rows_annotated = (n + 1) - n_missed\n                    if not rows_annotated:\n                        raise ValueError(\n                            f\"Could not annotate any rows from '{in_csv}'.\"\n                        )\n                    else:\n                        notify(\n                            f\"Annotated {rows_annotated} of {n + 1} total rows from '{in_csv}'.\"\n                        )\n\n        except ValueError as exc:\n            if args.force:\n                notify(str(exc))\n                notify(\"--force is set. Attempting to continue to next file.\")\n            else:\n                error(f\"ERROR: {str(exc)}\")\n                sys.exit(-1)\n\n\ndef prepare(args):\n    \"Combine multiple taxonomy databases into one and/or translate formats.\"\n    notify(\"loading taxonomies...\")\n    try:\n        tax_assign = MultiLineageDB.load(\n            args.taxonomy_csv,\n            force=args.force,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n        )\n    except ValueError as exc:\n        error(\"ERROR while loading taxonomies!\")\n        error(str(exc))\n        sys.exit(-1)\n\n    notify(f\"...loaded {len(tax_assign)} entries.\")\n\n    notify(f\"saving to '{args.output}', format {args.database_format}...\")\n    try:\n        tax_assign.save(args.output, args.database_format)\n    except ValueError as exc:\n        error(\"ERROR while saving!\")\n        error(str(exc))\n        sys.exit(-1)\n\n    notify(\"done!\")\n\n\ndef grep(args):\n    term = args.pattern\n    tax_assign = MultiLineageDB.load(args.taxonomy_csv, force=args.force)\n\n    silent = args.silent or args.count\n\n    notify(f\"searching {len(args.taxonomy_csv)} taxonomy files for '{term}'\")\n    if args.invert_match:\n        notify(\n            \"-v/--invert-match specified; returning only lineages that do not match.\"\n        )\n    if args.rank:\n        notify(f\"limiting matches to {args.rank} level\")\n\n    # build the search pattern\n    pattern = args.pattern\n    if args.ignore_case:\n        pattern = re.compile(pattern, re.IGNORECASE)\n    else:\n        pattern = re.compile(pattern)\n\n    # determine if lineage matches.\n    def find_pattern(lineage, select_rank):\n        for lp in lineage:\n            if select_rank is None or lp.rank == select_rank:\n                if pattern.search(lp.name):\n                    return True\n        return False\n\n    if args.invert_match:\n\n        def search_pattern(l, r):\n            return not find_pattern(l, r)\n    else:\n        search_pattern = find_pattern\n\n    match_ident = []\n    for ident, lineage in tax_assign.items():\n        if search_pattern(lineage, args.rank):\n            match_ident.append((ident, lineage))\n\n    if silent:\n        notify(f\"found {len(match_ident)} matches.\")\n        notify(\"(no matches will be saved because of --silent/--count\")\n    else:\n        with FileOutputCSV(args.output) as fp:\n            w = csv.writer(fp)\n            w.writerow([\"ident\"] + list(RankLineageInfo().taxlist[:-1]))\n            for ident, lineage in sorted(match_ident):\n                w.writerow([ident] + [x.name for x in lineage])\n\n        notify(\n            f\"found {len(match_ident)} matches; saved identifiers to picklist file '{args.output}'\"\n        )\n\n\ndef summarize(args):\n    \"Summarize multiple taxonomy databases.\"\n    notify(\"loading taxonomies...\")\n    try:\n        tax_assign = MultiLineageDB.load(\n            args.taxonomy_files,\n            force=args.force,\n            keep_full_identifiers=args.keep_full_identifiers,\n            keep_identifier_versions=args.keep_identifier_versions,\n            lins=args.lins,\n            ictv=args.ictv,\n        )\n    except ValueError as exc:\n        error(\"ERROR while loading taxonomies!\")\n        error(str(exc))\n        sys.exit(-1)\n\n    notify(f\"...loaded {len(tax_assign)} entries.\")\n\n    print_results(f\"number of distinct taxonomic lineages: {len(tax_assign)}\")\n\n    # count the number of distinct lineage names seen\n    rank_counts = defaultdict(int)\n    name_seen = set()\n    for v in tax_assign.values():\n        for vv in v:\n            name = vv.name\n            rank = vv.rank\n            if name not in name_seen:\n                rank_counts[rank] += 1\n                name_seen.add(name)\n\n    rank_count_items = list(rank_counts.items())\n    rank_count_items.sort(key=lambda x: x[1])\n    for rank, count in rank_count_items:\n        rank_name_str = f\"{rank}:\"\n        print_results(f\"rank {rank_name_str:<20s} {count} distinct taxonomic lineages\")\n\n    if args.output_lineage_information:\n        notify(\"now calculating detailed lineage counts...\")\n        lineage_counts = Counter()\n        for v in tax_assign.values():\n            tup = v\n            while tup:\n                lineage_counts[tup] += 1\n                tup = tup[:-1]\n        notify(\"...done!\")\n\n        with FileOutputCSV(args.output_lineage_information) as fp:\n            w = csv.writer(fp)\n            w.writerow([\"rank\", \"lineage_count\", \"lineage\"])\n\n            # output in order of most common\n            for lineage, count in lineage_counts.most_common():\n                rank = lineage[-1].rank\n                if args.lins:\n                    inf = LINLineageInfo(lineage=lineage)\n                elif args.ictv:\n                    inf = ICTVRankLineageInfo(lineage=lineage)\n                else:\n                    inf = RankLineageInfo(lineage=lineage)\n                lin = inf.display_lineage()\n                w.writerow([rank, str(count), lin])\n\n        n = len(lineage_counts)\n        notify(f\"saved {n} lineage counts to '{args.output_lineage_information}'\")\n\n\ndef main(arglist=None):\n    args = sourmash.cli.get_parser().parse_args(arglist)\n    submod = getattr(sourmash.cli.sig, args.subcmd)\n    mainmethod = getattr(submod, \"main\")\n    return mainmethod(args)\n\n\nif __name__ == \"__main__\":\n    main(sys.argv)\n"
  },
  {
    "path": "src/sourmash/tax/tax_utils.py",
    "content": "\"\"\"\nUtility functions for taxonomy analysis tools.\n\"\"\"\n\nimport os\nimport csv\nfrom collections import abc, defaultdict\nfrom itertools import zip_longest\nfrom typing import NamedTuple\nfrom dataclasses import dataclass, field, replace, asdict, fields\nimport gzip\n\nfrom sourmash import sqlite_utils, sourmash_args\nfrom sourmash.exceptions import IndexNotSupported\nfrom sourmash.distance_utils import containment_to_distance\n\nimport sqlite3\n\n\n__all__ = [\n    \"get_ident\",\n    \"ascending_taxlist\",\n    \"collect_gather_csvs\",\n    \"load_gather_results\",\n    \"check_and_load_gather_csvsreport_missing_and_skipped_identities\",\n    \"aggregate_by_lineage_at_rank\",\n    \"format_for_krona\",\n    \"write_output\",\n    \"write_bioboxes\",\n    \"parse_lingroups\",\n    \"combine_sumgather_csvs_by_lineage\",\n    \"write_lineage_sample_frac\",\n    \"MultiLineageDB\",\n    \"RankLineageInfo\",\n    \"LINLineageInfo\",\n]\n\nfrom sourmash.logging import notify\nfrom sourmash.sourmash_args import load_pathlist_from_file\n\nRANKCODE = {\n    \"superkingdom\": \"D\",\n    \"kingdom\": \"K\",\n    \"phylum\": \"P\",\n    \"class\": \"C\",\n    \"order\": \"O\",\n    \"family\": \"F\",\n    \"genus\": \"G\",\n    \"species\": \"S\",\n    \"unclassified\": \"U\",\n}\n\nICTV_RANKS = (\n    \"realm\",\n    \"subrealm\",\n    \"kingdom\",\n    \"subkingdom\",\n    \"phylum\",\n    \"subphylum\",\n    \"class\",\n    \"subclass\",\n    \"order\",\n    \"suborder\",\n    \"family\",\n    \"subfamily\",\n    \"genus\",\n    \"subgenus\",\n    \"species\",\n    \"name\",\n)\n\nNCBI_RANKS = (\n    \"superkingdom\",\n    \"phylum\",\n    \"class\",\n    \"order\",\n    \"family\",\n    \"genus\",\n    \"species\",\n    \"strain\",\n)\n\n\nclass LineagePair(NamedTuple):\n    rank: str\n    name: str = None\n    taxid: int = None\n\n\n@dataclass(frozen=True, order=True)\nclass BaseLineageInfo:\n    \"\"\"\n    This BaseLineageInfo class defines a set of methods that can be used to handle\n    summarization and manipulation of taxonomic lineages with hierarchical taxonomic ranks.\n\n    Inputs:\n        required:\n            ranks: tuple or list of hierarchical ranks\n        optional:\n            lineage: tuple or list of LineagePair\n            lineage_str: `;`- or `,`-separated string of names\n\n    If no lineage information is provided, result will be a BaseLineageInfo\n    with provided ranks and no lineage names.\n\n    Input lineage information is only used for initialization of the final `lineage`\n    and will not be used or compared in any other class methods.\n    \"\"\"\n\n    # need to set compare=False for any mutable type to keep this class hashable\n    ranks: ()  # require ranks\n    lineage: tuple = None  # tuple of LineagePairs\n    lineage_str: str = field(\n        default=None, compare=False\n    )  # ';'- or ','-separated str of lineage names\n\n    def __post_init__(self):\n        \"Initialize according to passed values\"\n        # ranks must be tuple for hashability\n        if isinstance(self.ranks, list):\n            object.__setattr__(self, \"ranks\", tuple(self.ranks))\n        if self.lineage is not None:\n            self._init_from_lineage_tuples()\n        elif self.lineage_str is not None:\n            self._init_from_lineage_str()\n        else:\n            self._init_empty()\n\n    def __eq__(self, other):\n        if (\n            other == ()\n        ):  # just handy: if comparing to a null tuple, don't try to find its lineage before returning False\n            return False\n        return all([self.ranks == other.ranks and self.lineage == other.lineage])\n\n    @property\n    def taxlist(self):\n        return self.ranks\n\n    @property\n    def ascending_taxlist(self):\n        return self.ranks[::-1]\n\n    @property\n    def lowest_rank(self):\n        if not self.filled_ranks:\n            return None\n        return self.filled_ranks[-1]\n\n    def rank_index(self, rank):\n        self.check_rank_availability(rank)\n        return self.ranks.index(rank)\n\n    def name_at_rank(self, rank):\n        \"Return the lineage name at this rank\"\n        self.check_rank_availability(rank)\n        if not self.filled_ranks or rank not in self.filled_ranks:\n            return None\n        rank_idx = self.rank_index(rank)\n        return self.filled_lineage[rank_idx].name\n\n    @property\n    def filled_lineage(self):\n        \"\"\"Return lineage down to lowest non-empty rank. Preserves missing ranks above.\"\"\"\n        # Would we prefer this to be the default returned by lineage??\n        if not self.filled_ranks:\n            return ()\n        lowest_filled_rank_idx = self.rank_index(self.filled_ranks[-1])\n        return self.lineage[: lowest_filled_rank_idx + 1]\n\n    @property\n    def lowest_lineage_name(self):\n        \"Return the name of the lowest filled lineage\"\n        if not self.filled_ranks:\n            return None\n        return self.filled_lineage[-1].name\n\n    @property\n    def lowest_lineage_taxid(self):\n        \"Return the taxid of the lowest filled lineage\"\n        if not self.filled_ranks:\n            return None\n        return self.filled_lineage[-1].taxid\n\n    def _init_empty(self):\n        \"initialize empty genome lineage\"\n        new_lineage = []\n        for rank in self.ranks:\n            new_lineage.append(LineagePair(rank=rank))\n        # set lineage and filled_ranks (because frozen, need to do it this way)\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", ())\n\n    def _init_from_lineage_tuples(self):\n        \"initialize from tuple/list of LineagePairs, allowing empty ranks and reordering if necessary\"\n        new_lineage = []\n        # check this is a list or tuple of lineage tuples:\n        for rank in self.ranks:\n            new_lineage.append(LineagePair(rank=rank))\n        for lin_tup in self.lineage:\n            # now add input tuples in correct spots. This corrects for order and allows empty values.\n            if not isinstance(lin_tup, LineagePair):\n                raise ValueError(f\"{lin_tup} is not tax_utils LineagePair.\")\n            if lin_tup.rank:  # skip this tuple if rank is None or \"\" (empty lineage tuple. is this needed?)\n                try:\n                    # find index for this rank\n                    rank_idx = self.rank_index(lin_tup.rank)\n                except ValueError as e:\n                    raise ValueError(\n                        f\"Rank '{lin_tup.rank}' not present in {', '.join(self.ranks)}\"\n                    ) from e\n                new_lineage[rank_idx] = lin_tup\n\n        # build list of filled ranks\n        filled_ranks = [a.rank for a in new_lineage if a.name is not None]\n        # set lineage and filled_ranks\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n\n    def _init_from_lineage_str(self):\n        \"\"\"\n        Turn a ; or ,-separated set of lineages into a list of LineagePair objs.\n        \"\"\"\n        new_lineage = self.lineage_str.split(\";\")\n        if len(new_lineage) == 1:\n            new_lineage = self.lineage_str.split(\",\")\n        new_lineage = [\n            LineagePair(rank=rank, name=n)\n            for (rank, n) in zip_longest(self.ranks, new_lineage)\n        ]\n        # build list of filled ranks\n        filled_ranks = [a.rank for a in new_lineage if a.name is not None]\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n\n    def zip_lineage(self, truncate_empty=False):\n        \"\"\"\n        Return lineage names as a list\n        \"\"\"\n        if truncate_empty:\n            zipped = [a.name for a in self.filled_lineage]\n        else:\n            zipped = [a.name for a in self.lineage]\n        # replace None with empty string (\"\")\n        if None in zipped:\n            zipped = [\"\" if x is None else x for x in zipped]\n\n        return zipped\n\n    def zip_taxid(self, truncate_empty=False):\n        \"\"\"\n        Return taxids as a list\n        \"\"\"\n        if truncate_empty:\n            zipped = [a.taxid for a in self.filled_lineage]\n        else:\n            zipped = [a.taxid for a in self.lineage]\n        # replace None with empty string (\"\"); cast taxids to str\n        zipped = [\"\" if x is None else str(x) for x in zipped]\n\n        return zipped\n\n    def display_lineage(self, truncate_empty=True, null_as_unclassified=False, sep=\";\"):\n        \"Return lineage names as ';'-separated list\"\n        lin = sep.join(self.zip_lineage(truncate_empty=truncate_empty))\n        if null_as_unclassified and lin == \"\" or lin is None:\n            return \"unclassified\"\n        else:\n            return lin\n\n    def display_taxid(self, truncate_empty=True, sep=\";\"):\n        \"Return lineage taxids as ';'-separated list\"\n        return sep.join(self.zip_taxid(truncate_empty=truncate_empty))\n\n    def check_rank_availability(self, rank):\n        if rank in self.ranks:  # rank is available\n            return True\n        raise ValueError(f\"Desired Rank '{rank}' not available for this lineage.\")\n\n    def rank_is_filled(self, rank, other=None):\n        self.check_rank_availability(rank)\n        if other is not None:\n            if rank in self.filled_ranks and rank in other.filled_ranks:\n                return True\n        elif rank in self.filled_ranks:\n            return True\n        return False\n\n    def is_compatible(self, other):\n        if self.ranks == other.ranks:\n            return True\n        return False\n\n    def is_lineage_match(self, other, rank):\n        \"\"\"\n        check to see if two lineages are a match down to given rank.\n        \"\"\"\n        self.check_rank_availability(rank)\n        if not self.is_compatible(other):\n            raise ValueError(\n                \"Cannot compare lineages from taxonomies with different ranks.\"\n            )\n        # always return false if rank is not filled in either of the two lineages\n        if self.rank_is_filled(rank, other=other):\n            rank_idx = self.rank_index(rank)\n            a_lin = self.lineage[: rank_idx + 1]\n            b_lin = other.lineage[: rank_idx + 1]\n            if a_lin == b_lin:\n                return 1\n        return 0\n\n    def pop_to_rank(self, rank):\n        \"Return new LineageInfo with ranks only filled to desired rank\"\n        # are we already above rank?\n        self.check_rank_availability(rank)\n        if not self.rank_is_filled(rank):\n            return replace(self)\n        # if not, make filled_lineage at this rank + use to generate new LineageInfo\n        new_lineage = self.lineage_at_rank(rank)\n        new = replace(self, lineage=new_lineage)\n        # replace doesn't run the __post_init__ properly. reinitialize.\n        new._init_from_lineage_tuples()\n        return new\n\n    def lineage_at_rank(self, rank):\n        \"Return tuple of LineagePairs at specified rank.\"\n        # are we already above rank?\n        self.check_rank_availability(rank)\n        if not self.rank_is_filled(rank):\n            return self.filled_lineage\n        # if not, return lineage tuples down to desired rank\n        rank_idx = self.rank_index(rank)\n        return self.filled_lineage[: rank_idx + 1]\n\n    def find_lca(self, other):\n        \"\"\"\n        If an LCA match exists between self and other,\n        find and report LCA lineage. If not, return None.\n        \"\"\"\n        for rank in self.ascending_taxlist:\n            if self.is_lineage_match(other, rank):\n                return self.pop_to_rank(rank)\n        return None\n\n\n@dataclass(frozen=True, order=True)\nclass RankLineageInfo(BaseLineageInfo):\n    \"\"\"\n    This RankLineageInfo class uses the BaseLineageInfo methods for a standard set\n    of taxonomic ranks.\n\n    Inputs:\n        optional:\n            ranks: tuple or list of hierarchical ranks\n                   default: ('superkingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species', 'strain')\n            lineage: tuple or list of LineagePair\n            lineage_str: `;`- or `,`-separated string of names\n            lineage_dict: dictionary of {rank: name}\n\n    If no inputs are provided, result will be RankLineageInfo with\n    default ranks and no lineage names.\n\n    Input lineage information is only used for initialization of the final `lineage`\n    and will not be used or compared in any other class methods.\n    \"\"\"\n\n    ranks: tuple = NCBI_RANKS\n    lineage_dict: dict = field(default=None, compare=False)  # dict of rank: name\n\n    def __post_init__(self):\n        \"Initialize according to passed values\"\n        # ranks must be tuple for hashability\n        if isinstance(self.ranks, list):\n            object.__setattr__(self, \"ranks\", tuple(self.ranks))\n        if self.lineage is not None:\n            self._init_from_lineage_tuples()\n        elif self.lineage_str is not None:\n            self._init_from_lineage_str()\n        elif self.lineage_dict is not None:\n            self._init_from_lineage_dict()\n        elif self.ranks:\n            self._init_empty()\n\n    def _init_from_lineage_dict(self):\n        \"\"\"\n        Initialize from lineage dict, e.g. from lineages csv.\n        Use NCBI taxids if available as '|'-separated 'taxpath' column.\n        Allows empty ranks/extra columns and reordering if necessary\n        \"\"\"\n        null_names = set([\"[Blank]\", \"na\", \"null\", \"NA\", \"\"])\n        if not isinstance(self.lineage_dict, (dict)):\n            raise ValueError(f\"{self.lineage_dict} is not dictionary\")\n        new_lineage = []\n        taxpath = []\n        # build empty lineage and taxpath\n        for rank in self.ranks:\n            new_lineage.append(LineagePair(rank=rank))\n\n        # check for NCBI taxpath information\n        taxpath_str = self.lineage_dict.get(\"taxpath\", [])\n        if taxpath_str:\n            taxpath = taxpath_str.split(\"|\")\n            if len(taxpath) > len(self.ranks):\n                raise ValueError(\n                    f\"Number of NCBI taxids ({len(taxpath)}) exceeds number of ranks ({len(self.ranks)})\"\n                )\n\n        # now add rank information in correct spots. This corrects for order and allows empty ranks and extra dict keys\n        for key, val in self.lineage_dict.items():\n            name, taxid = None, None\n            try:\n                rank, name = key, val\n                rank_idx = self.rank_index(rank)\n            except ValueError:\n                continue  # ignore dictionary entries (columns) that don't match a rank\n\n            if taxpath:\n                try:\n                    taxid = taxpath[rank_idx]\n                except IndexError:\n                    taxid = None\n            # filter null\n            if name is not None and name.strip() in null_names:\n                name = None\n            new_lineage[rank_idx] = LineagePair(rank=rank, name=name, taxid=taxid)\n\n        # build list of filled ranks\n        filled_ranks = [a.rank for a in new_lineage if a.name]\n        # set lineage and filled_ranks\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n\n\n@dataclass(frozen=True, order=True)\nclass ICTVRankLineageInfo(RankLineageInfo):\n    \"\"\"\n    This ICTV RankLineageInfo class uses the RankLineageInfo methods but uses\n    the 15-rank ICTV taxonomy. It also allows for a 'name' column in the taxonomy,\n    which reflects that virus name is sometimes used as a sub-species rank.\n\n    Inputs:\n        optional:\n            ranks: tuple or list of hierarchical ranks\n                   default: ('realm','subrealm','kingdom','subkingdom','phylum','subphylum',\n                                'class','subclass','order','suborder','family','subfamily',\n                                'genus','subgenus','species','name')\n            lineage: tuple or list of LineagePair\n            lineage_str: `;`- or `,`-separated string of names\n            lineage_dict: dictionary of {rank: name}\n\n    If no inputs are provided, result will be ICTVRankLineageInfo with\n    default ranks and no lineage names.\n\n    Input lineage information is only used for initialization of the final `lineage`\n    and will not be used or compared in any other class methods.\n    \"\"\"\n\n    ranks: tuple = ICTV_RANKS\n    lineage_dict: dict = field(default=None, compare=False)  # dict of rank: name\n\n    def __post_init__(self):\n        \"Initialize according to passed values\"\n        object.__setattr__(self, \"ranks\", ICTV_RANKS)\n        if self.lineage is not None:\n            self._init_from_lineage_tuples()\n        elif self.lineage_str is not None:\n            self._init_from_lineage_str()\n        elif self.lineage_dict is not None:\n            self._init_from_lineage_dict()\n        elif self.ranks:\n            self._init_empty()\n\n    def _init_from_lineage_dict(self):\n        \"\"\"\n        Initialize from lineage dict, e.g. from lineages csv.\n        Allows empty ranks/extra columns and reordering if necessary\n        \"\"\"\n        null_names = set([\"[Blank]\", \"na\", \"null\", \"NA\", \"\"])\n        if not isinstance(self.lineage_dict, (dict)):\n            raise ValueError(f\"{self.lineage_dict} is not dictionary\")\n        new_lineage = []\n        # build empty lineage and taxpath\n        for rank in self.ranks:\n            new_lineage.append(LineagePair(rank=rank))\n\n        # now add rank information in correct spots. This corrects for order and allows empty ranks and extra dict keys\n        for key, val in self.lineage_dict.items():\n            name = None\n            try:\n                rank, name = key, val\n                rank_idx = self.rank_index(rank)\n            except ValueError:\n                continue  # ignore dictionary entries (columns) that don't match a rank\n\n            # filter null\n            if name is not None and name.strip() in null_names:\n                name = None\n            new_lineage[rank_idx] = LineagePair(rank=rank, name=name)\n\n        # build list of filled ranks\n        filled_ranks = [a.rank for a in new_lineage if a.name]\n        # set lineage and filled_ranks\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n\n\n@dataclass(frozen=True, order=True)\nclass LINLineageInfo(BaseLineageInfo):\n    \"\"\"\n    This LINLineageInfo class uses the BaseLineageInfo methods for hierarchical LIN taxonomic 'ranks'.\n\n    Inputs (at least one required):\n        n_lin_positions: the number of lineage positions\n        lineage_str: `;`- or `,`-separated LINS string\n\n    If both `n_lin_positions` and `lineage_str` are provided, we will initialize a `LINLineageInfo`\n    with the provided n_lin_positions, and fill positions with `lineage_str` values. If the number of\n    positions is less than provided lineages, initialization will fail. Otherwise, we will insert blanks\n    beyond provided data in `lineage_str`.\n\n    If no information is passed, an empty LINLineageInfo will be initialized (n_lin_positions=0).\n\n    Input lineage information is only used for initialization of the final `lineage`\n    and will not be used or compared in any other class methods.\n    \"\"\"\n\n    ranks: tuple = field(\n        default=None, init=False, compare=False\n    )  # we will set this within class instead\n    lineage: tuple = None\n    # init with n_positions if you want to set a specific number of positions\n    n_lin_positions: int = field(default=None, compare=False)\n\n    def __post_init__(self):\n        \"Initialize according to passed values\"\n        # ranks must be tuple for hashability\n        if self.lineage is not None:\n            self._init_from_lineage_tuples()\n        elif self.lineage_str is not None:\n            self._init_from_lineage_str()\n        else:\n            self._init_empty()\n\n    def __eq__(self, other):\n        \"\"\"\n        Check if two LINLineageInfo match. Since we sometimes want to match LINprefixes, which have fewer\n        total ranks, with full LINs, we only check for the filled_lineage to match and don't check that\n        the number of lin_positions match.\n        \"\"\"\n        if (\n            other == ()\n        ):  # if comparing to a null tuple, don't try to find its lineage before returning False\n            return False\n        return self.filled_lineage == other.filled_lineage\n\n    def _init_ranks_from_n_lin_positions(self):\n        new_ranks = [str(x) for x in range(0, self.n_lin_positions)]\n        object.__setattr__(self, \"ranks\", new_ranks)\n\n    def _init_empty(self):\n        \"initialize empty genome lineage\"\n        # first, set ranks from n_positions\n        if self.n_lin_positions is None:\n            # set n_lin_positions to 0 for completely empty LINLineageInfo\n            object.__setattr__(self, \"n_lin_positions\", 0)\n        self._init_ranks_from_n_lin_positions()\n        new_lineage = []\n        for rank in self.ranks:\n            new_lineage.append(LineagePair(rank=rank))\n        # set lineage and filled_ranks (because frozen, need to do it this way)\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", ())\n        object.__setattr__(self, \"n_filled_pos\", 0)\n\n    def _init_from_lineage_str(self):\n        \"\"\"\n        Turn a ; or ,-separated set of lineages into a list of LineagePair objs.\n        \"\"\"\n        new_lineage = self.lineage_str.split(\";\")\n        if len(new_lineage) == 1:\n            new_lineage = self.lineage_str.split(\",\")\n        if self.n_lin_positions is not None:\n            if self.n_lin_positions < len(new_lineage):\n                raise (\n                    ValueError(\n                        \"Provided 'n_lin_positions' has fewer positions than provided 'lineage_str'.\"\n                    )\n                )\n            self._init_ranks_from_n_lin_positions()\n        else:\n            n_lin_positions = len(new_lineage)\n            object.__setattr__(self, \"n_lin_positions\", n_lin_positions)\n            self._init_ranks_from_n_lin_positions()\n\n        # build lineage and n_filled_pos, filled_ranks\n        new_lineage = [\n            LineagePair(rank=rank, name=n)\n            for (rank, n) in zip_longest(self.ranks, new_lineage)\n        ]\n        filled_ranks = [a.rank for a in new_lineage if a.name is not None]\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n        object.__setattr__(self, \"n_filled_pos\", len(filled_ranks))\n\n    def _init_from_lineage_tuples(self):\n        \"initialize from tuple/list of LineagePairs, building ranks as you go\"\n        new_lineage = []\n        ranks = []\n        # check this is a list or tuple of lineage tuples:\n        for lin_tup in self.lineage:\n            # make sure we're adding tax_utils.LineagePairs\n            if not isinstance(lin_tup, LineagePair):\n                raise ValueError(f\"{lin_tup} is not tax_utils LineagePair.\")\n            new_lineage.append(lin_tup)\n            ranks.append(lin_tup.rank)\n        # build list of filled ranks\n        filled_ranks = [a.rank for a in new_lineage if a.name is not None]\n        # set lineage and filled_ranks\n        object.__setattr__(self, \"lineage\", tuple(new_lineage))\n        object.__setattr__(self, \"n_lin_positions\", len(new_lineage))\n        object.__setattr__(self, \"ranks\", tuple(ranks))\n        object.__setattr__(self, \"filled_ranks\", tuple(filled_ranks))\n        object.__setattr__(self, \"n_filled_pos\", len(filled_ranks))\n\n    def is_compatible(self, other):\n        \"\"\"\n        Since we sometimes want to match LINprefixes with full LINs,\n        we don't want to enforce identical ranks. Here we just look to\n        make sure self and other share any ranks (LIN positions).\n\n        Since ranks are positions, this should be true for LINLineageInfo\n        unless one is empty. However, it should prevent comparison between\n        other LineageInfo instances and LINLineageInfo.\n        \"\"\"\n        # do self and other share any ranks?\n        if any(x in self.ranks for x in other.ranks):\n            return True\n        return False\n\n\n@dataclass\nclass LineageTree:\n    \"\"\"\n    Builds a tree of dictionaries from lists of LineagePair or\n    LineageInfo objects in 'assignments'.  This tree can then be used\n    to find lowest common ancestor agreements/confusion.\n    \"\"\"\n\n    assignments: list = field(compare=False)\n\n    def __post_init__(self):\n        self.tree = {}\n        self.add_lineages(self.assignments)\n\n    def add_lineage(self, lineage):\n        if isinstance(\n            lineage,\n            BaseLineageInfo | RankLineageInfo | LINLineageInfo | ICTVRankLineageInfo,\n        ):\n            lineage = lineage.filled_lineage\n        node = self.tree\n        for lineage_tup in lineage:\n            if lineage_tup.name:\n                child = node.get(lineage_tup, {})\n                node[lineage_tup] = child\n                # shift -> down in tree\n                node = child\n\n    def add_lineages(self, lineages):\n        if not lineages:\n            raise ValueError(\"empty assignment passed to build_tree\")\n        if not isinstance(lineages, abc.Iterable):\n            raise ValueError(\n                \"Must pass in an iterable containing LineagePair or LineageInfo objects.\"\n            )\n        for lineageInf in lineages:\n            self.add_lineage(lineageInf)\n\n    def find_lca(self):\n        \"\"\"\n        Given a LineageTree tree, find the first node with multiple\n        children, OR the only leaf in the tree.  Return (lineage_tup, reason),\n        where 'reason' is the number of children of the returned node, i.e.\n        0 if it's a leaf and > 1 if it's an internal node.\n        \"\"\"\n        node = self.tree\n        lca = []\n        while 1:\n            if len(node) == 1:  # descend to only child; track path\n                lineage_tup = next(iter(node.keys()))\n                lca.append(lineage_tup)\n                node = node[lineage_tup]\n            elif len(node) == 0:  # at leaf; end\n                return tuple(lca), 0\n            else:  # len(node) > 1 => confusion!!\n                return tuple(lca), len(node)\n\n    def ordered_paths(self, include_internal=False):\n        \"\"\"\n        Find all paths in the nested dict in a depth-first manner.\n        Each path is a tuple of lineage tuples that lead from the root\n        to a leaf node. Optionally include internal nodes by building\n        them up from leaf nodes (for ordering).\n        \"\"\"\n        paths = []\n        stack = [((), self.tree)]\n        while stack:\n            path, node = stack.pop()\n            for key, val in node.items():\n                if len(val) == 0:  # leaf node\n                    # if want internal paths, build up from leaf\n                    if include_internal:\n                        internal_path = path\n                        while internal_path:\n                            if internal_path not in paths:\n                                paths.append(internal_path)\n                            if isinstance(internal_path, abc.Iterable):\n                                internal_path = internal_path[:-1]\n                    # now add leaf path\n                    paths.append(path + (key,))\n                else:  # not leaf, add to stack\n                    stack.append((path + (key,), val))\n        return paths\n\n\ndef get_ident(ident, *, keep_full_identifiers=False, keep_identifier_versions=False):\n    # split identifiers = split on whitespace\n    # keep identifiers = don't split .[12] from assembly accessions\n    \"Hack and slash identifiers.\"\n    if not keep_full_identifiers:\n        ident = ident.split(\" \")[0]\n        if not keep_identifier_versions:\n            ident = ident.split(\".\")[0]\n    return ident\n\n\ndef ascending_taxlist(include_strain=True):\n    \"\"\"\n    Provide an ordered list of taxonomic ranks: strain --> superkingdom\n    \"\"\"\n    ascending_taxlist = [\n        \"species\",\n        \"genus\",\n        \"family\",\n        \"order\",\n        \"class\",\n        \"phylum\",\n        \"superkingdom\",\n    ]\n    if include_strain:\n        ascending_taxlist = [\"strain\"] + ascending_taxlist\n    yield from ascending_taxlist\n\n\ndef collect_gather_csvs(cmdline_gather_input, *, from_file=None):\n    \"\"\"\n    collect gather files from cmdline; --from-file input\n    \"\"\"\n    gather_csvs = []\n    # ignore command line duplicates\n    for gf in cmdline_gather_input:\n        if gf not in gather_csvs:\n            gather_csvs.append(gf)\n        else:\n            notify(f\"ignoring duplicated reference to file: {gf}\")\n    # ignore pathlist duplicates\n    if from_file:\n        more_files = load_pathlist_from_file(from_file)\n        for gf in more_files:\n            if gf not in gather_csvs:\n                gather_csvs.append(gf)\n            else:\n                notify(f\"ignoring duplicated reference to file: {gf}\")\n    return gather_csvs\n\n\ndef read_lingroups(lingroup_csv):\n    lingroupD = {}\n    n = None\n    with sourmash_args.FileInputCSV(lingroup_csv) as r:\n        header = r.fieldnames\n        # check for empty file\n        if not header:\n            raise ValueError(\n                f\"Cannot read lingroups from '{lingroup_csv}'. Is file empty?\"\n            )\n        if \"lin\" not in header or \"name\" not in header:\n            raise ValueError(\n                f\"'{lingroup_csv}' must contain the following columns: 'name', 'lin'.\"\n            )\n        for n, row in enumerate(r):\n            lingroupD[row[\"lin\"]] = row[\"name\"]\n\n    if n is None:\n        raise ValueError(f\"No lingroups loaded from {lingroup_csv}.\")\n    n_lg = len(lingroupD.keys())\n    notify(f\"Read {n + 1} lingroup rows and found {n_lg} distinct lingroup prefixes.\")\n    return lingroupD\n\n\ndef parse_lingroups(lingroupD):\n    # find the ranks we need to consider\n    all_lgs = set()\n    lg_ranks = set()\n    for lg_prefix in lingroupD.keys():\n        # store lineage info for LCA pathfinding\n        lg_info = LINLineageInfo(lineage_str=lg_prefix)\n        all_lgs.add(lg_info)\n        # store rank so we only go through summarized results at these ranks\n        lg_rank = str(lg_info.lowest_rank)\n        lg_ranks.add(lg_rank)\n    return lg_ranks, all_lgs\n\n\ndef load_gather_results(\n    gather_csv,\n    tax_assignments,\n    *,\n    seen_queries=None,\n    force=False,\n    skip_idents=None,\n    fail_on_missing_taxonomy=False,\n    keep_full_identifiers=False,\n    keep_identifier_versions=False,\n    lins=False,\n    ictv=False,\n):\n    \"Load a single gather csv\"\n    if not seen_queries:\n        seen_queries = set()\n    header = []\n    gather_results = {}\n    with sourmash_args.FileInputCSV(gather_csv) as r:\n        header = r.fieldnames\n        # check for empty file\n        if not header:\n            raise ValueError(\n                f\"Cannot read gather results from '{gather_csv}'. Is file empty?\"\n            )\n\n        this_querytaxres = None\n        for n, row in enumerate(r):\n            # try reading each gather row into a TaxResult\n            try:\n                filt_row = filter_row(\n                    row, GatherRow\n                )  # filter row first to allow extra (unused) columns in csv\n                gatherRow = GatherRow(**filt_row)\n            except TypeError as exc:\n                raise ValueError(\n                    f\"'{gather_csv}' is missing columns needed for taxonomic summarization. Please run gather with sourmash >= 4.4.\"\n                ) from exc\n            # check if we've seen this query already in a different gather CSV\n            if gatherRow.query_name in seen_queries:\n                # do not allow loading of same query from a second CSV.\n                raise ValueError(\n                    f\"Gather query {gatherRow.query_name} was found in more than one CSV. Cannot load from '{gather_csv}'.\"\n                )\n            taxres = TaxResult(\n                raw=gatherRow,\n                keep_full_identifiers=keep_full_identifiers,\n                keep_identifier_versions=keep_identifier_versions,\n                lins=lins,\n                ictv=ictv,\n            )\n            taxres.get_match_lineage(\n                tax_assignments=tax_assignments,\n                skip_idents=skip_idents,\n                fail_on_missing_taxonomy=fail_on_missing_taxonomy,\n            )\n            # add to matching QueryTaxResult or create new one\n            if not this_querytaxres or not this_querytaxres.is_compatible(taxres):\n                # get existing or initialize new\n                this_querytaxres = gather_results.get(\n                    gatherRow.query_name,\n                    QueryTaxResult(taxres.query_info, lins=lins, ictv=ictv),\n                )\n            this_querytaxres.add_taxresult(taxres)\n            gather_results[gatherRow.query_name] = this_querytaxres\n\n    if not gather_results:\n        raise ValueError(f\"No gather results loaded from {gather_csv}.\")\n    else:\n        notify(f\"loaded {len(gather_results)} gather results from '{gather_csv}'.\")\n    return (\n        gather_results,\n        header,\n    )  # , gather_queries # can use the gather_results keys instead\n\n\ndef check_and_load_gather_csvs(\n    gather_csvs,\n    tax_assign,\n    *,\n    fail_on_missing_taxonomy=False,\n    force=False,\n    keep_full_identifiers=False,\n    keep_identifier_versions=False,\n    lins=False,\n    ictv=False,\n):\n    \"\"\"\n    Load gather csvs, checking for empties and ids missing from taxonomic assignments.\n\n    Returns list of QueryTaxResults objects.\n    \"\"\"\n    if not isinstance(gather_csvs, list):\n        gather_csvs = [gather_csvs]\n    gather_results = {}\n    header = []\n    n_ignored = 0\n    for n, gather_csv in enumerate(gather_csvs):\n        these_results = {}\n        try:\n            these_results, header = load_gather_results(\n                gather_csv,\n                tax_assign,\n                seen_queries=gather_results.keys(),\n                force=force,\n                keep_full_identifiers=keep_full_identifiers,\n                keep_identifier_versions=keep_identifier_versions,\n                fail_on_missing_taxonomy=fail_on_missing_taxonomy,\n                lins=lins,\n                ictv=ictv,\n            )\n        except ValueError as exc:\n            if force:\n                if \"found in more than one CSV\" in str(exc):\n                    notify(\"Cannot force past duplicated gather query. Exiting.\")\n                    raise\n                if \"Failing, as requested via --fail-on-missing-taxonomy\" in str(exc):\n                    raise\n                notify(str(exc))\n                notify(\n                    \"--force is set. Attempting to continue to next set of gather results.\"\n                )\n                n_ignored += 1\n                continue\n            else:\n                notify(\"Exiting.\")\n                raise\n\n        # add these results to gather_results\n        gather_results.update(these_results)\n\n    # some reporting\n    num_gather_csvs_loaded = n + 1 - n_ignored\n    notify(\n        f\"loaded results for {len(gather_results)} queries from {str(num_gather_csvs_loaded)} gather CSVs\"\n    )\n    # count and report missing and skipped idents\n    report_missing_and_skipped_identities(gather_results)\n\n    # just return the list of QueryTaxResults\n    query_results_list = list(gather_results.values())\n\n    return query_results_list\n\n\ndef report_missing_and_skipped_identities(gather_results):\n    \"\"\"\n    Report match ids/accessions from gather results\n    that are not present in taxonomic assignments, either\n    by accident (missed) or request (skipped).\n    \"\"\"\n    ident_missed = set()\n    ident_skipped = set()\n    total_n_missed = 0\n    total_n_skipped = 0\n    total_taxresults = 0\n    for querytaxres in gather_results.values():\n        ident_missed.update(querytaxres.missed_idents)\n        ident_skipped.update(querytaxres.skipped_idents)\n        # totals are total rows in gather that were missed - do we want to report these at all?\n        total_n_missed += querytaxres.n_missed\n        total_n_skipped += querytaxres.n_skipped\n        total_taxresults += len(querytaxres.raw_taxresults)\n\n    if ident_missed:\n        notify(\n            f\"of {total_taxresults} gather results, lineage assignments for {total_n_missed} results were missed.\"\n        )\n        notify(\n            f\"The following are missing from the taxonomy information: {', '.join(ident_missed)}\"\n        )\n\n\ndef aggregate_by_lineage_at_rank(\n    query_gather_results, rank, *, by_query=False, use_abund=True\n):\n    \"\"\"\n    Aggregate list of summarized_lineage_results at rank, keeping\n    query names or not (but this aggregates across queries if multiple).\n    \"\"\"\n    lineage_summary = defaultdict(float)\n    if by_query:\n        lineage_summary = defaultdict(dict)\n    all_queries = []\n\n    for queryResult in query_gather_results:\n        query_name = queryResult.query_name\n        all_queries.append(query_name)\n\n        if rank not in queryResult.summarized_ranks:\n            raise ValueError(f\"Error: rank '{rank}' not available for aggregation.\")\n\n        for res in queryResult.summarized_lineage_results[rank]:\n            lineage = res.lineage.display_lineage(null_as_unclassified=True)\n            if use_abund:\n                fraction = res.f_weighted_at_rank\n            else:\n                fraction = res.fraction\n\n            if by_query:\n                lineage_summary[lineage][query_name] = fraction\n            else:\n                lineage_summary[lineage] += fraction\n\n    # if aggregating across queries divide fraction by the total number of queries\n    if not by_query:\n        n_queries = len(all_queries)\n        for lin, fraction in lineage_summary.items():\n            lineage_summary[lin] = fraction / n_queries\n    return lineage_summary, all_queries\n\n\ndef format_for_krona(\n    query_gather_results, rank, *, classification=False, use_abund=True\n):\n    \"\"\"\n    Aggregate and format for krona output. Single query recommended, but we don't want query headers.\n    \"\"\"\n    # make header\n    header = query_gather_results[0].make_krona_header(min_rank=rank)\n    krona_results = []\n    # do we want to block more than one query for summarization?\n    if len(query_gather_results) > 1:\n        notify(\n            \"WARNING: results from more than one query found. Krona summarization not recommended.\\n\"\n            \"Percentage assignment will be normalized by the number of queries to maintain range 0-100%.\"\n        )\n\n    if classification:\n        # for classification, just write the results\n        for q_res in query_gather_results:\n            if q_res.classified_ranks != [rank]:\n                q_res.build_classification_result(rank=rank)\n                header = q_res.make_krona_header(min_rank=rank)\n            # unclassified is 'correct' in that it is the part not classified to this match,\n            # but also misleading, since we're using best_only and there may\n            # be more matches that are not included here, making % unclassified seem higher than it would\n            # be with summarization. We previously excluded it -- is that the behavior we want to keep?\n            krona_results.extend(\n                [q_res.krona_classified]\n            )  # , q_res.krona_unclassified])\n    else:\n        lineage_summary, _ = aggregate_by_lineage_at_rank(\n            query_gather_results,\n            rank,\n            by_query=False,\n            use_abund=use_abund,\n        )\n\n        # sort by fraction\n        lin_items = list(lineage_summary.items())\n        lin_items.sort(key=lambda x: -x[1])\n\n        # reformat lineage for krona_results printing\n        unclassified_fraction = 0\n        for lin, fraction in lin_items:\n            # save unclassified fraction for the end\n            if lin == \"unclassified\":\n                unclassified_fraction = fraction\n                continue\n            else:\n                lin_list = lin.split(\";\")\n                krona_results.append((fraction, *lin_list))\n\n        # handle unclassified\n        if unclassified_fraction:\n            len_unclassified_lin = len(header) - 1\n            unclassifed_lin = [\"unclassified\"] * len_unclassified_lin\n            krona_results.append((unclassified_fraction, *unclassifed_lin))\n\n    return krona_results, header\n\n\ndef write_krona(header, krona_results, out_fp, *, sep=\"\\t\"):\n    \"write krona output\"\n    # CTB: do we want to optionally allow restriction to a specific rank\n    # & above? NTP: think we originally kept krona to a specific rank, but\n    # that may have been how we were plotting, since krona plots can be\n    # hierarchical? Probably worth changing/extending to multilevel to\n    # take advantage of full krona plot features\n    tsv_output = csv.writer(out_fp, delimiter=sep)\n    tsv_output.writerow(header)\n    for res in krona_results:\n        tsv_output.writerow(res)\n\n\ndef write_output(header, results, out_fp, *, sep=\",\", write_header=True):\n    \"\"\"\n    write pre-generated results list of rows, with each\n    row being a dictionary\n    \"\"\"\n    output = csv.DictWriter(out_fp, header, delimiter=sep)\n    if write_header:\n        output.writeheader()\n    for res in results:\n        output.writerow(res)\n\n\ndef write_bioboxes(header_lines, results, out_fp, *, sep=\"\\t\"):\n    \"\"\"\n    write pre-generated results list of rows, with each\n    row being list.\n    \"\"\"\n    for inf in header_lines:\n        out_fp.write(inf + \"\\n\")\n    for res in results:\n        # NCBI lineages can often have empty taxids at e.g. order level or strain level\n        # without a taxid, we cannot write the row to bioboxes format; here we just skip those rows.\n        if res[0] == \"\":  # no taxid for this results row -- skip!\n            continue\n        res = sep.join(res) + \"\\n\"\n        out_fp.write(res)\n\n\ndef write_summary(\n    query_gather_results,\n    csv_fp,\n    *,\n    sep=\",\",\n    limit_float_decimals=False,\n    classification=False,\n    lingroups=None,\n    use_abund=False,\n):\n    \"\"\"\n    Write taxonomy-summarized gather results for each rank.\n    \"\"\"\n    w = None\n    for q_res in query_gather_results:\n        header, summary = q_res.make_full_summary(\n            limit_float=limit_float_decimals,\n            classification=classification,\n            lingroups=lingroups,\n            use_abund=use_abund,\n        )\n        if w is None:\n            w = csv.DictWriter(csv_fp, header, delimiter=sep)\n            w.writeheader()\n        for res in summary:\n            w.writerow(res)\n\n\ndef write_human_summary(\n    query_gather_results,\n    out_fp,\n    display_rank,\n    classification=False,\n    use_abund=True,\n):\n    \"\"\"\n    Write human-readable taxonomy-summarized gather results for a specific rank.\n    \"\"\"\n    for queryResult in query_gather_results:\n        results = queryResult.make_human_summary(\n            display_rank=display_rank, classification=classification\n        )\n\n        if classification:\n            out_fp.write(\"sample name    status    proportion   cANI   lineage\\n\")\n            out_fp.write(\"-----------    ------    ----------   ----   -------\\n\")\n\n            for rD in results:\n                if use_abund:\n                    rD[\"proportion\"] = rD[\"f_weighted_at_rank\"]\n                else:\n                    rD[\"proportion\"] = rD[\"fraction_p\"]\n                out_fp.write(\n                    \"{query_name:<15s}   {status}    {proportion}     {query_ani_at_rank}  {lineage}\\n\".format(\n                        **rD\n                    )\n                )\n        else:\n            out_fp.write(\"sample name    proportion   cANI   lineage\\n\")\n            out_fp.write(\"-----------    ----------   ----   -------\\n\")\n\n            for rD in results:\n                if use_abund:\n                    rD[\"proportion\"] = rD[\"f_weighted_at_rank\"]\n                else:\n                    rD[\"proportion\"] = rD[\"fraction_p\"]\n\n                out_fp.write(\n                    \"{query_name:<15s}   {proportion}     {query_ani_at_rank}  {lineage}\\n\".format(\n                        **rD\n                    )\n                )\n\n\ndef write_lineage_sample_frac(sample_names, lineage_dict, out_fp, *, sep=\"\\t\"):\n    \"\"\"\n    takes in a lineage dictionary with sample counts (output of aggregate_by_lineage_at_rank)\n    and produces a tab-separated file with fractions for each sample.\n\n    input: {lin_a: {sample1: 0.4, sample2: 0.17, sample3: 0.6}\n            lin_b: {sample1: 0.0, sample2: 0.0, sample3: 0.1}\n            lin_c: {sample1: 0.3, sample2: 0.4, sample3: 0.2}}\n\n    output:\n\n    lineage    sample1\tsample2\tsample3\n    lin_a\t  0.4    0.17     0.6\n    lin_b\t  0.0    0.0      0.1\n    lin_c\t  0.3    0.4      0.2\n    \"\"\"\n\n    header = [\"lineage\"] + sample_names\n    w = csv.DictWriter(out_fp, header, delimiter=sep)\n    w.writeheader()\n    blank_row = {query_name: 0 for query_name in sample_names}\n    unclassified_row = None\n    for lin, sampleinfo in sorted(lineage_dict.items()):\n        # add lineage and 0 placeholders\n        row = {\"lineage\": lin}\n        row.update(blank_row)\n        # add info for query_names that exist for this lineage\n        row.update(sampleinfo)\n        # if unclassified, save this row for the end\n        if lin == \"unclassified\":\n            row.update({\"lineage\": \"unclassified\"})\n            unclassified_row = row\n            continue\n        # write row\n        w.writerow(row)\n    if unclassified_row:\n        w.writerow(unclassified_row)\n\n\nclass LineageDB(abc.Mapping):\n    \"Base LineageDB class built around an assignments dictionary.\"\n\n    def __init__(self, assign_d, avail_ranks):\n        self.assignments = assign_d\n        self.available_ranks = set(avail_ranks)\n\n    def __getitem__(self, ident):\n        \"Retrieve the lineage tuple for identifer (or raise KeyError)\"\n        return self.assignments[ident]\n\n    def __iter__(self):\n        \"Return all identifiers for this db.\"\n        return iter(self.assignments)\n\n    def __len__(self):\n        \"Return number of lineages\"\n        return len(self.assignments)\n\n    def __bool__(self):\n        \"Are there any lineages at all in this database?\"\n        return bool(self.assignments)\n\n    @classmethod\n    def load(\n        cls,\n        filename,\n        *,\n        delimiter=\",\",\n        force=False,\n        keep_full_identifiers=False,\n        keep_identifier_versions=True,\n        lins=False,\n        ictv=False,\n    ):\n        \"\"\"\n        Load a taxonomy assignment CSV file into a LineageDB.\n\n        'keep_full_identifiers=False' will split identifiers from strings\n        using whitespace, e.g. 'IDENT other name stuff' => 'IDENT'\n\n        'keep_identifier_versions=False' will remove trailing versions,\n        e.g. 'IDENT.1' => 'IDENT'.\n        \"\"\"\n        include_strain = False\n        if not keep_identifier_versions and keep_full_identifiers:\n            raise ValueError(\n                \"keep_identifer_versions=False doesn't make sense with keep_full_identifiers=True\"\n            )\n\n        if not os.path.exists(filename):\n            raise ValueError(f\"'{filename}' does not exist\")\n\n        if os.path.isdir(filename):\n            raise ValueError(f\"'{filename}' is a directory\")\n\n        with sourmash_args.FileInputCSV(filename, delimiter=\",\") as r:\n            header = r.fieldnames\n            if not header:\n                raise ValueError(f\"cannot read taxonomy assignments from {filename}\")\n\n            identifier = \"ident\"\n            # check for ident/identifier, handle some common alternatives\n            if \"ident\" not in header:\n                # check for ident/identifier, handle some common alternatives\n                if \"identifiers\" in header:\n                    identifier = \"identifiers\"\n                    header = [\"ident\" if \"identifiers\" == x else x for x in header]\n                elif \"accession\" in header:\n                    identifier = \"accession\"\n                    header = [\"ident\" if \"accession\" == x else x for x in header]\n                elif \"lineage\" in header and any(\n                    [\"name\" in header, \"match_name\" in header]\n                ):\n                    return cls.load_from_gather_with_lineages(\n                        filename, force=force, lins=lins, ictv=ictv\n                    )\n                else:\n                    header_str = \",\".join([repr(x) for x in header])\n                    raise ValueError(\n                        f\"No taxonomic identifiers found; headers are {header_str}\"\n                    )\n\n            if lins:\n                notify(\"Trying to read LIN taxonomy assignments.\")\n                if \"lin\" not in header:\n                    raise ValueError(\n                        f\"'lin' column not found: cannot read LIN taxonomy assignments from {filename}.\"\n                    )\n\n            if ictv:\n                notify(\"Trying to read ICTV taxonomy assignments.\")\n                # check that all ranks are in header\n                ranks = list(ICTVRankLineageInfo().taxlist)\n                if not set(ranks).issubset(header):\n                    raise ValueError(\"Not all taxonomy ranks present\")\n\n            if not lins and not ictv:\n                # is \"strain\" an available rank?\n                if \"strain\" in header:\n                    include_strain = True\n                # check that all ranks are in header\n                ranks = list(RankLineageInfo().taxlist)\n                if not include_strain:\n                    ranks.remove(\"strain\")\n                if not set(ranks).issubset(header):\n                    # for now, just raise err if not all ranks are present.\n                    # in future, we can define `ranks` differently if desired\n                    # return them from this function so we can check the `available` ranks\n                    raise ValueError(\"Not all taxonomy ranks present\")\n\n            assignments = {}\n            num_rows = 0\n            n_species = 0\n            n_strains = 0\n            n_pos = None\n\n            # now parse and load lineages\n            for n, row in enumerate(r):\n                num_rows += 1\n                if lins:\n                    lineageInfo = LINLineageInfo(lineage_str=row[\"lin\"])\n                    if n_pos is not None:\n                        if lineageInfo.n_lin_positions != n_pos:\n                            raise ValueError(\n                                \"For taxonomic summarization, all LIN assignments must use the same number of LIN positions.\"\n                            )\n                    else:\n                        # set n_pos with first entry\n                        n_pos = lineageInfo.n_lin_positions\n                        ranks = lineageInfo.ranks\n                elif ictv:\n                    # read lineage from row dictionary\n                    lineageInfo = ICTVRankLineageInfo(lineage_dict=row)\n                else:\n                    # read lineage from row dictionary\n                    lineageInfo = RankLineageInfo(lineage_dict=row)\n                # get identifier\n                ident = row[identifier]\n\n                # fold, spindle, and mutilate ident?\n                ident = get_ident(\n                    ident,\n                    keep_full_identifiers=keep_full_identifiers,\n                    keep_identifier_versions=keep_identifier_versions,\n                )\n\n                # store lineage tuple\n                lineage = lineageInfo.filled_lineage\n                if lineage:\n                    # check duplicates\n                    if ident in assignments:\n                        if assignments[ident] != lineage:\n                            if not force:\n                                raise ValueError(\n                                    f\"multiple lineages for identifier {ident}\"\n                                )\n                    else:\n                        assignments[ident] = lineage\n\n                        if not lins and not ictv:\n                            if lineage[-1].rank == \"species\":\n                                n_species += 1\n                            elif lineage[-1].rank == \"strain\":\n                                n_species += 1\n                                n_strains += 1\n\n        return LineageDB(assignments, ranks)\n\n    @classmethod\n    def load_from_gather_with_lineages(\n        cls, filename, *, force=False, lins=False, ictv=False\n    ):\n        \"\"\"\n        Load an annotated gather-with-lineages CSV file produced by\n        'tax annotate' into a LineageDB.\n        \"\"\"\n\n        if not os.path.exists(filename):\n            raise ValueError(f\"'{filename}' does not exist\")\n\n        if os.path.isdir(filename):\n            raise ValueError(f\"'{filename}' is a directory\")\n\n        with sourmash_args.FileInputCSV(filename) as r:\n            header = r.fieldnames\n            if not header:\n                raise ValueError(f\"cannot read taxonomy assignments from {filename}\")\n\n            ident_col = None\n            if \"name\" in header:\n                ident_col = \"name\"\n            elif \"match_name\" in header:\n                ident_col = \"match_name\"\n            if \"lineage\" not in header or ident_col is None:\n                raise ValueError(\n                    \"Expected headers 'name'/'match_name' and 'lineage' not found. Is this a with-lineages file?\"\n                )\n\n            ranks = None\n            assignments = {}\n            num_rows = 0\n            n_species = 0\n            n_strains = 0\n\n            # now parse and load lineages\n            for n, row in enumerate(r):\n                num_rows += 1\n\n                name = row[ident_col]\n                ident = get_ident(name)\n\n                if lins:\n                    lineageInfo = LINLineageInfo(lineage_str=row[\"lineage\"])\n                elif ictv:\n                    lineageInfo = ICTVRankLineageInfo(lineage_str=row[\"lineage\"])\n                else:\n                    lineageInfo = RankLineageInfo(lineage_str=row[\"lineage\"])\n\n                if ranks is None:\n                    ranks = lineageInfo.taxlist\n\n                lineage = lineageInfo.filled_lineage\n                # check duplicates\n                if ident in assignments:\n                    if assignments[ident] != lineage:\n                        # this should not happen with valid\n                        # sourmash tax annotate output, but check anyway.\n                        if not force:\n                            raise ValueError(\n                                f\"multiple lineages for identifier {ident}\"\n                            )\n                else:\n                    assignments[ident] = lineage\n\n                    if isinstance(lineageInfo, RankLineageInfo):\n                        if lineage[-1].rank == \"species\":\n                            n_species += 1\n                        elif lineage[-1].rank == \"strain\":\n                            n_species += 1\n                            n_strains += 1\n\n        return LineageDB(assignments, ranks)\n\n\nclass LineageDB_Sqlite(abc.Mapping):\n    \"\"\"\n    A LineageDB based on a sqlite3 database with a 'sourmash_taxonomy' table.\n    \"\"\"\n\n    # NOTE: 'order' is a reserved name in sql, so we have to use 'order_'.\n    columns = (\n        \"superkingdom\",\n        \"phylum\",\n        \"order_\",\n        \"class\",\n        \"family\",\n        \"genus\",\n        \"species\",\n        \"strain\",\n    )\n    table_name = \"sourmash_taxonomy\"\n\n    def __init__(self, conn, *, table_name=None):\n        self.conn = conn\n\n        # provide for legacy support for pre-sourmash_internal days...\n        if table_name is not None:\n            self.table_name = table_name\n\n        # check that the right table is there.\n        c = conn.cursor()\n        try:\n            c.execute(f\"SELECT * FROM {self.table_name} LIMIT 1\")\n        except (sqlite3.DatabaseError, sqlite3.OperationalError):\n            raise ValueError(\"not a taxonomy database\")\n\n        # check: can we do a 'select' on the right table?\n        self.__len__()\n        c = conn.cursor()\n\n        # get available ranks...\n        ranks = set()\n        for column, rank in zip(self.columns, RankLineageInfo().taxlist):\n            query = f\"SELECT COUNT({column}) FROM {self.table_name} WHERE {column} IS NOT NULL AND {column} != ''\"\n            c.execute(query)\n            (cnt,) = c.fetchone()\n            if cnt:\n                ranks.add(rank)\n\n        self.available_ranks = ranks\n        self.cursor = c\n\n    @classmethod\n    def load(cls, location):\n        \"load taxonomy information from an existing sqlite3 database\"\n        conn = sqlite_utils.open_sqlite_db(location)\n        if not conn:\n            raise ValueError(\"not a sqlite taxonomy database\")\n\n        table_name = None\n        c = conn.cursor()\n        try:\n            info = sqlite_utils.get_sourmash_internal(c)\n        except sqlite3.OperationalError:\n            info = {}\n\n        if \"SqliteLineage\" in info:\n            if info[\"SqliteLineage\"] != \"1.0\":\n                raise IndexNotSupported\n\n            table_name = \"sourmash_taxonomy\"\n        else:\n            # legacy support for old taxonomy DB, pre sourmash_internal.\n            try:\n                c.execute(\"SELECT * FROM taxonomy LIMIT 1\")\n                table_name = \"taxonomy\"\n            except sqlite3.OperationalError:\n                pass\n\n        if table_name is None:\n            raise ValueError(\"not a sqlite taxonomy database\")\n\n        return cls(conn, table_name=table_name)\n\n    def _make_tup(self, row):\n        \"build a tuple of LineagePairs for this sqlite row\"\n        tup = [LineagePair(n, r) for (n, r) in zip(RankLineageInfo().taxlist, row)]\n        return tuple(tup)\n\n    def __getitem__(self, ident):\n        \"Retrieve lineage for identifer\"\n        c = self.cursor\n        c.execute(\n            f\"SELECT superkingdom, phylum, class, order_, family, genus, species, strain FROM {self.table_name} WHERE ident=?\",\n            (ident,),\n        )\n\n        # retrieve names list...\n        names = c.fetchone()\n        if names:\n            # ...and construct lineage tuple\n            tup = self._make_tup(names)\n            while tup and not tup[-1].name:\n                tup = tup[:-1]\n\n            return tup\n\n        raise KeyError(ident)\n\n    def __bool__(self):\n        \"Do we have any info?\"\n        return bool(len(self))\n\n    def __len__(self):\n        \"Return number of rows\"\n        c = self.conn.cursor()\n        c.execute(f\"SELECT COUNT(DISTINCT ident) FROM {self.table_name}\")\n        (nrows,) = c.fetchone()\n        return nrows\n\n    def __iter__(self):\n        \"Return all identifiers\"\n        # create new cursor so as to allow other operations\n        c = self.conn.cursor()\n        c.execute(f\"SELECT DISTINCT ident FROM {self.table_name}\")\n\n        for (ident,) in c:\n            yield ident\n\n    def items(self):\n        \"return all items in the sqlite database\"\n        c = self.conn.cursor()\n\n        c.execute(\n            f\"SELECT DISTINCT ident, superkingdom, phylum, class, order_, family, genus, species, strain FROM {self.table_name}\"\n        )\n\n        for ident, *names in c:\n            yield ident, self._make_tup(names)\n\n\nclass MultiLineageDB(abc.Mapping):\n    \"A wrapper for (dynamically) combining multiple lineage databases.\"\n\n    # NTP: currently, later lineage databases will override earlier ones.\n    # Do we want to report/summarize shadowed identifiers?\n\n    def __init__(self):\n        self.lineage_dbs = []\n\n    @property\n    def available_ranks(self):\n        \"build the union of available ranks across all databases\"\n        # CTB: do we need to worry about lineages of shadowed identifiers?\n        x = set()\n        for db in self.lineage_dbs:\n            x.update(db.available_ranks)\n        return x\n\n    def add(self, db):\n        \"Add a new lineage database\"\n        self.lineage_dbs.insert(0, db)\n\n    def __iter__(self):\n        \"Return all identifiers (once)\"\n        seen = set()\n        for db in self.lineage_dbs:\n            for k in db:\n                if k not in seen:\n                    seen.add(k)\n                    yield k\n\n    def items(self):\n        \"Return all (identifiers, lineage_tup), masking duplicate idents\"\n        seen = set()\n        for db in self.lineage_dbs:\n            for k, v in db.items():\n                if k not in seen:\n                    seen.add(k)\n                    yield k, v\n\n    def shadowed_identifiers(self):\n        seen = set()\n        dups = set()\n        for db in self.lineage_dbs:\n            for k, v in db.items():\n                if k in seen:\n                    dups.add(k)\n                else:\n                    seen.add(k)\n        return seen\n\n    def __getitem__(self, ident):\n        \"Return lineage tuple for first match to identifier.\"\n        for db in self.lineage_dbs:\n            if ident in db:\n                return db[ident]\n\n        # not found? KeyError!\n        raise KeyError(ident)\n\n    def __len__(self):\n        \"Return number of distinct identifiers. Currently iterates over all.\"\n        # CTB: maybe we can make this unnecessary?\n        x = set(self)\n        return len(x)\n\n    def __bool__(self):\n        \"True if any contained database has content.\"\n        return any(bool(db) for db in self.lineage_dbs)\n\n    def save(self, filename_or_fp, file_format):\n        assert file_format in (\"sql\", \"csv\")\n\n        is_filename = False\n        try:\n            filename_or_fp.write\n        except AttributeError:\n            is_filename = True\n\n        if file_format == \"sql\":\n            if not is_filename:\n                raise ValueError(\n                    \"file format '{file_format}' requires a filename, not a file handle\"\n                )\n            self._save_sqlite(filename_or_fp)\n        elif file_format == \"csv\":\n            # we need a file handle; open file.\n            fp = filename_or_fp\n            if is_filename:\n                if filename_or_fp.endswith(\".gz\"):\n                    fp = gzip.open(filename_or_fp, \"wt\", newline=\"\")\n                else:\n                    fp = open(filename_or_fp, \"w\", newline=\"\")\n\n            try:\n                self._save_csv(fp)\n            finally:\n                # close the file we opened!\n                if is_filename:\n                    fp.close()\n\n    def _save_sqlite(self, filename, *, conn=None):\n        from sourmash import sqlite_utils\n\n        if conn is None:\n            db = sqlite3.connect(filename)\n        else:\n            assert not filename\n            db = conn\n\n        cursor = db.cursor()\n        try:\n            sqlite_utils.add_sourmash_internal(cursor, \"SqliteLineage\", \"1.0\")\n        except sqlite3.OperationalError:\n            raise ValueError(\"attempt to write a readonly database\")\n\n        try:\n            # CTB: could add 'IF NOT EXIST' here; would need tests, too.\n            cursor.execute(\n                \"\"\"\n\n        CREATE TABLE sourmash_taxonomy (\n            ident TEXT NOT NULL,\n            superkingdom TEXT,\n            phylum TEXT,\n            class TEXT,\n            order_ TEXT,\n            family TEXT,\n            genus TEXT,\n            species TEXT,\n            strain TEXT\n        )\n        \"\"\"\n            )\n        except sqlite3.OperationalError:\n            # already exists?\n            raise ValueError(f\"taxonomy table already exists in '{filename}'\")\n\n        # follow up and create index\n        cursor.execute(\n            \"CREATE UNIQUE INDEX sourmash_taxonomy_ident ON sourmash_taxonomy(ident);\"\n        )\n        for ident, tax in self.items():\n            x = [ident, *[t.name for t in tax]]\n\n            # fill the taxonomy tuple with empty values until it's the\n            # right length for the SQL statement -\n            while len(x) < 9:\n                x.append(\"\")\n\n            cursor.execute(\n                \"INSERT INTO sourmash_taxonomy (ident, superkingdom, phylum, class, order_, family, genus, species, strain) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\",\n                x,\n            )\n\n        db.commit()\n\n    def _save_csv(self, fp):\n        headers = [\"identifiers\"] + list(RankLineageInfo().taxlist)\n        w = csv.DictWriter(fp, fieldnames=headers)\n        w.writeheader()\n\n        for n, (ident, tax) in enumerate(self.items()):\n            row = {}\n            row[\"identifiers\"] = ident\n\n            # convert tax LineagePairs into dictionary\n            for t in tax:\n                row[t.rank] = t.name\n\n            # add strain if needed\n            if \"strain\" not in row:\n                row[\"strain\"] = \"\"\n\n            w.writerow(row)\n\n    @classmethod\n    def load(cls, locations, **kwargs):\n        \"Load one or more taxonomies from the given location(s)\"\n        force = kwargs.get(\"force\", False)\n\n        if isinstance(locations, str):\n            raise TypeError(\"'locations' should be a list, not a string\")\n\n        tax_assign = cls()\n        for location in locations:\n            # try faster formats first\n            loaded = False\n\n            # sqlite db?\n            try:\n                this_tax_assign = LineageDB_Sqlite.load(location)\n                loaded = True\n            except ValueError:\n                pass\n\n            # CSV file?\n            if not loaded:\n                try:\n                    this_tax_assign = LineageDB.load(location, **kwargs)\n                    loaded = True\n                except (ValueError, csv.Error) as exc:\n                    # for the last loader, just pass along ValueError...\n                    if not force:\n                        raise ValueError(\n                            f\"cannot read taxonomy assignments from '{location}': {str(exc)}\"\n                        )\n\n            # nothing loaded, goodbye!\n            if not loaded and not force:\n                raise ValueError(f\"cannot read taxonomy assignments from '{location}'\")\n\n            if loaded:\n                tax_assign.add(this_tax_assign)\n\n        return tax_assign\n\n\ndef filter_row(row, dataclass_type):\n    \"\"\"\n    Filter the row to only include keys that exist in the dataclass fields.\n    This allows extra columns to be passed in with the gather csv while still\n    taking advantage of the checks for required columns that come with dataclass\n    initialization.\n    \"\"\"\n    valid_keys = {field.name for field in fields(dataclass_type)}\n    # 'match_name' and 'name' should be interchangeable (sourmash 4.x)\n    if \"match_name\" in row.keys() and \"name\" not in row.keys():\n        row[\"name\"] = row.pop(\"match_name\")\n    return {k: v for k, v in row.items() if k in valid_keys}\n\n\n@dataclass\nclass GatherRow:\n    \"\"\"\n    Class to facilitate safely reading in Gather CSVs. The fields here should be match those\n    in \"gather_write_cols\" in `search.py`\n\n    To ensure all columns required for taxonomic summarization are present, this class\n    contains no defaults for these columns and thus will throw a TypeError if any of these\n    columns are missing in the passed gather input. All other fields have default None.\n\n    Usage:\n\n    with sourmash_args.FileInputCSV(gather_csv) as r:\n        for row in enumerate(r):\n            filt_row = filter_row(row, GatherRow) # filter first to allow extra columns\n            gatherRow = GatherRow(**filt_row)\n    \"\"\"\n\n    # essential columns\n    query_name: str\n    name: str  # match_name\n    f_unique_weighted: float\n    f_unique_to_query: float\n    unique_intersect_bp: int\n    remaining_bp: int\n    query_md5: str\n    query_filename: str\n    # new essential cols: requires 4.4x\n    query_bp: int\n    ksize: int\n    scaled: int\n\n    # non-essential, but used if available\n    query_n_hashes: int = None\n    sum_weighted_found: int = None\n    total_weighted_hashes: int = None\n\n\n@dataclass\nclass QueryInfo:\n    \"Class for storing query information\"\n\n    query_name: str\n    query_md5: str\n    query_filename: str\n    query_bp: int\n    ksize: int\n    scaled: int\n    query_n_hashes: int = None\n    total_weighted_hashes: int = 0\n\n    def __post_init__(self):\n        \"Initialize and cast types\"\n        self.query_bp = int(self.query_bp)\n        self.ksize = int(self.ksize)\n        self.scaled = int(self.scaled)\n        self.query_n_hashes = int(self.query_n_hashes) if self.query_n_hashes else 0\n        self.total_weighted_hashes = (\n            int(self.total_weighted_hashes) if self.total_weighted_hashes else 0\n        )\n\n    @property\n    def total_weighted_bp(self):\n        return self.total_weighted_hashes * self.scaled\n\n\n@dataclass\nclass BaseTaxResult:\n    \"\"\"\n    Base class for sourmash taxonomic annotation.\n    \"\"\"\n\n    raw: dict  # csv row\n    keep_full_identifiers: bool = False\n    keep_identifier_versions: bool = False\n    match_ident: str = field(init=False)\n    skipped_ident: bool = False\n    missed_ident: bool = False\n    match_lineage_attempted: bool = False\n    lins: bool = False\n    ictv: bool = False\n\n    def get_ident(self, id_col=None):\n        # split identifiers = split on whitespace\n        # keep identifiers = don't split .[12] from assembly accessions\n        \"Hack and slash identifiers.\"\n        if id_col:\n            self.match_ident = self.raw[id_col]\n        else:\n            self.match_ident = self.raw.name\n        if not self.keep_full_identifiers:\n            self.match_ident = self.match_ident.split(\" \")[0]\n        else:\n            # overrides version bc can't keep full without keeping version\n            self.keep_identifier_versions = True\n        if not self.keep_identifier_versions:\n            self.match_ident = self.match_ident.split(\".\")[0]\n\n    def get_match_lineage(\n        self, tax_assignments, skip_idents=None, fail_on_missing_taxonomy=False\n    ):\n        if skip_idents and self.match_ident in skip_idents:\n            self.skipped_ident = True\n        else:\n            lin = tax_assignments.get(self.match_ident)\n            if lin:\n                if self.lins:\n                    self.lineageInfo = LINLineageInfo(lineage=lin)\n                elif self.ictv:\n                    self.lineageInfo = ICTVRankLineageInfo(lineage=lin)\n                else:\n                    self.lineageInfo = RankLineageInfo(lineage=lin)\n            else:\n                self.missed_ident = True\n        self.match_lineage_attempted = True\n        if self.missed_ident and fail_on_missing_taxonomy:\n            raise ValueError(\n                f\"Error: ident '{self.match_ident}' is not in the taxonomy database. Failing, as requested via --fail-on-missing-taxonomy\"\n            )\n\n\n@dataclass\nclass AnnotateTaxResult(BaseTaxResult):\n    \"\"\"\n    Class to enable taxonomic annotation of any sourmash CSV.\n    \"\"\"\n\n    id_col: str = \"name\"\n\n    def __post_init__(self):\n        if self.id_col not in self.raw.keys():\n            raise ValueError(f\"ID column '{self.id_col}' not found.\")\n        self.get_ident(id_col=self.id_col)\n        if self.lins:\n            self.lineageInfo = LINLineageInfo()\n        else:\n            self.lineageInfo = RankLineageInfo()\n\n    def row_with_lineages(self):\n        lineage = self.lineageInfo.display_lineage(truncate_empty=True)\n        rl = {\"lineage\": lineage}\n        rl.update(self.raw)\n        return rl\n\n\n@dataclass\nclass TaxResult(BaseTaxResult):\n    \"\"\"\n    Class to store taxonomic result of a single row from a gather CSV, including accessible\n    query information (QueryInfo) and matched taxonomic lineage. TaxResult tracks whether\n    lineage matching has been attempted and whether the lineage matching failed\n    due to missing or skipped lineage identifiers.\n\n    Initialize TaxResult using GatherRow, which ensures all required fields are present.\n    The QueryInfo in TaxResult is used to ensure only compatible gather results generated\n    from the same query are summarized during taxonomic summarization.\n\n    Usage:\n\n        with sourmash_args.FileInputCSV(gather_csv) as r:\n            for row in enumerate(r):\n                filt_row = filter_row(row, GatherRow) # this filters any extra columns\n                gatherRow = GatherRow(**filt_row) # this checks for required columns and raises TypeError for any missing\n                # initialize TaxResult\n                tax_res = TaxResult(raw=gatherRow)\n\n                # get match lineage\n                tax_res.get_match_lineage(taxD=taxonomic_assignments)\n\n    Use RankLineageInfo, ICTVLineageInfo, or LINLineageInfo to store lineage information.\n    \"\"\"\n\n    raw: GatherRow\n    query_name: str = field(init=False)\n    query_info: QueryInfo = field(init=False)\n\n    def __post_init__(self):\n        self.get_ident()\n        self.query_name = self.raw.query_name  # convenience\n        self.query_info = QueryInfo(\n            query_name=self.raw.query_name,\n            query_md5=self.raw.query_md5,\n            query_filename=self.raw.query_filename,\n            query_bp=self.raw.query_bp,\n            query_n_hashes=self.raw.query_n_hashes,\n            total_weighted_hashes=self.raw.total_weighted_hashes,\n            ksize=self.raw.ksize,\n            scaled=self.raw.scaled,\n        )\n        # cast and store the imp bits\n        self.f_unique_to_query = float(self.raw.f_unique_to_query)\n        self.f_unique_weighted = float(self.raw.f_unique_weighted)\n        self.unique_intersect_bp = int(self.raw.unique_intersect_bp)\n        if self.lins:\n            self.lineageInfo = LINLineageInfo()\n        elif self.ictv:\n            self.lineageInfo = ICTVRankLineageInfo()\n        else:\n            self.lineageInfo = RankLineageInfo()\n\n\n@dataclass\nclass SummarizedGatherResult:\n    \"\"\"\n    Class for storing summarized lineage information.\n    Automatically checks for out-of-range values and estimates ANI.\n\n    Methods included for returning formatted results for different outputs.\n    \"\"\"\n\n    rank: str\n    fraction: float  # unweighted\n    lineage: RankLineageInfo\n    f_weighted_at_rank: float  # weighted\n    bp_match_at_rank: int\n    query_ani_at_rank: float = None\n\n    def __post_init__(self):\n        self.check_values()\n\n    def check_values(self):\n        if any([self.fraction > 1, self.f_weighted_at_rank > 1]):\n            raise ValueError(\n                \"Summarized fraction is > 100% of the query! This should not be possible. Please check that your input files come directly from a single gather run per query.\"\n            )\n        # is this true for weighted too, or is that set to 0 when --ignore-abundance is used?\n        if any(\n            [self.fraction <= 0, self.f_weighted_at_rank <= 0]\n        ):  # this shouldn't actually happen, but it breaks ANI estimation, so let's check for it.\n            raise ValueError(\n                \"Summarized fraction is <=0% of the query! This should not occur.\"\n            )\n\n    def set_query_ani(self, query_info):\n        self.query_ani_at_rank = containment_to_distance(\n            self.fraction,\n            query_info.ksize,\n            query_info.scaled,\n            n_unique_kmers=query_info.query_n_hashes,\n            sequence_len_bp=query_info.query_bp,\n        ).ani\n\n    def as_lineage_dict(self, query_info, ranks):\n        \"\"\"\n        Format to dict for writing lineage-CSV file suitable for use with sourmash tax ... -t.\n        \"\"\"\n        lD = {}\n        lD[\"ident\"] = query_info.query_name\n        for rank in ranks:\n            lin_name = self.lineage.name_at_rank(rank)\n            if lin_name is None:\n                lin_name = \"\"\n            lD[rank] = lin_name\n        return lD\n\n    def as_summary_dict(self, query_info, limit_float=False, lingroups=None):\n        sD = asdict(self)\n        sD[\"lineage\"] = self.lineage.display_lineage(null_as_unclassified=True)\n        # if lingroups, add 'lingroup' column linking lingroup number to lingroup name\n        if lingroups is not None and sD[\"lineage\"] in lingroups.keys():\n            sD[\"lingroup\"] = lingroups[sD[\"lineage\"]]\n        elif (\n            lingroups\n            and sD[\"lineage\"] != \"unclassified\"\n            and sD[\"lineage\"] not in lingroups.keys()\n        ):\n            return None\n        sD[\"query_name\"] = query_info.query_name\n        sD[\"query_md5\"] = query_info.query_md5\n        sD[\"query_filename\"] = query_info.query_filename\n        sD[\"total_weighted_hashes\"] = str(query_info.total_weighted_hashes)\n        sD[\"bp_match_at_rank\"] = str(self.bp_match_at_rank)\n        if limit_float:\n            sD[\"fraction\"] = f\"{self.fraction:.3f}\"\n            sD[\"f_weighted_at_rank\"] = f\"{self.f_weighted_at_rank:.3f}\"\n            if self.query_ani_at_rank:\n                sD[\"query_ani_at_rank\"] = f\"{self.query_ani_at_rank:.3f}\"\n        else:\n            sD[\"fraction\"] = str(self.fraction)\n            sD[\"f_weighted_at_rank\"] = str(self.f_weighted_at_rank)\n\n        return sD\n\n    def as_human_friendly_dict(self, query_info):\n        sD = self.as_summary_dict(query_info=query_info, limit_float=True)\n        sD[\"fraction_p\"] = f\"{self.fraction * 100:>4.1f}%\"\n        sD[\"f_weighted_at_rank\"] = f\"{self.f_weighted_at_rank * 100:>4.1f}%\"\n        if self.query_ani_at_rank is not None:\n            sD[\"query_ani_at_rank\"] = f\"{self.query_ani_at_rank * 100:>3.1f}%\"\n        else:\n            sD[\"query_ani_at_rank\"] = \"-    \"\n        return sD\n\n    def as_kreport_dict(self, query_info, *, use_abund=True):\n        \"\"\"\n        Produce kreport dict for named taxonomic groups.\n        \"\"\"\n        lowest_assignment_rank = \"species\"\n        sD = {}\n        sD[\"num_bp_assigned\"] = str(0)\n        sD[\"ncbi_taxid\"] = None\n        # total percent containment, weighted to include abundance info\n        if use_abund:\n            sD[\"percent_containment\"] = f\"{self.f_weighted_at_rank * 100:.2f}\"\n            sD[\"num_bp_contained\"] = str(\n                int(self.f_weighted_at_rank * query_info.total_weighted_bp)\n            )\n        else:\n            sD[\"percent_containment\"] = f\"{self.fraction * 100:.2f}\"\n            sD[\"num_bp_contained\"] = str(int(self.bp_match_at_rank))\n\n        if isinstance(self.lineage, LINLineageInfo):\n            raise ValueError(\"Cannot produce 'kreport' with LIN taxonomy.\")\n        if self.lineage != RankLineageInfo():\n            this_rank = self.lineage.lowest_rank\n            sD[\"rank_code\"] = RANKCODE[this_rank]\n            sD[\"sci_name\"] = self.lineage.lowest_lineage_name\n            taxid = self.lineage.lowest_lineage_taxid\n            if taxid:\n                sD[\"ncbi_taxid\"] = str(taxid)\n            # the number of bp actually 'assigned' at this rank. Sourmash assigns everything\n            # at genome level, but since kreport traditionally doesn't include 'strain' or genome,\n            # it is reasonable to state that sourmash assigns at 'species' level for this.\n            # can be modified later.\n            if this_rank == lowest_assignment_rank:\n                sD[\"num_bp_assigned\"] = sD[\"num_bp_contained\"]\n        else:\n            sD[\"sci_name\"] = \"unclassified\"\n            sD[\"rank_code\"] = RANKCODE[\"unclassified\"]\n            sD[\"num_bp_assigned\"] = sD[\"num_bp_contained\"]\n        return sD\n\n    def as_lingroup_dict(self, query_info, lg_name):\n        \"\"\"\n        Produce lingroup report dict for lingroups.\n        \"\"\"\n        sD = {}\n        # total percent containment, weighted to include abundance info\n        sD[\"percent_containment\"] = f\"{self.f_weighted_at_rank * 100:.2f}\"\n        sD[\"num_bp_contained\"] = str(\n            int(self.f_weighted_at_rank * query_info.total_weighted_bp)\n        )\n        sD[\"lin\"] = self.lineage.display_lineage()\n        sD[\"name\"] = lg_name\n        return sD\n\n    def as_cami_bioboxes(self):\n        \"\"\"\n        Format taxonomy-summarized gather results\n        as CAMI profiling Bioboxes format.\n\n        Columns are: TAXID\tRANK\tTAXPATH\tTAXPATHSN\tPERCENTAGE\n        \"\"\"\n        if isinstance(self.lineage, LINLineageInfo):\n            raise ValueError(\"Cannot produce 'bioboxes' with LIN taxonomy.\")\n        if self.lineage != RankLineageInfo():  # if not unassigned\n            taxid = self.lineage.lowest_lineage_taxid\n            if taxid:\n                taxpath = self.lineage.display_taxid(sep=\"|\")\n                taxid = str(taxid)\n            else:\n                taxpath = None\n            taxpathsn = self.lineage.display_lineage(sep=\"|\")\n            percentage = (\n                f\"{(self.f_weighted_at_rank * 100):.2f}\"  # fix at 2 decimal points\n            )\n            return [taxid, self.rank, taxpath, taxpathsn, percentage]\n        return []\n\n\n@dataclass\nclass ClassificationResult(SummarizedGatherResult):\n    \"\"\"\n    Inherits from SummarizedGatherResult\n\n    Class for storing query classification information.\n    Automatically checks for out-of-range values and estimates ANI.\n    Checks classification status according to provided containment and ANI thresholds.\n\n    Methods included for returning formatted results for different outputs.\n    \"\"\"\n\n    \"Class for storing query classification information\"\n    status: str = field(init=False)\n\n    def __post_init__(self):\n        # check for out of bounds values, default \"nomatch\" if no match at all\n        self.check_values()\n        self.status = \"nomatch\"  # None?\n\n    def set_status(self, query_info, containment_threshold=None, ani_threshold=None):\n        # if any matches, use 'below_threshold' as default; set 'match' if meets threshold\n        if any([containment_threshold is not None, ani_threshold is not None]):\n            self.status = \"below_threshold\"\n        self.set_query_ani(query_info=query_info)\n        if (\n            ani_threshold is not None\n        ):  # if provided, just use ani thresh, don't use containment threshold\n            if self.query_ani_at_rank >= ani_threshold:\n                self.status = \"match\"\n        # v5?: switch to using self.f_weighted_at_rank here\n        elif (\n            containment_threshold is not None and self.fraction >= containment_threshold\n        ):\n            self.status = \"match\"\n\n    # CTB: note, used only in tax genome.\n    def build_krona_result(self, rank=None):\n        krona_classified, krona_unclassified = None, None\n        if rank is not None and rank == self.rank:\n            lin_as_list = self.lineage.display_lineage().split(\";\")\n\n            krona_classification = (\n                self.fraction,\n                *lin_as_list,\n            )\n            unclassified_fraction = 1.0 - self.fraction\n\n            krona_classified = krona_classification\n            # handle unclassified - do we want/need this?\n            len_unclassified_lin = len(lin_as_list)\n            unclassifed_lin = [\"unclassified\"] * (len_unclassified_lin)\n            krona_unclassified = (unclassified_fraction, *unclassifed_lin)\n        return krona_classified, krona_unclassified\n\n\n@dataclass\nclass QueryTaxResult:\n    \"\"\"\n    Class for storing all TaxResults (gather results rows) for a query.\n    Checks query compatibility prior to adding a TaxResult.\n    Stores raw TaxResults and provides methods for summarizing up ranks\n    and reporting these summarized results as metagenome summaries or\n    genome classifications.\n\n    Contains methods for formatting results for different outputs.\n    \"\"\"\n\n    query_info: QueryInfo  # initialize with QueryInfo dataclass\n    lins: bool = False\n    ictv: bool = False\n\n    def __post_init__(self):\n        self.query_name = self.query_info.query_name  # for convenience\n        self._init_taxresult_vars()\n        self._init_summarization_vars()\n        self._init_classification_results()\n\n    def _init_taxresult_vars(self):\n        self.ranks = []\n        self.raw_taxresults = []\n        self.skipped_idents = set()\n        self.missed_idents = set()\n        self.n_missed = 0\n        self.n_skipped = 0\n        self.perfect_match = set()\n\n    def _init_summarization_vars(self):\n        self.sum_uniq_weighted = defaultdict(lambda: defaultdict(float))\n        self.sum_uniq_to_query = defaultdict(lambda: defaultdict(float))\n        self.sum_uniq_bp = defaultdict(lambda: defaultdict(int))\n        self.summarized_ranks = []\n        self._init_summarization_results()\n\n    def _init_summarization_results(self):\n        self.total_f_weighted = defaultdict(float)  # 0.0\n        self.total_f_classified = defaultdict(float)  # 0.0\n        self.total_bp_classified = defaultdict(int)  # 0\n        self.summarized_lineage_results = defaultdict(list)\n\n    def _init_classification_results(self):\n        self.status = \"nomatch\"\n        self.classified_ranks = []\n        self.classification_result = None\n        self.krona_classified = None\n        self.krona_unclassified = None\n        self.krona_header = []\n\n    def is_compatible(self, taxresult):\n        return (\n            taxresult.query_info == self.query_info\n            and taxresult.lins == self.lins\n            and taxresult.ictv == self.ictv\n        )\n\n    @property\n    def ascending_ranks(self):\n        if not self.ranks:\n            return []\n        else:\n            return self.ranks[::-1]\n\n    def add_taxresult(self, taxresult):\n        # check that all query parameters match\n        if self.is_compatible(taxresult=taxresult):\n            if not taxresult.match_lineage_attempted:\n                raise ValueError(\n                    \"Error: Cannot add TaxResult. Please use get_match_lineage() to add taxonomic lineage information first.\"\n                )\n            if not self.ranks:\n                self.ranks = taxresult.lineageInfo.ranks\n            if taxresult.skipped_ident:\n                self.n_skipped += 1\n                self.skipped_idents.add(taxresult.match_ident)\n            elif taxresult.missed_ident:\n                self.n_missed += 1\n                self.missed_idents.add(taxresult.match_ident)\n            self.raw_taxresults.append(taxresult)\n        else:\n            raise ValueError(\n                \"Error: Cannot add TaxResult: query information does not match.\"\n            )\n\n    def summarize_up_ranks(self, single_rank=None, force_resummarize=False):\n        if self.summarized_ranks:  # has already been summarized\n            if force_resummarize:\n                self._init_summarization_vars()\n            else:\n                raise ValueError(\n                    \"Error: already summarized using rank(s): '{', '.join(self.summarized_ranks)}'. Use 'force_resummarize=True' to reset and resummarize\"\n                )\n        # set ranks levels to summarize\n        self.summarized_ranks = self.ascending_ranks\n        if single_rank:\n            if single_rank not in self.summarized_ranks:\n                raise ValueError(\n                    f\"Error: rank '{single_rank}' not in available ranks ({', '.join(self.summarized_ranks)})\"\n                )\n            self.summarized_ranks = [single_rank]\n        for taxres in self.raw_taxresults:\n            lininfo = taxres.lineageInfo\n            if (\n                lininfo and lininfo.filled_lineage\n            ):  # won't always have lineage to summarize (skipped idents, missed idents)\n                # notify + track perfect matches\n                if taxres.f_unique_to_query >= 1.0:\n                    if taxres.match_ident not in self.perfect_match:\n                        notify(\n                            f\"WARNING: 100% match! Is query '{self.query_name}' identical to its database match, '{taxres.match_ident}'?\"\n                        )\n                        self.perfect_match.add(taxres.match_ident)\n                # add this taxresult to summary\n                for rank in self.summarized_ranks:\n                    if (\n                        rank in lininfo.filled_ranks\n                    ):  # only store if this rank is filled.\n                        lin_at_rank = lininfo.pop_to_rank(rank)\n                        self.sum_uniq_weighted[rank][lin_at_rank] += (\n                            taxres.f_unique_weighted\n                        )\n                        self.sum_uniq_to_query[rank][lin_at_rank] += (\n                            taxres.f_unique_to_query\n                        )\n                        self.sum_uniq_bp[rank][lin_at_rank] += (\n                            taxres.unique_intersect_bp\n                        )\n        # reset ranks levels to the ones that were actually summarized + that we can access for summarized result\n        self.summarized_ranks = [\n            x for x in self.summarized_ranks if x in self.sum_uniq_bp.keys()\n        ]\n        if single_rank and single_rank not in self.summarized_ranks:\n            raise ValueError(\n                f\"Error: rank '{single_rank}' was not available for any matching lineages.\"\n            )\n\n    def build_summarized_result(self, single_rank=None, force_resummarize=False):\n        # just reset if we've already built summarized result (avoid adding to existing)? Or write in an error/force option?\n        self._init_summarization_results()\n        # if taxresults haven't been summarized, do that first\n        if not self.summarized_ranks or force_resummarize:\n            self.summarize_up_ranks(\n                single_rank=single_rank, force_resummarize=force_resummarize\n            )\n        # catch potential error from running summarize_up_ranks separately and passing in different single_rank\n        if single_rank and single_rank not in self.summarized_ranks:\n            raise ValueError(\n                f\"Error: rank '{single_rank}' not in summarized rank(s), {','.join(self.summarized_ranks)}\"\n            )\n        # rank loop is currently done in __main__\n        for rank in self.summarized_ranks[\n            ::-1\n        ]:  # reverse so that results are in descending order\n            sum_uniq_to_query = self.sum_uniq_to_query[rank]  # should be lineage: value\n            # first, sort\n            sorted_sum_uniq_to_query = list(sum_uniq_to_query.items())\n            sorted_sum_uniq_to_query.sort(key=lambda x: -x[1])\n            for lineage, f_unique in sorted_sum_uniq_to_query:\n                # does this ever happen? do we need it?\n                if (\n                    f_unique == 0\n                ):  # no annotated results for this query. do we need to handle this differently now?\n                    continue\n                f_weighted_at_rank = self.sum_uniq_weighted[rank][lineage]\n                bp_intersect_at_rank = self.sum_uniq_bp[rank][lineage]\n                sres = SummarizedGatherResult(\n                    lineage=lineage,\n                    rank=rank,\n                    f_weighted_at_rank=f_weighted_at_rank,\n                    fraction=f_unique,\n                    bp_match_at_rank=bp_intersect_at_rank,\n                )\n                sres.set_query_ani(query_info=self.query_info)\n                self.summarized_lineage_results[rank].append(sres)\n\n                # NTP Note: These change by rank ONLY when doing best_only (selecting top hit at that particular rank)\n                # now that I pulled best_only into separate fn, these don't need to be dicts...\n                self.total_f_classified[rank] += f_unique\n                self.total_f_weighted[rank] += f_weighted_at_rank\n                self.total_bp_classified[rank] += bp_intersect_at_rank\n\n            # record unclassified\n            if self.lins:\n                lineage = LINLineageInfo()\n            elif self.ictv:\n                lineage = ICTVRankLineageInfo()\n            else:\n                lineage = RankLineageInfo()\n            query_ani = None\n            f_unique = 1.0 - self.total_f_classified[rank]\n            if f_unique > 0:\n                f_weighted_at_rank = 1.0 - self.total_f_weighted[rank]\n                bp_intersect_at_rank = (\n                    self.query_info.query_bp - self.total_bp_classified[rank]\n                )\n                sres = SummarizedGatherResult(\n                    lineage=lineage,\n                    rank=rank,\n                    f_weighted_at_rank=f_weighted_at_rank,\n                    fraction=f_unique,\n                    bp_match_at_rank=bp_intersect_at_rank,\n                    query_ani_at_rank=query_ani,\n                )\n                self.summarized_lineage_results[rank].append(sres)\n\n    def build_classification_result(\n        self,\n        rank=None,\n        ani_threshold=None,\n        containment_threshold=0.1,\n        force_resummarize=False,\n        lingroup_ranks=None,\n        lingroups=None,\n    ):\n        if containment_threshold is not None and not 0 <= containment_threshold <= 1:\n            raise ValueError(\n                f\"Containment threshold must be between 0 and 1 (input value: {containment_threshold}).\"\n            )\n        if ani_threshold is not None and not 0 <= ani_threshold <= 1:\n            raise ValueError(\n                f\"ANI threshold must be between 0 and 1 (input value: {ani_threshold}).\"\n            )\n        self._init_classification_results()  # init some fields\n        if not self.summarized_ranks or force_resummarize:\n            self.summarize_up_ranks(\n                single_rank=rank, force_resummarize=force_resummarize\n            )\n        # catch potential error from running summarize_up_ranks separately and passing in different single_rank\n        self.classified_ranks = self.summarized_ranks\n        # if a rank is provided, we need to classify ONLY using that rank\n        if rank:\n            if rank not in self.summarized_ranks:\n                raise ValueError(\n                    f\"Error: rank '{rank}' not in summarized rank(s), {','.join(self.summarized_ranks)}\"\n                )\n            else:\n                self.classified_ranks = [rank]\n        if lingroup_ranks:\n            notify(\"Restricting classification to lingroups.\")\n            self.classified_ranks = [\n                x for x in self.classified_ranks if x in lingroup_ranks\n            ]\n        if not self.classified_ranks:\n            raise ValueError(\"Error: no ranks remain for classification.\")\n        # CLASSIFY using summarization--> best only result. Best way = use ANI or containment threshold\n        classif = None\n        for this_rank in self.classified_ranks:  # ascending order or just single rank\n            # reset for this rank\n            f_weighted = 0.0\n            f_unique_at_rank = 0.0\n            bp_intersect_at_rank = 0\n            sum_uniq_to_query = self.sum_uniq_to_query[this_rank]\n            # sort the results and grab best\n            sorted_sum_uniq_to_query = list(sum_uniq_to_query.items())\n            sorted_sum_uniq_to_query.sort(key=lambda x: -x[1])\n            # select best-at-rank only\n            this_lineage, f_unique_at_rank = sorted_sum_uniq_to_query[0]\n            # if in desired lineage groups, continue (or??)\n            if lingroups and this_lineage not in lingroups:\n                # ignore this lineage and continue up\n                continue\n            bp_intersect_at_rank = self.sum_uniq_bp[this_rank][this_lineage]\n            f_weighted = self.sum_uniq_weighted[this_rank][this_lineage]\n\n            classif = ClassificationResult(\n                rank=this_rank,\n                fraction=f_unique_at_rank,\n                lineage=this_lineage,\n                f_weighted_at_rank=f_weighted,\n                bp_match_at_rank=bp_intersect_at_rank,\n            )\n\n            classif.set_status(\n                self.query_info,\n                containment_threshold=containment_threshold,\n                ani_threshold=ani_threshold,\n            )\n            # determine whether to move on to a higher tax rank (if avail)\n            if (\n                classif.status == \"match\" or classif.status == \"nomatch\"\n            ):  # not sure we want/need the `nomatch` part...\n                break\n\n        # store the final classification result\n        self.classification_result = classif\n        # could do this later, in __main__.py, for example\n        (\n            self.krona_classified,\n            self.krona_unclassified,\n        ) = self.classification_result.build_krona_result(rank=rank)\n        self.krona_header = self.make_krona_header(min_rank=rank)\n\n    def make_krona_header(self, min_rank):\n        \"make header for krona output\"\n        if min_rank is None:\n            return []\n        if min_rank not in self.summarized_ranks:\n            raise ValueError(f\"Rank '{min_rank}' not present in summarized ranks.\")\n        else:\n            rank_index = self.ranks.index(min_rank)\n        return [\"fraction\"] + list(self.ranks[: rank_index + 1])\n\n    def check_classification(self):\n        if not self.classification_result:\n            raise ValueError(\"query not classified yet.\")\n\n    def check_summarization(self):\n        if not self.summarized_lineage_results:\n            raise ValueError(\"lineages not summarized yet.\")\n\n    def make_human_summary(self, display_rank, classification=False):\n        results = []\n        if classification:\n            self.check_classification()\n            display_rank_results = [self.classification_result]\n        else:\n            self.check_summarization()\n            display_rank_results = self.summarized_lineage_results[display_rank]\n            display_rank_results.sort(key=lambda res: -res.f_weighted_at_rank)\n\n        for res in display_rank_results:\n            results.append(res.as_human_friendly_dict(query_info=self.query_info))\n        return results\n\n    def make_full_summary(\n        self,\n        classification=False,\n        limit_float=False,\n        lingroups=None,\n        use_abund=False,\n    ):\n        results = []\n        rD = {}\n        if classification:\n            self.check_classification()\n            header = [\n                \"query_name\",\n                \"status\",\n                \"rank\",\n                \"fraction\",\n                \"lineage\",\n                \"query_md5\",\n                \"query_filename\",\n                \"f_weighted_at_rank\",\n                \"bp_match_at_rank\",\n                \"query_ani_at_rank\",\n            ]\n            rD = self.classification_result.as_summary_dict(\n                query_info=self.query_info, limit_float=limit_float\n            )\n            del rD[\"total_weighted_hashes\"]\n            results.append(rD)\n        else:\n            self.check_summarization()\n            header = [\n                \"query_name\",\n                \"rank\",\n                \"fraction\",\n                \"lineage\",\n                \"query_md5\",\n                \"query_filename\",\n                \"f_weighted_at_rank\",\n                \"bp_match_at_rank\",\n                \"query_ani_at_rank\",\n                \"total_weighted_hashes\",\n            ]\n\n            lingroup_ranks = set()\n            if lingroups is not None:\n                header.append(\"lingroup\")\n                for lin in lingroups.keys():\n                    # e.g. \"14;1;0;0;0;0;0;0;0;0\" => 9\n                    lin_rank = len(lin.split(\";\")) - 1\n                    lingroup_ranks.add(lin_rank)\n\n            for rank in self.summarized_ranks[::-1]:  # descending\n                # if lingroups are provided, only report summary for specified lingroups\n                if lingroup_ranks:\n                    if int(rank) not in lingroup_ranks:\n                        continue\n                unclassified = []\n                rank_results = self.summarized_lineage_results[rank]\n                if use_abund:\n                    rank_results.sort(key=lambda res: -res.f_weighted_at_rank)\n                else:\n                    rank_results.sort(key=lambda res: -res.fraction)\n                for res in rank_results:\n                    rD = res.as_summary_dict(\n                        query_info=self.query_info,\n                        limit_float=limit_float,\n                        lingroups=lingroups,\n                    )\n                    if rD is None:\n                        continue\n                    # save unclassified for the end\n                    if rD[\"lineage\"] == \"unclassified\":\n                        unclassified.append(rD)\n                    else:\n                        results.append(rD)\n                results += unclassified\n        return header, results\n\n    def make_kreport_results(self, *, use_abund=True):\n        \"\"\"\n        Format taxonomy-summarized gather results as kraken-style kreport.\n\n        STANDARD KREPORT FORMAT:\n        - `Percent Reads Contained in Taxon`: The cumulative percentage of reads for this taxon and all descendants.\n        - `Number of Reads Contained in Taxon`: The cumulative number of reads for this taxon and all descendants.\n        - `Number of Reads Assigned to Taxon`: The number of reads assigned directly to this taxon (not a cumulative count of all descendants).\n        - `Rank Code`: (U)nclassified, (R)oot, (D)omain, (K)ingdom, (P)hylum, (C)lass, (O)rder, (F)amily, (G)enus, or (S)pecies.\n        - `NCBI Taxon ID`: Numerical ID from the NCBI taxonomy database.\n        - `Scientific Name`: The scientific name of the taxon.\n\n        Example reads-based `kreport` with all columns:\n        ```\n        88.41\t2138742\t193618\tK\t2\tBacteria\n        0.16\t3852\t818\tP\t201174\t  Actinobacteria\n        0.13\t3034\t0\tC\t1760\t    Actinomycetia\n        0.13\t3034\t45\tO\t85009\t      Propionibacteriales\n        0.12\t2989\t1847\tF\t31957\t        Propionibacteriaceae\n        0.05\t1142\t352\tG\t1912216\t          Cutibacterium\n        0.03\t790\t790\tS\t1747\t            Cutibacterium acnes\n        ```\n\n        SOURMASH KREPORT FORMAT:\n\n        To best represent the sequence dataset, please build sourmash signatures with abundance tracking\n        to enable utilization of sequence abundance information during sourmash gather and taxonomic summarization.\n\n        While this format typically records the percent of number of reads assigned to taxa,\n        we can create comparable output by reporting the percent of base pairs (percent containment)\n        the total number of base pairs matched. Using sourmash default scaled values, these numbers\n        will be estimates from FracMinHash k-mer comparisons. If using sourmash scaled=1\n        (not recommended for most use cases), these results will be based on all k-mers.\n\n        `sourmash gather` assigns k-mers to individual genoems. Since the lowest kreport rank is\n        \"species,\" we use the \"Assigned to Taxon\" column to report assignments summarized to species level.\n\n        - `Percent Contained in Taxon`: Percent of all base pairs contained by this taxon (weighted by abundance if tracked)\n        - `Estimated base pairs Contained in Taxon`: Number of base pairs contained by this taxon (weighted by abundance if tracked)\n        - `Estimated base pairs Assigned to Taxon`: Number of base pairs at species-level (weighted by abundance if tracked)\n        - `Rank Code`: (U)nclassified, (R)oot, (D)omain, (K)ingdom, (P)hylum, (C)lass, (O)rder, (F)amily, (G)enus, or (S)pecies.\n        - `NCBI Taxon ID` will not be reported (blank entries).\n        - `Scientific Name`: The scientific name of the taxon.\n\n        In the future, we may wish to report the NCBI taxid when we can (NCBI taxonomy only).\n        \"\"\"\n        self.check_summarization()\n        header = [\n            \"percent_containment\",\n            \"num_bp_contained\",\n            \"num_bp_assigned\",\n            \"rank_code\",\n            \"ncbi_taxid\",\n            \"sci_name\",\n        ]\n        if self.query_info.total_weighted_hashes == 0:\n            raise ValueError(\n                \"ERROR: cannot produce 'kreport' format from gather results before sourmash v4.5.0\"\n            )\n        required_ranks = set(RANKCODE.keys())\n        acceptable_ranks = list(self.ranks) + [\"unclassified\", \"kingdom\"]\n        if not required_ranks.issubset(set(acceptable_ranks)):\n            raise ValueError(\n                \"ERROR: cannot produce 'kreport' format from ranks {', '.join(self.ranks)}\"\n            )\n        kreport_results = []\n        unclassified_recorded = False\n        # want to order results descending by rank\n        for rank in self.ranks:\n            if (\n                rank == \"strain\"\n            ):  # no code for strain, can't include in this output afaik\n                continue\n            rank_results = self.summarized_lineage_results[rank]\n            for res in rank_results:\n                kresD = res.as_kreport_dict(self.query_info, use_abund=use_abund)\n                if kresD[\"sci_name\"] == \"unclassified\":\n                    # SummarizedGatherResults have an unclassified lineage at every rank, to facilitate reporting at a specific rank.\n                    # Here, we only need to report it once, since it will be the same fraction for all ranks\n                    if unclassified_recorded:\n                        continue\n                    else:\n                        unclassified_recorded = True\n                kreport_results.append(kresD)\n        return header, kreport_results\n\n    def make_lingroup_results(\n        self, LINgroupsD\n    ):  # LingroupsD is dictionary {lg_prefix: lg_name}\n        \"\"\"\n        Report results for the specified LINGroups.\n        Keep LCA paths in order as much as possible.\n        \"\"\"\n        self.check_summarization()\n        header = [\"name\", \"lin\", \"percent_containment\", \"num_bp_contained\"]\n\n        if self.query_info.total_weighted_hashes == 0:\n            raise ValueError(\n                \"ERROR: cannot produce 'lingroup' format from gather results before sourmash v4.5.0\"\n            )\n\n        # find the ranks we need to consider\n        lg_ranks, all_lgs = parse_lingroups(LINgroupsD)\n\n        # grab summarized results matching LINgroup prefixes\n        lg_results = {}\n        for rank in lg_ranks:\n            rank_results = self.summarized_lineage_results[rank]\n            for res in rank_results:\n                if res.lineage in all_lgs:  # is this lineage in the list of LINgroups?\n                    this_lingroup_name = LINgroupsD[\n                        res.lineage.display_lineage(truncate_empty=True)\n                    ]\n                    lg_resD = res.as_lingroup_dict(self.query_info, this_lingroup_name)\n                    lg_results[res.lineage] = lg_resD\n\n        # We want to return in ~ depth order: descending each specific path in order\n        # use LineageTree to find ordered paths\n        lg_tree = LineageTree(all_lgs)\n        ordered_paths = lg_tree.ordered_paths(include_internal=True)\n        # store results in order:\n        lingroup_results = []\n        for lg in ordered_paths:\n            # get LINInfo object\n            lg_LINInfo = LINLineageInfo(lineage=lg)\n            # get result, if we have it\n            lg_res = lg_results.get(lg_LINInfo)\n            if lg_res:\n                lingroup_results.append(lg_res)\n\n        return header, lingroup_results\n\n    def make_cami_bioboxes(self):\n        \"\"\"\n        info: https://github.com/CAMI-challenge/contest_information/blob/master/file_formats/CAMI_TP_specification.mkd\n\n        columns:\n        TAXID - specifies a unique alphanumeric ID for a node in a reference tree such as the NCBI taxonomy\n        RANK -  superkingdom --> strain\n        TAXPATH - the path from the root of the reference taxonomy to the respective taxon\n        TAXPATHSN - scientific names of taxpath\n        PERCENTAGE (0-100) -  field specifies what percentage of the sample was assigned to the respective TAXID\n\n        example:\n\n        #CAMI Submission for Taxonomic Profiling\n        @Version:0.9.1\n        @SampleID:SAMPLEID\n        @Ranks:superkingdom|phylum|class|order|family|genus|species|strain\n\n        @@TAXID\tRANK\tTAXPATH\tTAXPATHSN\tPERCENTAGE\n        2\tsuperkingdom\t2\tBacteria\t98.81211\n        2157\tsuperkingdom\t2157\tArchaea\t1.18789\n        1239\tphylum\t2|1239\tBacteria|Firmicutes\t59.75801\n        1224\tphylum\t2|1224\tBacteria|Proteobacteria\t18.94674\n        28890\tphylum\t2157|28890\tArchaea|Euryarchaeotes\t1.18789\n        91061\tclass\t2|1239|91061\tBacteria|Firmicutes|Bacilli\t59.75801\n        28211\tclass\t2|1224|28211\tBacteria|Proteobacteria|Alphaproteobacteria\t18.94674\n        183925\tclass\t2157|28890|183925\tArchaea|Euryarchaeotes|Methanobacteria\t1.18789\n        1385\torder\t2|1239|91061|1385\tBacteria|Firmicutes|Bacilli|Bacillales\t59.75801\n        356\torder\t2|1224|28211|356\tBacteria|Proteobacteria|Alphaproteobacteria|Rhizobacteria\t10.52311\n        204455\torder\t2|1224|28211|204455\tBacteria|Proteobacteria|Alphaproteobacteria|Rhodobacterales\t8.42263\n        2158\torder\t2157|28890|183925|2158\tArchaea|Euryarchaeotes|Methanobacteria|Methanobacteriales\t1.18789\n        \"\"\"\n        # build CAMI header info\n        header_title = \"# Taxonomic Profiling Output\"\n        version_info = \"@Version:0.10.0\"\n        program = \"@__program__:sourmash\"\n        sample_info = f\"@SampleID:{self.query_info.query_name}\"\n        # taxonomy_id = \"@TaxonomyID:2021-10-01\" # store this with LineageDB, maybe?\n        ranks = list(self.ranks)\n        # if 'strain' in ranks:\n        #     ranks.remove('strain')\n        rank_info = f\"@Ranks:{'|'.join(ranks)}\"\n\n        header_lines = [header_title, sample_info, version_info, rank_info, program]\n        colnames = [\"@@TAXID\", \"RANK\", \"TAXPATH\", \"TAXPATHSN\", \"PERCENTAGE\"]\n        header_lines.append(\"\\t\".join(colnames))\n\n        # now build results in CAMI format\n        bioboxes_results = []\n        # order results by rank (descending), then percentage\n        for rank in ranks:\n            rank_results = self.summarized_lineage_results[rank]\n            for res in rank_results:\n                bb_info = res.as_cami_bioboxes()\n                if bb_info:\n                    bioboxes_results.append(bb_info)\n\n        return header_lines, bioboxes_results\n"
  },
  {
    "path": "src/sourmash/utils.py",
    "content": "import weakref\n\nfrom ._lowlevel import ffi, lib\nfrom .exceptions import exceptions_by_code, SourmashError\n\nattached_refs = weakref.WeakKeyDictionary()\n\n\nclass RustObject:\n    __dealloc_func__ = None\n    _objptr = None\n    _shared = False\n\n    def __init__(self):\n        raise TypeError(f\"Cannot instantiate {self.__class__.__name__!r} objects\")\n\n    @classmethod\n    def _from_objptr(cls, ptr, shared=False):\n        rv = object.__new__(cls)\n        rv._objptr = ptr\n        rv._shared = shared\n        return rv\n\n    def _methodcall(self, func, *args):\n        return rustcall(func, self._get_objptr(), *args)\n\n    def _get_objptr(self):\n        if not self._objptr:\n            raise RuntimeError(\"Object is closed\")\n        return self._objptr\n\n    def __del__(self):\n        if self._objptr is None or self._shared:\n            return\n        f = self.__class__.__dealloc_func__\n        if f is not None:\n            rustcall(f, self._objptr)\n            self._objptr = None\n\n\ndef decode_str(s):\n    \"\"\"Decodes a SourmashStr\"\"\"\n    try:\n        if s.len == 0:\n            return \"\"\n        return ffi.unpack(s.data, s.len).decode(\"utf-8\", \"replace\")\n    finally:\n        if s.owned:\n            lib.sourmash_str_free(ffi.addressof(s))\n\n\ndef encode_str(s):\n    \"\"\"Encodes a SourmashStr\"\"\"\n    rv = ffi.new(\"SourmashStr *\")\n    if isinstance(s, str):\n        s = s.encode(\"utf-8\")\n    rv.data = ffi.from_buffer(s)\n    rv.len = len(s)\n    # we have to hold a weak reference here to ensure our string does not\n    # get collected before the string is used.\n    attached_refs[rv] = s\n    return rv\n\n\ndef rustcall(func, *args):\n    \"\"\"Calls rust method and does some error handling.\"\"\"\n    lib.sourmash_err_clear()\n    rv = func(*args)\n    err = lib.sourmash_err_get_last_code()\n    if not err:\n        return rv\n    msg = lib.sourmash_err_get_last_message()\n    cls = exceptions_by_code.get(err, SourmashError)\n    exc = cls(decode_str(msg))\n    backtrace = decode_str(lib.sourmash_err_get_backtrace())\n    if backtrace:\n        exc.rust_info = backtrace\n    raise exc\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "import os\nimport sys\n\nfrom hypothesis import settings, Verbosity\nimport pytest\n\nimport matplotlib.pyplot as plt\n\nplt.rcParams.update({\"figure.max_open_warning\": 0})\n\nfrom sourmash_tst_utils import TempDirectory, RunnerContext\n\nsys.stdout = sys.stderr\n\n\n# behavior is default behavior, present in both sourmash v4 and sourmash v5.\n@pytest.fixture(params=[\"v4\", \"v5\", \"(default)\"])\ndef cli_v4_and_v5(request):\n    return request.param\n\n\n# behavior is default behavior in v4, and maybe will be invoked by --v4 in v5.\n@pytest.fixture(params=[\"v4\", \"(default)\"])\ndef cli_v4_only(request):\n    return request.param\n\n\n# behavior is available with --v5 and will be default in sourmash v5.\n@pytest.fixture(params=[\"v5\"])\ndef cli_v5_only(request):\n    return request.param\n\n\n@pytest.fixture\ndef runtmp():\n    with TempDirectory() as location:\n        yield RunnerContext(location)\n\n\n@pytest.fixture(scope=\"session\")\ndef runtmp_session():\n    with TempDirectory() as location:\n        yield RunnerContext(location)\n\n\n@pytest.fixture\ndef run():\n    yield RunnerContext(os.getcwd())\n\n\n@pytest.fixture(params=[True, False])\ndef track_abundance(request):\n    return request.param\n\n\n@pytest.fixture(params=[True, False])\ndef dayhoff(request):\n    return request.param\n\n\n@pytest.fixture(params=[True, False])\ndef hp(request):\n    return request.param\n\n\n@pytest.fixture(params=[True, False])\ndef keep_identifiers(request):\n    return request.param\n\n\n@pytest.fixture(params=[True, False])\ndef keep_versions(request):\n    return request.param\n\n\n@pytest.fixture(params=[2, 5, 10])\ndef n_children(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"--linear\", \"--no-linear\"])\ndef linear_gather(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"--prefetch\", \"--no-prefetch\"])\ndef prefetch_gather(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"SBT\", \"rocksdb\", \"zip\"])\ndef disk_index_type(request):\n    return request.param\n\n\n@pytest.fixture(params=[True, False])\ndef use_manifest(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"json\", \"sql\"])\ndef lca_db_format(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"csv\", \"sql\"])\ndef manifest_db_format(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"sig\", \"sig.gz\", \"zip\", \".d/\", \".sqldb\"])\ndef sig_save_extension(request):\n    return request.param\n\n\n@pytest.fixture(params=[\"sig\", \"sig.gz\", \"zip\", \".d/\"])\ndef sig_save_extension_abund(request):\n    return request.param\n\n\n# these should both always succeed for 'sig check' and 'sig collect' output\n# manifests.\n@pytest.fixture(params=[\"--abspath\", \"--relpath\"])\ndef abspath_or_relpath(request):\n    return request.param\n\n\n# this will fail if subdirs used; see #3008. but this ensures v4 behavior of\n# sig collect/sig check works, where manifest paths are interpreted relative\n# to cwd.\n@pytest.fixture(params=[\"--no-abspath\", \"--abspath\", \"--relpath\"])\ndef abspath_relpath_v4(request):\n    return request.param\n\n\n# --- BEGIN - Only run tests using a particular fixture --- #\n# Cribbed from: http://pythontesting.net/framework/pytest/pytest-run-tests-using-particular-fixture/\ndef pytest_collection_modifyitems(items, config):\n    fixture_name = config.option.usesfixture\n    if fixture_name is not None:\n        selected_items = []\n        deselected_items = []\n\n        for item in items:\n            if fixture_name in getattr(item, \"fixturenames\", ()):\n                selected_items.append(item)\n            else:\n                deselected_items.append(item)\n        config.hook.pytest_deselected(items=deselected_items)\n        items[:] = selected_items\n\n\n# --- END - Only run tests using a particular fixture --- #\n\n\ndef pytest_addoption(parser):\n    parser.addoption(\n        \"--usesfixture\",\n        action=\"store\",\n        default=None,\n        help=\"just run tests that use a particular fixture\",\n    )\n\n    parser.addoption(\n        \"--run-hypothesis\", action=\"store_true\", help=\"run hypothesis tests\"\n    )\n\n\ndef pytest_runtest_setup(item):\n    if item.config.getoption(\"--run-hypothesis\"):\n        if not any(mark for mark in item.iter_markers(name=\"hypothesis\")):\n            pytest.skip(\"--run-hypothesis option set, running only hypothesis tests\")\n\n\nsettings.register_profile(\"ci\", max_examples=1000)\nsettings.register_profile(\"dev\", max_examples=10)\nsettings.register_profile(\"debug\", max_examples=10, verbosity=Verbosity.verbose)\nsettings.load_profile(os.getenv(\"HYPOTHESIS_PROFILE\", \"default\"))\n"
  },
  {
    "path": "tests/sourmash_tst_utils.py",
    "content": "\"Various utilities used by sourmash tests.\"\n\nimport sys\nimport os\nimport tempfile\nimport shutil\nimport subprocess\nimport collections\nimport pprint\nimport traceback\nfrom io import StringIO\nfrom pathlib import Path\n\nfrom importlib import resources\nfrom importlib.metadata import entry_points\n\n\nSIG_FILES = [\n    os.path.join(\"demo\", f)\n    for f in (\n        \"SRR2060939_1.sig\",\n        \"SRR2060939_2.sig\",\n        \"SRR2241509_1.sig\",\n        \"SRR2255622_1.sig\",\n        \"SRR453566_1.sig\",\n        \"SRR453569_1.sig\",\n        \"SRR453570_1.sig\",\n    )\n]\n\n\ndef scriptpath(scriptname=\"sourmash\"):\n    \"\"\"Return the path to the scripts, in both dev and install situations.\"\"\"\n    # note - it doesn't matter what the scriptname is here, as long as\n    # it's some script present in this version of sourmash.\n\n    path = os.path.join(os.path.dirname(__file__), \"../\")\n    if os.path.exists(os.path.join(path, scriptname)):\n        return path\n\n    path = os.path.join(os.path.dirname(__file__), \"../../EGG-INFO/\")\n    if os.path.exists(os.path.join(path, scriptname)):\n        return path\n\n    for path in os.environ[\"PATH\"].split(\":\"):\n        if os.path.exists(os.path.join(path, scriptname)):\n            return path\n\n\ndef _runscript(scriptname):\n    \"\"\"Find & run a script with exec (i.e. not via os.system or subprocess).\"\"\"\n    namespace = {\"__name__\": \"__main__\"}\n    namespace[\"sys\"] = globals()[\"sys\"]\n\n    try:\n        (script,) = entry_points(name=scriptname, group=\"console_scripts\")\n        script.load()()\n        return 0\n    except ValueError:\n        pass\n\n    path = scriptpath()\n\n    scriptfile = os.path.join(path, scriptname)\n    if os.path.isfile(scriptfile):\n        if os.path.isfile(scriptfile):\n            exec(  # pylint: disable=exec-used\n                compile(Path(scriptfile).read_text(), scriptfile, \"exec\"), namespace\n            )\n            return 0\n\n    return -1\n\n\nScriptResults = collections.namedtuple(\"ScriptResults\", [\"status\", \"out\", \"err\"])\n\n\ndef runscript(scriptname, args, **kwargs):\n    \"\"\"Run a Python script using exec().\n\n    Run the given Python script, with the given args, in the given directory,\n    using 'exec'.  Mimic proper shell functionality with argv, and capture\n    stdout and stderr.\n\n    When using :attr:`fail_ok`=False in tests, specify the expected error.\n    \"\"\"\n    __tracebackhide__ = True\n    sysargs = [scriptname]\n    sysargs.extend(args)\n\n    cwd = os.getcwd()\n    in_directory = kwargs.get(\"in_directory\", cwd)\n    fail_ok = kwargs.get(\"fail_ok\", False)\n\n    try:\n        status = -1\n        oldargs = sys.argv\n        sys.argv = sysargs\n\n        oldin = None\n        if \"stdin_data\" in kwargs:\n            oldin, sys.stdin = sys.stdin, StringIO(kwargs[\"stdin_data\"])\n\n        oldout, olderr = sys.stdout, sys.stderr\n        sys.stdout = StringIO()\n        sys.stdout.name = \"StringIO\"\n        sys.stderr = StringIO()\n\n        os.chdir(in_directory)\n\n        try:\n            print(\"running:\", scriptname, \"in:\", in_directory, file=oldout)\n            print(\"arguments\", sysargs, file=oldout)\n\n            status = _runscript(scriptname)\n        except SystemExit as err:\n            status = err.code\n            if status is None:\n                status = 0\n        except:  # pylint: disable=bare-except\n            traceback.print_exc(file=sys.stderr)\n            status = -1\n    finally:\n        sys.argv = oldargs\n        out, err = sys.stdout.getvalue(), sys.stderr.getvalue()\n        sys.stdout, sys.stderr = oldout, olderr\n\n        if oldin:\n            sys.stdin = oldin\n\n        os.chdir(cwd)\n\n    if status != 0 and not fail_ok:\n        print(out)\n        print(err)\n        assert False, (status, out, err)\n\n    return ScriptResults(status, out, err)\n\n\ndef get_test_data(filename):\n    filepath = resources.files(\"sourmash\") / \"tests\" / \"test-data\" / filename\n    if not filepath.exists() or not os.path.isfile(filepath):\n        filepath = os.path.join(os.path.dirname(__file__), \"test-data\", filename)\n    return filepath\n\n\nclass TempDirectory:\n    def __init__(self):\n        self.tempdir = tempfile.mkdtemp(prefix=\"sourmashtest_\")\n\n    def __enter__(self):\n        return self.tempdir\n\n    def __exit__(self, exc_type, exc_value, traceback):\n        try:\n            shutil.rmtree(self.tempdir, ignore_errors=True)\n        except OSError:\n            pass\n\n        if exc_type:\n            return False\n\n\nclass SourmashCommandFailed(Exception):\n    def __init__(self, msg):\n        Exception.__init__(self, msg)\n        self.message = msg\n\n\nclass RunnerContext:\n    \"\"\"\n    I am a RunnerContext object from sourmash_tst_utils.\n\n    I have methods 'run_sourmash' and 'run', which run Python scripts.\n\n    Take a look at my 'location', 'last_command' and 'last_result' attributes!\n\n    You can use the 'output' method to build filenames in my temp directory.\n    \"\"\"\n\n    def __init__(self, location):\n        self.location = location\n        self.last_command = None\n        self.last_result = None\n\n    def run_sourmash(self, *args, **kwargs):\n        \"Run the sourmash script with the given arguments.\"\n        kwargs[\"fail_ok\"] = True\n        if \"in_directory\" not in kwargs:\n            kwargs[\"in_directory\"] = self.location\n\n        version_arg = None\n        if \"version\" in kwargs:\n            ver = kwargs[\"version\"]\n            assert ver in (\"v4\", \"v5\", \"(default)\"), ver\n            if ver == \"v4\":\n                version_arg = \"--v4\"\n            elif ver == \"v5\":\n                version_arg = \"--v5\"\n            elif ver == \"(default)\":\n                pass\n\n        cmdlist = [\"sourmash\"]\n        cmdlist.extend(str(x) for x in args)\n        if version_arg is not None:\n            print(f\"setting CLI version arg to: {version_arg}\")\n            cmdlist.append(version_arg)\n\n        self.last_command = \" \".join(cmdlist)\n        self.last_result = runscript(\"sourmash\", cmdlist[1:], **kwargs)\n\n        if self.last_result.status:\n            raise SourmashCommandFailed(self.last_result.err)\n\n        return self.last_result\n\n    sourmash = run_sourmash\n\n    def run(self, scriptname, *args, **kwargs):\n        \"Run a script with the given arguments.\"\n        if \"in_directory\" not in kwargs:\n            kwargs[\"in_directory\"] = self.location\n        self.last_command = \" \".join(args)\n        self.last_result = runscript(scriptname, args, **kwargs)\n        return self.last_result\n\n    def output(self, path):\n        return os.path.join(self.location, path)\n\n    def __str__(self):\n        s = \"\"\n        if self.last_command:\n            s += f\"Last command run:\\n{repr(self.last_command)}\\n\"\n            if self.last_result:\n                s += \"\\nLAST RESULT:\\n\"\n                s += f\"- exit code: {self.last_result.status}\\n\\n\"\n                if self.last_result.out:\n                    s += f\"- stdout:\\n---\\n{self.last_result.out}---\\n\"\n                else:\n                    s += \"(no stdout)\\n\\n\"\n                if self.last_result.err:\n                    s += f\"- stderr:\\n---\\n{self.last_result.err}---\\n\"\n                else:\n                    s += \"(no stderr)\\n\"\n\n        return s\n\n\ndef in_tempdir(fn):\n    def wrapper(*args, **kwargs):\n        with TempDirectory() as location:\n            ctxt = RunnerContext(location)\n            newargs = [ctxt] + list(args)\n            return fn(*newargs, **kwargs)\n\n    return wrapper\n\n\ndef in_thisdir(fn):\n    def wrapper(*args, **kwargs):\n        ctxt = RunnerContext(os.getcwd())\n        newargs = [ctxt] + list(args)\n        return fn(*newargs, **kwargs)\n\n    return wrapper\n"
  },
  {
    "path": "tests/test-data/.sbt.leaves/0107d767a345eff67ecdaed2ee5cd7ba",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453566_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"0107d767a345eff67ecdaed2ee5cd7ba\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    5641354835174,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14062071191653,\n                    14580861632266,\n                    18722876140337,\n                    20714320729467,\n                    22732389403804,\n                    24134363957219,\n                    30606147678309,\n                    30841792132441,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    35413666412010,\n                    37166860055638,\n                    38008340488610,\n                    38631948370393,\n                    38946626358857,\n                    39177463395973,\n                    39396232170068,\n                    40000457533067,\n                    41548684950793,\n                    42975853122398,\n                    43119393989323,\n                    43377695911881,\n                    49367718187361,\n                    49468277378328,\n                    50266038601832,\n                    51636068122286,\n                    56622962479482,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62130354354877,\n                    62702978264830,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    67872638217057,\n                    68827108109263,\n                    69134145403133,\n                    70436552236751,\n                    70880519905358,\n                    78004711377952,\n                    81502993782978,\n                    84636365982041,\n                    85239629151685,\n                    94266407193778,\n                    98142256300701,\n                    98837920540443,\n                    99930975216128,\n                    100653760748845,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    103652023867250,\n                    104130252812879,\n                    112760650992638,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120285237540732,\n                    121866736124647,\n                    122140892054804,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    128261346941417,\n                    130618284885748,\n                    131310062444107,\n                    133580282506938,\n                    139762252968300,\n                    148434659896290,\n                    150472163116319,\n                    151610888790844,\n                    151736593364935,\n                    152145317861349,\n                    154119208822262,\n                    154803963303860,\n                    164146490870545,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173503876669758,\n                    173949973069402,\n                    175345218226732,\n                    175559849681044,\n                    177057739236298,\n                    182134979074863,\n                    185526639726849,\n                    186188120396587,\n                    191078441509481,\n                    191784713609488,\n                    196150349451960,\n                    196584209022550,\n                    196853921592387,\n                    197752504251580,\n                    198597053692927,\n                    200567230796156,\n                    201179164742411,\n                    202960515626517,\n                    203378213499023,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    218586803538885,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    223103766020907,\n                    223436957406949,\n                    225216425962890,\n                    225962923363564,\n                    227026140769845,\n                    227790244540446,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    235385609463388,\n                    235438505061770,\n                    238869764444344,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244786468497109,\n                    247140303430449,\n                    248336783901894,\n                    250357693564448,\n                    253975323975963,\n                    256375919657769,\n                    259301238714261,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    267345873524094,\n                    271342665825792,\n                    274876788032658,\n                    275360996806051,\n                    275711441656065,\n                    276221877341287,\n                    277115529175674,\n                    277862338800417,\n                    280967669495427,\n                    281817613252845,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    289038917997203,\n                    289724862541255,\n                    290309864993733,\n                    294086384353867,\n                    295503963521838,\n                    296966685834878,\n                    299005107402724,\n                    300199234365396,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    305781540735975,\n                    308107503975413,\n                    308473366560206,\n                    311148974624393,\n                    311393227334671,\n                    312856558437716,\n                    314634385460120,\n                    315140251773348,\n                    316147818305256,\n                    317314266550052,\n                    318043998368340,\n                    319121931997971,\n                    324333149672473,\n                    324779561826125,\n                    326855577904572,\n                    327646715321140,\n                    332098363218169,\n                    333944737799563,\n                    334160175766170,\n                    335584394916553,\n                    335971123608722,\n                    336472954791992,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    347580313704916,\n                    348815216366639,\n                    348987115477673,\n                    350399163507829,\n                    357535517122796,\n                    358595265377108,\n                    358821394913517,\n                    359452645935849,\n                    362124977362793,\n                    366354200059782,\n                    366535672236781,\n                    369474755519844,\n                    370249620342175,\n                    372037414685096,\n                    373949557068914,\n                    374319819178480,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    379102542404949,\n                    379241504134406,\n                    379468459802010,\n                    379661395441316,\n                    382035531157070,\n                    383008100523152,\n                    383135333541903,\n                    383850900061929,\n                    384049466048679,\n                    386263487549463,\n                    389141313731258,\n                    390332660259608,\n                    393516543506060,\n                    400967959890432,\n                    401487977714282,\n                    403579902131163,\n                    406955472999822,\n                    408962716867059,\n                    409903018669983,\n                    410861197839878,\n                    414355853800959,\n                    416580890530128,\n                    418934773149726,\n                    419642123579295,\n                    421963163293847,\n                    423404494960378,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    429952924284227,\n                    430664272577516,\n                    432630098291297,\n                    434623968464695,\n                    435267549331128,\n                    435277763415865,\n                    435874505125675,\n                    437654980371254,\n                    438061138128325,\n                    438738288109196,\n                    439177016005977,\n                    445344075816835,\n                    445802335759252,\n                    446710003143163,\n                    447467518423055,\n                    449641727299803,\n                    450058424424520,\n                    450112320572118,\n                    450125274173050,\n                    452241247094714,\n                    452829154656306,\n                    454813132622585,\n                    456174765596578,\n                    456493632715805,\n                    456717723773303,\n                    461156956524045,\n                    462211497323948,\n                    463604028403361,\n                    465228093393002,\n                    466250095735125,\n                    469687793491358,\n                    471922058927200,\n                    472039595540269,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473018780652067,\n                    473772140307174,\n                    474570287539184,\n                    474912397870603,\n                    476325119891604,\n                    476526896773980,\n                    476855560317170,\n                    480232815782455,\n                    484291524803718,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    494276065129917,\n                    495846359323641,\n                    506531113930798,\n                    507871334392190,\n                    508031302306958,\n                    508934816424512,\n                    509939413858428,\n                    510737910464301,\n                    512514768813167,\n                    513350289212553,\n                    517460246914282,\n                    523321188654478,\n                    524296526109332,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    532977797373940,\n                    533221992957154,\n                    533383900955463,\n                    537527309474265,\n                    538136383284668,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    543935720187395,\n                    545273268128445,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    555828795847874,\n                    557285930201258,\n                    558008777268240,\n                    558433475619762,\n                    558892016080993,\n                    559199414492426,\n                    560748186311107,\n                    561604684739024,\n                    562789967643507,\n                    563343385252253,\n                    563775395645616,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572526115602502,\n                    573767900523468,\n                    573851852316852,\n                    576624529060777,\n                    576874504697497,\n                    578856083248351,\n                    579395263040626,\n                    579656586099131,\n                    584217116139474,\n                    587458649504773,\n                    591009756408904,\n                    592792708776319,\n                    592997432856726,\n                    594482884410814,\n                    596004492939074,\n                    596726606390901,\n                    597875929908982,\n                    600179982751750,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605545396594434,\n                    606419362199228,\n                    607833403537880,\n                    609555580824872,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620059729516362,\n                    620849299055244,\n                    621083126852990,\n                    622843084945666,\n                    623088556560813,\n                    627738708322473,\n                    628002002108775,\n                    628967244202734,\n                    630034340392901,\n                    632757066611488,\n                    634340585739407,\n                    634691502028135,\n                    635939425862264,\n                    637603178700210,\n                    637880811482435,\n                    644557275230225,\n                    644935615624623,\n                    645793929303122,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    649351154360370,\n                    653652775436966,\n                    655230244020599,\n                    668170744538822,\n                    670595660720839,\n                    671785773373187,\n                    672641554971634,\n                    672821857332020,\n                    673587502056476,\n                    676044446355190,\n                    677295740685782,\n                    679716691783353,\n                    682874745971459,\n                    682963108550465,\n                    683897063771844,\n                    685246440558482,\n                    686035384279530,\n                    687129162879229,\n                    687440351836027,\n                    688990372747831,\n                    690608944213791,\n                    691680901171966,\n                    694851976547107,\n                    694869046270466,\n                    700054088308311,\n                    701010566680671,\n                    701156706346414,\n                    702431887238370,\n                    702728791577749,\n                    703127461004015,\n                    703460523248065,\n                    705302678110381,\n                    707793984897058,\n                    707799855432305,\n                    707962189637436,\n                    707993631271976,\n                    708854130532070,\n                    710403353214581,\n                    710927468728191,\n                    711091480855740,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    724746920000049,\n                    727030394121071,\n                    727262050490847,\n                    728279662753580,\n                    730854175545196,\n                    731361512976697,\n                    734622692371860,\n                    736290151677476,\n                    737921635760471,\n                    738115824615020,\n                    739389456325310,\n                    742704052187442,\n                    746469097917429,\n                    748064810280445,\n                    749144352424687,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758543555642030,\n                    759083903793759,\n                    761260029175908,\n                    767230586289375,\n                    770167973924874,\n                    770328708409334,\n                    772165475523258,\n                    772947318346532,\n                    774312511311396,\n                    774365323868051,\n                    774964429534347,\n                    775558532281404,\n                    779330069525835,\n                    781344931111517,\n                    787747218685488,\n                    788027556261557,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    797511060014001,\n                    797622366845781,\n                    799257433888961,\n                    800060479182618,\n                    801084876663808,\n                    802340523858506,\n                    803596407436267\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/4e94e60265e04f0763142e20b52c0da1",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_2.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"4e94e60265e04f0763142e20b52c0da1\",\n                \"mins\": [\n                    250486723534,\n                    2508456406617,\n                    3114055682630,\n                    4326583440446,\n                    5166206090659,\n                    5651658843765,\n                    5888422665728,\n                    6103415363614,\n                    6235526594701,\n                    6326519491884,\n                    6878955625210,\n                    7215992153582,\n                    7263583777537,\n                    8395644761685,\n                    9072289775829,\n                    9599933508359,\n                    9851745764538,\n                    9914450265081,\n                    10636634611478,\n                    11078169853920,\n                    11850890474214,\n                    12268586466425,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15424135029274,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17427197239629,\n                    20208369434823,\n                    22648822913198,\n                    23651462508176,\n                    23928516462553,\n                    24474488157758,\n                    25171338917197,\n                    25595537972192,\n                    25977883823029,\n                    26336101344262,\n                    28005085380016,\n                    29426613300325,\n                    30912597140678,\n                    31804114294503,\n                    33283788494941,\n                    34832941612548,\n                    35206157695212,\n                    36608959952536,\n                    36699864848579,\n                    36965258409960,\n                    37923647270157,\n                    38668597630050,\n                    40072538274701,\n                    41051959531050,\n                    41163986984660,\n                    42806708117796,\n                    45549512378900,\n                    46330912571584,\n                    47932899674281,\n                    48305356021361,\n                    48422112851291,\n                    48827478905522,\n                    48988117530884,\n                    49720533077083,\n                    50336770017521,\n                    53853474657507,\n                    54546098460847,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56306387723041,\n                    56789903701800,\n                    60051688191594,\n                    62790957647340,\n                    63034352531495,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64303638595001,\n                    65401240928904,\n                    65659023305314,\n                    65794631590725,\n                    65924385841826,\n                    66254172924766,\n                    67162847056402,\n                    67207262461072,\n                    68027479033630,\n                    69023206404673,\n                    70845832854736,\n                    71648552124359,\n                    72267500733483,\n                    73600562400430,\n                    73600726148081,\n                    73938092731264,\n                    74463348702348,\n                    74757289081889,\n                    76461141982463,\n                    76601650706225,\n                    79332000470232,\n                    80480643670004,\n                    85069188519897,\n                    85513145337736,\n                    86370708776973,\n                    88205744296842,\n                    89385885763749,\n                    90136762486499,\n                    91578872290342,\n                    91791067858367,\n                    91873432718081,\n                    91947365014884,\n                    94086187561813,\n                    94879727048600,\n                    95613743229855,\n                    98324799297724,\n                    98406995764882,\n                    99368955966421,\n                    100718427599813,\n                    102632033433196,\n                    102644142538181,\n                    102882967284023,\n                    104095665010556,\n                    107278977448655,\n                    110162881433718,\n                    112325880172670,\n                    114727586194884,\n                    115711999096223,\n                    115890459170026,\n                    115990086684946,\n                    117509882155020,\n                    118006247672122,\n                    119438611160104,\n                    119862823995471,\n                    120859413131497,\n                    120869469396540,\n                    120965026768103,\n                    120980078369659,\n                    122789260675111,\n                    123464311633543,\n                    124631092323259,\n                    124750192071655,\n                    124948347574890,\n                    125648214305342,\n                    126324422909661,\n                    126386912242740,\n                    126943192152369,\n                    127838593437661,\n                    129104997236940,\n                    129661998661164,\n                    129921574005351,\n                    130381409629549,\n                    131426956400912,\n                    131670610194393,\n                    132320703016655,\n                    133074201429869,\n                    136270510397946,\n                    137011854576215,\n                    137250954972319,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    142846188486668,\n                    143166346620229,\n                    143570389373736,\n                    144015570248215,\n                    146405999815556,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150653874201709,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    153964058113210,\n                    155005702504057,\n                    156275207016386,\n                    156516659025181,\n                    156678666334181,\n                    157146773076591,\n                    158914038640710,\n                    159350162876827,\n                    159359554299317,\n                    159472244264757,\n                    159869778233041,\n                    160225475241462,\n                    161489918754278,\n                    161548850449553,\n                    162966656941363,\n                    163709351584749,\n                    165572906446902,\n                    166605601159467,\n                    167304010117193,\n                    167578307012466,\n                    168412944661902,\n                    169891545961677,\n                    171948018815208,\n                    172888919441360,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    175029718718788,\n                    177264301473978,\n                    177974381583110,\n                    178176094018343,\n                    179921783290284,\n                    180656320447823,\n                    181063160240061,\n                    181257548112038,\n                    181803993639937,\n                    183018746533881,\n                    183449325300818,\n                    184271038362020,\n                    184594169885550,\n                    184752983925284,\n                    185471680685606,\n                    187928842797492,\n                    189442327350789,\n                    189748192026650,\n                    191344453396371,\n                    191379677170076,\n                    192587291169373,\n                    193005890924998,\n                    194065250832376,\n                    194363033520822,\n                    195441337298296,\n                    195793810311093,\n                    197916541706101,\n                    199129991434152,\n                    199438795256574,\n                    199510432035291,\n                    200372412253250,\n                    200404566576199,\n                    200763792087641,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    205495097863124,\n                    206915135800075,\n                    207091233110623,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209010486710646,\n                    209240354662781,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    214695938897851,\n                    214903197314923,\n                    215248629858867,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    218536028897273,\n                    219204102261164,\n                    219891441411753,\n                    219974613748434,\n                    220343480974288,\n                    221554546582125,\n                    221729288627371,\n                    223834426416688,\n                    223984693568096,\n                    225075006031359,\n                    225198908542897,\n                    225259785351827,\n                    225688512560038,\n                    225796963089274,\n                    226620699633185,\n                    228659301550674,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231765455198863,\n                    232016464825731,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234486644060094,\n                    235151438889624,\n                    235231753660795,\n                    237490431789443,\n                    238102472767969,\n                    238536247300230,\n                    238574581938385,\n                    239320860931883,\n                    240958548895043,\n                    242434218139153,\n                    242442058293823,\n                    242559604450370,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247103593644053,\n                    247223650843273,\n                    247271784936594,\n                    248730448052989,\n                    249136603804393,\n                    255250274209015,\n                    256188918759811,\n                    256264089513587,\n                    257140177602265,\n                    258090152932519,\n                    259079953498264,\n                    260567430361426,\n                    261430613863924,\n                    261804172017043,\n                    262102779540056,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263593108768410,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264847443724344,\n                    266537010768292,\n                    269449522688748,\n                    269788172566464,\n                    271375997486305,\n                    273963009929669,\n                    274201125891842,\n                    274383394688737,\n                    275456716615408,\n                    276087711843386,\n                    276171708863992,\n                    276395310963137,\n                    277124038643903,\n                    277967939584293,\n                    278359501970729,\n                    281419217453687,\n                    282627103058306,\n                    283418694026492,\n                    283650389519323,\n                    283716381550104,\n                    285115327004357,\n                    288471586195099,\n                    288630780557211,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    291172509721213,\n                    291901191461589,\n                    293349295644131,\n                    293364784068746,\n                    293460842461919,\n                    293761737980270,\n                    294048628266791,\n                    294309017220579,\n                    297566393252293,\n                    298164502295539,\n                    299495863829841,\n                    299686419400666,\n                    300842773788181,\n                    301280787524288,\n                    304357039915265,\n                    305883937093471,\n                    307125249787970,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    308924696686164,\n                    309853660376897,\n                    310260543915478,\n                    311783912113073,\n                    312655519254570,\n                    313635798098525,\n                    315730568901909,\n                    315766966261328,\n                    316937125480217,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    321890891143490,\n                    322521825476248,\n                    323047827128093,\n                    324351935671697,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    326399280158975,\n                    328158084014937,\n                    330274652031045,\n                    331145279644469,\n                    331872454071816,\n                    335724314867453,\n                    335817092568549,\n                    338300563625880,\n                    338844220006106,\n                    340863683252199,\n                    341662236661817,\n                    341811810483352,\n                    342688543846132,\n                    343279150148526,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    347266825568201,\n                    347767039186779,\n                    348817429227528,\n                    348833845559066,\n                    349622757145996,\n                    350987533382827,\n                    351058626361688,\n                    351589420054826,\n                    354103463961601,\n                    354387066710883,\n                    355561819235138,\n                    355789912870705,\n                    356695205540256,\n                    359175499709959,\n                    359439738386632,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    364345413204186,\n                    365126424210828,\n                    365413280249712,\n                    365934903234669,\n                    366193857397914,\n                    366211725375178,\n                    366388425061942,\n                    369001359438455,\n                    372036972894155,\n                    372119412691335,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    377253494422430,\n                    378570200652257,\n                    378812352248018,\n                    378988928968399,\n                    379202966330246,\n                    379383874861118,\n                    379655211188325,\n                    380132704649033,\n                    381418800043351,\n                    383272102454619,\n                    385418400433017,\n                    385959959345831,\n                    386426924783330,\n                    387084858219758,\n                    387891260768716,\n                    389648404681890,\n                    391093344163451,\n                    391412493497363,\n                    391837889962924,\n                    392637215710013,\n                    393407397414020,\n                    393666094843064,\n                    394549480944907,\n                    394992647600588,\n                    396097144709247,\n                    398018189439516,\n                    398451260178161,\n                    399359713815504,\n                    401258033920475,\n                    401548443050700,\n                    401678403062417,\n                    402467057162382,\n                    403472959967900,\n                    403550823036072,\n                    404003416788822,\n                    404032561117566,\n                    404071682289595,\n                    404160108032790,\n                    404962546496863,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    407839904624528,\n                    408693003864864,\n                    409460547709689,\n                    409964247236589,\n                    410070177508463,\n                    411917287296495,\n                    412738866512772,\n                    412842793028086,\n                    413767389226181,\n                    414678207656526,\n                    416308367178118,\n                    416821154641916,\n                    417458112822963,\n                    417538262642243,\n                    417879179345800\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/60f7e23c24a8d94791cc7a8680c493f9",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"60f7e23c24a8d94791cc7a8680c493f9\",\n                \"mins\": [\n                    250486723534,\n                    1276320723000,\n                    2508456406617,\n                    4346223556404,\n                    5651658843765,\n                    5741639512374,\n                    6103415363614,\n                    6382184420000,\n                    7215992153582,\n                    7263583777537,\n                    8230363088713,\n                    8344183384681,\n                    8395644761685,\n                    9599933508359,\n                    9851745764538,\n                    9908321119520,\n                    12179585228825,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17520725293289,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    22648822913198,\n                    22764046638638,\n                    23651462508176,\n                    24455303556700,\n                    25171338917197,\n                    25977883823029,\n                    26336101344262,\n                    26775359856414,\n                    29426613300325,\n                    29429643624977,\n                    29716486194840,\n                    30912597140678,\n                    33283788494941,\n                    34633591199949,\n                    35265151771864,\n                    36608959952536,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37321172331310,\n                    38189684658557,\n                    41051959531050,\n                    41634658763025,\n                    42806708117796,\n                    42941620852116,\n                    43102684986874,\n                    43257012736171,\n                    44469103278173,\n                    45435629568409,\n                    45555150962803,\n                    45778211392090,\n                    46428667877491,\n                    47743166786889,\n                    48827478905522,\n                    48988117530884,\n                    49652906159408,\n                    49720533077083,\n                    51190225926040,\n                    51489867698846,\n                    51681162571203,\n                    53853474657507,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56495629119710,\n                    56789903701800,\n                    58448059219764,\n                    60051688191594,\n                    61585240896556,\n                    63136274461401,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64098752156766,\n                    64303638595001,\n                    65337560481765,\n                    65794631590725,\n                    65851646271217,\n                    67162847056402,\n                    69927546604113,\n                    71441250280595,\n                    71648552124359,\n                    73938092731264,\n                    74074344499959,\n                    74463348702348,\n                    74757289081889,\n                    75026691722950,\n                    76601650706225,\n                    77594090223745,\n                    80429502208150,\n                    81546812908959,\n                    82700429817161,\n                    83318109425074,\n                    85069188519897,\n                    85513145337736,\n                    85753551939023,\n                    86112424291327,\n                    89385885763749,\n                    89781876394634,\n                    91873432718081,\n                    91947365014884,\n                    93462948799513,\n                    94879727048600,\n                    95613743229855,\n                    97571747840697,\n                    98324799297724,\n                    98775547882506,\n                    100718427599813,\n                    102578745288578,\n                    102873080592435,\n                    104095665010556,\n                    104528709310472,\n                    105986132286860,\n                    106984945037295,\n                    107278977448655,\n                    109551654663245,\n                    109566666231438,\n                    110191507921350,\n                    110549642873812,\n                    112654122078687,\n                    113222445295988,\n                    113854916802784,\n                    116127169502189,\n                    118006247672122,\n                    118237881107424,\n                    118484253796245,\n                    118762763614010,\n                    119358605785829,\n                    119553131858167,\n                    120859413131497,\n                    120965026768103,\n                    120980078369659,\n                    123464311633543,\n                    124449616140151,\n                    124750192071655,\n                    125424514480710,\n                    125614494300765,\n                    125698882792384,\n                    126860824288401,\n                    126943192152369,\n                    129104997236940,\n                    131426956400912,\n                    132369532359260,\n                    133074201429869,\n                    137011854576215,\n                    137250954972319,\n                    137658530991775,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    141543030608061,\n                    142846188486668,\n                    143570389373736,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150561506312724,\n                    150889573263592,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    154067549446405,\n                    156275207016386,\n                    156643571858026,\n                    159204029141024,\n                    159350162876827,\n                    159359554299317,\n                    159869778233041,\n                    160021373144492,\n                    160225475241462,\n                    162966656941363,\n                    165572906446902,\n                    166307721941863,\n                    166605601159467,\n                    167304010117193,\n                    168412944661902,\n                    168609000755301,\n                    168699625286154,\n                    169208855579907,\n                    169523753644578,\n                    170917904316320,\n                    171143723926121,\n                    171243991312977,\n                    172170767228631,\n                    172842536979187,\n                    173410623132357,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    174897648514915,\n                    175029718718788,\n                    177264301473978,\n                    177857889812960,\n                    178176094018343,\n                    179017201157110,\n                    179921783290284,\n                    180059082755493,\n                    180068779789910,\n                    180414262292400,\n                    180740880110572,\n                    181063160240061,\n                    181803993639937,\n                    183449325300818,\n                    183519396664097,\n                    183571182225450,\n                    184752983925284,\n                    185471680685606,\n                    186580476523320,\n                    186949263795931,\n                    187928842797492,\n                    188086202110112,\n                    189442327350789,\n                    190807904035305,\n                    192319726776217,\n                    192393783199254,\n                    192587291169373,\n                    193005890924998,\n                    195786680138999,\n                    195987898533177,\n                    199510432035291,\n                    199650567438286,\n                    199897125905944,\n                    199958856257661,\n                    200763792087641,\n                    200811993081184,\n                    201913688816444,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    203992874733577,\n                    205007299373342,\n                    205495097863124,\n                    205586854488827,\n                    205853306198814,\n                    206336494258543,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209537101018812,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    215248629858867,\n                    215275340873070,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    219891441411753,\n                    220558792511464,\n                    221554546582125,\n                    223198782858602,\n                    223709567417754,\n                    223834426416688,\n                    225075006031359,\n                    225198908542897,\n                    225688512560038,\n                    225796963089274,\n                    226081900407695,\n                    226749405843443,\n                    227730705667335,\n                    228659301550674,\n                    229789874401174,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231270817858833,\n                    231444506729168,\n                    231765455198863,\n                    231916540191853,\n                    232974725797149,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234373571118961,\n                    234486644060094,\n                    235231753660795,\n                    238102472767969,\n                    238574581938385,\n                    241665428326676,\n                    241990049986130,\n                    242442058293823,\n                    242809521673924,\n                    243357294296588,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247271784936594,\n                    249136603804393,\n                    250033322896251,\n                    252533523398493,\n                    255869213781995,\n                    256264089513587,\n                    258090152932519,\n                    258801668971304,\n                    259079953498264,\n                    260567430361426,\n                    260653292806033,\n                    261804172017043,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264731207392290,\n                    266537010768292,\n                    270110108859339,\n                    270538381802720,\n                    271375997486305,\n                    274201125891842,\n                    274383394688737,\n                    275533107905672,\n                    276395310963137,\n                    277124038643903,\n                    277403312668335,\n                    280768685536212,\n                    281419217453687,\n                    282461563119931,\n                    283222379262666,\n                    283716381550104,\n                    283753951167536,\n                    286272134191105,\n                    288471586195099,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    290751156362843,\n                    291172509721213,\n                    293068286620317,\n                    293122482945702,\n                    293349295644131,\n                    293364784068746,\n                    293446294820727,\n                    293761737980270,\n                    294048628266791,\n                    294285966776959,\n                    294309017220579,\n                    296404313255688,\n                    297267706713144,\n                    297566393252293,\n                    298164502295539,\n                    298353836077639,\n                    299495863829841,\n                    300842773788181,\n                    301280787524288,\n                    302656802432509,\n                    304357039915265,\n                    305166459455071,\n                    305883937093471,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    310260543915478,\n                    310265191419295,\n                    311783912113073,\n                    312500518005538,\n                    312655519254570,\n                    313635798098525,\n                    314170569167596,\n                    314916970143294,\n                    315568913490822,\n                    315730568901909,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    320108891188997,\n                    321541456700375,\n                    322521825476248,\n                    323284031290836,\n                    323583450074959,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    328158084014937,\n                    330274652031045,\n                    330565598299916,\n                    331145279644469,\n                    335724314867453,\n                    335817092568549,\n                    335974005310403,\n                    336220685656619,\n                    336260335931378,\n                    336261489349740,\n                    337623845634316,\n                    338300563625880,\n                    338841443768533,\n                    340776015225067,\n                    340863683252199,\n                    341811810483352,\n                    343787907925867,\n                    344460902511425,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    348817429227528,\n                    348833845559066,\n                    349270259964100,\n                    353928548293364,\n                    354889737852692,\n                    355561819235138,\n                    359175499709959,\n                    359490965261776,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    361245631263122,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    365152687151188,\n                    366193857397914,\n                    366388425061942,\n                    367512815238907,\n                    368111726415588,\n                    368850056470283,\n                    374792067287126,\n                    374992075674229,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    378988928968399,\n                    379202966330246,\n                    379462778378127,\n                    379937459247959,\n                    380132704649033,\n                    380373432490457,\n                    380778268703892,\n                    381418800043351,\n                    381991699884352,\n                    383272102454619,\n                    385113003923218,\n                    385418400433017,\n                    385755642378984,\n                    386426924783330,\n                    387687866855442,\n                    387891260768716,\n                    391093344163451,\n                    391412493497363,\n                    391913316514326,\n                    393253943410375,\n                    394549480944907,\n                    394868976184257,\n                    394992647600588,\n                    395370668508160,\n                    396097144709247,\n                    398018189439516,\n                    398330770380060,\n                    399359713815504,\n                    400501102903000,\n                    403472959967900,\n                    404003416788822,\n                    404032561117566,\n                    404160108032790,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    409964247236589,\n                    410070177508463,\n                    412243873589964,\n                    415731791994512,\n                    415798442457945,\n                    416308367178118,\n                    417193054089403,\n                    417879179345800,\n                    417958793174431,\n                    418013395365815,\n                    418930712757550,\n                    419080351349759,\n                    421689299055012,\n                    421897504513649,\n                    422317065560637,\n                    423341155346518,\n                    424170930031434,\n                    424684625834342,\n                    425491993925697,\n                    426300532034066,\n                    427562965999248\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/6d6e87e1154e95b279e5e7db414bc37b",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2255622_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"6d6e87e1154e95b279e5e7db414bc37b\",\n                \"mins\": [\n                    215089315280,\n                    291674529868,\n                    659912036083,\n                    736968581505,\n                    944574910739,\n                    1130926917921,\n                    1140383038326,\n                    1224208891333,\n                    1519622976813,\n                    2508456406617,\n                    2726898850574,\n                    2813494374706,\n                    3047015433984,\n                    3835288040828,\n                    4231658739382,\n                    4413003150135,\n                    4870914467521,\n                    5825209928114,\n                    5871893412345,\n                    5888422665728,\n                    6103415363614,\n                    7532547771555,\n                    7594581929652,\n                    7910677492884,\n                    8182315511682,\n                    8230363088713,\n                    8394347595486,\n                    8623700758937,\n                    9739271815773,\n                    9780886482986,\n                    9836834414894,\n                    9946639466383,\n                    10104425650117,\n                    10122980714756,\n                    10229953843845,\n                    11382774219786,\n                    11828070075151,\n                    12099834582305,\n                    12132880780844,\n                    12459731847780,\n                    13935429903706,\n                    14563906465922,\n                    14758098660233,\n                    14761433865384,\n                    14898831781122,\n                    14958876677719,\n                    15317866923606,\n                    15366664740987,\n                    15764118331522,\n                    16115281956116,\n                    16219549320392,\n                    16244571079575,\n                    16363695412769,\n                    16493792210474,\n                    16852225843359,\n                    17503337897524,\n                    18262609533893,\n                    18283839128286,\n                    18393265118408,\n                    18699386411547,\n                    18865536207758,\n                    19653463755059,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    20993534689958,\n                    21309387292380,\n                    21678201955671,\n                    22228433882905,\n                    22400017100650,\n                    22481669321537,\n                    22648822913198,\n                    23075126583981,\n                    23473630895827,\n                    24228397245244,\n                    24453017104540,\n                    24729753092003,\n                    25171338917197,\n                    25470086398510,\n                    25859976628720,\n                    26034960602920,\n                    26050630874225,\n                    26811088179302,\n                    26889776861871,\n                    27379618897398,\n                    27579322793320,\n                    27877721210839,\n                    28181374991281,\n                    28987805918116,\n                    29485767733290,\n                    30645532261705,\n                    31018397527996,\n                    31804114294503,\n                    31828073872267,\n                    33174177282046,\n                    33766728674754,\n                    34293559391707,\n                    34865655278433,\n                    35594794270269,\n                    35737327561228,\n                    36023575677863,\n                    36115178283383,\n                    36296573836791,\n                    36648254328139,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37722662910660,\n                    38047555790079,\n                    39181335028291,\n                    39315707646191,\n                    39525475121988,\n                    39547908012021,\n                    39569717769426,\n                    39570762134913,\n                    39842830835114,\n                    40131183581621,\n                    40359387471137,\n                    40488805247400,\n                    41051959531050,\n                    41208453811482,\n                    41327552124444,\n                    41731966115950,\n                    41848970534226,\n                    41993387439893,\n                    42240649495469,\n                    42806708117796,\n                    42835572354395,\n                    43361270985506,\n                    43392410013225,\n                    43951532139020,\n                    44251094622336,\n                    44469103278173,\n                    45134133836289,\n                    45162468772898,\n                    45253034750040,\n                    45493022921402,\n                    45549512378900,\n                    45631191923950,\n                    45687888053031,\n                    45961575852560,\n                    46031634263009,\n                    46219814209796,\n                    46408058278807,\n                    46571511322916,\n                    46861475435055,\n                    47081622333494,\n                    47309849454170,\n                    47851830416841,\n                    47932899674281,\n                    47988023254574,\n                    48322895089471,\n                    48721945773460,\n                    49163704568316,\n                    49371043945336,\n                    49686742507605,\n                    49720533077083,\n                    50096835907506,\n                    50270049899306,\n                    50336770017521,\n                    51082727813358,\n                    51528521216274,\n                    51681162571203,\n                    52034584391811,\n                    52210140433416,\n                    53023472863526,\n                    53228660416588,\n                    53853474657507,\n                    54692295414908,\n                    54867740755084,\n                    55129376901201,\n                    55236706250225,\n                    55778862667349,\n                    56306387723041,\n                    56657193003439,\n                    56789903701800,\n                    56799175563515,\n                    58105502805031,\n                    58290341538968,\n                    58337636059748,\n                    58488541968161,\n                    58720502087817,\n                    58840242165831,\n                    59494247622507,\n                    59495718362544,\n                    59981877800655,\n                    60051688191594,\n                    60188262372837,\n                    61494212300278,\n                    61790767178261,\n                    61812779636411,\n                    62099680245497,\n                    62313609143465,\n                    62639365934918,\n                    62662601215791,\n                    62807714707992,\n                    62828283855818,\n                    63129837300858,\n                    63227673813565,\n                    63343999371796,\n                    63511319636084,\n                    63997630844999,\n                    64226287840399,\n                    64303638595001,\n                    64534788908566,\n                    64598408397821,\n                    64641070960034,\n                    64727391334782,\n                    65372884132154,\n                    65555522561100,\n                    65794631590725,\n                    65879475768365,\n                    66208953124276,\n                    66568612075368,\n                    66827922406571,\n                    67207262461072,\n                    67677675064362,\n                    68180164059744,\n                    68439185286494,\n                    68761623640864,\n                    68842406304872,\n                    68983853573191,\n                    69047394343401,\n                    69229098109696,\n                    69531629629596,\n                    69927546604113,\n                    70273121946683,\n                    70649076239339,\n                    72161895027450,\n                    72329350928637,\n                    72384590450660,\n                    72784763566810,\n                    72926015770316,\n                    74185732683200,\n                    74995142431146,\n                    76236574892384,\n                    76899785139431,\n                    76910573567504,\n                    77363880951456,\n                    77435320006613,\n                    77499348917587,\n                    77670697910565,\n                    79332000470232,\n                    79746229389501,\n                    80363874565010,\n                    80429502208150,\n                    80939112789193,\n                    80991804891201,\n                    81459515971071,\n                    81914076163002,\n                    82065184534549,\n                    82105662040805,\n                    82696690432912,\n                    83034887506486,\n                    83178028089512,\n                    83964592793137,\n                    84005077178832,\n                    84558403439851,\n                    84777164098582,\n                    84876046572148,\n                    85223814578728,\n                    85283551436014,\n                    86034559726890,\n                    86181847516411,\n                    86662916902939,\n                    87008362790296,\n                    87264350072268,\n                    87416948371306,\n                    87553087594658,\n                    87706538967451,\n                    88398210557196,\n                    88606942757476,\n                    88724621114355,\n                    89224410019537,\n                    90273256224370,\n                    91706763244181,\n                    92563002307861,\n                    92615551991813,\n                    92670714878004,\n                    92808938741689,\n                    92963671022329,\n                    93402089893230,\n                    93462948799513,\n                    93841830978049,\n                    94123707640329,\n                    94390504905414,\n                    94449201343599,\n                    95108638560446,\n                    95322147890566,\n                    95470737290984,\n                    95613743229855,\n                    96442880942679,\n                    97040758087909,\n                    97246797236254,\n                    97571747840697,\n                    98123090506182,\n                    98179513908619,\n                    98324799297724,\n                    99368955966421,\n                    99569043912575,\n                    99965133914776,\n                    100448234351312,\n                    100689066969619,\n                    100725505255788,\n                    100757191863196,\n                    101455538328968,\n                    101493231099683,\n                    102644142538181,\n                    104091683226971,\n                    104120924444187,\n                    104400591660966,\n                    104446790158566,\n                    104451867849834,\n                    105189561915429,\n                    105717627107319,\n                    106434203474251,\n                    106856438858860,\n                    106984945037295,\n                    107001680275504,\n                    107246503630802,\n                    107335243861817,\n                    109071581673129,\n                    109551654663245,\n                    109694118121197,\n                    111454367428562,\n                    111636058746833,\n                    111788278952703,\n                    112015499236465,\n                    112157193261305,\n                    113163563618295,\n                    113410539288368,\n                    114139175955629,\n                    114307819855046,\n                    114321559757180,\n                    114728471948120,\n                    114903557460790,\n                    114981716237090,\n                    115403886521159,\n                    115650470365123,\n                    115696569747930,\n                    115711999096223,\n                    116127169502189,\n                    116211838271866,\n                    116371477715368,\n                    116556039792279,\n                    116957004714210,\n                    117867146428505,\n                    118484253796245,\n                    118571863639262,\n                    118704354431725,\n                    118762763614010,\n                    118916030730019,\n                    119186746319693,\n                    119349197230465,\n                    119358605785829,\n                    119438611160104,\n                    119698878365483,\n                    121123692554185,\n                    121142462666583,\n                    121528792557620,\n                    121797541557489,\n                    121870306095302,\n                    122149310042087,\n                    123106982277866,\n                    123435887685299,\n                    123601762458621,\n                    123717654821426,\n                    124051214072843,\n                    124342491116643,\n                    124503522875964,\n                    124578586530266,\n                    124587964437913,\n                    124725729653665,\n                    124746422633510,\n                    124750192071655,\n                    124768282727566,\n                    125230114876611,\n                    125321826030016,\n                    127419004886761,\n                    127420241505431,\n                    127838593437661,\n                    128608410656562,\n                    128615562510797,\n                    129136336003338,\n                    129743357585456,\n                    130357183596582,\n                    130449489784288,\n                    130759367637359,\n                    130932431409422,\n                    131114765041506,\n                    131259713485090,\n                    131665899116300,\n                    132696169867812,\n                    133074201429869,\n                    133610721653670,\n                    133658087266350,\n                    133805949970550,\n                    134022643347451,\n                    134180001503169,\n                    134480946295095,\n                    134528309262636,\n                    135813149578002,\n                    136270510397946,\n                    136440932785986,\n                    137225082805595,\n                    138015741692447,\n                    138036515355989,\n                    138868467200948,\n                    139426803069629,\n                    140477227833971,\n                    140758407076546,\n                    140945797534471,\n                    141177726297957,\n                    141990335973972,\n                    142280730309472,\n                    142394166917163,\n                    142866591234977,\n                    143057190215748,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    143918338421151,\n                    143993203989656,\n                    144035717909615,\n                    144099850521047,\n                    144118542916339,\n                    144289220792317,\n                    144756978268718,\n                    145507507293269,\n                    145801993118700,\n                    146036048035532,\n                    147547181493835,\n                    147568633164936,\n                    148265509196629,\n                    148271320739741,\n                    149009140521356,\n                    149400470821791,\n                    149466695315067,\n                    149610030539086,\n                    150525607103853,\n                    151134340913122,\n                    151891421516846,\n                    152173033669992,\n                    152252932556929,\n                    152545355800304,\n                    152763516596482,\n                    152767089713159,\n                    153018942489979,\n                    153277687133191,\n                    153499429746893,\n                    153619074170851,\n                    153688480117844,\n                    153819767075496,\n                    153934077987853,\n                    153964058113210,\n                    154144078574046,\n                    154473683474900,\n                    154504590428422,\n                    154745677105480,\n                    154767139169904,\n                    154792465965192,\n                    155005702504057,\n                    156187447382478,\n                    156337457611871,\n                    156516659025181,\n                    156881462375449,\n                    157486234764096,\n                    157771792852571,\n                    159350162876827,\n                    159359554299317,\n                    159525033588832,\n                    159811833882343,\n                    159833415113099,\n                    160455334711875,\n                    160779614822235,\n                    162184986436543,\n                    162660721679577,\n                    162832799447054,\n                    162966656941363,\n                    163094038630874,\n                    164292320065575,\n                    164730857318871,\n                    164870234246611,\n                    165572906446902,\n                    165599790702978,\n                    166033901816340,\n                    166883822819949,\n                    167007474650516,\n                    167141620488773,\n                    167220419246069,\n                    167368164348954,\n                    167477335839938,\n                    167536779496558,\n                    167578307012466,\n                    167627584385194,\n                    167628267366836,\n                    168279076776929,\n                    168412944661902,\n                    168495462754350\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/b59473c94ff2889eca5d7165936e64b3",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453570_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"b59473c94ff2889eca5d7165936e64b3\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    3558981176698,\n                    3595680864757,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14077774510216,\n                    14958711182794,\n                    18561566035899,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    22816587154347,\n                    23694929505466,\n                    24134363957219,\n                    30606147678309,\n                    31130970675642,\n                    32760645340554,\n                    32914685791800,\n                    33190965408032,\n                    33960067474598,\n                    33972093486205,\n                    36209503859197,\n                    36836491863349,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    40000457533067,\n                    40821822920127,\n                    41548684950793,\n                    42975853122398,\n                    44318001749959,\n                    45220477427487,\n                    47205415940160,\n                    48527209372456,\n                    49367718187361,\n                    50266038601832,\n                    55281399957585,\n                    56622962479482,\n                    57082333339946,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    61074441390615,\n                    62702978264830,\n                    63272127345152,\n                    63747523251368,\n                    63753094017459,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    67872638217057,\n                    73961050027324,\n                    74203304881322,\n                    75510673507974,\n                    76301251957108,\n                    77462788932224,\n                    78004711377952,\n                    78593695483794,\n                    86080933269012,\n                    89312085426348,\n                    90302598717534,\n                    92082937491658,\n                    94266407193778,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103640879986045,\n                    106478901668282,\n                    106527047349315,\n                    112760650992638,\n                    114014805629783,\n                    114457599754429,\n                    114719330008227,\n                    114779375695317,\n                    115180661866118,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    128261346941417,\n                    129274485291245,\n                    130190959130109,\n                    130268767097311,\n                    130618284885748,\n                    131165953925337,\n                    133399630293992,\n                    133580282506938,\n                    137807029090583,\n                    139762252968300,\n                    142561908560556,\n                    143304921092381,\n                    144178457349008,\n                    148434659896290,\n                    150519487205401,\n                    154119208822262,\n                    154803963303860,\n                    155829895672627,\n                    156056750199531,\n                    159477189409659,\n                    160949002171461,\n                    163227549897255,\n                    164655854171874,\n                    165496592913298,\n                    165633097778062,\n                    166146331478050,\n                    166719940886532,\n                    166891246324981,\n                    167767324541682,\n                    173367021064967,\n                    173949973069402,\n                    175559849681044,\n                    176037192436786,\n                    181359032563838,\n                    181452042206456,\n                    182593899788192,\n                    185485707281703,\n                    186607121994479,\n                    188106044596447,\n                    191078441509481,\n                    194214915999879,\n                    194881073215824,\n                    196584209022550,\n                    198409930440501,\n                    199577187021953,\n                    200567230796156,\n                    202981877464187,\n                    208004490729476,\n                    210822710165852,\n                    211216538377500,\n                    211915017282095,\n                    215418355892998,\n                    215493649182712,\n                    215607106913801,\n                    216444054660744,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    225216425962890,\n                    225962923363564,\n                    225980008558421,\n                    228170423512561,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    233393853088183,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    238537875199759,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244255726983140,\n                    248336783901894,\n                    248851248559212,\n                    250357693564448,\n                    255343715369709,\n                    256375919657769,\n                    258616504685066,\n                    260212336791624,\n                    265736169322750,\n                    265781739304017,\n                    267345873524094,\n                    270071179263543,\n                    271342665825792,\n                    274122990498640,\n                    275360996806051,\n                    280967669495427,\n                    281897628539431,\n                    282200323162036,\n                    282342999530487,\n                    283830758206802,\n                    284620358398045,\n                    285925400570356,\n                    286736038466698,\n                    294086384353867,\n                    296514059807299,\n                    296966685834878,\n                    298791773277565,\n                    299005107402724,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    304085672582189,\n                    306426014688347,\n                    308473366560206,\n                    312407681513044,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    326855577904572,\n                    329899680983199,\n                    330331027273450,\n                    332098363218169,\n                    333944737799563,\n                    335174317746616,\n                    335584394916553,\n                    336702934772821,\n                    337731129151000,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    345448918397261,\n                    345460489054988,\n                    345741054833297,\n                    345875303722758,\n                    348815216366639,\n                    350399163507829,\n                    351292962170419,\n                    351636183165646,\n                    352167543743049,\n                    357535517122796,\n                    358375425017902,\n                    358595265377108,\n                    359452645935849,\n                    362124977362793,\n                    366535672236781,\n                    369461062038057,\n                    374615513078797,\n                    374673872059460,\n                    375780195152331,\n                    376434056729415,\n                    378592360993657,\n                    379102542404949,\n                    382035531157070,\n                    383135333541903,\n                    383850900061929,\n                    386263487549463,\n                    388013701783741,\n                    390332660259608,\n                    391711331432850,\n                    393516543506060,\n                    395113186430911,\n                    398353486663867,\n                    400967959890432,\n                    401487977714282,\n                    408778667923133,\n                    408962716867059,\n                    410861197839878,\n                    414355853800959,\n                    416391446838305,\n                    416580890530128,\n                    417681898958140,\n                    418835159902566,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    427962000123701,\n                    428646049860395,\n                    429952924284227,\n                    430664272577516,\n                    432118521614652,\n                    434109604325888,\n                    435267549331128,\n                    435940587843567,\n                    446481351575757,\n                    447467518423055,\n                    449803315024875,\n                    450112320572118,\n                    452241247094714,\n                    452829154656306,\n                    453367679371415,\n                    454813132622585,\n                    456493632715805,\n                    456717723773303,\n                    457632835991147,\n                    460076260875464,\n                    461156956524045,\n                    461171986063800,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    471195319432894,\n                    471546567533879,\n                    471922058927200,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473794754684632,\n                    476325119891604,\n                    476526896773980,\n                    477517713088633,\n                    480403157013579,\n                    482503820391550,\n                    484680531927015,\n                    485278877010947,\n                    487131235164323,\n                    487732314724511,\n                    488524886279546,\n                    491715999174683,\n                    495846359323641,\n                    506531113930798,\n                    510251560588775,\n                    510737910464301,\n                    512448947565770,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518629934480933,\n                    520568397104333,\n                    525382873389847,\n                    525762219690878,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530515351265560,\n                    534461213463332,\n                    538939534540869,\n                    539614362293141,\n                    539777176029418,\n                    539873986742508,\n                    540921382222017,\n                    541186981810837,\n                    543935720187395,\n                    545273268128445,\n                    546633122974996,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    556847877286431,\n                    558032616210722,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    561604684739024,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572186073828265,\n                    573767900523468,\n                    573851852316852,\n                    576313152716444,\n                    576624529060777,\n                    576874504697497,\n                    577153916453262,\n                    578224661471458,\n                    578856083248351,\n                    579656586099131,\n                    583350333207780,\n                    584217116139474,\n                    587065796103120,\n                    587669535192483,\n                    592792708776319,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    600583358156891,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620849299055244,\n                    621083126852990,\n                    627738708322473,\n                    628967244202734,\n                    629396495678046,\n                    630034340392901,\n                    632152787169751,\n                    632757066611488,\n                    635939425862264,\n                    640549605471712,\n                    641596035529063,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    648990703275660,\n                    649351154360370,\n                    650654068363343,\n                    655230244020599,\n                    657226217132416,\n                    657355507140185,\n                    662135736889575,\n                    663462366932727,\n                    665636043678921,\n                    667342688777044,\n                    668170744538822,\n                    670595660720839,\n                    672641554971634,\n                    676044446355190,\n                    677261185301275,\n                    677295740685782,\n                    677738022893547,\n                    679186583662682,\n                    681266465716475,\n                    682874745971459,\n                    683897063771844,\n                    685746125867239,\n                    686035384279530,\n                    686106466488739,\n                    687211424722853,\n                    688990372747831,\n                    691020029667905,\n                    691680901171966,\n                    694869046270466,\n                    700054088308311,\n                    700366400626315,\n                    701010566680671,\n                    702400887447953,\n                    702728791577749,\n                    703127461004015,\n                    704335484663791,\n                    705302678110381,\n                    706832134097576,\n                    707962189637436,\n                    710403353214581,\n                    712661928452840,\n                    715334925158742,\n                    715377268215567,\n                    715896323316677,\n                    716020219332683,\n                    716091343321154,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    723332805980528,\n                    724621545164802,\n                    726012427583803,\n                    726271575466251,\n                    727030394121071,\n                    731361512976697,\n                    733617713228542,\n                    734622692371860,\n                    736290151677476,\n                    736566880750337,\n                    739389456325310,\n                    742704052187442,\n                    745420507633982,\n                    746469097917429,\n                    747026339202991,\n                    748064810280445,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758453303481943,\n                    758543555642030,\n                    759237826018133,\n                    770328708409334,\n                    771613473168408,\n                    772165475523258,\n                    773304776019517,\n                    774312511311396,\n                    774594040074891,\n                    774964429534347,\n                    777891987478900,\n                    779330069525835,\n                    782210000583365,\n                    783959071612606,\n                    785243161415867,\n                    788027556261557,\n                    788033647567963,\n                    788617127284627,\n                    789488280089338,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    794276713525849,\n                    796762144732626,\n                    797622366845781,\n                    800060479182618,\n                    802951804704904,\n                    804618913432196,\n                    806028047443770,\n                    806167606439428,\n                    811884284377466\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/f0c834bc306651d2b9321fb21d3e8d8f",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453569_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f0c834bc306651d2b9321fb21d3e8d8f\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    2756695559996,\n                    3017280732468,\n                    8798248946328,\n                    11352616080698,\n                    11550845136154,\n                    12183113567732,\n                    14718047586080,\n                    15518147513869,\n                    17682163834920,\n                    18029472307723,\n                    18722876140337,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    23126533024618,\n                    24134363957219,\n                    25105646732171,\n                    27426095011341,\n                    28889287639316,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    34376317340737,\n                    35413666412010,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    41548684950793,\n                    42975853122398,\n                    43333283576538,\n                    43797826300341,\n                    44182822842357,\n                    49367718187361,\n                    50266038601832,\n                    51459351831459,\n                    52459209483030,\n                    54096036790222,\n                    54938371268946,\n                    56622962479482,\n                    58428533496606,\n                    58910287066672,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62424408278746,\n                    62652142008211,\n                    62702978264830,\n                    63747523251368,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    65853715307230,\n                    67872638217057,\n                    70880519905358,\n                    73961050027324,\n                    75833178093944,\n                    78004711377952,\n                    89046548749891,\n                    91970793441325,\n                    92082937491658,\n                    94266407193778,\n                    97059945956107,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    106511667935863,\n                    109026157607570,\n                    112505435116132,\n                    112760650992638,\n                    114014388557103,\n                    114457599754429,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    119998700438175,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    123453159722404,\n                    126427982409537,\n                    127302670329760,\n                    128261346941417,\n                    129274485291245,\n                    130268767097311,\n                    130618284885748,\n                    130680267494321,\n                    131310062444107,\n                    132907013766936,\n                    133399630293992,\n                    133580282506938,\n                    137450930961952,\n                    139762252968300,\n                    140619106750418,\n                    142615782998151,\n                    143304921092381,\n                    145203869062483,\n                    148434659896290,\n                    150519487205401,\n                    151659316769984,\n                    154119208822262,\n                    154803963303860,\n                    155091361216035,\n                    156355255647409,\n                    163227549897255,\n                    163905808341739,\n                    166116061393073,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173468574347604,\n                    175559849681044,\n                    176037192436786,\n                    179129454015522,\n                    179606648877738,\n                    179956173397439,\n                    181175315330322,\n                    186188120396587,\n                    189162728773831,\n                    191078441509481,\n                    196150349451960,\n                    196584209022550,\n                    198409930440501,\n                    198597053692927,\n                    200509345911594,\n                    200567230796156,\n                    202960515626517,\n                    202981877464187,\n                    210625558705034,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    219619606513837,\n                    220138017981065,\n                    221322641419906,\n                    221692515333150,\n                    223103766020907,\n                    223308827351122,\n                    225216425962890,\n                    225962923363564,\n                    227654478699541,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    236606915867400,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242779977866708,\n                    242838856557679,\n                    244255726983140,\n                    244860991440151,\n                    245130313552765,\n                    248336783901894,\n                    248851248559212,\n                    248993151758694,\n                    250357693564448,\n                    250433703280235,\n                    258315509760939,\n                    259301238714261,\n                    259835033542287,\n                    264753634717119,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    266888647546888,\n                    268179213976013,\n                    269644108985416,\n                    271342665825792,\n                    273193300451366,\n                    274122990498640,\n                    274876788032658,\n                    275360996806051,\n                    275543995846992,\n                    276221877341287,\n                    277132191503183,\n                    277862338800417,\n                    278212913088609,\n                    280877794706788,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    286555216056228,\n                    286736038466698,\n                    288091651180818,\n                    289724862541255,\n                    290309864993733,\n                    290388809460443,\n                    294086384353867,\n                    296966685834878,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    301510670432750,\n                    302667628736144,\n                    307413790961671,\n                    308473366560206,\n                    309227573740883,\n                    312587803039400,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    319121931997971,\n                    326855577904572,\n                    328849372415869,\n                    329418197512975,\n                    331238400730017,\n                    332098363218169,\n                    333944737799563,\n                    334843701246736,\n                    335584394916553,\n                    335971123608722,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    346077313264359,\n                    346299646639688,\n                    348815216366639,\n                    350399163507829,\n                    352167543743049,\n                    357535517122796,\n                    358595265377108,\n                    359452645935849,\n                    360947577332752,\n                    362124977362793,\n                    362617542158239,\n                    364155736950907,\n                    365659628340646,\n                    366535672236781,\n                    367226803013763,\n                    369117201073175,\n                    369325291998224,\n                    369559687694957,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    376434056729415,\n                    377398322708389,\n                    379102542404949,\n                    381336562045153,\n                    382035531157070,\n                    383850900061929,\n                    384211196611467,\n                    386263487549463,\n                    388499765349836,\n                    390332660259608,\n                    391711331432850,\n                    392351813514281,\n                    393516543506060,\n                    394623284964953,\n                    394996681358473,\n                    401487977714282,\n                    406196060040394,\n                    408778667923133,\n                    408962716867059,\n                    410071124049598,\n                    410861197839878,\n                    414355853800959,\n                    415194310967331,\n                    416580890530128,\n                    418088879972183,\n                    421486950473329,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424577144701529,\n                    427230335237565,\n                    429952924284227,\n                    430583031413630,\n                    430664272577516,\n                    434328269700792,\n                    435267549331128,\n                    436479092642625,\n                    437123713564004,\n                    437654980371254,\n                    437948315733142,\n                    447467518423055,\n                    448817550923236,\n                    450058424424520,\n                    450112320572118,\n                    451622661916081,\n                    452195530667530,\n                    452241247094714,\n                    453735785331029,\n                    456493632715805,\n                    456717723773303,\n                    457996242151684,\n                    458057319849877,\n                    460076260875464,\n                    461156956524045,\n                    461276801535123,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    470135419109892,\n                    471546567533879,\n                    471922058927200,\n                    472365458755346,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473082557541180,\n                    476325119891604,\n                    476526896773980,\n                    480177741395295,\n                    484639189320920,\n                    484680531927015,\n                    484810950748951,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    493125876509773,\n                    495846359323641,\n                    498279238790238,\n                    508031302306958,\n                    509308758440423,\n                    510251560588775,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518525721488903,\n                    519307267967594,\n                    519375222893422,\n                    520006459875423,\n                    520568397104333,\n                    523796133390380,\n                    525331047566316,\n                    525382873389847,\n                    525443969024288,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    533221992957154,\n                    533383900955463,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    540252372548066,\n                    542883591758496,\n                    543935720187395,\n                    544910970844098,\n                    545273268128445,\n                    551381720133873,\n                    553977959695484,\n                    555273679362469,\n                    555321949850378,\n                    555828795847874,\n                    556910957763276,\n                    557285930201258,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    559954430933840,\n                    564616206473372,\n                    565020390122451,\n                    566114305025384,\n                    568901431510366,\n                    572068367820350,\n                    572864932706448,\n                    573767900523468,\n                    573851852316852,\n                    576110831795731,\n                    576624529060777,\n                    576874504697497,\n                    578416100451701,\n                    579421699692764,\n                    579748224601908,\n                    583346960664570,\n                    583458377899774,\n                    584217116139474,\n                    585039308609199,\n                    587065796103120,\n                    591244122623354,\n                    592792708776319,\n                    592997432856726,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605527960069793,\n                    606419362199228,\n                    607649938708299,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612318401334000,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    618889806182696,\n                    620059729516362,\n                    621083126852990,\n                    621271411830233,\n                    623252370242796,\n                    626526286339314,\n                    628967244202734,\n                    630034340392901,\n                    631029322236360,\n                    632757066611488,\n                    632818738426364,\n                    634691502028135,\n                    635939425862264,\n                    635969932055283,\n                    639610417638976,\n                    639710605455165,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    649351154360370,\n                    649391604242707,\n                    652455823903591,\n                    655230244020599,\n                    657355507140185,\n                    663985456931184,\n                    668589629748046,\n                    670146496451272,\n                    670595660720839,\n                    672641554971634,\n                    673587502056476,\n                    676044446355190,\n                    677201890824346,\n                    677261185301275,\n                    678303154208507,\n                    678412732753910,\n                    680941268401052,\n                    681266465716475,\n                    682209634532220,\n                    682874745971459,\n                    683897063771844,\n                    686035384279530,\n                    686106466488739,\n                    688990372747831,\n                    691680901171966,\n                    694869046270466,\n                    698831566328784,\n                    701010566680671,\n                    703127461004015,\n                    705095159614137,\n                    705302678110381,\n                    705440295396070,\n                    707962189637436,\n                    712128120373858,\n                    712530228579255,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    725530359226083,\n                    726271575466251,\n                    726644962313888,\n                    727030394121071,\n                    731361512976697,\n                    733555199906207,\n                    733617713228542,\n                    734622692371860,\n                    735916499223944,\n                    736290151677476\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.leaves/f71e78178af9e45e6f1d87a0c53c465c",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2241509_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f71e78178af9e45e6f1d87a0c53c465c\",\n                \"mins\": [\n                    60400386987,\n                    823577066500,\n                    1519622976813,\n                    2099558230394,\n                    2198288153123,\n                    3973909611528,\n                    4586034465171,\n                    5888422665728,\n                    6302757725882,\n                    6367937204658,\n                    7215992153582,\n                    7669958619476,\n                    8230363088713,\n                    9707684064301,\n                    9739271815773,\n                    9780886482986,\n                    11021715939935,\n                    11850890474214,\n                    12099834582305,\n                    13092799901887,\n                    13225001158920,\n                    13609959198971,\n                    14354310516423,\n                    14563906465922,\n                    14571059560222,\n                    14645306127358,\n                    16310340704441,\n                    16958276389988,\n                    17219579204110,\n                    17953084754017,\n                    19959151374003,\n                    20208369434823,\n                    21248632255890,\n                    21852731993169,\n                    22648822913198,\n                    23058172043183,\n                    23576662356304,\n                    23829375645561,\n                    25261795703932,\n                    29548113152218,\n                    29602469588352,\n                    30665779043560,\n                    30901584804357,\n                    30912597140678,\n                    31255720474308,\n                    31828073872267,\n                    32047005497326,\n                    32455199900939,\n                    35265151771864,\n                    35504563643595,\n                    36618240038591,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    38152902047267,\n                    38189684658557,\n                    38758196129412,\n                    39368843530690,\n                    41051959531050,\n                    41208453811482,\n                    42201185214133,\n                    43593801431999,\n                    44253524153058,\n                    44436694084066,\n                    44697291364213,\n                    44698336514963,\n                    44976567584701,\n                    45391001008294,\n                    46515523354690,\n                    46816178877796,\n                    47731774762880,\n                    48595334402758,\n                    49021979265101,\n                    49371043945336,\n                    49676482222915,\n                    49720533077083,\n                    49845812873381,\n                    50863756953274,\n                    51528521216274,\n                    51681162571203,\n                    52832061642195,\n                    55129376901201,\n                    58290341538968,\n                    58895316100455,\n                    58986967295710,\n                    59831458885832,\n                    60629989873712,\n                    60862427199268,\n                    61311934374427,\n                    61741300517625,\n                    62998796549670,\n                    63214224986744,\n                    63436550394145,\n                    65555522561100,\n                    65924385841826,\n                    66014450404167,\n                    68106503958474,\n                    68361070361240,\n                    68429622395163,\n                    69531629629596,\n                    69669816952364,\n                    69834076734040,\n                    69867726565078,\n                    70390489655010,\n                    72161895027450,\n                    74627935126284,\n                    75599412151037,\n                    76910573567504,\n                    76990092374193,\n                    77823679358184,\n                    79920934493212,\n                    81153675749737,\n                    83034887506486,\n                    83541004870527,\n                    84117257683706,\n                    84510016212982,\n                    84558403439851,\n                    84566106541648,\n                    84869605041559,\n                    85020470139133,\n                    86408814513897,\n                    86689484146462,\n                    87496267274159,\n                    87553087594658,\n                    89031341868186,\n                    89224410019537,\n                    90968099687792,\n                    91947365014884,\n                    92560475806357,\n                    92705312571767,\n                    92963671022329,\n                    94042470128938,\n                    94981444614992,\n                    95346285931614,\n                    95613743229855,\n                    96073201994886,\n                    97403829495106,\n                    98324799297724,\n                    98335693463023,\n                    98358008337001,\n                    98513632733989,\n                    98581447863023,\n                    99240980237734,\n                    100665877566078,\n                    100757191863196,\n                    100874197486354,\n                    101402668545174,\n                    102523882340550,\n                    103837073195515,\n                    104511770485165,\n                    104976980796599,\n                    106376197021301,\n                    106790594595842,\n                    106856438858860,\n                    107075008219968,\n                    107270211710572,\n                    108522499772179,\n                    108796977261490,\n                    109072458044113,\n                    110973691690640,\n                    111597811721701,\n                    111852579406785,\n                    112098834290105,\n                    112854535715471,\n                    113100360362644,\n                    113532609924883,\n                    113707672644737,\n                    115222086224134,\n                    115902936575572,\n                    116875710241107,\n                    117439434128933,\n                    118237881107424,\n                    118484253796245,\n                    118577458244101,\n                    118704354431725,\n                    118762763614010,\n                    120403562403398,\n                    123085302630219,\n                    124236663214303,\n                    124503522875964,\n                    124750192071655,\n                    127838593437661,\n                    129008119673637,\n                    129500120619911,\n                    130386592519852,\n                    130916995773652,\n                    131868928947612,\n                    132342877083990,\n                    132696169867812,\n                    133177175428260,\n                    134940238499518,\n                    136270510397946,\n                    138015741692447,\n                    139617655113359,\n                    140742957630633,\n                    141060355139271,\n                    141727722067525,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    144524559656528,\n                    145048941926910,\n                    145358524676284,\n                    145801993118700,\n                    146147941959569,\n                    146197332642273,\n                    147298094626620,\n                    148132313295676,\n                    148271320739741,\n                    149246624631496,\n                    149412030697401,\n                    149428289783056,\n                    149878295612908,\n                    150300472338716,\n                    150498142033726,\n                    150606394548784,\n                    151891421516846,\n                    152252932556929,\n                    152472674447245,\n                    153018942489979,\n                    153041570427833,\n                    153261172171064,\n                    153499429746893,\n                    153688480117844,\n                    154721599478608,\n                    156275207016386,\n                    156516659025181,\n                    156643571858026,\n                    157408350370825,\n                    159359554299317,\n                    159796078446483,\n                    159833415113099,\n                    159910575077486,\n                    160351486834693,\n                    161939629643864,\n                    161940609986387,\n                    162704932949945,\n                    163068263480786,\n                    164511747855159,\n                    164647714000312,\n                    164794299381545,\n                    165210023048822,\n                    165572906446902,\n                    167086347826855,\n                    167141620488773,\n                    167220419246069,\n                    168279076776929,\n                    168412944661902,\n                    168499688420518,\n                    168588153181670,\n                    168632649534409,\n                    170442460802606,\n                    171201369635525,\n                    172053856709804,\n                    172169121265773,\n                    172775324389923,\n                    174450145080469,\n                    174885454236600,\n                    175626124736457,\n                    176179703984274,\n                    177264301473978,\n                    177275301905938,\n                    177917847980823,\n                    177974381583110,\n                    178636928206636,\n                    180068779789910,\n                    181013251409814,\n                    184142039382455,\n                    184752983925284,\n                    185343297638823,\n                    186689460295987,\n                    186949263795931,\n                    187443322053286,\n                    188174311614794,\n                    190190643958498,\n                    190435386968577,\n                    191505075402719,\n                    192587291169373,\n                    192985634484457,\n                    193005890924998,\n                    195150511219449,\n                    195224591208679,\n                    195323331568844,\n                    196399956208036,\n                    197488865076969,\n                    197645431867085,\n                    197667892486155,\n                    198690669576940,\n                    199129991434152,\n                    200099494106658,\n                    200763792087641,\n                    202246005298761,\n                    202454193719832,\n                    203231046579715,\n                    203642731049900,\n                    204596961192335,\n                    205551931705237,\n                    207512012707137,\n                    207560662478458,\n                    207745988431556,\n                    208169002151386,\n                    208798692991212,\n                    209380169367696,\n                    209686709070155,\n                    209935365580642,\n                    210216741203157,\n                    210731028249650,\n                    211044888949477,\n                    211164963414612,\n                    211432561012148,\n                    211608720186528,\n                    212069282457339,\n                    212165241332190,\n                    213423868189143,\n                    213594793122705,\n                    214603931274555,\n                    214895004823429,\n                    215462220362127,\n                    216515317435923,\n                    217624364104314,\n                    218959868504958,\n                    219332462426643,\n                    219420900711806,\n                    219530707228594,\n                    219983169752798,\n                    220400177029026,\n                    221554546582125,\n                    223834426416688,\n                    224013129740964,\n                    225012348009219,\n                    225262901002064,\n                    225272976988478,\n                    225688512560038,\n                    225729121043728,\n                    225865605063898,\n                    226478191326675,\n                    226490280450555,\n                    226749405843443,\n                    228571438273762,\n                    228659301550674,\n                    230063816731086,\n                    230147740600471,\n                    231131716258590,\n                    231167269732039,\n                    231226956607413,\n                    231434168452327,\n                    231846056194211,\n                    233464870224238,\n                    233897329427385,\n                    234080711761577,\n                    234944418269182,\n                    235139431941673,\n                    236106415795883,\n                    237691017699919,\n                    237692482084117,\n                    238330510293383,\n                    239079001777789,\n                    239310431954774,\n                    239320860931883,\n                    239785978985749,\n                    239829043576634,\n                    241090707457411,\n                    241270093069305,\n                    241852865819133,\n                    242213168881845,\n                    242442058293823,\n                    243586260715005,\n                    244486101538283,\n                    244880293726455,\n                    245267018164948,\n                    245709056012167,\n                    246591135909905,\n                    246682667613431,\n                    246892463978226,\n                    247032392472336,\n                    247065219019444,\n                    247098177223672,\n                    247103593644053,\n                    247271784936594,\n                    247397470910482,\n                    249437105252228,\n                    250385372089026,\n                    251364588008466,\n                    252185328425888,\n                    254645791555521,\n                    255035361284884,\n                    256100243468872,\n                    256264089513587,\n                    260526496756444,\n                    260527113994454,\n                    260632609080480,\n                    260694307191271,\n                    260962806951214,\n                    261567562084725,\n                    262025645329226,\n                    262207826333011,\n                    262252115767644,\n                    262455939936188,\n                    262788436418257,\n                    262946168044586,\n                    264421080266300,\n                    264528896513727,\n                    264647060615723,\n                    265815365072475,\n                    266152688016901,\n                    266413794194257,\n                    267078713918965,\n                    267176377119695,\n                    267190976962390,\n                    267294416108493,\n                    267630676165577,\n                    267927798938957,\n                    269578359283844,\n                    269788172566464,\n                    270531130735056,\n                    271754338938388,\n                    272352526980268,\n                    273148755474859,\n                    273963009929669,\n                    274383394688737,\n                    274823193889498,\n                    275503278029490,\n                    276248461650896,\n                    276614092454373,\n                    278054029097666,\n                    278107042683824,\n                    279140340979356,\n                    280242842017684,\n                    280804489026790,\n                    280958622044268,\n                    283716381550104,\n                    284043008927592,\n                    285957888031159,\n                    286847587035887,\n                    286953696536864,\n                    287220289210373,\n                    287661265777051,\n                    289325450257575,\n                    290604862937111,\n                    290674026441801,\n                    290932091338198,\n                    291083660987511,\n                    291172509721213,\n                    293622260022011,\n                    293991300103064,\n                    295865985002150,\n                    297566393252293,\n                    297619063065931,\n                    297638855027375,\n                    298164502295539,\n                    298353836077639,\n                    298409391465409,\n                    299686419400666,\n                    299769726700118,\n                    300136436050699,\n                    300583122258222,\n                    300710556964575,\n                    301266799261438,\n                    301280787524288,\n                    301527407021198,\n                    301988872005691,\n                    302360612278753,\n                    302656802432509,\n                    304549554050632,\n                    306203041818970,\n                    307080590001213,\n                    307145677617826,\n                    307967534912464,\n                    308150774714909,\n                    308280991213272,\n                    308423591882698,\n                    310277246224302,\n                    310518075637689,\n                    311177999205805,\n                    312376374680562,\n                    312500518005538,\n                    313566577455370,\n                    315379360903532,\n                    315761524455196,\n                    315894474312958,\n                    315915560704609,\n                    317146165008935,\n                    317911096926352,\n                    318149703248740,\n                    318452257301876,\n                    318838378422560,\n                    319002045581712,\n                    319870839054454,\n                    320478308186860,\n                    321581854131598,\n                    323244150688113,\n                    325348339530349,\n                    325401700852377,\n                    325609668529942,\n                    325840322414685,\n                    326362555166202,\n                    327401856042864,\n                    327430526220797,\n                    327717949035640,\n                    327729120445936\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.subset/004459575e3657bca8a3d0424545f082",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900106845.1/GCA_900106845.1_PRJEB14233_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LT629846.1 Romboutsia sp. DR1 strain Marseille-P326 genome assembly, scaffold: scaffold00001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,4,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,20,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,13,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"004459575e3657bca8a3d0424545f082\",\"mins\":[2120664548548608,6708879590764546,3490756526907395,2003178351706120,2203167580168203,2239229698777102,7436323281682448,4063395143925777,3321814693974034,5242802943610901,4940266321027097,1793388663635999,7376299513663525,4072560275972136,3389782468591659,7710871755079728,5498251163377713,1261771333734450,9056430593194755,2933744208326714,5270484578746427,8818688556359743,1072007380659552,5684168259821638,2016761337040972,7076321283569677,8336884612690002,7157787496024610,5450387759358036,6197235028062297,7350628049399899,6365759864770653,4366114518224991,4094601964081250,4295839866608315,8674640944955492,4952977811120229,4565778397974630,7390897191251985,3061990409265263,1169326912128360,5759039630631035,3343245291671676,551515891470461,560126183624830,4064693298778247,1130340818364819,1968174278161843,6184852385345682,9089053547593072,980192377581737,8325862034149548,1792983220383090,3167535931554925,7437049733124276,6790146912157878,4255233292422516,4143083491360957,2723988296560830,6661697383825600,8889228797468868,8151274430501066,6236492003266763,2793425552842958,4207871445876946,3732439032461719,4670539744207062,8420853953364188,8899702170661085,8696044457324581,5562128258392290,2233272629600486,2111338403013329,1030468090732781,1781798563115248,6326940271947816,2867556803592435,151746745524468,446455964627190,8012212130656505,7179844138946811,5316988966322901,3878767907889408,3013818278138115,6239316465971462,6539789252210954,6853133254541579,522060295627021,5769269662224654,7340950578112557,7920845552800017,1014029728088338,8072674268086552,3754953736077596,5353521443995696,8896062475387171,7585815244302385,4885601443696938,6591983469748523,3279945029193778,38266502398254,6506229938413876,8178563233841461,5028330721015377,7619190727651639,1923026594833886,5169218419134780,8578688145482045,7899007605092677,4161623378944330,2500795476046156,496263055860046,1503174770135376,5151498931892566,1467006768767319,4705501054763354,2872963519693148,3834732596273210,6602959459197280,2904119054111076,2286177224466791,4876604427690349,1727168327856495,6290895092932981,7840249475715449,1788994856419707,1779007504249212,213334334976383,8002253165719940,346641454276997,7778662002622859,6457927992770956,9001405699518866,3584597796897174,3545119932010906,7060276241707759,8962910398296479,4615388355899809,7767334458544546,1146900297863588,7923059790700967,6771909879787944,7849237564404140,7430054697665266,5642910330245550,1517269503947183,2762395042374064,7432614387931208,5705831229653427,3021380323160503,8105515662447032,3414719798711711,7507301173150140,9211418382320061,6136391868948928,6496484847145413,8623559698440654,1210621044203983,8588262768411090,4546210359202263,671581821104602,3023939132302075,6680204863586789,2007024778199527,1877018582188520,425904141197804,1626517560349165,1812615472939503,1015952396235249,293349231067639,2329866462728697,4408913850876410,5662966587990523,3559950174933502,8527945569202687,7731149134152196,254019513602569,3024591287661068,5858770356240911,3558080374125074,722783566389779,3939405514879511,202137229337113,2364745275363869,4562700627640863,3077313122079267,391591143184476,3447315178381866,7139407344874031,749189084848691,543020881662517,8940519296389687,4664609775935583,5347501799432765,8581941431435840,7825880807618871,5317128415568457,67039146824266,7229639703056971,1046035736674892,2408765042213456,5089117304902232,2233617986410597,1801427775685221,8771480797626983,8106906104160872,2262520064817256,7515050376327801,2782522465820173,7419889279357567,7473346558395840,1082233237414534,9096909238482369,8361444177836140,7659599883678347,8599616557445773,6807264263525016,884594021458589,250005812626079,4588379524035237,5832132757279399,8425290851242664,8689743163798188,8278967346309234,2618946101514930,2106433381319350,2299550976037559,2687739314107064,759835590820543,8647679191257792,8533770200187588,4139307068723916,8913158252143310,3962510920528592,1175623287653073,3560496242696914,4814302159608611,7450875340456660,6478547498574549,3102591411266263,6434265189278427,5748393409565404,8578837787150458,4646329660686890,6247665395480415,6217842865524860,5363130529018604,4619132607427311,5167322198115057,3280360766046962,9075774787695347,963588363806846,7341505650778871,149964990644987,8055498569519868,3801719923716865,1912266982638339,6935932264379141,7900761509335819,775757389562639,5767421119030035,3310937226240789,114188440716054,7104636915028759,1087295815320349,1792174135628578,9159760317612838,3982735442088743,7182304175432498,7092483492115247,1977349177291569,5057286189847346,7903654152789470,1491380924924727,5761116104807226,540200101622587,9021174167178037,7623415401218884,3553576042447686,7104320294875976,8009471867401033,8485627434283851,1492749589570380,6913185859142479,1779637450928978,619824052589398,8698898963698522,5495233123988316,51172001731423,7650725475451746,5878923686031410,6325012404183908,311693583438695,7273303888417643,8771306348875922,4282921913688946,8622968705839990,5567405819556727,1392018669794169,1496647450948475,8774544679576446,2321466914362239,7842106125632384,9188938477331332,3021278781870983,4377227902935946,1703764613378958,759194092663698,6740499959370649,7356833953325978,28494234129307,6873605062902684,7323363073029021,1643887515579298,7149437565076387,8676380755895204,7881412080817065,3674153430467504,2099753185371059,188865886901178,223436398187451,867643722363837,1753717117371327,1631682810086337,8632627206644555,627127895122884,2814256801674181,1374921524368327,8872884912190408,2584916032173007,2668310134760400,831306425243128,8990382157669330,3100573437354963,2982185980054350,7245745244754903,1307961316611034,1938908854232027,376165057241044,6180675554714594,2222610288161774,7827214271366129,1030601358812146,9059085481599993,8062102380389370,1209081682301950,1745382726415359,878566694941696,56680197075969,3509863259042826,8019177410450446,2532448687039503,4317361539019797,6602080022819862,8496145734284316,8871990071518237,4160964749726750,7816521641296933,5414203033269286,7150250003035176,5082310372844588,6189163196040238,7157885007135795,981321798501429,4874686061585463,5213237658879032,1724900812801085,9017914750211135,2159420811351105,2036761677630987,6423874145002565,1228079308485705,7810714874598475,7454920744084322,1710494226990159,407213654209616,5284847468465678,5998433008845917,2683420727884646,8743971159200872,5425581888853099,2914829060183148,1304657691448850,8347982185144509,5721680083556247,5863216904647797,847647166280827,1590456942851196,4059881986397311,3950941672415023,606826794509457,5180551376532629,7926859704108186,6058369167930524,980364434871454,1926518632883366,233991311258792,4166269175755948,680782961415343,8100654141924528,4810139514709171,2481812402459832,8803281542083772,29698921088191,7242720029172928,934175251186889,5088950728271050,5432897216484555,3134260185224398,480203907831672,7379392794186964,3171910483665102,7190912771077341,7639850910397669,3346482948957417,5321657025746155,5054869433218285,7246027114710255,4307916143121649,5065269591360762,7551802823932,4652306268919338,2212765295138047,5378944514012416,4883509986685142,7061090541696268,2975132191118607,8976689339507985,7854786920228114,2196656008171054,7446844649096472,6514648489417133,5081374562780066,5511355430389024,4966166028657953,1948141667909169,3832597741397293,6165788886205742,4373836921242931,858898647749330,2494481900564703,2848872447157567,3296003274626368,2430241332311361,3355296595916343,8287168398312781,4290222596285777,595892877927763,1678798566090069,4380579913880928,7174489711555944,8934829419627882,1864275512493419,7512421171172718,1306946974614901,8795920789513590,541794640967031,1653648510178680,3965401082267001,4087921199285627,2410087787996540,8240112794371455,3142140087178625,6327609160508802,2029855944361350,5239656576218504,8483224140703119,3705706826765714,6439378411779475,2907307102950804,5290911204787606,5271400564327833,3193009035388316,3095211465470874,2225664474252702,5128223916012271,3635490298179824,3359507311232420,4538830752028079,3164069950649928,2145878984885683,3773009405478326,3155343908627895,3668560478791924,8324065115653562,7554875392083391,3537986867275200,5195287257417153,4071646134617540,1052249881694454,1059271101498825,4201582505055691,5489663528622174,7281586326705613,6567480262497742,5214393983972817,6091966011909592,5500393566208932,5793153031088378,4469067350754782,4139277907994083,5260554177697614,3960190167315941,7384080485598694,7450314094503399,2874271086024168,5213963780208105,7085885959517683,8021864301344248,6561313301624314,658328141325832,3203807645230601,2318067256382987,4348469005682188,5909535839348238,2589270511310351,8160857376474640,5243737984415249,5803630936213010,3676671934882051,3818722764195349,2584094670099992,719845460715036,6231921056167454,3542590629242402,6886212037168731,6114551481259556,7693901685113094,6967628975482408,1952249635243612,3498673373222442,4985483697870379,6791982603806252,5051562598237745,579724071601717,7558028861363767,696652428097087,3278488013641280,5336884744676929,6034018996725320,8498948633466445,3217222010431054,8777799385850208,4389142733069509,7169379925648988,8790352008537694,1173925725034081,8357132723471972,6496766024205928,8961810550613614,1123217931671151,2913197139158640,7669052657124987,3982066857916028,7599902814054014,7539831973041792,5310179620472453,5529555170730945,722189495715465,1444706565543562,174698024987831,1370426280960963,8297729039300244,695265924535958,8556008141973785,6425672832911001,6138799570986607,4551352011757217,111734455211682,3825049880127771,5979012889450152,1855424909239978,4067573787551403,4363780573038258,504872492602215,7310432534320821,6392624309229240,2015057246914243,4151336703104712,3858001201620686,3586308961789648,1721520676345557,5786184590128856,3637987132875682,6010744296908512,8882611091551184,5352872361002723,6566955908945638,3946144890595056,2898602446416851,4811080643376766,4021191480143424,1617360904779519,3850262512764674,4661429990895356,2752485152765702,8825204283381520,6060525345720086,6486643986573079,6366991334655770,4751222188553740,4331285317969696,7183901265442593,1886124359128867,538802502133542,2164053375469355,1742974839691054,3368346251996125,4795401190704948,3807915591943989,282336454184585,5932548826216251,4362961763407676,5048003828854410,7708771667269438,7503333954107203,21552337852229,9220808425580361,943578347521866,4990368038717751,790222085179212,4047429441787725,7040455451055950,770410276652880,8055964326803283,2237971506517844,3031409176047355,3958409673594720,3536501209872225,5504609246173030,4414044079961961,3526117480085356,5124696305776494,8066731269486447,5677106389042869,5681038484850323,6560897557993332,1017575025809269,5554963039545207,8998015661273270,602211663939452,5588832159614846,7525405214132098,8750020840703876,2329916213458823,5524765624388588,6355379959019402,5792419988440973,3388968427284368,1797805671143314,1438365700232174,7391909636441753,8950561983932313,1849203403995036,7666266608719773,4109938223308771,1681520140625824,6831401548769194,7374864567124205,8514337445365682,1519768392803077,6393119660918710,7153445733824441,526828148819898,1388341964588987,7185847033726908,2125390521575358,2599224582735809,8182851890509762,6366993374402499,417138704070306,1536486098407354,6990873786165205,7416507486690297,4902849744328669,1389911691026085,7476090973464545,2115352978241506,7531744295782379,8193937338488815,1530727966230512,4160368844330995,2160081651492852,4563261114296310,7858305815263227,3871186084843021,8993870182897322,1799903020120065,1842719213955074,2077908248926214,1574168376551433,8918599823558666,1319919140931596,1661014653184013,4105975304742926,4031634442483728,5415313104635929,5115877504428064,6808088748423204,4799508053076013,4198972650919984,7364106201987121,4930479547623477,5895427989157948,2245539226208319,8925797226074464,4543458929268807,5750641062029384,7929267983345740,9180845188721677,4822075127466067,1375496010692692,332854221673486,2878546660317275,752970259535964,2416518754658398,6019450065369188,4007645429336165,4532094029920358,553344166738024,3909900504377452,2818579533187183,3469285438441585,7144435024644210,1610091156043891,1902102048057462,1216182462367863,4440346081441914,8034381210048637,809390643366014,3645370453296149,8708548786788483,7193742248605831,4202870805571721,7694445765245066,3893937922046094,8059846558759058,7411205597038739,8813165490792597,6363010834491542,1868298855827609,1773976253383023,1462306489611818,6932572565305508,3882460602714278,5716627028412584,7613915785647132,8627710664890541,3115025559455921,672190227135519,7012391848573117,2956120511482050,2385334641342664,6233157866989774,8500018784815312,6712699682330833,2982263343478994,7095165042448597,6983556983515354,1863220865997023,6952506952780001,3885959314254052,2955713286485030,3659157845838058,347946692208879,7878828529658100,3692901881616632,818746498734330,9156853770098940,4477862964225852,552698459703555,7792166304176390,6531609798654217,3913793537632532,5749390217402645,4197415457872151,2215308199311640,7453086339457412,4841591528020250,1042115806513435,3714885745211677,4247481848105250,4749384982231338,3656538402326827,1251432957143342,4882032667535666,4751026152776755,8120971115075895,5172637004680523,768433569605947,2756259370137312,133289431415179,7365455321661836,1768917864929610,6644281677257035,4884492873247052,3034599742446648,8932089877461330,4391372077881684,2285017516661077,9049165611318329,5808018239703390,4058127183894879,5259573760268642,641071278373219,3609477916608873,3362409776703850,1642562220259691,7516671107918189,1767022955530607,9196597744916850,3818038088624531,1562414331271541,3742425169521014,7116721475348855,564732347349379,5911889713228166,2060663417948553,6745531679046027,4717672628009356,2467896549890445,8877936648878480,5753847154350483,7955464684501396,722174081055127,6385775893937220,1286054657005981,7648207627245982,4555886804519329,1855822846740898,9130061618498630,1852050908465575,5748971328817578,5716248673778092,1140263871080877,7647597883759023,1019759774108080,749949555743164,59791636781502,5735151187179967,7773786564409794,6965195237714371,5144959179004356,5815076196252102,6748623960922571,1364148054367310,6873677863057878,5880248184068568,643249466112473,6579715169462746,5018000366229983,2157787965237731,2831833061714409,6473275539704298,136918846372946,8856672335174128,4557673168738809,8122245452519936,4415430075390469,396184824756743,125811772217864,1655171780729355,5150279245019663,1265689348799004,9206197524171294,7712144711317253,5172706190543394,264293818567206,8303890793466407,1444068257180201,7168228059281965,2017213363373149,438898423499313,7293527990929971,3224523610683961,3909599789468218,447544395524669,2155684054469185,9043874179426889,982667069067703,7652882457352780,6280104621546061,6853896640977488,3651909294328407,5407768796944984,6616993134307933,8165300025829983,8791191322384995,9006915698326119,2426729721487804,5228530320928179,89525684345455,647104815049330,8755500132153972,3138428422687523,1846377129024122,7480451976170110,7901579667663488,3858791642806913,5782862793991275,502307211978518,3526029052758662,8313644519087212,4998359052630669,4653321116633742,5192024859749007,6002031227849457,3665753107229340,4279548608805534,6970450988346019,1865462638361252,5718918422723242,1436954436483756,1337600651524784,3822403110124212,1478784514001595,1864703950260927,6572646261611201,1488116952799939,8156799849851588,6378899049127713,1971954471402186,5113738063760080,1642824002203301,2352257077500029,2000337177381594,6606355316935390,3066915860216548,8461657293146853,5352653937904360,4492887316433641,6114908641045226,5212840268593901,1159233763822318,3720586820614895,6477564875098864,4199676966779633,1348264113249013,2160921203825398,3062614229129975,4948877315189497,9142217941437180,6138265249446659,1571722635397895,2818415682198284,3321621830667021,5367751553012535,2171466887154450,3948286561098515,895141204113198,2568472781511450,6119530008181531,6104383487036190,413201149655839,5690679852407585,6583414830877475,7240766620658470,22943748004648,2016959870675753,5908167532698410,5596123955841836,8589197722708783,8522319078649103,865347533036337,8345443673676597,6022177330776888,7343112622610911,8102141182249790,5107336674315072,1569225995197251,3063205403981206,2780374985063245,5392951361710926,1549792059243344,976278538766819,5153093660408660,5063483287845718,1082857060485975,333080563166046,3151380049292128,3984535662384955,287040498662246,4766262100573033,1895378204707690,5657175903525739,2526809675397997,18240044227439,1729610635996018,947964328680308,3807745108356927,4244586562053269,7526792536988545,1237708156742531,3456530349255557,8073900596059018,5083148228823949,3275191381801874,5871662332492692,1902960881429405,4809847213104965,6355194980552850,7763197354240935,4867925861174193,4801995836935092,7557896878263221,1553248920193974,3285569976617912,6773204543122365,4449983603391428,107844958022603,4498725310904141,227564978129875,4911566899493845,9178230766261872,5425626847615965,2359062944455657,2824567718333420,9223105155917651,5203841707994102,1200994643725303,4141036973500244,2555836812962810,2362821262187522,1034225072290823,794412735532042,2209392219950093,46344731032591,5783890842602513,3861090384251922,6069638749957143,3113665758043161,6012638846987295,9138551589764955,6928826914778148,9223169295649835,5841633040985134,9048604392025137,1233917165841458,7609212203256888,11065548135481,6340469069360187,2984678526229566,2097525874510911,5611688174750784,4639709624982593,953319114861636,4650687898758214,6173462983511112,2811647567154251,2473747034700877,2091933352176718,7509677102820431,8157888254483537,6468493426756690,4201565426048084,1211579607232356,7136424718888030,7885061144910949,6809815128882284,6124401998621805,5894441323678831,2203928211180656,2203460803779698,4884309514904767,1019958963399806,6794368072191104,1031851068398721,430655991381122,3931167680408708,5978511246052486,6502977491393672,2238237459983499,437960694072773,3505949596740757,2445880578051223,5199891170176154,1593506037794671,3034161229483166,3091070609452191,530164464135330,4496480694283429,6027241841511591,5231071756971178,4862198632504498,6055813078105268,7157300303678645,3599173660810423,5837709875637434,8636806866616863,3718177149625546,5912259881770030,2578362996051138,954804921754827,1122501810556100,6442636021517509,7744640798264522,5187354032651468,4920383010966733,7578890542365902,3598096837618897,3059042326596819,165947373817046,6132261263154391,5582986667900121,5379628104768733,7462015741578465,8807652338265315,3164780512554212,5218560392477925,1492860000672998,5678682206330065,6342053341343807,5698698314206442,7382127577918701,5335425392909557,1453551935569146,8461973104979196,8313286305575466,5765332729449731,8874040985091332,6452273771687126,5688364736765192,3911379431193865,8355580222799115,1278131112007554,1049390179785998,6472205828189455,783470770330897,8230996006227219,8738064221093148,4958514904874270,8344114139458849,7714043212945969,7837342730259752,185739354840361,7578574785809706,6651808093396267,969681807461676,6633528606729437,414440263085363,9082128709982089,93371503050042,6734624431127867,6891719467519294,3880148775771455,2960223277657410,3441977615023427,6943171544583494,3778929498307911,6587696716725576,1708339804196169,1552125959888203,1507603560234316,8451816507956560,1220465931939153,2245505974082900,8477517066399065,8962571709877594,1460805499727197,7779860814355807,794264575614304,3055254213176675,2105675844492647,8359561346899304,4296394407148907,8739385871150444,6130303239114096,6007614381383026,1282326830094069,3804176410635636,4917690645314934,9103935343922554,2283841969532,1802829239954813,1656928995609989,4078270585834886,7155148524379529,398159589055882,2998693793656203,8077578017566094,1891466432609681,2131283877002644,2354916640769945,1487504838348185,3548481670634909,3006255824596384,113232508525986,899801653534116,4121944624799145,4701006290745245,6912382186134963,3937496785915316,6304609138993737,1671588243766714,1016347154779580,7957762626366909,3802016907132350,4925940985421249,68750127288907,1764784737107397,6227773945904588,6865364426010063,3203587937013203,4736653079694807,7724078789905880,7585170614865374,898578085240296,5564538082745835,7353009442176494,54167078944243,2141649703972340,4986982943817205,8068761542168057,1281601333812730,1407082460909051,4804123035926017,5194342148529669,4982058173087239,3033043047493130,5905747854424663,6439710928748045,6303457266695694,3847469268523608,1162846098263571,8039121397693972,4964546193219101,8619215611108894,5396636610530850,8520111542337062,2948484566371880,3306101382434346,1922521174429230,7465443536932399,7383809066143280,3430154368175368,230299432283700,6626628445773365,4633177714623961,8839501421162536,4692283885039162,7783519613255232,7576891577310786,4199154055269957,961525947047494,5169076856053320,8385575929292044,3447073973415500,233434377178704,3896229244894802,6519520871976531,7013833495543383,1142866590637327,5638377399304122,7701734835768926,6179945725632100,7408422108626534,5206965028912744,7978710700416622,8650764629012081,948017147047540,347015201586805,1108162735435387,206606200766079,5829544266538632,8243049697316489,3263930306993802,324715889833922,6927766179782289,901805643394712,4306059894546073,6555989213920933,8097821454000753,1728385193066153,1010796994600620,1048822905982639,5967348326428344,1396456480632505,6279155207909050,7786546353794747,7773419599576764,7621598742425279,9054599659040450,2736287785807558,1551329964973767,4731078186704588,2646570267446995,4070938453802711,7300372046094040,3172446661398233,238580669742810,2987965898477277,5804799966002917,1005428120653543,1107824197828330,7252530316967659,8577662801977069,2207942697189102,953124930993905,599533644062457,1483013898723067,8737856812211964,8196703398452989,2478656177659649,6363345450442500,6000729861312263,3342556815490824,7116261956828941,4099236370257197,8651248837238546,7473939626938816,6388019087823910,6578388029206305,5375703269637925,124693502930730,3254946018979627,3153331330670380,848420802719534,2999061661630255,3132867347193654,7588963894411064,4247992568573753,6638531418980155,7277194788372284,3975746724540221,2806878654025535,4988154925011905,2830301900939077,3098860599830497,7616359873494858,1205651629752139,4050960577560399,2397795801616209,887611951509331,8165030927220566,7872724367653519,5105697081085794,1633214818381668,1041057516842854,3723326627028839,7811083154419565,495890799140718,2142695479467891,5991916666122100,4146167452732734,954814646321017,4456483080490874,4806818764685179,1557576214372222,5654428535414656,6613063789299691,6239637221638583,8877208898039695,5256900711666628,7411786040188829,8924891198439326,367483217301410,1359262869213091,1141038760554406,1711110025637799,5276315789402024,6861164271796137,4982418075758507,6955944803599005,8284298692538898,5917660623716276,2582982982959033,5069407812456378,6865964539675295,6708086954741695,6235031061376960,8918512779785547,2121419690717127,1530992881139020,4611330185670603,4696169460301777,7894440193306580,3574464844849110,3248539281345188,7571025426292699,5754231061753168,4610322955403234,2065723636006883,3180393488117732,752669107273709,9220070844665838,5866722835502074,4454960130396146,989537292502355,2956738783105012,3177541209899003],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/01bb2bac3849b82dee57a6ecf8725432",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001844655.1/GCA_001844655.1_ASM184465v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MLZU01000001.1 Mycobacterium tuberculosis strain I0003636-3 I0003636-3_contig1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"01bb2bac3849b82dee57a6ecf8725432\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4137376921317903,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,3853897425318415,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,3807266757341739,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,5080262464819937,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,8651815331507604,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,5842852661052750,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,7982695525856751,4092526301791731,1360710405096951,6524009387461415,2918737215086164,4875820081283327,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,2319684329502984,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,6460791612430260,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,7917710442910040,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,1488198135089416,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,8604592003787340,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,2545127928916740,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,8215276774560757,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,1691698663883279,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,8407988312059771,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,630218890143184,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,3337568874086235,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,401375166743886,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/0382590e3740e4c94455b4d52fff9143",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001288425.1/GCA_001288425.1_12971_2_27_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CYON01000001.1 Staphylococcus aureus genome assembly 12971_2#27, scaffold ERS432053SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"0382590e3740e4c94455b4d52fff9143\",\"mins\":[5146675777052673,2315163181510658,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,2907133893206033,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,6479806504648738,4449147792408615,7277617451196457,3116364401098743,3518770889224237,7372327805427759,6506000896569401,3863448372494395,3909397344211004,7437334004842560,7140729989324865,5055350997004299,4046441427542085,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,9173197031722616,4447327968161932,2687238688096398,5940834273493135,6968438657196176,6423458840264849,4283429268783211,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,7932357643723463,1816213056534246,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,4275434089636035,5392923544264054,3896588604084428,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,5908374364680418,9100377281368294,3977127583879399,6833222729797864,6675745817342186,5625039491039468,1133486263984368,6101035983073523,2417632473485558,8091788112306423,1302574224109821,8212410875969790,5937898811502854,948489885540616,7476293558784267,1316115594879244,3963523983684994,1655653727666446,2377197744251151,3590799175020818,1803490896380179,1613233089708314,1398163635020061,2660901546139013,7318609661925379,2138747986847110,4034436112523558,5119942787128028,8091310037205295,8909030726132017,7967446089515314,6922370832007476,2133264542323422,1477786791149878,3871300378636600,4040110223393081,6992758984360253,7445078125691199,8895922000216384,2602070490546912,843457896101259,9089878662127943,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,5840344637290916,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,481260299161970,6614587086000499,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,3316038957900173,162751473398158,3734458897543567,5940376136597911,2972258577203608,3242446598427039,2968451845775780,1188374620819878,2246725717416689,5877325657956782,74203906302383,7745961481458097,5935630862422453,6969176995176886,5347282112979384,7357884307374526,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,8940994346209769,3517087197159920,5706335401980401,4252686649659892,8499479516164862,5137838574998006,2188170162708984,2546695760749056,3527332718576132,162688560886278,7497816545194504,6855779845853707,2823650723037708,2519992179606030,6748402791805460,6314115733123607,2628169269867032,1991856884875801,1893040465097246,663267648999967,68515416416801,4224499299092571,1283325847532068,237184967045669,8303975859675687,8246219929334314,1561783378768429,8031857753711153,1297442792150451,2744117220422198,2644883506979383,550323193349556,8082439380873789,6161629781725758,1301466934951885,8792974406386243,861160734184004,239261345014344,5360518378600282,7443731089928787,2591352585302612,3677235441902166,8774502673891428,7863282501620314,5791949031062287,7266335543571037,4888768950592097,1251060182680162,2051483091522152,8074218591388266,4363284863173231,3939017814893170,2418223084651124,4891494248387191,6047329894011514,4946705701540475,8556996361134716,7613883562408042,4194303986672257,4260895368577666,3662919159013483,2166267691369095,985997338583691,7167030720094868,4627768844518037,635178958910103,2877754653855172,1108575844749982,2918795761156768,2868277602058914,2635086747951782,8473257377227436,3692897477640877,8821595848045232,4629281300140726,7899833835700340,7926257273950906,7447126361371325,1788090151867071,3087196799197888,2169107663986396,204269439025862,1939633497252551,2439240982766282,6559343506969291,8499668649452236,5909446257947341,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,6286493618604155,61926092041681,5538283699811048,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,970330114464553,1817613396386556,5619546432701021,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,1888527096943373,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,7161054261140279,2642347481506640,212186904118100,3043432314913624,6709902552658779,5652844016120672,8248516013412496,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,2442719583213032,3399098890158963,2413571986957173,9167447170032505,8558537765561210,7509411440202623,1053060246836105,4117238218216331,7117595573932866,2372154767496079,5547694202340241,3220718305670034,2272237085107093,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,2923022378894253,58548012524462,990095007548340,9025646331909048,410144451802613,8535094002541505,2801544017978307,360504095483383,5718263849001935,6177526526477266,8076461447820243,8794208264791002,122015909989199,1338323295265756,2994560223626205,3428447854789601,5274301660094267,5596785988511911,7027985096934380,7482765729801198,1625254992364527,6176712354587633,4752895990487891,660191707599862,3089495541412855,8413332258904917,7122517469537292,7415738719983789,1880410170582036,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,830388703421489,6104920293028914,2683864114443316,3161510797841463,6653090173899838,6240204079699009,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5279738514840419,5906462950118488,144929027286108,6166084614014049,6423506706900066,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,517359220212855,7498960818033784,851815340897403,430223076136060,6432046918378622,4370251230234817,310401436513421,772117120378000,7279634878366865,8934811836040339,1890986035680404,4414964609014638,29860417139863,2185485247435928,746970284205212,2086986011604127,7190948106835105,329215423440037,4950726440469672,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,1971104120004146,9187572004045690,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,936638823216367,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,7064378317985064,385907700483371,5728268182717740,1759748373012018,4110401245517103,1336059428508981,1618472691987766,2262947123078456,2427434620065085,6974450251494718,2555346529826111,4925763159749515,2562320086883280,5811691374228807,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,6138704418343841,5274803040281962,7319951751783787,7610599010751378,5155360444663152,915883713245416,1260790606271859,2952168537830773,391700864198006,51745215800695,6610124020532606,1314889990042517,6713487310972290,7361515808982406,2218257629603393,6570381896951176,1982265176835467,8567589419816342,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,580001466129551,4410612950724851,1287137738233268,9063963446371766,6240582334678461,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,8431983561594311,897316570514903,8150866244466136,5469018164704731,3885943932519902,4293065844762082,4936027117872614,2397618178008552,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,7682210448059988,402247873566207,605192001652224,7323875920791652,6451364401675179,5077643932915205,1033361534550956,130457181976075,6474396741751726,4396323642545688,1603137902355995,7848717625751069,6141646980806917,3517221940119072,4004155958476460,702798501799460,4221990677784101,2850576000013862,319524505622058,2864627209774636,4146833238394463,4620747332527681,8068985491437122,160694334858820,7530221302335046,6073972491583756,1106191012378192,5799343132662063,5701137865421070,1757736763295318,7611734689027677,985626569586271,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,8590428516263539,4512180937213558,5590584270309652,7156388644240319,4542558157555328,6760809165536192,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,6463356318623379,819530571867797,2973371054093974,55532696639127,6520130709554843,6274847488566940,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,5767914751350448,4063887283164850,2818235886003891,4444908075767479,462594584405688,7672125054567770,1639747824223934,8001342250198723,4533568422573766,651657068725962,75607106131659,8084476987051640,1166808652568277,1050472124757718,6635096463206009,6861712285648606,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,1525877688391402,3320002371577580,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,6497917926444676,8143513944316657,467300572956444,7641917531428638,7327034779342626,2254292328232739,8126008824080166,777026232017201,5117258784737064,8552312296191785,7553352169367338,5861465820534573,3343132780332849,8546891284027186,982783900964665,5177776401921852,3109989319097994,3478329653159746,2970622895822659,7598272163776324,2016823776880454,5969289268451145,500006684268363,2339293216622415,6829961833686864,4974610471645496,820079529219923,3716488083994452,8059723177205390,1290139896432922,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,407494504056686,2167369577068814,3827221495609203,6981944088999797,1209024400287606,4733550782715769,5853576310753151,9158016872989675,5382715700053894,8462257808402312,8245677561885676,8154597807642509,7675177204093251,5664055981840276,7469817883450350,6655834216400796,8449499606388378,6161054654166945,8935628239632291,7640718988732325,2215407908836337,2769199177598620,4285562358224810,5300625464223660,7687547568949165,1586163045525149,3700712461854642,1299923441830899,3086808181540789,2417609231026105,5296176842942398,1229878691049804,8690783830517706,8326254200203212,5550023567304653,3159560503162830,4265524355446736,4494745225119689,1055754057562072,624885245548506,153369867168896,8286237998987231,501314330843104,8214132091116539,2783293737744357,8189536530413545,5476876315310060,467366249592816,3001959122151417,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,3404645514262587,7805354275301657,4125199387330624,2275693130250305,3669669445212233,6994098420947023,7256199734364243,6445197233936468,2614524117768281,2176156635736155,6415637455083613,9198749196284261,1062207237257316,8369242804119653,4898691182037097,6924058499905642,8838956566890603,2033238974833351,1435058818705086,4403747301046395,7670540484323560,4706193404512382,5090934684186756,7647986012981381,2893765109098643,164072296102038,2343666349557911,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,450088546953389,5524874001115311,7656430088894642,6300248156747957,1826572334769866,4034678905878720,1203515549264065,6547833949292739,6585493558229191,5902059711862987,297946451506210,5484048230209742,7424197000927439,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,2266518188165352,5898357841811690,8292970583906548,1219768655680734,73407638169848,2057763371387131,2902111595423998,4037615708129537,4735068303730949,6868805569935625,73265497950478,7846237798144273,5184617738316050,2067257304910100,2221340687153433,3442643861129498,6368094493092127,150144952449313,1357719164033317,7797236362615080,928062918895913,4333565149649197,5369751621683502,932244993407279,8995213276330288,3264293452933428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,4088699334455693,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,8443367849552226,1923663661255013,2528889561520487,6247490209868140,9049977009835279,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5502346576963992,1580143928650134,332549451344280,5602292474825115,2096841890683293,7064012510296479,5584756052421024,1541713433336225,8105508678531491,2902476096768420,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,5564848928414133,30172216461750,2774005338483129,7413661131340191,8069172111739324,7612437979536300,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,2760855083342295,8260407158634968,2949081325283748,7873984218462683,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,1239923617995242,8489320569743851,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3054304020027890,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,585038334536187,6574721260816894,5917290617760258,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,340514272782864,1787508922165780,8952362163265966,6616815189441046,3299864180793775,8644146702531103,207892688386593,1354074465876514,211721470048805,9118918071159336,6714337179294251,1419291878255150,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,2527092163099744,720459020642883,3498934123428420,6875606331546038,2085938533902923,384651385379405,1631879280163412,4746826772617814,758283499566863,8361022599817826,197275571292775,3563874166663785,6607041102383728,4204796266711667,8796579924642424,1965966511262331,1186578641926780,2209184500886142,6217388977945224,7505984773102219,8603296405064333,6254528881375899,3796894009887390,1339905113829829,4001936773421731,8833716684167847,4115418516888233,5078604763028139,7944456366951084,5132300845271730,3806717176019639,7779913425963705,7879172040727235,8328582983088836,3981187881433797,8334953150270153,2027494681635543,1390679848778457,4009191020419804,6982435519695313,981946939239152,4952730055523057,5482216705940214,7046896457378555,1102254127540010,7920821769997056,4018290538196096,1956410942925570,5681948115341099,7769295295371735,7012232712137487,637717087886096,2334075661093650,2057294021864213,210402935216919,2947196173888283,2110302892063516,4230071825489989,9193508402337585,5828810279275305,7078403057355566,3252916289493808,8183273020525361,2100493461572402,1397154956147511,4021653090544442,6632433388350267,7678991267339070,1755284184296256,7088305201981920,8711986948082498,7467931263134177,1203079434555191,6985458709252940,6821187116937698,4133002593487694,1863456533297999,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,1191595029470351,726814415526748,1869739381005155,2746847273347940,5565618624165953,3042810235578172,487864828935020,3869761225206638,3408611869207412,8441358375734134,4033162446019447,2765804614536057,4396390006889344,181638314539909,789663207095175,5675853195025288,6396034465909644,1552378516372366,7553111683168749,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,7530063864933276,593012990819230,1169438882554352,6086204123819675,4797301698399142,2866656252631975,3471569168190378,8952231969012651,8075354013268908,9126554829507511,4865890043296700,3681130512911295,1189163822001088,7763557409881028,4666457024392133,2586418889903046,7057729200712647,7126776287083465,2361765179657163,5695909244033996,8647056119409616,9100812111035348,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,8506618169158638,626168875564015,2573596889369585,7946192001620979,7306522185604088,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5757452816149512,5796384473230345,4964781251513354,4122319891667983,70088873618451,3884489623182358,1677699964853271,3557713574820889,334844623043610,9029197543849729,2198108027522077,4180542909013889,7164125418732578,2908244240583723,2588162975686006,3649154946395190,253300033591817,2907874448857610,5356878132681790,3331986316520629,4882578364685381,5675714913627212,633105738161232,9157569010814040,5768890711293017,4812219920563290,5097534116879451,4955365087054941,1089272565173343,5671450707164256,7516356639951969,4926861423238243,7643972193975399,7118726016033980,1960247201090669,225636245425272,2392984746015870,5520592147606656,4632781860469952,3128705817382019,8158821542825094,5256643637594029,8154746805587084,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,1190842265513120,5241091670625443,1238619339054246,8700152929234087,5514768509078696,8494210442632362,7128580599985587,1515192525290670,5294676599532722,8875968855564830,6086409751379126,8707651019648183,2771632487820472,7885678641654303,9182108430318780,7293093929815232,8783786815601862,8197445232532681,2360605979561163,4803260508523042,7464689979698382,367954891287765,4086615967075543,976293987540186,3183706162982109,8223148645510366,8033238443244768,7315979768499426,1378353318702307,2641747955387621,958802972458216,8394425722576106,3430108296223980,7666194411646192,4836608690859249,2688817209527540,1033715359984886,4579041725200255,4298859764904490,1019530360671445,3567107464158468,5816011168292101,1448775314115846,2795829744222081,3556579375844622,7194270142693933,6644821181082899,5287326670494996,5000612806597850,6530364637157379,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,5335276921429322,5351668498910539,3285144305491278,5084161271253393,5183814044446040,5890867670273372,7882993032424802,4856610212101475,88437141712228,5253585232805225,5323332702567656,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7710155381849469,5151281455619461,6341820508011913,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,6403894935227820,1800517128877994,5926443562442162,7674181908761844,1458767657659834,5947103608716731,3555190914977216,7776477814955458,4646842126761412,2690941375331784,4782498127412683,7267065697569357,3066294121266641,78084367085014,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,1878179782938092,7864494568558061,4530178457788475,4717078305738226,9088616725393889,2846284314054133,1541930783479721,8569995544546809,3152905102806522,7687805010646954,5336395954564607,7187688514553088,6135375769182123,8985645944647986,1987340210712077,8205328358469135,5473106693410323,7906524426948124,1185378970902048,835582845963811,1345534315535910,7122433204903463,6675258019802664,177161577352745,7243701472849450,6152554647457326,2499002377216605,4393052211822129,6930698324287026,5168981785230906,8453583119834684,3401051871010365,7906973945146948,1993005114900043,3335731140628044,3365806770277969,1490649743597140,8497320404037205,9086189712409516,2376738954628699,5603043202166369,694729075228258,5862755334909540,1286345701920361,2407556246797931,2069399351119471,7180711155708520,1762891633565304,1826626455842425,2479347599965821,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,5276885771693705,1478175721172618,470083491171980,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,2379313998356137,3213809958264492,4725106938598002,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,3888158542495417,90076065684274,6133069365415617,3555666348039874,8660225691913923,5224110063914277,3818616056618695,5816608308592328,2300314053840585,4995812233531084,7374706893274831,7154763136518251,587253656190676,8303453292883671,8729737623117532,6128252439805663,984499184574177,5500657232277221,5677483308395132,3844045130731247,3834083608280817,72583097564915,3931973464080121,5985406373330682,1553419814780673,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,84834187095829,1924528878694166,5716331084570405,4440186563960617,8253731522256683,6412229720137523,3881211648824768,8910676381798199,3989388368871224,6737890810986299,3510921439481667,8605736591634244,6414585907380037,3429891841847111,4050500137410385,6355524819209492,8535608270551957,793823372574692,4577018362126171,4524906595225437,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,3333979680154941,1607268386283382,1213457523695486,4494558117785472,2569719125127041,5598069886194327,7039911616343950,8823763859310893,8599745542954899,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,3795402138320830,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,3792348455169996,1351605086977997,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,358899163144170,1189989031567342,8459448655941615,1503829884784624,7969431343923191,5631626399236089,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/0418b8351b86bb41c8224d9d15474614",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900127365.1/GCA_900127365.1_14722_8_29_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FQOP01000084.1 Mycobacterium tuberculosis strain 2926STDY5723801 genome assembly, contig: ERS519109SCcontig000084, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"0418b8351b86bb41c8224d9d15474614\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4137376921317903,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,1227254413865325,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,5088842780258710,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,3853897425318415,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,3807266757341739,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,2889839811662416,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,5080262464819937,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,8651815331507604,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,4231448943924397,8844332244629879,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,4838062178211363,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,5842852661052750,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,7982695525856751,4092526301791731,1360710405096951,6524009387461415,2918737215086164,4875820081283327,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,5461858100852259,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,2319684329502984,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,7917710442910040,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,1488198135089416,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,2996482787766008,5045078635080147,3277419547199956,6515117585048654,7703200470382329,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,2483171757361855,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,4816168309078975,2161394573327299,8116730466040774,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,8215276774560757,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,6980627359820863,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,1691698663883279,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,8170446919832381,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,854158067856595,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,8407988312059771,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,630218890143184,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,435211486978640,1514697037315554,1383806835723749,5905337141222887,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,3337568874086235,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,8441822145286044,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,401375166743886,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/09cc8e435e5570a5ba3b086bed8c831f",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000288055.1/GCA_000288055.1_ASM28805v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ALSH01000001.1 Streptococcus agalactiae LDS 628 ctg7180000002535, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,26,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"09cc8e435e5570a5ba3b086bed8c831f\",\"mins\":[7745885506894167,6567433806055429,637054950303753,2467302807214423,2072660206288908,7274999048554510,1800364528377871,4815459624005648,2128010937022482,2192983370104851,323437601929236,6602652753041429,1545920438519831,2872834522816536,251194217504795,8190248251965470,3060044990383109,7322325697155109,6426435937662641,3610785317775400,3773353977733162,508875004139563,8158765986275375,6308841475686448,4977554012092468,1583915571300702,7933146693460462,8724377094882066,7515100713246781,4628338749143385,4749943885905983,2493682628249664,1584441308936544,6242898095562820,1188735280271713,7351953779599432,4323559549280332,611013621239885,3502848667187280,3452354852479058,867322241200212,7356817033551886,2555314787146425,1839280281649243,7406259797338204,6953488243930810,6155044453103710,5479544326352991,4356343322994785,4149289124147298,3374959386541755,5049183124340837,2812233326542952,1638969105311851,2253538973725299,5370454803761170,2838821160642672,7040796192467907,8970425750401138,2193383150440564,8266651368071287,5484684251480184,1905289297381396,3119545960777851,2432715640828029,3467097964623998,8922202109069333,8364390356444683,666584281032833,3368273296199019,1781532602753158,6335553931483271,8150241518784648,9206465083179865,3315733489227919,5449001504919576,2087372917328018,2560934570151749,8440501395825152,3095987527618712,4346749751681177,4036131335542938,9013940932122779,1942792329326749,7758187017961631,4924083311995040,8273070568140962,6463757665415195,5119818320679077,5449478180878502,6124778959399281,980192377581737,708971273560241,3544349491103922,1743342386999476,6040021320961737,3302400559165624,2114226274134202,8616285535536133,1823797167452349,14548618614976,8834426272774339,1994043796965572,7200084341498053,1896367566221510,3806220441008327,2403665386506440,7284600262248981,3588655797319885,6714958503191587,3560228705937620,6184663482622513,2185304098267350,2446909989337307,141979745857053,8532060075253984,3966763500933346,731197349271781,4629556646286885,2109507371112684,29170977818861,865996418951406,1564332663333104,4134653119830257,9096572428034252,3387202127528185,4661990414778622,5842988991232255,53784788947202,2909527281950979,5334823833198852,5895157052585686,8967047611355521,3781288969091338,5332283631235339,1949736161202444,4896779007691021,2474439097434383,6010801831682320,5170574699694355,8813950316669481,8939030350366997,322193728336150,2886074231266067,6997955492576644,5769325629487388,7043667795142372,6388681521215777,7754333812920010,5010225398958374,299412896225576,553364134428969,3127425923547435,9190011301307101,7125488696234288,4885100191999368,7350109099049266,2710073402597683,1586420879567157,2820784308517940,3097175131750715,6500618335318334,7581528718356533,3292974780223810,6017037957524875,2094125459270453,5886606438701381,8252771381627206,8425319925461319,8925490532399168,7886420964344138,5526899722453327,3902046231603536,8820578162101606,4958514657724755,3603298240915796,6746444219631957,2176052431323479,5469225494673753,2695452998164826,1597054581662043,5683053052809564,6498560078797149,4284654792620382,3749929748070752,1181159360344417,8015619107047778,1153879012473187,1619498588848485,255778204572006,2359963829813607,6628506778751342,4513800353329520,5725240314644849,2661968161380724,466901218972025,4423105402464634,7733059655829037,4554243676584320,6060962307856448,4732354961607043,3859768176141718,2585365975265670,8079236149284553,1612172434248074,7883316285647243,1731684652662509,6985398460270993,7585854855621699,8512258147529166,956953435203992,3483184321171868,5222736786460058,5358404762972575,7399617416331681,357949338861989,415853640031985,3074731315022603,1149194215436716,6025501300735730,9065167691964848,2723450353215921,5541318717243826,8098865579702708,2459376462659513,2769293634884225,3386951814924731,8310133285278794,1544370683095486,4220735790920129,8403670325916747,6706132606050191,6039582182760182,3049046283315654,3303192434354632,1861076218784204,7161720129121419,3835306170673617,8379141009478734,907992260708823,2531905761411545,2465422108461532,7479851379706023,1636425636205425,2760408604285409,1290510064726498,4039910634716241,7565039146054122,1611625952291307,1925335653417452,2526760167018989,5163312916318702,8351706294936048,5539413386469874,5033799853912564,5811561537718773,8918700470512119,8550731685413368,677544401975039,9129251368448508,2103176203266558,2795411769948671,5908806989617664,6583373875813120,5413979414774276,4263425036511753,4221084140823052,6805408552477197,9141370607307278,4771765209238034,4383259090082324,4192293596170773,7927199547204121,5480215604548122,7083260393283463,848447525773853,3154161325603359,4477917980178978,4385758858877475,682858621298438,3477929918153137,4500835949074985,6624634782751274,5501230936840626,2205592691550767,533228251765297,2512612219918898,2318947062448692,6016727388101173,3330027068738102,8889141490293304,7810961486262367,3575481546420798,6278987952755263,4256457228369581,3957391503469123,4948684950313540,2450984467884613,1906101459016268,273608292418125,1234941514863182,2914029033738832,4629253890845265,4035755790248530,2470345337021012,6373280324495118,1146882209247833,1854117026745103,8337159786734172,4086688956045922,6935182864603747,2869822072668772,8828444920353381,5598815091765862,488494175322727,5254649923758698,6396235830831725,2424599423138415,3751114786100495,8070578299496552,932178895239259,2214895396319859,1984379047705204,8420455028734582,7581223505422968,5155284664640124,8544982933236349,6290322758386303,8724282772025233,1955296063373953,5393276705395330,5128545203526276,8170635119035013,1798137397691015,7007491519859820,6675638398170256,6716022066650903,1112236934484623,7777158039777936,1952469414644374,1738696817592984,3162350095355325,3328670341530268,4121637653103261,224493254852037,3721299106824864,4043136153544816,8393802987553563,7932161444436422,4993027147319974,8252015570860711,2933958424259241,8803210625497773,5372796831070895,7427058485889181,9102992559179208,8720011720241842,8401648229573301,273485874440886,4987656069974713,5837351034720954,8940515860865725,4827184110447297,4145126986975942,5346716707668680,204487741417932,2435570503144567,8651570273151907,8607342092743374,4583781422514895,3291645751249621,805721695650518,4161832816007901,8118347973444318,7627262053339941,8263220511998691,7109052087712485,8335445635812072,3321342241995500,4768243700970541,5683776837505774,3159296621531261,2806983580716869,9176523560816083,7156450203525876,2924816143899383,52571308105540,2883223093512954,8824540959927035,5893647951008508,4707805034373886,2192147485750016,9036546160535339,1492251486784260,7440686522536709,8335656947153470,368740955226888,8325716076098313,3329795469925130,3281621415506699,4892655060232975,8953229822404056,8432821866570514,3850275206925075,837834768880405,6192049204040470,9016946924354329,6713488951515930,585099434228507,6066160852181789,4751480609905438,505235386671903,7974987086782124,5705665268381830,523328868326182,1259463780279079,7888076370834428,8616956064653046,31272159636273,4845336849900338,5143634436607454,7003383978386230,5972133665618744,8973228459544372,6614199025787707,4759206978737157,122716683612989,7575512257960766,1242790438826805,472471849055040,8174603362594272,1379557076841283,5673608746190311,4561816267107147,3664661717033805,805950087326542,8328206332216093,999048862167893,9030725854862168,4137348295830361,4305723202264034,1691404797389668,3847102764616550,8868358137144465,4498080876188523,6736007448310636,3223600034470766,2934032762965393,1016415816014705,5414395420332914,4216112877345651,3398053590266747,5750361275085685,5095102630798198,96597824427497,5940248825002872,6538842300570489,2970182584626042,4408724138873723,7871252503714684,3567746304686973,2342476321722664,4337359305679745,6390667292649084,1689930299245443,6367122374945668,4501596511148935,5333586270317450,6256465120232335,4963856535245712,4123542447502225,2645450763803118,394260849124246,4421404974689176,5292903568520089,1016454242034588,5738048437017501,1233757647264670,4032421890750277,3256416179387298,4458725998023587,1426531157664682,240412212003655,10723812531117,8948263734377390,3648834201446557,4526158072245168,4683278107202481,7818456045191404,9001742592101302,8067340183535467,4093051554120632,6665152377347002,8311782861683148,3699865190155198,3612996123663296,1369205082721217,3139573235102658,8069987517379,988989406948294,6913463783224481,5593114550686667,5583843905027020,238119321428941,4141491062987728,5991981154528209,6439386591206360,221786539574233,6732187105323013,3010862254150621,3099923669512911,8103513036957650,6769742254814177,1849694366383496,7197613786377187,7061752088247427,5517790552499173,3781457979204583,3003527234868202,5176519069113511,4834156264887276,1270656991462382,1406873713255407,6205201025204462,7315471614026738,6575590450818036,7025054226518526,4951968113867766,6231777211251706,6637416474584060,6481044003706413,7466583947833689,5478181869769729,4174600479527938,1999653646355461,8984342058263041,1705946443549705,3060143544607754,4516237174748171,8651020756049410,290490429135891,8853998147986606,7233170992505879,8203496872795385,8957595600141342,6480309178909727,6392855210496052,8981536781093636,4250350991909922,5062309078350883,1105736160400421,1451855425504294,3622822712173607,6049045425931307,2180369705524269,218618447053871,5971210462258225,8022189547581889,2109178863713332,8942975923117110,9092783540908771,1660640136019001,3442747225994300,1178636490124349,980231430365058,8058674542763072,5485169299285059,2015449061774404,6413726186468937,653623325992009,7174908036084810,8316874298710199,1581641536289870,8754386463958096,623532151514193,3487448754136249,8170766685143908,9191040206283868,7282004038388922,6635160024114273,7520686275155043,6672878101273701,3640202699592807,7867006027574378,5035391974915180,382549762671725,4131465460483182,6681733489367229,580147590546546,6297383723072627,5878571743960180,1181920140760183,5696731108191353,2643830939579514,6932565419603135,8882946560545917,5324290291671573,3947551853074624,1630581459799171,2624562293632132,154822611013484,2593734512133259,601271868032141,7618603517828994,1112369319935865,8333146531216529,8304720044555410,5484950513429651,373640093670551,6847685066859672,5586476870859929,7606457414311069,3431988174714017,6443974479445156,3751812605893798,5789465279904935,4967392025714378,8862684884266404,2156350654411949,1543286812204206,5116370533921309,5174233591862448,8676467006323891,7112196106409143,4283102785635513,6030213737082042,3479079040117260,2759722752799605,6034308066780352,2104934789528769,4567823400244418,2449514091459787,2187696685204676,7457212841223030,300075545947334,424797188129993,8932656186488010,4080755185059019,7398046079251660,1729815678032418,5567878247605454,3707225741780176,8563489662450897,43440479381773,7035860592594133,6994161362468054,2866205853299927,2377857869423835,5029151592889564,2881500758303965,4344979243521246,4300884233952479,1491850091633888,2872185268032738,4818737392676067,8199748430159076,8530426475949286,554386887894247,7402860044445564,5589977681485034,5682805070056685,4078854208686973,2928463070219506,5528663363851508,7533176941290741,1388095444333814,8476846512651817,3072832372342008,6505663417736404,256618765352186,9064493445051644,114669823841533,747137179350272,6118579559798411,7675057764113622,8975003915937030,6178565701352712,4313501022424329,5852400223403274,2680107776902412,3573360247942413,3925091808402702,2989944884148781,2892038542900497,2449614481689475,6434827669775235,5785453384770840,3099810451107097,8752804601726271,4268094994806045,5271657513422725,3783918863394081,3609776238564642,4331261096562566,2302084368528679,6984427312583976,3021278781870983,8390795944092972,2719719782423854,8976716647468253,5622962571355440,6180123360320821,7073017765053751,6931709116716484,964245259877690,5516674936653115,8089483974192010,2791414370585918,7733119658875445,6923723216282945,8912566481681736,4182766267917642,7788781166697804,2726661014998360,7799682966708576,6177967785318287,6086065958821213,7425495965349215,4749559399496592,216115475103291,6857739062666596,2938896543169894,2507699942245265,625372516662503,2213709083912091,8993120121490803,5734860342607220,7069176275453301,172869501672826,8962023645993535,3497137629812092,237433671335488,8813786907987331,6355679202616708,7970094452129157,5260243991025030,2071436735602055,5560928694011272,4215211698746761,2947746662772106,467054035996043,1606982095562124,2129736225543566,4767737266040209,9207082917891474,8332628223692180,2410687390037397,5351330649515414,806849363482009,1100360344927642,7937292877919644,7777716915578270,1928028437387504,4746737383225243,4781478713951652,8619380621530694,7058928444982694,4599245087240433,1553966038361512,6056642952768412,6730227342869930,7843140621182380,2438142933282717,2811466481968562,8670638061649334,5822548383249993,6110201721265592,2952858366250916,1345155944928842,3116920505742783,3475520903218626,8184316467980929,5993384056784324,3489845972700406,1228383557508552,8978952786558199,7436327285478862,6668489583339085,564779998352848,2037541668445650,2096045439237587,228544163730900,5946994218396238,394372511145431,2350481807134168,2729864226776996,3386138147206618,1878354874680796,4381212342857182,6768327820611040,6431817917299280,6108221743784848,7988171392753124,7959166664167,3549971138125289,7428610813505002,157788216575468,4158805276599789,3809137768871406,5291620546351457,6878617522511345,6521958032739826,7745661459631610,5418905744545277,3472154457067008,6495226706816636,5514454527667714,7600929311346181,5950556888532486,7448592069844491,5879321577822467,8367228559683092,5489497385403925,7954480912337092,2622830969427481,8096912461684250,7792544386012079,3247569991222813,8492087877162245,2383241900012514,7450239558424100,5418798588638757,777519130922534,9005662883313192,1663013605420585,1161221210564139,6001311476866605,5664143974864432,412557450901043,5476448301602359,1692111874950712,1913982499925940,7344439814606394,2552509139146299,5630924496250431,4014329963730496,7264206565826114,5836432012101187,4446260708097604,4672795096225350,3723126319057164,2643026943675978,2085710872409676,5827992647173730,8052764783766280,713567619835149,4351859366984632,6796418607835760,3372450823118777,99226194853464,2749219284553307,7959885257031261,1479817349840361,4455067443703394,542347747397563,1780730788095589,3964145196887654,4768934288635495,8156844276544331,7621009901064807,535300047382125,2300222396604014,4753396524834416,5819745389110897,8182238590052805,4362288908664766,7983860816246390,1156108050433660,1747000939144829,6640514042728062,2613783205844608,6866316274355136,4347066209377922,4222163255182981,1385018851278475,1968893189861005,514461283214992,5748144300050065,6654449291878035,8983992910925460,8738486859173701,5182428587179674,800546495864476,2019539798638239,6324765148661409,4908025538698915,3896671433119396,6357361947769798,7136012144957094,5386497710874279,8698398145199786,5391776708921004,4052748445792882,6367577402940701,5710596708265648,6373330772514481,8390594178385790,2386918403562099,3938781100779189,216737473498806,5572818005833399,8970038394351288,5427705806786233,5880177458605754,4040944013622971,5896471191731480,511240224997055,4897340578724811,6171245589556355,7114995602014497,5950146482548425,5491074085512906,9070402820426619,7708430225000141,4450124038457038,9131740267139431,7870316659932882,3753320061171412,4916189093811926,6926558836807723,7716611290015450,3810144389207941,8025528026861279,5182361721536059,9214145374295778,2147842615531235,2206972604665572,2130773237958373,3570615593907942,4450274794075879,4875572370337512,4871796500803305,8671225496850299,2626745603923692,1146175312133869,4430135302127342,4268011721070319,2624335787254056,5154074169659122,3000266998964179,5007282062491382,4804206315215276,2675369364850430,2030618707435263,6171499794036480,8641193387216641,828780722269955,7430922500845316,1186779160846086,1669792714267265,4439013461094153,2570894690981646,447480853276433,521122802315026,7900811917061731,715132890418967,4869295112290072,1264277139861273,9000450402393516,2205459406757660,4107945624743709,258966123892510,6735389054023457,9035913137708834,5244504005756710,371564178634537,4339332603452039,8943693451521181,5969491072476973,4370283091545902,7983377776929757,3413554757650739,1956420858767156,890525521766366,3407083184643895,129376156919609,5262376800956218,9004919024464522,278424562140991,4917832349669003,462994517233476,3988100216903493,7046692682614598,8896992930547857,2864299892326217,2358456798883661,5396090123378510,1106734982606477,7487024420109624,2239451074248530,5691707320344406,5724444932389519,4229439956262202,1990972817200990,2669104254599007,3384549077728709,5464913272330555,150790534680423,2806615826517864,1289179486411751,3393171666491244,7723741625056184,8714032285900661,4146898539290488,4435039178995577,7323446787653498,3429486041905019,1754495676564355,6619486196778877,3408522629369726,1949216357649639,5755171203260289,5758337377699714,5504301168490612,4485575214997381,4687173878568838,7040949930149185,6250477461964681,2975404289093514,8471890576955276,6999719716469740,3462998347356046,1550400808824719,3237022909847440,8543061920066393,8302591021363524,1983935728926619,5809643619180445,508998627534751,1133310688819106,5597648286627748,1542703277987749,8743923504582590,4796655420284840,6186058106527663,5472028793943984,4762684868288433,5587782360416178,1369870763644852,7598305531500470,7635363537405879,546591933775800,1122230064713657,3484971650766778,3825827044534203,8938613067951434,5324231945818046,6083451943453344,1246183702918134,2544593755300733,8967917330335689,9199865931098103,7535165453457860,4153983858100174,8665489840902854,3275267323168722,4904175743481507,1772300838092756,7562319471464100,7331920813030394,3964273544363998,3068256189978855,6517628072808416,7065259048194384,54882516983779,2932440824119268,7128341469052903,6047990553009439,4249744670939248,6662281325094890,2004534051471339,2923534049213713,7862972567629262,354068754173935,6761776305419795,8667042603863074,9188508815290358,7180162650134519,4054076759113721,5859927516131505,2647109273376767],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/0d5e85e6ec8d82f2ae38ecb7f1394a04",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900120785.1/GCA_900120785.1_14722_6_47_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FPNO01000077.1 Mycobacterium tuberculosis strain 2926STDY5723547 genome assembly, contig: ERS518857SCcontig000077, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"0d5e85e6ec8d82f2ae38ecb7f1394a04\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8630172568446706,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4137376921317903,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,3853897425318415,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,3807266757341739,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,5080262464819937,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,8651815331507604,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,5842852661052750,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,7982695525856751,4092526301791731,1360710405096951,6524009387461415,2918737215086164,4875820081283327,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,2319684329502984,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,1581937127016009,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,341421648443122,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,7917710442910040,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,9177142455007585,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,1488198135089416,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,2483171757361855,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,8215276774560757,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,1691698663883279,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,8407988312059771,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,630218890143184,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,3337568874086235,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,401375166743886,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/0f6508728e178731f3884f59dc7ff3c3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000158535.2/GCA_000158535.2_Fuso_nucl_D11_V2_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KQ235715.1 Fusobacterium nucleatum subsp. animalis D11 genomic scaffold adfWA-supercont2.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"0f6508728e178731f3884f59dc7ff3c3\",\"mins\":[1921501536280577,1453973403158530,1619992758790148,5166845965072391,876951245633545,8054577749475671,8346026992631822,8321649689355811,9031460185835537,8415417225633810,970615076597781,3044225977894916,8135787535227471,3058441012264987,92125540710429,1066808509833171,9176968155656163,6579602811644866,4142838224431139,5306150005907492,5020053744719909,4829964828284966,4808514984801969,7598230547734568,613621131075629,1615777356736559,4280002548869168,5916211382317105,2571578695895090,7280637619939323,992011096680505,9028476606580661,7794591633195068,4055433308393533,4995620565766837,2852373537677376,2199040059988033,2728533741502530,3173438862934083,6638711982149,3232167276130375,1134838102796360,6706601619544137,9015952737141659,3584335143819342,1016629805772880,6439498032033464,8509093164701778,936414268946515,4959796498571348,8575263066913489,8962772397852687,6634650891522746,8555697486286942,2676593749274719,8016042530670688,7279359702239456,5169374718419045,2886778369378409,143794501797994,5074055070216304,5741099519088753,2273605210466418,3329152220653683,714942956642421,8395566282555511,3727331509161080,3091847985944698,986203570950270,5978710217023509,3877040971196614,6911498728218754,7117674671239300,8954698101257921,1357479603245192,1056441933575532,6498734248606743,604586946527374,2826669757018258,6019495904434323,380305149253780,4314544989436053,5570948255307927,1645924691556505,8830795275497627,2252517257281692,2773447100697626,6921208712124574,6343680352950431,6223124021872800,3991751466342768,8152525645225721,7126996111616027,9059607790467236,4382831858135205,8290503885537446,2258341767954599,6220046701488296,8679044814017468,5911447199115436,5248594258084013,2111380492943389,1785716300601521,4624782575634610,6052424182518131,6759100622554202,8343110078095920,2940026187708604,389611318787445,8146759238430719,7549223516051423,1705078242975942,3646603145818314,3805479538286795,856734554991309,4040956802292088,131172340766930,7760593577250851,1378683327585791,341038708719832,5700207920167129,3141105317652703,6213477655736544,5496638907547686,3200443816018641,4362397388312811,6457577560522988,4406391608529133,2158484813897966,5688467556047087,1450582307055857,7046634377228531,8779893663858932,2454894552148217,406382338609403,5020354681170172,2143569190848765,9007377903035462,783319723524351,9039458827616752,7847582725095927,4084980797841672,2734831104581898,4200309307101451,8538295505006860,7362312777924877,6624903727210766,7172774257984557,7783065338771728,7557141247490323,1547212838048021,7008554350407958,2492619447095575,1212849171183898,3631855199656219,4425500710082844,394423898753311,6292026574131493,4051281469919526,8839598049958183,6223790566275369,3362727443435818,220377423339820,5143558629615918,2923540046420271,146461590059313,3876055899187507,30335183847732,8892490543059337,7966500150866237,7586598660518206,1129737065138495,8927446741170496,8691846823655136,375108370035010,5807333601323332,1992278073436485,7084751777345249,7412577422490005,1902686608187721,2445019847164238,4762520379285839,4645272506162232,7736824326140243,5979464428939607,7845382462381455,2864769044248924,8655932228460895,4829976191850848,7907588546722147,3649538037829989,7792404783107473,2532979371340136,8609349839482941,2696486627932528,1722868294674801,5518834397090163,1176739069845876,2377034030948726,2996982947734249,5258876088279416,6503488393748858,6048590873979967,1411287364583805,1794623982798229,4373258946390400,6184802856540661,527769316948355,8345289773805957,366779210260870,305539490523527,7916464130021769,1541487338379658,5422017624314253,7993180823921041,643503390237074,755047536451987,2797815994719988,7154093843769750,6767578558196857,806290964191643,6242812245047708,8474893047859057,8037793897509278,1063097260972101,5709484313829795,3919110229094820,1282972076655686,5533074560555430,6064154101387687,7054568510056873,4823565916563884,8042252984166830,7836494655611311,1970182084757936,2328438846171569,5752606717749683,1832852794046902,5081714524901815,9062347591823123,1214664512625081,6490556498214303,7250081195418051,9075783166849476,4706609012742598,2649293865071047,6974385579058252,5212290507232452,7813279507273924,2107214412503501,8482782953852434,2092411246887376,5146006387499473,6765073718608338,6808037433836963,236123854563798,2378431304427991,1711820072595933,4977078449268133,7749400033782240,5018765312602593,4761691458741169,6865190830523131,4700385497154020,8033302281131391,6797214940934638,5128634366720496,3480222783025650,5670248769541203,3489873432633086,8705437021811476,1808183513297399,6163807741927928,8762748840173719,1642914306034174,2538945397828096,5465648714533381,4140479443102214,1923023666506247,3589298512368138,7292582636794379,7144143311837708,501677499720206,7330290258263163,8278422104846818,5195311261645330,2769915169202707,4864276276066838,8451610451079704,5075834219272730,4368130313460252,6196731331770909,3913377740266016,2965361534243248,675071736364123,4785843551324708,199736762386982,4892390933549489,6334914939253290,2797178696559147,6428607573701165,5923264931784825,1721872474393135,6074454812009008,2928102520850995,7757677776333368,7180894104003131,4506256803574333,4372607450092095,2765144393210433,6813089004526146,571404129769227,1440581976279478,2697926885196359,8823125521499052,1560543153125965,6082764617026127,9215627702006352,7127960990896722,4837730303765077,8373754035485271,6421342864527960,6978631875560025,4890766433907290,6536544766124636,4325241302575709,5954846451246295,6044963826731615,2322922173553248,8784588180406881,4338203933225570,5488887439356515,5880059434557591,8842101578130022,7153183136072295,3637549606304362,7714840437164651,2184938464422508,259246292261486,210592425704049,8008116499954454,8835569552248175,5110957727320692,3778930722398996,8692316393164223,7807635529343616,4277857026032257,4815116062702211,8780467305540997,7910678411387670,4019648836094603,3183069633309326,5848829438757795,8264494847044246,7847340320488812,5444958598278359,6667820508584702,7116303477217954,1952039383732899,1708498336936612,1888638602367654,9182414585227377,4607800136209068,7701879984839341,3291296427186864,1552649062838961,1690593476479666,5384471849134195,4465329893239477,8050365369946808,8843304721552057,2045918707137210,1574629933556411,1382371280247485,8191794633146605,8513373236212417,4642982459763394,5295766929722053,3653990028669639,5830110482434761,8544916636689099,4508549033661133,3366171906724984,8551802772890322,1501214029988563,6636162441366228,8905364399909589,3727038388962007,380321161799460,6289757601719123,8804754683538248,6328329294925946,8770428614292190,4424588095079139,6696077251277606,3961671089683174,6935472901570738,8455305734605544,482393994742505,8062688869378794,8618446104449772,6279906249370352,6498781657123570,3150290293922548,9024981037515511,2233091628989177,2864797338696443,1947112526154493,1458186724682494,4666987095843586,962993026343683,7927447866306317,4566728628691718,7289221012675335,191220903355146,4124342215916299,6877035417546296,4504949064282896,2355489503884050,1301764334961428,6493770903425813,5971973024836374,1271463884485399,5973141446751001,2873240109198106,7012373364245295,8864831390576090,5145947966561056,8058787773989666,4219060707986907,2280300153864996,9002809334578310,1172183236678438,903051685047080,1301910112660265,8254585615874858,4072479744056108,918440129600301,8439085780196397,3465414122598877,7065524630940465,1336849730378546,6124745312615221,5277311943361334,5299623349449528,5719916841890619,1867142242726718,4980472803791680,850760279063717,5678118252196674,1278118518137668,6657068122020662,2775887014349281,2837810276041544,5812179959122761,3515340214451020,3678982357668324,6211666562509646,5794606767721295,1770164619476645,3057225903778642,5926214970143571,3274274021071703,3541503425377112,2839142601561572,3418101200855899,2658680815446876,1675421004686174,9093176700529504,1851402113246050,186719933125435,3782715850435428,8119244758584166,550913080832871,7588509891779432,1013866464869226,7338146567705451,3531025993925485,1358265079735151,633734885379560,7140006860794740,6465983005742671,4952451257574265,5300034896888698,8323577040318613,5837047634250561,1507953756218249,1032304154839946,5099248411636619,3581145559415693,2103550827662222,6106735858705296,8756226313414610,5383363895247764,3103282100917142,3062507855969175,3179912315136920,2704990326119236,8648704748000154,172040289611247,245726452403101,2348133463901086,3390032317041845,1225191030940579,2288363420885925,2631291200443306,644241515850668,550825981776815,5200526605503409,4970407376300978,5512777574605747,6057276330624968,3591552047266741,3226921482122169,1261349641221051,4456780810943420,2049978599707581,6101661559036863,7597456768796832,3595523197776834,868118055039941,5733740152573008,4205229397760844,332232585497546,5735430821471179,1158174299677644,7166329560501069,405368085875664,6381583870157777,2971691398515667,5372549637020631,8794438889712600,9123512685325273,6479518110962650,5523913073076894,3846713444473823,5232373748421601,3556247096966115,9221686127579302,3238688738965671,1356365679522682,1718835093253104,3157378904095731,8650069697547252,1249035245687294,5736448288582646,5595866192614392,3579041621156857,8401316844961928,5613235037180923,3739860273007612,5670466252137470,3119478972939264,1768295765242368,6918448812977156,6425501107854341,7021469668116983,7375587344337547,4427056810560520,6525171075525641,6853851793955850,319077875768334,8609218706364325,1738256672252944,6648779179195410,7077780583191573,6063950092813145,8596034881844249,1090113022991386,3214265435528221,3529943618892830,4508271926600735,3052860784204834,1816240488573987,8026567848438821,5003723430683686,6029777431489575,8383799844948828,5415751221306410,1907473685178887,5961169000188082,4739173275808814,6397999699244081,6563289618923737,8494276111281204,78617404435510,8292409291543607,3276437134904376,6202983300750393,1850583895692131,3154013640404030,1791448204778559,4172004523914304,2429694087134276,8759949834353258,1263484184169542,8741263598085191,5764338352262217,4806749511830603,6565489579562060,3716603393707085,5214183786757199,1653683232326736,769225865030739,716774309885013,9154733600398596,7466640053193815,4960855584248920,1859004739998810,2256025365197915,5567189344517213,8234909296086110,409266724605024,4220018709845089,8118658617129937,2803616588578768,1440153384332391,8667715371042749,6774347629502206,7953885216350203,6943741386185842,2138464893521015,1967281304425592,2665774846446713,1023066467073147,110175613181052,6360197419754621,351362383459454,3768507815619712,8943554279087296,2982949541061762,9103935255769750,544992822209046,5708952192164998,8069101369130124,1644247188147346,1019486444510355,5061609047192729,6427362710295706,272083135769755,8052178609925276,2335724641891485,8919633390608817,4309526919494815,6989808978254931,844788277064868,910313582171301,7412638134027430,2487723439938727,3360327875378344,257179255837212,7769298659374250,8623400381115591,8674844894938284,8124956083479730,2191579737191603,2980853760781493,5593513795497142,918222839620792,2824724702289081,6796822072186042,2683365555770557,1578383119363262,8187531801242816,3498413503573185,3145941098357956,6399666830818502,5297041332456647,7610410180885704,4465551220954313,5238187715894474,8190607273454795,8389523625452205,824468540978384,7530999980927864,3337734908810450,723484082760227,8164762792874584,3581658855453911,7071458465230044,2485585773137117,1241009832948958,4815632329297119,8901722639187169,2855813054504162,6338931123512549,2681206148275430,7356987425862887,6515609015266536,7186839430079721,7209039282109991,1183807382696146,5987915767004398,906432985513512,9085894279786282,7166860412280052,6867647444388596,4870144927927542,7270448311565560,4280143267757305,1947499781258181,5672630140017916,7058466816719402,909219415403775,6981640861488029,1981075957232897,5066261046394115,8059656339570884,406994079745285,6951057950498055,7439262696340035,4755649083211017,5099083247371531,872315415426317,111640819119374,8242871705112109,7308015861263632,3563666451876955,955491515129111,8649253214948633,5746392162512155,2221361221190940,3248695031523205,7694978699201474,6534133292686625,7993956752233762,1955384049702179,2495112114005284,784692985675046,3449889726786855,3289525732328745,1121760386155819,3296431086204125,1480540179621168,8809602075241778,1059211057179955,2572096994067765,9101938963475443,5424562517787959,5679092243060024,774955726036283,1291332850175296,7232411159785696,2654556130710851,6018042609341767,2256537489485128,9139849327328319,683045459729739,6961232810290508,3160660192247010,1111359353273678,9019191276074319,6162438954248755,9152917173146630,9094264319315855,6120298850968924,2409279215068509,5491659924944225,1196133641715046,9058912903673843,2377872438368466,1005344578440554,7637072201044095,3374132698774892,314727664924015,2114927241264498,8368770275360659,4763452234368373,4958896865426324,6808860068275254,7571451007659388,6931947549393413,4064800214703486,6525221828926847,8347512842010079,8843927498158773,8807974924944772,6041324555136389,6799366620540294,2215127672953409,7563418963123592,6163190252019081,4672284638942603,783648722367884,4736356241229198,2805409999041935,2333905013851537,4791979849131411,4721901763507605,3236481982221718,6984125665896422,6568905223864879,111683748857246,2458620530617759,284935814303138,3302234516812699,3181822992958885,7033555334632870,156688897901992,485567135802799,5789087425928624,8326941764175281,8068355237275062,1868321363322299,5808088924607935,8640568647635884,5997722777796674,1828888968414663,7416446990409161,993727466794442,8397902369273292,1513034772733858,8586331054747088,2561578770101715,7510016814337492,7656953119354325,6298924315106776,2963401228060122,1838889559598555,8589505100651996,4135277342670302,5166875054034399,879665358689760,5438203884735970,1521093242402275,5635098938834404,7383869897200054,1654156578973160,1975120883518953,5177657761278469,5736050531954941,670363604942321,6314266130245107,1508501663669956,1512467815017974,965084894531063,445688330791850,4600620137352702,2129032178471509,7862362548862467,6132125579640325,8178098364620294,4216512598091009,6605392439819180,4030715765601803,6739082483596817,4195227942641170,2609758719503893,7529438714615318,7894029762474585,6810532665660953,3287741993164314,8098889406834607,5109077066896924,7330251242741277,3323374303346206,2869082891031813,1582698820621857,4188890934433315,5954245703499300,136006741872166,1849530970082225,2120462724943400,7700038738288220,6922305868094896,3947242840251947,851736094191149,5273339511979566,1189405899003440,1812551945580083,1127467651200566,736802952805944,8812347610026868,1282743151398722,7963756955682367,5012990240239171,5275168499906116,4670820491189831,4716104657135177,1898156233586250,98092805557838,3576282447101197,2693328966813264,4353399975618130,8200204511417939,6216050752484948,2635766703248981,1960476592550841,3410250021445211,5440046758256220,6164261240156090,5432357977677408,9107299825023248,2196416643916731,8350583387729509,8781168933611111,348690795204201,5766968145694315,8906272289734489,1636529105283616,4992941930186352,7062274944708210,7696407125005939,164319445284468,1213003453830774,5859715687034473,7079961704829887,6063831010752125,4445687229298302,8641460263667989,2296322349919874,1417205788593796,9180584457946757,3100813449192044,1314858907332887,2009643573671565,3141661644912273,1216468005332628,6121285018738327,2197994135080601,2105005613354650,3836161774306927,1576468563136156,7544065230866077,7170399481675422,4713281341118111,2339220092180128,9189018891051673,3780372596145826,6169412231806235,4862041538895524,117973786812069,6029573259929008,7984333195333290,8954925312738992,181446550199985,8511427628590301,5763114629099138,3936376279111351,488341429323448,3786252044148417,4204085451683522,1805568942330540,4016825720600260,8562766467393221,2004226213459654,8656879189157577,8976085442307786,55372034238156,5990976471049933,4899379909414606,1875755819017937,3059980324679379,5752560944905941,6894897378494861,7205447140189913,6683220792430299,7369594957240028,1719536393899741,1057708628696799,4860186969325280,3964422785810384,4893267730278114,1751116441059045,2398140235429606,1181653800341223,370445325799145,1608002341552082,1701035802377941,5662175162140403,296825508208372,8573132689176190,8491290504967927,3872601138089720,3576091638015737,4142222280277754,6643711682590459,9014939053160339,4824353984403198,1178518215165695,7034119045342976,6772614257452801,1304406376241836,5968531943059205,5639103408109319,6135763126429448,3820013766248202,4186532744296203,1702547450928909,399825345730321,3471602647924499,1096165895276308,5857488951558105,5379310215859993,1661460732397338,4760170679258916,810274413930801,8357862761142056,4026639648069417,4630422589726506,375839227651883,5478510515754796,2042256206079789,5118371211752755,4207006639933238,5673034164927534,2237353638993721,1376361093609439,7326458871617341,5238632558028609,3467673888825154,1819347761049411,8372047529064260,6740219540241377,6789396089163953,1766703133843275,5684311604501816,6082184802000723,6052514679203670,8238863540080184,3915343077752804,1969888889126747,4406156157296476,2196936952340323,1148845178855268,2444781459981800,1660093047848806,2988849241540455,7606373628698804,8051366735207662,5643506010073311,8684211038763325,782760297033585,5643185167110002,8457637152313204,7043904157589365,243227323484023,6022882400335741,5981695497869182,8932807451597079,1503884096474091,5655368429383557,8461138363294255,4667330514306957,7437266830582617,6343002821788653,2113352743696272,2295129240974659,6391996287174548,133960643833750,655189037707159,8047743762132889,594852629507994,6380763084320706,1102434746849184,6757986518980513,4692268854292386,5987890216212389,3275503601928103,5182723748587435,8698463241398188,8390554461904814,4969022907654063,1892998763417520,1297645736697777,8627925992433587,2449940538363829,1913983081525176,1049971017272229,2586448558696378,5634729318115259,1598117231316925,5134411264899006,9023988563627680,1318043416915906,218567238600644,8761607589535686,5559659666485192,4968487556865994,7230279711277730,4503032258815309,3240840993540048,2971689772781221,4992826940133330,113246384472739,1559848577720654,2304560755804118,1335463458506711,3059016396498904,752027508504537,6340876682563578,8218436043136990,4339538996312031,7218780838771763,7801227956463586,4533179311142883,3923665033910244,4136372311250917,359381264838630,543939725991911,6649415236202472,6902938060965873,2149755353269485,1562068078856182,154201105577975,4011931099385849,2222155766802426,4196530426560511,5111907908151295],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/1131a68ec746703c8c4a2bd13557bf6a",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001768285.1/GCA_001768285.1_ASM176828v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MENN01000001.1 Bacteroidetes bacterium GWC2_33_15 gwc2_scaffold_108, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"1131a68ec746703c8c4a2bd13557bf6a\",\"mins\":[2626832078774273,8100094856537965,8101308144119816,6255172288522,1764329749030914,3645986610073617,8005566484983829,6142427182403611,3116477263982625,2144565564174371,2581368415236132,702840194276482,3557183384793127,8064860864831531,3114911184805934,520964720897373,2569319895494423,5715897506902066,5441867976912949,4871101987029053,5363698073731134,720817318752319,4306384303013952,7125155095576641,1208744918855746,7441649594559158,8225131766654797,8383226337550412,7731762013663310,1748334647379981,1272343702143056,8520391232749650,3703659079938131,3873405737422932,4846872623845462,5817410771116119,110604391563352,7248767857967194,6869924685054043,39569887952988,3049760369967197,7491456748253278,3335388196716640,8768300417658086,5606744980119653,3578103233232999,1051907288694889,1955631535743082,4678955476983915,2029825398751341,3689020628428281,6706923253543613,2937406609399920,8002921392091249,5741199155945586,1778201751626430,5194867271127159,8519442902355091,1131477915383829,8902859067269249,2089950681886854,2676145124851847,3284121926017160,8531020050649226,7679069400543372,4910984018497679,3555387643975704,6208098594422930,5169782273843349,404687851352215,8852120227938457,1841239921959066,9178351531581596,3171277071687837,4440260352386555,6202731454242976,5106899477561509,7606820917051565,6420417286758575,5114564922863794,7097902936175988,5633057534729589,6869008910651585,6944305076453570,2453915127230659,7763310175561076,8416107186024527,2803159368507595,6268386520426530,942008089080016,3727142037684433,3589552170365138,5342568984846548,4783032924418263,636937729274075,6924950465163484,742135353696477,5177419228392144,8848673593311458,1768539486318820,5815528261181670,3065656546902248,962149741167996,3116354504716523,5529056120570094,6944445017432305,4273752361320703,6323252364144897,4031883556917509,2815587817668876,800430906589453,1750723823468815,9061135788716307,7661986183870510,7982571189899545,2555796989817114,7050162566709532,4886900525871389,8149304016405893,2635618276765987,5453856093753637,7193955721687335,9176596611059574,3186523918561578,2709534611423531,1113141616492847,65051433427249,3315024464163122,48065704444213,3612076850475318,4149537508004152,711252540571963,7278898442318378,7762560340775230,5168345202557249,3754112642429251,4228390288781638,7458062000460,28497659224398,6330602258764111,446568818053459,3208908696367447,1828664245947108,7895749023682906,6204579960959325,7984233861562723,818715842281828,3622570299277671,2321254731297129,4429054476987111,2336404595773805,8377193142440302,117930796818799,507306347008368,8981189126421224,2810703727698290,620228596801907,5339932368007540,62064756818293,2368477893243254,5939269291958649,3926240246116736,3310582155354498,1283572297286019,2992511013970308,5046613165089159,28400583045512,4079180213158636,4320517858136458,1812351279751566,1814613974225297,7625989740810642,4093867572621715,6604784716394902,3294985708552601,944902775980442,7794801434125039,373040339227036,647336283906462,1445817632547231,4303260841193889,3654840493621668,8406724999176262,7515369179938182,6531345037189543,1257207197449628,5847519913288106,7763287557425906,9142577898504622,3970247481778608,868246414418353,3114596735996340,2251510985960862,5851342081921462,6119945262133691,8304080691028414,1682543428137411,1163691641221574,2779734495315361,3046420450714056,8200562092216777,2426261845000652,2010214817698253,6594341262483921,7567519966949843,3191243950965204,8855920831081578,6132954946339286,8423094399911853,2061309600395343,5862029890601436,2916928783208926,1651558084923871,585301889774048,2888436738990561,8567167271014882,6195477378899839,198424816570852,871577290075558,3274209139851751,4406029881233896,6753012758835689,5114950557077994,1214218450358763,230511053500909,3731632222650865,4513389197316179,286907101327860,8345937755677173,8386323717153273,2797681143910906,2576191543828992,1394188037960193,2339755853046276,1419628407562761,3597278532334090,2816504236376590,732682007282193,7593695211090451,7105714228738820,8155691112428062,8228259444535839,4563642852520483,4063815982936613,1479614102053351,1114377988178472,990902715216425,331875149914666,6108662195548716,758824170607151,8257734974072982,2532572881064498,7338137520611891,2454322818187828,9140565889438261,3430857972905396,5659563079107137,5150590923153988,2547099891742134,5621779731223112,7345509666189897,7075546306287383,64834865160779,8324953662183522,4443048762524240,4707258032833976,3431769686989444,4488170741908051,5420177164362326,8722497226211416,5001669707203161,1186385211896410,7759109866779228,3679664477241949,6102569216471646,847229649427264,3657327969172923,6846948529290001,6031928107905641,478280318014059,8674520321028716,7135185447023215,4725368771674738,5921527846802036,5154862208750197,488247519739652,4901105270894697,7507346125396756,7513791430118847,5414246730981482,2903631188013694,398407885972095,4014815604814464,2266909890404994,6295315325465366,5021752520204934,1053701037434305,6788919688225417,4555513749430923,2075150089929361,8391347621117377,2339453000053396,414663137333910,266576629596830,5988965872976547,1622799851029157,8701974689415849,7715476131906225,9048847194399410,6286858533319348,6042816609288885,4016944653271411,2006730259899065,6300941860098748,764256124629693,288536396149438,1559140905870015,7030037319913551,1936740395119297,3898862969438760,1291867181433545,7488576645456211,7290370343500578,7778094037545678,507480313848528,7816805706609302,3816986737238740,5920840161710807,412683692077791,1351291671274211,5977780676555493,6292929512428266,4596394338435820,6586326665450221,845919689716463,7773044460270320,9212630627975922,5905628086756086,5141897287078648,8962938939163387,3330691782775555,8396718674499518,1787661844153098,5412550027059980,8793376343079042,1489322705044241,5576033732747469,8331824176101507,178330662683111,4007957663847190,4615136023487256,8503079970841369,3717278151297839,2847903126201116,7438979900517850,2718012169638688,6491887394730786,3210585429087013,5701655625454375,1050876535350057,7698280260198535,1733402643611101,8662168090431255,836020790829877,1150882585113400,4113201653924665,6434197055255355,5868214389138237,5059536280757054,613886748353344,7444913686467393,7760566327284546,2843475114955589,6030805773198154,5028929099787746,1630515811849016,4246327490286418,1210730389152595,3368944083792725,5823864234820441,1065042542547802,3672331640378205,6747335536665438,1305268881552223,7780315990352740,2230024677528421,1489702512690022,4151439725085544,9091109272367978,1880120773301099,8023086224491372,6318724023395181,2523416311276399,1471633283978096,6317584888038258,3316547182076787,4011161956889460,213009361056632,2636866111857532,6351055685574805,2805474785968960,3591101258929027,8050998218797957,210769486173062,4244562590568599,431068399039376,8685686259803025,5920443737158550,5751729595585431,190267392418715,6138729957258142,550369930404768,7710238774567842,9034422279603697,8682732712805288,5405696017859499,3621960008946604,4787573976921006,7345826384101533,8054271497655217,5943256748348340,6386325793801143,7314865151636617,84534906844091,4286942992790461,1288638154552255,7794056924971975,7231712852476876,8352222627498146,2547830778651599,372946750927825,2895677757756371,715305802539990,920361771463639,3176420573770712,2500108130640859,8905081766782623,8399472211428320,3696177383025488,3407111594529763,5767291349062633,6197891605723303,8609846533006316,7940304624984914,8255992639988719,6935984380720112,47664053155376,382589562731347,2442187701384181,813323538547706,5561452565316603,4976042747757564,6018630207514794,425442306864128,4766104227865605,524948373165063,7898737868964873,1012328662508555,8939035997087917,7732566134203410,2389331116848643,6591558907683861,9002241920496664,7713513144923652,2480841037640731,2962883861926940,8299662723057083,6396529302041630,3131535368131617,5670223224497187,464118331952646,8854688619279620,7282442031808462,3377899293201449,2023518069752875,1385477038928942,738867656487983,1235753307016712,6203988020982835,3005685123380062,273016466740279,5598225244423225,2130670882255930,5285339116815419,8774472733127741,1208298604348478,8659215933445187,5506478712117430,6355682328099681,4733591574996040,1358549802507685,6893414989145163,6590020340376652,3120713309389903,7508389678228507,3685832699855960,6367323536033295,7012421022015363,8791174156825693,7393452507432030,3769534949635167,511891084596682,6787751575975009,858043963149687,5502107032327269,5359988128392294,6033675604042855,1947916972831848,8407761262273641,2798691057316976,3501996308285630,6381170675954808,8600200824697985,1671905965044867,3040143773303942,8403798419853505,750707735763820,8070871340975245,3522955312166031,7347780947744309,3911582068565141,5837046812370070,3339769876243607,1053287544898712,379268331775133,4744259883279519,5215955868304544,7953444554589345,2571673910453411,4142294972941476,5541067464567665,2438379501712552,6953048610563241,9206533264319660,3113480208364718,3989255617615024,2268476345042098,5800391659562165,1530513064043707,4133802973942972,1884507423958207,1975882736313538,7411425062372548,1003278517568709,5025673195997591,13647287932105,2887059569112271,3990933447230672,5684543766230225,8028557673506003,8967318649808699,5910994911397081,4282666425943387,5012808274203867,836333592573150,4041792979899616,4559741577491535,7952814948854611,5792016288332669,7879752550663410,8569919636875475,4215347249476854,6127707457156343,3390803643860218,6238391021338121,8918339025278214,1845792035013505,7530649441207560,8854410095875340,6336092235134221,2908280291427885,1130379391399187,4678862221681943,6546862993261854,997539448857887,3002468592137505,7834715274839332,7805396465188401,7070756640240937,6269214135645485,3129712630592815,1151533438514481,3137495742489089,2058996558009658,4881305597285691,5446318702413118,3466533101252149,7997473027253568,2256198320551233,5512864365964171,804025879811398,3942796414608713,4705540992488778,7252805687600461,1398034223863119,2342373633815889,8082696449250644,1725178319377750,6001053801051480,5283924812277083,1142605507462492,4219323728287076,8295365423823953,6484341019796839,6831432014600675,7161060057961841,4428926194742644,9080717832856950,8711773965766889,863861184342932,5388318519543162,4737332485465468,6251169699235199,6927018311046528,6567775099520389,2470004150613382,7524609747375981,8007695784027528,3967190648362379,6135293695006092,4181915439039888,6819812044178835,5907779508905364,3553670422791573,7470548518327702,5825183680677271,3661896004304452,5996047756739994,3830714744604062,8609941479806367,668089389319584,4165494402766241,7003612940015010,3593780722251171,5713406586205605,4802390744925607,1733108432856488,2324486610683305,8080619313726892,866523605513647,232906088816200,2985812585776563,4745909575165364,15715327542709,1579304448615862,5748247008191928,3219464879592891,1653963831215690,6002896434836927,7646892427523520,3413314484016577,1895944395507138,2012139356202436,441250338436554,3006610384799179,8497439221323214,8528887818228783,6525045779215830,6189576596063703,7484761048401368,2990877153230415,502257779193310,2269327224587744,2893905538622945,8316573952738788,5599865574860262,4724365025461735,173408355976680,7508051255293418,9018589629019629,4400669729797615,738897135764977,2526992752821751,1662613860558329,5026215167054079,6906958024115708,492308725163517,3376320763745795,1470173933725188,5878864313226758,4776351975101959,7288616321677678,223667671282604,2761252486789702,6339828074604047,7960605100809630,1611995866822170,5473257714435611,1658417186870796,146899987621415,716165795665449,3516446949348909,136820162680367,6239300514760240,73020818433586,5773851747690035,3243134551984315,2239825804949049,9124403954075196,5471273892509248,7236882228033093,5287119993996871,4647274461245708,3470195128075850,6125255165274381,6794677767572408,4957525937350243,5007723188856404,2366358700992782,4915406663640662,5557275829003864,5895614802077274,4195285361260124,5008680465204155,2743571273922148,8593332413169957,1113956796016230,1770783363630697,2281128490612331,7919592302082989,7912425886288829,7680684074411625,4652863370753658,2565705661625979,2011292851546389,572839553558144,6397466545096323,2516362013402763,1806939934246541,5979917026162319,8982188582880913,3744488880850579,4790122284492436,323234853013144,2567083645511322,5120617323132572,6050789318809245,76863017432734,3675247816153888,817217319114403,5830661915088549,6489708344104615,4428707381532331,3988988072109741,6037955230996144,4808263195002545,1853148098647733,440361763321528,594489540331195,240772595472063,4240680181532354,6857059442722501,6346270665844422,6909234559596231,7676593819618935,4715759785881891,1599138591200981,7440528717305558,4305858521439865,3627313589151448,95475905824473,4711372545484506,2614164036019932,1734555482054266,653242848167647,6206102246659808,6853969894184679,3225632754935528,5835049339942633,7179834714568427,958253076481772,6387094500264914,3142613248321262,3519365810570995,3559551176050425,2945344159913599,6020395471190314,2107806568029141,9140732206364417,8245101001561858,7524955412383648,4069635680306134,4227191083869958,4796957078859393,8735934414812941,225188926502676,881408803833622,408711097546519,8717238779635480,288303318062874,5213268002735899,4336031030844371,1046040768390943,1427854755047203,8557519828776740,7397365030463271,2898220670342954,1214483068421936,5031667532150577,7675810256951090,8027152986031924,2200365079865141,7343617196893608,4427709978814267,8778630150997821,3093135855477045,4794785148119432,8561617406056043,7634534725191492,4621281077096076,8986865222842187,5535958660228941,6077953056397137,3868361134049110,2700465361782615,4932239035291480,168273572202329,2912251528976219,3315045226375004,4867089349511008,2892855590979432,7295232680097644,3744295377024877,788046850725742,6704894756533400,8371745328830321,4146888007169906,5183854494840691,2299842193729396,7553311672571765,1987210541959030,5755311313966972,5557106364557182,3869202383755136,2485559260257916,4604803623389060,4359887624898443,8607948835764546,4216161879021455,6369255758034832,7866104885802898,6855494936019267,3356364520558684,8291827666784862,8557152881354653,7305190871041531,3795845906548640,3477299087120289,7693812023975157,6643956787595172,6579187745376169,4990138474977194,2932151097943981,397922222938030,494170727843759,3612045417302344,8399465474504627,7802473023506078,8009160062404536,8857025884315445,4679659251349434,4394368258184863,1277015035013053,1694884317202366,2162654505007513,6871171372408216,5733745255737285,4342349019721378,5835866894624718,8230691659679697,6277032112412631,1044759442782168,2145815370577881,5036202918205722,7034896425296207,7688459608324061,914174957103071,6656408509245408,5195959107618786,2793254826792931,6093112280405988,4930666362739533,8525524933097447,8508303388635003,5257917654591468,4365928451131730,3614286157748207,2553260760332273,5828102713479507,5401006211684342,2835543929362423,5611247474503797,6099708421441529,1284658983067306,1673402142357503,7130996353193984,1048721193433090,5410840466032649,1660077730994519,6338026083715084,1461916877719565,9033341942978221,811306969004053,1686300579018776,3981077912573978,8392654753185455,8357640612237658,7162278525709267,871356174219295,8905258210064416,8609361880737825,4454322759125026,5526128111081507,270245817313316,6447710276405286,5410147189852200,8903499013949481,7303111806112775,2322918782859310,1987950232393775,1481850926184496,5134181894637619,1406156939569204,5970549975435317,2897319668717624,6180239542372411,6052034521376830,8648395447641781,8063943862960829,4372981177890883,2662875429149709,428236295931985,5752257790142546,4617437384439895,8484330042697819,8161443313372858,6402036766505054,2670904224790626,5964743678343273,1988867158264168,8234216323080153,6721047951825014,6906627790162041,8659631985010808,6500745904044153,7789316024740579,2725559079192703,7029431497373824,1186179207850114,2457128120608899,7539046496294893,8210645257924293,2457176162851182,6630770454784150,4329683473438871,5379085796636824,7494749764368537,614052934236319,4042073351272609,3265930388789410,5747338050951331,5679852977768613,5882903577962662,663449144182951,5852664771885226,2922435719727275,5325747734468780,1670283022406002,136959245324659,4358830430546100,6285592453425333,3131861156210870,922862171740344,3337821939722425,5660263945251002,2998775337904315,7051592755955900,8733284648730314,286985911318718,5508770166581621,1650339737245890,9066278237165942,6096066866251975,3490579380791501,5313182777186511,3038588940179664,6292977148311761,5555758757054675,9155768399812820,7156470208227548,3061720502446305,2201159137323234,2851648489928932,6652862927124709,873775066151145,3701506258225386,7505771362486508,9057600919005071,7326328965708016,9125542514215153,3122235240847603,6217860930185460,2095688806172917,8974769508484137,7010059243142102,7723920415418617,2072373577275644,7783184829807864,6788307023677695,5934779434748160,1019013168404738,1337564892059907,3053858927827205,7073160878033160,2998341123418381,1923330781624590,3152303596345617,6598205298196867,5465201381386517,7213048529770777,2144024907208986,4427356266912027,2419861221664474,669935776954654,2983859737401631,8597676308496257,2695780799261744,8697804377677531,3142270106597669,7694003125855281,1627921214810410,8243059857994119,8677407058030538,4684874944590216,7784077403321395,5666273274595636,1920323347814712,8327645541304634,8608371369770719,1215245201758524,4581557196675390,1189835561482560,4555877127620930,2197746768607555,1954574677252422,5094543103801671,3100603681859912,7729366522763593,64514732726604,4642286864427342,1290064893413712,1991210748668984,2261536227539282,7849846457293139,5605746214328660,5739766136314197,2530528112589143,1540209560541532,9064416614922591,3280105086118241,1234351811881320,4433713527757161,4106725170166123,4390163347269998,9072342240668016,7945147180597925,5429332064104851,1217474594576757,8080341158862238,820540052994425,8120788226128381,3831636450990460,6599897071167869,3708269630269825,5654227584029078,180691948317064,462422337022347,176288406350221,5987990653659538,6457570975250835,2781796193298836,623757385599381,94940611226007,8919070948055448,178564092606873,2437317840046491,8498252070038223,8405656502204831,2372240558127524,3543396312209829,5801756085582255,2303835758378056,3475407262976437,4938283335895478,7600131858811977,5345346848759542,6793059355343306,2269280792508877,6205186851281358,336472018266577,7269275729660372,5192698925263320,7922045709224409,2012928956111323,5916888379578845,8746916740811231,4608671308033335,990981392955874,5751702942045689,4208848399465553,1052605565671913,5325661767035370,2742375195679213,1465996369963502,8403742315264497,7149151265179293,2406629701372403,4039980151863797,861803350566655,163101235227132,7592508092899754,50558991948287,1448883562985984,127054242413057,2850180406741506,6419572744681987,4519389343861252,361015064545798,1578603252050442,5480530101553677,694807899548175,1299453812307032,1366856691558931,1102232427907606,1011053907098713,4732459759708696,808379023505945,1534445469956635,2504858251983388,8574243683743768,448824869640735,8999226420481500,6120084895226402,1375071781620259,3147159235869220,7288093644309596,548828567259690,957284044384812,837260838509101,9207797295868468,6749785760012853,1992189976682249,4888682492697147,1442229656062525,8923297146235317,6509862701570624,4341689063476370,380415651977796,2419692506085958,6139318547917384,310188564392525,4969515535407695,6124629104220752,2843732631657041,196887924247126,5557038778522202,8610329488792155,5774819439405660,260079441268155,7279248113589349,1752430807050848,6424162724543073,8305559811918436,4467289327400874,5193707957398631,913026556702593,2066613522135664,6251825901415032,3010220348455545,164546706528893,6204434833107583,3324335412685441,975573507701380,7218474042120837,9000196659214982,7241288324291209,8462715020663123,587407630359179,8807275498850958,8669828313390873,2083538389486234,6348825461885596,1162430769044128,2049776566581019,632982289117006,514176510251462,3011761426696870,4823751637753428,4103769640450730,1063735161313967,4806477206948530,2258055851731637,2026843960232630,6826391745240591,8762795702652020,136296105376442,7296674375609022,850452358374517,7279088995424961,5190576104565444,8841501292354245,4697598898645702,8174263507552967,1569034923342538,3969439676500685,3752126600579791,2795285433219792,6930499608062695,5341378265938643,3793095387179732,550937056107221,8579993967991512,7834697232591577,7039048659729593,4282125948668640,867641180216033,1615359543319267,5764205403003620,3769997573364455,1905886849678056,4479273829698281,7212881020566250,1129579946158827,8877917865155310,7963040745089777,4830754371615474,2733685886565107,332835998825211,8787360320423722,5763868130499326,3652240989445353,7440000436866002,8942335340669697,2281206695467780,4904479088614149,4247619350608647,1028376079973129,4252207688071948,4601395793062669,3645161030028047,2451152843205080,4758444190677779,1621220579547924,8284484994976533,1673198184270615,7462718170143513,3193783821548314,1011939714366240,665018072361762,8826943083170267,1964860972075814,5783457390095146,8083762818963250,5944518146321198,3262834371095005,8165417453153072,2084690091821874,4858639278996275,1542850650950452,5521249713697929,5107304987786042,5277422068472639,2012231489628992,5972480918563649,8528883250750358,3459309701454663,4110158982306636,4034562044074466,2354594911980368,2646835077737299,1794725765143380,7722889346435928,535544657419098,934124082686812,7918336717028189,2316562693696350,4060542971273701,1366733092121441,6697668348778299,8367757890304082,3986069137251173,7524248029879142,5722540696103783,725024033790824,5826991127845738,3941533756332907,6643720419822444,4534415585332077,2537162983992177,5346671027125106,2250313993378675,962519707802487,1906896253213562,3070323050711933,1610458225711999,7406112625159040,237881432497984,5636296773491592,3655042346879882,4982988465130379,5953826779650956,746412771736463,2600676045335441,4129091917274002,5914476675836820,1931136612305815,7938988961967001,6578141652777882,766952458976156,3736144901335966,5124382588611492,7035691944950695,6738728156425129,8616139820731306,5452108893687869,178072733813678,6712161364745137,3131476092193714,1065781484595699,3929620020181942,1996528380835657,1640352427264952,5260270619245500,7860544313686973,3812978470734782,4442957415956597,3193978042608579,4118348817488837,5356317606280135,3335421696416712,4444138371611595,1212714125827023,117883309722578,2199827352253603,5366494931098581,134241129864150,833444424174553,7681747412197199,5065871688076256,3962071864511457,4015531253378024,8049839111738546,7798887857118186,8174418652277739,3012872449973229,2356093637589998,4410288080129007,1315401252465649,6617127529536498,1808746139991031,8532105814326215,2454969029028862,2645531335221760,6412676360199171,2545940271143940,1107813891632133,2932987241040903,1464658124261890,7185670322682895,6142332125432848,7869613363033944,6211249746324502,2149529811560281,4994992613829668,5195767405775912,7726993783540777,4558185047481386,4481917467757612,6710513354202157,3117025090968624,6218547499715633,7970000624614451,2759637427523422,7428948578288137,2275209298132024,8125957856022372,1950342646791228,7875296861584447,3504225397517376,3889646270483521,1638659367062594,7476387786136332,6187868726660167,175549419424840,6407412443155529,7618210470964299,6694128577371217,9213774601642510,2821406863236183,402136165100633,6126476247186523,2784711209974876,7870449955041125,3275351875507387,16870046215269,2797643172826214,127457940660753,3487379038659772,3986215965174890,3769174330424427,7986867833422731,6306118503013486,3597315080555632,7403306716023315,3051874214493300,2212398926119717,3605894125284470,7854631594048193,7031374743422143,3496586751462527,5841693964565632,2139147018202242,643538218929283,5936321041280132,7336067411180679,9135859148967048,3821382010395788,8520586043759810,1061062448610447,5904314728639634,877082835606675,5210658148768917,1704350891268633,3135761515232409,6696347980402791,4550505573706910,9169573953457134,7495562866351265,944695361096868,4663723667623078,7366207324048552,3388246191979689,3112663760211116,723150206794925,7134961965735086,4833501814111408,7980541953162418,7261903516720307,5952583650376886,7272899242927305,1754728026295481,7000370028776636,3057212905770178,6705881007467716,7566178150485189,3481882475613385,8576568480877771,4490949869399246,1266897215315151,7511526312654533,7133694424132814,7807236761390295,4329854060764376,1673960933866713,1663477281938653,2461676516256990,6137775144043045,1451159808703715,1567128421723364,33592359554278,6714864566422761,3433560356490479,2901651941846256,5975741569232113,1998924578823410,598891138457470,6795713522732278,8455361094073591,3346603684834552,5864603404938491,4084312586042621,7734503941676290,2726898657123588,3182540737002757,2596016303676679,8102222965906696,1378290631123500,728762315107594,8110933145197836,5611690475040015,3117317675195666,4474351909440787,5512693660327188,7477926235766037,643008003865878,6089672087020761,8675242813751913,8742247271529756,455487627898143,7668544592235809,5825555381781723,943828273495333,7293776401186087,6110971537358120,6101923353705778,5328897194868021,1120784606526775,422163904139828,7410585672404284,8690466907504872,1684580902592395,7616818545134916,7429396569959752,4506212054244682,8557320491067959,3261170181934416,1445624660053329,7541073308620566,7502248063557518,5242090513259863,8648750912400612,2214368864410970,182920177684367,3931651395939677,8660067671894556,8680512229859314,4856819070516579,3235455248526693,1692244946487783,8020387373337960,5163215618592105,3992795847478635,682960506154351,6664162114256240,5729190277381489,4005376639492901,7074878303505782,5385066047589609,4738528073641336,517342438940025,7337608060652127,6435415898959227,3853831168638332,9142243608404291,1577165609400213,908927687323014,6004054783544714,3988825142926736,8113545119579537,5654915680394642,5629666936827283,5600147523558804,4142376361282965,464859702390167,6127580807821839,3125428613123481,3763642724379887,2665367298006428,6165465988050334,1944646192922015,4477654905764422,2995658363006374,7509100816596394,5070604326776237,8862454912649117,2429291573296562,4288443958615482,3539270048787899,2119101586566588,7028782936653245,1790454721428927,6469038163762625,6817725628263874,5047449374305731,8719495559781829,7969605420029175,4113044633783756,3939339690413986,6537277125159501,6022042859109841,8403286513466834,4680286833888726,1350422637469146,7335142903262684,645014381483258,4683144070656702,3865078080843232,7350141547027937,5412241828343266,3406048734500004,860964829920740,4294506023890406,5016383786274282,1268729456508401,294587633593843,8770723551893097,5995006818520566,3864419682672120,135759843597820,4314497227320829,1563336802983423,77743662059010,1652106631376388,6474660632374790,6605592331836936,69950174776841,4499962699320847,61011515006480,8908093874335251,7785738101602222,8408900328144407,6860692878683396,7478424777751913,7801181564300831,2267587305172512,5465154686905896,566624012987945,7523757037038855,7939096448024108,6501022279364142,6705429078445617,7700981932903986,4792349678157365,1483745198038584,6019049744518715,4766670242401852,4775113854835978,2844043701378997,7164121350426177,7119417617256003,3744788342423108,2452113802448453,7452903213289030,6419436203466312,6801289283960395,2511602626962701,6188935678811728,4011162650943058,5465911835613453,698502472044117,5978835141328470,5356735925190232,3745757095861849,698694862089819,5839821111641465,8814002621455971,5383334449020517,6775911482342674,4913467051613809,2411973565867966,7305534744395524,3247105427275383,5024946533584504,2251268211990137,616639019654778,1692659750845445,4165929729289855,151651029081729,1784829628035,4133905777344133,9159940525313671,5725240685158024,7541695606033687,5994165958643340,3854053600370320,1188556155838102,3020260573154968,5699319067934364,1389167892598432,2693571667000993,1464641487605410,4127013356211876,201288089829032,8232625733537449,5761668585803434,4763966393290412,7574800978554541,4962099221454511,8844390957530903,2903499626081970,1575220420076813,1629236900214046,3378297302953654,5450272297624051,2425436425277117,1300017018588869,5131477072084678,8572382497795784,7639198057967305,8248046601256843,6649394856496843,4068221247401676,281873368067796,6074589067655118,355166438801113,869802137997018,1352880105905883,2892075514027743,6793174726192867,1369502675762916,8974133254707153,2067519715356396,1043113212710637,3479313511922301,3721824669687364,7728420577435380,531999367282421,6248843358359286,9060851162974847,4135980709371652,1224223180429953,4183481985126153,184192226721548,1640862547177468,3556301866045199,8381453343670232,9133520372080404,6792893289131799,5741688748269337,7644262963490589,5312347547283231,7431348503998245,6600305625654577,3492386499833642,8454208080551723,3724829255192453,2526393160781616,883121503424306,506189748502325,143471990161206,9170764118699535,269357525086009,3651526573502266,347861593153343,952256758615872,514193166606145,6019523305783106,3556074745668,7801851824975688,3417933525294391,3484249973579596,2607473072703458,3445459287294338,4091652994805583,64203051921234,1937809147965268,7681818157146217,1575680318035940,4388465680187228,5356353939038045,5037332989124446,4456172045844322,2284167090311012,6667852993838949,7956454233526122,8952701503946606,4892668301631347,6555513209122678,8727795858395000,3106318735028090,7561556723634043,2445355116670844,5938739502710654,6542246872395647,6082381908561793,4806985334648706,2252854250917763,4569779849130646,3149344976807233,2260084821151624,3573571301126027,8114421301956493,1101040754597774,4497749214420879,3455682759401364,6720250962263958,1802919781863319,9158584443125657,8268782118563740,4306001473499037,4377850439634850,5590274369658788,511716612837293,8625103140491183,361468291567540,816111046664117,8322196344606646,2156778197479353,371223037648826,8572408215662524,840091852027210,1117737537694368,6242139751591876,7343075800006597,2153923201113931,4945570764074956,9042931053010893,5707279542861774,6075498915291089,6282937084923864,4130959694020569,5333044178425167,3470221576411813,8070173870050453,3572027380584419,6901419588889254,1474023050563559,652802191257596,2261743291305962,6403804394082285,7730052812660718,1827732591652847,2239527547822065,1035570939019250,3598949427089397,8790780271288310,8200096088014843,5240474780045308,1374360967813117],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/133743f147335b4d31b0e91480606339",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001438705.1/GCA_001438705.1_ASM143870v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JQBP01000001.1 Weissella kandleri strain DSM 20593 Scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"133743f147335b4d31b0e91480606339\",\"mins\":[6919144075216638,6407193685571588,2614013311120390,9006235240476161,987453326203913,7156008465807243,8457337907771405,997767595098126,3262073279537167,3123699254447121,5985812592889929,6422040382387864,2870779425005230,5844804898187287,1859701373212696,4336689040281625,9121503473840722,1462443490236762,927318720985120,1473214027838497,6159198339989539,5924888003010599,2586810114468904,7956884320325673,329730031744042,4042300127970350,7601093864525872,7800153613874867,8369248649930804,6455152032298037,5904241926473782,5431016265118217,8377718869267513,5809627427863610,5012838686644284,2602302620867645,2856477266153537,6519146253817355,806397464538180,9133084350293062,1115779172143969,1838361354411081,6744843787899219,5095675924994231,7019973032270519,6915837691367502,2818825859687503,2484218572050512,6343009538932920,8610037553420915,3101689520873486,127811737651287,6304904689711143,1823488873100378,2760741088471131,3490061266289756,7849690166679738,7092771142390878,8438783346502562,9196869450779017,2927058581541392,793548355846243,7862129685344356,3762967677575269,6127915358049382,4240766525864039,4949039138259049,7739472839361645,5957457618156655,8817845026457713,8458509524858899,2108483981663351,7732533778476343,7486358112982548,5665801934229626,753371655300219,1475336343893116,5428990564177021,5996718103788672,4488207553264320,8679869391952893,8041601150505541,2853327819495557,69068136791175,7763505168029815,7955688472835948,5621068152888459,7219398683581582,3778810027748495,6581371356454533,4019200306056337,1108004575391890,8976187925591408,1910900065281173,8084226783861785,8406921358628228,8587450019730588,2027200520981661,1208556031293599,6536414133639328,8062703989567344,2759935227681954,1562573825605795,6911634918813859,7511713688497318,7214396752875631,3954752761033896,5491804272039084,7330473706423469,358103378132142,6376010618125341,6736634596333747,4211350972421300,1713790725187767,3451264843200696,2232490672237753,1853152855071930,1931343570346173,2417101743376575,910223950544064,5990245621348384,7179191899808201,5215504953220293,4447530945219783,8684810728559816,6956404156361930,2068367814387915,4996279060313294,3679113951631571,6803779522829524,4664661431877845,6582051570512259,2020457130708186,4303105767782619,5042145717313757,6588085992490263,5113391557821665,2277488958279906,8413734580748155,1607306848313574,1608542926998225,121407264914665,8758983909745898,2356030700694763,4252730795830551,279933499818221,2143739211859182,566017280304367,4804947447423016,8079081100862706,2192256400022774,7220547715453175,7986909084940230,811183161516756,6873356519121147,2082092219267324,4830550939182122,5262372908882174,6093274286078208,915296353187073,121964642300162,336513231401219,7592333478888708,1488766898732293,359082002443526,9166852537882888,915131327675631,249732119753996,6196602632114446,7646363007091983,1298343668361603,8568389888208466,7001587855250990,3012087971456278,4013138276629783,1092083710523672,4771466276739353,2996151321529626,4934084491214107,9156052171509748,1223220167771422,5794812632348959,3178724542415139,1297579609454885,6169811751492902,9186675113823761,6141457168441641,1755383562241497,2224041732095278,1758927824139569,1524456513151283,1614059872751924,7266670145316149,1125488848329097,139525199687992,1149713961681209,2443590529950012,9039384023844746,7829809393387409,4176755158912321,7250480269432086,4394413333799235,773390127870277,1060450652688711,7734336010477124,3455699489241417,9150695714010825,7726064202735671,1480527902294350,3665140223238479,8029467815684432,5260573201102161,1388072353962323,6075375490553172,4485987129859414,8934332375296057,2576992307549530,7216416458593679,3917425794948837,2446731535270240,7451179792868536,6079907709439854,5080374263335270,6873172915306934,3948510783183208,8658006889754172,2560425887118699,2714481482692973,1192955233874493,7375087831472496,4375138609731953,7262670429912502,3830887321066867,6746063975895413,3266987782300026,4539800252220795,837576426588540,654439182992765,2550284839648638,8256283662424447,7421822694292864,5520410588390028,3232790193459587,1984717175544196,2862437660371333,2226456833570182,3698005549129793,1629855224850824,445043955436,6213450697443837,4128907956986775,450816995986830,6131637508766325,7684848511023358,5735034235057554,5349005613967763,7392814190290725,1325028202956182,7267370704332868,2795161219301787,1868769899160988,1807377003206045,6825313241166405,6904245943749025,3374055319570850,2398053992459163,6310113702100389,5973964940322215,8183842469947816,2757944758048169,7911587785111791,8613082419675133,794093245711788,3592225945608624,4138552541711794,5006684908163508,2622789832950197,5271788496441303,2222808497548361,4655072909820344,1886607826042707,287506759299515,7321977855528380,3452387073298877,4167898977533374,8588759342041536,6288369228580289,8473027785065211,5475917484219467,8993929773423044,5674796630923510,8341810968141254,3194748753992135,1883482352242120,1045786176102857,7159370087235019,7140772964027831,1994100467586510,8483390906455374,7701562488219214,5020076251133177,377965521551268,7308757196146140,9111506971759718,5339154995843551,8317717254660577,8418859533519611,6028920432858596,2303523414010341,3186225024233958,7745917725230567,5516678066405628,294610943864300,6728165540603373,7308237818776982,8735598654624851,2221045420113397,7444489250109943,2118221825466872,3137269019109881,8429295576046516,5432262510441386,3666976871753214,6895468188035709,8146409827987894,6278471070433536,2584784673450796,210214754441687,4090990698450441,3952500257382923,8492236964318733,4395115002366581,1872255640362512,9043446689988184,8563656480786691,3972456962150932,1841762185567191,306393997931031,3569147514349080,8377184501763609,8890771814507439,6769316760101229,3068139872492061,8471851035363070,61809255558688,6950705707718064,5863806702762587,8875834880780838,6464802667747534,5211890775611945,1024284822859257,1563460357318188,5062833922126382,5064147662764593,8163239347498321,8709063996488243,8467828596648501,4797363027708340,7592094235794410,342891364818491,8610697757126204,267921751398973,1234348067636149,7324911122916928,8940257314100801,6409539569369666,4134770637827652,6413365851015749,4206199945197665,7563644035448393,5886105185006007,8531076345999503,6909448591798861,1930454170017358,2421749330993743,1472199227406776,2181259407695442,9066194411655764,7705602801755811,3407676461772375,8739492284035498,5906563264176729,4390918252780303,3366164154197597,6851550665445477,8753440009897568,9123018544032354,6867607781025796,4583328991860324,2876103824215398,4928381181762150,6498507089185383,4124144185797224,2884553854319211,5852934932208236,7744206024268455,2799604787114600,1245671600127603,6829860241930868,2065005120279157,7640318509727193,8920128985187963,549179174688381,7125110724363903,1112518583134848,323795533695617,9153304644271232,6177754433867371,4104861865946757,9013744296213130,1054820931631755,1502050357109388,4210438915066509,2257554152871567,5934573477563025,7253978602596710,5650109332484758,6007371105957528,674918943511193,7111474974192152,8369028862206119,5457077502218912,8145081305237490,742344423643810,1066932093557019,7802221241812245,4350876868171429,6911560320492199,1496800093169320,465276595515051,3058523356155566,5078345991633583,2020535021586098,7352519225182899,6577339096681140,6694233816390942,6948112763885238,400944649577143,2943136262536997,3696524121026235,4449615390266044,8327728366877470,2058779968066238,1079596923291253,553531892912832,8833675832703776,5101693180960450,7653522419058635,4668835064252100,9006152073560084,2727325416977095,7509070011188937,4486263296140302,2502199641455735,6556996302554914,316991466512081,1303898052027091,2349347196755668,6626895977950933,3072089423186646,7615988520627335,2881451001027289,5220556906263258,8369435803334607,9136145863524060,7022887865670365,4661519071420126,3006328981211941,5855274771084000,9131129145965281,8929077912251107,6144279467901668,994393379341029,3451071253495527,8304817727353576,7601505982408425,1193957218239210,7063045352545003,156086845545196,808178016773869,3697699783946877,3258245831196400,76569350072053,4189152511057655,7891030367977208,794250647932666,1987719658952443,3890325907889918,832625023458047,5537767992075008,8371229270596643,6628970209799939,1247915558835158,2292813029731734,7618640218913543,4674031789915912,2100387991553801,8119823240186715,2341310718163723,506250841387788,1277189620861709,2499019226226447,1168169279097134,2573701570673431,8964314560258840,7427214655928094,931893274465055,4364513948301088,483398671224610,8049957184133083,8645922290638491,3991041690662693,8973654658433497,5161751025459116,4768723154059052,5361698494958385,5140515879677235,1577578925036340,7147321802637110,7988247988694153,8068946844611384,7172178258383911,4153151497610042,4061914327235387,3676994442950461,8434550268238868,1730596989755199,7668926595350336,6470674522419009,8869640883025353,9137207677043523,6922945817734980,1204542445020998,4346651350676449,242347171157832,2900323113704076,6326004201102154,3942903791149899,8387214013310605,923909991530321,2375008346287954,2571709833453395,8754920630924116,8547454079555413,8829329440752163,6728142073547065,3317170576364175,4291798243033914,8461197621112670,8039148287090350,6562502920029024,1860337919230817,6358620276057915,5953953755709926,248516654512998,3681830367871121,301594385931112,7989568758453067,7932333351924587,3133622842533740,4877638381266798,5110566930250608,6813811034485800,4845830229735283,6681168360362868,8722538605010846,731699757038456,3913891452689215,4743714869961597,9186913622225792,7982684811765568,5579768830532483,7285872598888325,1434205520420766,4384027989137289,2003136696448906,1886459760398219,1063523877604241,2621376125364116,6658948328445845,9197088539720189,3185629062942615,716324368153497,2246644879099803,9023281797395356,4976544014595871,5696556956509089,1480325353354632,7778001669625763,1445666222163876,4111748006043558,7759774616159144,1357929265485738,1373057472469931,1271461344241269,6703760385034157,988606660651951,9156350956705779,8158398298946484,4070864385052597,5403494895315895,1298890574466997,91719336659898,7653439196912799,6960474311169866,8620348420472767,2036234912751552,258021305997303,8051061547910601,7762608119117763,6859140703986630,1917522127237063,8156047918065971,7610138326740937,7047112807920191,2014766513895371,5944325653426124,8733418613695437,7686793312083919,3524387563056082,349657149942435,2588625571852622,214160584561622,1002042342530007,8218521223955418,5924589797212495,1387728682114042,6882123870221278,4754354951866335,4542505300586464,4601737700711393,6240326143257570,7420494861437709,8180272769058789,7020936049440743,3848604102857704,4890099322975848,1926732418425834,1816718456935403,3027757842037740,7687743204053633,2875840647561199,6316215764315121,7051459194417181,2632987893425900,2756381393379316,8669018878519038,4627336469814263,4772346911548410,5795784919088123,4625275670460413,2843220717685758],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/175e67b69e1833bdee0859a3a99495b1",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001104005.1/GCA_001104005.1_10209_5_45_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CIVS01000001.1 Salmonella enterica subsp. enterica serovar Typhi genome assembly 10209_5#45, scaffold ERS239666SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"175e67b69e1833bdee0859a3a99495b1\",\"mins\":[5899883759812294,7667242559123457,7142121365635074,8832940841975813,5500481590300678,33714525184007,6781576977846677,8961340170563452,7149019143905290,2003725184888844,7538830409318402,3074685262462990,7020060309848079,155830823456784,3348913372110866,3449892164485139,8247264029053197,3666544173096981,3250417144311833,841835917180954,1329129177767965,6652061552234527,6426478573129761,7567752747511843,312543422750757,7653629477826598,4350243599745031,7858600439742511,8781245490012168,2468692223627314,5043679904161843,5675901661478964,7547465771229238,8981126744596535,1532400603127865,5560402654953530,1086732900704315,4953237476569149,2198162296894,5429272783895221,8634023067414575,6246951338862089,7376740728343905,4346228865634376,5150220836593737,5510921714606156,2228149444509773,4142709335220303,4413466296205396,7699437898006542,7953805352283492,7661661148872794,4610790027702363,5951872424226908,8737067013126132,8709868313103717,1087389546942560,3547511032197221,3046934190174310,580002293616743,1951587606835307,8712222429098092,614117598728304,5595856690754618,675798713393268,1189114657366134,5842420426145911,6571847009566840,1160729994289273,8059835218186362,6903209903747195,1450361857089661,4858741714927746,2419947851556653,2533127438577004,1118548040110219,9117921582833804,3048697703739533,6231973802160273,2099869908435091,3220579656319124,6133390943420565,42268254855319,2864493289873562,4443544544104603,4657657665306780,2996476514086938,1380881938284702,7023088342458394,936075973243044,6980401474429351,6635331330359464,3981595702952107,6032360780656812,1673967562956977,650551306137778,4197046924042419,2315390550597812,7301288408412341,7154164731192555,4458146038722747,8982782956413118,8400820012121461,5695311937183936,2920441813536962,7542189195321540,6278955061215429,7054749859827913,4640032178831562,6763953629155534,734190807951162,5717435355128016,3452273148465362,8927506911707348,4763585229107413,634835628724438,132263687037143,6854210870993113,8148649347528399,7003909459631223,7023383739617500,2972432946561245,5682379950731488,6559427145941217,2421205544034530,1125902530592995,4466484413501668,7055332613012549,8258305578123496,2115422369853673,7252117632917738,3213076491571435,3601540529979628,9013710678219636,2032666380553597,1307173302747377,7507799825498354,1184730021462259,4271376251439161,4424877218406646,7596565628064157,4825560274542841,6066866288050474,8029245432482408,1004510776971521,1156158785220870,266407656232894,1578988311843083,428966940319106,3011652750270737,4983272580863440,5231131468531758,2313840849371415,512065760100633,5101298975113499,2497533126410525,2420917941133598,1960346487296288,3900541634150689,8205039379147108,963704366062509,2512037354959146,5841693726925099,4279616639930668,2986434217500973,3454101319655731,7897604301570356,3021391463772469,8655401750617715,6630137174872378,6486366560624955,209777099018556,5690135547568446,8030581497893183,8178733033453226,6630741681000235,7567288214211979,7109926634643828,2207550833701200,3057984860864849,408986989610263,358472893305171,8832538327941779,2784447813493077,619222914013241,297717739503960,8195563525001561,595994403097589,4595584729410959,4628636252754269,6391180946272607,3854093525619041,7797290409255270,6284824850235755,8474700753287847,1515622212116846,8598622280609853,2875479673643379,2833074701422964,7664637125124473,7687732216357260,4808857808662907,5418417637122430,5133649707032959,6738942595015040,4600723580223873,6774257339310466,7241452761821572,5793286718508438,4709752988127623,2629446602621321,696310894365433,2095969561760140,2288712094724493,7022747690851053,3494800120402320,8039963334221208,3888981362831762,907806612451733,1750192293802390,5277658521391511,9166107209953348,1984056380322543,3614784003117468,4334174176510365,3256840136970655,1308466320654755,3914090489461826,2421660401136037,2347551799898535,3906101247312296,6136216904610217,85776855069098,6053742209548715,4733576779141548,1932222325929782,8895901541220782,940213145788847,1027644789920179,7949008728069323,3468003891184055,222518498161084,5067407861301694,3392660871418304,1265001215648193,3755822690767298,471720962580931,8562189316408737,5269082233635272,2746759931082828,1473107342860746,191913654223307,2748361177846220,2922225705398733,4038398964289998,3603904732963279,114474105471440,3464476123365841,4906984463589842,4510804543881684,1782862355208953,6013743152714200,2766426039513561,4147229481234906,7235823689830876,7962500072292833,8559911958933986,6854997912162787,1294946232029668,2758264492147173,3149840717951463,7043159233139176,1046687379259881,930872963293674,8701922676152402,6938567795147246,997142266790383,5739066936098216,7777442779382258,651565429694965,966058389463543,4411291880649212,524147611447806,3583119003166805,6251429141955328,1404315542372867,996059339366916,1143446724145671,7731244410036744,6077713026503179,6489699495729962,7502222724588047,5870545779999248,8420355092097573,2410193198547474,2151652043604739,1989997902488085,4691692328538650,8207992784237083,7726114096026432,2154689808757283,2521002441265700,8583199448278195,8444411046870449,9125443279180328,8974838263099303,6509084823900717,1209885410484782,5339064985240112,1882484501008945,5138493665624626,5367164803007027,9210781741125476,7833563247771019,973973028467466,481393158509118,5704806173180480,233642889462339,3951151769940548,7890913031856711,8635755689570890,8715299787358795,7323835294949964,2472140177142350,8482136702620239,7599602189782884,5597608394555986,444359522337363,5780427990733266,5284633093022294,4872114199741015,274303073649240,2196089090658907,2167397794914908,2812912326649274,7803130107673651,6179709639530987,4818858557407842,676744876192356,8371918168690679,9039455019639398,2415738176799336,1703411556545129,634502016692842,6054476545831531,506873641599596,8659628277334637,216194601009774,8131742137712061,3363025795113585,7425176196366962,414921167815285,5564695883085791,5760999445373559,4453708423537273,2056152816267900,1724570649657981,2519785797448319,8639849475287147,5917500673159812,2942332323517062,6643267600130695,3167805276766857,2538368041894538,5121175980137239,6441102257816204,3723147829305997,8940528804162246,5015838702185240,775420119408067,8820099366415694,2708478246412950,2288553949987486,2642909110399647,7124671579803539,7530336652429424,988496938263203,5506859514252597,4062422159663784,4066287134741161,5647632053756586,8474743802331819,876290879189676,7158705250108081,8066174717787910,8797751287262526,398031542002462,6414218185663158,3400148493193915,6373218733589181,4266757400908478,5356814370709962,8187312762512160,687776326775490,4489746485416643,5011655231045750,1805301284967110,6682597705495239,7034658147467979,6191577713985611,5095278986728142,3686767431353039,7176956964511174,4986078173842211,6441958794682489,6252745484687497,9095087195456217,6144407359025882,1869784025006811,4344411177177432,4655832299815649,3711510044373730,8581032561058532,7551743307844527,6406337245512422,7998852131324650,3051141314798317,1881126528430830,1348850511180527,5141715656196848,9077293606195953,1157923615327699,6985867287209862,4762036958961108,2033419603964669,4940717972017918,2055835598859733,2991609448162048,4757830880039681,3641283523318531,3398775252067078,533298712670983,1241020761522953,2300341877760778,566762934179287,9156501451643786,1668972437971727,4490535517451024,7618938367492881,9070563492909842,6609712885261075,8463962032318343,452975526679,3940306491763503,1596039444300572,3709829719098142,5470443723825951,7346955555791648,8747232437494561,5945995850982178,2623027730125604,7492539000721609,4071866172175144,5579773940218674,4828795254633263,4126004650177328,4957775544318088,1738462353646386,2761768064602931,3791611701965621,6912588088828726,4796204597642039,4901064617743164,798868643812160,1338203319067457,4833368247124802,7184391422245312,8887928089925461,983002602214213,8505742885010293,6575045633073992,9043503077340766,6851025416180554,1798831352435531,7803479018064013,7926284395672400,6533851262128977,7440207515271509,3859263718163939,8203419880003726,2723240064279382,2545185923302231,6933973702869849,3668908087326863,2608945270502237,5783001957613029,9063105580508001,3635389743293282,6672333947474790,6134002501714791,3418771147354984,5647515952829290,264496461521771,1314202262917999,2128438396523381,1441494353546914,4839816082785144,3256915863896212,3036570263229307,2600419368797054,8186464642409343,4520272609932160,4328576230097793,4222562474337154,6364293130736515,1487675705533317,3094912929248134,7342712596759431,3220227803063176,4822719302087561,2995206309671819,8944160785390402,548416513213326,7517322524010345,6396907213450446,2349567300653972,8336446076842901,5200814934590359,1755607425356697,3764174567576474,3910093462762396,1159544424768413,2428308208534430,6429776601063579,2316278106239908,2417982387782565,3648138902647718,8980657561393330,4112415658539847,794562638783404,6060333225833389,7266718050477913,5248185161894045,5976421305619376,5784390038203207,8851636510629363,6407665131514014,8619431967474614,2317703192163255,8153523721307064,1466698071463910,5305547338904506,7986979991066783,872408159298493,2552156920112062,7464819275826111,5936758195385280,5981719669089222,2166596848387015,8460228394893327,4781270823064521,9094472384897995,7972238557078476,7916022112258210,8504163723803469,6589558900401106,8340405120926676,2771046292554709,8524515802033657,5531473759649956,4688507946681307,8200252460385244,4447216729056223,871709577090019,2477934950253540,4801531112670182,8347818126939473,7869360031254849,437563671057392,7952523352168616,7488866651544602,2200379227145203,7417630278575092,3987667524054526,4583736287888374,859476197024761,8778551257714310,5647799875933181,4676040385473365,6871481626158592,1891674251408388,894273844724744,7802673296602121,5972151396851482,3283637403927563,2226956289459212,6417956757935117,9162821235325795,3796616322409491,8229225330563731,1861947185983220,3196142507205654,2314307504759831,5802395270845466,1448880223941660,1228899360396319,175734808470560,7580535526937633,8987055669077026,4804380071625764,7948579634816518,8349950503662631,1030310028192604,1309199382606891,6107690259992754,3461504578257757,5469193354794504,4789307833095218,1540130197193779,8268120286951189,256280713643061,3174683943007286,95051134010889,2587738075083833,1464620563891258,2973437097387069,7566332212591730,1328190663705664,8837176724567106,2090172305962053,3615590913016903,622188910686599,7870326325810249,5757686916252746,2101773243126859,13661764940876,50236427273058,6226695216805389,9075893912813160,1935921914225745,8805606348729187,8329635154339491,4222079261377622,6609290369733719,377384294933592,782861886403673,2413403248510042,1561817631880284,1052977930028126,1032418317239393,4857733530797154,6131897686692963,4887649752966247,2441887717961173,4157968559989867,468081270490220,5267119911036014,6666623700743282,6341241357210739,380292373890165,6487376557675638,3216456733926519,5645638169871482,8838840152329922,5472524878075005,6395515818955903,9020938061956224,2511547896298347,7452288980348425,3164368610071689,2658354862584973,3931562626897038,5746299957933199,7000171664606352,4146651274744977,1017356947838098,3018161651127443,1243051266110614,170159509392921,3176775879189656,900162075620506,7375822005161079,7631417175467907,3617794764493981,6781921912881349,3149906855916704,8782973118321830,8464230606165160,5534376381355182,4921694918354095,5042974264650611,5434055855875252,761680236803254,2623504852497591,4921672993346744,5183762809169081,6115813926307006,5570081563865973,7158086979015880,3701266058921161,5103163479418058,6634422979384183,3392480305652941,1777431546033358,3399529205359823,4118822455425912,5742398999278802,2323754789332515,590640550487252,7934633255077918,6798493811123065,4566086768632921,4021120871982297,3418349251847386,8810441169180879,2554492164353573,4056976335058144,1586263062172897,6855473680928345,7330798937527527,6601495938585833,6515308128892139,4691498178217202,5366511980242163,4458190157075701,539261405611254,8117664457475625,7707162345727226,8060204161361147,4439187623639272,8804008150624457,3953193440961791,6560210596812032,7003518955537280,3845889825453315,2791571609793796,7045651703901590,2689640009000200,1502873804653835,757680585356556,5114460015702914,4820100822807823,8519717240329489,6534779263724819,469614924858647,3567555766994201,2022825651647770,493622072034587,608678462596380,5339760056775965,2053245964989727,1667613825422631,5706903704126761,6472412795471146,1322574410237227,8222273776915756,2636674965853746,2061681405490478,3190549188796637,8309275975680385,4363884157567880,6060785987921101,2858050529764659,767018547668276,7494778308604140,538922793293110,815968354379065,8905791761032295,8761588900390205,5860247428091859,8597758869190197,8733304826938688,3170965927716161,176443782346056,7584009381496137,2003627071083851,6798921647281652,6317814990861647,7962448127673912,6605125460456334,7565801461286231,1707953079627563,7109073690596700,33325482419549,8989423247615328,1444811072210442,3545289693836643,4042892510496102,6258504989840744,7018227477992809,1709795956561258,8035649242548660,8229159631036624,4372807575288040,4884572939515250,3516199574144375,9168034149081501,3048716174910356,7883983063356795,6728186912397267,8042950165752725,1101365094035008,1488182483494275,651603508020612,5046549108106629,6483170352495664,8828143227951639,5440312139134345,8256658137195412,4800392856741260,8713442385643074,5689072710702478,3514751407928722,1414317840659861,7925066249065882,3713333490394523,3591212387227036,8414742353659293,874306321245598,7852664874857887,7535287209014689,1818158295602595,7398737924419142,4453036770313639,8967579758163370,2227481306654124,4775245094784584,338031841936818,8764898673030582,4348508294940088,4571168539530681,4347967997023674,2964366848207093,1725652218955200,603723544886697,7281809625858595,6752275299386821,7614706359756230,5820795079153792,1650213179831756,6773037966919117,3964646268257743,1649230538233296,4467021060179409,8615754678904274,3308911444497875,182173807171029,8929331168974294,3332708485383639,214928036955608,4342464695952861,7761707923056094,8077472501913055,5762248554055137,8451615345698274,5029790084625891,6830305427912164,3703190419827622,3613476809405927,2082210848335336,7944623598202083,606376016274923,4075616248669676,6594829218051567,3018088443037168,6207312858162675,2128808349279732,2786299327542774,25043460490743,5454684516298074,8849879366800893,9169586316342782,26996850963968,3221671360820737,8867481726778263,6034836883940564,2935616897984006,6373948582236417,2182079777469960,4953149820658604,680843690051082,4546327433016845,1670685532400557,872035560183313,7936960859923987,8709412136190894,7093807022224918,2232134182671895,7684269187824380,2062747392960025,6071674841031599,6477767439722013,7777640728958497,3567103089776162,1980107848689187,2422170018448932,849271146664198,3088193999304230,7712899375969523,7270114471530868,5836521522128341,3320126178838059,9091339809357706,229730930722351,6709796999637068,2896563856741938,558784005514805,7602930519402038,876228623607351,7637673616637016,2215385946845855,9004110310310837,6024992530792467,4330569518302785,1881937312843330,7328014713968136,5815431523857988,6521419425640294,9256413976137,3822953193010763,7094303869460066,7691162001838690,5967064669993229,121428072867410,2779054256531028,6530647323139001,7081314123486808,4741826496558684,3336605611099066,8907873749530206,6464916939101793,7101997526506427,4945869523662436,8314654128694886,8007402726123111,8181401738344044,2046649241302637,3920291554035311,4013295382001264,5086700650174065,4472440995165812,2464279016109685,6369696787084918,4088830013236855,2329319645619834,7195724533933692,8804202034652798,7934195266143871,9159935469771807,4545913083242114,9097501646935683,7946685539878532,288301403063941,7139801138402237,6330150343472776,3251586299885194,7694331219583255,6161647960628379,445333053183634,8317888860350099,5466087268333204,3132925813753493,6876242254722710,950873040090775,1760823475619480,7186784560308682,8776679386799087,6488269287269999,4586720274589343,4500582573676193,1964369945540258,521191956194979,7698624449279653,8570474410001706,1673050334832241,4565460888479401,1657896321967786,3927989439489707,2898170455553708,3090491217254061,6330238278509074,3838182736778927,2644767429723826,6121314243708710,3679862672968843,3964901725763870,5128354617677496,6636136791344825,1347943642076859,3985229469161557,5308248343070399,2106825039062720,8422121531860673,4814106041388700,4112885253129923,9085846138920327,2896715108882117,9011623951365355,5417091227105569,2181459282015946,4407834142164683,561404979717838,5346624878614223,7360163519993554,4857157896107733,2172195632854746,4114752204367579,7679690893620708,5360393208252128,6919156008389585,2623306480537211,4140826588067556,6897277844240101,6691692128442631,3317863302006505,7552727705593578,6848696958514924,8329462250333934,9205620099043624,6600018023525827,533509815207667,4688264423161,5446757734995706,5127013415982843,1564915573237911,5033731931457277,6100220424144639,8690713741256448,5348637647970355,4211730115966724,7706587482040069,4461391563314950,6557797094194919,2874501914281741,3539105648775469,5829322722346769,4448483657553682,6461979553939075,4815710965823790,1290448240297750,1681060518999833,8538085435298228,5099977234687772,7127777288072154,1233591354898210,5491451344338566,1408255433402150,7238110203594535,7018756337716745,1240066836596521,6006913746245419,4608157651699500,2356193109284653,9153528767976556,8435536335704343,8123269404845704,2847759945615154,8084343777403337,4176217626351413,247623028684598,4978929370052407,3581632945383224,238635326994233,2022807142803258,5267795467916255,7996209448671036,137216535475850,8856868821143735,4704893258154293,4039079064811328,3857916781078337,2562695284156226,5149732944166539,4674561936136004,5895348954294085,8807413122725702,8872342455375687,2325087454635850,5329427935520587,3208220820035404,174025380063053,8350358619417537,3493536856844113,7676966294050642,3619704864651091,4058056754018132,5708433471903573,6792154760582998,4681347148076004,8769193780307802,7464474036447073,6895359992447771,1923545053628260,537468527651132,4277668422666090,1309029966022507,8210708271458159,807543998326640,7573883049879410,5319258108381044,6690127582099317,8888762566276982,2273838361048952,7253121883555476,8056983904030677,8513165716478954,2591361253508993,1965371690703851,859452633241476,8947182068660101,1969983725987718,6596611524012353,7348159461862117,8386000389457803,4621666960222095,4134027119716240,960739989321619,3768676024248212,6395220159308173,5876766461540676,6363344116971418,6624552624052123,3785212094982044,7709178769450911,4317306224113568,6957628632032397,8830581879912354,8624660576636409,6079811412764583,4557177739372456,779230802116324,3977407856338858,5650354964412333,6245753702033326,1099516733503408,451120581445960,8678236338956212,1254267278784439,4144480892479833,3585145642497983,4865933837871042,6463800501988731,5806282386102212,3292641942136774,9152864094315730,2618814530189258,6510543560293367,5185320825952205,7973421628504014,5184293123636899,5198938453792724,6609894173665238,6448080537816057,5752949606386206,8746250355763164,7267779940968298,4092171006515167,2388146285723984,7422386338265058,5852508892609531,2428235422771172,502402209470438,8540956756629616,8162169518446571,4298440151640044,8131906424004990,2436938215679983,4303042354923507,711625844209652,6572476717303798,2209075498903544,6371559945058298,7391576733557034,8962006973175777,4583725742856189,6757340653265237,5461642314091520,6514010774400683,2078384878950405,3909344174680070,5254879555438599,1966029162698412,8350554160662540,788509388883983,596173146403160,126590754007058,2591419040606230,2712603419187223,7771022354996166,1572356031411204,1465483891283631,6915139761246554,2838365919078430,7069137364666400,1689886201784353,7368375630518306,1542567626737699,3194265969334309,2654709635626244,7323291230337063,6885791500404778,542332090869805,3124796163946542,8641319291096072,3927327479265331,5456567116912692,8080443739596853,7681344302491298,1992590317054008,2239467549997113,3764789973760059,8972197871214536,9151998028335167,3640538450647105,5897682840872457,513942037088325,56608669681734,3992050605562209,5397772407666762,841688988907595,4876034909018188,3891026655107149,4487384124643410,5890424155301971,6213635920042253,3214216908011605,5541610094812070,5469901770803288,2293884384790617,2426041499756635,4874904316303455,5629260182255713,6069728631273571,7181642424816882,7955485635512422,8901583829756007,3240689394350186,5258637824211051,6610582313462802,6742330448062576,6674461591337074,3628818666887283,1265061373565044,4642336363096181,4799176339216502,3972519561250936,7055270432594041,5494529873852538,5106999170435195,6957668849370848,5949749411465342,567656662714496,2925276112783490,8093953642758507,2003661778198209,3519667105339528,5943693569702025,1431039489927307,3889415131871372,3453110641633421,3851755875379342,1286470239099023,2342265336165452,9207039731481571,563381985605783,240576739383448,3711982467758233,4505213965585434,5470776088650231,4510670544611487,9054144529922416,7048169904068770,1595571707394211,2856215005730980,488213304276147,4894627741890727,5897557270292648,1911565472123049,8655614835185430,7728824939763890,7486435108515441,6255191827925364,8572029258984479,2053365821274300,3028816728004799,6478693324941504,6919318501676064,7537762956503496,7398660690057199,6871151417497801,2142322034346189,5814708524050639,4017968855656657,4868153009834195,1348731958405334,7047595546483882,672446842483748,3266410232453338,2113964597550799,6726714915592413,5995058603178206,5500803861051616,3217409610930555,6539021957806308,7337473510742247,5242524731693288,6377031226337515,2756050571589868,8028711382618413,6441389764561135,3113800241694960,567624656677105,1093531385153918,4061335508363510,1883255014729975,6493604753066232,1298903626955002,6445941215377981,8087395110689234,2659414863595775,7501491578160732,8120972615432427,4145792771377411,6522369232711339,4018963969520001,901382993377545,5175614411331853,1978631044820971,1903633811736849,5453831423617298,7860563295190062,9001919699228952,4860977024514330,2376784102009115,6068951745511130,4355265301924126,2959725902522655,2446507305564449,832107770321186,5276875870660899,4635033598163237,4842591110428967,1559964211831175,2303363406350636,7459423677113394,3596723624655150,7345475783167709,3785404777568560,8948072973617457,1839335770655027,7506074640391648,4723936623815049,4394880825338172,9108340639063401,7135138689866048,1185710905047361,2353045636462914,495957856627012,8732822431732790,263527479847239,636508945398088,7216881382848841,7529431108581383,1297876388792651,3173983418288461,7199375808522574,1559264567765389,1987363902536791,6101227314106083,3567542418389334,2557360395654201,5437966500200164,8482247320140123,2677254289049948,3853552288262493,518076508506512,5342369863289186,9189152930890189,875588512434532,7599583280454575,784658345687401,1274201991285098,1441515080396519,7420264629636114,6762326548171120,483348184811890,4266642012678516,3341507944806773,7706045317739626,8514999855516023,4475489118169465,5275550779992443,2635045495695742,4922365850573183,7442420044879452,79217249615595,594684579641732,171458001926534,2248768132221319,825220776753545,8122845796864407,2560549024704909,6311380195694991,5434272744008080,1424643346762131,4197490382637460,5886067841362327,1805222612016196,7888121911941436,4008786844260763,3347474192042397,3488929672001950,6023108566828101,848721535216037,3013362941720998,5197256242571688,6285124191289756,2337907999791530,3191909348848711,2087057658268076,6786094656899502,1652352100161967,3830459211737521,3547746445719988,1351499112233401,6405262704085435,8146237756830794,5246312295995838,5643240862239167,1795544633412032,7798237498748139,4115262509640779,8203115445807557,4666726824311240,2596002053130697,3159701697063371,8683805861530063,1778242509294034,8617033189149140,8217173740493272,8617594212530649,7015790396824026,70265923824091,8737494948546981,5264418991348195,6503044550002428,709034931999143,1421602687768317,6190818471786992,2041544847788532,2875834899487222,8918394810395049,1623483434277370,1727169400580604,7768428034740650,2781804830206464,8482767251781347,2623969094720004,1678764707882070,3866479640349190,8033033516541697,8827502275498412,3049336886909451,8653219328845594,610187567974925,5032779958839823,7292063695995992,1362058257287698,5925563678702100,2578629647575763,1486714296027671,3888651889018628,3397433524734490,6084563426234799,4539192285477406,3525698514733600,5915543436481327,5482306434337159,6424427348334342,4081484619913766,8906999356996883,2830428014082601,8798429442419243,3647883477260844,8726171118783979,4702122660497976,6375221759576633,236779526220349,1868723269585470,3842524200319551,7175491926800962,1090196750293572,7415876291168837,5109677343119942,6350995657675873,8139503603427913,237579024980554,2593497153100366,1248655098574605,2756978422852176,7195380304001617,5538930468178514,6486681056620689,6559455690013113,4949250803364887,8412272893848153,1723841151044188,68860408343653,905695458785890,6993885286025659,8802278723304036,7078612381736358,6173816214542952,9168492783108540,7289279608697077,6317547516011623,8873539462765164,6905166401787666,5125200885148273,7443259159046770,3099485917346419,7849893361469886,8485871005645430,6477809343277687,5962973093775993,261926228597370,8691986296842875,6727004380413034,3834556389313150,6752249944660607,2011206057509312,5238815189355141,8830490007440006,1033582737816199,4363046466308744,541959268555401,1797303198165642,2284258909396759,6848628917275278,2656519453145744,4874952937597585,6889719627880899,8678249936640578,4990998160681621,3484996857019032,3241824526826137,3015999469947546,3328578741406365,6698810453519007,1265991794854561,4483026856942244,2827861308312231,996104492968617,3795949646809772,6053610728696946,1716991140670126,7431910899758877,1831872852277937,5924700975008924,6799443818203827,5076552093514421,7246535767870135,4657303421528765,4552055457790656,7510650862213406,3422892041732555,3893262846185781,4138536396356294,6627141941672648,1693196097063625,4526938645088970,2731215567239883,2663375620636116,8860608301697182,7714280745588975,8610160831974098,2095345928075987,1440431595780821,5846305864504171,9110095193161019,1122470271769306,661151481445087,8706805767408593,5294275793738467,5999096583673638,8316523916948235,3743924128819945,7845899009334221,3400632123194091,5321859951799021,9023651355835720,994308550015731,1669031183858421,4402143084781353,1686827846148564,241331235101436,324683648834301,6697017844206334,6745608545479424,1301957561166595,8147439718750982,4373650501020423,3557677947017994,1454771836984078,4027944642979629,633106053221139,4242808956136212,2587905060653845,4282459337575190,2983461663113689,1394352714119960,6277968515992345,6749100151675674,6954816654531358,6513294958590117,7334034694511394,79007152802595,9219999120210726,8085875745540274,6061877385427753,4113101791480618,3392400392379181,2020250073688879,3958671937493810,7185609371896969,6380356678908729,8880291889525262,4485742654401343,7685708138618899,8423600816339777,7006477861972802,3302306111401099,3541206393355077,887173487123271,8620242805401399,4097782020987724,449764345883469,3519806489852751,258450410981176,4924746861189970,2392689065306595,1301362479006862,6993319233956695,236258353390052,1606637797276508,3684105766338362,8663660378956021,3332795770415969,1844403335192545,37878577412964,4169990378150761,6875490626292586,4485906862390123,225988241742700,8070410143284370,5192118225382254,5815273360046959,7203659442744178,1577776738470771,6032490258537332,7651493222157173,9091035019410294,8126517757397481,1618375532108664,7353494121470841,7561213934209917,810343061699454,8936010286291840,3826303079451522,1647009746033131,7823876673358724,4044780944845701,8136858931350786,2178953385631553,2370614328806281,6381788502875018,2433898361486487,3071602639223693,2771552160193422,8836044945896600,6566694330678163,4430949784013717,7709598228405288,7534747515030431,3703468221782944,1087749313592225,1566846942448795,8794101093156637,623506968345510,2175595157154729,1915721120353196,4356857373629357,1842270257068974,2891255687486383,2918644271328178,5329499696528308,7786716067900341,9019362800240283,6289086425975736,1441066174626745,1040943956421563,7416259984048279,4931290167299232,1034714675772354,1226259361749955,6872140933143493,7269394299128774,6691524686203850,2480739659693003,1624628444294306,2937059272948686,6442802221397837,1362248611617744,613417479797713,8221340797434836,6143824281017301,4968846076050390,4538817020914650,2586260151843803,4337747795659740,4213659193687005,6848715154045918,8762249175692665,7796793055394784,1246215536036834,2863072203533283,6369108943510500,575477822707537,1853236189207528,2395106122251242,2431286987570155,4605274132618221,8243242683317231,7442703941164017,95299597556722,3921501740612595,340293622497790,4306624652393463,4698634642103289,1624739856092155,2568062394166268,1324846827502762,2850814782569471,3004522382838784,5108863078898694,4251604574383111,6227845223521288,8806024658861065,6274217669696266,7184353675041803,2914795761445900,6563315160206351,7494115199962128,4303267609140241,3156944276864018,2651564593503251,6644661110103061,3617670596533271,460580543248900,3901242407296026,512954021885103,7908323244564859,6201058890836485,8095815471548891,192709735873570,6385224218438696,6129766677433385,126348862841351,1453655841397804,4816748791122990,5502372834475056,681137258208307,3017833617460280,5715979382246457,8166484168641595,6439808764488766,8316406735948864,4805170878549058,6561532477643843,3864457852496964,5340371733175365,8691880957919452,5160186787630153,7940050763817590,1523358345046826,942485145467980,3953546123213657,6703755820477520,2434095161834578,7949151372371811,5216364370234453,9204064322864965,5207312869678167,7136741540824068,5239204143814500,1410319990209626,3641000276525479,2758523067989087,8912480651807842,2245632752540773,8944700240505959,6481431658765416,4188440357612650,1738440261762156,3906946772961810,6643780079885422,816028610755696,7352387090567016,4792395065523314,4975515712535669,4950019763469430,4367683948641399,8177047268733601,5370043587824765,8890171324427391,1222138433469570,2772152389676907,1469954207157380,1757565792160901,4719633696471916,2627230804683287,7047168781622413,8993294618434703,6713717946608784,6813038456700049,7653418342145170,8589163151539348,5384659971673238,2619373286444183,219447692176536,2742595427327131,3704351961062556,985804946554016,8492953013231472,5351105988451490,6341965661965475,7338650740165796,2638566291887462,8816146076716913,1412974396456104,4570022519684266,7754480598850732,8631410209135790,322374640880817,6189027593407668,797327697349150,1882698016124090,5272267761249467,3418622779927740,8421898045016155,4720469031701696,3715410315993853,8946413257531458,1308274733636806,8722871821014166,5732776453729255,4636391883959503,5132931438341329,4640500744985810,3204064587711011,3221349532255438,8151705046617302,5909444756462808,1743355317378265,8109479692590287,3275061495259639,8110724879183071,6309949354548450,1861632565100411,8813421552282852,897210929716453,1838459307412711,4819586886008041,1198633621900522,3213204488527083,794781823196370,5549519315487983,8044189006696602,8558117445246196,1220365941128437,2320417142562041,9018176141326926,8814608672129646,9158339605241045,6754270791711259,7834782129196290,8557552677895430,8373475303419144,9066127881272585,3393355308228148,8075764452631108,7241666060379016,4701171408325907,3106839325465877,804790373657878,3608164999920857,1750788280769817,7933058750323995,3028497672363292,184817019104543,5383196484416048,2145015248174370,6188354740509988,5716179479281542,6807447181351900,3665731451161895,4404284603714856,5049484353379548,5470905645585259,5519524013964588,8706108316571498,6882505380506927,4645519556905036,8346616019299633,3403126846356787,3112102230187317,2368011617017144,4923183834885434,1418934958083387,8573140353680291,6896755352687559,3978904572590945,4328667611110720,3362713583969504,2712469352295747,1306995003891012,3770662451658053,6615561519443270,5012702507887943,2362988176133448,1051831162182986,4733582183058764,3813095621360973,5921953278172494,7942717148176857,7201677917277527,9201688738663555,9028049747389668,3613980998991065,7049335358254991,63061512760672,6739729734332304,3167854745169251,5556302789475684,4170096552906085,8487042812984679,6165527512231273,3743961606118764,330922710986642,4394433086984765,7390108201524594,2659429204105367,2491826544168309,5747091809356351,8621799452597628,1969290438471037,4050405426855294,4980337745317250,6704524459941099,4907229094236054,5308263417695623,6414820039056777,4702819983039883,3382919947849101,5238794761305486,3260711832345837,1262772867194256,338763742866833,7309197632105246,4067608178894646,4303018541751702,617149162377113,7215172080999832,2812252754570649,7026726828875162,1455195525717914,9223118495385181,5755148248369999,9081149777243962,5664558385331622,4005664091823528,3106216145069980,1089622775373227,4890705677618605,8998721014763421,5326318714572209,9054561477373362,4640741145730483,8319220080893367,1682428789198264,6754404320407497,642426740977084,4895792177544637,8964935542801558,8970244747874230,2310932547259842,1827317143739843,4932159476088261,32720583388614,22436748869063,767086167363020,993037319900623,2582152908189187,8041472400510418,3164673918778835,4264172006899156,2436684815970894,8274609046761918,8557903874342361,5332383884406234,6683574890925532,7385281337638365,2731163567615454,9123221996191199,6275239700614624,8267467956307385,7221145385089366,4546705708781029,1731917309877734,2248842372953022,3636743414390248,6951475785969129,2282720749063658,8558510186481575,4352264832251086,1821788769451504,7545549560685342,3026526344056310,1667659350277625,1521917827547475,4056450730163707,7922407005390658,5146953896353278,8377045681753602,2085185168616963,630338109935108,5849647596177798,4730025346698760,1520670471814665,8111086886878733,9168269925387790,6900353371905552,9187019953255223,7676374671344503,6119824679149076,9097312802000814,4166112837037454,8634687974557524,1337628063174169,5458247778803631,3682556719074844,3976857796177437,8360121306811935,2206896186809891,8641401588059684,2070212227283419,7462740933910054,1906624155463208,4914140971938396,6249722101136938,5508172687384112,8795656055737608,575808750009907,4379186958081588,7191616510828090,5657379649166907,4193814242680380,4170570524204606,6931880560750517,2963931588390464,8006529920058635,4931346169429573,4761478884777542,4945257686912584,7663983071755849,1886288263519818,6031746233252390,8931368535989257,7542663025439330,5097795614465614,1552434896567887,8847647794654800,544158535630418,3116006636371540,373505521331798,8871264898674617,8427770585341528,6709366269492825,6492642808743323,5988120362038244,2128604220796510,291482944990815,5281919610588769,3234017377726050,8348394730450875,3546619208322660,3446677273681510,8600643100028520,2122484177682025,7891129803677291,5924457669303916,7421155197664877,8688098264865867,3431633236029039,1300654295630339,330786077326961,3827052685028979,2175217154575989,4953520941928055,5359003787251321,2767581460209274,5168095931742143,5622912960534679,983924183576191,9099768538697754,3390516959981186,1710000774639235,4902303102066309,4321959984561798,6523600333708400,5109300718010988,97218239528215,1181330355248781,2250602223713936,2734910637948562,8206502183640108,2639786389040789,8504376026631449,6108079473434264,1388300688154265,5890500524613274,2240124539485851,2035006005800604,2754188550532767,3248962484850338,26287827857059,7148786573473734,1026377179139752,5571141421542684,3761600094219947,1256640649862830,8185968163311279,5723360613174961,8954332891131570,4277335625461429,8245057303801526,3169899476217801,3171002127912632,3441473387278010,6862983510023455,4188529001987777,7659188190363330,3554990670675653,5774588200541894,1297804887977673,8825445874978082,5422524323675854,3537635261353679,6154044390055632,7580133915541201,7971077281492691,5311467358931733,2948428341853914,8762439273176031,7339638253436636,3788885202019820,6707866534375134,6404007857589541,8181637082788363,7189924519128802,3887157124997170,5450391152627428,5293195954577125,2179376799342310,3329572358479591,8048905893588712,4118511580192039,3118987320689108,161703652773613,4935736916954862,7602933404559997,1506067859087088,5183848285932840,3501532163673843,969964248239860,210254306639605,9084508042341673,3393383322623736,1044805198452692,839793820454651,7018780894846716,2930455752163069,1832185633140479,5181701176680192,8756402017750788,3956611570896646,6708416662777611,6367560505949964,8730345418511159,3156079150759700,1362615270285077,744890819944215,7868000644939545,1123036446535450,3003977055285020,4135239890329373,7794594152009504,1470755860614448,7195267284487971,4850416975110790,3635554613849897,791032629477162,4381819528965931,6857270928428849,8823940150738227,7956813340698590,382444380241718,4545598467907383,8699554965830224,2997143991168826,1504556618186555,4686931442621749,4269687397535553,9120863595745931,116589162149174,4022759826374625,2141853098602315,1777196050722638,3816921235783504,5815850934161233,1209073613719220,8842166304411478,4632328774704983,7265214886344676,664148708543802,1425717323808606,7016013522095967,8580785194524512,3986406154350435,4681292948524900,1271418044329829,4061806001348454,6044345273651048,422511308312425,1826330203983723,7038403765708000,2318304048316270,10488238202736,3723937100369777,2096898035052402,7423169727770483,161079824404340,1274620100427637,535174405242742,2099063362121591,5855779389325177,3085149344263487,6723338375213516,7007797886193533,7481277435571494,8857205691058837,542070582267778,4041186263318507,4470924445011845,1206211162570630,9004420450410376,6687712988946313,8831501810294666,8817294598954894,5036798356324239,1263700249378704,626856661077906,5497711469317443,4596977725284244,6929844442427285,5057533782544278,7087909241175960,5290138398113689,5099225536774042,5185292997025691,4157036191099546,2979863276426845,560595737354143,299338513289120,4119496559112097,912864977850274,4039545094061988,216567535951781,3895255234408358,6347233558867953,4017557037637544,3308097294602154,2243927260098475,7285281755504556,2446448248831917,6973420924260270,1756687539404719,6156443877859095,6798561494695857,2568568963432370,2750657723084724,3990411502493753,8905242881675190,8644602754274633,6030579112674681,4453509640376991,3917053492559807,8389710985342626,1443836017558269,3133091751006148,1754953295925189,918636738293702,5667165625081799,5343561945915586,3701757881196489,4363130678030282,1935543794859979,36290201018319,1188886142685137,1949512905760723,755903919173589,4519916921675735,898690320965592,1620056107462618,3829578382779381,7857866244499450,8642820142817957,1041656748867553,8752406983647202,3148414190718951,6060219132825123,4670341057243815,3924585430480893,8796314743239171,5464815035281393,7660657009844212,4859896893792245,3085856755960489,2542310866558968,3490271597518843],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/1bc3dc1d05e30383d4d098b7de944951",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900135805.1/GCA_900135805.1_11893_6_21_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FVLT01000013.1 Mycobacterium abscessus subsp. abscessus strain 855 genome assembly, contig: ERS373388SCcontig000013, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"1bc3dc1d05e30383d4d098b7de944951\",\"mins\":[626276077666305,4863077752590338,1011188716896261,1248554743267329,73132982095881,5766552187666442,7230017427763211,4703194071719948,7783023768158210,4752809934155790,6917813933936656,7148659144773649,3907322345037842,6983943137461111,3098380142768150,7921743915339097,7719618120876057,7610565717278390,3530882953109532,5707295951405086,4167898459752453,6496895110189744,1003858589646882,3633869109719075,5147490759020580,8319531193960481,991562376773670,5311849273853936,4626473145479175,7762249619774909,8710229247385646,7810601247536477,7840405265695966,4875429438124081,2566843699617844,8528020346015070,3845666108928009,3141154841235512,8438984433762996,8341634782388803,1827259492356156,3052191590039617,4854377200140354,1783081884651587,6902415385763908,1857251630653511,2030881848528973,1899057351815246,235324610469967,3404409914994771,8926512700687873,6819733133434965,2265013853814870,3302288979914839,4439857723191384,511247359287385,3656735091892457,2901739980214364,9214952761610333,2676809452499038,160543575899493,1508296557674592,3762350197944419,4277904111431780,670898065145957,754561619664998,158636326174823,6787136364531816,1964394433589353,1779013259456620,3981153088589933,9140604607270175,611857643343990,1394284088828024,789311551852665,2399458186068091,8372745159544961,5564668266454083,2184287563374723,2712395937816709,2566954650087558,5201186620186759,6183011515072648,4739743053602954,3914542698713227,5280650527207570,2509269824909459,644805591621782,4892292904173720,7815243671330971,7394701071802529,8605756432440403,2439904069529764,2458973970534565,8103952677875878,1216382159147175,1452504893374632,2607841287131305,6973140918575274,7522731158737511,4950419667996845,442473438834862,861233790189743,3822862375854258,4086319398797491,5162869685960885,6317978733748407,2821496976634041,7849054336073035,7363800835453177,3296228271112383,6981047644930243,2417815139954885,6560532142645638,1728914999275719,6061819263127752,3201524384338122,5967528248357067,611895509188814,595994711829197,1654346482827472,4071504271529149,755992464752850,1794766397452499,7281894093533144,7704203600982734,4021842006073559,697883772072152,535064198021338,6850943074992347,1728000434241757,7700040459251934,3050128574058720,7503192874363600,1426599808704739,7379440207126756,5735400094036198,4126644916883688,2858758815572201,4066639386767594,7029553267683565,1113871677915374,8655138634480700,9158338825060592,1444746374770929,2584133273096434,1406203390591219,5568958041957615,6438010983211255,1389685325500665,5544166945808635,3321902361899260,5872222667372131,6319801054900391,2014182259929813,7706197280472053,2213156141854978,6225787783820673,7345204186556460,6489758722048266,7346244296147211,1596783636903265,2159685184143634,517518768402707,7991901608476948,663788239663382,2589294482579736,7646541674276228,6042487047231339,308038249054494,3656942282023199,8107792064700464,3750719267709219,8891216397928660,3340178814902566,7672301657501745,629274020802857,4289506995605802,3767736691593515,7572702868201772,5417327501857069,4686983469052206,7427369301537071,9003763193301051,8550966632415539,21703424012597,2803034997526839,4219053940511033,3420580874371387,4617164804784444,5109651890228618,1977717666439486,5522939550454079,4866900900520256,6866762797818360,4679893381837123,7003815748600132,6890503517510591,4179571091382598,4061719209713991,2729725831979336,8496311129652620,7981641465438539,7586618135843154,2400719289205075,1391070769963348,982420035936597,7373828971262295,6659241282548057,1963062361928027,8245531828658524,6622194946965853,8416844572026101,6746475283186015,5067286938689889,5620751313908066,6282941677506090,434190235644260,7418008050512246,3368008396681574,5854510236181905,5191172565798972,9077648518549866,1230122298040685,6457660111769967,5785071415001456,6708263265354472,2685744681890162,6207925969699187,4393669188178292,4608609180762485,4694054161138038,7253881337502435,5023717431452024,6543713003632015,6987046063731067,3358085626667391,6341196242964864,1290632978702721,8115118877335938,759876879991172,8776822694317462,2763321731137926,3523514454184327,2307068352737672,3897815570262764,6201095041002499,7393601666396226,3047620833808782,2383546555629967,5565099633684880,2526755095680408,6284046830121362,1358610088853909,9083497879654807,1012971335741849,4250791818793370,3526613358817691,2614576814338460,8058227172245016,1752237469888927,511240727413154,27105153130915,2720232323322276,3067492753445285,6433841486225832,6588523676783017,4060419965575595,5406070332139728,5499410640788210,6605678925423023,3651148508881328,3547899838808498,5431045217305012,3245826489819573,4167805797425591,1045742946492857,8867975271704800,3076854455402940,4407017828270526,4601604895379903,5074204251304384,6594062862401986,5398857422041539,1492195759878596,894183705256389,103433463864737,7229397824123075,1526186960835021,4005514137610317,8566652864804480,6466664950951660,7421160961260032,4134237034755259,1841110019228120,25845746049498,2662873588211791,3941232659481053,2167600481149408,1999437750997473,6106741170239506,8544506528663683,957798002389477,1773051682955750,1537389728987217,2077570673345001,3391935380279787,6074375445807596,7428016355566061,7958321927074288,8156431280075250,7011969954395561,1281766356451832,5525965012052052,4518876572733951,7347148064870912,6985340072550913,4135573074289155,6401494551382423,8100244204434367,7086068109902148,5551566198297097,6276089319182707,4798234437169676,5121112877387431,1016119930069518,4225719838756269,3274744627692049,7638862922178245,7197179312116243,2929367879348759,4591487622439451,2824209489429021,5210357417026079,3960214082925089,7926945006248027,2233754655965732,6060241126861574,4015047766569513,7646238790103594,3591925752615687,6869865530200579,7517232014635568,7792982064136879,1782513860473396,6074118410895481,4906389956837944,4869565094175289,6607322732073055,3970344727573052,8986831691250708,9007335809499711,7310389332845120,2292314083823712,4083509074305603,1113674266486198,4451965628281416,5009308937892620,4158632551613003,6250793179669069,2147953520865871,7171488502243921,3630467019395666,5706463972384867,6767647999165556,231541315539542,4625783810232919,1660890418803288,2733595228148316,7468884285152698,4337224009073246,1101835988255327,5819812652055164,6437560745240415,9015825458643556,3459789550535269,7404630150175505,5297495925215848,3381710740333161,5133912432018690,2161012454097515,2987845546046060,4987371758015085,7734451850348913,5586980317855165,5333473019261553,2641194151039602,4491488878375539,5366603471262324,3619203013911157,2702121779913334,5835398525057763,5148525664873236,1406604159890043,3412333964276349,3465582021415550,2229712831160959,1746999346102914,4999305875079812,6279162399871623,1602019840245628,3182239528260234,1472874169496343,2325377695335054,4185080297337489,4726439991300754,5301398778523282,513956139055897,7645177741359077,4773219011850908,5047729433039517,215446413742756,6985612935093702,2514287601033894,7068503751133297,3991007786910376,168549419000494,7023536335001855,3997401817146032,6366047666635442,1278878776402612,4707446062052022,7415703122332777,4513131885081272,1591440902005433,7668996265607866,4306083245580987,1565109582144188,3235448389631434,8703493169548308,4678015555756735,8832784500683456,9197844677725643,4776945790877814,6331707738923718,2260560993112775,7442472189489864,360217996604105,1240520486458060,6799401940484813,4665731542307534,4128242862441167,4938111850578640,6893795962024658,8491401144021715,1756716557050580,115348717781717,4022219504710359,233846381703896,6226227228705497,7978213634866133,7709145998287580,1394953923072733,5633435418351651,5077009041318626,5717857650419835,5230108513821412,1838419127472869,1539981502923494,6135864309657571,4847843246125800,8992532203774759,6717188104549100,2611532068238062,2179935969157872,8226901654521654,2546931073401586,7475381664174835,1013849825247988,3453773512975093,787352509874934,8151315523543909,6184412479415556,5293628289756628,8095040828950937,8934430920857727,5024397954355964,2691979973567229,8663824800551679,5229814688867072,6288016461636354,7110514341395243,2292374135333636,1885081627562759,7710330153620232,1903044935774985,845446305198859,341074646864652,4099408905753357,3069264792331022,2598565661700879,3920152856867601,223052708664082,1801358439841923,6291002694349588,1109296485253909,341000969982743,5618330761691929,8527681239728924,570329549536730,5663248917664542,6414089374511904,1353707998200610,9026378973711835,6278664519475334,4911760563491623,6170984734384937,7851177807926059,3310709715370796,8371705092342573,6311973619492079,8269602931090224,163475831751473,2331979389154100,4654899609875257,3794133461209916,3733798975390525,714642671338303,5733199678538560,3575181349991233,4668833351726179,3838493080052551,5315363476992841,3098208973812554,603998106137419,8939944714949453,3415617079608142,6548300000589965,8389821908462392,5587773726864210,8308049053871971,853739712906915,5194681329996630,508190232609623,7306034231853915,6446701943017575,7691855885223265,7634541561933285,1622934081512288,6602743156594966,3782871057224547,3223170974569317,4480710174847846,3894798851707751,5411468980265832,8508952541872956,5014742536311660,4675154053706605,5588580062954350,3349992992359229,2892232316423656,1103838325470066,5785984040584051,9066150887351787,1086405627650934,3435023808127863,7938803435922296,4498552678515577,4859862890910589,2192350337824917,1667824378106752,1249890839942017,4413257193997186,4536317246387075,6586875744157846,6704616368382854,8048274815537985,5135564755456904,3729097609606027,561453727302541,8303043627691079,1823015478236047,8799745752039910,7936954551083160,6410440647082898,1241825085399956,931772591834005,3829558707987350,8668028562920343,973874995540888,3387583544195908,2905926459724757,6344605801112475,697394182329244,2339688932979615,5913564068189088,5055025330693025,4577777517937571,8772986929807362,1663240351538673,1225274084844460,7127282878477231,6424236319085488,4238425038087090,5258560470348724,3610704851854262,2448135802368951,1302201675219897,3639295089392792,3081847678436283,1663335090942908,2515549585892285,7126080479114175,6979943433052921,1953873384743873,2027582899487682,2140259379520331,832101369410500,3409318825857989,2798995724436422,5734389240542151,482550070289352,8960461425521609,753442541615053,6123577052910540,1514540918846413,9153975900981414,4113519197733840,8378178435659499,6302177589741731,3662107277194196,490068834935765,4088949070980055,6410921384100824,4512465384018084,6845336011543514,3420491078419419,5027184603751389,3831562849747935,1418718576796640,316262226939711,8231488483148770,1227137997091811,8841978994682956,3174756445467621,7773384283509734,1164102679643112,6750963922122236,2424327382721515,3808538401575917,3071880324412398,4424034821043187,2725509759558645,1486447684662262,3539177256993787,1786592949789694,8276462627855926,6874131185435650,7852700934030341,7351518893099398,5643572070810631,7856877515928585,3428145128006667,8474683293418069,5130948349776045,9170391048739450,3020050645599249,1898161125245970,505772007760915,4532581677356053,6564083406128152,2221885490517018,3325791856157725,358371172762654,2702532704678944,8719272356952884,16177008712539,8404447757018431,7065350764158470,6577110195106377,4491481676543015,3157350104704040,6403464755504955,7777635666433067,1625756431635500,4076682346124642,5560151481607214,7136032267576367,5492254914044977,5858603082246323,6924133100545076,7275411683853833,4874357001724985,1634070678324282,5520389781705787,1119983815062591,8394751017132665,1818958220850016,3105588174931011,1165902319506501,7772390674342983,8722450596737145,6070682441372746,8567337752461495,561649140991052,6328892308620365,2228396749091920,5366217853727826,2036239405241429,6301918581736534,6292429908440154,4242100762268765,3128450694357861,8978012512448417,5625286815402002,1951782523905123,4641043284726884,4734812896511077,8372084266217667,2251436392408167,6088684784632936,9129987599234153,5747719316571243,5950712444319250,4029681454728302,3997983587050607,2834895239185521,4297879293744242,7330835581251091,3302662956463220,8958347233322587,4981044452561087,6488063242771306,1824116572525694,4351552910378112,6032419789870209,1197382333647723,8866485919811927,6220178388186648,7042366602978451,3300601135088788,5962622507828078,7113778248281746,8350804890088599,5091045275346072,5528147436691981,560855818593437,3667573331367071,2278993639699616,1805008385803425,7749528044308790,7459742248992467,1696661928113317,2865928470971558,3277729037251441,1269322391831720,1578681020232875,8981601895152712,1235215459050850,962684259607726,4564693988586671,7287615999870129,5278322548266163,7821311362311710,2456918627165366,2287077812802745,797740591584442,971313563935931,4391230491608253,4642793447048383,3451554256557250,1658966502913219,5788391050036086,4346395821839558,4665039597307080,9027135987444136,5034001228071799,1573964222616781,3183530344985806,7933478468027599,5123738356520483,1312181563213011,4892148657222973,1892529817990358,7647128391177431,702308083889369,6001076386755806,4473191889365200,8233490392007907,3558440361932004,6551181090450445,4301454957679853,7105235920930030,5062687131963566,5145809053349104,8837935141320487,5547004253205748,396236818187509,6677124310394758,3358133979464952,3821573186090233,6841872255612154,4870171250341115,6933326545421564,3958354662469162,4407175915394302,7114513409455359,6528728465773451,1364946221790466,2986795585127683,445778699228420,4160417263031557,3861534272480518,5111336736535815,5993360972434988,6741782302221635,8135767474255115,108938401264908,904025472062733,8644040206787854,1220896981923088,4524705006776536,7229071645730066,3307354363897108,6092038425277717,746316223165718,6858327259773145,356382966101272,8926698934154799,3443004895126812,8806287504401761,2922028888233248,7104602790331952,4412388360504611,7191475703587718,2424286790427944,8092044670128213,3693700545893676,4515554611623213,1049014234371374,713369933153698,6160583227708721,8273873240097088,8633250998621491,2802579165992245,5991226711439482,3496695321130296,2470943848805690,2896142230665075,6064816291348051,1242411032028477,6600998793696821,3259971106545888,3899907176109379,8025647517012437,2413398587729221,4144694227338567,7291460037396569,3384412547581264,7821867613414248,5157990733924037,2566209510516053,7347764827907414,3554151265002839,8452027396704484,8597507364260122,5587827951398007,8724078934783324,745843024592442,5159557357315424,1428344281687393,3100289179321698,4565392535552489,2750529895794918,4802937521382759,8549209360188776,5000392054457705,8085587504423550,8797778980042091,8681128913903824,7745240469701522,7029874014242159,4420104974091633,3640347142198642,7864589341401569,6020329284294004,5829026645638718,79069506958181,3199416214832504,8488525318677396,6330595470349690,5671005688973590,2530522481886592,1129866385712513,413979367957891,5550848642741636,6910945536527254,4015706666382726,1418902631437704,8003239790122377,2267468505712010,577006485628300,1282262709077389,6404758038410639,5365743580984720,3641109619840401,6049171691063972,8119433240139624,3556220372123886,6671791878800790,2760293907973528,2219596076045721,4660874786238925,5777148946232731,6492724985570716,7044120700011933,8638368196326814,6492618092950943,3698935323555232,4388810921866657,2466925881796002,6379874624177051,9086183299474853,6341026674624753,2881039038481833,3277886834853290,7731680948471211,2767423501531425,6770741246436783,6213979158616307,5767163218859444,4595114357544373,2322417365476790,3411076601759159,5025741254960569,4899613834474938,4460888755700639,3397517155718730,7940429915847785,3408004793288127,3656931193955777,7963098778797506,4304173246763820,6384054438495688,3628410108118473,6010909054207434,6603250616235467,1649029295249860,3570238803076558,5648758555145680,9130467097716177,4402065179481554,3356022969976275,5783941402736085,6316694233626070,4197278144738775,7224889387813423,4507473871603162,421975256245726,4692814354212319,6055939320964576,5893423159637584,1869059886085602,7552546789492195,5377738936247783,826266114627048,5317350291210492,3850174625490410,2943829670221291,3978943628625389,6774937098273021,9083804648048113,1815986195269107,5094398606492193,5108391377397240,3807098178758137,2485542242144511,5358420465587708,3985340043908605,3517802869146350,37557390265942,6425263404254726,5272447251289608,6828111974065068,7571671484397066,1188087835944459,5464733456877826,7226362352199772,4157039477990930,3326523227354643,7318112747894293,6494610658064253,8430954664781401,49576017659416,3737465852058543,4476797639566878,3082816310662591,2920057743238688,1654472801142306,1420943345353404,131896474695206,7836096712727473,6571600156337704,2730570767619626,5599298081912363,7302114181109294,8628749309695654,1051342224643632,8425266171671260,7311890395223602,2461964703348275,5169846298818100,3149585803400757,8522551417648694,5875667220596280,6346683763234361,6293306947495482,1351397343278652,3391622780851773,7978465602825141,5102528195256859,1319143125046880,2404909172291138,51733081617987,1085328903153220,6000096302433862,7504299826509384,3713538787956298,6397910727730763,6237686493328972,5594590193710672,8639075642681739,8768529095979490,1113065818576483,8827356365293140,6000357219870990,8002501432091577,6921795515269907,1518923765601881,2638429525299471,238686959322716,4375088443139002,8316287570400862,8671596902618719,4377494402352736,4103040481715131,6988185770064815,7528408610158865,6516149251729878,9051638033167978,9202263422219883,4614279620580972,2692652112635501,1170117136811630,3567140466853487,7751202609772784,4457196613121649,2541876271011442,5012165099955827,2122741884733044,7390814473967221,1922767750453825,986018268628599,8834863187171604,5685244145636986,6629970022463099,3137371638408832,4593370175538818,1086283607234838,180998035745729,4822324179801736,7556057926928009,1606854342366861,2720125332686478,2500797126241901,8268801352537744,2541354836014737,5048530314434194,7965430059877315,1381605541422741,5704536799667863,8035997683559364,5409400493930138,356628933922415,4985156875675930,6124420760168094,8024350491280371,4804257769232034,1650426864593179,2283403189866497,3258373684848293,4453281584948902,5326411427698289,5925402719487657,2471946108323499,542343672526509,7784861817484974,1383948924876463,2609942277351090,4892779359839143,4840620647884471,8743705087870648,6500432964306618,6581973672343228,5465256082036413,7478449429589890,4241005649467071,5127548438087362,4150810884048581,3755354362575137,8368345054867211,7737868084709065,4940227333887691,5469372786611916,2679628988176077,2411958743197390,8739691466787789,9171016046260235,3431829158282961,3838085722412754,966590170396372,4473524831917781,2244650618902230,5965184542844632,8270824270493401,6086009623525083,2943938890651356,6850270140679902,2968476043511521,2495355206944482,5075802864285412,6867709447094566,6019299568761809,8614730687497960,6048814596167403,2811245176834906,3452415927252718,4427416206329588,4946577539651317,7756810643572470,1894599537628919,5582955157997304,7537270114701451,5750254974931681,4447257061132030,3652218266347263,3640172071122689,6220976309659395,6566047102379780,5123221386471173,9080823264198138,1875443624122120,8620044032946476,7012485992097091,8336371202378711,6748469540443917,4675741680426896,9051139431110416,1318226819487505,5185174831027986,2467332341831444,6068242039738390,7365230101689306,100240572450590,1107464595609375,4425552082052897,1614899500283694,8475839902794723,3055715504293670,4021381214508839,5180628005219131,1005368207472425,2870310172658507,1937224299357995,8572024807949982,2638112332117806,3506311525521199,1924436818355780,913186744084273,3998850824775474,2085238020843315,3493679168313140,4724902965087198,6768341118966548,8966124162349968,6291415315076921,5925334867363643,3822671547729726,4713912246751541,4996545691289408,161927970297669,3551505821648711,1761158163814218,5755732597238071,5282889776686924,8289955415018466,7796585428940622,1966413282436943,8313588553303766,6307989561952081,2959333722269523,2183328330065748,4748820574734165,598751521322838,3108264806856535,2400602241021784,3980272432789337,2960865876662106,8127007250353791,3874342091159390,3553792026764261,1043304846727008,8831818746969744,3590354817255269,8751977366148967,4662960097458024,7330167184208188,3529535777807211,7637857879624798,2069029996590957,7743156244343365,8003951550097263,1468400471140208,8248454712003560,3054881791498098,3998326305761139,3751339235862388,4547089679980406,948293997021047,8988517062106833,9162998450294456,3843209960135658,7710020190467966,6872629201602431,3449103667578379,2885823264718639,5510171285768066,4530170249729003,8475437594093444,5803914830452614,3043081417066375,1632539869665162,4203758241916811,5418515751016332,5951723157411725,2445110758614927,1992531298207632,1802726486034321,4160028853229458,4793246606108563,2561545304848263,6262668773615510,3361202922198935,9094020670856631,5526092545238937,6396784485968879,5759407101551637,8966919835289458,5720260461799327,4426266606262177,6152648375438159,9003244261873200,4897941587453862,6688398473885608,9094576112766620,189108573050795,6148959529428143,2075409370871726,6171830817183389,3111848626722736,557085359998897,7083951521363891,6352626648790686,8663496280901558,2259973610063800,7034605389200372,4254633551906746,9114408424949883,4261389611681727,1430778026297280,5014171194337217,3946444002145298,8601919782211915,6872806339889092,8023975727031286,4261176238798792,9206650147071403,4526463747053218,2022786828946424,3686117096740819,5688505655814101,6411880645619817,9161518720559064,7561016364465591,4474841037490140,2258884285761501,7027238529288158,737169567168165,1969443578980320,2025900290705378,7294472517574186,3713987029141476,425714764965542,1298465439299558,9040692167354936,2685430567225322,253030763849707,8427224231094255,5051191700318192,1430455632451570,7017751538161651,3577799944108020,8398785666878764,8997391762216007,8488146953900372,3888915538274298,4245358763685883,8868108863794181,5644338193747491,7941646985916757,6376147006576640,3659434425059329,5437056220911618,2177823685154819,6774073883262465,2854438252959749,5500863711278356,8659710271981575,866952943175688,1097347913963863,8250829970396162,7430003096242193,2275565008955410,4919094931679251,467804604061716,8697768137010233,4573597032646679,225144730314777,3595024024274970,9092085244731055,8795010944673822,3560364944656415,7522766572980257,176053593016355,1788611974929414,5358998850738217,4264184817797163,5657716474533932,3400331107330093,1932689407131530,5376296835405872,8749418803334040,139565361678389,6331698347989046,6481325177358395,2369037766395965,8371383751387200,6951005700092524,4088054542030914,6337048937039656,1669206161766469,9080496588293311,1496880666478665,1189517252040778,6286919518836407,2034980698667085,459847027525711,265527352199248,2174756905412689,6921583181156088,7340244900182371,1305159784499284,6333581994592341,3535049838790742,2691586976325305,7943134116411090,152482590865497,5061327666002010,696277013309531,3313216249702492,7490220330310552,5132463405723928,8185206470613466,7620752564503276,6875614372918289,6754096471935082,1327605235701867,2470991035970578,2872921233139822,2147264789280879,2295982522484849,9209997810192605,870731801925749,143632768354422,4029399175620727,9104476371858629,570763652353044,821105705810042,133336367478463,310774037481596,7118462260865149,6986754633898110,144297056668693,7088697282144454,1233812555556993,3642878494812290,7677548879632515,4458520896424068,2120202924492933,1280088427595913,1956518573140107,8389501986723980,5511492430289037,8227394375356781,7206655281886232,6184899797725495,7536496401450806,248969304443029,5701781363234970,7917443718383771,1148953958070431,2560128877594784,4857022428657825,5646974067755170,2600884130773155,6959275496904868,848963865348261,5396298896144550,4260912466815143,9069913688950953,8701210043392713,3615724030908786,8115084404766472,7646295382333337,7553074892990641,4644007613245619,4033250954542110,4887751015884982,836443628357816,849888648505530,4165965386856636,2503760760002749,2131862191237310,6343184061262015,2674021505607875,8970980698691780,3552606172887237,496378859026630,8194089625205214,7897671193446600,3463143914031305,8770738455050442,3110727820249292,6929958448405776,7715491165783165,776734628141264,7561599664543953,2362157628672210,3511065941354708,1797391718148311,2231431422937305,8464361491752977,6711242105929002,7041077501450462,6452776757287973,428864044722400,1538286704416993,6391582940616930,7468477230640925,1718806343350502,7184083933235431,1174002567432426,3523272757732391,1158079924160210,7996267888619026,8400277377222895,322139414956272,2923859933079793,484060284872947,4081429597706484,8639290068871745,3726306836203767,8652696465839516,3684092627794171,7708406966592269,689956825524478,2224613045733077,7871534885460224,4811087177066754,8725178590779651,1511627579037957,5715538952210694,59950595504391,389956832606472,2809582483721,948883094857997,2049928208898318,597688023690285,8687907108712768,5618067599882513,7559768490248466,8295058960492819,7367715290691860,6371399580532501,3509888530503958,8385230511402713,1290290620201241,3997275553057050,318443175618843,313621017200925,54063070132513,7256655749794082,1950469602863395,7881463944763684,4940212125593990,2610377604426023,321271504001320,738385559767338,2819294701033774,9206299842554159,3664740151232816,6611491630946609,2874624317745458,8850141284396083,2387816629733684,7739697733330654,1694847899113782,1876006686030135,7397652772633652,7871716996090170,4057665346808123,7108440729236306,5814906683832637,7420046589431064,2462928810793279,8541631216754152,5697180975798594,2307876192917899,8535404245289704,2789492978604358,6146324576528097,7677341588244810,6663578091250718,730473070254413,2011554271140174,6789241275746641,7870380393875796,4715039271291221,1554320855013718,1017692134271319,6313836737370456,3130443581086042,444266637572443,4597029747665244,3939325392959837,8212301121616222,8789245683292512,8482480256040695,3735037428955490,3022998054071355,7484825522350438,5768357486756241,6973031821162856,7655792648454565,2721854827314919,8273638641641836,3720772888938862,2567101374142831,1860742243240305,1713290149079410,5899362090731891,8064430721431924,7096778429097333,3148781306804598,7436348485770528,5549014994605119,1380948577923477,8081848419055516,13933282011524,4209455686867334,936890119993736,911267261738732,2930599550359947,3614417738766734,4940557110868368,5726296494262266,6163778430200210,2441387056298387,7110089515178424,5584861646926233,4987972376881560,1025472623663513,5700819815926170,7085962808975087,1566385614887324,6708211143803290,5910921668639813,7615451317631392,3832258391591330,6020620831729974,7605121107605924,1964421789960614,6748609573534119,8559460210157992,5923654315999644,4003626125736362,600674179643819,3641676629178797,721730190018990,7314985608337839,8080390568683953,4576492040829364,8534060836276929,8338631253148566,8600731125967287,4996514111302072,7272421683583417,6992332895758780,1151206531905981,1530378667080127,6760957331136114,865935838939587,3066866876115396,7891271361543926,2212191860918726,7321847365366860,5574358517303031,5894667356301772,7793550569087394,1362270617655758,4622122502691279,3297464771430865,8360401089539500,6457212201245140,6460711009647061,5598822024939990,885212417526232,6275903005833690,2823837403089371,2894207165847442,4698332368992735,728655253660752,442092547013091,7297984845128327,1342385581664742,7954242668116276,5439726260455915,4503068661586412,5634339104430573,2417460065180142,5063336091815941,2474555431545330,5996511892322803,692480983640565,6979858909102505,7647349853560829,8897139229182458,8391086228522751,2312247467260414,1589140104295509,1946413112437248,641230451931651,7596482911812102,825873729406721,1913436089092616,7597355857907645,8915296244759051,1627726481586704,2869161317403154,8463745324677651,1519724225800725,8609756047543515,8103064263666200,8986695317958404,3539964280867357,5963756646619301,3026962012498466,1556071087020581,906106658519591,6686146854965961,2782969108630059,8017598429018670,6076081203223087,1380845328443953,9209575370899969,6447353811229790,5686788956572214,1856935612127800,2865378089531961,3483226075867709,4758847762188864,646558119758401,7676074204895006,2672797651569219,1745245072362052,1703626175130181,2423873555118662,1647925198912609,101987858664010,985265084926540,6490836865725538,1047437233769038,6426392697944657,8393779057830482,1678649579811573,1538498184894222,728264610603449,5565323424275033,1817901748342578,99437944347231,8847475184194963,2644823237225059,6292902820125284,4669680566213221,5811231961192103,7524616093581929,7618729507375721,7035843390700138,9029088710257259,847632809888365,4909634822941295,6661319065388136,8422642897701490,4419495654890099,9104760166955636,8927214449459556,5158583413656031,1662201863994473,6246844867294215,5526320857569913,3727577157519994,3565175680600699,5662540942068348,629618814077565,2597739688036990,5350171579759231,6156332487359104,5477121179781761,8588792243817579,6214203255267094,8090545125160131,6323536256810314,2366214140504713,2558880344218250,2009964219617047,1796824227698311,6527223353461389,2384334595025554,6999594270630339,2589923509300143,5252305672474393,1907721986902681,2585728672351343,8272815476779025,8378709519508033,637132238203553,3006812194732706,1569948551662244,693138484689350,7660176461761193,3928723445508778,8508293700565675,5990438945495329,349419113441966,7009158731424896,6877845383211698,5514112326912691,7416481955172118,6161826685807285,3405786435680951,2225111297121396,7859138137557152,4547852889172667,8691528315882172,6453720960051901,7815154447571646,3754325226273471,6203436145631673,9198823378184984,7834648065342148,6867523878934187,5431676389042886,1868173448452808,7047719522421196,1752610928417482,4146301460073163,9124524358265548,4838118756907725,2935248677309135,2864121350445776,8383274665719587,6598361148627668,2473092891151068,2652823556967135,6796971400891106,4424408812034787,8055357092856663,4365281351863015,7456706446674109,6001157134390530,2497151447455527,4429642695699180,5422808199863023,2698344834120433,4001396101860082,879242617903859,6054218832284421,5168641576693687,8412101248445174,5417585848918885,8035784336952058,2555081131621117,2331708517231358,6471729605276117,2715379600046848,6247283103089569,532678166349611,455571950033669,5635464288605863,480416601517185,9118054647610127,8942872885111568,5911542227444184,7676403886253187,1203873119316756,2513976961322798,1735171032525590,7636600065956632,4293431361317657,82341062846255,8963541032295196,7034763234921245,6248449965755168,2120495368330017,6520764892299739,8125061070887716,3491803482352424,6932169155138057,2053650964110123,7138801393474348,2881412180524850,3245205454134062,6620064056462130,6574116994890548,4970657369446878,8654190949239715,2575189058591544,6764556811736884,7869798382594874,1362693464811999,2011910951766845,6424038638413176,528099555121987,260687082081092,3965392593927990,2950946106682182,5292820675006945,1106499957451595,8281466897028954,1950418961316685,5002103231097679,6757446102445880,4920377210472931,8594717496277943,7710249028900930,7142210428985145,1103355030250958,4360604342197082,1345238762060635,4666670881364828,4095032638872414,4720969209842527,8218048253627232,1298332873980771,917472644688740,8176086803524070,2516182073443799,8960927396484287,366994564254569,208470680038250,622848735976299,8993137242377276,3355577538030448,8388778051516763,1163898742987637,2726929606957943,8922397793198851,4411364766826303,6244750917548925,5715780875361150,6782679945644927,3008303969287040,3433154181794689,2790236003163010,7758777261671538,1299435758898054,8583443606203273,1027850168851339,6587979875934018,3369515406617486,7660751759576807,149534822554512,2289867525520273,6426091741219492,6214103534889876,2594818606238190,1731617100680086,327608859745175,2565535870876568,6059927631960987,8148109679938902,8728510573017496,5461858100852259,4876452783934372,5472006927297146,7340370013188063,1323209745460380,2817939850652587,6837099842497452,7863945917135346,1720247111072687,4183334700424112,7406220970265253,7780381516012841,6434197270870965,1507503438179255,1661251388410812,902237463748426,6223276710939125,3759744894835649,8305355416717307,6504291826764740,3379924297456582,2486597198281671,8949507949957817,7270144645681913,5653703880952780,8530647102668065,2476897870420944,4541747820696056,5971398833667026,8291826230983636,4020365116890069,6931506874026967,7946693409788785,8619448599391197,680343019633630,5850924054387679,8397709046393127,5254034808683490,5635252479095976,9048310173550417,7079757643062248,1658644716145642,900919783545835,7688548533169132,9116832418971937,2754622796905454,3690746723068911,5230443957513200,4387847080258545,1736119246326770,2940245264419828,2750858391374837,8628106027344228,528872917101737,2187294093200376,5094767336664916,7392225467653114,6028526140476586,4106055591327573,3329573833915392,5609682838546944,9055765671422978,3324530788033707,1119778125057028,7162453938002448,4275340588608518,2028346468248583,8427469492304904,3972925633063945,6136541083948887,6373028852059149,4874455676754959,106059919264784,2320706042780690,5581798246046211,2104743592274964,2529167849585685,8409237523061782,3612802421521431,5856509318003736,7352337841077273,3300954304271535,1880521989708829,1679191535303710,6462009382149153,341430139629403,5132640343534629,6546545214241969,2371322404883501,5876051817147440,7135810997193224,459021062589490,603473699154995,422791695236148,7652801453971294,18201973599287,4596715679165497,4220006287866939,7166057232837692,1177687186009150,7311761200057525,6958029697775245,5197409078406209,1023050080345154,2773081739312195,684137432374340,5577871439703222,5447246230712161,1532587595369544,7381459055782986,2382322758097996,1103384662518861,5379036933706253,6700050550222008,7961711749020113,7355253317348435,9061848952236382,6154863399574613,8244872978448227,3462101049969752,1500085708295258,4426842370260060,3771637433543773,2202627328629854,3334111798254689,1488540034495675,3303673634344041,971210121970625,5583163849231469,4211281533394031,2780375464257384,9013422977404018,1157866641976436,8317586365889967,3481199364177015,8984050549985558,6531101238802177,3856585239016639,5819530901621885,5972419462302846,7258931501120639,4417405871307905,4072145035623554,3886090067188835,8533767851793540,9049674027271444,3523750062791815,8528267049273619,6848675358676515,5804835025448076,7473399132735712,7624167882241901,6097161064238225,6907121773990187,6547146935450819,288649921854613,7056268001872975,511707259292823,331192803134616,1947897370004633,853900909296794,101764709301403,4252545689783452,7125205280910533,5548933297589408,1066200637099888,5170526599777442,4254995495128227,8067523557765590,4791501382683817,1929326438263978,10513698757803,2765103200488331,839731910466733,1617572466435272,3970527724410739,5922195503709364,1183127991905461,5285259610901686,1188017959075000,126388692868248,8144163133467835,4298152610786492,8473726899252414,6425670017612992,5735738553298115,1330702240085878,1798627012910279,5922364215491784,8463917701747477,4082250984647882,1091895259854711,8692937433201868,4453308533852706,5651812705449165,3232107466161360,8760548102262648,3191175475721422,6481881920830679,5744441207880921,6375548533902555,7567907922619592,7565729970547934,7789512455769313,5384722103934178,9050407302909155,8236693364501059,7614858564072271,6561924160482536,2165225888611561,5328230633614571,8801168381855562,4384970821212400,1473110234123502,4233965142254522,3227969980558576,817221086493938,4255143355653365,2097849362382070,5057807288683235,3658995322060026,832392781335803,7425501927770425,8777135201691049,5945730325646549,2450627812699392,8324728088531152,115375058574594,781458224852227,186067732757309,2423069074443528,8048225647865097,7847806953412491,5826710214786946,3015705667280143,6335497854024976,6386158447820049,4243509692808466,8259363776892803,4174418625035542,2503336035448025,240009528474904,1155328037391302,3402145596144924,7747244372368671,2105853084948368,3138477460294945,7586975169359138,8381154128095024,337756828859684,507821535575333,893002804608295,8445709524770088,3388002363088169,469075009604906,1583060135030059,2683407683935532,778401293745454,3822907998350639,8564859195546929,5923114077531445,2421618317659446,3609149306938164,7227171532393784,5889910105972025,2902850744143162,152375410355517,1209928165227839,6444406348557633,754909108195211,4660283057945924,2105647313722694,6178718560556257,529469060603210,5858732507640488,8920611735345037,2162036853280080,1630022872427857,2898843332513106,7486164759320977,7553207483333974,7607399845147193,6950413383925081,9053934991805786,9210925995768071,8450645572717402,5563036013399389,2803746785709406,4620491079355743,1214500655115616,4208590457830753,2652441538909446,8305605739410145,3146529806601573,6110266337955475,6065594143486524,8410589911342443,585800273780077,8495454819873253,7055842754620787,2731899328843126,6612578885410167,2484725125361016,7301758411545979,1570537489366397,7826775969832853,8972775328202112,1850221033069953,5336728922713323,8441586712382853,2525888252063111,1520472346054024,5912653427613564,3080836749118858,5999347635939211,2425943573216653,612731799752079,1445412648005011,461701798862230,7074596401073559,4617610217491867,5999692296652194,685408640691617,9173984846536283,8376462322228643,4765434668274091,6807588647915420,6064044282699010,8839996806731372,901663591706028,2379892813176237,1416071927344676,8505197429296560,4019048595516849,7358418832244146,8266230851646905,5400165692521908,3963945716243893,6110535019311689,8353537986485688,1774877933288890,370176553455519,4605753838652861,9085187178032215,6893231792037485,1912247410253248,167844336238017,5923224327007686,5767574338844577,4642196859682250,7385227570232567,4462844296502733,6934161123651757,3339831379410387,418565720112596,6032785540689365,7385537360866777,1144902524218842,1890259212037595,3059335732338140,6279398901632250,4508599971868127,2143563433381346,899504805957091,1107463065316837,2651369680000471,2528108392402407,4604085228289512,5344138909946277,7488397110934275,6122391109053933,591301726735856,1962856295493105,5889638603254434,5669442535416890,968042114620916,4821632668003829,8640154361564663,5802863345356286,7454395203948025,4232940125322746,661513712901629,4404587645689342,5983865008998997,3057989302226433,4188208616431471,5197896908615172,1310402648150614,3485901563551238,7003589399420424,2245922062593282,5309914993860110,8424234421227025,2155640165441042,4870981976667395,1310456980598296,1739567629819417,7280643510971930,9089102413164060,5790636799708702,6126205048274181,8379679661631408,3659868849602083,3372997104676388,608767053219078,2228473206738470,8956902478738695,4686806786960938,7141006832918059,3465979916352395,4247598823657005,1635459442363950,7157591949114931,447386041490996,2753176747925046,6862063862378040,258702586736185,217658490146362,4215761066679868,1587301768224317,198983817895486,2921203812873187,7334008724016061,7126884701529714,8362608985812918,3276950107520582,8491441601941178,7319935465500232,2304025890106953,1711461952220747,2517026031644237,5526947065490690,7147328643231311,7953699520786000,6537540820313960,3120936895909459,2135036286602836,696634675129941,2749235280272982,5237610329132633,1806187214531855,1027451839315548,19861589424058,587037818506846,5514529594642017,4572174628384354,2351856231579235,7246302980217446,6715164034526822,1020935661874791,4490324219539048,3633483762470506,6473742836987040,2838626752986732,592699817999981,2241404653575791,7125432899758692,6519252493698204,1920929719652286,6497100829888118,1239448523828855,1197402197376632,1749903412739705,3711954038759035,7511426146518293,7163879448835171,6145874096666560,5515359107524073,1824370747195013,5107978253946502,5140549032066697,4491621578439959,5097805094744002,8265546440351374,8275129585184129,6754548073047320,478968464510610,856905789120147,2662744703159956,6446410073800345,7591949044063900,9153850981508262,7909733762928288,4038514258386593,4187411713589190,1073865641385639,6116716387663530,4474328595226285,6588166247341743,5841955342474928,4449666508037813,7022936488648374,4973131854094008,3754890070666937,4301811484229306,3521486831361723,3166821953441468,3546649983016638,6463079648191962,3457677407821505,1508471579397828,6798351613508214,7782777650196166,7968788288556743,8646420964252291,5000508503955371,1940571112103631,4831643224448721,4808745956667090,1830478794868003,2114014938676950,6778166845915769,6904376412777764,3665675690798813,56701084634846,3580401450163493,7705878977380064,7673697644031713,1042082827259618,6986541593304803,272795419602660,7996499478208886,3707453159505639,2964131768114921,2053598484909803,2499963422345375,2939896450739949,5025761203706493,5280385964818160,6530174826944467,5818355875793534,5671435912178241,7601962436963625,5770268590796536,1669548665487097,4685922747768572,1403192231407357,1645921157828352,4355966238391152,8912048148816727,5886947090992900,8405283125521132,6190471822982918,859726804741897,4323095500979979,6387742334593346,9219005045669648,718271665618705,6287926553107628,6607316500836220,2618341165204782,581964206948118,4338451830603543,7674277680336664,1804186867728153,5566700684633906,5006970943033116,4153017568864374,581957552484126,7179428040470320,2527122232064875,5325836084907813,8986222583558192,3932136498265896,3206920015701980,45264748502826,3648342990135083,728947920830254,1542615215771439,1241155779817264,7053143597764401,40133817646898,2995333438074093,7218574419090900,8676324721007518,553507595711041,5345295954538698,4562529016606521,6044289124118331,2791540581719870,3017716916207423,8222796618119317,6147601021988674,6117915662638915,5005850929827652,4520480650948421,9000130073698118,2530698467024711,6534558079183500,3542612701163338,7580766703019319,3771601914109772,826952354000720,545680826732369,1738365252673363,3210908843413332,2850174551330647,6784057066528740,8872910368862042,684722881580891,8511676612083549,4930433930841950,5290768242995301,1749702109429600,2146816689336161,5814055741171003,120516138493926,7923078439639270,2027719671611241,4812091888292325,5841328139508370,3439750639768893,3085188358479728,1951765463990248,3683825608576883,50754354810740,2273448562212726,274102633885560,6667489038520185,7863527022272378,2587717702061375,862077800697724,9166959499454142,25279953760128,3937171976507266,228376482303875,4941892743138597,1406717125328774,7576959283502983,2780388086629456,4112260527603593,2773173508886410,4402520905867927,2611245814116237,5273183366242190,5862383087853455,3602875469492112,8790950705717138,5421401006927171,6875159898800021,7392027280002966,5572954208755607,2434255911346072,6771662674443588,96572962426778,3459036142522267,1789548938436508,6891819266224030,441510215468357,9064849317314051,4051583224643489,8592572070166434,8151746998018715,3079592664010660,7776790492344230,7303627727056808,8487882670756508,7682023091138474,6940941502119239,3457940901896010,934159810203566,2866990180188884,1768816782574145,3467173644136375,6585775513530296,807762262218351,8283732285452699,5834739798166858,1909940635570110,5800088534196159,7480174262222784,4147594045407169,4518564743827394,6981421275757899,3697015879565252,1671318518329285,3968939501064134,6670866471987873,1277430310801353,9023308411258871,4274529748306274,661734117314510,9050906181226448,940179598438355,3443187699544203,5205350725259224,5198911368921764,5872871460634586,1238568953921500,1664818781466589,843737059383973,4048180303749088,727425107464161,3201716655333347,458460067196900,1504656904523749,3823730812317670,5095574603554129,1913196468821992,6584259927740394,7744427334354099,6143623691022317,3046144584220669,1743011475234800,783140208336881,4391185345548274,1848379236859894,7851074232008679,5118898746082456,4542012780087978,1245759219154942,1183810686763007],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/1f86e7c6c52baed6ce168b05f23013fc",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001224785.1/GCA_001224785.1_5083_6_3_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CTWK01000001.1 Staphylococcus aureus genome assembly 5083_6#3, scaffold ERS010934.5083_6_3.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"1f86e7c6c52baed6ce168b05f23013fc\",\"mins\":[5146675777052673,2315163181510658,6104821307289603,913590870499332,5921337521975297,2136238765821962,3106069035610123,9215953575108620,3336512770453523,4304708589903892,4366044986945560,8976730973642780,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,3518770889224237,3767149128499247,6506000896569401,3863448372494395,3909397344211004,7437334004842560,7140729989324865,4046441427542085,2375917415634273,2885561946520247,2343748905513037,3506453766344792,1498068637614170,2309979171803228,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,1997574336651369,3662919159013483,1307705680961644,5434311755829359,7284609180405873,7199198146764916,3954324893139065,5897781912338095,4823510936105092,7956408597766277,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,1939633497252551,1816213056534246,757043825455283,1451999676301492,7999157878374581,7169548162306233,3173772744495291,8260608504786293,2081882917404865,2766068969783490,4275434089636035,5392923544264054,197231274291400,81635630112972,5356500413587662,2722651891744976,2138247811834065,2929787349803218,1759748373012018,8291164134043862,8288761955963096,1293765200834777,5763937543921884,3264746473492702,5908374364680418,9100377281368294,3977127583879399,915883713245416,6675745817342186,5625039491039468,1133486263984368,6101035983073523,2417632473485558,8091788112306423,2345917413478649,1302574224109821,8212410875969790,6276844254068996,948489885540616,7476293558784267,1316115594879244,3963523983684994,1655653727666446,2377197744251151,3590799175020818,1803490896380179,1613233089708314,7372327805427759,1398163635020061,1090286115836191,7318609661925379,4034436112523558,5119942787128028,8091310037205295,777026232017201,3855061649035570,6922370832007476,2133264542323422,1477786791149878,3871300378636600,8019225952256313,6992758984360253,5839292010541374,7445078125691199,8895922000216384,2602070490546912,843457896101259,3247571112300869,3674047191355718,9089878662127943,4745743747608906,4886619860382028,1600279738216782,5620340898599248,3947602212196690,8604153811108185,4022123607998810,4425527205646684,1006677272891742,4530178457788475,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,481260299161970,6614587086000499,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,1873232587175596,3242446598427039,1376387293671841,2968451845775780,1188374620819878,8143513944316657,5360048481649069,5877325657956782,3299864180793775,7745961481458097,1532248529208051,5935630862422453,7357884307374526,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,2462394055594471,8940994346209769,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2188170162708984,2546695760749056,3527332718576132,162688560886278,7497816545194504,5137201667535370,2519992179606030,5181580931883096,6748402791805460,2628169269867032,1991856884875801,1893040465097246,663267648999967,68515416416801,4224499299092571,1283325847532068,7906103035638309,8303975859675687,4298859764904490,5749761984184876,1561783378768429,645136536220209,1297442792150451,2744117220422198,2644883506979383,550323193349556,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,7443731089928787,2591352585302612,3677235441902166,7323875920791652,2499002377216605,4888768950592097,1251060182680162,2051483091522152,8074218591388266,6142827993272943,3466699351597682,2418223084651124,7028688272483970,4891494248387191,4162813093515897,6047329894011514,793823372574692,8556996361134716,7613883562408042,962398808360384,4260895368577666,4283429268783211,2166267691369095,985997338583691,7167030720094868,4627768844518037,635178958910103,324815487947417,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,8473257377227436,3692897477640877,1219768655680734,4629281300140726,7899833835700340,7926257273950906,7447126361371325,1788090151867071,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,7979981988496079,4255210889675477,5702774370640598,8435605503566551,4799709323047641,715674874864349,6170381369696990,514142706336480,6201873645794017,61926092041681,387851009274606,8647056119409616,3997317780447984,1399315029967603,6689558235349749,5636998099235575,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,8034626097156873,1888527096943373,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,5520319973442338,5469018164704731,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,7640058598458166,6035570396930872,6770526131303234,8616213849949705,8823214936765253,5216459085250700,1397154956147511,2642347481506640,3043432314913624,6709902552658779,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,3503691300365169,3399098890158963,2413571986957173,1118885345428345,9187572004045690,7509411440202623,4250192010793867,7117595573932866,2372154767496079,5547694202340241,3220718305670034,1314889990042517,4417325011829655,499817582085018,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,2923022378894253,58548012524462,809110246044594,990095007548340,9025646331909048,7651082374915001,410144451802613,8535094002541505,3507253187924811,2512865056413175,5718263849001935,6177526526477266,8794208264791002,122015909989199,1338323295265756,2994560223626205,3428447854789601,5596785988511911,7027985096934380,8216853956002797,7482765729801198,1625254992364527,4104830240113648,6176712354587633,4752895990487891,1290139896432922,660191707599862,3089495541412855,8413332258904917,7122517469537292,7415738719983789,1880410170582036,8188099686265882,5042862487835677,5751779125384224,3353246143173665,6932846907687970,6433529401226280,8546929131742249,2837875491333162,68026310562860,6505518806582320,2719967621366833,6104920293028914,3161510797841463,7078490448426045,6653090173899838,5767721901851712,6240204079699009,4221925077075012,1378685439386693,2583516015719502,1161506574537807,3277740466119760,75091129832530,5906462950118488,144929027286108,1080754928845670,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,9166612212995189,517359220212855,7498960818033784,851815340897403,7973286791894140,6432046918378622,4165123035849860,5452134955545734,4370251230234817,310401436513421,772117120378000,7279634878366865,6547833949292739,1890986035680404,4414964609014638,29860417139863,2185485247435928,746970284205212,2086986011604127,7190948106835105,329215423440037,1044951834932081,4950726440469672,7648404597621932,836252080051374,4913023526655151,6750433567802544,5015766876053704,3475729660106173,4227702754264245,5623483114239159,693796660573370,1996572511122975,7395647341966524,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,8456011513107658,4033162446019447,2781157967312077,3864648699065550,7693248543537357,4304771496076498,8115575334364382,5729488410395872,2287535748633830,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3504160964633841,2086682841597170,9047776546694390,4451688021447929,1859721248011520,5195275595142404,8427394283750668,7588963357979917,5395473031197970,9059221439596761,6988101536453914,7255889444500764,3671565933241630,7949201316488479,8413427240301859,819754650215716,7064378317985064,385907700483371,5728268182717740,5828810279275305,4110401245517103,1329463919809842,6261672364234035,1336059428508981,2262947123078456,3333979680154941,6974450251494718,2555346529826111,4117238218216331,5811691374228807,4819719989986640,227412655342932,2613315185845590,8669223739008346,3509711960462683,648548090783068,2126833649923421,6560554740667744,4843831604053345,9033189355451746,2752520230327651,8668036368331665,6138704418343841,5274803040281962,7319951751783787,7610599010751378,5155360444663152,6833222729797864,1260790606271859,2952168537830773,391700864198006,51745215800695,6610124020532606,4837271462970261,6713487310972290,2138747986847110,2218257629603393,6570381896951176,1982265176835467,8538014580684176,8567589419816342,8935830662170010,7455948431881628,5130704189359686,8707847105430950,4410612950724851,1287137738233268,9063963446371766,7854647199692218,6240582334678461,5052182129870271,3198977779324352,8774502673891428,1993005114900043,7443290551317957,960356550845894,8431983561594311,2674318196962761,4003215957845454,897316570514903,8150866244466136,6848525567399387,3885943932519902,4936027117872614,2166319637214696,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,402247873566207,605192001652224,5077643932915205,1033361534550956,130457181976075,6474396741751726,4396323642545688,1603137902355995,7848717625751069,6141646980806917,702798501799460,4221990677784101,2850576000013862,319524505622058,2864627209774636,7534790450554415,4330692566193719,4620747332527681,8068985491437122,160694334858820,7530221302335046,6073972491583756,1106191012378192,7365186043549266,5701137865421070,1757736763295318,4146833238394463,2338670647686753,2128625191036514,2397618178008552,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,8590428516263539,4512180937213558,3801724647384681,6635096463206009,2521189072553595,1554189922743932,4542558157555328,7505864488856074,833092384011907,8661756812112227,7324671778338437,6776038419760778,2801544017978307,2973371054093974,7805354275301657,1803953867310745,6520130709554843,6274847488566940,2129273223465242,4953212197500577,3178755594893524,6500983449683621,5590584270309652,7617356865365674,8001713123239596,843789784188589,4063887283164850,2818235886003891,4444908075767479,462594584405688,1639747824223934,8001342250198723,6553553179592388,4533568422573766,3128499912722119,651657068725962,75607106131659,9173197031722616,1166808652568277,1050472124757718,4304259375339229,6861712285648606,1545195813721824,2562320086883280,9145060402161275,4870118807992038,5078643480934121,3320002371577580,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,9130305682536177,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,1758942514429572,467300572956444,7641917531428638,7327034779342626,2254292328232739,8909030726132017,8552312296191785,7553352169367338,7967446089515314,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,7598272163776324,2016823776880454,5969289268451145,500006684268363,2339293216622415,4974610471645496,820079529219923,3716488083994452,5553553040481934,4040110223393081,5360518378600282,3300357632857948,8617233707472737,3843618476357477,7190985601980267,407494504056686,2167369577068814,6463356318623379,6981944088999797,1209024400287606,8110674850921690,4733550782715769,4579041725200255,9158016872989675,5257396834191237,463092216678278,8462257808402312,8245677561885676,55532696639127,8154597807642509,7675177204093251,5664055981840276,7469817883450350,6655834216400796,8449499606388378,4090374638159775,2959466822535072,6161054654166945,7266335543571037,7640718988732325,2215407908836337,2769199177598620,4285562358224810,5300625464223660,7687547568949165,1586163045525149,3700712461854642,1299923441830899,3086808181540789,3971834076462624,2417609231026105,5296176842942398,1229878691049804,8690783830517706,8326254200203212,5550023567304653,4265524355446736,4494745225119689,1055754057562072,3404362110215844,624885245548506,3118907763906525,153369867168896,8286237998987231,501314330843104,8214132091116539,2783293737744357,8189536530413545,5476876315310060,467366249592816,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,8685975635462151,2194538476795912,6838275788085257,1250269936830479,8960623108675600,6402742393902757,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,7920984055155720,3404645514262587,2275693130250305,2380585982662722,5330443437426759,3669669445212233,6994098420947023,7256199734364243,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,1062207237257316,8369242804119653,4898691182037097,6924058499905642,7154763136518251,1912752488757357,1435058818705086,4403747301046395,7670540484323560,4706193404512382,5090934684186756,7647986012981381,5960639243274381,2893765109098643,2403413705627801,457918945306778,8021177217775772,3654508277414055,7952952923375785,4079964453292203,527250636097708,450088546953389,5524874001115311,7656430088894642,5929566082291891,1826572334769866,972614980180160,1203515549264065,4938927696959683,6585493558229191,5902059711862987,297946451506210,7424197000927439,2408367899015376,2949811674540244,512992635649032,6152106369186008,2281810992756953,6405312114620634,7774822659813071,2616401854290141,1683181509208287,2266518188165352,5898357841811690,5215621112293613,8292970583906548,73407638169848,2057763371387131,4735068303730949,8579169889360135,6868805569935625,3096997674071069,73265497950478,7846237798144273,5184617738316050,2067257304910100,2221340687153433,3442643861129498,5250171345791260,6368094493092127,150144952449313,3213809958264492,4731934536485157,830388703421489,7797236362615080,928062918895913,4333565149649197,5369751621683502,5799343132662063,8995213276330288,3264293452933428,5085323617671478,1668681224825147,2084532488939840,8656843213650242,3755199397484871,3734495735626056,5608160409942348,7393489351358797,1544646640245073,792942249322835,836909738424664,1676612448274780,4633515119782238,7000127150279009,8443367849552226,1923663661255013,2528889561520487,7686641230297449,138396340889963,6247490209868140,9049977009835279,7630230196581438,1525074792253161,5996134094489984,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,2096841890683293,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,7831115821488550,1817325609851303,424135353727401,5081406681463197,7675482551941552,1333593272314289,4410947517753780,30172216461750,2774005338483129,7064012510296479,8069172111739324,117078030150084,4260640978303429,6943237729311174,5292946014976455,1314573516897356,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,393274085046750,5159188045658592,5104769332398561,2442719583213032,7968941333289447,5841433499171304,2952787269913065,1239923617995242,8232251443288556,7553111683168749,3182861987777006,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,6574721260816894,2666970296883712,5917290617760258,9179669523560966,1788226934370049,1458416177129993,2907874448857610,6072125870725644,340514272782864,3498979658738194,1787508922165780,6616815189441046,4878707520396378,7885678641654303,207892688386593,1354074465876514,211721470048805,9118918071159336,1419291878255150,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,2527092163099744,720459020642883,3498934123428420,6875606331546038,2085938533902923,384651385379405,420464067803727,1631879280163412,4746826772617814,5258126261832285,3426322821610081,8361022599817826,3563874166663785,7464799420283500,6360105620134509,3094658053712495,3279510064929392,4204796266711667,8796579924642424,1965966511262331,5677483308395132,2209184500886142,7505984773102219,8603296405064333,6254528881375899,4909849541008029,3796894009887390,4001936773421731,7117599678712484,8833716684167847,4115418516888233,5078604763028139,7944456366951084,5132300845271730,3806717176019639,7779913425963705,6819293919705793,8328582983088836,3981187881433797,516072321291432,2027494681635543,1390679848778457,4009191020419804,8691345688738530,3139745478540006,430223076136060,981946939239152,2246725717416689,5867676100037363,8124051107420916,5482216705940214,7046896457378555,1102254127540010,7920821769997056,4018290538196096,1956410942925570,5681948115341099,2760855083342295,5791949031062287,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,4230071825489989,9193508402337585,970330114464553,7078403057355566,3252916289493808,8183273020525361,2100493461572402,7161054261140279,4021653090544442,6632433388350267,7678991267339070,2820696871828287,1755284184296256,7088305201981920,8711986948082498,655311392901955,7467931263134177,5684475990154056,8910676381798199,6821187116937698,4133002593487694,1863456533297999,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,1473417792170842,580001466129551,726814415526748,4565654378650463,5279738514840419,2746847273347940,5565618624165953,4715391824151015,487864828935020,3869761225206638,8934811836040339,3408611869207412,8102057163176823,2765804614536057,4396390006889344,181638314539909,789663207095175,5675853195025288,2155536979712909,1552378516372366,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,7530063864933276,593012990819230,1169438882554352,6086204123819675,4797301698399142,6451364401675179,8075354013268908,9126554829507511,4865890043296700,7156388644240319,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,2361765179657163,5695909244033996,4304614427552720,9100812111035348,6899487686306776,4859866816269273,5004638558784474,7068743889562588,5320260141112286,6672925459491813,1082376892709864,8506618169158638,626168875564015,2573596889369585,8792974406386243,2744843007502163,7306522185604088,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,6353716854512644,5861465820534573,4875381475535879,5757452816149512,5796384473230345,4964781251513354,4122319891667983,3884489623182358,1677699964853271,3557713574820889,334844623043610,9029197543849729,2198108027522077,7164125418732578,360504095483383,2908244240583723,3649154946395190,253300033591817,4355633735907850,5356878132681790,8310818656353346,4882578364685381,1287098760653898,8707651019648183,5675714913627212,633105738161232,4967233577905238,9157569010814040,5768890711293017,4812219920563290,5097534116879451,4955365087054941,1089272565173343,5671450707164256,7516356639951969,3116364401098743,7118726016033980,1960247201090669,7097318302420081,5587667073572484,8753946596940915,4914432896436756,7612437979536300,5520592147606656,4632781860469952,3128705817382019,8158821542825094,5256643637594029,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,770217696107684,1238619339054246,5514768509078696,8494210442632362,7128580599985587,1515192525290670,5294676599532722,3827221495609203,6086409751379126,6239227985996983,2771632487820472,8644146702531103,9182108430318780,7293093929815232,7791125912523979,1605490846309572,1607268386283382,8783786815601862,8197445232532681,2109431893175501,7464689979698382,1019530360671445,5163187295190230,976293987540186,8223148645510366,237184967045669,8033238443244768,7315979768499426,1378353318702307,5323332702567656,8394425722576106,3430108296223980,7666194411646192,4836608690859249,2688817209527540,1033715359984886,1009185351310588,8246219929334314,700523669716226,3567107464158468,5816011168292101,1448775314115846,4180542909013889,3556579375844622,7194270142693933,6644821181082899,5287326670494996,6162219441212695,5000612806597850,6530364637157379,6152522718874915,7642964956253477,8031857753711153,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,5351668498910539,3285144305491278,5890867670273372,4856610212101475,88437141712228,9044286231537648,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,7710155381849469,5151281455619461,6341820508011913,9091415375486871,6676116454906435,7526121950424472,9051053538184605,7690101890186655,3289590076870051,6403894935227820,5926443562442162,1476335672319411,7674181908761844,5947103608716731,3555190914977216,7776477814955458,2877754653855172,2690941375331784,4782498127412683,3066294121266641,8935628239632291,78084367085014,1801073945726423,3261189274541531,7385626605825504,4736904158449123,6548287328611815,4368166270504425,4925763159749515,7864494568558061,4717078305738226,9088616725393889,2846284314054133,1541930783479721,8569995544546809,3152905102806522,3909246984449532,1800517128877994,5336395954564607,7187688514553088,6135375769182123,8985645944647986,3477567545936470,1987340210712077,8205328358469135,5473106693410323,4952730055523057,7906524426948124,1185378970902048,835582845963811,1493106012102181,1345534315535910,7122433204903463,6675258019802664,177161577352745,6152554647457326,5619546432701021,4393052211822129,6930698324287026,5679039857864245,5168981785230906,8453583119834684,3401051871010365,7906973945146948,894063478267464,1663633658035787,3335731140628044,4803260508523042,1490649743597140,8497320404037205,9086189712409516,2376738954628699,5603043202166369,5862755334909540,1286345701920361,540113038163563,2069399351119471,8084476987051640,1826626455842425,6936999565049467,2479347599965821,4155506935291518,701505411436160,8204114985614978,6497917926444676,599196216102534,5643554321571463,5276885771693705,3109989319097994,8059723177205390,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,4363284863173231,6607041102383728,2379313998356137,350130024791722,4004155958476460,4725106938598002,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,90076065684274,6133069365415617,3555666348039874,8660225691913923,8729737623117532,7219239730306758,3818616056618695,5816608308592328,4995812233531084,7374706893274831,587253656190676,8303453292883671,2169107663986396,6128252439805663,984499184574177,5500657232277221,8835865557208807,3834083608280817,3931973464080121,1553419814780673,1262523435581188,2729482319322886,4194303986672257,7509575534522121,8399396488744715,1205143099420432,5395011470851857,84834187095829,1924528878694166,4440186563960617,8253731522256683,4970938020564780,3013510239711025,6412229720137523,3881211648824768,1203079434555191,3989388368871224,5274301660094267,2559496497311550,3510921439481667,8605736591634244,6414585907380037,3429891841847111,1059194669793097,8332284229222087,4050500137410385,6355524819209492,3467276601790293,8535608270551957,4363526816403428,4577018362126171,4524906595225437,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,9115939470275901,7986770140512118,4494558117785472,2569719125127041,2354956995047303,7329596496499351,3684338307846029,7039911616343950,8823763859310893,8599745542954899,6556071619964822,8923353328464537,6527583680225178,6303151162171294,3197109218230176,1503829884784624,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6718325252018101,4270387686297529,2263958098522045,3795402138320830,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,3792348455169996,1351605086977997,3802696281022415,392326751543259,168902776664030,4276573756637151,8337568228454370,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8459448655941615,108362677993456,7451413053571062,7969431343923191,8596346580230136,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/1fb580f790c207278b55c408a68ff391",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000282135.1/GCA_000282135.1_Herbaspirillum.strCF444_v1.0_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AKJW01000001.1 Herbaspirillum sp. CF444 PMI16_contig_1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"1fb580f790c207278b55c408a68ff391\",\"mins\":[1823428229386048,6952097263386634,5775462911614990,849470764411565,4093359624405010,7198218273890323,7624084295131157,3952315306229788,6371534806016032,8817148220801058,3290285353091107,468535540555813,4183195964270054,496522896031786,8023681556160555,7747061883363372,9107359375605808,2919749025079346,8168736815833142,1122253154385978,5830697388638269,1579580454649919,2957045393276996,8260609362845765,3012396730449995,6689004907421786,7421138543698016,7025193132425325,7899510344663151,8131273229361269,6580027416264824,5121314611699839,6073071281717377,5114484335485058,8645065020522634,8752751492006035,4533104761553047,9132653760777661,3659046706547280,2020815270420648,4290095402770602,4592023168196779,2111307407678411,515262097670319,8866891860500656,5084736837509298,6433169748377786,5488820876517565,7444394032259262,89805299654849,2855474285609155,5675341728088264,1309294866407625,1712606933008586,8176787981639884,4963097969131725,2058609885987029,5374261180907746,5079312929550374,3891937317200102,419145283813608,281624392843499,4424996657553646,3147150335746287,816652924313842,3507995498242293,6172568800534569,4026081833050364,855166752137472,3040062546731265,5495127761461507,4147339812184324,3196871579304197,1130744454864940,3255641691742478,2303131250985688,4295183853617428,7023663992684822,4972258858770712,6606249832136985,6850209106837791,6168684653579884,418314136609059,463993421414692,9132927563276582,5135768149958951,8350899568443692,7183079542890546,7253771991884078,8203010160607535,2905568974168368,5851484105022174,7591860674429239,2073079825539389,5667288350810432,4857274092216641,6288506656956739,3487614199628101,1207061142774088,1908736749592905,8841389654093879,6764993573732694,3658563356778839,1640311295220452,9213587857383772,3705276181700960,4365247747776867,6479790254866788,6752792263254374,2779729385628007,5799324123586921,9045960260911466,8357912913740151,757610377445754,1039062855393659,921112464605566,5610359506747780,2877138764317070,6675095075307920,7062245157642646,310801575780760,1678602572241648,2395939021005218,1876579861611931,4972369760534951,2289128723325352,8983988119675306,5565574475047354,8277155494076859,9071917355762112,3297957172191681,652391881613762,6086057419812939,7049209667977670,6462039264739786,3136359866327500,6834493267288529,4328682030604754,412358303039957,739672620433879,8649330452341208,1882197305647582,3818287206236639,1289789756973538,7793966371496419,2542426606772709,2637396409639398,4325725725671911,6133602173207017,7779785632694768,7349428761952755,2248392142250484,7167038794146295,2145633683882490,7371080523383294,5260274699051528,1854094961418770,3423077249573399,2963182116086296,9145411432464922,1799040116097565,1376376973427230,8253777509024287,5717531271987744,2996378679263777,819958594396709,2122325636448808,681549787202090,6209025065237255,6311008473236013,2555439066260014,9044388896809523,7383644864610868,4542149975537076,5308501512651326,2024456911962687,4355008469352791,8790289639785028,6514420604273224,4407644441412169,807666237899338,71943665597843,509905491427920,1385596905341521,3981985125970021,488369309762146,649521551139427,6898914858271333,1119335346266726,1076116494271079,4230024450228847,3353700361446000,4695067554488954,7416865039540862,4293838046159487,6454480518537858,2065876026770055,7064395181015689,2858406060180108,7778690770363022,2331659853800080,8490838966772371,2945152558973589,292496763404950,6592375777485467,7055114426851997,5585102107984542,4226349126238880,5835389891322531,8294899010740900,4835008533111461,6087080616772263,169959442219693,3467256190616238,2430737385300657,5516268484207282,6526523933655732,4421950402347702,1128152858755771,5068122641651146,2254427742151359,3269779039707843,8697073922155204,3121331896591047,8699003440194254,7834311000908498,891059987404238,2481291550728918,7407944228340443,1994562869060322,3053460236559076,2391568001606378,1667748175225581,8160869144355566,3645119046959856,2966848389661431,2901213850977016,6940184096793337,2613959603454717,1635373287495125,1637939984114432,8236555704722178,8619713890247429,4649399518241542,3491994937287431,3662783881503502,8189872119210767,8475100390638352,6892231345079057,5750754803401492,8261489851237849,2477144904811289,4839151834874650,2430172201534235,6260706893538076,2584917549081375,6925228950019722,5825068759917353,3496429226656554,1078644133757743,8306749223748403,766589104382772,3222191883978207,4160205285196609,1173220025164613,8941720104952646,8852303746949959,3284003498730315,791302841754445,264123610440526,7745836370699087,6814050529905464,4974063627993939,7225109524964181,5757019266433878,5963119130275983,6936727695950686,5362794574889824,1464523627217761,3527488291996517,1738959944950630,8313469981787694,9147862615111143,558998275056495,218199643194224,5960441846924148,8769256476476277,3417258286441334,42444511616397,6175403625284474,2448665055175551,9155103433827202,1857044684292998,5633450548692031,2609341781222287,4561501807079576,4182773907448723,215797585347478,104984760828826,1289722577675165,2353616940516254,8087603489006495,8284218257613728,3620186670932902,770637698007979,7742632567702445,6157881826476974,7394202979648431,1058845741712306,326691023750067,4570348977808308,2032119768155061,6141609028699065,8944620614607802,6434943397700540,7396479449785281,4780109512336323,2914737672769697,3341906051736522,2372380022563788,4659174807765967,7284628372153298,5401307536393171,4955438758601685,1753737182864350,2503918500004834,7897912330658788,8394357357839333,6897851815699431,4264035378177003,4211156130678269,7008050298463217,2848192491602930,3680787250527761,6475779575129079,2603588741981180,3378546139030527,2923999155559280,1924895666619395,5489843719988230,7540767845712911,5991632182993936,8163962149453999,459978004710434,4218052566513158,4780830369334311,117377093207090,486077858931763,8808140316812341,5258291103228983,670042460316728,6502376730149951,6026667616683072,5829827950361440,2824927449654338,2587789637502019,746147074892868,4420883190916169,1845066350535756,1985681355703375,237331684664401,8719595779097682,4684753943774295,1307088021429092,7426995233137757,5112941170017375,364619230250083,5048433677307528,6525030871663723,2327204868818450,5970802730781358,5571612423505010,326926055089267,874831511127158,9094866362874729,6552443486438522,3613610439935099,7088800096044156,2976652601582717,5212121386886279,5207682095989903,3922142569325713,1003330494481554,3812139614307475,4903094797886624,4762434827797665,3258604939019430,1632007751935152,7937410560656564,8388489956918455,1887673509225667,216413087425735,457814380782792,7208543921066188,2945986750104785,7707575680361682,8004741154612435,7917181800793300,2238488784102615,8783596509619417,8164565546722525,869937238099168,7294747318079073,2507734977479915,5877305726510317,4361282372851,5186429730276597,4989198064870646,6632078777517312,2348197467153672,1856917214037257,2391544589649164,6055347576685838,8170755598939694,5865854980130073,3225542783321372,7176332454069535,9007340186269232,3324826302039331,1257174850274596,4710941958685989,1057825129768230,6575503123793193,4396255497561388,14186859758894,638400205890863,3744807680140600,5623330684077378,2368839782425924,8848234315171141,5134530002027853,5998202237519195,5902502381258076,5716016816194911,4247424887039330,2321248228984163,775491729302890,1555826905392493,1051838633395567,7017998666605942,8142158576027003,1244373938070916,7301414455581590,7241757920667023,4408750027826584,1700115985827227,6250638980441504,1028024865564065,7459089807713700,1156253557163429,2622018711381417,3063719555679658,6351829859354028,8039617989756334,2494402925192624,7083892585645489,4152270769898931,3035779424945588,974483416778171,1140211379365310,4959320017388991,3203242942072256,5359269299283394,6899035328196963,8785952432981446,7904740714243528,2518355126470090,7326879796397518,1438014378632655,3103615614936535,7160284056094169,8556376219395547,788255453111774,7063706776896991,7847487620318688,7154670503519717,3009961229051366,1699442996495851,4093272691492332,73077968233965,7005884362065391,436855755212272,6389111966197234,8227336657135091,7292968588297718,1472096039699965,4623937350346242,362755052873221,9068749122504201,8422896915596810,8672371057092111,1053459860743698,7029183147370007,7746489297572100,3017288710653468,1214318190175777,2152627752175140,2166214218589735,6225413598414376,7712086104221227,3029435654473262,3015975995295325,1620723903847347,8471970062362164,8272160258655799,7699035908793912,6036832172172859,3048449744071605,3970668830017089,3042179053733447,6839548084528714,3741896465868365,8460227509700176,4408780575326478,4917665326286424,6578166585349732,6806746639943261,225882787808865,5559847043827299,8869091316852330,6731972547200619,7803191482001004,5354548163782255,1501878461302385,2018047800501874,6044297620115731,8792947592021622,7694067082856060,1213248173562816,2323556786398853,4643908175472262,6395477209613969,7617708716951188,5946143212349077,1026749023831705,1928726864635547,5720472932542114,8958030118995620,6471158779332263,3695137719756459,6683524807870124,6326355373532847,748867519645361,2369136926049973,3520514483784649,7619989683058292,6811747534005947,8646396337661629,7514374941902527,4105820848023234,3812429531244227,8412636623378038,2959176762679585,6771302303499977,3289375726986954,1336095387944654,3911794312660687,1960965015160531,6038394310919896,4202428272603428,5420758755837659,1233165445121758,6207203005277925,331810113242748,3039584962496236,4217004035262189,3467945199929070,2523301642778237,3694205594617586,4522829255501560,658992198182649,8149323864540923,2141393374242556,3286698080978690,8286314899531526,3017603394070281,3008356771530508,9011764346824461,8131132865488656,4810713872926495,2792642739349288,1364335502542635,777496868429374,7509130642663216,5312266674184722,6710917417207603,7141793767130933,1111659458016905,7159425152116537,529829594801980,5240729944713026,420371135915843,8946774355085125,3448633569258465,2268644153048034,6089790480534979,3759633082451793,6085962822657875,5150357038344021,9163099640383319,7817511690364764,5792681332688739,1560492200630533,1658493897287525,8824161413793640,9006370529175401,6072351074264938,4569698214643564,2846265987954322,3837807027750772,3850074365831031,2859433886852990,2237180749924226,5747993920636804,958058250168199,6582165604894601,7298590750648204,282582001282970,3955502645159825,6308970940768579,1907119705799662,4708377941116828,2528670406797214,4020458588905797,3984543685789604,5083473889085355,5502725730551725,62133629503408,7749027395454898,3527401139267509,1180337991501753,583624657848250,931340982495166,3886401580263364,4834795916273605,3086603811874763,3397704469317580,8633229002598354,1157224795895460,5677969286957029,413940258916328,6955378666547177,5733584269174766,2373888597321716,4822568986077173,6970819301746681,5834959129888765,1583488014677675,6632844229962581,8203295827134474,5963102540122123,2967974974933011,8201671023326894,5948057767510361,6789589465933848,8370322729011226,3885808164054703,6930555694663710,9021099468479669,7062100487211044,1890625036601383,4921993589925928,5038205297228807,7374737644472367,6005534654031922,5678328076953651,7427227074840628,2368357752506422,3999950803814456,1370400721235113,2948203154622524,8489397456889923,3208384988301383,9077342818429964,7082965000710219,2795419064764492,4957868198013005,6439294712817744,7970546297545059,8034956561457508,8848907770398810,8488335904696412,4312426032605277,2561225268586590,7524921836556645,2796205638576228,4701450405587046,3226346830243946,5694863922423915,3150907373398130,9006036181960821,6066197233951081,911966627809402,2864560952141949,7805049564080254,5796387113708565,6408370413316224,4163124469885057,8004490023110788,4324007647488136,5903573637674690,3087713059145873,3681763928238228,8260488215103639,4006661905696928,2299827482405028,4995437326846117,5408930058029223,6705662488733865,3177379762245190,449626922305713,8686278034166131,8110665024800457,8483217319962814,6123849058232516,5816576346032325,8024313190262985,5931345823270888,2413582661036237,7840145657694415,6299316457965782,3873587683780824,2147610512779483,7203789675309282,4286719359117539,8548427602020588,6135430905972973,6607928958061368,6972408529234161,4618597356513529,8205565125921022,2062321972979969,5869103121967364,1363000189269718,2487171852683535,745274373720337,3163573510859032,6328114708271492,8651163587758362,4494562642413855,4234350486530336,6911531692075297,354520748157226,1830432893987117,446597312022832,2198595633514803,8841788987279669,280902001658167,1553400223115576,9117466327347151,8738179459295549,1973023506417982,3375795921210938,9120584059218244,5361112893180230,2692214170110279,6433912877222218,4176135420959799,766258594859342,7052147155765584,1362978837801299,3969835682261333,5632288376744283,8449103720442206,6973128669997408,4118687288011108,6976012064598373,1548007957154157,4959168847407475,4472128846752119,2612684088057212,8871327179245948,6289821323889021,2722681948506494,7812434708603286,6274588270504326,4150979467995530,7595130750841239,3991020432295661,1344635174087057,3116331579222418,4997629900622234,2098215707986331,4389884204534174,8927808408308127,8856740854925729,2900632744536483,1520570023487908,5392616163486119,349832123885992,7078706084419941,5273758979074476,6933779829123504,214399171963315,2772671089854903,8010008083319226,6045253434419643,4043959159237052,3109182693657023,8599497417886149,4956442331376070,6064396617632200,9216546563443147,4580074940713421,1199274810584141,2513498557630928,7553608837728727,3595239323675097,4558127079959002,2811492802516916,2077434243566044,2560911816878559,6938180457302502,1597776221514833,5479775342166439,6781557363870188,150965766687215,7342318518897141,7546689580550646,2827752220568057,2365661757491706,7375461689348978,8292861153438215,5478613909598636,6015827180521995,3213652102908428,2751227237165583,4747668368746895,3947679897242135,2627654263769626,4623519751571996,1708989114640925,2730259119188512,6935681913932322,926001323624996,8206378644965925,3257584398625318,8746426259900970,29007262853675,5830712638229041,2053526548097587,5530915089099316,1267018882869813,199440437520950,315538411932217,1219896177060421,6000298289777222,5146716940184140,6600018023525827,3166737892428368,3509559529581142,1544661971536472,6677877409227195,5559197230975592,2893682215750251,6397916698462832,1359312875620984,1101998727383678,78233958443647,1210008563141250,5581885259811459,1788549925579401,5388379590462090,1127179755481739,5712995026231746,8863899674405518,7345280210967661,5588142949059216,1787370086746769,8295427495461315,2695286516566679,3488929672001950,2655089554172577,2994689782819492,165823146265253,8244852055190185,741034544540751,6081434747062955,600363723614893,8837796858497710,6850026664102581,7104610663672508,1815635433302721,8436941421857761,2587944690584262,2330804836950476,5829641269775052,8881120816607693,2674749140323024,740284537183352,7992090418834130,4844461982214868,8614825322113750,6982813378079448,7762230293637851,209418898598620,4103573333215965,9216735143305266,4164039984646886,6210773940218604,5347565711401426,4635419546258161,6370009562827508,8275503714585338,5329347961222954,8178059324156671,321689694710531,4538902995888901,3687834988874502,6160106171198217,4822039105784586,50263978208021,2613810848467734,5199816915700505,7740451274214171,1648690472667938,1693824205024038,6892630419180331,4192692134873902,988542404979504,3749188863224625,4398386021403445,5881247632272184,1420926272695097,7848361346763578,1339254923864893,5620494576405310,6299913911216959,5282230397193026,6112218833751610,2832081868993136,1154966983174991,4470204485118805,4109624207526742,8333190709283673,1147226963888994,8537328285787428,6694227064818536,6683421231590251,3735802765331533,6825199301946224,2493662636551025,2583069228796788,6004107179968488,3372400145238902,1844374264892284,1566928814190016,8992947985468287,8874908401789825,1574823989107990,3874484740688771,5534136468482951,3036020561390473,8624872792976268,8474233082170253,1057068211006351,6860938891660178,992474271607699,8022042679661235,3583675390159766,2770501075725210,1122096557378462,4582023283218245,1729769315314597,4675130945162152,6212562019818652,7715077205157703,1323657070635949,1014327560776626,61421217524661,5072903132258804,7154186233629628,3318259900517309,8350358619417537,26434133793953,7194464596659145,2955211143949258,5161356324719565,1563634531339216,1902495698324435,1888912722774997,809492421725150,3924318163200993,5267246291606694,8387131820207081,2884594945993707,1445623446350828,1687710273776625,4925463891725299,5020518727134197,1345564543134711,465301263854584,1493010707450876,2243922052312071,1155025995287564,6905239596567572,6272913351232533,8225712691776535,5645021951912984,8700174713424927,4161491368225826,3319648685968431,8534246081565192,3496512822971445,3617188494986297,4548359479782459,3370723238497461,4325600052259904,4104411328343105,5697570310450253,7649789819848231,5105016065854544,6648604190338129,6545058569587794,8430284560608340,92012113136725,7966101375372376,3371538138557533,6731582417645149,3778398555843683,7667380828605543,7275951686904937,7912824258997357,2137146711600238,9142177180857334,1446552377461888,4209917646679174,3095069544754311,8663907490917512,5745053454960492,4450323842034827,7149386163965069,7688781077359762,7870444307303575,1764797408472219,5870886287576226,109752529185956,6774316891663525,3609364745800621,8547080165575852,5772593737477293,6225408191655088,7091598962195656,1229712510586037,1355364603595958,5743264326421689,4990707194047674,8092054208598559,4487704912702653,7463154402618558,1566464037009269,3523257412611265,2549608346119726,8898044785052871,318950717406369,7644672358968522,3444233089879243,985680440282319,6166602462868003,2223697059228884,6720257108118741,2013091592309976,4731739826449629,3972726347394276,6538499173240039,273183897595112,3303355228105961,2411909502635243,5682846098189548,2326706553253101,5540207650753780,4986071453125879,5621629119556857,2956068885892346,7779263611350269,8630090950577365,8523053808520448,1174693540031746,8694430503709956,8003848585770881,443463269379337,8899966200113026,8525893925637391,5421449380171024,893560037485841,5550744573021458,3378496576474388,1715320008226693,2829166995189025,8056971048095019,6240753840225666,716336873426223,4884754184006961,225795277090103,7281499342294329,4875703357525314,3236242392661805,6351856152972616,8988115927992204,544740585000267,443657675853132,233085482126669,1264035046804814,7168016111996239,8336159939390802,2221286376828245,8484041708850522,533204635356515,2261772318436709,4679008606571878,3525144200005521,3049547343261032,2940065765261017,8781519273348459,8905001332419948,2583832517225837,6644736468225390,5445482138692978,6630651406536051,3219064005234037,2675759374642554,3537575794568578,2608424013413611,2314254877617540,3080724534660485,4580492048969100,5622591984553357,7357792932720016,1520282480242066,1726665237992003,8459459400134040,5513333059087770,7543699314437532,7622690262397509,6711801977919308,6345809072541097,7981863390670251,7113921589464496,6501965076557233,7325299587632565,1749975683501499,2691993341300156,6140424607023690,7552001367453120,5676360721092033,1000579789393346,4687712789638595,1942329422933444,5029263966621126,2265421333163467,2907452271300044,2569424163401166,5403490321224269,6029442405019089,2085525677329875,7247097742708182,8661265136438521,4252407064120795,8498685617196508,6118423652594741,4374491714334176,2101671376367078,6093049021001193,522133040396199,2758506090040816,1480939823631863,8907993319034363,8185939752988160,7124350157647362,328510126321158,7507424305049097,7253041256836624,7956977324551699,2323322547916308,6771413250592279,454230775934489,1171228152819227,4310382323920414,8986361815240225,5672983612198436,5229495559466535,4763469031869998,6185872187403824,2596636177829425,2845023545683506,2199315780726328,2937490255460276,4809289250680378,2757182717775419,5007354150530620,1343941387660862,2790995075116609,6760242134732355,8178881774243397,1237934761651782,8110035525840456,4330272942074246,3964889196392011,2134316897349199,6936463755382352,1995856184929876,692893422169685,6660272437522008,8404429328215641,4215871974575375,7800933367769018,8505057539181397,1498877895478883,8440078818766437,4995671106448999,6018335730298476,6412818460665883,6474496361909874,870203551954879,6871323061448316,6482767681244797,623332855058048,8643857964945026,8546236073381509,7667514906586760,1423215445593737,8607529471651466,7738670096453260,2354125391072912,2210671770496659,4913394891059822,8422066624499355,208385595608733,737383676535408,885943079276198,7891445600079531,2676455910788781,6320573112077999,5394231482971537,3498829579792049,2706110458588853,8927453382761247,311356301389497,5853161322269983,7812030597271229,6615744111616765,6990277059575073,1965349280542410,4734431305150155,3627803097435854,2066830272904299,602499186544338,6683113867407059,6388783126671062,3659151309557467,5847341213101788,6572001324262010,6604300461371103,7520062296374205,8823777879556325,2807092062727908,7530084908478181,823469780854738,6563151856815855,532700099309297,5001596819082996,3431032256261880,5472683443632084,6155456236023546,3513154292112487,376464675761918,5488041355750891,5919978579324673,5847157176676099,5580062279356165,2594330393586054,4484887949340424,5332757333818668,5809996251852554,7520897119891211,1406991603846931,2556189435162395,5977309777981218,8010375488889479,6019149664538412,1442170044477229,6887224577404721,8800313969372979,1512195614592820,3703794926227256,4304070603165497,2876258817716031,4729869953903700,8877449856896834,5148564124356421,5111046248804169,8040106990759757,2249076222685007,5605529113399121,6700178590928732,1909145481858295,271373055618912,7984040994819939,7817811989966696,6566227313411833,1365991009324910,8573799651924451,406533615093787,7934654021744616,1536839342362487,7228475495935870,5666372931155947,4019016527589266,477704638317860,8722634533023639,6275558527471514,2159813012766563,4872775328345413,3443298694582180,220898940383141,4924567570001838,3847358665306033,1838633115282946,2158216596778931,7652644586016693,2837414231481673,6415198183223968,1889958160125893,2833119523106760,5315648095629261,7899384987520975,5274034903019474,8061518413803477,8771874889592800,6446445333819363,1988220716077028,6726304222482405,3061832076439529,8748141286182891,383972892872685,7479966527934451,6621211471982581,4106187788759030,4309531127762939,4716052563947516,4282298732482558,6950266698387455,5631814051344384,3716691181703170,824422596989611,7818251001556998,2712498449387532,4489686183219213,6668230509735957,568669108875289,1995510906286108,8504219883434015,7119170328572592,2303456565047334,1605962341929004,4242375653101613,4961452690886705,9098577033138226,3002019445280819,1205559368314935,7069119726030905,7176700944281662,6961572144050869,6254851460026432,5173442975084610,6457784362168392,1603595420782667,1943083471163469,3274768263934030,146614233190480,4683401119076433,7375532941750354,2940948826615894,1201578334974048,1267718889984097,6143948048011364,3551579583377509,961351299674217,5308381783978098,1472914480484467,5562225504958,1594648252239990,1669917173928055,5347712821748415,2571784273547388,2701509543972989,5550146518626435,3222622570250142,4326240683659399,446126105686153,8610120231850122,2269547645300875,2646093143265422,2336497174376591,3628570676946968,2746046308544659,5845331661394068,2735960624935061,3900418417447064,5735657288904858,454152354140321,1295193014505635,7184118306050215,980192377581737,846679021899958,970425278599352,4889023870685370,5460672834613435,5315070111920319,7538485306511553,4294400033026246,1481902553379019,3477218690396364,107542094393550,2836111321403599,9004180564742354,80349643010266,3628573822644444,882513965273309,1974199907971295,6906592226128096,1397042736763106,4897200569536745,5834236212179182,1623601397207282,7158560781512948,4393031750758646,2647084008829175,9045389411709176,5249926602969337,1424827138969855,1514592131608836,8905641017856261,5162235733471499,3016156688797965,506676522660114,161725398864147,2559484289601813,4097597776679192,7589890419872027,205032914612512,2577445802086689,6988435130691876,8128355714412842,5203378537984302,537981155412019,6424773376692532,8190321597714752,2829058425886774,1778807175933324,7103960655016268,514097133310287,723304124862800,4634797183021395,9148660173698608,6620198971044184,815671443518181,5273088541577571,9105291824955165,1601649077662053,8950009211268499,3119152676417911,8648077548663160,7280994621985145,4808857808662907,1905000847913341,7997029211435393,7241156565209474,2956820311544555,8281927960031620,3185862429102469,4707133412684166,9034350834323849,4469484897489290,208857908212107,894944967291277,1657903288537488,7457400301760913,5520691514110359,6755961195458968,5743419080929689,8468754478289306,7201573545201050,8777439541989791,2447640735535524,4526376039862693,3884690885505446,5417483020267944,4156976803901865,2553631312892331,2858278471061932,2214641223717305,3049083100777887,6403946106859964,5517266384220607,4702251289719232,235310027968962,5533612310637537,6449029817586119,7227139064508875,2829380705980876,1488172169359821,2923607776239009,784140095689171,6845100230611417,43054872056283,6240692653543900,8550766671933918,8384604902617567,4238321184829920,9150955784112208,6287821338063330,6448916307759587,3874574843228644,3514837753205221,2100926919422438,8594371997045224,4092155217837479,1090648908796397,545826853753327,2656314013381106,3799648559714805,2305185114591736,4952005787791865,7725114053964282,6709808481473026,1026168084042247,2897451518906888,3470758298252034,8013032599335439,5781118285804051,6646475292201492,5756829663457813,6923426620330518,1762851151796313,4299853401502239,172279983323227,8562036667126308,8530194083930886,4072389088809512,2571247049164892,4851671816712748,4645197947040304,1263116909392440,479514384724540,6290497536881217,1472231585739331,3906030113837636,5217887461208645,8395884095926854,1890972590453320,7359510195499594,763611691184717,1362684166509136,1809674796137912,8223669758448214,4145904203764313,3844966130430558,6070039597986403,7734672505311844,4974770362749541,7940371627537004,2231663293141614,2677817651326397,5507024142815856,3511790678930035,5318738936156788,4111125060707092,861533613732475,6860621005987264,1270201064411779,3800280819454596,3107085233943318,5114868997239430,3143819469303233,4608312535390316,6271328071660175,455029186245264,119161060774546,914241760653971,8471920938832533,8525682541441687,3750727413674653,2384427943457438,3120683805577888,6365420074455713,9130826461328036,1973610520980934,5251502209557276,858167522800299,4260914884637358,914081079956144,8804823692366514,62051680229491,6952767932961461,7755931388181961,831766415102648,65457847620284,5359912822166206,4043390209544895,5444206175220417,7117169490645698,1492997448495813,2684688685822664,2119820989275596,6092085228835531,6345854656221901,5917972147114706,3330900596593363,7891298279895765,1206933584712406,5721719632523991,5647296172823266,3672636609835749,1783001173111530,4613497993130731,5157571258241773,5291692934623983,27741862325517,8512085186257705,1047012056560377,8369797699949307,4575872988463914,9191225312948993,8002704045781762,9165224202642482,4664226699080453,8830946581289089,3146054672323337,1562688669225740,949604469732111,1507548624958224,2781262381658898,5578476487209747,6892538546778902,7503999323992855,7660276889162520,215375543746010,8478270342363269,1012467758625570,5984853919445797,1994364022354727,8736575784530728,1268310454244138,2902283510567723,6684168928088878,4372174001492783,4240599674090293,7209468560929590,1944335334372153,606889797096252,2933046374182368,7478638587982662,7326740903695177,2990917976445774,7949656072392046,6245731116757848,5336984614482778,5817140041675618,7921665867023163,7178128759976805,843295676502887,3781203256554344,678397030634345,7693781681238892,173161153540975,3530804955100017,2356018258908018,2108201106845161,4212083827168122,2489852060360170,8379756141515647,1470983619761026,2673971176616835,2049379194704772,2063941032358790,9172939751863177,7494091834463114,3331058423722893,3438330988355053,4146270868935571,60456382314649,7055185531507608,3917105364390813,8048054250050466,2667888468595621,1739670243521447,3707426998170536,1194024091825066,2747575503901611,5489090617627565,8787970986734510,7507976049177524,5692691697341365,9054484719629239,4759255894275000,4196593053307837,1987865198752704,4588489456571331,602757771826117,3850247371396045,5440209932579790,3085026690266070,3531765011897849,6708171729581019,1899569610104314,3985506490184672,7358667805127650,2960042636375013,7593921673434088,3380824132162541,8653175386895345,4491949581325298,3289381665362932,755136314356726,4597427355775991,3619800975700984,45082846393341,1158765167690581,3729331628127233,2279820082566147,1588400788427781,5565266388251654,6299903524008968,9148775540306956,3200219116426253,5376428464051214,5745860628345873,8891011530986515,2081230991979541,4064998879982615,3967916570522652,1995798830314532,2257816303752231,2628628808717354,4762072341959725,3039678572860462,7262199944942642,510858017518643,6967780737725493,354024464119988,5172232728359995,3438946663247135,4717359044416574,839118980569269,7163361351480390,5635158080746567,2420719706805322,7813679263429474,4094653076270531,1468819379912206,7998939967435864,6835977218913369,3466178107348058,3192198953153629,1087542008671760,2321569553675364,3211363983426406,4785702003086439,4254455839495272,3329646269518953,3297351284405357,1449560650880111,6965503991352851,5269113104462972,2722226026599549,3454091537306752,1027279396009092,2308350108226693,6630056799220876,1557366214694031,8367603617059986,2051370995356822,8859609798947991,5379756896195737,673828562834586,7100341196141729,876750602040483,491315848533158,5995047825945771,3407599393150125,7266114169771182,5060507307414703,8317241356014771,8591229079529673,3382282802865012,3558307172054205,1674145961358527,4171028474400485,4231198607480004,1029984126186694,2903850230281416,582010861425871,2263516458226896,7018443930817746,2255373584569561,8447429875872987,623104834401502,5338160551007455,179770759091429,2998493088061650,5479631682238675,7558881112487159,258149866075389,5403197091247359,7736416884069638,642040483591042,1596118635402115,9053647782240009,751863012513045,1974315489514774,2131885009720599,4264867424883992,2326679804990340,6632571974784284,999297263088925,802119421039904,3893411554923811,7192470803543335,2400375285232937,718693255107882,1922698814070322,933463491941678,1533116559095088,1519067544311090,3900658984588596,1697550550259001,1550301388051770,6904099390158139,6579823616177034,9175922085025089,8120456615318853,1647668982953286,4908722768950599,7030429543339337,1768649356563787,8280686435546449,1509810289208889,6468293075004986,2331148813085388,3684476956783971,8984938348565863,5668993853953384,523450491032937,6612176462042474,2751174028383600,2599592630744436,8880858411881845,2403521445623158,3663694354126199,6942222698870136,1809708694738298,9130416539874683,3240903621670271,4386818373085420,8250602206131594,8654057321977229,1049449675126160,1339737687725457,120288676279698,3696882580016707,164320196621716,8601761303598491,5471675920070045,7530824595158430,8338377613489568,7203797418792357,181959563949478,4029741218608554,5937776960886189,404947436975534,1547165692745137,68574214935988,3682981390505397,9197481841137083,5721258837325244,5850955403425217,2392943765648836,5652442970338757,7830555313321417,2806551159690698,4390418643736013,1154518120043982,9161724374259153,7971044889204179,6332695133885909,1518390573979096,3219015412223567,6786578662929317,5759614313264612,8577734770800102,4391636251123281,4051991466210793,8153139362633198,5327481577993713,108700765042162,613296353744373,3157886439814648,251677764441603,6350276144821766,1814884526668034,2438346598462991,1990389878306322,5358231963481619,5808290282010134,293675770721817,8324542678372877,7111732349416990,5604504768779807,4119452619617827,1699143855781412,4461836380943911,6008857772758571,6605492179375662,6125036221707823,3912624896161328,1603138314343987,3300946293749300,266089550845498,3108959935815263,6116175635748412,606202734097990,7550550494910023,9081419611510354,283742722201174,5197518746564184,4612731240527449,8889627689914520,9072586430445522,257198734972514,5217660840244836,345090608780904,400935616943721,3160184988644971,7776803412571756,330848203257456,299720019039857,8360345853400692,6356182163191414,2213397199787640,1169615198680697,2779676143957627,3814228227978877,3256823695685248,6341148895516289,1747286016251526,4828448461254252,2492257646417547,7355689718208144,1003766672520849,1224694591166098,2938342760199827,954715114010264,2465130712880795,5762870567649903,7089117974705822,4948936348677791,7750790611883680,5819703265146532,8166432938194603,3496877370974113,4473642232862382,7077641792747191,3506359595849400,3795189108143804,3363322384086719,8717885350262466,3013369987852577,3540262060570314,6212017729894094,9150082489636559,2767820504463058,6309363930339027,7112968842565334,607249232494201,3190333355456217,6706873020593882,5731681068898016,1569955980572388,3192464717348476,7634791859877613,4256926805989102,1156201112193848,8205063201765108,2246952191440630,667965152278275,7989768487998422,4519695068501766,5819057900254983,6903791712540426,2318583947704075,7043722278762252,6885417026098959,3506426378090264,3082292767561497,5143660179873336,2408050332991109,3401309283669793,7764833281835137,5280144404576041,5035367646852906,1828103014176560,2528360850241329,7524901969123122,7970250745755444,2231812040152887,2494224939210553,6139137376311101,2769111738406718,5835534955968322,3187063598487365,4196910000592710,5632807664777031,282476127622985,3208220820035404,1921228084115282,3069658524301142,3806925206107994,8247667304666971,4894639599537399,8710885309192032,1317015918369762,4934888309938021,5021712464017255,6822195587217256,7656551644256106,5156554985830252,6066643853013992,1531215921510258,6290509951309685,4293938329499513,8185627061025087,5094630696335233,2766272572307332,5865688797935493,8941259146614669,4962017687934866,466689816164243,8333774220392340,4279894451838617,3897360907819332,2985509943457691,3096292586177521,1262400018069418,5112450055002029,6344521493659969,1291347115857843,7956350943500212,4065652247754680,3388899791968191,6580905604814784,8300572042139586,2418873779401718,6436192159045575,7330784873011146,8087122749690871,5457805913855949,1170666901698513,6212702990201639,3262200001632212,3589270807033813,2546769607464921,461319680858075,3145527296972765,991296711792606,5535743541893096,4786072009802748,351419372419051,942870468990958,6485551033686009,6915197091846139,4593285650446333,615119372351487,8553759231465473,194082153628739,4806624860206081,3460000050378763,601550013257742,1439356323846163,3327600104667159,2544525421967386,6651244571242159,8125093820094493,8495625999374369,5418052304836643,6386260008477702,5539808782030887,7557647049709608,7318111771818026,7756271632073643,4544592813053999,4512037664921648,6981360877934644,3439295972792374,8753882586323002,3625804994468191,5266384158644284,3873163822061637,4095138468739142,6086778549073992,4499228522469453,2978961533851726,3406182880082004,197925090138197,5065159931025494,918657439578199,3108684109633413,7908628330756185,5964604274907227,6478558267947101,5704768345110622,1646052540234085,4723119570794592,1228639220766818,9101640971882120,7483194708842604,3019145593441981,7505840524884083,3369194179311734,2830808894570412,511825015961723,1118013967235198,6283290197047423,5684155108333697,706209033713796,4126209539872901,1794009588725894,5923285944080520,1740518673152137,6290721868306576,6056733065681044,6862648291653781,7161881854769305,8934376351086748,8256784591632541,567441434548383,9041784564119713,4795714351487145,1139971846871214,2730190015273136,6842484329814196,8238437732333749,8408089714284734,1422047701907651,4187039296924023,971987401611471,7003928921692368,2473148078086353,6521826844022994,8275419983100115,7878051866466517,7554031424551127,5848172315022372,3214503938406620,586095737919717,1435115937387559,4076976284079686,5102895708362989,9083937091475837,4209119097567482,7082551533515818,7287746596411647,3983810647144706,4982136366209285,1674882886072582,3838704441956616,8915891599300882,953758359001365,52475800410391,3803170564552986,7191704165202203,8549064729192837,7571178175936802,877729481304454,5063798671456556,8786551529273645,1545577775192366,2157650687480883,8909717704694068,8943124976572726,13961140672823,3895893931374906,2142102765629151,34266621065533,5911280811406389,4294321578301761,6245114702297412,5107342998870346,9149538537864579,4314164349426000,8398517811960149,5535708168788310,4769100079896919,7628583160486232,4446181966494043,7320476697016668,5011816320891231,2141966308873275,7062525577615717,2177657686911377,3182034416974185,3940573846444395,4925952887093618,7231717542484340,5257581161888121,7106165365843007,8705950911306108,8975087770261885,146120240906065,5487163207440769,2222779516082772,6558023460354446,2605524955068817,5001851725625746,6390562079401027,454677944170900,6113681840454037,1177122034399638,5883585401338263,3611636914204399,1604886526720414,2380161883732383,3549765602736544,6039403991546277,2509268559468976,8712064764410292,7798237834262965,6857709861788096,2246982406152778,2485759267789255,2820284673178066,7392405786962340,8019668602452445,6230428296034785,7689731130153443,3364151280777703,9034030135753201,7203037160331763,3852004789377524,5344193138104821,2881634287229432,8368325432859131,2734544436648444,8501432018606589,4689735935357938,3221376242964997,1449996268083720,6289622145939978,6899751843936781,4793953844225015,5573652244347419,492639602235934,2184224675093024,3480201704970672,8000266846976546,2823336526543398,6012485088287273,6227678340349868,3207230653512237,5766205674920494,8257055863231581,6063876280760881,4120313024854578,2436951170877875,7763677533354549,28178780592694,3639972442689289,395043137868319,7939179423545915,3531308228655679,6001787483404864,1667610638441027,2869097344467236,912668048570953,6132888442889652,787701659621964,1219066888182353,1897762842827348,3124717253425751,3794373950200413,4437926726703714,1641335365589604,851228709739111,2759433933855338,1967157325199983,4189199109044848,7498037322209907,8682838176699497,7726680372132473,829173805742715,6672409233119872,6949319097916036,5178105138756230,473649156217479,1159770602650250,3595950533335694,6641158368524946,8691143921433243,3938807517756062,49792600316575,2657779815537312,1113169417632419,1862436518156968,4547896007899817,4401644142180807,2173549513768733,1960146197846708,1715482474462215,3178775564163772,4314810752432834,2163634615261891,2735619425254084,2264051960718454,3512565660105414,5194981895215818,9075832439249611,6720998934043347,5373309161233108,4068673063115481,4033309445757660,6323650241346270,459731333259045,7132221883841248,7510476092300003,6424145917131492,673459189435976,2015678767332073,7901542989822698,27557048375911,5218490189134576,6147229794163450,4811373926898427,6651542767975171,8741799785995015,2060914921003787,5594216268954382,8331221888834319,7338950704671193,18799731735322,6970102724770587,2739859954827529,5970755054154885,4295745478703905,5208931838655268,6208856329927461,5923057266555686,7109653630835496,4760620279733033,1648749595851562,5193277174201131,3998092983073580,174072115034925,1579023902866224,7057472410884914,6215694856706868,8639792030489397,3671374361074486,3585589873810231,5031012871371576,1823190964116283,5312903008066364,5121535413705535,6228427605367618,6917376992212108,6543740510829387,2983504082049868,3195882303298382,4357557632572239,8224274250052520,4477648318634837,8039501872601946,4892717611809628,4035017288776542,8637099397061472,809257692953441,5464879958358882,4499529692879716,8737723910609766,5814427535367015,1102119283686249,595676915383152,657865174276980,3467682195053430,1618015470549889,8490888048991108,2632381682349206,2939412611054472,7938347352316809,1969469442490178,8319796717886350,988564579957651,4330049319413996,1857498428423061,6772748845079446,6090910468718404,2449455784696737,8805032585290006,1108192014515117,3500966220382024,7007351510055858,4664739195918835,7365112417672116,1076349592894397,4751037745494974,7413141944343488,7264296766340034,5281668287486915,7783556307819461,1908996930755529,4581224422816715,9115191963171788,4634791776238541,331518098086864,4256841067985400,8654748697877460,229068662406106,4672697008610267,7800368791305133,546863451318778,783318907993058,3422302351047653,2003505982913511,2202659376643050,395881124207598,3771678353185775,6993265542806517,1968374293199862,4215785738288120,6283470390516735,2143278483454976,3009714136898561,7023781551922179,4491167578184708,4188344418155527,8601287572954125,1844767587447981,3630852255841300,6989520367424686,7062498970696736,4637018229138608,1478250251041826,4223263274687523,2839916059835428,4442358277667881,3291399962319917,1680519867849783,3642468072291387,4256488345738300,2282374728694845,3558309007662142,2691594591255617,6498159509249098,6282451197934668,5276876030082127,2956304310958903,1872336587390035,730292212022361,6275384632986127,5798781225245790,6492788657175655,7789152850705515,1955616826449005,6655245213383796,4354914013912182,347560033311863,528467997514629,2563338895031420,2265701876014954,5987475973422210,4523538856246403,4609828277247112,8895773043776650,1707239555898510,453313763851412,8319685425938286,922121054805146,8405591071423644,6350718519659034,7970381843856545,4860828489407652,5126229318735046,5983258570923174,1610771910892714,6146367946161324,7998987352603822,6758873661228232,1192694080380084,6702044196568245,7568126588560585,5298471671921850,4189864079604923,2849743537708220,5894744610053310,5499491482041535,2544776399445184,7197491710753985,2851990134660290,8275807876652228,3800357983665350,4834877373136072,8286960172506313,5231406085151948,1378153511623889,129384792595666,3058513171815635,8330498408224564,1980173316914392,8979417030352090,1408722582543584,4872551283636774,7828678236847337,2256558192327914,8758989214522603,7775193864486124,2338723759095021,3530146244222190,6685352311758067,4028900674125047,3598601447128312,1063592394259709,2377134254718208,3452807939441879,3436945916755215,6972956625804562,4169111432543508,1903127897742614,1846617721961751,7268837828615451,832965022129436,1993539205930271,3130939823848736,1619518807973153,8121855445112051,457832850890026,7887288654347564,2793133753457202,6964393395348701,6667431637264111,1070949634197291,6912423261306186,5092320985201995,2273729658273101,2999967522929999,4761780454489427,1010391918468438,1557438306942295,4834159441984858,1364095889300830,1312728367308127,3083246662745442,2148553752689211,1622340755381612,1900249457163630,1311697689197937,5193347214245237,7072957203144056,4320612404026746,8574213471075707,4927552223780220,815528574934398,8571300606819714,6246307227731179,4997194661911940,2708177763917190,8130173806460296,3442744199814537,4741060222480279,4727372320423309,7613012617428368,5139485167115667,217299900480922,3920892072344988,3832136211365277,4936791204707745,4685238548836251,8598500008271271,2507820513877419,175170196430253,8173787574861235,3264003841850805,6266922667081142,4908197382217143,6984520764652984,2842912531611065,8414726643973562,5626553225608640,2641355753389508,1325967968976801,9105008629767624,7284589901364681,4028415600882935,4316988524051916,1083889639087566,8300501341437393,7046077968678362,1035217536926549,2772819302309435,728176315702755,3528924899442148,6152790743096810,5398272925466093,7522577311890927,5077652503141873,2219277589978610,1434135742774771,1731044682374644,4625999845457399,2565381485107796,7244585347096058,5083129805102588,9099643297062826,3638234146561535,2602652104785408,7148684495445509,2058461134331400,6333459394330540,8363007536668783,1771079605616140,5354862270594573,6487409957404174,7246144141418001,3810797080264219,8433803101257245,7977196272316029,4900511194848803,1047387794095652,2485232990232101,7613316075265574,486972301123112,8288244166442538,2023730501008946,256315782889012,848040602322185,6150635746909752,8327669643378235,1317743771082301,4647553419935294,6273672511668567,2327060625702470,6920389097946698,7915280619117154,7620201483615825,1910211115966037,450331160706647,2313898947403352,5826716650798683,4531703470718556,631813658402399,3698777827319392,9042540049309283,1732562300631655,3474554422124140,6267469976247918,5200820517518962,1690206866593043,4267330451725942,6387688098430585,6962620423364218,3117426602016380,4908910340898429,9069937246158467,1569066039221893,628976591396486,8994183918509703,7062139086438026,8037417713720971,4685884172361358,2613960833875603,5792941211603797,2601632675233132,9213143398514330,7511516412149406,1255757202751430,8804481372479142,5566161406607016,1880542115553223,5789739878772115,6323316298841774,4504335819157548,1214317529456305,3877968778911410,7351215824036383,3060872397414073,5275617420721851,1184116300127936,8252996244512453,4244998486073030,3385059133955786,5113634864348886,818039988118820,3504278368722651,154397272350431,208073820528352,4876917012823918,9212909760904934,7763070292164331,6536947296329453,1631367095992047,4802560074792690,1786534012815042,1127309350928121,8702341640530412,1533435678842622,7326285097697026,2163967872048902,7774983320936201,6582691703308046,4546808593973007,3866054428729104,5984721173646086,5693885123149588,7006633178930972,8539076056768285,3254438001467166,109056865984288,4349585924890402,2002872179056419,1259867604123429,737666443304744,2027313583464235,8040061202415404,4081240131215149,2739317283716919,6379508655718201,3439778529754940,6009077493784384,2081584817864513,4772307373203266,8791991951982403,8305044534779716,580914458642577,5204202980706091,6679471363899210,4271201584938828,8171811676013880,3208350754889492,5109424208345630,9037131083611995,489995092913595,6969164702072675,8771330374197092,3182696707653477,1322209030455146,7839979943124846,388036530558269,765673786826609,770782814740338,5793610166132595,4491947799748470,489063987830647,5081273413615480,7537157741780857,8905469022592890,3628710140141436,3286192182697855,3546558031810539,3237246952939397,2155755793817486,6652812012363663,8368133746073490,1617328180846486,2335817730154396,4031805233962909,5131219628801950,756773746746693,2220453881208737,6876239550963619,126821661122472,1591938333089706,6848237395140524,6089436343197613,2583669561114542,8479371018911664,6319677924564914,1182082423644148,4705757680012862,2258492172255171,1903805316874181,4877768592465862,7221444944650183,3553979988017099,6641341237247948,816013901463502,4765822783160274,3036780830728151,8700708540253405,7149056314105827,7808370269500753,1226508626911208,6084028616621585,5659898090520568,6214360876138489,8303677348241403,6461180054724607],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/205c4b9623e7331a907f293865925dfa",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000778175.1/GCA_000778175.1_ASM77817v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JSJT01000001.1 Escherichia coli strain upec-248 upec-248_ctg_102, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"205c4b9623e7331a907f293865925dfa\",\"mins\":[5859080619220994,2991707264114691,2235115913207812,5349090226169174,3728622142857222,7243207238129462,3936481708941320,1305774346354699,3484985178759181,8328806130479961,5824963049521168,8600737110331409,910260459544594,2657920817778708,2357378814590997,2119859839299608,7362756409147417,4279099998765082,420513773821979,5478482300284956,8719382970615673,133535365812254,2261620935442464,7868054092312582,2430236048871462,8725800200456881,2463415854891048,6364308473326712,8244811689408505,8588972619104446,4281915611832365,3248848289660974,1874239187120175,5982640473612336,3205569263312945,89217825112117,8810462027214902,1840603893760057,7807324074018952,7249876427247675,8697447499234046,6985245606318144,577022782136385,3533801781903427,3172383269003338,5510921714606156,2182398795403341,4763806838976525,7371661740671056,8471416538238614,6749844396871765,4588882368847958,2128219652771929,6652122976211035,780927423520861,1051896060691813,7617995195688442,4532998204641377,8920527252377698,6147782503108707,6363223884542052,1390675320180837,3589031359889510,7793252700781024,3212616315093692,7898019631235179,5470570690666604,5568630790840431,8789761698894437,8557913976427973,318427908817011,3322284621480052,7775585762742974,3459151149293686,9223118495385181,923547613745274,2481176822280317,3468478413435006,7640936389113877,2344109037412480,4552055457790656,2758371055804546,2626771742625923,8539004164948100,7320406424580230,5426426969901761,102186394538120,5026847141937291,2569804992065676,1529771851866253,2444008305504280,3238514465894546,2634406262534294,4479098013347991,4689327314907288,936156697600155,7765584890341429,4577706923735066,5809570678718622,1930844063527071,9012936261589228,6980401474429351,355068611980657,3089609529942184,6746820172378140,6664849986859178,9185438272614573,4260042644267182,8044184034230448,8325363747717297,5779594307760308,3991881398988981,6318558600655561,2513321267851452,7813210444492990,5752477798703296,3941664884187330,3813318153999051,54267487195332,3920674891829445,700570702659784,1285480463289037,325405291561168,1958335824154835,4990822371406040,6763584774734042,2831593290445019,1452769867915484,3813806871597279,9023651016650976,293631713009889,1355348817854691,4466484413501668,4942284316191441,785648654295272,3789981931700457,4285889479766250,7303145929355499,1223472291905776,956777688150257,1083684492550387,5478954090696949,2144861695090934,7503106689917176,5628993266052655,295102052892922,1012693995966716,6330764457199658,606392454750462,234488146968831,4746016443060480,6485806308532481,6251498761466295,7915640336060678,1052577627164936,2490674119126568,106776035873039,2927652349268240,8744065506162346,15214235558162,6313316894343444,5962730765967637,5243940590752022,2638357482914074,2174974481998107,2640078475481372,7608817843593338,7656413098012959,6639787637215522,8909732310045403,1540697415967014,6057434412714033,21150285087017,4523320794685740,4941779457685554,6450742998952669,6548257278107953,2794968621154611,5788684484124980,8001397440233782,3816397287392649,762182587978040,2023429428011322,4313045818585403,1752908108796220,7298749349184906,7606467691581758,3495517882196287,7512500632015168,2355412341809473,2088069525771659,3346776127533380,2987482276307270,2791711361773895,3731143665119561,6920749447696714,7600533010597943,3713786577838412,124098536026446,3657672682430800,6241052815601507,8151325185288164,2673985800224142,5862130321367097,1853196278886744,2499118837629274,2227481306654124,1792417193943389,4586823680090463,6903200412788795,3296962647322980,5250521463216870,636729285540945,4120190169361809,8592181650010473,1085464144855401,5760795239805290,2139576114905451,8098712991035756,8625407358164370,8311019152317956,1981067029344623,1122474689470832,3512898337591665,6364201369596275,2239183959286133,7641508116359913,7475092350742905,5375296869237116,5803893689332093,8805719932889721,2062128011190655,7093607097488272,3257692349493636,2436724776239495,4905932281966984,740607477961099,1802457946327669,8429228251806445,2513155861381520,6578302166270354,5911341261175963,7215055957377431,4492617869402521,7606562266386842,4997183107092892,2564237403603359,7977555933352688,730627061744034,3693090239263139,7922006282224037,6535597500903847,1147603046457768,9170463103473844,6859671838925226,4146001591927211,4858254758601133,6889719627880899,5923439901028217,6563744752300468,6046018190438837,2409861074473399,3123099783696824,965770318045625,126141660684959,3934834437456318,6851313249743295,3029341628273089,2306539468046786,8451694650196392,6982012547558134,460724902633928,6103640832397770,7685169946280396,8057439109149133,2062946370593230,6192421826011599,33355113951698,6304638001390035,9047481075304526,6973334182239240,6328458091603364,1415164117193179,6057766533247452,7457366942433760,7606238520869346,7059564896941279,1623756785893861,3647315641012711,2830075377656296,7434756525609724,1320593841811948,3461927447106030,3069234671311613,1316262047470064,7281161084531185,4630603735446003,2571781153471230,1756517806858748,9083574064996861,4560468916523518,2409391466709503,334627267289603,7904686935169861,329115395973639,7522436974756360,3819505028789676,915177206215178,6853818491443933,7046263851764358,806065740141997,3706241000403472,8179864612635877,5659157171393046,2483232887628313,3058265525461530,7775114526998619,2521002441265700,2410197458295558,8196924189913638,2169826375262759,6109531722023465,5789573214511659,311935564800556,2066190839833133,4810524835729966,5855779389325177,5498454157423152,1882484501008945,3343417539056178,993226001749427,1125038647685684,8014596945296394,7976867571786294,7211587815200661,5394219840704607,2965832364118588,3429852718600970,1383618410398270,8445002148701621,1308040806261312,6091645937185345,1448281385951810,3178442832052805,6611645103428166,6545724660796074,2316787462754888,1820959062880842,2472140177142350,113846791348816,5539170023359057,205867475239506,1525557707760212,1280168115413774,8031406990306653,5326400466580921,950790026596952,2164808574747226,7919002265754125,8661840198358754,5080508310012510,8741228954923616,8812535259785194,6935423251665506,6817438024151651,8384970864149092,5297868597404261,8701452782276624,7861126491783069,8491613116097973,568000522973802,8940081059791467,7754409884422930,1587590753501807,3024423721812592,2589855202779761,2793097290789490,4289392086258291,5045175309042292,554127215600247,4005771395834488,7049445218833017,4120589373940346,257814287504831,2897095043949180,5795162424406656,2435191429074368,2397689414378114,6232967090696835,7884387499119236,7938505541344069,2679207567196806,678285722124935,4946516284314250,1724031441810059,8789390209405580,2353730651177615,113269032034961,5511923038667410,7358116785174944,5339577517900437,518593397944982,6026699978048151,8109200655040088,957664219980442,6586311591924382,2215385946845855,2989476604134051,9042985953004020,3504564547469991,4273289964511912,6631051285934764,5961322984107377,8200159383064348,1753771755791029,5664545369785014,8950184045597492,2041358419321528,1560440145576633,649936829809338,3496369553818299,3763145072980668,6572195292820938,3375494323790526,5788626177394805,2098982571856576,251532409189057,4039196619215554,8167177011847876,6682597705495239,5912127355224777,2209227890905803,1156519831795465,2555252183827150,4911327153189585,8949696555437386,6202748544676564,7298738867790550,239945629602519,1550977950057176,6108826269531599,5294766748025565,1329660083311329,4567546034963171,4704426556949222,7813367093870033,7646609744973725,5177840254444271,3672224951714544,8570715246269169,4987313721561844,1787259017597685,5842392311423734,6025606226006775,3958895049360120,5069302333174521,692261617423099,6786758668423932,8722933495968554,4212662351934209,5810464076514051,6375221759576633,7130606621063980,1616248529153055,545034796114697,877463201362698,7335642155118039,3655348890841869,3334521995297550,6584841380211501,1568756855591696,3312750158140177,1370559325721362,7937636816298772,6242121013485364,9037916445556738,6010117874946845,6320444637377312,2069696959583009,1821681489232674,7283539392975651,3364210976543527,6347070686084891,6724075959686169,1789900134822701,760199217039095,3298104694887216,2004039151534897,1751698265555764,8188669259415170,3406325407851319,4845256832766776,665513478769460,9065084596160867,6221238639424316,798868643812160,6281497035855328,3022380208440130,5669509104911881,1193194748379973,7454968044588513,3194308357559112,2319028505625418,753153853702987,6835847231583714,3285863149081422,2741660511556431,1541037172577104,1175397545550648,5948496119125441,8009831577100785,5530939248102201,1419703420392281,4274777565541210,2128353777681243,1034145939477340,7405781378130782,1147610223223647,8752921214539031,1533610324456290,7732183357549371,3373419224413028,3639144062502374,1315453574816614,2461665449976679,7447968941572968,8519892691163288,3640921402798955,4804113849557868,4710684819043182,6408366099364270,771166874256243,3492622314177396,4745325140824949,796516093461366,3753675332473720,266297663386490,3225933434121706,1989126515630975,3813469322421121,907310714922475,6886829094818693,3168575450833798,6994363248708417,5272525025047432,4287993550570377,3104551481378967,7912365981145922,4500080543150990,1995644919788432,1934324536599441,4424843564700562,8998795423507347,2790397990978452,117793242025942,991336039265177,3764174567576474,1719461470643099,98055163335582,1947362805623621,5472728336085921,1062265454900130,3926064929824923,6076909087628102,2790759863837607,4953149820658604,8199538191279978,7302752899863368,5073156142875570,4824386659382195,8396508860658612,8674670306599861,6443784898034505,1672317452907448,5855712591020985,4173319206690975,8783502280774588,2857818427626431,6372996914213825,1157467251442626,669811571962820,7635490757400719,3584901329069000,4097782020987724,6513875706381259,8425980466193448,4616453495653326,907164545261048,5387187980387287,2509715549919396,2570809912824794,8123516906542043,102565214680028,5386911440364509,191598411457504,9076818340918242,7321703987165226,1261878071358436,2144389061424101,6230881572242407,3938036248081384,2076738711958509,7291819492885487,1140012540019696,6336152938842963,2023674656646132,6213240609679417,1919631874167799,4670831696962552,2909449267180539,4519324738618364,3717724958857386,6378674551886846,595892117099519,9058835486569475,6089652439225856,1172164637492226,4871056328320003,5486067987211268,5828222574330913,143345725674503,3424706376942600,4458521668379657,6365639325819735,6819720967376909,6001107418272781,2556327963026446,3233217934193683,6263170972926126,2314307504759831,4414847417299993,8301344556431535,5923997484364830,2924331359450143,1171980783285280,3067442679313441,6035460513596455,4528338812834856,4439357241263145,4884851639452714,4458909273596973,1376333197112366,8695347109493251,4589500102661169,4039600984450099,3912286671615028,8718820209599542,2397568319902775,9049388485481529,2715140864083002,3182324679992379,3842997852132412,7132268710888512,8810737386038112,5542898849719363,470398414697541,1505429101958216,2471969595081801,5826009492259914,5259326805443660,3774411384146786,7674151613951427,7866375711778317,3344902780892240,6843224483555455,343034588177493,9137429863620892,2513275657722041,7220111714722905,4074678051050587,2920066062038110,3955606250837087,2407186399323232,5446789427717217,1515481216234594,4299315705107555,3453716837938022,2182286565880934,3727059167776273,4407081787098216,4201051028996284,282631119565930,6134002501714791,6822874574181484,8417413703262398,3391858706936950,8027584499502804,441021008147578,5477515544372348,7643703300975466,7217042959914110,3198624140223617,7530331985466499,3322417381274756,291938081838213,4961473957147782,1974598399054984,4706110060348553,6508832892249227,4594386927288514,7791564038861968,175896512464017,44060762338450,4512763559527572,3747058568012949,7896352435140504,8405523286193306,3472461633787037,1955432948978846,6907437044057248,4502617358304420,6480414174873798,71889932481702,1685645628789927,8550510119265448,8996701607342157,891472737961131,5240781291304108,7211868266849634,8869269742340606,172206845146289,3406486889866418,8277556558095539,7356683079486603,3777954798801716,1580668012123321,195539820147899,7059993799656636,6623373924644029,6824052985741391,12520229467329,278740376483011,37254031406276,6047489833534326,8927947075315916,4114688373978321,9132586668618963,8629085353172,1272101094470869,5609254094157015,2581034133583066,6798651245831387,2746740739822815,8755977848294029,6552739233923280,9149955693775915,28337268266212,5970012582401253,1303579862459623,8679329479869672,1502483749131498,2460940098376939,2875119864429437,2194026537071857,3745691804464370,7067369247249651,6236861544015092,3461738536258430,649346518873334,324230192022775,6986109377038813,3309153399130101,3354456329798908,3520427090617597,6747852412978431,4909275774137601,6710920959153411,8783200348723414,3633452930009981,7350518350345482,7747901425624332,3641062808497026,3579385405969678,1968358009558574,7760471900674265,347157609198875,608678462596380,5774736280085790,8303745815831429,8051151538439456,748493633127713,8320452755817762,2792082387105059,2144295051339044,5278113965188437,1667613825422631,3389669392196904,4198112666613033,1710580230436138,7380061455852844,7287619667993901,2878497757259054,1989118792365361,6031427847992626,7679109584230881,1561211337072795,116589162149174,8140946923541385,7387311707809084,2440967105688895,3029860654573792,2546086870418754,6124171288552331,5846008576685380,2255271338167862,6494693793629511,2003627071083851,5038763940545872,4101024717622840,7450634403829075,6071655422456028,1234779779282261,3687598771689608,2562883673752919,5394612515087704,3164104797435227,2923707812386141,158913928799585,5557323231348066,2909476481185125,8656156206547857,380476869989738,6858062779555707,8802100285823135,5426883999288039,6772732532958576,1913472879708869,4550736576566643,2750408660657524,3643628911563101,2612167706735991,7559991823487892,8794310088809494,5892479742866814,4754015864153475,4091181569054084,8305241984120199,1000793834431881,3625832106907018,1248171481961867,6063316204944962,6802381326464398,641497577649551,3514751407928722,339034220533139,3433564635899284,8926606378878358,1437404333118871,1014488286180932,3963252660082076,7356846097337559,5546537427220037,4520976796439968,302140257136880,1020487038711202,5356323937822115,3633897363477924,7528048074286501,7302732293254078,7717829201204369,1767001339426217,2731408912889259,2862025196574124,2734691450365357,4103871071876530,1615805749241267,2852943564101044,7763355015020081,8066264245639940,3379690213143992,4571168539530681,5676997974996410,8395130278021678,8064219598979223,4578360470906301,1684541581264319,7893111703799232,2109338263586241,5232293236954562,4585567380870595,3375965378037189,4011135044584903,1532231731304012,6564781728314826,1876207015413196,8694040690017741,8112973404274068,6393030055892435,6084433886205396,7579519046260182,8512811347178967,5978101212931544,8698332590274010,2670151490262491,96823843735004,2356902362190074,4814981291587040,1535063496938977,3473052769015266,8112216468284899,6687740656830501,6655171521656293,3255800624584166,4960729051461095,7293944941209064,113769038976489,4987596047791595,7253633366222317,2961425221989873,8659386870962868,2241011611182580,8372994542765557,7015634353141240,6872140933143493,1218023296808443,6694977618002022,5851095604147710,2221906647410175,2830811517908480,6095385139958016,7952487478216194,909557781804548,2051033510438458,6328700050601485,4189633671095822,367970776901135,5026028643122776,2304539911632403,185135589226004,8938620010911809,8882223087596224,438382781212187,849299192264220,5483272129254941,5593311210044068,8379516354311711,5809455706822176,7596734866439751,1138218115835429,9011426629690172,1277145842427434,1053681166214699,6161515286562348,2871178830644782,3618063291627055,9054867349584892,6533315474228785,5720391017313842,7668213434440627,2493587897258919,876228623607351,6793828710484336,2696906355795514,6371200743200319,5180953740789314,6074385662464008,112565798999620,4267064051471941,6595576037684806,5212727640540744,7822350133554977,4803330485364300,2475314713904717,8079967605040719,1099512157992528,3894574025987000,545847248881234,8315031461396977,3118812205090388,333578810836565,6673075227376569,6245168367201167,3046942532736602,7416859535778063,9078859797314490,7929349078771294,1056399742412383,4800271459223136,4904957393430113,7583879429913553,3604100724868709,8942842223956241,9007202001978984,448223986562665,940920938149482,7164253886760556,6880273180763769,4784989623917501,8514276046612080,3237005651498609,3863911068636789,6610277478459000,5279339470612089,4610472403542975,7980786240508175,8688245763861440,7084825750111874,8194824533876331,167043047663236,6491715019843205,8345018156611207,3084853977048713,8296503176803978,7035581127345803,5273531122312844,5019550983284367,204848266864272,104177745548946,562607240181395,3132925813753493,2868657437681302,6510161575691928,5396580587734684,4311554702672154,5265123120101022,6515358279067295,8862154917254818,273169705301671,4140323289708828,7229128039700138,4494109223323307,8594720618331762,3844780248437300,302608756655792,3658380591429298,4981663301994163,1209073613719220,5382521049324389,4237539074401976,4772161298372281,9195540769266141,4445653405824699,5509066692568764,5840343794221872,5953514320340671,1439598852662976,4413295314859713,5444280865285828,2056797368387270,2522729966995148,4728324470884046,5701235894830803,2460734473004756,9132908525632520,3703694776023,5402676049155800,5242697689642713,8162665901676250,1443986292471515,8234328640607964,6664010515355359,6028391215257313,1054172634769122,5535262954522235,5333287473071844,3547782135072486,4344102135072487,8740233401673448,8595028790210172,347197665990378,8294645253333287,782651869345516,6422390769389,9202252780635886,8893864147363567,6751401486718704,6061204575086325,2313083550406390,3683146741977385,9076589951530744,2120418862012154,2783343659615995,6822100204277336,5883171429841194,2682235950348030,4053088119052032,5510891111339247,6652143124216107,9176417956251397,4534183793723142,1743209788307208,4721758881956140,1053649852479242,9221187093427159,5143254703216396,3208973197969165,5327896939939600,5412811201063896,3202607827433234,1772093084911379,8655614835185430,1351087127528409,1858217593308953,3951148041963291,7737197085779742,3791666338809637,1150373777852198,8606861947601201,1991163783206698,6598240466007851,7767937931326818,649581478942511,4274270668896048,1775979806697265,4021638072788786,8618750260307763,7339193896830773,327506758448950,7869103084287800,7958237890115892,4334239117655007,978850611402558,8932915527732192,274792493025090,5630273200682821,5709386733987468,7329623042501765,6442802221397837,6840341648085244,3930551311013714,5536236203149140,8046903434229589,262297732220758,5237762536236887,686727405791064,889716034582361,4004088876922718,2168987310023653,2855125351690727,2576994800772964,6154169292396391,3542016813135722,7307199296628589,481883942840175,1616818859835146,2861402905415023,1405577059608436,4382998701631350,5598442556102519,2273838361048952,2020376058877817,4481182332098426,7033454540529983,2590806855300988,9101286740066083,2474149675777685,7670831243653529,4758366609581954,6568326263744387,4626708574213782,6345620861540230,4973032179816769,298387923916680,3217544566048649,2886624360716170,7005601602353035,4868646329079692,4270927373993869,2406905388192749,5790964790024080,4157948689913745,4160126022031252,4745463713654677,8237707056594585,5622037961426840,4807185569740697,4237598646806426,6700029481252763,2976245038557084,3562717374600439,4661444297934752,148554695608225,8244853440076704,1367699723044772,7867289030074694,7193039224375206,8794616942453649,8482553776723882,1411562183321517,3353518872332206,2410983203030959,3942606670972849,3532119970224050,7981934680624115,1786784236170379,5888716618704822,8104617108215736,1350281300930207,2707290026870716,7470985706406218,9142148767273988,7099137001969602,1285144604825541,2366122170656712,5978794435033034,1917220597480439,5711034633287629,2751890801645518,8649394277585912,2843456650639316,2848176503183317,8904375767902980,742449454393303,3266269268387800,9197956372912551,4756206974506970,6050162097899483,8406285518876081,4727297292588895,5924979399384059,1830268693993444,5833612259573414,1501840430117884,4212998694971370,8333886829919311,4414307818707282,4726650901227502,4141210681509872,987105269848049,4486813295335059,5027736341551093,6572476717303798,8254361263289063,3213988571539449,5221164721529855,4583725742856189,3970807947683838,1113547510077440,8048213154560002,2959250607480491,9203373353111806,2104519934924809,8775685911277911,1714180404283407,2562578271266832,8405880525875218,4215671249811475,7616506808324348,8902361039702040,5691257654103044,2039697840715802,6618163993244445,3950002242062682,7685344253958174,5754686370494109,5148980250990256,5101683099736098,8027753902708771,1158716490930212,169624182697529,5723360613174961,9056408138131496,4669780111865897,6060172696057898,5755998821259307,6888802582865964,5138977312765444,2167242595203119,4181281779263537,2651809316853810,7206166905503411,259088076671028,5854400033650347,2935382216684553,4091243956815929,4795426756147258,5950527330869599,1076579573766205,3892371598989377,2172287414552644,6153948080058038,6082291677947974,4553790569252939,8486090814467180,1821551714945102,8559236026021967,8527649202526289,7039665049380947,8534307831682020,4320986050725976,5370976620489060,8530457979066689,7986810274920541,8445169186490623,7661250562885728,3422844413151330,1385432822868067,349767623575653,1292863176689766,993631974471784,8264433517862588,5676954615998930,6592237653317740,5824356341717102,9074573824315647,7567615698804930,7457660503509106,4765676198175763,4642336363096181,9202268699002920,368915873239401,233296489277561,3318165060487291,4826799375718524,3398470435692386,1108166494080021,4804672276785281,8498804388745608,7489510163736939,6722901807712388,4846312142272645,5942866442619014,5115208205547201,3554172356249736,6364092936832023,3889415131871372,3634597400467599,5202817753598098,4365581199710357,2614697878718614,1564915573237911,861763781830808,7123070194403481,7200669157685402,5136721276512411,5487175665236125,7378306770819230,7642586415323936,6641155958077808,6348907705216027,2856215005730980,7836289669525873,887433673881770,131359518570667,6463112871925935,6166747151939761,27141746342066,8143505977179893,8279833769011380,1110463687231669,1571845198751926,1667965263247545,5051432539269306,1337578450090171,8466679623792222,7237325245337973,8417900494846165,1024116778875076,6532727659378885,1592599533574342,116289689660513,5946533100351180,7824529303595210,3332031864527052,1574712798197965,871928416692430,8544681838532816,6242013984625409,1585091358386389,171696315934934,8216227390351237,124408420690137,8462131047278645,5995058603178206,2325350755879136,2302143995115746,4650726365129083,5573572253900134,8677404261345510,6161629748783336,5431843803654378,3384681920227564,6291118634244334,2729012306712815,7662264213133553,3734908231985394,752953043015924,4537776651978997,5583335211153654,2332159970220693,6374391574358265,6294159053277434,7423169727770483,2616708825090300,5394532950534398,4221618855090431,3105863704385920,1270621240174851,7949556095600901,7358445198547209,893070792300812,1525562526492942,4823682473445647,5580631435856144,1583069890320661,8991141000939799,263511612897560,7803048901239172,392370112142383,270873324267804,5586098873485597,775825801107746,2625992604322083,4936040132552997,4300140535437606,956794137753897,5220476694546730,5416007709731115,3408425625962796,309739075521586,1817302344161584,8398671374415850,3697871907363122,418142356576564,159311917533494,2312878396041528,8316110361879604,1999653908166971,9182545715384894,3776412219984190,7531348323445055,3671439528499520,2274746986338625,6946423621487146,8732822431732790,5526812130138438,2137165687535943,7431593957501258,3552450997041483,5719676001142498,9120110479075663,4338663515134290,8036829034228052,8724133974849252,426875394775386,386621431482715,4990114287917405,2435995871201630,2589398439520608,8865846797597026,8495035540960680,2469283444599140,5661504645400977,4829792934091113,6616110992083307,7977902631756178,9174360402516335,94292632250736,4766337389369713,483348184811890,8017526242617715,2408363197917556,3540445101472117,3795755017271670,7923291333080608,5476843305777528,2731487272651131,3858224035027324,7352469028656306,4483687460215168,1337626124900737,9116391526344427,8168079143819653,5367454651591046,2495673317636489,2916591282014603,5940203619654028,8650657958124274,6311380195694991,1363472823179665,8327599730018706,2812677611379091,6816140684577172,4051631205779863,1010691614882200,1468435389131163,6337274644904348,8694380075498289,4886868911864222,417183285987744,861392469825953,5426707122600356,2982403472226725,4623754979346854,7053276770107121,7509413864855976,7220025238817193,5161774997412266,198176128092587,2087057658268076,4869089014847918,6453894400629167,6838508322437553,7922745855910140,4112215828220339,4974879756798388,4603016361605558,4810915518237111,6187809768630712,8016739934946164,5924556079905210,5735395064302013,3980433721457086,5448333877590463,942666134206913,4451901578131907,8646895613981820,3282079768381895,2596002053130697,4719003487095243,5445580157196750,7115065703258576,266747475753425,1668596037745106,3757165922705827,8555340185356757,8324706907900613,6983832037444056,5783914855246244,190599583623642,7783144962869723,3156480916105693,3066520441915813,5617553253758826,1206109020850657,9040259016362470,2567652907002343,8123509697168382,3790555233065450,6917971709200875,3875843314616813,5941127891773639,1740395278342643,2399109144087028,2458019191831029,2752423935891959,9144608465066801,7578878632417785,5903292757744122,4026157818993147,7011131767310762,898355044186622,5565350668760832,6835792989035010,2063008413757867,460580543248900,587025448184918,2591314194680326,9184864644744961,7543300918315436,5599867525706839,3301669530810893,3933430968146447,6078758054567281,2423211172870677,3407417032890902,2874305858943422,8913282277275219,4011465562278425,3819282607995418,1337823682935323,4907225642712475,4572260837272094,7716721045510667,5147489034471970,1969003266570787,7175224400443940,929969753369125,7647411007617283,6391604629121578,8142596272331308,2033030565452334,1808464570083889,1271152529340978,8603154222869044,546390065056310,3421175480810039,442379340315192,313805160671801,6688461578349663,2818908710349372,2341627452978954,7930928405002814,2518288437807679,2956187255855680,1930759754111553,8055559338871362,6816901238266438,3982947229822049,7325513255430728,7227310839314641,1204751753802167,8231564070405901,3328418818493008,7593967918787000,8021531636894290,5983223634987603,3728967388755078,1887627906882134,6407545686026840,468082959264345,6733530985728602,619756558154332,7293683406904162,6849433991193701,2756148829149794,6082723240413795,7254842316319332,4384444165534822,2917966323538534,1738701129210471,1327617093048938,1763833688373868,7266068570217069,6372087985805936,8550022748977778,2855474670840254,7685377066969718,7569060977110121,2213129570848532,2247728248306298,76713886034558,5593545597857557,8932240705804459,2849656995314305,6530515580324482,8674328407850091,165792636480134,4642843437996679,3517853633014408,7499942705728137,6023516580028429,5943804311894669,4298157106822269,1440086161402512,3556170538121875,2450608614533781,5479900336921243,1753308552137375,7794462726855329,8510668751457623,6131691779643163,4483026856942244,6268954209479333,2827861308312231,2583154746694313,5228270315645610,6053610728696946,1537020432648880,2187371118363080,7724510455745651,5742859995253428,7747804385140471,770831345597112,6981729297519914,5552651826269983,5494527504734908,9116165232921278,1874956623407807,3879385250286272,2809718767484704,696766285662917,8836870118505158,1308079881551649,1850941908679371,1874542107503308,3580903455144653,4328922121485006,1604112006613713,8610160831974098,5497315871468243,7570999364389588,8605976960895438,23555715885782,4849657711811290,2719661363231451,6252429507249274,6991461334364522,2844485372875795,7267827156959747,9168096297381430,7925085763300068,3915472784263910,4279881745844689,7454634398513404,2114661762763497,2320997905608487,2017863976585964,4192794161777106,6943981820680942,1733488330992367,5340323227027905,314449369471731,5990363720530686,4085094571961077,5396793497098998,6187926840089338,4588826351770365,2934130909580030,8714570880644275,9005202054068992,1249140625378049,3862595997907716,7144873681035734,4479140437973766,1306937454668551,3224023476960008,7153042163025074,8625386877098765,8992603408346365,4054825354459926,7665939473291737,1347659037780763,3677744119175966,3686978483403551,2023409032137504,6717357464484346,1672690280184610,3243666353441572,4438151487247494,7929412095559473,2217824728075048,7018641336748842,5185292997025691,4990934060489517,1278839460809518,1021838098774831,1021639750908720,7707589327869064,5411906025092740,9107445861660467,1703437916199732,6691631711775541,8268762812580208,3715464516467511,3858229711407928,5250346004804468,771151939283770,3385759904131899,7228366762040125,2193889836206911,3582366510873409,7006477861972802,44305289972875,3541206393355077,2332595734174534,2557471253289799,6969224908585800,767973926198089,3829536338807628,8520891560951836,7524023027604304,7057537721630520,2722975644081312,1035348009397075,668620257274709,54928807149369,3839830780943195,7134056542165855,1613625605184352,1967900217355105,1929741658729314,6670861739383652,1355693212068709,3387950719650663,7088170934731489,7421189107424106,4485906862390123,6398465238080365,5106241252916078,2959350548499311,3960985728187248,3195488200716776,5852598555277118,7171691819395958,5452767111498616,985203252116348,3320900876696445,3032025711852414,3347159629025088,2686544187808642,3676005960022917,9026192641616774,6153576337371628,419966752631691,606812680768397,3877099778972141,4255110086353037,6833986613242769,3735719011408786,449954328588135,3261513360556526,6484820882770838,6391854740568990,5797501542288287,1833417472609184,75700895850992,1933040317668259,2516513634028452,3703190419827622,1646305274637223,3758221620808616,4764367314893737,7761554913336234,8644789270002605,2258474097707950,128005786442671,7445570533627963,2090878888905651,3704892020370357,5799352963368777,4616502799477236,924337930096207,3223034165546826,1659848504113041,5132426954926581,8033248447320961,1093706599324609,4703163501472709,2135096604875718,5391085785500616,3289192022973385,100178539101135,9071633823952728,3005312060169169,3821560155065299,4835822447066072,3151103808181412,5973120922098652,2251884510464989,5790268325641182,3496543980542943,4413914210728928,6117974944136169,4664038408080363,7269997855394797,8776679386799087,4771915571612657,4225686076387155,2281558473473012,7630912924212213,968748113128438,1145125463956471,8975008361441751,2830259086277627,4260932176202748,4762751895985153,1911117743246339,1407734237912068,4035769082387461,7832780204751361,4107344791612424,7958635627392172,2868199030500362,6506436218615639,1709208928259084,2494415491640334,7330181486482605,4368193544776721,3156944276864018,3326614806453267,7541396141800468,1178572981144597,8737311327037695,8822088796100441,3067617749310490,805332733234351,4320845755448350,4625536036531231,7223953172495394,7596731119771129,8485547671291596,700059310672934,1355565657226279,2915178544995369,5044122412646919,5951537149328562,8992257804410303,1951801563728943,7910855219076144,4670046822136882,6910292243573939,7317037294844983,7620211855539257,7928726925117917,4546673823771707,9211057801100349,4152442747800638,4230534457396287,6561532477643843,5192118225382254,4922802361003079,1612636636714015,5942065384086603,4650047259597900,4226025292930125,3305961102863438,4767266858314831,3132682207292497,3137020839906387,8888318446984276,3959220638104661,4728085340953686,2215280247524439,7747383978789978,2772284167605343,4773995158363233,5873398543133794,7255355172027579,4963122226240613,1154625347894374,7392982413843561,5288382662827114,1849189836049515,6548733000166508,6816443819904109,5324358032551022,7804931837512817,4017632119000178,5524139219074163,1255209853791348,7114616997158006,6425500222246007,2341001259207800,2346698706320505,4438518309526653,1262366023195776,6033477696003203,4746402769931397,2526240495254663,6929971272725003,6820507053972618,438854574541963,7627974237867202,4018724785429646,4893064095313040,5505189555469459,4039708618955924,5420519881276565,5384659971673238,8790794176916631,4772316598254744,2541031035836271,4762031577498138,6360859184483486,2269985197005983,1518556890623136,3578996623416481,8426313691556379,6696174202424484,8245287469210789,4162981813779623,6078577984824162,4379470044904620,5318644423166501,2230434136562863,1361225577573554,1250420615792499,875134964763787,1199755153304757,4871721899465911,8688632851627192,2026236631086964,1335701699607739,8077700732685503,5274495159024834,3394733054252918,532224739114182,8501902506724551,6975930551434444,7479320746843345,5551596145208530,3827295790337235,1104080838638807,5909444756462808,2724855133798948,8898041383738587,2940092630809820,8181072562001786,1354419926207710,2356810424642783,5840654394674400,901931471834337,5647534168772475,4988581470526693,8805934872616168,6001872670227689,3260711832345837,4593429204483313,6110625273466067,1018355523411192,7268794764750076,6941755272064866,6833920980102400,895399681539329,8854351558372610,5413068254633220,2045576691854597,8557551783120136,6216094863617291,6655041574092674,2169218424245518,7510868637162769,5769435600473363,6573178773535278,3810328094993686,2560178100641047,5287645478767897,7950659746327834,8439847584426235,8997639549439676,6435137973929861,8526854575394080,5563605173345570,5290346182860067,6750851599924516,6002518857215269,4938254385265959,6719064569552170,5859404947406123,1825093361945900,2994454008158770,1956939094953262,7363470578285873,1922264350502195,1197963051541675,3148897366994230,1526388199669049,2109825994698043,8083665576942911,7783436286160192,2616447217909057,6230844835953987,9092082750758738,2365414048390744,2780876524840844,4364710580399434,3308465573850446,8671955716333758,4581979074080080,8509392281324262,6939178355866962,8478987444325716,4259525210180616,6353341513100631,6750112766491992,443275948871001,663550836070287,6349307440250205,4769816767098207,3338013074967905,4294068497886562,4274823311166822,52789690206097,9048025571917161,7526797688869349,2220943948307820,4804041580690799,4192581360332145,6844714864541587,3020314390764917,1654004508413302,7917771061107945,320800131693944,2943776093321108,8818855874407802,6373238951857531,2564931009789095,7993520613141886,1939313756933503,6472427671228288,5740758977031556,6921739629677957,1153526756527497,6418089280867723,1296529575858754,3296402779852174,6357473946896820,9065139632741776,4159521219222929,3365541559217554,2132734055665043,448962290097556,3113226145811862,7394559187953561,6227358377586073,27362219888026,2607549250757871,3678108274559874,3527308810683320,4934420991774114,1285226976702363,1397245118305521,4005664091823528,5858810105137573,5655837810494890,6951728823145031,5581874784452012,6096210421691634,2474177960075165,5912602551437850,5082215959600561,3461011284749746,6608254712237299,5829571994764557,4135426915290549,769954764926391,8408061691853785,7984135389022111,3209700985683389,7760729728165271,4770329940483519,5051031092256192,8090964157107649,6845439856826955,612498938365174,8190096274275782,5342238240909217,4326387855506888,95335672892874,2861041144780023,5749942729657806,4083749572492751,4439837726354680,8896551123308752,7115565510267391,2055835598859733,2836051683896790,6269258288094679,6683574890925532,7965610324332453,922005921377760,2272874058326608,8686045525592335,7755102393884502,3544375496805865,924694737817066,7778635003461543,3164525091077613,7515785737981181,3441475510943216,7595105359707634,1830914225229302,5615689609387511,3082828996070904,955510212705785,8300249861066236,4364323455303165,1585465219251711,6414143064881449,8916998892338689,5563878505651714,1205148966280707,7305022208482820,3388481852759544,8330525997735432,32603191963564,8775722629387739,289412741225997,5040395774366296,7728415271490819,6274788398992916,5648553106906646,8442323623131737,7461258859609624,6543550232460548,4820800956558874,2338003281677851,7746018193678938,8722165604212256,5896561533201953,673908089802275,8416499520380454,504842659335720,6481777437923932,2953543609151018,2545902301273643,65617729843018,363600372848562,3412193769311791,1632545932299825,4254545242783286,492909452725815,4678364545187384,841657013022265,6742509007600715,8814854711972332,299021510237758,4664309204082239,6091619280590997,2633509876997698,806540983549507,219127232708164,9204064322864965,6652035869015623,2788599090376268,4563477645695586,1124632343461454,3069854451662415,8774051203846072,5483969637555796,3122332251553365,8806011350241903,1283101839867479,4181741017120344,7154918652243958,6034785516539486,4810411704371813,1526039318580833,5766981575821243,7700732237851145,2392544648101477,3193706453044838,8080743715469912,2520037021788775,6704889315121490,1029035921841773,1368887603125870,1764571529379439,832385482837616,252227878792817,3744877234597490,4088495394184820,8763922766160948,7970309105624946,2796934217008523,3254156206685824,8039903998695492,1223282148925061,2211096632368775,7962449713306220,2712244095024779,2012301316677261,8950452669456373,8153489318837903,5417276690014869,5694163690438290,376057577697219,5531389097143630,2943288050044565,6185492340510358,6193677916929305,2115046591520408,3670484071759513,1699078812835482,4361023345688219,3037301542633117,9008409451359902,2157929031679647,7635830782829168,8206673693474466,7495193030954660,1458939511156390,2063904110392604,5474448204193450,3761600094219947,8211045209267886,5561586553339569,4963030464041587,1739299347312309,5333487387721398,491199959981751,8073178195030644,1418211397664442,1214229549227707,1997508214632124,826975585942133,5824178611957440,8838840152329922,1950351940048555,5964728254013127,4006317212913352,6771221685192572,5639932700145093,8280827669062263,4502701244829388,6848926219890382,3688537180270287,9014023793106641,7545041443454243,594525377085140,1156577842927566,1631481276104406,8506062973629049,8259532203304462,2894408820752093,823611825934046,5141654754672352,4724108893925089,1981154059288291,5450391152627428,5823914545077990,7621804322944096,4556057587601132,2498401103564525,3389100120874734,3795028387798767,5163840132648688,6267931029091624,4768380591479422,6930999493076265,8379883779332735,5502000587686501,4580622250784042,1616057056259838,2203909323521797,4206599056973574,7828646954913544,7323538908970284,2431147396931338,9201102619219927,1872575906889485,8301207175020504,3156079150759700,5182364117536046,5608714533949206,6695301922022877,3894385258729243,1312909406818076,8127598629312474,4753827992887070,2744473906118431,4724731890605856,4719429313871649,8827895889194787,8547389958967076,6134118650839686,3148514413817638,1206628672783665,7886030753738537,7877467250249514,632723652775754,7618519342976606,8016696936765563,5510329357668148,9026220777570102,6823609602121527,4111711852744504,1953999342060852,2133746750881594,7399478461767483,8976303730622268,7795246703771453,2141153230466880,3770546504679392,6393962549382978,2777956427972420,1995726403899205,7790834026291014,517330267815754,7261274080976438,5506106076471117,7482085523734351,6817611207663441,8583974846336850,5067014384078675,9006213841505390,6608967962619734,5442495340777304,2428235422771172,8050449943611387,2016164553764703,6854136308322144,4889826673729378,1693082404291748,4162564648951652,3512032577594001,8955759719473001,5506034138503685,1896705421674557,6164115505409907,2932142013607796,275037120221046,1801275206256617,3255111532879737,8824800509890426,4256472345023807,7007797886193533,497551098572671,4189143409770368,2073715707596673,496814813028226,4211982679515012,8150994036996829,6221362529099655,7282706113200010,4011387404033931,558735877332876,6581963536019371,5915842324615054,5977905926680464,3796829349695379,5049306778140564,8827803687770094,4587953117122457,4514245792812955,1025475811135389,3544329638719390,6799595395192133,2948535438196643,5054369835044772,5170477133153893,5983240135415793,2605011208343467,4606987865481132,1308060898893741,5795137764646831,768617718185904,1610373911846835,6931880560750517,4628680223539126,57980449935288,8091840416174010,2779551068544955,8348394730450875,3917053492559807,6515951171614089,7130411148574658,1056815373995971,9062974627829400,3417344214880197,3949406079369159,7921563254894378,5578012417638346,1177183468310475,892684572200909,1130056091934672,8911890218514485,2508983603584979,2702174834597844,2153136934395861,3076244208144327,7501741814739049,3234906712772568,4020199739027417,7998964700604762,2478116024606687,4295609558564832,5003977362132304,5364423909433339,3405103093370854,2438746107822056,4101048935542763,8659205105741316,8549586904743920,6946980199036759,8782668410220533,5444527118203717,3641510570831863,6480735812289876,5314744005980154,3490271597518843,1812744655888381,611156861902846,2930455863865343],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/20c1ca3c7ff0bb437afd69042bb5f852",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000407505.1/GCA_000407505.1_Ente_phoe_BAA-412_V2_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ASWE01000001.1 Enterococcus phoeniculicola ATCC BAA-412 acOtz-supercont2.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"20c1ca3c7ff0bb437afd69042bb5f852\",\"mins\":[7161094028324865,7397973397568433,6771114066448389,1275514188156934,1913352213389320,5658038390272010,7608740704165899,5147289904285698,1920040107155470,9187506107453463,6147298425008152,8785421671886852,2326085798219803,5864539408053594,3766757806837790,4757155986509856,8986616860692514,6601065653985315,4656614695917293,287022676471847,119915731869736,1904204601110571,807361232973870,8379863288881200,5200092462516915,113514511667253,5991001894035510,2580810458984504,5737835862859833,7959049450553403,8888846196740158,6020176091791423,8907164748488771,1070531609624644,2715567973786294,201180129337417,8213247135780939,4024289592045644,8945773721616461,6684859709765645,1283113509056593,8673273532110179,4467950108061710,7860729959402852,4897863903412314,1445496353632347,8631841413083231,7108866629513312,8383045818900628,539062009851775,1141707727970409,7962136794554476,2781618321756270,2188018843275376,2338274582810739,7351505080361078,8343196628330516,7401587201505462,9037167793685183,1729880991178878,8267853307752575,567661048117952,7710393468379268,9119895193707640,4789404014723207,1972897068171400,2373004710080651,8350467932147853,4667819413356687,5565302779502738,5294004409741460,8256847196455062,4145648404658865,5959164293734557,8974212466240011,2558491688891760,2604865909358754,6557548979079878,980192377581737,1883909713354922,3460430211371180,6090892514832558,8447707226845362,5925399693521077,6084794193334455,2102152361431225,3332769996267707,879639190511804,1453489006428349,6745823212998848,5321178106577089,6021408727822530,3982654982455494,5526845741478087,4404279545954504,8385269553672396,5434452963827920,675182103740625,3521140618973394,4694816957042900,2031877642195161,7218588014725839,1534278363033826,1366903913629856,46896205652197,7228559009960167,8600532594954473,4448838426222826,9035065113538796,7540735092916462,2513547824012669,7357612797449598,7864971732775159,1100682634326265,4302047597830394,6007515373141375,4954851661226237,3941463857008000,6616374651224326,9114616410874119,6890632247240719,6671435735939800,4247152000540946,225454449406227,1242393799827732,5278436305015063,7677507240726812,6856681286065541,1016924227932450,7569875955769636,773011056320805,5458027170890023,7136627284144424,6462157944406313,1478245390168363,3777872737272109,4378098740797747,4671481203138868,6046371283112245,1236951222919483,3183696332128572,6764784043617023,4051794741129536,1477500657533253,5542904796242246,3051723402977608,3415923584360777,5687131324969291,7779233805869392,6686127891591505,1049015894765906,6438176765247830,199269464860729,3743749790196452,1399160078332257,5023023410114916,3557436797817189,1780340291334502,2364726042591595,8324321200603501,3983664421106031,3139072921493872,1184759953391985,8098233678819698,3743502224642420,7502430814421367,4140669414818168,4883960738861434,5432486427025787,8994564316473755,614397100794238,9007240043401600,814154015801730,8108752460106475,5961907986375044,5229263911240070,1121121033929109,6123945847554441,3272810575557005,4305163626156430,1856363401220495,2893440728617361,7522667809593411,3956800262390165,1279959666717078,1790930459324823,3443295381332376,5629078945615940,4358476049281436,72441475592605,7054650195546527,9004781228962209,7569497766433188,3001708606095784,3178607413891497,3215021552333227,7542457404314030,7077669100146077,8367466666557872,5270411112444342,2418915664080969,2392609739633083,2147839877185986,1516031459770822,803148069878442,794224681128394,2003308668264908,5994432890196429,8654460971336292,5013656734921172,8149507682845141,3767657482103545,9142881338950754,6748373556527586,6208013319172579,4132124705137126,9001033826421754,8043631193723369,2206170943193582,2610774117925359,8750494186661297,6566615319917044,8912957416800391,3531838058369531,6896378906865066,8873211451684949,5801112239436289,9162048609964546,8265783920862635,983660570423813,1431009792291335,5945470883557897,1538567320945163,5486002034250252,8528878890893237,6527442171798030,7940238117006765,7318927146603024,7100977761993536,6618172723970580,6428400622440986,7179357648659055,651394573234717,2341589635293957,2930878181511716,5005578173644209,7666406691178103,7344937536344621,3685805436101167,1510931093172786,3098582396473909,2839761290691127,6783790541173307,4291008363434558,8452910982967871,2108419559588417,7671801345409605,8075188605026886,508041060241992,5606922594275913,4954705783534154,8974219837088332,3203324869612109,5713632052003407,8038330106696272,9074766386154936,6692328683501667,5873477325550165,3236848752083542,3997728053592666,138118529217116,2763312535925343,7427886654583393,2185961830027875,4077065915310692,2287640692253287,6842812261200488,5168412949652075,7162348032930412,2503002601423470,3557718364144239,3088296224711281,833147990925939,4521469135008372,5664282991157877,4553339760804470,6680228459061879,8093718395589242,7265797425853054,2758077175626517,524123995943552,2454346932994691,8414463809478764,2793656456393356,754630876971661,4091796313899662,8402297775851676,5120883769520787,2006499591885460,252633324130967,5342450214452811,3774873778295453,2738846841275042,8335323053806243,1662028024201892,5746002966733477,1078182317961894,4939282062811815,4887935880065704,1774546274669226,210713240372679,7410601891799727,3036983908041392,7004830137463474,6110233734603445,2763758867956406,3399361449894583,5540047745995450,6216920220185276,1436940473868991,4194884822028992,2048835216523971,4286900363171958,6177394098356935,4080588743160521,7394165172675274,4031233318937291,6939222863979215,9003332792955600,5907744257811153,2609005050720979,7137056911721173,281746447053526,3169741163729700,7930584651600602,8140327860802268,5167633477980893,1515366708765406,7706724089302480,4284829212406500,4093583144395494,83034860278503,2441156282845308,1290827687703274,6873107241497326,5462380891923184,5929369205502760,3614347131609842,99072166454057,8840470942311892,1470272796885760,3448535845794563,5104776036336389,7373649981559559,3953064580489992,4730276934619948,7380351754265355,7426770137316141,4310242012853008,3436533668344596,2596127460234006,2761508628230935,1806950146417433,8261351633412891,2629467993756445,8867087200822046,5718665021039393,1731854853952290,8961044632835707,4191272279610148,6834783158423421,2336199243076392,3033972405211945,5742093662929706,8580852780151595,4161620227203884,9217252573467439,5468554107457672,6850589419746099,8155944746188254,740472717046585,1476850809090876,6187353811858240,8446084554822468,819283256075077,6318507479130951,2379758644527945,6219865382712142,8755323283862353,3636622451688274,3188505144677203,7897807267124639,3163974288427150,5495068364264249,1244874520874468,2527120239747939,7227488092099428,2026830618633061,5589939000296294,983515587523431,3034010235155304,6736689826007442,2684332727575413,6570813171903977,7064300924290298,8878266214368123,8465033747124409,96090997302145,429367919903619,6817788119024519,5530909584626571,7464302459319180,3749101088981901,723670638347150,3372371129361297,4568508160078738,1072416069162725,8783882403796205,259454507795352,975302995768221,8184501778111479,4472317448573857,2380173159547811,7305853584696230,2861078820328359,2894302669841320,2976956775048105,2722913212269383,5165919470224300,8751293024433069,6602867672686749,8054548223890352,6888540710568882,4419498760037299,5675139328205750,3717715844666296,5578293715944377,6131017460814778,1204824243082846,6377282037535678,4582551170192320,6291467795403713,8965963656710305,7953893747925962,8315757897344503,3548178679985101,567308550132686,893465291759096,6311569539351506,1561802561106899,9119660770395250,5751297383179222,1730264600694265,2761776999920600,6890336326046685,756738368041950,7832728990954464,7378472141912440,4461711404930018,5697844643935204,1442260950885349,5033055332873193,7685566183568363,3947504621814764,1697631068395922,3975360886518767,1269662829233137,6195842150499315,5495973452440564,6551747534102697,6615544857715706,2030644178605052,7579276835070973,6161075450909525,109207734932482,8318073661424643,6706464454101007,8004853931991212,1082474532275212,7606469268960271,754232622933011,2649492353594388,7665923134583830,7327041664001050,8692284085968910,8551326926017568,8294580177138721,8829648489112610,8725194757887091,6850867898352676,2169676345398312,2776229241300009,4305709375296554,5470886993097771,7976146571580461,7470225393554478,1993871364871215,1046002379072561,4716323142263858,3664876241884213,8436470189944330,7485619288794174,4446905498801218,5767492876503222,1049266349425736,859509682685002,3732083885577291,7286914504926284,6108178109963789,4780339967571025,6998467757102162,616237318591572,71154855093335,4538298908496986,4158779633174031,911478457418848,5001907608478818,8489441871667387,3084900603069540,5582391154205802,2426525263516519,1301315320038512,6935982454540119,2540803818570867,3058574329287796,3456041721697400,7342133452563581,8685217275606142,6884712304612479,3905420701906048,5801790864151684,2679220608705671,2964294376141961,1264048296465550,8875669790928408,4602757130253458,4409914239624340,6319237254984854,4485859930928280,1004921992594587,9174515865026459,7250259443334682,8982889884603552,6830754935473691,6261830546166948,4815302504907941,1808901285500072,2108627429696681,6950646458897582,6246470512477359,7599993343358129,4942180200273076,8826565297939637,4287372055897271,8826044107871416,5145735614654666,5245237409436863,8245826760984275,1970208249242821,1125231636637217,2751791799719112,7555309079913673,5610428789691594,5758633436583120,1726537775953108,6436547737842901,156876675749082,6766493284816095,604869972137185,2078873585562850,3424791675118822,3427272998962408,7613148642010349,3175242965408637,2620164545701107,7666490234844404,5248671647859957,8615542920697080,2355520317109497,3217603214222586,783406903502077,815969287988480,5723185466490053,5268870047737091,3464557730281686,6323161802274055,3225442883548424,1293455814710537,5194423963436299,8081824105272590,7610093973063213,6814750445784871,1575917593343251,1197063351821589,4172710862333210,4878735033116207,8505688729044253,3405115336955168,5866754143081764,2075042664998182,6928990272464169,2670008549836081,1870958505133368,5787341619713337,4243417748391228,7501941427410237,3631051971228990,5554396998669631,2336873103389096,749534918464837,7573518848025927,2717662238332232,4737709428028745,6593135464715594,8123902513325387,5692156822873422,7707079081970758,2400989940327763,893134537958743,328545720908318,8858139535967579,1880918207386973,5374843385259363,6804008072619366,4937639465264017,3670592800793960,3166439704638827,5001522990797714,4453759371617648,8924977138447729,3716794024387954,816361183659379,6655255163671924,7197519489534185,3867510880335375,664056375584126,3371285939506069,2000510309549440,4571085590689154,6972098346395011,3997703337100676,4712817029170565,7512200403215753,5370585406211466,8617371017078156,5936826438882701,4044406777742734,3796579524674959,8223792585794960,5341474026595224,3049905311794578,1202057143801235,7951591165519253,1110364225693079,1806708562589080,7636925924758937,5810594979403163,1434189753374111,7715911400306086,6707773140207016,4409034027830172,4573425114633643,7776569267959212,1592687391131054,6825393538429853,3812693267695025,5934856613496246,250608781616568,7874341403461876,174102575744442,1696399716111803,5797233456829884,4377410780796351,5210883302899471,4834946429568451,2618253010432929,1027674679453131,5462353813329363,2269529719270602,7746276337751511,8765326305119140,5604651321497050,6155325581919708,2470426458088925,1443033951794655,4176173683238371,8801210800674276,7828341690365414,4214759504246247,6417790199096808,1257645198767594,5243092296447467,7169514034963949,339428332590576,5348810472326642,8042185942029225,7908119703291476,7744025960105466,6251443829954962,4815860123211264,4702484618614273,5413845871322627,4232206384498262,6600291011248385,8249307262862856,7986088874742489,3240588420957709,3915391763244559,6934941133995608,342695531062805,8915864692094486,8259869357053463,3595810856277528,4558862249063962,4475225526485935,5293269334689309,1609011051828767,588918374970913,8007353428870747,7045685883954727,115192084536924,3741816093742636,7172261595948589,6517119102576175,5912007012664883,661568816219701,3561206751639135,7479583613290045,7357510792402495,1088713243739715,2622257382291013,495757661382215,4460803600643657,5943718671795787,8387580678104466,146005434627663,2438704958252628,6481676140033622,7121827484108778,2068358747055707,7547256612484700,9030698461770682,6126689779013214,3745037622503007,8790567315269217,7952353065543266,8237027243896703,7331253942539882,2734771822440039,665713020389275,9098562051532397,1100493666649711,2286551939442291,1906713582876277,5467032519671401,2928786656151160,1262412244334201,4586964837160571,1853875404732031,3356709634549377,5219306974756459,5259668232128133,7701169015503809,4751306830399112,8208415249930520,2733124852061847,6795044018923163,8109616494043106,142135928809124,527189186885288,7857062268057258,5065940305585835,7881527683929772,1220540968519341,8434841270835485,2670621928019632,9136434848655026,5455578374352499,2361483050968757,1855263212582582,4436304853952183,6333980121380538,3446731787339451,89775250417340,7921327845091005,4066840095020734,6506505506371189,6436897771923138,3207215183433334,202611023562440,9177707713926858,2290452934178507,4118945779689166,2348674066914253,7195475227154131,7273290163353300,4604195000219357,7818974618658527,1514336294725344,577985635522273,3061625102859899,5199457427187429,8320949167036134,1606685028729351,4357094384080617,8674012996149813,8448844011260199,6910575494895340,5884107517728493,6560060896474866,7843724610547315,261106307287891,3441809987806967,7550595783497464,6928108957218042,7230767072425599,7947936122349308,2040526081758973,2303684379719426,453854522795779,6603575787153156,6538413482235653,4072473913098402,7473849349941001,1608594200893202,4768806151231252,8103983197474173,8265230666127925,2551347526260508,1043887867737888,1137381640185634,983721937225507,5503388604565285,2232670915086641,9106168606817244,8783933787088519,280543713466156,4205874121734450,1058956079449902,8609031126804272,6116577694265651,4314019197908791,7328226587830072,3201871334025018,2618784536917820,5669347027216195,1614327487358788,3438529608853319,5751651635379928,7034372918055906,3957708766336850,1487159447590739,6317869025015636,69356138056371,709451500500823,4224858666760026,4985669167535963,6300606478161756,8740988679315834,4988705908901726,6839793051379554,1307278606042979,5963696459693030,8322546708915857,5824430865450856,1384390326495087,5306300423419763,7965045928545903,2513599669757822,6360113724962687,1049626152636736,8564877510682499,1267016598349700,2721782944978780,1202230759057290,4080766032123789,842698264938383,3826524663863185,4728227091167123,3498469025937301,7655895485622167,4369485337360280,4085157849859994,2390277012453275,4849261292758943,7657769730664356,7994510103114054,5753556526024620,2913415101128349,2137316678203312,2784530338104307,3689345202390964,4808509060126645,7269357909477269,5936746688422900,5932582070233018,2515693840166559,1931928586491838,7513227812946251,9122941071256487,1991476529575879,7367111596962807,1871260121380812,7010735541852812,7692098830022614,8418253355990616,3361092066100218,4999745414907874,4593891956897765,1254499840157670,3833385828161514,6791401058334699,5579516647954412,1759617912031214,8096430654031856,4659375216543729,6367892834162676,248522009495543,7176691641309177,6109330595756026,4934022803396603,9123344375531178,30728802899966,5656846422726655,2203424136526848,1168900761774082,6792337775048708,7938080500639749,8236904765298229,8363165561567241,4894590432417802,4280285857736715,4854696382715917,1008561541863438,2972064935585807,4303743423371280,4179621622544728,3500710756722706,2049106816591892,7925192856672280,109149673138201,7789555197765659,3365259331569693,1637061560039458,8290712013058991,4585106200246314,8697187400525868,3124977182459949,6204570677401646,4017594271897647,7822063174593544,6939339641411639,4206867793977,7789790218938427,6372027707594812,5849370697140286,8565421270104128,2301916730222659,3613290715068540,7830507752630347,1764607848220753,1925307832085518,8820549866440792,1299362458310745,6990337704904796,2438774922849978,6414043089201509,899420098332768,4548007915538531,961739544475748,2027038412874086,1897158961866854,7252773334678545,3784752718723176,7520113614616685,8224539893450429,8839031834404542,3396726987536502,5875871529126008,1174342045866106,1553633210124412,6733186083072128,4219976440428673,842730627803266,8989214683220331,4815602817566857,5299412601088142,7099863713048719,368098255386769,759834780031122,3668299906332819,3382061846116503,7610249663547548,1673687002699933,8459357228947614,1402936365407941,83367007033504,7342154687244449,6760073725941922,9181911223947964,1046214729951398,6062108182390952,5506063556581545,7440333772347757,2103854193354925,541520327198895,7017508535077041,8655817116532486,7425647289862323,7434260453288116,2943130049284278,2026700964427960,5790191185273204,3189376374782138,337627361511613,1767298995681470,5245282430937282,6813527713093831,4397316934449354,117114393451127,3478743269226700,4151852875380941,8018590898985063,3812607616850129,9188443931337763,257350183332052,2678829085976790,1374956989090012,6983419550615773,8816651400661217,2398411469809891,8592506015811812,3080931651664103,1825147879713000,247383125701728,557369118472429,4878040802429169,8042797135496915,424522253240564,7417549463740798,7035615812040950,3483074111753257,9202361307257081,6284367776737663,8882593022003452,7065900512202453,6237600207026436,6408976797268230,3821461624547591,7972714835223442,4438842071226634,521844665108747,3846704578627854,4330933290932497,5432981973805331,3036371868498196,5800170259257624,2850283899238684,1229843817164506,689681710623012,2287767414237477,1566922238355750,221790450540334,3615975657564459,701918844467505,1029902612482354,7711467644723092,196849519327542,1874528329425289,2889785341972191,1992560037845311,906300323346752,2059889281923394,7740032237367720,7960628498344262,3290034934458696,8448243938126155,1362271841106256,8983427982850385,5208032949872979,4168726436923732,1051698310236501,9008029548857686,7644491128645975,4348836082956632,4360458014636379,6889581486405982,1045354187849445,1770275655055712,8246485444675937,3093100087052643,3505396454783332,442261686069605,290124600613222,4502038338705767,6442419831544169,6851300937304427,874152424888685,7111060732213910,2920744558253489,2590423841094002,8627724454503486,294175737862520,7669634008009084,9113059162386176,5679816060201343,1710976626681634,1144826545215876,8451544794016133,3910555248306567,6715857027038938,6341642337462666,1922531148790159,8327831214475665,625235988797842,7410146538670483,5166443819719060,7410694642694549,5761911013521814,2564059955947928,215575775238553,7625964629682587,4473875121465756,6830012513528225,1788384462072226,7187947818629539,5484495896308132,3973634988763557,4335867548531112,6761150809934249,9146963271871611,6035874576665007,4379141387188656,6894562206595505,1865633130080690,1401725695220147,1993955975117239,3642664892545467,7089561145170364,6421442972658109,137502155995582,3077521890941689,1968396198836673,7691174634406987,237883346276141,3203540631570887,3405116008311242,1259956332173773,5789668426095055,8454257116884537,3365556342077905,3697046374640083,5984896187247060,7815014633213689,8420288526621147,5977153023834589,3591036038289829,6197240688859618,342887258850385,5633048311081448,1805763052423662,2196000428263165,9065113491638768,1322366787930536,7292022684473845,3979060231236009,8402480140483064,3588172529244665,3640047082658298,3420441850769151,5004477892516350,3316419827988992,8632888813619713,2840936304511492,4504830967667205,8112139066280454,1592119210732039,5143886986140168,206967269693961,8058675186620938,772919655685207,5199149621963276,2826765215017488,3396383250446865,5617370169764371,246035936852500,3399784752396821,2798707626691098,5536669577021980,3005928008874525,1529183758486046,4559229691955632,3359377827854885,7973237785860652,7000754901424685,1227990121658932,899023328913973,8170956117756470,6137043216759352,8979141106702905,4235478490298938,3195777913289279,1590810740906560,3486126562346080,9166140205277622,3603509630278217,8658172817586763,1657374246148685,3248713122601551,5899557638752848,6005480896760403,1112297552407127,5282659349285466,2944936772536923,2423022272596572,861620973976159,4731625380956256,6655945014999649,5611545702982075,2438581051869797,6311077879876201,4130180176370282,9134421858880107,1178742349245036,2808400565237522,8453673840118388,3020107800443511,7904860529866516,7818916566362559,8061581846747773,1549446153484928,6138157195871339,2061012321716868,7692443380416278,2081104353794694,2390973833423497,7079320437140106,238869256641164,6029042072947342,1390946135620246,8646405121056645,790025918663325,123994383803504,3194540745837218,3573783203613347,1660667616434854,4479551676304042,5876314208647852,2724262011308717,7755613282121636,7627713510492847,4632980136401585,94860705016499,8076916030671540,5572545572620983,7582901432605368,3879767055403705,8428888597940924,1540074385193664,5874124767492801,194596432485062,7258290374529299,6453203116780233,3818628179110603,5501028641671884,4184537949412045,6393304999934670,1686386330430159,8664345798302417,4199649197091541,6201346067139288,2214057171053273,1240079764884188,8734189194922671,9033303010961189,5360112204602083,4358328740899556,2487020044376810,4230386853784299,902559234964204,7733258841496306,5328253453879763,2339800154299124,5692869586606838,6042469466696439,26078804257528,3432474279705044,8685349081504507,2164974760278780,1665650775998250,3098898600930047,1983050377018117,3348396318329606,442629695908616,2159570955994924,3041186895571727,1533617761725200,961601509182225,1704622197476116,4129481549884181,290561537104663,3647507204061976,6498158387743513,2833011519945498,496485275671325,4556051551984414,2676035443891333,4837172283464484,5023675070966568,3152799819885354,5632751219219245,2488682657909550,4660724652616497,7933054162950962,2877955946674996,3397957825186613,3353985794407222,8148686812897076,7872940754651965,2056983494921025,3872205594204995,7249463252400968,7616152863018807,5109216191009250,3646575211621199,8377109716353717,3566310943128402,1361884932627283,7533452447813433,1342115172526936,7794571970021675,4926701086636890,136757176126304,3030692222212961,7871983305436004,1957337751894886,1042415073147751,2954919144647528,8375384822877033,2474477546601322,6135433664654187,6002875580951404,3029077730913135,4185240451359559,7216426125957661,1687445562780533,9217304267684726,2906066396719991,6774700334906234,3108465010113405,1943328790305662,7475547793238914,3487403387923331,4527946703670149,6663400978275209,7105085377989514,1420736905198479,2510711769396376,2427686029663125,8197250443561880,2637576655584153,1500851661355932,8585938336722074,4477388041927588,1226652663634853,6931500196133799,8325072046140328,8436860366347181,5716478710393775,2171536294824880,6031448415402929,7323707096370098,119561702149045,7677399959694265,1522762947718076,3522879670954945,1058927281044420,6496205236304843,6813296885304268,6082052234865613,167993533283278,7426626815556561,1049654963166168,2220044348169178,6269681223334875,8012590699224058,8192072898677242,6969130746993631,1832123927018464,7816257244503888,3691207541476322,1250378746076132,4152443454393317,3559230723275750,7918300748439735,738876989026063,8238023392200530,9011233352587091,6495370643086325,1876900653868201,306289253791572,5316982553328634,3451390005742587,3266188701375484,4970583061507069,4453292544371712,8670255969250311,4507752130767880,2733790770048009,4448393570053131,3475726764874766,1150214980832273,8468245409541139,8862009281847288,8033594461059588,7588078106789722,392315520696837,5700444263382051,6120162375949350,3001441079807015,964118139370537,4186777791386119,2993502570314796,5504148592806957,4832075309952046,1366449054698546,8848238623128629,4748171588551860,1815104105622588,462121407073341,7509650451688510,8022627824516160,4975063630249025,4592570615864386,8571699887303747,6560987976662086,2948623950199880,7255032806468108,5307655593407671,4286001805917262,1129354913782863,901310587874384,453079514250322,1559679733525589,1169510263872599,5460934999714906,8613315356720219,2013878165265503,3142802785197152,4222033506675809,4214783327607908,16003716193383,8978021210008681,6856953100348522,3417410377604206,916641816070708,1648752163863666,6261753121063444,3493395196988539,3238643495869565,7665694693080191,2396564779166851,169431072812164,2843595714575493,4742486216723590,2435907577355403,6952796220624012,6651793248863423,5151840460024974,3379263608265874,1524690578992276,5194513281191061,1565510817918106,1033042814160027,1896967965162693,7042398750850210,2167441737668283,624487124208807,6766719429229736,8468141138689193,5095483356597421,6433407990897839,7210433634442416,7933848493927601,3404522750659764,3067169437755934,6026890955926715,3643851508718780,1724831045205181,3069305598066549,4658822748810433,3131114661842114,305591701331139,6998792369061060,4441595014241477,4647204019129542,468588579491017,2850062012824778,1135596299574477,3087596799515854,5042568415947981,6172519870962897,7057123267415571,4810068310179031,620598771950116,1761391506615514,7949554400431311,9056563214240989,73982280203486,3764852657744670,7272803449486564,4457622112464101,1977225432665318,4733279501551451,855643691605229,6819502437427862,3122448182747005,3394779782319345,2117262928297203,9118441548057845,1858510750514424,9039514143153402,4854642166511487,6535120905444604,1722816480664835,846251447885062,4844164900703495,2873504148290827,9001807171632396,4135573046549773,7340268184132797,72454713093394,8615518586739991,878185677675801,7495378834432559,8037448215297242,4248117413076255,6689299921534243,3665587835645225,47968413084971,1032310570413358,460672081692552,12472250285364,1712171914685750,5534682602941752,4938102435633716,2722549264895291,16056562745226,5859245765598526,2920860315755061,7777827677751185,42068376276290,5156275147636035,6672553951689842,7997831606390086,1788585143756001,437688235400524,87436043242831,321347706940752,6575137172233553,6781652962920133,641166391221729,766787659550037,1280866671607128,6156087420668474,8465233869217121,1763267961556324,3440881896675555,1836912512126316,2515303002086765,2172532891037042,3706240373964148,483532135686036,7371470126837114,9003812018754111,3425068454018428,3847554690583933,2466461464505727,1305408208412032,8723372339482479,6318407401966981,7461015058877830,835393524667911,8919314377379209,4287971289500409,9204707018286974,6818509457304813,3350524171017619,737423861370265,2852354850663834,8390720333724911,183403431648669,4915493660970399,2447320271404448,2579012657636646,6478882550906277,249644080721820,2228812247236010,8567284738289921,6897389702512045,632544818175406,2042752067575216,3187056770273864,5026754805108146,415664908660147,7841789081996726,7212342137851319,5292696981441976,273021766118846,8801301722200831,6691373271047619,2018717140368837,5283558815964617,1351475444956619,7931452927225293,4526163413171663,1708627503115728,7856404382715347,3288679373149433,5521618774564312,1481007686229924,5038477461032412,228092554933498,1265539612347870,860443611213279,4838328844847696,130915613998564,7777354671247413,7794739756109288,40366881476073,5766870433955307,1239989206828285,7302347026386417,4851571586952695,4747938141892088,3265119050624505,3872704792108538,7513501708230143,8677824950304751,5769927221825032,6128378482351626,5295354072320599,12798097985037,7103263084736015,2681811797626387,7733473765060119,2744321264934424,6959095107702298,2186071271716783,6589686408003103,1650810827566627,8026292400665536,7760402934051026,35546729677404,956570775084586,1779184227167787,1235045704039982,709236562300465,5998449492043136,6040404452146740,6268287388511797,532794855219694,6895742498917944,3453770259820089,1856839418498618,7970381360770619,483941715693119,2187775316323904,7109770225949280,3117223255825987,6389545381760583,2140299380502091,3304909745151567,426262796766804,8481242463239766,3365659506679383,5073576196463509,2203478623399513,6252859431046748,5705123584947513,268986921504352,6327351885721186,3508274328780731,3677510921735782,6147858240622183,709610623135337,2276059307007595,3034257729236589,3430122457587311,3890498794450547,5664897029791350,289441491791481,6156533097860731,6940156258188924,7584436710282017,3341114649714302,3472258612440704,6611143315937005,8451288738308893,4410818728820359,5942036824776328,7505182273874540,2463107852598924,5230137190309518,4402468687994512,6594524784987793,4477733091389077,2103519295733398,6139378957307545,6795222188839535,284663503089308,3569511321347354,2063325110427295,8563459671050516,3305259628416686,982663779876529,5800862967934645,156923861139128,8310101453803193,1936808840031930,3242246234230730,4914958547779262,7774442473341557,8836031561612993,3716269232955075,6719532092486262,3912346169175750,4218971300236999,5464887348334280,2980385466052298,4047097600192203,97271606214349,6644807250087636,3623548493832142,8651070682644182,6114493598682840,5466255370850009,1336059363643098,5960078405054171,6724745148927709,6128252439805663,5262937323970272,5521516835913441,611388737941219,8723868862119652,4699367421857509,9205468879460305,7243905926323944,4630274144038636,7554340800421621,5785224556285689,2896595694690043,1384473238572798,6048208732413695,6610933925093120,3465762355031811,7471158072381190,9026924907441928,5429296035847442,9057525389872909,4587188123008783,9164605843524910,1338391514615574,8635565899417965,1727426766434072,8002209446453021,8009085416341278,5105990716264227,5435988713668388,1776576321750321,6186778079420200,5365711546052394,2082645309001515,3594104362880813,5314519131127598,7709457410478563,6569055182978864,790617573936946,7544098933489460,6940343985811253,5188702511136567,8878754042446806,6923601418923316,367130850553659,7343155666931169,4410546509852480,8617804886318915,5265875073421125,6384222580358982,5361757306784396,172378127462218,813045937270605,1948972891025230,1627657049755472,5937401888755537,3217957494476628,5511547377750756,549768127151959,2226199127527257,4324202703970138,9059534203555675,4397487463677788,4259947528429406,268522219847519,8094553182095574,6711799718068065,8846515107942242,6499064236633955,5797868132822884,888762018199526,3483173782044520,5977725964152682,1432002252574572,1358206181231,8333749795946352,7835568033480562,4449364689206590,6084830971174774,6346233065996151,6293467930722964,4065577314684794,788214820027711,4052989932420988,1161076967989117,1004279149449087,1862811581755265,4439855035300502,5615497825793722,8374141055025032,4479666321051529,1309949657087882,6445174894006935,4649872669757324,3267848518286658,5986661068816271,6364199518908308,7950348599988117,4175162238402455,4639020083457946,3096123695585253,3795599508258716,7570127680479133,3124377876217758,6083207146311584,5263463725014947,220586372685732,7323045086474151,7456467563327402,2481506988720046,5424499872928413,8220218962388296,8571285929685164,2762400634576953,6944709619302326,9188913577766839,2683959296794554,6099861149081531,6606809212482890,7863322856594695,1093445948690422,7816945206104006,8438355872746934,3530057646886856,2907513651264844,6279747476377546,3175707135039479,6153973746782158,3251064257540049,1552943118856148,4034008880959445,1993560629391318,3655714806337499,5102988186697692,9202950720585718,758031956897759,6280197437448162,8458624830758887,1554473214095337,6548119479791594,8307813892248231,1698724820135933,307406453063665,3528018113875957,4331433747120118,7128616683917303,3614830029180920,8746473671884794,69641006805674],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/2ac8b6220c4d44ae3dbbbfc7e939df61",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000580475.1/GCA_000580475.1_ASM58047v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JEYQ01000001.1 Acinetobacter baumannii 17534 ab17534.contig.0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,6,3,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"2ac8b6220c4d44ae3dbbbfc7e939df61\",\"mins\":[8181894441023488,8813955913481558,5541473772335112,1213008423690249,4891197350350862,6405795182731279,1292920291631120,8625455497351185,3429340745846802,7421433507929780,4563602436899502,8813679705755670,5404646105235482,5378157474930715,3231823626928156,7161064291309120,6475953998368800,454181991235619,3998387213766693,4665219290210345,488896446894125,7575209607286830,870880560533556,3779104174526524,1803340166914112,7361150973950727,4520722258092098,1664127175020611,3321593012124342,1625501389930567,2609745074151497,8130613482274891,2515641832296524,2098521231355981,976347927957583,6681370608226899,9142212978278484,8643680819365441,7833041882206294,3370776724414552,4427362319175769,2240459064025179,1252291231236189,1537579130418533,954691547267169,4177898724043451,7659229213600443,6864347593896038,3937586185359464,7863680146395299,2825735627648360,7759424718729330,2576072623026293,1904221617623160,3849001447256186,6379251582382204,6047159181181053,5607353648337025,77391054389379,941369776025732,2342644280971399,5597694849294478,2281351507169423,2845512615956626,2230993997955219,3731847970943124,4645904835301525,2344662116626583,3304114104566856,6901734199312410,3127837087453342,3138201915506847,5021126274867360,162067735527585,6157068730282146,4790426499526819,4007171187245221,5932936724877488,3661577663106419,1457429579833525,1821024477499575,6062239839703224,1453510771802297,1925389506977979,1993041543135420,5974590019219646,8978724713796981,2838528189075649,371806036046018,7488073850085572,1916785053503685,6938594364793030,4123806102409416,1535509646319817,1350249630761162,7323469603926222,4649903700959440,8019862005368004,6708920620287050,3086608253844174,19188431938898,628696623030489,7034736136262351,3017637868007646,4343790555152421,8995314149011680,5899103184711910,1441070678533500,6751688800854250,8911895773879201,8739804342202605,4489602371173757,3623751600488688,4338028264722676,1802314703933686,1352028126875895,8917563158338260,3574649936707835,7036801302692092,1351356769427710,4032051372245717,7945899188711683,4997560942485768,2258075009037015,7341939211919628,6839659630899245,6502303808868625,4226404972114197,6913616743235862,8236497907405080,8419697295102639,5045480089694494,3464003774875212,5425041953362209,4255969162006818,6074976559685923,1474899261075748,3123219452809510,8209261265255537,3437741546823977,7069742635876650,7984113711183239,1812032314745133,3693981752348974,3337647139594544,2241061589975345,8140358179201330,5335054735130933,3645151689064758,9007554857619768,1126991978668084,8228202118240991,3906189182034236,255323955608288,6985468938121540,3144927008960838,2981409211339079,8401851795083592,7555607540196662,4144026820936013,5462146422030670,3533177502593359,5260560864469329,573677798691156,6118133152923990,5881410430103900,1793613271593309,710504530366814,112324569416032,7931115760734564,1182729880727909,7951683636278674,3743471910273390,72033151029617,3696515745235315,1215751240520053,7475741446238584,4020399402166335,8938541819534860,8050697754099093,7873996541348655,4151527171508288,3592725326320008,8657078720239793,6750314612674955,6721955631486420,3850130208952718,1110395909848472,1624836110295442,8988696853533075,6503861991428503,1919601790189985,2443253592199587,8943991890551028,8806400180571266,2229400174611185,5568416924103080,4905274133819463,1092654338863534,3189081727898032,399195265114548,8737938926251422,3557207336063415,1583617303388601,1032245252309434,5034827755487675,8160422900040124,1710275183493565,39440409227712,2885481322443201,1343119917539782,6741485414749601,2759430517318089,2062980109640141,7092559117500881,1156252240769491,8073734279573975,7395112247787994,6808214708932687,8944314896183773,282130381345248,6485171246037755,3189369248268772,8788366528232870,1633612760801768,4836175962233596,473524408410603,6486589759156716,6491643301642733,2136486913135086,2519079664185839,7848531489680882,6484527543202291,1829691521159674,4798889966645755,8132503010356229,7026954303828479,7065996551922177,1870664517927428,277217363358216,4112695516160521,7099183693730317,8526889157440015,8829884413946671,7441596396412596,6623607007916564,5850549576569366,3608097592844826,8657687125099590,442977858757381,6451217813685657,8335881509338813,924975381750306,8367981864595547,6699553971323428,4991842926084646,1117508026630699,5686357593420332,863897512924594,8602836738224221,3432178500436529,8399917328104263,5322238349576038,5378557211443766,4499121276924478,5374001331175999,5999680069333771,8632119812339809,3888484608746057,6135986892427854,8156696966582863,1740647216874064,8174501410738769,1665243572249170,4389468770095699,1953679381250646,3204862938410425,177836967408216,8013089547989092,7844830018239884,8447949312504411,2969283385688668,5196427007738462,4835946048897631,2406754736641823,4272008840516194,5077842238902883,5802189598200420,3118454374847079,2586992467063400,1129430946554475,2214895889498738,8343435896079123,8304388901724788,5442950546063991,3995639887032952,4981471405994618,8079001112457852,1376311004273429,2121238882611840,1790942327943817,5404592418132625,1899977179144854,4629307963298460,633281886249630,7033395146801823,3004584167748257,2384381491200680,3159124133659306,7444957754252743,783290268390062,8173340442358447,3861475659702960,6390274593370802,4240443692745395,7357846573245709,1547274787857865,6509437536998074,4205241677959869,2428948643840703,10192046142145,8312691852571331,5138555310301896,1949454307963593,2337852421522127,948576151909074,2651245557584595,6365808033465045,6073617798079190,319279825543895,1238994794136281,7879658713342682,3739197973361372,7166851099718366,5039473648005855,3575260968354528,8083181782285094,914904817892817,8816232169022192,7136382147896050,6177622505554676,2895845106639609,6968268142740219,4402948718560042,350362895622910,5481097096229631,8704640344101634,8352052201517827,62519730946821,1679398313130113,5399339151250187,5025195542364940,4629441147708175,6825852616352530,7521032876507923,2297585802634005,8847010064891228,6906069264798491,3681479835374368,4014416337812955,2672197787517734,5624379729609514,8316545590375211,7511078060398101,6608888707253037,1041579883021102,1960626958021424,1377851646845745,57729931858738,1398617425613622,488128636244792,8494304400937785,406438340203322,1295274058876510,4132626593973054,290639733280224,8708758993249092,5838858707342151,9095229921563464,663459984114506,107069092685415,640655978607436,8498998175691604,1502672049283926,1945063063110487,2876188033987417,7474016249090906,5915017963896975,6464605453067066,1812315206267744,7486333928945808,7279771054289762,5761241966363491,229897556398949,8881619351004007,2495509449016168,7649975759864681,951531287745391,705275396473713,5096656047485075,8449598761584788,505062753219451,1893511799767934,261844342797183,746425193698177,762902229148547,6810718610155670,8899620076209031,3468432959857545,5594135368221579,7558371386491789,1830261482488718,5902375575675792,792307096982417,1760826070942611,6475674167735189,7425093272317049,4722815833977754,2667018395790764,8367965017256861,1590262880781836,879212704093088,1913831387018148,5421297181381541,4831467683726247,3723890736772008,88637230670762,7753219224714055,6858882806211501,2802206584935344,393043518533107,5649803683557534,7722646054458296,1689439999288249,6243066197729439,6113508923782078,5861416851001184,8357169467999170,1093825310958535,5119663278109640,7062399327297698,6219879427732433,2528157758137299,5920192272987097,5071434328220634,5771542761874395,8514141598675933,929234802852830,462277071647711,3632719499293664,2146705006830561,2123821028052782,165360454362084,2019237027394533,219101627151334,6821188556788711,3352786174206953,4116864957895658,5036259833189357,8878539811567101,4434063454165285,8043112174887923,7305251641436933,304360781808630,8226605965038585,4322136949838845,2494893973251071,409279686853633,5350134234113026,7480103772103683,2068143625417732,1170833743889413,6724858519512070,174088587695112,5967937695106058,5191571587732311,7408194032763917,6079515402585102,1095999883064339,1058736324916245,4317069979206680,9122391191533060,2676094026486810,6553315127420185,9090839575290714,2038079634138146,7063600760390695,2242308151759913,6909055695090731,2479037383291948,6877746225021997,6373885627741230,5183402545427504,2090011690832945,5725250149532722,786754493277235,8001119577895991,6355168943572027,5913237140452412,1795611226764349,4516582152700991,7997490791535682,8596383183841462,3116389427434566,6250423501399112,6124713796765196,2839186133648458,8799233896350795,5463376781501519,2914037979288656,3993807421294776,1245652680152146,4934863053706323,5666620369667156,3226568614336014,8426862289653945,7683993061737560,6370740432357985,6542540030231645,5145402147734373,8290057524065376,8541537437480181,1097845528290405,7473148660094055,7216534883685480,8988664527049833,2317559662060651,6514026787915955,5382000232748141,9007226546435185,4231189283016894,8554611583280248,5377966799357050,6745767137899647,4727516850721922,4034134175392902,6469508577592458,5203039712986254,5040566925776015,5929400162051221,4361204476388504,833739366216857,8425940522054511,2160874004804764,4645290944132253,7770027033240737,194660658795686,3527643486090097,5189702969304233,6021884201825450,1414232214324402,8361785420169648,4612171128751284,5490322363188407,2686712561226936,8665592220394683,7480267081852092,8484831264949577,3658239794771136,3167534881113632,4760888719492290,5514598674479307,4166885838648516,4589169047065799,2289355550926025,5402816453477579,137256719664333,8470347319570784,3716866725639379,7944960602158292,4164177354675413,7398372944049368,8032826457766095,7422542680511708,6332925398512865,5890129976399074,2248984702231780,2632026927310053,3582971232380134,7895063047071271,5718451505390831,233733227537651,844676157252852,5121426803475701,817491968201975,4729651015967994,2206026567108256,2651808151602429,7074092949046526,4389497383806207,9075707162539264,592576992965889,2940067051621931,8619371832587526,1832734739465479,8300651884463368,7947292238618156,5345662948091148,697435119629581,2943730816996623,5901986485941521,3761957586588947,7987244587062548,1203606931440917,877564167333142,5248754413536537,880821258448431,1707761648764188,2450027035732186,7795981357466501,5909109466287664,2197884296680739,7397168491042085,5813647328339238,3205481757144359,548564063933737,38370210731306,2963304906106156,1068793632216365,3855684271437103,1256326370305332,5570832541599030,1483458098824504,1303139741074745,8337545826301242,4055989209593148,285068429800765,4235578042086719,6555120292468034,8525976186492864,614143246417462,2864936228951366,4310605822879048,3130086264829257,2158788708152650,6168377757976119,8912992754910540,4759783637439822,7915102941918776,3521869229659474,7778660129572180,4831859947529557,1839789219841371,3888522879112541,5089540320086246,6702580783027558,2906993989637479,4538394071422316,8499833379575149,1653842736289134,7846687027308375,5995636510004597,5844023369839990,4628637204826345,5698808449500537,2689320547898748,7918468451931517,5138320933172609,5591554332820866,1553840686863751,4009132912592265,2355044481414538,6800638537028394,468369521284492,3257097119575618,7501730503873938,714557305640339,7734393818047894,2689019265594775,8101665139877635,6167052500522393,8260152714368413,1277697083540894,2459357963691423,5881470524523936,2581510346876321,8575975529462683,1853774718043559,4543208832428956,1738393913886123,3517484546725295,2528601577616817,2968977689519538,1676316924167603,3686872063841718,3787457440138681,8185656159987130,6891001926698429,3200609564607934,2814376002877685,3313926630737345,569373227816386,8397427475841789,8710347175441861,6120254816993653,3747281338455497,6030722694534602,1591413830235596,6659128357051298,5176526445082062,6802540546368976,1116022533203412,9056908902244601,5781044120716761,1730408465905117,2019657513240030,7206176971523552,6603023532512739,6063667762427365,47527809562086,158150759347687,3024918768805359,6398652143756784,6870250500785650,4182716575240446,1990905254508023,8124492767254008,301903268918778,2424669153338877,2752831270643200,3040462407579139,7992831330928132,7319647475066376,5812206717662732,2205042858898958,3948808495683090,4103403715617909,5247135062619670,6821873459945049,2796065161795097,175782660081178,3195378948507166,8141374987901189,5173849600063008,294990201665061,2659119107374372,8214865030116905,3196338243122730,3401796986201645,50231029429853,7409558356767667,4570406371419701,5687258363274806,6264658933082377,7908243317667384,7757213016664379,1589621727573562,6214738474604093,2499169427923893,4975719520278080,193960566924865,8188598855932070,5801921525106244,3550628941817415,4878043531958336,4685366071752265,6192535931102796,5107410725414482,3875713497204309,2879415806518197,5445232313357917,6236514402166366,1026102297425506,7905999207846843,1771371671090791,1767092070028905,4464438345180778,5274145507620459,2101530632423021,4216242473313902,4099756934350447,3484239602972273,565629026006647,6147351616951929,6074245905929851,5029466991482492,6561626909093483,6085191965333125,5587142841382534,3380537751791239,6450090757625485,4812337245664915,1716472092061294,3284657777637018,6606784943128175,3924644067186333,612777807088318,5290803440854688,6437379667392162,7477624262465187,8632564063925927,3149434142029480,6930371027011868,5605235376083911,8965612060109443,6507753939945141,1202433074452151,5555134979012280,3690676833228473,2425194666211004,6604325275535037,4513417178896062,8319735679342272,4824602496442656,3081128215488199,4478301985445576,5923595997731788,8718224935810679,1144364117501648,3814148394649297,4661441603348180,7911973238097622,3355492476683995,8342314374002398,2979426311993055,1901955647526626,3440348666488547,4025367241762534,4388026101585640,7633032752482025,5695183613429483,98012912633582,1889915872933617,9018921004087030,8807542998229289,7884789576480504,6874110809720571,4360136718735100,3982326053218602,8367137776678654,1672233623033603,7519031755145412,2532592666859269,7101038559860488,1898584061437706,5680793050265355,2088555747550991,7631143906748035,6342660228159257,5715523729770799,4542566070019871,379779378882336,7004509987858214,2902337458829617,6915920132245288,3015475568998187,2507876340655918,3413569780246324,6482889267917790,4339087251167034,8140507117582139,7050045401384764,6445265780504381,8225450583734078,164465416124224,2167945677813571,4394310079895365,2231548909872966,6975722046302028,4664189650552653,6958666025686864,9123783908726913,8677658994517843,2932343301561109,4526361210636118,4264638976419671,4976516243220316,8728409914234718,8471622728492898,7716018096245883,5291568000522084,5784368218875750,3771031931119467,7259975188016786,7360201095636846,8355150181099377,7249252955587003,5025828280670067,1155366848501620,3366476030965622,1147143811671928,3640202607720039,5774468489123708,5793746089408381,3408404585801365,3069058911741824,5405683809339266,1616427014330255,5894100212931828,4440134269814662,4667272745033367,4808095820232588,4397106128734530,1405541855757293,3298177536966296,4649363102459794,3024061787051374,5727618948736918,9041710011474244,2499521524066202,2735099833157531,2055218748155805,8557451895900062,6422672764766111,980256254756769,2268976925271970,7738404772906919,3034852795152300,5103329747408816,6011485864290225,5754824483129268,6433582601004105,7187163980327241,3078948892444600,7822644131952569,1309892588902332,1049648180045758,2722061717358528,6292873885321153,7189059021654347,8620206985870028,1841892429346759,4524399109199817,6060639242676174,6652971685787602,2003495999965141,6157337709631446,4150193961359319,8908268584900569,2598636506318811,4384617695160284,4022863965366240,8879979808364513,6997801515722722,5869221133105124,2851626112329704,5752222170548201,5260230813939690,7991354860294970,802894694762481,6809949666379767,7327497414390100,1259644191148027,2178466733447165,7606059796076544,3397087678711809,5349070294145029,3289419142882482,3230008619431946,3104506928093196,8871246457381890,4731787703228432,7194833327672323,7509844952471572,4152573169838101,2904128148260887,3505648129873944,1067410565991428,3709732196231196,4285506138146846,50687923438597,3980508881242145,5626248078235682,6355221689976867,7575499977991834,4179238039996457,6166121159559210,6108578675714091,1175334971922479,7918678955613875,6553133450107523,8466536165358373,4529565358290998,7324711779579960,7095814019591860,3629803956021307,1207986740733534,8229572450928702,3843445037566015,4326299762395200,6334551925209153,3695741112477765,5667876737443914,809106099226699,4569952001919053,8867689134244371,7136862319086606,5018817472444503,2945636636608600,2985127976265817,1009668036384860,1053581526923357,5924737469868129,1334224515954787,2410350063302758,3874836085151850,294452513122414,7608680620983997,4410291974330481,3291983806605427,7396719563200628,5631036446521461,3517337247619190,8183327603083384,1015099407915129,262813037480058,7468371116244671,3004532571097214,5470244022970496,1577784076281985,4636443748780163,6498007100725382,8236758772062344,1236165158832265,5586953467676813,5684410491615375,6343872921004176,8203954998188180,5386648895703190,7015651386189976,4022064116563652,2474052686747802,1889099847035036,848782386464925,5929132628510880,2863996704237731,2428512856471718,43720848507249,7459595425515207,8156161492664372,4659964610267309,986793099708592,8208054113007793,7739651292231858,2809715951450291,6240207655065782,2310756244596919,2426488239077560,7888935884604097,5672531975092415,2121200165984454,8553843458578632,5047660958124265,3812020855638219,7778213253351631,7895462134098130,6406577356314835,3079028063492309,2570735830370518,1077943002507482,7038353767905500,5092347071871197,4587424471587044,6553740990089445,464866107558118,1412824217708777,3857653606201579,5819952474368241,8302604472815083,1976239067057875,930908654741749,5193562301831416,4266558878247161,3485258266614011,8001162687256278,103541687206956,5332919581796618,7473248021462743,3424252514982156,2324532356299023,3299027854276880,5965968511351057,518295756376339,6876834760474329,2571678924081432,8589036098296879,4446795445303580,6722365150837022,3997340995946784,5032969395250224,6807638953257250,1491284225287899,8322576780912932,1353688551930149,865423368276263,3130606410541354,8617629401450795,6692313738189100,7660255082539310,2344829848164655,8580625138559280,1860492172458289,3997516615444790,885514339903803,2255197709818173,3147387273046334,980997298436417,2179556145867074,2970649004046659,1180468225098418,4430817028127047,5825406975256905,1658514851514698,1641444504914251,7833776705411404,2310991938774754,4534698136369549,2550739893997283,4251701577124182,4498423412365656,9019479131728217,8808267395762522,8382250251643228,7256094313875806,2615764417939807,3809563897305442,5139812837934822,7001525575883113,2806915229315474,5361587063630192,3069990577662322,7506332920921150,7412378645784951,9149056125934972,9175219536165248,7245127572138369,8005590614006147,8295209431366626,6671124438354310,773414429284743,9090803271924105,2064439166736779,2452569199266189,4614587353938323,9167132709163905,9175727638391197,9040648270440862,2355738008017312,3420646887844259,7178258539030949,8470145822910887,8655158898174690,5735331629951401,2023083420875178,4498115045570987,496548420594092,4105185406060976,3595256717915208,4029968942406066,3521903263078837,3675233722231222,418079479350345,3068558309333433,7608338102901178,3571330278300093,4408624441608639,3757232242010528,3946267222163863,4140191993485768,5782192790301129,918455144183,4496592484268493,1882153121446350,5793370540775887,1630211689245141,9196557110700502,2997907419006694,5516623749925337,3501766397543503,3580188421999071,6596800074013776,1813043985263074,8105348680902395,6558497359448548,5058746843417061,4651143395682790,1063462045321703,5689675398306280,2237049954277865,6240401795475946,297476061125099,9186863116036593,679012996311538,1673435849319507,5553573168056820,5866686612535721,8773608874371583,1700061399808515,6670219378571780,5094718010411525,1335963601320557,6450806266202637,7331479813397607,4545360200788496,7623921295376195,5512333892909587,5011891280861718,7450370201472089,1112458131143195,9029818893527581,6685861342007045,3977567188449824,7419383314651681,6576361734457890,6355230398249509,7851238837271078,1277920151456296,3848961914690090,8498623585995309,3600751485946414,7383961299530845,9124957346396722,9209689729616435,8133282013954902,1419039991413302,5531136114518585,9035830766142559,7307105369524796,4550797856041534,1169170458196546,4196081591310915,8420977950341700,2093899575786060,8817802597545213,584201965206094,7342776546150993,2892487768545225,1873173155600980,2094133736616377,8720893006105176,7932032223591002,2388725271919195,8077500554189404,6641870805435104,2489493377083998,7057266646051941,1276498968119905,3705475861782971,3514767491078757,6593134491744870,854878905829991,1707116425120360,1009176304335975,3304112652820151,8916188011276910,7820303202613872,5271644305820276,4291772542884470,7887062280739448,4482298727213690,6170835078994555,7792151398632061,5489901012159103,2940620004670082,546135710995563,8711959152781956,5967218836744838,1401246782962313,397034320443194,8448864850073223,1213833065503374,2649540752997009,6408855474387603,6859534636739224,5207767421123228,6475731381074589,1451263424951901,663589331405471,5021125357779620,7899731005901937,4294590606633645,2989069630967581,7524646304774833,5599947026782900,4338127945112245,4151024829414070,310182144559801,6389645933505211,1142579350989502,2703215096022133,2882354552272672,6631722529667778,7536973023646889,3799758852352709,6112561920932550,7468885250916129,1005352669702856,3632142612220617,1609735960550091,3877139163044556,7109702898232013,5536979225377486,3035129818585808,8700054471019218,3985441555028692,2622904053074647,5276398257072856,361113832585945,2057056656337626,4821521514728157,6661306190400223,5393352544331210,1152885232476095,2990897161702114,7240416172909139,8950069974230082,8642772806870823,863267863730929,3471179694234355,6224072090872566,5212761812908791,6087504131033851,5813237747596028,6102857961868029,4380963206007253,2477951409310464,2475627072564352,2186793038916349,4119771461864197,2664444456258311,7380069500476173,6475679946013455,1783837213670160,8405085365091092,2039526141877013,3505101468588826,186073826040605,7696110071099167,3106728150117157,3558886836734758,7110824273861415,9038972720942898,1483142623812399,4790324169030449,2096399693040442,3162410717035323,7584264706771212,7765205003578179,7781019974726759,4418522350287685,6848505461148487,8078336265767754,6047716646882124,2856549204593488,2440390243547985,969595399809874,8763321205811683,7338629012679140,7005820087819098,23325603257180,2113804977211194,5554011787586399,7394177155513184,1436692048362744,8072418547231587,1082398404647781,7470842257927015,6934837888228201,6920028561291751,2457758692916077,3482062815528765,9014246414477801,3040354687687550,296125770537855,6744830144403264,771617410116484,6168846048082822,3048962852776839,3067596576693129,3924796231060364,2216266763205519,375089202514832,6945444216545091,7859231110159253,6723669747387545,3281807020166043,3204261448346524,1934187509255069,6687748374514592,1259542543625121,6046389967457186,2155226569251748,2017576256715686,5050970018823080,3226700670373021,4101897265671090,37376706245107,3789527918873526,4392245755829177,5937350208388028,1786198334966718,8241206012599233,3098292069469122,4391675836124100,2040797906160584,7882705443127116,963994888301516,2441862990302157,833753239108559,8032688618298320,7673045359942613,5656143716121558,8109099990289368,8932275206093988,4210418998414298,1564462819417053,7790205438753762,3525009279586094,5699008485710820,1137284554251237,4747726467202022,8555098905824231,7685633615617000,61536631258091,5559436889639921,1459197307505650,3774870154050547,167662123703285,1864326302708905,4477795627453434,9040018063515359,4422886166002685,6482740479843327,1875687943326723,4951471393483780,7739527297608709,2779297968098310,480582299024392,2263560339926026,5130823448849419,6929624073636876,4600683712195597,5085462443879438,3967818134637583,8095660863859728,3816358143966226,5149395694041603,5896880682859542,7730830417268569,2000010809707556,7097260343893032,1926955816413020,3600401999166509,802779929107502,7981186681962333,8750693831422472,1195772908809269,7453353831177270,3412113454910520,8733631843023929,780402208631866,1228610783763518,898950324730943,1113111541431361,1140748474985538,1389893927746627,2235807341014087,2186230588132429,419574043978832,7275945499790417,8466567800847446,3903461488950359,2727229049603940,3667652661701729,7619194236517474,2698862967778403,4657734269226085,3029821931818086,5923992968252519,4525118670797928,3615039250009194,5088324404591729,1652479357217907,5138578338929785,3227978329185403,2169331811548284,8472228970302591,5683787747523712,113074066623617,1472873439521922,3540744485555334,625624575958151,2685515096849544,8809739887193225,8314761805085834,8434889396833419,1833418565680269,6400797482519696,6188453096381588,1214088013925527,2013936940031129,5923517556853915,5383572666043548,246581408816285,4053587952487582,8223017211624609,3819215802842275,596847221918884,6173974813125800,2526197652280519,1959006391151788,7339422979628206,8351765844266160,4577847886613681,8728939785227465,8103139847456628,6999473038678559,7946156386877753,3678882531925183,6934277968034336,3803758111231175,2533703346302156,3078265496943818,4631755347037388,5342369097938125,4407301122202833,2459349824493074,7958182917242067,7602046333187961,1158899557686488,317477997972697,7228181767208154,4329594177821918,5870409928543455,2371798752656609,6404749695704290,7840780851600612,6164917204475109,7390473431899367,8517278970715368,8984385288396010,5843250442276075,8557471241825516,3002272074951917,1896037389663470,1017881939578095,2727590714322160,3895710414400754,1650909430717684,5043150754839800,2031229824417018,489372079811835,7929631032339708,7795016770756804,8696231010061566,5258637390687488,3968654109158657,4711067263073538,340377730100485,5260306592095495,7083456451270530,7426733239188751,2014030732332306,9184438940232980,9096781118577943,1861070060760348,9001688619735776,7092681844923679,8747937698412755,1976670927858978,2441116443200804,1528380433513765,5390166030986534,8613603267548369,6971682463026480,5252454000209800,5871372919291189,5822106829585719,3102774980087096,3594966709677370,4891855952645343,1962025874922812,3621488315153726,5813108614913343,7100907877879104,1779652662701379,1491917184097606,3623158885633351,7135955507509132,1279217174601036,6473178305125709,5321902362479951,8239535735565650,2926648757849430,1978823320137049,5337180767698267,2218640333012316,1595839460306149,9164575986019680,4177863895735650,5452125392596323,640160081136996,7754141379744998,1397981449727334,4102743904001383,5385140409953640,3163167136804203,4129949400313197,1866753473908083,7788097624625283,6665939542662520,212780559252859,8334395904789884,4585732865039741,4288155933910933,4789166072753539,4482143524853654,7938063863311752,4974328803192204,8711948489547149,3450912449129870,1264909794061711,9146646562636355,8223879369665940,2445686666059157,6489848494476696,8609626235028719,2909444612472222,3230971073240479,219355671203232,8948136406220195,4464759533952420,2438073117531558,7014348526857642,3746708065336748,1857493672374173,2486754253749826,4199627940593077,7977500061253047,5128272643755252,3083110514134459,6773372274212981,2253350811717056,1624347228401089,5988462480256451,6905015154666948,6141962211954119,2671067399740872,3721351002349002,5311098976320972,8784511908898722,8957988778808364,3670564804922832,3135733867269585,1192372106739156,2755735458029013,960136436112854,9046249338731992,556319312231897,5228949541363163,4380964209204700,4025727604774138,3542295576612320,4294371425668579,6462802174664165,7438072224890343,4565204840599019,5618547140144620,1108259250757101,4911099995526397,1060839602519537,1062046573608434,1745982849285619,9003320892476916,7447630947872246,1870360950443512,2461455015405216,2714303069707774,3657990052806143,6886890991633198,2679814504390148,2441239305370881,4943743921729036,7913849739411129,1785167954005521,331133729795603,1219504915054100,4760074817416725,2075550237474327,3948850569780760,1689537896779290,9118086323043867,8238037952703749,3341638435542960,8171249844979728,5791295701417512,8569013156495293,4855889105661483,2975674590662188,8165079119564334,4939755241848367,6367141629615664,16064784883254,2791777805459001,2889893556330044,7656271304138305,3372336971251266,6073909990981188,6036236624431803,625475672243782,4014933424360033,3113785830112840,181542846637324,5769061761130058,2341667757293131,6362604811849292,4721665416429133,3161422568250958,7253543159348493,8457699916994488,7925709868912211,127747389120084,3280392283348566,1571411244965463,4227550588344538,4550937123192409,7087439968630031,8922982978512786,8197311531580005,673226613866084,3078494857865148,3400361368088021,76573520191083,1202410575199854,830371954679407,5461000863039088,6970581835050609,2132589344409534,5978919863828088,7079472694795898,4067647580110459,7085581186698879,851908377898625,79080737656450,2876526007804523,1929984040025733,5818649229246087,7638596942311049,3039110292063815,3683421679193740,1589542719127181,4272177026981518,2633299063343725,7331591723482768,4361421326565010,4686785404026515,7049278521713834,2935011828158103,2929450901053080,4960310592179866,1862144978395077,3979632031223457,4761451335511716,2288465813687973,3460980778413734,2494543521569283,8547528405991082,1239278789865132,8249610294628013,7621720578346672,1126362286653107,1054211547471540,5288869525491383,7148391783131764,5978180737924795,3028001503428285,6545423854079679,7113111813648064,2839124983381698,5976464707313347,81961844728215,4636757516274294,6405769148374727,1387851862941384,8478507521351370,3579904900021970,3522959105549603,3310765708766932,7177464597046787,175672684748503,6428125342211801,6976453611434618,5366223603654366,2788799774764767,2447294299680483,8306065431912164,3441289850060518,3600468359245543,7035769763207122,8570616685269524,5877052802473711,6492934983614194,748116020113139,1066163173404407,3187568499289853,1501251022806783,4334166127820549,1981360047046409,472620061908746,7268547799904012,5608876884047149,8849643086700305,668473103552275,231949229170452,5134149781962517,1098499268149014,8266277895775913,7946832271230731,6284070315171611,4718551065014045,59673028849438,6232919604084511,6380873562758945,3468139853885221,8354201527189289,4885022954721066,7701177197682252,1089817046908718,6654988036263729,8628838597357362,1139859193589555,7883435593429535,5293463201812282,9161019746094389,2230759098625859,8473634067555497,6324763420720965,602694344286022,9075931152731702,920056880602956,1920671151533902,3257767583665887,4349928790433617,1497942389600084,6528739393408854,1892285979885399,7061545100201817,626501105254237,2409857410807242,3535844708163558,5739327546179431,8774769415847784,8291729526553916,462083794866026,3361611106877291,7476183352620349,8388595726901108,4602895335238974,3474547452819433,5668795492765560,343785042423673,1634670873337151,5699555658231677,1972407322955646,7577014136364344,8108260642070401,2665037505212290,6450410234105736,118149015592842,2892318986768272,8566876259170968,722492416159636,7174031798937347,4866464370405274,7939666611900315,6260659214237596,5370966248103837,2749988640937285,2850732051025826,2014030703570851,8294925454790564,4625034729770917,9186625936711590,368440417656817,7284228109955005,7087654345952583,6943573199338141,4824794413446472,6798730118090676,971586476057246,6964773653344183,3370517254696889,7304416264073887,2377548885823421,1413606754639806,3413971498319807,7063092140388289,7262684027045321,1866083386765251,6218732522024901,5838854941746062,850558758195146,4321614004649931,2975867002236876,7107897494380495,4339377591390161,7871382954274775,8018436185164452,4665865467174874,1263539059806171,8266393513607134,5702027847603057,2349639662632928,4088993209495522,1940380394962915,6543702431715300,8995464451989477,4429873213358054,206573390721000,3426472441233385,3641994166766963,831167712376146,4626205025112046,284059665076207,4781229677875185,6335539128356850,2687910789238771,3324371216474101,7575676785909752,5727660260802558,8588689511182335],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/2b28f083395d8f5e7b88c1899ff4a212",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000242895.3/GCA_000242895.3_ASM24289v3_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP005586.1 Bacillus sp. 1NLA3E, complete genome\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"2b28f083395d8f5e7b88c1899ff4a212\",\"mins\":[1837538595762177,8380233091191257,3710714250903555,8733539225953088,6435725896896518,4026325141610504,6359177513151831,7669605071376397,103339895525390,1594963963473936,8825418232079517,7216907509164035,8344243616538645,7596546530856982,2626453034815513,5405259091714075,4856149937778718,1305095281803295,7499025862318768,2267724587155491,1403332385727667,4279665220071463,2856529669668904,8113212004065322,8716197976545287,2887159134588977,5399122488393779,5884938133026142,4394150113923126,2823553395408954,6703146627272031,2180101915672636,9206181009420350,43736059748415,2350501977235523,1825258309124164,5523335456735304,8875532722372681,4882547199033418,8105782677467211,428895450988620,3870313829126228,3738513563451406,5467716084822102,4667536542257240,3393937207926873,3255031080300635,5844501830320221,2132132292866142,1770994288865376,977222386053217,7550289573179492,8853496470035814,2536908709711974,6894004603788011,4309596798812264,150858134392937,6072109632995435,5695858463281261,8001165601902702,4978829199130735,5879088797154664,1092318542786675,3624631323906164,4158208954577014,4616240437141623,3882104933726228,3384985888886906,5083547502084220,3502078539141248,3212484722618498,8295171582359797,5338867963097220,6399390151262341,8122626904293510,843685501558920,4162159605428366,3577943116666221,3928547024388241,8596302927790226,7487061342943648,4656496878727316,3409366321389719,2861660107776152,2652628175601818,9036575548775791,6028455778739034,107435432583327,5502365510672544,3930404797657251,4210775228543140,1962312255525030,980192377581737,6407115562980039,5111917687181485,730762915229870,3394648482779312,4635671519801521,16919851122867,9013604442566836,6879479403139254,6359865685606589,5815489150025919,8212494111174848,5659487565664451,8206942941307077,7756351744952353,1731076438511818,8093272791122123,3873575907143884,4710615377596621,1944815829332174,5708055906025680,7994155046105298,5221129187549397,8246528278474678,397334157582552,5743917883723993,529039282557147,3918295836184797,5608780337653211,8219056598610144,6405265038731984,9082579210006361,1187588115115387,2468747024261348,2517152275943657,5994462949645010,6664293475467502,2959088135504115,5633179688559998,7998640760009428,4473581377278202,8587226027518785,7312732809224447,4828619065475330,1369110189162755,6570969862982917,1069978998427911,9190084350519340,8846085052100874,2892405991784715,6061035849629964,6859027090542862,8836321034070020,9205545268458200,7044394381925081,7699347873255704,1620801157509408,7961044919320866,6270729363468579,218508423069989,7242689168783116,7680985757856044,5553609445867824,5928659312853298,8961237929816115,5513893191565620,5370524981645621,5506290065596726,7100149299266953,245076027240760,7468042314061876,5605926643396923,3113121400103228,7382237421076797,2980109126836544,4070989808116033,7647053533921603,905277082079558,1178144843161928,4986999975600458,7449053505038339,4891263004434764,8232695857418978,7378319378931085,2394078995190097,7440295573953251,3417223208132948,8112165600805206,731431999472356,5787322411217243,1414763368690012,4234563896244282,3064936566460767,3449938492510564,6137939936608615,5313927570817384,1409689054241130,3341835202433767,6603377114611525,4117628683043185,5646037380338042,3688084919812478,1538462141170047,7223426599043456,6613557819961731,5934366742057348,5110765960163718,8707718182797291,8932824794368380,2814540319129997,6154008927789454,3734458897543567,8790650917278096,8427753931828632,3520093949653394,1857868513632662,6552919023824964,7021973545094554,9177124692677022,2049021311234464,842043569787299,1462359514816932,8108898105827750,7867880088936871,2467444079259036,8985228472205300,8553956194762855,4885787406008754,3542024633098676,4138925762945462,4970713284006328,895089141264826,401258727403964,4884621269148095,1336641543953824,133152972415426,8768353848160241,271758463726021,1252031923696070,7180486163567047,874525547327564,4812714648061346,5546866819576270,5374417880273359,1154599831904720,7624295865928291,2339931933244835,1925921427833303,213656621662680,4713565546656217,8395809344713178,8342963932516827,2673472672805343,1857290234061282,4971721442787811,5316589073076710,8680593847569131,7142401242149628,7416045683140007,1201468284862958,4841051786691056,5800115224134129,6551938389294302,18210604245495,2407056483029496,6297099566147668,581995068752378,2265557376811515,9213903305810430,3628525732739710,3722306829087233,7601261385531906,8625143514538499,8485396478255620,7417931566354518,8324600960279046,5130503992386305,8095830666043915,9024169231255945,4300454481097229,1559957668790798,9186899193172495,8030118720098832,964310304653841,3710415560778259,3578212533752340,4275587690029590,6039011238335000,1036999244960281,1019185775710749,7448773440520965,9104667134453168,8069231780004386,7265705120141403,3087571581342244,8323037854458667,5542473308459562,5930774096028204,6324991504756829,6269898992973952,2732956922376757,7530333014529583,9138919366177338,8808536254526012,4475928654623498,153262698447422,7025289722013109,672852032934464,4725549482766432,9060496918549059,7911300796011076,2524017022271439,1385089638842952,8438426317541961,4934151601611339,2808948076864080,6137581952725585,6680912083944020,6881675332444758,1742673420808791,1844849819873880,790484531389017,5738342812198137,3586658795291229,6596094256665183,4109294968836704,2762290232091237,20024935449190,1718125988387601,1150014378246762,8334056517972587,8079341317984878,8016169349367967,3952507695067760,8104006791127665,7039751719330418,334072861332085,8582977369096822,6386647966920809,4074696807641720,8471321620093113,454499853419130,849017957565052,7289504884384382,4629849070129791,7579062054431958,7554420248217960,2152197861278346,2317453646029451,5258628923327118,2758227975280749,1599500431135376,3126853336023698,7348760345268883,6735816829176342,3704251930759831,7754068140611012,5275248023777946,5761550948415461,2826221381771932,5905865668178594,4630716292739747,972946631766693,1964861790769831,3796108039066280,255566122783401,7587954764166599,8944285369721518,1763776455455410,1219704248131699,5610905352057524,7745879886703657,8644871089513143,8456657992696504,4891954238775994,1999638833601311,4615108237992087,1739795777049277,4805996976949252,937216870367935,1699810171462337,1678140180992328,4630788332647111,4539089533199048,5740854533771383,5861251903140556,4439859039683277,8061255628780238,2576606260843215,6677694530822865,7795199185871570,2893475421618899,2179719259402964,111355741410005,3307172188934872,8247938964153051,3224863764632286,345635388109664,1304994739966690,6942028051765371,3200598351479524,1795637231563493,1616864215155431,5776126320698088,1851529555067626,571434530450215,7565182928462574,1166528523051760,814581897450225,5409204674271762,1267969067660020,8099408391126873,8861171417451305,6675604788327160,2674598004596180,6710276798104316,2970496744571646,6336376064028117,3988590713481344,5664270052561666,2628312961872683,698219500383702,2333485545980678,5186879898377,5392541683811082,616966822216459,6439071506146060,6910915708142587,9029165123273488,678354465510162,6500166970809973,9011068153709332,5211855509951253,363506151637784,7220905317630084,396671043265307,6644433592291316,10675904119586,1228433380050395,758959412777777,5883215346246440,6709168979067689,3086299778523947,351146738488108,8713979791850541,3594374939206446,1381818424907229,1717241400804145,8223636961973042,5091248547009332,4076723404911413,1188379399664439,7973261401600825,607212608402911,1273139857945404,8052017752822073,3068192946619198,7477926878462849,2865649703233675,872032533566277,4434410839106375,479639957177160,329307774554953,8982623741829943,6541283456124405,8257494184887118,4963828615131983,2786350884811600,4392007608648530,733786637468504,2276349872378713,3842420368139098,2852050106307421,47868259435358,6876210938781157,407392385786720,3671358680504464,233446662435683,5730255912842084,8046830158632147,4893527796748433,4153807304471400,7219289992377193,838285105771370,8952619060384619,7172228762215276,100502166410094,2601877522260847,828398472512369,7271185137823607,4511989926609726,3889996752573302,2723789118313337,8186964392616826,4011009039672187,5176108224381821,657023297180543,3754642871563136,2660771010925441,1785788789371778,7798815976380661,507572643091335,7493468498363272,407454073852809,5400585882518411,2153726951760781,3609718322930574,2196111080772496,5110704936001688,4712986166768530,7508325648137027,2163526026122132,4647732455928728,8086891648033689,4121471330141082,5899149508584347,8457807884539843,8563348541793093,4553893155550704,3073849216906146,8543449832369442,6163090890945444,7086007321732006,7647159699933340,2101059569177515,8074048299510917,5584221128537009,4550329447715762,8647247239410611,2382702891889588,9061972092571624,2921283937309625,4906280885744570,7131458553835679,7154127562194038,3530522005980095,1352404726793152,3210373044204481,5356687436166084,4740240359351237,8000006762247110,3944138653295561,1264383778304976,9029371830626909,7670891858440355,7596271462749140,1176931603391445,2016379128980438,3335305093293016,3462311262725084,2926292232672223,6008787484292456,8285715634965619,1224737440248804,3239470695817382,4587761134851046,870335367513065,6369587494303911,2191705248175084,5782417918075730,7834597808598873,262855072224239,6602761612415986,5830641768715251,5235168841712629,4928273629892777,2285568404513784,5324192193016825,5837491500983291,1073322625524733,6763874316461054,8808085431972863,573261317919745,3596426696573954,1732568230040579,542948711605252,8336423012279301,3862787843183622,3068414216786952,7495089858383362,3924664022991887,8497764691670872,1154400100668433,3357929094571026,2141591457641492,5039871265010709,5381067809000281,5076256022860825,3063007164941339,2363547732464669,7638778719597599,9145825417659985,138818869138466,8579020644783140,2977824885863461,1179087342175270,5305134110290983,1859739719574569,7567086108918827,4377065520378924,7191096604775473,839956649497651,4420435286717494,9147030231012407,6206437055947832,4826290462352441,7811983294448479,6657771284112446,8845320763647039,4430869469414465,3889838655054916,5787488790307909,7108386908418913,8731457916682442,4338356629025866,5986279444468812,2177934832292941,5912108426265678,5863516068295759,2973882151396432,7356469202961489,2169910916875346,4900253949224021,370556683285590,7007732486768825,5203290429363289,1659539104666714,1823591116698717,4396723040172901,3815716806567009,5645504352687202,1307377331024995,2964939288724582,7515613544543335,5583575180823876,8815319155343307,4592082744329323,3099711775765612,7600642784017938,4602485961147502,3701668048094321,3471700352300146,5790719061812340,8552162961957737,6494644822078585,8923602636484226,6370300074656891,1632696071758972,6820180167926913,6210447068437944,8490988749088915,2304647888655493,2890407449949319,7356086655628140,9121603992022810,4104450883863691,7603897358713997,101388415562894,8738615418961432,8735113630018840,2037624233370772,7337698512622741,5546467548910742,5404907542447256,8879194059805849,5298590021772443,6384134395794588,8582641954841911,5894649807660192,6384784324582256,8169015918022171,8846149680064290,8071213010717670,2271200704210087,5059232020280490,2506140750518919,5245792508675245,6291552389496349,5369590014489777,6259347023320242,3430494689924275,5933507899118773,2179539079468214,2344971300484279,2219149134398648,2133712015324346,7791889904289311,4587733923935420,6243497610559690,1211271221335231,782711669617856,4498063948936385,1170083249435843,5167649457685700,8334377913603269,3515445177058503,1607327069888152,3689079770621132,7193564836606157,2921002810352848,5781396102542545,1077703100851410,6189046646334675,3340658352211156,4755247957943509,4547376978043057,1333364603933911,8908630192260312,6498099594519396,5183369260283098,8285572038625487,1585496191763676,8382454262070138,8035581826331872,1993690888254689,5784780155388491,1541392805639395,5227619883897466,4281122595112167,6905057887528170,466402148369643,6988337505333259,9041052686238960,4361488092648689,6185901001979123,3298554927265012,4437875286320377,1426583135347962,4885615276921045,2366789055605632,7315994195668523,3402362420991236,3677499291882757,8242352600522248,771505123235079,4701379736265992,8371793905280212,5514843364463890,785960630396180,6817523048222254,8722050939663638,5649092522046297,3455406302885147,7706952969319708,6716929420637469,2785998369514783,891657600775457,4755856796853539,3310716849788197,864754202527015,9202586559696407,4479428747633962,5575857364342059,3833663506523436,6771674092570343,2749765096853725,5419853856503088,4236214722807089,747954841384243,4718031760667956,4019212916597641,9128788339811640,7726310898572852,5365322897020219,6645967601993020,1331352805741885,876565603853632,5668844052818144,8915417542090055,6265834986273675,5135082955724100,4015364792239429,8625716473083208,4761337902261577,758774071530826,8819090480338764,5820269864622306,5305914674840911,4980137251861841,6957867601687890,4633396230698323,3881909738505557,8667575077401545,6143211718639866,4158725511943514,4995239287399773,3446621414888798,6958911801615712,8628840010577252,8292409361501363,1090846144042343,5815841891513704,613086397801,5566449410123117,6933698098152817,4024785982506354,4638301416322419,2291400643374654,8568744277132663,7983208563710868,8310290079053180,1955468104160637,4984751239001470,6096157529150847,8075060647770212,7911144151795535,8183935556400515,6169889914070406,6102090724288065,6373755105428872,6716095385990537,4248342848501131,7386152951174543,6563832912786833,3195506162390422,8653734432155032,4761531903548081,6447004199716251,4570766726170012,7643545782383514,5891935604385349,5013151245882784,4505872878704033,3773786506683810,1117887553521061,4263256522025201,6812856203763271,5317743685587346,6908961931515311,8568425544297936,7744898145525320,4893150909358323,11556757231028,5227046279957406,6408137092683085,7724805556671931,238256651236796,4314295161181631,379669366982082,4313138789475780,2424114132010438,1853725631264199,7956074508309961,7163375381118616,1687976234362316,2577093754115533,9017527253218766,1179302189266383,6751672418593199,2169205883811287,6762845466977753,3207844226729435,370294970111453,4178232707728863,6190912667029652,2775785790899683,294159309059557,5192423725093681,8045910875559399,8056870852163050,6138662678286352,8090658050754028,927952639509997,5580669217572334,8830230345790959,4294523957339632,4705749028149502,8813256628295162,1444052928144900,1155328061683207,611218973226506,278963960612363,921877335922189,4756222646351378,3437327979624707,4304149257229846,5952505028337241,8388102684292632,8204462802671130,3038233797711387,7242238107387421,6456007929284126,5589176628905503,8345005237148171,6536493964650019,6789203755324964,223645173626406,5284233467141058,4566537369118248,6493122666866832,5928626750295362,7260587612979408,6901440388511278,5009058393134639,7787055902178477,7372976787646002,1981025616041525,1846660493055545,1762251989202497,3165582286739010,4012484186924612,3906257581504069,4786161913755209,659864608476110,2925546744510031,3927988935652945,6807738813199954,8565901507835475,2509536646604374,6926679370732473,5631178312623704,6700395365618657,8594215629207130,442458516985435,1441376205706844,2637147009713757,7156708981212283,6182481346180707,7551085917179494,7486660012775014,400279698151016,2621101718140521,3652628983998058,5936799714063981,170579841980014,6112488289310320,8709498771336808,2500796441372275,1696669412574836,4446184760903285,2474181865875062,7069925864359543,2785912796386937,7390397112444538,8762085419873915,8955061241370236,8573348122461823,6794612988014413,7768438307051143,5355891145234056,9062064339886359,4108897881441932,1815156969176002,5128360473110158,7068252567275155,7509119826429588,1653132577531542,1706826616170136,2835229663118276,5273040910462575,4124280910937043,3198021082666657,8852966622758565,4882731069097639,4493650501818025,1162671635621546,507195602429612,3787699605534381,917022669137582,1711373594322607,615431013619376,7484151496263346,4875264198477491,8528295608272564,2820487292409525,1341502964836022,4385302835537591,4455082827896504,2894224848655988,3386960390166205,8359225789331134,1881719696238271,6572806206377645,3370455511135938,2665849878779593,1700031338018506,7039636488238795,2908010001426126,947222306164585,9222614654638285,7871136376123683,3885979369088725,1932946597291641,3473171135243992,4452083652306649,6363351207806682,6747766450222811,8516728176035450,4269188294238501,6572222298878928,5320960766449380,7322015541401317,1389661765101286,2950039467517671,3323000065996521,2874537298257644,5523444137486063,7683257076609701,6941843338295026,4421619968998355,1158864444364535,7305855837210270,4005039611225851,795717439530749,467634021975807,270000844130050,2582003550557955,5453599915955972,3696170087453654,156090050529032,3138308627758891,8686241681138811,1737076882664407,6236775031338561,5074425542211341,488974532560655,8575190476629776,1660197458437080,6021938181175058,2480171066599190,5291918463670039,180274589902616,7675757570242329,5760243236005341,1603916583926063,2697641390999327,8184938584111020,4074518267512610,8408929728834523,8809749049976612,3730126656608037,3650680800143142,536396751623975,8921943986903784,7766831683548969,4545054921758506,8796311613886411,4914112623830833,3350889908516659,2879094208579380,9120289437581987,1982058756925238,4537053675214649,5496690520045370,4983006922204988,4149546270357312,277556078012227,6323985130434870,3224837290264390,6148698499761991,2670997962548876,3621401021704010,2951841000863564,6001373430475746,4767755437651791,3875854255920976,4066325397178195,6592015751411540,6999308736767829,5540612717778774,7391060861466455,918678606305112,4954709825328987,2264840479668061,6050155726128101,8294815167674210,249859754022755,6297812838713189,441232175675240,954979852269417,4976119375238645,5632978419677036,691941553678192,7219269227641832,4653782815381363,3009019365193623,3350140665141110,6919016647149435,5585474340132732,6402718272464766,2610064895869435,4351626395431232,8556293751707522,5210328562997123,2332629081351830,9016160488204166,9117716126541703,3988073202968456,74557937871852,3309158665496458,497014745114507,186356218201999,8636278844881063,3520250102167441,544015672039065,7611814088206232,91974718141218,8367969487271842,3252000651749284,4538298988730277,4901649406420903,3960339058177960,3896962987022249,896398545348524,2316435624142765,538006365310621,208071696011592,1480962246023090,4891364476072807,1532717845796789,7939554899205893,4495871709943735,81649647278008,6775251131054009,5002252667152314,5661678899035953,170128020150211,8569999299707604,3002240164923334,6472599368881980,3753288949711863,924005369239500,9122616874886286,9182842115889103,5484670770067409,6385025966518769,3824931347482582,5578074462627799,1719985788368858,8478575921039323,4421415583967196,6874997923665885,7216323538871950,6119982682603173,8476182693624358,5768756316288994,5872992757639139,2851415600977893,5650517730441191,4865297703569063,2175070811240430,7425359354135549,2232700610430960,2297031806445487,4316955264554996,5798510424218622,3164855026644983,9003464947107832,8776852873740093,8638254661363706,4390071458445307,1969123798104060,7239318791514109,7753542163450655,3550051116341251,4704438454151172,6522333640341509,5890751123939132,4159544091838473,310138826016778,203096606664715,3902297539766284,3985633705338894,5487107960733357,5064223122151441,6614309953899523,1065830059354132,7599828879652887,8809725228922627,5881797260253209,642773153015834,9169509850633399,5951305390490923,4599168223901728,7416737731024929,1510318691836800,3581610685618213,7314743315331114,6425595539630123,1585698379778092,6094630756380449,4923267615045681,1608433392998003,3222523941967924,57438987180085,4393844344916025,83251373389882,5916231648372795,7077556634462272,1260147020093505,5436705875286082,8423166832647179,7750422642038855,6853296096880768,8365147328558955,9082183021242722,5393744407857230,4629713659766863,7907365485526173,5681302261794897,1319338948638804,6948661618219093,4909312813904228,8445273955551324,2180087205932963,1753767445760095,5442565044533344,1335340469737569,8858416338189484,6372405865465956,3933868946757735,8767240283031656,4496903123179625,2218333811136621,643765208946798,1031870567655537,6298654529820788,6547649191450741,8609185033173111,6670839735625407,9215684629270890,2885081940972565,3097280727808128,1350691060709506,812410459605123,5956502227533743,6999052730689670,8609355493819516,6632619607131928,1680301195815051,3623735216670860,2188011023255234,5380133629335694,1565572811647120,5960675154212922,5270367952976020,7666946072682862,6319415516695577,5873309323580194,6853198723070108,5300329696594077,3030694031931551,6288434871765152,7785039766726818,6011422064448539,7969323567666193,2694397108679025,367519501629260,1543266685049002,2308496551811719,1255620059457709,9014835602786479,3364884569105711,4021402169948339,7354178383993014,8171587268269769,6832977428756664,6032447894472889,3361616963942586,6921162718976194,8583153395738315,4469734697810116,7678546018441415,2598844393965768,2982624058616011,7811945057454285,8659638400563406,5088760115353807,6585451882029500,7196269080525011,6037801958015699,5887746671503577,4201498792249562,6471811187853531,6880078163963063,2717377161488606,8281716191683251,901774543063264,514005046737349,5110294401673442,2936288493623524,4760479059876069,4726811532577001,9052871503618070,2803949050521841,4779509863405810,1902727334365427,2262108182771957,7587806171181324,7430228567165175,8395571403200760,8457069186951417,5512299772786939,7607248380815612,4261010726779133,2981185127983358,3734372360235267,4378139692288261,5245999470385414,4555112533711481,5704486641740040,4834809986779401,127646851492106,7142185105694423,8775606582530240,7503658419665965,2535597722700049,5893848406677779,4389189680576788,7112141453699349,7393337069500694,1736599571843351,7576972703820164,5145962555185434,7988940439218459,8601139326458141,6565548242917663,6627141444184352,5756056312781089,339896951671074,1386152174874331,7516700296608036,7559165891004711,3402102027577643,8983661388687660,8926530585917742,385743397280047,6737892145744177,3654513812748594,8979459037911348,5921213059414326,1752158505027895,4491768283789630,6532147033983296,1054396134050113,8803912338940299,3692144830253380,8928080349272389,239708424173898,9115954108628766,8793766784415314,5875987661253006,4955122136414551,6207453850167640,7298256213920089,5858664507496794,6953661366767589,6231790539852124,5538158827379037,2390768006244702,7620889363376482,4832060651739492,1619251894450533,7749070261823846,8028532302252391,6010861736782184,2469077454858603,3481291509541229,302207331756399,7873557025271528,8608305714866546,6558780370356627,1769789041736054,4002173639707003,8469028497148284,115636201277822,742868836931968,6387326674127233,51249009686914,4867212622326148,3835116331071877,5311684681460105,1450207308458378,7402496764086692,5294034797050254,4887432377424272,3185017472891281,2791276916046227,335596527585684,1647518073252245,5802987159222679,6885895182545988,4444800061315482,899157200476571,8250309116453286,3654440219527583,791145666148768,4542376211044772,2169302684618199,679847042435495,6791633713019307,6623749103630767,605692715702704,841764136855985,2205457048549811,6728991939576857,8570247961033143,3173479349311928,3513746794523067,4216842730748348,1474734270514250,2796863640938943,7470894758246816,235058221431234,5854215866137027,6714603534776772,21758757267909,9170209415694793,7476915304753003,1181566585846220,7215761854822862,3291989952248271,2465739043917560,6143452396235218,2529874990160339,8764029543684564,7719675928975351,2377236008454614,5764122136096505,6853046184094168,3730839072381401,7211702002665946,3135025004121850,7782211178875358,6348224122526176,8659492152007138,1719619355240932,6276853802105175,4450609621625318,8696418875841617,6442382146906602,1020851942225836,4495881140775405,5581590568212978,6597186321889779,1663446745561588,8022751622541457,1079464361769463,6980200735021562,1296936500980219,804463629306366,7296066119088640,1492626456549889,7161901353060779,1740167878543876,6600397158210646,81591307774473,7177174184752215,9108238657581214,7952837975907713,1666321776077329,968177679198738,530193366388483,2519617884940820,427918143289878,5635332984056344,2660654883526404,2100770326338074,3931339481664027,1136426400193053,58350617983518,1222257344829983,4011907413895715,3859047274207780,1499555286755877,4719908906244646,77206446959143,3863712216373801,8900080746045177,7880577944562781,8022495458212275,4391467497962037,6573416626014775,981406294751800,9067106486204987,3331301584857662,3213841735395083,7952463502867012,5747269020764741,8163100104501830,4874321167682119,5945425002543689,5073562473167435,2868288238066252,256847408269902,8013465978042125,4365939462806097,6177163801987669,6280157685505974,7300753833123750,1752680988002908,5277153385583034,1855815630621278,5342114989210208,5177416034884193,3718697429387707,4734901820017253,978743372629777,1742624179292777,8293036481432170,5499835947522668,5400709373913709,8752832672743598,6333287336430192,1985408830716529,8804701206235766,3976777968839287,6387858940340856,2717314880899705,7663001455780177,2779658146703995,2125770174548604,7711210310380157,1522944223443582,6926592351992447,7473481211076118,3151746686597764,2397036765686405,5839600613948038,378485569272455,3061961825766024,8556706630788204,723575130552970,3694157580125975,50903233669772,8124483742087821,248237392407185,7839607439981206,5590980382689943,5104225193028249,7061300265004281,5627038919920284,8176173622236954,4403067359570591,3069363211922081,3243555201788579,2047057412143781,7062939970831473,4634907587369641,3804260025039530,7543977238087888,885787102452399,3736087142677168,11089631087281,6856632752028339,7582970639381155,319321948265145,6099695342923551,504928826211005,6100358637714111,9115998062869185,7869372360099819,6010081752301494,5371481520282310,4138050292619975,1971168561748680,1315785346419401,2297510168046282,8410489727612706,2328178223532752,7097413948054648,2462012911004370,7055410192555637,7787336648608469,7596377934793431,4005136878598443,173416622004954,5330177771203291,6807882059066076,7133868142049153,7876946674649826,6348659909589731,1501031932213030,2881186681834216,48263872058492,6815209841511146,713168088255211,4326648357681900,9185429081856466,88033002474224,4696026483657457,2490153087163122,2781974733773560,7960923417283321,188655207107711,1095020415785725,6980293128523422,7962920203236193,8004992985715483,3555490495642370,1315645648546563,3904491494930902,5296177873603334,5712605316082817,877887112276744,6833446854482698,7855529784426701,9041391011552012,3696643275746061,5843675337407247,4018812191476496,4125685350026001,253319832550162,6959807790167171,8793852252416788,3757943027534615,120381832321817,8448231450798877,1465203375483679,1314085676092196,7362292306447142,2552048067637041,3842474332236585,2000041563335466,4207823430933294,6711978367028360,6599282938564341,2786064398830389,20840136764553,1221173652029236,9111352467781515,1906986990046011,4151081531861820,3073963132566334,6217220814019392,2639459034577729,2593071347739458,1835735001226051,6301470749641540,7389147369605957,2055514611276615,2854000113961802,6015339296000843,682318068083533,3665054726269774,2377074170633039,2875863421127504,2910088625363794,9152416356109139,6251185517483150,3038360062707513,2581067851254244,44457438727002,4420645757987675,8155974006973090,2739407479404346,1025138320816995,1495052258732900,3048285977401830,5991366240888836,8508760600812392,5604468739538748,4285387178208106,1696610303462251,6094529929030510,8348554477575791,5657503864322693,1503619634957172,7568399829198236,6704497404083708,562417443785600,1304800578756416,4482928646802306,5248644746107780,3258535571213189,8683247052545857,1635495637159571,2283739277040523,7159891338644364,3081211508759438,3065374306286482,6008566766088003,3236928433298324,6773743122924014,1388388267850654,6558277366744901,7598411432225112,6166944306457505,5839043983506338,6548088603044771,3489701544278949,5902952445467559,8072217382880412,3723719881980844,2651847572261806,6829854230076335,7514546091805617,570727920430002,7866523054418419,1656853539515316,6785686169213877,4136735762340790,7226902519054673,3898598245600185,7110368012241850,1194679483378619,6193924739197886,4548380103224258,6449241733247302,1452985945422789,1779728884784070,6428006147181512,1928848135015369,8875780634590154,7473071493766091,775022454557858,1702389626702798,5292769603709903,4300903262084049,698031756983251,5226091987008471,6286720454940495,8063122338865658,5897467313249250,4685288720267771,1091567169661924,9188189660654565,7828876250008550,5611997678722023,1645397218827240,3037632890002410,2923880146955244,8333203922389998,2182979649674228,4433451350055929,5011478847675386,220695311891451,4460194338561022,7249013715086335,7401522470879300,8885974487427584,3283739012582402,4576732760304811,7751573013588996,4111787317241686,2774711158168583,1353231013903368,7653672870118572,3986974169878359,9150886103952202,8948665381118466,6319473702386703,978311281616728,4898221422025746,4422729636568083,8521851345128468,4895895377665046,2229443662728215,5834358401612824,2374202071489561,29791784074267,3658586599726108,1363401083976733,8645707542219269,8728297873710113,4459188061727779,8018193515596837,9197678710950950,8959375823512753,6057291470319468,4751680873057322,4734938853866539,1830467200588844,5663150845357101,8269059385791005,2218664712272946,2080716278295603,9044775609286883,295123327532085,4070422104857654,6834509492009731,3627816869321785,1431416031772511,2900550440496188,3908172023307328,267469558377538,7865230760734965,7237571727432774,1274693064440903,1758744260394056,2899492692466761,1657705650506827,5801184900566987,1788886213110864,3349325556849745,4820316737756243,1980684690730068,1301340942048342,7661799700520023,3656632297725016,8619749520584548,4443482272324698,7214798736419933,4402854470962272,7877573029407841,8175261151312994,2730175753550949,8484766236004881,3492317347368040,4450609192438891,3292888931822701,3000376583195759,8886531076588376,340786435794792,7257699859820927,8065015968079799,6777870512668570,2455491536727159,3118477282622584,8759275679250737,2608085683514495,356649465515200,7639562180099202,7178582185701227,6202060279104022,700349689949318,4370630693919879,1155125692738696,2140138126146697,2398690555059339,8804836710189263,6693696354135917,8721600027442320,9187536169481411,4477869661097115,5846314500131997,9220154687830251,5363191393582242,1047948926586020,2947084710055077,3721126445628583,7776675745225864,2743529656726727,7478302689217708,5434439561264301,7440577042568492,2125640507173405,2251132309195952,2697398339370867,5974804115557556,3554280185527477,1287874053921975,1610003718823097,8742263503477946,5547574198389947,8802305884116054,7679432995459220,2722746577878208,2863848801447105,3211951320415426,695850589284214,3779587374042971,5415640796843208,557957798536396,6445229541532328,1269863302352076,4572707337288912,3391395835518161,1560847745645778,5694393359248596,2385108786728150,481383662042330,7622293290163419,6943814143229148,1955952644725981,3595785193630942,4878246208478432,550249631833314,4562435499207908,4669314706979366,5862126260194513,8928994004389096,2215316898842459,1241618867821803,607446985305324,5287992073624813,3505931180006639,7363231485332720,3200706095049971,4175015283698933,2630107178974455,4835431938612472,4002503618471124,633670628904187,991144551591165,6182167602031870,6377247177841919,598798415109376,172920336821505,1363058744540374,2224827144264966,6754455537493889,5134363179986184,2441498184215817,1356515675434250,1168821429599499,8389866958920972,6545628982721256,2465986123214094,631672192511247,2651665798188839,4687936382852371,653901952412950,2235613023366424,6544472034398767,8579156036928730,441578684247326,5228400631713058,7572781297746799,3903508000328998,5630740817935655,8483170239966505,8847769468243243,2832676073930029,5726610185653553,771803754417458,4337307678616798,2294558363015049,947617488194872,6907314400509244,8260921593929022,5439617616420160,3933787592170818,3598267232406851,4811540933766468,6639614080078734,8651455979775201,2198841754918216,8838989544619916,435996187688266,649179112217931,4924746671947086,6582332325547343,3297674795752784,4923491369888312,3614501291844835,950315588574548,5514006382419285,5532609967906135,6740876979554603,8157519079856420,7681673898412562,4327220864892133,6817923870294880,2444821728652643,6183930196491620,5886011498253670,3005633928093955,7287979134610796,2650179847622546,6035167823110717,2685592924056951,5740059543319492,8809056350895482,5063909095439739,4681188186665062,3259009976302977,2742155135372674,5786853321821419,7774631657576318,7272871788551560,3405232014060939,1543319650336141,4288189486266073,6242097577782673,2609708297657746,683802806926740,8054138852367765,4675298751421848,1581884128947610,5291440853101980,2753847398363034,5427973501373856,1161707847617955,2949527718264228,147397655973,4201494481333670,6293116566498730,7668330430548679,7592947554860957,3484763260263858,6589156659594483,2718570184293814,3539347558157752,8982232382434747,7741206357592605,9097998468017854,6620820300062144,3016489770384835,1541364980252100,4138311841820103,8554536312569496,521225449192907,4273022207512012,1983514794786254,3780613960461775,5268086350405072,3040061530464163,4297758644473300,4661235417206229,4057645739638230,2883976339135959,986563464697764,2731408531348956,6300344238440191,6663243041959392,2162405423689187,506075828338598,3607633862401511,7839298866130504,6847718502350779,2990912346709486,6270727939120381,9138496020047784,8178403517713909,2075224765668854,3300708939775113,7680516071236180,6337408768368124,7291259323731077,8875054348073661,3080918468972034,483196294163975,3903770272382472,5476126081973769,1172175354785290,6251065753591307,8713975085907885,1898565008424464,5357331551552088,6364067823238674,6980202280234515,1195999357550101,6298198840811030,4492283676820057,2048881429523992,7898526970322457,7585836289383962,2829613426683419,3531474433228317,702808478424325,7522919394889249,6105972640886022,295120209586097,2567261187869276,2310627467963946,3008868730998315,883447473204780,2867468328130482,4319387508178478,8468860262396509,1554393509596723,5880394187693620,3027053748820574,8577819931810946,7377588174242374,7762945442921168,5331269405597246,5028602724580930,3026352049757765,3253052356337223,4429376500809288,2371140997279306,5474721379511883,509599139266125,7661915234070095,3440202144697937,5670482976382546,6123390523632227,1822705957252692,1789842778512985,8860158741167710,7899236682554975,2250562421612128,8063287924674146,3750861986541155,8371013164875364,7678385798736035,1765405075205734,6874371532400070,7406088531943019,1812462208040556,7484101200987410,4972798244970095,4783747582742129,890982241439346,280479077507006,3625359683554938,956736503905915,5460230181748348,4536628590395007,5514770478952064,8669774434815693,3797969014660739,7236354385424005,4354251808882312,468794660142729,323847626256010,3636333601132173,7231924359630478,6086555218230927,1029443893959960,5276099418558099,563525672615573,3179637891075736,40612056439652,1729603685371548,1070406324874909,6157706928086686,7884283031563937,3724952320573090,2820314541110555,343562843295397,4797400363406344,4562395753254573,6088554441948847,8767922334183089,6737820152352434,8458217448480435,7721027495694281,1390134552952508,1049523236545686,5406470514155199,3760757620281024,5439382336559051,8285521263786862,8591087894211289,2280327622614733,5113997200686798,7056383910465231,7776919985091192,2422865178791634,5270218095189715,8349901097062100,984093294497494,3011434253523577,926804355067609,5079304768179930,4484592328474575,560470842080989,9138403063640587,3227431230484198,6738333323825752,991626880179848,5369803437741351,7103132828663534,21311653199599,3776891417808624,2292898090749681,5723497191177970,6401189791231731,8597404401737920,3701071880800894,6142158179487479,3856982184902392,1897887053754105,3623228717916296,7878335611313917,4405635998506750,3452897429055627,2217918916003079,8958225161482880,3745206475755266,5012725668476203,7555457855739717,1971561451777797,6382776440344819,5947540377415433,6113890350950359,8942529790168365,8557000483061526,4494664342617880,4619471609421593,5652479210688282,4576872783152431,7864951115538204,7638355855265566,3992601347886879,9005086971309856,34422562610977,8831572213583654,2856661366957361,9000568040689448,2118148564852523,5062115028700974,8436974537356035,2871374662344496,2552166506592904,7971780928503602,4728382793236276,8045978370543414,3081207536385847,2674227723679279,8154172869517115,5554593581186876,2416862941260426,150330234974014,2120993150988096,2073285821296449,3661474693214859,1948557263613764,6385378825813829,7776946016153416,6797709920947003,3604555443809944,5815284353893687,2106013115391821,3137267720634190,165110827011919,634048970821456,7416580004323153,879896022962003,8700878114357076,6426204026381356,5207779753365335,2646878432086532,5178583086239578,3275745266863963,1689196118183773,5504480519487326,5039757114781535,2664908019954320,1841240314539874,6269692710805347,5828506047971172,7855261311136459,7530660903041681,3246183011565416,5241537590550377,2557725785640810,7003373558071147,1532882113204076,3133613733949293,8216508971320007,2084615140925295,1744078137372529,5604585513213810,1749430956466035,913266360131445,3969218124152695,5866503485116282,6148540129648508,8424863106879053,2027624421563712,2764853016240002,5004672643266539,3617729291874184,6432627446833815,1207282963906444,5914859500363074,4227512983322510,8096305568399248,4744462157528978,5096988198834067,2155801608546969,891738434645913,713848338632602,1288385858113436,6677610130064026,7211550215999378,4965367944250693,3250059383877536,6971798655987617,3664922892525475,3226690805696261,7449910243970983,8512830966189992,3328184209706921,6261799097094059,7818240164643586,3166252141498287,8399122372063153,6379644054413235,1089890326785974,3363521281728439,776771880370104,1050653138798127,2381178141913019,8824152196744522,4113103734673342,5643909523832768,3149159217319874,8259317489145505,8890942149066693,2638192799207367,4361788465831881,6827387524103491,5560563518672843,6707146875884194,5497454757846990,1733892181901263,858900203634640,1930507066509105,8139065159741396,3590997290553303,5279952370302937,8527379210407163,707931047083996,5735908203036637,476570233126878,2049287318114271,7467895011917851,4415972859826146,477281169516539,3514360175136741,5936331221073896,2015374584045545,2238543162892266,4007420137983979,4976210450964461,1156184693080048,12708638380017,3884207967417159,7866788970065907,3323438749057012,812659173228536,8567867114409300,5892760937865210,7853911720244015,3336806943637501,6866734913451727],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/2d8b4d96cf9d790c1b225e681f8d57dd",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000994165.1/GCA_000994165.1_ASM99416v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LBZC01000001.1 Candidatus Uhrbacteria bacterium GW2011_GWC2_40_450 UU04_C0001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"2d8b4d96cf9d790c1b225e681f8d57dd\",\"mins\":[454441997976577,4879246933831687,7469330123541512,5696308510097418,5009526930697230,1094406065828879,8047621350512131,343963785344020,5390871591785496,4000798553850907,2111960945569820,1258077018131485,7656420597304354,1693813189151782,3293999009037831,745879407646764,3142550196948015,5766267515730992,7732262179110961,8291970669253682,875386931633204,8044953095057465,4836507160433723,1296573204432957,7279963011188800,4413926063984706,5609090462539889,3973080273454153,6473006427154509,5165843072442449,232742181926994,1250352046192723,1721613390346326,4934029372392538,5289135766465632,1633758534601830,6100458738034793,779185426018410,3511193907786860,1316237153823857,3336818388155507,827492907363447,617761607633940,7128309010423934,6178730412530816,1208544027197570,8775632917885060,8448421912357398,5639008160792711,3345884132477070,7944290518343704,5429221768052885,1868679545598102,5723473253705882,483119482210159,4488315786394780,8448724623312032,4721691554471074,3146988774858915,7351761649323172,9182026757847750,8884036318740783,6767352907908264,4518568226516142,4577099441953821,3694632418664625,222668164718770,6225463568728245,7213164176552118,4274181684683959,5517504071256252,765462240363710,6102233968597184,5981752291997894,3604756145004065,4748539511140554,6932432032647375,989412983222483,8796730466866388,8077901363513417,4200238020732120,3705757762231520,4695689219631142,3716835680270566,8234244795720943,4166576653266160,1035036208084209,7693393802097906,1520840459854067,3626427274790132,8878747435882878,2023911950452095,6001013128950015,3231530522969472,6671230904922376,2946560911200522,6978485596157197,716640845340943,4747555739044112,301506466396433,379910181066002,7276077829015828,8713894038360495,1639036215238934,8322248856934130,2065425595989283,5337984571863333,2686195823173207,4917473648489773,6457947468256559,940813507142960,7082036260172086,7084191362213175,1596083651888086,5601291820890425,5712931464611027,4964853605614917,6080638930556230,2590786704447816,6756859612457289,9045044941403466,1762939296460107,9211487042354508,3258410120360272,764365222955345,9013022603927891,5433633710490964,1760279472794967,7935272278801101,2820730417252700,3896196857115997,8715361312076177,2222968787528040,4232360435155305,1339426497925482,1454265297942893,3305530975491441,4417080236455283,6071760424447348,2160668447307125,2559770874859898,3456197296399739,7519627228987933,5505011562860925,4643646634869118,11370185201023,2483860568872320,7355670870151553,7598789513798949,5787916134272393,4929607404964234,1336486487273868,2316691497806221,3700137099862414,2437054605236625,2907463776678291,6742910519060887,5678044608465306,2069570360652188,6008604482133406,8389542831932656,8396624242808226,4926750268203931,8947898898669991,4056326661512604,5588560809845139,5889184165324871,6851868161917357,933005233754543,5490399123216816,4205232673409457,5119181465209270,7369945140214199,1048254183441848,2276348237850868,7644213613898173,9094723703401923,6968069574600132,1848524903064005,9182625077628492,5090672987456971,7708915656240748,5822090082305485,6727237340574158,8200087208711331,6024563802179027,4299508931330036,5676496262704597,252880808200664,5676320503513561,9037341280208346,3309305144993244,5156815572810206,2373945194143653,7028621350381164,526627040472546,4390302423135483,5985537725582827,5761529568017900,6623263268650477,3681589938614766,8856343518813680,8922734253249619,3934280229136887,8362310439387988,397198406756857,4309553027999227,1312525234692608,8857381321168386,4777013051695619,3177622678095364,2119996231331926,1214725049027079,39861301558546,1822411206977111,6389374927882766,5655986536194477,5271751007490577,2520417561794067,4434624551094804,1364060171299350,9174257591533080,8933810247384602,2743097020351003,7089304566939164,7139941262455386,7227541317412382,6584292226374175,2294739245865505,6612319807578660,5518633139336741,7990617801550437,3869581871573425,8432028760428076,351208831325741,830678637404718,2532009787593265,8482134765397556,3912920466227765,4230232385762872,1215606883921466,9136011815579637,8506319498076734,7284843391702591,5882961791371840,259765185341536,6230299368296003,8695430923496007,7922153955043912,4223548942276172,2664484386133581,1500107538612493,3924079164186192,4675177102164562,3721572539783767,2900797523723866,5508662026675804,7980855601779294,6328939211077215,7861044984702561,8526674865552994,9124793995578979,4597002677747302,320279648890470,5664356306787947,26388263377516,2920581357560429,3621117619063407,2092072571286129,5405389827152499,3230850583362170,5967759893056618,5902309174390399,8637751103574658,4190933329182341,1633389036621449,8510160107808535,4483392555422348,8949594143951469,2480390277033617,4113852756960914,631169605971603,3017408032476824,9076112267149977,6409877348907677,7909576455145118,5253198945213087,8664686741253792,3697824737314469,7230732988773489,7121859094116009,5220274290653869,3925167301188276,831495349123765,606438888714935,946085961003706,4952836703352607,2772379470436028,3658028248362685,8716395044618943,7806494800729797,2590415987676870,7203505700731596,576442432891597,4474831097950670,2548585071106774,5470299280177885,899840116034270,1105535336962341,7560011991108336,2268824795709170,1468991846107891,7401207521795834,1053182808482431,1479485244408574,3070563285840641,8036395880222467,3348768266041093,347975599367832,3681253466303247,322775035917072,2358514848953107,8028944904477493,3420068844116441,1715121112394520,859570904898329,4952412113843995,792491131783965,5539475444629590,4733220829757217,9203451806903362,1273562762496805,5591094550591452,2014437496903470,1454192781507375,7821844012678961,472225951996723,2231259554662197,5916296786503484,4107001033474878,5885029703158591,7139939778154306,3547769631187779,6189099650464583,6608689232461641,3597613746322250,6825805806122827,25561776098124,3383984738958163,4046864237104980,8711971844809559,3027859595129690,3809270527911773,77391550725984,6939418416337765,2039781058039655,7210871808003900,4378020372664170,519454039079787,6369389312235372,7509680499018386,6663890933870447,49313151612788,7589635052958241,6297061971866486,6345038221405051,7197377386805116,3125335204565886,8111812272442239,3091810160699266,1691942249975276,7477788166989293,6711164001696657,6628815103079315,2268011373642644,5727579421349781,2653733469153174,1860193211940760,1977490305366939,372078367668127,7174633036752805,8719726294499241,2789498901531563,4303040132575148,6457183866222510,8533590057694877,6763482690122672,6220838509138866,3833495996983625,783618967963576,6241182704009145,5381460545674171,2605748260254465,3107884085655485,7370753086983157,120452555234241,7248841521876933,7603684151827401,5480815297015,4846691836977103,1479304567595984,8957190285944824,2933015706309587,5124837544599510,8309755302727673,6338201771778011,4441805989477340,5347212389887967,7017326676261856,5802563651940688,3955278642665445,6630560315917288,7384001620430830,6733557290884079,5018687347599346,4641699354849268,5168917657995262,3748591196974070,3000934427809783,1818608406636536,8160464509299540,7195780144774230,6479135444719614,5193108654665727],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/3685ee5f820ab6e840ec6b0fe090e754",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000326345.1/GCA_000326345.1_Esch_coli_KTE139_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ANYC01000001.1 Escherichia coli KTE139 acwoz-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"3685ee5f820ab6e840ec6b0fe090e754\",\"mins\":[5859080619220994,2991707264114691,2235115913207812,5349090226169174,3728622142857222,7243207238129462,3936481708941320,1305774346354699,3484985178759181,8328806130479961,5824963049521168,8600737110331409,910260459544594,2657920817778708,2444008305504280,7362756409147417,420513773821979,1040906481516572,8719382970615673,133535365812254,2261620935442464,7868054092312582,2430236048871462,8725800200456881,6364308473326712,8588972619104446,3248848289660974,1874239187120175,3205569263312945,89217825112117,8810462027214902,1840603893760057,5897969538039135,4046711642517564,8697447499234046,6985245606318144,577022782136385,3533801781903427,7230648005027303,5510921714606156,2182398795403341,4763806838976525,7371661740671056,770831345597112,1056463717097556,6749844396871765,4588882368847958,885105075142743,2128219652771929,7249876427247675,7775114526998619,6344495888882189,780927423520861,1051896060691813,4532998204641377,8920527252377698,6147782503108707,6363223884542052,1390675320180837,3589031359889510,7793252700781024,3212616315093692,8560440570970218,7898019631235179,5470570690666604,5568630790840431,8557913976427973,318427908817011,7775585762742974,3459151149293686,4850188991156345,923547613745274,3715299619541116,2481176822280317,3468478413435006,7640936389113877,8882223087596224,2758371055804546,2626771742625923,8539004164948100,8350358619417537,7320406424580230,5426426969901761,102186394538120,2220943948307820,5026847141937291,2569804992065676,1529771851866253,2525002412212366,3238514465894546,4970354525880467,2634406262534294,4479098013347991,4689327314907288,936156697600155,4577706923735066,5809570678718622,1930844063527071,6980401474429351,355068611980657,3089609529942184,5478482300284956,6664849986859178,4260042644267182,5691267324358832,7501741814739049,5598442556102519,5779594307760308,3991881398988981,5912127355224777,4201051028996284,7813210444492990,5752477798703296,3941664884187330,3813318153999051,54267487195332,3920674891829445,700570702659784,8395130278021678,1285480463289037,6552739233923280,5088556791717240,1958335824154835,4990822371406040,6763584774734042,1452769867915484,3813806871597279,9023651016650976,293631713009889,5591038921172465,8997639549439676,4466484413501668,4911327153189585,785648654295272,3789981931700457,4285889479766250,635136383123691,1223472291905776,956777688150257,7889004868186354,1083684492550387,5478954090696949,2144861695090934,7503106689917176,6762907209459276,295102052892922,7253633366222317,1012693995966716,7321703987165226,606392454750462,234488146968831,4746016443060480,2525877720523013,7915640336060678,1052577627164936,8827895889194787,106776035873039,2927652349268240,1550977950057176,15214235558162,4754015864153475,6313316894343444,5962730765967637,5243940590752022,7303145929355499,2638357482914074,2174974481998107,2640078475481372,7608817843593338,6921739629677957,4256472601616674,8909732310045403,1540697415967014,6057434412714033,21150285087017,4523320794685740,4941779457685554,8150994036996829,7656413098012959,8606861947601201,6459771538178399,5788684484124980,8406285518876081,8001397440233782,3816397287392649,5723360613174961,2023429428011322,4313045818585403,1752908108796220,7298749349184906,7606467691581758,3495517882196287,1042566742143296,2355412341809473,2796934217008523,3346776127533380,2987482276307270,7088170934731489,3731143665119561,7470985706406218,3713786577838412,124098536026446,457763742601552,6241052815601507,8151325185288164,1207072803811669,5862130321367097,1853196278886744,2499118837629274,2227481306654124,5333169923062285,1792417193943389,4586823680090463,6717894818345313,6903200412788795,3296962647322980,5250521463216870,1562298933076327,8592181650010473,1085464144855401,5760795239805290,2139576114905451,8098712991035756,8625407358164370,1981067029344623,1122474689470832,3512898337591665,6364201369596275,2239183959286133,7641508116359913,7475092350742905,5634897811501434,6690573431050619,5375296869237116,5803893689332093,8805719932889721,6281497035855328,7806345381331008,7918334635264164,3257692349493636,2436724776239495,4905932281966984,7927270590651116,740607477961099,4540069431656844,8429228251806445,2513155861381520,9132746182173073,6578302166270354,5911341261175963,7215055957377431,7670831243653529,7606562266386842,4997183107092892,27362219888026,5168331105685918,2564237403603359,7977555933352688,730627061744034,3693090239263139,858071260565924,4214333815701925,6535597500903847,8451694650196392,9170463103473844,6046018190438837,2063008413757867,4858254758601133,6889719627880899,5923439901028217,7161289865100019,6563744752300468,5016591687962014,1204751753802167,3123099783696824,965770318045625,8316110361879604,3934834437456318,1082920449679807,8039903998695492,3029341628273089,2306539468046786,4970771199730912,5842392311423734,2187371118363080,5923012618264652,6103640832397770,7685169946280396,8057439109149133,2062946370593230,8996701607342157,33355113951698,6304638001390035,1577671327887828,6973334182239240,6328458091603364,4942284316191441,1415164117193179,6057766533247452,4371759855858142,7059564896941279,1623756785893861,3647315641012711,2830075377656296,6786758668423932,6382701539852778,1320593841811948,3261513360556526,1316262047470064,7281161084531185,4630603735446003,2571781153471230,6506660737266768,7804641486876756,3442871712997882,2966200342921724,8865842697617917,4560468916523518,2409391466709503,7267827156959747,7904686935169861,5044122412646919,7522436974756360,3819505028789676,915177206215178,6929971272725003,6315142948381196,8471416538238614,1802457946327669,3706241000403472,8179864612635877,382644013236755,2483232887628313,3058265525461530,8501863874373356,2521002441265700,2410197458295558,8196924189913638,2490674119126568,1306937454668551,311935564800556,2066190839833133,4810524835729966,5855779389325177,5498454157423152,1882484501008945,3343417539056178,993226001749427,1125038647685684,8014596945296394,5061816688071222,5394219840704607,3429852718600970,1383618410398270,1308040806261312,6091645937185345,1448281385951810,6611645103428166,6545724660796074,2316787462754888,1820959062880842,2472140177142350,2272874058326608,5539170023359057,205867475239506,1525557707760212,3848836181647957,8031406990306653,950790026596952,2164808574747226,8661840198358754,5080508310012510,6078577984824162,8741228954923616,8812535259785194,6935423251665506,6817438024151651,8384970864149092,5502000587686501,8701452782276624,7861126491783069,568000522973802,8940081059791467,7754409884422930,8806011350241903,3024423721812592,2589855202779761,2793097290789490,4289392086258291,5045175309042292,554127215600247,7049445218833017,4120589373940346,1684541581264319,4889826673729378,2397689414378114,6232967090696835,7884387499119236,2679207567196806,678285722124935,4946516284314250,1724031441810059,8789390209405580,8016995015954347,2353730651177615,113269032034961,5399031890362244,7358116785174944,5339577517900437,518593397944982,2134661135663767,8109200655040088,957664219980442,4847982489132396,6586311591924382,126141660684959,2989476604134051,9042985953004020,8190096274275782,3504564547469991,4273289964511912,6631051285934764,7457660503509106,5961322984107377,3454147883254448,7531348323445055,5664545369785014,8950184045597492,2041358419321528,649936829809338,3496369553818299,3763145072980668,6572195292820938,3375494323790526,4642336363096181,2098982571856576,251532409189057,4039196619215554,8167177011847876,7461258859609624,6682597705495239,5560778908603081,2209227890905803,1156519831795465,2555252183827150,8694040690017741,2029463840150225,5830994252219125,6202748544676564,7298738867790550,239945629602519,218488132682456,6108826269531599,5294766748025565,1329660083311329,4567546034963171,4704426556949222,7813367093870033,7646609744973725,7604050999448300,5177840254444271,3672224951714544,8570715246269169,4987313721561844,1787259017597685,4081622579155702,6025606226006775,3958895049360120,5069302333174521,692261617423099,2088069525771659,6309456752497408,4212662351934209,4189143409770368,5810464076514051,6375221759576633,7130606621063980,545034796114697,877463201362698,7335642155118039,3655348890841869,3334521995297550,6584841380211501,1568756855591696,3312750158140177,1370559325721362,7937636816298772,6242121013485364,9037916445556738,6618163993244445,2069696959583009,7283539392975651,1437007264772902,3364210976543527,6347070686084891,8722933495968554,7475979576483975,1789900134822701,8531569051055773,760199217039095,3298104694887216,2004039151534897,8782375079969586,3777954798801716,8188669259415170,3406325407851319,4845256832766776,1751698265555764,9065084596160867,6221238639424316,8557551783120136,798868643812160,922005921377760,3022380208440130,5669509104911881,1193194748379973,7325513255430728,3194308357559112,2319028505625418,753153853702987,6835847231583714,2741660511556431,1541037172577104,1175397545550648,5948496119125441,816503841678163,5530939248102201,1419703420392281,4274777565541210,1034145939477340,4727739389031262,1147610223223647,8752921214539031,2493777281889121,1533610324456290,7732183357549371,3373419224413028,4656754749973349,1315453574816614,6134002501714791,7447968941572968,7922006282224037,3640921402798955,4804113849557868,4710684819043182,4076668673815407,771166874256243,3492622314177396,4745325140824949,796516093461366,3753675332473720,266297663386490,7739824411547637,924694737817066,3813469322421121,907310714922475,6886829094818693,3168575450833798,6994363248708417,4287993550570377,6124171288552331,7724510455745651,7912365981145922,4500080543150990,3164525091077613,1995644919788432,1934324536599441,4424843564700562,8998795423507347,7559991823487892,117793242025942,991336039265177,2325169820894106,1719461470643099,6141663376171933,98055163335582,1947362805623621,5472728336085921,1062265454900130,3926064929824923,6076909087628102,2790759863837607,6267931029091624,9195540769266141,4953149820658604,302140257136880,6464448631872945,4824386659382195,8396508860658612,6443784898034505,1672317452907448,5855712591020985,8802100285823135,8783502280774588,2222905529545662,4610472403542975,3840123825705920,3272198463615937,669811571962820,3584901329069000,4097782020987724,6513875706381259,1204390586319821,4616453495653326,907164545261048,6940868016210900,5387187980387287,2856215005730980,8123516906542043,102565214680028,3070117075821533,191598411457504,9076818340918242,8665080585463291,1261878071358436,6230881572242407,6131691779643163,2406905388192749,7291819492885487,1140012540019696,6336152938842963,2023674656646132,6213240609679417,1919631874167799,4670831696962552,2909449267180539,4519324738618364,3717724958857386,6378674551886846,595892117099519,9058835486569475,6089652439225856,1172164637492226,4871056328320003,143345725674503,3424706376942600,4458521668379657,6365639325819735,6001107418272781,2556327963026446,6677230206931985,3233217934193683,2314307504759831,4414847417299993,8301344556431535,573632093979676,5923997484364830,2924331359450143,1171980783285280,5828222574330913,7434756525609724,6035460513596455,2114613282968616,8644789270002605,4884851639452714,1376333197112366,8695347109493251,4589500102661169,4039600984450099,787486999061556,7405781378130782,677989565006902,2397568319902775,8279833769011380,2715140864083002,3182324679992379,3842997852132412,1878222618190911,7132268710888512,8810737386038112,5542898849719363,8044184034230448,6490992759438933,1505429101958216,2471969595081801,5826009492259914,5259326805443660,3774411384146786,7674151613951427,6328700050601485,3344902780892240,6843224483555455,3889873344578645,1957701014063289,7220111714722905,4074678051050587,2920066062038110,3955606250837087,2407186399323232,5446789427717217,1515481216234594,7375550296380515,3453716837938022,2182286565880934,4407081787098216,3657672682430800,282631119565930,6822874574181484,3614133777437806,4120190169361809,6168770492553733,8004260972910099,6790939554149493,3391858706936950,7062224376218745,441021008147578,5477515544372348,7643703300975466,4449343608685694,7530331985466499,3322417381274756,291938081838213,4961473957147782,8417900494846165,1974598399054984,6508832892249227,8942842223956241,4594386927288514,7791564038861968,175896512464017,44060762338450,4512763559527572,3747058568012949,2673985800224142,7896352435140504,8405523286193306,3829892763460763,3472461633787037,1955432948978846,6532727659378885,6178165436702495,5049306778140564,4502617358304420,6480414174873798,71889932481702,1685645628789927,8550510119265448,891472737961131,5240781291304108,7211868266849634,6020221237839389,8869269742340606,172206845146289,3406486889866418,8714570880644275,2044246544508087,1580668012123321,195539820147899,7059993799656636,6623373924644029,9071633823952728,6573772246713536,7923291333080608,7262014036550850,278740376483011,37254031406276,6047489833534326,8927947075315916,6421773740451021,7338238661022926,4114688373978321,9132586668618963,8629085353172,1272101094470869,5609254094157015,2581034133583066,6798651245831387,6193677916929305,2746740739822815,4293765883585760,7593967918787000,28337268266212,2613436531741925,1303579862459623,1502483749131498,2460940098376939,2607549250757871,1397245118305521,3745691804464370,8244811689408505,6236861544015092,9008669983195714,612498938365174,324230192022775,6986109377038813,3006981149553915,3354456329798908,3520427090617597,6747852412978431,8991141000939799,4909275774137601,8238052630910279,6710920959153411,2874825177847044,8783200348723414,2114111736337670,3633452930009981,7350518350345482,8632211871515646,7747901425624332,3641062808497026,3579385405969678,1968358009558574,7760471900674265,5628993266052655,608678462596380,7596182144714013,8303745815831429,748493633127713,52789690206097,2792082387105059,2144295051339044,7763355015020081,3389669392196904,4198112666613033,1710580230436138,7380061455852844,7287619667993901,2878497757259054,1989118792365361,6031427847992626,7679109584230881,1561211337072795,116589162149174,8835515237074232,7387311707809084,4256472345023807,3029860654573792,2546086870418754,6746820172378140,5846008576685380,2166296975250757,8083665576942911,6494693793629511,8417413703262398,5038763940545872,4101024717622840,7450634403829075,6071655422456028,5278113965188437,3687598771689608,2562883673752919,3164104797435227,581932411000156,2923707812386141,7093607097488272,5557323231348066,2909476481185125,8656156206547857,380476869989738,3393011265291627,4390468767561071,6772732532958576,4550736576566643,2750408660657524,3643628911563101,4070909141800312,8794310088809494,7148079275754877,5892479742866814,8725394809885601,1136441185432963,4091181569054084,5401565526566277,8305241984120199,1000793834431881,3625832106907018,1248171481961867,6063316204944962,6802381326464398,641497577649551,3514751407928722,339034220533139,3433564635899284,8926606378878358,1437404333118871,1014488286180932,3963252660082076,3764174567576474,7356846097337559,2927049817007521,1020487038711202,6824052985741391,3633897363477924,7528048074286501,7662264213133553,1865515581158824,1767001339426217,8199538191279978,2731408912889259,2862025196574124,806065740141997,8016739934946164,4103871071876530,1615805749241267,2852943564101044,8491613116097973,8066264245639940,3379690213143992,5326400466580921,5676997974996410,4866836665971615,4578360470906301,257814287504831,7893111703799232,2109338263586241,5232293236954562,4585567380870595,5660204985497028,5639932700145093,4011135044584903,1532231731304012,6564781728314826,1876207015413196,3187961819489741,6873644207984668,8112973404274068,6393030055892435,6084433886205396,5775547922126293,7579519046260182,8512811347178967,5978101212931544,8698332590274010,2670151490262491,6480451608426309,2356902362190074,757115512202720,1535063496938977,3473052769015266,8112216468284899,6655171521656293,3255800624584166,4960729051461095,7293944941209064,113769038976489,2493587897258919,6442476629616109,2961425221989873,8659386870962868,2241011611182580,8372994542765557,8392463162865785,7015634353141240,7617995195688442,1218023296808443,6694977618002022,5851095604147710,2221906647410175,2830811517908480,6095385139958016,7952487478216194,909557781804548,2651849896281605,2051033510438458,312258088334861,4189633671095822,367970776901135,2365414048390744,5833612259573414,7647411007617283,185135589226004,3808516667364885,9101286740066083,438382781212187,849299192264220,5483272129254941,8379516354311711,5809455706822176,1138218115835429,9011426629690172,1277145842427434,8320452755817762,6161515286562348,2871178830644782,3618063291627055,9054867349584892,6533315474228785,1980704278435381,876228623607351,6793828710484336,2696906355795514,6371200743200319,5180953740789314,112565798999620,5546537427220037,6595576037684806,5212727640540744,8671955716333758,7822350133554977,4803330485364300,2475314713904717,3182112634136143,1099512157992528,3894574025987000,8315031461396977,3118812205090388,333578810836565,3046942532736602,7416859535778063,9078859797314490,1655257524774494,1056399742412383,4904957393430113,7583879429913553,3604100724868709,2567652907002343,9007202001978984,448223986562665,940920938149482,7164253886760556,6880273180763769,6009858873992816,3237005651498609,9012936261589228,665513478769460,6610277478459000,5279339470612089,8079967605040719,5535262954522235,503172701324924,8688245763861440,7084825750111874,167043047663236,9120286956097152,6372996914213825,3084853977048713,8296503176803978,7035581127345803,5273531122312844,5019550983284367,204848266864272,104177745548946,562607240181395,8301207175020504,3132925813753493,2868657437681302,6510161575691928,5786714652692255,5396580587734684,4311554702672154,5265123120101022,3696808032433823,4526197234513568,8862154917254818,4485090167125668,273169705301671,9137429863620892,7229128039700138,4494109223323307,3844780248437300,302608756655792,3658380591429298,1209073613719220,5382521049324389,4237539074401976,4772161298372281,4933073889617594,3816796472084155,5509066692568764,5840343794221872,5953514320340671,1439598852662976,4413295314859713,7695029361133250,7643495293273795,8487042812984679,2522729966995148,6639787637215522,4728324470884046,5701235894830803,2460734473004756,9132908525632520,3703694776023,5402676049155800,5242697689642713,8162665901676250,1443986292471515,8234328640607964,368915873239401,8959593688600221,6028391215257313,1054172634769122,5333287473071844,4344102135072487,8740233401673448,8595028790210172,347197665990378,8294645253333287,782651869345516,6422390769389,9202252780635886,8893864147363567,6751401486718704,3821560155065299,6061204575086325,2313083550406390,3683146741977385,367745128085240,6301415847132116,2120418862012154,2783343659615995,6822100204277336,5883171429841194,2682235950348030,4053088119052032,8932240705804459,6652143124216107,5797501542288287,9176417956251397,1444117735503622,1142966623106825,1053649852479242,9221187093427159,5143254703216396,3208973197969165,5327896939939600,3202607827433234,5593311210044068,7245559411074837,8655614835185430,5854400033650347,1858217593308953,4665359213123355,1337584253880096,3017307405326116,3791666338809637,1150373777852198,1052289371649832,6191751289390889,6598240466007851,7767937931326818,649581478942511,4274270668896048,1775979806697265,4021638072788786,1409233346303795,2545335484921653,327506758448950,7869103084287800,6154169292396391,4334239117655007,978850611402558,5547319169652545,2712244095024779,1111983466948421,9014271563277388,5709386733987468,7329623042501765,6442802221397837,6840341648085244,8800120101314653,8207544012289872,6528572357925687,3930551311013714,5536236203149140,3940355778045781,262297732220758,5237762536236887,889716034582361,5386975842144570,3728967388755078,4727297292588895,2855125351690727,7324837404501858,6805822537238843,2576994800772964,2003510354282343,3542016813135722,3798361848542866,2541031035836271,3835701883783024,7970309105624946,1250420615792499,1405577059608436,4382998701631350,3328151429433207,2273838361048952,2020376058877817,4481182332098426,7033454540529983,2590806855300988,2474149675777685,4758366609581954,4664038408080363,4626708574213782,4973032179816769,3217544566048649,2886624360716170,7005601602353035,2780876524840844,8835377174959214,2076738711958509,1659848504113041,4160126022031252,4745463713654677,8237707056594585,5622037961426840,4807185569740697,2976245038557084,3562717374600439,4661444297934752,148554695608225,8244853440076704,1367699723044772,7867289030074694,7193039224375206,8482553776723882,1411562183321517,3353518872332206,526425556840093,3942606670972849,3532119970224050,2326474255755188,1420415050020789,5888716618704822,9196123179321953,8104617108215736,1350281300930207,2707290026870716,6817861404324853,7099137001969602,2263586660612036,1285144604825541,2025746269927368,5978794435033034,5711034633287629,2751890801645518,2513275657722041,8649394277585912,8889762527702156,2843456650639316,2848176503183317,8904375767902980,742449454393303,3266269268387800,9197956372912551,4756206974506970,6050162097899483,4284250642315233,5924979399384059,1830268693993444,1379547584071404,7958237890115892,8009831577100785,1501840430117884,8398671374415850,8992257804410303,8884338078849004,4616502799477236,4726650901227502,4918012979737597,4141210681509872,987105269848049,3309153399130101,6572476717303798,3213988571539449,5221164721529855,8744065506162346,3970807947683838,1113547510077440,8048213154560002,3761600094219947,7352562116380613,9203373353111806,5707762488350730,8775685911277911,1714180404283407,2562578271266832,8405880525875218,4215671249811475,7616506808324348,6978571046463512,5691257654103044,2039697840715802,5170477133153893,7685344253958174,5754686370494109,4765362600928944,5101683099736098,8027753902708771,1158716490930212,6687740656830501,5561586553339569,1027100588271656,4669780111865897,6060172696057898,6888802582865964,9204064322864965,5138977312765444,2167242595203119,4181281779263537,2651809316853810,3082684337973299,259088076671028,8462131047278645,2935382216684553,1366139758544952,4091243956815929,4795426756147258,5950527330869599,1896705421674557,7011131767310762,3892371598989377,6041958250575939,2172287414552644,6153948080058038,6082291677947974,8932915527732192,4553790569252939,8486090814467180,9047481075304526,8559236026021967,8527649202526289,7352469028656306,7039665049380947,5313636444859406,8534307831682020,4320986050725976,5370976620489060,8530457979066689,7986810274920541,8445169186490623,1808907691685984,1687121972496481,3422844413151330,4445653405824699,349767623575653,6799630358825063,8264433517862588,5676954615998930,6592237653317740,5824356341717102,9074573824315647,7567615698804930,7372756740577394,4765676198175763,2825296883447925,1185845922855031,233296489277561,4826799375718524,6991461334364522,1108166494080021,4804672276785281,7489510163736939,6722901807712388,4846312142272645,5942866442619014,5115208205547201,3554172356249736,6364092936832023,3889415131871372,3634597400467599,5202817753598098,8211045209267886,4365581199710357,2614697878718614,6724075959686169,861763781830808,7123070194403481,6286699777628314,7587082163288037,5487175665236125,7378306770819230,7642586415323936,6641155958077808,6348907705216027,2509715549919396,7836289669525873,9182545715384894,887433673881770,3738568221599915,507915443189932,6463112871925935,6166747151939761,27141746342066,8143505977179893,438854574541963,1110463687231669,5442997139765430,1667965263247545,5051432539269306,1337578450090171,7866375711778317,7237325245337973,1280168115413774,1024116778875076,2410983203030959,1592599533574342,5941127891773639,5946533100351180,5968194737445853,3332031864527052,1574712798197965,871928416692430,248830120397008,7227310839314641,1585091358386389,171696315934934,8216227390351237,124408420690137,9138445020641545,5995058603178206,2325350755879136,2302143995115746,4650726365129083,5573572253900134,8677404261345510,6161629748783336,7756367489771753,5431843803654378,6907437044057248,3384681920227564,6291118634244334,2729012306712815,6218036404041968,4528338812834856,3734908231985394,752953043015924,5583335211153654,9202268699002920,6294159053277434,7423169727770483,2616708825090300,5394532950534398,4221618855090431,1270621240174851,7949556095600901,7358445198547209,1525562526492942,4823682473445647,5580631435856144,1583069890320661,472429909944599,7803048901239172,392370112142383,4140323289708828,5586098873485597,8168079143819653,775825801107746,4936040132552997,4300140535437606,956794137753897,5220476694546730,5416007709731115,3408425625962796,309739075521586,1817302344161584,8498804388745608,3872857876166963,418142356576564,159311917533494,2312878396041528,3912286671615028,8432821866570514,1999653908166971,8386241549871420,3776412219984190,970094454397247,3671439528499520,2274746986338625,7661250562885728,8718820209599542,5526812130138438,2137165687535943,7431593957501258,3552450997041483,5719676001142498,9120110479075663,4414307818707282,8036829034228052,8724133974849252,3950002242062682,386621431482715,8644919563745805,4990114287917405,2435995871201630,2589398439520608,8495035540960680,2469283444599140,5661504645400977,4829792934091113,6616110992083307,7977902631756178,94292632250736,4766337389369713,483348184811890,8017526242617715,2408363197917556,3540445101472117,3795755017271670,4369132900235639,5476843305777528,2731487272651131,3858224035027324,6982513958424533,4483687460215168,7121638815020787,5271087950494085,5367454651591046,2495673317636489,2916591282014603,5940203619654028,6311380195694991,1363472823179665,8327599730018706,2812677611379091,6816140684577172,4051631205779863,950230135011738,1468435389131163,6337274644904348,4886868911864222,417183285987744,5426707122600356,3066520441915813,4623754979346854,7053276770107121,7509413864855976,5161774997412266,198176128092587,2087057658268076,585844926888365,6408366099364270,6838508322437553,7922745855910140,4112215828220339,4974879756798388,4603016361605558,4810915518237111,6187809768630712,6258783638895785,5924556079905210,7223336853350844,5735395064302013,2855474670840254,5448333877590463,5340323227027905,6742509007600715,8231564070405901,8646895613981820,3282079768381895,7537762956503496,2596002053130697,4719003487095243,5445580157196750,266747475753425,1668596037745106,3757165922705827,8555340185356757,8324706907900613,6983832037444056,5783914855246244,190599583623642,8333886829919311,3156480916105693,4313903103881637,5617553253758826,1206109020850657,8238920846854566,4664960338958822,636729285540945,8123509697168382,3790555233065450,6917971709200875,3875843314616813,7542096303740669,1740395278342643,2399109144087028,2458019191831029,2752423935891959,7578878632417785,5903292757744122,4026157818993147,6859671838925226,898355044186622,7971484046609541,5565350668760832,4146001591927211,5506034138503685,2591314194680326,9184864644744961,5567207935199752,7543300918315436,7716721045510667,3301669530810893,3933430968146447,6078758054567281,2423211172870677,1212670612032022,8913282277275219,4011465562278425,3819282607995418,1337823682935323,4572260837272094,5552651826269983,8398190895329614,5147489034471970,1969003266570787,7175224400443940,929969753369125,6391604629121578,8142596272331308,2033030565452334,1808464570083889,1271152529340978,8603154222869044,546390065056310,3421175480810039,442379340315192,313805160671801,8782668410220533,2818908710349372,2341627452978954,7930928405002814,2518288437807679,2956187255855680,1156936765056096,8055559338871362,9168096297381430,116289689660513,5026028643122776,2409861074473399,5223914490829391,2332159970220693,4913061698824785,8021531636894290,4368264860752467,1887627906882134,6407545686026840,468082959264345,6733530985728602,619756558154332,7293683406904162,6849433991193701,8948110112991840,5746232861780577,2756148829149794,6082723240413795,7254842316319332,4810411704371813,2917966323538534,1738701129210471,3210185838369384,1327617093048938,1763833688373868,7266068570217069,6372087985805936,4794614070168177,7040810196118130,5144875337206388,2874305858943422,7685377066969718,7569060977110121,2213129570848532,2247728248306298,76713886034558,8379883779332735,2849656995314305,8674328407850091,165792636480134,4642843437996679,3713280205748872,7499942705728137,6023516580028429,4506490715709890,4298157106822269,1440086161402512,3556170538121875,2450608614533781,5173117748348697,7548975815707291,1753308552137375,8510668751457623,1161495065754275,4483026856942244,6268954209479333,2827861308312231,8200159383064348,5228270315645610,4615150062750380,6053610728696946,7717829201204369,1537020432648880,7755102393884502,6098876790831795,5742859995253428,7747804385140471,1030863354604216,7584569400147060,6981729297519914,785842719842079,5494527504734908,9116165232921278,1874956623407807,4552055457790656,4724731890605856,4980091908082371,696766285662917,6799595395192133,1308079881551649,268748182387402,1850941908679371,1874542107503308,3580903455144653,4328922121485006,1604112006613713,8610160831974098,5497315871468243,7570999364389588,8605976960895438,23555715885782,8547389958967076,4849657711811290,2719661363231451,6853818491443933,1004403388656351,2844485372875795,7925085763300068,1002750953623334,3915472784263910,4279881745844689,5040395774366296,2114661762763497,2320997905608487,2017863976585964,4192794161777106,6943981820680942,1733488330992367,8650657958124274,314449369471731,5990363720530686,4085094571961077,5396793497098998,2319049604805076,3202400544324347,3069234671311613,2934130909580030,9005202054068992,1249140625378049,8790794176916631,3862595997907716,4479140437973766,4013893797030663,3224023476960008,8975008361441751,8625386877098765,8836870118505158,5675704077210423,8992603408346365,8654212608976574,4054825354459926,7665939473291737,1347659037780763,9223118495385181,4746402769931397,2023409032137504,6717357464484346,1672690280184610,5364423909433339,3243666353441572,4438151487247494,7929412095559473,2217824728075048,7018641336748842,5185292997025691,4990934060489517,1278839460809518,1021838098774831,1021639750908720,7707589327869064,5411906025092740,8618750260307763,1703437916199732,6691631711775541,8268762812580208,3715464516467511,3858229711407928,5250346004804468,3385759904131899,7228366762040125,2193889836206911,3582366510873409,7006477861972802,875134964763787,6493199051918148,3541206393355077,2332595734174534,2557471253289799,6969224908585800,767973926198089,3829536338807628,5118767765834574,9076589951530744,7524023027604304,7057537721630520,2722975644081312,1035348009397075,7153042163025074,54928807149369,1535759823027033,3839830780943195,582275162127199,1613625605184352,1967900217355105,1929741658729314,7399478461767483,6670861739383652,1355693212068709,3387950719650663,7421189107424106,4485906862390123,6398465238080365,5192118225382254,2959350548499311,3960985728187248,3195488200716776,5852598555277118,7171691819395958,5452767111498616,8938620010911809,5027736341551093,985203252116348,3320900876696445,3032025711852414,2686544187808642,3676005960022917,9026192641616774,6153576337371628,419966752631691,606812680768397,6245168367201167,4255110086353037,6833986613242769,3735719011408786,6484820882770838,7079276935305615,6391854740568990,5630273200682821,1833417472609184,75700895850992,1933040317668259,2516513634028452,3703190419827622,1646305274637223,3758221620808616,4764367314893737,7761554913336234,8754244360756140,7200669157685402,2258474097707950,5088733429664688,7445570533627963,7668213434440627,5329499696528308,3704892020370357,5799352963368777,7501546713299896,4074839805716980,924337930096207,2269985197005983,3223034165546826,7302732293254078,5132426954926581,8033248447320961,1093706599324609,4703163501472709,2135096604875718,3289192022973385,6142639110024139,100178539101135,6254271104413528,3005312060169169,1647118845643731,4497569962052564,5412811201063896,3151103808181412,7482085523734351,5973120922098652,2251884510464989,5790268325641182,3496543980542943,4413914210728928,6946980199036759,7807023889402851,8344953922283345,6117974944136169,2564931009789095,8776679386799087,4771915571612657,5067014384078675,2281558473473012,7630912924212213,1145125463956471,8425155291761656,1434897867447289,2830259086277627,4260932176202748,6026699978048151,8046903434229589,5875883351747584,4762751895985153,7134056542165855,1911117743246339,1407734237912068,4035769082387461,7832780204751361,4107344791612424,7958635627392172,2868199030500362,6506436218615639,1709208928259084,2494415491640334,7330181486482605,4368193544776721,3156944276864018,3326614806453267,1178572981144597,8737311327037695,3067617749310490,805332733234351,5682351946484887,5426883999288039,1616248529153055,8755977848294029,8485547671291596,700059310672934,1355565657226279,2915178544995369,9149955693775915,5951537149328562,1951801563728943,7910855219076144,7457896014220337,4670046822136882,6910292243573939,4004088876922718,7317037294844983,216708626754616,7620211855539257,4546673823771707,4152442747800638,4230534457396287,8442323623131737,4922802361003079,1612636636714015,5942065384086603,4650047259597900,4226025292930125,3305961102863438,4767266858314831,3132682207292497,3137020839906387,8888318446984276,3959220638104661,4728085340953686,2215280247524439,7747383978789978,1991694675922013,2772284167605343,4773995158363233,5873398543133794,7255355172027579,1154625347894374,7392982413843561,5288382662827114,1849189836049515,4338663515134290,6816443819904109,5324358032551022,4017632119000178,5524139219074163,1255209853791348,7339193896830773,7114616997158006,2341001259207800,2346698706320505,4438518309526653,1262366023195776,4967956567465089,6033477696003203,3407417032890902,2526240495254663,8905100871027849,6820507053972618,1786784236170379,7962449713306220,7627974237867202,4018724785429646,4893064095313040,5505189555469459,4039708618955924,5420519881276565,5384659971673238,5054421719249433,4772316598254744,6251498761466295,481883942840175,4762031577498138,5788626177394805,17551373616191,1518556890623136,8426313691556379,8245287469210789,4162981813779623,2167512983407785,2624878766120106,517330267815754,2230434136562863,9040259016362470,1361225577573554,6164115505409907,1199755153304757,4871721899465911,8688632851627192,1335701699607739,6117684355693757,8077700732685503,6984789661944611,5274495159024834,532224739114182,8501902506724551,2391614908888951,6975930551434444,5551596145208530,3827295790337235,1104080838638807,2747225172085976,7206166905503411,8898041383738587,2940092630809820,8181072562001786,1354419926207710,5318644423166501,5840654394674400,901931471834337,6858062779555707,8805934872616168,6001872670227689,2966844382108906,3260711832345837,6360859184483486,7007797886193533,5256173091007728,4593429204483313,6110625273466067,1018355523411192,7268794764750076,6941755272064866,895399681539329,8854351558372610,5413068254633220,2045576691854597,2259632172825864,3488372777296428,7454634398513404,1323381410139351,6655041574092674,2169218424245518,5909444756462808,6568326263744387,6573178773535278,3810328094993686,1441167748644119,84064412864388,7105582433646484,8439847584426235,3346276047021274,4445469137632542,6435137973929861,5563605173345570,7545041443454243,6750851599924516,6002518857215269,4938254385265959,6719064569552170,5859404947406123,1825093361945900,2994454008158770,1956939094953262,3456378584522031,7363470578285873,1922264350502195,1197963051541675,3148897366994230,1526388199669049,2109825994698043,7523497609699210,3965288345267519,6014145374969152,2616447217909057,23956976762763,4364710580399434,3308465573850446,7074722524225421,4581979074080080,8509392281324262,6939178355866962,8478987444325716,4259525210180616,6353341513100631,6750112766491992,443275948871001,663550836070287,6664010515355359,1465627109756253,3262376948747614,4769816767098207,7569391397436768,4294068497886562,4274823311166822,4157948689913745,3951148041963291,9048025571917161,7526797688869349,3743961606118764,4804041580690799,4192581360332145,6844714864541587,3020314390764917,7917771061107945,320800131693944,2943776093321108,8818855874407802,6373238951857531,4685739954195839,9083574064996861,6472427671228288,5740758977031556,5795137764646831,1930759754111553,1153526756527497,4524069248241035,1296529575858754,3296402779852174,6357473946896820,9065139632741776,4159521219222929,3365541559217554,2132734055665043,448962290097556,3113226145811862,7394559187953561,6227358377586073,2513707624910234,5510891111339247,3678108274559874,4384444165534822,3527308810683320,6781179540163824,4934420991774114,1285226976702363,6167372250939378,4005664091823528,5858810105137573,6951728823145031,5581874784452012,2474177960075165,5912602551437850,2060709803594312,3461011284749746,6608254712237299,5829571994764557,4135426915290549,769954764926391,7984135389022111,3209700985683389,7980786240508175,4770329940483519,5051031092256192,6845439856826955,5264407669386965,5342238240909217,4326387855506888,6240403862388169,95335672892874,2861041144780023,4538330229997004,5749942729657806,4083749572492751,4439837726354680,341666494353315,7115565510267391,2055835598859733,6269258288094679,6683574890925532,4415864036130272,7454968044588513,8686045525592335,8578077332831717,5838923403099623,3544375496805865,3225933434121706,7778635003461543,2530027634101740,4212630335229282,7515785737981181,3441475510943216,7595105359707634,1830914225229302,5615689609387511,3388481852759544,7596731119771129,2493282781261307,8300249861066236,4364323455303165,1665008270048766,1585465219251711,8916998892338689,5563878505651714,1205148966280707,8311019152317956,32603191963564,8775722629387739,289412741225997,3727059167776273,7728415271490819,6274788398992916,5648553106906646,512562265217625,3512032577594001,6543550232460548,4820800956558874,2338003281677851,7746018193678938,8794616942453649,5896561533201953,673908089802275,8416499520380454,504842659335720,6481777437923932,2545902301273643,65617729843018,363600372848562,3412193769311791,1632545932299825,2255271338167862,492909452725815,4678364545187384,169624182697529,7929349078771294,8814854711972332,299021510237758,4664309204082239,2633509876997698,806540983549507,219127232708164,2750369727553093,8568508094717510,6652035869015623,4254545242783286,2788599090376268,4563477645695586,1124632343461454,3069854451662415,3004507690637973,8774051203846072,4293554709216850,5483969637555796,3122332251553365,1283101839867479,4181741017120344,7154918652243958,7886132860011590,6034785516539486,8789761698894437,1526039318580833,8348394730450875,7700732237851145,2392544648101477,3193706453044838,7510868637162769,8194824533876331,6704889315121490,1368887603125870,1764571529379439,832385482837616,3744877234597490,4088495394184820,8763922766160948,7578470472863351,1405023982632569,7633780669603451,1594814692912764,3254156206685824,7088784588988352,2833087346273922,1223282148925061,2211096632368775,7942824813963784,2560178100641047,7501428243299980,2012301316677261,8950452669456373,8153489318837903,5417276690014869,5694163690438290,376057577697219,5531389097143630,2943288050044565,6185492340510358,5287645478767897,2115046591520408,3670484071759513,8519892691163288,3037301542633117,9008409451359902,2157929031679647,8206673693474466,7495193030954660,874060810997413,1458939511156390,6000046121878129,2063904110392604,5474448204193450,2959250607480491,7783436286160192,6349307440250205,6982012547558134,2366122170656712,4963030464041587,4277335625461429,5333487387721398,491199959981751,1214229549227707,1997508214632124,826975585942133,5824178611957440,8838840152329922,909687392632515,1950351940048555,5964728254013127,6771221685192572,8280827669062263,4502701244829388,6098480370712269,6848926219890382,3688537180270287,9014023793106641,9214166088328002,1156577842927566,1631481276104406,8506062973629049,8259532203304462,2894408820752093,823611825934046,5141654754672352,4724108893925089,8843712291188450,1981154059288291,5450391152627428,5823914545077990,4551215811366631,7621804322944096,4556057587601132,2498401103564525,3389100120874734,3795028387798767,5163840132648688,2885374227427057,2707745248689909,6930999493076265,7824529303595210,2384313132466132,8732822431732790,4580622250784042,1616057056259838,4724566596288255,7567334930103595,2203909323521797,4206599056973574,4753004304333441,4625536036531231,7323538908970284,2431147396931338,9201102619219927,9141465723109436,1419959991936984,245157799366419,3156079150759700,5593545597857557,5608714533949206,6695301922022877,3894385258729243,1312909406818076,8127598629312474,4753827992887070,2744473906118431,2809718767484704,4719429313871649,6418089280867723,970940221091620,7046263851764358,3148514413817638,1206628672783665,7877467250249514,7618519342976606,5510329357668148,517477273235253,9026220777570102,6823609602121527,4111711852744504,1953999342060852,2133746750881594,7115670618435387,8976303730622268,2141153230466880,6393962549382978,2777956427972420,632723652775754,7261274080976438,5506106076471117,5943804311894669,6817611207663441,8583974846336850,4225686076387155,9006213841505390,6608967962619734,5442495340777304,2428235422771172,2281330396372826,5148980250990256,8050449943611387,2016164553764703,2169066504840535,1693082404291748,4162564648951652,7513131209846629,449954328588135,8955759719473001,7172331857149805,819228047714963,2932142013607796,2019325732740981,275037120221046,1801275206256617,3255111532879737,5647534168772475,3509864058867581,497551098572671,3686978483403551,2073715707596673,496814813028226,4211982679515012,6221362529099655,8611121204056701,7282706113200010,4011387404033931,558735877332876,6581963536019371,5915842324615054,3112190251462546,6230844835953987,2181081730658196,8827803687770094,4587953117122457,4514245792812955,298150060019612,1025475811135389,6320593105067935,2948535438196643,7965610324332453,5983240135415793,7113193072824234,2605011208343467,4606987865481132,1308060898893741,1756687539404719,768617718185904,8649348406275586,1610373911846835,2375382411513780,6931880560750517,4628680223539126,2681841310609335,57980449935288,8091840416174010,2779551068544955,8949696555437386,3917053492559807,6515951171614089,1980568214822849,7130411148574658,1056815373995971,9062974627829400,3417344214880197,3949406079369159,5578012417638346,1177183468310475,892684572200909,1130056091934672,8911890218514485,2508983603584979,2702174834597844,2153136934395861,3076244208144327,7473863764054009,3234906712772568,4020199739027417,7998964700604762,3770546504679392,5003977362132304,2764657354948603,3405103093370854,2438746107822056,8659205105741316,8549586904743920,5482593250418674,8520891560951836,611156861902846,5444527118203717,3641510570831863,6480735812289876,5314744005980154,3490271597518843,1812744655888381,2736078835449854,8540540802686975],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/38cf0b7d644963ee846734251e9c0175",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000154845.1/GCA_000154845.1_ASM15484v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"DS981516.1 Bacteroides coprocola DSM 17136 Scfld_02_89 genomic scaffold, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,7,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,18,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,19,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,5,1,1,1,1,1,1,1,1,1,2,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"38cf0b7d644963ee846734251e9c0175\",\"mins\":[4341350940020736,2904240466595256,903991816167432,929060540555273,4326320860200970,2343703698309131,6877219347718157,2957868325040146,71787816943635,2657902153969379,3499889192204293,5592930702360608,7507437180354594,1190301406377307,5130943283445796,6842830479927302,6806207871365159,2491236046082089,929834754699306,8748345587052591,552758356344881,5444804900722697,2568432592478264,435750367379513,819407484870714,7098332435851626,1653158061588543,6387737606312001,2354008700035138,659409861906500,9218878043115590,3476565311001631,3215492842278985,1437273751969867,7589214661181521,7232035001303122,6702538617761875,6041517822476372,8646927725510745,7865180891668572,3897564796108894,3669542580585829,5124163581075553,5407610642931811,3994759082471524,5184145868767333,8044073305309286,3812802781872231,173441347088490,5574668961976338,80343392571502,8385467431944303,9156037121538415,1724745205137427,1036618528252020,7165789749289662,1336886043168887,805972213657720,8242395581799550,2460925498515580,1629220688990334,7163554258005564,706556309651586,370481994694787,2094296457060485,5075401326424198,3175203548356746,4957459328372875,8169803707969677,8844029880348814,860155906265231,5965918227271825,555372892229780,406227473665390,6722329772929174,7111766615296025,5414827832807577,1650513396469915,3530949089345692,4723924038588442,7995560000174002,270199683768481,6191069496918178,7867294909309091,6181519163847190,8233415606550698,620579260657835,3902073949884588,2865259563081901,5227965362675887,3804369619106504,6818459740352690,9078341923213484,4164083052142772,3010534991118523,6195463242313917,7337392128537721,7444589801984195,103514888761540,3450354129989829,763493576949959,8435057008554186,5778183426019534,2662835867087055,5508168759759056,3931398207234258,5073393813893331,5465979698335956,7093616132337877,4326459153510615,2311501008494808,1748847241695449,2191239806566618,2532015557423323,6168726844235130,1255449490342112,9103471637307618,5791774000664804,8305173487943910,5332283322679529,7476751818223851,6424191548342508,451114019692787,2081633884119284,825688105255157,4977602148376823,5824324355215608,3667205635678458,6599122065519999,8965314590109738,1873124965875966,5002935206097151,965175566554496,7062883106223934,2655763226038533,5628731863695622,8335703476461832,4730948471484681,6678902695682315,1257846275973389,4149678401667342,2052653776126227,2670962257211668,908473159483669,8701102257962642,7944502026982105,5280861211586840,8348472256147739,8886404415590684,3108330704417055,1021773643129121,7375406261080354,8580845045451483,2944581374696838,3584943634952487,6219671752659240,1182691516305707,5177317336961324,7746910462918957,7436911344738868,2166264145596720,9107871249842481,7982026625566739,644001437700405,1519498543911222,3172240472973624,5788993208959289,5972817282289978,7801456083603772,6634027968176445,4295947807514944,5863121023807809,7181100137659787,1962472166863172,5558155207672133,8682044884962465,689313376792906,7451494656741709,3144877943480654,4290064938124685,3556652216668899,828493013930324,5160540424667477,498196240544092,8153307973972317,5928401656361312,2536318441505121,6643729269604706,7708066619433315,4340879504240998,2127124233282136,8532170429726780,8970891727688423,6745342387071216,2999605622092143,1806176293237104,6392357086855537,3369073127330163,3984843724755318,1863454887100791,8028794395718009,8852378019305478,8066040198148475,6156115170111871,8340089845926768,4413794077122948,191260028080517,1144435033870727,2213397433241994,1367477718430091,1782590568280463,8027785045711980,5494058555675026,1296622117122451,6128052890472853,6826254568362396,6157808130015646,3760873026142623,3901455355802018,1407749189734820,1198090442326439,5788374437601704,5599746389823913,1508314454266282,7992013194050912,1840623531504044,3843773699756461,6895298956341678,9116226600190384,6887483787931837,6620613894218163,7409356467066270,8683923383907823,8128543757550010,3112786876397346,5317146531705279,7245015973712320,559729325265346,7209977426442315,4889161291555271,3436283361468874,6219251398886135,1901818317529550,1160652413043151,363445712835028,8003218208571861,8283060983220985,11449357947353,2484701638484442,8474967534797277,4577837418234335,7417188318745059,8987715530534506,3257794833281512,1337458324353514,1117359366779371,2580111382852079,3129989094248944,2106088960066033,322406574690803,7774239484453365,8018517206467062,7021720691266039,3949561340461560,2252112546103804,573839346364926,252450007536128,382451595047426,5048680817455619,2755771510649350,7573507125887745,1763097327440392,7103119807123979,5271756299186700,12205703923117,5066265552859664,6737628514103825,1876285360386579,2075320625017364,5003080149852693,1366392650543638,2990404524769815,3738191730516517,4815558341362214,4266700430484007,1396977116500522,8931728714076716,213203514884653,6783262540288304,4477444161491506,3546993204109876,7007554992022072,641608847884857,4838729228296762,6084001455872095,4641311949859594,3663695178371648,5733903106269761,996642066485827,7138473281425505,8227963697341005,8792599479194190,1129680932703672,2331721504027224,3908514174808665,6229991059313242,2771801752674908,8328017306624607,321748061354586,2171638493270630,4534864812245095,3175517817504364,1760478167986799,1714207417332337,1358053892821618,4833725766218355,6659913167377017,4977559029338748,2900366195829540,5600199035843199,3734713613060203,7718824016145683,9183854998151814,8301325883758931,456690063708812,6595163943837805,5689813629317776,8980570444808302,4718384847193540,4480564832721007,4559285907211034,3518877356941983,7911157980099234,5587105285661353,4535004692816554,915771837662663,4614009956819633,5963448073425011,1654928710959796,7663017727615673,1140147840627389,2210072506176190,8129641458468851,25334730425025,3266383820657346,7985031637193411,5158956618384070,2745588180349642,1368971912522530,3862027829736142,522896520766160,2447451210289272,4623033279075027,19086195798743,2711545355145945,4860120944763612,6912715048585338,8643125676720862,6788197504973605,377161244422880,2779532822168291,7643705107180461,8327398690061777,6439244569137896,5904010940011244,2371996942777810,8030157204570920,417372740469490,1112627474174707,3829554465919732,7416920646988376,1347316657910519,89055919276797,4357479347249918,6917078514201345,5814046859727618,7225379079478205,1781259347008087,6826676517212941,9003838920160045,7998288486111712,220320319697681,2169252875198595,2610464193823514,3509512851170077,8550240810534834,4513206999085857,5700265497494309,5061493943890726,6235044954809127,4506468280390440,2902502824084956,7228978259601543,6305818500510508,7347690808233785,8213340169719261,8728783807047816,7450131607330971,1919918582592310,2927723621290808,6900735424598843,6339521555956540,2900100845155134,7458250757323573,45158622683969,8201339007560647,7263837857130635,4435279603495748,2330278210028360,1737620634841932,2940025688011598,5899635663389519,4213626055398224,1886793262375736,8505004514038610,110179975242580,5498211889922901,9091929955029847,6426340997395288,1045521720820571,7233553212015453,5171046330798943,9217318470449122,5978780009255780,2201118117368678,4064203833418600,783473974465386,6432394137633645,684799640175471,6916182172042097,496849218249586,8344703527139922,353528204759925,7520341284076273,6175110736044920,176482604663673,9109049004024639,3630767769092988,8827648300475261,7356026590087317,5305889551127426,846688998323075,3251322668086148,4978634991289222,3106888707785607,8573338036027746,7460500125836175,7951482214957968,1643637717971857,335670512055186,4973527101745305,4511914534125039,2087023268680604,6975335471926042,6029206214304671,3748381350921120,1625097460728737,4401518493610915,1005586023183276,8029098743853998,2825488060707765,949240374850486,4453383033626040,1405768601072568,4930683875398586,5395834630379679,4642234304828350,3876904384324543,5250859587716033,3241156928598979,3142712862294980,2654516438283205,8461888325963937,5164874256544712,8729586543634999,3845485455643596,3377959818642383,6206918886933456,3414886741754835,2065437607678934,8830595335144407,5236064006697944,3291420623070169,1259480663163866,631858851759610,9177319898080225,562993449117616,9160048241460196,9186390870503645,1275261818110952,4434332822253052,8020164320601068,6964385852881746,4519303829050351,577129583719408,2194051165320178,1049323837584371,5593097267000308,8151467979973997,3331364358341460,6458107005621248,1971201000965121,3289927788700674,188521073775620,7372444327359493,3431264712823814,8299878166025223,7036211246928904,3399420423607305,3014510431429642,3524832563520523,712929652302861,4147264151278606,2222455533679631,8808745519105040,1220473175598098,6792920672175127,8991501408310296,6487720009585690,6727459658103537,5595849747461148,6615967344776221,4343699540358175,8412966987047968,2689922214691878,8066591034278065,7998577616870236,4124741523104810,8230994382091783,8521324650760839,8762731862709085,2357520183653425,6790225747815945,3233923240376500,5624842893788218,2142860565042235,6981888915387380,8019958253417534,3778685377541183,7329723573189472,1956669896447042,3741914511629835,6101574943278149,7988244506035272,5218657890100297,8778250951697483,1810748593865807,5324895759357008,2541991800229767,8724274748359765,7524846803473499,4803417807762526,6243813680956511,2388619738362976,8788243997470224,3161546511852642,5564235631055718,5024219216122982,7159382369510503,9056661492249704,5753065739064426,4720767925314667,3877081423393900,2451368325678189,4735477266891886,3073501980681327,5866451784754288,2884246888989809,3686594185784169,4969141350127124,1784838602798202,7213023318971515,5805290055042172,7846344572175489,4653847876797570,5223770527511683,1142065140188292,2829578951906437,5057661121086598,6062084407542920,7840052002024151,319754711176045,3625561815405714,7497344946369684,8727911680099478,3836545517577367,6754497542792344,1152300795638941,7525948099409054,5730029672903841,6115654478189730,988395676890276,2974945859191974,8068676372755625,8239658130134186,3194983577748651,7236082392499372,3972312546259826,3888122510771375,2283992773620915,2829985935144478,3747160886867126,2870376898761911,8477897881063678,8748511966068255,4153585616643261,2142438697255797,1155807909506571,8790099163077341,1982898856367302,5415174880593096,6405699373057226,7760534729754382,3227954970830032,6556610181600120,8987094753644067,5177625670161621,4034129886549207,7601625178698968,6541014285693135,7894139260261597,2004744818685150,5723596451292384,5337797606085858,943142657688803,3557534335513829,308571825087718,9216588641060071,3866343628715240,8087046756185321,3626233852749036,6176977462330605,300770266477807,2622431053645040,7121253758612721,3867313204708598,7921131326854392,7517231931778297,5626960794756348,6674271507891458,1240120649078020,6981511515228374,863121461334231,7781410862281996,8037115726910338,4850909135840131,2030577769661717,4812119561889046,2542996356532790,4073824661460528,9185131069995156,6585458393465051,3929231035323684,1156834564175142,8822942186710311,7935576913806632,7556941971461417,8682906900804906,741885734233388,1713542183523631,4909063686456625,3659934676362548,462347712095542,440667556693311,8313008559959912,3670655569597763,2835037962044744,1669329192180620,551522513155403,8312439108592974,533309366818130,8397846129707017,145149809059157,3228073626641753,5295555772065114,6161951757129051,5143486575879518,6901813739582817,5579379071526242,2219360982488635,4729576811645158,3802171888166248,293379787859305,6289364647716204,1520593829233554,1186116023653745,4891217644328306,3420293829834099,3767895282025844,6328503617459574,7205565364992560,8211978407355768,2887008945716116,6043501290440063,4293164169692544,9186455808742785,3651901596902787,1054583169189254,3461743522887047,546085521831306,3597931482150283,2884478223271308,6375528709957005,8074541260768657,3390585750714247,4588514312402326,4821310005876119,3046538254501272,3861210186339742,8768242882053701,6528604543657377,8073948736019002,1718904293639589,7906284433929640,169633357366855,1320477441467820,5765622919554477,7524408308753838,8934066452317021,2349236005283252,6521955932128693,4574343774062007,2665687490946488,3776665109296571,3163734405633468,3347710845363648,435635161606114,6241654374299076,538847594366405,4519525696767431,789859611051465,4067497081959882,608430142408139,8858432022661832,9018671649187277,883587189306835,5001142636619228,4585625676239098,8099263787922913,7537641079365201,1190841848784361,7627483838929831,7894907485108464,4315929198142958,3661182901757423,7477913148500904,4091057454097908,4026398131594741,3796819773167098,8495971783845371,1754068727150077,7443501451171328,5365357824525825,3221469574305282,3078152441964035,6895964225162950,408887455557126,5237481992403201,860482856936969,8197804589749774,139007622634413,1957508146148884,7299815437288985,15663312868891,1572249781794333,6078032291218974,278206514918943,832508659525152,5433852020442657,4469030163482147,6953889766147620,3358963058599461,4552865872733734,5220151738751754,4265243698669098,3101588146730540,4424722214819376,1567923537540657,7329255069234738,1456541103433267,1749345483450633,463915572065849,6113872645269051,1950482873091644,5146631469016639,3339147346769476,4961781716334149,4905611990062663,7873168747038282,5223416473070702,7643315778766414,994472133366712,2155875843110482,8623481434797667,1305374418777685,8314447070881367,1181294872960612,8120299276118298,8064925570963035,1576891902866362,9111130347349599,2331220260197986,2066579937579963,6694920127375378,8315361829193319,9172483262613096,3663127641753193,3637969566082668,4901357137905261,2845577325635183,1111313112360560,7279267076560499,2444311396316790,5316552394802808,3844126313034004,4358371048954660,7341712349161084,1974115606644349,8277429109450609,5033516368152194,3905979752851080,3293686141642377,1183720103548554,4575417974752908,5791065867957902,6578176362493585,3368904575504896,4855642510100119,1139408837318296,4688112989853341,2652916309046213,2246627858163312,5139872651773602,8151333550717498,1901206375096298,658474829383336,5867898664289961,7666658401281706,7607397970826923,5713504747808429,6747098348164786,4495451299146580,7038737741829812,4773705533548213,4407998300313271,6674201850373816,2636108872476345,8123745932363450,7748145822807739,1234662351353537,4886620565599939,8584242451689960,7542694856177350,6995243473387127,5354110253078220,8959295877270477,8658116449494736,1533551280252631,8513698895467471,1489765364258524,343854835512954,4404150358587107,3608401574463209,364806646122219,3613536047601390,5575482004219634,7068872650995443,6700193415087864,8973248404212272,1608802792003323,1913470458013436,3984189615101694,4276819598563072,4051533870212866,2521751090263811,6131844505118468,3151115438860678,7434596994313857,8083675296646920,3818686261626498,6673806911286593,90997535872783,3719123173193489,8256247582010005,372021303154453,9086767720482583,7636894645397272,4791427599283998,4280772693034784,5854228307719969,4730393901999837,4808218637707043,8224665599612708,579414731298603,6471668936116012,1706639559915309,5321340973463342,7648382959474480,6592920749219464,4718563941156659,2418626034083636,8646055998424885,4528434212529974,8638824691074697,6369922386724664,6057800209701941,2114186992129850,7496154451060539,1535198470203198,308607853725503,7115025971394368,749241698838337,1127092732046987,469217816385348,612822277416777,6780465248633786,1144239611262798,202713031804751,5814228264818512,8612710758846094,366852886331705,5335416424421209,5211708870997850,8594741327752847,3883191986521948,6108155281872733,7248680182929246,6779295348963169,8961784527206242,1187978814437226,4689612975464082,5512343491397488,4269369364116456,7515416575182707,933014151178100,7659132387182455,5125358373459832,3114531314685818,7159030163814270,2507751352864657,2049542695298951,6745706768557960,5823483641333642,1583955504871308,5257828628879246,3277341568665488,7965111148926866,1357657046546324,8251975170028419,3421626030659479,1825420398970776,5991953406650265,5748508479068491,1159204487325596,5719653661448093,5584930445789087,3845013950505968,1558511353800613,6487655700527021,6690733310205597,1155737401528006,1800607188162481,4741228630894514,348717362853817,7378416170690490,5790481998940091,5007172411421002,6528102813844289,6940001482381247,9138506586226788,4844829430409547,5143418756794308,4903620815022032,5909640735991762,429609669142483,8176088165319938,7663018555597134,8053527739660246,976186845686777,1805369649575897,2617733211113434,8350713731184605,8996452813686752,7573952231309038,5043371716892642,8893499615010730,6117687723313125,5839665644481762,8380658361513964,6346615885764591,7338134322701992,7957856125466610,2366762270877683,7649844456269814,8114690802906793,2117524356446200,6926907028817913,5354765161875453,3325427159631870,2060983712253957,4908789760239622,1929603969587208,560147344799753,7174749267060748,6560398562658319,5649594631620624,2714564721436690,3850230682130451,6880185216513028,4674877996877850,2150283355215899,3950277696161820,1902834912581978,7536139468404767,8505194667726881,7795445466429068,7530975678146598,3132415239536988,3267848343066667,2721067220121644,4717078581733423,4855121030244402,5461250217535539,3426075227002933,2251582921421833,6681604162938942,658522118526645,7132705439451024,9127991232759873,2074116866197571,6681211353774149,3474564511258699,1749544265787469,6872960279221143,924620563235854,4141980118898775,7006803207933626,1441585036568671,4863069498374240,8928203453712482,6905948060878947,2596978272827499,6973868475692050,1932578840555197,5037466308847728,5329706184358002,406585021524084,2450741349136501,4602983183976566,8932276151040361,6363427103369338,8220356446365819,6580866639501436,5718046771845245,3369574143690878,8994571901716607,6984346472670722,3304909818988674,1038273642875014,5501899078260417,8358536065063048,1797848937072777,8407581910649431,138467215345803,8441847738521741,4022992902641806,7124373056559247,5574083391924368,4714929304074386,112142513522836,6771710250031470,8160052626061462,1552956826340377,3221891233237145,647358479237487,7198140262589640,1943355540920479,1168264274069664,7171164233068912,8233448448432291,7958278586284196,4206705500149925,956625708742824,8035687873427627,4099338087082156,2589695662217391,9186887590930609,475867162106036,7568913210579125,7989406470850742,8262207261972664,8976071334369416,2986208431143099,8721927436813948,5422285899573443,6976236695132855,2688085435029705,4583242579380433,6099631286827222,2216556607256795,5138411068791004,863524078082269,8056210111551710,4151018962847967,7106865132228253,2975706043570555,8509352370660390,3995231422011622,28720040024299,8384295507971794,7331669510998254,2507014619195632,205099070187763,5765034367031540,103230502815989,3109755488852219,2457216644843772,4211157591746813,8518453027874950,1242844187900161,57534373304578,8714197605722371,7780941003630852,6510616382627141,9197752393107720,578526125955337,7625837304084746,5749239377975564,9019698325592336,1923263870429460,4222208729876757,8938403608419449,1051206726146328,1549689608972570,8762374874786075,5603345670195486,9070424634840733,8783528549919010,254991221688611,5443656658442874,8723494977632550,1570799268073863,939996133665068,3128819388311261,2486622097537328,2458647717488949,3516581693274423,5263906610481464,743759506058292,7495850396624413,3003730699954495,7365149146581312,9085530219248011,8533432935889221,1741868591405387,8402268910025036,1970779902859597,4680391682779470,5622942492678483,7016896114264406,4450430224955738,1845480576477532,7343102940420445,3109813781096798,908368612813152,2076530321480033,3779212239702374,5349167226477794,2596532325370218,8943558297289969,1726130074618222,6897987123145071,2490770342287731,9050165014662206,6647561097779575,9180001154922900,6065037164366203,1637735207954812,8662360789170560,1436201516341638,3328538743318921,6645341089577299,2234393024682379,5155985068020802,8098446742268308,3539521059567342,2273876472949146,3005182602148250,8182210783668639,337353510504865,486479306627490,7933002344424742,5856367456192938,2782571566139821,7995373408668078,2508532310682032,9098676597565876,4040715641293238,8467692289107017,442091220281785,1913334462110139,6977308264516028,7330556056037738,7095449688627647,3273102119344576,2734162549934529,7165669225413059,1831424073652677,4690796010928582,7138618439678369,4959602781268431,7985093477165523,4402070626453972,5466507449491876,2210035440658908,1864133076675038,2412222910581216,1435445433207266,3741072756206058,3144275873548781,2252585372989935,7763370194999792,1696662512964008,4622192818887155,3178718684559860,7898635121460990,7808370147996073,8365577441933467,7960520292661753,6917373347834367,5466480728672769,1250576358184766,7119995656530439,1503508683946504,3166479821986313,1517534827665930,264061017299468,5882137935363842,5989143994972686,4872147639964077,6515865806703123,8478027433630228,8483400283232792,8781237657949956,2341380179470874,2361225393928732,3763702853851678,7287811001905021,4947614722116129,5184081429109283,1478945908730405,7586041667185191,6505107621177896,1309496143739435,7329649344237531,167572812745264,8801018277207392,271140557773364,2430435680000566,4097994370058807,520169730992698,2188584798480955,4973455075072572,2757191545186877,539079167334976,6414743522654785,6910577103825474,3212628667601320,4831654416538180,5680017874356662,6744329293033513,98062026259016,8506181310567762,256030387704930,1685380532361810,2225424532675157,4013630652652119,3766171763030618,3644503903541851,4706717968820829,748845686971493,3386484746898018,7681847746056635,4481174280038161,1467584601262696,7430428795796074,5969538219301483,9081218678577774,4278132410190447,9170427125942902,2115512912325239,2341529315015290,3292448091601531,4079681566022268,7023316602616411,793441679294230,5449466470709697,7214750322709612,3848997218107159,9190637978024588,192665891328955,5471224808979086,805852882332303,1780312294096664,7768395176954514,7617905820815811,3930802575662190,8233298605698347,3370501955914395,2478602594425500,873462159694493,9165544659249822,630436390050463,6703688398471054,8351541652851370,2318322862596551,6417345921952438,4720334925085367,5006465864141500,3023704276343486,1047049171421888,13360222997186,683470129200246,4596438710209224,321359792466637,1093649484774095,4947904726903504,53022057147091,391924357520084,8281154489580245,3910586833042135,6639872172741395,8183970539608527,255531799635066,5521495156275938,806135853996771,1945603496205032,8769631284032636,5511064921090795,4708206834948845,8983966132519861,1769552353069809,4097751025974003,6451417518750452,683700456061685,1980504779684599,2330139187464953,8618726792718270,7801246230747902,7763188285205248,2437907763718914,1288589190077188,9206622706989152,4469846644431626,1271379855940364,1476694256954125,5304058722978574,2071436364126994,312112318929683,6971496644053782,938616885715064,3319139036584730,9066182805179167,2748375312056112,4475580222446370,1088092296764195,5260186247293732,114698998391942,5508042682133287,9134311581313835,7417635666484021,9178859338787638,5238459446192951,4458253298035516,2290175906880650,6993381494336321,3648443630455619,2891048630307653,3809135574477639,3503267696036684,966323379432269,2981333789911886,4748749292755791,4061747204303698,651366677392212,5966228858895189,3983286935431050,2620440164653913,828299095210844,1976213102893917,7593946168571713,2414738368158560,8289070304029239,1248365719767913,1176554555648874,5744083948280686,8121276793527571,1884737191381873,2975581477727093,5231686131948010,2028394226101118,3086323269933955,4023087412054916,596931463763777,8597264444988950,8411955732622219,1799623366937484,6804319401503631,9058882581986192,1954497218833297,6436446458858388,1537445793553107,8290386124602522,4271678781082527,6674575328167906,6940494064746992,6900959512398755,2911316629561946,1388770958375845,6955267558479979,6979683503576226,352097789369256,3004577450298285,8018536979561391,7590569433344944,8030332372284280,2601930390731700,2735667575413685,4566183899204536,6157475872545721,2798175775349690,2935802461199292,6951627160759229,6522174951357374,7392984080919487,9033391227108292,3679687020903585,4605992575159240,4017949503458249,8294912072633290,830226958449611,4638627093556172,6123340074236877,4946251845905360,9091491988992139,957181537946584,2437374650571744,1011191351703376,8548585967750276,5101391573437420,1431419049106415,7274682486451184,1578947307248628,8366336607038455,1960011471608824,4899144858364921,3289663662459898,7983882987953147,7220143103347882,3418894080543745,8734110325837654,5809693664619532,1538612339485709,9003006348742635,5525032049523729,5759511547030546,3579137415240725,3848503855118169,6082804171680793,1670306917567516,7071509376710490,9201556943246029,5193064779660321,2759436310174756,5597431274830886,6616265387797543,5639761784507432,7810198259829801,4976584972495914,289967011699890,5586158416160605,6291952013888008,6851486612485299,2716808408947764,1887404483984437,5728453458356232,7581091679136265,8673038310554681,7975895239121978,8863245683334265,9133879961463306,7291737422990398,5944901794817205,329239650417728,1275167702694977,145210515360834,6530197486595145,1675429522304076,5542887414451277,2979161927924816,1022957206510673,6394884919397460,7126641943788629,6172518810143832,2633181916109914,6210174491397211,804437624605789,5674376164195423,6464583828024421,7440828653454969,1759171903626346,1620761497250924,5643892112682093,4619730839182446,7257813130538095,5973286956321904,6234372903636081,997855450304253,7870281235614836,1242144102091966,5712824494345334,2542597335116921,2631715946871933,3150330717297790,592181375872127,781160078068866,3063419513691268,2464406242942085,4462498517744775,2907615615175816,1379266649845612,3806647360015498,8384192732654732,106025576623245,974757616123023,8979571788982808,4306552515312788,748662629223576,6296109468466330,5761839174629914,1076622580685982,1416929960492191,5128335154424993,8289067274268170,5371575069244579,7127685089156260,4498780365458597,6393901636228437,7264814157724839,1799782496713898,2156023235108012,1414800411778222,6078075901619375,347102711551176,4012167993359538,6611030741679987,9067327223852214,3452238616480954,178336155020476,2290225381477565,3563949950659774,77983983648629,3863405294398658,7523450019634373,6954123139525830,1543203518672072,8074258704441207,6418273673063635,5637330104249556,3282551138073813,559141082733788,7072041059534714,2612068990431781,8231961382919392,5828308463977680,5391731418643682,6653200185863397,3098382470720743,5023704969579754,1088829645356925,6140321130265840,2818097929694449,8631452563528946,8911508011191540,6186588820901109,8445402507852155,1204608514067703,619307430792555,3681045150776572,3294246926974205,8578941706702078,3390690315754751,8043620263745408,3945506084642050,7466890848442923,8803269825750373,6265744783469835,221971235765516,6170320189750542,8185614063021327,8224907571776786,1609700287757587,7523648178547989,8237395448618262,5640322959854871,5894243336178968,4316903135878425,2989374818147612,8066477486730526,3328553350262049,1360633851247907,5521500001639717,5959238005058854,1809531155213608,457931926432988,2976780633570602,4892304720231723,2949367549738285,4175650089643311,4288277829963056,5571049561787698,2391222831312182,127218150640953,4574971809729759,272224183151933,3747202383887679,4350003164134720,3733773638921537,6140615872867650,5730504358923589,946726178282825,1108923252452683,7018797205896524,6105976050146530,3008832787746128,4578818971192657,150931130084690,1578108127698259,5393458419731796,3379072898494350,2298409873575254,4458714113604954,2139307625897308,3675515607728698,4302888593014110,504897886338400,758253752813456,1890601519586659,4191187015572836,4373812681342311,8116262740107165,7387998860266858,6019700263263595,100149101223276,8151694003658093,1869278712302958,9049984576897019,623113099523304,8661550532312434,1330653458713971,895570393292151,2127467603819896,633887941533050,3909163723152765,6378020502945155,1126998629969286,4904660189212039,5650545017666955,8252019645869245,8478331427819970,3568124641815956,85655422938517,7347805044539985,3427235601237231,3195987178696093,705016742636961,7280200395287970,2314164313890215,3888861938130344,4651874940792233,3414888100097450,3553674646658475,6117556084428204,3471070525869486,3803677682152809,3916726846741936,8256408898186675,160451911990711,5656000778202552,506612468571577,9178967368383947,8305869814324668,1862670038887870,2616560902409461,8636758370536904,6008482027724233,8340958556929483,3212631647440334,7058476121869775,8100988655490296,4349710275075538,5459253064220115,3235938621242836,8648784151715286,3394602786147799,6086316378698515,5756681300311514,6795927728799197,7262931724991966,725189792628198,1971359519002087,1923179942481384,5559952086932969,2018484240117671,6815201527291372,3627911198825042,2997087252241903,4100387385863664,7667415932595698,1370536052780532,9219786746961150,4737662231309027,8990151973895673,6111547392482812,7311602634182570,569555020176905,8037736612879882,350329988127319,4678823389228290,4940045166009872,3078332611617368,8797226801016338,531644611255827,7956255304191510,4487316109942295,2932258386339076,2237070684085787,2986297769519706,782677116505631,4724428649930273,3731550635159075,6291925028736553,8970862845474001,4425756202429997,3186960935255598,8817263697089627,2414308564913716,226479947935285,7505559179533880,7208615702765492,6650600476913212,64748688059967,961926149901888,8570183769640513,109993154813507,3442568037076548,7253009360080454,8525516889919049,3389231880072782,2802918761299536,1259854960701009,1348768315575890,5679878144544340,6236227878586297,8805036326769866,2195677712076380,6819991078063795,7072664215123834,1790545646661216,4514220882517602,7192199412918203,178859739102820,6660124220921222,3082826575736425,1836922713550442,3898985651323394,1409802578479037,8487949790411351,7119364468260466,6770775552521491,6843752945444798,3312352462134903,8817997821611967,1269116691254910,2802559725362817,4012358872272515,2252537918578309,3212802276691592,8526391591604844,6887303220661325,4254951082204811,606788288269966,8585464552087183,1728707078090386,6541942469081027,5924000565993110,8750833021656732,4821217595559581,3376049838788254,5487301470285472,6308183012114084,8239559593650614,4399709160828585,7233023312543404,7370953705737901,6806175581681024,1111605217722035,5492569951526580,3936825489489589,4223570821320374,768176299507384,713875147857594,2806482574491325,6639521486548672,2803286131158721,6804337518386885,4460456551915206,2632436652220104,3434341882526327,4806138922372814,8945816361954299,798695000870610,7762213433070883,7031934973664981,8702810379588047,8511457131814618,1133386631315165,3632359931571934,1778151578815781,7498133185339104,2453398215301072,2952410051411682,3603436044599011,2881896918798053,862178874490598,2097167731961576,7721807409782505,4716657110003435,4446270861213422,2424432871075567,4019871117729522,5553219548483320,4220128784816931,51808283161215,4835450219945258,4880546016554754,6758841191763715,2081465689009925,663899178020625,3106449741623939,8570608978043750,5617648289615638,2843711984656151,1174142748241688,5764022738784025,3833787331628826,6486702333660955,4499233585725218,6920947617419227,8847857002419505,2252427229298472,1059854445207337,765668164034346,646440327835435,490999208226606,587763258412848,8831942722514738,3042578405756723,4631092704505652,5422503416567092,2086136199589699,4948832645119813,7838724408904446,5848303430828684,3244945349476322,3799990486462286,7132331117079181,8962253421092688,1431924624101201,5745705970499412,1152949731041110,8231535207832889,9094839413055320,8962055216300981,3189593274883930,8306850298679131,8838656505267415,4880302300772325,6959128290770785,1298915045416805,7076833574882125,1806630921473895,1392401710071656,2030055739060073,6191945405103978,5550028481617772,2244551135387502,7594812495908720,3208740413730792,6293494958482946,6258367147630451,5249485956435829,4785549057660905,1588355266248570,3232752878731132,4164622899437546,8986916544532350,6647469697829525,1039339901935488,3754178585198467,7504630908137348,497085481160583,9217344512790408,2937375778369417,9153379885115556,4610898519101326,3627098602217360,269205513240465,4232846719639445,4241983841030039,1818926066106264,2874513975152541,4647777302781855,7942691793166242,5347443485339555,8563943214983802,2323056498671526,6138382096555943,495007375495080,6399434804833197,798884217339818,3655446264291244,8391429519171501,7969374122528686,2316311020452509,248498642980786,6818407903134648,4326025832296372,1437228353564598,5217213975416137,5427985511456697,893237709090748,4131640897580989,5585543428661182,5677984059137983,1586565234802624,6105175201599429,5614629209485254,8589366255424056,7308303751630780,5662705750183245,6224278798155729,2422684718313429,4819510857600985,6674011621937115,4467874398019551,3256759835176930,4694509317095395,7123070756108966,8711774151368678,1619009492262888,3627971401117674,1879432549437419,3195155034991954,259166468165615,6832967798779890,4271980535017460,614432224284670,9023058063814647,631330753105913,4438314937032699,4311974311399422,6051062377103359],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/3988811e454e96213af488031d84eed9",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001694725.1/GCA_001694725.1_ASM169472v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MBLC01000001.1 Streptococcus agalactiae strain IT-PW-086 NODE_10_length_90377_cov_78.2723_ID_19, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"3988811e454e96213af488031d84eed9\",\"mins\":[7745885506894167,1214930324293636,6732187105323013,570959108790279,7974987086782124,3398053590266747,2072660206288908,4174600479527938,7274999048554510,4815459624005648,2128010937022482,2192983370104851,323437601929236,6602652753041429,1545920438519831,2872834522816536,6755492196808729,251194217504795,8190248251965470,3060044990383109,7322325697155109,6426435937662641,3610785317775400,2459376462659513,3773353977733162,508875004139563,6308841475686448,4977554012092468,3102722582310965,7990751068633143,5558130993582141,4749943885905983,2493682628249664,4108011386776928,1847854094723140,1181159360344417,7351953779599432,6736007448310636,4323559549280332,611013621239885,3502848667187280,3452354852479058,2497227238805859,867322241200212,7356817033551886,7771009064222807,1839280281649243,7406259797338204,5479544326352991,5841444458291296,4356343322994785,4149289124147298,7244481455204277,2812233326542952,1638969105311851,2253538973725299,2539226087620717,2838821160642672,7069472003141746,5504301168490612,5484684251480184,1905289297381396,3119545960777851,6216289599820075,2432715640828029,3467097964623998,8922202109069333,3140543618969280,2430357398353142,1781532602753158,6335553931483271,8150241518784648,5141722278793356,9206465083179865,1849133988077711,5409069928794257,2087372917328018,2560934570151749,4346749751681177,4036131335542938,7964667570976924,1942792329326749,7758187017961631,8273070568140962,6463757665415195,7803881730670756,5119818320679077,5449478180878502,980192377581737,5859927516131505,3544349491103922,1743342386999476,3026260645519543,6512825680842937,8616285535536133,4967392025714378,3947551853074624,8834426272774339,1994043796965572,7200084341498053,1896367566221510,3806220441008327,2403665386506440,8955100809894089,7284600262248981,8170912421712077,7708430225000141,162769053358626,3560228705937620,6184663482622513,2185304098267350,3099923669512911,772118877407452,3966763500933346,1115363189444836,731197349271781,9005662883313192,3068256189978855,2109507371112684,29170977818861,865996418951406,2315385011865839,1928028437387504,4134653119830257,9096572428034252,4464603769121014,4342760871760120,1910812978036988,7532347717429290,4661990414778622,5842988991232255,6344776454263040,53784788947202,1262003347318827,5895157052585686,8967047611355521,3781288969091338,5332283631235339,3723126319057164,43440479381773,2474439097434383,6287196354685202,5170574699694355,8939030350366997,8440501395825152,2886074231266067,6997955492576644,6386066478911772,7114995602014497,1502647346932004,7792544386012079,5010225398958374,5971210462258225,2342476321722664,553364134428969,1794827466404139,6039582182760182,624474396396253,55958486716720,7350109099049266,3413554757650739,1586420879567157,1955296063373953,2820784308517940,3097175131750715,6500618335318334,7043323710968128,6714958503191587,3292974780223810,3260955414524299,7061752088247427,5886606438701381,8252771381627206,8425319925461319,7745661459631610,5526899722453327,3902046231603536,3603298240915796,2406363360264533,5449001504919576,2467302807214423,4628338749143385,2695452998164826,1597054581662043,6498560078797149,1583915571300702,1584441308936544,5291620546351457,8015619107047778,1153879012473187,1619498588848485,255778204572006,2934032762965393,3153907173253481,8252015570860711,6628506778751342,7078490448426045,2661968161380724,9129762329287742,4871796500803305,466901218972025,4423105402464634,5789465279904935,5758337377699714,4554243676584320,8925490532399168,4732354961607043,7630467086311812,5351330649515414,2585365975265670,3814951233972615,2798623094567307,6390667292649084,7585854855621699,8982360545077652,8456008387948953,956953435203992,5046057587342521,3557825270110618,4107938238212507,3483184321171868,1100360344927642,5358404762972575,357949338861989,1935718588826023,3074731315022603,6003319339700636,1149194215436716,1238075025070509,2793270378498480,2723450353215921,5541318717243826,9065167691964848,8098865579702708,1515490397657525,6242898095562820,2547163736486331,8310133285278794,1544370683095486,6174803647979600,5301398129527235,7535165453457860,1791226765040374,3049046283315654,3303192434354632,1861076218784204,7888076370834428,8512258147529166,7317197720807887,4869314161885648,3835306170673617,8379141009478734,626596402975192,2531905761411545,1636425636205425,2760408604285409,1290510064726498,8824540959927035,4039910634716241,5893647951008508,3924036490815979,1925335653417452,2526760167018989,5163312916318702,8351706294936048,5539413386469874,4710097177633267,5033799853912564,5811561537718773,8918700470512119,8550731685413368,677544401975039,9129251368448508,6730227342869930,2103176203266558,2795411769948671,1106734982606477,7666931019710984,4804206315215276,4221084140823052,4771765209238034,635041871819283,4383259090082324,5324290291671573,8227186277728768,3043740040589849,5480215604548122,848447525773853,3154161325603359,6689614740462113,4477917980178978,932178895239259,1186779160846086,1705057167120934,6445192748778024,4500835949074985,5501230936840626,2205592691550767,533228251765297,2512612219918898,5630511124761139,2318947062448692,6016727388101173,3330027068738102,2776727785432841,6928730804648507,7348510959422012,7647407838421770,3760070569351742,6278987952755263,2591330889806402,3957391503469123,2450984467884613,6746444219631957,8352749444061293,597820120590923,2125070035960396,273608292418125,5946994218396238,2914029033738832,7127469614252100,4035755790248530,7520686275155043,2470345337021012,6373280324495118,1146882209247833,1854117026745103,8337159786734172,4132271794420317,3386951814924731,2869822072668772,8828444920353381,5598815091765862,488494175322727,5254649923758698,7601251293135975,7754333812920010,6396235830831725,1998545818284466,7723245796721264,8070578299496552,694622653747826,2214895396319859,1984379047705204,2946089239163509,8420455028734582,7581223505422968,1990086777629307,5155284664640124,8544982933236349,6290322758386303,8724282772025233,2769293634884225,5393276705395330,5128545203526276,1798137397691015,1870815574266508,7136342666241474,1112236934484623,7777158039777936,8079236149284553,1952469414644374,5993384056784324,6906241090173595,3328670341530268,4121637653103261,224493254852037,6083451943453344,4043136153544816,8393802987553563,7932161444436422,4993027147319974,6747428666028519,2933958424259241,8037638647509087,2048413284448939,8803210625497773,5372796831070895,7125488696234288,1228383557508552,8720011720241842,6297383723072627,8401648229573301,273485874440886,2555314787146425,5837351034720954,7749286378406687,7028156929299866,1442039726131909,4145126986975942,3315733489227919,5346716707668680,204487741417932,2435570503144567,8651570273151907,8342754385156813,8607342092743374,4583781422514895,8267327378551504,6147455256076408,4970534210886355,4284654792620382,3291645751249621,805721695650518,2776808017048280,4161832816007901,8118347973444318,7627262053339941,8263220511998691,8335445635812072,2123972134605545,3321342241995500,3159296621531261,7206062184518440,9176523560816083,7156450203525876,3078944499591926,5597648286627748,4548909128710908,7619446772079357,4707805034373886,6583373875813120,9190011301307101,9036546160535339,1492251486784260,8335656947153470,368740955226888,3329795469925130,3281621415506699,4892655060232975,8953229822404056,8432821866570514,3850275206925075,3398965509088022,9016946924354329,585099434228507,6066160852181789,4751480609905438,6241864526312223,880010294645538,5705665268381830,523328868326182,1259463780279079,4969447216354088,251239388773162,5837013724293938,31272159636273,4845336849900338,503145191037747,5143634436607454,7003383978386230,5972133665618744,6614199025787707,4759206978737157,122716683612989,2094125459270453,472471849055040,782594073508673,1379557076841283,1611847346502468,3407083184643895,4263897556534097,5663604019926073,9030725854862168,4137348295830361,341354776822618,4475525305863003,6675638398170256,1691404797389668,7093121527941991,495290098424681,4498080876188523,409050072376172,3964145196887654,3223600034470766,2461186920207216,1016415816014705,5414395420332914,4216112877345651,2759722752799605,5095102630798198,96597824427497,5940248825002872,6538842300570489,2970182584626042,4408724138873723,5332249575455612,3567746304686973,3941711862586238,8879010208526070,1689930299245443,7856608256115588,4501596511148935,4842548923853705,1005338566896522,4250192010793867,6525927400976640,6256465120232335,4749559399496592,4123542447502225,7933146693460462,5137985885582230,4421404974689176,5080055607016345,2093050315074458,1016454242034588,5738048437017501,3002835864846149,8563489662450897,4458725998023587,1426531157664682,6926200076206059,8390594178385790,7958689017317867,3648834201446557,3281974902901681,7818456045191404,9001742592101302,4093051554120632,8090082227057767,8311782861683148,2996167556082621,3237371899133429,3612996123663296,1369205082721217,4561816267107147,4216300657357766,6913463783224481,4897340578724811,5583843905027020,238119321428941,5991981154528209,6869061275769182,7764091149621070,6439386591206360,221786539574233,6188993645269549,6017037957524875,6769742254814177,4305723202264034,7197613786377187,5517790552499173,1289179486411751,5554235025853417,3003527234868202,4183157469783019,6999719716469740,7025054226518526,4951968113867766,2583569534508023,7331920813030394,7258656843127295,6637416474584060,6481044003706413,5478181869769729,1560122658855938,1672342365225988,1999653646355461,335805420239880,3060143544607754,4516237174748171,8651020756049410,4971665342331918,7389758946464784,8853998147986606,7233170992505879,587373231488024,8203496872795385,6495226706816636,8667042603863074,5062309078350883,1451855425504294,8868358137144465,4768243700970541,218618447053871,5925329090461192,2109178863713332,1990972817200990,8942975923117110,5454176375079991,1660640136019001,439096927173690,5538810105271355,3442747225994300,1178636490124349,5469225494673753,8058674542763072,5485169299285059,4283502931428421,6413726186468937,653623325992009,7174908036084810,7627482505239735,1581641536289870,8754386463958096,623532151514193,7294707131098196,3487448754136249,2229343600335960,8170766685143908,8920062224198747,9191040206283868,8491355176869050,5370454803761170,75379106722915,6672878101273701,3640202699592807,5933422219912298,7007491519859820,382549762671725,4131465460483182,8099219147770045,7285353767136368,580147590546546,1279452460131443,5878571743960180,5544155554870390,1181920140760183,5696731108191353,2643830939579514,4192293596170773,2381465584444544,14548618614976,1630581459799171,2597163832448132,154822611013484,2593734512133259,601271868032141,6047990553009439,3720100518495377,8304720044555410,5484950513429651,5080709921592469,7499903381806230,373640093670551,6847685066859672,5586476870859929,6796688551363740,7606457414311069,6555076572758896,4599719217218724,3751812605893798,5176519069113511,8826431520625832,5463823492224169,7810961486262367,8862684884266404,2156350654411949,1543286812204206,5174233591862448,2185918233134257,1824144872244404,7112196106409143,4283102785635513,7282004038388922,3479079040117260,4567823400244418,2187696685204676,300075545947334,8467827101797921,424797188129993,4080755185059019,7398046079251660,1729815678032418,5567878247605454,8981536781093636,3707225741780176,46982664734584,6454328009489619,6505663417736404,7035860592594133,6994161362468054,2866205853299927,7430922500845316,5029151592889564,2881500758303965,4818737392676067,1878176851586276,7441981861203174,2154017579918567,7866704750693244,5589977681485034,3875664459588844,8616956064653046,2544593755300733,3504160964633841,2928463070219506,5528663363851508,7533176941290741,3954069025193206,8476846512651817,3072832372342008,6057451484506421,256618765352186,8761949912849410,9064493445051644,114669823841533,747137179350272,9027127499119874,7675057764113622,8975003915937030,6178565701352712,4313501022424329,5852400223403274,2680107776902412,3573360247942413,3925091808402702,3751114786100495,1754495676564355,6523725575003413,5896471191731480,3099810451107097,7367957688294684,4268094994806045,3810144389207941,3783918863394081,3609776238564642,4331261096562566,2302084368528679,6984427312583976,3021278781870983,8390795944092972,2719719782423854,7711203403423956,5622962571355440,2108696766404147,7073017765053751,6931709116716484,8696804363065908,4229439956262202,5516674936653115,8089483974192010,7733119658875445,2087578325923136,3489845972700406,4783727152889321,8912566481681736,2343066659075402,7788781166697804,2726661014998360,1528343916272985,6086065958821213,7425495965349215,2200860360506720,6108221743784848,5182361721536059,6857739062666596,8530426475949286,8820578162101606,2507699942245265,1949216357649639,3917455430155632,8993120121490803,5734860342607220,7069176275453301,276762588728695,8962023645993535,8813786907987331,6355679202616708,394260849124246,2071436735602055,5560928694011272,4215211698746761,2947746662772106,467054035996043,1606982095562124,7264206565826114,2129736225543566,8940022681479405,2708574317585808,5395323828891025,9207082917891474,2222543935607363,8332628223692180,2410687390037397,3859768176141718,806849363482009,5222736786460058,7937292877919644,7777716915578270,7851558667333025,1983935728926619,4781478713951652,8619380621530694,7058928444982694,4599245087240433,2861880072418729,6056642952768412,3251390455297452,8552703028452784,412557450901043,2811466481968562,8670638061649334,1316656641344951,6110201721265592,3433114462651833,508998627534751,909464292871612,3162350095355325,4171929982137790,3116920505742783,2023276377107904,630081385315777,3475520903218626,8139832319034808,2168477259091396,1388095444333814,3906517715819976,1906101459016268,8978952786558199,7436327285478862,2449614481689475,564779998352848,2410714202865912,2037541668445650,2096045439237587,228544163730900,3111075155674583,2350481807134168,2729864226776996,3386138147206618,6848525567399387,2168216352153053,4381212342857182,7988171392753124,7959166664167,3549971138125289,8182011822003691,8947142614511084,4158805276599789,3809137768871406,4946191961511165,8204799191643633,6521958032739826,1996934364879102,5978516603041274,5418905744545277,3472154457067008,719134921192704,5514454527667714,5950556888532486,2155339371144712,8581290212357995,8321026266621456,8861938575730264,5879321577822467,8367228559683092,8948263734377390,7954480912337092,2622830969427481,5483857697170970,3593971016063919,8492087877162245,2383241900012514,7450239558424100,4629556646286885,777519130922534,1941390418902961,5306589094809128,1663013605420585,6001311476866605,4456232790478387,5476448301602359,1692111874950712,2337304462984761,7344439814606394,216115475103291,5630924496250431,4014329963730496,6536097692487234,5836432012101187,4672795096225350,7927199547204121,6357361947769798,2643026943675978,2085710872409676,4964926805573197,8052764783766280,4896779007691021,2248911491109118,8976716647468253,7900811917061731,3372450823118777,99226194853464,7959885257031261,1479817349840361,4455067443703394,5746937253635511,1780730788095589,2341425017837158,4768934288635495,8156844276544331,7621009901064807,535300047382125,2300222396604014,4753396524834416,5819745389110897,8182238590052805,4362288908664766,4136198134586998,462994517233476,4272306154737273,1554189922743932,1747000939144829,6640514042728062,785133093682815,2613783205844608,1234577011383938,9027877753495147,4315276239136390,3453549867148936,8850128557457034,1385018851278475,1341777891565197,514461283214992,5748144300050065,8069987517379,8983992910925460,5908806989617664,5182428587179674,2424599423138415,800546495864476,7601737925444271,8025528026861279,6392855210496052,6668489583339085,6324765148661409,4904175743481507,3896671433119396,988989406948294,7136012144957094,5386497710874279,3452271881184936,7605611019520924,5391776708921004,4052748445792882,5710596708265648,6373330772514481,6536102850567858,2386918403562099,216737473498806,5572818005833399,7412991499841209,6953488243930810,3374959386541755,511240224997055,5375800335892160,5593114550686667,6171245589556355,7983860816246390,6040021320961737,5491074085512906,8896992930547857,5422770340113698,4450124038457038,3753320061171412,1597300796432334,4916189093811926,7716611290015450,4775683344955102,1611625952291307,9214145374295778,2206972604665572,2130773237958373,4450274794075879,8333146531216529,1156108050433660,1500041522282219,2626745603923692,8103513036957650,4430135302127342,4268011721070319,6025501300735730,7799682966708576,5007282062491382,6800466303827703,3368273296199019,2675369364850430,2030618707435263,6171499794036480,8641193387216641,828780722269955,1222409405818628,682858621298438,1669792714267265,8316874298710199,4439013461094153,4347066209377922,2570894690981646,447480853276433,7024404029490963,4869295112290072,1264277139861273,9000450402393516,2205459406757660,2989944884148781,258966123892510,6735389054023457,9035913137708834,7730804614612772,6124078548911912,371564178634537,4339332603452039,5969491072476973,3746503437647662,1956420858767156,4356482607947573,5362524805138231,149262542608184,6531745755082221,2871882386659132,278424562140991,6118579559798411,52571308105540,3988100216903493,7046692682614598,9147933641232334,890525521766366,2864299892326217,2358456798883661,5396090123378510,1968893189861005,2239451074248530,7681692677050340,9142785790872192,5724444932389519,5415680538298206,2669104254599007,3384549077728709,6213435302356837,150790534680423,2806615826517864,7871252503714684,3460431330991978,8067340183535467,3393171666491244,4327078748122989,5125288132054895,6654449291878035,4146898539290488,4435039178995577,7323446787653498,8752804601726271,6619486196778877,3408522629369726,5755171203260289,980231430365058,1114921660826603,8328206332216093,5015766876053704,4687173878568838,7040949930149185,2975404289093514,6177967785318287,3237022909847440,8543061920066393,759663532884595,9147229194166165,8302591021363524,4746737383225243,4120640307091356,4090374638159775,2705232223932321,2952858366250916,7571166701707173,8743923504582590,4796655420284840,9006805388419954,6601336879388587,8325461377142700,6186058106527663,5472028793943984,4762684868288433,5587782360416178,1369870763644852,5827992647173730,7598305531500470,8403670325916747,1122230064713657,542347747397563,4182766267917642,5324231945818046,1246183702918134,4153983858100174,8665489840902854,3275267323168722,3000266998964179,6914957829818361,7562319471464100,3964273544363998,6517628072808416,54882516983779,2932440824119268,3391587970058214,4249744670939248,2004534051471339,7862972567629262,354068754173935,9188508815290358,7180162650134519,5456499875225592,4054076759113721,8698398145199786,2647109273376767],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/3e18cd65bcc35fa150185fea0f162549",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900120835.1/GCA_900120835.1_14722_6_20_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FPOJ01000060.1 Mycobacterium tuberculosis strain 2926STDY5723476 genome assembly, contig: ERS518787SCcontig000060, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"3e18cd65bcc35fa150185fea0f162549\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,3275671231799366,3550153143791689,2551767531312142,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,5458380662771820,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,377871934709908,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,8700533915128007,3101512308711625,28147068350666,7077040330383564,1400958518145231,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,6289574478109544,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4410731228500310,7917710442910040,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,7109733243151760,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,8358165811386431,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,5088842780258710,1386188411659673,6914478892422459,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,4322762825490502,8486449541902758,4183197510988200,3735667434631593,7524860168862701,800336460501421,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1546868478003809,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,5281656741482959,3538544750158293,8212042408507065,5989413972484175,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,811327082263023,8797845524066800,3456230091686385,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,4137376921317903,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,200567419970091,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,3121445769118275,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,7127066892468815,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7813386708787858,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,630218890143184,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,1010787532220230,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,7982695525856751,136847085507491,8694608941484088,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,2700551849485231,9057522667853201,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,5048208825244375,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6515117585048654,2679163824325711,5153860076094653,7554813291074643,3378101202289749,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,4231448943924397,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,4992214606672079,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6021406202598646,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,7595245655450923,3585984418156082,3898137379435822,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,5842852661052750,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,6801528529380709,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,3415051281864101,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,7728232038233681,512293069321704,4875820081283327,4092526301791731,1360710405096951,6524009387461415,2918737215086164,1396209862055419,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,1488198135089416,6804214012519986,997635026228851,8576587009578549,9213276759184950,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,462079636833860,3761580756706885,3236869990516294,8025936863774305,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,1855786139203187,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,8117885561915084,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,5201658808489695,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,2196442469646242,4860096552404742,7106994624153217,5400970783831816,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,6898879231672973,2835966774077202,8204014194640659,6146633883944724,5668890570836270,8117469891086102,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,6645065613965117,4458099002193726,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1373999588247366,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,4863503626172242,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,7978969931245482,5230235725289387,7629630146503514,7142210428985145,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,5875736407955439,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,9177142455007585,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,2335930318383202,4892772449671267,7357254875188571,4011267514259560,2439494055196777,7645804919789676,1075249865836147,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,8338382065725145,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,2319684329502984,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,8677466780043574,5008624991828279,2659378973649209,702437560981818,1774008723412703,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,9201610019288777,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,8821337113352545,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,7224009335007632,2195879548254609,5767780446599572,5237286534846870,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,416499054373302,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,7703200470382329,1691698663883279,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,173980174334452,7308248452880126,1723792686442999,7863329489046008,7485285006882559,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,2612105443641782,6875366573382753,3644457848015432,3393690246830665,6877880405244490,8407988312059771,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,2520168393783905,8926237069912676,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,8006582758969940,2563108188572280,3866835372612217,1530371720903290,8945141534161532,630170306693757,3601228852828798,7988235638052629,5320352399628930,8076524559055492,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,1085349512407705,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,9103165703493502,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,8558600339808341,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5458391754881751,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,2545127928916740,6299628036135685,5081623498877704,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,4570236392198626,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,2996482787766008,4816168309078975,8744559858798411,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,9049015856461567,3853897425318415,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,3807266757341739,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,3419679557709111,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,4567543971065185,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,2344201065659778,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3209607062733379,8651815331507604,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6067184487083454,3538950924733891,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,6950495470877619,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,256353772703194,8019380067207759,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,4086606100950733,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3528834978807511,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,4274469151678179,8950431734370021,3581157912997607,1249083456638697,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,4242898493615869,2664750101171966,4121272903601126,5596208657243906,8169274058352598,8322848836558598,275840779529993,7285360428394136,6007793192761986,7517293616647951,831762282004240,8194784683541921,8845946951044299,502404629790484,4160660855090965,1382719954104086,7750109173538583,6906180571823897,8524647299501851,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,6418132290309963,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,8215276774560757,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,4543746223037081,7216004371440712,2525417664202735,5251757406719901,6890256472289183,3777151208890272,1402840140218273,3286336178085794,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,401375166743886,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/43637330e78d1518b4d8f7603fdb6899",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000834035.1/GCA_000834035.1_ASM83403v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JXQJ01000001.1 Prevotella sp. P5-60 contig1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"43637330e78d1518b4d8f7603fdb6899\",\"mins\":[8696066421280768,2843488868683778,5909735143813124,3741428008505349,5062803328364554,662711968755724,7769250534244366,4747186920566799,3744325431771152,5447170766189230,2858860072701977,4021768727347227,2351194067824668,4571722617835549,7608442088308767,27401106423841,8218719996198956,322011188867118,6036290098446385,6354871783477300,6033195252256822,6674974157348920,6813370246258698,2722401127870526,3352537978024629,2910545596850240,551085522841672,2277021926981644,4224200229654603,4226513341677645,4648168916328527,853475493474384,187431585009745,1921685693026388,2527629812543574,2691447361076580,4825518316671066,425103294586972,5953543232954461,8889864937582687,1769691822620772,374434298245221,6607099588206697,371663885025389,7082305519321198,7263524929929327,6020487037313139,5727277812215924,6142061496815738,117301417144444,3802099516862591,7215415051022469,5903490934706318,2624565138280591,4493885474214032,8945982247186580,3274544671285399,2908234616496282,3024680517501091,2041132261759686,4398692730937513,5173687920799914,230328919773355,680476217229484,8614120296045256,2255800333770930,8678306201514165,2861165781680311,8313198061514940,3164641408618685,3398791496913086,3137577256907468,5332858159481034,5507800903270603,8754069985788113,5162232597233875,2521717742661437,2037355851145430,1476377653463,473302954250457,2123366977454302,2800625924321506,86862405738726,6996181223342316,6832376706167021,2736921441349874,7358539048620276,9001596071811113,1178094370365690,7199665320911100,344389657940222,8158319144820991,3877605158527236,2341218488484104,3895634832056590,5765308809733428,4757210000421139,2880177249726324,6993665126539554,8693305602154792,8553828922564906,5572387651658030,5810296174555439,4100486019510576,2577263911996808,5390978328797494,3899512939254071,7914685263442232,6490161217839156,5812586777651253,4004646697554245,1465898175865159,7925372578337097,8325449512788300,545825932349774,3892398413271375,7949301653815352,5381566651687651,2786013866115413,1216951418724694,2087292793857423,208367671361885,5586824422195558,2816813787738473,7286005359796586,788047212642667,7086327094395244,7200072674378094,6943848966979645,5589745567240560,8950709262500214,6811205242728825,5118389664387450,3258713149772159,3383873299710336,4805600944439681,938414414057860,2524612055483798,2546326235849094,7031522154620993,3298825510887816,8966458006512009,2399896132202890,2353305484276107,8392713673965965,4532284534509968,1262886335701394,3975280717218198,6739405996388759,8324878675190168,5784903955636633,4420029409137052,6088173482308002,6652753334927780,1084369261863333,8949124728226214,2223523846641052,1621351831327146,8443837938999723,3473000433291699,4145796759871928,7801549062533561,5650527215100347,4103872888201663,5732149823353280,1435124508672449,8391786285900226,3678896179056715,6135145583526340,7887419230372293,7031074716918214,2244152612252407,603649598280144,8511842193469907,2829048743252437,3426834567291359,5236360578785360,5051090347991522,4694229693583843,2080002079064550,2347203849630185,4123020166205930,1971124111573485,4880603460665838,3115292908278257,1871070119694836,3563837748597246,7122315512447487,6954994199654913,1299207321498122,1928339148437591,3930963428012556,5818550191116815,831885163438610,9031206547984473,3799758504919576,8658607683101212,3280949506232866,2055558100595236,3171461573235237,5745654846824901,2153786971144748,6421182381146669,7351754592145968,4569667258200625,8209744073290290,1831424879796789,3443073011479305,2749563606995515,7986390496383548,7685453575157173,831070894842432,5492768556200513,1494327759159876,145993049485894,5200694740148810,4471178401727052,1865965268693582,8276888152379983,6278529772765777,2348962173121106,4616928941011539,8746421857358422,2439886947549785,1271513663831482,355605120991838,5339495152963003,4774018580824676,909954331619950,2620687697351279,7664759115883124,8186903030264444,743627824403070,3358243960464832,379334269465218,5371865183789702,8704224702907017,7821710455530123,9077901324935821,3117318550868622,7950350963458703,8008126465202968,8297820666434194,6522578594591379,7063605046850198,1458230200748825,8267119191331483,8285706207855261,609732842533536,3124427021214372,2917795510739627,500402878210734,4650992604041903,1716529875055280,8145354893435570,8914813485724340,3887387895599797,7458625783694793,3078039267095227,1727052953367233,2302072108339907,7010097798267590,233280482755271,8806122042516170,2958295707095755,6735369555968716,4361368189891277,7746115316318929,4937136980734674,6583939397898965,2543322270806743,8208357314855640,8803140177933026,98292006781667,1806441096475371,5362628021672061,2692260581749492,2793314235183864,8467374579847978,6015822393142064,8358101793313536,7166053137613570,1849500932739847,224281900118793,2223816006391255,6025614039540493,81375335353134,840794186056471,1726752145814301,54230977577759,3668140054332208,2168373023793954,166821575353124,4669889870734119,8451543175385898,5885714660361003,6945461599646358,342018983142192,256257833788209,8177890478244658,9188585524176350,3435877005124406,9221099644310327,9023596546046772,5848633994941242,7494741997871931,2816433714832195,6265736525876022,3783158825677638,9161561657303879,7933419308196681,8745209697663688,2339038681288162,1311826079855439,1335490060305232,5663401400451923,1935494671979351,6183370813850460,5816699790615393,1808630380610402,7251255570461539,4010236452238182,3498376892154733,6216254413495101,3560157809574769,4572862172437310,4934747611673462,193475502980585,8814519043986299,4573304367670762,639316999504766,1590492271047554,3494894941840876,1469000506385290,1843350025539053,1592465638048660,5022043726246808,4957236326052762,7471035093091228,6628882371490,6232360670774179,3461809032020904,7542696026309546,7827298859951023,1792209627984817,5763105514578867,7493629519811511,1968432237970360,3157676517106617,3261292209554367,2955131961463749,1417071387775949,8663587118458079,8813205549419342,1438941309772760,8521331968623577,5626771962147802,4787874367779805,2946050058666974,2653851599877089,2878637372589026,8307725625394149,2033902266561511,8152348813693928,4562899984270314,4321337731272189,106131444687857,9119382788387826,6948821952095219,7055063572148671,2758540415329270,8527520801476777,935183646938105,8396313049269243,5828853795382272,5342672973841411,3070235794826245,9049984891876360,3614363154698412,1797953921856343,635477591180300,7809303113049104,6875153744447742,2691549467247634,2592595426452500,7380341086879915,4710835423065110,8295482012230680,7077778283480089,915391347455004,536799745503169,6335705473971242,4894950886634542,7384978505716785,3432598212060211,6968583030920252,5563982289085501,5373821070353470,5772104206271551,6379632943674432,4707488476718146,8341800179672134,1916368152101729,3512882791294025,4297667599987787,7509488976639053,7649556980679760,6710878823187539,3678836120409173,3621278530409558,8261623425254490,4736112270611547,8156617812374622,3446542140585057,5277207628489828,1207390991946855,6853190262182076,6660485434946668,1123505616847983,8718324566265363,4833710114501750,7828016010044537,3781285173970045,2965664564049023,2010793983345792,8319994673788036,7318593546781831,1239775163978893,2910525564069008,9090320101786775,2775580613013411,8008330359321766,706949634651306,8665367065044139,2494298340304050,7022504030569655,4862887191860408,8885225927374010,2323358718473403,4041692993795260,5252465304630463,74522439099585,8967738444817602,8241089591509195,926334355071862,907473961338054,418660482159817,6327773770634447,2954543783548113,6294916464370899,4508342258193626,7542830276555998,1810853739840735,147520440374496,2544506839803105,1016093419779300,5572813996135655,3892500967310570,6147250238452971,2650476947940591,8012539099354354,1338819157513460,8216449495172343,3519082925397546,1673737681548542,4026243174226133,8559339780588801,8245975618520326,7172636876387592,4652234358650123,6723979028038924,7259638382400788,3585723677259030,5230980640514265,6375567036560665,57185382184219,3894304907134238,5259595568208773,2687278640825633,4443340971409213,7946791134676262,6347578809500969,726094624957740,1425407980844337,6452520954029363,8346863472481588,8040686529279290,7379084185109411,1608601168962881,414383676953922,5805866886915397,6517004786767175,2625474924152375,844774766715106,7843980653262158,4589246384301391,3237545129735736,7141463449806163,6369722186929493,2779506918655319,8924405241451869,3419110088553822,4907968622908644,523786562901352,3422888083822140,1361366538347887,4763421673244016,4041950330500468,8174991581574518,5178617485349780,4164496882062719,8470594431010176,2995222347773314,3978765832193412,5479249498924424,3759185377581292,7729027519079819,8598745355924876,404331254545829,8341081516832143,3910152753567124,7596737366550766,8389633834554774,7297688772486552,6409276570371481,4932170011764124,8164559699879333,1007682897999270,3632899793716648,5538876502992298,5935701997721004,6342375769069810,7940046356284847,2075206204175794,2899688040928693,5113593780561338,1935085445821883,8818633295783582,4546751604172224,1183494064702913,6510794747041219,8921021787043271,7745327064802761,6322957250918647,980966014780876,1523739966514637,6411383782622670,1139291903804881,6679399087510435,5447735677269461,2849815010022871,1337256424216024,2311884436735452,4214752352007646,6155046505932255,6092668894852576,2739238152443402,8486538088971857,7977643911878120,4037116261052668,7418400771700202,5973313848817132,4725483146899026,6581105339889134,8121068034516465,2466885270810878,1360100064513259,3857813263463932,8317983235065342,4712187652003327,8644558680077825,1682628264736259,7036975033636361,7151539642045962,2908826004723211,4473478319744533,3174983960835607,8285830917105177,7857102140904986,8463619235759654,5537977074349607,1247432004707882,7079491756910123,7324393773827631,1456541103433267,6544213733242423,7478081071666744,5024661847747898,2436977825285692,6423572712625726,2432944412386886,216941455930953,6231604497294922,8183182373193292,3300608281601618,5778730291934804,5376040266081877,215858281817371,1837717191247450,3322936604161627,2209134078019164,6563990799009382,5158624030961937,5836348239832680,6576319840159339,9181100274431596,8201456991598192,6623548920108659,4297134941529716,1073727687116409,944574203639430,1532804579907209,1371293759743626,9217774603175564,5153181434029726,1153307585385413,6369316037427836,3120386842121892,4922725399353001,7142712783222447,7554681354921649,3999709948970675,1291043292671959,7575359165332425,6779149884995260,5140645804775101,1840085681981120,1568108075578055,2653456205899465,6459683162171082,1260460345738957,2041021295765199,3374069670475474,6513586490660563,1981149857318521,9085517325654358,1299740101494502,2064111311369959,7127627414808296,4119281832138477,6154955479955182,4495933235541743,4523923101947633,502331040810739,5077757254670069,2138506510735094,8165167818356472,4265494952835370,7609052354707072,1131037347579654,4058977091482721,725741243565832,507606962508002,4826148410592899,9204212542952409,7765876987045657,6173043527910362,8770801289832070,1041971599734569,3341420757890858,3406830233331499,5336148066092845,8238258575644466,4927628573696172,7403121308005342,2459944464070454,3259157352548153,7648905761711930,4639229907834683,6312650283390780,2405163898623805,4161924444285920,4655444720052034,6986676021987140,8448064779999046,6743071524660193,7658722570835785,1635717507438410,6676854057727819,3533179783112526,4220724596430671,1937694704109393,7606888195541342,6173105328175417,3215528206448472,8812222224015414,2278167318419292,5034140396377954,5681062951959861,6173218028894058,7234713470371691,1904782828909974,8204429397514093,3551538493424327,6425398800815985,1981870704494451,8597591177779060,2291585059829622,5266841888917369,1644496364488572,8355574523388906,5959145025238913,5073871410411394,4292360353314694,2792237199554446,1281823685158800,1687670535284625,1084173971756946,3214267534268307,4481863420401556,123513017517975,6667232493725592,3902133487003719,7614438124686319,3859082365052835,2595074113820583,975774016296873,1715512127162283,4631678919611145,6609368028608430,5237740762851247,4835567625973949,1408664050571188,3298098580207262,7957202164021174,1988652078770104,5794240620844985,5494092854855611,6391929716803518,1601507617306561,3248348938733506,927020800899015,4221779131451336,1811114997307346,6149454599940052,6465739420426574,1875432096896983,4137612978755544,1206101567866844,71911339985914,5134525139400671,5216827735131131,8048464479586278,3056750217730026,1430077179996139,8393845144775628,8359433723885550,3447843243966378,2669026758387696,4743981318177107,3297044229642230,4610921293985784,3175352078387196,2236120385234948,3552688530653526,8750336885479433,4226676857756674,8878272100407310,5299777879250964,9176759341426709,4964834726623257,8505194667726881,3992153007020067,967225882327076,3404002487105201,2985010700208168,8851311666104361,5472225856649258,1907977541009074,7437525951746397,5264064941602869,903549895538742,3681136158702602,7891253161281598,6651914660546969,2446090172016705,5247829316409411,5145239721257028,2056468250105925,2343455502833735,8113028110249655,3936617053784145,714955164117079,8436612034111578,1518014639114334,6297836572662800,3374513527519331,2570960655669351,4225548090706025,3966413448108140,2106979725039728,1048450287294577,5339076504488050,6073581701867637,6422588241063710,3093466773739645,322317238446217,3441683560581258,9066699935184698,4118870335428752,2165284274071403,4060288878622866,1053143307233427,400398519715990,4518344307037209,2470315025213593,1098657156417691,114733512140959,7009240513396656,3009754173819046,6404692104525993,8375357515913386,4043097752680619,1152026399598263,4697484992055470,8575301494098098,429311596022131,764703070210228,7547057531111605,8660825589287094,3762401259581129,6581796760848572,3857835703273661,570737639835294,8048387008825535,6312716558571713,538751013263556,6722412827716641,7574691924199624,6834427763521737,7954187901712587,2141182848731349,6042431185983704,7973927818827996,8119671678097631,6714673676208353,3188774939273447,2887236150270188,3933201560242413,3955374269143278,7968700197939439,776360861915376,8450228529559793,1392916536428786,3118377527228663,8399763892105599,1153018184231166,8013783229425919,5448169326180609,6292890672695555,8892185257097476,2492709277235463,3922204547975436,6884778963892497,210896294419502,1056665863682333,3608659820939550,65129473841541,3438734094379298,6969540122687781,2938712332798249,1013832147228970,317263916005676,2749331022645555,1954832173721910,1927388469710189,319832691894585,177405490026811,483082150934844,3821375654234430,2214379383277891,3290341772990788,1594475487292432,7470061896497482,4707702135822671,1773216958794066,4155499106871635,7147975651174742,4306012106545501,3478918520645982,8428489052125536,2189810125826403,1072988760033636,5827567311182195,6582943522579518,1067669335148918,6973605103049792,745327088343427,6500268256934277,1568532957665672,6067294569777559,4924537659455884,3692811291105677,7516135385532817,7285088852756885,8083521772734871,1275997238028696,1489566008379801,6734886839744922,5403821958216091,5414506894543263,7195537220336032,4567733969979809,397625633143203,5209489509001636,7260136396945829,1651088559360423,2639454788794792,207162015979946,1389093196204459,360174836640172,7071334881061297,8863932507892146,3056535707651827,2632036454484404,2394477302761912,667981689657785,3858791939376885,7722476035606944,2550862868310466,112017421494723,101778240043460,1720352603183559,7330949622520270,5474106240211408,7288642687146455,3842614195526106,2530429169752540,5163850260142561,2405512928446950,4762377289529835,1836114901006831,2494365604583921,962899428735480,6574399892527615,644412930525698,5287428610988548,188614015367693,863389128604175,7037359820937746,3823411512941077,1141411904047640,5719352354175513,8561062342101531,9175095905004060,7254679200168479,7113249450228256,5120008839354914,4626294230116904,5293119753488937,7279195679566378,6407030234274347,1119507524491820,9125110254832175,4505604557568568,5104873270946363,4915563959126589,4852281609378368,2415047450446402,6406199600745030,156212865854023,3039437703498314,3838342453992014,275207042038351,7546310102847928,1778352692169302,7131479098987620,1822997783038560,3127714857732706,8502318278353339,1514743821904487,5471391866899048,9149884176071273,3616435695872619,8682040453745261,1151830025255535,1329258554755697,3133987881327221,8830965564611190,5453488986968511,5920005655456380,706064894947933,8927606140476033,24030814374533,3689439990209158,445510614280842,2673144011328139,4348052854672017,7652725540657810,8734401597094547,4994691911277205,5490576938572228,1342092159249052,8220734824708766,8271729772878495,3757608980302497,5500985194470052,7235628745898661,1937374245473393,8353225463020201,50660678314666,2652350614444718,3359844549044912,4596124543437489,4725017342470834,9140545077331059,3116131315280565,8702685168122555,922554420296380,158152815180477,8990053698251456,6597115642088129,5827649671969475,6462063661083334,2726701825960648,5495255018912459,8713382022057833,8141662270573269,5177076996684510,6235933610978018,5608004347509477,4098544757242600,1177256355060458,7813281095781101,4711234292927214,2582512063538301,3911941509487346,6061480663890675,6238252868147957,855828921551607,6249363892439805,700863663844097,2089010406005507,5023689330440964,2111557092547335,4511530161715976,7009589506796300,2073848171195151,3015693645437712,2828159147613315,3213790719646487,1687439612300056,1510526810888985,758777403759066,5965332082289439,5909996796930855,3063862834477866,6302952835529518,605987528338224,5752768977922865,3207590830713652,4171334164712245,6232167709540311,801837206813833,1047736314838154,2569995746016062,6562094810868543,2887701887303520,2897999538974518,429220042369863,6805071414467401,5921020876298057,8179721466233315,5883032777255766,8477763504216380,5723408120162106,8445566326963039,3266132419058529,92214829066043,1687880639490917,2319325925022568,3342081751714670,2461943719246703,7078973658753905,5153635370851186,5592810994170739,7825879461251956,2837061870353270,1979286013504375,469024673307796,708377938542775,8897430520474496,6177474248641410,681482843822981,4625834856541063,1144041310037826,8443483656289166,9045746301455252,8115373809044373,4240404178672539,5453370803959952,3512204499938210,3881148155531761,8813466080545706,8200510043040692,6613509405645751,3205851095239608,889611202382778,358581792385981,3761557446302664,6808771191139273,8329074386987980,3838600291429538,3185713778187215,522373098761171,520678178266070,6358973706570712,1349867702652069,3330580287216608,9088581505965025,7675761815731172,3074285578898405,7975313555258344,403897238408175,6765218809592816,2860693515521012,1263732664765430,6275187812092922,1726481798732796,6739366661577728,4743029926378498,8815401850239862,1564330605820720,2864384659577872,3982265041771539,7318545922161689,1784976519777306,7338123924376603,5925651733802012,2988236211801946,5708846863019038,1400485295877152,7029654459571233,1874628998892586,777540270357550,2469771584183344,3301231740431410,7368356284255284,3576885257243704,1739239440727103,1691274218675264,1513953613462593,5475341734442228,6043894083406918,4382958039841865,8244236654111822,9184619644966072,509335894879317,2676873868151993,5063563430726752,5290303514771302,2242920146967657,2262165962947692,2209142521969170,4575516678253679,2391707705392241,519473833733234,4389814288043125,2956957271117673,3601080137411712,7746256065133699,350963026803844,2331601973607561,1771768286993546,196053655813263,5871962649267348,3539143774063767,5301523941256344,8837537687374918,5466641151503519,5266315137936546,1997366683458723,5925626655411364,6297144660360357,8890248217009322,583271763213483,8415937182870704,214198938590385,8680018917653685,5331029689146553,9197023864240671,4013015491599548,5292619765943486,7628083002715327,3365936238210245,7110501810269382,6250968916507848,8832542249794761,4782625870683341,8637322905689294,8109157168405735,2507586135271114,1093187953147115,6777838613220588,4095442958179567,8933863915748592,9067941431781928,5838821179649267,6416115687861492,6893736564177449,248456341474555,4265335335316732,4910455459683581,5594960075848963,5475879444813697,4617513680706824,1209925137059083,2654427255082258,5829604254165229,9188881042304283,5203168155573533,8428342379728159,880455043624224,5149661673542192,1202468793773347,219263255756069,6965447434063143,5111636734987560,5320620933680425,3298406065311022,5985976494873903,2382759235280176,8383634638241075,5166235581031646,3661926592212281,5457887644589370,6499339444247867,5512885280648512,6014920159010121,2415174272185907,9221928742919499,290724719390028,1027590599429458,3962290302395620,14348443954526,5343277714346555,6556066077891940,2473511207099757,6018329790979438,7692978679261757,8967262976916848,202501869365140,37085628910971,3002349178735996,5924537726465258,2166018335608190,4371444145180031,6021934454500738,7348358594966763,5968413685480840,8446774631955849,4703967742455178,7926257891112855,5263183358093890,2128983906785176,992670267723154,3317314446986643,1654625096249924,2265882220195227,2497219064756122,9056663914405284,3958915394149797,5241073239313835,3579949103154418,2412084973575601,7744301739720115,8560460422540724,2586553298488757,4653665174879671,6777536482655672,5846655541099961,7436999006768570,3461900152176059,2055494193581501,5423495981915585,9169347607469506,8493265294167970,6235842550124572,3888019305146275,2662942526643668,1270859604237784,4566579012091355,6128774259077447,3037121531325925,8351420528328169,7186227988815339,8413408505942610,6287244624006641,833528155405810,3956651760381429,3521911762032553,397337596616184,8728311802502651,8533907918441980,3089920070975402,115371301671436,207040717016575,6601440222440961,6542588222737924,2221155464359433,1020289857084943,7997612985064977,1159153369857555,7287190725389844,7171915633565206,1753895182069272,2389943992024604,3108959202332592,8106071180398115,1869570330631716,3769104998661669,85990406561319,2263119126429224,2064367596428845,2755971069468206,6450144632659503,4612488177835568,8709497903678728,4188778337619517,266553502055999,8236620499552864,4193966652358212,3002973484665886,7473304871345738,6966443297873483,2864787907411536,3290726261304913,7375028329360978,437494052621677,8240174518820356,2508317584465510,8441219281631847,8301741282299501,568997285551728,8284030525927030,893492635602556,4783448124628608,4589303765637544,5724275938668167,5550606889348749,7452328562269838,8745582782115479,7048188379328152,7128197715938969,2214299197742754,1470248200824091,7477826341875366,1353674761288305,3025183263551149,5128515719406230,9181117218116847,7901901422812848,6727556117597874,2114601347612341,4238064947891895,5146925035814584,1582255316496065,3720632953274054,4745380001078561,3923933993021129,6753652976938707,3172479669935836,6175748488416549,5759808946244219,8778868969299688,7774597907881705,2769125650988779,4561782792453868,8980343911599853,2731617496190703,192043582393640,4019871117729522,2844790216716019,2571479121993462,456811519213307,1496205843222270,1999301477890005,1008723363360512,238369179254531,6499265766100742,8158882616209159,5396111458365192,5058042046873353,4682365214936843,8517455342666370,1173911458035672,2933860930309906,7764318352891678,8785358402404998,6204262846885670,642670811083079,8569906690215721,9013612116400925,3741151260084189,4873634409975600,7701916196233012,2688078222851894,1092237279829817,1722267802718011,2059283412426556,5372860482652810,1590283086847285,5311833362948747,5119570477604676,7475438594371402,8023803534610252,1652929444261710,3918357220881038,754982183567194,2999937698514234,6423351845039968,6422079641583461,6079780639981414,2186602425839463,2753244714233705,2466235323854701,919173810798446,8755695127355247,1247364281641115,4798528507780981,2202948632694647,621680204697466,846542867070843,6850062726754172,526920716451710,7060441846218623,7849264540258176,3953468574261122,2246437578436484,1731615424430742,6934630439886729,4343437420588938,2927764081955479,8899054137333019,4947259057155985,1059921150664596,8979742081793942,2268788558249879,8458432669573789,579237530888175,6025889437917086,5249845950705570,7507628039144091,22154596302757,6163129148194726,5651016076054439,6165817492959144,1713516993532357,1920694942564271,4426413197221808,8274911145746354,4359748284821429,7600660559318966,7189045806309303,2441752762013670,7665420453105599,8114336454438849,3674686133039042,424131270234052,7840387132994442,2206349826016589,2827043778195408,2196293295839224,1469691924115414,3707334736899514,6107081508442072,5171267135605412,8572408305725402,3997581522948062,3887629822005216,6483184021213154,6070964665679845,8574297092290527,3199556490489832,5216857443348460,9151570405404653,5044229677051887,621789206683633,8179416357830642,3186348288659443,4147102894729898,8876171981791231],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/43fcce1eeeebc8d40162d5247202aef8",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001838645.1/GCA_001838645.1_ASM183864v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KV838039.1 Neisseria sp. HMSC70E02 genomic scaffold Scaffold6, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,22,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"43fcce1eeeebc8d40162d5247202aef8\",\"mins\":[7355921047681026,3259216375752707,8590878746275844,1290111760289110,7724292716171270,5566755119879169,7193202358002811,4557752136966154,9012544720973835,135937534973964,1446054248704014,3988412692815533,2248574004088734,3968947561451523,1348315771090964,5058695612289045,7743947345674262,7338710517039127,2903763691991064,8814741286613017,6735791553869854,2720532259121184,1442763333308449,5066021107032457,2675521022064675,8722179413041190,573799169484839,7001026076366888,4479552760789340,6473694894096427,6694256510271532,7560456023023661,5170476303433774,8973268346961245,9213782072404016,3601159946905649,1931184012714034,7209404623142579,5382358912000052,1158799341895733,7641098318153737,6620152508057395,6268565741944890,7056629457426492,4999921640052798,4852957021308991,5622605755363393,5846836571371586,2239379297434584,7756386978339255,4306628247242081,6189806895409996,6263877317940855,1770102283223118,6024403997573199,8569267215368242,2005876073424977,6345403054915431,5469424564148579,7587425580724308,2659179048680177,2059103852800088,6448883598997593,6872568809000754,3149013459150940,1373731069939805,8925275070537927,5417532671055967,1915655417268320,8922022351515249,1766797257781350,2297846932009660,7116557813102785,6525438988198247,6093030097065053,2177078840287341,3595827274037358,7501182187844553,8654913302616179,4815340025573493,6898924677677175,3040778947205240,6226314186213396,8574563676037620,3582753455364221,107490684561534,576585840181375,2760650772861291,8376718777641092,8762540497260314,7395412170632897,6118644738582664,5117468674494601,8452925264619659,8028923077083276,7855870047166608,6257906497525784,3800088069310611,383196877315666,8508747861905557,8554985919078550,6958594629724312,785100473329819,7847591175929143,3529157256554654,340204805916357,993871056961697,6941952213070826,134673609789603,3541036426336421,7824379269443750,6736091863005553,8137300692320424,4135768060799145,2234885597958314,1983986161225899,6283759806872946,5357576428005554,8411570044550806,4598409521469622,7136736675454665,2056674350215354,3204680829315259,3010657293521085,936480547776703,989394676926656,667531243681985,5114580226261186,3233539970748612,7918524741810373,6600419253960216,7097896555794382,4729248892260553,8199355150449450,7716032082436300,5999092225439949,8092109191346386,299091561466067,5692467803027090,1088251595409623,7800457793468632,1457970859581657,3323760585226458,4622988034265307,1887711381678302,4675093560719583,8350328352484484,5351070693305723,7235532819998948,3962869294426341,6962618773896712,4674809027748071,647829477589226,73047667218668,7582370066984290,2993398656098542,8170897740276666,819329178697968,5959583344646333,6223639111949422,9017162604685555,5387200606267636,7201458580926709,3646868037527798,5478233738850551,5214457038852345,5856673013420283,114708846039292,8851413612641782,3604363447921365,6983643268893351,2957757425780995,248708767387911,163338957904137,4866681230043403,6051336156319162,8381501994730197,2097286316056852,3362501153968406,5704048849476996,4227713821004058,699974985167133,1317189793319199,639443127574816,4722654816420230,5592453320032550,6396318540826673,7001573049762090,855211392452907,1647493876146477,6469699076737117,8723738970923741,3786419895359793,2285831348293938,5545155328392939,2296980227962590,4401050249841347,1403643364834697,6199799626860856,7044577392693561,6949855412224315,2074966337980732,2404437811677501,4929142301835582,7461402202589237,1541787943604547,5499829233381700,8074948277399878,5662116586393827,6333392477623506,5960813414713673,7774683613002116,4473594672423244,7279606234360009,8740001142958754,7320542659071223,4069922116575746,6537220241553747,2793463791450452,5376463996852566,7394195799394647,8608685442184431,6429852223457627,191933768096092,8147983060744933,7412363057002848,2369014298036577,4767036959377763,6358989658901325,3613608288149863,6144086806546793,2939673540751723,6616781867645292,668287266261357,1595739295824238,5231172886741359,5013003483064688,470743740133745,5182319904455027,5006749612054900,5438247316199486,986342556797586,7290646946795895,9181204836901635,7408245579211131,8214242562793853,8179619952347522,3141528708696465,5713530335099268,7479750564327830,1819911057195398,5254637462372743,7294396717668744,930942508166892,1172166273147274,2918018713377175,6230392954998537,352969485871503,4801072976128400,3994412620949905,3860208655714706,6598554156032404,687234607038869,7425143088994328,4119457529694615,8484070723560942,8737093846073755,3670440710048156,8051188169226653,7669621840548254,4393435913249183,4366850751662496,8934230356422299,8877529014284745,5668932975172006,3348959455248807,7817893780506813,4476403498914218,7768134169630387,6727077308213797,2249471742093742,6853745063177629,3317834930166193,6738115733234079,343782584586678,3373358295148983,6516749068769720,8839772102870772,2281744710166970,5795082475182495,8108796282289672,4218869173285962,1142236586738110,4574690593909184,4680673727826370,6173475550951875,217139393472965,8713351703602299,6520170097390668,4443661389109706,1033988228383179,85581879065036,7715916157958221,7835816397859280,8506357168507882,337924958177747,5298161996392916,7771633428734422,1520343343200728,6479829693141796,1202611462666717,6920223193846864,2371969813817826,6287842243666403,971764325120485,3030942332666342,2643921926715879,647310320482792,1133008867920362,584184747397611,5698974035949802,5050183207832048,741964989884913,3939365420456436,5266432810835277,9158517736772242,1318555151235576,4489894149569017,8504318445699578,5197766734524923,4904686449183228,3695321365316095,2427935539255808,411304355492353,2254332010435074,7051457087278507,4203989482488324,8386050107666518,4130654810208775,4919988096936458,322163871183373,2399752354458128,3292152259844184,1862833239680771,7990288040497241,5086733885778456,483430114857497,7953373254644076,469204007727643,7513397067532475,502790180803101,5151083868776197,8301777126199840,1650318205641249,5418444724139099,5924387779537444,3171749025636901,5195377420374566,4166566816819751,755564211935786,6582768636066347,3665027000797740,6436286959744434,357404472730159,2086462370476592,2358792287939122,6729102177227315,5409836237264840,4850836042207468,4573774472110646,5475506867690081,1673245749981790,1918062346172987,888109998864956,6675160969700722,334941017674302,8704642656648195,6325025312643649,7939681612396113,2924255829006915,8118533643383364,140973768010309,3624344141853256,8337320853376629,3000594687545931,2655661538796108,3310635905808973,6603561386583821,4453382421709392,9077404063196600,8378961118251602,2601070781467219,8346930913702484,5654564705858134,7827582807386711,5423923324889688,4890737951572569,2797712305298010,1719011406137947,689675629083229,2439086916850270,7238640504947813,9021779433651528,3688953076871777,3194267002013798,983965492641553,8168965417912937,595240490721898,1079088018735723,2626441980760684,3817213786548846,4785083561286077,1392417500699248,1664922342648433,783374713516658,8899432029414701,6945372108033178,8324515207287913,4819234530345592,6818101271298444,2134234189122171,8004082624213419,747852691208831,1362535028105857,6530933366268546,9083279025404548,4886857941971589,5999025016181384,5474704627696267,6559187810939532,718295377787533,5525876573229710,5726549417171053,9038129902420625,4340531356697234,6733123651049923,8293792806427443,3058017340930709,8179932472567382,8580981766384280,6630849161519367,8921189383793214,54379149910685,7862278304545438,3097530511522463,4551855188754710,8383084649539715,8822330898079468,1602688169734989,4048372338402417,9212889044314455,7176944437912234,5131803917114027,1941451513273010,1137256007364601,7091897916226018,8679101071976222,3324203025058486,8644077439027895,305675019213496,4421743471850170,2116629056160443,3586977722428092,8906267988484230,9156810954468469,9126624801139392,1070150225511106,3500454994191043,8288195187845883,3264824132039369,4759446921667276,603013180287695,1723602131696337,7666070168957650,3957201306710741,4972031586185943,1587065919820580,2530678821352155,6960858329201774,8421644303403742,5466763629264677,8664119596961232,2249855891350243,2828498617357028,6676868278336229,5898892256117478,8723899503441708,389459093609193,2567106835185106,5793101762347759,732521818557168,3429579347167985,8449166762585033,7330687640443636,8395018544755314,2469905281303286,7666984789648694,8175352420385459,1291777785398011,5203712045286141,8272037225704598,2130373681720064,8452999674706690,5074415546158891,1357998251987717,2857669385345798,6546971495903995,2479517489165064,312719278458668,66392080444170,7679024256688910,7018173696742162,6225339252171539,6676745935287086,4961703218596632,2910279557069593,5795307214584602,3176662757589787,5409911151000350,287157673724703,90684183462688,5100815978748707,3143934223723300,1846115581359238,5719641296982942,5012528916230951,6543697804313384,5688486546899753,3683239498195754,5920606737553202,6190741608316631,3100618371881437,8682864610530096,2550936644342578,4362511330001715,1761554798654260,892285588464437,4837226163301174,6811547014699832,5066604741522233,5818170272023354,5379134590842739,3175212528567101,9036031678400751,6762883419536181,8681139700815842,9138130565850311,1110171733969733,1473600719792967,8114130420253513,7165831581586251,361233159361356,2209778012417506,1016759847955279,5269633771729744,2405162766026552,498590113919827,2061438515958612,2296482023850837,9026234989508436,5710486266030905,400074408657752,1546683700595545,103359401474908,1612364709918522,4632908929708517,5189102510056712,7030424141986659,5856011383042916,6212096429406631,5629256264441068,2848642290848616,5966506815064159,4913916144075628,1483462741511024,7978104608375272,3275135036506995,8959556421790583,3218466906698616,7769207685738291,3373611700544378,5633355197873020,4860232204974974,5539027115694975,3438719628729216,1673925832381313,9137635568660224,6515674310951403,3453561350159236,6327066331216773,6020664057007949,1958716956502919,5572995144375176,2513492544771564,5973327613479820,354601973345166,6866866266651535,8834618076275223,4106060459996051,2341938067960725,1605747074447205,9183485021156274,6484266684613529,5183096202156954,7183796524044911,2615186033116060,2274625220348829,2751986815093662,7761588007545669,4753862594218912,3514309446642593,1689048002628515,8850135787991972,4164914812220325,5541522259155878,1363438804077479,5633451181585322,6080209131911156,5231783015957421,3417783751943086,4714251101973423,8764156558924720,6809484735800242,8363199897117619,535998059664309,9170068578490729,6420291157199457,4293138922791864,2136889515195321,7432104118011780,4658866741957563,8891419425609035,2664525340441533,3847918362239935,6432632751332288,2170395730047937,9117228304126497,6669350972574660,2527525857166277,479778639171745,3767390303003592,297417338604489,4539039888161740,8991941565017037,183180299187150,1094004894851917,4103468540144592,5156558909915640,7149373517499920,2353318927688659,7469126908046783,3892087702586326,972725006726649,4827990277665752,3460728496188377,266903890250628,1102800326071119,1088002956967876,8674423185757150,5941903535141855,3384398425463778,6982111029727739,8866684711101414,1618828893360977,3865022912914408,4459927046682108,4435824919346154,5606736540034215,3552864984540141,4451023425534959,6949389243618288,4107241556169713,1708999117556563,6324624060040181,9181432183657873,3639132180775927,8663174518778708,7738337224145407,7122882722031786,3462396073741310,1679582832954368,5087493269227008,1072807848328194,1501851358546947,7825727759940612,5246352789050373,7406400492469761,1041300510543816,2968110015685645,1935180284064783,2976636073245712,5393467622140945,6503016969402882,8313352296512292,7161662620406809,3885548085885978,1705855183283375,8037562930122220,3736723327671326,1479075309777953,6396243460871202,8815540510379057,6684196201006421,2588246175224871,4242492056267816,7483628359817052,3739214695955499,1720230236783661,8394630457387865,344288752236040,5181302437608499,111719966458933,3543840136369206,3348346589488086,5857165858638906,1792846003526715,574228812364298,844377313348671,3074662840190016,6027978828446787,2455130825274436,1703817787042890,2432406600135756,4717403822451789,3359733433988174,325548371414096,826307191247953,7198292914801750,3953819773267033,2014038675827802,1882815000654939,8016263991366690,3492120695471290,1038769801321567,67091842909281,2383946275294306,5903805098277987,1698768637447269,2857673489005670,8733827364428305,2332083056970857,4703872362577003,4151666313454702,1178473123823805,5595429627290736,3473041626240113,2553212788345971,3764701817529461,492019325185143,7743150799580680,6744203904997567,4183716398679164,145806933838973,6214262466123285,3917273671548032,6597677186917505,2469393090126980,8553341530612151,163799610997894,1871254638117057,4262821012302986,851922160258187,8137448243667138,876863053958287,4618519958035601,5612889453743251,8144596046501014,1985218508928151,2160410375012548,4603525896287386,3741136253787292,88837915409565,4214093577442464,9111619934933872,7714842322848934,4053946305502375,7054044082126359,1629271239054505,3984800202564778,7949280495744171,3334591383078063,9081520002612384,3824951995456690,2343200447673523,3633135012443317,4203836939955382,7035420024523959,8927777962982585,3576570656924858,6414727440448699,1261139646839996,448529274856650,6775428467344574,6473155794054339,1395102171325637,3844680074521799,98178532697288,3562653968919753,717300108426442,7085880149665314,7090565778543823,73300536724689,2164730200610002,7032564449445075,7470615746346197,8429486894413016,5907598710367450,8947154947038429,4583213122479326,5179740364070111,8079916243375328,6052375907478751,6680781253686498,8596752130451323,7706547570838964,5396336909262053,1973394574073041,89132244055272,5189338394721513,5126827360566508,5385016915643602,3388924901184751,5770520885001259,6015402872494291,9097154615713013,7196884047776507,6519227711394245,7087088700118265,4108707910041471,3884785778541820,5928584444171518,8930125518183680,8026157097745960,4038611913166083,3898084500223238,7837431347082113,559277914488072,4865434284041481,6765221367322183,6353870307184855,7914993174281841,2145200640140559,7911718426380738,3959210680474898,3583540648056084,772018825090325,6599297240220950,3018178211876120,116375641259289,4696861051485466,8768124597611805,3907758738509086,1962905547652997,7724362228590409,1855974784937250,7451440350356771,8495789723219388,9065422581822635,73507254412587,836804437001516,6048574314975794,8518919746356526,4878255589686575,5708248752697840,2637714021554398,7034826073904438,3471797159073079,945821052159288,3670156894467385,5293766549871677,1781455075945791,5608680039198479,8631596026215648,4074812450407746,2094383160479043,1452506426925622,7237691086959942,7551753621780529,5630606207559987,8650460015811127,1797540358808909,6119697118717262,6899063308371279,3573428406549840,2358959478581112,2731430700787026,2676406426053971,8824350955877716,727974161919317,3418851163940182,8473771991677497,8419231811036622,4137373152484697,7802176807484763,3703266651821404,1579058748333626,1253413043230046,5410453245779295,3740275832477024,2574115118433,6918175698443618,8503264631963438,8511316957306815,2599476318991718,7010657541410152,7568715373916732,5338425059292391,8453629640965816,3363258271456488,5843017319476205,6331240722118547,4774956738479476,7343795437727294,4296850362649975,8543024882002365,8184218275136890,1497951672200767,5193952124335485,4381839421783422,3913244075531157,4716552951778688,777177868498306,5562507704401283,2107115733200260,5252906841400709,3945444437982598,1063877312187783,2610410983216520,1952942354490761,1791609254989378,7225760769817837,2914876820907409,9065415666120600,7192764154237507,7400585969331605,7260528496393623,6629150534669720,595994703545753,7619886752128239,4489687866463645,9015768091031636,165783250974114,2887669761215907,4783459523577252,4138526987529640,5505403126828459,8454484290698562,414628247315885,5835085904170414,2318356855023025,2833949610749442,4303569897364915,4700146380979636,327022184350622,4373940536964534,908180472067511,6141287532750264,4155210953795001,5880431116878549,5337766048369866,9023698415171006,2018429419353535,5620083455255785,7446833813170763,7419948269517046,6169951179423175,6682329476640201,1647111356028363,3401832243125708,1714823344162254,1254696617428557,4935020402531792,1866092209673682,6700868850845140,1503628164789717,5812193157145938,8750672304235993,3629511828717018,8143952178441691,5671474465363421,4436148343526878,686772679109541,1176809609307616,1824035137277409,858814689805794,6635469726470275,6969556009856487,4179711235593704,8696833157017066,1617348594388460,4105072826484306,8013405101962734,3607164635944432,6847346584237554,2598080528991731,5972044307700990,944498893293046,5516901390472695,3663921159482873,1479205605219834,1526245799855612,8338553290552829,1029400485633536,5202432682399233,1855535348278786,7388671796090454,6607642519192271,3929798534010376,6048555425718059,9151316342619658,6634156767417867,9021409090372023,2611785583291919,5381266456350224,7306408752031249,8500658352283155,662906197235221,7140128472702935,5575324279055895,5497811937906200,6114999593509487,2963363803510300,3588034991382045,7707725151399113,6836054778629666,7533135843414040,8048347178467750,2461779423145509,8864978944716721,4867708883691048,2422754753136171,8170535507520297,8946162896185278,8259750109431343,4257639473126961,547770192948787,2285248658192990,6546767680609848,2939062779238324,3366877861316154,5654355770717755,8464710749851197,5017694007395902,2440057462025791,6556564210556480,3115568023846466,1155181785781829,872966354556487,4669259199784520,2410602772192845,3656769048674153,6183042265034320,2057617078787665,4748596385447506,1639288561391544,2199252376467030,3357754337189464,6340555309246041,7079178601453148,6176982374905437,1367504355108447,7275091436317729,5947868764690020,5725829180800959,2310704297901670,1917953512615868,5502527305487979,7244410578144876,1148212980764269,4541876375185006,1479949489557104,2198027247754865,4842343902406649,2910182167064180,7609701763282549,5103314159990377,7624278633242517,919710711748884,934326675981247,2679190286884476,6413799167801962,7255583205316222,7925000167757077,3601052121056897,4322260237268610,8573658881652356,2008357718828677,2434978049109638,8679176967329415,7164320814167690,878946724941456,698174771054226,7572966787454612,8017471155166830,5425598363459222,504646997276311,1412143593899673,5154412458720922,537883702421147,7239031561870618,3385019410312862,6245231607183007,5271906836203169,6584657644447394,907096692106915,2716002385815204,4743579364730534,2405223536234105,6917215296626345,8134125389498180,6069342820982444,4578795488486002,4873592615237725,8539002180753693,4000286368859824,828441535358920,6493500302544499,8125298456507674,5594454409262773,6509097835761785,4884702204092088,6455823303159482,8600894934186271,5385800344944316,1848364684625597,6179286090768062,8106171016556982,6190864946030880,5106735004665538,4137925226606275,3008721786498757,9009950654574280,1289611913643721,8110672377443423,1229359814428363,2647366777478092,5972052513908429,8125102211666552,6987793019784142,576501170493143,3101889022453464,6038993808673743,3002191940873950,4723862756372191,7693134314053344,6592190643805922,1877916592873190,7282008641411022,1478866830366332,4110175622977259,3182477637545708,4915460232384238,9222953684219631,3408745274822385,4931168596549364,7240123135578153,9026537249299833,8099380573335786,4042228197957370,2126411049580283,1985064654331644,4717602042408703,836010406062879,5178954515238882,2952133025343235,2733325909303044,2232646728347397,8960953201224053,2347316936275720,4500204904023817,1580460574390026,643805552955147,4377303771897612,6186205008858754,8303279328212750,4872393237082413,4669031571979224,8212432139702036,2775426268942101,8352513900544985,9016432633527940,66966455125786,1833674096012591,4392759080984348,9177847675194330,1577309112985374,9142067538817669,7042709558841121,720731546607394,7774153962149667,3107251082159750,2885577983409960,1438083766095659,1228583734550316,8192551089589554,5137443385786071,8782702915047215,4980489544550192,7492300887562033,5714532712099634,3466120522092339,2047748885620532,6442366011218425,8214996306663223,4667326661164856,172653613893433,2502054610313018,832860795617083,6818419078129468,3309915308003637,1433982190528320,4526389305794372,2643684761790277,4638502285795143,3168053376151369,4162798134556490,2660484945917239,8326241168137908,3445817397811021,2168871888832334,6453547360708920,8591318901346130,5969633292937379,1518680946605909,2103179912836298,8537549705907513,9149199291006544,6562460413552473,8370107597094747,5391927982520156,9039929380022699,8152347169415007,8031809941262177,5751175136623931,8241437150551016,2486135143909221,9109647219943013,1411087284823911,5190849441163112,4661443054415721,1753209387015377,8320698359170923,965246815065965,4627976285335869,6272241513512816,6806827846403953,7550358345293682,72070874111859,4624977382306774,4008471171037048,5021959439298425,7045753825151490,3595045086389567,4982974676555645,6638521191481214,2772951422978604,6908441755645248,5968319262398338,1037224474610169,5758468658907012,4290962296741765,7880014653613332,2867971337730028,7966627389484938,2349177678387002,9073154117139794,8227770077508930,825017099165582,1330365165995919,2074662575902611,5047806218942356,7425557543609791,8266042263276057,6291911550805912,7269990294187929,5112263656081307,2506216647071644,116685785503645,2224619618897822,5386365917633484,5852452202166176,9138234408757520,8961975362004861,6889567834845543,4122787771912100,5415009778440102,6626779686780841,2658486607613866,7533375648557605,8331280432987782,4932758849927837,4383477444419504,5817598664859569,1583871118942130,1180817055639317,4840930510286773,4974176450084791,4148594506246072,1254442244333497,4609114566027194,730274903996,3886920798768668,3266723430758335,3751081136279489,8761802148420939,3523673055772612,2293101935376325,6254484896745414,596867587835847,4658850104080328,7985492773851082,2451412118568907,5903743629679726,4981328064874446,4515749759541199,2803737362835409,8110267125778387,3672912181997525,3700839582453719,6731058334400476,4535528357369826,114977286291427,5901500508798630,6050586513198417,6712264975605739,3227092167575191,2934549999068598,6126340943939566,2097909630339055,7365061012338037,1552749406914548,1849738001085438,4273163349020663,8206447282095006,3574790615582713,1296868797427708,7195784235090698,4406556360760661],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/46656e34e01f58e22f22a622f44fa658",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000952215.1/GCA_000952215.1_ASM95221v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JYMB01000001.1 Enterobacter cloacae strain MNCRE30 CRE30_contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"46656e34e01f58e22f22a622f44fa658\",\"mins\":[4444292660404224,8560108967976961,28844980408322,812204007252651,1970097281110020,8186664331725531,7994945089144833,5958784952397832,2459210835894283,8998316785283087,377071931625489,8591374006947858,6772588184150035,2130293504782356,1716991140670126,1604859536679245,2532910826145113,1205486921560089,120725991161882,8870436874936348,3742741021074778,1212699687665694,7356237035195325,8597266475515937,7831206055034915,8779563423244324,2339386315554853,6851143443243046,8266778655973415,3478402007310377,4881705621954603,2548579307233324,6420567337257650,1566762600710190,2935911275974704,1818699108646967,3635454582202424,4692716157325370,3952791583454559,6014418867702851,1958102266540095,4912906192851008,6660548609269825,171737529315394,6329395875663939,133581156053061,336877748569441,1951347522142282,3799486767116363,1941632494514252,2713784533811277,2224358656860239,1413213387151987,5529297311367254,8840944003982009,8621655799402324,4551979423506521,1267628744229890,5826296650799802,4810006303866974,1424126352572511,5415260710670434,7144588411577523,1862043465486436,1047512203795814,7466461220854041,4815055471059048,6846000087924841,6035543765582748,193104640139371,5251261108064364,1396778403184749,7003270129013437,5697175623508080,7793976468463729,1733251127455860,8556537024437677,1189114657366134,436432813031543,6818832234233977,5779041585049722,8224114400989887,5183701213192318,4861913658056725,991132750164096,1083617735479425,5496707118862468,2400141840859269,2855504718172294,5295082870825097,7578470472863351,5244217099964556,1593495968985232,1119919150563473,8024652595200146,2288325987889300,4666174586212502,1635969133146264,1412187159900315,8011637236102425,4553693270016157,7243526454538398,7317853696391877,50099672244387,4808462484275364,8836870118505158,2454282536386728,5683139849744553,2795924386422955,6973097582645420,4882212505194670,8660789534118453,67009535660208,2971092638495432,1989285614514355,219256461381812,1910062711509173,176407647285431,5603206575575224,1199114372792507,6418262408016586,7524900551561407,6092447834955968,2643310155882690,2757776019833028,6682377265433974,1623650722414790,3767695243428039,6851284767387713,1670526291538124,6288220300199970,2676726988521679,5749822972973264,2300327872762065,844088112484562,1958335824154835,1889473372942548,8379039707381973,6970470543260890,4695857709687002,1303762119262429,7384453032628448,2987020468121826,3689545552437475,4466484413501668,3643293607510246,3127470665519335,5199856333398248,2552467121832170,674360771559659,7609271824441599,7480439442366704,1542425437884657,717704666231027,5811430707998761,8445864933508802,5772586560184569,2450565222461690,372349193339131,377069384610045,2349356845629694,1698940261359871,8531476328120866,3654131261145345,4584016930345218,3981602675949827,572312571027716,1732814645256453,7578700490359046,6476437993777196,4791327526555916,1101423995453709,8089039634854158,3784195777446159,290814883971344,1683469769179410,8975889621759278,5888502400684308,2582773413642517,1201429851353368,2617438091579673,4563529957351706,7691773253730589,2220037139931423,7950814020683824,3487013636909787,4507873689534756,5244019832963365,3902906399138086,2403422805758248,6810597534657244,6816678752307327,357496269967660,8800229558677805,5887830961922350,5455562910239453,6044368929304880,1146454889861427,7431446733242676,8817428189848969,5910121347981624,2061714842960185,895190780301627,3179359951298876,1199837262086462,441074112467264,7452736996553025,7565793070278027,5163020288221508,8925957063067702,5541191062491463,4716847914037579,1014501422387533,1756771111108942,3289887646167375,7058131403710520,4845436850086226,6589637598241507,5985843027083604,6342709011683742,3485528599363927,828632546365786,5443372103508317,2877845973418336,3854093525619041,7384525458682210,2654529157067107,7344176925184357,5933455776629094,1605082731236753,813881272217963,3150676430750061,305347633254767,3350185509572977,9055698052493684,5887664894833013,2085006170875684,1068719311417720,2413522731942266,4808857808662907,596347172450685,3391905859735934,3546512244502911,280302043025792,6751168143294850,3751752603521412,5768316582962582,1985958093316486,2626850312507783,1683858250211720,108777174778249,5098567578816906,7350434741505431,990826458042764,1977922363761037,83397418496402,2854128186990996,8990659664605589,6371200050210611,4539714600493463,6697233920434584,6939360322566212,3890822428160414,6543297885180320,791459018191265,3663109761127835,291205865779620,591800199102887,885758721556904,6248702942138793,3717895044067754,4136197382082987,9094377126711472,7456848232325549,8954766365337433,4526480294699439,6172698989134256,4382119517303217,39025139958194,6813201467761078,7775024758494183,3146772590297528,3760926935470523,7004559098085284,8271337940033849,8901080519803637,1347260009546177,3355038998389186,7562078214203135,8408897307414986,5681544328514295,6276507555294999,4475452465141154,4146506218430929,8301686608474578,6790353886085587,5763639112917460,3168022275776981,7615873749742038,4396878916137432,4784690787628450,7780182077301211,6642048708373184,1224209826742749,4021435222843871,520705803977184,3868929682182625,340378506777060,6206157158319494,4436962874872295,8130751562387944,4373923543679640,6349655318802923,1852810387665388,6933980312670702,4553145559020015,6845406482750061,6297511012499955,1271531216421364,7721805861491454,5611818534007286,8323673997019543,477498388550136,2076690014713,1513384903664123,8556587709653500,7483165595084202,4106368200327678,3214216908011605,3549489630503428,7707473354377302,2125743934001921,4744021344702984,811116088235436,2862076585124363,6255705868415500,282993281103353,8880291889525262,2370221234017709,1947685983744530,4618491493855764,1748635203473943,5793845689360921,3190829283791387,4271239657198110,3594375103193633,3714881005212194,2521002441265700,3953429649306149,5342884019671590,6063410977345628,7975754683781674,7094933651653165,2694760901714478,6477049641020525,671930109809201,3343417539056178,3063990943658548,5888030277996638,4144362794967610,8842072663863391,3287208395522620,5136942129672766,9093140599782837,5302895891931712,8605660383522038,8962753657766468,2078783274754632,6767664504209993,17336501137997,7210570777932366,6545855969979149,1631946754053585,5146610656612945,8482553776723882,7677855636615267,2884290619896404,5200701903340118,697868253322681,6007564575175256,6781247298674788,8822086686011994,6324134267259663,8869780259209820,5835031995548255,468250291774048,5541343530750565,8190214312278801,2363411617170025,1636509422854762,1393845766399421,3363025795113585,5966243587322643,6810964494415294,5309062919365240,343840924885625,6348470565401210,1774668621525627,1391096221946493,7474226404692607,862804117000833,2499021446976130,171827798671467,994939443528324,2896301721510533,5880762087547528,1125793916850825,2009534680191628,4242963857481837,5798022241661584,4340605099123345,5652003012387477,3152422053188247,2818610018337432,6831185652694468,4084301764108954,7325725236572954,9071158411161266,2411786518520486,5495654297789095,29699315114667,6010125935784355,7189921946288815,7936468479710771,5550593178387122,7777687308645043,652344979616439,6830037517707676,4309170132579002,7997055052096188,6564781728314826,7130364188807870,7115482700128959,5529446987810759,6317062213624513,7017319589070553,4768244905386696,3295012552598218,6742219490454306,8583282060145358,7323545247257295,5593654870971088,8785723196285649,5247571002385107,9125592972193272,8548306574371620,3194162147409893,6605177033315038,4596079601963743,2899364769665761,4161278460609251,7599325991568102,458620108354279,3829207690912488,4671732291699433,3369226077856491,4167565453644526,991011384287983,3482584047325937,8301175498520471,4227279000031989,4290751944106743,2619221693108984,1635253801925914,4835558693191807,6653414209561340,5220347556662058,6879688296461852,4621821431128831,2351753822450432,3107143857369216,5860693220102915,318205095158533,872358937481991,3573544848814857,1230031707988747,4567471766696719,4857695283106579,297264622019348,5662399924142873,6135605046040988,7336235562226461,8319979055598024,6012584159383685,1816282691855136,2209492805193179,7292243068654372,4542637764244262,5442656380338983,8484647267397084,2782003020458119,8127610148741932,6160069455205170,194627703849779,7538770262782772,6453685217068510,9002501738439479,4585304309441337,4901064617743164,4408528158073661,5507805670425409,3306078812500802,4608715738851467,1075026752653261,1034393205965638,2902230343779144,492027526628169,7723643365708619,7661181878465356,4267956470354765,1872309631644495,1975760416942904,6748171956585955,4789223690269526,44287628964696,4736715360957276,8410633648406347,758222764401505,6255656902986555,1392986907120484,2646416084337509,8346101918774118,4358803398756497,9021264256735054,4620170073158505,1166262502175595,490148188054381,191859804648302,44951990182717,6950970903798640,8537368926298993,2302661636989812,7346314000774006,1769706409128823,6593845070701432,5468323597009785,2450914125702010,1949321903854461,6716866520580990,4211488200456341,4278889550877568,2612302716666753,4222562474337154,597852118500227,3785206615144855,2091516216334486,5505154995700614,1213461871147841,9106411101806286,4749033235575618,1119805256921998,1829121572455312,7660176134459544,8949010671235986,5200045230756758,5081629980194969,8356791591543972,2659260710613914,8292957084844955,2034571697456028,2500974424781726,3707554817059653,640058204193697,2418066212696902,1934528151166449,7991568419165096,5563825550242730,6207936519410603,4953149820658604,7596469345474034,2121589401351087,6445239629124528,9133830455006129,8856498998928306,7473400967243899,8862154917254818,3336605611099066,2427567592407996,9043415599866813,1295681114407870,676279003382719,668440985996107,7522527204470411,5434873457790454,8201614961218503,2841996144952265,567125959521227,817693849438903,9092887195920627,3555327264490447,5825056845938168,584468261290963,7706587482040069,2822060571186134,1567489765954519,7788142795630756,185113406297050,8444249449364303,881570650624530,4590127409964000,3818744099403095,5398069431497696,2388677840999398,4694178996527953,2752853406634984,7054924376006459,6179740639540203,7853069209397049,2574579456959470,9035802382113341,8064985729740957,1310337054942193,368683384230899,3405870452118518,1872340974183418,32149270963198,2354853729330175,8869492274730496,1650841262441474,2610602924487684,7814768413537110,8578456502834186,4703263374144524,2665173574112270,2714854963647503,4658970019992594,4858111454233619,607721512363028,8942633397239982,8650300355298326,7880061409553241,2103098482299928,8922459893659140,680705081553946,5480382482741423,5168263319016476,5952467972214593,1924597918307359,1889849438438432,2889974471058465,8245777860264653,1942926151545891,4875905590416421,6166747151939761,4528338812834856,1503719553287209,2372322075251754,4224780458898283,8804095451694410,3669828795401264,2718860142670897,3393945886839858,2477363551667251,7858152526272456,2569222592214447,392612759381048,5246037579337908,7847363843949626,3869115888642911,3290607609107523,1394397519418436,2656250638259271,8893977635613499,3161509814383690,2904758868046007,6044673725648843,3271163161642063,7994429600072874,8324773262682979,3634948583343600,5653268450083930,2126681557705820,8866094337287261,3741746960954463,1875835868197984,6657899081450593,1711472764716131,7014564506564831,9071664336630995,1271007731909736,4450393570776169,3043540571047022,6933915280340079,1322854500418673,7695377927517298,67961224578164,7405955853052094,8202056359224438,8714251108562044,4449343608685694,1493034182415487,1523903461667968,7116649040163969,4557938860618883,1938659486459012,5960990383617159,8549370003574295,3628957203321996,2377072541811854,1740104453760143,513555806518808,7559036676348099,3930376034493588,5695866157606041,1442776393753754,2159554855527580,8542080275256477,7962977805541573,5951108954088612,7118036754616518,71889932481702,4051441532322983,6675641367086248,421278874678441,5167093329052842,3928720296395949,2716164982695086,5854082564240925,9111450430051504,1095971864274097,9067715226133682,254357734503603,6644631174882262,9181613308688375,2880797389227192,2824575287751865,7046978525791953,3054534824928443,5934064858162701,191933797840062,1276829185627328,6969418435000523,6228543997240517,8055156119888262,317074557672993,368829420668104,2138111456372940,8823180764656842,252560700916599,4587460337935564,8189951464797390,6360621666446200,8540963970360531,1039026789115094,8373281723393241,6470265896637660,604324224418682,1811519486940382,4013472888358112,8067779146634466,4854658935473379,5595068352242917,3819295924412625,6447993321374953,7258410441613030,1984487144301805,8820332172564607,1397245118305521,7019770675402385,1301585569543412,8745694693114750,5063421919061238,3253941907811881,5313584148411641,8298699785372924,9137778224152789,1004058039530753,9129515132146946,4214595234444547,8145457696978180,5021911240848645,270288219538305,3930547112293640,5686990209289772,8248414519633162,852783785792779,5892195775100174,2676964277298733,7396782522856722,626649457370391,5426361602315544,4254126849914137,2245876063638812,401887289550109,1893218078713119,1822736669435169,8292451441559771,7551534964569382,1933149767017767,5045471255311658,5667777764889899,9203911142159661,6459674825631022,5134252620465457,5793904793998643,5530079151863092,2094950215312694,7401939367887847,6452512099546425,5768046187038127,2614116663252288,131001617519940,7810416986146122,4945189499204940,2302143995115746,6678126106961230,979592336868687,3956628154213714,8152194788327651,49308489105027,3097338243216726,3681691355149655,2449031616071001,5057939327898970,6101602389891983,6474263986517342,4069403888080223,1568550404171105,4676544164787555,3995567180223845,7603270596453734,8076445152211642,3878303300961640,3577569953166698,5921105789945196,3263718081201519,9032849992455742,1114372821042553,4748048633935229,2612711218496898,401795957859715,7361199218177412,2493527516681605,3461969400186246,1527560290538887,1563815290881417,5658490000950666,6633281741616523,4861059343472017,5095313125451158,8131818033130393,7816676781003409,978270619694660,930977850254747,3963252660082076,3764174567576474,1620588118853022,1679483909903775,1847294072300960,2183858922689954,7589835569997219,5940435923602579,9113761738638757,7286681358439846,1474265929928945,4320189643183529,6074299472266666,4562854340539819,2227481306654124,2242400658208173,894109469394350,2933953989268911,5879582102992304,3597075797190066,6239037137012147,2007629697099189,2897111044859321,2974390973900218,5782069055714748,4741589963961789,6219878741738942,3876624665663733,4658535184307651,5609943416931780,2785959738840517,4419010982725064,5164141291636170,4723737427174861,7629680811887270,4983272580863440,2109814557959633,1628863376549330,936918614951379,2365877782394324,1025051910061646,865828296111577,1263652160239069,1195173870593502,7492640740877792,2856746470831585,6064109002618338,5399405907878139,2908967752914404,8389311921811749,433058609808870,7669148189427964,7304840538315442,6209991743096299,3169338666886636,7181131465150034,2787746882913774,7617567772677615,3953814900385264,7075678367953036,7594162111731283,4548629880055285,239560443282935,4777947315869177,3843368579450363,8990934205720060,4242274525136383,2553348161631744,8219836106802689,3985740974585346,4494708935300611,3110156105336324,2915486520116822,3282126815062273,2657053109708297,2023630537668109,1138019182888462,7403760095159730,1689213078554128,8271181509144835,7267848893395375,9058556482610714,4054841320988,3473265270863389,4146488943851038,586087433208069,3863090068862496,3710751087699489,246333945202211,1149395585812005,2049179301963303,1093641230857770,603390429070892,4041067557578285,437894317278769,262106324121139,5437535644182069,6029000792581688,6209803830261305,594507726669370,7098764136252987,6910476868240956,6291213113620030,1950861915294463,4098538111870528,3328218348099139,3762962183792196,4177644879767109,1387354334922337,6493159177670924,7231623609126211,7550205909988939,8269513020958287,2783712639768144,6156729269081699,3935693785159253,3559946507437654,7844495014562745,9089779998730897,5301471215191642,6300205587319055,1229367238469213,7846438904866399,2665383021359376,42595201500503,5205395221784163,9090915875767908,7909955567212134,3954716088718950,8121456056182375,4728076667020904,6552202510684434,2969906251545533,857167257892464,3527384571827825,4503419537131124,1474858316551797,1241067233416823,4318461303215738,1685522697787006,199214880776469,7084825750111874,6387469402039939,6433320773359237,8350358619417537,8535236606019211,1902758161726402,6299733183340141,6084892299133208,7216214774273682,3901168918692803,464601045960340,8850955797620373,3517273203020057,373220824913561,8650933937612442,8510157984261743,7185360498640217,8933309977629637,5127895750260385,7168752287753890,4485090167125668,2325033775351461,1585471360001702,1278909074138791,6233622519441064,5517676383033001,3555167304459948,7965996735496692,31856644384431,1721187425593008,2420075337332401,6753197316789939,2176707125954228,3874740968100809,330490159929017,9145282709034682,7777485191254303,310132391458492,5296545416727498,5648877308307134,7379698444635765,7371873812346560,7757773647812289,6861151939970754,5851834900317893,4317387257190088,2111147329314473,538489902479050,87436598998647,5290242021091020,1946136613013197,4909797890070224,3150113997338321,1591497564747475,1020328807089876,3508443110905559,5242697689642713,4530215035266778,3546606070085339,4446630222137052,223498473543389,6509244936788261,1316838646253281,3980435720242915,3291259959245777,7552727705593578,8188435921656827,6235354561611594,817009745495789,7736960458811118,5420701161815677,7263755160368880,5309284605880050,8083106045177470,1300271734642422,8605895030490871,2228844379811716,5457476561471231,1330689851825792,865795065046786,2224699908552451,5177622580950788,5634734374088802,7591642193772161,9202999813429000,1705315402184460,4531500419414317,8314571347343120,2338615536228113,6031995142739730,4958480492183171,929669042239253,2660793489798935,8586825391949592,4190941984147225,1620562135206191,7180325695080223,1670831218898722,2586260151843803,4618423142201124,8048046612725906,9103997739606259,5693184808233266,7332020592548829,2188071616244019,8843430435387189,2874083884300086,5097725975418681,3082755818256189,7619155347887769,4761322215909183,5893172793677632,2466516422772545,6138038964660035,3841607967196996,9204064322864965,2800068156495687,8932024371255113,4368138660554570,2032066977109835,6442802221397837,2676151636002638,915778171615055,7988991270123346,5237762536236887,4639882346854233,4661659095009116,7084867323200876,6074747978372375,5723360613174961,4566316781815650,6593190275204963,4498374832183140,3792108169815909,851254503303014,6966807104730769,1727997278578537,8885260138272618,7286127474468715,7030847132067698,353173405575027,6342903806292286,5790086484419348,7025107568117396,5220584069719930,4145232016111483,7086834455349119,3866121324771201,7187115446745853,4404979235391366,1782236440344455,4271337892714376,4918738666268555,9046751842977677,2506507201845134,2281809822807951,4693352156776336,7834570858161653,6064676106571802,2345786977187731,5084590906531231,4112409700681621,4467712315099031,5158827195160474,6717133165160347,6732361174565389,7669737456011168,5606715795629990,7017370584863729,8609688402040744,8292088109545454,3977407856338858,7894287098943815,7880570419119816,7821506599503789,2702650559784882,8691996268533406,4791619906242486,2685331410696125,4420424835774399,8677108571990327,1203933228971970,5188606338095044,941921546180551,4156564111124424,4459028494813129,1534645503301579,3058463012743116,3495930893019085,2686954869032911,1212788939782098,8155509641437464,2501288682854359,5098026210625496,3481564759087065,5574374331312091,6801409637731322,3660513193404382,8768410182827939,4605134993524706,4712520863251451,2428235422771172,5940478877251558,5107906611206119,2835843826141160,2202651607623335,1199038705739758,8312095540173821,4343002235690121,2225778183813105,3680731667482963,8859400733595637,4827418041456631,2294687895800148,537216432633850,1877746344101884,9110413900738218,6068339572246528,5881057946966017,1003115324594178,522570453710851,5759849853360132,6494117851433302,4534663395858438,3428145415821319,6434024476313611,1127530334185484,707729543492610,1007007495940112,1732877872744466,8186758030658563,7411893728008212,6808796687598762,4967310020532249,2110901449013275,3541075559710107,7941715573483550,5031102157858848,7266068570217069,5101683099736098,5574798741202983,7594951672920104,6723660405708841,5906613526427690,7204860841678891,71503019665452,6082861542780594,4998993413683248,4210791811098674,7600976263788894,3984346325542966,2889720097519675,8048979687770173,176695771551806,7588408019163199,8850575466864992,3304484080703554,4574002789537859,814209553803332,1726173691095109,8640485855007073,6212080519960648,5936407884857023,3097653981195277,8572888222902352,4778853730674770,6189797896748854,1570901517084757,2086740115585110,9066801855596217,7857832023242840,3648658654439514,3006915833538654,8092188527188063,8940086553258083,2800394399351661,368357487229031,4300658237604764,5781918346245263,1271761770477677,1429248486840430,8069640902854333,1071004676421744,8660027779180657,7709174679675429,4707090001692788,4642336363096181,7207873085977620,732769030037183,4823295417452668,1711753951660157,4736934188312703,6071139263961216,2582591387850038,2060547876870875,1365138155141255,6224691963185290,3407032504207499,1482006789675149,2521492212037774,2926287761363992,2428349768149141,1670760511608982,9106538483119516,8789228432890008,1616127266764953,5576572928875546,2821973975197854,3694174969632929,3297885793700003,2856215005730980,2273014493853861,780642201280881,1339891799394473,2787937362479274,515025743616173,746472455915695,4344394229610184,3113292384028859,1225255255320764,1062250948106429,3067038296746174,2980465354602687,7855294703048896,7853946822052855,5630288362731211,2118602051717317,432267718392007,1786013529127115,1267061236025548,871928416692430,1470006660241101,4390573064059088,7808521341715491,6182329548953812,6539366059972821,4248653312538759,6214554099362010,4543446766808783,2125394733193436,2098097520593117,3204676947290335,4810250062043361,393702221297890,6280845275477713,3876883601840364,9104695604250862,7125721834328445,3826033519868145,7603286229313235,1566312689821941,1068672360306935,1635550786308346,346483429128444,9203456711347242,3223662800599297,7283654856849667,4431238536546564,1328225253562629,4935045199931654,7459905953474823,4770215734941967,9077932450720017,9203478662740244,2106353481300245,5271511479519511,6974106336827122,2794726088595738,7108191586318619,8276465971238618,8972261043198238,6302155283685765,9079362095798560,8481624477703216,857741804721883,6501611622271269,2657518516681001,5439292915943722,2782940487840818,7342484902362140,247969931716317,8700934944903935,4268293312870705,1721551494723890,3034540635363635,5458295818370782,6991754543360311,6958199479928543,1518791833483581,4397664610548032,4969066544254688,5667927574325643,1225072248522465,7431593957501258,7138642862165119,8098252645788620,3350302174638477,8737479080905450,8326280193207352,2925541860101859,1910855576869204,6595228140312974,6404896235247958,5558214964574552,6873365519437662,2665436197402972,1687595743832414,3282585040423869,5900879278389601,302852256799077,9112233780332122,8244672688839016,3714008913643882,3549505106209131,167111605129618,4742985177201006,7473514371246447,483348184811890,3768806758979987,8134509833549020,7156022809111614,7716315517626742,7023124944132471,5410863497980723,4014008332310905,2824722181274687,7659763024402815,864919468194177,4110298319604098,7613834258386100,8114039928027524,1888474443184518,9212270320758878,4912310086031754,1252587884296587,6853217395825036,4048739180374414,6207469431720335,6581498650597776,184086076205459,3746954979817876,9180332746014041,3732976122218903,3868192136661400,7946688113572249,3693311772088730,2048807333751195,3016026810145180,2483123407350173,1744365055183262,4726580242951237,8211066445391429,6476310618368417,3406557645748635,8421668548876708,7762091808262568,4960568966224297,7744498115475884,2255790816496045,2537971039148463,2144042013316497,7389029053893704,2026582708156851,4089633802033588,3071911273994677,9085516818741686,3560983089125816,9152004065987001,7462690031190184,8353244333137534,8418932562811326,8528550981887733,59024066582976,7731577484341664,1406847466252738,7869809226639812,9151853518122742,1754284380907974,6282121712720327,6834950889069000,1137342792653257,5242641435748810,3262669777448695,1674382549166540,7508646438771150,4032335622449615,3290132279249363,4868520902584016,1946581522512341,3471800011381207,6612225533422042,4036856492001755,3244667270330846,6472019664353759,5017394930661856,25383992433121,8083870139730402,4298380828084708,1344799423166949,2185986679650790,2082260916406760,1787092600609258,7022566868010124,4469940958095853,6546247087573487,3134680232100264,4227717324679666,811813304941044,3513547076680181,3541206393355077,8918394810395049,1185919342668280,2664475266157050,4062415067048443,3054654285355518,5754706780658176,7736610087021057,5517878338494302,1717076381461003,8250049978376621,6338580034947600,8087141683616274,2313267609313255,4717055762352665,5670384764214205,1254342070413852,6504202220096602,4033322303244830,6351278241066757,8121440680372768,7129870444893935,7974420689071195,3494464078563876,2943694554282533,4771785060588072,3301399676963370,3647883477260844,6788848201763373,670914428271151,1852378164800048,8789042879359537,1680825151355443,262594028829236,3618165684083253,8857073254689335,5269882257033784,5271624012540340,4862791518321210,4260489899481660,2343956259883581,7492652689345086,7073063202781759,1816673688234560,6809612154567233,1097422610635331,5214288156301892,1036563931134533,802849472735814,359403822328394,3652223941663307,5567398658579020,4381122431277647,4913061698824785,1842232046553685,3783960695491158,325692784224231,1581425992940121,720229005032027,4489944845758888,5535492040059485,4571012553153118,596030456474209,6476052462066275,8187838546881124,7034534364002917,8850701699627934,4812894543608429,8980623435839933,3384527543057008,6155367671266408,2271189277293171,3137633757624949,6680866270341750,616348920683134,2302309959481985,7790604803514063,1791925378337412,3918617015749253,2747257304304262,8427735552432775,2819940917934728,4909525851372170,744890819944215,3553373785401996,3782891551349186,7841088724085390,5522774027487887,6093515728829073,6178112671427218,956826666085013,7678932688984267,679509460585113,886038873172634,6154289986960373,1211896639658653,247568671439518,3488929672001950,2214842700384929,5398725375666852,7032981936347814,2827861308312231,2864385447078569,8654931264012901,899465748671149,294985157462702,6530671581096625,179355814673074,5636960847248425,1493355201407671,4305306459151034,4516357200911035,7832092043782844,4552055457790656,7846887295794976,7732387541947673,1596188523674309,4044623925496518,5075903999593159,265649557461706,3175392835115723,3331987217996492,7101997526506427,1133411178367695,8177764025969361,8610160831974098,2548524024797907,1907926970855043,1690225019078436,558634948725466,4398455289891547,3972884329802460,897750395996893,4609582438607583,7012568978388302,5558982528199394,6154212182293219,1745701831783503,761348743555819,8955902511563218,2078314507528944,8586699809831666,7966740574632403,6458586564807412,8567218104113989,5667502475299575,2493807205587704,6956609547672315,4058459774061308,2658742488169213,6346853035215614,2307609995246335,401952307321600,303593247675520,765272604842754,5072325427702531,6086116811688708,9153942880764374,8560520806730503,15197047859976,6776391421053399,2555904373963532,3866098540800781,5661733113131686,845360089468623,8524082841753040,8567672989305622,245206025784089,7154573246709893,6238404571380512,6397635627617058,2326405875362596,7437035611972267,1525697583110950,162010297805607,275877612997418,966484279397511,8344523615316781,7840015776946990,4008445327237597,3019568812268336,6316722576141106,321059005307699,7519973712120629,5669356511669046,1170980026133303,3858229711407928,5836950521004511,4220571316271932,1481050643536702,7089214959443765,715985750204896,3454107954989891,1520368991028029,2636308784675654,4845913583680329,2153093754858315,4097782020987724,3268732687293263,7252257847745360,8406367019435167,6701896975092564,4928973526292281,1583397994588644,5746299957933199,6607258584640775,8000733824245562,3117211253955045,6992794857958240,7039131583875939,37878577412964,3914078643358565,7316778429066086,4692106943916904,676819538062189,2695068766649203,8386319025224567,5452767111498616,5385129736231807,2008965768108928,1509970614537090,4986390448610179,345216855567236,7508563783447388,5567417695110977,5115585908396524,118234020961165,1865253080566670,5869062561348213,5081496966650769,3193977971293075,3514170573904788,6297675284248097,4588690790603671,3947028548586393,5965998129658779,5085353505459102,7723025039526815,9166532062456736,6622320357657506,1637247697279907,6160225412164520,7130960624293020,6611515101460803,8776097312266891,4682936908331949,7485216110057866,4842313264327601,7635855483050930,8503417718993395,5164831714234003,1104341594061749,184966413138871,8696810946071480,1910611758715380,735017628736442,5948219247621874,9170496470035851,4460359290137533,3036599803698110,8364734362102719,8268078856485825,2343869363751874,1134457724828611,7109602177702390,4686259492187078,7511849441180615,6819358358207433,2320221634677706,8816913256583671,236789140429772,3124855700302797,7351321009101776,4205252401404408,6014635399814101,7175362990447576,3955585367272409,3529827418549211,3422265119431645,511311629044702,955658264976353,3539521391145467,2272665943731172,3683925562702822,9143156212235239,7706852683414505,807459265155476,2053875133185003,2287627561143276,6186108836764653,4066633881648110,390962782903281,1602403570934270,7433233499139241,395330714471416,3608666539416569,5756772280183802,1234994891607035,6754826401111210,4383663716117502,3083652970200063,6345871007214592,7065767173975042,7000695333705863,2938605665061892,7926343443270662,8588447741484040,8275266575149683,7844073543998475,2474581572361228,1612198448286733,7149947059444750,8836495646587919,5283601517997072,1337302999993361,1420934178380820,6644661110103061,3086686260542487,3901242407296026,7776942903663643,1188481914289180,2779335824563229,8122201133736453,4861338979146784,1659740180859939,3625994578656292,1669596679736358,4565353319176028,1087239907617834,8149360571879080,5236052894276654,7730266741811997,8477537851534385,5524438602742835,3401327904971828,4234419898689902,3817058567248952,6017702049987641,7468340773754057,4831061992959037,6631504424393790,2909400940379199,3096261538921536,4037119531945025,926780777589259,820420634684485,7838335740857415,2179515857032784,8437855533036044,217394733128778,6818876217306187,4094373137550414,2948863843957839,3727008298650704,7748380165065809,7418441342811220,6047808168654455,5207312869678167,3932194590170200,5070427350993715,842681529343066,2364641940503643,8887184383183965,8006111748374373,1008533136333921,195539820147899,2233483136972646,4702020635057254,5004191310343271,3889508425313384,4424666755918953,2698953119535634,941959196585071,7376315083108211,5594147601026163,7212680378481780,8080981753224311,8627973496911554,39064422341755,4422548529359999,1234156587592833,8517783141913792,7067879117939057,64286690499718,2763031711833223,8371551935787377,55325522693257,406604288887946,5101910255471755,780060840156300,7047168781622413,7297940388646030,1369627468271469,8757444370025617,866698421865618,3107958740327571,5113284982246548,2320286598503573,5712326290472005,4391859657274342,2458486763486366,1008357200174239,7979780218957566,6220090819583138,4029357882135067,4226824705342629,292424708642479,4769737178245660,5785930245328042,6275690824760463,5710070409871860,5811502989413552,4529442232294577,4804457914105011,2281754237959348,4434808510635191,428605865716920,6106767452892346,3420946054978747,5185970643557564,8569891547369184,2951245798165695,1825170070809794,8680015059429921,7165557788183752,5199172619935607,7865364043702818,8907971317120207,8998324443434193,5978539402751261,2184522665823445,5855779389325177,7795856852106456,2408828451028186,6289292168445147,902430156020956,5835414676731770,856939411815647,8631991440408699,5735265151651041,9105163706183547,6870784109817060,8543753783717095,3466355399720168,1218894356843754,1070146682748139,8594653622195374,5129204440255725,1447216588688622,121734488149231,929787798908145,6508354438537079,8669153162140916,7319182726126838,186228290608376,2707337395907833,1878041871822075,7479203076254974,7286111807241471,156855523515649,4172359573994755,4185604054652801,2071684557753611,5303691241250063,6309274863815313,4637594266049809,5054063533554962,9012131821755667,5121386269389035,1488221106904345,1812937464892698,6608823680682997,5571141421542684,2347599028088093,5890818330957145,7294894843653282,5784968342186199,1012188851764517,213811112545574,865953488489325,2674116223110441,2882824967229616,3279959607360814,1286297761111343,8616755703352627,1340397234523445,5682299087527222,502050830961976,8086811854694964,7653257557527867,7437364751842620,1351781971893565,357076974931262,7374716624079413,4432844597215771,860025299606850,2995699586370883,9050064747151149,7693595073154273,7880360698321303,1132997153271114,8353042924787771,8517909575593293,7125485065088343,3759314600480088,2421844278074713,3817722343624026,5710766310849884,6006395246116190,4769816767098207,6169716019148933,2708684479442273,4544741947059555,1927767490043238,9048025571917161,920875627158890,9011308057562476,6167312820907373,3077691530198383,5399976299859312,7896534302948721,3732838895151941,7363509604541673,7900926406745465,979982162402682,6641533437668731,2046669087319957,3612349408779651,2828902828023172,8374726624705926,7764665604299329,2489878891736456,5517675778964875,4827570998640012,32810048535950,4585342335712657,4813326647922015,7991533269042478,3148460527422868,5589579302237428,5776840037453210,2518281480498587,734462159105436,2622571337805215,4027732391783840,1720941844479393,3359882065489314,8686540580597727,6228632013718769,7886954497236393,1636955248729517,7126772201618862,7481023323418031,8290107292396486,6464448631872945,2933209576328629,1682428789198264,3067914405002681,8911026142256571,2852691338259902,4099035136519617,2310932547259842,3793902371933636,3547080663442678,8537426290060746,2322434028623560,4567735760444881,6763318299119059,2055835598859733,4299437465763065,4911211602734553,3370867543945969,4324969285672412,329251210202795,7281103466876383,2714540384337377,3380188613045730,3323975087869179,8960568049122789,7781212952803921,3352296352910826,6344785739447787,1061763631987985,7896422189121005,5866668355153392,371485589908977,2454386697952754,2567130072178165,4089444115946998,3102594434266916,4015543740407288,693720402365945,4140100665630204,6514675174783728,5940299509149182,5265420370710018,5746738702320516,7383800979515990,1561367596740103,6116172117623383,3871526753119756,5278201160474125,3975463128350226,5290110706335251,1209692254583385,608736174698008,1756687539404719,4239336270470685,136205437170949,2163948702785056,3106831271464481,2206896186809891,3918086055095844,4681999375695398,3905959758929449,4106213877943850,4744714558488107,2357374193933868,3345932495441455,6852541204665664,7108526460510463,965445144743478,2550832211295806,6931880560750517,3849646273351234,6458631298735685,9196123179321953,1516483617623624,2845775709683274,2901374376369742,1135357484195408,5921952715083346,4190871659146836,8491839273701903,8808469733248601,6417864021906208,7946726042127632,8281858584274416,7502744973545061,4868592349359377,6246285751244490,4619458277707369,6895487474052714,5925037331891066,2927652349268240,5823038480838374,153845989793394,825077356560318,3181461445612389,5168095931742143,4128009948565117,3688834933395070,961210547666560,5741908802012527,5002869311229571,6297660077223851,5471952866134666,6253659032829577,8249908098481802,1391227832669463,6540428647995330,8026143571655998,4830076610157453,2173770165857936,3357059595472531,2874952463498900,6293747495169305,7341525149435844,9047368407887514,5688318207005295,6804969147583800,4483101538561693,8457516129472159,1906440794795680,7589532867512508,8909735284461535,3772335379558055,1250015843516072,3080617309466281,5169920682685568,1191872184286891,2026454474346159,8319165458366231,3239914425253553,4625145933872818,4938306228481715,5462074836049588,4277335625461429,5675210570694326,4361297496284855,9081740634449404,7058717157179070,17696333971135,3295109604310720,7397432466957721,2927565505924802,4775128750243523,1913534656792853,3554990670675653,6832495631609542,5141482078531273,8518210462471588,8362615328326856,3851489416556239,8780493800001232,6550930271369077,4248625308647125,7556057615961814,5863958900990585,3354445276864217,7090764789976795,7203121770016476,3045054100217566,2193568360476383,4479644880248544,3353259488923362,3210796564188899,5445592812228324,8250608783044325,617447583071974,7166497916112616,3715222453141226,5534772885632295,2667754069520109,1551544600997615,3268119327235824,1393045929058034,365054728111128,4289438638479140,1849968521008413,7198845908131579,1469049987825405,1616057056259838,4239326784143104,3348389434216193,1709748004327170,8485899294667089,3859472213872389,7750814027308806,7137078482250911,5843184425930506,7533589858069859,7787150160179842,6541956535891903,8375345769074447,8523115918919640,8107043767759099,8296015503158822,9204674339383175,5728419252413627,3969105305145111,694201474627152,1815893752516377,4459950450335517,2129289223970590,7786012401265285,7641703360241440,2576512620023587,673485759287077,9043761777650021,7573894416912169,6371039208693547,1141469973098284,3492629126746612,533446587997998,7714762210233453,6607811912065912,4640673789259571,3706509230649140,4003541850251061,2305560507252534,7505191370957449,1547350175557444,2931302208663354,4060069104664379,1676986144395068,1153509914726205,8054082116239390,7338185931722560,2856373721149249,4110994996600642,4975825308819267,8467439858442052,3788436810846021,9098092418870399,4698594962403145,8102212384384274,2264219264479051,5010190571708238,2958453306752312,2514309868023636,8708935800841529,3603284933046104,1361860405317466,814069981499227,6494656334540637,3317515520364382,3143159119982431,7970574311038816,8400207690264417,8909970040852323,6706855935731686,1298335843372902,4912493433054142,3872560295411563,769035656732525,2366339438336824,4145181408096112,919337365499762,6801875022991219,6846051161226558,982666638020470,2670965789155191,2003027934408569,2212320778837883,8042385315538659,3885316062244735,2073715707596673,4754305308237700,2311229495394565,6924095394062214,7774900780081032,6953531281084298,8695103025554974,5307170334498702,4732224626237327,2772454580551569,2676132451610515,738264401850260,3271009838878613,4679044548935574,5000606183395225,6486549689221018,5185292997025691,6010757371525786,8353992583008158,4119496559112097,3421583296343970,4600930164326307,6254879516561230,8439325245739512,1379755657289642,854493463224235,6207397011083180,2742974764977180,614642763291293,6690640045883314,1906740412476555,6797214569716382,8905242881675190,1222163948162999,6231130891269956,4953461272252346,1324326644481979,8348394730450875,1054315394740158,154800089616320,7445856460439489,4553879641321410,3973467758186435,696587646627784,1645518695307255,3997573481664460,3778118486949840,8860137379367556,3421581594767315,4177730595770325,3788350342089604,8196900439740379,7711189110615385,5966581068423135,4104904612503522,6769448503488484,4002283196665829,4036300357476327,5094099165659112,4298346656514027,9193287141335021,3337491550412782,7614453785317360,8239351791910897,7581771395969010,8182757758321884,7997177392189438,7237289737012564,6673030593130492,282410866544638,7643210106829274],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/4b57274be5a768732716b9dc600a1f14",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900028085.1/GCA_900028085.1_14555_6_46_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FFDS01000001.1 TPA: Neisseria meningitidis strain 2842STDY5881483 genome assembly, contig: ERS514760SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"4b57274be5a768732716b9dc600a1f14\",\"mins\":[38817924173825,5100259079884803,3151211822321668,5570385732253703,9170861620080648,4557752136966154,1946926880968023,135937534973964,7455687611238415,2043199588497427,3264478203080725,1219158525765654,97335423301657,7797587932657691,6183416492625952,1442763333308449,815424615020578,836911276202022,864985011914791,65561252495400,6611453948973063,8560557924192301,3776179341815855,6396318540826673,1327419869860531,2292723950807092,2558612762940085,6868672173840448,5632887084619841,5156229612030019,4754450805540534,8070086841587786,2494183601589196,8950807782379597,7802197138038869,1173016094816338,6346054786349141,6034270075650136,5889829223508058,1575634138769500,6469699076737117,3435916200802398,720746295142496,285723212427361,7499539838466326,2734607785963620,734827582888041,8076864477749354,2564972579281003,2714222965505014,7003131705288813,924619839000687,4894809144635504,5893952855935090,3072244036587635,9084314277494901,5886274984034422,4540093020545146,1327141448126589,3372419887515669,2580925226897538,8288242039134339,7111466991622278,1054194599385225,824899554597002,1115243511457935,8724912007816899,6022481978155157,6783278823328889,309930287669405,8147093354769282,2547398116823199,2447705787277475,4135768060799145,6909207418407082,9095401617046215,3842631055428491,6672762272520366,5931412103647407,6254810726490290,7707168135799838,2264439069926772,6226280637673661,7975359125909315,1858587039982367,6113819124242465,6794621307492552,7312697545126090,5737110246398155,7716032082436300,841908330348749,8021453114751182,3396261535396048,5885887383873746,4609209577085139,290615440279765,434650760399062,1088251595409623,1457970859581657,1544101425852634,2922054599370972,1078685636618461,2637714021554398,3027712700834018,2495793099186404,4140890494928934,9025058125062375,2556040328263914,326136592543783,5714785752535277,4807968632248558,9094901810425213,7870618432581872,8454094335267057,5442318095808754,7155727241517300,1174969022447998,2250986612111616,3335546624989441,1319355284910338,5283616067191851,8576725296492805,6099354700001545,8179619952347522,1532293379240207,8701542172750098,438494691817748,4551855188754710,286937693145367,6332102138060847,5654417032450332,5239469881477406,8429473086405131,7244410578144876,9169768952838434,2001427799101731,3683799450093862,6737759419246250,3594676681406766,8630680180623436,6440982810485041,8301054501677362,6163896575056179,3730783236294967,3769454612920632,8450441695758649,7819522651684575,6801734451115516,5217532676925758,2542880816283969,3534284399731010,1541787943604547,6654187076792646,7069551626416456,9163647923542346,7605028079362988,213138952091980,7639416182205729,1222155560737103,7952143274666320,7506258097821479,1011015710785874,4281924684161763,8798692694439532,5487891855442266,191933768096092,8420743177095518,2369014298036577,702884938205541,8425874520554219,9170068578490729,4443413599029612,2698803055886701,6204293526977443,8223354307697010,9136697060966771,5807586055434613,2747761435615606,2992668497344890,2660855602041213,5106358351083902,6540729406071168,1778134811255169,5627244567970178,1565385567058307,4493597017004421,1346029830539659,2374380369777038,8227024691658353,6319473000276374,1150818014355863,5696561597933979,1940868191244701,4366850751662496,644095338414498,2983269606388131,2408432292934052,3354676275956136,2285863993979305,8583517584665671,896816288491951,2598166240660552,8982230112797106,234511533267382,8388103382221240,6398902180422074,8788064941774922,7541485932741054,4843250651560385,1996573371472322,7568216766888694,73597162269127,2891294535459272,2716853918396873,4064590593362379,7552137985651148,5814463478919634,667993028283811,6014915443273151,891854772728281,4700334267560414,2182361601028575,7291300706238945,977216858669538,6615987207866853,8961975362004861,7084669652795881,1352468053522922,5342757102748139,1184264251748848,741964989884913,4219398865349106,859062538021363,7540839429532149,3127063732029942,826740018348541,2892505365010942,919452363573759,7679137097906691,3198522820690436,6197386471672918,4130654810208775,1934002330429963,8903652066257421,7069217595134479,815850986068497,4127873538898450,7614183064599025,6707601609028116,5749041348145686,5908511969533017,7950472917355032,6796676458041775,8523605435648540,5017214826672669,7037717964470815,5544745437112753,5924083222796380,7747990570846765,2588190740557250,2457383750097458,2690340467313203,7162938880879156,5258433835149406,9047580475181226,4055726676521528,4628576962935354,5474479894245949,3843183596464702,2601672638474821,2434949006129249,5307937826665035,2867618226455116,6159952357110349,7378821095981646,6173582981919153,2390955746019923,107073583743572,1406498415233624,3354224285121113,3947284344187483,7329049421562298,5783371696949854,3552881265249,6393423933145698,5745390629976676,4542346640368229,823440670384744,6583683678735463,304814499277420,7452363653597806,7359388454501821,4639948581005940,7633986145008246,396336678337143,155470270425722,6149868963480187,5635559219053180,8911085938127485,7776241385069184,7099410774840768,6060578503959171,136268389118598,7364084904668586,2089077121969963,7229576544445066,4334443621473730,3758955213795982,3607354869346960,1351124319789715,995870206380694,3983222480220953,5790172740718703,1825774623849116,6805004937876125,3097530511522463,5704266029867681,7890243454436787,657999834622628,4494924090426822,6583335954812878,1992011753994921,9154159918289578,3669801530024623,4023015114199729,8341643848094386,5257409924776627,65372587152158,3324203025058486,5644172026725051,3586977722428092,5471125943563382,752465389497031,3378694471986636,32143750126283,4956877731387170,2105362656729810,2739258920829651,4634855366383105,4972031586185943,6311957940855294,993629148431066,1921242722249435,4298632168940253,8921941070119717,345350161167072,6835280494039777,7452140675607266,2249855891350243,2495440779485990,6688193936303228,1362804008395075,615889063191275,1026336735451884,5233225790184174,2722226026599549,9019085913422291,5972494735960820,3351280924539638,7913088365028088,5522051940477689,7166095196238589,8661607716555518,9132806078266599,8954989307504878,1251862442520363,2113507825783560,4600345632975631,3759656361884432,5622472636439313,1384040177572626,8348177832422166,4361498608218905,7225899052995354,412049292149531,2640463519445789,4452774479794974,287157673724703,5017621170889504,5096858568430369,4480787503319843,1659856879452965,1829303786474278,86426983305009,8556080903241124,744604270005037,8996593369025326,7201433412345309,3866022158879539,6347122181778228,5913050263003958,3434809799306039,8274850223526713,5992348130104122,3267204482970434,8318617790919677,3580673368701771,2669247088491341,9044422308324933,8631560877981707,1618828893360977,7042187336665938,2429430370523243,4852596782904150,486614221202266,8519104727407451,2376643722996574,2665989518451553,1498262160653086,1886895172834151,2848642290848616,8795658023197545,6733777524581226,4183323113614188,6120074787277678,4939686804243311,7904241158488946,9220194308353450,955809567529849,1392373452520315,5273920184372092,2194993540615037,1232194806887294,8508747861905557,7422419701567002,5825987109632900,8665101148629895,5572995144375176,5651935091053449,5713597093831563,9210742782743436,5515500995810192,6011861807233939,936762320933784,5346299919502235,8591463206529419,6945372108033178,294253865921438,388596648541089,5606932177509283,9146963695944614,4635132941738481,4107353083308968,5633451181585322,2679394057708460,3293867442722973,523923380503474,4490732610327475,4952739985814453,2622636875551670,7430848049505207,154960555271096,2959440355632060,7904320743730109,5628618709365695,1752711593008064,7348257264071249,2233537797328715,2714728349539830,7458958778493895,6366599543843784,8449166762585033,706225617347530,3456002743163852,8795754400068558,7798435131669691,459951257897943,4569169665532888,6796136741213145,5441460086660058,1098757625142235,2247590934373340,5649530571351006,3060281480422369,9074302555567077,4447441236029265,2224682073559010,1248770096063467,3552864984540141,2089331436268528,5611513479803889,3741340230183923,1537125487557104,1959073981008886,2725284336202921,6041478002326521,5754563822560250,7346554066522623,7122882722031786,1072807848328194,9065422581822635,2477352775582724,7235532819998948,1398085815321607,4926478228327433,4075081404797962,2968110015685645,13307624268814,917830970606609,8204740566948882,7949901899424787,8361023115405486,5134307584513047,5604213675936792,5971974842080285,7295062646776862,496428506326049,6396243460871202,7581895051795492,3559074083185841,4242492056267816,6903502746782377,2953862150870059,120937910191149,5239686779399214,111719966458933,6191113057500214,4005636378670141,1965486406992963,2455130825274436,5652121927916613,4748378817844295,1155581647492168,8213179247925994,2465587342222412,4424376365589582,2876343350713427,5542417335450708,1038087768310869,3135237119482966,1936468882658393,4427100179838044,6752703052334175,8754084643591696,2216652191272034,5903805098277987,6730082499195774,1527759629687911,7678403830908159,5978479046452335,7881612418821232,1178774044789873,3664591120381042,181400431448626,7932923709797493,2335032944082038,5441656821716088,551574341430804,177814595456124,145806933838973,3917273671548032,8624549941508716,8350328352484484,5093188865637510,2956842461147671,9165584951559309,351329355748496,1373537054184594,7983502937396419,6963752904324244,4603525896287386,7455245633559407,6418561454558364,2404751895782557,7140683555427754,3899118690198690,899280186238116,2255266406638790,7699103085022374,7826868923360424,600626401166505,8199152421799111,9134994507764909,1891089429327025,2587852166554802,72070874111859,5760896375614646,174997313311931,3013671724557500,3191805016556734,7701327492209857,7249066560625867,8272657268059332,1290210736501957,3429891054640326,1290447015269575,2005112206576841,4491911047994571,6062082001491148,6404555279146530,4375723725601998,2349631047666895,1973394574073041,334734742897877,2965658184585594,7695121821043937,4806914595364215,3529522672653540,8752410814395601,9222953684219631,1427434587995371,3815811071249646,306481496374511,4707071796655345,1312505984748787,1478114903508212,2941212667061493,2426847929519350,3019651862787321,1114942774842618,2165173509049595,704933221653757,3866905343042814,6974197775934677,5500549615019267,5688879042509014,8906610364421385,533304796028170,4271438154923277,1629086932577550,4031285852929295,8643898681793809,5137411688750356,7938795709433109,7932339816699158,308361553118489,7239031561870618,467335544828122,4621248313101600,650886718097968,1696970340037922,2982658402557221,4857504309155113,6943653136612651,6604630496589100,2358792287939122,6142096762992861,5504307514793264,1805247577226120,2170849717620024,3263765503821113,1496471551552827,2116412036992317,1523879400137269,6889712909352459,9203966702230849,5975778407890827,3678999800378692,2893555157654854,789459478854985,2958520282838347,1322516209737036,5245023736995150,9003009900832653,2676406426053971,1290111760289110,3887000834422103,1721824087205209,8575276342750555,3126967493705052,7802792317242717,5410453245779295,1472204020141409,2371934420176889,488709998245222,7752851385759079,3621141912302953,1070998481436011,5773993369439599,5274127806805361,6914931314507123,4105609634987380,3858635723892087,2522081799505277,132404851785621,3289981765754240,1604566336423297,1354388327507333,6153184805907849,2524982492411279,4331704324763025,5472613483230610,4319590106262931,7400585969331605,5448718801153430,6935536040953240,5857973207143833,7823259634152175,4119330361548195,7682054184039844,3597227741001128,4948270307118506,8638303722065323,7760845690985901,8104390132493213,1354354467782066,1161197965690291,8285499393258398,8159356095440116,2642314477604284,4383552216040893,6045125276020158,3287150326397173,2315016269706688,6434577674943937,1014965356686786,5225095868194243,6405704941686232,752197058944454,1249107906974625,6143363412630986,5974451031414219,2584174865776076,1714823344162254,8192826297157072,3606493327982033,6183764543737299,9117503249337220,7643011398833622,7087088700118265,5466769376437720,7560642369639897,2536370662768090,1524146615901661,8927340010864094,6865987321499103,1183538958587361,1958689423468002,6544038918141415,5341398431489514,8484070723560942,7109235784162802,5631247128570451,1146979533180406,4176266151507448,3663921159482873,124885730141691,1526245799855612,909358880660394,5268700123000318,6978783516964351,5924732097198336,1549874787563010,5862902285534724,8179932472567382,5554345500603911,8108796282289672,5092547519827465,5466350461044234,2693740957167115,2576663086167564,1273192013863170,7706304654749198,337874952439312,5423923324889688,9194729827936515,4826282234531348,6037820566527510,3137419614230039,7014768360250906,5991686723380763,2580357068256799,6010978452723234,797652338294315,4106885729752620,4802785451226671,2469737093092913,7776778810207155,9073837089998390,6583635386677513,3144617726524984,1579058748333626,813453570279202,1860319207714365,3115568023846466,5958724597708357,6907193869725254,3673436425494090,3755883712708173,4993985943387405,7939681612396113,2376127778403926,6911227041517143,4289188838553176,6579773741373019,3674794047303260,5484049627983453,5591991982718558,6028712750417506,2299569924036200,2400149034143339,1716270530719340,1082858470116973,7687903058595773,2910386408203888,7341778530945640,8288733761814130,5506755945719411,5227442717218420,3724046676707604,8996151922724479,6337445419736538,5978664546569859,4062962872663685,8412144537530305,4095691240144520,5564096305257844,7164320814167690,2136163033902731,8953559704030860,1251081614335938,5264461296365198,4890475442220653,6908756693257872,6962820352693905,1975888131145364,1586588535264917,1412143593899673,8934230356422299,9011816295860526,7179127394285216,7081063796143781,2293661601840807,2614236947048104,6917215296626345,5976727332435626,2330135778764459,5388178620876462,15160542774959,7479832618628040,4451622734419636,1811502562424502,8922022351515249,2582558043426492,6172778042544074,7395412170632897,4137925226606275,2956576363216580,5764989103560389,5798574796604643,5625352900093641,1229359814428363,1146201127526096,2942534026837714,2321998809495253,5983000855629529,4461662635106013,8268911130023646,2760711695863519,6890931717914336,2200384427865825,8069320485228260,7019542529360166,9158714899242961,1278090048036584,6407115936446186,2969308747767531,1982152139267820,4465868715861743,5061425343655665,3547929630948736,7226193446762227,1446900736558843,5131383597635326,4717602042408703,9137635568660224,2952133025343235,4016463796102916,6920919441118501,4706278363551495,7516773284387600,2325587368066349,1905929215069144,3973450018680594,4206697544707715,3034561777260308,7312580901042478,7753887508971286,7814406120969987,8753758580341651,3925107670484765,6256064832980767,4918258979651360,7920954972808496,1730890457820962,942518464958247,8142497676807976,6133744254760746,1559688127235883,5995216427462445,2920647794970414,2192433435815560,6007230768256819,2047748885620532,425194032035637,1680146718762808,5983411601563449,5574799430593829,8516280687636286,7186886899633983,4631085635166017,5992264637353611,8865229412179781,6702695373463366,318640316361697,2913507059025736,9071878139209356,5284495532044599,6020664057007949,718295377787533,1619606749112144,4442945435820344,9026234989508436,4398782324948822,3223376723425111,4272731124098906,6636119953715036,48593219653471,9037895178555232,7150107553792656,4855581087168354,6833930372892515,7157112269412290,8318835110231911,8956757878650958,2736382209245037,6351461829220207,3794406391919251,417944615233397,643857618069366,8359945739442153,4008471171037048,7572966787454612,7838002156660603,2100510872502141,2780857629726592,6377599036731266,2062872300830598,4921870004367240,352533504739308,6120315248707467,6642928343189388,7235310206857538,3389262090262414,2094383160479043,4787875001847701,8469193961762713,8660741041117083,1190323512385437,3100074015549342,604074866714529,7791783848023972,5640447190851495,4708078375725724,2243849441120175,3295459893579697,4874861922768818,719704575270835,2939062779238324,2660437493014453,4742984252907446,8525547614107575,4148594506246072,4770554057557947,7611988628199357,2370159673140213,8930464639709120,4771025758263233,6043839901548482,1798300482934724,5131066988269509,6579978303944646,5583424580964296,337593377720266,7748437022019575,8278082821906381,5460552048447438,8803535299964881,1338072358395860,8537549705907513,1762906333214679,3738054415970639,1545018218807262,5220732458613413,8238249668362208,5933320061018081,2321272966434786,114977286291427,9070230180308964,2889874976122854,5575324279055895,4363346807945193,993234041901034,4322377661087724,6875764440648018,3856993557749743,1674739436144626,8936090967855093,4126830742638583,1137256007364601,6046999560312828,6158091409897130],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/4f1bf83d739fa4d420ceb0aae9403400",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001366855.1/GCA_001366855.1_10607_2_11_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CHMH01000001.1 Salmonella enterica subsp. enterica serovar Typhi genome assembly 10607_2#11, scaffold ERS327362SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"4f1bf83d739fa4d420ceb0aae9403400\",\"mins\":[5899883759812294,7667242559123457,7142121365635074,8832940841975813,5500481590300678,33714525184007,6781576977846677,8961340170563452,7149019143905290,2003725184888844,7538830409318402,3074685262462990,7020060309848079,155830823456784,3348913372110866,3449892164485139,8247264029053197,3666544173096981,3250417144311833,841835917180954,1329129177767965,6652061552234527,6426478573129761,7567752747511843,312543422750757,7653629477826598,4350243599745031,7858600439742511,8781245490012168,2468692223627314,5043679904161843,5675901661478964,7547465771229238,8981126744596535,1532400603127865,5560402654953530,1086732900704315,4953237476569149,2198162296894,5429272783895221,8634023067414575,6246951338862089,7376740728343905,4346228865634376,5150220836593737,5510921714606156,2228149444509773,4142709335220303,4413466296205396,7699437898006542,7953805352283492,7661661148872794,4610790027702363,5951872424226908,8737067013126132,8709868313103717,1087389546942560,3547511032197221,3046934190174310,580002293616743,1951587606835307,8712222429098092,614117598728304,5595856690754618,675798713393268,1189114657366134,5842420426145911,6571847009566840,1160729994289273,8256658137195412,6903209903747195,1450361857089661,4858741714927746,2419947851556653,2533127438577004,1118548040110219,9117921582833804,3048697703739533,6231973802160273,2099869908435091,3220579656319124,6133390943420565,42268254855319,2864493289873562,4443544544104603,4657657665306780,2996476514086938,1380881938284702,7023088342458394,936075973243044,6980401474429351,6635331330359464,6032360780656812,1673967562956977,650551306137778,4197046924042419,2315390550597812,7301288408412341,7154164731192555,4458146038722747,8982782956413118,8400820012121461,5695311937183936,2920441813536962,7542189195321540,6278955061215429,7054749859827913,4640032178831562,6763953629155534,734190807951162,5717435355128016,3452273148465362,8927506911707348,4763585229107413,634835628724438,132263687037143,6854210870993113,8148649347528399,7003909459631223,7023383739617500,2972432946561245,5682379950731488,6559427145941217,2421205544034530,1125902530592995,4466484413501668,7055332613012549,8258305578123496,2115422369853673,7252117632917738,3213076491571435,3601540529979628,9013710678219636,2032666380553597,1307173302747377,7507799825498354,1184730021462259,4271376251439161,4424877218406646,7596565628064157,4825560274542841,6066866288050474,8029245432482408,1004510776971521,1156158785220870,1578988311843083,428966940319106,3011652750270737,4983272580863440,5231131468531758,2313840849371415,512065760100633,5101298975113499,2497533126410525,2420917941133598,1960346487296288,3900541634150689,8205039379147108,963704366062509,2512037354959146,5841693726925099,4279616639930668,2986434217500973,3454101319655731,7897604301570356,3021391463772469,3543270697087287,6630137174872378,6486366560624955,209777099018556,5690135547568446,8030581497893183,8178733033453226,6630741681000235,7567288214211979,7109926634643828,2207550833701200,3057984860864849,408986989610263,358472893305171,8832538327941779,2784447813493077,619222914013241,297717739503960,8195563525001561,595994403097589,4595584729410959,4628636252754269,6391180946272607,3854093525619041,7797290409255270,6284824850235755,8474700753287847,1515622212116846,8598622280609853,2875479673643379,2833074701422964,7664637125124473,7687732216357260,4808857808662907,5418417637122430,5133649707032959,6738942595015040,4600723580223873,6774257339310466,7241452761821572,5793286718508438,4709752988127623,2629446602621321,696310894365433,2095969561760140,2288712094724493,7022747690851053,3494800120402320,3888981362831762,907806612451733,1750192293802390,5277658521391511,9166107209953348,1984056380322543,3614784003117468,4334174176510365,3256840136970655,1308466320654755,3914090489461826,2421660401136037,2347551799898535,3906101247312296,6136216904610217,85776855069098,6053742209548715,4733576779141548,1932222325929782,8895901541220782,940213145788847,1027644789920179,7949008728069323,3468003891184055,222518498161084,5067407861301694,3392660871418304,1265001215648193,3755822690767298,471720962580931,8562189316408737,5269082233635272,2746759931082828,1473107342860746,191913654223307,2748361177846220,2922225705398733,4038398964289998,3603904732963279,114474105471440,3464476123365841,4906984463589842,4510804543881684,1782862355208953,6013743152714200,2766426039513561,4147229481234906,7235823689830876,7962500072292833,8559911958933986,6854997912162787,1294946232029668,2758264492147173,3149840717951463,7043159233139176,1046687379259881,930872963293674,8701922676152402,6938567795147246,997142266790383,5739066936098216,7777442779382258,651565429694965,966058389463543,4411291880649212,524147611447806,3583119003166805,6251429141955328,1404315542372867,996059339366916,1143446724145671,7731244410036744,6077713026503179,3507946976690702,7502222724588047,5870545779999248,8420355092097573,2410193198547474,2151652043604739,1989997902488085,4691692328538650,8207992784237083,7726114096026432,2154689808757283,2521002441265700,8583199448278195,8444411046870449,9125443279180328,8974838263099303,6509084823900717,1209885410484782,5383196484416048,1882484501008945,5138493665624626,5367164803007027,9210781741125476,7833563247771019,973973028467466,481393158509118,5704806173180480,233642889462339,3951151769940548,7890913031856711,8635755689570890,8715299787358795,7323835294949964,2472140177142350,8482136702620239,7599602189782884,5597608394555986,444359522337363,5780427990733266,5284633093022294,4872114199741015,274303073649240,2196089090658907,2167397794914908,2812912326649274,7803130107673651,6179709639530987,4818858557407842,676744876192356,8371918168690679,9039455019639398,2415738176799336,1703411556545129,634502016692842,6054476545831531,506873641599596,8659628277334637,216194601009774,8131742137712061,3363025795113585,7425176196366962,414921167815285,5564695883085791,5760999445373559,4453708423537273,2056152816267900,1724570649657981,2519785797448319,8639849475287147,5917500673159812,2942332323517062,6643267600130695,3167805276766857,2538368041894538,5121175980137239,6441102257816204,3723147829305997,8940528804162246,5015838702185240,775420119408067,8820099366415694,2708478246412950,2288553949987486,2642909110399647,7124671579803539,7530336652429424,988496938263203,5506859514252597,4062422159663784,4066287134741161,5647632053756586,8474743802331819,876290879189676,7158705250108081,8066174717787910,8797751287262526,398031542002462,6414218185663158,3400148493193915,6373218733589181,4266757400908478,5356814370709962,8187312762512160,687776326775490,4489746485416643,5011655231045750,1805301284967110,6682597705495239,7034658147467979,6191577713985611,5095278986728142,3686767431353039,7176956964511174,8655401750617715,4986078173842211,6441958794682489,6252745484687497,9095087195456217,6144407359025882,1869784025006811,4344411177177432,4655832299815649,3711510044373730,8581032561058532,7551743307844527,6406337245512422,7998852131324650,3051141314798317,1881126528430830,1348850511180527,5141715656196848,9077293606195953,1157923615327699,6985867287209862,4762036958961108,2033419603964669,4940717972017918,2055835598859733,2991609448162048,4757830880039681,3641283523318531,3398775252067078,533298712670983,1241020761522953,2300341877760778,566762934179287,9156501451643786,1668972437971727,4490535517451024,7618938367492881,9070563492909842,6609712885261075,8463962032318343,452975526679,3940306491763503,1596039444300572,3709829719098142,5470443723825951,7346955555791648,8747232437494561,5945995850982178,2623027730125604,7492539000721609,4071866172175144,5579773940218674,4828795254633263,4126004650177328,4957775544318088,1738462353646386,2761768064602931,3791611701965621,6912588088828726,4796204597642039,4901064617743164,798868643812160,1338203319067457,4833368247124802,7184391422245312,8887928089925461,983002602214213,8505742885010293,6575045633073992,9043503077340766,6851025416180554,1798831352435531,7803479018064013,7926284395672400,6533851262128977,7440207515271509,3859263718163939,8203419880003726,2723240064279382,2545185923302231,6933973702869849,3668908087326863,2608945270502237,5783001957613029,9063105580508001,50236427273058,6672333947474790,6134002501714791,3418771147354984,5647515952829290,264496461521771,1314202262917999,2128438396523381,1441494353546914,4839816082785144,3256915863896212,3036570263229307,2600419368797054,8186464642409343,4520272609932160,4328576230097793,4222562474337154,6364293130736515,1487675705533317,3094912929248134,7342712596759431,3220227803063176,4822719302087561,2995206309671819,8944160785390402,548416513213326,6396907213450446,2349567300653972,8336446076842901,5200814934590359,1755607425356697,3764174567576474,3910093462762396,1159544424768413,2428308208534430,6429776601063579,2316278106239908,2417982387782565,3648138902647718,8980657561393330,4112415658539847,794562638783404,6060333225833389,7266718050477913,5248185161894045,5976421305619376,5784390038203207,8851636510629363,6407665131514014,8619431967474614,2317703192163255,8153523721307064,1466698071463910,5305547338904506,7986979991066783,872408159298493,2552156920112062,7464819275826111,5936758195385280,5981719669089222,2166596848387015,8460228394893327,4781270823064521,9094472384897995,7972238557078476,8504163723803469,6589558900401106,8340405120926676,2771046292554709,8524515802033657,5531473759649956,4688507946681307,8200252460385244,4447216729056223,871709577090019,2477934950253540,4801531112670182,8347818126939473,7869360031254849,437563671057392,7952523352168616,7488866651544602,2200379227145203,7417630278575092,3987667524054526,4583736287888374,859476197024761,8778551257714310,5647799875933181,4676040385473365,6871481626158592,1891674251408388,894273844724744,7802673296602121,5972151396851482,3283637403927563,2226956289459212,6417956757935117,9162821235325795,3796616322409491,8229225330563731,1861947185983220,3196142507205654,2314307504759831,5802395270845466,1448880223941660,1228899360396319,175734808470560,7580535526937633,8987055669077026,4804380071625764,7948579634816518,8349950503662631,1030310028192604,1309199382606891,6107690259992754,3461504578257757,5469193354794504,4789307833095218,1540130197193779,8268120286951189,256280713643061,3174683943007286,95051134010889,2587738075083833,1464620563891258,2973437097387069,7566332212591730,1328190663705664,8837176724567106,2090172305962053,3615590913016903,622188910686599,7870326325810249,5757686916252746,2101773243126859,13661764940876,6226695216805389,9075893912813160,1935921914225745,8805606348729187,8329635154339491,4222079261377622,6609290369733719,377384294933592,782861886403673,2413403248510042,1561817631880284,1052977930028126,1032418317239393,4857733530797154,6131897686692963,4887649752966247,2441887717961173,4157968559989867,468081270490220,5267119911036014,6666623700743282,6341241357210739,380292373890165,6487376557675638,3216456733926519,5645638169871482,8838840152329922,5472524878075005,6395515818955903,9020938061956224,2511547896298347,7452288980348425,3164368610071689,2658354862584973,3931562626897038,5746299957933199,7000171664606352,4146651274744977,1017356947838098,3018161651127443,1243051266110614,170159509392921,3176775879189656,900162075620506,7375822005161079,7631417175467907,3617794764493981,6781921912881349,3149906855916704,8782973118321830,8464230606165160,5534376381355182,4921694918354095,5042974264650611,5434055855875252,761680236803254,2623504852497591,4921672993346744,5183762809169081,6115813926307006,5570081563865973,7158086979015880,3701266058921161,5103163479418058,6634422979384183,3392480305652941,1777431546033358,3399529205359823,4118822455425912,5742398999278802,2323754789332515,590640550487252,7934633255077918,6798493811123065,4566086768632921,4021120871982297,3418349251847386,8810441169180879,2554492164353573,4056976335058144,1586263062172897,6855473680928345,7330798937527527,6601495938585833,6515308128892139,4691498178217202,5366511980242163,4458190157075701,539261405611254,8117664457475625,7707162345727226,8060204161361147,4439187623639272,8804008150624457,3953193440961791,6560210596812032,7003518955537280,5572895169451266,3845889825453315,2791571609793796,7045651703901590,2689640009000200,1502873804653835,757680585356556,5114460015702914,4820100822807823,8519717240329489,6534779263724819,469614924858647,3567555766994201,2022825651647770,493622072034587,608678462596380,5339760056775965,2053245964989727,1667613825422631,5706903704126761,6472412795471146,1322574410237227,8222273776915756,2636674965853746,2061681405490478,3190549188796637,8309275975680385,4363884157567880,6060785987921101,2858050529764659,767018547668276,7494778308604140,538922793293110,815968354379065,8905791761032295,8761588900390205,5860247428091859,8597758869190197,8733304826938688,3170965927716161,176443782346056,7584009381496137,2003627071083851,6798921647281652,6317814990861647,7962448127673912,6605125460456334,7565801461286231,1707953079627563,7109073690596700,33325482419549,8989423247615328,1444811072210442,3545289693836643,4042892510496102,6258504989840744,7018227477992809,1709795956561258,8035649242548660,8229159631036624,4372807575288040,4884572939515250,3516199574144375,9168034149081501,3048716174910356,7883983063356795,8042950165752725,1101365094035008,8181637082788363,1488182483494275,651603508020612,5046549108106629,6483170352495664,8828143227951639,5440312139134345,8867481726778263,4800392856741260,8713442385643074,5689072710702478,3514751407928722,1414317840659861,7925066249065882,3713333490394523,3591212387227036,8414742353659293,874306321245598,7852664874857887,7535287209014689,1818158295602595,7398737924419142,4453036770313639,8967579758163370,2227481306654124,338031841936818,8764898673030582,4348508294940088,4571168539530681,4347967997023674,2964366848207093,1725652218955200,603723544886697,7281809625858595,6752275299386821,7614706359756230,5820795079153792,1650213179831756,6773037966919117,3964646268257743,1649230538233296,4467021060179409,8615754678904274,3308911444497875,182173807171029,8929331168974294,3332708485383639,214928036955608,4342464695952861,7761707923056094,8077472501913055,5762248554055137,8451615345698274,5029790084625891,6830305427912164,3703190419827622,3613476809405927,2082210848335336,7944623598202083,606376016274923,4075616248669676,6594829218051567,3018088443037168,6207312858162675,2128808349279732,2786299327542774,25043460490743,5454684516298074,8849879366800893,9169586316342782,26996850963968,3221671360820737,6034836883940564,2935616897984006,6373948582236417,2182079777469960,4953149820658604,680843690051082,4546327433016845,1670685532400557,872035560183313,7936960859923987,8709412136190894,7093807022224918,2232134182671895,7684269187824380,2062747392960025,6071674841031599,6477767439722013,7777640728958497,3567103089776162,1980107848689187,2422170018448932,849271146664198,3088193999304230,7712899375969523,7270114471530868,5836521522128341,3320126178838059,9091339809357706,229730930722351,6709796999637068,2896563856741938,558784005514805,7602930519402038,876228623607351,7637673616637016,2215385946845855,9004110310310837,6024992530792467,4330569518302785,1881937312843330,7328014713968136,5815431523857988,6521419425640294,9256413976137,3822953193010763,7094303869460066,7691162001838690,5967064669993229,121428072867410,2779054256531028,6530647323139001,7081314123486808,4986857663682139,4741826496558684,3336605611099066,8907873749530206,6464916939101793,7101997526506427,4945869523662436,8314654128694886,8007402726123111,8181401738344044,2046649241302637,3920291554035311,4013295382001264,5086700650174065,4472440995165812,2464279016109685,6369696787084918,4088830013236855,2329319645619834,7195724533933692,8804202034652798,7934195266143871,9159935469771807,4545913083242114,9097501646935683,7946685539878532,288301403063941,7139801138402237,6330150343472776,3251586299885194,7694331219583255,6161647960628379,445333053183634,8317888860350099,5466087268333204,3132925813753493,6876242254722710,950873040090775,1760823475619480,7186784560308682,8776679386799087,6488269287269999,4586720274589343,4500582573676193,1964369945540258,521191956194979,7698624449279653,8570474410001706,1673050334832241,4565460888479401,1657896321967786,3927989439489707,2898170455553708,3090491217254061,6330238278509074,3838182736778927,2644767429723826,6121314243708710,1209073613719220,3964901725763870,5128354617677496,6636136791344825,1347943642076859,3985229469161557,5308248343070399,2106825039062720,8422121531860673,4814106041388700,4112885253129923,9085846138920327,2896715108882117,9011623951365355,5417091227105569,2181459282015946,4407834142164683,561404979717838,5346624878614223,7360163519993554,4857157896107733,2172195632854746,4114752204367579,7679690893620708,5360393208252128,6919156008389585,2623306480537211,4140826588067556,6897277844240101,6691692128442631,3317863302006505,7552727705593578,6848696958514924,8329462250333934,9205620099043624,6600018023525827,533509815207667,4688264423161,5446757734995706,5127013415982843,1564915573237911,5033731931457277,6100220424144639,8690713741256448,5348637647970355,4211730115966724,7706587482040069,4461391563314950,6557797094194919,2874501914281741,3539105648775469,5829322722346769,4448483657553682,6461979553939075,3596723624655150,1290448240297750,1681060518999833,8538085435298228,5099977234687772,7127777288072154,1233591354898210,5491451344338566,1408255433402150,7238110203594535,7018756337716745,1240066836596521,6006913746245419,4608157651699500,2356193109284653,9153528767976556,8435536335704343,8123269404845704,2847759945615154,8084343777403337,4176217626351413,247623028684598,4978929370052407,3581632945383224,238635326994233,2022807142803258,5267795467916255,7996209448671036,2689074072549002,8856868821143735,4704893258154293,4039079064811328,3857916781078337,2562695284156226,5149732944166539,4674561936136004,5895348954294085,8807413122725702,8872342455375687,7956813340698590,2325087454635850,5329427935520587,3208220820035404,174025380063053,8350358619417537,3493536856844113,7676966294050642,3619704864651091,4058056754018132,5708433471903573,6792154760582998,4681347148076004,8769193780307802,7464474036447073,6895359992447771,1923545053628260,7517322524010345,4277668422666090,1309029966022507,8210708271458159,807543998326640,7573883049879410,5319258108381044,6690127582099317,8888762566276982,2273838361048952,7253121883555476,8056983904030677,8513165716478954,2591361253508993,2431286987570155,859452633241476,8947182068660101,1969983725987718,6596611524012353,7348159461862117,8386000389457803,4621666960222095,4134027119716240,960739989321619,3768676024248212,6395220159308173,5876766461540676,6363344116971418,6624552624052123,3785212094982044,7709178769450911,4317306224113568,6957628632032397,8830581879912354,8624660576636409,6079811412764583,4557177739372456,779230802116324,3977407856338858,5650354964412333,6245753702033326,1099516733503408,451120581445960,8678236338956212,1254267278784439,266407656232894,3585145642497983,4865933837871042,6463800501988731,5806282386102212,3292641942136774,9152864094315730,2618814530189258,6510543560293367,5185320825952205,7973421628504014,6728186912397267,5198938453792724,6609894173665238,6448080537816057,5752949606386206,6563315160206351,7267779940968298,4092171006515167,2388146285723984,7422386338265058,5852508892609531,2428235422771172,502402209470438,8540956756629616,8162169518446571,4298440151640044,8131906424004990,2436938215679983,4303042354923507,711625844209652,6572476717303798,2209075498903544,6371559945058298,7391576733557034,8962006973175777,4583725742856189,6757340653265237,5461642314091520,6514010774400683,2078384878950405,3909344174680070,5254879555438599,1966029162698412,8350554160662540,788509388883983,596173146403160,126590754007058,2591419040606230,2712603419187223,7771022354996166,1572356031411204,1465483891283631,6915139761246554,2838365919078430,7069137364666400,1689886201784353,7368375630518306,1542567626737699,3194265969334309,2654709635626244,7323291230337063,6885791500404778,542332090869805,3124796163946542,8641319291096072,3927327479265331,5456567116912692,8080443739596853,7681344302491298,1992590317054008,2239467549997113,3764789973760059,8972197871214536,9151998028335167,3640538450647105,5897682840872457,513942037088325,56608669681734,3992050605562209,5397772407666762,841688988907595,4876034909018188,3891026655107149,4487384124643410,5890424155301971,6213635920042253,3214216908011605,5541610094812070,5469901770803288,2293884384790617,2426041499756635,4874904316303455,5629260182255713,6069728631273571,7181642424816882,7955485635512422,8901583829756007,3240689394350186,5258637824211051,6610582313462802,6742330448062576,6674461591337074,3628818666887283,1265061373565044,4642336363096181,4799176339216502,3972519561250936,7055270432594041,5494529873852538,5106999170435195,6957668849370848,5949749411465342,567656662714496,2925276112783490,8093953642758507,2003661778198209,3519667105339528,5943693569702025,1431039489927307,3889415131871372,3453110641633421,3851755875379342,1286470239099023,2342265336165452,9207039731481571,563381985605783,240576739383448,3711982467758233,4505213965585434,5470776088650231,4510670544611487,9054144529922416,7916022112258210,1595571707394211,2856215005730980,488213304276147,4894627741890727,5897557270292648,1911565472123049,8655614835185430,7728824939763890,7486435108515441,6255191827925364,8572029258984479,2053365821274300,3028816728004799,6478693324941504,6919318501676064,7537762956503496,7398660690057199,6871151417497801,2142322034346189,5814708524050639,4017968855656657,4868153009834195,1348731958405334,7047595546483882,672446842483748,3266410232453338,2113964597550799,6726714915592413,5995058603178206,5500803861051616,3217409610930555,6539021957806308,7337473510742247,5242524731693288,6377031226337515,2756050571589868,8028711382618413,6441389764561135,3113800241694960,567624656677105,1093531385153918,4061335508363510,1883255014729975,6493604753066232,1298903626955002,6445941215377981,8087395110689234,2659414863595775,7501491578160732,8120972615432427,4145792771377411,6522369232711339,4018963969520001,901382993377545,5175614411331853,1978631044820971,1903633811736849,5453831423617298,7860563295190062,9001919699228952,4860977024514330,2376784102009115,6068951745511130,4355265301924126,2959725902522655,2446507305564449,832107770321186,5276875870660899,4635033598163237,4842591110428967,1559964211831175,2303363406350636,7459423677113394,4815710965823790,7345475783167709,3785404777568560,8948072973617457,1839335770655027,7506074640391648,4723936623815049,537468527651132,9108340639063401,7135138689866048,1185710905047361,2353045636462914,495957856627012,8732822431732790,263527479847239,636508945398088,7216881382848841,7529431108581383,1297876388792651,8188238830537036,3173983418288461,7199375808522574,1559264567765389,1987363902536791,6101227314106083,3567542418389334,2557360395654201,4144480892479833,8482247320140123,2677254289049948,3853552288262493,1878651296385374,518076508506512,5342369863289186,9189152930890189,875588512434532,7599583280454575,784658345687401,1274201991285098,1441515080396519,7420264629636114,6762326548171120,483348184811890,4266642012678516,3341507944806773,7706045317739626,8514999855516023,4475489118169465,5275550779992443,2635045495695742,4922365850573183,7442420044879452,79217249615595,594684579641732,171458001926534,2248768132221319,825220776753545,8122845796864407,2560549024704909,6311380195694991,5434272744008080,1424643346762131,4197490382637460,5886067841362327,1805222612016196,7888121911941436,4008786844260763,3347474192042397,3488929672001950,6023108566828101,5453500487326112,848721535216037,3013362941720998,5197256242571688,6285124191289756,2337907999791530,3191909348848711,2087057658268076,6786094656899502,1652352100161967,3830459211737521,3547746445719988,1351499112233401,6405262704085435,8146237756830794,5246312295995838,5643240862239167,1795544633412032,7798237498748139,4115262509640779,8203115445807557,4666726824311240,2596002053130697,3159701697063371,8683805861530063,1778242509294034,8617033189149140,8217173740493272,8617594212530649,7015790396824026,70265923824091,8737494948546981,5264418991348195,137216535475850,6503044550002428,709034931999143,1421602687768317,6190818471786992,2041544847788532,2875834899487222,8918394810395049,1623483434277370,1727169400580604,7768428034740650,2781804830206464,8482767251781347,2623969094720004,1678764707882070,3866479640349190,8033033516541697,8827502275498412,3049336886909451,8653219328845594,610187567974925,5032779958839823,7292063695995992,1362058257287698,5925563678702100,2578629647575763,1486714296027671,3888651889018628,3397433524734490,6084563426234799,4539192285477406,3525698514733600,5915543436481327,5482306434337159,6424427348334342,4081484619913766,8906999356996883,2830428014082601,8798429442419243,3647883477260844,8726171118783979,4702122660497976,6375221759576633,236779526220349,1868723269585470,3842524200319551,7175491926800962,1090196750293572,7415876291168837,5109677343119942,6350995657675873,8139503603427913,237579024980554,2593497153100366,1248655098574605,2756978422852176,7195380304001617,5538930468178514,6486681056620689,6559455690013113,4949250803364887,8412272893848153,4041186263318507,1723841151044188,68860408343653,905695458785890,6993885286025659,8802278723304036,7078612381736358,6173816214542952,9168492783108540,7289279608697077,6317547516011623,8873539462765164,6905166401787666,6231802442746480,5125200885148273,7443259159046770,3099485917346419,7849893361469886,8485871005645430,6477809343277687,5962973093775993,261926228597370,8691986296842875,6727004380413034,3834556389313150,6752249944660607,2011206057509312,5238815189355141,8830490007440006,1033582737816199,4363046466308744,541959268555401,1797303198165642,2284258909396759,6848628917275278,2656519453145744,4874952937597585,6889719627880899,8678249936640578,4990998160681621,3484996857019032,3241824526826137,3015999469947546,3328578741406365,6698810453519007,6523600333708400,4483026856942244,2827861308312231,996104492968617,3795949646809772,6053610728696946,1716991140670126,7431910899758877,1831872852277937,5924700975008924,6799443818203827,5076552093514421,7246535767870135,4657303421528765,4552055457790656,7510650862213406,3422892041732555,3893262846185781,4138536396356294,6627141941672648,1693196097063625,4526938645088970,2731215567239883,2663375620636116,8860608301697182,7714280745588975,8610160831974098,2095345928075987,1440431595780821,5846305864504171,9110095193161019,1122470271769306,661151481445087,8706805767408593,5294275793738467,5999096583673638,8316523916948235,3743924128819945,7845899009334221,3400632123194091,5321859951799021,9023651355835720,994308550015731,1669031183858421,4402143084781353,1686827846148564,241331235101436,324683648834301,6697017844206334,6745608545479424,1301957561166595,8147439718750982,4373650501020423,6102947123786133,3557677947017994,1454771836984078,4027944642979629,633106053221139,4242808956136212,2587905060653845,4282459337575190,2983461663113689,1394352714119960,6277968515992345,6749100151675674,6954816654531358,6513294958590117,7334034694511394,79007152802595,9219999120210726,8085875745540274,6061877385427753,4113101791480618,3392400392379181,2020250073688879,3958671937493810,7185609371896969,6380356678908729,8880291889525262,4485742654401343,7685708138618899,8423600816339777,7006477861972802,3679862672968843,3541206393355077,887173487123271,8620242805401399,4097782020987724,449764345883469,3519806489852751,258450410981176,4924746861189970,2392689065306595,1301362479006862,6993319233956695,236258353390052,8993294618434703,1606637797276508,3684105766338362,8663660378956021,3332795770415969,1844403335192545,37878577412964,4169990378150761,6875490626292586,4485906862390123,225988241742700,8070410143284370,5192118225382254,5815273360046959,7203659442744178,1577776738470771,6032490258537332,7651493222157173,9091035019410294,8126517757397481,1618375532108664,7353494121470841,7561213934209917,810343061699454,8936010286291840,3826303079451522,1647009746033131,7823876673358724,4044780944845701,8136858931350786,2178953385631553,2370614328806281,6381788502875018,2433898361486487,3071602639223693,2771552160193422,8836044945896600,6566694330678163,4430949784013717,7709598228405288,7534747515030431,3703468221782944,1087749313592225,1566846942448795,8794101093156637,623506968345510,2175595157154729,1915721120353196,4356857373629357,1842270257068974,2891255687486383,2918644271328178,5329499696528308,7786716067900341,9019362800240283,6289086425975736,1441066174626745,1040943956421563,7416259984048279,4931290167299232,1034714675772354,1226259361749955,6872140933143493,7269394299128774,6691524686203850,2480739659693003,1624628444294306,2937059272948686,6442802221397837,1362248611617744,613417479797713,2689747329985490,8221340797434836,6143824281017301,4968846076050390,4538817020914650,2586260151843803,4337747795659740,4213659193687005,6848715154045918,8762249175692665,7796793055394784,1246215536036834,2863072203533283,6369108943510500,7120044475317248,575477822707537,1853236189207528,2395106122251242,1965371690703851,4605274132618221,8243242683317231,7442703941164017,95299597556722,3921501740612595,340293622497790,4306624652393463,4698634642103289,1624739856092155,2568062394166268,1324846827502762,2850814782569471,3004522382838784,8842166304411478,5108863078898694,4251604574383111,6227845223521288,8806024658861065,6274217669696266,7184353675041803,2914795761445900,4033764552097332,7494115199962128,4303267609140241,3156944276864018,2651564593503251,6644661110103061,3617670596533271,460580543248900,3901242407296026,512954021885103,7908323244564859,6201058890836485,8095815471548891,192709735873570,6385224218438696,6129766677433385,126348862841351,1453655841397804,4816748791122990,5502372834475056,681137258208307,3017833617460280,5715979382246457,8166484168641595,6439808764488766,8316406735948864,4805170878549058,6561532477643843,3864457852496964,5340371733175365,8691880957919452,5160186787630153,7940050763817590,1523358345046826,942485145467980,3953546123213657,6703755820477520,2434095161834578,7949151372371811,5216364370234453,9204064322864965,5207312869678167,7136741540824068,5239204143814500,1410319990209626,3641000276525479,2758523067989087,8912480651807842,2245632752540773,8944700240505959,6481431658765416,4188440357612650,1738440261762156,3906946772961810,6643780079885422,816028610755696,7352387090567016,4792395065523314,4975515712535669,4950019763469430,4367683948641399,8177047268733601,5370043587824765,8890171324427391,1222138433469570,2772152389676907,1469954207157380,1757565792160901,3104849177443462,4719633696471916,3302306111401099,7047168781622413,6489699495729962,6713717946608784,6813038456700049,7653418342145170,8589163151539348,5384659971673238,2619373286444183,219447692176536,2742595427327131,3704351961062556,985804946554016,8492953013231472,5351105988451490,6341965661965475,7338650740165796,2638566291887462,8816146076716913,1412974396456104,4570022519684266,7754480598850732,8819000512647026,8631410209135790,322374640880817,6189027593407668,797327697349150,1882698016124090,5272267761249467,3418622779927740,8421898045016155,4720469031701696,3715410315993853,8946413257531458,1308274733636806,8722871821014166,5732776453729255,4636391883959503,5132931438341329,4640500744985810,3204064587711011,3221349532255438,8151705046617302,5909444756462808,1743355317378265,8109479692590287,3275061495259639,7515617957276894,8110724879183071,6309949354548450,1861632565100411,8813421552282852,897210929716453,1838459307412711,4819586886008041,1198633621900522,3213204488527083,794781823196370,5549519315487983,8044189006696602,8558117445246196,1220365941128437,2320417142562041,9018176141326926,8814608672129646,9158339605241045,6754270791711259,7834782129196290,8557552677895430,8373475303419144,9066127881272585,3393355308228148,8075764452631108,7241666060379016,4701171408325907,3060277196762388,3106839325465877,804790373657878,3608164999920857,1750788280769817,7933058750323995,3028497672363292,184817019104543,2145015248174370,6188354740509988,5716179479281542,6807447181351900,3665731451161895,4404284603714856,5049484353379548,5470905645585259,5519524013964588,8706108316571498,6882505380506927,4645519556905036,8346616019299633,3403126846356787,3112102230187317,2368011617017144,4923183834885434,1418934958083387,8573140353680291,6896755352687559,3978904572590945,4328667611110720,3362713583969504,2712469352295747,1306995003891012,3770662451658053,6615561519443270,5012702507887943,2362988176133448,1051831162182986,4733582183058764,3813095621360973,5921953278172494,7942717148176857,1678919681817942,7201677917277527,9201688738663555,9028049747389668,3613980998991065,7049335358254991,63061512760672,6739729734332304,3167854745169251,5556302789475684,4170096552906085,8487042812984679,6165527512231273,3743961606118764,330922710986642,4394433086984765,7390108201524594,2659429204105367,2491826544168309,5747091809356351,8621799452597628,1969290438471037,4050405426855294,4980337745317250,6704524459941099,4907229094236054,5308263417695623,6414820039056777,4702819983039883,3382919947849101,5238794761305486,3260711832345837,1262772867194256,338763742866833,7309197632105246,4067608178894646,4303018541751702,617149162377113,8039963334221208,2812252754570649,7026726828875162,1455195525717914,9223118495385181,5755148248369999,9081149777243962,5664558385331622,4005664091823528,3106216145069980,1089622775373227,2078878503951788,4890705677618605,8998721014763421,5326318714572209,9054561477373362,4640741145730483,8319220080893367,1682428789198264,6754404320407497,642426740977084,4895792177544637,8964935542801558,8970244747874230,2310932547259842,1827317143739843,4932159476088261,32720583388614,22436748869063,767086167363020,993037319900623,2582152908189187,8041472400510418,3164673918778835,4264172006899156,2436684815970894,8274609046761918,8557903874342361,5332383884406234,6683574890925532,7385281337638365,2731163567615454,9123221996191199,6275239700614624,8267467956307385,7221145385089366,4546705708781029,1731917309877734,2248842372953022,3636743414390248,6951475785969129,8558510186481575,4895394775191020,4352264832251086,1821788769451504,7545549560685342,3026526344056310,1667659350277625,1521917827547475,4056450730163707,7922407005390658,5146953896353278,8377045681753602,2085185168616963,630338109935108,5849647596177798,4730025346698760,1520670471814665,8111086886878733,9168269925387790,6900353371905552,9187019953255223,7676374671344503,6119824679149076,9097312802000814,4166112837037454,8634687974557524,1337628063174169,5458247778803631,3682556719074844,3976857796177437,8360121306811935,2206896186809891,8641401588059684,2070212227283419,7462740933910054,1906624155463208,4914140971938396,6249722101136938,5508172687384112,8795656055737608,575808750009907,4379186958081588,7191616510828090,5657379649166907,4193814242680380,4170570524204606,6931880560750517,2963931588390464,8006529920058635,4931346169429573,4761478884777542,4775245094784584,7663983071755849,1886288263519818,6031746233252390,8931368535989257,7542663025439330,5097795614465614,1552434896567887,8847647794654800,544158535630418,3116006636371540,8871264898674617,8427770585341528,6709366269492825,6492642808743323,5988120362038244,2128604220796510,291482944990815,5281919610588769,3234017377726050,8348394730450875,3546619208322660,3446677273681510,8600643100028520,2122484177682025,7891129803677291,5924457669303916,7421155197664877,8688098264865867,3431633236029039,1300654295630339,330786077326961,3827052685028979,2175217154575989,4953520941928055,5359003787251321,2767581460209274,5168095931742143,5622912960534679,983924183576191,9099768538697754,3390516959981186,1710000774639235,4902303102066309,4321959984561798,5109300718010988,97218239528215,1181330355248781,2250602223713936,2734910637948562,8206502183640108,2639786389040789,8504376026631449,6108079473434264,1388300688154265,5890500524613274,2240124539485851,2035006005800604,2754188550532767,3248962484850338,26287827857059,7148786573473734,1026377179139752,5571141421542684,3761600094219947,1256640649862830,8185968163311279,5723360613174961,8954332891131570,4277335625461429,8245057303801526,3169899476217801,3171002127912632,3441473387278010,6862983510023455,4188529001987777,7659188190363330,3554990670675653,5774588200541894,1297804887977673,8825445874978082,5422524323675854,3537635261353679,6154044390055632,7580133915541201,7971077281492691,5311467358931733,2948428341853914,8762439273176031,7339638253436636,3788885202019820,6707866534375134,6404007857589541,5495945521186071,7189924519128802,3887157124997170,5437966500200164,5293195954577125,2179376799342310,3329572358479591,8048905893588712,4118511580192039,3118987320689108,161703652773613,4935736916954862,7602933404559997,1506067859087088,5183848285932840,3501532163673843,969964248239860,210254306639605,9084508042341673,3393383322623736,1044805198452692,839793820454651,7018780894846716,2930455752163069,1832185633140479,5181701176680192,8756402017750788,3956611570896646,6708416662777611,8746250355763164,8730345418511159,3156079150759700,1362615270285077,744890819944215,7868000644939545,1123036446535450,3003977055285020,4135239890329373,7794594152009504,1470755860614448,7195267284487971,4850416975110790,3635554613849897,791032629477162,4381819528965931,6857270928428849,8823940150738227,5450391152627428,382444380241718,4545598467907383,8699554965830224,2997143991168826,1504556618186555,4686931442621749,4269687397535553,9120863595745931,116589162149174,4022759826374625,2141853098602315,1777196050722638,3816921235783504,5815850934161233,6097188754542422,4632328774704983,7265214886344676,664148708543802,1425717323808606,7016013522095967,8580785194524512,3986406154350435,4681292948524900,1271418044329829,4061806001348454,6044345273651048,422511308312425,1826330203983723,7038403765708000,2318304048316270,10488238202736,3723937100369777,2096898035052402,7423169727770483,161079824404340,1274620100427637,535174405242742,2099063362121591,5855779389325177,3085149344263487,6723338375213516,7007797886193533,7481277435571494,8857205691058837,542070582267778,1284782993231851,4470924445011845,1206211162570630,9004420450410376,6687712988946313,8831501810294666,8817294598954894,5036798356324239,1263700249378704,626856661077906,5497711469317443,4596977725284244,6929844442427285,5057533782544278,7087909241175960,5290138398113689,5099225536774042,5185292997025691,4157036191099546,2979863276426845,560595737354143,299338513289120,4119496559112097,912864977850274,4039545094061988,216567535951781,3895255234408358,6347233558867953,4017557037637544,3308097294602154,2243927260098475,7285281755504556,2446448248831917,6973420924260270,1756687539404719,6156443877859095,6798561494695857,2568568963432370,2750657723084724,3990411502493753,8905242881675190,8644602754274633,6030579112674681,4453509640376991,3917053492559807,8389710985342626,1443836017558269,3133091751006148,1754953295925189,918636738293702,5667165625081799,5343561945915586,3701757881196489,4363130678030282,1935543794859979,36290201018319,1188886142685137,1949512905760723,755903919173589,4519916921675735,898690320965592,1620056107462618,3829578382779381,7857866244499450,8642820142817957,1041656748867553,8752406983647202,3148414190718951,6060219132825123,4670341057243815,3924585430480893,8796314743239171,5464815035281393,7660657009844212,4859896893792245,3085856755960489,2542310866558968,3490271597518843],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/56b9e7bddb830ebe3faaf9923322b51e",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001419165.1/GCA_001419165.1_Campylobacter_jejuni_CVM_41933_v1.0_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JAKN01000001.1 Campylobacter jejuni CVM 41933 contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"56b9e7bddb830ebe3faaf9923322b51e\",\"mins\":[363953759254530,4905268034541574,4830716678408199,4615235404331018,1444525794539522,8591956237561872,1361649238313304,3652030990712850,6218779798768302,727109614186518,8310255750012951,8815092809155588,2332691452557338,2029461126070301,7718781393694753,6948912715635035,4942277240442916,4770554426056742,6413314833682471,6449523583453224,2569492910405673,6498119279505450,2238185480153136,6644835729618994,6032441117007923,2265431622260789,8855449883936823,4098544253481016,3680434603438023,2623364318117215,5559045987186748,6627447189094463,8902009645081952,2173067396644930,6031794687318084,7248645511137350,7064831402223687,4099598122063944,4633308419380920,1482237420664908,3213834099372109,5070720836941903,5668324007471184,6841832912040632,8740393120861763,5280416085090389,3889715001917531,1917140684322909,6715680905742433,7345023067791458,4947055461495712,7149729448173585,1430429596571752,1284218938654825,4832634303517714,9022122820117181,5447665099408744,7902328079423602,1164579022555251,5388739140200564,7658784011561874,7795395490255137,3334163802843273,3109049368629394,4519138228113555,8360956682435658,2403350729490581,7892351796823811,7498635144692420,187477920077980,4609451006242842,5193152376662174,3978370009221279,6932184255066272,168057907007649,3633061756182694,5051639380351148,1312698199107689,7380196713609391,4530574679330992,2138989144533171,3859273107837108,7521253991912137,3003667635798200,1638156799725940,1201473958863035,8073455905704128,4841722281195714,147832580356295,744534784788680,8548508096337612,1104025648228555,6636878357821646,119710866536656,8840882109670776,1919931635720910,2120912113729750,4869725406826712,5264038832251258,8353911554154718,1213468713185503,8621525119920352,9054509667551952,4187210269917410,6539689322721507,1950678536501477,752212056443110,1208020748251367,160258203715818,1058119130349810,2163597214484724,4880092065079541,7987388760873212,779658734815485,7129741505218815,768684779663618,57914762230019,8912969008732422,8508720437339476,2817226342590730,2671881033146641,4106092604299538,3806035032848666,1313937631586587,96771746519324,332450410692895,1107585695207712,7378654470742064,64006086779611,3732804878270757,2496453011894575,3792675341013296,5802038055702834,7379114235963699,6680747726283060,8126025350679262,3083652879704374,1114764850360632,256483771973948,2663727517906997,9096618745972966,1931477370790210,6758404192858435,2543437758622021,6135603612889417,8554591419418955,1662307836889421,1197609220544846,6086623474635087,4998392254544209,6332184546941270,6928060589551960,7929649902383450,6841353815152987,3234318755527006,7869450051461474,1203073777224036,4068535146553062,1312907530824038,2659270557565289,4113454429243760,2248632670403304,8155519286311283,7129406924525940,7866910292955843,6246593678852474,2325781332033915,5712340366926204,5113006762221949,6609090755107200,2173379378685676,1475868394602884,1100543895400841,1681849780394378,529396335151499,1646856318648716,8415197298289037,8882551414064687,3460888423326101,8770643109788054,5352198138409367,9200938444367940,6717801128905115,8143447480181048,3639401316800934,224588505407915,7586392630868398,6457380157313456,3017324229771698,8535039387365813,4534448101665865,2640038895086008,425330984903097,5822818882195898,371839192181180,4163024394176957,96671766266302,3535759378946496,6355984308201921,2333562545484226,7793634233072068,2798522293971398,4679828435311049,2590088820619735,8679203051739614,2820072512842211,1182836383222245,8983897766151234,1506017109522933,8611939314311673,6755374861234214,7960887331148285,1956720537661950,840230896023637,2597851514118656,678301500957186,4709663987755525,3281723787481610,497682353598987,3589217497350669,3084727340079635,2334120557810197,7556543128736279,5965498185832984,3292824729190941,6363303114775073,6807981881566299,3675026789534246,7801018321490471,5028509113002536,2542387866421803,8018282181921326,6354415716872752,3744701937521201,2148348142754354,2626319417152053,8594431114629686,5582452978571835,5848083602481726,5469723931161912,4241144450085440,5717685171679809,4118023840748102,1458913297281804,1586968314188362,4730129721938359,2085607670669901,8221378388595278,874297541638584,4522529291623523,6457134687289940,7688552065581497,2730494333278809,4820540862876090,5572096416522847,5565679430111840,6462260635895227,8615827551070820,2657359822387813,8118366629444198,6780845357790993,7685312231424616,5630634859649641,7319953512262251,8008882028118636,3551184786457199,6110907546350192,4450734652734065,8863337680314994,4065203926721140,6907836083042935,6966139068944489,6662423674686077,5594774837252734,7617614355327618,3062339100275332,5564599061377673,2384326245470999,848464921137805,382240487484047,173579999541904,7089079549014808,928423510141586,944430469479060,7746152360192667,7974026560709406,4818407562756891,576285205697189,5656113661045416,6672105840175786,6494462809764526,349528260319919,6592992693338800,1761319483278792,7453929239564403,1941250181942046,8499370034129353,3361743628980920,5290083073843898,1665996329460411,3867289658669757,3520756179563203,5999735476071108,6245191847746246,7180189744915145,4249937065042634,9208389176400503,6885899598285517,4252919555965646,3381661455540944,5601351797409571,3017091096355540,6800753752867542,7698286016436954,5900573777251035,4108031178212474,5469892536050398,8850616285612767,796979373169376,9145631548816222,196116631964389,5753233429799656,8356223084317420,6731364235248365,2469730424011502,183808268685091,5630352459039476,7423727690659441,2828854215918334,2014370602879747,6520020348689158,6960333328835335,1433288114346762,707694335797719,6791830091651852,461816453503758,1867434587953936,7318305446802193,8261074792720979,5933022094142595,1252465908065046,2129474832184087,970085885133592,3184878852815642,5267483017702171,533501461224220,1940183678341918,2136774018861856,8533039467369252,3864908759178021,4566413696400168,6452959463070506,3149569303569195,7393468290955293,312783809727280,6198813803762486,6846565554377528,9199771432104761,304342932069179,6015924127816514,8595348833710915,7614724096639812,6015693715415877,1889749148840778,2760530422229842,6807921141027670,5766327104090969,8967217039270746,8471240184812379,6159566911333212,7133473654526813,6607723462433630,5810180761817573,6967311367783264,1997484125434722,6357237477804903,6911717235465064,4831019953859433,6949971837741330,1849128834460523,3710913293323116,4237997823818605,8780764702589806,3598258457497064,5690718806201491,1027265022253940,6813879726007157,5648355575554934,6873031403381623,3435325700287352,15092563481468,2068328116073347,6886132005000075,820687411510159,1163790791443345,4332751921818514,4071826852373657,5457555083957144,5309324048475033,4654396060382109,5789205739942815,4084496287599520,2910919851695011,6758925943876516,3355297312746405,4800692944208807,1088397731394473,4098548487877546,1055954250852509,2973226916023216,7198988670673841,6403153438461427,5710090788832180,8225889797338037,2956650800610230,544894054240073,225935901371322,3236486179537738,4094919884510142,8701152066317417,5483517169939395,8557524982408134,7120663620525006,4317986489578449,417413658178515,4901928943094740,5217389583277019,7521721051419614,6457185397902501,1577061554684898,1899107689769957,6494019416558567,7415526710965224,6137478248336362,2268872759833580,7465865449975283,5290338812994548,1039066124411893,5773486811319288,1458644485678932,2915022567605383,2067761391800145,8963220147219457,7324980333763588,1565480922711047,4360271739452424,6636240406916107,1718136360234157,3509941268558864,4187357473022994,3496944528573465,8105359921144860,3956602037949469,5299621436471813,5767919205538848,5617091528170530,4876259754187811,5303651937422374,8660729830282284,4297734451237933,2241871575551023,7266309586865202,915622683208755,2214377243845685,7823599413062837,2856490869558337,7090787373722690,9167333690672195,3694827148389558,6509566974794822,1107586468219976,2731787734946889,4598593529537610,4603283713074252,6772682429764685,4462132732867662,5520649289034832,6247506730857656,5140740277163093,1040766423417943,5191911231470682,4166280212055131,5272676061508702,6270591149169760,613337743244386,4246410340234339,332702384954468,2878376029115496,7687399083322556,8453093513874538,5002470652025852,5525257910049903,1294569481730920,3018673321047154,3480625689453075,4707928666629236,7017699453713528,1462653335262330,7874212987797883,7259952395867265,4205542357515395,7441036846790185,3345441330201734,3562345302719623,3305195660635272,2954317258466156,5874185606605962,7255652187703490,2210692757402771,3737361139342484,8133905377516694,730573162097817,3070867123359385,3857113744710813,1687888595838476,459236579181729,5654256686103715,679115632653477,7623768201591977,772487627080874,5892223871614125,669451956200622,5531597652741298,6274800884286645,3346305466975414,4528769720009911,237581211161784,1776418540788596,1552644192654524,3632757168702325,2674311538767052,39316548003020,7490281261378773,5911705373779159,6879651816025306,7712170072738234,1098731293326556,6369666413788381,260074244493520,3259452805836005,3046600013602025,4792847399171309,4014700390036721,7710783770258674,5130977423564019,288873444678902,1518288682396919,5035314771830008,7393819215127802,5684347768667384,2825886795468032,396973706878210,3083977124510986,7132273563503883,4756318228751631,454484209354627,8183379426794772,3761769716852564,9070551930983706,2673070305727771,1414447474412829,4486878547072286,738381509115168,3448158842475056,2173907174067493,6899781225114921,1180831463163180,795862504576301,6343384100156722,7638111989435700,6565123019758902,858032932255032,8270586304922937,291956973409594,8913490747352384,1383718736864582,6463479470486855,8368979641316680,4896941767789899,2177343603133774,5956478083671377,7296570608731476,7576586396269910,6250465426247007,5294428268991840,6150328587224417,6953680079114811,3010902680167781,6151083957597544,7751824894313834,2939141147266411,2726809871140204,6840878828356973,2033658416598387,7591286662507070,1548165118467448,6468926045527417,2449581806843259,6481015164941692,2707619288637674,3531827957990783,7755360364941310,8827950916689283,3771344890740100,4067688667131270,4610221234052487,7650463627560333,4613778776638862,4839718891574673,958394004358723,619354949055894,6463779892663704,8612652288388200,6928846162777502,4608330583020962,265538985887141,7430227846671976,3283957870486954,5341932338525612,8097388716694959,9205410931797424,5764777557546418,5753937986505971,778854407435701,7590439149384125,4991304170638239,1499220438879676,2527652998632897,7521138785102411,7688007615892726,8760057643773383,2096120445881800,5532233885281737,8466293609286725,7370427917565217,6569820177130959,2800815376174545,8299938228162003,8469828654862926,6879770146737625,631793111315933,6981176739804644,6851583547819493,2284250702566887,3492555708386792,2727672860964329,2304868362558958,739324587771377,6091626680442355,189594918055417,1000126895551995,6912313946265514,5520902778004990,3621319947972096,5293074993239557,4150033525235208,5051514347181580,3935822681300226,8695198837929486,6606321288850962,880329795442195,6818769279436308,4187537498134037,680527356954201,8597112722023343,6663189668870064,4353189258919464,6486896258336297,3641733448984106,5200683558906461,8470080308123184,2660145386073649,7716813184254899,562707366317622,9073957162069562,7039709039885885,3364363368488515,3025733440912964,8504561991048118,3869473642020422,8173556351748778,3945132053356104,241119377991242,8938305615224395,6483462214825550,1041830427883087,4743784378439248,3750476317703764,6696531157171798,3366998777884247,1385566454621785,8411095598472122,377941983190623,768357197629025,2611394916152934,160395593956967,7193190246790760,8045753174298218,2838718120951404,4894868376987922,5165373352627825,8911796727946697,8673546076544275,8962555190017655,8165432826830457,4970842568646266,5190602421651067,2839600221269628,2179069219999359,6007448768439936,1472032452374145,8327007652527748,795637838564998,7830078129870028,6609291795652235,8378878803055530,761348494614161,1633646798935698,8594907319502267,4771952113215127,2020530109484697,2838880968289947,3424264375862944,4758923208691365,1485863048840870,2452932911838887,1218159161859752,8028505430644394,6041024335959723,8052350776258220,8997210176859939,975146033665720,8817538830724346,4503729848762043,7908405372538556,5041325081648831,1703871048214213,7195113414790855,4594077358156407,6781347984649932,5452916115043817,1981724630509265,4182463843897043,5178131653424854,582814727034586,4681058840952539,2946006133860060,8163363753385694,8278277673438947,5680751052973798,2771633342696401,5941113257118867,6605070437916394,4156182910521068,3523574563253203,449942821576446,7450910977236735,2383021559480064,5822778841933571,6639768137221895,1158123058259726,402327173238544,3168288948541201,5673989110701844,6600467563595543,2157390340992792,4089982557128476,6052900658212643,145429936299654,2167015570261799,3111113915881260,6713170582767405,5762314918852405,2150238432902970,7850189281072956,7994332251285309,5305616789659455,1166229317871426,7387546552336195,6743158280658761,1954353726160716,8826491247941454,2616340506765965,3644352419098448,4143655803524408,5687894627297108,1422976419899222,5613274821918551,7264535670234968,8566658512088922,4516103602909019,8546471009390428,5494840417531194,5202832358170464,4431613042967184,4195972029417316,2457848298217321,5349013082511211,7924917457801069,3988875005044591,7819079435048727,280105174394741,5385967066554233,819286265845626,5333799122627562,8025870440099128,5739400337860480,6831203868135298,2830561253644163,5914719602934915,4158675925182343,1238785710747528,1559902642167690,6985440419698571,791522328424334,2539002731329423,2199769532510099,5677053152962452,8969203259641749,1485056830473881,9220751625653889,2183473567341932,8530672852176879,3059980437004613,639137300688800,6210057770983332,2926734510662982,4970130109372328,7871995188989865,6961935151984554,7734796783402923,4021623381829551,1080939613833136,7766642068012978,7800627404601267,7693413643984827,2803141115135933,4337672852459454,977530576042997,447092383920064,4502972192124866,221222758997955,5191143331164103,4787170367647689,3726821965555661,7268694412201936,7362435731601361,4550788141744087,4706252673075161,7849931722565598,8291460753201119,6542847762622432,6419378063747041,2212122334087824,5228007020644324,3946890457724902,1506064241315817,8158915117035175,1871949985703917,6490513597302767,3960134663600808,5491566081646580,3096609601310718,6537670140450807,8020392204319586,416241964148731,6356555689043964,844754276055037,6310332292997118,3189823325061119],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/57256c01ec9b9980ecda5b97acb236c3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000560805.1/GCA_000560805.1_Stap_aure_F52748_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KK024063.1 Staphylococcus aureus F52748 genomic scaffold adwto-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"57256c01ec9b9980ecda5b97acb236c3\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,4366044986945560,2156504318697501,7000457640026142,7896021307777056,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,6506000896569401,5364504867515723,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,88437141712228,2309979171803228,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,3234534336884842,3662919159013483,1307705680961644,5936088672694382,5434311755829359,7284609180405873,5378024996409363,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,4275434089636035,2588162975686006,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,6833222729797864,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,2345917413478649,1302574224109821,8212410875969790,2012844047311103,5937898811502854,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,1613233089708314,1398163635020061,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,2968451845775780,8143513944316657,8952362163265966,3299864180793775,7745961481458097,8055901273809331,5935630862422453,1161869623943606,5347282112979384,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,2462394055594471,8940994346209769,3517087197159920,5706335401980401,4252686649659892,5137838574998006,9185892931558825,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,8246219929334314,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,8082439380873789,6161629781725758,1301466934951885,8792974406386243,861160734184004,239261345014344,2591352585302612,3677235441902166,8774502673891428,2499002377216605,4888768950592097,1251060182680162,7016685056307815,7180711155708520,8074218591388266,4363284863173231,1951053797429874,2418223084651124,4891494248387191,4162813093515897,6047329894011514,8556996361134716,4194303986672257,4260895368577666,4283429268783211,717815503766149,2166267691369095,4658866579997320,985997338583691,5223980807856784,1430121092358802,4627768844518037,635178958910103,2877754653855172,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,8821595848045232,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,2169107663986396,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,4255210889675477,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,78000814482148,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,3950687240408887,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,7724391001129743,8074915177646570,1863691628282649,4216267683599133,4684977435296542,5520319973442338,3261189274541531,3650169611711273,4556704932599943,8557495048119084,3894727865107245,6318228701848370,2610327495815987,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,2642347481506640,3043432314913624,6709902552658779,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,2413571986957173,7509411440202623,4117238218216331,5547694202340241,3220718305670034,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,360504095483383,6177526526477266,8815769383846869,8794208264791002,122015909989199,1338323295265756,2994560223626205,1953886652294111,3428447854789601,5274301660094267,7027985096934380,1625254992364527,6176712354587633,3048526863073449,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,8523349380506658,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,2683864114443316,9173197031722616,3161510797841463,6664851025699898,72451129181244,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,8650391268110521,5906462950118488,3730400047403177,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,7498960818033784,851815340897403,6432046918378622,7867843017488576,5002993396520070,1203515549264065,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,8934811836040339,1890986035680404,29860417139863,2086986011604127,7190948106835105,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,1164683235056503,2781157967312077,3864648699065550,4304771496076498,8115575334364382,1310375489938662,5990617355047121,336938091775208,704012195243245,936638823216367,3863448372494395,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,8427394283750668,7588963357979917,6152554647457326,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,824008146597161,385907700483371,5728268182717740,4911190400468269,4110401245517103,1336059428508981,1618472691987766,2262947123078456,2427434620065085,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,2266518188165352,2952168537830773,391700864198006,8535608270551957,6713487310972290,2218257629603393,6570381896951176,1982265176835467,6010489251927439,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,6101035983073523,550323193349556,9063963446371766,7854647199692218,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,402247873566207,5077643932915205,9086189712409516,130457181976075,4396323642545688,1603137902355995,6201335188993566,6141646980806917,3517221940119072,2376738954628699,2850576000013862,319524505622058,2864627209774636,7502333181040182,9189100481070687,4620747332527681,7476293558784267,7530221302335046,5907535925622345,717513438836299,1106191012378192,5392923544264054,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,985626569586271,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,1290139896432922,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,5767914751350448,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,1826572334769866,75607106131659,6099104711074097,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,9130305682536177,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4426014275942165,4210999028688662,6497917926444676,5799343132662063,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,8059723177205390,5360518378600282,3300357632857948,8617233707472737,3843618476357477,6990130627200871,465037166274408,7190985601980267,407494504056686,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,5853576310753151,4607325484564118,5382715700053894,8245677561885676,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,6274847488566940,7687805010646954,5300625464223660,7687547568949165,1586163045525149,3700712461854642,1299923441830899,3086808181540789,7046481273812920,2009369612101575,1229878691049804,3089495541412855,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,1055754057562072,624885245548506,153369867168896,8286237998987231,5920383623823696,8214132091116539,2783293737744357,8189536530413545,5476876315310060,5612209855076334,4725106938598002,5245978388174841,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,4726229880813622,3404645514262587,7805354275301657,915883713245416,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,2009549124475012,7647986012981381,1998211285457031,7821296065001613,2893765109098643,2343666349557911,2403413705627801,8021177217775772,4783551950379170,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,6300248156747957,651657068725962,4034678905878720,4370251230234817,6547833949292739,6585493558229191,470023763785928,5902059711862987,6932846907687970,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,6152106369186008,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8292970583906548,1219768655680734,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,2129273223465242,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,4363526816403428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,6247490209868140,7630230196581438,6259851054508406,1525074792253161,821362676717952,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,1817325609851303,424135353727401,5081406681463197,1333593272314289,4410947517753780,5564848928414133,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,1912994901379617,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,5691197937691181,8600866540726831,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,5258126261832285,1768705500031582,8361022599817826,474326943902307,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7152093423583475,7505984773102219,8603296405064333,2192532495772303,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,2962096888568518,7277156913728206,3275110843738415,5402584754821847,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,2246725717416689,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,2760855083342295,5791949031062287,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,2820696871828287,7088305201981920,8711986948082498,7467931263134177,8910676381798199,6985458709252940,6821187116937698,4133002593487694,1863456533297999,1635651637476176,3989388368871224,4660665155473483,4752895990487891,1712595186215765,259364722940758,8447021480557401,1473417792170842,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,7255001061059048,5424923310544019,3408611869207412,8441358375734134,6067236678941559,1239923617995242,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,4360520181401411,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,2653365989327344,6086204123819675,4797301698399142,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,4461197842708983,2350571174063052,8647056119409616,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,7469817883450350,626168875564015,2573596889369585,820079529219923,8045422011980286,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,70088873618451,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,2907874448857610,5356878132681790,3711070083308612,4882578364685381,5675714913627212,633105738161232,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,3028319556770914,4926861423238243,7390098272967783,1960247201090669,7266335543571037,5520592147606656,4632781860469952,3128705817382019,8158821542825094,4384814729055367,5256643637594029,2669250979570882,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,1238619339054246,8494210442632362,7129634646088877,1515192525290670,6086409751379126,8707651019648183,2771632487820472,9182108430318780,5107270389779645,7293093929815232,7986770140512118,8783786815601862,207892688386593,8197445232532681,6046314350030026,2360605979561163,4803260508523042,7464689979698382,1019530360671445,5163187295190230,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,7897782769245419,3430108296223980,7666194411646192,1378102746791153,2688817209527540,4579041725200255,1009185351310588,4298859764904490,4285562358224810,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,5000612806597850,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,5699252652330325,5890867670273372,4856610212101475,7184278211472740,2287535748633830,6204666995137902,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,891540588617103,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,1169438882554352,3289590076870051,4938927696959683,4836608690859249,6550313765640092,3387633365577131,6403894935227820,6824098036452785,5926443562442162,856884970847672,1458767657659834,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,1092029821496793,4550261648928219,7385626605825504,4736904158449123,6548287328611815,4368166270504425,5132762411359723,7864494568558061,3883631707438333,4717078305738226,9088616725393889,1541930783479721,8569995544546809,3152905102806522,1800517128877994,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,8205328358469135,7987100592164375,4952730055523057,7906524426948124,5816011168292101,1185378970902048,835582845963811,1493106012102181,1345534315535910,6675258019802664,177161577352745,2361765179657163,5619546432701021,8338634504957489,6930698324287026,5168981785230906,8453583119834684,3401051871010365,7906973945146948,8763164838227526,894063478267464,1059006959607370,1993005114900043,7682210448059988,8497320404037205,5580264614796559,5603043202166369,694729075228258,5862755334909540,1286345701920361,2069399351119471,8084476987051640,6355524819209492,4907233847361149,4155506935291518,701505411436160,8204114985614978,5587667073572484,599196216102534,5643554321571463,8293699458965128,470083491171980,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,6133069365415617,3555666348039874,8660225691913923,2981054086278853,5816608308592328,2300314053840585,8728167376662219,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,8729737623117532,6128252439805663,6428061299113696,984499184574177,5500657232277221,8835865557208807,2541091443550753,3834083608280817,72583097564915,1553419814780673,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,5052337430671124,84834187095829,2799942993075990,5490276726882074,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,1203079434555191,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,3429891841847111,555164866154318,5640100560236367,4050500137410385,793823372574692,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,3333979680154941,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,4494558117785472,2569719125127041,4848772203458437,5090934684186756,7039911616343950,8599745542954899,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,8003607871717311,4918384395505602,8927309108653387,3997686878646212,8952951168884682,3727800611913675,379350842564556,1351605086977997,3802696281022415,3001959122151417,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,8008379688011774,7969431343923191,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/57c3b9f54148e7ea9ebfdabbe530f131",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/fungi/GCA_000732565.1/GCA_000732565.1_S40293v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KL650158.1 Stachybotrys chartarum IBT 40293 unplaced genomic scaffold scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"57c3b9f54148e7ea9ebfdabbe530f131\",\"mins\":[8727798289399811,7903107105292292,1690144340071766,6394604614483975,5411239094026249,8007270013337611,4647871725010956,183177082241038,1305849463996431,1454344515780624,3923833117704212,2554809989398549,8540596911936857,1228083199442968,147626993418265,7319652218919269,2441108038254621,834279499137055,3117763883991073,3004205437550628,1362591707802852,2916671263309865,8163087161884679,4379179250876463,8620020450983985,8300831215943733,1187013619318838,4984467400294455,2005325574012984,7135238082658361,674282548035643,1529704962490428,6037753397510205,2675320178835518,3040142400760501,906831208087617,3826761927884868,4669060583686215,8613326709965774,2807037339336777,6787272820042423,5970261790425166,5329367673962575,5993233050828883,3734005647769614,501564134064216,6951394533081178,8612225588308666,8574551826471761,7046874807637349,1709530444103776,2470613977563233,512544778846306,1180108147905894,2572313132957798,8812610570111983,1175829763326060,2317061203673106,809952438354032,7647569168662641,7883401162700891,5240645392083646,2373301488386166,3618721406222456,2025423764586618,6705947218258623,107112145387648,5000913498996866,153247301763206,4629471800819848,2354800380082319,1591301258155373,5786692020305944,3235300948781763,7696094077572462,7252835389571222,8026845243965591,4127911889141915,3639857938956444,7881846407178949,7571292330688672,2990904202761584,4809215459950755,2177693959979172,4831456483999909,1674872659181734,446410079928493,4929917057171631,7635025922205181,3944634598692211,4038391852433588,8666982579397697,3862424754192570,5888446845812924,4321976003078858,1147713957298368,113202902215371,457820263153861,7275510773018396,8806888604467402,6539730034753742,4663992478171347,4920655585837269,910460383527126,7990192199434457,3353021807657178,1214459943059675,4946746915193052,8720079947246288,5467714010513634,2222997190574307,2377859891462372,6616011772952806,8302457090277607,4622053240504552,433903120842991,5864044771803380,36131818209525,8845792618240121,6612701416954803,2940637859250425,3199435820794107,2411498400383229,720019894108414,7702872778375423,3194017587790082,218992306323715,5870547611418884,4115770313933062,5754830210667905,947428270047496,1316304260232992,894899514048779,3791859559203088,2270509057147153,4799188753056022,8781487895849689,5849528053334298,589827419472160,9022730424762416,641048618959149,7557341474455856,8644423257081540,2454979090907452,7803905777025077,5140180302922049,8698679407252875,3879157715140935,593047193911625,1228752427942218,3481075028918605,3026993936597326,668896755908945,40732764569940,691862702424405,3609480757215574,2570687485935961,7908128076326094,4449389033488731,1563645835116893,576865859830111,1052451888693600,8770643608404322,7315815879589947,2568037489607012,1312529964761445,51570947850598,8121779872727401,3900299281334634,5797810766905707,2420128889930092,3519521845969261,8848140317786479,8748651422845995,6759672046846323,6237217141555573,6369372787442040,3089955482927484,4037218673623421,6566660004252204,4188416667336768,4650333527277633,8283678878362348,3222106805502346,33225998991757,3500284061778320,5927010103263635,8986294453212569,5179232423182744,5407318354919492,7595798931603867,5169692648636830,7432405427288743,9152337996591480,2236490315399586,1481813540274598,6353869509427271,3184318990778797,7872655503627677,2877683322028467,5225391372468660,1309936320577973,6854896961192374,1763570673615287,5283451593829108,690365817520572,1611164267151807,6843414389326272,8680289734263234,9080799467962820,6925334369599943,3926212684120520,4334819481092554,7650813653646162,3398251990548940,835117254836685,8435565277053392,6122368458162641,7321086671541667,8139228927721941,1423228282995158,5261882982728152,3139274787586521,3743262655840730,4601621736751579,684402635702748,7956711297679838,2683077176907173,8084553346031551,5979840664338916,4370291628212709,8846104566387842,232342918103528,546290512364011,3197483173085676,4400414084661742,757554037948916,2364713098412533,8938861462462270,4016820854424056,3152707626691327,8979939443117869,2138403705586177,5367633390207491,2643071916769796,5463076098769413,4341636609966598,4512619121181191,8309490344717183,5838932221657611,1657792108888590,58615441195536,4371155407339608,6239673047155218,5377051590656531,6773537326432791,2749841506107928,4565742966309403,2920046491337244,6091027333147397,7026361315263008,1037760948109857,568296780628517,1642038512943655,8569264880238866,4873276207071788,7650422347530800,542233647120945,8173095229522483,7455074847130164,8494693070127198,1173442723578425,3195249357226557,1968147759399486,5457277525923253,1142736156000833,3514172743451203,548488218935876,4638095209103942,8526614863609953,2251480503616072,7616423681032780,6448483920805986,6029377501463119,6119331342385744,812643842823608,6279772269890048,2904616792687192,1772886874849882,7515202272537359,3652188060975708,4941372963389541,2687426207089248,382052836934242,6912745632669469,2866558199726182,7234197854459324,3214376526873194,4872661665415787,4181585814684268,309871116092014,5012293535335023,3244949086208625,1851552235782770,2295168450867583,7288179783762550,1173558160458359,2374916236837496,569696169067131,7258733025771183,6046424891130494,1152464746021503,313110518071938,1088755782058629,3146595842818696,4436515373056108,8577580620677770,699813822530187,7936964159298987,2111796257194637,2453773189644942,8654667605573741,7242695279510162,3944546552054420,971959838376599,8793891205141956,7592414699404976,6920052696132378,7322822383493969,7456349630071456,2841923209757345,7878595117744802,6851321536709283,3520470546840669,3830772228653733,3150614845981350,305011777733287,3935496935762699,8575477010688796,4696745294725803,5344443885585071,782278708265649,8849872976741044,4633092302996151,4243763404374712,3181086380556987,6554013777024458,6887903648816894,4846733860111042,7947870453727940,7623415296262853,6488509008478918,2326533723849416,1676705666586060,2628658039096013,8138107388691150,116519241351887,4907872062472913,4727756039389906,2582305457767123,9162437218403028,768450214167253,8992106307748566,7247950072087255,4937296715317977,6102040953684090,3689701575820001,2256423681465215,5449042243152680,304810499605235,5412335512552180,7451110443838333,7985945310528249,2136702564434684,7838366180246269,849792498270974,1497965938541311,7340954671245071,867418242034475,6719017537798916,9167228564237718,261365457027847,36184544841954,5975251040142093,8091483643627468,4350095804433168,2284589809992465,7827358993818504,314709708178196,7171098191627030,3896278274991274,1915643621147417,1862189762216730,7653717662919471,142882817311517,6813557786346273,3853716717798181,970584891753256,5416868857119529,5049079049454378,1051151232238380,7124614381273901,5831544967758638,2302372136551215,586686728569649,5829274832819678,5092029634511670,1737519661056825,3338483142099772,8695368754680087,8980114258016231,1707116340183874,1283395200910147,8776955891755830,8564859985113787,8476473900324321,5946532161520457,2943480862278474,7289907989840715,4707674123404108,4006993320298717,2511277174948686,3203648617907023,9117426485340984,1330241602159443,898563118367574,322966965125975,7843165113746265,5313844745372508,8629030127397690,7447470979646302,3232083888630587,9942022882148,1931148156715153,8233746646346556,7489812934624106,564894362993521,987135284249461,3105673379939200,1717317270078337,1482426591118210,2143242361373571,7660974957133581,8667884465010737,8004939900552071,8879795896386443,775815331545996,7372322237875086,7744361255601041,695532940100498,5131206714852243,4312302468924308,6986920418247575,1429089558528921,438591175820186,9000466728285627,4474300664677281,2373473458193317,8674876218540970,1218077729063851,406233121719214,7483563532682162,6451379778585524,6929457696113593,782693126046650,7167769683297211,5690236732484426,788094872355774,4978890260382655,5658163889963969,4338422154822595,6176352228672452,7048604519302090,5554688026117068,2101475912549328,1982696411431889,7270898256643028,7340121046909909,2280124749513686,6359621043508729,1308288492667866,2975004817320783,4661578302850014,680553887433696,3602310217106403,2817057279443110,3579277070730214,4938602195037009,5889375146509288,8305948931384721,3675503703983083,632382476125170,7163137496476063,5621707198682622,6345153820417340,8937956298490872,6799562085925881,1256863860622330,5831205672610645,2637775451718658,7328574311723592,7308192109560839,1836041797370889,8874157875004426,4014243042100237,1128017820845070,6137946543292655,3413406337336340,4651610572686357,6222001338876951,2056116862419992,1977825419396122,8624884869891101,1919827463504926,3858707720569889,9065987316909091,2637381921113125,6718095864857639,244818803164200,6277065069063004,2141649895156573,8848134443271219,6566689309902881,880315595216393,4219028910200367,986971627652156,1595668940489789,475992994219071,5948216841602112,5032938200219830,4388526245774410,8772130513699860,3870141750281293,495506522473553,566096638444627,5201751599121493,1363407304066134,6949441761132729,4260739236758621,8331478427501664,3348752778691686,4700955811316841,2258427754146663,7768661691039933,1513818284719245,8889983150478867,2872975400469620,5795656915977333,2539315520275575,9106722963195000,2744574768682516,1191172870702202,7529960994112635,8182757449952106,6254093953598590,3180700721775744,2403601855284353,8536910569614187,6891111975453829,2816423776388230,4262955428021384,2493386974495881,7450848183944331,3633875565151372,4900118084715661,4000404102153358,8171873164219928,4787406197687442,2549232701572245,4565458148590743,2353496582718616,6346454933516117,3455271703348379,4253236113704092,7840106418870058,4229662410835102,4253179656536261,542299123123361,5931245899252898,6126119493637659,2126512856794276,7273383733167270,7359904517784743,8744111770687004,1220638107239594,8001040861719410,7057507075196079,1649363045926728,5011823996601521,2168150168503476,8799894322381556,8241323540640709,5602479137326269,4008231344833726,5156349559473343,2569936781501842,1979001096438977,5370641082453268,8736636432897569,6763573397685449,687243658200266,7014379145790667,1102306356987085,1919815115063501,5794153967715536,7548484078929107,2317544136049883,4050465737737436,9067570988706682,8256585340164997,1551282668963042,2520840251868387,218474903274726,6944655931752657,7369476775019753,5727123813303530,6953093222237420,1496277841773805,2547625779397870,223863923344623,7346094434162216,3415223910434036,7258374460741161,4132174867825912,1208460434507001,1235082250093819,1767815026279677,9189807705376789,2902571953423617,3204332397135108,2709414098044166,3092326138316040,8165203079746141,5381570257224973,3062907647657230,5454306099758358,6448488997225751,2230060652332312,768196580709935,5391358826856666,1400300243125534,2580521497625887,895614157751584,3214132130797104,7043382527296803,2292316823127332,6262979026748709,1665656655250726,1268492713198888,110349823116585,9124522079651114,9184657554900268,9156388326557789,8529352105624879,4139313076497288,974730674046259,3698348315477300,8281198225450241,3504348253062458,4194178339702075,5127392957957436,8931315563998090,2132367313864002,8035222752780955,1650356997686597,1515268851762502,7967564141495624,3097834928538953,7353992743549316,3568391111673163,7031369556243355,5087233598382304,1699340761171279,7245680797615440,1098547496678312,564336098116949,9208968763283001,4455914204202329,8953203748580239,8762011245633252,773582647940666,4209444630037857,4382593210073318,1062080462882153,5326721148290415,6379981004375409,6404370391827826,7227506906203507,2222023878706551,7604139858079788,3610139528398201,474713556649338,2446089290220923,6660995719169408,1072920807966082,7524912836969859,7435831192847749,4047201791837577,4581609046312330,1731548444339095,3349843152209293,3012059563623823,2401841660233111,7985674480911770,5079378137366767,384375799940508,7313901949627290,6091377563927966,4791601302804037,154526893508000,6873310379592186,1026353203217826,4948451988450203,6655510550611366,4698099249939879,8605127498892712,162564354573737,7386371743176152,4658198783067563,3742507197203884,5005521292494253,3864250053723567,255218031330736,671371776951730,7318451088065971,2885447221609911,5605303065417290,3714641599858110,6478897599386989,1573778493375941,1305477499979208,4553470163846601,7719725366642122,9119252055688651,6139302798919116,7840858155353551,7138005642937809,4436561612637650,7612388303799763,1157736397571540,2521520537208277,7544256469272023,3724897398883801,7542674756044252,6586411861076901,3861018620134880,6547615722735076,8505860130080229,1022029284476390,9006577920081721,7740236044699113,5161739954760615,5960792067245548,3191444673103341,1713595402878549,1591550512432623,5898404288398832,303693523027442,8923342928610803,4568797932029429,8180018041651455,7220846785529340,4628002035762685,7713749645362687,8729391742092802,2528429750343254,6420753809591361,3400186897171975,524698188318218,3612074378069516,1066178510521869,1257668768761361,1658597206656532,4991502117448622,8272513067320855,5384263117702680,3292464277489179,7597683624838684,8338852808382235,6180670585374240,8615696629761571,3390603786749477,4134256339158568,2590026730341929,7211949861268299,2923313472931371,9116606278380466,1012504606049839,3572326004885040,6368761746130485,5830490875921974,9061798770051873,6314785851049536,4268581936404064,2817995307712779,8766379240490566,6324967503107681,5485821424174666,598234731087435,1392192342296144,6188477611116113,701252097345107,4413376648218198,4390051576972887,602898140759640,7545374640161039,1518050598422108,7201912434670248,3260223265867359,6517722908493409,1269405818717798,6123676200207976,93063180912234,3003278498059879,2997461398274322,1884201208546926,8217434923009648,1946257305638504,4393832172684915,2867560239695476,491971064277950,1537246755784312,182443615880825,6951679312463482,4101834307208828,8833653907133558,4154372794484350,7690143479894067,6708926158771819,8391560964474501,4577219308652168,624035474540170,2058420231210637,8562715982927469,7733962123970193,2844305382599619,4076089839715990,8242871023863451,5890056848148124,6137244028602013,1276156829992609,3895308506531490,7651997248226982,1903731792512679,2255931926709935,1683807171315376,5074849543154632,4763297214990002,2414308890445491,2064017736074941,7703379422643904,8011842264941505,756987317552836,8351041205110469,2100572438496966,1183610540689096,8336046639258565,1834007385999051,4150837555463886,8859753475671760,1266728388527825,7872228873410978,2855000053039395,660736648260558,2487993165350618,4362124811175644,8040775769130717,478711059515105,2199644020901602,131775577327332,2436332471125733,298081489127142,8307954837456618,3478307342649067,2975745908016879,1236321846855409,2618510504232690,5985287841122035,7337758644897525,4084499118130937,4050830882801404,8545761400981246,2570999793256191,3391013125293824,4744894739384065,4414858021603074,7060485804900651,5203104085214980,4082540113832918,2851058537596680,2671011343730442,5185608213169931,1997486254393100,6814716077155583,7160463789066000,7624001876789010,2690323080382227,4439520114411286,9024247841326873,7388765994806234,9209597390591621,5211992083633798,6013248487884582,5179521844250407,7216464074540840,487219956844330,2837115519105769,3087217638967084,2596258058864429,2733636671384541,6374273502010905,7367434439165670,7420107453336447,6436305936264158,3299935386371894,5125446547343165,5721225698296117,356718846117698,6421258623321925,7829111683483464,575925717305162,2422017448160226,6162834199250766,8562522937988749,6525844399392592,6784089698503330,4696619262216023,909054217193305,7625782511969550,5940809981953887,2881528267212640,8929071455050518,748085518829411,6908520769842150,8531397759371111,1172358396544872,533241070847849,2966646622586730,7925826717714285,7214994310268784,7037438363184104,6669865338832755,4279938837120884,5824745479931765,6818417656792953,547529116321661,9008408560948885,1922389438677312,55894011292651,7853390914979717,540562886559622,7056328048248711,1838076712880010,8749121897990027,252082340202382,271992629430160,6360439507453843,5967501768656789,3393895645415319,5586721760231748,7321233784899485,1170511788050334,3503109938055073,5632164021110690,870608992929703,3443353704040363,1216815055079342,700204381669295,1088192922355637,4449917000550326,6725318098374905,1609880303437756,2376172420530506,8162034002364350,2621368929585088,6992704413635440,5826092167825347,949940483491781,7203355908573127,5889083017758664,7703429600643017,2974766812621009,4576027822262220,5316076872586914,1756284890187727,1044657895704528,7585184071503191,5917310396401622,4539249507436504,7094236106512036,2307203818555355,4902282520856540,2791046336317407,855923865552864,3726165686945763,3394875295205352,7870769012348132,214622963697647,5826912051562480,3669095629359089,3282464556484596,8436499100599840,2338630675695616,7823493469241686,1565757137422342,2018229669300231,1999150700988424,280524063016969,2683954611521546,8358628645978455,8411882068445196,4698638111541262,7651499335833261,6687081380349968,2268203162961937,8213892019161106,6452920967284435,4602989922289684,4773966036797462,6094431207131160,9045802384130266,4596848211658778,8591671944255151,2953351179896860,3606834835308890,1446654233511966,8850972395138053,5764425295464480,9193413631117345,4208488777091107,946916557817894,4061455379400751,3420379385890864,7276816491736072,6977122136416948,1159808333471720,7794134016953708,9082429501887331,2481297840965695,1954300124563520,2641671724042308,3178040405002310,7612638661160755,1654469711300683,3120450813462606,7326020151576656,4125797033052242,713986761328724,4930804935329879,4018601572106596,9156448966281306,6359172590703377,1258215769409628,5959412692977757,8983254769535070,6648122411386977,1931592323762275,3070551966713959,1097728620922985,6043085551208554,6617276689025131,780149189314670,3419601349642352,5013435536967793,7004367905565715,9123188993603607,2252202885023865,442374641911932,6307234978578794,4393906277582975,2466379106158720,684639029364866,9028973141557611,2094335548131460,7319750990399625,6403836272294226,8840424518617228,2813809118811842,934589308191085,4157659769735312,1200171522853011,1141023170791572,3457266045028505,8048580559603867,8963461140711582,7574293899544735,2480272630352032,1822839961094305,8786286545295046,916003644442792,1211838307600553,2215812650567851,297415058346923,543478685599918,1139019569097757,6424521561540784,3967532738709682,8369766635405683,5321919901150975,6981271607314620,1802854539888830,5585516984403222,6544638440204403,353337819007172,7351028377815237,1715182272261153,3247870061054152,3471644123269321,9054014553327818,8609207847487692,8031349069154509,3256621500454605,1109798680129244,8146369220905170,4709186031651027,7012992917115019,6174237058471630,1762214306580694,471089111329828,2621339641055451,8837713913055452,277230352763102,2922287327217888,4176495558088400,840827619674341,6415132395210982,1030904336258769,5556868236871913,2891139802499310,539271074646255,8523372766497008,1644508707424501,2326570095380726,6965522663147526,9044519442483452,6782380245453053,445131667998975,5240052422019328,7293029890535897,981074984306948,8075836543240455,749392429517066,2122010916882700,7751135036653954,7605922458437902,3822308395157776,7326198378944216,7252315430422804,8311677112243929,1353891285403930,7094794912625165,4572142793239600,5711457953417507,3306221052365092,3781813715765543,5492180622412073,2462672158394667,1618532822288684,7028683585383474,3018148499458350,8025995221043503,7781466934426277,9085336879499571,2222824501106398,66687952980278,8834902177253687,2579843446114616,1811283218270521,3173271439179331,9177974644179338,1951349861615936,8485483506155915,8664906046212420,2716092632664389,4984602405257612,1809783681333522,5871806877600075,418832608692557,4087239293241678,4048175717124431,2125236721224017,3641391324105043,5383848861403476,8973355947945017,212138544138585,5943813893851483,8940306804967772,8002147343567198,5320372998572384,5384542719773030,7520955034012008,4652007878166894,4568175449901425,6028524265867635,8980997949086469,8954592681331062,7820141072113037,4221033302362489,5389045440514427,18426004219599,2217449541962111,1569067631600285,8726931343878146,3040067631737921,7732677062592904,7790410580527499,267154040654221,673712578627982,2651272986626448,2688542653221265,4871420990491026,8645991990757779,7188935495292654,7579467827743126,4386060496112023,7897189887871384,4369981786327452,4821106637801885,3752183567026590,5361940183034273,2041203624348065,6504289425666442,2674459838679460,3300787410274729,8729780397476268,4710673738307314,6198794204219824,416961467976115,2703897480563126,70830304209993,4634500505012664,841974282160571,5295751474284988,2918074872007104,3329949077899714,6802725780758432,6651918592149957,2165942272526791,4833140598344148,8249580806352538,3403660385782232,7725848675912154,4408008316914140,2188688988146142,3200473623955936,2708744847034851,8391388610396551,6958403000353190,135039519951334,5694842192726506,6607689675868652,4558686645553645,307846212717039,999237043554804,1021384749255157,6998506277767046,1013241515346423,5958976214698488,3559050285550073,6455562308684282,4323862535997947,1034998907079164,7146953236253182,1294698848619009,6183292675688962,1972838321916419,8655733627161092,2198736692873734,735648258918919,1473925907581448,2114085375847511,35628355193356,8507035258227214,3449113312428461,6682343874464273,517793690225170,4803743235443223,8772338117741080,2746185235273476,2406873430100508,6454614507072602,2296257255836193,4803405117860955,778316472191526,5032361561688618,2189328361294380,6562590011066925,2699157594737199,7719655802440242,5985409933181363,5548517909105207,8333284321987128,7150842560711226,8424582487312956,8790811421968958,1060826824936000,5255658907306562,1689262355941955,5934733758663236,603633504946758,8382398252681799,6884302664534604,9193958678923854,5479404531223119,1151374840695378,7277640322419286,4137289768798807,7096048216771160,2436840468425828,4638485166099035,8341662733339229,4468702256213093,3724766577035874,19875678358116,2810654768564838,3181686288452200,7768931429188028,4840965695638122,9077736617020011,1456714199861869,7090014858248008,40391885630568,7819425453366916,3022892662118163,1072947490261620,467938408958581,2389566175980649,9173523527105195,8228582931171961,7665865053932154,5818735804907967,4565073215359612,7068332724706471,3009539474000513,6995974980307591,8500433269262984,6815775873593131,8198846940252811,2320000255167116,7157115981500672,7078655936268944,1247568827946776,5464635323976338,4567524079110810,3697552650832540,7009565027394385,223662104709792,2719604100696738,8285136645098147,4950383753792164,9171579559815168,8522988026333866,393792637536942,8341282270233593,8527315273417160,7186015420762252,63784897645235,2577739364895415,3115990825634491,2674618838518460,7503851704754315,4028859123543158,8565881553226438,3073308984579873,1091421351611081,4812486401043575,1350608500886220,7912978830883230,5305130699754195,763559138888406,3183600610609879,2697960912456408,330498831583964,7069726426776016,8172432168651490,255766435990245,5153635754691486,2331684739943146,4216469728201451,3864667389922028,211282983783149,3337643546446574,5726224296643311,8788246375063193,184238189054706,6631988229343987,699997531540213,4797884699085559,7063377968466680,2266884527000314,7434973089027882,7013620488440581,3382758318213894,9010290045782792,3228660992562988,5675975276628750,2399046926142224,7329824128287192,3210043407764242,8105320644892462,6095640567087577,4438121205369627,4441357635980060,2826362047695645,7226505818284286,7181382034500741,6280649697798275,62076159953697,6790742388149030,7487042316110636,5196551244647214,4979881517583153,2239558209604403,6349616195472181,6997627092806793,1111317289372472,7972530841422649,6707555975807455,3331948784978748,4147507080399677,7000000534678334,1043429661595445,3533333913602881,7856767895186571,1366117695687492,3051011127282502,4046666203547452,5901666389920586,4447027345296205,3863894750694222,312652440406869,9139531172252502,1125876513901399,7457117963946841,3009362562706576,1149413645454178,4755193621416803,6553040839426534,8028272401247880,7133706858938855,4887936775621485,6191795358206831,3964091180616560,4645787058277234,8001737871461235,2151436330371958,7333873397730169,6003960341695354,3138114889649020,7146494143327381,7811107555231517,7085775587150727,6389325746801544,3311101590997897,2453779509840782,5766545250880401,2262930237197202,6899737121557395,7190670620593044,2712696904911769,8324122447238608,378595547065498,1056558183254942,508261638474660,5708084789971880,8608942945234076,5906737387572138,6342653591181127,6007015247973292,3487463084198832,2972088352377777,6254858183117747,1466341871064905,3611286563359674,6500043659177119,8027324772136415,1762759418943306,1975801154866110,8720903990217664,8182111603780768,83855666285506,6656571746159556,3995502249446344,1678259120409546,5785495564654345,1840237073173454,8071753452339704,3390237128231893,6208539170868183,2714721111870424,7370050480545441,3992058412633053,8807488086379488,4062316068572129,4839564709989347,3183333931027428,216983263546342,446733178580135,5440090951551981,3396954927827951,569144120183794,6277030551000916,2144513216973819,1117389811551228,8748415569693694,6717456025338368,17070738770949,4199961670028294,6212954792985089,2865807725169672,1561111788555278,7942700253842448,5798598617631761,3724609894124562,5317979010272275,5235201974209557,4539197488860183,5550750691363866,1005423538932764,7619684667591709,2915214002064415,3832626896604193,4385293588827172,1402870020541479,7047835949599785,8696794015024077,1187212593859627,3721003198057516,2452738930764979,785839166655540,6327019568270390,7142519152249913,6795194946327279,5611923008818241,8154829397294811,9182311372472407,5162105593269323,907404527733836,4174727970425934,1674020161260624,430515806866515,650304299699285,2579043596758201,1409657350687833,5304273767042138,4190309752769630,7203744200300389,8187091220728928,434090829253730,1159706350390373,4282397523971176,4029922138057916,5226837529379346,1916566312324206,3185818172034159,7047978362801267,2117410097302645,8471671138001164,8032024397662670,2240073380727929,6160277494795386,8148927426800831,7900521890090108,3972691549654143,5155712397708416,5091431006211201,674313264860295,4342199553887371,4321185490898060,7558168685382797,4781124232318094,8530426301254799,8944366681820306,3473833621130387,7143569962011798,3134611455773854,3489778132749471,8425785583343472,6578450154144283,7982344834545133,6231966760766630,791203861630120,8172364439227561,7776397855755434,6704794442665132,3514456162995374,5587120081996977,6463194785320115,5604702348741816,3645231987395769,6764780536502133,6733233486826690,2538817029573827,6143426060061893,7151802405224993,1769473863290058,8376537168678093,3751113342848208,2864682752219000,6785542483807443,2827172608060622,6088450255129815,9072777408351448,2211224539991257,8201131740400859,5929014958820572,3476326822448358,8409684538461052,3103916366433514,3798907247103212,4739611544161518,2541845812579567,8633569186556549,9007482384713120,8685139068098430,7531425922735224,5540972143250685,8017972083723518,1773866741173504,5748320672943362,3412307334958341,8273917037055239,5882547735006472,8479579912844925,3084527695310039,3950129387343117,365791910792462,3804667696553768,2797157045275924,8471545627001390,8242765499174166,4798077139222844,7340253673753881,2933359513144602,4720424697236763,5836227926035740,4584595466358049,535449739595043,1781006722960678,6641368412294440,4705718369619241,8142133584071978,6480128861585970,5150475229695280,5581577023622450,4976636171914548,2099569706470710,2589464422354233,5958412258577724,2712904908344639,8518424584981826,6617882726927683,4075759374372164,7953090417137225,4342811652427082,4825687812803915,5745735513541968,6112675982249297,7290151494266083,440429060364174,5909988365208919,2279631855816025,4872411817643354,7280946173250908,3617335936322911,1444390178032994,5565052161901115,7482576973797265,5205354095333196,526791242485097,2912274356445767,5302679826271595,2784560430058860,7860899857809981,1074702480412017,4839830707342706,1989754581014419,1150229403372916,6548976886841918,2792040190012649,6938599235816824,1809333216382330,3941807505608061,8581999250378110,7386572465638784,268827836583300,5696551536001601,4351168158698888,344446277037292,1007534356993943,2083988110314892,1439756658658365,5521269382679951,2768367490502032,1543790976568721,5902682615451026,7424172210586179,82597075881364,7948458274636386,8075405198790038,2112217596956055,7947538428530072,112962790821275,6288723300486557,8685144867573152,1676795639565734,186386541252009,168242495327663,1943940433407219,6509619326356917,7127828297682358,531794600791480,7205213423406521,7736693545605114,6036629689077180,242785723190717,7584656330231230,7083839997226229,6012115937496512,1382580953517506,2924940273782211,8487396130229701,5624577894223306,4931527292358093,3705674647571920,6670870463282329,7401132391241636,4469615667036751,4758339574074844,3927195384220514,2895903369727454,8532218900778464,7430470006637136,7379375078736465,7782958767050217,8282843155109799,258616228089329,705039147372018,8099700452605815,2088791842903977,6357579572238261,1531139856895482,2755984764079611,2286594251492861,19114865430014,2729482438282751,8314632035208704,887689144208897,509087807405415,4501313668989526,7597735693515010,5964875599253005,8846198770074200,4211768237035030,1972729438338158,8060969976696344,2837372168744196,2156072623246877,2038111756717598,7585752076876478,2620849513139746,8453742534135332,2912587731930661,3729917404679718,3362279467486759,6801616707140332,9060906575505248,5267296228249136,1319993215749683,3397996625694260,4583977173749303,1170639547141688,2515782806634142,5059405059493434,8305771190095419,3932530963877439,323620067380800,8827445499127293,1495690758786627,7488962126690547,1462528599101001,2949584286191179,6308020789000367,2255820907449934,372271943396621,3842322044161616,1663593365868115,6215520251317844,7082592785411342,8188575943951682,6338662070128215,8351732277481049,59849418968667,4343001928076892,717869953748574,19845636558431,7386970176100283,8124348174765669,3864200123584103,353790130654826,1813075890835051,7350305284230766,260612359229040,6222755028668017,6296506338217586,7076428989664887,3148881720577656,351834117448954,7014416372422591,4694514976309866,6745318361304703,3901762938263488,7399786648833666,2535310442401411,2284645465755268,2452874838576774,402311740231305,5003627010166410,7526731902332183,2329441559056014,6629301690240657,6459377319874194,15471571774745,4965900683087512,1501290633432730,2636824749146735,8188769110724252,2274329012047518,5041325391744672,1812009334345379,1317647636795044,4117391436137073,2216717976932012,6135386629639859,5357481609137844,867535882522293,7810750237740728,4980784542224059,3104813031788220,7693670381817534,4878602639830304,8492879158939330,8035814825629643,2094456983785166,7015766156906192,1895496397619832,7276058386304723,1965400266378967,9213596613489116,8189374829859586,6209925814128349,7486608510612034,7340527898431202,2166885207758801,5625297912646524,4896110901530346,886809094786800,5031479296003826,5096973643190003,7635424261443316,5120107995336438,1492403009883896,313521708994299,3349232742371069,7451648327945983,5709566880222977,6674084570836267,1637807521042182,1481248163434249,1978460374906243,4530363729019522,4640952151272749,5946100205686544,4257794956594961,7902107888258837,4200390485085975,4386293521583897,2923140012609309,3798120212038277,566650247188260,3172423423528743,964391653805864,4342250089647913,8387028755589243,8904550407737132,1995230725476141,3245771732422446,4296639848320815,6451607479004467,4267099777929012,6843703735095093,1528005643505463,5195622837784377,1304589104516922,916833748094782,8050609948861492,2414808080024203,9188868159606596,8298839419125890,6780777140164577,4279742500048716,1109493447692111,1104205061885778,6345442059556835,6659971329363799,1183101584707417,9156487280646985,5350402985365342,8063865373131633,651151789133664,8947862327922531,2226516030199782,6662975639885710,4035006776831292,9016779440131948,4133446903435117,2075186240589678,2948474377867119,6465851908362097,7001764741255030,9121545472764541,6671052166926202,1981023174432746,7809056632406489,3748076200464260,2695779301429128,2661373086603244,6442570998681482,3226050099023756,4326136951607181,1356866066288526,5632105246939117,6461938787730072,5141865129906066,6024036703801235,728999718162326,2034610805378970,3424587875192731,779550313910175,8879147693226409,7556581691146907,8261868208762182,2919865664835495,709074948394923,165229871534004,6637739347742645,318122071232438,2595890673225656,2575651880669113,55229533163450,3131909963222971,7914748713668541,1038340676620225,489138641440706,7668496031289284,6698996782862279,3253117738127304,6406549933567308,3031558443601873,3778612910067666,3829681879781331,4682214553489365,3696114550247385,4989068377788379,2751377236332508,4550095105265629,666059083943903,3773045354181651,6397602610589008,7806164808013819,6284740275438246,3364918729215975,5385995188309993,413480974387913,3235034631897767,922872955047916,1922427884004522,3634077101756399,840971532374000,8220363295199217,2833384897417203,2177783340656714,6356965255474516,1009849455775738,2462539565699067,6941033472790524,953040701178538,1235188752846846,5260902744397824,260927374266372,652243350654981,3133419011182598,5428870069358601,1338029882183692,7262812612155394,7612132272443406,5849638762418192,8364054669955090,3754386321707028,8166275419377685,4803250628235287,6065740005085210,2559303715914415,7165905498574877,7550863000244255,736045872156705,8254659941404712,7244327865019740,2547814979473450,952399538032685,8861366882932709,8891193440112688,324100748021809,1321291522412595,8937809369287559,2264105687795899,9155442821107766,2045063564267576,7127374476152889,2530704419491900,8381285635844066,8913311217815616,393242789089345,2102611206017092,4300158776807496,2795071349757964,7691198153687735,2330229535182925,6673418873966672,5706885095965368,1757798214438997,5757395747324601,8575537452748889,3222512484849679,7779481951178844,7466108357840989,8654896813961496,2799388898857056,107461323493473,2212071917981796,5753376329928806,8347204361949289,2657286856937582,2647432591741040,4851667473698929,3687398666309751,9154636766894100,132244861862591,8412933676142716,9090914761871485,6550605943771262,7250145322176640,992166759633025,8983346246881411,5113152842436742,454862898040968,6250009041899657,5767175254478987,2056977566273677,3144550853120142,8653776013568910,6945456600350513,7239143283167379,6767611408224405,207990739472535,8674453153321113,4315923213790575,6939413415661724,3840683727196317,2636745790558366,1930650956271775,7465285964533927,6421678505595048,7720943862583467,1677772308816892,5081857609810632,1635951374831794,3052773815586996,343175283445942,2272686869057719,5153845881245886,1740443979296117,3168137827717314,1883116586799300,8738778523963589,9161250521815073,7165340954431690,8164612797136290,1322442005188812,4272944442216657,8965121829765838,1728231659704536,4370081170329817,466113224380636,7162521744445663,7861027695764308,5432293585391842,8845248213327290,1949524144984292,7054310073405670,7619016950088401,2616321895370985,5548799178543339,5604193039356140,6296298018345197,3467110362878190,1035153024356592,3747239661277426,5612338488840440,5502586355683579,4186860937023740,5663382382809344,444841663992065,6248507550208261,7561864464297345,1430151558292462,4011918885720330,6739048512426251,3992759408955908,4595363048724525,2866065952521243,1416582699028753,2592358711988498,1178211466318099,6218944199790869,8041486565081404,1691247299825944,935167967531290,2078656157683995,2337026812416285,4944983960883487,7030017495994660,3074559822270760,4638899215700266,7910246321822747,4580037109265029,92367731060104,3254980882960691,2409884571701556,6024795468632373,5697353403765046,1724714028110137,2543295763419450,6675930607948091,434340451291455,4424969618985280,5680895496869841,3851100704903491,5987314726994657,6995043761472226,1548869999963444,3617332807602512,5075018964457528,8828069562354816,7426404503951417,529071290978651,8802258160030045,5143785151566175,9025929605555080,8532033661178214,4668272686633319,3863213136875880,7733124938666346,9118239605035371,8926591473619308,5980742873045492,7995742741404131,7382572097212784,8838957325861608,797594944384403,8977067031990649,4914680167862650,1838366915563899,5652192217502085,8489764639576457,2455769591255434,4247251800232332,583487004676493,3439785093403024,2905749036437910,6907570445348249,3212431822492056,6117239592817052,843266658374045,5172482155483552,5710004748226978,6113811687608739,661862255235493,4086531194130856,2196996442689962,1487971477000623,1851737239523763,688218770909436,6900968671702430,4018259014357430,8704037671114825,8023828197409524,4237133914182074,7717110332708938,1359633587311040,7521757465144736,2674777210327490,8541848148039755,7613446230479300,3392570773443016,2019857053880777,5075044710453707,6003301019652556,1165193949712845,5615326893019599,5904622097699280,5476460519330257,2680884395625433,6207488033329619,488280118956500,1661694135996885,4886713905320406,7123442850808569,311687803376088,2053582754124249,9083111644926426,3487708070484047,7351987515494877,7589497566866853,7699845969486000,1257768916619745,101445267952098,1318655796023784,5093297456419305,4518951487803885,7638191479444167,2570850894496509,731817924268528,5790330538037746,1067094581875187,2084207187530228,4238227256250869,8632296924642799,1535287337325048,6697788957987321,5323441596273146,3834334489416187,2822646200373757,640136997736958,6516600201746517,3968853485097472,2351453428191745,991022881346050,2838652028752388,5552520566641160,2292783822869001,2174945448712280,5835240972862211,6452073764000276,2821799005100121,5422430535258648,6722676169968109,6406830940361248,7495618464017840,135426181730851,7718104218210852,8436468280345350,1581802471494183,113483804742186,3951237599040044,2257272319077810,5655992939468893,3853064534561331,1168573987394102,3099159784493623,6589442384794169,5424379703857724,515876704293438,175504364540480,703899378192962,7436377914053189,1045986864725967,3927664714897505,2634955566813768,7033892575515209,8160357384327754,5665294666961483,4265300485116493,7896773931471439,842223852556882,5875549056012885,2129356634362455,6811903062366308,348758606811738,2780134803915535,8592709497788517,2754090219344480,1849446569480804,5602723865629285,910201461052010,3506387203723883,1056419640480365,4709809622749807,6563712646156912,2191808856086632,5692049527542387,4611437325980277,4429114644730488,4007808375702292,1206068353012347,1418117437264508,3410181322019456,8115929597547139,51441894560388,7663039304303382,4044318949806726,1981156286501511,1102574915818122,2185669588980366,6770824055216237,7692253030027920,5587856904458904,4535226950916207,5173640006593989,1890190740132514,1140279308096163,5399756565844644,7840779922674342,2539376271792241,1704985890329256,5169635458106140,2746941864373703,1249332815598252,8981961228327026,4605643222618803,7217634563199669,5907711177724598,397854227894967,6968805613399498,612436994429630,1392716992649333,3466526197617344,1263884831791222,7170283647631333,5672011318959461,3133734115545807,3468942888211152,4901455733920469,2900872176800470,7053935043647609,4220232885342938,1064830874325723,1557413611410140,227750639047390,7426547931721569,7090566845281120,8297924638479074,4565703513936611,4722222356108007,32695582102250,3123480100829245,4397256238076655,1892333563511592,2840301234492146,2107205041296116,4454560927159031,710663110660857,6370342545585539,3541124651258620,2512999735104255,4106198288929538,4213377110741765,7502321311552262,3332541364048648,2942690686079754,6527188782584588,1857372068026498,1166006063207182,2752674881777112,6997033412952878,2856024877732630,7042287111967511,4431883842261784,4168616910885657,1740358814110491,2034180785640221,6289379221017375,6415741398160161,1285773667767075,3809689396484230,1753917692580646,707284390875946,2304609337905964,3189707896329005,7988978331128622,5204630200626653,8206633491419516,5265076674794291,6744983828150864,1257987036549945,6614294874362685,4170667794240319,6822676092523328,5053642085798721,7349929014006597,5326364370604870,8391320427598663,7358432094262088,471177719092041,839081840972618,971663733494605,6368047694713678,4873684622152527,6997023765795665,665160807289686,1774960111289145,6649332339053400,5179122673768591,1100300488119132,9048679940503020,5128464368309090,5246651820774247,3917744301151081,2773882484921196,6739451115100306,687411352015726,2527523041776496,1275815199567336,8795607027192692,1712295023022967,576203601482620,4990150469325695,768494484231042,5548099965752202,6632878132027483,1576319979623311,7570109580243865,3030844811401368,4568473927652242,4271599228785555,605768537969556,5693028354298775,7420340445189016,5193919192994713,8624314879492933,2775220430869409,7431916525639872,5753493820576675,1898149103211428,4369968405582757,7003589594583976,8567665465299882,1426180705686443,2890780278166444,8526010583636125,1800935342085042,2220562152592307,8460135851103158,2665041257731001,7577589066240955,841992361153468,4355662947226557,2732914258219966,4066631990481856,8679236217701195,4037563931300805,7774914566882209,1322293088392135,7935408096416712,6329422203388748,7725901856796151,4534441488585677,3335236846293966,2230738768609193,3534326806647764,3730116258894806,1574207001516196,6499411262636879,6984111283803103,6677113284746453,9059403615769571,6937166653101028,5573238314570726,469038371935210,5588118141950119,9195047546620924,4077455487276014,1638833719406077,6113296345437170,1984413746205683,3128540622033908,874474031485944,1166246635049977,3703173715170299,4801176197534717,2911995093631829,2885999550927874,4525734524261380,2882433592890379,4864993215288332,6932356154627086,5374213486711823,2535105588040720,1510146029556754,5592094263317523,8463142688265237,1636203220119044,8123647322723358,4726783325115425,2319911936693282,2807013859038244,300245026968613,2881962066940968,7386470735695138,8622824501810221,8068475005211695,9159740996654129,2998045016069170,717084020085811,2968289295733815,7369310566197556,2425191749162043,1881539325498431,81956580856902,7490035299587146,2621011449222219,8995106693241771,844429407065168,8502229848069203,4682187863790676,682968715760725,7782062559269974,6965892074411096,3584753562452836,861379618149467,4818579532682332,807904277271645,4795627597501534,8720953153654540,6466204108779025,4719943625741416,2648253138474090,757917974041707,3515654144693358,3983907046069360,1335098368627826,7140211013195966,6818244781599378,6855422565880951,4068082338816352,3932377963107452,6035571435410559,666177633260673,3123280131232901,1300046657918086,1456458997699719,13023333061769,6122939603260554,4276711297035799,7451987425727628,7069830947411086,4650038856619151,5565728213701777,1522352326146123,6812072603817107,8160987280938132,261558684652693,7453884767362608,1596583925159065,5450503280989341,7268593704768673,3387469093180578,6710238177203363,5854579300406436,5905206830601383,8342533007938728,3240678505714857,6077618310583466,3164838064264364,6564572713384046,6035255991135773,1392508270253236,7620542985445462,5571060575147190,6896563764925626,1104434981573819,8610517862705335,219174612997311,4606535664014528,6285957870556353,3389721965860034,1799274633991363,1256773307536580,7458725166257349,519715857929414,7034472237477409,6411625191511240,4364718938527948,3239829116523722,4928358873339083,8812959566048275,5029574890362061,1127015331468494,5034962393208016,6295884344595667,1434247623087317,2128476466228772,6003232369644764,3241647656375520,3975511357986020,2967711737746662,5748614261085415,6146447630865640,6650388261640402,3153784087450862,7519672998659153,5302066738205942,2944300271408375,4239961261282553,3231810810909949,8364150718329836,1163352648226047,6833598203905594,5313356749378821,533627435652359,7581603889419528,8074811375392010,8071285839631628,2353325957485837,8040376309847310,6576185149822223,1662174872737041,5742746823169298,5031806701114643,3878368906581269,6719523996079382,3803662214173975,3133075379524891,2186228536858842,3038721684739359,3214888048979504,75646607136034,3427854636619043,753330895099173,597778043147558,6043572441158951,2858424054650157,151726146820317,2671359132603697,6435478967620914,2959081965917492,810804177835317,4477940714444090,8439190990013322,2149272299869502,3232737322789256,8489383473222979,1004474347296070,1750063587988807,8323980170831874,8372800943809793,1169344939660621,7939688231650189,7115648858041912,405994364998995,348661036698041,4146972682098916,5418453748487516,7840954841601378,708584241763683,16800804803941,9133097663763815,2191676539377000,1081871977420141,294330922669423,3143297704924528,8590506016151784,6682268710114674,613953492489587,4380056873142248,1719281746777463,3071181256136058,4221100539489855,396319247200000,7288547313390975,3205209685661057,1350652075087234,9090402649134309,3933361705031047,6557921927096237,6608456013387146,5876672929207691,85302066648461,5154236443530638,7875391976593645,4087918746441104,5326459189892500,8092503783528778,2384210076632315,2268726577239449,6325428022744477,7182980829156767,3459789852448160,1908664385564230,729577469318571,7713514153285040,110933012944307,1244345849386421,1075064541124022,5209161587791288,6704949870302649,4131071369123259,6249987798767036,4338362666227133,3445070378931646,708483393951173,6953052155642785,4255755388130760,8436901163308489,4146441345734091,5594595419821517,7367078951638418,3276184277816783,8369555788010960,5601384078339662,139483031115222,4188603575309784,2067943075288540,3808977994946014,3123917583324643,6565001311163882,1106364646757867,529237183010284,1225374290220529,3010177848219122,5750836447783668,3248026960336375,1768629651781367,5804397710841338,5609613371086334,5607889638036994,267870650144263,3743195141845917,5429357022221837,740080333952528,5000634936301074,648752358921748,7486595835762198,4219688971136601,3909897937753624,556360770786841,3385775443613211,1651714541983261,3635766562788894,6164366877201953,2265649232516642,3404956919010851,5322763225830948,4876018474882597,3770005582943784,4163853803525673,4781042411804205,3772443855328815,5611264023991856,8104522614478386,477481524237876,5499982129632823,3708961326569017,7972212628002362,8484517366765115,5958216197740092,2311625135200522,2773382071064126,3418778463082047,4207320222733891,3453568818615876,1111356780320325,930879288875276,3913994509555274,4863063153808971,8368788973629026,4887364550399568,3315498827945557,6682676750182733,5714616959014488,4831638267054188,4839513697785438,3284752982349408,4539087108839009,76496947353187,8921195733621009,1533644417996392,5678915854276203,2423231112648301,2798720900568687,5255148488300145,7635608054765171,8358125104305781,8416690997898857,5267888473871995,7332353005426300,5649332760581760,4773201935210115,7969779666982532,8787077923218546,5474814376416902,1459362901857927,8705806438798984,2558522800871053,7319340263544464,3686794021508756,1931135124575895,8735708974699782,667993867458205,8708746979710622,5813860544517791,7452228954036507,4846930736912037,1250339516192422,2385555922589351,5515687032559273,2747714449282730,7971114715158190,3013286322443951,4896925376517812,5691410134242999,2947037900019389,4702929244952254,1153433024632514,150522349295302,2171618790512328,1168837395683018,1678435375578442,3651850096875810,3185778452305614,5541753726703311,6768367236338894,4665529405183697,7281596405192403,7861849744098254,2493480681739990,7418127293847257,5816412837648090,6243497778091742,5916672471865057,1612678976116450,6383314626795814,405364828346088,8447941806888681,5936105373865709,6636013408163566,806545448343279,2493269034637040,3048726696318466,3200502508295924,237163948578549,8223206690833074,4673027097019348,2040012352263930,5898730659321595,6641577424426748,1824154165898880,3594303998039810,3565951436527915,5902789350987524,2561731938223062,9168938745638529,66781020755721,6827577615619850,6822082889237464,5181581306140434,4070236497745683,8289830599933586,3916267108275992,2714536119768858,7668733629208349,1358920275662625,1000902701356840,3304666685806377,6871572570412842,8269148455999275,3338478820267821,841649763850032,7341127343668218,7820583813125938,1713905932605238,9183630305160841,1208908742596409,4794542646641631,8195162163255100,4370530986334013,1181497739024190,7898370613466083,8316727328675649,462139327256388,1902341139109703,532355859421001,4043931144263498,8497956139166493,2318426660247373,7041077423740750,827377616885584,7803929508288339,2331402153662292,8236335539328853,8187332907276601,4306986868348760,5034129034155868,2449207402895197,3233697452922719,5356066255411042,1523737941793083,3809202634752998,1522796730881896,8543213209600999,5291671412889917,23692719200112,7389057497252840,2315545703028595,8582336178919284,5368085164857205,1546633888110455,2886840762505080,1630944885348218,3907865566418811,5468229644556156,5042362029458410,5046635873015678,5623280999274368,7597613707041088,1400670988066411,5976435884125846,7064362840037257,4805778133620619,488106216691596,7588438471022477,4169663194601358,5679621882320784,4027469811816337,2544437086558100,380506705106837,4177901900273559,2864972229023640,4566058809530265,6917728177821595,4539974370072476,667188587081370,9037367932819359,4826526490630048,3644482871760802,2131356189267876,6901211793332550,3430652156712871,9001329450748592,3070646706149703,2935219927450610,5862473486309294,7299766694057173,5317298753214387,2105679805814709,8009529923012876,8184607371985908,3757333482805179,3259102830893386,4477453681694654,4357755739969472,1746515454367682,6619035964446659,7760827516022433,3569628365920200,427702143686601,8784964468807626,5689238251968459,6277828169988510,8675219984469004,4255749389064143,7574043333007313,8422426359535573,3562392958572502,7386510684657623,5889270981629913,1231546588403674,5386491507709916,4957162848977914,1091100077365215,273173033064417,5493203798705147,5325626333534180,4199293411563493,1303930207279078,1500677237970922,2286417072297963,1362908705265644,6577603274053613,7910244763146224,6361816935378600,7328855616231412,8567506462458878,2640665178740727,8993329995388920,4520594017425402,4456748074506235,1294199625783292,4882783360489469,7485169547220990,878232692201471,4292632765700096,3346088776013828,6644424137595222,463337071810566,286034101344263,4048993222137865,4840544442193930,1671115513174027,1830810582194188,5094949264196610,950790318594062,4333108895455247,2233784071624721,8470499751335959,8197022019328024,2485497328277531,195616719515295,7816434883003397,381072622235312,8545679731103778,8548970814576677,7875028181424167,1536302347884585,1486731384854570,398841719330861,4964811547220017,8117703890590046,4264009398196281,6247971213580347,7411953120876604,3921494014990398,354009234774079,2390482190637121,8591553156081468,3086534994499657,273446923212879,84396370958418,7792453118662739,2294642873374804,2860679964722190,4828772223883350,9028071123916887,4717207292909657,3230185071122522,8010018885507164,3352891499911262,253970727147615,6259312187709537,6711437453459084,8520196166621283,713432034121829,8796528880574203,1884185540106348,2889619182481859,5418852574206063,2706741803260264,6162073074047090,4907790648416373,4086407220303990,5808351078652025,4877981484357755,4092866144802942,4353014480574593,1190871582218370,1718566061283460,5725410301876358,6512703239756140,8703044825651339,5756860989806732,6029644065413265,2030774902790291,841450192214165,6031637604970180,3442973042022555,3358777837000863,2338538362149025,7539695440140451,4092091999426727,179517417625768,7820530872162474,7753467259236687,2233840674478253,6977270564198574,2441696261192902,180347348981937,8960179511477278,5567940947646647,2295749767502008,5829718136068281,7476464782072555,1018517720602811,2304601859889340,4928007518918846,1184534761915424,6793524769233092,7999196032468001,2008294302161096,4367835944261833,3390936749283531,2529117095958732,7311628770384077,4630421936150738,5809402506942675,8826624292034772,8048235688603342,2028048270301398,3809942444480731,862614250395869,4192715812870366,2949099494147109,4889648486684900,5929629529544934,4869768097700072,8257727518278695,1508623697025260,5780012973463790,2835436372334831,6815874184283176,6861564360322771,5513468216842484,8946293251086581,597708184393975,8466645519210744,6930815191292155,950792688572670,6826336351721729,6012731138906370,3677290911668483,2501925482535175,3457976599157001,6220130546325770,1299701040781579,1242209144609036,3309226400585997,6704674054347022,5791508412963089,4725631605512466,6579276018265817,7446173186032687,145253931194653,5645609907820830,1839140929083680,1707850003618081,4555549027014946,9082014129942235,1318114260818213,988638240676137,3233957507504426,5392214427703595,7635174031333679,8432507517999496,4452286953199923,1908229892020536,6182749016398137,4864686954846523,7266120966046773,4672123718375744,946977481365827,1675396946827590,5010343701748039,5292092049332554,7622300703922509,3907158026492238,1820529169733968,6900836611922258,2992756626266451,8762484692034084,2101365439099407,5768182014220630,2039215000492376,4914887939496281,1559005111490909,1569924027980133,6383829772179814,4711038130536,3847282557000042,1768888274295148,3602195400705085,7111371731016048,3241807065192817,7068014268717426,8680417810356595,284915244210548,7365874966665591,5836474934958458,5903913852279165,8460234801370891,4264660054448511,2933191570594181,874083978910087,7955289673734536,1586096843430282,6578750657272213,9189468103612823,2423541574703512,8740835949091225,6715468039920027,7180498409216410,8284664327238741,8812350410174192,2181834947631522,6789837601511848,4628731165448619,4531845444442540,365513575078320,6954637691951537,1686483285318070,3873320613102665,4017513395657145,8812049084123120,6073556791531965,1407872750721478,4019481548036551,5905069991449695,7184469458098594,3203092349426126,1823089190083023,5425877619644880,6866176587635154,1694211729856979,2488434052438484,7261932195245817,5286316080765400,8369414038460889,6301176064667386,4254037698681312,677055882030843,8908947683514852,2239010511526374,7379945946421735,658734743853546,8566736521239019,3097648311769584,6815828596562344,337402750638579,3541377111890421,4717630013839863,6842963678140921,2936916876794363,3523621790587388,1241131131181567,2959440864483841,5248288276781483,6643895098055084,9207367928251479,4798304108157456,8421321601718804,5247009317722645,3436193077369366,623920142424599,9094240561043993,6407903558310426,6590021915523825,8488658698902045,3146649319873055,7048319403301410,8606204228311588,3833238428523046,4160573869267496,5788074793146921,8291448802169925,9114099109818119,1233915398691372,1884131426048557,2858121955449390,975622888823346,4402575675431475,8254603349170741,8077902875826742,7049736505208585,3757340924746298,2642035654892091,241253537716796,6091468841081972,2015783869848127,7726409425132096,2444841005226566,6147612521929287,3594860667607625,3697337362029131,2900360121395993,5212358594304589,216333225073231,8536934238984784,2415844709243474,8483110579280467,1710912515414613,1178540373645910,8377604529691223,5132668006308440,3133925989653081,1001372685310554,1876756210096731,7521904534526557,2667760454703713,7724662467462246,3230871206730344,6166324569119338,4869018679220843,987964239223404,3853338309270125,4834443607726525,1093606546414195,5548142965529204,5440381564525173,9095159955724922,4245274665114047,7612004737882748,5596631501216381,6281031018191486,64474143857279,7298293163793025,7645112058523414,2939043869301383,6014885520382600,8055861486331904,3704023055374988,1199342952159885,4470691937819280,7808411406146193,5926579137780370,4837817948707476,8916065410947734,2701957648002841,1269370089446040,7941286483466907,5379673696967328,3905500893584036,7204366811994790,832149820873385,8650556453264042,1781151844293063,8051047234454642,1934577406352046,860102035675827,2495509130189494,1781071860439735,2043042550276298,2942017716225140,6327690772126154,3255727342623425,2645046464289474,3744419095812803,3661905270101334,2103741869464262,1683166611570166,8362315913173707,2242267385338573,5660911166528213,6101741833984728,6688323860667097,4694543462734287,8703824619938596,2241539580533469,7736710963469023,4682634379074272,2262435665877729,4835807858858722,776613004352229,8506847523543785,7709147326585579,5567722668858092,3595176526158574,8506361953458927,4127008549247728,793239511407345,2602951650679251,9120149585500916,4221511321197301,6652599573551870,3612065805015807,4714738199233664,1947502145248003,391606523894532,4238659175750408,1938288119705388,9220081544436576,5537459239754509,7019602523525925,5409103808605997,3596969082723088,4409517719001560,9153648178961171,4647457007377172,6634130056944406,8036669939304587,2429761706695448,2857423646432025,4106573660986080,7553742429526816,352271281888033,4522359625751331,3419427886400646,3774812437977895,4110297138305839,8739013256414344,2824053511941939,3595399332502324,8712944661093353,489970150415161,6971472135101243,3462969463194762,9059458959383360,3127360766253889,4783391346793282,1902199374912324,5980564594727751,5684352545069898,1307263615064546,4677630507588430,469149255703375,2391439591731000,6888801440848355,5576231069358934,1373863624093610,6971890520464219,5788252994935644,7326848709401439,1278850252807008,5997493063064417,8448637386365796,5941459651926885,2318904529722216,1363397353937770,3698044622248814,3496953356721007,4055448389163893,1434353544764278,8499977260800890,6874516458660239,3579048971148157,1686982463358101,7872553270236025,2325739571747713,452103002594181,8397635092781958,473320216130925,3992504102525832,6069741414980489,3688567742765967,4018549966314384,7513810339366040,4522092280224658,27035426746179,942159627426708,8079069839432597,7122309074306201,8419569990245273,3811837664041882,2410291611671451,282900143807388,2018219571223454,8129393862060734,6271674135616417,5801287219485603,7628515135132493,5262882774916007,1193641294666664,8263058326625193,3713292872194986,8035746167364526,8455516986393757,5533404068846512,4789719970945971,580697185754038,8149337335274424,2661291908733881,3609657291611067,6635966961425340,8488119765081024,1069296689717037,2663445977618934,9069138285697990,4904855118546081,2890528263216072,1665439366131532,2408042865761226,3577844811570123,2775965393984461,1626604529621969,8482319934856147,6460046587408206,893547657173974,7172552793725912,7950493156503375,2468860497353210,7116264549850078,4216490053835743,1914009624604496,2079141516254178,7915908268546555,8130929704180709,8817861749971942,4826098320874471,5761538358844392,1125058224123691,2805312877009898,6317664632806381,4882349260872689,5655953550613490,3131390756396022,1672578933988343,5285413790292985,162137632152063,7159766362299390,4797771079949311,7957065878772736,5694239969680389,4070507558968326,836273898445313,5824582224387081,5839109079866379,3932578840812556,2337829033122829,1922325156633614,8538819395460114,9137086740438035,3588517892665093,574561821400086,1299935110241305,4883027225353243,7896148221565980,8657599971335198,5271755849800737,5719663757564963,4725799892556836,2868786873310247,158290236054570,222883648117803,5158062517197868,3514138335616045,6556481206328366,6389385871785319,7904823445428185,8980184208781150,4278422781434936,2640462195203129,524970767916090,1789748324342848,7454041823855798,4969752407678023,1310446152752203,578646940261452,2670996222385239,7329951279848542,1699802656775265,8785655206069435,7994653954088038,1922573345987687,1126683606981738,3756327649320043,7695306948428989,5287973274885232,3426668922575985,2606918910450803,3120910478875764,1125977753459830,5054282506973033,4375211769404536,5600663148233919,2947871766879357,2790660129724949,3631168498179200,5835831942290561,3803136864590978,2241489748630662,7431593256721551,6011060614929552,8306751640312977,729210075651219,8542313590987925,5106638572231833,4976178751577242,5224884891262111,9089658458241719,6560459171458928,8411756854090267,5874869348736165,7477535246163110,7071891260120231,4175538011970728,8922542870371498,3853753720675499,7903466400182130,2998739527462956,3685253074230448,7130500033845452,2468606037597365,3285861051833529,8282763924839610,8331121599651003,6974846268218556,8258761209039025,689087620226241,6766534949149891,3330620303580358,1139921765587489,7522153537117384,7058277189371084,5842040000552140,62582887292109,7472190365015246,7831467795912568,804954026995577,5503240305384664,1322386278620378,9060133776825565,7211651345587422,168600222080223,8520053789138144,8304690221784293,9168299061562164,4642616550366439,3838418909306088,208650520009961,1672305614167276,3063290023779565,183556278197487,6809105037696242,1504664145337594,8014435783449852,7169737664781739,5318588192300290,4277009915026692,6588864030022917,3521627813944582,6746596585905415,8654390345286871,1391130670996748,5648696469396013,3232444131974416,8183259999640849,8440161591696658,8955991559395825,6894732496782553,8451608704202303,1596280947252506,3965625231351067,5225853447839005,7079781346188574,1507001809444128,8129961131318567,7398191836497116,3425386652835114,2888655593905451,8204685888888111,173645146561841,5872060667174194,5268930488703539,5677716388100023,2593504876830006,5681073051344184,5424479312780601,453128058871102,6840494093245759,240486367042881,565882918018371,3817151587938012,8194408791973189,3039550235450694,2689414741564743,4820216898755912,956342469369162,5786350822890827,663041636566242,2116540665503055,2237503239527760,8485121900031886,5065934614732122,1076906674920795,2859179465906746,2698402139282784,5848481611816290,8705826346048059,659975396121519,7723615504833896,1347678741896555,7852129143299438,8494284682370416,8069620434410865,936548902696463,5948246744505722,431708109774203,8198810589518154,4761195031043454,6995256809004416,4129616058785153,4063954285075842,2067698720611718,8505871152798273,6307160220081548,6516307548964077,147972827159954,2911744130915732,6591463615366382,5135003759943062,6887148866968983,5336306978725272,3250542844845466,7895195740413341,7556999709171104,8165578544354517,2377451438611875,9108932367178310,2322459644075430,482834517269927,8701046122159528,8819248855212485,861831993499052,7354666843030770,8984912031431269,1384801838996915,8156669800094281,4716928364119284,6719223059588817,1508408543911355,7523128606367164,6272832432086461,7825859731299775,5364899144736466,7310245645840288,6685044211981762,5349943623884230,1292043322760648,7438996778491337,8518384725237196,299173893905870,7979009349819857,1766157505011155,2889123931561429,3985509685403095,7612400721305049,3812795193771258,8756545183817184,5834397461519843,539044645281253,8394798743887336,4919104310943210,4909897022250476,5244811115928146,4390046305951214,4881801318499581,8360911166873072,7843799104990690,3564608137567731,7219453978418677,7222962416066038,6034794148765177,7698313816590163,4606317411119018,2797523836771838,8372777408895573,591913935347204,5782949372500566,3002383012830726,7674636880199952,675155156344335,6437581978443280,8734645890321320,7077416916862156,782833742323221,5002242351439382,5959545827433049,3074875489197592,7986325864957405,6423873819291312,3837124262141468,4159419231280669,5696260766735902,6945960031476593,7895088048877488,886873402710619,1389299745627684,6688139799928358,1853150224064040,1632689304575530,5605913251651117,7940065296030301,7037626609606193,5577213873069618,5234958794858036,4134200036204087,962649230548537,4506124162244156,1474875263622717,7737105909587518,4134283760508481,335397918449219,5521311004171844,4034498991250017,3611569312538184,8842679519602475,598864072089162,472951039630924,461765733248316,3298570173455952,7932137544851026,2103454765194836,5948169956885774,1162906612309591,1366821537357402,1355593486933595,7167740303449692,7939514005149863,8066381310303840,5962322983493219,3609473856970340,9097523035048943,293372851461737,8868116319447927,6434697718013550,8710221108092527,7735164560756011,5297038572789362,437305264152179,6552796904201852,2902458589945469,8224571726405247,1522136439725696,4033431617543811,387611510185604,5276601956336918,6153072314261127,4489988011138696,7324060521995916,4629034528415373,8199352750692973,4064462813431064,2004251447762579,193404875087508,4662523904663190,1847569014005399,8660226039029403,4729249529142942,4005586020310687,7051195447080166,7862543221075910,3581460111826601,3157563055152812,7862890834370223,2701547161427632,791665331707570,288287721791156,6305223322830110,5261335623343798,4322268765134519,3921205183585976,577480229789370,8685079856334111,1335047821401791,3177112295874241,8068158502706888,6698503604842444,3140527570230989,1859058714549967,8812084133770966,5518666423213778,1676302074496291,6588165162933972,2209874679668437,1918187558837982,7808598218710751,1160795484692193,6432149755829993,6954121399331595,8063703890173676,6467319195959677,7214029602594549,5622950852254141,1045482329349883,3284684385951486,1043672002830079,8950932141512007,1477451311587076,8563726594711302,6695206888021767,8291327025389320,3035175278681865,8551172741637068,280614496804621,166504791219986,8512485470765070,2928261135015701,3892380200050455,2103640804564760,8178948294221595,5371124150804253,9109003666463365,4712776301387553,7646155290582818,7153552020119331,6052542825912966,1551394506514214,6176189902462760,1198370734677802,6876423183172361,5980751233130285,3693437510197039,1729005660002952,6238576555826995,8917341792575284,1289069536223032,7429082350886715,6792687893585726,3301380777549631,5788108891234112,3474049772724033,7741628834213023,8340330863206212,2662455342112583,9176506661477004,6544923158500835,8664907063893841,2515425308553187,5333134910955348,444921650323285,5251852484445498,560391106764641,765231369232226,6679911976043835,2131980813148004,7492160358952934,4338413945102182,8274735661748044,9029333808596618,5928034769543019,7252877215491232,8145326234607474,4093940745314166,2542036456730601,2764993710989176,7905995794299406,557807430442875,4407627325349757,146697143787391,8441751259124999,7105147164958594,1600260767588230,5966477229012325,1504590096965512,8997451204762263,3610450814443404,888967242941762,7680659433955215,8264130061696986,9204176967277208,6421166425878510,7028491503280023,2536987286675353,4992120828567451,4575203782762398,526382622121887,622271127003040,1702562018271137,3666102395707300,6822953718149105,8701138114256808,4178964687471288,1552263086514092,8297189341191497,4392510921220015,8402550266044336,4527465083520328,3332758333013212,5466025563627445,8092653220790776,8623637786030068,4876565400339786,3906380737720309,8502968414150593,6067805705215942,4851824854147015,4117023227027401,2384866414796747,2180242800353229,5006149583118286,1128066307137487,3652474733666256,6995367515660245,3080079751520215,5134082293997529,7668275091424591,1419759891619804,7565368064483294,4756100122091489,8855960195339428,8295612730613733,2821688566390759,6890187196790035,1827215026528233,6837612895543274,1040896260972523,2258214857744364,1943843396296685,601209677717486,1518622758318077,6196650291845800,3570019808976882,7780743852950765,8951231551558258,4890597318531753,1132748890185720,1937700111686955,3733400251641855,7656238720983507,5773509348794365,3030252625633279,6124897971019777,6339054400732084,3061525791481864,7999248084523692,7718538489444951,1347498719223819,5296160006709262,3582072335343635,1065096151080985,4182627078709274,7083291890425883,3746330941005854,8269471492513825,4498178137890852,3203325215318055,5343419802591273,6241562927636522,3552896759603243,4755671538966573,1106486642417710,4094464553754672,12796120750771,5507153104281652,2612920462846659,1681827256410167,3068814675189817,2074891018674234,8110944982020106,1602930995011653,1812932860747849,5220680565170250,8588915550804663,5641363606085709,9115280729546831,1647515298373713,6178257569620050,4521681379106900,5762536953159765,2779263270920278,3493850377166935,8032162686420325,7346851420020836,5422008362654396,1992250438262890,2405003554660459,6969822622035986,7903688472764526,616213761007727,1916847653724278,4431522942754935,7137604285702264,7502449542578572,8617289874725567,3289626202120317,1072020105535615,3333769114165376,1753182963212418,144931714670723,3089039878598678,3670534097019014,6221748515905672,6588395472253617,2714474871156759,5678535289075855,7697536485612226,7695655409787026,6508777858474131,5476592324550807,8528142584891586,5367338692321436,7431552080075461,9003196042518688,5819107090604194,5968256241741851,6640819902292132,4524343135576229,2348869604581543,7229869419602090,8213673208994503,3976975141937324,2485822164639917,478429924958384,8638792240701617,4217750521225396,3561569164402871,5178763806613688,2860268578152634,3368335808438463,6225347626803392,1081352961794241,5586050509447362,8404939496005830,7893845473599688,3203923193077962,3845771839316173,8187268173099043,5100809481527508,7149540505585017,7279993717917050,7664358693314782,975571793440805,1583135899132130,3522875628822756,6908002082074662,6866915994033160,8201280612606184,2357767850008809,7038232769096980,9009417170133228,1917466040901869,4034731774648562,8904327118692595,8874881877057780,4729017171910901,1755830784336118,6600353111253239,2392761463939320,7800965240430842,7202479407767804,2333605975044138,482959226642686,5965684256383232,4781924694368513,4225025293938731,5652634511618092,7042740021600524,2450845646397712,1221599323527896,3258697460949266,1563426367512852,580215518392366,1359499566653718,4865804431565080,926986864271644,35093864685853,7652215168606500,4533195100594470,3150760072585512,1574990813897002,1390612032495916,3417935742868189,2545429641503025,3747112753373490,5760844170194995,2377532429884081,541007492030776,8193953852793145,8394935593671391,8215193602388021,6734894754603328,3580676404452064,6161648935084355,8304603164876471,1224513586176331,2764835424772429,8026897321769979,216808227905872,4282981620982098,6316394126057812,3173980133847097,6587649720654924,4273470923219289,7641458096152923,3427703218512224,3026299387486563,4053180472679142,2099263707554150,6762534875841937,5517878084673901,6363278988668989,6288359213801840,8960994414174577,7276223042363762,8561798834668947,3321158017950068,8342448923320697,949148429394299,5215342317576576,6087633036484993,1099470052041091,525100424995206,5420120563458441,644056916992398,3810259107062162,4970573277442115,2820599675919086,7384928722297243,2736486942974365,6729673692617456,8248068146152859,6749091817770884,3034910544208295,9211731437356444,982248180195754,2445897861865901,6642878052211443,3347591507124660,5932749363028405,5594453424054710,2017969299792312,3329644240445882,8487755909602037,4180076485681600,3714363454424480,5177413759607234,1531049560154563,5541216243130821,1732527074189770,5366950989210065,4584253098336722,4886839835985315,8240462834084629,3286263049036246,3425045079237080,2659877218951643,3866046328676828,5299779506494203,3693122407932392,7117688113373673,8152300546204138,4808347413881324,8129369025441642,7778170503864814,8531636657309096,6910418201846259,6679710702590718,4244009311880617,6517092761510394,8101636699267581,8911308059848789,8030099260088832,7685830557147651,4393433231401477,6322927242027528,8879094626820617,5798185192845399,3832758895780364,4296065870111247,3011544689864792,4377070226842130,1637806774919703,2368835184992792,8415129301033500,7851528768627229,1787538429485598,6944532273111583,3369027809387041,7971935299871268,6654158417535526,2136684400058920,6500110972527147,3566829543432749,884743054434862,4614935126809352,748789061132851,8370199847838261,7582979597900553,5579312012141114,6108922947543611,1865045040046652,656179549643326,6025604799701567,4282167998849600,725876310909505,6288347189879364,5414961559879989,945610595934790,5974278419751495,4714600185832009,8391301821964876,558380518646349,8007043423542029,7563928009810512,2566026631914066,8627148930756707,2628206654399061,5848547628753494,5695859773710937,7962924025684572,1489700767179357,896907880079966,737390011068517,4435338649117282,523266654380643,8758701597827684,1070588938035813,3868662634455654,2691310201676391,418826648494697,2181296905666427,3236522585956974,2521849633677937,4744289107485298,2652554178601587,8247835897189920,4655378219606648,7822446669470484,3440252496978556,2916516660814464,7843654404579969,8363972774142594,4924114830893701,4117816571601542,5329982632567437,5841819132109454,9154047392914344,7572741732967061,8245203758237369,6361973215109796,1484569765627334,5275655515120295,7731977434217649,4535321359950509,758510041408174,4965497908077231,5276837295235761,323953762247347,130930418229940,4081995612725941,6538211730408905,4091286366200504,4526279492117177,5824985366766266,234423566213820,8559444678018506,3338636378972863,2840530532278976,6393602459507489,9170479870649033,2715822709088973,5508967587816143,3337104928824099,4348615603364569,4247443185312477,3293585957233375,6009535313388256,4333522514158306,7100313245197030,1452003876053735,2839475453043432,3417639408902889,7929659366449902,2761943792198385,3288440995816178,684407055327987,6797732776729151,5220079310938870,9202667072209465,8675413784011587,6271624570712586,6632550903128829,3194053885207296,6911242750370561,7997937012220675,1973037902275333,3338497323593857,5594172687557387,6959664059065101,161934416880400,9081117202981649,5717371171087122,4972286340080404,8509585217132080,7763694455792412,9119669740433916,3334263308526366,3169399230636831,3142669637907351,7424272295011106,7261289793233699,4508126065730340,2258622468170535,4597548797281756,3544836400918663,9061582946968365,1551561023398703,7642500714373940,5906414738547510,3172462762140471,6546962700126197,759371455210298,4808708606862139,380495252464447,7983150075592885,1258498124489538,3919643506385731,1726871211398729,2205404096242507,3497171560735564,6328227027592013,8768598577621589,2269925040563023,1889287840768852,4161514103645015,5574214094341604,8817193902351195,8629779668247388,6661760625761082,4666590013039454,6366290237858658,2274582011421543,3540998293529450,8828252964004715,1482061895410541,3237978215097199,6901606191030753,7272183340049268,7743984389268341,7509844543839288,4102309735867258,1529999280219004,9110398916141949,8525710476583808,5431121233322881,5273288292115332,1282622250066824,6214602599564780,2502309247099786,2743840571564939,4438087044801421,3122577715667858,5939802793190291,4123590719644564,4074069994808214,5489318095821636,5650605301029701,8735153133684208,1087688089707427,2012386540069798,2254614039438250,432895428633516,1354458278430194,1268448871657629,8429436915473224,5975416220558258,3575475575202742,5522451059614647,6131668602069944,7876521349882810,7271024002166943,3176933078574012,5439222288849738,4338771378250686,4236255296144885,8594539353842627,6758702945903557,6494855971939270,9273715631048,1375891166274506,7367952270173131,164851664780270,1733231039847245,8959834293642193,138278048441299,1850344382702551,7217459534177240,6948030204047524,1786230144869338,722650903487452,2778756256343005,2825467985961951,4596324030850018,2778706554528740,4820314964108263,8269835640054760,6094181998601194,5524094122566635,4010849596253169,3087345536934899,5363609175925748,4098694068249593,5308763189978108,4496571638686719,5163839365143719,7297547783513091,5335730466300932,8687331457735510,7054888262804486,5136685998187527,8399625710574721,3288263794435082,5003773796262923,1568970630964237,2149544990024719,6588369528321217,1307070202749970,8656684886828051,6688897731470356,7615101562925230,8829555896834905,1732623438193688,5154487381402651,2711179452064796,1145413849949213,9005809547322398,7440568977466400,2414962329134114,9112088199849855,8960989102679077,6214777074951207,9034193750591347,1048229222589482,5314120752145452,3077672101159987,6647394612519988,1147455217411126,1351590030124088,7257553090454585,510337162847291,5312546023351357,7699747277396832,7771829841699906,2428477165872199,8232932940358728,5284811247814156,7396871595533386,7319331338757195,120235709539404,4410057124619342,5747728443262477,8946219030324304,5293880158253240,2545675956462675,8150569281365076,2796118159991895,8843814932292697,8589000877679706,3841031492117595,2279631154291804,8948566959334493,2835318379750495,6081515562607713,1244021493998690,2836461748135013,8547971357647974,2532853973853287,3956039253173352,872185833038953,2573124626424938,704099365790827,6240908845524076,4045616586040429,5225724864832626,6691713097507955,5260672660513910,6837590750438520,2967094609981631,5060304025232508,5264809738345322,4841353781650558,2737771664319615,7173327429805184,8064774427419778,2825540668368003,6206782797259913,6695614265402506,1019133695501451,1789613873603724,6548168129480502,859288372913300,3307426631689367,2757249522672792,6356045700048025,4524306860647578,3946621672924318,3923862158714015,7075616808715803,9153299402433702,2237016351286439,6666975624307880,3437898429179049,4695025284785322,8630352342197419,8897418952610914,9192933741143216,2201759752529074,2104468313875636,7268697301591223,4092543080768698,3596883045786813,4533406942578208,7961495226164418,5515324999670646,5195603034973384,2438489437021385,4914100713858254,1247271723541711,6282264801016196,8848015582846173,2096438757467347,5680189727122645,8020015174231254,3000696344388823,2779850787300569,4783067828626655,3802815612462304,8158460216845537,6756612367525090,16955870225637,6217237676827878,8919635639444711,1336589144433896,4895392868246761,6560219689985259,3669224827266285,8746313005223070,176491177256175,6284645804221680,4504271503697138,7519477525573843,4836046378149108,7283471664381619,7778733070656760,3640276536108282,4834443874048895,8503343411037738,3951709737886975,8468647374751275,8727767939540359,7775890917369093,7615100179360833,645035283457289,7120213715625227,5977654687671566,5027145663849749,310151192473136,7576536115389721,4154757853947162,9002272389290160,5779252654744861,7751579933025566,6472075934702469,7123656851557655,226068205839649,3721782059984946,7261024938796326,8821881125350773,805418992510250,4172306549024043,3465095917181832,4480219153638706,5141513828574516,1837139520922933,5131343788120969,4943909783020857,3950349138175291,7021490300473492,7191499174061376,6543797290889440,4673443124389189,6493982611842375,2091359607137608,5756085157307723,9072941569075497,7484302974485923,7676023732151632,2788094581089617,1403206498395475,3463022032299350,3674963569550679,2975917260350808,2900925520815449,3701961036211547,1067425317135709,8690247540286816,3804413196969313,3698063542527330,597005751887204,8072707190042854,4243379208103270,1753849958999400,8055866215572842,8876416628147603,8545393881097582,8380808194663792,5778584151270771,7350297277310324,7789166320199029,2833206491915638,7804239538974953,7295495507450772,5066510099522938,4433635741541756,6516095646508413,819862445204863,5089348193428864,7478825413256577,8421714118256005,1250534143403401,3117220644234638,626904455357842,539061761713555,2440284418781422,5942996398777750,865148287821208,7514024325621148,7176274398389661,5207799157368223,9182552303368617,8638272693708194,9184467355116965,2311278553245095,7737604491126184,6953216056862121,1740545279305130,192395351041451,3424738072765922,6254152218063091,8735392715056567,5248136926569912,2342637802333625,390506368705978,6420712571381179,4314445325411772,2340711722395069,3794632249157054,5909625471346111,3707309557239631,221542190259071,797947620402631,3585256526136908,3423864371258828,4240483286670242,2932436324558287,3775001572451794,8170728508349347,358378442106327,3359307134707160,2832418094130655,2582654934525408,4271555364103649,5837716308895202,6388000254764518,6330455991395815,8815307592345066,284391332619755,1652178809267692,4667390788609517,603225215641073,8895242716915186,820034969183732,3040698409985532,7515569197852157,3146038521374208,4407236290717185,4692601939764738,1297291288225283,4864256729876054,2003254137005575,827534310319625,1108103930684938,1032517658650123,1498500377323022,1080150840223247,1997901424707870,3702580576396817,6810402982209046,2637265940555287,3262654998095384,3639716381271577,7805125575812634,4574300856296987,5796120668317212,6572588971372806,6223414621480478,388725152491041,2037263672518178,4288803397202182,5014211096389158,1225149314049577,746033127532074,5404082602845739,4119076868498991,5079603349923378,3885137033406003,3986894505373753,5468497751693921,6775542334334520,8736481280763453,7493283885251945,4629551155422785,2588524499674691,1547728828147268,3573481584214325,5635493241005643,250117505885772,8380474211116621,6064594871690832,4918982293726801,4633437696009812,1628894557775445,3476385719985750,8055323901666903,7922286844911184,5498859695162980,2813926003454266,579995088365148,9141991700519866,3190539530217054,5530401597498977,8699574900065894,2006369018816102,7535917958309480,3205774368876137,3454854142240363,7426239538606354,5118773598299758,1570101721704048,8764442142967400,7210896095258226,611786358105715,7498656297558301,8848994077399998,5574703223187062,4433469143066231,5436345205368441,4940235638515322,4256274562877034,55395083298430,2951245094233727,134641846475712,6293467720361603,3978133696816774,8889423231227237,8846656605189554,4746138689447563,7346934726810562,5842059152492141,7154030963454232,2435022017406611,3385850774365845,995739734156950,4901010793408152,548001147791003,7915030701975196,4337670001665693,1271995107433413,3909848478697072,5052452704986786,3807767138502257,390948907624104,3632593795458729,130870541887147,4246488768652975,7007214212753045,4211604134700721,4165146158573234,8936147996132979,3178198816401080,5862217966683764,499732628317883,9114726347818613,7644819056469696,3375069625525953,5942926977003309,6553665945645345,7738357467006583,7318947953157837,2082818250088395,4491266435000015,2939305679038161,5469738638091988,5444104371709655,2692352025274073,4211318068291290,5701176173799132,7955911761635038,6581515759714567,3049997438363365,714284337604326,4164345632523900,988676824658215,5578440443255762,3857174795429614,8211339376862959,3985387497826033,2776587442792179,7058973538723573,1359025517963005,2023081828427518,1214448027805439,4708204589197059,3812712513152772,2778389333911301,1875540884268806,6609807656986375,7147088718665304,8429668678379275,5556165750531852,823455804794638,7157831705293101,2337509694056212,8413550313482005,8661204933630937,8414569751553816,4230786726539568,390424729869275,750503149250341,1900621366863655,2851931787929384,8483891197945643,6846359388956461,4848489193809711,3085548974155569,3002785740433203,195135169832756,2487031740245815,6335647710947129,1040238219844575,2876565061314364,181833340790589,5270048386462005,3139094604883776,7035642677765953,2860248345945922,3080416430966411,2395464524932933,2588258394023750,315661065824072,2377983755134794,7292545404217167,763450622125904,3328932825409361,5573662964492114,8511137822615379,1220449540450132,3610648596424539,6018250961135453,5161662416856928,6435964755789456,713298600601442,6350379509819235,5241066612303717,2966516661430118,6936753772210027,886856732026732,8840762463659888,7553783226299458,7421100692929464,9214780721014644,492818589755253,5106005930157943,6735179468253051,827348157966205,2651678668072834,4633523804055429,2866691388123019,8612193792144855,3276480791881613,238264522123152,2103081210259346,883725987948440,6263418572777370,7636849291012003,3933631577663396,1308607465329140,8033862590012401,8812606700977245,7983481287902876,8803633277514055,7019801473755053,4200784244877231,7412482016946097,2115757713467315,4629020880089417,8906962828142520,7861148908963487,1049909981292476,4020833315127430,3754322971043775,5589546832373696,5141846116181954,8216148336947531,6256685374449604,531122375501771,7445662457735117,8861256981849386,2974929989740499,1668666213148628,2309505006970837,1598007732217814,7733684077111255,5515241475450840,8859390072731427,1979032538785755,8274655184005084,6979662803391269,7951137404856287,2232178163984352,6355349054760929,4249316774684642,7843850750076899,3915451851712486,2435643807377384,6151496703322089,4238250424018923,2260883154380780,1035117782397266,2645001524632573,6862007141115890,8347791294312787,596165258356726,7479457311303672,6297597792364538,8651423304329212,2951804446320638,2570232883980288,6894645142661122,484475288135683,4213347161614341,8885878303139847,7463922344667330,1648075751663625,7920254435059514,9215970087970828,5678442866588895,6702386674018319,4834287008917520,343542961811800,3769037207382034,2162687140177940,4675389873629205,2099319139837974,1648736923985944,2105144735363759,4001204937533471,8773609463662256,7510839874342653,8902867566107654,2565458714044454,4217849092745255,8359649455913448,8023691518847017,6508645294286890,1479402433554475,8365220251117615,7222981313023074,6364019092184072,7585109366581300,7680983089160117,1307884166096960,7772828871446373,8471203187156771,4083068312493068,2669547779205202,7855215518459989,7695785790384215,7931986564687964,2118175726512222,1550222644947039,1112410987047008,8411005693405281,8126395486906467,5547382917441638,6329526612404332,4930392257569820,4337394266613875,2996665092810870,7676565280103444,6790228511238267,969101414822250,1472039061923966,8328721276160980,16842454542464,8153694087055040,1504071629613186,5804977425543531,8689782446401675,1892742396520588,6513344941009037,8296914984857965,5489619196094611,3724534605126681,1915032788534980,6108657438894234,3448388708968603,8900729113612874,7825985048553629,3752168185047198,4323442756069537,1006455618939043,1628546043947174,3006595849908593,7495975488825513,8988626305460400,8362018753849522,2790632289347766,6257287342606025,1118160731285688,1778952269768889,7201176551991482,1027212761376955,5404904794532028,3786178126661322,5260764932483264,79682056464577,1433542558329026,7523947179804363,8576762135062725,7859120618711238,5938416064896033,3320375872652089,7949722888841422,896022235066744,5031881859803347,8848864951251321,6572844049492186,4317909477402843,549151548811485,160231378790624,2978921934924002,801874462451940,7333547265730789,8575745678190822,4612613095237864,3775895380699370,1488472435108075,1776626757650130,5607428807862510,7499427703269615,183781133789425,8562763720417501,2124785104045779,7270476859191678,5231106408065272,8905745160513786,4079301782516095,990969361803516,8942069073881342,7288741189562753,3825040173639944,4976991401879817,1935232275425546,7779637060053259,1107509424204045,8652083882469646,174256048056592,8505442893441297,2402669753444626,3458408755734803,8830639790832974,7206453168351510,136087323790359,6262130504149273,2215360288499995,7214200411269404,2708066285168926,4718738019395873,4678503673530076,1181765832976682,7862893723625773,4171702266276142,3211215449991473,7809168906430770,151464566532403,6202479058659636,1727350064624009,7198076197447992,1249478774403466,7568422822029630,4059461739620672,4853737357420865,596926852081987,6203339669875013,5250988992530145,5808277336107336,482564962781670,965892079279159,7173291073390306,5316448127687736,7821563118004563,2147127072172372,7359250240153943,3654790952888664,8061658140518747,7074503303342428,7694886647212382,5455331102271839,8092147280237455,981277839108453,6591803247587730,6012421909260655,8143325598631656,5073341351995762,4595325555681651,3245928227416437,9039096188021110,1612442308915604,7049019164076410,2121554170489211,3735008727804290,2013459880487299,396493542500745,1148671915239818,5547159018219915,5178593148099650,3333951594146193,5095714752801170,6564886616287635,7959725435726232,28270250024004,2815131053000431,1175793179830686,8757656511064107,2514188080531184,742726147647909,7056335978867113,4652917138336170,6984182841465927,177818693797618,7518639062624686,6835260298591827,5450280160471475,2630487163611572,7014231504646981,6701780662954423,3836429961963961,9182707191491002,1889764166488157,6359989999380924,7960316737923519,3796065588521408,1496996452280770,1511689205295555,189897401984943,2749236515482057,3851076199838114,2416294706457042,1650704005605843,3856776777935318,3517988393003480,8413734399165267,6654468605094363,3561532978702812,8231234088272979,4710915579423204,6931008350923242,5527708761401835,1795090335902190,2574945493320992,4833020994071024,6509364966664689,7570143451632975,145981863485397,1222357706156539,8317122812569649,8610693781367293,3732903921822206,1784835775080961,8585448108239364,4763552673147398,4387963668146695,4501329160808970,7738577602882059,3936806585805326,8276439335252397,3611462969207315,2644082335279469,4507626228754968,4683224352893465,1732437918427674,3688789638326813,6456862563150366,2665663111932449,6225349393558050,7844009746351878,1887241010190791,5942250466585127,8825145376156200,1668833633937961,501337638316586,6136851970402859,288566554503726,2993727594858248,7311219711902226,80649085299252,3268747175176757,4145201970883127,8980286300203577,328792012892731,6265978561145404,3894733016434442,4149372603804222,2271575754418752,289263739906625,5230046892164875,2880850898987588,3074436916193863,6489815308872265,3230342009268810,4738730786269771,9062333781884760,2061342574094930,6052453478030435,5302068425108053,4281388772338262,759452678662743,756257197468248,4051977960729181,8214143656536671,3141784856439393,787274245122659,8504763749917144,8825094073789029,8625357215902311,2836154147613288,3980015681186410,7412470136449643,7087450415344237,7334589264472686,740268357757551,6355623603677808,4020038661712497,2103831296837395,305185986292342,3713410590792809,7627640380009080,2088509730499195,418556856609404,6008819166095997,1816035529009790,7755008413772416,5408435256666754,4894584678623875,7283158540617494,318392951155338,2850498747640459,1193369460976275,1617468327897751,2200607886224024,1669394251721369,6937643952384666,522785140353694,8426739266034800,7327118087465634,1340745978194595,2250708868082340,2283635658042022,955952621988520,894481395919529,1822658035395242,8996979380668283,1462492229970605,8831247972641454,7769975772923677,7875507357428400,9097281751165617,7775353742263761,8455459074910899,2826480044820254,3493329618971318,3642215576447671,2064205294984308,4575354660137658,2203601496451771,6650390416337596,6919625364156874,1793672030071486,1563137252076223,7060909969943233,1933708789754563,7342661194361540,476629142088389,1342889319115462,7402849898187589,6177692152801994,4947664265292491,3077911526025933,3017613088238286,8109864427205069,5550414560832208,276352014527185,667781688732371,6755010816518869,6784849064110807,307239390277183,337033181375194,1122787572755163,8388961447488221,3263367145171681,4180915840527074,7275511672577147,7119880150133476,7756527713060646,2367234240424680,4627366612675307,6094655191755501,534070993230973,2118206688832244,3943001883978485,8085601929784214,3948627463685929,650507279805178,3484128854449279,2094509914113834,3365710566044361,4025242096315138,7346239764769539,5921212068047621,4473598899727111,3430825297184556,3825683592522507,5222002171521807,7028820417325840,8740613123484435,5931265868573460,7480002334370581,3292098773658390,2954662128921367,4076199416048409,4824238717774618,655419868097309,3429583717444383,8553336561838880,2629214137068325,9140588912290599,1313475109563176,3593298530380585,1066555824258149,2228754632649518,1257710992370483,3693076988767030,2651989966007095,671141070777144,7504690801126201,4198491379149628,3077763516705597,9124228954006548,1590978307730241,6920390639856451,3856422192973622,7363129783364422,2337509575782881,2596625775831880,1003989855003922,5618076885920588,385261358295886,5727401349098321,4454203274668882,4329446109391699,6641256330406740,4818949732097166,1281280029829976,3285109332487001,8333307686103901,7822943715634017,7288336217746276,3443355582722534,5658425727633212,7215566585475559,3611967446890154,3493613963160439,136284808948600,3049330849950587,6979193414579676,1951174785167850,6360986284645525,2510327856737153,5711070885718914,7841419548044163,3288475939744644,1002667430161285,7535217737345926,396762296498532,3678015312276362,1406045028494220,5050806158535565,8413244505598862,1585074714685933,6280435346090902,281906641837209,5055151877310276,292056978467738,114274582801307,7801643226867433,7373986210687303,7276543692254115,2438417362037671,5803690681379753,4268746354404266,8556932995427244,4538576941296558,1688094167509935,6113612768914352,4000677108762440,5130870360320946,3624052448471988,7604070513191861,8181605731216310,7553421564233545,5014659448974266,8792303634394043,9025267203485067,5018293959142334,7667525219873269,839292995906497,2334050397563843,8731832886779433,1109075282078662,3297128464329678,9031320811809743,137187725257682,4194409875057620,1696274304871381,5344028872747990,8016654277979096,6492389210598361,7981214935234305,5673080232160221,3178598021770206,2732361583664293,9202854113684449,2535325321669602,5152722766146531,8654417710689253,5539213841738726,8262933696956241,2416247227719934,4179419840523241,513318880500903,1649435957898221,989630142032881,1792027842718706,3841810491059187,8556229050117109,7588801661527047,8402245386771755,2155279072766970,7185693166316539,7283034982525951,1598224552864769,4856515701430537,4895023899192330,5939049490918413,4570609777159182,5291177021693101,6831481825128963,7667686951470937,6954902998494234,8531546497195183,8771857665847813,405734808202272,5825959952428065,9111732576857125,2044860622318630,5607611518561319,1668537586494504,8018570833610588,9058881534667820,1609916241816621,3795762541775209,6141376883338288,5776039754869812,2973829499169845,1984500402400310,8899396565226373,2438719898332219,6078081731244554,8544721826098238,1365211685858367,7261676439947104,2570094695230531,8930633051515417,2016499868576838,6841140936584263,4448738233887817,3291311837359178,7907223259634871,2407037139463244,3481931355204685,4750764202667087,1946234054159440,6008526608870482,4090148111166548,1244680262855767,6367561430981111,886908920050191,6571872628190300,7055339622613695,618919206628449,230570977242211,279433892768868,4569558140045158,3116155007052904,317115435166825,54715030953149,1866904924138609,8997601797352562,4979536455381523,5727752857529460,5393142792674494,6181910145018998,3188837801405559,3135463391636600,4417290112430612,1703426983111803,2104448302969366,8445803560250504,6687371925925001,7650026763063942,5505967782472844,9181090668457101,764041999330448,7426707497399653,343797793500307,8708020698197144,4414811664886938,7314777641200796,2765138440858781,1734035029929119,389755852139681,6577249918777837,3777312650046628,6017033625676967,6133199280975016,4841501367512235,1953250295590061,6239405461089454,5922413905947826,8238279903905651,1737206012292278,8059252300586185,3442272547548346,1806872635813054,6122742516165823,3181780243983553,8323870660766914,7181686230428868,6534655486962890,1856569271233741,4021539513871566,1647781859372239,4705079778127057,5170333906349267,8684377031060693,1141008377162967,9008362185175588,576251155852506,355980093861086,5644742098791651,5394109937036516,2181282386342438,5048276985228518,2252388954221799,8552218061590676,1476279553797356,8713666508008687,3643658428805672,1767478548049138,4838768675073267,2284893037440245,1153483862256887,3572508172823801,3716834643356923,1302403457506517,482341562789122,3836413685214467,5988546061348100,7668647774215382,5263452299537670,5695927537544455,5625561013169417,3065285706558732,767558436891917,5475255717375246,737678139994669,3316631343176920,8571259524754707,1099009252732182,6594242758774141,397753807187224,1720872651599129,259810925292827,3404181038607644,5751572514381018,4121820933926180,1154001765051685,3235850909560106,4764821050804103,8530905512160556,7257373605899565,4705162310704349,1489765597457713,752150835768627,1614897767492916,7257154855443678,3061955755322680,7854326229643828,44521696767292,8662830955300746,5364346589458997,7548744275209539,1093196238138692,5030330446311990,6303971668995398,7346463433172276,2784680010787123,9069126137066039,1281461608787276,5151160611908941,7180855007305236,380206692609359,4750695963110736,1711067728293202,4794795671137620,2752918655895438,4296787884977501,9126061184265566,1530523693680528,2405313907928418,7877694692601188,4473828967886182,8356730317942120,4737482468732271,1603584089861492,111820283129205,7433288133717369,6196466934459770,28573289886271,1277959199337858,1670383008001411,7912051288321415,4536437471194505,7918705164660107,6646744160513420,3557126164786573,450635823328657,5541808542592403,1120057789701358,7816826212265367,7172632851426719,4346123322207649,7908058904072372,4307975608577445,3499670654463399,1582601927110058,2934217893424555,4503236096568748,5328318824000943,2500894735086152,2730765520776627,5174028153630132,5267860140174776,3992981505781183,5691977875303873,3329586390904258,4777166593535427,7086733876538821,8005791939014086,7017538258677191,3386008946322890,6403699614413740,5919300430736844,3845539454519202,2501828550733270,2073123809537495,255019034258904,5564168228810205,3389056873049569,2878452187573730,5123805751336473,4187871131905510,6484062137318349,2570400767945494,8814838445568595,1241534131711477,7489814435868150,5581484626816503,726620060725844,1708420627639803,2532782543220221,8775770577533083,4547817839134635,2364177014959620,7027642006744587,8325640472014350,1777242576170511,1958777401257488,3432288255749649,111066227279790,5805053630361111,6129662976667161,1918482381309871,1540025047526940,8829778597260829,6984583372713504,1845461530167216,4994026705038884,6790834672142748,7563668821093927,7735147220841052,2569736884989482,8304316386618924,7352864766374493,4809187208736304,5675004020174387,3187628269874740,2659366045265461,295780021218870,4909772316225080,5622743005448116,8266438916091451,8896800348417598,5593302690990005,5803123140406852,5817238128423521,7833560085618982,5950184238001737,2772798819184203,2435831734152781,6670604549271119,5503935829257808,3555760802351033,4475039668022872,7663227233218138,6288954902453519,5172076867563101,6070719834205790,4963117998747231,4099567371464290,4532199071166051,1593580874968676,8425963439009381,7169635504643345,8227367113311125,2574459873472107,615480757464684,5554658266394221,7147696373247598,8564291800346223,6915880486915993,1544465708429928,7026069217521266,8446266933595958,7175560224419444,2369786969318326,8373521627262584,6464480633826939,2145675368312444,5840288266071679,493430382970816,5254477417361026,5663783655133218,9203608305778809,981816292650630,1765482559091174,7203414349360779,5222628293881484,7655412006320901,3234705060540052,7341023361588505,4006747450748568,6871943043631044,3909651439988378,6611088892571294,3435089705469893,4894738174653040,8331499487112866,2287761053200035,4619960750616230,3674542564978344,8839988563937223,7401690133579438,2325285152272048,4852275556036275,5853611873578677,20880357928630,804671862451895,7543755607618501,7714948975537851,3778422617835466,5238090756763326,7319994109406911,1456332511588032,479668848864964,3919501088861893,3856280087015113,4225311145045707,744028793679566,7220070852341459,3409166748233429,5352887216910038,1615571650031319,2001356828847833,3130237351669466,5357135103438555,5645752629210846,6221639645998818,147949993210491,8906917937622757,5691217158057702,6244418400923376,3151737840971506,7744345798946547,6646697709055732,6845195724593121,7005298189829144,2812997022035706,5423057611304699,6225815583600383,5931310063136515,3339086375628548,4663372584496901,5505440243920647,1588483886329609,2145689347141386,8592326758117131,3458190760259340,7126808626672258,4657360112423070,8075444686827280,5101380456679384,5106812732583701,1349741058633494,4436098035003161,1896883414314778,7786524137342938,2775432457367327,5928637734072097,7770636059815716,3545875499396906,3045009507556658,4976268819115823,1967170136300851,6343572857335604,4150972006313781,9202393501807241,2864812642643768,8103924410789690,363964441112379,3464300631011133,9109691570335861,7309954958470977,8495745886465860,7492091409833270,3078701943074630,3172199512813383,3055162007170889,1043991976355414,4296915619295054,1544964592251533,5620501674831696,7940391689406435,3150648228425556,2410703620584078,9073909996948716,8812973988654940,8483566869950302,48653029224289,4306313736859492,927953212109457,5678089216503657,2569648081743723,1078659455070060,5520156995202925,4768950116691822,8897213672124960,4530078377887720,3170085694501524,7752421030965116,7609307131764365,7513219140366210,4837477633240965,5061434121592129,3462902836899720,1672450962468745,6638458793439895,998833677866793,2737606434926478,604351092371345,2893183132151699,3111996816371611,2835792593268639,6612140639301536,6884377038030832,8991324500111266,1763232127266726,3763351651944433,1199613563547562,3380812197867437,166697522999214,2979409769197774,8275919120283187,3967343916691378,5987639373606835,3908248139280308,9006420148793269,5993954968191536,7884532284207032,1203629768798879,6675506617724862,3363734928961471,1064422992949184,6085605504888769,6768517384613826,4314967037751238,6583093384130504,8739633488256332,554169806630858,4563411232993227,717012356739020,4327814559903694,1577782018158543,5252600579305424,3792882582433745,5232500665593811,5938401853190100,2499436664696789,8363945071543157,4183446395727832,9030198361436124,4461004178304995,2212315459792868,494499126849510,3880632991533052,4949502299688324,5853786888679403,1797847713198060,6565290026512365,6658148806638,8098434590427133,4908884552643240,702508713859389,5574920969105401,7643743794514446,7906731403560959,5237060964036605,5436249086439423,8702576434360320,5328098627170306,1132416299020291,5663707165995014,7400553122443274,2050657881108491,5772531112325132,3275386067529741,6472085322805262,3635029289775119,9203733836475864,9099226409611281,1216431168008210,8924257145892954,4978615579947029,606215701344278,4739284734062619,3761347244531034,42715828858913,6358288760680483,2471969687089189,4082500542902310,2921250721100465,5144311263211560,4209026448601130,8148300766955527,476523356008492,1273288608188424,8511608082673716,2472542972948534,7850958764322871,4995065507164217,8618143083311162,784048032133179,2074326939273226,5207254887641151,506280031563840,3666622391365699,3771578695856197,364240126881862,2737510162247755,4856456096100429,8913134584311886,5481028704776271,6165056307114065,6802305175848974,6414783796245177,6053186477797466,131106838523996,6007819818217567,6748119972294754,1874264690143331,8380763828793444,1603597622489189,3333998673178727,7895730442521890,1255870675660908,3303456746451054,1924407556878447,3525190750646385,6136706901166099,4379160371212404,4801873256722549,1489251574526070,5514829551710327,8782516619062753,3205809906331770,2024722453704827,4220276979457386,7678537097490558,9009567228577813,8240951984795777,8208933606666372,8234550405138454,4124294327316615,7663636862120073,840892938367114,801686552785042,6388500326297752,3662210704388249,4134136728957083,5481632765282330,61733848658078,6363619070881954,5599223420104867,2762352212670642,139854006300844,6077779949007021,4099106497147054,4620055342712861,6065205772759217,7588842510338078,424874147983543,1464546534612340,2235608424034492,4506302877118655,8141481140160544,6853515388954040,991299952685253,3146059668795590,4527369977350177,5127833565212873,3020621019328714,6757286826690594,4258454166155470,3180152504430799,3116018044973264,7179481801497976,5973723885777108,7675406812673000,88676115558614,6394811158245592,3102790457995481,8676638730657146,5864439124439262,8208528407919829,7306677263544549,7707534588392919,1934553385152743,2340665028882664,5137961893376233,8386285553397994,1375387193028843,3325917761745134,8309514214748401,5554632017228018,5786679599608051,9174767510297982,5699771099033849,701382027522299,1727896770883837,1058556284449024,4487291687842049,253492962013444,4522638315204869,4114398290784518,2528253757141255,4768885239460104,6895283158135049,1875988315254540,2303520537161996,1865494353752333,1259672114671888,1720760082510098,5256047800463637,4473112140820758,7592212753134297,6574518998872347,8651943548535940,6688757456941344,5917516199135280,374247053041030,7224571650158887,6204872472834344,8137975017054823,6774066476364078,3851578602524439,8672165053280562,985404948853043,1873551462740277,595138101850422,1923418166243640,4225248566587706,5541000950722883,2486349945057607,5209974436671817,2157501658411339,7018514981957966,171168466121039,5343511516885328,8323770943825085,2198062006201224,5797348880003411,7601585291309396,6610502318741149,2294173779734872,1131684345295193,2755569243238746,9164523880182501,4472863895990626,8189098767626595,6670043596501349,4444668597154154,5287573794763118,5692657068355951,6003523021287794,2051965301600630,310718320816504,8270001424937337,6878354549000255,472026755117436,2599751602581885,4279828302147966,5222251393724799,3276626900824449,7430344934281834,7994400082506117,4630426861089161,5998023601795466,3703143280062859,8625214522241420,3539224551551725,4128498369966480,6091022238260632,137295852450196,6438924220412656,2485373443748265,3939581334205170,4179563727565230,7317788585079216,1011016353067446,7759821920547256,5907014795538873,5732046649635258,8073557261431227,141215891966026,6074902047625177,5951143053177279,4093215138722240,1788465158894018,5312608424626251,1910771605778884,3586404912705989,1515523422532040,1199685440385481,2485950123946442,6625079680466925,2628056298402252,5857041393332685,1324875593396686,5846990674801104,7828400079216035,363860962816470,9132918171333369,9160566518854104,3430872262685145,1197486954885594,6514426214724059,7486182770848220,7893603726340575,367809810346464,7859551157654709,2185453676966374,1994886133925969,4825156620399356,8504012953099687,5849755371112530,6403990354571760,740127453065714,4712324721706609,8753726570770936,6113577438349396,3414342616003068,5702358070899197,5526585138819582,4380106880168451,8386158489154057,5307462003372554,2990561565291019,4570558316392972,3364621246902797,5384964989628943,7614422849712252,2532397099856402,6231360259043859,3055711862829588,7204676110627353,8981648682037788,3399255121048093,4978265202471454,2372233208705568,4564743597049947,1956587138462244,3889476304482856,2983748287826012,6765295038400745,9010278332035847,6576611273679943,382124203192877,7233823546323502,3895220927219805,129049580974640,979286777803313,449946851979826,5091940442119603,3420958242419252,2010474100125753,528796460921398,8892576155611913,8105349549863481,1440805072122426,3616384914403899,2996220055171647,6540162840080962,4997655385908404,8232413370977661,2271246124626501,1469547523103290,4711387042034247,3189772323402312,2508970317902604,5625061614498381,2000282363998799,2981403538567762,8752810607686227,5755398472582657,8995210730025558,5686169423491676,2926851304862301,2128557670183518,6150934776394335,8872877490647648,2717171087913569,8006260021339283,648512547304038,8672852030583569,4378364739793512,3474071826237543,3732169097163538,5467850780062320,7193286346617460,4111989389537910,5359918277145207,5867726299148923,2054135078236796,7739633211869290,31195385803391,4065807217111681,947546896544386,2102417349653123,5389267102937733,2337966359622281,3664684253393546,8587102718936968,66304129381005,487922008863374,849449137091215,1613954160571024,5575093803266705,2546200929645202,4106240838251155,860515124753046,4924902748119275,2315481316130634,6485617952240291,9011532265375270,2292982016389804,8514426284618416,7738515899626161,2370719850377906,1290487232901812,4936277033923253,1733578089018038,8573967060889870,8539321073316536,761542256833211,2556897389651776,4208669133419205,5472681951343305,8045779903265165,1714413065160823,2269651331953360,8159164821527790,3417492075098835,3489557002564308,98536473080534,117818725124217,1591291631416100,896925219533536,1999687542485730,3106803795145443,7695182135800548,7953087735247589,1112226674981705,4790930791794812,473067518680530,8239818196693743,3287254594007792,8893221208674103,4195459254104818,461875055112948,4522237591476328,562362618295035,3683822336324348,7263182419014398,7282339388764930,7390820194169604,8286866555458376,8749821505303340,7879981757142207,8468308621423405,1507548624958224,702669029356305,5704414466323218,8917418790406275,536407124620052,8904389363839766,7432148720627248,1114435101307695,2017522873021213,784425360831268,810796086014758,5443532558152489,3957236775957291,36811920651058,4378231283069743,2682327894700850,6307939402412851,727476535276340,1996805953303350,7859778083924779,2853366862426937,4582185082958651,7731887260218172,1924524287013693,4105412019336001,7945575358892171,7628539977229313,1636597412246341,3198354188838213,6499644246056417,1839600516969288,1422974350799689,3561383571108684,2693539177706320,809348555518801,5387057978482147,928454547977046,3376653342552920,1546632223896412,2312980592866141,1392616514794336,8141483473340560,7313927740404578,2292831847723835,4280618537726820,6899279950752069,3069811175371626,6581558914560875,3689727973897070,4935117347566447,4900210715997040,5254994332005235,7889561216837429,4797069218820982,2481309641323384,1030894099460927,8497706532025213,8519859957156996,8555415896199617,7342140922289644,8171432294495115,4202101630612364,7221939350532930,2748341974905743,1608983219581843,6547475283817364,1684274044220309,7826744839222084,2687011389027226,7013052229497755,155049929159581,1692927670432671,5041939271791520,708456232367013,1336240677467046,1736399704404903,3427663169500074,5433153448368262,2271827394147246,8830796165821359,5193937338741681,8473293133258227,1950538048877492,5643318495916981,4076993062613943,4931546675262394,2470806574824583,6314100925281214,7981607757394879,4637910854022080,9195010964763585,3736792352076739,5032687789650884,4747704533103557,2461622313857991,324671281181641,7009049912456140,7592667284976590,453161832985553,3637390240113209,8108169005478867,5290594701554648,6201896224437210,6575330514711517,3605348318884830,989273494827999,5213579547456482,7999880411922765,4032999136965611,5699890396902381,1577415786869742,8336540073633917,5402641206064112,735124284126194,4563019818447859,7250469460876798,3985831924221830,7176505747299839,6245070689154045,1027392232174590,4727967794803712,2543551720012710,2194529275130884,7382782874667398,4661176397116424,7626059808519178,696106931860491,4575948774403896,4024510144689171,8216871605104767,4444424969991192,5933916986507889,429254907573277,820330759566366,6947421831509025,1291582086067235,1076666627798052,5421871034217511,2301254253786152,15436826686505,5184934934426666,5764662157751341,6352441588265821,6441360644748336,5641375633912882,8423680151499827,1847599592420404,6349498153136990,35140351472697,1287447319983165,9052679472299029,5261528696248469,4730513449727041,6111903231335947,5334058691572804,6048542191400005,5526791888090184,3806761756439627,8377160700506978,5452816661361744,4338575484400483,5498796708574293,6639638160389206,5764398959670359,9073137467539885,6676257524298842,4944814963373149,5024167243527262,7717454033859681,4802518350410851,6963966441586989,6242606119629929,2826538319230058,8615839864009835,5750218207583762,5874814334675734,3883921453074621,476315777938549,8226604130841719,5225429530195065,7999143316436092,5586911775372413,6886984652922389,5753836605098178,888534377346191,534851773685272,9142284128028867,1832786953745556,1283150991242390,2762019189480985,1108718353495193,4228302271526042,6650526703367023,9124781982746821,5094701560050848,4363665471419561,5331777863562410,2557287392064683,3136242550744401,4334326651729071,1879705953711282,8391724653622455,1164145968002233,2358100145779899,6647229021271229,8121269966549877,8363797363835858,8691773907383489,6605655087887554,7277552241292486,7794351343714157,8128128682701688,8121787655926996,1808995504633046,6099396160369882,6374148495619291,1665662715507933,3395253351068895,290735551165664,562823542584187,5634929203918052,5824646953098790,7408314495057592,569996262782185,8526882390053981,3145177357240530,838100122186990,5814513093489903,6872178793457286,2668458902959346,7002885584876414,3185361579488502,8612347064431863,1314265886733560,1579988150859001,5148890453980410,9038464174142715,7005653754164479,8085926530315136,2821899251332354,5687116396836101,224545787393287,463143465694473,6184828495082762,8114052348554578,2991035276211470,671783704813101,4043584312096016,687047186298132,3995635742782741,6189187743036695,2001505893627160,8948492517618969,5946705117058427,8772700720379164,4558604659602719,2064053474647600,7906831035846235,7750279756887334,6079305765641777,3281031106278698,3805701358630189,7854744485135437,5191420298278191,3098642698417457,2563841069364532,1198432873002293,9043988295486812,5043309985183033,5987060207727933,7727358668256574,5743836906108223,2509412383091796,5397195256444227,7129468026045171,250566080574789,4094048058258758,8364807277360456,2499399192065353,7032244745319754,86199552849227,6899206808765859,1939075218666381,2707242045355344,3534000759518545,7689517176894802,7375486494566588,22550218454358,7279535072716596,7938651164161368,3718615834801499,3885610610472285,4020817710429534,117971746862432,4727760935138657,4393761197077860,4756249277445477,1040601701954919,1856179576640348,6458948961973610,2348198023935339,2134344369976684,6371334823753070,4603881932797295,3272598399305960,614885220005236,8918603437827194,6312167344452982,335989544858999,6378459981624696,6739869547476345,1167630243618367,168796124820863,1973523920827776,4946593756394881,3656869575996803,6163074096215428,2430904038159255,1349637547701644,1207964576494992,5374184005973394,5995545055599,8839860048803221,985019738207638,4051446904976281,2197729134938351,5880388546835869,1936721185781151,1732630032889249,6265851735798683,8432888318145957,7149851732129197,4802445049410991,4406012425543240,4803199214040502,3113797017089463,9093586040987210,4099399708227009,4902547810334146,3494360492488131,3784793307952582,8438756896871195,7689952639989196,2077686870521297,4982551449941458,7684260681397716,7015199710361046,3303397740754391,6996656485172068,6490354285851557,3576801971713505,6433858246291766,6902266644379109,1789308446488041,3958820137678316,3033827717461487,3348671985104368,3495565908210600,5213822784910836,2406523316054772,6922866868663798,6567986709775866,6488570872641016,8847603399204436,2556254458656250,4251261242193406,7877090583623167,3012293397984769,2412353540535810,663028178007561,6643352825378315,7954455681927426,7538858693539342,1299231759676947,8410739472761423,5026643195639320,2691602407655684,1650783851755034,2640527823418907,6857169939707420,8947139263018525,3292440983352863,8322711640815137,2706333530895908,6173156897502759,6894207047349801,8536876024772138,6846020958413708,2490579247183406,2828973629060657,8263602555631155,3419933884200500,4106150072170042,789993492166203,1126818357687871,2738836650473024,8223336765447776,4092310458807877,8029148153460296,4858147542599948,3971293007492682,2092811819824718,6630968821200463,4196916033467984,5056355000399441,6632173051229778,1394952950560340,4401017272612437,6695451948562007,5024574389859928,4989017636222553,1898222055831134,5231862585177695,1727416156370528,6113091273197840,4545553586075240,9027214466659947,5547384800753260,8874224821319278,922364894164591,9202931370796043,3967121702647183,4356428651804277,3836643826087542,7144456012838519,8093836677822072,1323738609563261,8806498438329982,6176661523881579,3203807950550660,1059780799739525,7748551714911878,3349111293851274,8730861924595346,8921476528494241,5767245862123156,2896893690721941,3248006794013358,1440177176295063,7155345432753092,9203351763827002,402685190228250,3214839313938078,6034759542912671,6935542506747110,3628841193387682,2218181440845476,3099838161204902,6441176887539367,5551451230451370,4106959780820651,837902517286572,2260829484299949,4765753014047642,6387757383202481,2152229478418718,4286211861918665,4105893550241464,2956689852675770,3211314748962491,2647124925169636,2715571915732670,8767925011887807,7961719862113985,5571263624558274,1527856315233227,3524540830922436,1026813320476361,4572969111828177,3830730705188563,922253364541140,3624013857634006,8634259360134875,6730298481063644,1219307348276960,3312082983351248,587624922003172,814895169648358,1612392792274665,5107835523086058,8902411842586919,27637672883953,8729752779617346,9203389536057075,660071312275191,8208714778130171,3782164816705276,4837547733202687,6391886499067649,3215243344262916,6091198430525190,3830425753061676,3726634244028171,5178453254158092,7036502755663490,6066588177839887,3451388494493456,8254048055948248,146060828423954,2489525901221507,4694667810827125,3068081518950169,5298096380622620,6024752516806429,7198237776787230,3167562397521565,3796735246841635,8212528683890468,7956691878698634,7458067259246897,3729494218684200,3497793314600745,4488060758177578,4697510306002732,4025765159876397,8889887468435251,6378258757629748,952557297578974,685541398853430,2653157589694263,3848211156912436,7472568191022047,924716769238666,3806322363304245,924973189150530,5525462081976134,5324367505159137,2836409332709192,5821635217733454,6418066605530765,2505983216498512,554836553054033,8700412975003474,6516130538698579,148959485245271,6898759121123161,2764334085800851,19065627653981,8513661588584286,3185746583926624,8163738830951169,3258594841718851,1753573817005923,4917234241419108,4462453928212325,6396694932535142,870727960698513,5378043031271272,91760089347946,3347473645614955,6101341864376172,1358278918518641,1038621296146290,5221892510326419,8320615323973492,4831705830978537,4560042920812180,219364316697573,3437707995264892,1983175438677885,7207158408361854,3829553605162882,7288894059329412,6628543469172613,63507550287751,4989727566346120,4188444897785737,9083163207736983,1148456403384204,1503436641286029,3588352703182736,3864536736774033,2739397538297747,2633061758187413,5255993689431705,2592471257167769,2032673699379099,7318776170035101,7919748331059102,7531819516442530,702039308351395,3222505436231589,4802556661184427,7835950967426451,8694822214562802,6435066130980509,7934957349083193,4192238412281778,2094287612032949,5858880982103990,2104251938486199,5876137099573177,6041133702068155,1068134742276028,7931366772291519,151809628682176,5325328258217925,9143833309231046,3801423690053575,5386887657174987,4728061364680652,6724812653213646,6989338259549118,8608603568355281,2825699816290258,3209404748665849,7609815375656917,5600617972709334,8665353737320408,7098422314088411,1103536350836701,3542318212570789,2872375184308193,8124621665796112,3109130202888163,7732473291487207,4671299268229101,2040310236427261,6592520282210201,3752841481304049,4525994646112595,8498199076932877,826867950270454,419267194173434,7943023315977692,7810937365552810,2085028840912895,2979346694846464,7425348757638260,6659581292263426,4587697811011587,6877733821036548,5776664630671365,6499364165040137,8415022777401373,1504335771711501,5552207541745682,5292653414332436,5119078826293269,811804932061206,4143947042994199,4237001325623320,2684516007949316,8643850181566127,5246557837080605,2729583787948064,8571462843244208,8298347152132443,2048486797391908,3311456172193831,9218519895324712,3543552679859760,2901292199295021,938335155009582,7593088757872687,1280986811676720,6804964081726472,2985847918671922,7380738434637492,2473725918525502,4070258430380384,6451733548415043,6114194172459076,2684430238267461,3448864738555975,4497923067689032,8293184969329450,4643590563962551,49153989720140,6167284544190543,6870239928531025,8423038626509679,7032475340126293,2299225519929431,8790744565594201,6091414724589659,4711144123906140,9147488322199226,466658084665440,4482350257748065,8103522028634439,4226325511911526,4914198859107311,2776262548863081,1554501944555627,6288068874287212,328661100607598,6568540082724541,5544698034402323,6716360204728437,2966777630181737,2324366334310521,5331686108263056,1469199573738337,2914486902569089,3209521746163844,5906998273947781,1880872986336961,3703233803991176,6124708232476810,4502842090535052,1129174788978829,6746672655153296,5511478165387409,9145097162686696,4701163369740436,4008718273067157,523868794206360,8799868573431961,6505431797287279,5295864809240733,6158134962829470,151771766405282,6138409278191782,3108337702796840,301308045177885,6492915137657008,8551387758704298,4816897658861746,3441630807505076,139290127775925,8558025744975262,6715104093139568,1227287708711099,2026873945012412,8063599981639869,7002262322854080,919910153369793,8411822824724173,140208887085252,6856451102523259,4157423881795785,5202099444096717,1312175022651601,3267550886050002,413777002346707,6457867213617364,3708511744604378,2815759271573723,2850968212388064,4740643508762849,5794242096511204,5795507315947750,1580568774457577,1913954189975250,7313504196839805,4899465951230192,3020909601338408,5789243215584979,1174726100465911,8962148248729848,6266008462440697,4742089105033599,8394933300777957,6046611997669629,351564881017086,5960060038553301,4334984637477931,3373931590531334,5592049197824263,2447158965352713,263824536975630,3800517532596496,3258726917758680,4145903488907538,7800814602336534,5709909431367265,3472613560072473,7560944095508762,1640752039573787,1286562199681308,4546458941864221,2559571281459487,7723495335835936,4213902755969313,3718389366765858,6629443251026213,3533430339792432,1430173037148459,5778907952494893,6681302513695022,881952833222959,4028008479471920,8465425118857608,2851582434031922,5994549593815348,9074736955937507,8627683303045432,7748257514240313,2054159235201338,6693110552541725,9142173695392061,6771166286100646,9035895173222722,8942446665668544,2770594700179782,7936158809695540,2750218939873608,6597336171624778,7476621124712779,2439063969282380,7164652255557965,6001519738501455,673401218546000,1610745126074706,9002005784705363,5274492716890453,5423783914223959,1113018796685656,3340513209956697,2991332118968666,1665423393929563,3868404160084318,8676945331632479,2983149514930529,1646087416166754,4273830697384292,5410718236621157,4849348761946513,611689573431657,3788018166610283,8544747002378604,2752124330490222,1701912543345008,7081091261708662,8251847873879785,6147391017892217,7934938128693628,2160663736367485,7620072848144766,8768570744965676,7233278686990890,3038356797241733,570183913519494,2348718622390663,8666807914805640,8560060167666058,1056486058539403,4558577883526978,7861245185538448,3207680122632594,754420273199509,8966322415876503,4933466047297944,871073098445892,2859892020918682,4360832754203038,6966906157020229,3758508124191142,5363077464859516,5327105179105707,71728575855023,815890395673672,6537535141820850,3558572244056499,3951097494485430,5645289447995832,1065487790161406,7371323500706235,3674061028964796,752749513569354,5472732834511295,4643296100563392,2746198946462145,1837605456163915,1227747393288646,3554416373807565,5430694055113805,5550826130520529,3554558273632724,4260409222445526,273350722035449,811244534577626,3776623775757392,296198210402786,7835529697966563,4369864197224932,5633410177710566,1955976345074152,3622965389179372,6045845757802993,483415820941810,4907188078459379,3365444230527476,3825696494631413,1902710418848246,852909019531689,2403618920086008,1437477205654009,5918264495258107,8645551075681236,1641447639497215,5099269094390275,909739120310788,7358533648692310,321457337776646,419377907284487,4110744626805258,6224390114523661,5138339756325390,1972485481671447,5657765520587283,4505115979102740,6692353072766724,7622306581756443,2325668880497181,1291318342433310,604086751181344,8003478156851748,8060617364159013,8057095422523943,2769563436431913,3659373591673386,7768650337958443,5566674925697582,9018139895231581,9110270604288909,234452376468021,3750137544948278,3425854451785481,3508700141369913,8721481461512763,1900853111568958,8752996125555263,5294849611217472,989247716964929,7079046892818856,771482996161093,2361438710577738,4495628516244043,1591865339984460,5504798561745485,8520386608577103,3458716741384784,5536290206550456,1362734299101780,4448073095044878,6086419273529942,5792727032154553,3804582924466777,5642113608235611,9138252289751645,7068063438289502,6915784768436831,18819078654395,5463806030527077,980693469346406,4445850800503400,7426595080026731,5925857660058223,5230081884832148,5059388231400057,4036677910411901,190233666075262,5707004065790591,5866721781037697,8886016959953539,6539842124331652,8045792252572509,3393510740474505,6748279796504557,2291259657501324,4946356331887245,3684234916706958,4374487215912045,8856998052313745,8993126786528366,2228878873733671,4745940138998426,277278736300699,8311446433020573,7437609920566357,2169824635599519,8133731317004962,5568437730359972,2809404278753734,2780181223389862,5000689969150631,1627883063589544,4685310308989609,3964210548816554,5068880817175212,4844600604309239,8869856807252984,4690338192833206,1123699272923831,7082220311493307,7915067708521149,4336208279026366,2908869110250177,1902639031040707,4349601628928709,459540344650438,9141506902407880,8912387754965705,4113588179057358,324537541114576,3536406950656721,7756250092747475,5816783836616013,4263252424178389,8375088264918137,8719178497701493,6527469011057370,4285056995346895,7794538319133405,9131584800962535,1920328496914213,7073475083254496,8918006038809926,3262019026893628,7698244680006376,2888108952468201,1407907867900652,1604421023021807,1781847230357288,1127994755201780,2122967098800886,1224250711030521,6069534129601276,3165232097573630,9152676592821332,945315166370564,7696282318650120,3050278056213257,1494602241063690,3724695091624715,4896547808945782,8832674787965710,4631768161836845,8654314255474841,1281877939272467,6491750843628308,5663010225077014,2377376655162135,5561772884245272,1548584348400409,7618972163685147,5264347292187422,1730730998363269,1634117677005600,5346969241405915,5061952039828261,8719811785636647,535060566391592,8322654147066665,2254825643948842,7663037612047147,1553230461352748,5824413784652589,3295660805438254,2065030623804207,191293591042864,4330952540699442,3279219872217908,8188220533708548,8330738757942073,3915807305677628,8424964610964285,6425470939773762,7693137311677252,2031066205961029,364134264159047,5113603122263180,6169734515571533,1376675067999373,5959357435699001,7935463172127576,8849953233832420,5170019395681116,6035497904487261,4341190585858910,8611147182816095,8388083202177888,2506023413070689,3854238604475235,2601839987821030,8242352584571756,735202044033901,156773808159599,6679269577378280,1378060988038002,3389045900262259,2348012700351348,8038162714533694,8483152764744852,4713733851134845,824686014643073,7067200642547469,4734951481228175,8890957257244634,3894225504418709,436353353694104,6763209042803610,4713698462763503,7601045663839386,7611425885993886,837226454465440,3709507168484258,5045132068811931,5219845263768484,2452106034264997,1398245674597286,5959159582899112,3285500983884718,1440025685769135,4702865038097328,25640340667313,5245902049524660,1518660050828216,5664497420175860,8043213770275773,5256678235093950,312022440295361,7382979000613828,8898094826654198,2650153148562375,5826253121600458,6174764139625419,429153252883404,3626081510144974,8111222371114829,5000668310125521,8307722359837007,2434024336473043,4212327726169049,605717838281691,4528584797862877,6851653130941606,6336854665018344,6725010637765206,564139406343155,3565767353318389,163832299764726,2802086838778871,4460564637891576,5815457251412479,178021683182588,6597079492606973,1033373370301438,3480742837111296,4548112281320450,5101482596121603,5755128219614213,411084821394708,4007112945351689,1703253335456778,4838098503220235,450736844422156,3974274042575886,8770292683979791,340436536736784,4855941588106257,1310643709197331,5448920756065923,8869466822720533,3167496024013848,5689305978092569,5873219753817263,7391587289549975,630246367616859,7618112885955005,1478507687590951,5410632013560872,1154015209798698,2278378173873198,5500053866921014,1487926332374071,7263760445258809,7303462280186378,7376326428421059,7530849646624535,7383787123313163,8564745017015365,6122304599538758,6843819846581320,3899427508472332,6432714931190859,6617319302020173,8352470362831950,7800014117576547,3604534799121492,2067673872681486,154444188662871,5296573421861976,6805205387960164,7967765940747355,2651119674276956,5572652272454343,8487916773063776,8655197745308040,6759953339202189,5176531846347876,2547803213635430,5446101296089055,4843986128649319,1632021031500909,7625316639142603,2616916231273586,7875786234084469,6872972885113974,8951534622498665,3601092147723384,1776674843901049,6133685264202874,1657917352023516,213505533721726,2391318788652159,2198995028458625,7996801951087748,4203559773803553,384659028851846,2612780112297095,6901872107472438,320285450728642,2658632791407764,3412724725660822,4053917203643544,1092141247184026,5146601911827614,5987246603287711,88789840149664,8831102426725537,468698426424483,3874898495487140,1166470127869809,1276630060645545,2241755565046958,948526712798384,3024198866156721,1694128246734003,9159917625883829,5088453707185338,3355097096699070,7185996349127871,7135883138088129,1083361977416898,6720912660478550,1756062119673028,3276582534692038,6635133805398561,1802253523991752,4463808474463435,5837737200241514,973415292714192,6558562385943432,2870604797689043,2154626477622728,535169786821847,4982516072725720,753599137430745,8488965834885142,1157285685279963,3638540324125916,7054376699743835,6192673101462751,3891714521873632,1288452374811458,2581799239662818,2071262599036135,3976719718071531,4670174402886893,3216120751897838,7057230326084977,5346802164710642,8965478729179006,9167315866860791,1924404258946298,5930873446219005,4531306584980735,7406462072755522,3045840734272775,5221766850153004,5509412116708618,1990987687902475,6128242134039820,5110032222600461,8294466689744143,3621465862814992,1927546012417297,8958118566640915,3230460445801748,4415759574187286,103490269068567,6046577433918744,4792854635658521,624276154072346,5601621153955099,994510797356318,6234094549515551,1128753456209798,3453255866596647,3968284657925416,4143527902166313,6423674490789767,1898574751022380,7404076816514353,2252995545414962,2098491020950836,4268377618398517,3568840140143927,4915918039072057,1851767961075004,6546915607326877,3203583503416638,2523947454577983,5009399537939680,537965771677579,1998825275116086,1422646092668812,1786859181292874,1196599806175164,8449991383104845,1230903827447118,1623579607645521,7191736675548498,6930913995898198,4123673687192804,2423956380368218,8975918966291803,8531823070068062,8981148617522527,3156091793128802,3133631407701347,5458873823673700,3233196415434085,1837201157384863,4572141884983868,2305430099719399,7464024359851850,5321845792045718,6291808722238837,8927739800501622,262880052067703,1352223276088696,4211940782226809,3875535758409086,5273132120063359,4757443084139904,6868229289065857,9066808708119939,4941161833868289,792586979392901,3757794484174215,1598426061847944,6633348619320714,8321606332693900,4373586394070413,8465942646873969,5195715200433554,5476794829136737,6680724995816854,1060677087608225,1394438330662307,3487843271949735,4943208370716072,5258539653476251,6053123668393390,3387379544702383,8391764982038451,8539994822688178,7649551488073139,4156386657090996,61307873402579,2442060059128594,5510835640338956,4795664966073793,1763743659998658,5186167039571190,5648315108834759,7743375950691785,7706642853493026,1385313593998797,3758843229191631,1450517808528848,76922899971537,1714380805458905,4097783130865108,355542017686997,9097938069402873,5239099683159520,913808137502177,9116595775613637,7107349549432293,7218998582361577,6866273690820519,3858001066180077,6379428445339118,8771613318200816,6611851032898988,1957452358303220,7342830473985525,1229851576679928,7074256719232505,5621065737190907,186247835237884,5552847848291838,3404528494788097,3988404258946563,5346347170086404,2936083219234312,1493786759716780,2038982028246538,6008747903748695,6778966887284236,6558578007064077,5670442148642318,9138060825017872,7830446401273361,1494027913805332,3631304992570903,1261362636045849,3845710114012699,499257514704414,5417958648364575,3504950321987107,7342702139948583,1625049688718890,4808419758929159,3649116327984684,2380752507363250,209682588515890,7560184285838900,7379504061663838,8600425270656566,3484797561615625,6779345395859003,6811181972557975,3732380596485693,3257436227166133,4464011836341824,8048765399383618,1781079625416259,8322010921710860,685594809548363,7586876588506700,6168543160142434,9024915560054353,9117966644952660,8934154267777975,9209113916685910,5927203920950543,1367722466098780,5884042776067679,2391299627836278,4326955983309414,976215855516672,5588802964831847,4828315348483689,1399634889162349,4951142673759854,6963859020382827,8412027039386216,4681224389869171,2843061957193412,6732720548686141,4753448652652151,5436843489967736,2473538990060820,7066265578758079,1698975842877052,8759272715487850,7693655477730942,873363572978965,7489369118948992,605160890121857,6453744031055493,144362844896902,5724295463648907,7631239115694018,4576035117285006,5594473363737197,3815008329711248,5634215115669137,5362864110190226,845140236328899,5910672124788372,6235032618516117,1347818685283993,7204975277194917,4211198181260971,1675476301430444,3858706477760174,5357523730232605,1792203505614512,549843678314161,746438192938675,8084164765775134,6985017995083446,6180348335013560,5983135174704827,8488996754612426,5825528279818187,2750432898105028,3897858503887478,2741490629621025,8507385773047496,5922313741156042,2541160979466871,5717578427383502,5636246393962191,5186863412592337,5541859286447395,752220132589268,5922292312580046,5179860744290006,792892495380183,4190323860651737,589545339633370,4415066471178191,614267788934877,4367943748828895,504801873977296,7594657292795618,4088193020739300,7719889825423313,6033080094670574,6147232760479478,3535726981267191,2407000265867001,4061600066261030,8270502093995772,5101708249259989,3148763577564928,2759653917572869,5600223779733255,4720020184776457,4009497839779595,5695656112045838,4027788341163309,5157039600484112,7687743821332243,6914233037799189,1167789850115863,6861391396582703,8773928307760313,8796215741500037,4003956688600866,131274884726564,4044563646070565,5984699699085094,4186024402829095,8195013412962088,4846432633700137,4051499908153131,1179786111893294,9175272031436591,2041058200043312,5694897964007219,7040556074658337,1112137328934711,3602691150266168,3678194157436729,6736483487924028,982183141293885,6053479817363263,8410970216804810,6386675121612152,8203587003039556,1914556607414088,9123157836319372,8785811397525322,1917635168425443,81369336332112,8829798130802659,1138603650400084,3023810367078229,8757703008599895,7390242918252376,9129079450845017,803804626698074,3963387382418063,3588485813747548,7338196704000926,8115439267987295,8259939713236833,7493650293571428,5830892889325413,3784195993775664,1987913686452882,3708888245616494,5445078332620656,6126727616839537,7946661964496757,6623019633885047,3082412778602363,8030368192053116,8319131746878794,4560920485183360,3614477488471937,7966596420225546,1140122964148100,1564476356804486,3513679305416684,5308020988723082,6851616972294807,3332038074358926,3575046907740053,797117887692694,374146604056472,739222038953881,1337321088630684,7197302812995525,1474021093621664,6760234311860129,8048213152251812,4141459876499568,5766257436966826,1770502289735596,1323589975580658,191445232992177,6151249679630259,6213075720322998,695540677984183,6873731906782426,7980566397894585,5592470661676987,1855545719209918,4734332715240096,692252050997186,178220794691524,1089705274195910,3677901243427554,8814599816341372,6730384927132322,1466575150235599,6767180891111378,4968715399741395,4278849394917332,7920828539781078,8137352976449495,6305371600142296,3478485611659225,5952885298939372,8918657950501321,4107947174797307,1707541558771684,5364565508931557,558355902250982,3205313629929447,8759373889322988,8509827589783535,7099600574529520,5460645431853041,845712296198130,3876720485154805,3561909228126199,1212904697315320,1121873982570489,974928603701247,5953405633839104,8016433609850881,3248914668011522,8342133629829123,7597306638876676,6809955443523590,5308198817316872,4949478430064649,7755303168451931,6455791466496013,6761217648508944,2356154631700497,2074423004839954,6271107606626323,8656082103503534,7170935650226752,8530602934147681,6930050885074977,1737464162730018,4976391294629211,7702283604836390,1199071807029288,3666794874159148,8541325762955954,8578098066276400,8654291547177009,2237048654217267,1204947551666229,9190756020797494,3147117901340681,6733823522488376,1920306431770682,4520161249181755,6158357693153341,3529654300229694,1480043563171904,8617970540552203,6307136464306247,6377347511468105,4991268302078027,3487675935309900,8254147599332706,547446055092303,8183355755708497,9044512139690067,6773627633516631,5833157380980824,7343214451078500,9085460150861914,4170802256658525,907828215627870,2145990689210463,1139697157029985,1385577679030971,1652125747658853,974877243913575,7205338182303853,1382620920987758,360884266647666,300055614177395,194152016855157,9154029039108217,5935163275329658,151841587325,9123043835592836,701118096457861,5310086511149191,5238183643529352,4751393255276632,657499957805194,8738758370377869,4144200818714755,126548911505553,172154713325714,1786864259317907,7085559549834607,3196553596780700,7950280031202519,7021297548837023,2922109409771684,6245455846064295,7876259827507228,1316489522069675,2075257758728367,5029371195050696,6790246570280401,4124789888382323,1734622149386270,3308511375605942,80093944168631,8963308531684489,5898077445079225,2481507789947070,9036069143055022,340959630254112,7707396192406219,5203252010533060,9219548934229285,5013006921711815,2340250891520716,2893067484577997,2032928663847121,8635370332017137,5012604308340948,2499630482112725,7696890511084633,8414122688034169,7432815497351169,2386110920507610,2567814792050042,1356043837620446,1049179690156256,1819314027217121,5131272429617378,8233748921368803,8569299555762404,4322610583060710,5933139063980263,6623624959672558,530473038266607,7183803008849665,5525117216309493,8855488488988713,3539743199871224,8327070344956628,2244704198836477,6336167683178752,9170498990915842,2278801332969515,4068110295482631,6523596553765129,6830125725532427,5346049057538316,4955488679174189,6891344647700752,2037480389984529,281654213198098,5495698638192915,5267894929539350,257499166493401,8623864439095576,2077842140217625,748929075214927,1522182038307100,2841448490451230,2220174719959328,8582478218666032,22164264861987,9063545133642509,8610828517523750,1213287395363548,2212371130237227,1776418380171997,3052408600412469,4262455529718070,4904224233865528,1291907617988660,2049591535454943,6496922671661373,1383594075537728,4950888798582155,3421607818903876,278826706125127,5209193469002056,436538421002570,2100018198036813,8618507788042577,8718974300733778,7328994722870670,520625584652631,7387231242512163,2147200638140762,2107186867126619,3020383654461789,2550737203675489,6419420861256966,2946125257228647,1590145714241898,3584083765707116,410968915001709,670337592738163,8117534413472116,7342683083933672,4842684854976886,7094817435757705,6656810676568443,1289988175937916,914157572473214,2390764068402581,3704118816522625,3193597215752578,6068978566578563,4610920507523460,8197011149026710,1865054202970504,2015128734692759,2256910126498188,9084644272587151,5444920297800080,199950596129169,1531511108977043,4123420744204692,7668693828963054,8025189621580183,2403874540087725,5007894505210267,3933308921201055,4703710877237665,6933965585070147,1432930719285668,592302483751334,8052916237617905,7639029330428332,5255756545411826,5743360561922480,6564177487217077,7731631259992502,4385705816277433,6256896699187642,473401201607101,2468859212710334,8698625461095157,2477872213836225,8800981427634626,6619714974695876,7632595090751941,2503719799898566,504095987220935,7260576286261704,9105506771266103,7446995552190922,6085370176932599,3550756907631055,4457564550939088,6392290041968035,1711917685031382,560828023357911,4164042953540056,6140670580248434,5286412021187039,8554756745970144,1132323880976865,6871329896382946,5593150652793316,3762575834759654,5583737175359975,4274830405419498,2483770931617874,1013764199596527,702770032099828,3240792491213302,3881420508512759,7126061048709624,459836582150652,8115642342449237,4468704482312704,6035287719985666,7509001563436459,2406032656343126,2350504733884934,8555387223264001,1463629901545992,2441608974530015,4008386585575950,8670120095528365,7854677873869329,3757903491711506,8224869529037709,2627875904733716,6555393024622864,8472760819139097,6571748463949231,3464261033476636,5263021034586653,6769228994658847,8450619257635360,8731259924208349,1686551443122763,1970550761931299,7254746307117604,8156650654447025,1742966537077288,2035176446509612,6750435698262573,2920051851969070,2161087917834800,8156766087037489,3906344122171954,4203763079299635,2339187575407157,5967032393351734,7424524149735991,2484868334993977,4986425177981499,4897021812228669,8392099241542206,8756303727936064,3287361100038722,4147145029435972,5043927462462024,6736660738458185,5765043000361546,3801229657424459,2888604780249678,152113834574415,468470740861526,4216809397679545,4324556991843987,8831951084750867,5729470458118746,6726740184428807,408464859218529,6629367270261346,2657500974236259,1299634599936612,8435132048957542,2792585853616746,6058844714655847,4875385017483884,5769018723945234,1137073541857904,565256394687089,3019107135537782,6823915185987689,1828398712177272,1199198543823481,6625209875415674,8049681719214715,5766473408004735,4019923664749184,3504094170532630,7538331845345926,4787170717125399,7071739028387266,4086354523570831,1603307297125827,2421944535106199,75587862872728,4331168235124164,3307982342013594,3544318010409627,7463288978555548,8699042893513377,8731426882470564,745064314749605,6540082966938278,1689112606818986,7805112850203314,7317547025810100,6835049002582709,217019271791288,3867987123618489,4232129106231994,2756102902858428,790394993590975,8755249684464320,2876995975281117,125084497232582,2459088517528055,4457650190828232,8216361568584394,5442265947349111,1641117956418865,7247184634102478,2817334800674524,827462770410195,2303476909916884,2068524606964437,3625776353592023,5510943377965785,1581186116141786,6199716962288347,6634024607695582,8814976639943391,4449210794459874,63282075419365,1029750643213032,8202642136595584,7918924375376619,4081330244207340,9075910844347858,3369748705198830,7938827442637608,1558812192981747,6296719189983992,4139832874517241,7718019685245055,1669250572043005,5860706937258750,2126938606781185,4957979527037698,2508361361998595,1675460553818884,3984756278608646,5459612969255690,5021467248837387,2041140258325260,2040727332373263,699631793423122,4788039749288724,3586056559772439,3292698215727896,3079712122946332,2770356172145438,9107523510506021,2091853785318177,2351562700833571,6376670176133925,1542820806869801,3555216993764139,8350249058419500,1852664009278259,7921449485681460,8029641015523255,4025499323024183,5662512438823732,3895012724261690,5605872031155003,6486561369146172,2020321379134,8027650901084981,3099544257807170,1461523540001603,1946642905940804,7051263847809861,5867066640712519,8212364603059540,922067349652298,984023656678220,5627599683666765,7140091923942476,1365873822384978,7167810722182627,2573524779615060,2205277081650005,5145005811057498,8856293100601417,2242715379188576,7994198327396764,6136720924132201,1601812377551724,7379860721288048,3585490844599154,4378302851040116,8022226678254398,6850980729107945,3140189077848954,710835983926139,8542373279581053,6439132023276416,904143769977733,1630660261430150,332718948303753,7243663892235146,1586041252791181,4482286021015021,7540909604979605,6851240057684886,4418752457130903,729182794367898,3809681915003805,4762133694432159,3729367878714272,237909615949296,8020582932071333,5501812263502759,8937438255268776,5415947908980892,8192308483507114,4692150758574919,2339223572759469,2379224001201072,1753922640115187,1454186976134068,9169147323699076,783657731902281,8105396066960314,1024943910470593,7248588623135685,5231008947265697,8792480659129291,422083442820044,4963994528227490,4383426829140942,3254907080323603,3094355259048913,7350424103240658,1410221725369299,456308375339988,5385289791587288,3062142858291239,7598659873482433,7918676641301467,8294550612394972,7143226685015006,3463347217187807,238884277634018,2753177242086319,2679530812982247,3530127733933032,2257260947850218,8975544122964583,6194548071187437,1081642379527152,8200323522797228,6048685002671090,8347321018991603,7650592875070452,3871219366446071,6076248795300856,2461471612584953,7631981497238522,2376676544660475,2231939657647100,3522550692234237,7752802198111230,5636519740621823,2802462453220353,6116929039713284,2993383078249477,6068385878177281,6230899954992139,7239682227815437,3551170161787918,9151791597274127,1676881976478552,7470932580680723,7168603479032852,8641031188431895,7530784783320088,6864569354798105,3461131617310,387437607207968,7188419559940272,3427305888367650,8576729061664926,4820342298723367,5631622867174440,8809986831174492,2562709048902698,8038730564788402,7952943003550772,8720134111020086,2505236612997300,8983152188376122,5948252824847421,1795782145360959,1978681470557349,8062435815506587,9023438205338693,7199317304493126,6338851984345953,5245853979427912,2019982096483401,9221555012362423,3979700215956557,6317442276246606,8297789884974159,4040988054296163,2813280863964004,7790742898656346,3265338614301787,2856351524537437,1974660970038368,6025497991169121,3384384581583970,534240403211364,1923355819295845,2874804422296679,4639176939357288,6154158341376871,7257073832215660,1687194018890861,2638777571591278,7077620837008496,1125259026547825,2091170288256114,3196237973767284,5838132628472949,2346071029695608,4075738247840890,3806181812594596,3451542367782013,5142375388158219,5385277435355328,7037392438609027,6712544369198212,5013204737803398,3893789833448300,3458952786822282,3205907019580556,7717743574081730,8632321355107181,5575744522667154,835815418774676,3106538277094550,3603240970175640,2854406152144025,7718818359690397,8855922743395488,1826406681560225,4314939720352930,5275661145982115,3915498534191706,2787377975713990,5673761659438247,6582797384402090,6621671835321516,1464383730125682,3778331235108014,7148331749701149,607641452659888,8359455855494324,3957455160112670,569427330974902,6157070647084215,1656771346658847,617582305395901,1781038490076353,5422765471712456,5016523676042441,6317860112843980,7662499711108301,5132859918861519,5928532331742417,8212382444405975,5525684586083876,3800460990661850,626727124570865,4448823494427872,8093069643498721,77937493492963,3635012883924198,88020397001596,6592370774164721,2304958538826994,4910493993125108,8112890401057703,1118576353953014,209567520965879,8161742737097976,1707163970183380,329046433449210,3740416768574295,8879757374637309,9208361954133246,5036778015704319,2118252542870785,9044054548313643,6823065492079877,7761524027180294,9167540582141324,7325971177978994,6413050841908490,8274754103524754,6310230092891414,2174014646830360,4552573972858137,847602588606682,3826720407733535,6072586713253152,2766098779686179,5937419503551780,4904668758230309,3378064793879847,2984975186085160,5229595065992491,8270302471583282,2311422038492463,1098511170028848,6578250392729578,2251275200415026,2824263183975731,9162843520386356,6948445958201566,6591707263452473,7320015871362362,4688897684522299,1914494924670268,7851392469747005,3124008450475327,3138313366193472,6014503099352385,465844170278210,6764881487971653,1068326962578758,1155298564530401,1855640241358152,7824065788134729,3990466282826,8291264779381333,7065684915342221,3090856016004433,7229342825006418,1820874505995605,97524688602454,7886324424624816,1497495372416350,4526009504056671,9190843358823776,273369458133904,8430722721618539,1858912165853350,7677532124824934,1850846131864937,8980661359920495,5490022633489776,8779803836958065,6381507181319243,3017590747678068,2734129250551157,2361372200355190,3902599056344439,4831744607831416,7954471665765268,7633221001967167,6106326036596092,1788661328201085,7804568840324478,7685836914738559,529915144816000,2889619707774339,2857619318818182,1757162532521351,2202105438225800,6771892345324937,1629750985301168,5879573666284942,8497265693040877,2569189781259664,507359820662161,3640966973900178,6782946822210963,2058793752249749,8116144653387159,3659507951060379,7059227895248453,2392245686952176,2481335355950498,5342168193910184,5560214189721001,7404658905892266,1315802548716971,6693883625751980,1507387511293357,8731826558707511,1999806026859954,4117850122208691,1710752973833653,7611181018006972,835556951147970,1598346192855286,1422349351896518,6029219307242951,6538016290293192,2410185478424009,8730593034651083,1187806500832716,3156418014135759,3337664201934288,6548354301019601,3894194220713426,858384635217367,428973339461080,6962906100763556,8474797557689041,3748514283537883,2387945486009820,7914763265417466,2504385013663199,8461888134461008,528482221245924,4039709286745574,5562135920096849,8070434376664552,1373979159938540,3533471766332909,2374037487782824,1928088027645426,7395200892212542,2936712404583925,7155056043967991,7698764047791700,5927884724487674,7461441373998825,3561510917621245,2410545108366933,1703872335070721,8118179155381163,5702522737903108,8261916512765447,8981262192363016,8747577933874697,8612155174221399,5379263843321356,210417487467890,8288405657306639,6904069492291160,7434695131219474,4873870760723987,8390485875656583,3583334915720725,6434371958621720,4412123157186075,67264250758688,169845297083995,1211112023311910,1251309531547179,3344940065572400,3024177800824371,8293177870927412,8760112934241845,3912029485286966,7745520164544777,1408086967830074,4400085319435838,6907237688232885,7924936347797058,58298736297540,4127240745528219,3865338412353097,947232186123852,6451109310940749,6765725730195023,4863976930639005,1350004003489361,362933637341454,7523018928899672,8849171028161883,8762816968712463,1436144548693598,8479239825061477,6715508766438747,1265242614866192,5153070139426402,3901974637823588,9058382873753190,2939647536055910,6637004081668369,7620431314667115,8078797534545516,1380364243296530,1380018165991022,1817841013048944,8207446844498195,125744916973173,6631004520400503,1013932252930324,1841810470717051,8630851167850997,5107602023433854,565394866259583,6392715167188608,7316914452421471,793102618576516,4154434591016581,2937439876400774,9200786312185481,569376017335946,658957946242699,5986150794380940,6461423308966850,6832515694282382,923336015801117,1096636819457680,2013885698220312,2913344688080530,5011006452975252,972883694896789,8003009245333142,385675238721175,7195618748435396,7676912291657327,3406298586728094,1773352363902623,8566593743704440,623829005223588,5649378477262502,7394956621914396,6945507961260999,4034218626270893,5881990545655470,2039173849368239,627618865694384,8930166942780360,5550325859894965,2517037381240502,4065403873117880,3526751667336820,9215961118361276,1093853734188661,6016704717866689,9024521032844994,1703091772737219,105113393186500,8037309929615831,8376824436836039,1701795490875080,5224578287617737,2751814217057994,8238524340545922,6769533985998541,2091758320142031,113708853774034,817573330896595,15841869219542,2724692366313177,2786022575097562,2426234937848365,2992209179363039,2896131485845218,1473152720467579,8372966879545060,5292181374977765,1816126701586151,5256699698824936,7144319307347580,4093584683353835,7594223170980340,255375937009277,3765915457341168,2447919257601777,2945884804335346,6822336400508661,6807437817038585,7613095518947072,6155841336854278,3755073212172039,4470737682614026,3421338172278542,2523660387075855,3355305437284112,2731617020299025,8991936037385859,3784513670235926,4121139278104343,3069718141040260,8956598256771375,2828367352416029,713309752772382,988063753357093,2774414064633641,443518397892394,8383069427523890,4435202853604317,5126377660663602,3312455857185076,7115403585079098,3358942760093500,6034233040717632,8950348827182699,7700218652182339,309827605055300,5797065053047777,733609332000584,5052635530250057,8371193899992908,1164897742505809,1156225013287907,3041316338269812,7930997065303895,6542728100300633,3485381948589916,8188204904269661,4022593410385760,6129108095420257,6898237177979195,2964691063245798,1300989564372838,6319061483800426,7682584028628844,7167252037846893,8000309897971567,2965811472058224,4368407979378545,8410475046618994,1028935135905655,994266411393343,2212418936273746,6487889676289917,4365846124087166,6937431346628480,3102312018134913,51850196339691,6673121369704595,1365838898743174,3190860672845703,808595617826696,3036614406621068,7439779700033421,3088050696308623,5503353704531858,3009176494088515,3239432411826068,2672927341168533,7720093618021893,3062298632406938,782180302440347,2160110029391772,3895811654225932,6525134685128609,2701052056553378,3755274148628388,2942291528828837,8390078505235780,7758269986960548,5745863135938478,1449770199402416,9211846499157938,8454880870614963,4989992092092340,4262079775852470,8138137905357181,8640053163509688,2767402620274617,4688629500102589,2293219153889214,4817394743232448,8657934486204077,5975490333329348,4702478192789447,8677385830189000,3702797289441226,2753052289288139,6779346489788364,8832928662894242,4910602230089679,7213437543270357,5889342508255193,3566391812245466,8896014681524187,8038749586474973,8839326111474000,7471213077285883,7444534803187686,7914083281658193,5645567215323112,1476964757915625,7654781882267303,2560248562567148,2926566850578417,4219891063277555,331495457311742,1559678863099897,8469118538565626,6709578989095935,3090042681575420,2708506206029821,4695745156532223,4268295300499457,4606341329700867,4243413820753924,3073862185994247,8324108494419628,3377085749282833,3491639962257427,393524593374894,138930497177622,170626873958745,6766646159689756,7304982954231837,2653591050405918,5887512660921349,1358422096332833,5929939356829730,1233539484272676,7649645925338118,6639907568601130,1837847414851630,444444624358408,473415345719351,8958970374965308,6615279549827134,1829941811791935,535410524283232,3622963390924866,7980592472686219,8694425768098129,8027426122909768,7085581094996041,288339807291466,1269817471256657,1796973741394004,1141681904240726,4451497007597656,2671261072410715,7608354541291612,3654228853061306,3325729342277727,2086433575684192,7068853226746426,7153561183183206,2389472829917286,4439399333709928,7290960658614378,127466434021484,4911933777430641,3157693684172914,7182535625870355,729520951674997,866817637566582,1647139379824759,1061913722538104,5740666075433081,5993861100172991,8968232456636542,6510542034225279,4830694642731139,2565890863057028,8812699033487494,148520690731147,3558860978505868,8935872024889485,6350428956346511,8557257493072016,5681858042017475,8523097263720596,1756865229277336,3782758708889757,6583477647362207,2897561408227488,5093954905956720,7562880227461282,6946356084081259,5838814122592421,994219080206502,1563890274355367,8589989784390684,8852994003619040,8115524103620782,5865552658057391,6486344244951983,7139049870706867,5248095373772980,5068096148883637,3497610920544440,8726167961028794,605644392614075,3009373670983869,6700356136782016,473942333540546,5093893609605315,650860030609605,6893906111188001,1652777822898376,5566776677877961,7804483500165323,1550097642014924,8168234034284750,127902548936914,6669873932519636,6792714429286613,1780682181920982,3018175381620951,7225806240008409,9157046757521103,3206584017176797,9202617001822431,2047706053986531,1486083093154021,8812046758725862,4629568541739239,2697883877984488,3692370550540527,782491263551728,6033408241486070,1634752243386616,3901903375452412,8607163523800237,7044311686924544,6602348994493995,7281552327461122,6935381248133379,5633136083978501,6012882087758087,1000310351153418,1937895736690955,8539194540640524,1512910100842765,7372566241265934,1693455186544922,1719177935440158,4161266626742559,2649260451547425,608845749700899,7724137172410758,5618136063527206,7896780101699881,2364396870289706,8558146187086124,3535617532479789,8877276570372399,7264114056643985,2557691555170609,7567556188064050,1591863929129268,3850281415123337,3691503834560223,6041134999685441,7750431279335746,2410636929491339,6632674908533808,384065781057864,2347298808521100,1276224114772298,8408937582774604,1663192227563856,2394336369002833,6885262689552723,6441584660528348,9065353296322958,2933438338550105,8000836572016451,2526607058103972,2055155441781084,4343337660434782,2812798076668256,1546750683367777,6362230486087398,1584601937463657,9199681580360756,312183525722476,2570018469264039,2950665873836398,764686894385519,8064143208663408,8060611925720418,9008921469854099,4035211678009716,2439614887184757,8442227700787969,3928723608455549,7039997004761470,1805920470550911,7559753631189377,5191230085613954,2638142603282819,433036470110597,5551217603594630,3956071257557383,5588411788282249,6900087387929256,3239811854190990,7051462560663952,4328266446162323,23006948510101,7306319426308506,1961504787974555,7203274330818972,8147498050701725,6301748328876446,8211630096501151,7225685617854881,8879390547222939,3714608976284070,6509625052842408,3850159047756202,8983174074124716,1355606074018222,5389505540442546,5712371405146550,907463274940857,4114042766870970,6048061887859131,1211314522638781,8922584748804542,1078808435804608,1293721621219780,8685552440281695,4308658035345862,2273515565157452,6091995051411915,6443280678209998,1377224789608911,1225208995426477,2553474553170387,901072577361051,3417288528590585,2781741933906393,1620210002315738,757657994709467,1665671091145180,9078887035029983,6344343394929121,3054788604676578,4837558717598181,5177393075243495,2503907768781288,7293172781239378,970543996553712,7946844901984753,6327380073123784,2836259114961400,2826195972704762,8757099867707300,1282853422145962,2111844925131263,2722471114590720,4196817516677637,7000765882578689,764295412632072,6559372184308234,849239478880780,7725842146419900,1014781256223246,3793520749781421,8117104404729116,2745586977425939,5719241681390102,1928707150253145,1092200217430554,3042462767008283,4123094262647898,726208432130590,3411127653812773,1329619930630694,1824567159441959,4410227269126697,1736429453888043,5014292168886833,6989279500259598,2345241460460084,3614276281092661,1953642506996278,4742129885596215,2154535983893048,902556119222841,7258796624677983,703934547184188,3795629444581949,8883214605601343,2394576410583478,2539296638978630,1959802673351239,7641929901197896,6779456263014986,3088485188815435,982214524226125,1950237434759761,3801826409433683,1074668986583637,6562349128305239,5444789745601112,6879742160947804,356055745284702,8826887122515728,3761657489377893,1711499723131495,5608398800112233,8160632054421518,371237554801260,6896644651698798,8587479804201586,2365202314873462,6315749849992297,356081375627896,727056724413049,5565620263406204,8928700808612477,7924807163202174,3116279058123392,6498253591270883,2520743928548459,3426244847433494,4260363283221128,5865397273807497,7206513030706967,6651638764227212,1251341926386317,305570765523598,1755067081181839,3519829590231696,4057688774167185,2156366511983250,3246734683523732,2706063399750766,4561163427531414,6248436198668057,8447171675179672,4511804273248921,8689944650074778,3409099402496669,8207579324588485,4693977826478753,9195145316944548,2474699756587686,753017386748585,900231474176455,7097866400386162,4046178353859248,8830163882262977,8229730598311376,9101576427200969,3989307727563448,5291990684716148,9204145178959593,1197310713940673,3257568748063427,476577843908,8973416487144566,4897777741384390,709535473093319,6126622839556808,7098404654465201,5775261380135629,8928160064031438,2151277449398994,7184382417844003,4829628854815444,8111085996559063,6264775373605592,1110575342865113,1284062224599772,1471284251970269,7411383102065374,3852267675110111,1672272182823648,8893485446482658,8241361257106555,6809447598312164,8262213326911270,3700648235934161,6416323387935464,7569367812348877,6841727705107180,5287016358388178,8352441496947440,7779461055821608,945457324411634,1634069604770259,5959167865866997,8111715340236585,2621523966872314,3809837984959227,8447683487451900,8293476475156266,2040840289405695,3772529724082945,8358384085322498,750870811298563,2130098167302920,1219674267765516,4731521448233741,281428588940049,2560838025202450,1473878912682771,3322655220812566,4125622707997463,2148928363318041,7800383170497307,2979716405244429,6120142763477793,5560942202768164,619424656968486,5985330231954216,6793748813619676,5859251673516842,8946367327054113,6523676091927342,241893297638195,602794296625972,4310216408812342,6294255208844087,4966656122249017,2107020910938944,2389432339139723,3279287607905093,164668595161927,5086736119548745,1612374255553356,6913615891254096,1740430710557523,4537172979174228,9029314079700793,2657383393315672,6520774116133722,8582066642832220,4414054964939614,2419397222681439,2001172624722784,3891606865791844,6539458825735688,3248913327147879,8298391240100713,5370477193186154,8338142594485099,3215186583210860,2657815739485037,6321129868510019,3982024197524336,5145089683344244,3277226393946997,5361244450114424,4635818573876092,6298465115141952,7110532508874561,5673875644730250,6486027624172695,2454927597647682,8210119381896078,2885511641779087,1998887332694928,6353293324372882,6833155801336724,708629596097438,3388124645968804,8091950791347110,3781326715210663,5976757190216616,4724281321049002,9182340226773607,5497083010763695,2710416404171696,2994081812592456,1154698826730418,4420209825991604,2152211301649333,7525831437705597,855202834926522,1333856457739195,8265513155382205,7352944229878263,4632693388921793,8755323130727363,4569469057190853,2371577994234823,4282808132062152,1807967432592329,2350402830388170,8121211952439799,7246983739067341,5058851193244622,1472459490885656,4022734897335250,1592902157814740,1895956002687957,718431276944342,2582433578535895,1598039719332825,9130115549055966,2095569890167776,1990471052839905,6803349985414114,4604208746237094,7305694836879661,3732415359536103,8474804144351425,1617532545321963,3587781756734446,70165481999343,1170336884542448,7818414004931752,3984740285500402,4071067767884787,8473649379175295,7885527629941752,5892259295448058,7371114009584127,7049506060356605,2602246097685502,66364140342271,5385970244570112,7574950138563586,6022935040740356,5733987445066757,8427397388094470,2395728465309581,9112332877548554,7915508180503564,3604422441421839,979827659394065,6869696184568850,3937026587085845,5267214934133783,7625183711775771,8928537573837852,2655712272763933,819351366328837,1797122447887392,3911083477191856,6626428020291875,7125328853027880,8299059040267455,1462725092658226,4498566949409403,5705828234710069,7930098445143095,6941074512104506,3142260803357756,5989271859055677,5826313467415614,8404360013859903,2889216523515744,9107074565426243,5796174823017542,4298472989117513,6127309205457995,3357627777797196,6199429616716878,6347906187447375,1035820082646097,295155168758866,8431417675369558,584594326735959,439822734538596,5975517948693598,1170315139042399,5229029983931490,1292737695108199,1585632350522472,2436797922135228,433882191613035,8297834964470892,1943474007854190,5702701733694578,4659805269118068,8306713142348918,2092318799055991,5726992642002040,1574978730180047,789498266471552,2046914616675457,5173493191593090,4933952759843972,8179630191610165,7777335187066049,1985803251109001,1386854578736266,44720339078338,3095742520522605,8097916590404326,2129197668715667,2249738748644501,1913548096457878,6323990140603543,7380272112520344,2276843880008857,625760864947355,972558956186780,1856382891150494,1503751095340193,4709393718004900,3115836566916262,2131740628339880,4056531435184668,1150721455246512,1653063688320884,8096912265716255,3143447362063548,935073892224189,4435536727854270,2344269685274513,7080057473092801,1281377737624770,5549644298833092,6433426094968006,8835319045115079,8119804342062280,4627902519200970,9057055255088334,7788131740638429,9073888324373715,28009034894548,3134281465744600,2339330171948249,6133386164391130,3285136337652960,8665668794305767,2685340886846702,220081002171631,2775567379877105,5532329850195188,981323499916538,1285459105565948,6356893258617893,397210166840574,3305040127085823,7455397842341122,6347813672292629,6721846800567557,6373911131147530,4988026959547659,7150257423240460,8963386774954541,3552214609448213,1026281140899095,448268106878232,5071424891145498,8553877962312992,7757096980040993,2348894740892962,5126993565306147,3644590382533925,4072563273944359,1242408765377832,582949347970345,1129106532579207,8785297421094190,7523939762195760,8479252161116040,7038474547167334,6542194654192179,4283382665661748,8425803265559917,1945826589658424,3517258574777657,416784483110202,7657348870098238,4054653914331643,5972933540924737,3094624931237186,8094125959073091,1229918735355204,3314809560288581,8814976327601478,4733329889480009,325115354697034,8300054984639549,6655221146389678,2642140062797136,8478128534184504,7592410425281876,1615494094714766,182225351003479,8350932884648467,6101616620588382,5127300794273119,6611165320727904,3294332578090339,4503555264919441,999711069293928,8026421789745724,6705220494773613,2851164074003823,6395963221921139,6655255631318391,9071455893704058,4996974606699899,7613853786311914,7046499483832925,2174400484494719,2194899473911168,1009322924756354,5152560469691780,4296203371859333,8067372768578950,3467161041522055,1921456650177929,2886889091943818,7332998137733225,6534228728892813,3459417969675667,1147175191203054,5773030309776623,4166692248243613,3244131540979102,8295644291338420,1475735865249188,6004384927698391,4174138823069095,69942409874857,7610218688204202,5465173735285319,1724739602337196,1903459892153774,4679508252511663,42785441729968,7465160828636593,1141788010696115,669025239518645,2976539937164728,6141140365135293,3003064188816832,8646808713186756,3121450280504775,7443071395305583,854288260943308,5906490097716685,3675574424882642,55728753921495,3361965840944601,1724369115762138,2790021234090575,439629628329437,533853890858462,2023194837568644,6770991323237861,8625281615416806,466105342971371,2545751922476320,1239909743578612,2948184961764853,343343334116854,6743337610692128,8538209458867704,1415920544566779,2499849027330645,8181324792199083,7904504107453956,5849318373674502,2510458131762695,983438940098056,8584557408936535,8648819273813517,1064761338482192,2424969495011928,3329555665341971,1485397185941012,2268821172178454,8740472687316504,1402449795501593,7186411978903066,2307541226933787,5535858894163484,6562828388290078,2067696640380448,1521388318772769,766774823276066,6311145449480795,2678401822182948,746704992882213,6626595828091700,6893128312540712,9100306100363868,3271587527478828,7049821677041497,9076548545957424,7838712473554184,4069774662028852,8961758976544009,3781771156606520,5468061875129913,2176171613507130,7730602169737823,1887615002136124,7231080642989316,2094920631963199,6264627390041664,928114807551926,3045874785955242,5195020059921993,926048391974474,4220424944602699,3005634113465096,8244206719470861,3907687602572880,2640874124529236,5552857602805334,8564074440374201,5635569320152664,2888778610593371,8031064011135143,5449639267683934,1759384056024671,5561759046225504,7159353537449569,8361902679281250,7795531495815099,5458772546637413,4288877476335206,7612892784643688,397928140164713,5945554871100007,4799602929094252,7868927006749055,7895211308163689,6039792132918548,8969158312507327,3553254793072252,6922012580367997,7488338840997502,7698452867042943,7701525172625216,567938824353728,5620008175947394,4124308661587587,5652125618753156,6209931030482568,9006440994492042,2542536033750667,6602757733011084,5072776799440527,1732865224756881,8691179990077074,3805063414664851,7797215402446484,1562802838315630,2393610234391852,7221814174971860,6070607848984222,2530253806030497,8392208037017542,4304636190281384,7459984443870492,1916250268061354,5269618896621227,783675969719980,37106759421613,5097616613199535,7302298631807603,6099622739594935,3871475664375480,5992633259052730,6263339581623998,5990119601360578,6400705126452933,7194819891432737,2675385315086024,7326390805253833,929219075198666,6290872651763405,3065232417738446,3048699214581456,9044038618165941,2773395828920018,4233620917095715,7689060662202068,1016558436175573,6404701447769815,8856909896339160,3440005805723354,4367603730534110,8212411722452703,7449907800559329,3889125069327654,1621752584359656,642286031294186,4336762754027243,1751117007048429,8053854249307886,839843980594927,2436800903302896,1721630205168936,95896166059762,7105923082473204,1194426523678676,2468270968753914,3615653715758843,2681523588189948,2865991776390909,4620070207147776,3715536041627395,7201837250451782,8637731278868229,8767447969079938,3561745706667792,6827028763004164,6010091936501525,1698579459471321,4258315149627160,5946941536718621,7231533095636766,1927196591836962,2556476845924998,8632773415292710,4514560907333421,5720640370528049,7804018949771062,6227126006206263,9028854397030200,3298983454199610,6295538576111583,5077460589891391,6727373740789569,5749193807941442,5537001241038660,5658050960526646,9060245401565153,1461332134186828,2114319549833869,8049595343040783,7420058236669780,1078149474460302,740976475328342,4041467834158393,2185839695155035,426764760502109,8000348721368926,1521179344981855,8189724463320929,606973281193827,4369546064711524,2508002255140838,1331812255616870,8990261109935975,2054781616443241,6902617054090741,8592193363361122,4934627045134193,4039654615437170,7629469113798515,8110450588110709,589390483935097,1267708261126011,1737844699320188,5713739672014717,8460256624707100,2429676591304576,8105972934698909,3828208902328196,5199199533191047,4064677263691659,9099450247827340,1524444161259501,1152301723340688,2161490335158162,1110589382512533,1936437639466902,1244942602424215,6749434242813849,9115403974823835,3505719225896861,2900742397153183,678298554912673,4492294580621218,792308326780835,248100193587108,5465489482469285,127432727941032,815693962399658,7250727889883052,9090686522773422,4852926829154223,1981340037861296,7488812252352434,226079618086899,4447559716392595,4769192066502581,9204482185580470,6973879620325303,3003711707762618,8353144617914301,3002057034452928,6800625858306720,3460796313227202,5911490998996299,4357925310353348,2984530680238021,8711539623687135,7932433014149064,717458686037963,8459297991413069,3927882070708178,133654902099924,1679965111580809,3068488853671897,1855705340202971,888833958531037,5594676916441054,5929142908538849,4924507024183268,1652644968353765,7339917695799270,632334898679784,2025832623525866,2049056941559787,4007374357549036,6791584941658094,8773683090606026,7124186098782193,5416398011158518,3249942513274871,1707954014703610,6729927113920509,1715253139153631,1875306115158018,572582662098948,4841254331076613,3966062868287494,3546528697733127,4634374380343304,3040775195021322,7531413680131415,5472740247326733,5949697101844495,3550180910714896,6076194128351252,491621216079893,3410083888762201,672928725389339,9089781978102156,3862427932479522,3444421313712163,8532861257404453,3457027818082342,4597765160652839,2446566938398761,7664790557184042,3775350916599854,2397068534534191,1664048429551664,438337167511604,418686416375862,951532498145337,8192885031751740,1769089892557493,5898141241430080,7637049363583049,8082455046508621,368938491433041,1026705705259090,2250640771353955,1823964439171156,1807353579556950,171163820380249,1209231449804893,8660645962698846,2520532350914655,8021584671232096,7648825355096164,245905666756711,3285293703155816,3072224149295209,7238984155582570,7113411668692327,3191387612270700,4173457982345327,1112625477898352,1688569113146102,7715652974170226,6925217715540083,965185051545716,9134909834088566,375509561823353,8194421367885947,4055681497188965,5884344874487936,8017527977610603,1202640439332996,6758641497925432,1257829577707654,4045559519105159,2113278791526725,6436147254513803,5234003534237836,3518455230746767,6012213881557136,7180237548697624,1139730560110738,5349351293833364,925960815923350,2469582728943802,4904382285697178,8990589943352687,3440499826184348,4883344604647582,44129710166177,7907400474720283,3660343313584292,3335256503013541,5649755933790374,2703211563896999,3990099150753961,4342355077910698,8028701077507442,5909214324969646,130411559538863,5805853565472945,1399508097781942,3080088418472120,4277576256901306,4132471908061371,5820415244914876,8055553651724478,288265784447167,7968077411176642,5755414324044882,3002343289016519,2988948859900104,8571211973087433,4109112047980746,1790133325287627,781506577670861,3987248839348432,6104156793557202,1784170080915667,5961636137291988,5484730954535128,1981420311859417,8047205538004149,3577682805477597,9060876266328289,6216794665602427,3042165662011620,4072030329917669,1127110480613606,3228316936949994,3277010848010476,1970966412284142,4852919863169263,3674677412942064,7557894098313939,2268590242124021,8028448591640713,6374214987010297,7132532425543930,3657321986444671,8495894856360661,5569478675910912,8448949442138369,5568968862519554,1997987685159172,2188598556119301,6466091003515146,2060605246132489,4560780048355594,269641133543694,1706989105205519,1340743816335633,2732699707232530,3376675524595988,779361883797550,4528759559311638,327632961856217,5831791143932184,2240992464752004,6177876293669147,6834332399587612,7790922038628639,7669210907415279,6406825038041378,9085327850590501,2484496123875623,5952751027114280,8709601937838377,4732928804311338,1360686819791147,3864365815222573,7521567500161326,6828634580361949,5046300046971185,7846614290883535,3683521151422771,5586974699540788,3330739632460085,3420997793894710,3769445167976760,5771481531327199,8865937925931905,434109681029442,8950607287570758,5844369412804935,3921177112760648,2569948860616076,6812468359395383,7885666504626510,2636806561780047,9062725548134736,1387541076791634,1883046804705619,3598449105391956,5475757925060951,4667012503884120,6100730820743516,1290738390880608,4063746104349026,7290932534104420,2236353728336231,4736236121680504,1835053283070314,3000153629249899,4140462508134764,3676756157631890,2116279613673839,2537318999961156,2518189767250289,1522719654990194,572924790231411,4146350722175348,6775891911397752,3929216833966457,1788561902752122,5340391142379899,58593748996476,4297542506500477,147205544825215,205589158744449,2735825919234434,2565327434535302,5231417888330121,2311641817118786,1015495859523987,7162330472469585,8301201297887638,3454884096332184,8615156747745348,6484504091054492,7581850592792994,4581695109386659,3224445288141223,7833037818712488,733147746619818,8112732749625415,2127333110260466,4134596469346738,2917255755583923,4813667202093493,7490187453145844,7529748320244154,7612062620242365,8583490107971490,1480476048708032,896248259039683,160296517915076,3822798014108101,6646301938340294,8785800126255560,1181481338065357,1133604354544078,2789654580754509,8542250976825811,6528240114258388,8813510753276373,1891249546752804,6128656909553060,3415809100042717,8449262271320542,2842056138641888,4750346941813218,6875802251284965,858431496180198,6386123880911336,749576558989802,1109356817895916,896840348727378,368940994056686,646124934713840,1863677501264369,470609201648114,6564107144984659,1162084574450164,5065682115449333,8508744926956969,2282106843189752,3676366568706554,6681113593369086,7589970934125056,2557353085653505,5775161868012971,9164424101351940,4261780596380174,3398845772452367,7649329672507921,655026359521810,6216834648691220,644981509116438,3105833411727897,8939800050151273,2978450057989551,9136723680186909,6580169017347504,8535174025531938,4948263864678491,1710239203807780,8900943568556583,8255950737422428,6901440075518508,5514628489986849,5911977109213743,4653073071690289,106054752850484,2410598828036662,3177365530464825,2594682996576828,8973723139199552,6552982695868512,6854012514062914,39491039601419,7983951541374390,8383907122264161,1195095741420106,8735576028992075,7680664608302448,58443338863186,8519170420570211,8323289254928649,8974620407845463,9021313144509016,8004150714930785,6367466587183461,858140905919069,5531936004814950,8226950371003017,5560542988194410,238293480994919,2816870641554030,2015678424714685,8242975799923312,882619194135154,5655567770243700,5342535596790401,4026901437600387,6384681107588048,9074075725451909,6791240256803464,7947415679554186,6361390625018508,5323466796305858,7423017407828623,2884845747655313,8528146985046674,2736587050373780,1328673511307374,3238762279588504,8051007996547741,6560990223782564,996072111428262,2527059220648615,6749992512973579,8464413069582302,1700881133753005,6553834361777920,1193668098798942,878683067798200,5111774846389706,4539849935934144,1666631049695939,4835363873411781,5958190580519622,1051913743061703,3759670433467852,8917056279312503,631557431481037,3814230884602576,333351547926648,624907682992850,6623045145055955,4907486914073304,2685502259516121,1070923808821981,1042457378218789,1262901475758819,3091206033527524,2495774673916651,2170006561608428,3299236793996013,143697052947182,5038495963206384,8242497448137459,1349325825692404,8599433368556277,2867914181137142,7935692277437177,2702293252854522,3837684964283134,6641102671323300,2232839209472770,3603723114795780,3881895990153989,2030884838101766,5712042472854281,2517704927071703,4309161786430221,4531414462354191,7403063307447630,4204715749135121,987171540849435,1116974130549532,728010754144389,6276653419974107,1847428631253797,162513649259302,3866879057613612,9077548533699376,5312218966709041,6796890690507571,1651203711030068,8547582548610526,1630210452607799,2804352964121401,8464787870569274,8493809821045564,7434626611303229,3532642077201215,1923573155025730,5285976482108228,2374424168584005,2976958729114439,5598124110140232,3210849804702538,6227730037788130,4577635927708497,1630325466452818,7903981040266103,6662428176372564,1560870008181589,5989240045720408,6888780259513177,914725301516431,5165622489928542,2594934613758816,3077422786270051,6941647665550180,7802524129514341,3807616751096679,3907070138209129,1454645969245034,2082330197709677,6325279870899054,43448477543663,4530635499230064,597453283185522,1866996098487156,1519549652620149,6969065578713977,4038418400105338,1520284093010813,6264564781416614,2352072773981056,2556951792898946,6380332775232387,5278315243787140,2207186616013701,5174930009379720,8800627672306569,343923615355789,3123032784458639,2842011190186898,7827447134167875,8358325325999941,3224117350486935,5874416849474456,2292012935828378,3714269662598044,9028818213889862,3465738392949663,92730090607523,5540151932474276,4005625623630760,1079821969052586,2503119704871851,2974757135111087,7692846902367154,5093004119626675,443454389638068,7498465022792633,3138286170428346,5101422674727870,6191645375548917,4000590822429632,1608896153408449,1037708863722434,7046844392088395,8722401128797125,4870895047336780,8475161513741815,1270818678821836,42756167062482,7139913481081811,7883727665587022,5716728354264023,8612779923546959,6294915443627005,6770479175530661,3556587704603616,8356951117648866,3429960950830051,3760540605895652,2428662990043302,5454201475191782,2364251727975399,8578148581135336,1012906339062761,6024834441073645,4664582229677038,6062588802814961,2595370833269747,3240552538115582,3535096705242104,4090210752291668,8128374855357434,392921626334206,5578683172312063,1431831927739398,1825339301123079,7226007729394699,8826793570358284,3472091406980111,294450860938256,4638950465557521,1165074557883415,8788404500943896,8736500853429273,5629688389424154,5384053227050011,6309196936041502,9138333655873712,8143221572424740,8190527348626470,3470548654183463,1121199810925609,6326935258584108,2260800739890221,6604036476458031,6457812376278064,3624526643875336,971808245797938,634879912858676,7693648575162035,5552057284744246,159586343172276,5297327310623804,3924076085072957,9200549927572542,8855093703955519,4295164765918277,436652574168134,898303831368545,3456034362215406,5399462228874316,6448351047721826,1519329151449272,1890553913824340,3838280514720853,7153516584096854,4901502352905305,2919886132925530,7121504474059869,5109535235626079,1057177557357665,5484088601426107,1775950468535397,2674494045272252,2817943103525999,5358290532357233,2333508875179122,4724487448319094,7443878164845689,6496922610864775,8224969036452988,6507397348283518,3199765090129023,1225519492519040,7426259249681538,6568848936359045,1581118221046920,3088180686476426,8905787285918859,219293081162895,1340875505718416,7535386964126311,93258335179924,1087803186074775,7881257377584280,5785827888452761,3395119724156059,2192979881153693,7598590430925988,314699860825259,7186356196566029,4865139705238702,218477415126191,4613592663774385,7554359279657843,1433219383874741,787097996940476,7095829914244286,4722421340230847,6910154635280637,7678665672250563,4057146644485316,5243399002444997,8797401811899590,1041882685199560,5017993122862282,7466543938950349,1249984371119310,9140677038593232,8335131283444949,386101646480598,4924723069341220,3613600714314970,2601920819057884,6420066615042938,6271485112898782,1588710354357797,6317027513497808,495623899272419,6863099573276198,6061666054821094,3400710371988711,3571781970318569,7365977397183273,8237578815976298,5801641595426031,5143204417361138,6959989454387411,7815820125099252,8716110621332728,9015014674740304,8740080804473542,1165927713690877,8794974463972610,6721518062228739,1779064202941701,5584355948123398,7246139571164425,2380746273271497,4440324614116619,6802271330587916,7857722193696014,6665078060770179,2513910717371668,8761313047716740,2989362801825052,1284817573219888,8355429759472930,8071394387196123,906065305261349,1202946930070822,8013262115820839,6229036173677864,1295982834570538,3583642322097451,6642918565996458,9078558977931600,159505230517553,4151715880293682,2433021173042739,9073002004043060,1986398645867829,8897999176666835,971725721330569,5962286040307008,8674178930718944,3858196073993538,516964706342211,5670948320400709,3774668510738657,5027932838090056,1668695000867724,3854952296797514,7414917499835723,7973509922379084,7305706384217421,3753442078250319,1267677420442961,1852891947619667,1964045594678614,5684651919330873,2900385510078692,5209780037866842,8307960820720527,7482372235284026,104336091796838,6977264325154151,3431910688511341,94395491767662,5460654595134834,2626320909018003,8785448869483892,8404305646166932,7091032725542266,319404071341631,7785647407814012,2867120232387967,7571144535058670,4488082899635776,8145491311220100,4535636018189701,1483511879652742,1109391860422023,3744339697713216,6583556828747145,7990890571814282,6420389066429836,661463215920525,2144226819364238,2039052512318864,4063832399041938,83809884099987,8632064937055637,75451457459608,3970007692924313,2012730710447514,2667405337879450,1246807425242526,2470929910093217,5339254630536611,6932529401157028,3988449236571557,2726334469821863,7619412186748328,4208572837189033,1275640018684990,6435894801552813,8476743432525233,6455850326374643,8329672579536308,412903272895929,23832538961339,7931789646517693,3591852093831413,6882546718658123,2210379236005316,4901279106061768,6470875520947657,4544640493366855,803815048107467,4417309116028364,3136950081770958,3178433087198672,3482937639636287,8410716186699184,5494507898484985,1319778113574360,3542829794842078,6327204985427423,2968678254171616,7005055258398288,4545078599586281,2296184821568996,7803692283385320,8737994147395875,9120007567049658,8469059549943275,7235859679958517,4007072097476157,3875893375882750,3936207711229439,4516752807745025,3541791294051842,1248809384236553,388922100438541,7307979150468013,7494302291809808,5656033656819288,7381645349691776,4730756835497491,3539545562207768,560943532430873,3962832971097007,3351213411849756,571794981410336,397766145922593,1078602901378594,2306390256178723,6407922629826084,7696350694979846,1873268152882729,3777623576892970,7657527268063495,8641095226926002,4457177822975535,3357372224525872,1531992310020360,4182070119388724,913527434268254,1323622477157942,8290427714524729,1410134766605882,8602657350973706,7758859086222910,7616022605190721,2731986882156098,1662852630729827,1730245649487429,2086703501989447,1169659541771849,2006659605059146,3108915378266157,7813434732264701,1444692407296952,1757179671369298,5074751212607060,3412628189632085,4572071851775574,2453830842242650,7850824388770063,1306941461459865,8962105238299578,8118637181883998,6965965373001317,8271913170467088,1321643454682724,8180109213486694,2686789978707559,5111083358934633,8521417210812012,3338042762974829,1652717799134831,8844301316413040,6819526773069425,1320460910253684,6607651504313977,8130523841320571,1940347060213373,5572071330469505,8370070102824579,6763048306824840,4402271825057417,4777419817113226,3697058266535563,5356702386476689,3502128117405332,7897850408570478,4554461907474070,2357991395120792,1728115478681242,3162828222584477,6480273462974110,7912658773956255,8679465053148833,4408680412960418,5615152809498276,6492736870635173,3100801827886759,1778273819186858,44594965108396,2720262032512685,6418941921343773,7563413559521665,7717617103961862,6637743311836852,4694539188360889,5518688370795466,2798789178480320,1702804066293443,1233738197494568,1857519593412295,273999297992393,9162927576078027,6110327382660813,3551565906368206,6113322450671312,3014076903872211,1000602282117568,6156685046077142,8448791860940409,3243506624386776,1455431923431716,5975535175328719,5904886196098781,878622663923422,7157505725511973,2006370802882272,4524888932177638,994771963765434,2904144601798381,9171287867133565,3255192575923952,8884214725505326,3249626314790644,5120701371143925,2614603464759030,9059263274951046,4139019597797113,6896983379054207,2370776278521597,3682455239382787,6760380214531845,7976612496748297,1049640950191882,1109564735117067,101741825833261,775947207694097,516718384109331,5740368272381718,6797213928623748,3824901698884976,9117639331403550,5609759020865312,2173020658849569,6266220695508772,4512848223196967,7818249552936731,6279496824837930,5410728302860076,5115971015694125,6525098047919918,2120101184558895,6550672616902280,3436188286015285,6471177158940470,5095096814014089,4197235204708153,1791626320009021,1368760374253374,212859076540725,8025784114566978,8923325642985099,6716138815182660,1112353152489287,5576309330171722,9132219935269858,4132776986695503,5648648197887826,6584471646164829,7935493735924274,2980635862947682,2397898232887612,4822842772313962,4856826107156335,7431036507576176,3815027104175987,5426028225604080,2667542557317799,3778391427471226,4405178120329084,7193765673588607,2291989356566402,9142037481805699,1492707294467973,336819761928070,9159200840759617,7808804286650249,8257463559425687,8924637714732941,564776403624941,8439591106907800,2336097755649939,3798075010376686,8246673625282884,221572069549039,5625991431280540,3035695314774590,2820597678782889,5042130295216034,5880950227883941,721566116370345,7198781272652103,4113927012046765,4721913041311663,1006907861489584,7195189941295025,8229409022695346,5752352538381982,2151892143200182,8091252628019134,1387324482181055,1853949624473536,7005926086662081,4583621209020354,4415628637525957,2644294635345862,6013660404864969,603193118681297,2494462596536267,1287714916063180,4872667758155728,4404045756880849,6562814859171797,3378115696534521,3535201811879896,8404907576168100,4465948690044890,3516480393820495,2691312829527582,6777019714557921,1588898433193959,5224192381343720,4773558561134569,7884521325385706,8226763096709099,3857849611147244,443243840853997,9218302679493722,4749054968911862,4240282142332919,6925094343235577,2742898518677503,1403828410570754,8481720066133675,5605908503844871,9210465993840648,1029747607293612,8447213177886733,7265797714663441,9145270304307217,658481888155668,2109510010624021,5793177172760598,8460916146172560,3922952356714520,8816493304436766,7249695483418655,6504519590336544,4461155230603297,8401802396751906,4924149211387939,1929895293900836,2855902134065192,4458423041808425,7119304506660906,5233927432886315,3169921341741100,4961523561420852,5076226974996536,6828131416397881,3272996614723645,6588875005160387,5807311951845440,7695219371595842,7732448647731267,7495400611813815,1243050023180358,7236454465485153,7412855469430857,2328525564500042,4406084246624331,8019408046643276,8792912110213197,7778272265164878,7111819092482127,6837110288701520,4959619764506296,4271765534988376,3539477105236057,430796255975514,1043169895993018,5953398260586593,6486476928538724,2812598963492965,7000045800484701,1124185194584168,6302429719615594,6676538910300269,3872470827718769,4830381840521330,1390040165275763,5689584942209141,7271514131260436,5840616756369530,4771756252518523,8214618419153502,1337384815122563,213726194784390,6857623872526473,4721550093998223,6488035004340370,1235661977802900,3431910434592917,5349667362003096,9124470072301721,8850530014533753,8001775962937501,760767500343460,2360534800292007,2902881152751785,504979492067499,6173138014197933,1565381996075182,5570098966911152,3886967708801203,7263161501538485,1126663920113850,7725915402754235,8948624243873980,8225535998594426,5073844607441086,605573809304449,8426937741564102,4370879624894668,7358677127848994,8712719037430136,1217981314586837,7976474016143576,3071438948194521,371567056410842,3449136614368293,8473014409378671,4884009188251878,4450409331349735,8327028715430228,8449077983467754,4508385185781996,4094373992255186,4991259027069166,1168698998773999,7486072242441939,9131421776107766,7481695652585642,6605880425686058,4716494264064254,470594979516117,7188014693968671,6763580906756353,6018530400753922,6434899760404740,1802618829396232,821542000154889,5056001815337229,6012129664653582,8544971018098960,4479762107619604,1912104298731797,3256144909935786,2456857740212612,1933856097196317,5500329534740774,3816781661919531,4762708716083501,1098094962858286,1152300046342447,409365355026737,878161449417364,7021398177555507,7870914709346612,7888995676311262,7922264046655798,7625179960301881,5377030201432378,693138641208244,5589159839684925,6097830169401662,7770570984612917,8712348445497664,390087089084737,379759685523783,6915712726227273,7050992183335242,6657715681158199,1126240116267343,8722411416560696,6917810544761172,1543698239183190,9167273728877625,7044929847220569,4319197458159962,2224317874665871,8990016131033174,7883122390751582,7835944786808549,3585980629506402,7457420605872483,676185180428645,3411082964261223,3843099835521386,1614438872471917,7181967538228969,5354032770931065,8542157070326139,6304076597766555,5451590011050366,6766199041874303,3542766189926784,5412612443396484,108169582500229,5476804964899207,6035948310419848,3644863817570699,3666820608047512,8532777403963794,6443672451733913,3505360486455706,3347220705302939,8639032806660512,3401228049157872,2211636172380580,8217481161663558,5695774173387176,6428786314773176,6959320505437938,8967749078210993,2073520014219701,6517688017328784,164690643089823,3785168578697660,947330516769213,57824848730559,2199485323207662,1866254129551811,8127650276792772,5389037302058742,5113933460527558,598789472115143,5733344480486476,31004234930634,4288932856092050,3187544715221456,2810312881830307,503953036649550,5498417095825880,8472359333747162,704838545168859,70600411371996,6609481131871994,6908747914400250,6225778246801890,1369655941880291,4880765957298660,6341519762586022,3557021335640552,7152878603555012,8735260035898121,1052275900996077,5874738891643375,17715352590832,7846165639879153,7605586230223955,1438198854900212,5193024201087478,1975746812402167,3634782121253369,2153345123146234,4037971178412539,2820769239194108,7096811813526013,7802091628604609,1043147754393344,637610673912235,103888905034245,7856232727435782,5630176146872839,31705004595721,3529208146811402,7951298131450380,2345493800213010,2882858141145619,8689801044711957,7560132943796759,6321167296879132,3876288927390238,1071178784856608,1771778982369493,5357155465484834,3115025941526961,6338857720361,4659950443911722,9110725915957803,7598276712020402,5667537252801071,8887493204335152,6044030113189641,8964497312930360,5784205957519929,3122541709744698,1110865492354143,6414864088950161,6868841711820998,59806269564000,6850260904827458,233068631251524,2931318455630262,6547322706647622,3835985375451721,5692784756054609,6501924436204118,4586999799745007,3066419775691352,2640433252063834,1667651243081396,1879305655278176,5185836472717072,4485802060962402,8840855175428539,4202990858525291,8014799273646701,4106984859785842,3738975241067123,7456028953401975,6661626045164127,1753294471739839,4621405848066689,4845831493671554,7048361654803075,7527365099723851,5936371083729542,6146304797727368,3616510173928073,2426574047055639,9068877538051686,3856375544994446,8343412678534253,6460996277623441,1753922841598610,98612234443411,6197654063615769,295236669201053,3272858977131168,7406240439396517,3778508861528739,2625556086119079,8921806527144,2635731876764331,4278554614487724,6899906495128690,1184487151096730,2875219347921585,6154106353244850,4722942639856307,6822757674408630,5700082432891575,2631804373129912,8236232536614004,4114426721079071,1857151908141756,2649267605494461,3320359607392959,3126487291910850,4430917607021251,2042647515912901,7108748188408519,7203901945003868,4004399969295056,1868531694066386,6081830303488723,3064641249663700,2457715359767255,717128969247448,3346745080503005,602026523581150,619221860375263,8116341514656480,6492424160041699,382362432887524,7246888327909,806171756485350,7133552800586474,4181513957071595,5455519871687404,70990058347246,3702282375682799,7675986174270193,8874047591144183,3006986716371704,1817818654268153,3963990065011450,1457099287223035,1432800296327934,6124875716483840,6085661031914242,3993637483862788,429316706687749,4781033990970118,6366386893708039,4524429532158728,1893693225963746,5239509663767308,2166924311893183,3217322845297422,4062002902981391,6927553302387472,3181763094502161,1402207081945874,9144869919040878,7096886608583444,2412322453969685,4885171944807191,1508848943064196,4571550213462811,2951757626170144,1416825645587235,798559451667237,6830721372838694,2039148611230503,4362082723781416,4598605750491945,1050981126076893,6889984594523456,4360713783434033,1561718925286194,4339688142396212,5384751542801588,8131856441236278,5877391617795209,4373611171142456,5921466240600759,5614222856379194,7660564391058235,6957647616367423,4985022322989890,4167107952696133,6377027321715526,23547187033119,353140569463625,3262287590873930,6234933138429081,3950350955273036,471437559716686,5726177665243983,1951208362304718,1095853309352785,6195013901405567,989451136490324,1390203378850646,4919858229500760,2160899676494681,5542986682162012,8876488185371486,680107374795615,5720395782413152,2723765172296547,750451375397732,3510756502756197,3215057815098733,6770486787758955,8364067610177484,5931147545697133,5309222549805935,872172580199281,8209764430666610,1616651478162291,279456002071412,4882423600110457,6240122689805178,7346788366279829,7742231845395330,409773862902662,3881790352153480,8927060304090661,4134310210853773,5145374724086671,2318855793204112,8157686974339985,7147905600805778,9011533436343965,7280934276388421,9059307398751385,2435949967399833,9055234866553877,2423679417834397,5847411569971013,4618426034019232,4048106080426914,3179875002606747,2622226849174724,8648058099030953,9152832355346191,4953709578181547,3948123789548463,939211003419568,6294510031035318,3424706807290807,6238713997089721,8517160075746234,7861364955274172,4063362859228094,858610314435519,615894177078208,209158362520513,5213427508665282,675195906873523,5533428550556614,1670181740305352,573875056758604,399094104898039,7742277693531653,2307805756218321,2694866360884178,7573519272141987,7839240898279929,5496703277131815,6041452723310415,7675862362858747,8825352758609799,478679300004831,151181410229216,1872457845136353,5373293415086587,1326266933763044,542958727453672,1868374007642620,8552633502426279,2671713440160749,7663229722582001,8733994329426173,8133290207212925,6865416426773494,4250951016602618,532606997969407,4328831517582506,53795256982526,648633072475137,980485554002946,4855887240810326,4755957040110598,1307634504031240,2793037985274889,4196534563363850,691399399726093,3585001998048273,2511090068773907,69438422244372,1327465357237271,8288821414967812,7580560630012959,7988086163692576,7988639526706209,3757036498476066,1322471576984612,6047914926103593,3199878049061937,8109319147576371,5530462770682932,2376760776678455,3857789454310457,759778231340895,1243252445273149,6131257292512320,4459855085657154,3066939168709700,6507506097396537,125519409896526,1353757649296465,5417843131309138,6585133329112147,7692412973243477,6596271928597591,970445616569432,1712187436260444,8836581135965277,5177532666600542,6709275858787423,9220758121663779,1430834235006051,7783836826131556,5323115479744207,2427595471412327,179230203305064,3773828807580777,411536101989483,4185132042673261,6069830198109373,110366677916784,9026940580288693,3582112337091699,2894390839237748,9152777030917238,5574534749687657,6884349239450744,489682524200058,3167236920532097,5000249169763459,2713796576271495,7242295793671305,2961442875530380,4578389633784973,2487500693462158,5877531914951823,5662625641389205,2683375012641305,8647933009878168,1846436405730458,3627483941670767,1918375991829701,8592693088757584,462462167473313,7829973731105956,3166363000003749,897568047845233,8750957358734504,7894763674852521,6422872505703595,4863944477433005,1424111740902574,6562665367919791,6938141872579784,5560415331769522,206543395050221,8012139282586809,2660038788734141,291321760898238,4175331752852000,1350265181822147,91111792696517,7696250685742279,1335402333265096,788967021929676,4819998681357514,1416405985123531,6269013878496460,5715946963295437,5506139048303825,9198123495414994,2747000678589646,1173921802673366,3816051793222872,4510416920829147,1926948788427997,6942950412350679,459128069381343,734341567341776,7078392739505361,6899633398471917,2688239066209518,7955463530863855,4992703953755376,7921415008804086,3638740745608440,4315634049539323,7987190634428970,5876349214448894,2153949639499008,7616825528153981,1129248873536770,7203628493757702,516165855272203,5522029247028496,6564339155065614,1025914007706901,3257814315359513,5009924252753187,2945314681445670,4720550727146791,6134012893945129,5936304524647722,8962582718467975,2902451841293612,6190291239132465,4087229788642611,214177930337590,7269445249686839,1719535646956856,7706977222483258,4929223097277756,7978190733270335,5195642720902468,7679069538016581,7361214256094825,7377407170633033,6370141070548298,8431330771295563,6717669273001292,1583873917115731,1299883730132308,4758512525008214,4688743996024036,8277644646531659,5727650829491549,4569678914411870,6714078429291749,1613558067780960,2443337794084194,6389587253681509,1138810621879247,19450142580073,991422832663914,5755765673483628,1615222437010798,6716115928243568,7343097631399283,1057144052276596,7015525908438389,7642365421577449,1288409994255738,8619401917062526,7060793726590336,8966797790795472,8356489287032195,4616893179092356,5132380252626309,8178686178909578,4669058590989707,1032770751978892,3184940727983501,8689893852252887,6439675284825325,8539004554337680,4721172686495122,8787655727430447,6883435082796953,3229352890555800,6585492747292570,4811554707660192,831113441371376,8898673036647842,723785415724955,5178475097316775,5220303317523881,1870079462759851,7588042760314284,1746807976385965,3758279313579005,3547650689650589,1834757792660040,4298467113815511,6358962222128566,1871340957294010,3360361995734943,1601562524474818,4431322844290501,2526071927004618,8527952355354100,4281660738919886,3830376358075857,3992117498764754,2417806923357653,2380553795788247,2251140882423256,9090469597175257,4675016654092879,7132586683293148,1511017508691421,6736458565530944,5966912188927909,3004335374940752,752443419418083,2203902608367076,2877642997226981,7309012648573521,3668152098335271,6159937669029356,281881176792557,339801747119598,756515179322863,3934738194882034,4811608881651188,6988693349937599,8257146855874038,4856882093940216,2282670416429891,1588071112090879,4523684312141738,1505274384145918,521069566287359,6526768042546690,3783314638420566,1231890660285959,1759703000103511,6359000738225677,7683739908644225,508287524265490,6697280462595455,4012638129282580,8151622604505552,1826246786866710,4000903515266584,5346776932605465,3092017638497819,3300772138343967,204006192995875,6864260103137134,1442003883318822,884294233677353,8527369629426951,5807732388781613,3889613954276910,2949370985831984,4301431060684337,2898477674061364,6301047921204792,2802795828174394,2800881697644092,3810944763878973,1141501360561727,7730036693196356,1975210274381383,5250047146709263,29816061091409,8522916501806674,5571139686063701,3389056937496505,2763436153101912,1179081992986203,1241094157360732,751357048479327,1945178830823008,4187722543423073,6986362351380186,7505140986777531,2837724299091558,4182565388836456,5486152689606251,956508018433644,4200442741874285,4305776760872558,5569894931291759,6023494426025587,3090828479983300,1278345372950137,838571966258810,4346731359985277,829815068679808,7344087725137537,782578937552514,1975842602475139,2223330487328388,884435829297089,4909705483345544,248890869472906,1770509252746892,5858398423470018,2297605608300176,6815072280881845,7118339248709266,5388840590990998,5052007113707460,1867776750608026,1940786087452315,4742958718803613,3579367952834209,3668923588239010,8320081753726628,2449237712133797,9140156283477671,2575705929866922,3872368070123179,1656791009207581,7809994902059752,2208145038630577,2554164313022137,6896004066434747,43097763307196,1778881160994493,8841189037760192,3755410727788225,8898226882207428,2730518457704133,8114688878468806,4147835974966986,2557574956113611,3275997283448585,2127833814949584,8159384408223397,2527589501624019,3410434224185046,4321047820843641,1768527377161944,528816778174169,4622104431484636,2242168452374237,4899112897306338,2137543487151844,7051854824759016,2712455741595369,3114619654135530,3871566377475820,5599006131543791,5925950396849904,6989403648646897,752453373874132,1284972160212730,8259823124167295,2832891302797052,6334062531141373,829214506311423,5099118736563969,6807764279222018,2410626903695107,4367635549478666,3845920610213644,7796185854828301,414470107717390,3425595218943764,1131556994309910,4773140440928217,5330796671655705,8247002313244954,3391060337385245,8846044164906782,930926019665701,7952920306454492,1674382102978347,7443635359473452,6079793816362797,5070270227930931,6532318813839156,6790893806768094,2460237306713502,1534756962492217,962397817724730,3757596678787039,7642041110635829,7522663022812993,3234902749568834,7206226567061319,7972672612360008,8695447911119500,7955878639820621,2864312462359181,8706415056740176,2480406492340050,5183360860774230,2236934077883705,3654142916943706,2157751386267483,1526591730872455,4407167108244794,3951606597836638,8636301619154917,701838376918882,7575395248070499,1863310353162084,1954907993628520,921446366764905,4621741840883562,7012601464971115,7314219103641452,8501852780591762,6409240853831535,4266928512327537,2581563970609012,7783848555274103,4660835339755384,2100843918228116,4908756174954362,2743081444138876,1650503669211005,593933671227262,8544096922008213,4527398614359936,2745548682911617,8469629337141721,6132480564886166,3896823835746182,4468494199512967,2035376781877129,7139696204767114,2349435215273867,2034793854492557,7745756296994702,1803089603157903,7505126184862388,8190980581384081,128067942047634,8782170253098284,3784647379410839,4448780673834905,8305626066096111,411348619845532,1318140597034909,3892355488818501,8882947609026465,312673300111266,2714851701383080,1740337410957228,5817296020955053,7544246588435199,9087697987413320,1983072225091506,3320114202578931,826706190950325,4689317491564476,3025778948590092,2618044842565567,6088594623520705,5874829221859151,5976861597196227,6464075226357272,2502172158779337,4865403059818487,6116479851029837,2506355460104144,6765143468236753,4126596245675988,2207436624453589,8605099612037079,6969780877660154,71152015171550,1866194601294501,2150583073345531,9162323331669988,1103867021189094,5042245081048401,613658391109608,875885720657897,5600034540288679,2907151206014957,2071306206011374,6851704782748328,1809290256506866,2961816031389011,4725049986736116,2563689406369790,6247433365872630,2584998272055977,4323016741740539,4197082696376319,3834065471922176,6147172119371778,404518643628715,3888523285651460,8281629328400389,6894571968341528,4082242349862913,5093342699610120,4597889213554697,1919558119186443,3604618427523084,8764327418945550,153720414134288,2748372573577233,7559362474041363,4956369619487980,6761500200034326,5938514377531416,8133551647641604,428049854128156,6204287289024541,3980864003104800,6365619616702498,1352687289312603,4456001956339748,9147149374874803,694734687494185,2934640185434154,7224258773336662,6863083828695048,7942374207131657,8251287049822265,5272783010582538,2283627367194687,3533771481210946,4761495017283652,65271301836812,4742002879502231,2269537393982135,8706639145591370,9028497001240896,8422891526551263,7815459086611172,329849198436438,8763563592671319,2284855300961644,1966243319360361,5644396845654107,1898124523233373,2334891799568478,2571215864127583,2901540336197734,1866161917255783,6404619165622377,7924357636314434,2765377156309101,8191978295582830,2066743437811825,4338022216654963,3139929766551668,7362838012705470,3945604482326646,647862769410168,6867774846767124,1630483153969277,5892054969933951,3789210023551110,7406034319138957,3160712002494607,5374968039897795,7921391925289109,1970239498805398,3243915842674841,7959176632492186,4616522084540573,1298325858279582,1905670989331141,2718213644607648,5617106883698849,8418723173589159,8256424850665567,5045048852177067,7600803012927661,6695519368110256,3302148873216178,3178933747835060,2438160564740279,1743422714765497,3512955573330108,7175871969917642,5638633096143038,3482301389234367,3779688207278273,5994750785839298,2860286450196678,2086298146201802,5243106694586572,135092313612493,485420792340686,1441204363289976,4689050046058531,8226456534645454,8646886951542998,562025088704728,2311912259182810,4752353651974364,2094745357624698,1742675658891486,5593344204169440,3644924133990625,3027016347967717,5915240516477158,2603229890175207,1977141952962792,6639950546898872,710390718783723,7744949363892460,7079717013905645,1811510442189038,4002457714254063,5668041639583984,5015059562422514,6386355225912703,6673282564940030,8707334318317824,8001090224972037,7757290553598218,1885132883060098,5597704139563278,7058416700743951,3971157739462929,829472340467986,3755632129171731,7981228382933038,8096929323737366,8885130186187031,7611876299850198,3826364620169498,5445395946103067,2900208924254495,5220688670417187,3755325794869540,3793951659122982,4822376535122219,1877255584407858,7535548104532275,1882249993052469,966300250857782,685962531004730,5066897771913531,8885113766399614,3593890795381055,139707503829313,378516963942724,1531028778292809,2479164958040396,2119503793840461,8617495732741517,5090025344557392,751342378279249,5642089818022232,1572473690284377,6874256993673563,1464105117049180,4027200398516573,743192218558814,919529000395104,1043240515428710,112712306156945,8761118230924416,5073621647222162,6689461784600942,6131668123672944,6597349852799345,2514587424874868,3222552175311593,7432153389228410,7836914520744316,4544091759403389,6031974754676480,4798187990868356,673135876956551,2669914020798856,3073418460553609,5176580698300810,4157968670351755,3455658395492748,5397165405791379,5821415771948027,7243968576905616,6453506710200723,9119287677090979,6992238892835224,8375184188760475,3266441700139424,8417752402655984,5297736138908066,5357076959388068,3489561259434407,3100200392614313,8712774929408427,4221427666739630,6515248655327663,5342620361941425,4485579998060983,2229256193827256,2423509592292084,3733784666661306,2391809671815611,1574269007258044,5356387653411261,5779386544677311,2639377460027842,99370918633923,4964407712178628,21037018603973,5450995276276167,3859082271842761,3930503287497162,1186219556790731,1033786027729357,7807679902376398,1392197477589455,8083328097575377,7501207486751187,6042432720036309,1719200886504185,8438875961778648,62307166675417,8438174231585242,6815036019380304,9083231383609826,524089321748464,8915808931832294,253797101789673,1781030520316395,3641225876988397,7728969446056434,6144458677871092,4104206859493882,163180742894078,3807285625709055,7066052377105967,7751483842362478,4229417145000451,2175788715794949,3112309469635083,9185699104481809,5082933718213148,4994469355708959,2469536879011248,3856137087181350,7516851225585073,6970312093819434,3124682449576492,8374645986933158,861867478114863,9012624582277896,1120293118992948,5855731790340661,2536002844451384,4722284361998905,242114398282298,6362366746878524,8150121504127754,5855370692682302,1991369129386561,3128650227475010,419911395926595,496770146755142,7411801471312456,6980532345430602,7788820627415629,333755788354126,5834458644832847,3532719820825168,6749318614114897,836058666230355,887033020736084,8757108834820693,5093722297844158,3198287883297368,3452136469095001,989985435859727,3525030251453265,9004016260042341,1139300927306512,6777845850169956,4480458150077029,6302077793690215,6684072266424937,2213199236162154,9171789653107307,6575847368745581,4757862520676974,251587818016872,2692470874431108,1862984612635252,7724156512297591,8732383562339358,8001424500472596,4325944160903803,4761918976647805,3685986146902659,1607654912352900,4869013638308488,4077145687515788,1985122605523599,5784661745296019,3742464884073110,5544840585536151,8838970428298969,2276540781159066,8009798771593327,2876150285689501,6556129517232798,3773850626271414,1655906842501792,322944080810096,3641061288535494,6231762397913771,8620856534262445,5777750036985591,4609974922896052,14574517707446,5622905011364537,6139209864995514,6540263914759626,312037525938879,6774356648387265,7984014462542536,486080349823689,5949525924995793,7338027791540946,3681964405973715,79718421127893,5944247594181334,6235278612975737,1193100528083673,7003146817004250,4511762045362909,8842192704561886,8808651204125407,3911187068773090,8204227900334825,3621508627227378,3489480794333940,4049200022840058,7679174005973757,2924273700388395,922016759374597,8708984386031745,4344681255691016,7976244322427658,9077257599534906,7327370471471917,4425985126884115,6715964448242478,8786113302487832,7486059799831323,6078262149276445,799896740979486,5321869841916703,6053925279097632,3015433329468195,6424629093327652,1620605125944101,6655421910082349,6328386931254068,248686740824885,5932463822037814,7245787119674167,5682294688015160,8110953761104697,203608873132866,6586377178800963,8377745600701252,8321246179474230,339069206111713,948180339909452,5479346663678797,3318068186014542,6671683552338769,1214641991934803,132100535407089,7446505479922518,7731082048091391,3941157548450649,4944552436392794,3932902464283484,2678946308023137,8437139203322264,694240180495203,26382166188905,6166660387267438,5222507501675376,6673956646183794,5626809465004917,6109262828069750,5804431547256980,6624570461643643,4283978425656188,7767350310167425,902872686617474,3794462117028739,2459059488744326,2665468457575304,837315476284297,3129504965704862,5486099363586955,4156798173307788,3329755476845455,2019381273781138,7717526708970387,3463204082377620,3644679881581462,4542569212142487,4042712628290458,5272511920202651,5207493834330266,6824227569492894,1196282181739423,1843126714000292,8873822060466332,4287210439500719,8378994370209267,3919266971930782,1789167617467318,4465419168113591,7870022390818292,6560431877227209,5604279775257533,8037422592103314,7502340765037127,6123996312822723,8150859903558596,8070270143554505,3435323703550927,4379285660754900,5144960107144149,6063883414004696,2870984499946461,2126383936791519,4760661921031140,6329533779409745,8327341394748394,8348645522985127,6474056781252247,3297059823844178,1666182189016046,5424040583717871,2846254354195440,3843449916154867,58668780184566,5942033784557737,1496188072158205,8049688416609279,4000506833167360,6474278119531521,2606746745922565,1136892814452225,8877152251110408,6361338238133257,1495914404799498,1264238676304909,4231902442611729,2740207962973203,6088109388620820,8864726628989785,3635937921885208,7522279648224282,9088921162933275,4507433195060959,3243561942639647,1599597827286048,7329766675833890,3489968723878948,2016928796369957,6779219708470311,4773810292253737,406505666438188,4776192089449517,8938708254352430,5549296379837277,7575006034584624,1986595952387121,3916325184791604,6866577117985630,1451323194860599,6513065838142521,6707407615239690,6327005495964452,7174716170337120,1896686702814274,7512661270701579,1812256902276166,6212231286252615,4656527355733066,7068499059500107,1450125725131852,7971864151958248,2605436261622864,3741828328776785,766155711505490,9045112706671609,7466021688952716,513811134276696,923066924863998,3458263676052573,4784747501675614,1628662169238373,2568440818459744,8985495266255969,4192905945212002,7896394416771259,6304281643179805,9159401957532461,5797926256927848,2987340794239348,8845457085751001,7243269739897964,2524367964005486,9005432491657746,5092570264888436,3140789519967349,3065262394008695,102545454720120,4626919796237433,2475102266057850,6750395178881215,8213214023371487,4467066456368256,3194123125351554,2340128174957699,2603300455343236,4634307118195845,3537115388568711,8879868583523796,8642744180822026,2314113958329810,2392844955968657,802162403533970,5305366303237267,1206037652235413,1852329484248217,5505948775703707,7467260976391325,2148456865424544,8863300644673262,4005204856890530,3882862911399451,2469899036812452,1961805156738215,8146320983221416,4924745275663530,9158923090715820,535125795136689,8775062920287420,5422436595688628,324621466625206,423592499903906,650199726056634,6760482705925308,6693917880280253,8115866878469314,8282981484777675,2978306524472516,4596616896210117,4663762629354694,3844387222447304,2123823978308247,2209473207690446,1335090289927375,978961144177872,6390682374563026,1063951409177813,5241695494104278,8088981740058940,5064912399033561,3201350161982683,709982201275613,5503250255471839,5981676923249892,7895182192993509,6508209821344998,4803850541950185,6741029179647211,5610215483892973,8127899553916143,1550348440397040,8244585993823473,8114241940645106,6879431980201636,6689478721692918,8563731329328681,4766733567845624,8187212757034234,102171914599295,464493896951041,8832620369444736,273364148806915,3284001756931332,7617451454817543,7275165149357320,2326552122942729,176208274679052,9135553819201012,6274205981107473,3283195867029943,8334532058244356,2036319260927259,966913306289437,7970909257983262,7591926962808096,5223322014803234,6757814440060196,4855654005433638,3550256725648679,9125799093236237,8301083752490290,5314624614524212,5855758427874614,4965905117635898,329654973424959,6557508549567808,8241991122183489,9050508181711219,668308777329987,2409783792100676,9153941193024838,6466016896132663,8949126172950931,442145019990242,2357186521949518,8303240682055224,3912310433015123,6678487556679225,8612680943822887,7739882338865380,7965560514340186,693124573510543,1480577957225821,8393896254193505,1622700111324511,8234281307202912,8428265155896663,3675564338701668,8358354821453495,4348090727589228,84675599590768,2961814357435762,7622648878931392,5404261065909624,1780233933284731,6869946647569789,775850785498495,2627212639593856,1783150600545665,5950532912997762,5686892901524867,4058402255267206,676093148276289,156638241416585,4605839783290250,556026618209675,499362595038786,3254641071941008,3093616251725201,2435497318933906,6031085466461763,8500716470494613,328435777529238,2955201586554263,8062148019905947,7731842024764501,7281345972414021,3409243199825312,6519464913790369,6036088407778722,6884465539704233,263011124405675,5075427801818542,2722428387091888,1816315345724849,8171040286926259,7283609181780894,947197271565752,2640570924197310,665387577959872,7704526367155787,1976127711241668,6172924781585861,4472944775849414,632926999930311,2520064111863240,4183397962062310,5103554751423946,3498312279123404,1044116089916070,2056395109197266,3817296259769812,143993659549141,1598401433757142,2084191897321317,7018454057663396,7061239806158299,730368813000157,2734259427572645,4695574334727648,7068956338005584,4530617838527973,6001595787929063,7600040141088237,8433573956445679,5840475590911474,5362422087312883,3805479097066996,5323730355316215,6508592875267576,3461501397296634,9023794304897279,427402565871101,6447253773346302,19464304748031,1984553450923520,1039733846435329,4654550962497028,1630950203827798,8072304678430215,8499296656641055,3959349015602697,4716904152720906,8235881963890263,965989726348812,7248162171971085,7615178740491790,7174273727609774,8008574065667095,2623685516420635,8635144057841242,6313274357573150,2369713244759590,7221182833671089,779595808499240,7974629970068552,4453480660821551,8395256204617105,8630414411508784,1146055913825845,5442761726087433,4305732438910521,5323131690313274,4651118428186171,309021400491580,4108338097492234,8289760591406654,1623890975123008,3425736316085826,8734751271915787,2169824129246795,6867664447104589,6160240794986063,1571870869093304,7164671412921938,6390262183596302,1107835642078806,6068524803352151,2003179422279256,4631035028399706,3305230997491983,8375445673010789,9165251210863780,3195506556790372,656486110045798,4915620171638374,4854406278243944,2814296352384617,1780784650249834,8586701333751404,2957392982528274,8389261020134333,3493518992893552,8540816611298838,644403468625523,4771022402840181,8846548232070774,9079735255393912,7896965843936889,3691939400541820,4689837581100669,4550750128236159,435875062638208,7813012430382721,4999058218280579,6582401770219141,8749833581291144,26827234797194,1949610155299095,5172446128793229,2769870378067598,8471390763640463,6780950574600472,3628688450283155,6746416637863572,295363036210837,5380902002058902,6967478430620499,768787110031284,838414864869020,7268555118143133,1113507668649630,9146994785963351,61066426082979,6573634882561704,448579517802153,5674899597518508,6452175527241389,9117764038911662,4612594662598323,1850356156851893,8685168337544886,8294061068767519,7177548613183164,9164843143674826,5640334845666933,2747252663805632,9168456578979533,1352088600192630,5787197975324359,738950717422540,1112227170608846,1928507386193615,877853056100048,3121850089137875,7209505296770775,1853324772501209,3591856172000986,3326359675856605,2461654236620511,979980889698827,301910494308067,2314379897136868,1487942513780453,1573291825587945,3106053858617070,5106233523726066,7994149321336563,46890095601397,8877599028012790,5745038136338167,2785314672568058,2910718249756287,6784327665051390,2602618247440131,3719908716284814,5351712187836168,8679785793677066,8893719756597003,7660191312537356,4283936210708238,6080399898339087,3073270564382480,9172830333069075,8408805108610133,1572044953839382,3788835774237719,638190623418137,4012514739775260,2878101332846368,7385020190730665,8883818229229346,2724443575958491,5090433982654245,6562269220688177,1001562129983274,1712103949395755,7727597562783534,3048245556629811,6662684018304821,9167017858295607,2316676926433080,5581340421656884,4456562165737274,4200507574052668,4403428152561973,8937243607000896,1816039173547841,3584661904052534,6210496887547718,6430257458374477,1183500562458450,378837693785940,264530413097273,4226703094540120,3442205663323993,7928285237405530,449510931785564,2477426716403549,3041242881845086,7951747239307107,2365914198239076,5497412437993317,5308024380647272,7872228517963625,2046153641781099,4640767033534316,4441838862329709,3008527956764526,7838823411102292,1685464905967474,8247510917097107,1790093599369076,7265797345273718,2531517834356599,4476995733314258,1333749263198076,5987471928321917,157061247788927,2179860752951170,1414064300091267,8641454330436511,3399683932366486,851891743221643,2571577571882481,8190741819156371,106943405287317,4265586710439830,5584938531907480,7083876604695151,8055781335230106,115821508388767,2924908132427680,6290989900294050,28260544079780,4366648067145060,5676908502476714,7628384200331591,2726126150150061,4102417369966237,7018997808857733,7825919016593330,8804657191931198,2950114961549236,7134674005649335,1143936636676025,1290997120395194,1389209317959616,442615960430534,499021712320455,362782755579849,8566896053323232,9101982278274408,3917768538417114,6778520800651227,3082511172397021,4222828360361951,8034461171717659,8047129434384354,7328423755889659,3366565043333093,3717311492155367,8996206356686824,7711675538701308,7025609639913450,2651087897159659,8179585676994540,4958853475258706,8172028090836974,4904123387144176,9185679036114929,236580289565011,1026378908575401,1372495751800826,5508012541700092,8694954366725807,4103868554504190,5071509661673471,5315651217876993,4258501398718469,3024363573766151,9015286371575818,7532242241447738,6704373231746050,1828891529996304,15125818501141,7484527235328022,1511924622551064,98646701402138,713246145701915,1060504969308192,3565431063581019,1074347580106417,7721942604081192,1437655883802669,2431021480567510,5507056587116473,3898579418900530,409979022960691,7879238691383350,2599574012291127,5922446350903352,4224457864996921,2107454207223866,6788394851723323,7529904596609084,705914382608446,7980249918396961,7605689405073476,8731500402927286,4558056847435846,817442187896905,4538094932125770,4883783686547531,3396976064129100,8520152544214029,2221167375771730,825651638298707,8833761964025940,2324398294219790,8477660976343126,3899289201469527,5285659592255576,6265031163177051,4793002526271581,8907993115289694,810749346539615,354984701257825,6603982868277346,6049104018630755,8741734951905384,6912160888907881,5946107698571370,6338052953139307,5373492486476136,1838239176145939,5653550422157429,1800469126867063,8675160130894868,1184192610429051,5306692793395327,8386205623678198,897363484561771,7958685899804706,8069979136305390,1817727725594759,7592698956146426,7718666581905773,2688092470339728,7159115402832018,7182361231419539,4265578452183188,5966797325396117,7740556497391412,703583629568153,4089451430564207,2386769734592668,5049391050647710,2713112407828643,6477716722542757,5930508399831208,6455582479148743,5135596757706924,6518651399923888,6492424194156721,4273538356111538,3406212993345717,5301184278390353,3718886315518135,6716286145915066,6982676406200508,4731261459523775,5771383059776108,4484177846757573,3195351347652808,2712020250454222,7596507467575665,6144836519454928,4011021248325841,6736793503812049,8671917395372243,3720846146823886,5541739636189402,4008907072760027,3030004283500766,7869781195483360,6223610473670884,4462233655961829,7480656884689126,4386595944441553,4908406981224680,7615182693525737,1020573736495339,665060952500460,5286274667014381,7807460896336112,886114436037672,3907783801563382,3562404164364535,8041829500774653,4147679145027840,4657639550413057,6978467787204867,3277482372065543,4094480962513161,939073692297482,2165220339181835,7158938883189004,4077851871701261,8323608112130324,3919940153731349,1596050434418968,4205477559527705,5684630419466523,4404010065864410,7728075163298078,6940264393773445,4968058953361696,2805811661039905,1997378852770182,5210586363521321,24013634922795,4389534336543021,6461421819291952,5485631630076209,7882379797724211,2437470137641269,6942631072262454,334979031787831,799684377372984,793860975683897,7401406835641668,5616890789914945,2315616049490242,2346072662042947,599726883006788,652715007043908,2658822476196169,5070814679439935,2927567108794701,3372636312987983,3155190562089296,5014136117619025,6536042389006674,2218823723641173,7991268725357625,6569036449311064,7412447051540825,4998956639938907,8645939682404069,7842204017486178,5194959502649062,8685776717408620,3946022333049197,2664660254746991,3647215466277233,7998731600602604,996252967195027,511239781312884,4379922070628073,4654850426202489,7574268598283009,2680943275665789,5821489129810302,609136253331841,551957640440197,307995454957960,6135831841696137,7109886528453646,3349839189502348,6585195605356800,266323291171215,8854824627005840,1094668204829077,562028113783194,7479226190784191,1222995342588997,8852536165034403,501741732161960,783701584112042,1361053588192327,5401503101184428,239951861147378,1548154884581806,134367824243119,7079201706699185,3831988254615283,9104452550504890,3720256240609717,6215289089812919,2118197941070265,2258604736211391,6182499666127296,150379656178113,8322297502620151,5549047899744712,1349298051377614,6479397173979599,4572823101368787,5397235907559644,1932291271944662,5888594328971735,7988387231066584,8655294994778671,4867680980461306,2338837990009312,1695927867664865,2008499474426338,1130589947095523,2605061167639013,28401650002406,462778396338664,7962890553485802,7277971255323116,91057057917422,1941973869849072,539014600026609,8027447691799030,7186548821060087,5542157978233336,7200776743610878,4622676527114756,4831478082267653,6956790696110598,4223118838098441,4992684386216459,8373930071321100,7484473204795918,5989516844061101,3025565940574737,5116902149876243,8223592629824020,4564705419913749,2916647272966679,8041761424337433,2424787620588059,5445439487437340,8305981714033181,1585951184677406,305990042184224,6552079937234150,6958580888627747,9100930194926118,5343003161979432,5112334264887852,8564445618498094,331897957116463,5837138182990384,6573919941585457,8593642672241758,8840782184540726,7448957650725431,2801600240249402,1242955005872571,7742615233129024,863637483252297,7073695868777369,1047771370711634,7488598942313043,3436910905846356,2262086528640782,8175191747187129,756842665929304,2685225731603556,1614640891128411,2763425850288732,6673292785947066,4541465107565653,3355993420196447,2002479989221984,5668139569375841,2861594324134499,1016016480299620,5642863986076261,223173570783847,5418884824459880,8564124893817626,5562771420015215,2882278576220785,7735241812509818,1616853970283128,8132470113102457,3155979387202171,8163506992481675,43571157854845,1511945003231870,2826076341594753,8981918143834754,8154840191663211,4520248424949526,5117144646969991,8891104701032215,1333175159188108,8456740839164642,4330639333419662,6118173278399122,3275831136217748,2489018641148565,5180213556603543,5864585867651736,2661965496150681,5459382600100508,4215688402397854,3465644739416517,3496984719780514,7793731799640740,6568488143171389,1746698997885607,7357990332230312,6718886615116457,6561747373746858,2751235605293740,1764144646220461,796723219262126,6925524366977711,3886277201554097,3427123274738355,4709394646362804,3985780523199158,4081116725832375,8796606526417593,4002625874553532,4837957816052414,9155673115884661,8728529987300036,8658546610453622,3529152699951814,2777638826404551,7163092191825771,620709339622093,6680089488986573,6788949027777235,8806549427612372,3186364923407061,6684966376073942,3707701656218328,8864398602693337,8038616697133841,4613592433715935,2897807343512290,6947716703188132,7756354504518373,3302352482921190,7557415451749100,7440864591211248,586877755386610,5561792522578679,3834280698778068,5835963229994,492313386511102,4746816220293887,5498490660481792,2665710403316481,6760585616353067,8175990813846276,4469569616210693,8824107491355398,2688281411545864,5868318620674827,4426320059165452,4421698343562002,2184351066483476,8282552464206613,4300090484550423,6803912322444056,89138418510620,1057469572868893,2983553854028933,7773429981244192,7715660375092003,3585600600533796,4674970193914664,1826892822866729,59115079330602,4155460359121707,3623280892668718,3986997311721949,7253546793560880,3096986096331570,867816987305779,7996399189531088,7889640606285766,7062750608566068,2939926450400058,5179915754367803,5699543052806975,1664645692058432,8107381027754464,7960001059449666,1271156450552644,4329245830179656,4716817784105801,3859077149879115,5607906706324621,2519512128153400,7103749200112468,4175702183242581,274976906111834,4582349645933404,723214746806074,7191949017639775,6588725600158918,5991332741016422,1786479102618471,171849218812776,6005126916565865,6788568375776777,6401880802618219,1452243859270510,7104534235245426,7400521632639859,2617053407243125,4970276869018089,9175150506045235,3135386337930106,1143508634003263,6193365101505405,280806990343039,4711056998886272,504886528223040,6146695087975298,3270282283182979,1192622973435225,99569220447111,1871291218488200,4739900784765834,7769857416073709,7124452218039184,3949155228755779,8364572403657620,9108999486769453,4845588449225622,3338550749522839,6566028460845977,7808884833807258,3209273045085084,4028809157405597,3254643644787617,3691949600009123,1691291155622821,3570789235157927,2173822455966635,1070095035329454,6063752568925103,5902995492185928,5946879766326197,7954405929431502,5914785638027764,8129577302617018,5344842854644895,5940799459191740,7223170992996145,3482246044692874,5280360772325877,9039053692052083,1915435210861507,7348961270098885,4338160177146822,594638711188423,171693338094536,1824434078051275,3185543098723276,1354411072650403,57069372959704,3465656645446618,8395667052653532,4338605981658077,8355452963449824,2415607445711841,7297966167711983,185460851469286,4495738026093544,4473392057641962,4525529192295403,8163498276611922,6298744594076157,6913067410582513,6143489693585918,1743422536875177,7544185608759124,1432795576986627,8018321193397253,7969056851487750,8126964577477111,6810532999228424,1552048732335113,4078618044131159,4214554430663699,4984736851651606,7402092117355543,2391762545077272,4980114652064793,2221374341114906,6801551772675099,4266947289312285,2418838969019422,3263882773085360,2308077243755554,1457485132983332,6294389038214182,5032199939615783,9020842630114346,8853457333185579,3056406511216477,4772262178024498,2652097978788916,2787177252185950,639211473431609,2511681863740475,4368513702882365,5235065185659967,2657222181317696,4060107298991169,3196256754723908,5617486838197317,3201904678562887,8711348447079496,8112492482260042,402957647277132,7051440546671694,4528953057898571,6764706952750947,5998008078167124,3790084986104917,1213716010462295,8034806212553816,3856513324837979,6752181806623836,8653454411525213,7626053099449438,6813412712836194,8612590968583396,4686241673155089,7819456041652244,8430863030479980,3289226744130670,7342256424709234,6209168089574515,1730229797710964,6869036807974009,3530883873336444,3862148683328640,5378417411746945,1416681725062274,6126518886362243,6197898302975108,3787903992065158,1800075340197729,1393940114893961,3984147091700930,7367359387987086,8465740094236525,4443205275577488,291889901694101,8894492991050265,5454013882133656,4123494852193435,573642247367836,3601299136572574,1159019456130207,138433480846496,9004142055581552,5385930322268699,3612461605809317,8745093729873064,6644371681901767,7171821912157357,1671571510095022,7056979985919152,2130967679401160,6101236815883443,7410279501884598,5636873706007737,3651585540648124,7376705788181706,2162796756561086,7388511657633653,6785448912350400,4662654040442288,4622729645911234,2762760342748363,9069073164598476,5093338288057546,3379779086493559,9043331863407820,8676078868294864,7732345492924280,1585447109782738,2950315322731731,4895439062363348,4022150147570894,458892730821846,406138145598679,8886944791031002,8587580830088399,1609864815865055,68999101050082,6626380612693220,4939795014217772,4038337206611177,2654873539931374,3321404307613565,3102140235246835,19849514937589,5479547614850295,5150689437445369,5987481050082555,6436113948709418,944470128782591,3438753016245505,1728559734123781,8239001641118982,8185731834255260,110683617783055,5974732600012052,6738419529837845,1825896847195353,6417493852147048,8705644631936805,5090221929360672,972097575021862,8981063840754983,3083681232645417,6670237806292266,5309287000370476,4903252748299565,5477100489010479,1784373222763832,8296324866141497,3278553515060539,382360743963964,2122049185148221,1675405557132608,5302904911752514,286827354892171,7943952038260036,5319313723419974,4738800318213450,8691754424439351,4024785899253069,6273981809747853,9139137481731409,9210197509172563,5926743759908180,8020863494679895,6294931745271128,523482904063321,3548761228871621,2333439182745735,7667482670263645,617231821139294,3059093832527202,6624421686930787,7297873398844612,1214292393717095,5867627288751465,1830851141135722,6769021352738023,1963218756005228,330977705815405,5177499235937647,1574618764617218,7958980804210040,7381674045992313,6940590836772219,7348401382845820,4311961334716388,2688916719758718,3388173509453717,6137452163755393,1616719416212715,4811402565840260,2397414366768519,567501829107080,3766885503462794,3002962332494747,3083728233622926,2012500693493656,8740415223098770,4235504053480851,6816672241184149,7477139974385046,3417704561962393,8241337521663386,5669115546856859,3194238159154590,3322426192915871,4669594123909903,2631673098431908,5680666431548844,4017076300692722,7871376003362222,6970663477692411,2323468918189488,7019743242218929,4081771722141106,9001195263805367,5489467476438458,8937006909253535,1943294574023242,5829515040779717,4772061466979782,4989105935773127,3015017261526474,66051022319053,7198377007537586,1675976969579984,8501079658968075,4217732926729684,8632496721849679,897238417727137,7771136637955546,7933569240994383,1868369029557724,8658241349387006,7430118371794304,3639041977544163,8716898654512015,4109922698554854,5467803522821608,1508771693198588,5699656312186016,8320742196473325,1160384226487790,4301172781706735,9198173045823399,5526289789644273,7374324306603506,363603303263731,6173577261805047,8996648378843411,1091915544784380,1639221079862781,5872805057097221,6040115669626375,8841750475748219,5761021289524748,1025318686234669,6467841463348751,3758992657444369,7662480864100488,5850318761258518,7338228455435801,3154527909899803,5158418023673373,7678176630476575,3217514187714081,5508682942705186,5648833276702244,8550310435155495,6888367224122920,7582573799271979,4798687738555951,1506407869443632,4768050327219761,5169734095710131,1100752042585653,6242958772989499,6701973829516683,4204394338774589,3127413537500734,2267911150726719,6518480820629058,4725881868395700,7095831642868411,4273511814295110,7487306759945484,7569615437406887,1644838536244813,4951495378300494,51739235085905,5560582288010841,8010237406735968,7771560504999184,4954188323581538,2019463610104751,1665584467847100,2768460995096172,1967179029376622,17489685343855,8337522219118198,704446788955768,4305120133508731,1251669398187645,8778878674160287,5208599926468224,257161588615104,4306470862450306,8100804072959620,3168825273302294,7413321819223448,5040532622012041,3626087239904907,7265850294431372,2237345480535694,3082539618659984,6987041450618513,1164173492612756,5193704062308974,6263316076719766,6491297965043351,5382992779013786,4732396610048623,6485389074919068,4978398390120097,2520737522711835,3042731198475940,8104455587882950,3075325904514729,8652985670069933,187339792445102,2682523124854447,5162635186728624,5219323459399345,8541105692873558,7446918304526006,3572351081017015,6755187248721593,4395043200580895,2185466774154940,6466513642814752,7016910218424003,2661687211617988,2383567825628870,7007103820066505,5236322877107914,946874148220621,5215406753541841,3092418925460771,2785348878724821,5825904034353785,1246790357708507,4802341291224796,4886339491557087,2699585705832161,3965595014343795,1259634995392230,3381959492103914,7045141163719976,4011005478891251,4381243079298479,7064922880262915,6868072872242937,653175611584250,3790188307705595,6972607616773884,7229515615366909,7026748704386814,8367233340796671,5833298436189952,8944551049522948,7926540672607248,8562276635424417,5126486659595564,8561202369585084,4972989450153740,6711915956825869,8480356192014645,1316856567692589,2058774672731921,6853664057650962,8677594745073428,710875272245013,1844576794930966,7280458019639940,2911319427215132,2569983657668382,6013560172670753,7733023675507844,986900736503589,626171176578855,4590109195104040,1939057376948010,4247420403609387,3827620389482284,6032591845781293,2803335631630128,5259131572121395,1694028153057077,6120951586484022,4289677648457528,4736436871098172,2673075054145347,3515985661718340,6969968955879237,6411891756265288,7977286270480203,8202558189268812,2690876371791693,5238473050550094,2229397565549823,6214918984101712,2676317466357589,5784759998181206,6565837322907481,9166125452586843,3309165434335069,1457201264095070,3821016850362207,3133183879802720,7767395916902243,6198649030733668,2921959867445094,140799264255848,7569205087825770,927310797303660,3370738233765741,8650570343086384,466919427469168,6175626986418033,7587477183557490,8523306670419828,3101465638059326,4235737493729145,1039237966753659,8804168727621500,157071262445441,1510121751174763,8108201077575876,503214755999623,6466999966722029,1812654503391120,5914398598419096,288498542210962,8757094326267803,3999134202064797,6832191093344796,2359844228808005,477471723614112,4683493696169968,7108662747763355,7958793242975119,3607869079613349,6161536973795239,4306149636042664,163796617097129,7197685614636971,1596712788815788,2084732293541807,1201088501116848,47006952386483,6226770293485492,8778184559456184,9163584041447355,5139288861634493,100894063882174,3454304267661247,2296866971905984,4713148127724660,3598669603663810,2203958860345285,2964745665674572,1110978572587682,4518983513894862,3747032147956387,6787744735474843,2607492556012878,8081564698800089,1893798312275930,8582464230391119,6820211574368250,8127383084527583,441257578491872,91347369508539,6558155014487377,2134991051974652,4043792022674867,4088012660273134,4559012914687985,8146914088823898,7988606401998841,2473975905742843,2939714968547325,4072430860169215,2089292421132289,6890631076474886,2027404347076618,6799365702840332,2698645039640589,3404579464073901,3777734735665862,2631095060131860,3759109551910935,5422224010479240,1504828575410181,4671020187086882,6768567963712859,2069235921907749,7136807462694953,3188084551348267,6266092900315180,4544049961562158,2820797747916847,4989003882140339,6229700479447092,1295869433376821,4026865670221881,6107754176081978,4459844464336429,1534791042265152,3360263250309185,3779070440239171,8352335775410713,2212300707917894,3373262967828551,1355773945049163,8139845753172044,2634269018615885,6546684297277518,2683605231235151,499083812617571,8184899175890904,5012544268333142,4848673892593751,1369032338042968,4834652974733871,3147939845697627,7689723779739744,4525394312523873,305424954814565,8945578493997160,6699867143288684,5075740843012203,5706045236506733,7479333006569583,5620288273903729,3915634837876850,3098303380680821,6089925316833399,7717054346195064,6481730095968377,1287010317660283,3254256481693820,7408392529375357,4286580233693205,8945960093184128,5099855592149696,3709537617997955,3929601319643158,81739656949895,2196094330335371,1838806688297100,405870767975173,7864889922023569,6000840980131986,3656234392678549,3588802646274198,7214557156634775,808145367101596,743547075129503,3387915434619040,5428122056978594,1268817725026468,7914397279195846,3618600129625457,5655477925343403,7938227105296557,7819923172094128,6203190143643825,3203700327313588,4734178414620853,7698627942969526,5962169794556088,5514703897161913,1693174509564090,4662564973881375,6345625057049973,1243474031898817,5912627930460354,2237563526049987,4126573749104843,6087859429765324,1628075206547013,5905003535528146,5204603081027795,2610921624432853,124704008368342,4510434987375993,4891064822124973,758641086329054,8431081942347999,4035121402474720,6414200435241189,7899669378615864,6087985314951400,6584792887226601,5775581844402410,3250655836631275,5113168126701804,5942851449614574,3157185784705265,2170512548524274,229049538998515,9163628716421365,8811279052927223,8156289815834872,4023969349955833,5743031078187258,1676674168516860,5039348317188349,7489157403046142,133447570780416,8734982115687808,5322937435091203,4738504515088646,2569640406905095,7189049042411793,8330588687508070,6861548855062798,4690398933903405,7238698617787096,8849583469883666,6932565956424989,6540732170916569,3315990005739800,6855211106605434,7969420568588577,7540730501689634,458088145056039,6048892806828764,3627503437869354,7732686772793643,2912297676662834,44616922657070,5346882905534767,8739590053884209,8573812436234547,2079726203498804,2720493025891038,5092947907440953,9049980679605204,8934847229260094,5858640853657082,7251005144240066,8092359520842050,5642813595775299,883894688608582,6311738371699018,8430664183441463,4334761125048652,8662831953280397,1017911548080466,7832310902026579,6003494154793300,8962270449461261,3037122562290009,2848310061101403,8075020854368261,6707250463732062,2603234231152994,5929636974358886,6744306844168552,8250274389125180,27155432829290,3485022605472107,3916747112018285,6363937192571246,3712804583993711,3734104096338288,5546912688009585,1112507437314424,6672828094706041,8209376867638977,7673597137318267,8339256769704318,2101892098318578,2873000163209600,5516134468579716,1034573365168249,5077551379116423,9204031812096748,811190159896970,1880206662463883,2994217213784460,1879979328033517,3697791507362193,1599388266131858,8244765470397731,1658082997137813,8769200882811473,8550532127437994,3012868238471576,2086930531938076,5216427297272219,6374753089319327,5485263220429552,3968160718156194,5613327378543011,5609492905914790,3431279665476007,802374964180224,3263524001676701,7393812447284420,7350327195614129,3473568559002039,8890850848764344,7745815038456250,5037890412179900,6076181894686794,2836944749982142,2946229837361601,2357656899840075,8414378936612974,201438242007116,2652061821465036,1053395244282317,590926566617550,8661121620687914,8832327903080913,1450717747114452,5479016827417045,3490984411230679,8641312020492762,2660314654568923,2018592870421242,2369466935701982,6165442242212321,5050380108886498,2814731984630243,5855837330272741,4959007205585382,5432232851337703,4795900700455402,7240453269405095,365953015280108,7956929871505490,4042933958341102,950219175017896,1490073893663218,9093751422019667,4887783923937780,5651554197238261,953160638329335,8668813374026232,852586621006329,525828928180991,1123989757719036,2743665884262909,4541281836757505,428859091743235,2862500378440197,5065727047004679,2076964864586248,7595913526047241,532112633950730,3033181272212371,1708597778869032,534447945347603,6058087824093716,2421696026898966,2456128454947355,2120394282562079,7280687785046560,1174727111338075,2030158486729254,9098562962387495,5939260903485992,2262167076172329,8616120873284139,888505563968044,4836705410773552,3763564152058417,5134771516437042,2079529976459830,3404181107241530,6190442801164859,3122533351672251,3644081816367682,600161483321926,73294538994248,3213964160463433,2067072711029322,8536989809275467,9960798974540,9062674633290317,5486262532207185,8294540321286243,7042002664690446,7521605077299801,5065692079674127,8057771320275552,5054251200213601,179239870493282,240998642020965,6317965774123623,6949423385565863,2725669427606128,8607986779189874,8867147032408106,5669475676877429,2839113279795830,8064560624986217,3494254654059129,769501312843115,8801544781720091,4244905095524993,5673042084164228,4851755449684758,1676128477343531,7573635522365279,5045717780558478,3304511279886992,2836576982700824,2825410533356179,4930324590260884,6232106115410030,7416079852828355,7937524165178011,5086680521077407,9124545267135136,7487251874607778,4575347996258979,8548647700787876,2013260461732517,7720425771791014,2376813951611560,9018894602015168,5427640655606444,8361080790685077,1720809273389743,5582741578478257,7027987357627058,4661500469703347,7017367009456820,1542453130883767,2962990283420345,2778423338037947,9175395657741588,4229756170236606,7361327862215362,6018039378342603,4772004868947405,672358005961425,5060806640169683,387913334078927,5844245451117349,518035320107744,8913447603584464,2227843305239267,4719530557076196,7069829571154726,1172979953234663,8585894030340843,4066083889738477,4572667645358831,8476464043478516,7460439006278386,2057716298478323,2558387570668276,5444925986829046,3014463716553463,7658515622425337,3313667189011194,1202530114859772,7067003795253376,7556610258203394,7522932174779143,5183071590183688,5773138538820361,1292344593773322,4148853833596375,1402011494806284,5295585854892162,7667596828111630,8269598043140879,8010912723563281,4215629482980114,4366298315715347,1305765943603991,5688370271089432,9059923513006437,3173379746263836,4851440620532516,4166876651647781,3241532910269223,2483163459285801,7950423066276652,7015729702007597,3798093551498030,1108503534105393,2249778993525554,5579917194720051,8559688944808756,5705280578548533,6605711819993910,8849842866451255,612453155468089,2614367439647549,5804496667603775,938977362801474,7483297117762371,2830931688911685,42591960298312,8664244006318923,7788707533924493,9142181569590099,1165196674822996,5072870258897749,613164443693910,6577736503382841,6829526297068793,8447265682977629,1217790871565150,969653273359199,8454006886757217,3899778255713122,8090527844856676,8271877512033126,148741904331625,7366996958650252,563262705595245,2816409530364785,737888356037498,7423790382478204,1545851564290941,6880286637781886,4793070816850815,3766221998224256,3304737723446145,3169304440337283,572255132152711,1338900203885378,1813914289337230,6498753118860178,8785442558636950,6183714883564439,4140230771626820,768737832563611,8643528340829091,6679501441921959,259132438279080,7528309648290729,5881453548303276,8571093694378927,4112492088521648,1338419874755505,7245468066070003,4547640636773027,2605759514735547,3212148094079818,6065743819502527,8558448856254059,505443492852674,535478057434614,8954514245634129,6371660410516423,1782615453299659,4451380629402573,7048015126991693,6251063033058689,6388947023095971,6902917113508823,5837783268324312,7835776524478503,3225311952434139,5382385798446586,7828169935679907,5895832484901855,5721477006488545,1218493212718052,2628172405339109,1003604339520487,5901491569554408,710702074885097,5431441927631852,8046300163691531,7010217343710194,6481473202254836,5631152529817086,1352160609039350,3137152034894839,7605951241085959,7164989253139235,9049515080971259,4598965588423676,722293426648061,8825466640626687,9205000812264960,5697213205902338,6713472473003011,5534659194614788,6115124798419973,4614452899393796,3986378616992776,8056998986768836,7005510023345166,3296733027876355,2416487876981782,9089712914953240,6550786585359385,1762610655392799,349028719686688,5410407323956257,7341468243293219,958100658847238,1444093295916070,2821173771007015,5733763879924777,5549340256007210,5045514218501163,8023673379877933,4747830554686512,3998169833174066,8433271531601207,8276120562988088,9193877350806585,3443445596080247,8627407222076476,6320589807975946,8989454648469690,8707351746158790,3264236253139808,2751762501956674,5618221979151589,203681749365828,5843589162988613,1198714409710662,4270236768990279,6461904958682184,6066628983258636,5254422287316042,6706822891435083,1827706971550796,5081559693751373,707881609491536,7175234504455251,536370281313365,5789470526829655,3478118922253400,9204898778215514,3860659836613723,6272539741942877,691345390335070,7885966832530527,5799169929687303,6703170493753507,5634200756581478,1904612041094248,4314463605683305,3050657670394988,8239007789166003,2692946478232686,4548844106347635,1429754831598711,5532371032110204,5656242240189566,7255736293454977,1201923806688389,5737819747251335,1707435039495020,5816431622288522,5327436067697804,1854205634475149,6924838137062138,7471313835489088,3477372292920469,8633915616588950,8056822452778137,6412604282565786,5371395644945563,6739449247691934,1414176118961312,4675416577872752,2678894595404962,4681347802657955,4642929249449124,6465376940651686,5355163685188775,2165529546028201,4642300514104491,8251430425576981,2915652954018674,3106213950354608,7989124166120625,2709504244085939,9086947713381317,252066984785089,3538165581411522,3667321313114615,6484799171884233,8779025257925124,7262904550618320,7828579332846801,6920262238296968,8195430913120764,4726140404430039,4829712030430426,14153953866972,7788140955512656,5624323809637604,7090655425918181,5999532841137382,2806519980979431,7271436928147097,7641149011621097,3340950947689706,9016505537047860,1926132634678510,5144698298692849,546164065662195,4134536521020660,7632246146561270,7583267197772175,74038459168000,641107448755458,4874552102679811,558042775876871,4533431995004168,3530409112408962,3364357241770500,8624803231639768,278733326677267,5587480124552468,5160813296022805,3211958659314968,5956814393210139,2389742247376157,4365845830006046,6865423270835487,1730039294522656,7245390814049569,165775859525851,1676454866384165,953665810281502,7579997906400558,2388215347115311,5243990781949236,7778242376660277,7793630550310452,1358579244594498,1101488161092931,1620031259080007,2573265589007689,5251137804957006,4736675534140754,5435952346920275,1617092744443221,491351740872022,3820879761536344,5177933115320548,737285872350554,6473208270541711,6600276475409756,6454518834885981,2714372506842463,3981831179400545,932850494993762,4712378922595685,8755269673292689,1914440433595752,1641089983968618,4053491830617452,4897995322094957,8439856359535984,3342245284836721,3880354508207474,1489451363832723,7997927686632820,241122160342392,4416554404345210,2054296195495292,8027919543870367,4216155500814681,6432760022634608,1714622304872683,7933530852685188,5810111625885063,6634309958759817,4381302788388235,8608545023475266,1279555857675662,4645765849675151,1550231513757074,5253507819402643,8940203725415513,600591328717038,948295644968342,1263454845138327,6585994302654032,2196343375000988,3985563206874525,7493427275101598,6442577163035243,8013136804806214,535207858763175,2854261768584775,7503299988977072,8056762268374946,7168011927713202,6027255478154675,4482913574745525,9094227515176374,8297940112995767,5143611800974777,7177213153792927,6048342298034668,2879373818131902,3579082431002047,2757323309544896,1025320808543681,6164626330908098,6616014162918987,2727812832720324,6625116976903621,3625508140676552,6382462470747594,7907759018393671,3084035078485458,8588051536712611,2372743496367694,7401456073412551,2616634596980188,8828387148821981,3997628487890399,5160280850986465,6623473256101348,8552753534924263,274590556780009,4732463522346476,5382000230430189,1998477089601007,4668159686211057,1703901176428019,3708834441688565,6917786062976504,3810301232641530,5949298890929661,682378608311893,5294244447090176,5543325982717441,6048696069460907,7200574432900616,6216991569638921,8669963879945106,6653641234118158,379546196932111,8599384645629456,403140146525716,7804639220954646,9214118934312474,7340589734056879,817586592577053,1366708832597534,1409847262410271,6296494473016864,6383637285500450,1817495674418724,1258793318479397,275971500045862,2596878791013927,5074966810818088,1978920445244970,7934580081256711,2510608592500269,1067983185606190,5655049275799089,7201810129155634,5610448159569460,2298238867011125,8410695177041462,4878021527664184,7330779027873018,1254128295015994,1078860204308030,4039410338010603,2482623368099400,1913600662533708,5823297781003855,5864184573097552,2264311704548945,198150720747092,4449596494083669,5305235037943383,6359340979549786,4063495873918555,3246697294708325,1385217761900128,5098072745473634,712731038957158,4479047370176102,5249551951296103,4059182143567470,1416587917260399,2608827870443121,2191364611044978,6572564384118388,8030059838637616,8987871293488745,4009161004119673,5359449379174011,5591790451357308,1330361906099837,1650230316004990,1784772569247654,8538242908462846,6343672986014656,645447987525251,5502559164175047,486265490723777,630364214064777,5681138218169994,2212403050935949,732923018198637,198745425311377,1130374619133587,2077787829812846,8770533729760919,465985186363032,305490507331225,8311636801812122,6529221370039707,1011476911093406,6285732132819909,4903761287280288,1964988242097826,7097671030398359,2617668832687783,959333863683755,8634847152484784,3723171514185392,7200083582363934,1363524787467961,2089708245382842,8487795279453660,6120838737196735,2976442785068738,1530589988320963,3617614834592033,779615418676936,8995709916468172,6571270406159991,7759387595896527,6521013291251408,8182220613023441,6843150021759950,8393384700018297,3876019808585426,8669788582541020,7748709205571294,4645673524754143,697007920085776,6979301401360240,512009256564452,4053536445298405,6420768584333030,8434059312887527,7048070466533097,8355628422654051,6160238469150443,2821630380364911,6359131291875055,3503669529048819,7467311812114164,8478663208295595,5165434085439222,5877209882195703,7382227805533944,6033842134782932,2971506492110589,4343512388990720,8305058659136742,8189792465090310,8584224210941703,5943107884119816,4268622608922377,5074917005293322,6211515649783564,1134387439662861,5663414960649998,1782243126118492,8141344768738665,6342815821002514,2815761914459923,325825011480340,5126432807221014,6458692679628568,235973718079257,2352305024071456,5129670435090548,1491339284969254,8237853336532778,1917684448950061,4033077355050802,384145771034419,6296246567696180,3877741827979061,6179435294357302,1856611341576500,7283289377470267,1022592760969020,364370377570112,6117501982439233,4651389007429259,1423812588009287,2142152550676297,2220361434429260,2590396816643043,2145959799093077,2705219710711638,534273229027159,6489033255188312,4742376384690009,287235602413402,4492064746880655,4989165585299292,3382472186492767,4230984653272929,5495802613626726,2767140593914855,4062165363816301,1359421309876078,2705864433772861,512095034472304,880140666453651,3981230329231220,8733082494174475,3200224173848444,3485881779807354,5350607072536896,7227792200493740,8074623235489430,1704227992008582,4937655825266574,4062833048713104,3816365485258643,7216636555425686,4987328522090392,4631399178205081,1993114647361435,1752237425666373,6882254789310368,5403026879838113,2621778646333349,4509942163404710,6762679243723761,2922790045644712,5592169556277163,9118583708980210,9158122827413423,2776960821491632,3600958015170888,4272872587622323,226478584100788,561648615159733,133723262232905,8415605375347426,4750432555366331,2274202609481663,1372319343409088,2187884102383553,4267679818840003,6957462180722630,6569937675348177,6518379776473035,409216536868813,6352585140303823,5175983772472312,3009434682718162,6257897089562580,5735648709769175,5633699448133931,7429623055050075,2064293855847055,7925745812094629,7747995092088801,908596032305122,7881406431669863,3437235157235686,1198995246413799,2688127442384874,4188696771466237,4864307046807536,1764379064039410,2768808177035338,3448882574906366,2751602179700727,7753003848398840,6524344435636218,4312094830203903,8571672154457415,8182197595338751,196943595719796,6220483379623939,6756882937346058,8997185109686288,7955318454479192,2561038353201174,6310829433223191,6658419114426031,6930260949382506,6391773698193439,4720874484627488,3865662733383713,6647926064969765,4665279371379337,945405117659178,1197052584294443,8147519520372780,2868522323703853,2937148454467631,2177907313080371,8595411468691806,3895984704452662,2870160011130935,2906834435045433,3376723944273980,5461338283276349,209751203903550,6465544723953729,4930916550703170,7340043839378443,5791990348052548,655470605760583,250095697000520,5957735845494455,2020692653897805,6601855257081935,63062872455249,3204487930116178,3234214354483283,1320747767035989,5929540668946520,6080284406151258,5366582156105895,5404166881572959,4041407131809888,6023326610651234,5925137807734883,2186740225046630,254216646064231,4867275443370088,8608027288283642,392231046903914,4940636132898924,1408460325763572,4427903481396382,586466427828337,516568356190323,3094467755243638,581652221884535,3964764469852280,3738260161820794,8381751588710308,2014365320149116,2439871342671998,4806112790116480,7848395833178243,5882966763763844,5159030994434181,8669846107519110,7444454692616328,121442034743433,3776548445649037,5188572703029391,4414680682231952,6703483232976579,5179482533001365,5112634865252502,8173796661637294,7057022068271471,9218887762868382,4378021793382085,7075234926295200,6085908669027355,5233460463237285,568847598647462,7296963278885227,3453366259447977,7690102812760786,5045553946294450,4432792393378163,2088685865466037,6910108161374390,8429995411040789,3811409122556088,2745950260259188,5628038122305723,2737352015607996,1321836545654474,2597487942498495,887416213699489,1776959861855265,2644809051928776,3707496274557129,9178819922262218,6314350203988343,7512943866560297,8953620233058510,8945881161758927,1992144694638800,5276801996617941,2525686846552279,3261852861167835,1816692258339037,3818435442894657,2502810553521189,8329440632174816,2803912664152290,5130295979813243,6514163409320165,8515807530118907,4606229433710828,7204957695867117,7320172438583534,6792529092821733,1491396950649214,1240014270494966,8278861539113211,7012285711153410,480923591768324,2786585776287980,8764681728588041,2328812866697482,2501114721532173,8972956741433614,3552585981982991,7912026326862274,2728141239074501,2397902183495955,6514912875839193,1736818373785881,8231760624875802,2380288783513883,2502547176159518,6620655027091743,571949557446944,8006429761410493,7328963764779298,1533331042335011,4923075981637924,8630659612932394,1212963725310253,6822812337010991,5502607066888496,4948257975269681,5554065255470131,5944507285698869,9141957555190070,7479818273221001,8764065831713081,4909666780084538,3814601593878843,4060418185886012,8023514914695562,7370965047270045,6420704734181697,5257048731539409,26225836652867,8194910604892898,103065452411205,6596358144293191,4673505504459081,6313690989951307,336264603695438,7171619534801655,8115281108629840,3537386228087121,3382899353090386,8033279585111699,8116284469344596,5054473823582552,4720507914746203,8402668919552348,4178598012791448,2976190078777697,3895614847547747,1498121138470631,4307275163400557,6670308899132306,3703432534358384,7078469136415089,3361168176380277,3187700846754167,8106313395075448,2561748145371513,4427084265814396,5289292161775997,3240589341035052,7191923409615233,5565237196454274,3281103653927300,9211593466345861,9146407491592434,8918088381495687,2544903742880138,3854851770133403,5126658673523675,4906531090233743,7325633647671696,1040828486154642,2651403981257107,2799065174145428,8487631103621526,9171500528675225,7370086941817241,5711377598675355,3087492010768797,3060807834040734,5204069195970975,655050975607202,259065739815323,5159814532125766,5424358964361638,4367062430529194,888853138930089,6314673938561454,5191333974309295,3261764092524977,354494993398194,5801887277711091,3297425250023860,3378520170527157,6180553959143862,2885773321271738,880782883912123,3214336589421733,2606986344954307,9113273094630594,2110902085495201,5679513304168905,7835003765029325,7376742618790352,853247296515519,5074690975168982,9123799839111639,1574532012407256,2927561244834265,4227216050825221,5794926054078941,5819471801645536,8459651982817762,8219511316984118,6935252308760875,92687232825829,3584270206597607,6787410548750826,3255364200166965,5134380170639854,1240857950845426,8917923977005650,176373157722615,7130095432169976,5620141636949076,6389910965591363,6994697368345286,5818837611444732,6250755978361342,62989172177407,7112995541286656,6608737036859911,5620114744224173,8061258638595160,5900136655321618,6064991718406675,1337840799934894,5289062414187032,3794909371398681,9195594511579674,3725743542626735,8242299218360860,113745079695901,1613021195237918,1495801158892063,2339288893323808,3738120091302437,327816460630572,2567485045013037,7221372622567982,2081733657033263,891512941017648,5318374506986033,5331366191069747,4826485591800374,6651118523367177,5364211221035576,5186253585316411,6229484944554558,8188431221062211,1327910164691524,1121476928371270,2292951284611656,2229897709119927,278314416765516,7885272047694845,4141210692876878,1176883168049743,5794818000827739,5700893878614609,4378563554540114,1822709551299155,7943745951005268,6891783549712982,8330685007868593,8860628593540879,3580545164081757,4865960783271013,7311464943828752,4238911544916578,5809834239490660,2291462833343471,2790380359252584,1418497840675433,6393519646100719,7662517556836976,9190330783726198,2036525306378871,4878428137847418,6478377776118395,8995601967413885,4683419654093440,3773652396157376,6012703535790722,5185546808294027,1822823318321809,1780614504413842,3619902468401603,4197068566428308,3508644205886101,5719115620547222,5306922386848408,4494882096675481,5020053593937007,3203275251001797,4646953154575008,3105507505635099,6792413675322021,951667484785319,2407003779136168,5901177538706090,925034320231083,2559348842658476,2700887978080943,7048035636470678,6959568644000873,7353163353684666,7426896161241788,7472019257096894,5586138407631552,2156273204492994,1877046233430723,3052711818033860,3537699901635269,5197957184912071,4878770339285859,8407623010024139,6196095377734348,3209843042008866,4405787757378254,5570514301057748,7219288020646613,4075827971496831,3076228314495706,2854189240941275,6558277727681246,973032676212517,8234748283681508,7486687739281190,3279967353273062,5744064178223847,4585212407675624,1880439743714428,875637268773611,4115254977559279,2722325304474352,3008793278097875,8617084182100725,8789972477755400,7014033772215031,9098924103289964,1204006946437887,1641261910092246,8113688473359156,1921839410248457,8456178589989642,3606009202043351,1753319999322157,4386945245608718,1528118796746541,1444328636054288,2525087894567698,8040865247656725,1302531878565831,3280718588607256,2411637985508122,3226350968699676,7379411090406173,4801455063956256,7685239449528795,428176620485412,1287721876945702,6567326754536231,4008200499788584,6632543691442303,7497294253193245,1963974044285741,4540517490195246,1608783972301616,1821545467083570,1117637118869299,5109849263897397,746146442443575,8686147340160348,4822017152252729,7085673252059963,8997679835201333,5088399158803264,7771387753954113,7550328340511554,3416506800864067,1176454200294217,5732657124211531,7422674895563234,6073256999680337,348709592857425,1500829068819282,4639322230717268,7242301505436503,843833154960217,3070515659864924,4420614985251677,2994635856837470,1126136412076896,2043751134526305,8030226775722164,3308272255564644,3191527662844773,1509764245945190,3046061750516583,7647776953629545,6826971414690667,7029089219939729,3353285390264808,5047717424266098,7481279370782517,7518728443624313,5539274457316220,2900392212298623,829215082511232,3746351631006593,270290109954946,4122404285741955,4219189144615813,624996000791431,9140072606595976,6397166152448908,6705920172030861,5662945992965008,3620913861065620,5359954429318297,824210709314456,9017486102904644,2011624212396954,111645593009052,2902106897593429,646859359288223,7821421021428640,4892019492617121,6990686063474738,5901945603521445,1920638608964519,5005655206365160,2033599907756973,3375305860152239,6439445551365960,1493172764933042,2980758603107288,750261755378616,1711430748395835,3764742027639738,889258298833851,8237285312003004,1574074845888330,6988105050389438,5924914388040639,3365455012821955,3623887620766663,6991303702870985,3975315328498635,4462274736198818,6212458269081421,495509067688440,64276138359764,839628865928149,2992326139542486,8214474109352921,8847113246964700,7193083432348154,5671341556464607,5781519829793760,4022619976432611,2249981159308260,704613615598565,8597110309055049,1847944678013928,6913755313306603,1807239731739628,3770515476806638,2068838741048307,7067002375470069,2548599764843511,3932150044118916,468965702630395,65374751095804,2249602065791998,4258406757989378,522686812683267,5497870751431684,3870313359178758,2639871663701000,4216812646005769,3865127582596106,3246175014157325,4949569039203342,6230132359035921,8142417686690835,4538489959971860,7795765216105646,5592596550581274,4918998038140079,796145971919901,399056832429087,1218118910966818,5631960060394533,6897023315344422,3537732013915177,1300191005277226,582903777360939,7553229476330540,68290366536750,2061406247648303,6221784729320496,7367910520837666,9177675038882868,3630870090251317,8580827827567672,6006746322605236,4896529588091962,1272678170655804,1891411741441085,6708586305803445,8104457620193120,3749302339501122,8112355436362819,4157024059685957,7729632848364869,4599368175156295,6797712533842747,9174453779715955,7163587590388813,6357952522058832,1909526229908561,2787751476701710,486233963461719,2940406876372059,3658565877464157,4364375153998943,6926375940756667,2980669167206246,2496450178481254,3409898930797673,3490089425031832,7312549391367275,806296021335149,5793032201731182,8013686264446792,61893737721540,2206705044419625,7084924489957225,3265599069912187,5981512332573820,2118719777766525,2028092506995839,8164189101849728,2834846015030691,1096393599253637,5580459852102791,4304767397493896,444799199542410,3715290632387725,6222005715008655,3785637574311058,7958093343849619,812662992174231,921461197372568,5262381080433860,6037330523713102,5407048085699741,7577502892358815,9162657662402416,3570962974178467,4264697658834085,1617799406943399,627980901809320,402096005184681,644233451568300,3696572662054062,5227528547215901,6828068151472121,4040109535816222,8184171986025654,2496169149562039,3512392853617850,86371700102346,1991518302436546,3623389055384771,102218374118596,8058597126505716,3236188021692416,6147969344208071,425016139545800,11909359238345,6990616949583951,2402883633446091,6933775061777612,4227406565932238,3532269969330025,6636614284967121,3935992150293714,1772096672090918,50104727403733,5508027555052762,752380201204955,3977526765223139,2971081451142372,5830449393892583,7199378247089385,4874442237028903,5662259120307439,782211558210804,447562175216886,5276654581316856,8783514168982777,4301864667413756,1936777924312318,2368067756850431,3577478318652672,8538615069661109,1071823590194434,1737161942793475,8972092359179524,6916694872653064,5285622476668169,6283568359144716,4626107421818126,6319370492181775,2454239338790171,5331983690038556,4862881658273056,7879309032258849,1316134297238818,2866426045431075,6914009748488070,2073081959677222,6797638342704423,6090049033207081,476543305153836,3623311997762861,8646112599997743,8835984840345284,8727732072774966,6520637846256951,1036051839089976,3884210767877343,9095165724646795,7504884673820497,5071144913239362,9095334854655299,1253487664790856,1373957482904905,6133010575981898,8903223719307831,3175480354929996,7135422504370061,3243426038414674,5474701967654227,7335723089952296,8830751129828696,868264228715865,3972249314819419,1995856776297821,5268477065133406,5639348851267197,48909363773328,7121774994062690,8850763049392730,3182381734821221,4245087746981222,3141595429338471,2929922528750140,8227870864964970,1536247214800235,3649902083538285,9827360636270,3423942270352751,4404841228172657,3903728321428850,78748462481299,5856361850502517,510013715512694,5381114863418745,7451621898550651,1242785748614525,8359322952830615,7833279982370177,9162467117204969,5392127540067719,203209821093258,1382262721380247,3507951310732685,5023370079665551,2339137161198992,8261194381333742,4705664377191831,4734925221494170,9158565198206954,3384618082368925,3284231304838562,4007708166749603,782061437439447,8702816209190812,1401302636494251,5192901775588783,19896537677234,3325119646498231,1468991077973434,1030895393832379,7902646156656062,8174873694141887,1048713143134795,1314117658154230,2373647749709254,7163962380123593,5012560757587405,3668587033722318,9077063050705849,5493432406801875,4804035573415382,5973687044832727,5109388050693592,2652804853137316,6880156199419354,2120699807530460,6697595825224414,5688037118180835,688545541914086,23605910022695,4034947180264938,194135329439211,6909858093661676,6197979595439598,7223863545861373,5569143338658794,2484342288776689,4811587266018806,4369897271443369,1761746186272248,4588293935460748,8443653099328767,8737891918593962,4532255089851902,6846221285124693,5722377786916352,6108004115480067,6375791325129302,4195173775080966,7311359197313333,5013042247466506,7694068356393559,1991348634942988,898580777860624,40218572226066,4047109566823956,598374221708823,5060390095027736,8820933644877337,2711186910117408,6960504278608475,3887749385551397,4634224387587624,5232941434017031,7054913304329775,3500435326500401,3352233016115123,8057639767042654,8837651604457637,2055016024735290,442591973670459,7677957132156478,5355560185713931,8212017425448516,9100645030428229,3114646127181382,43793556219708,4948362078387787,2164975995321932,2246938122911310,7224850990464594,5610743311466067,8534796634390100,5490238079073877,5285369596083798,122201134399068,7426540640299621,6862880448183904,4873950576344673,7580758954802788,7010984010448486,8709156071931496,3481690200369767,1082602727669357,1730732067651680,3558665168251496,2683473363500658,6380479562716435,2064886099213940,6916525208010358,3729894084465940,7078513289133690,2420811146722940,1635104694894209,1198390698049156,6281029807079046,3314585848315527,6166964034864165,89672639069360,2862323028524684,6327712956071874,2188464207625871,3901621164736146,8249692029321155,1573536860077718,3830767601188503,4089065441722008,4308403977977498,7118504981888667,2812195437313693,4749749475311262,4450329124339359,5206745821707936,8659942387154595,2612155976171462,2593610308845224,1683315416268457,5695023819325098,5881978542259883,960932293377710,7531872229534121,8028788776109521,1534988416789107,1357728225427124,6695344830742197,5737236045561527,2626800873995960,5713316648877754,6955934806736573,6955422484299455,2060243446693568,8552860962496254,115737415810754,5227693577993923,1549930132209350,6518893971281185,8779275574566228,1633092876932387,4740415919587019,382388555841229,6797704102510288,6268627571834577,7109762227801927,552586576467235,8633573095046870,6872277392527107,1310352708894425,2847765158248399,7341931577573085,7317305499123424,8105317118607074,6887831133514363,2120545962743078,5599187952313018,7401557254580860,5332906874304573,3058452972300925,3008049538563826,309930004702436,347103279054584,3790101851939617,8367783683555071,4821529701744384,234592609533697,2146304697827078,5827384504516360,6810670679916297,6514161347046018,6654661836084525,669324871794448,5157427059560231,8067449796270777,7201783081205525,2907134018879254,1949408565722905,5340399336685339,435498030169885,7247618253286021,1390970749419300,9127819268685605,1720423059488550,3261877189869354,7457797838110508,376839092720946,6853284472094512,774098970181425,1661188794482482,8876208803629098,1660894649253684,8451579537884271,4896789301067586,6481748365224587,4237056124092228,7832876269993798,5218379374034759,5413837013548872,236843264670000,2408290592390987,530230198647479,5376404666903137,5254760717811535,606373514772308,1511229016637271,4178845089922905,6794113567752027,9189353076129628,145909192769509,1571999188451168,6283918825488225,3689108737130470,4481963291148134,2949638367870824,895337508339561,5142411378982762,2253512237186925,391451038842736,7139731013184147,2144868408852341,7572327561166716,4902138107821949,8570550182346622,401450836033408,1733384950579075,6792720232546182,8470641384456073,3828691539263371,840735630786445,3340153188155373,4231725508165520,5952722664499864,4305093239526723,6174603405885332,1520084360986606,5118891275255703,6639403968528280,843657684090777,6534869227995119,8613501897899934,8736237907967904,7364769987444720,2027666104876964,859295129436070,6865966303346603,2618738943917999,5885261472694193,7955867666415539,8314501185448606,8986619285473548,2846502265088671,4720134702041970,5756700564455358,2528537991249857,2634780873162690,7658980115709891,9037066447749060,4059591121043401,2570231864983500,3813297674584014,5837224656797647,8473881900187600,3687809750138836,3160037394087894,5999553168146391,1802527769165785,5750787286073306,6227512847258959,2166671461449695,8802874110176533,2859050273122982,562386166575340,7772035854139368,4518951489634285,4142762503045102,1984148694499311,6390142326505457,1481095739047923,8080830261133301,8948555163232937,9173730254651385],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/58459874f43a5d202d46018eb8f06e4c",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001478155.1/GCA_001478155.1_Salmonella_enterica_CVM_N31414-SQ_v1.0_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JYVN01000001.1 Salmonella enterica subsp. enterica serovar Saintpaul strain CVM N31414 N31414_contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"58459874f43a5d202d46018eb8f06e4c\",\"mins\":[2774275877208064,7667242559123457,8350358619417537,4950630364168196,6218442386655281,33714525184007,4702787770122248,7149019143905290,8510668751457623,3074685262462990,7020060309848079,3449892164485139,9187081215549952,3666544173096981,3250417144311833,841835917180954,543614722584605,6652061552234527,3706321509175329,7567752747511843,312543422750757,7653629477826598,507824480366631,8653071968911400,7529431108581383,4793374837616684,7858600439742511,2133753812217904,8781245490012168,2468692223627314,5348637647970355,5675901661478964,7547465771229238,8981126744596535,1532400603127865,1086732900704315,8953029598707772,9099768538697754,1868792621846596,7376740728343905,4346228865634376,5150220836593737,7246535767870135,5510921714606156,2228149444509773,3589961342447695,5596152345821265,2653031016516963,4413466296205396,7699437898006542,5249095421169750,4610790027702363,5951872424226908,8737067013126132,8709868313103717,1087389546942560,8366619061999925,7677855636615267,3046934190174310,580002293616743,1951587606835307,8608539604335092,920936172225743,614117598728304,1172408151666801,3100798366208114,6024992530792467,675798713393268,5011655231045750,9108340639063401,5796818085355640,6441958794682489,8256658137195412,6903209903747195,1450361857089661,57032645582974,3478924149252223,7942717148176857,6504151754403971,6973052897427592,1118548040110219,7263612589514892,3048697703739533,1441515080396519,6862983510023455,6231973802160273,6295282781630610,2099869908435091,3220579656319124,42268254855319,2864493289873562,5014972273836187,4657657665306780,2996476514086938,1380881938284702,7023088342458394,936075973243044,6980401474429351,8845468004520102,5727664683118761,3981595702952107,132955391762604,9017113141433714,1329129177767965,650551306137778,2315390550597812,4321423939639326,7154164731192555,4458146038722747,7745030029657076,8982782956413118,5695311937183936,2920441813536962,391705246093507,7482507566493892,6278955061215429,5783001957613029,6417618610426813,4640032178831562,7434915897162538,6763953629155534,325405291561168,3452273148465362,132263687037143,308264836456665,7003909459631223,7023383739617500,6559427145941217,2421205544034530,1355348817854691,4466484413501668,6160078706462297,8258305578123496,4841648755024105,530049830420714,7323291230337063,1581957821534444,1969290438471037,1267056651886832,1307173302747377,2715288886305010,1184730021462259,4050405426855294,4424877218406646,4825560274542841,6066866288050474,5647799875933181,865865427378429,4924354120085758,1004510776971521,1807491613298946,2250624551235845,1156158785220870,266407656232894,1578988311843083,6078599883735308,428966940319106,1142084740630573,8593917991178512,3011652750270737,8126233796597123,2753451435856148,2313840849371415,512065760100633,8634023067414575,6030579112674681,52234290827550,8594519943042437,8162169518446571,3653439517311268,1297425988411687,2403422805758248,467825301594409,2512037354959146,1155664869794091,4279616639930668,2986434217500973,1350604536922416,5448727814881585,3927327479265331,7662007804002612,3021391463772469,3543270697087287,6218816824168760,657710388236602,6486366560624955,209777099018556,68860408343653,7130062024859969,7504910951010566,5775331168375108,2974326800372044,2207550833701200,3057984860864849,358472893305171,2784447813493077,619222914013241,297717739503960,4819275655426393,3907407941673306,5355663984124252,4628636252754269,6391180946272607,3854093525619041,3335603402944867,7797290409255270,6284824850235755,8474700753287847,6441120088371567,7823512286564722,3985105948242291,7109926634643828,2760225684802281,7664637125124473,6846520126108026,4808857808662907,6399750227607933,8131906424004990,5133649707032959,6738942595015040,4600723580223873,6774257339310466,4709752988127623,2629446602621321,2095969561760140,2288712094724493,5321859951799021,8039963334221208,3888981362831762,907806612451733,1750192293802390,8122845796864407,1348850511180527,3614784003117468,4334174176510365,3256840136970655,4578214137905572,2421660401136037,2347551799898535,3906101247312296,85776855069098,7517322524010345,4733576779141548,4697859476091309,940213145788847,8722358232019376,8620242805401399,1027644789920179,8538085435298228,8819224958325174,8706664033570889,222518498161084,5067407861301694,5375588973632245,2011206057509312,471720962580931,1801266594124228,3426137779937734,7535287209014689,5269082233635272,4645519556905036,1473107342860746,191913654223307,2748361177846220,2922225705398733,4038398964289998,3603904732963279,114474105471440,3464476123365841,2986301274485202,8987357365387731,1686827846148564,696310894365433,5943693569702025,2766426039513561,4147229481234906,5512520582316510,7983825673137081,5077605192575056,8559911958933986,6854997912162787,236258353390052,2758264492147173,8808723415326801,1046687379259881,930872963293674,8701922676152402,997142266790383,5851260883857904,8030581497893183,5890424155301971,8686094963147682,651565429694965,966058389463543,5416133514588666,4411291880649212,550993955825066,340293622497790,3583119003166805,9151998028335167,1404315542372867,996059339366916,5652894743945312,1143446724145671,7731244410036744,6286756015776266,6077713026503179,6056006527742477,8880291889525262,7502222724588047,5870545779999248,3344652105929233,2238799864410642,2151652043604739,6331266866147866,4691692328538650,8207992784237083,7289601377673757,3204064587711011,2521002441265700,5168095931742143,8444411046870449,6509084823900717,1209885410484782,5383196484416048,1882484501008945,5138493665624626,5367164803007027,8947749177960543,973973028467466,481393158509118,5602349287350848,181524099752032,233642889462339,1364896681673284,7938505541344069,5346354558319372,8635755689570890,3054114053513803,7323835294949964,2472140177142350,8482136702620239,5597608394555986,5575178316472916,5780427990733266,5284633093022294,4872114199741015,2196089090658907,2167397794914908,2812912326649274,8741228954923616,4818858557407842,4500383581868644,8319220080893367,7849893361469886,2336312330912359,634502016692842,6054476545831531,8659628277334637,216194601009774,8131742137712061,3363025795113585,2047416609915506,7962500072292833,414921167815285,7940050763817590,5760999445373559,52614158455417,1757137966165439,1724570649657981,5311467358931733,1374908026787264,8639849475287147,5917500673159812,6717874218244886,2942332323517062,5688939500257927,8029245432482408,2538368041894538,4945941309545239,3723147829305997,1874377628385936,1394352714119960,3596539956011666,1827317143739843,8820099366415694,2708478246412950,6277968515992345,2597332801557149,2288553949987486,2215385946845855,6742330448062576,6865362483176098,988496938263203,5506859514252597,4062422159663784,5647632053756586,7437035611972267,5450101883642541,7158705250108081,6518181527032499,4108765504467637,8887928089925461,8739850545337089,6373218733589181,6187691588069493,5356814370709962,8187312762512160,687776326775490,702823900590788,7398660690057199,6093675648766665,7034658147467979,6191577713985611,6951475785969129,3686767431353039,8655401750617715,4986078173842211,9095087195456217,5822885168302963,1869784025006811,6957996808897246,4596079601963743,4344411177177432,1649230538233296,3711510044373730,5106999170435195,8581032561058532,2520219393950437,6406337245512422,3992764934730471,7998852131324650,9153835391540153,3051141314798317,2478756357808879,5141715656196848,267301945004785,5258379395965686,2663375620636116,272472726557434,6786758668423932,1443836017558269,4940717972017918,5639677545229781,6251429141955328,4757830880039681,4928544909193986,3641283523318531,3398775252067078,533298712670983,1241020761522953,2300341877760778,566762934179287,876002947117836,9156501451643786,7766662540512045,8921779137787352,9070563492909842,6609712885261075,2354873927861014,452975526679,5915543436481327,1596039444300572,5470443723825951,7851706083775264,8747232437494561,5945995850982178,8233857915772379,7492539000721609,4071866172175144,9146065559510632,8328374178427690,5579773940218674,2791255665046318,4828795254633263,4126004650177328,3519667105339528,5573259592626994,6912588088828726,4796204597642039,2741131907953466,8077472501913055,798868643812160,1338203319067457,4833368247124802,983002602214213,2786959693398855,6575045633073992,5497217818944329,1798831352435531,9051254973685715,7803479018064013,7926284395672400,6533851262128977,1152732163576658,7189296086766420,2723240064279382,2545185923302231,6933973702869849,3668908087326863,2608945270502237,7183877607502686,5512724494869343,1695999327093601,50236427273058,6134002501714791,1016089704866664,1315177392989033,5470905645585259,1314202262917999,8166484168641595,2082210848335336,978007502893940,8931368535989257,5617027811771255,4839816082785144,3256915863896212,5020937611150203,8606478458482154,2600419368797054,6993747831354810,4520272609932160,7726114096026432,4222562474337154,8726171118783979,1487675705533317,3094912929248134,7342712596759431,3220227803063176,4822719302087561,2659429204105367,8944160785390402,548416513213326,7265214886344676,7253121883555476,2349567300653972,1750750618125209,3764174567576474,2671507657356187,3910093462762396,1159544424768413,2428308208534430,1984056380322543,3376326184166304,3820152327480226,4443544544104603,2316278106239908,2417982387782565,3648138902647718,8980657561393330,887173487123271,794562638783404,6060333225833389,8709412136190894,6071674841031599,6957628632032397,8730345418511159,5784390038203207,8851636510629363,4409092478354356,6861087335545377,8619431967474614,8862154917254818,8153523721307064,1466698071463910,3336605611099066,8825010094887869,872408159298493,2552156920112062,7464819275826111,8940528804162246,3632423301913419,2786299327542774,5981719669089222,2166596848387015,8601542577087432,4781270823064521,9094472384897995,7972238557078476,3235009758880719,4356116346651935,1234295557108690,8340405120926676,8524515802033657,7924878729171252,5531473759649956,4688507946681307,4447216729056223,871709577090019,298445339390949,4801531112670182,9211456307419623,8117664457475625,8597758869190197,8827959327845892,7488866651544602,6875490626292586,3829578382779381,859476197024761,3852446477775867,3906946772961810,1057165550396414,5869039030993919,7188087425274882,1891674251408388,2656900287153160,8613803161537489,6993319233956695,3602730159604748,8450685906052112,8606414419465233,7691162001838690,7542663025439330,2314307504759831,4392238843962392,630338109935108,8081470350595099,9082813718365212,8689212079665942,2860609327584288,7580535526937633,8789646288831522,672446842483748,8435536335704343,8349950503662631,1335790705245020,8035649242548660,1309199382606891,2242728861043335,3905319371256877,8272174740988976,5469193354794504,4789307833095218,1540130197193779,256280713643061,3174683943007286,6246951338862089,2557360395654201,1464620563891258,2973437097387069,7301288408412341,1328190663705664,8837176724567106,2090172305962053,3191909348848711,2477963716482120,7870326325810249,5757686916252746,2101773243126859,2552504797582412,6148493414424555,8389453148570702,279688560419919,8371918168690679,7506074640391648,9162821235325795,8329635154339491,4222079261377622,377384294933592,782861886403673,2413403248510042,1561817631880284,1052977930028126,4857733530797154,6426478573129761,4898743076889703,1000837698323562,468081270490220,5267119911036014,5493851236582511,3418771147354984,6666623700743282,6341241357210739,8713442385643074,3216456733926519,6122301952992377,5360393208252128,6395515818955903,6478693324941504,1963721387209859,7452288980348425,8806024658861065,3164368610071689,3691265711428748,2658354862584973,3931562626897038,5746299957933199,4305862497145412,4146651274744977,1017356947838098,4927935705740437,1243051266110614,3176775879189656,900162075620506,7988774328059035,7631417175467907,3617794764493981,6781921912881349,3149906855916704,7714814015739042,4639374453995035,71889932481702,8464230606165160,3682556719074844,891472737961131,5534376381355182,4921694918354095,7352387090567016,5042974264650611,5434055855875252,761680236803254,2623504852497591,4921672993346744,5183762809169081,7654755558089914,3161483059262653,6115813926307006,8505742885010293,4707276892107969,5491092211312058,8838522650569297,2790478672393416,5103163479418058,6634422979384183,6060785987921101,4352264832251086,3399529205359823,1662526682375377,5742398999278802,6617779675137235,590640550487252,5479017872466809,4021120871982297,2168780196898011,2777033380218076,2554492164353573,4056976335058144,5717435355128016,3036570263229307,2511121300096228,1819033329496004,3715410315993853,6601495938585833,4490613686183146,6515308128892139,6108740287943921,4691498178217202,5366511980242163,139974928528254,539261405611254,6477809343277687,7148786573473734,2215773100217593,7915173084167109,8186464642409343,2463078949094653,3953193440961791,6560210596812032,7003518955537280,3845889825453315,7276730619785672,2689640009000200,498851395814665,5848533301183754,1502873804653835,2855426982749452,4820100822807823,8519717240329489,7000171664606352,469614924858647,2022825651647770,493622072034587,5035827415762204,3266410232453338,5452936802972958,2053245964989727,2224033906722085,1667613825422631,6472412795471146,1322574410237227,2636674965853746,7941505729403885,4363884157567880,8661137121740842,767018547668276,5995058603178206,538922793293110,1787347884196140,8152589080251257,815968354379065,6781576977846677,6381788502875018,4776754467501375,3170965927716161,4413713496868162,3222734562379076,5574166681404743,7584009381496137,4113101791480618,6798921647281652,2085025958012239,7962448127673912,2844732429186386,6605125460456334,5895348954294085,9015801892982072,6985867287209862,7393605276057828,3608164999920857,7109073690596700,33325482419549,7218956333729120,3545289693836643,9070839045062886,2638566291887462,6258504989840744,7018227477992809,2523550622938475,26717466207597,3423751057249646,6523500184733040,5242524731693288,4884572939515250,8830186710233329,3516199574144375,3048716174910356,3682634219709818,7883983063356795,7252117632917738,6728186912397267,1101365094035008,1488182483494275,651603508020612,5046549108106629,6483170352495664,3601540529979628,8867481726778263,4800392856741260,1881937312843330,5689072710702478,1683568732190097,3514751407928722,8389710985342626,1755607425356697,5048928740443544,7055107521836441,7925066249065882,3713333490394523,8414742353659293,874306321245598,4911422457988513,5081755700618658,9153528767976556,7398737924419142,4453036770313639,5000726219244968,8737494948546981,149286569235882,2923577133860267,2227481306654124,7507799825498354,274792493025090,8761588900390205,4252928194432584,338031841936818,8764898673030582,7663983071755849,4348508294940088,4347967997023674,7534747515030431,8746961200897610,7407228233150,7289279608697077,1546197868676544,3575309775756192,8472338038043990,6752275299386821,5398417781896648,2788599090376268,5820795079153792,1883255014729975,1650213179831756,6773037966919117,7610846748320910,3964646268257743,4983272580863440,4467021060179409,8615754678904274,1157923615327699,5836521522128341,8929331168974294,3332708485383639,214928036955608,1552434896567887,4342464695952861,7761707923056094,707372040090533,2257557249238496,5762248554055137,8451615345698274,5029790084625891,6830305427912164,3703190419827622,3639144062502374,3613476809405927,3283628392613352,6438003314102524,3788885202019820,2893962944311549,7798316839661009,6644079646332403,2128808349279732,3010132198901238,25043460490743,8059924465784315,8849879366800893,9169586316342782,7242783762130432,6034836883940564,5752677422822918,6373948582236417,2182079777469960,5897682840872457,680843690051082,8974499613609559,6226695216805389,9122508703573518,1670685532400557,872035560183313,7936960859923987,6309949354548450,7093807022224918,2232134182671895,7684269187824380,2062747392960025,7054749859827913,3457020736027567,8095248902506015,3567103089776162,1980107848689187,2422170018448932,6115257530426917,3088193999304230,7712899375969523,7270114471530868,3320126178838059,229730930722351,6709796999637068,2896563856741938,2128604220796510,7602930519402038,4053125750769207,7637673616637016,1599652791162426,6910476868240956,9004110310310837,3715242293294658,7328014713968136,8095815471548891,6464916939101793,9256413976137,3822953193010763,3234017377726050,8983229070607583,6213635920042253,7172855744957357,7055332613012549,5575223360587346,6029898037139031,7081314123486808,6931880560750517,4741826496558684,5305547338904506,8907873749530206,772463224850015,1295640808143120,6739729734332304,1712021931808355,4945869523662436,8007402726123111,8181401738344044,2046649241302637,3920291554035311,4013295382001264,5086700650174065,4679903305102962,4472440995165812,2248842372953022,6369696787084918,5108252723876116,2329319645619834,1424416469948371,8804202034652798,6380302367008383,5589625793328768,8323188537780349,7012776745531010,9097501646935683,8148649347528399,4275358506759815,2435155270770394,3251586299885194,7694331219583255,445333053183634,8317888860350099,5466087268333204,620844115920533,6876242254722710,7553125738852633,1760823475619480,7186784560308682,4808187977606811,4586720274589343,4477351909189280,2949897356947056,1964369945540258,521191956194979,5544217123911333,1673050334832241,4565460888479401,1657896321967786,1966029162698412,3090491217254061,5529484739921582,3805307252880802,2644767429723826,6121314243708710,1209073613719220,4355265301924126,5236796214636844,5128354617677496,6636136791344825,1826096581138107,3985229469161557,2464279016109685,2106825039062720,8422121531860673,8391544360232643,9085846138920327,2896715108882117,5417091227105569,893983286249162,4407834142164683,9100335799808663,4446625192065314,561404979717838,7845899009334221,3465624308655825,7360163519993554,8913191152658132,4857157896107733,2700426176284281,8967579758163370,4114752204367579,408986989610263,8482767251781347,4140826588067556,6897277844240101,8504163723803469,6691692128442631,3317863302006505,7552727705593578,4842591110428967,7164899059689198,9054144529922416,533509815207667,393086103742197,4688264423161,1697392112133883,6503044550002428,5033731931457277,6100220424144639,8690713741256448,8033033516541697,5841693726925099,5339962295240453,4461391563314950,1991853601244936,772117172191532,6557797094194919,4736256438204172,2874501914281741,3539105648775469,9077342842191693,5829322722346769,4448483657553682,1772093084911379,8268120286951189,2979663117362966,3646436239392368,8653219328845594,5099977234687772,7127777288072154,4902303102066309,1701932527531808,1233591354898210,8987055669077026,8041472400510418,8778551257714310,1408255433402150,7238110203594535,1240066836596521,8123269404845704,6006913746245419,4608157651699500,4027944642979629,6330150343472776,2847759945615154,8084343777403337,6429776601063579,4176217626351413,247623028684598,4978929370052407,3581632945383224,7897604301570356,2022807142803258,5267795467916255,7996209448671036,8856868821143735,4704893258154293,4039079064811328,3857916781078337,990324661733186,5149732944166539,4674561936136004,192766642657093,8807413122725702,4523652479788873,2325087454635850,646710295549771,3208220820035404,1790960854784994,3493536856844113,630260428662610,3619704864651091,4058056754018132,3778361534003029,6792154760582998,8769193780307802,6379665254958942,2250602223713936,6593190275204963,5239204143814500,5065246861948993,6107690259992754,537468527651132,8837658774396113,1309029966022507,7527103004718958,8210708271458159,807543998326640,1694720909238071,7573883049879410,6690127582099317,7850884954593142,2273838361048952,5681619792840340,3913081756628859,8536156668385148,3132925813753493,7135138689866048,1965371690703851,859452633241476,8947182068660101,1969983725987718,6596611524012353,8350554160662540,846243213424522,3114442623444875,4621666960222095,4134027119716240,2864322284312465,5719996115521992,960739989321619,3768676024248212,3852616135219093,5876766461540676,6363344116971418,8776679386799087,3785212094982044,7709178769450911,4317306224113568,3739988142229409,4381296021063586,2240124539485851,6615561519443270,3693819340408742,8178733033453226,4557177739372456,4814106041388700,3977407856338858,5650354964412333,1099516733503408,6419511443364168,1254267278784439,7273678165458788,6766743848312804,3054458686924734,3585145642497983,6335082407270336,8110724879183071,4865933837871042,1771922784188747,252133240330180,3292641942136774,6723040977360545,9152864094315730,213713219536841,2618814530189258,5334160299944951,5185320825952205,3239259912923469,653591075397283,1044805198452692,6609894173665238,6448080537816057,9043503077340766,3732910321727453,7956813340698590,4092171006515167,2388146285723984,7422386338265058,721916212680676,9204653125568485,502402209470438,1537318871513063,2248705338656745,1228762990421671,7089899230480365,2436938215679983,3318360794093556,1262212902098933,6572476717303798,6199668653848567,2209075498903544,7070606820030457,6371559945058298,3924585430480893,6757340653265237,8804008150624457,6345871007214592,6514010774400683,2078384878950405,3909344174680070,5254879555438599,3270023758649356,788509388883983,596173146403160,126590754007058,2591419040606230,2712603419187223,7771022354996166,3673077083113497,4259896889456666,1465483891283631,6915139761246554,2838365919078430,3495603548514335,7368375630518306,1542567626737699,3194265969334309,647747654678567,7594951672920104,6379431794846044,6885791500404778,542332090869805,5231131468531758,6530965376346159,3385570734241840,894273844724744,7786927314188338,2792868309026867,5456567116912692,8080443739596853,7681344302491298,1992590317054008,2239467549997113,8355334793566268,3824555173615679,3640538450647105,8245057303801526,56608669681734,3563816715010681,2226956289459212,6839209387051082,841688988907595,2746759931082828,107673971120208,8152503429396796,3929296231371107,3214216908011605,5815478242285654,5541610094812070,5469901770803288,2293884384790617,6871151417497801,2426041499756635,4874904316303455,7661250562885728,6069728631273571,6709366269492825,5258637824211051,7679690893620708,5416197545678960,6674461591337074,8972197871214536,4642336363096181,4799176339216502,4015601695991929,5494529873852538,299884187846779,6957668849370848,5949749411465342,567656662714496,2925276112783490,4188529001987777,765588721019016,1212441472686217,6688461578349663,1431039489927307,3889415131871372,3453110641633421,3851755875379342,1286470239099023,365054728111128,563381985605783,240576739383448,3711982467758233,6519082957172139,7784968786531604,4505213965585434,5470776088650231,6762326548171120,7916022112258210,8815772855220387,2856215005730980,3116624167209125,1911565472123049,3717724958857386,8655614835185430,7922690070335176,8085875745540274,8098156786893539,6255191827925364,9159935469771807,2053365821274300,2792081300588736,175734808470560,7537762956503496,6442802221397837,1812588590115017,6714997208484043,2142322034346189,5814708524050639,4868153009834195,1348731958405334,3636429086234839,26691099330778,5128132925851867,6726714915592413,3470063526811870,1758820441692384,2966160482072802,7908323244564859,8540956756629616,6653260262418662,7337473510742247,4372807575288040,2756050571589868,6441389764561135,3113800241694960,567624656677105,4061335508363510,1493537590446327,6493604753066232,1298903626955002,6445941215377981,7300241399064277,6653627224608380,5686411270473615,6522369232711339,4018963969520001,901382993377545,8905791761032295,5175614411331853,8810441169180879,911058900388112,1903633811736849,5453831423617298,9001919699228952,4860977024514330,2376784102009115,585134325225756,3706322573598426,3964901725763870,2959725902522655,2446507305564449,832107770321186,5276875870660899,3690577712539941,3051864621504807,8614894794172713,1559964211831175,2303363406350636,7459423677113394,8948072973617457,1839335770655027,4209840609298741,825220776753545,5928712121912639,4742902463605051,3190205801810236,7405884626987327,6622713792518813,1185710905047361,495957856627012,1654921486394422,263527479847239,636508945398088,7216881382848841,8770967297390831,1297876388792651,3173983418288461,7199375808522574,1559264567765389,3567542418389334,2587738075083833,4144480892479833,2677254289049948,6715524253711493,3992050605562209,5342369863289186,6248287327636539,875588512434532,7258410441613030,1940437104961894,784658345687401,1274201991285098,291439063140715,6422898244524400,483348184811890,4266642012678516,3341507944806773,7706045317739626,8514999855516023,6111209949288422,8222148338293114,5275550779992443,8111086886878733,1947551580498301,1093531385153918,4922365850573183,7442420044879452,846945486218550,594684579641732,5849647596177798,2248768132221319,4723936623815049,2534332855884172,2560549024704909,6311380195694991,8802278723304036,7291735679359379,4197490382637460,7122424513468821,5886067841362327,3879154493415105,4008786844260763,4640116648921500,3347474192042397,3488929672001950,6023108566828101,1506067859087088,848721535216037,8535668077465329,5197256242571688,6285124191289756,2337907999791530,2577254551016519,1203355550243244,6786094656899502,5690622287583663,1552476916476336,3830459211737521,7056074749026035,2636984404527540,7768299711510965,3198248464791992,1351499112233401,7417630278575092,5246312295995838,5643240862239167,1795544633412032,7798237498748139,2869975832904779,8203115445807557,4666726824311240,3996843992381897,3159701697063371,7069475331127756,2205124924643789,7372960858712526,555141025967864,1778242509294034,8617033189149140,625311775975897,7015790396824026,70265923824091,7447238555191773,2682052126726623,5264418991348195,542505085303269,8459996714603601,680043350419944,8126517757397481,3641000276525479,1421602687768317,6190818471786992,8171214827612584,2041544847788532,8831761489037813,2875834899487222,8918394810395049,1727169400580604,5530171697910186,4968831734237696,8335957492069703,3131722725231109,3866479640349190,544879778970120,2087057658268076,734190807951162,5500803861051616,5032779958839823,7292063695995992,1362058257287698,5925563678702100,1597876603787798,8828143227951639,6084563426234799,6452537248160284,3087239843093021,797327697349150,7706587482040069,2696760442509857,1563338518526499,557432720008966,6295767261956811,8743848043555249,9075893912813160,29007262853675,3647883477260844,6661782660729392,2955820541246002,4321577573481013,4702122660497976,6375221759576633,5399402544327226,6488269287269999,1283246518020669,1868723269585470,3842524200319551,4209642825718337,7175491926800962,6708416662777611,1090196750293572,5109677343119942,3407469374552648,237579024980554,4517013077908045,6600018023525827,248048851597904,7195380304001617,5538930468178514,7829090135300691,794814110431829,7494778308604140,6559455690013113,8412272893848153,8715299787358795,221692388620892,2245632752540773,7139801138402237,905695458785890,2784035315903076,1011312576265135,7078612381736358,1875102701304424,9168492783108540,6317547516011623,6905166401787666,5654324650715759,4211942889996803,53585049435959,7094303869460066,8485871005645430,2032479863581303,5962973093775993,261926228597370,8724056119315067,4521787215851460,5523040514984573,3834556389313150,6752249944660607,6270320637418112,7184391422245312,7029583296572034,8207757598399229,1290448240297750,8310670263581582,215261577153159,4363046466308744,8784678740460652,5502883744189066,744890819944215,6275495927115543,6848628917275278,6477049641020525,2656519453145744,6571088833411729,5891437972729218,6889719627880899,8857205691058837,5238794761305486,7868000644939545,3484996857019032,3241824526826137,3015999469947546,8832940841975813,3328578741406365,9064718485162654,6698810453519007,6523600333708400,3704734631525026,4483026856942244,8552151938292389,7551743307844527,2827861308312231,996104492968617,3795949646809772,7566332212591730,1716991140670126,7431910899758877,1831872852277937,7803130107673651,5703709372275379,5429272783895221,2596002053130697,5146953896353278,349142041262778,4657303421528765,3491525351451326,1235260208192629,4552055457790656,7510650862213406,3422892041732555,3893262846185781,4138536396356294,1693196097063625,8974838263099303,2731215567239883,1285480463289037,8860608301697182,7714280745588975,8610160831974098,2578629647575763,1440431595780821,9110095193161019,1122470271769306,3028386732526301,661151481445087,8706805767408593,5294275793738467,5999096583673638,6401418255272678,5900769690102225,3743924128819945,6840788981488362,3767053759204075,4906984463589842,1850587137350384,763881411459828,1669031183858421,5740302599832666,1782862355208953,241331235101436,324683648834301,4653457161722623,1707953079627563,6673075227376569,6747497791470341,8147439718750982,6102947123786133,3936163747396361,3557677947017994,4654119389281036,6754404320407497,2419947851556653,5790210632108817,633106053221139,4242808956136212,2587905060653845,4282459337575190,5121175980137239,5015838702185240,1324103847897881,6749100151675674,9066566268652315,1932222325929782,7985291668736797,7309197632105246,5610894564793119,7334034694511394,79007152802595,5415639580687141,9219999120210726,6061877385427753,1523358345046826,6379936890657579,3392400392379181,3958671937493810,2918988711013171,3680468211604278,6380356678908729,928514187017019,1678764707882070,8570202458542052,6585370552089406,4485742654401343,7685708138618899,8423600816339777,7006477861972802,6127381265791812,3541206393355077,4112415658539847,427004963382412,9154250055621450,4989760574896971,4097782020987724,449764345883469,5755148248369999,258450410981176,4924746861189970,1359819759430484,4676040385473365,610038292978519,6774317987171160,1294946232029668,1606637797276508,2997143991168826,6615289970508798,3332795770415969,8805606348729187,6813038456700049,6864778197236585,3496300154555242,4485906862390123,225988241742700,7653418342145170,5192118225382254,5815273360046959,8641762511504660,7203659442744178,1577776738470771,9013710678219636,7851400534529764,6930820220468086,3912454320707430,4118822455425912,7353494121470841,6177810348460997,7675181146707775,7561213934209917,810343061699454,8936010286291840,3826303079451522,7823876673358724,4044780944845701,8136858931350786,2178953385631553,2370614328806281,591788159794058,2433898361486487,21624830622604,3071602639223693,2771552160193422,7093690531543956,7709598228405288,8608921512439620,8400496262388207,7353444552170398,409309025941317,3703468221782944,1087749313592225,1566846942448795,8794101093156637,623506968345510,876228623607351,1067202862918570,1156697244421036,4356857373629357,1842270257068974,2891255687486383,5329499696528308,6289086425975736,1441066174626745,7101997526506427,7416259984048279,5046578576500007,1034714675772354,4449933657098742,7269394299128774,6691524686203850,2480739659693003,5351105988451490,2937059272948686,174025380063053,1362248611617744,613417479797713,8221340797434836,8558510186481575,4968846076050390,4538817020914650,2586260151843803,4337747795659740,6793189454736349,6848715154045918,8762249175692665,7796793055394784,7616301840414056,1246215536036834,2863072203533283,6369108943510500,7120044475317248,575477822707537,1853236189207528,2064909134066172,8513165716478954,2431286987570155,8125652386012140,4605274132618221,8243242683317231,3309352340065264,7442703941164017,95299597556722,595994403097589,251991505562615,4698634642103289,2224695395187707,2568062394166268,2797465100360701,5708433471903573,5461642314091520,2781804830206464,9187019953255223,7888121911941436,2777393684220933,4251604574383111,6227845223521288,7754480598850732,6274217669696266,7184353675041803,7517201761811469,4303267609140241,3156944276864018,2651564593503251,7209752984738792,6385224218438696,3901242407296026,512954021885103,6692231253400604,1688875701468190,8572029258984479,6424427348334342,192709735873570,12583140977701,7367130656735478,992187272879143,3816165944388444,9018176141326926,1453655841397804,5502372834475056,681137258208307,6908803407338552,2056703777883938,5162128741563452,4614553361755198,4805170878549058,7542030449609795,7700168234265668,1327943657339973,7464474036447073,5160186787630153,4115262509640779,942485145467980,6703755820477520,7007387281304657,2434095161834578,7627950611472227,5216364370234453,9204064322864965,5207312869678167,7136741540824068,4681292948524900,8642820142817957,165543739419740,1882698016124090,2758523067989087,8587038146219107,4061806001348454,8720638795865190,6481431658765416,6727004380413034,1738440261762156,2410193198547474,6643780079885422,5151532885793903,816028610755696,6044345273651048,6053610728696946,1982586379525235,4975515712535669,7949008728069323,4367683948641399,5972620021734976,6854210870993113,5038483687607420,5370043587824765,7768428034740650,3571914698415233,1222138433469570,1053675280809091,9063105580508001,1757565792160901,906300425133190,7175986637786248,4719633696471916,3679862672968843,1453972637465741,3264904395902094,8993294618434703,13661764940876,1894167140580497,2420917941133598,8656159261191315,8589163151539348,5492219873251182,2619373286444183,7093451698519193,2742595427327131,5308248343070399,7870541081652383,4931290167299232,8492953013231472,1624628444294306,6341965661965475,7338650740165796,9202342528028639,1412974396456104,7418143099730460,4570022519684266,8973663052281642,7348159461862117,8631410209135790,9221614859934895,322374640880817,7418545461981080,6316214771743926,7034598571277497,440709743422650,5272267761249467,8421898045016155,5430905738554561,3453874242043075,8888762566276982,5177645688724679,7208521497656522,8722871821014166,4636391883959503,6312287393610960,5132931438341329,794781823196370,9158339605241045,2104934336867542,6510543560293367,5909444756462808,1743355317378265,701724138761434,1174120040580303,7709174679675429,4123245038427362,1861632565100411,8813421552282852,897210929716453,1838459307412711,4819586886008041,3213204488527083,6643267600130695,3260711832345837,7406928605138813,1220365941128437,7261042603818231,2320417142562041,2562695284156226,8338135692152061,6754270791711259,5561266129640706,5858137335987460,8151705046617302,8373475303419144,9066127881272585,8075764452631108,7561540955954449,7241666060379016,4701171408325907,7373930253602068,3106839325465877,757680585356556,97218239528215,6895359992447771,6998027608751386,7933058750323995,3028497672363292,184817019104543,2145015248174370,3094465726897443,6188354740509988,6404007857589541,3273900987415846,4118511580192039,4404284603714856,6527117351949532,7047595546483882,6882505380506927,1470755860614448,7910149252996779,9171677907409827,234600052096307,4885094221069620,4686931442621749,7235665393171766,2368011617017144,4923183834885434,1418934958083387,8797751287262526,3978904572590945,4328667611110720,3362713583969504,1298752578125122,5497711469317443,1306995003891012,3770662451658053,2524342919871814,5012702507887943,190736261057864,1930856731716937,8087395110689234,4733582183058764,3813095621360973,5921953278172494,7944623598202083,532759209565525,8641319291096072,7874759383292473,9201688738663555,9028049747389668,5454684516298074,2262432740290447,4020011947109724,7531348323445055,1263700249378704,3167854745169251,7953805352283492,4170096552906085,8487042812984679,9135012323843432,6165527512231273,6582013969288614,3743961606118764,7391014372814738,4394433086984765,7047168781622413,8959146824297842,8400820012121461,5747091809356351,2032666380553597,2070212227283419,9001142642554773,4980337745317250,6704524459941099,6179708756839812,4907229094236054,5308263417695623,6414820039056777,8936927474269578,4702819983039883,5595345021287820,8678249936640578,4166112837037454,4595584729410959,1262772867194256,338763742866833,7698319053897106,3895678637933123,4303018541751702,6439808764488766,2812252754570649,7026726828875162,1455195525717914,7266068570217069,9223118495385181,9081149777243962,5664558385331622,4005664091823528,603723544886697,1089622775373227,7181642424816882,5405913942736302,8998721014763421,5326318714572209,9054561477373362,4640741145730483,6144407359025882,6594829218051567,1682428789198264,642426740977084,4895792177544637,8964935542801558,4458190157075701,446704464014785,2310932547259842,775420119408067,4932159476088261,32720583388614,3506022595778465,8411470358550395,8420355092097573,993037319900623,8016695445298640,7005843561704913,7087909241175960,3164673918778835,4762036958961108,2055835598859733,7488903677008205,8274609046761918,8557903874342361,5332383884406234,2042373086301659,6683574890925532,2731163567615454,9123221996191199,6275239700614624,2756978422852176,7221145385089366,4546705708781029,1731917309877734,4265012663107047,3636743414390248,3589424049233148,8297307844110870,638036155469291,8386000389457803,1978166079468797,1821788769451504,7934195266143871,3026526344056310,7139924508958199,7605883822722552,1667659350277625,7530336652429424,7922407005390658,3987667524054526,8806756602634837,5734928668142529,2582152908189187,1012327316209156,7440207515271509,4730025346698760,1520670471814665,6902072325844491,7834782129196290,2446448248831917,4243682561007121,7676374671344503,6119824679149076,9097312802000814,8634687974557524,170159509392921,5458247778803631,4062218697567772,3976857796177437,8360121306811935,2206896186809891,1376657765645860,5057828800941605,6798561494695857,1030310028192604,1723841151044188,6249722101136938,1764333831986731,8795656055737608,8663660378956021,575808750009907,4379186958081588,9036021558466487,7191616510828090,5657379649166907,4193814242680380,6496286175436349,2100350594100799,2963931588390464,8006529920058635,4761478884777542,4775245094784584,1307085209765132,1886288263519818,8541800817380939,4856314515111500,3819766550436450,5097795614465614,4531440829718095,7435712779845200,3081080275697234,8871264898674617,8427770585341528,676744876192356,80848488066650,6735424671204623,4916171623648862,291482944990815,5281919610588769,4431596131499618,988828717782250,3546619208322660,9039455019639398,3446677273681510,8600643100028520,2122484177682025,7891129803677291,5924457669303916,5706710376586861,1300654295630339,330786077326961,6091016057941618,3827052685028979,2175217154575989,5846305864504171,5359003787251321,2623306480537211,638246481120892,7588725161655933,8229191216975486,983924183576191,6282996103773824,3390516959981186,1710000774639235,804790373657878,4321959984561798,1391227832669463,1181330355248781,5858974847233679,4198749734735504,2734910637948562,8936252556427203,8504376026631449,3237196097785497,2415837673410203,2035006005800604,6315521663569565,2754188550532767,7643340360527520,1441494353546914,26287827857059,4317455470726821,7022747690851053,5125200885148273,1026377179139752,608678462596380,3761600094219947,7425176196366962,1256640649862830,5723360613174961,8954332891131570,1725652218955200,4277335625461429,5571141421542684,1789653192241452,3171002127912632,4359180529426105,3441473387278010,490487552496927,1787249939386045,5947131705892542,112689236447861,4059949927386817,7659188190363330,8121748993658563,5673215187041988,3554990670675653,141395857477320,1297804887977673,2141455560052427,5422524323675854,3537635261353679,6154044390055632,7580133915541201,7971077281492691,5526367787462356,7927404692991950,4364899301748438,4453708423537273,4308344126385880,2948428341853914,8762439273176031,7339638253436636,7345475783167709,7189924519128802,6101227314106083,5437966500200164,5293195954577125,2179376799342310,3329572358479591,79217249615595,3118987320689108,161703652773613,4935736916954862,4376558150464446,5183848285932840,3501532163673843,969964248239860,210254306639605,9084508042341673,3393383322623736,7482976125434495,2930455752163069,1832185633140479,5181701176680192,2213538970853121,7561407903356217,6831544618942212,2203909323521797,8066174717787910,6308643144269576,5843184425930506,3946907942490071,9209028692049677,5841490529816334,8594653622195374,898690320965592,3156079150759700,1362615270285077,3685798503034647,6807447181351900,5525188320743193,5972151396851482,3003977055285020,4135239890329373,4837764499459870,5238815189355141,7794594152009504,8329462250333934,2193568903298850,7195267284487971,6134118650839686,8346616019299633,3635554613849897,791032629477162,1033582737816199,8109479692590287,6857270928428849,7572244253536050,8823940150738227,778027318611764,5450391152627428,382444380241718,4545598467907383,8699554965830224,3684105766338362,1504556618186555,4280786765307709,1251571050577727,7355649824186955,4269687397535553,5150647899004738,5431563550691979,6173816214542952,116589162149174,8512426517781780,8962006973175777,7949151372371811,8519953483517770,2141853098602315,4395443838578509,1777196050722638,5815850934161233,9213884018144637,8842166304411478,4632328774704983,2428235422771172,1425717323808606,7016013522095967,8580785194524512,8031001385329962,894657479102307,2329248970108772,1271418044329829,3977321645404006,2179518653603688,422511308312425,2772152389676907,6639422860394525,7038403765708000,2318304048316270,7682920159884917,10488238202736,3723937100369777,2096898035052402,8229225330563731,161079824404340,1274620100427637,5855779389325177,3085149344263487,8961340170563452,7007797886193533,1085109307207553,542070582267778,1978631044820971,4470924445011845,5716179479281542,352594963991873,9004420450410376,6687712988946313,9091339809357706,7040022769434507,6463800501988731,8817294598954894,5036798356324239,3951151769940548,330922710986642,7124671579803539,4596977725284244,6929844442427285,5057533782544278,2989337599848344,8331672385720217,5099225536774042,5185292997025691,4157036191099546,5622912960534679,560595737354143,299338513289120,4119496559112097,912864977850274,4039545094061988,216567535951781,3895255234408358,6347233558867953,4017557037637544,1379755657289642,6494693793629511,7285281755504556,4164584345108397,6973420924260270,1756687539404719,6156443877859095,2362988176133448,8688098264865867,3990411502493753,8905242881675190,8644602754274633,711625844209652,4957775544318088,8348394730450875,3917053492559807,5440312139134345,2003627071083851,3133091751006148,1754953295925189,918636738293702,8562467736125383,5343561945915586,3701757881196489,4363130678030282,1935543794859979,6999874369989282,4411670213533646,36290201018319,1188886142685137,1949512905760723,755903919173589,8078731081382741,4519916921675735,3234906712772568,5312394801483738,6317814990861647,7501209511493598,8026239390152057,4022759826374625,8752406983647202,963704366062509,2135660434272230,3148414190718951,2437024342700008,7813696175579114,4041186263318507,3837588723521533,8796314743239171,5464815035281393,7660657009844212,4859896893792245,3085856755960489,3490271597518843,7516778771034108,7787062065373181,6323466335563774],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/589cddfc349d8950af5bbd90f5db7060",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000774815.1/GCA_000774815.1_BPN_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KN323057.1 Burkholderia pseudomallei MSHR2451 genomic scaffold scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"589cddfc349d8950af5bbd90f5db7060\",\"mins\":[7746553504251904,4859505372020745,2717509936750603,8187669162330803,7070312202917447,8862655047638384,5399166381228052,665667000179374,1601995370405911,3472111535824920,2030963875831833,5851439248670746,8870436874936348,5153116669239329,8473644107200481,309534868643876,9101386872414246,2858888550080556,4713975900782637,6898819322740783,3281686287409203,1091418020167733,6039615470788663,3349204288110648,8119188477042745,2535093790310459,7143291319047693,8149401278038082,5595151229927491,7903214845821000,7773611234009163,8567341077128547,6127715860488279,5162993710497880,1480995134431321,5521343622307934,6664704707379295,5629909614338144,1069819280842849,2233318294585444,5006028136915046,3777712339501160,5367885602013289,3562022201090155,7214682490437741,1613924864385134,8807240960191548,3456585573703792,7161438631903346,4431976967250036,6465559202126526,493133997940857,3296344574230650,393297268334717,3224183994278016,6230747701436548,1328395305107592,3257696334676105,7499941074075788,4833310481178766,8312505234982403,7692595702390808,6426701193412755,6994561849213077,8711183162630295,5696991050342552,2473958480755396,2600001938563227,4505803106156570,8968940591151813,2836455211442336,3780686974107810,931582819827875,3654345070182564,1217052589015205,5776872417583270,1969048551735465,125926274736298,5240646694805679,6228501984272560,7960146002849785,6350303070560439,1835966793416888,4982372355367097,3175736049205434,3290760634419914,6162416284713151,6786873677693122,6403364525588677,3493147636809926,6856122472792097,3883650267652299,4525405676847309,4248968737104079,5848050358191480,3588037191270610,4021800632803542,4241674264879140,7314114970632410,2940426837469903,3245133312884956,4981109903466721,1399956061077732,339401912748753,6060069874852073,2563159167402223,7225201810448625,2893067736441074,3388851662170835,379542628450548,7244321710326005,908938666156281,2152813028565242,6728257185841404,7935468203612912,4321468431089918,2171212294521089,2664064637985027,6095911134241029,4481633112932616,4710445192061193,3761145753051405,3143943789863185,397548190433554,2098000573989139,989155982622998,4879638724365017,3079877184323864,3376329319555358,2918064227189023,5837580770320673,1373209314402594,891217191944483,5309264978370853,8988094890762534,2152530276843816,6914156956401962,318125183968495,7341349627677447,2554491015364914,5475058498945336,3656741016658233,3072858527719738,8870074993926459,3108669233676604,7739095147111818,7185865033367874,4643948763977806,5402418125431109,358814624234209,3796009539567946,6420829914906955,1155840539263310,153107342410067,1553088056123734,7904793672573273,1770758189867356,8781464801059167,806742844072288,6396790377562467,6781071974769000,5883396419711036,1993799498604906,8431829107786094,4455692381072104,4399096904941940,1122920504975733,6375177398436216,1842778008174969,4606560210321786,7130768395583869,863308814693784,9016539823710599,5011695708324232,2950965244756362,2740216180711819,8827847575847309,7386509178184078,7839211456604909,2574877696852368,2925007913230737,7379271804412310,7179343568142746,1250488172954013,7735538834227617,1459423074034082,3597953945182627,754549001789861,2555438499520936,8242717186890929,9046131501293994,7617325997494343,4385047317086641,1127576170193330,7957233805484467,8473570781954487,8668696188617145,7252373173419312,5978278318367165,5821063610024384,8278106250822087,7057569090413003,2383206941213133,1869537946182094,3308836348993999,5325623937507792,5556956717165304,6675092738982354,4942828338733523,6088773091746262,1148764263006680,8922119251075549,4217887666627039,9110752922768371,774515346711010,6406765967057380,9160106585748431,7138341469220945,2159646441611753,7007811383845362,4134320342622708,2663075449389560,4812323753075193,1038767408759294,1365395808854527,4479361592738304,328115653313030,1344346425528742,4859877392032264,8798202886734346,6700461993296395,451579383175938,8403782748774926,6570025689776657,1983281738457618,5497434623730195,728923330044438,2625898732814871,2358930838561304,3523046914818587,2142240532292127,8173208583791139,1853724825141799,2633426184575751,5694630357902770,6289226097992243,6315645555089972,5365589777109086,8096744791286329,6912608050774586,1908286874772027,49649330045500,696442189488702,4567453011231298,5014648242717252,6608986441671238,3062964041687625,5914045624689233,387450601521746,2583731065987667,3251133471965784,8764181659535581,4482009664307811,4557434504487525,9063994826981990,1889339001938535,6481310756307570,7888126025784083,6627581020979829,8251241056149609,7651702942147192,3548720757670521,3875152078750330,7685169291526780,7544654737375594,161678418279189,1250960673890944,2603490995765889,1638259334472323,7263332445898613,1685992038261384,2203339556569738,1485826745336459,5881971876930188,8706005255329218,2834837957485198,1230710656860820,2165883487068270,9081568207954582,8866309287183812,1824297824032197,6472631084630688,7074610795029153,6219544386011812,6112750771315366,4983159308755629,2104917818172082,2171913600197299,1749553360755486,7833647334941368,2548470717814218,587517808454432,8068151722779330,5972630758208971,4605660163973829,4046225857454796,664758416115529,50917966947024,5869419737981649,8105715647335203,5052027497997012,7826459532128377,6821437627892441,6333920249553627,3955987382805213,7196694557958878,790815759076133,7054870264693472,2504763779089122,6098176622420708,6258806321423082,827606701048555,5729095050510446,3331238203278063,4092091579761392,7599615066391281,4614806791201527,1694045073974008,2238098386650580,4890752916480762,5295387637367550,5765057749334572,4187902736573184,5927621723849474,588096779049771,1989066099229444,3780687373771525,5680020611050284,6092910910137102,1429186033959695,6973454410089232,3431865554122200,4412495707795587,3021450942219028,5002316448285461,4277613303399190,4942939650556695,5988828614714137,2922294353593114,3165020664415004,2504806269567773,6591306339812127,786573784941346,1531055814812458,4099540120760455,1567549641171756,4233048600945454,6908677979530031,7209287437749043,8035330161435444,6825055707341621,2791295648629560,2794629350261561,6821036742140730,2781150822122299,8896741830632252,1893926862758717,7009444644537150,7597798649840452,40481159138102,8700673694081862,1133012510573384,7679931444960055,4207478363276110,2232825474286417,4991941499929426,715241043903316,3894484428489557,677803543577430,6943769224004441,574261289657180,358172744614749,6789869255861086,9011147240735584,5217079795778403,2941631956337509,7865655590806378,2796095104271212,1029177621037936,4960132306232180,10246093223401,9135008219784059,5412653957260156,3668712071152513,2699757645611906,5585947806643691,1385043945864001,2848837495915400,1899995478926217,5629567698477964,1997713957381007,1013578542744464,4313036948112275,4782175337038742,445966530503577,7582267696156494,6012908707931047,7066986479035304,2024200224785321,6409629858513837,4416448424756143,8919355162590024,1155300950000565,7357451859067831,4104564331340730,6717140261962683,2720751129338813,8142709745533886,1985856485950401,4780109512336323,4599216129311686,6745763342713799,6900034076443593,6472301867082700,8814126040928418,1690293767414737,626755622470610,3835146109379539,6982199313777620,4492114901550039,5401117384424271,7358430655448028,269076298761722,5295554178850981,3702913722549217,8995078549304663,694696446370794,2346131095826599,8082305205229,6054515730998254,8641883959141885,5992930149360624,6063480038772904,4461525252039669,3148462127203319,5202627083576313,5540244887503870,617090076353536,884416067634178,2761071356576771,637242913465351,7623719695950856,653632374033239,5207210350150668,7542694949436639,913362812380175,713329799144465,8260544521397266,1388358672270355,576206960935956,5484946807653399,4530645078436903,2838899988243483,4968198284010524,4188823684432925,5450714961994782,7056642579183109,6264159609930784,7293741109788133,1520355455058978,8018734147119699,1517565012083750,1490580124722216,8946207072625705,4585332410287150,622246216909877,1466088258208823,2138334478009405,150844580793184,7774464042362379,3134977718223940,2112617043928138,7977099839221943,1578300065565538,4233395426698318,2636189900936717,4181867280687288,5902946773165139,1211138451424341,4974047464989782,5409819576181849,5773430550824026,8332519798478530,2248212036079052,4344309441995874,6249816307057764,5916100195148902,1446698755875948,8405857365657106,8097308621668541,5650583813981297,6035951286346866,1963605019640947,3910677264663668,7376077466657910,4325325905871992,7353518944607082,8190280091399701,6851157638390915,5355917560579205,4485682903581830,993522514592904,4128379569661065,8259282174461066,3651305007965323,970630523110541,4523718962046095,455819942102161,598990654866580,4683914068149397,7689440137503898,4186844757050523,4515888762234012,3482138209658013,3896271799149728,141283939853474,4914426830242980,693183627750257,8607042226013352,542910207583401,5588202083026093,2155026568193199,1968049884841137,1061395225658546,4174756901151926,1225415870022839,3170117751334072,3460043747673274,3216090609886398,4173218850605941,2869637037327905,2099964787918025,3096557608835986,7274497600152781,248168506565842,760634902201558,9185991147881691,6922093298762972,701558209357021,2964689854997727,3288291111101672,5248009370141929,2749318405604587,6517166374731986,6817911154549999,1847574842705136,7777016211137780,8251335656110658,5272272262530300,398791786546429,8729826796283134,851054077994239,233571450217728,7092495238399233,2140918170428674,2545029563016453,4143017450890502,5029611990639879,8752590130898189,8431159608329488,8409799242089746,2590328552604947,6091776466748694,9030788642891033,1207869136823578,8024724899746324,6581551567389980,2335720892867872,973418089104673,7750140881282338,7708159549678883,5375958161032486,2116801345275441,7780317920084438,828423569990953,7600501093500202,4421903679464747,8314246212511020,5225042430608686,867569085703472,5657721892035464,3481148094350642,1075319761667383,715361098106169,3298134319949114,5167620557849917,3403799281747264,1211507980043585,8749342979881867,6980360164607300,1798205563107068,5256899772616929,4184320875357515,7339874175088184,8401100463894755,1790012403918168,7120012423381220,3663449456633179,9003415536092509,1049294657504607,3044585703720288,2235059739313505,1846202708551010,1670753851131235,9024391753920742,4512008319870310,2371273714419049,4383363035022701,3910256034792814,6235352411727218,675058479916403,3243244793382260,2334092508194366,7716435144384745,5430779572036984,8428111777498491,3341864107885948,3041141266564477,1569470446929279,5384270448407960,8623870787159427,4889285479613830,4004027816691079,7125836342044042,3702659731932558,6129665122985360,2969885282993555,8073584087051724,1870793906931093,8303191814089625,214234800055704,3207383600981402,7076331116586395,8986864963766924,5304375303128479,469951365662114,8525897922209350,250094093375047,5469271715538349,8809473519225185,7928856206091405,2232047226422706,8628381316785587,1825531111441847,9012040793089464,651288360256953,7230851129473951,7239184753018301,1085559575930305,6013795580061122,7438422636086724,8110230430598600,18548549117385,6482768869713354,2125427559122379,5890856107378128,1928349318079954,1974252024358355,5699899318642132,300987936499158,8533610075940886,3417648328639964,1857106579146205,1270354511756410,2437531256309218,3004691185411556,6753941483137958,7350286138129749,8350293220025837,2449235271435758,8914666386915581,938428139767281,4166979565610483,4581547127177470,6355566813152758,2552233481586167,2289661629326841,4459735323403770,8162347610727932,1670818741771178,8850504319632894,8916743195579989,6899221937047042,3067005971547651,7547184283641353,1918538614556170,7729437438494219,8165542052840974,1524485506817733,8804857718466067,5311579043243540,222775189431829,8545447107899652,1671596400264730,6480521156584988,1044151471941151,123956760577569,1163881311331877,3331398201837097,6018389059823149,5675788468569647,4654118868026929,3862813297968694,4839776492234295,6150828045706812,4709395442042430,4577890798216773,3759246257940038,8909957007271496,322048970171977,4704380599395917,678768327706190,7140157519020301,4925241561343568,7875134968741998,1146874715752019,2767874127349337,4054759182452316,1472031772624482,189410050827875,5371514867777809,2751429091149416,6129245471704682,7787784962310418,7929752000685679,3608737233962609,1504481140056339,694868810548852,8675579969095286,7804511451457145,6285760540034685,3886972318287487,494206942537346,5518113786676867,7653230573952082,7315432584773910,6757112697685648,7734877369454872,808792816330387,4936312509335189,3520947663980182,8134018103600791,6803075734819098,1275763560597151,7255595691648672,224008718763681,5528013872228003,2034744982570660,1657825720583846,1447392944596648,6125624980956841,4837708498265774,4587997998909108,1540813202523829,9072019487082170,563358748403387,1431057601849020,2113814776702654,8844573262030528,1381869149562561,7756658036934340,1251884258846405,8617066629857569,2168307709003464,3696532255357900,7094928917276364,189509016004301,8710549601560272,3352267281909457,2165877775197906,1758350162200277,4400183338895063,6312772911580889,2794714469517018,3991480974264027,8498596476253818,5105130676356832,6480958516184802,5911019067991782,3731275924473575,5543269870630524,7494747769554667,7661810683504365,3183380241032829,7275432420124243,5975825224615671,5842100048242424,8151589436401401,4524428899133179,4209041587832574,8151379163192277,3053229552371458,4508577488119559,1820971328874249,6861729529734924,9003417387724465,659152744908561,5784748737185554,6255669643298581,2662742655289113,3100365476579101,6358938291676959,2801411914360608,2464684926805794,5830194688575267,3137409200301863,3219289273394987,8796891829561132,30755883304749,5918886830393141,5428439840900919,44043707361083,949437252392586,4708689889421118,2052609856972607,4511771631986498,2932954125756228,5216150868477765,4891658448238220,8000153877677899,1039619994355532,3507669907064658,4038841912338260,4363303545483577,2162526196926296,2277540194977626,5424630633748111,3318615736164666,9216639267342177,5866859189405540,6191147282696037,4923169137450568,3236747508934508,728380825327250,686033401295165,6672032474367859,5603776735029109,8157558414632822,5900661371955063,5783644534761339,8583377730791292,5734940511075306,980986892232574,1140731906238335,6167645832284032,1798996760102786,3834328103995269,1441944601552774,6983283670574984,4198655242258313,491621630560140,4472245918951311,6873693510838162,5965375694309269,356496265815958,7179270542247832,4034497010870172,5035096453384093,9221630110443422,6911280516841797,6947364334782368,624769261709219,5144198216927140,3862769250289573,8486978037122982,7593121114221553,4091477424465832,1052673583589290,2197035839907755,7757338842310573,5818630818777010,1307356310309876,4768593063593915,9188618168543164,8986764811249598,1494161365034943,6353889403529155,1572664855553988,6124758111799237,7087409760890356,5879881113503693,6046249653856206,4648332297168849,8760128216682098,6427080589904889,519673728411614,3912493719578592,6286442397927393,402431977834466,8411320588470712,5908021519943656,2133040507045865,4422267096541164,8666873566818642,4611074027374575,8100079125242195,2270858790258678,4293441147029496,3728094536468474,8890643880045567,4694869757650942,7829624524222805,669373727885312,276739703171074,7530869780424708,2060053326718983,8781271655287810,3118562307434510,3767086764181519,5903909266237456,4056905045715971,1656954541877270,6427990427609119,6808677296302114,145932815992867,2043489615800358,3808968984987695,3113669186161672,603268054738995,5167429001531742,1900681014798391,2298017514522680,5363694913955899,7842960578030602,2146041819744319,6675986737677346,5582264331380803,3616108795144261,916054347892807,722606829226056,844552806303817,2081256270727242,502753894635191,3226179510929487,2144073799002192,2266803904890967,4505528641874015,4063072518195296,6621742931882342,3939597907806316,475985962920045,1540337266247792,2403217336944754,1209815183419509,7478528374376568,4463761225205882,8682110540949054,4662974561567082,898327746324610,4678160227870851,5588431526652037,5242078222329990,6286320585885377,8684696046626970,1005110760032394,8005729597758487,3405340558624908,7792287402669762,3244654392707220,2072725139081365,6458507204569239,6865828609362072,5334667481286810,2799488787368092,9164849425051555,4193658517768352,197193485813921,8530135538961435,5823616772516004,3787925894916263,8968349939706025,1185084312201389,192577805985480,3578969250941110,7420254402734264,5274403993561275,3651466666038017,8809276713027774,7486740870095221,4604390603679939,7473025122901883,6719291002235080,882017297238218,1776141390391500,5277139520006351,5071905836476626,7099807761861667,4235730020174037,3642205674062201,5997178583320793,1783264816802010,2844525548832989,9120495665616592,215339685325026,95601053911271,6876432982194271,2952974292240619,5702216830290156,7132662582244738,395427792251119,3641856689498355,2274088035354870,5179168256944376,7528729085978878,8625056355846401,5003662713342214,3715878359410952,3123628443265290,5792646403475726,2109130021153837,5899481469028626,914254067624211,6596576071411989,2763022559013142,1969399086884569,459319119210780,3950655847388890,1658753792297247,2499919844669147,1438123059267876,2567279300495658,1430120074258734,8569147077028143,3550174297237808,4841416003987761,4495498543900978,5330942094100787,1902801008314676,7911259704625461,308588942698811,9164747113146687,6494012868929856,626976970303809,5858237342419267,4400163621669188,7720851334842693,8936053393738056,7648561908386126,2969767277087056,1191552714746193,2355912918640978,4880140409104723,990659294243156,1498005138032981,8334834923342168,9170917971937625,4446412965308762,4668341352089948,29747093850462,6427359536849296,4245367917267300,3014055704578407,5808986804332905,1571955340822896,2872733471746418,8531950867777907,7821224497298495,8897671631686013,5337913366210943,1412927148239234,2742312958519683,5625228999231877,3254857658304905,3782408444160394,4009804285102475,4400535026264460,816724129048974,5503445973726957,1885429789403536,2446776833026449,5975270695971218,8042235743516534,639788866783638,2710409811708311,2920431833532824,7115396197248068,79734328043930,6255349770889628,7462366217193894,3615328999336361,8699658076391850,6648735997537351,2017753397430701,2350918764380573,2548503161883057,9159665017632499,4918473768651188,2034787481315766,1135773007169975,8003930329426360,4376378634480057,3264988251875772,3708603003431360,5622374967143499,4661311391795652,2138637556623813,3371174935988681,2506980137807772,748580600408930,7367943576871330,2102165935097592,3031682552572370,2701253126613,6205123438135766,4879831091079639,2694976153940388,4696483680034053,7073582048250333,3774156190532005,4723635885844960,4028979858983395,5540878022185382,122694139963878,4460120253958631,3590212551227132,5206484342655466,1321210848520685,4876161637476846,7172462628121071,7844542142957838,850516054100468,1273454163225077,3824937462163958,4430058643106297,1858739076422741,7078158131430109,6301675337435654,6314905433369095,8446939556134537,5216631260129803,82123616348685,576766035929614,1503398328887823,8700026577431056,589344487803411,7937745420913172,8557760532523542,5147606207802457,2751322935880226,8076975408015907,1007966909573669,6294706025759153,4689413240343081,6517204841916975,5760046560578096,6438220135746099,1482447705926196,2788115731360313,7620656615139900,8041123441271485,8447256902172009,8292612935756356,5003633331251784,4100017446955594,1378730394610787,5411655942425178,7683639116449695,6517544807402076,7383820035661938,3374479353145958,8954997409892968,5875529574195621,842324826425962,4488133838817899,2549355847576176,3665227913833576,7971358166919794,6707052036524663,8166246788878438,6942354164943486,6239610297693973,4313875193580160,1599851393870469,1799261851060871,6232184364731016,7909109138172556,2322030111820430,8715198397886882,8323444561758864,2353397206576462,2977934984448665,4853844011641499,6748495939144348,3013194406103709,2949664260142875,7543471188923358,7332854142171263,2261630159850157,3521558255938227,3379795408718516,6021841916340918,2400058019916473,3156986187418298,7432840747018941,6799368484801215,8865361284022731,4818184931609286,452614483733191,8395572764273352,5386219690232522,3511839342015439,6176670235151055,6043144544087160,334222605191891,2830740826712789,3859397863394008,1864610684062425,5752946228480733,8090633682155301,6796971400891106,7343926163010724,3294600860242385,5693364172401384,187804754553578,5563307743365869,142723861138162,7546083967558099,4532590551763704,435212849228539,4011980510071548,8178937350753021,7548193141328638,2384610205821697,48175527014174,1458924394253061,6579850628827911,5720077462620941,1452079363163949,2368889114971585,2352306484996884,529537635068693,7888134012627739,2663611956857629,1095918438558496,3778581973258715,3736519321864997,1827189592066854,2394245953882924,5672881407275485,5810057447533360,2602429973433137,3695234310007603,1609129657092918,3159399237954360,1723542946794298,427932496612155,6018344639368000,1575650492517185,2997711861927547,6068045455862598,5217982197761494,7346057135934282,6070760571759435,5221028782992204,3643402380651341,6057105738648399,4362386372234064,2392497820502865,4839225547238226,1895021005425495,4321214095625049,478951350927252,8760397519168477,2034750638525280,2150786796596066,1310660919585636,8205029323320166,8253336857340776,791293789557949,6287922435492718,6825199301946224,6614341651041137,3902283199941493,8023219646616041,179199468178296,1728511502936954,2889462867725179,2549797975247740,4015156285074301,5307789426469759,6918617004526464,1939630788840321,3007022012550019,7922374037015432,2510899574471984,4594482089700249,2698804543810458,2955077886271459,8629647693368226,1717079513189286,679981909568423,1613532610309032,5717020213947305,255171230799999,6977122226899886,2369186434493365,5478407995173815,1597756493622202,2465542085994534,1758585265376189,2786848918047679,8350358619417537,4076961033817030,4103225684305740,7740519546964940,8049788818549726,331490864876352,687142263819234,691665180486630,8607133892963304,7623046825577449,6120269624396778,3824641232956397,5649321009351665,3652904988735315,2605456717179892,3798733303204854,193422476594169,7868124102216059,6850892792750591,4949628703857571,2178135651953662,5356935307930623,2046593638242905,602071202140672,190932911827970,5354669468101635,6634287883308037,1963709931506695,6974939934903304,3749263469587466,5629207371811851,7974460272282637,8391503860185388,4160710526692367,5834960315479896,4811529468931096,405638299233305,1680144976088239,323618658307100,7894539759062045,757276234148899,7287286891588644,7540111102857980,6563413855341607,1185991665675304,882250592078889,1199228574919723,3950132700056620,1421535532157997,6646789916789806,6417221382884402,1695902233214131,473423577320500,9062235036437557,2576968092236547,3243225175911483,4743410761124924,5419366511979584,3108613976173636,2364870318156870,2665073671212103,5970340752919624,6988789136560652,3163827281423434,5624802394696779,8640987567055950,4667587408956494,4819569272234509,5580261466729552,3447150516636754,8011413237812308,6867858784318845,2722915205916516,8370542931377617,8051113457095183,8183115683229430,7741093506690144,7454418685381730,1053143532039267,7586609359195477,6854122108529768,3835147275594862,3465685931813999,5235349268622448,830682278251635,8064972712889873,5076176255298677,251328327625846,6120943274552440,2728331204897913,3131354652626045,2123182097550463,2877984937012352,5454653144026242,3178022094982275,8268441429336861,745657236475016,3653690698475372,3031252884064156,275119278279819,3639614584679566,9134682107582317,66006819925140,5832981370719382,5217763879570584,3134734514424986,19435939619000,5924511387864225,8729392656778454,4222689965017023,3543155126529190,3860907027614888,6579379840552108,8460289933413550,1032736486225314,5718504516340913,5130882108712819,77915775282357,2897042774822070,7523735052407246,3934254398453620,8751279279770812,1629063046433981,6270310799223999,2987404941274307,5893855038557381,3600724421348550,4943848393641159,7415971742928076,1568300220247245,5961831820831954,8122335581828854,1563524158500054,3621038236937431,2545450691783898,863276944379099,3048472799972572,4743362860795771,1048673230490852,5101088868781285,464607002299622,1243159457729768,8250756119727340,6473087039622382,4543287920872688,5542696182590705,3647003534937331,5340029904522486,1870754383826169,4251627677748477,8963929286413566,8842507111538061,559836934712579,9159164781366533,5760024546727809,5679081236548873,5408308013378775,8978822977247797,1532780584865038,3614640752987407,1900858350325008,7230924532882648,6133911396330771,6173855624752405,1013497545837846,8124211388132632,8862149019281543,4291449710798725,7828922946129115,6534408108780836,258398857579813,7332431621631271,5483032371932461,3557628217756975,1653885421882673,6630185570159924,5364674919722511,7188790673818164,2081289038155067,152375410355517,8774989436226882,6783829159423300,1100719716642118,3014452411845452,2996169599356236,1945875634212174,4378091133128016,4894015555693909,3859047942253915,5299784447167836,7058931689833018,5184177173228899,90784618081637,624482415775082,1169368871783787,6249545686723948,6545849122408850,5440864010554735,4428240621129073,8287747325504882,369074147642739,4914307977162106,2839383908633979,2011542422162813,5257681339071723,4102313521253765,2086117881032070,8293350114251329,5369413388037513,5386598755675531,5050703143783820,814571398688144,7349843444123544,140888103415186,2737742408674710,8989063085600157,37552565710238,2347141713444849,3831294653219631,5809147578805666,6628678398078372,7714735437581733,2647671806266791,4758745590672808,2376724837174697,223588452232622,4701921009208752,2076945825468733,1796716880596407,684103668862392,7304159752789681,8360761926269866,6526613355859387,5972734753353150,2221655457476032,6073285721419201,3317760454700483,8915053278784964,5779565797386824,2641785685880267,5217765816831436,5412924533337555,7754200030714854,1890855547239543,3503314553687518,4494538691842162,6085441857080807,8231210746187240,7139625467336615,5801160284696044,3070032014142958,1738196316466672,8414322980335089,1823874086774858,3344521663999477,1582888394673657,265823091125758,9144611807202815,7829861832953344,7333219851418284,5114945348496900,1157633905241606,1000205558550023,798300730183177,3725997045411338,1594369545203211,4985330454367756,4199637751590413,4557845160226974,4255670935350799,6138087955992080,2106725784276497,4204142708067587,4709450566217236,6841949392402350,65288001211253,4352462022315545,8749668669894170,7569172043238941,3125243239456005,7483593720543152,5784502303198755,2326096334179876,4979769406983717,1130212228787463,6155326372746935,6905326491110958,3269379817647665,5365554920721673,8246650223816249,3900313875532074,4567738423152187,7597610828893757,9122709155941950,2666362468699716,7779211300040262,4769967016316487,5297925302259276,6947215279182434,7460028242079312,8128035234950737,6315048816324178,7001406741868115,3662621775219983,7331890562900866,4963753005264481,3966440310050408,2146102923120234,8760053397991021,4544631034999400,6724478940483186,1127237265235219,713526056431220,6761085026094709,6397349731397239,3467782324170363,3474976779128444,1383487525351037,5998701966208640,8934531776571181,7922799431724678,6874333071306846,9106454922087255,6868577344417428,6683839788836804,6863553746189892,4762716099817123,4587857555877542,37621092814506,1338723438186155,4533359539990189,4277163010518385,1004136782581424,4892689789791921,7479974814797491,6152079547641527,6628302088916664,3089230351118009,7086661243030815,1900447947124412,7690024060825281,7026590922706626,7359886235324100,3822725446184645,7940855047990984,6381969539346124,6181134668132047,3233194154562168,3279126374937253,6296839402680019,6111242785042133,5207316856423033,4537139920441049,7097610608072655,9177770968127574,6850234292825821,6139305322524383,7785495575700509,2499306156742608,1825709450063586,6898751426711270,7855105902012369,8672973885607656,3775830201257706,6553932029103854,5561318938701552,6844097170240165,5612640831688434,3598674727775859,4105392980741877,39405419941622,8168950692220666,7307974078263036,4069045849288446,3782697724396160,6685469338005250,2475846047362823,4155749905673992,3332955117129481,5426957599936266,4928831807139596,8742205797068558,6978902006820624,1378043861757713,1652560034869010,4929204758228755,2073224156729110,482157896806169,5701166902611742,3940493190934303,3207438747471648,7018223910877349,8698270186238051,832223734026020,8489992431399558,5344685408841510,5606887811632935,1074262187601707,5921740765114156,5198315761200433,1250491835100976,3921690860801844,4238565375354846,2972387926282039,5004933561487160,7179535324901185,6294872461697675,603730186688481,8616475592191816,532674171989833,2485916991065934,7264671558741847,3285491555725144,3026620151074649,613712441921373,7528120925466462,8104802785557819,5290759897890248,4289226543288166,2244709565001576,4843228237926253,4863440279883631,8829000954278433,5411633152337897,353962673532792,5379565174501241,7679907534262141,6522937431756670,541255874883457,6624775596819229,6292192618418054,5335789743820683,6528635496304527,5163492592398225,7849534864265109,7139099279170884,1748162333691804,4730165225820061,6963807298662303,6983523142340515,7943091223997766,3629808548327334,6445663427956652,6089517657231277,23433599356232,7709094489702095,1699531539894197,1188169568456632,2159429457988483,3183743191855039,2849406936567744,3006766741966785,4361545879310276,5263853367306230,4182276918851192,4215609340530638,5717897625071567,6856822726832085,4962501302300632,5814105360125917,809445550723749,3466237951487968,3221625635147088,3117647140065250,6155105389293540,203794709729254,6962503532306951,6598289990668267,7540998432829423,1698651456540656,6675945110374670,2290924803831281,9041811001298933,7939700279504886,4443034034917367,7722205550284793,2584605782683642,3653928720199675,5863312346688853,9059739621666820,1409301871243270,1552092258775049,8161440867238573,4034235785596946,9025915064005294,1038205348273498,2986761805918238,2707177242737342,6065142400004129,4937404318781474,6659077064912932,2257733226590247,3047404602331177,1164865872531502,5415428459098159,4742552948198313,6884004905472051,9021347657531656,402949157195830,5486333016756279,7630946018897976,8710152142805674,3158519319572540,5310820630319169,2515717679755334,7431429393972577,1439345279225929,1260119722954829,7920075839017038,4566741199622225,4710024898703442,915840815860258,7467893145178199,2841315127005272,2774132126814300,26596665725022,1410522309226591,8280567614705761,3831285980254306,7060452539404387,7624051107631204,7121102877732966,6557013799022698,6611181122556015,2695384820568177,3759613080186994,2070340124512371,453906987839607,786095448625273,7588750159515771,7983091671756138,5709782354055294,52133402775679,5169566203916418,2183133254946947,5491449817288836,7249337253523589,150075198787719,8355036730568841,5525260094804106,8635663366066321,7685358307119250,3023451799081109,757995239893276,4108913355034775,71515713400986,6546240660115611,233449244047386,905784471212190,2777724290805921,4774549414899874,654821006643365,6465445475332262,496136890896551,4153363635499176,980192377581737,3758912589689013,1722055675809974,952056054075575,6173842761158840,3630541163488440,3096191131693244,3955951817502910,372010013266113,4023299491401924,5661611515605708,8544847707205834,8560179787911526,1663322529738961,1835975490662611,9171955816689879,1562480095342808,731160351559898,1094872724828379,7879285370663134,5642214746697953,2529745875022051,1198585235310630,8769182684238054,8229362479976682,2565552694644971,7406153502699757,4421665972613360,1193234120716533,6033228097884406,3042859728498935,5588744800781012,8605337285275898,3769323659882749,6803659344883967,9024403648963921,3371900590567681,3514994907320580,875844628099333,2273041898926342,6827714348200201,5835876182577422,5389807873192664,2344743196712807,3448893444289241,1322866346610968,2877292063125786,445932418238511,3024896125636892,8989202165944606,3683667020362015,2618720197521707,5158038260937004,5964524530749743,6291111587017008,8968215284805942,8464620533669257,1632884051587385,7252203865239867,7098044877574460,7057196333846845,8589231938424071,1276490478760257,5020211376909707,5429581644353862,8376954723995978,3066633021932258,882859537518927,17306392056145,7698900885926226,591767774933333,3289610064564566,4598336494080348,2077260515471709,1025259712016734,1344223429964128,2638923411755361,5195835922542950,8914133761397096,8334895522419049,1596491613631207,2525456963329426,2393653257941359,1075006359597426,1624807817843063,8344580281915074,3259647205806463,3222249159692673,7493146398732679,3678310730183048,3269824445512504,8721833800044940,1364578744054158,1745435689906577,783849342384195,3376284453220864,1558242295574935,1912489348927898,2366448785261295,4026544941240732,3254262717968802,3732653349617051,302527438664100,1149363933802918,6821840541225385,9047348364644778,5853439556006315,6204655554867629,4562742115013045,783702889296310,8543538832355767,1909999000793529,2472437746976842,1878693710470560,3029472277369284,980981273825735,8448574976086472,8322152064971210,2393824236326306,2628138698592718,2907068787110353,7670428465951188,1552028206100949,5216876412080598,3284493916778970,523581427511771,2145264258109917,3194971208504059,5221315495572220,563892517769707,7155902367412716,2074529573655021,3548624083857905,1076007658697204,4209534888038902,7740651904143863,6782834221560314,8265515526779387,4731754258815890,8917545033484205,4521184611021312,4856298444141059,7371476714107397,6839609409114630,228297552007687,4498457579246090,5502324590424588,929156335989262,3552918893755821,8552189705405677,7697528890962450,7750467428217363,517513843855892,8055162605028100,5423265425969691,7397261318566432,4072003746508208,8512089674574019,6060637949620775,7498925232935465,5655722530951723,3866464443953710,3710568473776688,4145068454859315,1899837692233823,3097939052769852,6844837535928895,7426079886463553,3304833459827266,1935745651093007,8570872609968908,8227300301950392,8873453526839892,6869877224755802,1665832563716701,5161379154184293,4245763704582753,6564565735813730,374503678562917,4117681902465640,6049176018580073,1261515757007473,2932827525279166,5257966768468599,1401546273354360,3096324637258363,4017790566591988,1025115837158015,7217485937010783,3724488355500678,4155740087651777,5149813195772552,5567303692382857,3760858452734602,515027294179979,4866875690046095,8678452062376595,8077894994776725,4092043761316505,9193716485091995,4076263129313948,811479649342111,8146562105927792,1418470255727267,8851731699502406,377917348770469,7105398697988774,3158321197306535,6367442436158122,248030704236658,6524886543061678,6336457840612015,2184671187079857,5348932266308275,320917593846457,220749271286559,1734629163348670,5220557082220661,4737684973703873,1481243148923586,6795348713386691,6243742545089220,8474113926394565,9032118214243014,6521961396761288,2033246466618057,8684491852429431,2727237911253708,1460771073143501,7719732596677205,4717482572813012,5036527443981013,2643777480594134,748498053133016,45671782437593,6830989663883994,4333821223839866,3410459103883998,3222347932201700,3189130659787558,3883301693936359,8938287721493229,2900865755116272,4607532626170609,6078958700131058,5077000890954486,3311910683013882,1977713518252795,623963926958844,224046057894655,552502712718081,2748379471721218,3915369161118468,3868994020195798,7420651954410284,6142991243891467,1876938576343820,3848067821572877,5196472384836368,6129504052663062,7163908670133015,884653949031192,7661243789431578,6545954357859099,3344138562204448,8253578027324194,3511467415393062,2345948401513258,7773132202570539,2227274225300268,8593517249437921,3041958104249137,356331103220531,703207738110772,1914959390716725,5507728105984824,7821488976758059,2404432690901818,5175167715160891,5019552581350205,2116777169212224,597999893304130,4757058105299779,3309051661448006,3205798024393546,805284565226316,2470546020987726,5547882508919608,1469801002734420,1481364169700184,4055472660517722,4196375054340956,3611193416627037,1277150887277407,7437090624123744,5093505456780130,6965328953709413,3652882002490219,2165768213642728,316155184337778,6773290207196020,4820202657420152,873625629157525,8865775474364551,1673211003261826,1876904604275589,6716808558261126,789252370453384,2648468587205516,1077757695005506,6345372697334672,1920066676601750,3695128977814425,7395516673872797,3600147666613154,493507531854758,6651724599030696,1173221555450798,1081933683889074,6673335253742516,5051970159670198,8500969782260663,3437818973279161,8352887559025482,2865909102501365,9121049172889099,5559288426394562,6677911274566595,4495553226336840,126975099581387,2979796999558093,56950385382351,8591660611032018,7505013646922709,1766756395070425,14743335097307,8812934016206674,9184430431911418,5205459236926430,405068718454949,8283106279609313,5949637420610531,7611234044027729,8274490927870953,7828359214973778,8312779565143025,3780072002974706,3805864770143469,3575116992762868,7784880263679486,6665516993782612,7723933735689727,3578787328611326,2579607113888768,7511539414217731,2352914438173701,6728851690312711,122322935044268,3542550234125323,273091154744332,2007023778165773,1482955968345105,3211444381660178,5446437780173843,5046043936109589,4275950362334230,4953953501975576,7536132713886745,4109719206532122,5602484176754863,1389729297224732,3750707945444382,2436492583760927,7427539077313571,9163747823916070,5251278448432168,8949729127281500,8650119132820522,602580291613742,8638141518361647,8089040914482014,8704662727357494,1633361770053129,8003928847987551,1320262916584508,4585982619489344,1096238372901955,6822295734219844,2706554585699398,385072448967753,6570924604798026,5161717680403533,8735897277806776,1252913640731730,212074921718867,8564149508887636,634116440421462,1776854332175447,6998148468110427,4080319963018333,4810224243758175,5407234297007632,7648755579974755,2362269376959591,8603994785510504,8407577884444860,1097842400187507,2453615007446132,3520916485657724,7274290966951038,3597859476927615,3303338974532739,7396309592667268,6951178565915781,3309099449062535,8746149222970504,1513194272478345,2060542802187403,5241483134104716,7410241394496654,6760771487642767,7544930152838289,1248234229658771,4721728236868757,5768463219471512,4852756376327326,1343848323036320,6293746444113060,2869326632228010,854879606617260,3531416536749229,8545132195436256,6644764392305847,8468063901340857,3519395568045913,4698214917862588,4801006049334461,3497953215165630,9170953585546435,5426128216683716,3509583173719237,2928611771459788,6932697359684810,4439484922067149,7545710660489945,7035445218954787,7320739432314070,8679147080674852,1111210912863456,3309422522012897,3791173512680674,6819252083995877,8363224179374289,3674799938229480,7653147660375279,4517546953823472,3806896112391411,3489306113727608,5999778795522261,35599199499520,7837809123928505,6170022180672770,8889676174775214,5792127577429256,4961188895479053,8381875813479694,8670296494296621,3075122593699088,586947148895508,650287987149999,170145573287191,9220817586923655,8076196085699461,4658415480280357,3130572428037681,1367147780715819,5136602441283255,340749349270830,3658080396776751,162827734938931,7932494234900944,8469677991810359,896119342159162,1044069705554143,114684877239614,5803733134054721,274538481038659,9118230348737549,7929822071395659,860110510536012,5421786600363341,5139218635330897,7530522912535893,2831350414095703,2486267013797212,2708820065695973,2963593620927840,6925433740580194,2049891333774907,3361380018328932,7084134792732266,7010902637925734,4811627260933479,7299450149943891,4178181742894653,2527681901155698,7192324852733302,6159830362011001,8535182282896763,1933339713304810,8821737011051329,777177868498306,5954045974328707,8654649890997142,2997346422297990,8829123930477960,8899310359836042,5142498618627467,7011073884386700,4319561238828430,4249017974289318,7394144482964881,6411723903694226,2204405233615769,5737020513654168,3305234174893636,3933400728843675,8911348876129692,7692846564521377,5258972067632546,8235882306860451,4916953823548836,2263286131848613,8615625982621094,62249658013095,6770655928733109,4911784456549806,7946678245340061,8147177218241968,1518844452476337,4757889679979954,1202071946655156,5426716040689079,7403124168918200,4192433674032572,3594310605346237,6033422079145407,353874484450753,8123967321093570,1488067374205174,2587628004414918,8393198617793993,2438849184044490,6175543030658507,8300637426013644,184500155610018,4880826740831701,4833200087193048,4290871959451097,8059890226992602,2200362417133020,7938504806471134,8227239584445919,5490928178869591,4944565276759523,5516707071784421,2966212994813708,4051991466210793,509872896701931,2397547533340242,257415301887472,6209465371162097,1103350453040626,8718300317947380,8081991178286582,6778860325503913,6655403980994040,4446983467365882,8230981293681669,40598399202817,8685389527594498,2732645472581124,5875250966869509,7991547379512842,4393629649720845,6467066029069840,9104197979770484,4158285128414740,7102804309521941,3342405109921302,818393165182488,6578477463574042,5673267987494429,4237104312694304,3078913129788962,3758519913666083,8262356825082118,8531914678337116,7206021466461738,5375305416521259,4251996586423855,6452167374616114,7684426869029686,2251737390994996,7408491654274654,4278467401872951,3677694340822584,2864645356082747,1089407461431562,6795476442469952,1697818116576835,1026643101357637,6173048262196833,2502783268623953,3623985648383570,9178552663291476,6399904447059541,250292318189145,2688117289227873,917507755292259,2912451899332199,3098297565255276,8712576292262845,1028390310350440,7596792238700146,777028348147320,1845640583116410,9163393590294139,2587550303688316,6645195093972605,1994598872331904,393713093932673,7267750914348674,9170298464720515,3247380074747525,901974868965002,5700680624436876,4643543565309583,6264722241009296,422280264529554,7682836289443480,2240092272621211,2341308007208608,6700843437717155,7262682741048262,3740616530753190,4523492465481385,1258605632738986,4702234876374642,6785854041601713,6117509850437299,4622343479670454,6779358739584695,4828601969661625,1535941278054076,1336637108565693,7297617124404853,1620886994024128,4033928235783874,7180916759024587,5350050424084164,7239188528477893,4958811796043464,6280661255665353,8934185639147210,5672860155303627,2431046360741580,8205714363939106,5029779185817157,7710166425947651,2301905110890194,2197409951512280,1069787332024612,3865418940380890,4448985838032603,8313462585134028,4834276062287584,7043027937228515,6566910186100379,3299763870701286,6469953791222738,3235586212312814,5082719606142706,3297754215544563,8435001859708660,1013630571681526,22558780577527,1789001003898620,326614401247530,3107951350283905,5588528137238280,6919909448095497,1679272297799298,2998582119651086,39490752821010,7722020080424723,10501603243797,3488633570375451,9044773796668859,9092245136453253,1236258042992417,3861094056449827,7815065315661605,3310633371268911,5675595507619635,2804855396685620,6514126747809589,4214283793372983,5020160990992184,9170393023883572,8893664230315838,7353465689708356,363951976380233,1943083508766539,875099460564814,3885943145805647,8525793214289744,6960858200217427,354898472343380,6390060851451733,2507890506159960,3574101185861465,4043848654796636,2344106012972893,7803126866419732,7826100552381523,3653064227125093,3729904158693229,2297336062203758,837118796052336,5642161398224753,1164930005817204,2431646017771382,5104035560003448,7360400040226452,6857629406451580,248636181193706,2442051115390847,6106986719786881,3517508911830915,8855273308870533,5164885714900870,5975681842141063,6733533875845005,3021658757412750,8448611096500005,3027575746939203,7796498433849236,23377473484693,1866630933297051,4984411874563996,4164038527187270,5101671231808497,8387757942266183,6415112923240366,6886978953430050,3678802154567603,2939062779238324,6918926421211064,1356194590250938,5203755679872955,2770227185579966,7701725408425920,7268727967389633,7371612537133387,5140998017103812,990864693393354,3055032506996687,5328915849598928,4378933349652436,6235880396568533,289609832052695,2052612280145881,4104920113960923,1074085985843165,6508727630297057,3059939305627536,8894075914638331,48171868338148,5972031234971629,5821445509044206,118191151880175,1100331282126832,9208681001101651,56308045035508,255242989336567,7350361093969912,6573210826536953,7282001962311338,4794408288122880,2862933750315013,8498453254928392,402098792232974,618834665658383,8161306950262944,1605010411010065,2032583474083862,3903898461181978,1920140937088687,3179774093056031,7045553659263013,5761466486806567,8813548341188648,7725541356722524,1857381955631147,779784426887212,8307336287057968,6754426018322481,6914763013765172,1154957608249694,3084179225671739,4071471053247499,5186363697756229,7397276346153313,3631976910346314,9066438853246647,4499228522469453,1964420763154510,5717881265199187,9022715828085739,8261728446568534,3021144667600983,2571044034992216,951224472594339,9079785920673886,2075309065394271,7210379649235042,384509239531622,6466599699674129,9102290825107561,3070856331196522,8753153970534513,585697416280178,2921523986946165,7325149913033554,2941528638953593,8386153355253882,3799347565156477,5988259407083647,3483354230577280,8164903189313668,3457830716280497,3114615286806666,3010404153440395,4221190311860366,7325925063374258,5788995496433812,4438287430785174,2636071909972121,2492449398405279,4222754776094884,3660092626081957,709991052384428,4534484742576302,4512173263091887,4779331811735730,4996713713345566,29784325363896,2561026718988474,5277122969163963,6536582771659078,4619368112470215,8826095776618697,2675792851343562,6263172264499405,3674881287608527,4701322878277841,1213886012332244,1700201241188570,1122282061790927,2955169381357789,3382727526373599,6668526368528611,7464850054441440,5578980853422309,8475299491133672,4373768290629866,3711140160485614,3651877875489011,3588488655026426,4310304083293042,1145312870365438,4302179703355647,5191143707752705,6829288048982277,3397822382414086,6422688085603033,5393891360151820,5860326898497809,143910516799762,6830424910706968,6252344096667929,7839608733671130,1288244621170975,5961025006360865,2009753128696098,5593239911373091,5943644126452004,683332969085226,6324670298781995,1750244593785132,9075557680344797,1914321217247538,7379962157144886,3062049159444788,3743269111904565,5516352205125947,6878971001207106,7954247556831555,1181363499178309,4681583566379334,8242085956574945,5369473525171670,1180903847762250,2656235731548491,8603267557644621,8955521881676113,2069874956826962,2106418050259285,8658475829720445,8140272622115159,5365270230866265,1050545878899036,9028269527529822,2605609732208992,4146892530276705,5788094987286884,5645232066772711,2945087871908205,3660035492936046,6267553012726128,4805087864740211,7884932999313780,6522998190668149,1055718854130039,9135575706630523,7372593431613162,8583525194553728,4852267576538176,2510424379636098,2530494332254596,5961673869617558,8134455390910855,4060178588653967,5533041890793873,7166822489856409,2455130825274436,1740541854144928,3244405220161953,5260307416209828,7421368024224838,4230596084324774,3976201068367601,5409743641467304,8562131077495210,176991104719275,615268581325228,2996710260955566,5798782911109552,3913586913180082,6929633032654579,9178786487446292,5015699890125240,3638957842381243,3038128019952714,2370528531033845,2510720865638849,7162151227193796,6873825295366597,29233557543373,1423645179020365,6096986519640528,2136271885318610,2166014232525267,5208405560515029,6386667942164950,6341814417545688,1911888209369561,8690887889017307,6953144035531229,3069642226489823,4878298610694626,2648277503646180,8671051772954331,5256328339085800,4020332417505769,4597898629921258,8633643462539756,3346532251834863,3414024018885104,4666655966591473,5523425027734003,1316595600423414,9011812413333237,3204420412692984,1587413192309880,3497925177769727,4269709190383000,7613259898227115,3424225466833412,649083129246806,4690051909327366,870359752826625,8544711410500573,7236596557444231,7196866446678549,4543513825908283,2031821623241135,4995954342582813,2991716443494946,8454217614834214,1771800186747433,4811136159226412,4223596404038066,859409962580526,4242100762268765,2847292683409968,8513556022417843,2924276452145717,2017042619972156,8419342738291263,1613457551587906,2595451160992324,2789110073203269,7698146352634438,2733218440023820,6486315591129677,6905144793561679,5152235483232848,6156680898304593,6080149762243154,5171876187503187,1660426197785172,5623886574336597,4520308177668537,185003117124185,8900415943334491,8242467013220956,1043533134150237,1456170082450015,3979883415059042,7353224361144549,8782802499099236,3657647060187751,5872175595092586,9217464612230247,7655414231407214,8587913643317450,7581391033186938,1747436335184507,4363880025782912,8004491885394561,6874079519936904,7600761340661526,5813441881553543,6592273413347977,7291548269038719,5120146823699085,6241584987609743,4095219091077777,3351743300123283,8446766545541306,8666112313760409,2093415668800155,7262960737508000,7885081165249185,4449904302766755,4523828135871601,211991263460008,7137761331255978,5163375243229867,4441189010725548,3631403967396525,6180940757056174,6881437319887538,798927922715315,1031000270069534,5716819493382601,2753795523126388,2231401359538878,2023947750709956,7671531985388662,7504140723395272,1439475759848139,6141192450636237,4362169028623057,7463496075934420,1358822886193881,6034767612443354,8407504000424853,3946430045690320,3964981173530056,2764316690889446,2691979304327634,3641044711152366,4936655974816495,2221905449491184,4504017419696882,2742634174366329,4260440283609847,4384821907036920,4314471086586617,2139393754823418,3069234671311613,1660236197911296,8446151585970945,4761132258958082,6046976928176899,7484295228108540,4011749154142983,292637298260755,4966129511504661,3084157894941462,1421146935614231,5412879874259742,8739392496515871,3404376314960672,7882329285935659,3017346202344227,5479394704677673,1805910800569479,1474595763764013,1148258386642056,8565701798427442,182785088846645,262025256127357,1631327472614199,2740226183076664,8186205280341812,4502965001943866,9165610467081019,6961954603558298,532829611154239,1246266702031328,2071831844136075,6228419646380868,8976202589510471,4264467608124232,8281313713437513,102341952995127,2353823833209314,6503008836262735,8381290061839184,2238109128506193,790765711170387,7933297699067022,7427536492804951,4246078652119901,3684190753766242,711468550616471,1824094684887909,7725963563637607,1599920094493546,6012674581404524,1338971131403120,7182187420621288,6645756323167091,8712068112543198,5624603748730004,9128797916229734,7649691413106849,5055891544349571,528467997514629,5737003371912072,7789037565075324,4456275553500043,1225647123946380,7740526344702445,5819532891151250,4941207975074709,8615171193756566,5158872950938522,1513126837001115,5063422925839261,2464547456799650,6980900097555361,5782312220425123,5112719314369444,1547808024402854,1109394295421864,7038372420148137,1895039095888810,3039040314481581,7504522794720175,5042675358694323,8818920773442484,6122640795601396,6099194514676672,5093177647588512,1603869238967239,5534108428860364,4986609183398862,1250338918035278,6982767085591512,3578502230866905,424260351474651,3955706098047964,1200649179061218,4220892113066980,3844944665844709,4550741669444582,4619927742192617,569629000195050,6917884117687275,2536393702349805,5893178643946479,5333094708861936,5467152364280817,7405025037098999,7471495589444600,4341672174812154,4062796561554428,7707853885451252,8393750352985087,379392245586946,8311636308592789,6210811935022086,8052496213502845,8938827177614345,8196762809068034,8078166907706384,941678709038097,5310989709614098,1878610211929111,4445613300317210,5123860551935151,6900694772104220,4528718723374111,2419106505464866,2154541274078245,4532664283307046,3686778513472552,6003562833779763,1439679760923701,8401875601546294,4397656515034169,4538768982178879,3540528892533826,507581926456388,6942608797942966,8509894342409286,1377416286248007,8782926658673736,500681919282250,2797335747017806,4331286172679248,5380962056715345,7141832536546386,4916498759318612,4214669109591125,3860092703710296,7989412712704527,250485862497372,6704872450071645,6821625241672798,7502957934410847,4682394174274657,8462567137664870,1806525504584809,4906464345136235,6191797256445036,2875620089125997,6513283029335150,304614745642173,307192685714544,6765994143939698,8183992430139923,8332098664561780,3659427539172471,3741031443102840,4825789752679546,6959911726701691,6915761791894224,7023081089260669,4520223824862337,514100615445634,8674515264668419,7239093039922309,3144992956120198,8426133234033165,4441658026466440,5599406799764621,8502719740583057,7103536295148692,2357651679091861,622441224682648,1209772424658073,8198513448688795,8738164006845602,8008479472188584,364565087667767,7804527525424232,7756075521179449,3647841808439837,508902008806577,7055261728349363,8726769789918019,1473961866124476,9162806226885822,4867352777833663,1595934830615744,6580006929673255,2030859780267209,3129038216821282,5548948138351823,4911393700657178,6614955255774424,706103541647041,1019577124560094,7375998979869221,7205963347860704,5220573389184225,5541631866354915,8065320590646502,6348547972702076,9105143755758826,2194955323034151,7361509469408783,2513324378602733,4457885385800942,3161532871277809,4587635268852978,6894226255404275,9203604384464116,4859775353412859,8902819353665297,5383223594614014,7158166711713024,461782740188417,8548315159764226,5964557464683734,494463967141129,1259045207784714,8873751016987919,9203515478809872,7343612892830993,2786760386665747,8423455045401879,9087852138447113,3028716900728097,698285873315109,644370393079082,988732306620284,6351247418031406,4198382208378077,139515998911792,349602498043185,3335652296498483,8109606237945143,8408399566060857,4198499180756282,5388827519681759,1677133773700413,6932920007498293,5552580708900160,8702710108091616,4714158113591179,6389429249211716,3198753970666822,162107044920650,227478532750667,2820253948411215,3883151244713296,7351047688109395,2268007129005397,23411576028502,8806337084841303,6581050066943322,8682348728464613,5509988085366112,318753867201889,535769200098659,2712567818219409,7561257594396008,7799789737273916,3089217673837936,5489336037358964,953093498707320,4003734301777273,7972493863796091,17194720378236,5726397753149848,8051520255729026,7629918936900843,2126405337234821,8685433271565704,7551100225437065,5243135517472241,4551937779760526,3514374978905325,407448029691282,7957529247407512,6238083520265625,1540317422427546,4862484404511983,2617041563647388,6140617354706333,3613737057918366,8137139080240543,4815811391511968,6801304034739440,3426925341662631,701739293703592,2743046452821417,144238735236523,4165819326520748,5061320371150253,5117645653990832,1664233736019377,3990995666746802,4763166891504883,8223511334591924,7387663436903798,599650940951992,1314319039700409,4391614263180731,4064286853840316,2042746766654909,1440024368209346,3042316348759491,2305537674395057,1079861764275656,2444084392738254,610656358505937,2800035416608675,2427630069939669,4004981968649686,2371942615743965,5736457769770462,589609306160609,3907414379036130,6451990595575268,6393674097237171,4086652061146598,5529718116735569,961474791636456,9116568327798249,805567635955178,31897290063339,6517309073898990,7452136772640239,6755259289755121,3088156639685203,7088487333109804,4096715400371701,2451114677272056,1381618515778132,6996153042394618,3520585928310271,5145926463004164,4782813123378695,6933111250976265,7110127391014414,7212825566687032,7907019556904466,1698404115610201,6028073531309593,2240548991671836,7888782736812634,7768719265381918,3241539718069791,4419989167398432,7211479318871585,5697444269628963,1587776957373990,3877859303775784,7473398994476585,4183793249558058,3837199939378733,7567946207930819,2210031822732848,9183080822813960,7934582115974707,4488093414219316,5478403506216504,2196326942048180,3620121200279099,2065212793085500,6153539319643709,4819974857522750,7223457521237569,8964470757531202,5685476244692548,6768251422244423,6461341395926600,7556191031287372,5995541932862696,520142284551437,1823422280015441,6667554494578265,6913914169409114,8736534741808399,472035854687836,2472823669489245,6723612958047838,6586186318315105,5715058933579362,4038818288975461,35753628815292,4583615753100906,6895037853990507,3031140906475119,3633911678803569,8319477270086812,5063741255917172,4035624520679029,3286872844525177,3597227978026943,2423621567042695,4010143690407553,6966416272023170,1039518105632393,2710616642442519,7066745558392460,2949992699756173,2635613036773007,7043666847055505,2139158404660887,8628372608691211,7068650257251998,4999920373898912,8462005506091632,8713553002734429,4437033193471657,703141649989290,8802572450193067,8637470637465262,8892293349318320,3635598319689393,2627583610896050,5073037400227508,8621289084231349,2142951518703396,2278031084158658,8246208687567211,6477935950274245,6204251308351174,3695708689620680,2504564855750350,4964943644982991,3099104156262102,2552506815635161,7069460798414554,2148479993806555,7742298916978396,3695295322242784,3917202416631355,1275570071412453,5926919017053927,8903389979059495,4051478297108204,6535373089038063,5478424833744624,7043825944898174,8970641725447926,8819329473699580,4672599254561650,8388975390441214,3330105634574293,4418062844092161,7194890812178179,1040344886247172,8422520975879739,9006881258495754,2541790730944267,4263715957341964,6974205576888077,3338077920477144,3716196977360660,8358598506329390,8509614764064535,8022234109509404,1240549864488734,7937537882077829,4431390979309347,1142720806092585,6352201065376749,7636528607878962,6876027089002295,3721891970121529,8728841177087802,3927070386962235,3629338054549308,8045875787390782,5826259611655999,111028908482369,741530057998147,2903473254367044,3288374957948741,8965230614261729,1563493597241161,6035214478599479,3480140655476557,4299967400714062,3810776893063139,3286620129876757,7212903216578392,8824778339958756,3509369164332890,9140164007139983,2360920311807837,5594135849910111,1982817612316512,4070152053817509,4522020653380923,7651620112932708,3456317645217637,5490236927770470,4870579255198833,9113983747252080,8312093844322963,8502982940319605,1494313911140219,6424244317667196,5146508137185150,3929652053991301,5897647205195655,7878431078023050,3857766878592907,3473258043244428,2827569506721680,298282370760595,1740815318712212,3132561194164119,2152367829308731,3868452125319066,6566521435643803,6596767048028884,5489892950051118,8459030763780763,5086793439100839,2139972793199891,630985128173481,4945224252424107,2264220493553583,7640431683907091,4302688789454772,1552346027179957,6683684483448759,6289250306998201,8582308617120898,4928711831676966,8183890658828224,7371968657891267,4207308784562167,3837535974301645,2356517124693966,2627496360165328,2613030727352274,7728231136058019,1124527427567573,1293591050436567,3029102248533976,4723226312810457,2885934553844578,5253305103843294,8180400488517424,1096737336754145,6261567793856483,5278953930509768,2690938712424423,5477156966391785,8799288455266285,4758805218648046,4652397223657456,766209704426152,3944568101470195,1574739795419127,3913811695816703,6542460641738748,8080521856589821,6181664778706943],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/5c07a864e3f86a705a73b89bd517979f",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001231525.1/GCA_001231525.1_4395_6_10_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CTUR01000001.1 Staphylococcus aureus genome assembly 4395_6#10, scaffold ERS002239.4395_6_10.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"5c07a864e3f86a705a73b89bd517979f\",\"mins\":[2282635019599872,5146675777052673,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,1060460441690127,3336512770453523,4304708589903892,366038575566869,4366044986945560,6433345649885209,5970779731886107,7000457640026142,7896021307777056,3907965771116578,3116364401098743,6506000896569401,3863448372494395,7140729989324865,6473020451774532,4230071825489989,2375917415634273,4660665155473483,2343748905513037,7804130505932240,1928140813881432,1635397195808783,8044186767290461,5966751971373150,1028053574107231,8960623108675600,8774502673891428,5695996928335975,7906264832782440,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,5378024996409363,7199198146764916,3662919159013483,8104812828225662,8968488620206101,4823510936105092,4556601114480248,1840877050794124,2687238688096398,5940834273493135,8248516013412496,6423458840264849,4283429268783211,6060888221364372,8450313866469530,8093041849651357,4626104524247198,3981187881433797,2278346208018598,979588139913384,980192377581737,1939633497252551,3078563432313007,1816213056534246,757043825455283,1451999676301492,7999157878374581,7169548162306233,8260608504786293,4275434089636035,5392923544264054,4784671531708615,3896588604084428,6479806504648738,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,3342574886805726,5908374364680418,9100377281368294,915883713245416,6675745817342186,5445372293271789,1133486263984368,4410612950724851,2417632473485558,8091788112306423,549043327607033,1631611902652668,8212410875969790,2012844047311103,948489885540616,7476293558784267,1316115594879244,1655653727666446,2377197744251151,2902111595423998,3590799175020818,1803490896380179,7703321150955799,3098701157064984,1613233089708314,2660901546139013,7318609661925379,4034436112523558,4009191020419804,8091310037205295,777026232017201,8985645944647986,6922370832007476,2133264542323422,3871300378636600,4040110223393081,6992758984360253,7445078125691199,8895922000216384,4072587914527456,3674047191355718,9089878662127943,4886619860382028,1600279738216782,5620340898599248,1821374948897105,3947602212196690,4022123607998810,4425527205646684,1006677272891742,4530178457788475,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,135329339445992,481260299161970,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,4088699334455693,3734458897543567,5940376136597911,2972258577203608,2110937203020185,2243509869687195,3242446598427039,596216438858480,2968451845775780,8143513944316657,1977044871266728,3073170219135404,8952362163265966,3299864180793775,7745961481458097,740802614878651,841012279439804,2352267404956094,6689558235349749,2767098068603329,2674945199468994,4280139481391555,4335034824061381,3058448658571721,1262572732781004,4532841275367886,922638174302673,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2628535144231391,3405658398716384,9088616725393889,1960882994242018,2583875797723899,1178198406431205,401948343550438,2462394055594471,8940994346209769,726621958005230,3517087197159920,5706335401980401,4252686649659892,3908832524493301,5137838574998006,9185892931558825,2188170162708984,5911809211810301,2546695760749056,7070848760263171,3527332718576132,162688560886278,7497816545194504,7490818766929324,6855779845853707,2823650723037708,1342278520193550,3506453766344792,8111885282243091,6748402791805460,2792625553547799,1344680504189465,1893040465097246,68515416416801,2176156635736155,1283325847532068,8303975859675687,1287624144806440,4298859764904490,5749761984184876,7194270142693933,1297442792150451,2744117220422198,2644883506979383,8082439380873789,6161629781725758,4111671466041922,8792974406386243,861160734184004,6681550830809669,239261345014344,3204835458417226,5360518378600282,2956783960371794,2591352585302612,3677235441902166,5459191191773783,7863282501620314,7266335543571037,1251060182680162,2114917240898152,6240582334678461,3466699351597682,2418223084651124,4891494248387191,6047329894011514,793823372574692,8556996361134716,6924058499905642,1337146668794494,7873500052288127,962398808360384,4260895368577666,4221257546306179,717815503766149,2166267691369095,985997338583691,7167030720094868,635178958910103,168049742848664,3008589367177883,1108575844749982,2868277602058914,2635086747951782,8473257377227436,3692897477640877,8821595848045232,4629281300140726,5520592147606656,7899833835700340,7926257273950906,7447126361371325,4279968232481471,3087196799197888,8274490618561218,204269439025862,7932357643723463,2439240982766282,8499668649452236,9180662893691682,4799709323047641,6170381369696990,4931065070871263,2602070490546912,6201873645794017,8190104329298658,3066294121266641,5538283699811048,387851009274606,3997317780447984,3950687240408887,1399315029967603,2995332410417909,1817613396386556,8499479516164862,4850545404588802,3774790396211972,5728661481177863,2836598586495752,3724983289750286,7724391001129743,2594511652127512,1863691628282649,2274688364516123,4216267683599133,5520319973442338,2389234439250729,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,5622224862577464,6770526131303234,8823214936765253,297526335300425,1397154956147511,2642347481506640,6035570396930872,3043432314913624,5749232718713690,5652844016120672,6295340198605665,7244890770803515,9036218450158436,4154170303378278,4933256683220991,4291307568565735,5085654057914515,2413571986957173,9187572004045690,7509411440202623,4117238218216331,2372154767496079,8668036368331665,7610599010751378,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1861015296496549,1471864782406568,1107583157015465,3359192181203882,8537231999136684,6482115257951149,6474396741751726,7467931263134177,6786250260919220,9025646331909048,7651082374915001,6833222729797864,410144451802613,2583472275850188,6177526526477266,8076461447820243,8815769383846869,8794208264791002,1338323295265756,2994560223626205,3428447854789601,5274301660094267,9158016872989675,7027985096934380,1625254992364527,6176712354587633,3048526863073449,8313458673687381,9188154261160963,7122517469537292,7415738719983789,1880410170582036,2657677989274651,5042862487835677,3353246143173665,297946451506210,6433529401226280,4828638417458217,2837875491333162,68026310562860,6713102526477357,6505518806582320,3426729133401137,6104920293028914,2683864114443316,4107508896191541,6653090173899838,5767721901851712,6240204079699009,4221925077075012,1378685439386693,646861831406666,6725129984717899,2583516015719502,1161506574537807,75091129832530,3504570238248024,8072469350093668,144929027286108,5685476400346215,6490932119479400,318390755435626,4325735311524974,3895465852974193,9166612212995189,517359220212855,7498960818033784,2167369577068814,851815340897403,6432046918378622,972614980180160,5452134955545734,310401436513421,9033672459342990,772117120378000,7279634878366865,4938927696959683,1890986035680404,1596244949587094,29860417139863,2185485247435928,4780732367944559,2086986011604127,7190948106835105,3312978247697579,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,2656151018808502,1751702385497272,693796660573370,7118726016033980,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,4602167547733192,81635630112972,5522533494168439,2781157967312077,3864648699065550,4304771496076498,3479272006413177,6789442171303129,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,2086682841597170,6629854081336564,4451688021447929,2744843007502163,232716207690623,1859721248011520,3600894962525443,5195275595142404,31276153639126,8427394283750668,7588963357979917,6988101536453914,3070134228672047,3671565933241630,5437318788326687,8413427240301859,7064378317985064,385907700483371,4110401245517103,1336059428508981,1618472691987766,3991686361896247,2262947123078456,9115939470275901,6974450251494718,2555346529826111,6091189699155264,2562320086883280,4819719989986640,2427434620065085,227412655342932,2613315185845590,8669223739008346,648548090783068,6560554740667744,4843831604053345,2752520230327651,8003729942197605,7319951751783787,3220718305670034,5155360444663152,5474832406320497,2952168537830773,391700864198006,51745215800695,8535608270551957,3963523983684994,2435321170326915,303994623247751,6570381896951176,843457896101259,1001268803252681,8935830662170010,7455948431881628,476228714505629,2282890545722785,5130704189359686,8707847105430950,7748200313709998,4405226557478323,550323193349556,9063963446371766,2732774152586685,5052182129870271,3881211648824768,6428212826580421,960356550845894,8431983561594311,2674318196962761,8860425400792530,897316570514903,8150866244466136,5469018164704731,3885943932519902,2181274350118370,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,360504095483383,199187347236344,402247873566207,6451364401675179,5077643932915205,9086189712409516,130457181976075,7425087409698325,4396323642545688,1603137902355995,1996572511122975,3517221940119072,2376738954628699,702798501799460,2850576000013862,319524505622058,2864627209774636,7613883562408042,7502333181040182,2218257629603393,8068985491437122,7530221302335046,5701137865421070,1757736763295318,482115931981399,6523795419047513,7611734689027677,985626569586271,8906959415711334,1661039179171433,2904355576731244,2506883728483949,8590428516263539,1387322670048885,4512180937213558,5590584270309652,2271529603798650,9145060402161275,27098339767934,4542558157555328,6760809165536192,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8505486301984365,3264746473492702,2973371054093974,2221340687153433,6274847488566940,2129273223465242,4666457024392133,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8318515508209328,2126217008342710,4444908075767479,462594584405688,2757742046635708,1435058818705086,8001342250198723,3128499912722119,651657068725962,75607106131659,1762891633565304,6759506089019090,1166808652568277,1050472124757718,6635096463206009,1545195813721824,4304614427552720,2521189072553595,4886591475197669,4870118807992038,5078643480934121,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,4494745225119689,8307942525970189,7711242515060495,8791259289515792,4556321790367505,887468836411156,4210999028688662,1676612448274780,5587667073572484,7327034779342626,2254292328232739,8909030726132017,8552312296191785,7553352169367338,3507837377017646,3343132780332849,8546891284027186,5320260141112286,982783900964665,5177776401921852,3478329653159746,2970622895822659,7598272163776324,2016823776880454,500006684268363,2339293216622415,3672006595839824,4974610471645496,820079529219923,8059723177205390,1290139896432922,3300357632857948,8617233707472737,731807987644259,3843618476357477,465037166274408,407494504056686,273825237814248,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,8696795531732859,5853576310753151,55532696639127,8154597807642509,3421783037114254,5664055981840276,6609130413963158,1923517010253721,6655834216400796,8449499606388378,8935628239632291,7640718988732325,4918723631200166,3099173012382705,1541930783479721,1800517128877994,5300625464223660,7687547568949165,1629503790397358,1586163045525149,3700712461854642,7946192001620979,3086808181540789,7046481273812920,2382029668347565,1229878691049804,8690783830517706,3089495541412855,8326254200203212,5550023567304653,4265524355446736,514142706336480,2243252221102035,8655319023124814,8403538092447702,1055754057562072,624885245548506,153369867168896,8286237998987231,8214132091116539,8189536530413545,3390716620912619,5476876315310060,467366249592816,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,8681579408549902,1250269936830479,4814392193636368,4855337625377795,405651569137685,286013271918614,3982264274397208,581050367395310,3365276175554586,2108576829356059,5967912106082650,8231034623248415,5767914751350448,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,3404645514262587,3441561624303680,2275693130250305,3423829195130947,5330443437426759,3669669445212233,5391072142911562,6994098420947023,6445197233936468,2614524117768281,4224499299092571,6415637455083613,9198749196284261,2879386380826721,7323875920791652,8369242804119653,6106536950036582,4898691182037097,2464176813176938,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,7647986012981381,1998211285457031,2893765109098643,2343666349557911,8021177217775772,9032222468051313,4079964453292203,527250636097708,877823276431533,5524874001115311,7656430088894642,2736562014918845,1224794385881280,4370251230234817,6547833949292739,470023763785928,6932846907687970,7424197000927439,3178755594893524,8121186809886935,9059221439596761,3495883689957597,1683181509208287,7670540484323560,8292970583906548,1219768655680734,2555251262871802,2057763371387131,2809509062039806,4037615708129537,6141646980806917,6868805569935625,73265497950478,2067257304910100,636994868279574,7805354275301657,3442643861129498,830388703421489,7797236362615080,4722534397663531,8823763859310893,5369751621683502,932244993407279,8995213276330288,3264293452933428,4363526816403428,2084532488939840,8656843213650242,3755199397484871,3734495735626056,136723799236525,5608160409942348,7393489351358797,189283170584910,1544646640245073,792942249322835,2449484392376666,4672484486412636,4633515119782238,3838756300679519,1923663661255013,2528889561520487,1757176140671339,6247490209868140,9049977009835279,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5502346576963992,1580143928650134,332549451344280,5602292474825115,467664463329693,7064012510296479,1541713433336225,8105508678531491,5840344637290916,9130305682536177,424135353727401,2096841890683293,7675482551941552,1333593272314289,5564848928414133,30172216461750,7413661131340191,8069172111739324,5259563716037055,8863704050444738,4260640978303429,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,7873984218462683,3681130512911295,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,3568367659125226,6846105922922987,7553111683168749,3182861987777006,3700692511144435,7122509300181493,5877863094458870,4341759536675241,4904849276455417,1383270956448250,2182315366574588,6574721260816894,5917290617760258,9179669523560966,1553419814780673,3283597017790984,1458416177129993,4355633735907850,6072125870725644,5906462950118488,3498979658738194,1787508922165780,6237024926180441,3398608445229595,2555709334280732,1063417425369629,7885678641654303,2541091443550753,4803260508523042,211721470048805,8974862207918513,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,720459020642883,2085938533902923,384651385379405,5463030304823892,4746826772617814,1768705500031582,1707373643631200,8361022599817826,3563874166663785,1387363320081002,7464799420283500,3279510064929392,4204796266711667,7357884307374526,1965966511262331,5677483308395132,7505984773102219,8603296405064333,2192532495772303,6254528881375899,3796894009887390,4001936773421731,8833716684167847,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,2885561946520247,7779913425963705,6947539044592325,4461197842708983,8334953150270153,1880421043525410,2027494681635543,1390679848778457,5119942787128028,560690008429009,981946939239152,4952730055523057,9173197031722616,8124051107420916,7439205940817097,7046896457378555,8338543371344636,1102254127540010,6216692251380481,1956410942925570,5681948115341099,5957570610092809,2760855083342295,7012232712137487,637717087886096,2057294021864213,210402935216919,8600761421888281,2110302892063516,9193508402337585,970330114464553,3252916289493808,2100493461572402,5525998140009270,7161054261140279,4021653090544442,6632433388350267,9073605860059968,7088305201981920,8711986948082498,7987192474389319,1203079434555191,6821187116937698,4133002593487694,1635651637476176,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,6828781212150625,5279738514840419,2746847273347940,5565618624165953,3042810235578172,487864828935020,2097088251825007,8783891734748017,5424923310544019,3408611869207412,8441358375734134,1164683235056503,2765804614536057,1239923617995242,4396390006889344,8489320569743851,1069535652674436,181638314539909,5675853195025288,1552378516372366,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,1169438882554352,6348876083243938,2099648782044067,6086204123819675,4797301698399142,3471569168190378,8952231969012651,8075354013268908,4015480834878386,9126554829507511,4865890043296700,560732034878399,569858133703616,6399543881865718,7057729200712647,8346095201381320,7126776287083465,2361765179657163,5695909244033996,8647056119409616,6899487686306776,4859866816269273,5004638558784474,6074702285081566,4959226496953312,8996314752293859,6672925459491813,1082376892709864,2680596330777581,8506618169158638,626168875564015,1299923441830899,4704429005052921,966689432144890,4912195048307707,6056496052079616,698042668139691,6353716854512644,4875381475535879,8557212358855689,4964781251513354,70088873618451,3884489623182358,334844623043610,2198108027522077,4180542909013889,7164125418732578,2908244240583723,2191923344596014,8574345463184433,6486024147708978,3649154946395190,5723683002481723,2907874448857610,5356878132681790,88288992812097,3711070083308612,7867843017488576,633105738161232,9157569010814040,5768890711293017,5097534116879451,4955365087054941,5671450707164256,4926861423238243,1960247201090669,8352822593735801,2392984746015870,4018290538196096,3128705817382019,7589956941211795,8158821542825094,5256643637594029,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,230286193532068,1238619339054246,8494210442632362,7915404058193074,8875968855564830,6086409751379126,8707651019648183,2771632487820472,8644146702531103,9182108430318780,7293093929815232,7662411063549122,8783786815601862,207892688386593,8197445232532681,7464689979698382,4086615967075543,8765804629499097,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,4463836312960238,7666194411646192,4836608690859249,2688817209527540,4579041725200255,8246219929334314,4285562358224810,3567107464158468,1737746356272389,1448775314115846,7744785380621575,8518051298163980,3556579375844622,1561783378768429,3561867659214099,5287326670494996,5000612806597850,6152522718874915,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7678005521333574,5351668498910539,3285144305491278,5084161271253393,3735333997858134,5183814044446040,6268301756915034,5890867670273372,713248293268830,7882993032424802,4856610212101475,88437141712228,4352903144828262,7407364839177580,958802972458216,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,1393605004676476,9140899795443072,5151281455619461,3660772568489351,6341820508011913,7526121950424472,7690101890186655,3289590076870051,7018996086578599,8163870665432488,6550313765640092,6403894935227820,5926443562442162,856884970847672,7674181908761844,1458767657659834,5947103608716731,3709197275708863,7776477814955458,4646842126761412,2690941375331784,4782498127412683,1654526522764751,6765822772116944,61926092041681,1677868000382420,1801073945726423,7385626605825504,4736904158449123,1784880874720740,6548287328611815,4368166270504425,7864494568558061,4717078305738226,1951053797429874,8569995544546809,3152905102806522,3549731255033339,2923610052501418,5336395954564607,6135375769182123,3477567545936470,1987340210712077,8205328358469135,6606044422225428,8028597787790870,7906524426948124,5816011168292101,1185378970902048,4870364243930658,835582845963811,1345534315535910,7122433204903463,6152554647457326,2499002377216605,4393052211822129,6930698324287026,4005284196349875,5168981785230906,8453583119834684,3401051871010365,7906973945146948,7156388644240319,1059006959607370,1993005114900043,7493708287558180,3041547689324113,7682210448059988,5580264614796559,5603043202166369,694729075228258,5862755334909540,2069399351119471,7180711155708520,6644821181082899,8084476987051640,6355524819209492,2479347599965821,4155506935291518,6521037990264447,8204114985614978,7428929518419587,6497917926444676,599196216102534,1478175721172618,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,896023919447705,6810715537882778,6142827993272943,1732336648466079,6607041102383728,4629811890911734,4725106938598002,3909095957802670,7687805010646954,1321439432887991,8156124609695416,6954175431241401,90076065684274,6133069365415617,3555666348039874,8660225691913923,2588162975686006,3818616056618695,5816608308592328,2300314053840585,4613385655691652,4995812233531084,7374706893274831,587253656190676,5730136195698393,2169107663986396,6128252439805663,5500657232277221,3317176258019053,6720662867434394,3834083608280817,72583097564915,7041236094631668,3931973464080121,1788226934370049,1262523435581188,2729482319322886,4194303986672257,7509575534522121,8399396488744715,8247560756327042,1205143099420432,5395011470851857,84834187095829,6247058132823833,4363284863173231,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,5439322017761246,8910676381798199,3989388368871224,6737890810986299,6756341285068604,2559496497311550,1364538786766656,919134658182978,8605736591634244,6414585907380037,3429891841847111,555164866154318,4050500137410385,6631465887240025,4577018362126171,7473358281035614,5615591727492962,5527959960305508,3501948952465253,6256027916509031,7383880699617129,7535376972951402,3333979680154941,1805282352299891,1607268386283382,1213457523695486,4494558117785472,2569719125127041,7845117427883906,4848772203458437,5513139560406924,7039911616343950,486995003146127,8599745542954899,5902112804884373,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,9044286231537648,5707862725947303,5917734646341545,5972497682370474,6149574672191403,6241384143519661,8039034717364142,6198150788190135,2345917413478649,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,1351605086977997,3802696281022415,6015913189748693,392326751543259,168902776664030,4276573756637151,466507606347771,6113307333423076,1879504332029927,8980598175309801,6060945677271018,1189989031567342,8459448655941615,1503829884784624,7969431343923191,1301466934951885,2199283201691644,3109360564465662,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/5d19af7826508594c035efe76443138c",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001355295.1/GCA_001355295.1_8289_2_78_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CGGR01000001.1 Neisseria gonorrhoeae genome assembly 8289_2#78, scaffold ERS135281SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"5d19af7826508594c035efe76443138c\",\"mins\":[5100259079884803,5570385732253703,9170861620080648,2625774846058506,3887000834422103,1072807848328194,7455687611238415,5041372978438162,2070043917422612,7440672985321671,6806422178992154,8669734108747803,8499809652680730,1442763333308449,3576590259101730,571876416593956,6628446840471590,2767304909238311,65561252495400,1579820673611817,3397259963799559,8560557924192301,844712832069678,7802792317242717,6396318540826673,1327419869860531,504093571473465,7727537071299120,4557752136966154,6868672173840448,5632887084619841,3237696690079813,1733776353976393,8070086841587786,8171453445980235,8630680180623436,8950807782379597,6652141122289742,2636811743172621,3685937795166290,6346054786349141,6678665185519705,5870772883017818,1575634138769500,1373731069939805,3435916200802398,285723212427361,1892575065229410,4815739796205670,771961338067048,2429430370523243,2714222965505014,6411411307386898,2864780717876951,2968850862979183,4396218578514033,3683327633940595,4583178721523830,834857157298295,2401718474297465,8945670320099451,1327141448126589,8753758580341651,2580925226897538,6496973465391235,1976889011636358,7395412170632897,1054194599385225,824899554597002,8028923077083276,5528158130206861,1115243511457935,5604213675936792,3800088069310611,6022481978155157,4349831714215814,6783278823328889,8927340010864094,3717965743728324,309930287669405,3883560060016801,2684861438625958,4312590888900775,4135768060799145,6909207418407082,1795767125749932,9030128876352692,8361023115405486,5931412103647407,7552367111536328,715371495762098,6914931314507123,2165756074559672,4105609634987380,3121941017014461,7174460189034686,6987916434254017,4448455001098434,1542902629040323,5477344528134340,5927285101082821,519266138761415,7279606234360009,8994319821079387,5737110246398155,4496335119825100,3937383494987981,8886250113480082,3888197297004752,5748367736264913,1842628903987410,6015402872494291,434650760399062,1088251595409623,1457970859581657,467335544828122,4622988034265307,2922054599370972,6142096762992861,2637714021554398,2759908238813409,3027712700834018,2495793099186404,6972425280556909,8735675173269736,3205355914348777,1030805901383915,4807968632248558,8309147672469654,7870618432581872,181400431448626,7155727241517300,234964427733237,6554319555442934,9211432240529910,5940708104421631,3335546624989441,8576725296492805,5524295712765349,4972031586185943,6489004782728961,8014055096083501,3328692143327505,8701542172750098,2914259494885651,286937693145367,9035576144093572,1403420909947162,5654417032450332,5693813162068253,5239469881477406,5758500947806497,4780588693010729,7341239064961322,781790256706215,7312580901042478,7176818078196445,5666419541111088,3543741443199281,841103770956083,8227024691658353,4442945435820344,8450441695758649,7819522651684575,44627299608895,6890931717914336,3534284399731010,3797312904292676,7069551626416456,9163647923542346,213138952091980,8740001142958754,7910732291136909,1531753741443410,1439292955947351,5487891855442266,6457078947450137,2403284806347834,8587208927971678,6045125276020158,1004508126718304,702884938205541,2171280920582503,9170068578490729,4443413599029612,8106711761756525,2705885688172913,8223354307697010,5408574430764435,8788064941774922,2747761435615606,9094901810425213,8990688868772220,7424070670984938,5106358351083902,8179619952347522,5029781377307011,5330150823399812,1982152139267820,1346029830539659,7065940215763737,9220194308353450,2374380369777038,6464677149200785,2126385437153683,2918018713377175,496518520635610,1940868191244701,5652121927916613,4366850751662496,3193305990322595,228112583430566,3647870845057447,6393423933145698,4336700737132973,896816288491951,8384611152849638,1527678233649585,7348505644755699,6108661133840457,5578812249276856,8884841715766004,5591561889114554,1705024798212511,2115202547651005,7541485932741054,4660675655606720,4843250651560385,3706441955539394,4142511744158147,1296887478815172,824269115437511,6022075062548936,282300128917961,8956643495113076,4064590593362379,2312833232230863,5814463478919634,3670032781883859,7057021044549710,2758420164438487,7776241385069184,8595943094006236,2366867137728989,4700334267560414,2182361601028575,6816886097887712,7291300706238945,6615987207866853,7084669652795881,1352468053522922,1537125487557104,4635132941738481,7540839429532149,3127063732029942,5197766734524923,826740018348541,919452363573759,1438921451649536,6533800264101354,6226280637673661,3639260206303747,8402425949516886,4130654810208775,1368164524698121,4441065288801026,8006923614898655,481930355905040,5749041348145686,2956842461147671,7950472917355032,8480541250538009,5333896588704285,8071978068197918,7037717964470815,2634742375389728,1582250619787812,1163994897903161,472461694630438,636978216112679,4118535842912808,5924083222796380,7843275436137002,101136557823751,650886718097968,2358792287939122,7890243454436787,7162938880879156,4242926690257461,4055726676521528,4367332371399228,5474479894245949,3843183596464702,2601672638474821,6452525169528377,6173582981919153,8378961118251602,5631247128570451,6915949104535641,6450851097403991,1406498415233624,5083233327237721,3947284344187483,627473948662364,7329049421562298,5783371696949854,3985642764501600,3552881265249,1943008010351202,2498847530773094,4617659393061480,4854339445218748,7198978405021531,304814499277420,5973887547206258,4639948581005940,4708726813914558,5415935321107062,396336678337143,4819234530345592,7649907853402900,7900361440420275,6149868963480187,5635559219053180,1668589625000576,7535868672946817,4106885729752620,3969585193140331,136268389118598,3114983550939585,2235346569392777,7229576544445066,1996573371472322,1526295205577359,3794406391919251,9011816295860526,995870206380694,3983222480220953,5634638125777564,7225899052995354,8912639285728341,3097530511522463,5704266029867681,6140818314670754,6396243460871202,657999834622628,4494924090426822,4445002683123825,1992011753994921,4133448574515887,5693138933113522,5257409924776627,7536864961479348,1498262160653086,3324203025058486,48849637522106,6861386831567548,2319205190994625,6245191847746246,752465389497031,4415184822042060,7876271456154003,2105362656729810,2739258920829651,5059894704179927,4305831434554074,1921242722249435,3973480336308957,2249855891350243,6748998699123430,8213179247925994,143504600355563,1788743347258094,2722226026599549,3149476171750131,5972494735960820,1900258472342261,7568216766888694,5482579155122938,8661607716555518,9132806078266599,3251160789007106,522047468839683,6988590755660549,3723105516571398,7591305814614794,6660524207753998,4600345632975631,7880417349308199,1384040177572626,7648302010358548,4361498608218905,2301668658785050,3779293755431709,65372587152158,5017621170889504,3858635723892087,6753965563425572,8921941070119717,6543697804313384,3412564927269673,7988690421469995,5970552146778925,8996593369025326,3866022158879539,8028667924794165,3741340230183923,1965482714043191,9065422581822635,5066604741522233,5992348130104122,7436486142116667,847674267876158,7916033230218050,8444135494093963,6673852775115589,5862630726505286,5564830231542599,8100722913845619,9193067584619319,2868823306220364,1958689423468002,9044422308324933,7687903058595773,310342615659347,5141013441090389,4852596782904150,3006312305324857,5338235253049626,7130009441174671,2376643722996574,7094733299763685,6486833161296736,4019652853990243,1886895172834151,8795658023197545,4183323113614188,4980141643776877,4939686804243311,8981024989424501,3948176970920823,955809567529849,8102405929685882,1392373452520315,6849515734178684,2194993540615037,6730082499195774,8508747861905557,7660903129162625,9117503249337220,2322899147338629,5375039587450689,5572995144375176,7940319964714135,9210742782743436,8120973918787011,1457783418237839,6011861807233939,7955085867485485,1791788358327192,5398896788149146,8104390132493213,5488861398971294,7767312947090340,980081657490342,5423923324889688,5633451181585322,8972001991408555,7605028079362988,2036849088054189,1052705240992686,3293867442722973,9209958154462991,2371934420176889,4952739985814453,4293138922791864,7410127493872569,8906610364421385,5628618709365695,64638130355136,6488323437710277,5197885685768353,6366599543843784,6408345631329225,2494183601589196,5277347203226575,6616943735680157,3694314988770260,4569169665532888,5441460086660058,1088002956967876,2998275865957342,5161490558405115,3463876251339748,9074302555567077,372087782865894,301958105612986,2753656834919400,6801734451115516,8506357168507882,1248770096063467,3552864984540141,7732027214461509,4013201068529009,2089331436268528,5611513479803889,5400175783711571,2370159673140213,1959073981008886,7004469910254584,5754563822560250,7122882722031786,4798756220304382,1764524846316545,696094623484930,1501851358546947,2477352775582724,7235532819998948,2368054674002950,2541796344347655,6000957645104136,7003131705288813,532207471795217,7679137097906691,8724912007816899,5134307584513047,2783623997785112,8052870025868122,592118698828831,8922022351515249,6198253968074060,1768970814985251,708870132218917,5255307100734502,8394441630097585,4242492056267816,6351178492166776,2953862150870059,1959756824364076,120937910191149,5239686779399214,1363032089742856,111719966458933,4482142774770743,6115911851723956,5040120614769722,8532516206375995,8349811420582974,1965486406992963,2455130825274436,1685485909476421,8583517584665671,2598166240660552,2465587342222412,7911231778416482,9095491172526605,4742222186179664,6103568574945464,88897028623442,2876343350713427,5542417335450708,1038087768310869,6197386471672918,5184519673687128,1779252224681050,5418444724139099,7815663413427292,5816516084984925,8678546258484190,582395963520097,5903805098277987,7385689543894545,5978479046452335,7949901899424787,1973917733080179,9148075239369918,2335032944082038,5441656821716088,6211796127065209,4323482364509242,177814595456124,145806933838973,9204580010962048,5555334424544385,6158564173726856,6371676771015817,4260323936418954,2038432650845323,9165584951559309,4401734860563599,8204394891772440,3449527235574935,4603525896287386,4846007387581596,2404751895782557,2646400026526878,6280578470492357,5083227136279714,628482338415780,2255266406638790,4460234035442887,2346096104055985,2587852166554802,95722563509826,174997313311931,3013671724557500,3191805016556734,1782674147919039,7701327492209857,6705200998046914,8272657268059332,3429891054640326,1290447015269575,2005112206576841,6062082001491148,6939509416295629,8369949996743886,2419607747413199,7919786770216144,5605661113101521,8830361313752274,8634749083575208,2569931404702933,8507246891386070,864985011914791,4924591648466138,8751349209144539,315701476156636,5797703170958811,5019851374085345,4501490653201635,3529522672653540,4775493365607655,6647703765263594,9087913058542802,3815811071249646,8961975362004861,8660741041117083,4707071796655345,6125145589261554,7882970477855987,1478114903508212,8579930553711861,3643668164054265,1696204822977786,4026226295913723,2656884806186236,6974197775934677,9029220935509248,4487822594417921,7245664030850306,8658631624254678,3393807479125257,4271438154923277,5850516866454802,5137411688750356,7760050673304854,2909924576537879,6650036116758665,308361553118489,7239031561870618,9137811107114543,1544101425852634,8596333332356383,5094771708632353,1696970340037922,2982658402557221,8023652640269873,4857504309155113,8665101148629895,8664234249628972,2325587368066349,1805247577226120,7252564462086036,6109685479701812,247475081663797,7939681612396113,2170849717620024,8936090967855093,9208417213805884,1523879400137269,9203966702230849,2592337359603010,2094383160479043,7695121821043937,3958199165412680,789459478854985,2958520282838347,4252280983870796,8274850223526713,9003009900832653,6050586513198417,825017099165582,1290111760289110,1946926880968023,8199152421799111,1721824087205209,3126967493705052,1579058748333626,5410453245779295,6918175698443618,1987634936829499,3766644018734437,4543913981277544,1845167870494058,8532665085309159,5773993369439599,3757594986018161,2529260543921043,4774956738479476,6999591918910838,4461198895564151,9129078539189466,6041403720349182,2522081799505277,7624278633242517,3547929630948736,1604566336423297,4762602298549640,660211232431498,5644914359747979,638705018848653,7586195065605518,2524982492411279,8404576717714832,552323512961376,5472613483230610,4319590106262931,5072534764936596,5857973207143833,1051212937980485,667993028283811,7682054184039844,4315509768353189,7310184754371437,3597227741001128,4948270307118506,4036141700394412,7218406045412594,1289067383535022,1161197965690291,9202329417823670,1404997090500023,3187283821884856,7648698505624820,2642314477604284,7359388454501821,2759811632946622,6014915443273151,4334443621473730,5225095868194243,3778909619626979,5673829763024325,752197058944454,6810565376309153,8959591626798059,6143363412630986,2584174865776076,8578342638288333,1714823344162254,3755883712708173,8192826297157072,3606493327982033,1313989840790994,7087088700118265,8453208629835845,5352221605682651,1524146615901661,2635776839097822,5544745437112753,2209778012417506,156883826666979,7348257264071249,5341398431489514,3507447847513579,8484070723560942,5590551867143665,7109235784162802,7541578216029730,4067902261544436,1146979533180406,6857653351962537,4176266151507448,1526245799855612,5268700123000318,1549874787563010,8179932472567382,4357207161183750,1862149629746696,5092547519827465,2576663086167564,445207408596493,8754084643591696,4751031421427288,5526025204866580,4389863626268181,7559384299922966,4551209366739545,3565490036475416,7422419701567002,5991686723380763,3886920798768668,1930292976336414,2580357068256799,6010978452723234,723122469167707,7489418035953189,2015852700689960,8565914864112891,1041583748042284,5477670618211885,8000898357319215,6176537965736201,2469737093092913,7776778810207155,2772805974816308,3814638520990302,6611453948973063,6099354700001545,3144617726524984,1339160424959545,2492510369345082,5654355770717755,5197978186589758,3647035822270015,6924488593889888,3115568023846466,3402178188770884,5958724597708357,3048500390872647,7605435187054156,5907703533198925,154960555271096,7592421613551188,2226388237260374,6911227041517143,4289188838553176,1242773641586265,3674794047303260,8244826388143709,6028712750417506,2297902660746856,2400149034143339,1716270530719340,1082858470116973,7611988628199357,2910386408203888,2299569924036200,8288733761814130,5506755945719411,2723979502120564,6018808504358518,3688616487716471,1654553457415802,7510032252061307,2813157106036351,1752711593008064,7153993001332354,4206697544707715,286385998464644,4062962872663685,4095691240144520,5564096305257844,7164320814167690,8953559704030860,7157112269412290,6962820352693905,8719184043327122,7572966787454612,1256632879275670,2095141154207383,1412143593899673,8934230356422299,1117100395990685,7224023570341534,7980870684055201,2898760831979170,1216641691793060,4656000103847589,724056687230631,7321313106536104,6917215296626345,6158091409897130,5388178620876462,6335057260453551,7479832618628040,4800575858695860,1811502562424502,8449166762585033,6136886726599898,6522225801715198,6064345814869691,2582558043426492,6511873095109237,6430487834148545,4137925226606275,4405037053126340,4061634964047478,4260276469039639,298260310234826,6034283015384781,1146201127526096,4999921497229944,2321998809495253,4102887430252247,5983000855629529,2720909029422811,9160798607488732,4461662635106013,6920919441118501,5009348385130208,7680847598642914,8069320485228260,8108796282289672,9158714899242961,1278090048036584,6407115936446186,2969308747767531,3079851433471724,96562284838637,8935119121217262,9222953684219631,7177591453894415,7226193446762227,5349240656623350,8878861914022185,1446900736558843,5574512955041532,3952112562440397,9137635568660224,6483023028949632,4016463796102916,4706278363551495,4994040334965352,781638343796492,5608680039198479,7932339816699158,6493707620053602,8954189746278020,676229362067228,2817942352810970,4625105457913630,2946079566950176,4495777157050148,6440982810485041,555432107171624,7183567939075036,6133744254760746,3337758153484935,6728646619940656,6163896575056179,2047748885620532,8099518336619486,8048038553385609,4402885228267321,8466747381165882,2467994666956774,2862639878596413,7313504060560693,3073535724003137,8383640412451939,1644002988539716,9017162604685555,6702695373463366,1219167363809095,9071878139209356,6148245037893027,7431075596186279,718295377787533,2135443968575314,2564972579281003,9026234989508436,4398782324948822,4319517361258327,5037269254739800,9207929534863193,9120090978242394,7163417951889243,5660921330810719,4855581087168354,6833930372892515,3105174635587429,7026024050911078,7688683345213073,3137419614230039,9158504310608339,355118889033580,2736382209245037,7474363944108713,9112826138482376,72070874111859,643857618069366,7356669010372471,4008471171037048,765255476006207,7060200132691836,2100510872502141,4059597303132031,6377599036731266,991379477243779,4787864617848710,8507395251303174,6642928343189388,4074812450407746,3899374469736334,1750579616003053,2714782479040404,2972955492941717,6217106060320451,6016184736901018,7593207075653799,1190323512385437,7823992603066518,2539787973583501,604074866714529,4992736328705957,1911047440279465,7633986145008246,3295459893579697,4874861922768818,719704575270835,2660437493014453,4742984252907446,7925334227481929,4148594506246072,1689397462956020,4770554057557947,882608200685501,6432443836073918,7876416765834092,2849406936567744,8412144537530305,3871104110737346,1798300482934724,5131066988269509,6579978303944646,6268318691758753,5583424580964296,3906526966556617,8278082821906381,6583335954812878,2803737362835409,2204596289417679,1762906333214679,9151659575733924,2807559735824348,1545018218807262,4997217716574175,1220150351828961,3684628301711334,7706089481910247,8359945739442153,2553805460694534,2293661601840807,352533504739308,3856993557749743,7912651911206898,4902276098525172,8311788064743422,4126830742638583,7005391390222328,1137256007364601,3923668917839046,5676588981524478],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/5d813a4d317f9ad17154a99d296d081b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_002040135.1/GCA_002040135.1_ASM204013v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MZSE01000001.1 Salmonella enterica subsp. enterica serovar Enteritidis strain CFSAN057735 CFSAN057735_contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"5d813a4d317f9ad17154a99d296d081b\",\"mins\":[7667242559123457,8350358619417537,8832940841975813,33714525184007,3889674188935176,876290879189676,7149019143905290,8510668751457623,3074685262462990,7020060309848079,3348913372110866,3449892164485139,792944384274453,7139801138402237,841835917180954,1329129177767965,6652061552234527,6426478573129761,7567752747511843,312543422750757,7653629477826598,507824480366631,7529431108581383,650748759298095,9015801892982072,8781245490012168,5348637647970355,5675901661478964,7547465771229238,8981126744596535,1532400603127865,1086732900704315,4953237476569149,9080706751844414,9099768538697754,6246951338862089,7376740728343905,5150220836593737,7246535767870135,5510921714606156,2228149444509773,7569770699735120,5596152345821265,2653031016516963,4413466296205396,7699437898006542,5249095421169750,7328014713968136,7953805352283492,4610790027702363,5951872424226908,8737067013126132,1087389546942560,580002293616743,1951587606835307,614117598728304,3100798366208114,6024992530792467,675798713393268,8583993471856757,1189114657366134,5842420426145911,5796818085355640,1160729994289273,8256658137195412,6903209903747195,1450361857089661,3478924149252223,7107113391155904,7942717148176857,6504151754403971,4524318504613910,7663983071755849,6973052897427592,3187359066699799,7263612589514892,4558203357802637,6862983510023455,6231973802160273,2099869908435091,3220579656319124,42268254855319,6477809343277687,5014972273836187,4657657665306780,2996476514086938,781260490481824,8089933666603169,936075973243044,6980401474429351,8845468004520102,6793712656031911,3981595702952107,650551306137778,4197046924042419,2315390550597812,7154164731192555,4458146038722747,8982782956413118,8400820012121461,5695311937183936,2920441813536962,7542189195321540,6278955061215429,8582018279369837,6417618610426813,4640032178831562,6763953629155534,5717435355128016,3452273148465362,8057304480622861,132263687037143,7003909459631223,7023383739617500,3190549188796637,5682379950731488,6559427145941217,2421205544034530,1125902530592995,4466484413501668,8258305578123496,4841648755024105,7252117632917738,7323291230337063,1581957821534444,1307173302747377,1774648604870406,1184730021462259,4424877218406646,4825560274542841,6066866288050474,8909024974403626,1440431595780821,1004510776971521,1807491613298946,2250624551235845,1156158785220870,266407656232894,1578988311843083,6078599883735308,8593917991178512,3011652750270737,4645519556905036,2753451435856148,969964248239860,2313840849371415,1381701257413964,512065760100633,8634023067414575,6030579112674681,2420917941133598,8594519943042437,1960346487296288,3900541634150689,893970498412837,1297425988411687,6144407359025882,2512037354959146,1155664869794091,1787347884196140,3539105648775469,3112655412801840,5448727814881585,7662007804002612,3021391463772469,5440312139134345,8838522650569297,7707106954199092,3632365681860923,209777099018556,6404007857589541,5690135547568446,8030581497893183,7130062024859969,656549296901515,8269566335140577,2260632422429007,2388146285723984,3057984860864849,1817116200644947,2784447813493077,619222914013241,297717739503960,4819275655426393,6915139761246554,3233700112089435,4628636252754269,6391180946272607,3854093525619041,3335603402944867,6284824850235755,8474700753287847,6754270791711259,7823512286564722,8444411046870449,7109926634643828,1794452093776245,433704331383159,2707621029245305,4808857808662907,8131906424004990,5133649707032959,6738942595015040,4600723580223873,2726286372151682,4709752988127623,2629446602621321,8097307820623255,2095969561760140,2288712094724493,7022747690851053,7962500072292833,8039963334221208,3888981362831762,2903903621726613,1750192293802390,2812252754570649,2478756357808879,3614784003117468,4334174176510365,3256840136970655,1308466320654755,4578214137905572,2421660401136037,2347551799898535,1380215867683240,85776855069098,2760225684802281,6288016948826540,1932222325929782,940213145788847,112689236447861,8620242805401399,936168157114802,1027644789920179,943922633208244,5579773940218674,222518498161084,6839209387051082,5067407861301694,5375588973632245,3392660871418304,471720962580931,4970899479007687,5269082233635272,470297017143753,1473107342860746,191913654223307,2748361177846220,2922225705398733,4038398964289998,3588157351575629,114474105471440,3464476123365841,4906984463589842,3118987320689108,5282540936131029,696310894365433,6013743152714200,1164558456426969,4147229481234906,6266956533993948,687497605399005,5512520582316510,7983825673137081,5077605192575056,8559911958933986,6854997912162787,1294946232029668,2758264492147173,8808723415326801,7043159233139176,1046687379259881,930872963293674,8701922676152402,997142266790383,5851260883857904,5890424155301971,5469193354794504,651565429694965,966058389463543,4411291880649212,8967579758163370,340293622497790,3583119003166805,2590864661832192,1404315542372867,996059339366916,5652894743945312,126348862841351,7731244410036744,6077713026503179,8880291889525262,7502222724588047,5870545779999248,2410193198547474,2151652043604739,4691692328538650,8207992784237083,558452714897948,7289601377673757,6747497791470341,7726114096026432,2154689808757283,2521002441265700,8583199448278195,5326318714572209,9125443279180328,6509084823900717,1209885410484782,5383196484416048,1882484501008945,5138493665624626,5367164803007027,6240203996049980,4394433086984765,481393158509118,181524099752032,233642889462339,3951151769940548,3054114053513803,7323835294949964,2472140177142350,5597608394555986,5780427990733266,5284633093022294,4872114199741015,274303073649240,7345512011399597,9162821235325795,2196089090658907,2167397794914908,2812912326649274,4818858557407842,6798941970354787,4500383581868644,7955485635512422,8573140353680291,2336312330912359,6757364267516520,634502016692842,6054476545831531,4250308158407276,8659628277334637,216194601009774,3363025795113585,7425176196366962,3359597145752179,240458063143541,7940050763817590,5760999445373559,52614158455417,1724570649657981,5311467358931733,3029535331676800,1374908026787264,8639849475287147,5917500673159812,8689212079665942,2942332323517062,2348406629249671,5103956205011592,8029245432482408,2538368041894538,4945941309545239,3723147829305997,3073272315818639,1394352714119960,775420119408067,8820099366415694,2708478246412950,2288553949987486,2215385946845855,8293247778134910,6742330448062576,6865362483176098,988496938263203,5506859514252597,4062422159663784,4066287134741161,5647632053756586,8474743802331819,3146562533241516,5450101883642541,7158705250108081,2548099611685554,7309197632105246,6414218185663158,6876252905046132,5470443723825951,8739850545337089,6373218733589181,6187691588069493,687776326775490,802764168946372,7398660690057199,8825010094887869,7034658147467979,8655401750617715,4986078173842211,8217585988171214,6441958794682489,9095087195456217,5822885168302963,1869784025006811,4344411177177432,1649230538233296,3711510044373730,8098156786893539,8581032561058532,7551743307844527,6406337245512422,4252928194432584,7998852131324650,3051141314798317,3668399949865710,1348850511180527,5141715656196848,267301945004785,1410483665900276,6514010774400683,5258379395965686,6016797759187845,2663375620636116,1443836017558269,4940717972017918,5639677545229781,4757830880039681,3641283523318531,3398775252067078,533298712670983,1241020761522953,2300341877760778,566762934179287,9156501451643786,1668972437971727,4490535517451024,8921779137787352,9070563492909842,6609712885261075,2354873927861014,452975526679,5915543436481327,1596039444300572,2735525072057119,8187312762512160,8747232437494561,5945995850982178,7492539000721609,4071866172175144,9146065559510632,5573259592626994,2791255665046318,4828795254633263,4126004650177328,4957775544318088,1738462353646386,6912588088828726,8730345418511159,2741131907953466,8644602754274633,7664637125124473,798868643812160,1338203319067457,4833368247124802,8887928089925461,983002602214213,2786959693398855,6575045633073992,9043503077340766,1798831352435531,9051254973685715,7803479018064013,7926284395672400,6533851262128977,1152732163576658,7189296086766420,2723240064279382,2545185923302231,1047223013772620,6933973702869849,2608945270502237,8852066175562591,1257483184837472,1695999327093601,6672333947474790,6134002501714791,3418771147354984,1315177392989033,5470905645585259,4605337665941651,2128438396523381,6634422979384183,4839816082785144,3256915863896212,287974407082874,3036570263229307,2600419368797054,6993747831354810,4520272609932160,4328576230097793,4222562474337154,1487675705533317,3094912929248134,7342712596759431,3220227803063176,4822719302087561,2659429204105367,3305976961418124,8944160785390402,548416513213326,2162319222162319,7253121883555476,516896221094803,2349567300653972,5205482359796630,1755607425356697,3764174567576474,1159544424768413,2428308208534430,1984056380322543,8505742885010293,2266490915889307,2417982387782565,3648138902647718,8980657561393330,9159935469771807,887173487123271,794562638783404,6060333225833389,8709412136190894,6071674841031599,6957628632032397,5784390038203207,8851636510629363,4409092478354356,6007854788485177,8619431967474614,8153523721307064,1466698071463910,3336605611099066,872408159298493,2552156920112062,7464819275826111,5936758195385280,3632423301913419,5981719669089222,2166596848387015,4781270823064521,9094472384897995,7972238557078476,8504163723803469,1234295557108690,8340405120926676,8524515802033657,6127381265791812,2509715549919396,6463800501988731,7392154575315932,4447216729056223,3714872826934242,871709577090019,4681347148076004,4801531112670182,7145645334537192,3347767267021650,7488866651544602,6328110880991224,7417630278575092,3829578382779381,1090851533177846,2564496943752185,8953863563691004,5647799875933181,6615289970508798,8078731081382741,7242783762130432,1891674251408388,2656900287153160,6684431743300617,3602730159604748,2171140010041080,8847647794654800,2084097786144723,7691162001838690,7542663025439330,2314307504759831,4392238843962392,8827959327845892,1037770377294876,2860609327584288,7580535526937633,8339334594753570,672446842483748,7948579634816518,8349950503662631,1335790705245020,8035649242548660,1309199382606891,6107690259992754,6692231253400604,1535542076300808,7459423677113394,1540130197193779,256280713643061,3174683943007286,5897682840872457,2587738075083833,1464620563891258,2973437097387069,1328190663705664,8837176724567106,2090172305962053,3191909348848711,7870326325810249,5757686916252746,8117664457475625,13661764940876,8389453148570702,3532229440676943,8371918168690679,8459996714603601,8805606348729187,8329635154339491,1678764707882070,6609290369733719,377384294933592,4566086768632921,2413403248510042,1561817631880284,2155647690601566,4857733530797154,4898743076889703,1000837698323562,4157968559989867,468081270490220,5267119911036014,5493851236582511,1659560550507634,6341241357210739,380292373890165,3216456733926519,24788755838072,5645638169871482,8838840152329922,6395515818955903,6478693324941504,1963721387209859,7452288980348425,5962973093775993,3164368610071689,3691265711428748,2658354862584973,3931562626897038,5746299957933199,7000171664606352,4146651274744977,1017356947838098,4927935705740437,4960581277549718,4673375451649176,7988774328059035,7631417175467907,6781921912881349,3149906855916704,8464230606165160,3682556719074844,891472737961131,7203659442744178,5534376381355182,512954021885103,9111450430051504,7352387090567016,1249223475252083,4443544544104603,5708433471903573,2623504852497591,4921672993346744,5183762809169081,7654755558089914,6115813926307006,3716937611392191,4707276892107969,2790478672393416,5103163479418058,7676374671344503,6594108172399820,6060785987921101,4352264832251086,3399529205359823,1662526682375377,9152864094315730,2323754789332515,590640550487252,9204064322864965,5479017872466809,4021120871982297,3418349251847386,2168780196898011,2554492164353573,4056976335058144,1586263062172897,1819033329496004,3715410315993853,6601495938585833,988828717782250,6515308128892139,3832739292545234,9169586316342782,4691498178217202,5366511980242163,4458190157075701,539261405611254,82684464342263,2215773100217593,8186464642409343,3953193440961791,6414820039056777,7003518955537280,3845889825453315,6757340653265237,2689640009000200,498851395814665,1502873804653835,757680585356556,9154247953757453,4820100822807823,8519717240329489,8641762511504660,469614924858647,3567555766994201,2022825651647770,493622072034587,608678462596380,3266410232453338,6839180700435758,2053245964989727,1667613825422631,5706903704126761,2872919411868970,1322574410237227,3900640728212781,1409029156721966,7649284239947997,4363884157567880,2858050529764659,767018547668276,7494778308604140,538922793293110,815968354379065,6781576977846677,8761588900390205,8597758869190197,3170965927716161,3222734562379076,8335957492069703,7584009381496137,4113101791480618,4591646402385228,6798921647281652,2085025958012239,7962448127673912,2844732429186386,1086659465717075,6605125460456334,6985867287209862,8170839453204708,3608164999920857,7109073690596700,33325482419549,7218956333729120,1444811072210442,3545289693836643,5492219873251182,2638566291887462,6258504989840744,6910476868240956,8389710985342626,7337473510742247,3423751057249646,6496286175436349,6523500184733040,5242524731693288,4884572939515250,6566694330678163,8830186710233329,3516199574144375,3048716174910356,2880958476162426,7883983063356795,6728186912397267,1101365094035008,1488182483494275,651603508020612,5046549108106629,4453400697234823,8828143227951639,3601540529979628,4800392856741260,5689072710702478,8732822431732790,3514751407928722,1414317840659861,1750750618125209,7055107521836441,7925066249065882,3713333490394523,8414742353659293,874306321245598,4911422457988513,358565212403106,9153528767976556,7398737924419142,5530087241209254,4453036770313639,5000726219244968,550993955825066,2227481306654124,7507799825498354,8350554160662540,5531473759649956,112065988797873,338031841936818,7295161525961630,8764898673030582,7246012776379831,4348508294940088,4347967997023674,7534747515030431,7407228233150,1725652218955200,6237815941211587,6752275299386821,5398417781896648,2788599090376268,5820795079153792,1883255014729975,1650213179831756,6773037966919117,7610846748320910,3964646268257743,4983272580863440,4467021060179409,1157923615327699,8929331168974294,3332708485383639,214928036955608,1552434896567887,5286730999884026,7761707923056094,2257557249238496,5762248554055137,8451615345698274,5029790084625891,6830305427912164,5541610094812070,3613476809405927,2082210848335336,4075616248669676,6594829218051567,6807447181351900,2128808349279732,2786299327542774,25043460490743,8059924465784315,8849879366800893,5815850934161233,26996850963968,6034836883940564,2935616897984006,6373948582236417,2182079777469960,95051134010889,680843690051082,6029898037139031,6226695216805389,4356857373629357,872035560183313,7936960859923987,6309949354548450,7093807022224918,2232134182671895,4365879254119960,2062747392960025,7054749859827913,2891255687486383,8095248902506015,3567103089776162,1980107848689187,7504910951010566,3088193999304230,7712899375969523,7270114471530868,6691692128442631,229730930722351,6709796999637068,2896563856741938,8656159261191315,2128604220796510,7602930519402038,4053125750769207,3468620216952376,1599652791162426,4222079261377622,4330569518302785,8713442385643074,6161056473792779,5815431523857988,8095815471548891,8120236161576545,3822953193010763,7094303869460066,8983229070607583,6213635920042253,5157203960645202,8693287283721827,2779054256531028,4086988009064023,7081314123486808,8672334789146212,4741826496558684,5305547338904506,8907873749530206,7557464773716199,6464916939101793,7101997526506427,4945869523662436,8007402726123111,8181401738344044,2046649241302637,3920291554035311,4013295382001264,5086700650174065,4472440995165812,2464279016109685,6369696787084918,4088830013236855,2329319645619834,7056074749026035,1424416469948371,8804202034652798,6380302367008383,5589625793328768,4545913083242114,9097501646935683,7946685539878532,5734928668142529,6330150343472776,3251586299885194,7694331219583255,7535287209014689,445333053183634,8317888860350099,5466087268333204,3132925813753493,6876242254722710,1760823475619480,7186784560308682,8776679386799087,3189185989404271,4586720274589343,2949897356947056,1198002577360546,4082769021942043,5544217123911333,1673050334832241,4565460888479401,1657896321967786,6896755352687559,1966029162698412,3090491217254061,1465483891283631,2644767429723826,6121314243708710,1209073613719220,3964901725763870,6162172229666487,5128354617677496,6636136791344825,3985229469161557,5308248343070399,2106825039062720,8422121531860673,8391544360232643,9085846138920327,2896715108882117,5417091227105569,561404979717838,7845899009334221,7599583280454575,3985200647427793,8913191152658132,4857157896107733,4114752204367579,5360393208252128,8482767251781347,4140826588067556,6897277844240101,8613803161537489,3317863302006505,7552727705593578,2105751319258860,3338375195244270,9054144529922416,533509815207667,1362251832837880,4688264423161,1697392112133883,6503044550002428,5033731931457277,6100220424144639,6282996103773824,4708668462499586,5841693726925099,4211730115966724,7706587482040069,557432720008966,907806612451733,5236796214636844,4736256438204172,2874501914281741,2986434217500973,5829322722346769,6191577713985611,8268120286951189,1290448240297750,8713687793853581,3646436239392368,4342464695952861,5099977234687772,4320084953811930,1701932527531808,1233591354898210,8987055669077026,8041472400510418,8778551257714310,1408255433402150,8948072973617457,1992886023988461,8123269404845704,4027944642979629,2954669129295663,8435536335704343,2131982980467946,2847759945615154,3883352391464755,6429776601063579,4176217626351413,4067608178894646,4978929370052407,3581632945383224,7897604301570356,2022807142803258,2894584810619871,7996209448671036,1044258265663114,4704893258154293,3857916781078337,990324661733186,5149732944166539,4674561936136004,5895348954294085,8807413122725702,2513588484912967,8931368535989257,4523652479788873,2325087454635850,646710295549771,3208220820035404,174025380063053,3493536856844113,630260428662610,3619704864651091,4058056754018132,5209010276796245,6792154760582998,5988120362038244,8769193780307802,7464474036447073,6486366560624955,5239204143814500,5065246861948993,7517322524010345,1309029966022507,8210708271458159,807543998326640,7815567760983921,7573883049879410,6690127582099317,8888762566276982,2273838361048952,5681619792840340,8056983904030677,8152503429396796,8754825243834236,620844115920533,4118511580192039,1965371690703851,859452633241476,6522369232711339,1969983725987718,7869360031254849,7348159461862117,8386000389457803,4621666960222095,4134027119716240,2864322284312465,960739989321619,3768676024248212,3852616135219093,6395220159308173,5876766461540676,6363344116971418,7486435108515441,3785212094982044,7709178769450911,3739988142229409,2212635699652514,4808187977606811,6363418012968868,3693819340408742,8178733033453226,4557177739372456,3977407856338858,5650354964412333,8927506911707348,1099516733503408,6419511443364168,1254267278784439,3054458686924734,5168095931742143,9099793846433729,4865933837871042,1771922784188747,252133240330180,3292641942136774,4500582573676193,213713219536841,6510543560293367,7681344302491298,5263816100559181,521191956194979,6609894173665238,859476197024761,3714562604181466,7956813340698590,4092171006515167,8962006973175777,7422386338265058,5852508892609531,2428235422771172,9204653125568485,502402209470438,8540956756629616,8162169518446571,2436938215679983,358472893305171,711625844209652,6572476717303798,2209075498903544,7070606820030457,6371559945058298,3924585430480893,5962263754270719,5461642314091520,397204585479851,2078384878950405,5254879555438599,7501209511493598,1489412341876747,3270023758649356,788509388883983,596173146403160,126590754007058,2591419040606230,2712603419187223,7136741540824068,4040101484857372,2655859691239453,2838365919078430,7368375630518306,3194265969334309,647747654678567,6885791500404778,8825758847298567,1142084740630573,5231131468531758,2175217154575989,3385570734241840,894273844724744,3927327479265331,5456567116912692,8080443739596853,7802673296602121,1992590317054008,2239467549997113,9151998028335167,1569025339975745,8909117374343234,2225680908363843,56608669681734,2226956289459212,5397772407666762,841688988907595,2746759931082828,5342369863289186,1834966470621263,107673971120208,4780490377262776,4487384124643410,3929296231371107,7184391422245312,3214216908011605,5815478242285654,5469901770803288,2293884384790617,2426041499756635,4874904316303455,7661250562885728,7850948852275297,6069728631273571,6709366269492825,5258637824211051,7420264629636114,2248842372953022,5716416242178161,6674461591337074,3628818666887283,1265061373565044,4642336363096181,4799176339216502,6704524459941099,5494529873852538,5106999170435195,6957668849370848,5949749411465342,567656662714496,2925276112783490,3519667105339528,5943693569702025,1431039489927307,3889415131871372,3453110641633421,3851755875379342,1286470239099023,8121748993658563,563381985605783,240576739383448,3711982467758233,4505213965585434,5470776088650231,6762326548171120,7916022112258210,1595571707394211,2856215005730980,3116624167209125,1911565472123049,6478491346106870,8085875745540274,2249934787741879,6255191827925364,7482976125434495,2053365821274300,3028816728004799,2792081300588736,8844598045489346,7537762956503496,8130374111476590,6871151417497801,6714997208484043,2142322034346189,5814708524050639,8784678740460652,1348731958405334,7047595546483882,26691099330778,5128132925851867,6726714915592413,5995058603178206,1758820441692384,7908323244564859,6653260262418662,3465624308655825,4372807575288040,1473674613491947,2756050571589868,8319220080893367,6441389764561135,3113800241694960,567624656677105,5660370647154387,4061335508363510,1493537590446327,8842166304411478,1298903626955002,5500803861051616,2659414863595775,7501491578160732,6653627224608380,1647989894196950,4018963969520001,901382993377545,5168020711397644,5175614411331853,8810441169180879,911058900388112,1903633811736849,5453831423617298,5195100765288724,8242376199784726,9001919699228952,4860977024514330,2376784102009115,585134325225756,4355265301924126,2959725902522655,2446507305564449,832107770321186,3051864621504807,8614894794172713,7256734689827207,2303363406350636,3596723624655150,7345475783167709,2953896974862641,8301054501677362,1839335770655027,4723936623815049,1844403335192545,4742902463605051,537468527651132,7531348323445055,6622713792518813,1185710905047361,495957856627012,1654921486394422,6666623700743282,636508945398088,7320721572422028,1297876388792651,3173983418288461,7199375808522574,1559264567765389,3567542418389334,2557360395654201,4144480892479833,2677254289049948,3992050605562209,4752282207545698,875588512434532,7258410441613030,8084343777403337,784658345687401,1274201991285098,1441515080396519,6422898244524400,483348184811890,7291735679359379,4266642012678516,3341507944806773,8514999855516023,4475489118169465,5275550779992443,1093531385153918,4922365850573183,7442420044879452,594684579641732,5529437298751878,2248768132221319,825220776753545,7661108552272266,2534332855884172,2560549024704909,6311380195694991,3332434197227921,1424643346762131,4197490382637460,8329462250333934,5886067841362327,7700168234265668,951960812472730,4008786844260763,3347474192042397,3488929672001950,6023108566828101,848721535216037,3013362941720998,5197256242571688,6285124191289756,8538085435298228,2087057658268076,6786094656899502,1552476916476336,3830459211737521,350468857808627,3547746445719988,7419221968435637,4850157860788664,1351499112233401,1072301753059773,5246312295995838,5643240862239167,1795544633412032,6889719627880899,8203115445807557,2453258541603271,4666726824311240,3996843992381897,3159701697063371,6407665131514014,8683805861530063,2781813126441425,1778242509294034,8617033189149140,8217173740493272,7015790396824026,70265923824091,8535387017615838,8737494948546981,9158339605241045,5264418991348195,542505085303269,3309941305895399,680043350419944,8126517757397481,6179709639530987,1421602687768317,4745552528632304,3906101247312296,2041544847788532,2875834899487222,8918394810395049,5322689785982719,7768428034740650,8383167224400382,2781804830206464,682368589348608,3131722725231109,3866479640349190,8653219328845594,610187567974925,8511422563445262,451394395482639,7292063695995992,1362058257287698,5925563678702100,782861886403673,6084563426234799,7418143099730460,5740302599832666,797327697349150,2696760442509857,1563338518526499,4461391563314950,8798429442419243,3647883477260844,6661782660729392,1991853601244936,2955820541246002,1052977930028126,9187647787342390,3325438374885129,4702122660497976,6375221759576633,5399402544327226,236779526220349,491403352873534,3842524200319551,7078612381736358,4209642825718337,7175491926800962,1090196750293572,7415876291168837,7801014166919753,237579024980554,4517013077908045,9018176141326926,4905147181385485,2756978422852176,3198248464791992,5538930468178514,794814110431829,4949250803364887,8412272893848153,8715299787358795,1723841151044188,68860408343653,905695458785890,8802278723304036,3640538450647105,6729043658685031,1875102701304424,9168492783108540,6317547516011623,6905166401787666,5654324650715759,9205620099043624,5125200885148273,7443259159046770,3099485917346419,7849893361469886,8485871005645430,5321873435208311,5158554786077305,261926228597370,4521787215851460,7706045317739626,3834556389313150,6752249944660607,2011206057509312,8268078856485825,8207757598399229,5238815189355141,8310670263581582,1033582737816199,4363046466308744,7566332212591730,989307252920087,6706966657466132,7195724533933692,2656519453145744,6530647323139001,7023088342458394,8857205691058837,3484996857019032,3241824526826137,3015999469947546,5972151396851482,6698810453519007,8391163560408726,816028610755696,3704734631525026,4483026856942244,2827861308312231,996104492968617,8974499613609559,3146740332036551,3795949646809772,6053610728696946,1716991140670126,7431910899758877,1831872852277937,7803130107673651,5429272783895221,2596002053130697,9028049747389668,349142041262778,3948490342334239,4657303421528765,8756233227971263,4552055457790656,3422892041732555,8940528804162246,6627141941672648,1693196097063625,8974838263099303,2731215567239883,8860608301697182,7714280745588975,8610160831974098,2578629647575763,744270096181973,9110095193161019,1122470271769306,3603904732963279,661151481445087,8706805767408593,5294275793738467,1352762382838500,5999096583673638,5900769690102225,3743924128819945,5321859951799021,1850587137350384,6317814990861647,994308550015731,763881411459828,1669031183858421,5079626356595446,4402143084781353,1782862355208953,7684269187824380,324683648834301,8195563525001561,4321577573481013,1301957561166595,4477250411916037,8147439718750982,3557677947017994,5346354558319372,1222138433469570,1454771836984078,2419947851556653,7830450442427153,633106053221139,4242808956136212,2587905060653845,4282459337575190,5121175980137239,5015838702185240,6277968515992345,6956363384945438,5610894564793119,7334034694511394,79007152802595,5415639580687141,9219999120210726,6061877385427753,1523358345046826,6379936890657579,3392400392379181,3940306491763503,3958671937493810,2918988711013171,3680468211604278,7185609371896969,3987667524054526,928514187017019,6288947743079229,4485742654401343,8423600816339777,7006477861972802,3302306111401099,1248655098574605,3541206393355077,4112415658539847,427004963382412,9154250055621450,53585049435959,4097782020987724,449764345883469,5755148248369999,258450410981176,4924746861189970,3466996846889811,4676040385473365,6993319233956695,6774317987171160,236258353390052,7393411824002191,1606637797276508,3332795770415969,1504556618186555,2698684154268518,6864778197236585,6875490626292586,4485906862390123,225988241742700,8070410143284370,5192118225382254,5815273360046959,2058826039102322,1577776738470771,9013710678219636,7651493222157173,2039921394124418,4118822455425912,7353494121470841,8167766187596667,7561213934209917,810343061699454,3826303079451522,7823876673358724,1243051266110614,2766426039513561,4567239923702664,2370614328806281,6381788502875018,2433898361486487,3071602639223693,2771552160193422,3176775879189656,6448080537816057,7093690531543956,8042950165752725,8867481726778263,8542840479785357,5696805501016986,4772532988001183,3703468221782944,1087749313592225,1566846942448795,8794101093156637,3703190419827622,7135138689866048,876228623607351,2876058970446763,1915721120353196,1670685532400557,1842270257068974,3457020736027567,5329499696528308,6289086425975736,1441066174626745,1040943956421563,7416259984048279,8771721163876031,2061211686007968,1034714675772354,6177810348460997,7269394299128774,6691524686203850,2480739659693003,5351105988451490,2937059272948686,6442802221397837,1362248611617744,613417479797713,8558510186481575,4968846076050390,4538817020914650,2586260151843803,4337747795659740,4213659193687005,6848715154045918,8762249175692665,7796793055394784,1246215536036834,2863072203533283,6369108943510500,575477822707537,1853236189207528,8513165716478954,2431286987570155,7440207515271509,4605274132618221,8243242683317231,8823273917062312,95299597556722,595994403097589,251991505562615,4698634642103289,1624739856092155,2568062394166268,2797465100360701,2850814782569471,3004522382838784,491142996739243,2777393684220933,2026628453063687,6227845223521288,8806024658861065,6274217669696266,7184353675041803,7611801521576972,4033764552097332,3156944276864018,2651564593503251,653591075397283,1986974037521449,6190818471786992,8148649347528399,3901242407296026,4921694918354095,30236028046364,8572029258984479,6424427348334342,192709735873570,12583140977701,992187272879143,7709598228405288,1143446724145671,1453655841397804,5502372834475056,681137258208307,558238696910223,5434055855875252,8166484168641595,4614553361755198,6131890633821248,4805170878549058,8181637082788363,1805222612016196,7055332613012549,6380356678908729,8691880957919452,5160186787630153,2388840759712842,4115262509640779,942485145467980,7920187611241143,5796888420887839,6386648689675345,2434095161834578,7949151372371811,5216364370234453,7185973866322513,5207312869678167,7637673616637016,4681292948524900,5032779958839823,8736852979126663,1882698016124090,2758523067989087,8912480651807842,8097302075825252,2245632752540773,4078823557950566,4779083061316711,6481431658765416,6020558446570601,6727004380413034,5104730817346667,1738440261762156,3906946772961810,6643780079885422,4483056737496176,6044345273651048,4792395065523314,1982586379525235,4975515712535669,7949008728069323,4367683948641399,6029021977115768,5038483687607420,5370043587824765,3996939922353278,3571914698415233,4566606200835202,9063105580508001,1757565792160901,3010379925507209,3679862672968843,7047168781622413,6813038456700049,7653418342145170,2636674965853746,8589163151539348,2318304048316270,5384659971673238,2619373286444183,7093451698519193,2742595427327131,4931290167299232,8492953013231472,1624628444294306,6341965661965475,9202342528028639,9204774803058545,1412974396456104,4570022519684266,8973663052281642,7754480598850732,8631410209135790,9221614859934895,322374640880817,4719633696471916,7418545461981080,4539192285477406,6316214771743926,440709743422650,5272267761249467,4300610002357438,8421898045016155,3453874242043075,3090868502154436,9082813718365212,7388803896797879,5732776453729255,4636391883959503,6312287393610960,5132931438341329,794781823196370,6396907213450446,8151705046617302,5909444756462808,1743355317378265,701724138761434,1174120040580303,8110724879183071,2249409236274401,4123245038427362,7944623598202083,2804674522053860,897210929716453,1838459307412711,6483170352495664,4819586886008041,1198633621900522,3213204488527083,6643267600130695,3260711832345837,7127777288072154,5482388398828785,6617779675137235,8961340170563452,2320417142562041,2562695284156226,8338135692152061,7018227477992809,5887703724006656,7834782129196290,4027834277510403,8295791534307300,2070212227283419,8373475303419144,9066127881272585,6168834198602967,9164964867128591,8075764452631108,8173548487544081,7241666060379016,4701171408325907,8829486861479188,3106839325465877,804790373657878,97218239528215,6895359992447771,4907041099283739,5571141421542684,184817019104543,2145015248174370,3094465726897443,199331390218118,3665731451161895,5183848285932840,9084508042341673,6882505380506927,1470755860614448,7910149252996779,234600052096307,4686931442621749,7235665393171766,2368011617017144,664148708543802,1854915523620155,1557598654856509,8797751287262526,3978904572590945,4328667611110720,3362713583969504,2712469352295747,1306995003891012,3770662451658053,2524342919871814,5012702507887943,190736261057864,8087395110689234,4733582183058764,3813095621360973,5921953278172494,6798493811123065,532759209565525,8273617795495266,7874759383292473,8947182068660101,8813421552282852,5454684516298074,2262432740290447,8162484357655098,6739729734332304,3167854745169251,5556302789475684,4170096552906085,8487042812984679,6165527512231273,3743961606118764,6445941215377981,7124671579803539,1868723269585470,8066174717787910,5747091809356351,2032666380553597,4050405426855294,9001142642554773,4980337745317250,164383913069955,6179708756839812,4907229094236054,2720069637287302,5308263417695623,1248871661014409,8936927474269578,4702819983039883,8678249936640578,5238794761305486,4595584729410959,1262772867194256,338763742866833,3895678637933123,6390111993245076,4303018541751702,6439808764488766,4305862497145412,7026726828875162,1455195525717914,7266068570217069,9223118495385181,8454544856731547,5664558385331622,4005664091823528,603723544886697,1089622775373227,8420355092097573,5405913942736302,8998721014763421,4034152771739057,9054561477373362,4640741145730483,8139503603427913,1682428789198264,642426740977084,8131742137712061,8964935542801558,2310932547259842,1827317143739843,4932159476088261,8411470358550395,767086167363020,7999752365477327,8016695445298640,7087909241175960,3164673918778835,4762036958961108,2055835598859733,1077912644906454,8557903874342361,5332383884406234,6683574890925532,2731163567615454,9123221996191199,6275239700614624,5988058556177889,8650841377238498,7221145385089366,5783001957613029,1731917309877734,4376558150464446,3636743414390248,8823940150738227,8606478458482154,638036155469291,2826556930555373,1821788769451504,8178214632630184,7934195266143871,7139924508958199,7605883822722552,1667659350277625,7922407005390658,5146953896353278,8806756602634837,6560210596812032,2582152908189187,630338109935108,3845449927798278,4730025346698760,1520670471814665,9187019953255223,2894926518668818,6119824679149076,9097312802000814,4166112837037454,8634687974557524,170159509392921,5458247778803631,4062218697567772,3976857796177437,8360121306811935,2109162197945888,2206896186809891,5057828800941605,6798561494695857,1030310028192604,4914140971938396,6249722101136938,1764333831986731,8829551010177085,575808750009907,4379186958081588,7191616510828090,5657379649166907,4193814242680380,1130375793299005,6931880560750517,2963931588390464,8006529920058635,8905242881675190,956556504030790,7962446616817223,4775245094784584,2855426982749452,1886288263519818,9036021558466487,4856314515111500,3819766550436450,5097795614465614,4531440829718095,7435712779845200,8296355744816725,8871264898674617,8427770585341528,200617788830308,80848488066650,4916171623648862,291482944990815,5281919610588769,3234017377726050,9039455019639398,3446677273681510,9075893912813160,2122484177682025,7861255398048587,7891129803677291,7966447785586889,1300654295630339,330786077326961,6091016057941618,3827052685028979,387346605424245,5846305864504171,8722358232019376,5359003787251321,3585145642497983,5622912960534679,7588725161655933,6111209949288422,3390516959981186,1710000774639235,4902303102066309,4321959984561798,6523600333708400,6683658285867628,408986989610263,3701813287557058,5858974847233679,2250602223713936,7195267284487971,2734910637948562,4886293270228931,2639786389040789,8504376026631449,1388300688154265,2240124539485851,2035006005800604,6315521663569565,2754188550532767,7643340360527520,1441494353546914,26287827857059,7148786573473734,1026377179139752,7172855744957357,3761600094219947,1256640649862830,8581985289371311,5723360613174961,8954332891131570,4277335625461429,8245057303801526,2208945671745207,3171002127912632,3441473387278010,4885270162773279,5947131705892542,414921167815285,8193679785369280,4188529001987777,7659188190363330,1935543794859979,5673215187041988,3554990670675653,3976706470485702,1297804887977673,2141455560052427,5422524323675854,6154044390055632,7580133915541201,3477763141561635,4364899301748438,4453708423537273,8762439273176031,7339638253436636,3788885202019820,6707866534375134,943455554031327,7189924519128802,6101227314106083,779230802116324,5293195954577125,2179376799342310,3329572358479591,7805300358536936,79217249615595,161703652773613,4935736916954862,575798412120701,1506067859087088,4404284603714856,859319809392370,3501532163673843,1861947185983220,210254306639605,3393383322623736,839793820454651,6472412795471146,7979780218957566,1832185633140479,5181701176680192,1484281212157697,6831544618942212,2203909323521797,3956611570896646,6308643144269576,6708416662777611,1240066836596521,2190735862206223,3156079150759700,1362615270285077,744890819944215,7868000644939545,1123036446535450,3003977055285020,4135239890329373,4713869845917471,7794594152009504,3112223674388258,3272459473624867,7857866244499450,8346616019299633,3635554613849897,791032629477162,1707953079627563,8588847040646956,7572244253536050,3403126846356787,5450391152627428,4545598467907383,5202711352119099,1237837400842045,1251571050577727,4269687397535553,5150647899004738,5431563550691979,8608921512439620,4022759826374625,6793189454736349,2141853098602315,9077342842191693,1777196050722638,676744876192356,6848628917275278,7195380304001617,4632328774704983,7265214886344676,4923183834885434,1425717323808606,7016013522095967,8580785194524512,8031001385329962,894657479102307,2329248970108772,1271418044329829,4061806001348454,6571088833411729,2179518653603688,422511308312425,2772152389676907,8562189316408737,7038403765708000,5226990470840174,10488238202736,3723937100369777,2096898035052402,8229225330563731,1274620100427637,5855779389325177,1861632565100411,3666544173096981,542070582267778,1978631044820971,4470924445011845,3041125057503110,352594963991873,9004420450410376,6687712988946313,9091339809357706,4302073354706829,8817294598954894,5036798356324239,1263700249378704,330922710986642,5497711469317443,4596977725284244,6929844442427285,5057533782544278,2989337599848344,5099225536774042,5185292997025691,4157036191099546,560595737354143,299338513289120,4119496559112097,912864977850274,4039545094061988,6615561519443270,3895255234408358,6347233558867953,4017557037637544,7285281755504556,2446448248831917,6973420924260270,1756687539404719,6156443877859095,2362988176133448,8688098264865867,2785338889383859,3990411502493753,5716179479281542,5361213484933047,959077651189689,8348394730450875,5806282386102212,3917053492559807,2003627071083851,3133091751006148,1754953295925189,918636738293702,8562467736125383,8972197871214536,3701757881196489,4363130678030282,2362082133147595,36290201018319,8641319291096072,1188886142685137,1949512905760723,755903919173589,4519916921675735,898690320965592,8905791761032295,5560584649516021,5805033538850781,260454121447390,8642820142817957,5282229520383968,1041656748867553,8752406983647202,4751211928121313,8570202458542052,2135660434272230,3148414190718951,2437024342700008,4041186263318507,5195899241148398,5464815035281393,4182033870323698,7660657009844212,4859896893792245,3085856755960489,2542310866558968,3490271597518843,3323653434089469],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/633f4c15ae21310dac488c09d66c2d38",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900127485.1/GCA_900127485.1_14722_7_46_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FQON01000065.1 Mycobacterium tuberculosis strain 2926STDY5723447 genome assembly, contig: ERS518758SCcontig000065, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"633f4c15ae21310dac488c09d66c2d38\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,3577665917690049,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4137376921317903,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,5088842780258710,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,3853897425318415,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,200567419970091,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,7973729048206763,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,5080262464819937,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,9082487453817207,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,8651815331507604,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,6667150944715769,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,2504848111723677,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,1436921985953308,8305605739410145,4231448943924397,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,401375166743886,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,7982695525856751,4092526301791731,1360710405096951,6524009387461415,2918737215086164,4875820081283327,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,1488198135089416,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,6423624889473001,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,7917710442910040,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,2439494055196777,7645804919789676,4170968097339503,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,2319684329502984,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,5411909772304115,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,8407988312059771,8604592003787340,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,8006582758969940,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,8845832726416014,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,4200556103072448,4163747954567875,3036685401217735,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,2545127928916740,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,6203307628559501,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,1691698663883279,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,3807266757341739,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,630218890143184,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,255961615814172,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,1033671695335155,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,8215276774560757,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,5842852661052750,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/6381609c5cdcd210887f5add4bab44d9",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001194765.1/GCA_001194765.1_7909_4_19_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CSNO01000001.1 Burkholderia pseudomallei genome assembly 7909_4#19, scaffold ERS008829SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"6381609c5cdcd210887f5add4bab44d9\",\"mins\":[7746553504251904,4859505372020745,2717509936750603,8187669162330803,349773608591376,8862655047638384,5399166381228052,665667000179374,3472111535824920,9059739621666820,5851439248670746,7736453541667081,5153116669239329,8473644107200481,309534868643876,9101386872414246,2858888550080556,4713975900782637,6898819322740783,3194173711015984,3281686287409203,1091418020167733,6039615470788663,3349204288110648,8119188477042745,8489009187528762,2535093790310459,5939831864926270,8149401278038082,5595151229927491,6112765988921415,7903214845821000,7773611234009163,8567341077128547,6127715860488279,5162993710497880,8213525392280250,6664704707379295,5629909614338144,1069819280842849,2233318294585444,5006028136915046,3777712339501160,5367885602013289,3562022201090155,7214682490437741,1613924864385134,8807240960191548,1717422750613616,7161438631903346,4431976967250036,6465559202126526,7312287381799031,2308408435843192,493133997940857,3296344574230650,3224183994278016,6230747701436548,2391286582870150,1328395305107592,3257696334676105,5448043239735434,7499941074075788,4833310481178766,8312505234982403,7692595702390808,6426701193412755,9005370755486556,6994561849213077,8711183162630295,2600001938563227,4505803106156570,8968940591151813,2836455211442336,3780686974107810,931582819827875,3654345070182564,1217052589015205,5776872417583270,1969048551735465,6228501984272560,7960146002849785,6350303070560439,19435939619000,4982372355367097,3175736049205434,3290760634419914,6162416284713151,6786873677693122,6403364525588677,3493147636809926,6856122472792097,3883650267652299,4525405676847309,4248968737104079,6517166374731986,4021800632803542,4241674264879140,7314114970632410,4981109903466721,1399956061077732,378573554172135,6060069874852073,4614841653030951,1221430310379757,8658475829720445,2893067736441074,3388851662170835,379542628450548,7244321710326005,908938666156281,2152813028565242,6728257185841404,8914666386915581,4321468431089918,2171212294521089,6095911134241029,4481633112932616,4710445192061193,3761145753051405,3143943789863185,397548190433554,2098000573989139,3302305938313262,989155982622998,4879638724365017,3079877184323864,3376329319555358,2918064227189023,5837580770320673,891217191944483,5309264978370853,2152530276843816,1479105561411881,6914156956401962,7748144734150956,318125183968495,7341349627677447,6130843098693940,5475058498945336,3656741016658233,3072858527719738,8870074993926459,3108669233676604,7739095147111818,7185865033367874,6911280516841797,8545132195436256,3796009539567946,6420829914906955,1155840539263310,250358740746577,153107342410067,1553088056123734,7904793672573273,1770758189867356,8781464801059167,6396790377562467,6781071974769000,5883396419711036,4662974561567082,8431829107786094,4399096904941940,1122920504975733,6375177398436216,3642205674062201,2384610205821697,7130768395583869,9016539823710599,2950965244756362,2740216180711819,8827847575847309,7386509178184078,2574877696852368,2925007913230737,7379271804412310,364380328321433,7179343568142746,1250488172954013,7735538834227617,1459423074034082,3597953945182627,754549001789861,2555438499520936,8242717186890929,9046131501293994,6294706025759153,1127576170193330,7957233805484467,8473570781954487,8668696188617145,5978278318367165,5821063610024384,2280666170171847,7057569090413003,2383206941213133,1869537946182094,3308836348993999,5325623937507792,5556956717165304,7546083967558099,8329171087499733,6088773091746262,1148764263006680,4217887666627039,6909274530095584,774515346711010,6406765967057380,9160106585748431,7138341469220945,2159646441611753,4134320342622708,2663075449389560,4812323753075193,1038767408759294,1365395808854527,4479361592738304,2329620003822336,328115653313030,1344346425528742,4859877392032264,8798202886734346,6700461993296395,451579383175938,2455130825274436,6570025689776657,1983281738457618,2576968092236547,2625898732814871,2358930838561304,3523046914818587,2142240532292127,8173208583791139,1853724825141799,2633426184575751,5694630357902770,3967650081145392,6289226097992243,6315645555089972,5365589777109086,7831537410610612,7058931689833018,1908286874772027,49649330045500,696442189488702,4567453011231298,5014648242717252,6608986441671238,3062964041687625,4264249421365835,5914045624689233,387450601521746,2583731065987667,5680504819720789,3251133471965784,7624051107631204,8764181659535581,4482009664307811,8166246788878438,1889339001938535,8949729127281500,3044966491309501,6481310756307570,7888126025784083,6627581020979829,8909426219147895,7651702942147192,3548720757670521,3875152078750330,7685169291526780,7544654737375594,161678418279189,1250960673890944,2603490995765889,1638259334472323,1132002655942081,1685992038261384,2203339556569738,1485826745336459,5881971876930188,8706005255329218,2834837957485198,1230710656860820,2165883487068270,9081568207954582,8866309287183812,1824297824032197,6472631084630688,3456585573703792,6219544386011812,6112750771315366,4983159308755629,2104917818172082,2171913600197299,1749553360755486,8460763311415991,7833647334941368,2548470717814218,8068151722779330,5972630758208971,4605660163973829,1744107352564422,4046225857454796,664758416115529,50917966947024,5869419737981649,5121116345172691,5052027497997012,7826459532128377,6821437627892441,3955987382805213,7196694557958878,7054870264693472,2504763779089122,6098176622420708,6258806321423082,827606701048555,5729095050510446,5643461778932462,2366448785261295,4092091579761392,7599615066391281,2412529587364598,4614806791201527,1694045073974008,4890752916480762,5295387637367550,4187902736573184,8251335656110658,1989066099229444,3780687373771525,5680020611050284,1429186033959695,6973454410089232,3431865554122200,4257656466293523,3021450942219028,5002316448285461,4277613303399190,4942939650556695,5988828614714137,2922294353593114,3594628192510747,3165020664415004,6624775596819229,6591306339812127,786573784941346,4099540120760455,1567549641171756,4233048600945454,3831294653219631,3695234310007603,6825055707341621,8355036730568841,2791295648629560,6821036742140730,2781150822122299,8896741830632252,1893926862758717,7379962157144886,8700673694081862,1133012510573384,2655218494446391,4207478363276110,2232825474286417,715241043903316,3894484428489557,6943769224004441,574261289657180,8713553002734429,6789869255861086,9011147240735584,5217079795778403,2941631956337509,2179389910489380,2796095104271212,1029177621037936,7442040402412402,4960132306232180,10246093223401,4015728010011515,5412653957260156,3668712071152513,2699757645611906,1385043945864001,2848837495915400,1899995478926217,5629567698477964,1997713957381007,1013578542744464,8726769789918019,4782175337038742,445966530503577,7582267696156494,6012908707931047,7066986479035304,2024200224785321,6409629858513837,4416448424756143,1155300950000565,7357451859067831,6717140261962683,2720751129338813,8142709745533886,1985856485950401,4780109512336323,4599216129311686,6745763342713799,6900034076443593,6472301867082700,8814126040928418,1690293767414737,6469953791222738,3835146109379539,522730262381524,4492114901550039,7358430655448028,269076298761722,5295554178850981,3702913722549217,8995078549304663,6470196413807441,248636181193706,2346131095826599,8082305205229,6054515730998254,8641883959141885,5992930149360624,6063480038772904,4461525252039669,3148462127203319,5202627083576313,5540244887503870,617090076353536,2761071356576771,637242913465351,7623719695950856,653632374033239,5207210350150668,7951323165934606,913362812380175,713329799144465,8260544521397266,1388358672270355,576206960935956,5484946807653399,4530645078436903,2838899988243483,4188823684432925,5450714961994782,5875250966869509,6264159609930784,910413206742049,1520355455058978,8018734147119699,1517565012083750,1490580124722216,8946207072625705,4585332410287150,5320719141315636,622246216909877,1466088258208823,2138334478009405,150844580793184,3134977718223940,2112617043928138,7977099839221943,1578300065565538,8640987567055950,7143291319047693,8183115683229430,5902946773165139,560063245427796,1211138451424341,5773430550824026,7947440485367994,8332519798478530,2248212036079052,4344309441995874,6249816307057764,5916100195148902,8656088301364327,1446698755875948,8405857365657106,8097308621668541,5650583813981297,6035951286346866,1963605019640947,7376077466657910,7353518944607082,8190280091399701,6851157638390915,5355917560579205,4485682903581830,1943937928332423,993522514592904,4128379569661065,5301504746972298,3651305007965323,970630523110541,4523718962046095,455819942102161,7159327372305556,4683914068149397,7689440137503898,4186844757050523,4515888762234012,3482138209658013,3896271799149728,141283939853474,4914426830242980,6614341651041137,5588202083026093,5123860551935151,2305537674395057,1061395225658546,4174756901151926,1225415870022839,3170117751334072,3460043747673274,3216090609886398,3902283199941493,123956760577569,2099964787918025,7274497600152781,248168506565842,232463565628627,476830680679637,760634902201558,9185991147881691,6922093298762972,701558209357021,2964689854997727,8828806201140452,3288291111101672,5248009370141929,7629918936900843,3514374978905325,6817911154549999,1847574842705136,7777016211137780,5272272262530300,398791786546429,851054077994239,233571450217728,2140918170428674,4143017450890502,5029611990639879,8431159608329488,8276915681300696,8409799242089746,2590328552604947,6091776466748694,9030788642891033,1207869136823578,8024724899746324,6581551567389980,4821931169301790,973418089104673,7750140881282338,7708159549678883,5375958161032486,5656827515987239,7780317920084438,828423569990953,7600501093500202,4421903679464747,8314246212511020,5225042430608686,867569085703472,3481148094350642,1075319761667383,715361098106169,3298134319949114,5167620557849917,3403799281747264,1211507980043585,8749342979881867,6980360164607300,5256899772616929,2134919652803914,4184320875357515,7339874175088184,8401100463894755,1790012403918168,7120012423381220,3663449456633179,1933673076458845,1049294657504607,3044585703720288,2235059739313505,1846202708551010,4543513825908283,9024391753920742,4512008319870310,4383363035022701,3910256034792814,6235352411727218,3243244793382260,2334092508194366,5848050358191480,8428111777498491,3341864107885948,3041141266564477,1569470446929279,5384270448407960,8623870787159427,6974205576888077,4004027816691079,7125836342044042,3702659731932558,6129665122985360,2969885282993555,8073584087051724,1870793906931093,8303191814089625,4269709190383000,3207383600981402,7076331116586395,8986864963766924,5304375303128479,469951365662114,1513126837001115,250094093375047,6313713964197292,5469271715538349,4861975300818351,7928856206091405,2232047226422706,4820889135482291,5349210581042614,1825531111441847,9012040793089464,651288360256953,9044773796668859,7239184753018301,1085559575930305,6013795580061122,7438422636086724,2626171718387143,8110230430598600,18548549117385,6482768869713354,2125427559122379,2062748013446733,1928349318079954,1974252024358355,2238098386650580,300987936499158,8533610075940886,1857106579146205,2437531256309218,7023210070902243,3004691185411556,6753941483137958,7350286138129749,4904612529636840,3062264846788073,8350293220025837,2449235271435758,938428139767281,1146874715752019,4581547127177470,6355566813152758,2552233481586167,2289661629326841,4459735323403770,1670818741771178,8850504319632894,8916743195579989,3067005971547651,580488386635270,3602613138826761,1918538614556170,7774464042362379,8165542052840974,1524485506817733,8804857718466067,5311579043243540,222775189431829,8545447107899652,1671596400264730,7504522794720175,6480521156584988,1498560907858087,1044151471941151,2869637037327905,1163881311331877,3331398201837097,6018389059823149,5675788468569647,2116801345275441,3862813297968694,4839776492234295,6150828045706812,4709395442042430,4577890798216773,8909957007271496,322048970171977,4704380599395917,678768327706190,4925241561343568,9012806831523409,7875134968741998,7275432420124243,2767874127349337,4054759182452316,7205656475510372,5371514867777809,2751429091149416,6129245471704682,7929752000685679,3608737233962609,1504481140056339,694868810548852,8675579969095286,7804511451457145,3348483824092794,6285760540034685,5196472384836368,3886972318287487,494206942537346,7653230573952082,7315432584773910,6757112697685648,808792816330387,3520947663980182,8134018103600791,6803075734819098,7255595691648672,224008718763681,2034744982570660,1657825720583846,1447392944596648,6125624980956841,7260245193959084,4837708498265774,4587997998909108,1540813202523829,7353465689708356,9072019487082170,563358748403387,1431057601849020,2113814776702654,915840815860258,706103541647041,2964967539148483,7756658036934340,1251884258846405,8617066629857569,2168307709003464,8313462585134028,7094928917276364,189509016004301,3352267281909457,2165877775197906,1758350162200277,4400183338895063,6312772911580889,2794714469517018,3991480974264027,1845640583116410,8760527285005940,6480958516184802,8023219646616041,3731275924473575,5543269870630524,7494747769554667,7661810683504365,3183380241032829,5975825224615671,5842100048242424,8151589436401401,4524428899133179,8151379163192277,3053229552371458,1273448870106753,1820971328874249,659152744908561,5784748737185554,6255669643298581,2662742655289113,3100365476579101,6358938291676959,2801411914360608,2464684926805794,5830194688575267,2770932501096230,3137409200301863,3219289273394987,8492237787547436,30755883304749,5918886830393141,5428439840900919,44043707361083,2890220916008765,4708689889421118,2052609856972607,4511771631986498,2932954125756228,427932496612155,8000153877677899,1039619994355532,3507669907064658,4038841912338260,4363303545483577,2162526196926296,2277540194977626,3318615736164666,9216639267342177,5866859189405540,6191147282696037,4923169137450568,3653690698475372,5674176649783149,6672032474367859,7263332445898613,8157558414632822,2036169438370793,5783644534761339,6956012433655676,5734940511075306,980986892232574,1140731906238335,6167645832284032,1798996760102786,3834328103995269,4198655242258313,491621630560140,6352201065376749,6873693510838162,5965375694309269,356496265815958,7179270542247832,7484830292376559,4034497010870172,987035262461853,9221630110443422,7683639116449695,6947364334782368,624769261709219,5144198216927140,3862769250289573,8486978037122982,7593121114221553,4091477424465832,924718270064553,2197035839907755,7757338842310573,5818630818777010,6371155280906167,1307356310309876,4768593063593915,9188618168543164,1494161365034943,6353889403529155,1572664855553988,6124758111799237,559836934712579,5879881113503693,6046249653856206,4648332297168849,8760128216682098,8433970902223887,519673728411614,3912493719578592,6286442397927393,2827569506721680,7726665260903419,1592848428232307,5908021519943656,2133040507045865,4422267096541164,8666873566818642,4611074027374575,8100079125242195,4293441147029496,3728094536468474,8890643880045567,7829624524222805,669373727885312,276739703171074,7530869780424708,9168647528460548,2060053326718983,7488457249171464,3118562307434510,3767086764181519,5903909266237456,4056905045715971,1656954541877270,5592922261456921,9020734029304009,4178181742894653,6427990427609119,6808677296302114,145932815992867,2465542085994534,8636024371863900,8628381316785587,3808968984987695,3113669186161672,603268054738995,2464547456799650,5167429001531742,1900681014798391,2298017514522680,5363694913955899,7842960578030602,2146041819744319,8422520975879739,5582264331380803,3616108795144261,916054347892807,722606829226056,844552806303817,2081256270727242,5136602441283255,3226179510929487,2144073799002192,7455814078810201,8170989585394703,7217485937010783,4063072518195296,6621742931882342,3939597907806316,475985962920045,8146562105927792,2403217336944754,1209815183419509,7478528374376568,8105715647335203,4463761225205882,8682110540949054,1993799498604906,8844573262030528,898327746324610,4678160227870851,5588431526652037,5242078222329990,6286320585885377,8684696046626970,1005110760032394,8005729597758487,3405340558624908,7792287402669762,3244654392707220,2072725139081365,6865828609362072,5334667481286810,2799488787368092,4193658517768352,197193485813921,8530135538961435,5823616772516004,3787925894916263,8968349939706025,1185084312201389,7894539759062045,192577805985480,3578969250941110,7420254402734264,5274403993561275,8407577884444860,8809276713027774,7486740870095221,1655424057026754,4604390603679939,7473025122901883,6719291002235080,882017297238218,1776141390391500,5277139520006351,5071905836476626,757276234148899,4235730020174037,1751026262214870,1842778008174969,9054977610412783,5997178583320793,1783264816802010,8261728446568534,2844525548832989,3620121200279099,215339685325026,95601053911271,2952974292240619,5702216830290156,395427792251119,4771406095157488,3641856689498355,2274088035354870,5179168256944376,1692735184152829,7528729085978878,8625056355846401,5003662713342214,3715878359410952,3123628443265290,6675945110374670,2109130021153837,5899481469028626,914254067624211,6596576071411989,2763022559013142,1969399086884569,459319119210780,1658753792297247,8671051772954331,1438123059267876,2567279300495658,1430120074258734,8569147077028143,3550174297237808,4841416003987761,4495498543900978,5330942094100787,1902801008314676,7911259704625461,7325925063374258,308588942698811,9164747113146687,6494012868929856,626976970303809,5858237342419267,4400163621669188,7720851334842693,5491484323096904,7648561908386126,2969767277087056,1191552714746193,2355912918640978,4880140409104723,990659294243156,8334834923342168,9170917971937625,4446412965308762,1154957608249694,8809473519225185,307473681336674,4245367917267300,6534015827468689,5808986804332905,1571955340822896,2872733471746418,8531950867777907,3330105634574293,7821224497298495,8897671631686013,5337913366210943,1412927148239234,473610785212807,3782408444160394,4400535026264460,816724129048974,8580445221164781,1885429789403536,6545849122408850,8042235743516534,5961673869617558,2710409811708311,2920431833532824,7115396197248068,79734328043930,4643619633482146,4427527316244899,7462366217193894,3615328999336361,8699658076391850,2665073671212103,2017753397430701,2031821623241135,2548503161883057,9159665017632499,4918473768651188,2034787481315766,1135773007169975,8003930329426360,4520308177668537,3264988251875772,8299888642517437,3708603003431360,5622374967143499,4661311391795652,2138637556623813,3371174935988681,748580600408930,7367943576871330,140503559408080,2102165935097592,3031682552572370,2701253126613,6205123438135766,4879831091079639,7073582048250333,3774156190532005,4723635885844960,4028979858983395,5540878022185382,122694139963878,5893941107276881,1798205563107068,5206484342655466,1321210848520685,4876161637476846,7172462628121071,7844542142957838,6122640795601396,1273454163225077,3824937462163958,4430058643106297,9047348364644778,1858739076422741,8196762809068034,6301675337435654,6314905433369095,1176007026231817,5216631260129803,82123616348685,576766035929614,8700026577431056,589344487803411,7937745420913172,8557760532523542,5147606207802457,8527254573697843,2751322935880226,8076975408015907,1007966909573669,2194955323034151,4508577488119559,6517204841916975,5760046560578096,6438220135746099,1482447705926196,2788115731360313,7620656615139900,8041123441271485,8292612935756356,5779565797386824,4100017446955594,8543538832355767,1053143532039267,5411655942425178,6517544807402076,3374479353145958,5875529574195621,842324826425962,4488133838817899,8462005506091632,3665227913833576,566196285450866,6707052036524663,5280860591729275,6942354164943486,6239610297693973,4313875193580160,2627496360165328,1599851393870469,1799261851060871,6232184364731016,7909109138172556,2322030111820430,8715198397886882,6666899636488856,2977934984448665,4853844011641499,6748495939144348,3013194406103709,2949664260142875,7543471188923358,7362351024868015,8448574976086472,3521558255938227,3379795408718516,6021841916340918,7573535099931320,2400058019916473,3156986187418298,7432840747018941,6799368484801215,8865361284022731,4818184931609286,452614483733191,5386219690232522,3511839342015439,2940426837469903,6043144544087160,6007301676026578,334222605191891,7523735052407246,3859397863394008,1864610684062425,5752946228480733,8090633682155301,6796971400891106,187804754553578,7839211456604909,142723861138162,4532590551763704,435212849228539,4011980510071548,8178937350753021,5236163119483648,1328833398295297,6287652302072581,6579850628827911,8796891829561132,5720077462620941,1452079363163949,2368889114971585,2352306484996884,529537635068693,7888134012627739,2663611956857629,1095918438558496,3778581973258715,790815759076133,802078205512491,2394245953882924,5672881407275485,5810057447533360,2602429973433137,7209287437749043,1609129657092918,82018296376119,3159399237954360,1723542946794298,5954180737745375,331490864876352,6068045455862598,5217982197761494,7346057135934282,6070760571759435,5221028782992204,3643402380651341,6057105738648399,4362386372234064,2392497820502865,4839225547238226,1895021005425495,9003417387724465,8760397519168477,2034750638525280,2150786796596066,1310660919585636,8205029323320166,8253336857340776,791293789557949,6287922435492718,7540998432829423,6825199301946224,693183627750257,4173218850605941,5358861550938999,179199468178296,1728511502936954,2889462867725179,2549797975247740,4015156285074301,5307789426469759,6918617004526464,1939630788840321,9007839898946434,3007022012550019,7922374037015432,5586559985789837,4594482089700249,2698804543810458,2955077886271459,1717079513189286,679981909568423,1613532610309032,5717020213947305,6977122226899886,7687357285370804,2369186434493365,3394026010676151,1597756493622202,1758585265376189,2786848918047679,8350358619417537,4076961033817030,9203604384464116,6217077494163276,7740519546964940,8049788818549726,691665180486630,8607133892963304,6120269624396778,3824641232956397,6664407827516398,7008293455203312,5649321009351665,3652904988735315,2605456717179892,3798733303204854,193422476594169,7868124102216059,6850892792750591,4949628703857571,2178135651953662,5356935307930623,2046593638242905,558826002256384,8781271655287810,5354669468101635,6634287883308037,1963709931506695,6974939934903304,3749263469587466,8628372608691211,7974460272282637,8391503860185388,4160710526692367,5834960315479896,4856298444141059,4811529468931096,405638299233305,650287987149999,323618658307100,5513346055989082,7099807761861667,7287286891588644,7540111102857980,6563413855341607,1185991665675304,6962503532306951,3950132700056620,1421535532157997,6646789916789806,6417221382884402,1695902233214131,473423577320500,9062235036437557,4600659052768310,3243225175911483,4743410761124924,5419366511979584,3108613976173636,2364870318156870,6648735997537351,5970340752919624,3163827281423434,5624802394696779,8742099265096781,4667587408956494,4819569272234509,3447150516636754,8011413237812308,8403782748774926,2722915205916516,8051113457095183,7454418685381730,1378730394610787,6329231367771543,7586609359195477,6854122108529768,3150290137844843,3835147275594862,5235349268622448,5361913862065266,8064972712889873,5076176255298677,251328327625846,6120943274552440,2728331204897913,3879958226905354,6270310799223999,3131354652626045,2123182097550463,2877984937012352,5454653144026242,3178022094982275,6008970859785351,745657236475016,3236747508934508,3031252884064156,275119278279819,3639614584679566,66006819925140,5832981370719382,5217763879570584,6748412864982169,5924511387864225,8729392656778454,4222689965017023,3543155126529190,3860907027614888,6579379840552108,8460289933413550,1680144976088239,5718504516340913,5130882108712819,77915775282357,2897042774822070,2094033031747444,8751279279770812,1629063046433981,5603776735029109,2987404941274307,5893855038557381,3600724421348550,5900661371955063,7415971742928076,1568300220247245,5961831820831954,8122335581828854,1563524158500054,5408308013378775,2545450691783898,7828922946129115,3048472799972572,3569945850182864,4743362860795771,1048673230490852,5101088868781285,464607002299622,1243159457729768,8583377730791292,8250756119727340,6473087039622382,4543287920872688,5542696182590705,3647003534937331,5340029904522486,1870754383826169,4251627677748477,8963929286413566,452538969189635,9159164781366533,5760024546727809,5679081236548873,1532780584865038,3614640752987407,1900858350325008,7230924532882648,6133911396330771,6173855624752405,1013497545837846,6173622912863511,8124211388132632,8862149019281543,4291449710798725,8831021376649581,8865775474364551,6534408108780836,258398857579813,7332431621631271,5483032371932461,3557628217756975,5198315761200433,529781976575283,6630185570159924,2656251395812665,7542694949436639,152375410355517,1862666289212738,6783829159423300,1100719716642118,3014452411845452,2996169599356236,1945875634212174,4378091133128016,4894015555693909,8096744791286329,3859047942253915,5299784447167836,6912608050774586,5184177173228899,8065320590646502,1326713043316074,1169368871783787,6249545686723948,3962031086923118,4428240621129073,8287747325504882,369074147642739,4914307977162106,2839383908633979,2011542422162813,4102313521253765,2086117881032070,8293350114251329,5369413388037513,5386598755675531,7349843444123544,140888103415186,2737742408674710,8989063085600157,37552565710238,2347141713444849,5809147578805666,7969656487660963,6628678398078372,7714735437581733,2647671806266791,4758745590672808,2376724837174697,223588452232622,5035096453384093,4701921009208752,6770655928733109,1796716880596407,8227300301950392,7304159752789681,8360761926269866,6526613355859387,5972734753353150,2221655457476032,6073285721419201,3317760454700483,8915053278784964,3964981173530056,2641785685880267,5217765816831436,5412924533337555,7585280946810105,7754200030714854,1890855547239543,3503314553687518,6085441857080807,8231210746187240,5801160284696044,3070032014142958,1738196316466672,8414322980335089,4013159830037075,1823874086774858,3344521663999477,1582888394673657,7408491654274654,265823091125758,9144611807202815,7829861832953344,7710166425947651,5114945348496900,1157633905241606,461782740188417,798300730183177,3725997045411338,1594369545203211,4985330454367756,4199637751590413,4557845160226974,5364674919722511,5407234297007632,2106725784276497,4204142708067587,4709450566217236,6841949392402350,65288001211253,4352462022315545,8749668669894170,7569172043238941,4143464683482654,3125243239456005,6675986737677346,469271203548708,4979769406983717,5147332528942634,1130212228787463,6155326372746935,6905326491110958,3269379817647665,5365554920721673,8246650223816249,3900313875532074,4567738423152187,2636189900936717,7597610828893757,9122709155941950,2666362468699716,7779211300040262,4769967016316487,7769517117099592,5297925302259276,7460028242079312,8128035234950737,6315048816324178,7001406741868115,5378696771030618,8873751016987919,4963753005264481,3966440310050408,2146102923120234,8760053397991021,4544631034999400,6724478940483186,3598674727775859,713526056431220,6761085026094709,6397349731397239,7705750462762616,2997711861927547,3474976779128444,1383487525351037,5998701966208640,3626298670468690,8934531776571181,7922799431724678,4022777727774344,6874333071306846,8690887889017307,7035445218954787,9106454922087255,6868577344417428,6683839788836804,6863553746189892,4762716099817123,5826549667327653,4587857555877542,37621092814506,1338723438186155,4533359539990189,4277163010518385,1004136782581424,4892689789791921,7479974814797491,6152079547641527,6628302088916664,3089230351118009,7086661243030815,1900447947124412,7026590922706626,7359886235324100,3822725446184645,7940855047990984,1007276046331593,6381969539346124,6181134668132047,3233194154562168,3279126374937253,6296839402680019,6111242785042133,5207316856423033,4537139920441049,7097610608072655,6850234292825821,6139305322524383,7785495575700509,2499306156742608,1825709450063586,6898751426711270,3097949837823719,8672973885607656,3775830201257706,3519395568045913,5561318938701552,6844097170240165,5612640831688434,6929633032654579,4105392980741877,39405419941622,7150680119480057,8168950692220666,7307974078263036,4069045849288446,6685469338005250,2475846047362823,3332955117129481,5426957599936266,2733218440023820,8742205797068558,6978902006820624,1378043861757713,1652560034869010,4929204758228755,789556095094549,2073224156729110,482157896806169,5701166902611742,3940493190934303,3207438747471648,7018223910877349,8698270186238051,832223734026020,8489992431399558,5344685408841510,5606887811632935,1074262187601707,5921740765114156,1250491835100976,3921690860801844,4238565375354846,2972387926282039,7212825566687032,7179535324901185,6294872461697675,603730186688481,8616475592191816,532674171989833,1250338918035278,7264671558741847,3285491555725144,3026620151074649,613712441921373,7528120925466462,8104802785557819,5290759897890248,4289226543288166,2244709565001576,4843228237926253,4863440279883631,5250346205091249,5411633152337897,353962673532792,5379565174501241,7679907534262141,6522937431756670,541255874883457,6292192618418054,4714158113591179,8774989436226882,6528635496304527,5163492592398225,1164930005817204,7849534864265109,6389429249211716,1748162333691804,4730165225820061,6963807298662303,8646648860077986,6983523142340515,7943091223997766,3629808548327334,3808186395586474,6445663427956652,6089517657231277,23433599356232,1699531539894197,1188169568456632,35753628815292,3597227978026943,2849406936567744,3006766741966785,4361545879310276,7074610795029153,4182276918851192,4215609340530638,5717897625071567,2511745628827602,5138320718271139,6856822726832085,6616259938319695,5814105360125917,809445550723749,8965230614261729,3117647140065250,6155105389293540,6598289990668267,582288625407997,1698651456540656,2290924803831281,9041811001298933,7939700279504886,4443034034917367,7722205550284793,3653928720199675,5863312346688853,7310511601320652,7263391771791368,1552092258775049,8766438318174218,4034235785596946,9025915064005294,6426741949698070,5260599172272155,1038205348273498,2986761805918238,2707177242737342,4937404318781474,6659077064912932,2257733226590247,3047404602331177,1164865872531502,5415428459098159,4742552948198313,6884004905472051,9021347657531656,402949157195830,5486333016756279,7630946018897976,688051830992954,3158519319572540,5310820630319169,2515717679755334,7617325997494343,1439345279225929,6597573181698123,1260119722954829,7920075839017038,4566741199622225,4710024898703442,6922498775174499,7467893145178199,2841315127005272,2774132126814300,26596665725022,1410522309226591,3831285980254306,7060452539404387,1079861764275656,7121102877732966,6557013799022698,6611181122556015,2695384820568177,3759613080186994,2070340124512371,453906987839607,786095448625273,7588750159515771,7983091671756138,5709782354055294,52133402775679,5169566203916418,4412495707795587,5491449817288836,7249337253523589,150075198787719,1046207435559049,5525260094804106,8635663366066321,7685358307119250,3023451799081109,757995239893276,4108913355034775,71515713400986,233449244047386,905784471212190,2777724290805921,4774549414899874,2311691994894499,654821006643365,6465445475332262,496136890896551,4153363635499176,980192377581737,7951903224761715,3758912589689013,1722055675809974,952056054075575,6173842761158840,3630541163488440,3096191131693244,3955951817502910,372010013266113,5661611515605708,8544847707205834,3679669886177483,8560179787911526,1663322529738961,1835975490662611,9171955816689879,1562480095342808,731160351559898,7879285370663134,5642214746697953,2529745875022051,2043489615800358,8769182684238054,8229362479976682,5761466486806567,7406153502699757,4421665972613360,1193234120716533,6033228097884406,3042859728498935,5588744800781012,3769323659882749,9024403648963921,3371900590567681,3514994907320580,875844628099333,2273041898926342,6827714348200201,5835876182577422,5389807873192664,2344743196712807,3448893444289241,1322866346610968,2877292063125786,445932418238511,3024896125636892,8989202165944606,3683667020362015,4513440221704484,2618720197521707,5964524530749743,6291111587017008,8968215284805942,8464620533669257,1632884051587385,7252203865239867,7098044877574460,7057196333846845,8589231938424071,1276490478760257,5429581644353862,8376954723995978,2678032871788875,3066633021932258,882859537518927,17306392056145,7698900885926226,591767774933333,3289610064564566,4598336494080348,2077260515471709,1025259712016734,1344223429964128,2638923411755361,1540410700662843,5195835922542950,9170393023883572,1899837692233823,407448029691282,2393653257941359,1075006359597426,1624807817843063,8344580281915074,4261046058103163,3259647205806463,3222249159692673,6382657386213766,7493146398732679,3678310730183048,8721833800044940,5191834844156306,783849342384195,8879608918614766,3376284453220864,1558242295574935,3331238203278063,3254262717968802,3732653349617051,302527438664100,1149363933802918,6821840541225385,4031009044500906,5853439556006315,6204655554867629,5941686321713583,8551530644154399,4562742115013045,783702889296310,8498596476253818,1909999000793529,2472437746976842,1878693710470560,3029472277369284,5003633331251784,1851917789491659,2393824236326306,2628138698592718,2907068787110353,7670428465951188,1552028206100949,5216876412080598,3284493916778970,523581427511771,4873510612300252,2145264258109917,3194971208504059,5221315495572220,7155902367412716,2074529573655021,1076007658697204,4209534888038902,6782834221560314,8265515526779387,4731754258815890,4521184611021312,2196198690714115,7371476714107397,228297552007687,4498457579246090,5502324590424588,5881301921804813,929156335989262,3552918893755821,8552189705405677,7697528890962450,7750467428217363,517513843855892,8055162605028100,5423265425969691,7397261318566432,8829000954278433,8512089674574019,6060637949620775,7498925232935465,5655722530951723,3866464443953710,3710568473776688,4145068454859315,6573328828445236,457675718734394,4505528641874015,3097939052769852,6844837535928895,7426079886463553,3304833459827266,4321760166605381,8570872609968908,8873453526839892,741255721554517,6869877224755802,1665832563716701,4120336593515102,5161379154184293,4245763704582753,6564565735813730,7855105902012369,374503678562917,4117681902465640,6049176018580073,1261515757007473,2932827525279166,1401546273354360,3096324637258363,1025115837158015,3724488355500678,4155740087651777,5149813195772552,5567303692382857,3760858452734602,515027294179979,8678452062376595,8077894994776725,4092043761316505,9193716485091995,4076263129313948,3934937298735773,811479649342111,810682263048864,6908677979530031,1418470255727267,8851731699502406,377917348770469,3158321197306535,3204001106047657,6367442436158122,6524886543061678,2504806269567773,2184671187079857,1207185219703475,320917593846457,220749271286559,1734629163348670,4737684973703873,1481243148923586,6795348713386691,6243742545089220,8474113926394565,9032118214243014,5221079527370188,8684491852429431,2727237911253708,1460771073143501,4717482572813012,5036527443981013,2643777480594134,748498053133016,45671782437593,6830989663883994,4333821223839866,3410459103883998,3189130659787558,3883301693936359,8938287721493229,6123273316460669,2900865755116272,4607532626170609,6078958700131058,5077000890954486,3311910683013882,1977713518252795,623963926958844,552502712718081,2748379471721218,3915369161118468,7420651954410284,6142991243891467,1876938576343820,3848067821572877,4482730982396688,7163908670133015,7661243789431578,130817744614171,3344138562204448,8253578027324194,3511467415393062,2345948401513258,7773132202570539,2227274225300268,8593517249437921,3041958104249137,356331103220531,703207738110772,1914959390716725,5507728105984824,2404432690901818,5175167715160891,5019552581350205,2116777169212224,597999893304130,4757058105299779,3309051661448006,5726397753149848,3205798024393546,805284565226316,2470546020987726,7482657877717840,5547882508919608,1469801002734420,4221190311860366,1481364169700184,4055472660517722,1717829977813852,1277150887277407,7437090624123744,5093505456780130,6965328953709413,4561198759154534,1757460842345320,3652882002490219,316155184337778,6773290207196020,4820202657420152,873625629157525,2110075610575680,1673211003261826,1876904604275589,6716808558261126,789252370453384,2648468587205516,1077757695005506,6345372697334672,2478377613489044,5086793439100839,1920066676601750,3695128977814425,2840371806794652,7395516673872797,3600147666613154,493507531854758,5469296488805290,4869074029933485,1173221555450798,1081933683889074,6673335253742516,5051970159670198,8500969782260663,3437818973279161,4821031339865018,8352887559025482,2865909102501365,5559288426394562,6677911274566595,7180916759024587,2979796999558093,56950385382351,8591660611032018,7505013646922709,1766756395070425,14743335097307,8812934016206674,9184430431911418,5205459236926430,405068718454949,5949637420610531,7611234044027729,8274490927870953,3780072002974706,9110752922768371,3575116992762868,7784880263679486,6665516993782612,7723933735689727,3578787328611326,2579607113888768,7511539414217731,2352914438173701,6728851690312711,122322935044268,3542550234125323,2007023778165773,1482955968345105,3211444381660178,5046043936109589,4275950362334230,4953953501975576,7536132713886745,4109719206532122,5602484176754863,3750707945444382,2436492583760927,7427539077313571,9163747823916070,5251278448432168,4196375054340956,8650119132820522,602580291613742,8638141518361647,2579457354748977,8089040914482014,8003928847987551,1320262916584508,4585982619489344,9121049172889099,6822295734219844,2706554585699398,385072448967753,6570924604798026,5161717680403533,8735897277806776,1252913640731730,212074921718867,8564149508887636,1027599738355214,634116440421462,1776854332175447,6998148468110427,4080319963018333,4810224243758175,2362269376959591,8603994785510504,1097842400187507,7314913309355349,7865655590806378,7274290966951038,3597859476927615,8599022863873153,3303338974532739,7396309592667268,6951178565915781,7236596557444231,1513194272478345,2060542802187403,5241483134104716,7410241394496654,6760771487642767,7544930152838289,1248234229658771,4721728236868757,3187204999732761,5768463219471512,8203755942999196,4852756376327326,1343848323036320,6293746444113060,1905304432784551,854879606617260,3531416536749229,6644764392305847,8468063901340857,4698214917862588,304614745642173,9170953585546435,5426128216683716,3509583173719237,4439484922067149,7545710660489945,5784502303198755,2326096334179876,339401912748753,1111210912863456,3309422522012897,3791173512680674,9135008219784059,6819252083995877,8363224179374289,3674799938229480,7697437192107243,7653147660375279,4517546953823472,4763166891504883,7473398994476585,1785650904741112,3489306113727608,5999778795522261,35599199499520,7837809123928505,6170022180672770,8889676174775214,5792127577429256,4961188895479053,8381875813479694,7452318573747757,3075122593699088,586947148895508,170145573287191,9220817586923655,8076196085699461,4658415480280357,3130572428037681,1127237265235219,1367147780715819,340749349270830,3658080396776751,162827734938931,7932494234900944,8469677991810359,4255670935350799,4488093414219316,896119342159162,2152367829308731,5803733134054721,274538481038659,7929822071395659,860110510536012,5421786600363341,5139218635330897,7530522912535893,5490928178869591,2486267013797212,2708820065695973,2963593620927840,6925433740580194,2275169746498915,7084134792732266,7010902637925734,4811627260933479,7299450149943891,2025254079354223,2527681901155698,7192324852733302,6159830362011001,8535182282896763,6867858784318845,8821737011051329,777177868498306,5954045974328707,8654649890997142,2997346422297990,8829123930477960,7011073884386700,4319561238828430,4249017974289318,7394144482964881,6411723903694226,711468550616471,863308814693784,3305234174893636,8911348876129692,7692846564521377,1032736486225314,8235882306860451,4916953823548836,8615625982621094,62249658013095,2589684265858475,4911784456549806,7946678245340061,1518844452476337,4757889679979954,1202071946655156,5426716040689079,7403124168918200,3594310605346237,6033422079145407,353874484450753,8123967321093570,1488067374205174,2587628004414918,8393198617793993,2438849184044490,6175543030658507,8300637426013644,184500155610018,4880826740831701,4833200087193048,4290871959451097,8059890226992602,2200362417133020,7938504806471134,8227239584445919,2831350414095703,4944565276759523,5516707071784421,4051991466210793,5585947806643691,2397547533340242,257415301887472,6209465371162097,1103350453040626,8718300317947380,8081991178286582,6778860325503913,6655403980994040,4446983467365882,40598399202817,2732645472581124,7056642579183109,7991547379512842,5370503148893708,4393629649720845,4158285128414740,7102804309521941,818393165182488,5673267987494429,4237104312694304,3078913129788962,3758519913666083,1752365723924004,8262356825082118,7300846486763049,7206021466461738,5375305416521259,7445137745933869,4251996586423855,6452167374616114,2251737390994996,770379392835166,4278467401872951,3677694340822584,2864645356082747,1089407461431562,6795476442469952,1697818116576835,1026643101357637,7070312202917447,2502783268623953,3623985648383570,9178552663291476,5792646403475726,250292318189145,8156820943574619,2688117289227873,917507755292259,1211821057054310,2912451899332199,8712576292262845,1028390310350440,7596792238700146,8497775040026229,777028348147320,3568977450923642,2587550303688316,6645195093972605,393713093932673,7267750914348674,9170298464720515,3247380074747525,901974868965002,4891658448238220,5424630633748111,6264722241009296,728380825327250,7682836289443480,2240092272621211,2341308007208608,6700843437717155,7262682741048262,3740616530753190,4523492465481385,1258605632738986,4702234876374642,6785854041601713,6117509850437299,6779358739584695,4828601969661625,1535941278054076,7297617124404853,1620886994024128,4033928235783874,126975099581387,5350050424084164,7239188528477893,1098296566691527,4958811796043464,6280661255665353,8934185639147210,7293741109788133,2431046360741580,5029779185817157,9120495665616592,4385047317086641,1293012295259861,2197409951512280,2013353761855193,3865418940380890,2499919844669147,1590473736001245,4834276062287584,3467782324170363,6566910186100379,3299763870701286,8446766545541306,6364306801800938,4856433903646444,5503445973726957,3235586212312814,5082719606142706,3297754215544563,8435001859708660,1013630571681526,22558780577527,1789001003898620,326614401247530,1132320114816767,3107951350283905,5588528137238280,6919909448095497,1679272297799298,2998582119651086,39490752821010,7722020080424723,10501603243797,3488633570375451,9092245136453253,4106976682309411,7815065315661605,8544711410500573,5675595507619635,2804855396685620,6514126747809589,4214283793372983,5020160990992184,1523170684660020,8893664230315838,6727395425335108,3590212551227132,6730427855075144,363951976380233,1943083508766539,875099460564814,3885943145805647,8525793214289744,6960858200217427,354898472343380,7663585423259478,2507890506159960,3574101185861465,139515998911792,4043848654796636,2344106012972893,7803126866419732,7826100552381523,3653064227125093,3729904158693229,837118796052336,5642161398224753,3934254398453620,2431646017771382,5104035560003448,7360400040226452,6857629406451580,694696446370794,1911956985501567,6106986719786881,3517508911830915,8855273308870533,5164885714900870,5975681842141063,6733533875845005,3021658757412750,8448611096500005,1421146935614231,3027575746939203,7796498433849236,1866630933297051,4164038527187270,7139625467336615,6415112923240366,7483593720543152,8936053393738056,3678802154567603,2939062779238324,4073203978491829,6918926421211064,1356194590250938,5203755679872955,7701725408425920,7268727967389633,5140998017103812,4490711968044999,6545954357859099,7427536492804951,990864693393354,3055032506996687,5328915849598928,4378933349652436,6235880396568533,2052612280145881,4104920113960923,1074085985843165,6508727630297057,8894075914638331,48171868338148,8955521881676113,5821514425759722,5821445509044206,118191151880175,1100331282126832,56308045035508,255242989336567,7350361093969912,6573210826536953,606277799163901,6618142034278398,2862933750315013,8498453254928392,9145169615484938,402098792232974,618834665658383,5229241103431696,1605010411010065,2032583474083862,3903898461181978,1920140937088687,3179774093056031,485720528427040,8562026638342179,7045553659263013,3457830716280497,8813548341188648,7725541356722524,1857381955631147,779784426887212,2627583610896050,3215270248314927,8307336287057968,6914763013765172,29747093850462,7760716906148873,3084179225671739,4071471053247499,5186363697756229,7397276346153313,4169244495444040,3631976910346314,1308361893869644,4499228522469453,4643948763977806,6462956081707088,5717881265199187,807994938710102,2546496268548185,7168406463723610,951224472594339,9079785920673886,2075309065394271,7210379649235042,384509239531622,9102290825107561,3070856331196522,3014055704578407,8753153970534513,2921523986946165,7325149913033554,2941528638953593,8386153355253882,3799347565156477,7332854142171263,8164903189313668,1118868735170698,3010404153440395,3258647071370946,129544929802382,2945087871908205,5788995496433812,2636071909972121,2492449398405279,4197639479990432,4222754776094884,3660092626081957,8334087333877930,709991052384428,6337767649884333,4534484742576302,4512173263091887,4505613318584496,4779331811735730,29784325363896,2561026718988474,269510755973315,6536582771659078,4619368112470215,8826095776618697,2675792851343562,3503815134001356,6263172264499405,3674881287608527,4701322878277841,1213886012332244,1700201241188570,7709094489702095,2955169381357789,6668526368528611,7464850054441440,5578980853422309,8475299491133672,4373768290629866,5345698742540523,3651877875489011,5726555388516603,4310304083293042,1145312870365438,4302179703355647,7547184283641353,6829288048982277,3397822382414086,6422688085603033,5393891360151820,1149700634749314,5860326898497809,143910516799762,8679147080674852,6830424910706968,6252344096667929,7839608733671130,1288244621170975,5961025006360865,2009753128696098,5593239911373091,5943644126452004,1750244593785132,9075557680344797,1914321217247538,3062049159444788,3743269111904565,5516352205125947,569604132151008,6878971001207106,7954247556831555,1181363499178309,4681583566379334,8387757942266183,5369473525171670,1180903847762250,2656235731548491,8603267557644621,7679931444960055,2069874956826962,8140272622115159,5365270230866265,1050545878899036,9028269527529822,2605609732208992,4146892530276705,5788094987286884,5926919017053927,5975270695971218,3660035492936046,6267553012726128,6522998190668149,1055718854130039,9135575706630523,7372593431613162,8583525194553728,4852267576538176,2510424379636098,2530494332254596,639788866783638,8134455390910855,4060178588653967,5533041890793873,7166822489856409,1740541854144928,3244405220161953,5260307416209828,7421368024224838,4230596084324774,3976201068367601,5409743641467304,176991104719275,615268581325228,2996710260955566,5798782911109552,3913586913180082,8513556022417843,9178786487446292,5015699890125240,3638957842381243,3038128019952714,2370528531033845,2510720865638849,6873825295366597,6141192450636237,3510613583247822,1423645179020365,6096986519640528,2136271885318610,2166014232525267,5208405560515029,6386667942164950,6341814417545688,2865004337994201,1069787332024612,6953144035531229,3069642226489823,4878298610694626,2648277503646180,7182187420621288,7484295228108540,4597898629921258,8633643462539756,3346532251834863,3414024018885104,4666655966591473,5523425027734003,6580006929673255,7613259898227115,3424225466833412,649083129246806,4690051909327366,870359752826625,4302656415570441,7347481214286350,8183992430139923,7021529649986069,3190449126439452,6833518941248029,2991716443494946,8454217614834214,1771800186747433,4811136159226412,4223596404038066,859409962580526,4242100762268765,2847292683409968,6932920007498293,8419342738291263,9003415536092509,1613457551587906,2789110073203269,7698146352634438,2966212994813708,6486315591129677,8870436874936348,6905144793561679,5152235483232848,6156680898304593,5171876187503187,1660426197785172,5623886574336597,4376378634480057,185003117124185,8900415943334491,8242467013220956,1043533134150237,1456170082450015,8959250206502672,3979883415059042,8782802499099236,3657647060187751,5872175595092586,9217464612230247,7655414231407214,8587913643317450,7581391033186938,1747436335184507,4363880025782912,8004491885394561,6874079519936904,7600761340661526,7291548269038719,6241584987609743,4095219091077777,7567946207930819,5348932266308275,3407379068669721,8666112313760409,2093415668800155,2588283787689754,1710319396628933,7262960737508000,7885081165249185,4449904302766755,4523828135871601,211991263460008,7137761331255978,5163375243229867,7333219851418284,3631403967396525,6180940757056174,5043561297312431,6881437319887538,798927922715315,48175527014174,5716819493382601,2231401359538878,2473958480755396,7671531985388662,7504140723395272,1439475759848139,4362169028623057,7463496075934420,908957420567256,1358822886193881,6034767612443354,3946430045690320,2764316690889446,2691979304327634,3641044711152366,4936655974816495,2221905449491184,4504017419696882,4260440283609847,4384821907036920,4314471086586617,2139393754823418,1660236197911296,8446151585970945,4761132258958082,6046976928176899,1205709053135318,4011749154142983,292637298260755,4966129511504661,3084157894941462,1911888209369561,5412879874259742,8739392496515871,3404376314960672,8180400488517424,3017346202344227,5479394704677673,3309099449062535,1474595763764013,1148258386642056,8565701798427442,182785088846645,262025256127357,1631327472614199,2740226183076664,8186205280341812,4502965001943866,9165610467081019,8259282174461066,6961954603558298,532829611154239,1246266702031328,2071831844136075,8919355162590024,8281313713437513,2353823833209314,5401117384424271,8381290061839184,2238109128506193,790765711170387,7933297699067022,6173048262196833,4246078652119901,3684190753766242,1824094684887909,1599920094493546,4460120253958631,6012674581404524,747563049106286,1338971131403120,5256328339085800,7374928390067347,8712068112543198,598990654866580,9128797916229734,7649691413106849,528467997514629,5737003371912072,7789037565075324,4456275553500043,7740526344702445,3096557608835986,4941207975074709,8615171193756566,5158872950938522,3696342022490607,5063422925839261,7230851129473951,6980900097555361,5782312220425123,5112719314369444,1547808024402854,1109394295421864,7038372420148137,1895039095888810,3039040314481581,643747643235247,5042675358694323,8818920773442484,6342305094704059,5647622107233213,6099194514676672,5093177647588512,8770324000193475,1603869238967239,5534108428860364,4986609183398862,2485916991065934,5033596049202134,6982767085591512,3578502230866905,424260351474651,3955706098047964,1200649179061218,4220892113066980,3844944665844709,4550741669444582,4619927742192617,569629000195050,6917884117687275,2536393702349805,5893178643946479,5333094708861936,3081904964033522,7405025037098999,7471495589444600,4341672174812154,4062796561554428,6552943000959998,8393750352985087,6874514360933376,379392245586946,8311636308592789,6210811935022086,8052496213502845,8938827177614345,941678709038097,6045824950631444,1878610211929111,2155026568193199,6900694772104220,4528718723374111,2154541274078245,3686778513472552,6003562833779763,1439679760923701,8401875601546294,4397656515034169,4538768982178879,3540528892533826,507581926456388,6942608797942966,8509894342409286,2742634174366329,8782926658673736,2797335747017806,4331286172679248,5380962056715345,7141832536546386,4916498759318612,4214669109591125,3860092703710296,250485862497372,6704872450071645,6821625241672798,1806525504584809,4906464345136235,6191797256445036,2875620089125997,6513283029335150,3269824445512504,307192685714544,6082061425417331,3659427539172471,1587413192309880,4825789752679546,6959911726701691,6915761791894224,7023081089260669,7196866446678549,4968823825128576,4520223824862337,514100615445634,8674515264668419,7239093039922309,3144992956120198,4441658026466440,5599406799764621,8502719740583057,7103536295148692,2357651679091861,1209772424658073,8198513448688795,8008479472188584,364565087667767,9071822773910699,7804527525424232,7756075521179449,4995954342582813,508902008806577,7055261728349363,1473961866124476,9162806226885822,4867352777833663,1595934830615744,2030859780267209,526312326536396,3129038216821282,5548948138351823,1598590236998864,4911393700657178,6614955255774424,1019577124560094,7375998979869221,7205963347860704,5220573389184225,5541631866354915,5359010006670566,6348547972702076,9105143755758826,5257681339071723,7361509469408783,2513324378602733,4457885385800942,6894226255404275,8915486830662795,4859775353412859,8902819353665297,5383223594614014,7158166711713024,950626780134657,8548315159764226,5964557464683734,494463967141129,1259045207784714,5004933561487160,9203515478809872,7343612892830993,2786760386665747,8423455045401879,9087852138447113,3028716900728097,698285873315109,644370393079082,988732306620284,6351247418031406,4198382208378077,2510899574471984,349602498043185,8284976751680821,8109606237945143,8408399566060857,4198499180756282,5388827519681759,1677133773700413,5552580708900160,7139099279170884,3198753970666822,162107044920650,227478532750667,2820253948411215,3883151244713296,7351047688109395,2268007129005397,23411576028502,8806337084841303,5698272599629912,6581050066943322,8682348728464613,5509988085366112,318753867201889,535769200098659,2712567818219409,7561257594396008,8447256902172009,3089217673837936,5489336037358964,478951350927252,7972493863796091,7087409760890356,8051520255729026,2126405337234821,8685433271565704,7551100225437065,5243135517472241,4551937779760526,3805864770143469,2525456963329426,3300226618703251,7957529247407512,1540317422427546,4862484404511983,2617041563647388,3613737057918366,8137139080240543,4815811391511968,6801304034739440,3426925341662631,701739293703592,2743046452821417,144238735236523,5061320371150253,5117645653990832,4495553226336840,8223511334591924,599650940951992,4391614263180731,4064286853840316,2042746766654909,1440024368209346,3042316348759491,3226839100878083,8370542931377617,2800035416608675,2427630069939669,3868994020195798,5736457769770462,6018344639368000,589609306160609,3907414379036130,6451990595575268,6393674097237171,5529718116735569,961474791636456,9116568327798249,805567635955178,31897290063339,6517309073898990,7452136772640239,6755259289755121,3088156639685203,7088487333109804,4096715400371701,2451114677272056,1381618515778132,6996153042394618,6352028438224380,7719732596677205,5145926463004164,4782813123378695,4842668284255752,1633361770053129,7110127391014414,4130400868257709,7907019556904466,8437094155951637,1698404115610201,6028073531309593,2240548991671836,7888782736812634,7768719265381918,3241539718069791,4419989167398432,7211479318871585,6886978953430050,1587776957373990,3877859303775784,4291136255327785,4183793249558058,3837199939378733,9183080822813960,7934582115974707,6136513785339444,5478403506216504,2196326942048180,2049891333774907,2065212793085500,6153539319643709,8964470757531202,5685476244692548,6768251422244423,6461341395926600,7690895125397067,7556191031287372,520142284551437,1823422280015441,7390320126885458,6667554494578265,6913914169409114,8736534741808399,8531914678337116,2472823669489245,6723612958047838,6586186318315105,5715058933579362,4038818288975461,4583615753100906,6895037853990507,3031140906475119,8319477270086812,5063741255917172,4035624520679029,3286872844525177,5479710960844410,3183743191855039,2423621567042695,4010143690407553,6966416272023170,8446939556134537,2710616642442519,7066745558392460,2949992699756173,2635613036773007,7043666847055505,7298816640384660,2139158404660887,7068650257251998,4999920373898912,4437033193471657,7282001962311338,8802572450193067,7971358166919794,8637470637465262,8892293349318320,3635598319689393,1859439004221106,5073037400227508,8621289084231349,8016842774352334,2278031084158658,6477935950274245,6204251308351174,3695708689620680,2504564855750350,1122282061790927,2356517124693966,2588370815024856,2552506815635161,7069460798414554,2148479993806555,7742298916978396,5614547659824862,3695295322242784,3917202416631355,1275570071412453,5645232066772711,8903389979059495,4051478297108204,6535373089038063,5478424833744624,9011812413333237,8970641725447926,8819329473699580,4672599254561650,8388975390441214,3497925177769727,4418062844092161,7821488976758059,1040344886247172,9006881258495754,2541790730944267,4263715957341964,2521417818749570,3338077920477144,3716196977360660,8358598506329390,8509614764064535,4182958607638298,8022234109509404,1031000270069534,7937537882077829,4431390979309347,1142720806092585,7636528607878962,6876027089002295,3721891970121529,8728841177087802,3927070386962235,3629338054549308,8045875787390782,5826259611655999,741530057998147,2903473254367044,3288374957948741,1563493597241161,3480140655476557,3810776893063139,3286620129876757,2913858582331221,7212903216578392,3509369164332890,9140164007139983,2360920311807837,5594135849910111,1982817612316512,4070152053817509,4522020653380923,7651620112932708,3456317645217637,5490236927770470,4870579255198833,9113983747252080,8312093844322963,8502982940319605,1494313911140219,6424244317667196,5146508137185150,3929652053991301,5897647205195655,7878431078023050,3857766878592907,3473258043244428,3059939305627536,298282370760595,1740815318712212,4758805218648046,3132561194164119,3868452125319066,6566521435643803,6596767048028884,5489892950051118,8459030763780763,214539837284260,6378698863239079,2139972793199891,630985128173481,4945224252424107,2264220493553583,7640431683907091,1664233736019377,4302688789454772,1552346027179957,6683684483448759,6289250306998201,8582308617120898,4928711831676966,160445002145724,8183890658828224,8608265098909125,4207308784562167,3837535974301645,443784617181134,726391970373584,2613030727352274,7728231136058019,1124527427567573,1293591050436567,3029102248533976,4723226312810457,2885934553844578,5253305103843294,1096737336754145,6261567793856483,8824778339958756,2690938712424423,8161306950262944,5477156966391785,3363047572652012,8799288455266285,7104837153447918,4652397223657456,766209704426152,3944568101470195,1574739795419127,3913811695816703,6542460641738748,8710152142805674,8214620490932222,6181664778706943],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/66d40738bd608b83ef35b205a561eaa5",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000024405.1/GCA_000024405.1_ASM2440v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP001739.1 Sebaldella termitidis ATCC 33386, complete genome\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"66d40738bd608b83ef35b205a561eaa5\",\"mins\":[7176279489228800,530354196353025,3704828758441986,262063867031556,7614283698642950,7178660466998627,5415116504444936,1607711801040905,514685285261322,6598409039385943,3330326110519308,5436630362939394,7118796004265999,346205182504977,7309444622487570,1334784389128211,4401965465784340,9180808850432021,313286646761206,6785058981806104,1093608863207449,1468368577351706,6294552686374939,1474881037733917,833587956768798,7792962268246047,2373947202793504,3747734576057691,1196460140482598,8721560235507752,6995250535362603,6032355523473453,6142188159084296,7576032742823261,8800781458950740,6024933347720365,5577089203960630,798275822637109,6495612365578249,5764236221018169,1412329589936189,6490198751866944,7394820133167169,526579176788035,1706872094287369,2789416536031301,1355147020062790,2147122694881351,809461613711432,563024975192137,7914341186351178,3021679799288503,1257257613054028,1649950733660241,6470373919706467,8255191225786457,4987727690448992,1085133354631266,1306017748533347,1814891209699428,2058757281382501,5365302740385809,4850788689444969,6610708973981320,330292351714663,2333127329345644,9215322537832466,8970418023117892,8625525910389437,4009856331821168,692881212495891,737046919880821,9077200941138039,4796196198334586,445627241595004,493308121972861,5383183447261310,833166135813302,2061666837102723,1996354998763797,4677981998973061,9037392454762630,4629114125099144,5457644242953580,2315132744003722,8504839097897101,8833733886837593,635176495501455,3731512690827408,2427059579977873,361310360821907,6942952290637703,562426653601942,4604869632835609,4526214406103192,1710868633870489,4511062913794203,8229634071490716,181198854037661,2233463815438494,7570898905293293,1742344117690530,8993327545629583,5750685668773173,2694107518513318,239743982588071,658943797993640,4087606373068969,9182995975049386,7074784154411179,5879063581696172,6091508020015277,4399980826359837,6505244149702832,1174942747738290,5311367938957492,1451846614618142,7048174225074889,6910369888161978,217067618468029,1207359577129151,1418499693826240,4063565121019936,9023261067480304,1418682797043908,2767342394015941,1731553336664263,8380733187371212,71905981165773,6988440970457295,4524628483444944,4451404211413202,4957873242874068,4157313689157845,2206606025519319,911456474620120,1770242089058521,376027785929423,8038777948848351,6278254759258245,5690279466082529,4424934777843939,7706245526669914,4951165484024039,920658256797929,7949129257600660,936031446958318,6358128845840624,4971589387526385,7817694913830270,9182920344392294,8027999293689,2738249533681915,8945313883074675,3539323392280618,4176468835881215,2678003498516736,1999878638280964,4862819908567301,5618713707303174,8293630446105303,7861690086482189,6130254742057005,4162024134680848,6310358193920156,539596912800019,5033149554540820,2576551360852245,7808183841485078,7837687288488431,6141785125200153,321606237438234,7279025260556571,5342200041697564,3037489068396831,836903025824033,5630087516302043,478703516848422,4763553181225258,8676795585779079,4740058098878514,614122054922973,6055603892442504,1465174325801266,456132219654452,2188410605337310,8915009667373220,6965812829692215,6773993208226527,3281753065189693,5451975737934142,2588044538200383,3886378302501186,6541613891293507,507406820077892,7171260453902390,139455986680545,2441059447365961,3837065888137547,1825537904746828,8547307831656781,5832104755888462,7638906779414863,6978149505393944,5701016311890257,8344441830039344,7309921778208142,175257273151830,8667012655378489,141953414881626,1193722035373455,1396992630767484,4967130240721246,1439756037321055,6977345287514505,3150679561236834,3140172414755171,9055453603791985,5735824497869293,1040710818636138,8966538741770983,8038307995646989,1258898038833518,187114606498167,9095778566914424,4031478041387385,4337854515122555,7171532789297532,1166178358636925,3818714183225726,1808030514196863,6476255079522690,5933927344386438,7517947302387777,5187250244067720,2265813333868938,9155041887612161,5637724149186914,4921983475085710,1971659522056591,8357732524954001,3746825834451347,7359098484568470,2827163385647513,1377376138109338,395634939560687,7357698496770461,3434328942862752,8769780693844387,4359434375508389,3604066567430566,2306643176165800,7568399829198236,6974512743110727,6421614511886766,6583593262215600,5746431169630641,1901066880115123,5853743397444308,748504533959094,6819583388737977,8663890345562556,8672295059380298,5072164857598400,6028764361315744,3745938437079491,4887510450741704,4877693398249930,6961326759350731,7284699300413900,930423737466274,7872126395594829,8319428022649296,3325720006894033,1430946450047442,6059887172257187,5998856729227732,877263636636119,5452890132828632,7726916923380185,219070372512218,5413272432148955,2943655247222864,7365380125045218,8138530326502139,1886200153870417,1314254551560681,2905136008828327,2829768206680556,5039038248628717,7238995816631982,337591962452465,6044871537113854,8057879171715578,3180061546435067,2028108503921148,6213254346683818,1463759396266495,3181021290439168,7715904983186176,2761834428768770,7591822939447811,2921981462835717,6338363384066567,8690266987082248,8821138653746484,6780042623889930,1091235323167243,4576411559072268,4515180963144205,7559457370615619,6064457652245007,8054854135923216,415030269194771,80892864583606,8190970708714008,5017176956387866,6313690356482588,5429045330494213,8975195512573360,55681617105442,7435889140601381,5391918363496999,8872331517109017,9163172012622383,4133397695775280,1707938346848817,2108477258625586,3785752308961848,6337730182832698,228211164217056,3757453113988470,4283459803607616,4801989124507744,1175397700751938,617556619608647,1469621893648969,3706307467690570,6968090409769093,6067124386837070,5873367564898895,5735977108472400,4740062579126866,6562416778528867,194035346223702,7139313544602839,2244219254407775,3481625202213474,1266875318425019,4025639000089189,6449334570992230,4264172813709927,3114822820131434,4378402767651437,2923026199904878,1680031866724976,3080095195935346,2427479957004917,9097345267356278,1367684048106103,4043960492687992,7000855407202428,1806439966274173,7813150251156094,3367942994944639,1314920575402624,3467403618001537,2057757028164374,440290576687750,2538145144361607,2759918202311305,571200873636490,1255321203747607,7592457908400781,8439321572905758,8820242294149778,4523964350358164,11799551410837,1508618107327126,8452930500276887,1603745706078872,6152652387151300,1524088295580314,3053088676987547,2104016414126748,3136949359403678,406203203199648,8376919761486498,813334430700195,1772966022623908,7357982315382214,9003843839532747,420602913071783,1492932991419048,690319605281564,2079180298114503,7847861732930222,4234644366717043,4246504391799477,2020382658426189,776123555185335,3929520608404152,5777203195417275,5237893680210621,8001514799219391,1721855145493184,8999323369059104,6712711679701699,3871390857986756,6018924835971781,6946906836247239,4484156045013705,1912892566528715,5967507515744974,3644869118137039,7722769083917009,6911550676028195,707460282790613,2065611448574679,7952080272773848,97515941208793,617822073561821,4334358682436319,1166756564046561,8176040469727350,8976296033317670,8956390374687464,3164577615673468,6628193713513436,6724738028475117,5457023216997102,5317809275081455,6098061197390576,14113288159988,5578865203241718,2160047597884151,2149801384874744,1410512216609531,6954421313905404,7131975894708989,206174859465470,1096540816367061,5476703560553216,6201989086745345,3426632699540227,8121211736134404,622014499316485,4986027486802700,9031612909835015,444824422675208,1162896409103148,5889724764263895,4343011697296140,8061823015527182,899765379019540,722536787608342,9090943868732184,8800555150721817,4299412968026908,5266558787363614,5753588365201541,8778627469108000,4322148542296866,8137447631215133,4185386998021319,8760623929930545,5085304774378282,9021565083050795,1296283344633379,5929396424110896,8039106307903624,1250993321313074,4350738132222774,5340904648057656,4916616877052730,8370297693864764,7380187272714378,7577696374485822,7835924550546241,910030863766341,5046829263952548,7224880423721169,2901694629067575,2101050322047820,2310138853348176,5413010137101112,754793832342354,3855794470814547,3050871028261717,2476372333814615,7903447108440071,6053475344843609,5916584031863642,3650530967154831,2330738033193786,2945247275332448,9146500155426452,8615026892727141,41152534635367,1660419559674728,8939500179714921,7935893212345198,7731298251989872,2343412873007251,583538150814580,5131221166674806,6154845500904937,5685497355836508,7504957084832633,5213542727779196,3346336693592957,313454468199295,1607601189958529,782086413104002,5000082953819011,5524239053976452,2638310036444039,943907760149385,4340762657690506,7906858825433239,8243066834154382,8060989679747984,8149360304541848,2570909688304530,2306837632725909,6597655010923417,2434374794105755,5084896429376414,6653036311823263,2818858609554337,8476984558756770,1894381043788614,4720321665754022,5077376096400297,2550655507456943,4593798994113456,3734580662965169,624597066359730,1206946536088189,6722621898576825,6664662006248379,2213606356915133,4274628076585918,1648572723561407,8918574165873600,3502936934691777,1718238445417411,2374376542532548,2683385475892166,4108033078502344,2120102380049354,7373146433013091,6852214256210082,7872358309974991,3751051948708816,951675906008017,2955645587642531,4918337577701857,2689345132385237,2469654761927640,5075491630659748,234918172148698,1334728507155420,1843749641122781,6263665621857246,5427025265673183,1686749352203462,5349058976056144,8141882035909602,364827782325220,8940504550686886,2192473984984045,2118833086338557,6266439962862577,5755559377376246,6699490524876969,3271023500891128,3331095180366841,8157931346383208,1870022573114364,7056690983245994,210046844830718,5842464039556096,2614890007913473,6347181439693826,7829963982320644,2370445137101829,2238152582915078,9080510145778086,270503695193098,8696363687851019,3118286904779790,2113405964932449,1621340814455825,5785920476640771,7872085203042799,8189641891042475,515033461548058,2906088545862683,2322101202920476,6267847586205189,34089773827105,204186800731170,6694100380976163,3209531142579236,4225707355677734,9010027914355170,5981385093534764,1651591782110253,2470806721741870,5220302775313455,1104854897234993,5322379650818799,4357390457402421,5397169935418423,6172341251036221,3350815336689845,6982405745042272,5178322061599810,2388789237523524,393407283614789,8720481236997190,4171737408369736,7409169710429708,4335777563403339,4194077123667020,9093141634483277,612817371558991,4593150971733076,8240785045985334,6345127654229080,6367534997296219,7772750301566044,7340777076967610,203734310089824,9160106542958968,3527221701768293,82001209775209,2980222822225002,2540349007491898,4722506656982124,8906235937174637,2747349307753584,6967678901388136,2080746213090418,5037392874210419,6675388558247028,4372750936147062,1927962441176183,4745696937383035,2151941259637885,5701318030849150,2386629783557248,4164462336549056,1785105261634690,8340715580661649,8511431695061630,7395120321483911,9192279584138377,8152380528611959,8521261541790861,7338365560082688,1437145036252303,2320111925867666,6372343999333524,1892205948982422,3530626355831959,92808490279108,2671348582970522,2682636757208602,2735620794295454,1896715542656159,4623228827686048,1039630825665697,4022742267917475,1102658823560146,7648679519958184,4976914302222535,1063746527757484,1518982126765230,9021275571868847,1803677354333360,375390855308465,7442079782626590,4857997086147766,7573318210492617,8214892518094008,8605028759024825,974236931323066,5099542983484603,4357120753603773,8005286121086496,5509775975310530,7528881932375236,3114616942982342,6374729172405793,2613275556156618,8141927570527436,5777465947460813,4931375381668045,4671984831374544,5823497444463480,650263403515427,7307070640720988,326362846467285,8770800683209942,3398153328727255,2966053315171876,330880857126107,5816061612930268,5905157574579423,7235059176714405,5792325233616099,4692838551106791,4450265456436456,5578880654669033,3082946346095,8278339558888684,412381532353775,917408104756464,6056809664625472,7625339514819832,5346141371598073,7429192548392005,6729208561571073,3806144277832962,3451151226717443,1877912849589508,2457467487003521,5647246239009286,7579759768692951,3668664722355468,7629755314947342,6387913147583971,6724827303453969,2788817825449237,4622436996617494,3808188878807257,4325516228162840,5766339672421252,7552634287559964,1228719875283162,2791013563548958,5367747886564641,2763722060768547,6604305159830406,4749698579354923,522677214610732,8989775319618861,8034985853146415,2853085545243953,540416512439602,5924945207784755,4087915082351924,5654119913956661,6347620878320952,6183880832189753,9202568666695296,6746045417243964,8017965410210698,3446185760163135,7842286438316256,433508680058178,6227773485255564,7532889015319939,2019172665374029,6564793117189454,1213562711745871,6900872440706389,4979632506766679,1435749350569304,1787299312704534,2015028626163037,4845975904068961,4678071487141219,2088617258804580,6290642812413286,5190177113228647,544127258850664,7834981634512234,8445677561709931,3764578424173932,2977281431745901,6645836888001906,5378581096904054,3723753850676599,5421203896656609,8616111386516932,4697276124419458,6488003148715395,6444019802400132,286959146083719,1947384763626888,606502660371849,6390751690237324,1181899134993986,2902504895169935,8007627060617454,1849778876360088,7864837708850756,4593280879449499,545417676416412,6120373959157149,5563564957394334,1496212574780997,3423741351388576,2737684852352419,7995094716179876,9185827383901766,5018039109851377,7595844862049180,4315012088763818,8136645497886125,2280749489621004,2017575339591088,8528971124435187,2064028636452276,4322667271234997,350998779913656,5118221614835131,214037119452605,5371413431264702,7973745712287989,8353856789149065,5691219200886209,5955293876831682,910538987181507,4060048484492742,3779554208011719,1911435251666324,7266753066907084,6524289440785869,7576880622892255,8509148712477054,7263262753170902,4226110027113943,699360505001436,3542924243809762,8414569434183139,3469244762110601,5846967512385001,336499153241581,947930785830382,6679040734767357,8195340125353457,8274871359869326,5671472642685182,2463561745016314,550180391638525,6796497676731902,1047431880480255,1861950879379712,5704653911152130,2231198417647107,5043762089588232,2731936359147017,6780476828005898,2546896412747276,6176070249244930,6004254990706192,283589690095123,8213721668343316,487965199595029,6919962391263630,6623989828046425,7884580173975812,2214643561367066,6665176726696879,2732672862713373,4947537887101189,8142832772077147,3896274285139492,6515042398557733,5045090060174886,4212061149668907,4829477854496300,1093461321717294,6772420153275952,5792065376089650,5924594113752821,8619692258422773,2772195264529980,6186264131951440,3212729509307969,5136692946589250,481825513334340,9058822562720694,6076673430589830,8346176141792841,7200135415768651,7170383909783118,6083215462790735,5710862223251028,6835117437240917,1086009849239128,7809702077826650,7713306358849807,1541806332810845,3255019721360991,177070276875875,720309804992100,6787693567630950,7588530143856230,3403778832209513,4735403374024298,917979344529003,1749210695248829,3493051393382000,3660737673791089,5844986618986771,2826782430111348,1628013071177333,3815541546186093,8816742838253179,1659936436643322,2665190807557760,5350845563577986,145129233532523,2886260814218886,2362821085001353,5178017505957515,1542156564612986,1166171279412805,3434604836046480,5709134596417170,271922858821268,971226821298639,8388306002654872,4433697956685466,8866225192593007,3277928031590047,6683166169970337,8997415980319686,4959743507855014,2660369992992425,1020154108966570,8663960127735467,4712331601200812,3794951251711661,8748398624089774,6128652700051120,3230370189723314,3568485034649269,3478407688054455,5379499781850810,5031734459397066,5623629938443966,5782112756655808,8816640632398133,821944424773315,4625701481543365,816157681215174,5404629937475873,2392786669168330,7785608045553356,7101198657738451,2240166422046420,2113622694004437,298465263173241,8636861273332190,9162005535299289,6732843727935194,7069265549825755,1682003925681884,1750675496658653,9192162667779119,6010744296908512,630828387174113,3810561795475170,7886348915939043,4314916364072676,273887322747174,7539440600909544,1852674415187690,3821574858623152,4124761828182994,9102711324841711,7068865758837032,878378828449523,8118697952229352,4543569990973174,1394906209277688,4833229448287994,4181368661196415,2142417651099388,3096236408382421,5867918580332288,6863282516375297,5874810072192770,5778150593769089,2823134069118728,7683191719139084,5625669043311790,6182233587523424,6714114848072664,7289896709151022,3364541708572439,9064264585577354,1683223899636352,7141328580007707,7891436202260252,6597073781818330,5168568616736545,6990503338652446,3254031540541219,3986361564772133,7813570301019943,3365736614799144,3446308829579049,8197871390021840,6788210010871599,1376244481439536,4825939849508657,3687086236407602,153312892733235,2798749960050484,2408089187084085,6816361522636598,6987826126560905,2750065515030328,458532072120628,7591822047348538,8493431405943775,2598674491561788,6173887071741757,6239775934485117,6229696242734912,9018599585572674,7981684582420107,4638855385389366,5806340317578209,5548849551697737,4436065594389712,8188751756183863,8249159366044660,8233133769323490,2910261525960526,1968641318455119,3489177120797824,8401168538624514,5016430328858451,8308739203184270,4683243575965215,8401824205376701,7348270211054525,954246322620254,6980179979144165,4259443858618208,8076859425757028,4944286663071590,3788479771191145,396991081850732,7111967490107245,7709127610401756,726721863223151,8308142300231538,401777207416691,1791910530140021,4558278067443575,2304586434213752,582003193613972,4824231208040314,7476633879193919,2796324933920636,1846376808998782,3681459278098069,5146040315029376,1296765724247937,8047712970254214,4486402672417089,4346006782441353,8105593886693879,4718315629991824,6349040947775378,1683158488774548,8935857293510549,6699514674362262,5757731101403033,5091561599215258,4663249603438498,7058337317378589,1302160413620133,7668459379910567,398001266739122,9059238716536623,3623698702821302,8576645658802505,1480130813355961,1910528016504763,935040047949756,2561650558491928,6761529381309429,1083729247201216,7180365966747586,3731005369247683,2995113680922564,2142576855873482,8191447487559628,7125095483912723,4883354573715411,6632499620108248,2066914910660569,3070281305888730,5963164135733211,2630520125056989,8338111811595941,3788208750499808,7504435686478160,3645979094898658,3466146287154854,9044136823153875,2562231086815569,7373881456953034,3294361232603114,5230887347988460,3957607466461522,4032401483438065,2579348416038898,946714897176563,1391172317964277,8370047498323959,7710740351036813,1083059907639289,7611730765088762,5854973079099050,6301018855487486,9084273358917973,7456223973697537,5424757281077250,6371314197755907,1464077382342662,1546392696415233,1261679764473865,4832767324227594,5320000546007051,41727617816588,4108567897008141,655517262358189,1506771722045456,884379054290962,1354364304406547,6229893287561237,8039793024223255,955916386330648,5142337032429914,4256861897553952,7667208919449264,8726570683680477,115814178997254,9089787176986662,8012838024191665,8078526686525480,110861753747498,1572698889709611,8784110146748082,4628494570698800,4719006121584690,1500120180643892,4619738761455966,6593960253364278,2440577386641463,6743698166099650,8296993134671930,4746338564413499,8709483696887868,7098583380057986,7168403529240245,8276327449858541,6040645782620225,7301884074788930,2536497126410308,8217131993603766,3010586307782727,282429505583177,3368471172802634,951595683280971,2293145333911906,4910959520086095,1739590862342224,4426680353369784,6702582287571026,2747762903435347,4520965261846612,8350024476885097,6582578942560344,29827571378270,6130890490173535,4449419859576928,7496967194536034,928192986146915,3947124792891493,659691600742502,2651074012162152,7482047069378666,8535222608906350,7992741885327471,2034557428795505,2467110226057330,4641062323779699,3771263582185590,7597602145187959,123782514743420,4271383840295037,8776877470010079,4138701732657279,5717445538470017,6755714942638210,2574949485193348,5103824289795094,8138551421872262,5862827247024263,2623916950132872,5363236587661449,665264400894090,4957043036199051,5917887278470433,827703009040526,3649990963501201,667222698481810,6471503995913923,1758375463590038,6561548170791065,8889724047628443,2230195379452060,6227839895107741,4290654895151266,3301823613950115,4244040081516708,7530722821695174,3787316645337255,3722619811252394,5641651510392519,6843804159388701,195392548419760,1755119494495944,7536077996912896,8204017188637043,2138721793124533,1223504898746550,7516037461612728,1123766221314233,2688850016643258,8697063519290399,631385449019581,5992750108895422,7807133330933951,7903789140699331,7898134056851654,6905077424985121,1016740387649737,2092833421719755,2637004360743116,8686171367878880,781013338814671,5794498480023514,5316094938134904,194762694375636,6471622945470679,3484375311832100,668835054373082,4836725617174751,5042773089242185,5670128965656643,2062674340018404,1140701618866405,2990098778560742,1579483623905511,9213563925297385,8784848311566804,6807622058911982,3369496777926897,6115568273193202,5826511554580179,8293959666433374,3002122289518837,7991526674139383,4082177785923832,6988107597204502,5715218816186621,2857882506459390,47306426366208,937506291542273,1443965902928130,6104482362214660,35438889851146,2935588398745867,1640927116917005,2588088561629454,514000227907855,5002380221770000,4979984064530705,1933353671514388,8730482549034713,1181535093922072,5070122038360345,6291209622141211,5153654522349854,1175208163289378,992186328078628,5033603016780069,1839104061233114,3060099048569128,7442201156755164,6376913598804323,5862953791556035,6024115771637469,6829761939566984,2456470391015734,454287973773063,7918621562326347,877457997945147,4881955710855562,3165365261804597,3584199752829248,1961118411800733,8917376988199234,1648897372649801,8761579937687882,7874345527844576,2717317007673058,9194058780825934,5228883738433873,1189181570562386,6106450266368340,2191485549275534,6238467029093433,2713107829090648,1425108962896218,7053154276821341,676332893268318,3340631733299551,242692136126816,7367527531256161,4925767056959843,4632524012357988,4186982005877093,4385061834344810,616139315050859,8801888318659645,12131800652146,744545174067571,5554730569547497,5511139295029624,7615377531816314,7537292858063935,7416284272007548,2156146154018538,6615766036742668,7844138181248506,8584476618919542,3803975332616579,8126702163614785,7017415009319304,5239157314587017,863986646788490,6820087096969623,3525347160017293,4263300810099086,803502492894957,7193236906754351,5070417935501715,673382913440148,6750058462662648,188051966484889,6912077719794756,4034508864409327,814369691589020,9173653487497626,1564423345195423,8374550592763642,1120779300309409,1705590944012706,2073145501501862,7494201201391973,8934112660593514,2986532527417756,1264330475153835,1558301760883118,3368292511745096,2634877781277106,2956206249458100,5209864237463990,4903614720690615,4247335377608436,1232623857383866,3151704816028092,3818507217631679,8924912111159744,4697682690128321,5860499933726835,15336351574469,6274773621160391,6206418786017815,335338708912585,7200792706701774,3847744200886735,8372878597192146,522477481884117,7566309771401689,7191653381973071,1554263336044282,1780181464041950,5247180380826079,6932861936490011,3260860946024929,1872158512200162,835010921392611,7840564907698598,4316214459570666,1597815536191982,2719767298329074,312509310380531,7197384685197812,8498372507023861,4716896165612023,829534384194644,1251441890273787,1056688768268798,7018794177878528,8911230497683200,1868931221703170,992571808999939,3386030725597701,2905704222693894,3659487173515783,7033841238052229,6690714688170506,1781604922210827,3515108025838092,5491808352602637,2808092702665230,7773152093908056,1470059008870931,2608333100149270,8723141607390980,3842567053019677,4333029326834207,1653996363672096,7640317676980770,9086799849257507,539267128125988,7773219131546150,3881997827635751,1899002409404969,5426943040913159,8416358383351171,4847636234271154,514001844718685,2085607750567688,2601801452735026,3217210277284403,4807165907274292,645833118292535,8628217867934264,8194100853747377,361565635226172,3176521625176637,6871430247156288,5647283410256992,3768426362821187,4661605447549366,4844097961126470,6290460284672583,2353830920846434,6117209158704839,3048224787503696,8729361177673781,3322798518762068,7988767477086807,3104213448419930,9080770988370523,8337368362908252,5331084585441722,496018619475045,1983775060265568,3007130663516772,1860878264539751,4020151070968424,9195026750646890,1636487787612779,2219470940473964,7982703530277485,6234774032104047,8478641619114608,8400394844797555,1826905398061684,4686879419267704,5811716024523386,6946919874641002,3444029177076350,7926992482264853,6397281999901120,8979510270167489,1382561941158537,525113374554762,5399003532405387,3059514927049356,3384903589063313,3150298523175570,4825936571888067,3570961528969876,4925588396104814,7793639195859606,721505283533466,3274022614133871,6877809322220189,2972131872508574,1856035255708319,4289714027866784,8878723656870562,3925405782784676,2165897894443686,3793083742952103,7690650991905448,1045639924513450,8073207801424556,2618875351591597,7272344753363630,5522279999714419,1562107057830580,86569915542199,8015931722640059,2842899464374974,2035285371972287,7484267752200896,5811619051346625,4421438612495043,2385224460420214,7997872930339677,4135559713118919,37440840985288,3387905787529929,6119132636986058,5745844161243473,1211123948059768,1145136565091026,5549096629975763,5227972215106260,6844793996888790,4286377713064664,1203640194152911,4389359786093276,201212626193118,2303673475639077,8626888875510502,7717565861071591,1055574337268457,6104405328403178,6494665041874727,3430540143917804,1129386569250600,8545880356645134,647708534418163,3904446532422405,5778752286591374,7660447014193911,2819749442235128,673947058100985,2791701757737723,526995970256682,3830700232755966,5990158040947455,4444624081193728,3580631671577345,7326605188419371,3605818775083781,564512479079174,7155178940578571,6490153185172236,1629277727959822,5052994410396431,6761773230801996,5652807340020184,609408480303598,478686720211735,595029792848665,7435727052565274,7401666173316963,3890297829321500,4699558215807450,8591574112672542,1212540764756670,5543243838245664,5660566245550505,4801770608372515,7062729567770213,7749354596576040,8559997107930581,3780658120284972,6973992054422318,7316000317393373,8849760777075505,3332323660036914,840907299436339,8100082090056500,4188833407678942,2681895879011126,186216744995639,2162181355760442,195698876615483,6636650489486142,1512213700799296,5613337737530748,3367077315038019,2314328604650308,2550872916323142,1120830999305031,8346042166291272,8478705303440201,8024348932307786,2469320408944439,1905168848443874,3892076574493518,674261196080155,1128395769063907,6813597114551124,1064098250365782,8440749882493783,6846094455987034,6054316453792603,4978588148383546,7072621602845131,4186187964510275,3902725470116709,2801881209663292,42361861173213,6562428105309035,8277761198453724,8133606891910790,6588355772778301,7298316871609201,6720885948275570,7621747008372542,8646351849020279,7260769610951544,901025139759993,5039873885358970,3765912995109756,1858697721158525,2869994432416639,3125298524306304,7012667835156288,7865727893695638,5864451599372109,3975323073432455,3310006807632776,2488890866205847,5830981220952972,1171403150019471,4867719299230872,7214317411384211,5336438469192596,2591006829489045,2668127638383510,8249883878859929,2928978192259993,681131600997275,843080445533084,4567411711830942,641349557857185,1869040295074722,8156284604803007,4693223692217254,3784066753114609,8301090913417556,82766932929452,6958604824558539,7619942737636271,7549440391325853,7388373505825715,322402804640693,8018344595372982,2172178928217017,1857867734879164,4752145021963197,6804325898828734,1181579609873343,6361242415301792,2796247411792834,410668349434819,8999303318741902,6840602304339105,6990416204783452,8957683712236490,3534527081241547,5473550266321871,2397955941100498,85499873719459,1506884262874068,6911591069821910,5899280475093981,7011844341361631,9126285605182434,553665835539427,6690214403181540,723659664514021,2935809475353577,7770539408784551,3839918314859500,6197000273886189,1665337800313839,3914032226515952,165299769424882,1420496133554003,5583695784840180,1284426851191797,5962943158702297,5014264948890620,5550410545622014,8966249119197013,4099258111908864,8093132907588611,7389571734023173,1009210974280710,7125093652515847,7584820418030299,7329413931166730,4957172118002699,1219931658415116,7416887300512781,3064057739295758,1446964933508111,3527427010325271,7884795041731075,2030885342647470,3697121833450518,2972033670495258,3349051928042525,4705512203590686,7052079271902720,5508867775605797,9000626106014760,812034788928553,8543649895914538,3537008552266795,368696700165164,1129284807679021,3248708735003697,144153614597170,5812865495841843,4185268418210870,384021414513719,942150911425593,8308834749102478,720222200880191,2353421968485441,7029873785933549,1680573775459510,2244395809299527,2404928905419849,7279113754840138,7808655863357319,2854706762616674,4958900015619151,4906296624200784,6028700388355939,6151960942447700,911282997214296,8006688850362601,2088612285967452,4852848328543325,2632232086334559,2052168151390665,5204042522283111,2544302627372138,597863197875310,4092558682356847,8361945180314738,6595475322948115,7052847197922079,4346408822332533,4761533181856886,6675994740227191,5105430612278392,1171174416322410,7365880736418943,8498039821421760,979788211203205,8689872734563465,3924333465943179,4746345295301772,7715463829761166,6387701728611477,3264371982068886,4526507534421144,3575970504387737,2923573068381338,8708112113475439,8131029696412828,6168020354956448,1028954409282721,8261907805359266,8555928903912611,2408814178974885,1253775462735729,3706290841140423,2124463408041132,4017361871051949,1203706694687919,6794948770788063,238737329695924,6594733211462837,3230469404409014,2066436762229943,6429971679849739,5448192536308923,4847238202260669,5562524395474110,6790737184058560,1055096302304451,805754180832454,3985619951377607,8814997762100108,571022483987659,8238264555949260,2118849820687565,7202257732947150,3707653813406927,7040235523124432,5179088110661496,3343439118867668,4916003741420758,1186021079039191,7676208787836122,7847196520166607,4724533290790108,5467943944928477,3396102979001566,8749930859440261,472907188180176,6712626968669411,799393360215268,9211546717863143,3884082484591849,5679513917680874,6425659398171885,5657610664312048,5733009635376371,5806174238459279,4332507494591733,66716265471222,5713732105047288,8639756800701652,376090709466362,397946492165371,6909947991338237,9043928985581069,8428592189603074,7571286949387524,8996629590723845,152185481059590,24860247813383,4535157785111818,3817179064737035,7220235711061260,6727102706749314,8882495654085384,1904506558393615,5180839570099472,6447127178333458,7576376092531987,792461792648468,625925823798549,3330773288291608,9016700233723162,8843436542183983,8552570469032387,4281183196974368,4663631829024035,3485469844196239,170058684304677,8998751366574641,1512119407811880,713353413156138,1325725062155563,7264814056226092,2055903787883824,6173447769455921,1627854663453918,6326608671492803,452642774560059,7323094195375420,4713715568643352,7404277752831296,1258137098784065,2158148812442849,8180041911741768,5801596642307980,4559343055584660,1811787673242167,596711829437774,5253978959453519,3874880881007953,9203842957231331,7171154847251799,8597934381419864,5311151973924187,6570053935426910,8983011370077090,5713091203894624,3357746290371939,6229433370938727,1327417111928169,6245878922203263,8461982747798892,6451520785473386,7883675367250679,5801222149545328,6152767341339880,2057202847583602,8583512588918131,6953017106779369,1424983465995640,6873523246434196,143398748966266,3882720392187260,5062630572150141,4485048184663422,8393232066387861,6878122438545984,3850724312681858,1567985662997739,3904119102119830,2755590121721225,4024236945989002,8638862358750627,5237184267789520,2016202351956546,4269787528293774,7541660229148850,4712604375608724,3791182663077270,680084102667671,813826873994648,8512344848367001,5107656996556187,3729784381390746,5497237046173088,7382573076356513,4582720433466786,3663644381859236,4832913813360037,83766154821033,690191365823914,3006218335527495,873387008679343,3279300783742384,94210013437362,2503138078088630,5163554019126711,7677738782834105,8085427865263547,4581870411283902,6653221571777781,4596363793345985,4051070861200834,426686300081603,5735660667715012,5227097544986053,4245146059636166,1694536716271049,7117499348574709,6055329345859020,5869739722948046,7556243875192276,4522228130368981,1839078458654167,7093256664743385,6797847176023514,2362032390057435,3513682388934108,5965084274650362,7657303785694163,7623013316503461,1503090557627643,798246111702503,8769997109870057,8308187091791338,5263395770351084,8528410202869229,304411916668398,4492105431821808,3011049512336882,6879522831633907,542157996776949,7601894430383606,2820983451725304,5035347531189753,1098445491781115,6448948881919484,2138132161998335,5501555188452864,8088551934656904,5993579211638509,940995420570198,5035047634081905,1740505253096969,7314337719253250,6905970982944268,5418950846873101,6126339629592084,7172759172767253,4502031484481046,3368101005444356,4876789573369370,3138305019193946,4230383266577952,5288985815514657,4447061317021219,2423380000083494,2118713442618919,8043628574649897,6584836487134762,9187747720535303,4840752040291884,8383819389982642,1104745640959537,5832640285494840,9056881876233786,1304561623847519,835554510982716,4119783854054973,2522098045148734,5655385520568928,584085676916290,965851424620099,1170862775119429,1655580132335174,5774522610114119,4557197531287113,6674281290825655,154556020248140,4687371747728974,1002120961752655,3077520602721872,6475752529153619,9162145696840974,4632452777990756,2139940692249871,1432823265350245,148283225337445,6781621773528678,4085187946810994,510392082132595,658343303388790,8028240168689272,5338557766897273,5176271028674170,3748654575558267,5555021282271850,701829720804990,3753291646342421,4297337999076992,2356794766366656,7437900890774985,5180601552522883,4814658729152134,5284746216562312,6128441974975084,602248069377675,9020058180286927,9104680257630967,1966661477358872,2887027922816659,275083414720148,4527908228559470,1328444429938329,1741177734336154,185673779429019,876021786123932,4580860378197661,4956828849581726,6700603137271990,2505809664065184,2555180832927397,8871953772498598,3246770417643181,3541527148768942,6013150943030960,1844396354789320,1172037359279794,6579681516541214,6197312442527414,161410849783480,4990709197793908,6964188212632353,4725701038624447,8575797344259776,38182772772546,7991407998910147,8107840060159139,3256174366256839,3518303886896840,1848040974810827,3790529038692044,3564249107308237,5471665320341201,4588566683964707,55078712721108,860469144784598,434546870546135,809484118441689,7185320325492687,6080602943725276,1166830331879133,2891442772057823,4479976353939168,5959114026225378,4499271613751013,2366511437270759,592501723901672,823159340502761,8948839067228015,272358969556946,3643015168372463,3325630946826195,5235322160640127,3613131435797118,5497505244679927,6416557062156025,2819839006555434,1794354783765784,5842433559352664,5008600095728256,4144016763110699,2789361029345028,3511861721517829,305800730414855,8730201641744480,6697269788499722,9133017699300023,6177461373792017,1735691461496594,7382678936870676,454174002982681,3106002879315738,3376429690183451,6334675718749980,3655971349958429,806974218329886,3625453695636101,7879439618355163,8685529947501265,3361556200820519,6883205342842665,2523555835479168,6652365083770667,427077485457198,1257877003439919,2239030639198000,4376042417254194,7470297649120589,479257331056439,1490893748944696,4427218371804985,1996865433759546,7140797842640699,1061621554499388,2191811176628874,2707149119893310,31885424139573,2218859157135168,1218067526240224,6352509990056587,5627219033988934,7022485588419948,8621685204406088,7763911254122315,3038683106180941,5750726921924430,7725802876486968,3784227133755218,4768773743509331,8622078125651693,9121138262067365,5190408702476122,2629104376164187,5831597527158620,7037997336954623,8921686041263967,3005068117606240,4898449697996642,4564926505192763,6618607535370084,6541235303141222,8669151516568892,3797374834425706,5017312746547175,2092995483443052,5995016552873839,2937370172776305,822256896696179,4703818417495926,3009455284565178,4184118104694648,5850846401486204,5981343492109631,5060184359661436,2899036152604650,1777426683579029,2687323367165824,1905319888457602,2444977609539563,7744935428071302,4211137207208748,5006245990182795,3047743309295500,8604874120347534,1475369259585423,5364969709141905,8623853358646233,657914187718547,4499421846155157,4465835344981910,3049298345119639,184724733156699,1005276863823771,3671282234010302,7027626445025184,7278296185694893,7938163167613595,8378700759835567,6271587464011686,7110826754928625,6813438682358428,8566609869938674,4560363867889582,6518642347738441,8524335463858104,6886082466875381,3868221620100427,7411981069325705,362995625152455,4973561782366152,7798985870864329,3558738625597389,1892182785447245,6459132014964689,5193262331555794,9141739526012238,6721592469856214,3784128841654231,1733413588918232,1131899998460580,5089706434032396,4098532385591260,3333356614021085,1812215498715102,7633143618298533,8063285386448864,4898466878042082,8645560645799907,2027233706323941,3419735952383974,7998956820311377,5276717365936104,3552349825523690,1923558487224999,8794448651235178,4484758938181614,7064946133084157,6434540790771697,946190761144306,4747537718808563,7044634302629886,6096656849068022,8538502544707575,6530945535619064,8639463190831098,39590855372795,4675093913243645],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/736138545b801b99385439231a69ab77",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/fungi/GCA_000568005.1/GCA_000568005.1_R008_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CM002404.1 Saccharomyces cerevisiae R008 chromosome I, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"736138545b801b99385439231a69ab77\",\"mins\":[7492237651419137,5985899399905282,5695243620727467,7650131507052548,7430243544511830,3676502340993030,1512611683565575,1368981404172297,9208390434178371,3753168693486935,6807839013897455,854360518017038,8734988846424079,7486566250894680,3842557726244882,2997983607054355,1818735052480532,3813774262971054,2624465969487894,3673670541272409,1391284292939780,1209507403737775,6088140228599836,2194338384912413,561125043814430,5014233509888033,545649515691351,8944044096471076,1508915906560037,3138332743203505,5021210187358248,8285480763657584,8997300899495943,6290784660585138,7171012497326128,1954240766836786,7592554827726899,4085819027054644,894403841843254,5731227614617656,1589118595219515,7492973703048830,8268342434917805,1937472824713279,3325163954602049,1026676708638787,8378635561438827,232294767738949,2264262613524550,3565108941455431,1061118914355272,4509104035893260,5830005223260236,2137274184171599,7772739613451649,3026433687453777,5192281089075925,8014682612121683,8174393644816083,7379011446841429,2930440507965526,7596190132857529,5928321941741659,6690405272080843,2861624405074015,4327760650403936,3963671415791716,7739632178402662,1740344224628841,3405163376582762,6956931249246855,693383712989293,1303256410128494,3555921513922671,1432904037113968,121989129199730,4207519383969811,7950744278895446,6812694667862133,8608167686807670,2435991952089207,148626584518777,4449677651787898,7052653212590203,9060898953773180,8357581277230442,961717612413054,8444868657512577,5508808984723587,3455335957848196,1525497154997215,5010344087265417,3947948746970477,860138556997776,2138582661275793,8511241375580309,4051946824966169,3292128172712088,202359817822363,7434597676499101,5265079225369587,5198707529711776,217571545964705,183727525314722,7017775400570907,920248873238692,2918484347497,3576527994257580,1978579566051503,1052657746256048,1246514615566513,6199887831507124,3930373031723189,2750907244937399,3500452135837881,5851456742817979,8514081670643900,6496888032496330,3143849477103807,916637810180291,6793870468841669,3014147380404422,6983482835919047,559757232799946,3015364087668940,1890995794206929,7750051925291043,1405668384522452,680354650284247,862291356451036,6135723295949025,1992280781463778,8244177043194083,5146279941447908,4246859250475238,5006467820118252,6179924695146735,5416918671163432,9113810532869513,7300166082748659,5603362229993716,7994206622734313,2531886383415544,4083304694980858,1326614097158395,4534236553380093,185915791081727,4302885234229504,5161753059262721,8680443333460226,7022268785070123,4386875435507973,5225373280878855,2610519938859276,8755179778659714,8512749107609645,2328317740859667,6591485627982100,3645069236076822,6659678826127639,7420537991143704,392614636708121,8171319756292378,3040476539379997,2155802589241631,5776545224474913,7704845430411750,916562478661923,6089339481514277,770859272151334,2324634126483752,9110944847937833,4922911236055338,8064376800764205,3522838255045341,8875812622475568,4935971014943026,8734474715398836,4208467049578805,3427605946179894,8410761282618761,5937508321189940,9157211174027581,5217632044458302,7092513900429493,8290481172406594,6345846284640580,6324222019141686,1661292211913031,3322659676717384,7015216794894665,7992212188341621,719906311438668,9135739600044365,7625836874719288,6576303385691129,2013008274923860,4621856733558158,7385892848091478,8566860649355661,4827162655220059,1721575327424860,7880625124817637,8194253333397856,763182650581346,9217534546982142,3798349601915236,4797285603674854,8358055268344170,1450905620849003,129423268479340,185598574149997,2431951575040366,6071064037884271,5311224648114544,5701717440871352,286579400860020,5612704314679669,2610998723002742,5784541019552489,2549240388952441,2452292351115643,7275406840962394,2475122935456126,5988599098212735,1476174392648065,6996503445324162,1308625765515651,3977561505046916,1865660288295301,516123358445961,2047030224200074,1732983800013196,4810338246418829,7543328828148461,8296112151536019,4035485134578068,686116594162414,7380520197300633,3934037496611226,3892453193736604,6625465589793634,3197654295879749,2034320045506983,6465574984999336,3970771039027625,155191385563563,8797167380636077,6707447834812847,3010675217973680,5971770974423717,7946631867613618,369934144527091,5454261102518708,7666393316106677,3549825875977048,2338690888073660,5543825394106814,7773238756147648,2496231026811329,8406758891704395,8228204022686148,5918221583204805,3115687155196363,117367556751822,8050235597263,3842848319578576,8524238534181331,9141762114450246,4612782841700822,5398981346681303,4246993669628376,2470630350086617,8036200190771674,3296764073492956,8390295333890810,6160350695293406,7564428620136927,2556946565652962,6306862356316643,8407139210592741,5940954563117543,2640270384726508,1908191394054637,7233917655253486,8370093138447101,7721763436788399,6456034572460530,346006813155827,6739761743413748,2832908590825973,4591383605142007,5782529609236984,5474792712036857,7689437077807610,1862785065945855,9206294069608957,6443090419859970,6158300521084331,7566558506246660,2626002639094278,7636200652675841,8797501560521224,7906272136503817,7220214462349835,5814587970576911,69958089196051,3505541008736792,5301186806751769,5894005299806746,6218367635161515,4281688962597406,6038126761845280,4867757731635746,5818457463726627,4505629178241573,8534586532500902,6282555315984805,884278182363691,881767547830829,5306284620279901,8770818023918795,2996676521583155,5350541531013684,2370170278150709,1370082637619766,7410490093538344,5433930783547960,8460791037604903,3200755512484410,4332994387239483,7409952552354364,5607669104255550,7380280293737026,4817156305560134,5129018468569185,114809329853000,7573786822509130,9096742499238470,4127252562158158,8694617107749645,2452403348898390,7040250352681559,872548257948249,1924137602777690,8341101649320719,7097524906345052,7433731009865959,5919915277638416,7931706449347927,5784554565248443,4091826437286392,65655291626087,2735710300927420,5285046059991659,1363801433555564,345578235742994,681552276677230,669112662336111,6997074115543666,848193635132019,7707997532635764,7449350465806965,5901077986876118,134067613811321,4640848352051834,3525047019446378,6871916762700565,5771757460906624,6406289905026496,5629533176087170,5619328833061507,1016156214029078,6982843459723910,6089013535122056,6458643643327115,4139755263901805,6253056200770193,1613370162889365,4047516033958550,8270311388834585,8263963181604042,3674888169177753,7797995611404025,8372657045776893,5651902677115551,205643058766496,2077078234006178,1278566294340259,7652690566349476,7454695770612389,846839066698408,5281918420001449,1665938713240234,1464155247583915,6005149408329842,5103864038775581,6108942244487856,3017283892880050,8278156681724019,758129038369460,610347571241653,1334220662473399,4849893259551416,1234322768716475,9217638247265738,1036895654847166,3333589184135871,1832483068084928,8539290187891393,5465746060296899,904636711854788,6282894305845960,7411398335210186,8420533731086455,2049458815345356,4354056291869389,5735633761116878,7587486641488591,2679991591248594,7992646407488212,6858374493993975,1610491781735128,6500321360462554,9112001343808219,7501889278837438,3318223559590010,6675130409583328,6765517283279586,6271456828600443,3155313045676774,7840072745861864,2230156607267561,8314351564383571,3792757861425901,5031963236958958,5138725245838070,7212662661284599,770752704357113,2002730833306370,7038245685191428,4800832280863493,5844363109786377,7033804946102479,347415711408912,2633054430634770,848125877609237,8011307282817156,2995735273825051,609787602264865,464507220788003,6651735079000357,2770972370821927,4405371960148776,1231027692167981,5271059008291630,3468944191318835,3064036523131700,2274198120751925,8374845857841974,3733574844597049,2624083947560297,4095884172837696,7829825435641408,9017323031547759,449094555722564,3136862024287046,1457135609914183,3781627708965704,8066082512437685,7548421569385972,2868931045991246,7128710768689999,1503503967208272,7381801411150673,6741221683741522,5732783364735827,6873985862746964,7494605844243285,4379178994869078,7996691678135127,4349787839062872,781540710875995,8717666198831964,8682251319010141,75379588408160,5386412056929122,5881866753948475,7843052117664612,1733210527466982,3630613435401068,7950184811397997,475915013415790,8056690859363949,8616801701716848,6384148668412051,5058061065233269,8821045763326843,8989989363687609,7353772711294442,7341978249560958,4198865987995505,8098065842592023,5715226575307649,8729508162397060,3206976221291397,1694487765607302,2787294327661447,7606216129528715,8943038251838274,2229570718090126,2585455160288144,4776206600692625,4132647800341394,846750660395924,4895839472927637,5744419245761430,7600179964721988,2089068589974426,7973212309272047,6852801460708253,8611883703114565,3199924874953633,6443449802866247,846904957612187,4721837381419940,6649314033214373,5020954300539815,4030392243626920,4303539328811945,7773395378660267,7026027038914181,8528344099586990,5259966006199215,1421384300446642,2610100801684403,2022950247031732,1862881676043189,1304377900319672,3337990718227385,2796856093418426,4701361357587387,7812782846678622,1748539196597749,4842935868597184,2945955713508289,4707785349972930,2629661555440459,8860594975900613,755050489463750,4534459353890977,4361510832464842,5672827022442658,1910096789539661,192948156040144,303333715691000,4344184410596307,2254424437285844,7796578114722638,8436303945435461,2550031001658873,5222216950293464,4006441070461092,7162885833868814,134322602453839,868169600771037,3874417737868254,6669552643099456,8030318352778209,9156278224176099,8779785864491174,933793492034537,797177971475434,5067608575443947,3680507667325932,4510682211083246,3699218111775727,2971383647831024,8094405851137009,5868406768976882,3417101562395475,6083207043777524,5525854516749303,3684650565280761,2265295591039994,1820119402767357,2463909784093694,5862368037348353,2536315657896963,7722763076037462,2654071240147974,7715189236442119,8232799442773000,8077926474870956,8275349641943723,4238191644058637,4491248718930958,466406033589263,149798248031251,6264487017268244,6530536638858261,8764471368942616,1934789421606404,1832428351972378,7267552826450974,2015078832882719,6987671186145456,1629397313610788,1854174217765926,8515568477361574,3019827642237992,4290425631130665,835802040067114,2488626595873836,3859330973926445,4884486544081968,8693409073153073,8450666278241331,4363193410184244,2361429896266805,4979773882131510,6451273241404033,7144347863805242,3330799910765629,381617704952895,4555064155448384,8288369228792900,6931491840787526,9127078820332619,7970494811415628,5198307258467410,6745569406002261,8363199173583033,1012883198010456,383972143442788,2144884820083804,4762669881430202,1841929194194019,8381024984417380,780903387243621,560934875186278,7698050502919271,1446566094965607,278167467181165,9140487447900930,5199913434596464,5107261048947828,4012370433434741,8968261958042742,3532017620567159,8113009747887647,1862736794666107,2767175942161533,5708367199765630,5269435999798399,5276145414489217,3642949228422276,2577771614676103,7977894244336777,9128194379695242,7137355223961191,165817932350604,1445213076276365,8823152772783301,6411755815825603,7142659012099637,7567506315593241,13105238877336,9216194826494511,9147953609149169,176190003176604,8258071509697696,603502375085218,4314778936812707,8151990898884806,1486784145976743,254743818192039,548867486491816,8359072178800156,7639360274482347,5233211201553580,4954687619974317,1108301598057646,2584029773710511,7591327344968881,4399238095643826,3694012024981985,3545935367546039,5500094812234937,3699439752488123,6624563890414780,625968174556350,1434485820531903,5404373059986626,8862139506132164,6059004826964601,6263089617429705,5524979651454158,9130640761783304,942262206309587,6167651680781527,5661166991361241,3158953446434014,9093678195549682,2507995816076513,1556827159545428,8027591523206645,5139707600522108,7083554004960490,2701621540094062,3221567297692911,7917642660182248,5157602742199539,6101016746376062,1623942080087286,8145419699807479,1403782302377208,3804773212168404,3367913522038010,7303202750929791,4285127613777150,208583043290667,1746848868959494,7413894256731399,6198826961609992,7608641730413833,1407425008305418,5712160051987723,7463670796813581,6151187398854189,290046036055521,3771004857132310,4044296974468375,9201520225494296,6874271624153211,3989815539942682,1297047602545947,7621727186863391,4786380351169824,3796200136926498,4447778811045158,869313979344168,816959570075868,9203674322347307,1010448614229292,6274084562404654,4440020328342831,5852850241346051,8646962622838323,1034539497465140,325204980671797,6001538937365817,8404262643467581,2796388295517502,7835235335823379,3518222007862594,9207799658261387,3143946390734151,3675545454118221,7734103256234893,56350735038409,3769226552984915,287567222080853,8693514870007126,1934895340906041,4138434150720857,1064159485527386,2597268543530331,3503654729164124,7092731508442464,7184819823215973,6813085790741863,1756331275461992,2163838968448361,3259712292529520,7673213421097192,6677063998514546,2481019625690686,818511300683126,6531062739667860,7138471790241146,8876311546348743,1800443404860309,5924270290511233,3661379946046851,7708947668102038,3570295290185281,5712547879420140,821957721900426,4678670921418124,2563836915727257,4073573858125209,7019894183181139,5571428314539419,997008827942300,2667530137893786,7072882411971998,8352823665076568,2121142914655649,8787785337677218,5571897962603939,6081212706727332,3780315497506213,8497238899025322,5561519184832072,4191314492535027,1154418310716318,7821007672878521,9156079142774481,2913119467709883,454953660925373,848392584751773,475217837794754,6963936145180235,6071834040109478,8905463285876169,8528016794045844,7793772569339341,8681124196021837,6808091998946768,5117067982491896,1781367420069331,859003004077524,1778230032397553,8468711359137238,3367091422729499,4898460020233807,4149722043863955,6803445791393245,8691436656862686,5181032496932319,4462797266806246,7370626943903971,2142174251517416,4632305619477994,2546627924714987,7884093762700780,8217448204355053,5906784482305518,7019002806862077,3506181381219455,5673383145334258,7616326524904948,4723942306260469,652908615867305,4331845156595192,508100368041556,5492366855971071,9157366474335740,747992671945269,5220009442124032,492931981387266,9077200764451755,3186130361132548,4542809200518661,6365050037708294,8194027698367357,4430384586909194,2040659577570827,517841543464462,8874889410620333,8109868176598544,41409324418578,54704603710996,6865773977003541,5792379422707443,5962453887545786,4890575579476228,4485367991371292,632438705821274,3438620037842462,7293232748578335,3897580408464929,8386757730633250,6636682162185819,8202188201839682,4780789375247911,579529748792874,8908191249306637,4586274658551341,4261812537659656,836084524779058,7852001124539315,7744425578714718,6288976520300086,7512713982248503,2909282473420344,5023779163522617,2995819932935739,3717572483089984,5168774328690241,5373541196301891,7539859665479236,4730145402234438,5482097701946951,3315632678472,875882472891977,7720014008788554,1798833421182539,6850241425237580,590882876974673,8153404735907427,5091338552886868,3576901459994197,6047070945150553,6738669424515827,5218709697013339,8879208676419168,9132479930730017,4758059264288354,3968851323528803,6062667128088166,3680452348233318,7863223765799269,6517970650256999,5563208269358704,6402237639639315,225359098586742,6656146777297172,6741118477887098,4148285622060668,4592352829380202,7179174887241705,969070361888386,3833619101968005,1861883595433607,6628483029018248,2791389709805193,1560494834479383,2992994268702349,5130690055079566,732933933450896,8676646571700901,3987311764440724,6114915076310678,5245555775381785,7865460818626201,7472230562162330,1570661861172891,2847741195273884,6924292412664773,1559792289531504,5463649557874338,7870900485842595,314829079045797,7600304085321382,4441512224794279,1850005383448232,2984817318938284,964072099194543,8356027458594480,5567464050763442,6907490275174003,4869774263215796,6939958346320841,7424706510538424,5309617376911647,7689495348971196,39964199052455,4837690671163070,5479747563177663,7629987610461888,3683730196227780,7616336113707414,467610513278663,5344670841499938,3349980044748495,7659197557374314,4506717356984020,2320455050495701,7635594137835129,8422983915166467,4577829206599386,7303226988177116,2052348133050077,8651140949001950,2482805915494114,1193016372119267,4351609030115622,2792492607661798,4931393655938001,7013991177848552,6510849380214506,8166047983666923,3468956998321903,3929619233998577,3745395250382579,1151216817096436,6833794917944761,5977697827251961,1857232363595514,948251260684027,2987876761929469,2723923610994430,2438374485599999,2973180550784770,3910091466224345,7893617998333570,5261262081058574,4620292427474704,1049963895790552,8612788547249938,3309461986895635,2339643788633876,7245456480043396,6293850972038935,7504400428558105,6625785219518767,1509258500884254,1845569320126239,5036521085388581,663785810814758,5470752661464871,2112932102620969,4909246994007854,5786058914723835,2014096474957617,5150086528681779,5838252779346910,2252983237510966,5740013122328201,1905178491578171,2950849997403786,4523724402870078,801965179496255,9149090040520093,3157679429109569,2024431779862155,6893962885908294,9105564826158920,7074759648118603,3759738916869620,356247827007310,5419823165228686,1500715149052157,3195772763940696,9223074109549540,5789135240624670,5201963162634075,5253736274478940,2458598732679005,6814040514612197,2610142202333025,1920820938909540,6689671986964326,6821040793053034,4880769596901227,251302220130156,5410100054075246,5688105272734013,2096930562197360,1397496801716081,8131079587773692,2411309127829366,1874673358980983,8245593392064148,2002808862812026,3817294846650237,6929480796964737,314427120745451,5332028762163077,8714083833227142,8665293248753985,6942639051474825,2616814707484555,1582062282360717,438746386679696,107823864781233,6273745888192405,6315462030256023,6167714665228186,1900198082865051,4617663935317916,1286256484689821,3697127863289758,1269726840309663,4455747603007394,7863897866651291,3654441813641126,5980433155344295,4044530625300392,5266193007577001,2833426920253354,8849335506035015,3409208263247788,3359857459677101,1595006716250030,1766891008239535,8464546388402504,430144320579506,8652524396111795,5390230338664094,663223534880696,4901451204757433,5157422643292091,1819905430087614,1225864607844287,7464201559336896,6458720952506016,7631548024697163,7371477327865798,8613014489728967,4800130388214092,1133998552549322,6116316684224459,3747254197643213,2764757001357264,2416337560271864,5470437330618322,310931629819859,7976728662804436,6248799903918852,7666812483577815,4201516613093336,1640231822362588,6620219586832350,2858523594901471,643793771603936,1127755675781089,1871515131439074,5742923390420964,7270983698720743,4081687461914600,6781345714374634,6373231696054251,3664819447203821,5468019054733294,185940832045041,1000409717090290,4056155663075315,5907399909894132,5003553793353717,1690981711988726,3086317837355000,2775908982319100,2214779142973437,9105809798858750,7030409249250304,803408891791362,4790492203673603,3454777857001476,7100765076031494,8703049549391880,6589003278018220,7467244217067530,9148994076777474,7114892241004558,1014109380585487,5402268307957776,7109486256595619,6693110313286659,4875555874580503,148520511670299,5017505412655132,7911785363875875,183332349331492,8555952146229286,4276213203150887,2203377801119784,6584842015538183,745914865420336,309508126558257,7674527370971186,496623274240051,373298446796852,5196129406797878,6947228440758328,7635482480473780,4249745920043068,8663000874199101,6489787146364991,8035953595860899,5552674820016196,5347424267698485,3957354202687558,712681983641675,8226223635077832,3513182832408393,7515944723351631,8482690354915410,967759972321363,3849519447222358,4753926079072344,9179669919880890,4088182227421278,437244085440869,2572021467179104,112639551244385,592056074529072,6564612962191460,7242694605006653,1299422888836113,192994859488956,5938459503364202,7719864570768402,8724468206815342,6517720944336386,1157024771786868,3418305207428798,8111775545138070,4557432686045303,5492992787597435,5076499884755072,2613955039818091,5722504789851039,2856401070238742,2149652543629447,5331524973019500,115643688798347,4785257053939852,6012796401625229,13348610009230,9129847968598159,8973620973414544,3080168714569874,8351096759408323,5464367174166678,1562450971764887,405852392917145,9150833446848668,7911544222214302,5445761764681888,1291732891019425,1181712404351138,4473637330411943,1179620482730151,8554779239689312,4623034690250923,8561153449480449,6957780127000751,4173788041447600,743463668107442,8103118985847155,702199657105588,6468510468892853,8939110502222006,4815370388136308,6956818198546622,8767908939026805,4366804001310914,7498847005919428,1403869218963830,886767417354438,1189458599238689,2287377704904906,1668447090165963,8705175272902816,4614682134284495,855871189174483,7705260645910741,2158835384656249,9174468622389021,4660439116130523,7742261399021789,618559013292254,1661245543435301,2854759086565600,3174251631477115,7055415249357028,3997091892988134,3655665259505895,701782501538855,1418499984550124,9006481961806064,2344000235276529,1697758667183959,82091556628723,4867128157561214,2711611816020214,5255148178057463,6942752806071514,1901825483761917,5216835374360834,7729966555384067,3607991922497163,7429714308104577,7590706043145260,2375299563022603,3739872539748620,5519617282334740,7455187338299666,2823785152921987,596069655787225,4626924205212036,2917832561503279,1162031742421278,6325496918026527,5465400666663201,6313233200318754,4879755150104283,7489085972745427,2333912079616295,5009525610293544,8153848899938012,5197981518833964,6091888096238816,7003204001351982,5841068501169885,5110218638666032,8843925621460081,8296989141939934,2146845533522230,7481577278884151,6214531209349432,2199223946291513,4709585891240250,2357959293815099,3603261814688060,1875836462840885,774404698409280,3380273181567298,3169496681359685,8204318262349984,7430425806313186,6901445986650448,600066940881233,9018729501160103,5154209516898643,7239662734123113,4921706612443480,9155592767463823,4430744536721756,1664111906679134,2824195086952801,1960288900811106,9119381587206795,8370669322494586,3746815683023249,4426353603176808,7379489595525482,4268587602078060,7403037335049001,981394035460463,6503060529493945,6063770433427189,1922611615639924,8822245487238966,5861131244865912,3897428342673007,3477722607896957,7381664262244735,2112794609584513,7802593007683971,4814422005098886,8537568862264385,1607469794539244,1415017706006922,4622076052744587,6280857192204684,7930331109427597,10172399872400,6487429776558481,7764467373361555,6275859913951637,7016516356073878,2058337866729879,4063801425906074,3418081762822555,1747815954460258,3265630035298717,7862374746974622,3768621876087199,5652205360385645,7862304331197510,2701340553824678,4163794031441649,1281627227949480,5606394100011819,8181324692609492,2721395555961261,3161821883566512,8556487266460282,3773326310738355,3467561043685531,6362508512848314,1994964517218748,6572345275204896,6410358984784656,5829234695362293,2534726417484224,3288575986062533,8955931421706695,4867005280201160,3858810569075788,9183936983090855,3334247006030289,1462316529743912,6101830082783701,6787220818163449,1567115300383194,6819953111173597,3158208825682401,7093292788696827,696587533273573,6818850496072169,4171080308066794,3048538584771051,5348601877842414,3754250679429619,3132976875997684,2613556138748405,5684777804162493,791983685356024,1516904480623097,1823480504289788,4198179482659325,3347879339248126,268020099295743,2400924569846510,656408923785730,4910509400508931,7974707897756164,6882377467750917,4931373355477513,7024658911013390,5421716217129488,6060573405309459,6218482349037187,6305557804378645,6409604398754905,1157121534577176,4911017599617565,5560111563672098,6367852254644773,1180775000517158,8228214531992103,4440216533264936,3966791644809770,3775167771290155,3263952564832813,307215325260335,6542630634144179,662533055957558,6702538782673463,4900272456895033,2887077674584635,9084822240053820,580711660309054,6536993467420147,3158324047751744,488711025396289,1870550253603394,8114604697782854,1853730211044449,4100778364051194,8681654404018402,2551161712798818,1323657980045902,5873150110960207,4692540500355666,3187855190829652,3903954626589113,5818039320484964,6637942636358234,7601283966659721,3787876448070236,5535360206834269,136090024847967,1682656251013728,9202984166156897,6142501202733666,1747465085012580,5355096024520411,201959114219964,4634823584189035,1129221421787757,7379515164011122,7826688728794899,6844124974443124,7280641810713205,7549347635833462,5492579727780472,313476517685881,8489724730632826,8401232838781564,4205052961417855,6163810811873922,2048913235643015,6807793897466505,6337475846720138,5901612653958935,6942481261669008,691920751241873,2471098312329875,528876726094486,2453515877157527,2330856485268123,643134559890077,4415334152563359,4972550327962273,8016483896157979,1992801504234149,4631882294569638,4867171411233447,2150512590465706,37505078864555,1675574103567020,4099056928500398,2667463791446703,6589567105306097,7153592711588534,258020375980727,376212923763828,4664942357108511,3905631515388604,6927170626783937,5818943162130891,2300970225289924,7239200196242117,339768536322508,2249695338236618,4263318639528653,7121843325667110,384163751037650,7059786898402004,2995891366357717,4961820890172118,2471216307772537,8388383357954776,7645265796434650,5322564495583965,7306001673710302,6254896595984848,175825223584485,3120409946745574,6655152681144937,4753571899976424,8429709232433898,7111442117105095,1595910581717741,6998440153308058,7817210689240189,1999138379188977,7107410383915765,1184057155226358,8251366906833656,3015756035934970,1679668504013563,1471520491899645,793029645216510,3781836335008511,7442749161089792,3040875839382254,1633081434770178,772609087294211,4278220904139524,1865465699388167,2890662257787622,3058338758093586,1144527907277587,5209027797494548,5557274278538006,5126582816580057,7800937212697732,5033724948638491,9205712417254172,6159053387195835,7786095337434246,5410796597685023,3714371016248099,1916142997146758,5831109119711025,8474057515200884,8753178801236780,5364384916133682,2593840184830767,1468601058274099,5499499801357108,2457893742119733,3728880506104630,3465980438481719,6611892067134264,5999477469997882,5017149180521275,8178925344124042,8046986661902878,2884964357630784,7137905510405057,2000321835659671,8179270497457974,5386547016356321,1738658516544329,2853941196745549,4160797220285263,6369002297617234,5370263133301587,7773597366471509,6899200829041494,5118970131450711,787133835094872,8367415133954460,3860176921176924,8736851557518173,4379241190509406,9142896207715951,1918360828537699,5490966005910372,5870297121911270,4901256461568871,4727678261054314,3797399891045228,2219681425640301,2045658134743919,2757972665404273,4567369646216216,4045063471999864,4238859023666041,7923262970038879,863855513504635,2899333472603004,913043376566762,8236906693029644,6913151393155968,5500747784271680,5491857359287005,4559356520196995,8287002126527364,552816782363525,1519439835302790,369294979678700,997450486131594,6103697646955671,8551421228919692,2643141825063823,2190805917649808,8892700018803673,6193512445578132,2067338361432981,7114703707900822,6799712404992579,8195106369406055,2067717925464987,6692579149310876,5306244237831069,8179588402485511,3149893458815908,7653579748669254,378042321431462,3214597676911531,5811850368060332,715756587461549,6405793657113518,6941671103081391,4108006960607894,1784864011447221,3080703114628023,140593511836600,2762824310885306,608963548855455,6251567889269237,1525995725900736,4783683900296130,6608628855917000,4471017034181573,5213862416190408,3202957475883977,5203629805289975,7750677510728652,4457174480809122,8810577929350095,3065002570378194,7245691386806777,4268670643661785,2781199097236443,8116376391125500,4292298506161119,5143046787984353,140970576169954,3049040917859299,9004741492751572,3534858314787813,625160918969511,4476333972712433,9099998992542710,8910638554074029,7736360068021418,5312650342640638,7467117713181695,7918600228604928,8030849564552195,8918575552269317,5870825106811910,6409207690251273,330946665229322,2361981776803671,8740045374181890,6582711613640001,601789726788624,2565146643953496,7227749721164818,2157221426777109,2975998706215958,7038649828576279,4291786673466392,7008197948066841,488161773186074,110408466754588,5987123601438554,772708539804703,6460398252616736,2966215408487460,18122845785125,7756115301239417,1903858651327527,3244369344616528,6972164367871017,3634767375060011,6358136008010796,1933289163463858,4578907511311407,6893344132181044,1088852656770104,2871345406397497,3201535045684283,8309781141515326,2878625069546677,1814537091681345,2132464323251266,1171185221020739,4581712788851780,1577385868774582,2241713677765702,6692741582023751,5114718124575816,3041189039418441,2220974494092364,8503833890933837,6435614580812878,601179783105615,610987745938512,9003170566932003,3561288374514190,2111924432784471,5060961402619325,2073565601533020,4414117680376926,5933658763458405,3657067988290656,1249646774422625,331011802836066,8116961503403195,6847568305015908,2876973623868659,3439424991013992,7141311031807087,2583303500999792,7969263068212337,3725790273236084,1343141044063350,9064135744048250,654243252907135,2437802372508803,4105343943912582,5493535637834945,1474427536411785,3282480023112842,5176086887984268,3744397766782712,2328051630075075,7597207929576667,5355645685703193,94830212197528,2569089628179609,9180189820677851,8388379606849391,7885812036203767,6479909910189806,4631849113201826,5318811219758247,9121465960197290,8151099687251119,966996357999798,6782039760768183,5669402184928440,1925705506098363,1120840192441546,1722056289881278,8762485154621301,4967970939096257,256077985787075,6455794723712196,5205010679326582,8342573487852742,4704989902384327,1446431152196808,7561765885897932,940924378892151,3165331540618444,6363990486224077,2669000620432589,5285183242521808,5004178599122,5123229703605459,7634044088515790,6319223989578966,1638430505938136,9200146499067374,5172035312397530,2817887911278458,952339050097886,6983420999160357,1714032803728608,8975807580581089,3959632518343906,5050635253648612,6733788077001958,3845968415337703,6811443579227368,4442277384776937,4304671131323626,5949717667104187,8467798085204353,6456945951962751,5940389874568437,5761487075798262,3931117249293561,1723000070409466,8823675732978941,8670152238755073,822159938563330,3265717565476099,6604612950469894,3527880787741959,4851612227046665,6949099092503821,8703592129659437,8597161629822224,598683126639889,5846417947430162,5725270226564995,1339162582748440,5211251330944282,1403305863449883,1624599763021018,2252922625588443,1784957627239716,3853343437548838,4632984952245543,9221609943602760,3988186963135787,841807170572850,1692297490722095,1755762155269424,7522952499088689,7779325480387123,4139766757823561,6686490827787578,3510564301709877,6141858909987534,4343956467576032,7795712732485767,5982153010568417,401921585761609,6066087467691339,3431683237596492,8063192034217186,3777883744652622,3881649303661903,4606375383327288,5603180221730131,3646507529481558,2612980858031448,3336578905599204,6291301492886874,7687973636631899,3363788631649632,291526647336289,2001122481921786,6671598397714789,7600218852553097,1778252622318955,7152488825749891,2326122058386798,7141273714709053,5234293800234352,4885899726245234,108247266119027,2332938083306868,4117845466698302,6836257340173686,3025070090014071,6879209414454648,2096849296182649,5467077567425916,8992768016371976,4957750491139455,814885367352705,7148782443978705,2688952517393643,6706931387698564,7815942678031749,8382788493225350,8591075015167212,3787432310795658,6508015504043404,5999136911273358,7050403160919440,5766043796722243,2244496853282196,3993591027985813,4113081347225497,9022745494176887,4382420280610202,9089097917648283,8914659686976925,8728950533574046,796061055135135,5397557505387936,3312382345792929,7905510415371682,5877222650462790,5220772225011110,3498688498617767,1254337410231720,7788709042218908,920965502946730,182208564284845,3251131341622702,5373456546303408,98255925382578,454730661346547,4726349553118644,7086674094034358,1197299198463416,876305211289017,3703274391350715,8961742825110303,7240214498610623,2577805146959296,6398728879263169,5704120298802629,7976443242106311,797108564258248,5508369399311817,3982824634166730,4346098291174859,6634592916088666,8633384320331214,4271998258826704,379661224340946,6623510147502057,8166070556552663,8063547555641252,5078995653455323,8434637206755237,4354637164294736,5987645314117090,5140595610062307,4979410495752102,4119086695673319,7641310416432616,6268483222523369,4732121891515882,2034314667866023,4137280294030830,4882919910288881,5283012667331155,5089232536735221,7075369075620917,5333245227366313,450665419869688,7428569195803220,2018757465828858,2110568244042676,3952668772650492,7937744567716053,2060500473581054,3933525042679295,624565654326388,1288001704807938,6389224148315652,7609679861018168,1997293856894473,5278474398216791,5826462765567501,656087733308942,3034828501790223,3413723045424656,4512717154233873,3260851068841219,5858077588928430,7858047719075350,1713114935840279,1546576864759320,6127924247477508,1321489142205979,8315459678809628,7553790490162684,6424595624063953,2501570634837541,1454035394378676,6999070763830826,1545587098799659,5109470450535980,1109516317091762,6852434810883630,8656173966930525,341566663866291,6191628681072180,6431183251361333,1232785217162808,3327663459626556,2497066507701823,7416548965404224,4468652082368065,3631272646864450,6363284715368003,7224357764468295,7794527382392830,1411353594834506,8457833812880972,2183282937228877,7070815264589752,4881859239210578,704260094201427,7389304418930261,411992568368726,3600323848261207,4323382973820506,8149886903172367,6919780455820892,2541859715731038,9204965016885767,3806731620806241,1450992108850786,8636527524988859,6025551795380696,5278646167711333,2795756919246438,5820908466740497,7724017536913001,4241415970393707,1438704412949778,6636563282292334,4036618710284221,7979873211033651,4316785660497521,8282718119300724,4333313775177333,4320277587676790,3939068533649015,1629147719249529,7650634350972538,1619362456844223,1891360596749950,5426104493076098,5959110308114051,3757410210778757,1307942984846982,7909544293107649,7936364688338568,771050034794124,4618942904544909,3344656210972302,8857982073490297,3111189738286738,3053479284158099,4111254350933652,1733748925465198,3573645813755543,5138186843442841,5462733484175002,6741383242190106,3105150984801950,2611503513030303,7140161637256867,4851201688448676,7197935230455461,3992385928916647,507536740818204,4127231094861483,9072216954220206,8616299009291182,9220147453296373,5318642645233331,4927762429795614,9099906260336147,3950654862896823,228377303382348,9215261820788921,3446932529688250,5950041088478909,4075937576636097,129199515315907,6143871713068400,6620219930939080,7035274176081610,8837577237635703,1144600982277838,4705776529379960,428443358621395,211569460088532,7647481866237902,4700462553969273,307936361544996,6862607692951259,4751617043042012,5763557534519005,8318165636198111,4108083793235175,7761543145826727,3336843236880089,6167555350867691,7897981141962476,3890356894756592,5104882989371123,7901465769225972,6921293962399478,3655088936742648,3407574022688505,5106947637038842,1379285126393599,9024799660519168,2090834940555010,8196327056170283,3788731423929799,1060709288095495,5732575443775242,7298205204596889,539495207161612,4759185013527170,4929065315643151,2813030856327910,560426929884947,1161668455616278,5763609950506776,6472498800938777,2179230945627931,6359032009027356,1772140732665629,5861393779486497,4425048672210723,300345994866470,5660000056274727,7349535211701844,2947257740160811,8509606952303922,1243387056402222,4422729446813489,9084039930253106,6354850861854515,7112545115754292,535081789732830,7313694113869623,35750873001784,7431393249597154,4266722685398842,5902288262481887,5637832731307842,8969902406315837,8821632353005374,211428507414336,6163502520186848,2167289596972866,6842964861210435,2299988450250564,6693284430892869,7068237301288775,7588852296241273,9216542171192631,2129274754510669,6180876645756750,6994395089465167,2988530371096400,9192921768574264,5668268771946323,4965281541885782,1508523422388060,3586160863506269,4781404022806501,436256187559778,3664489700700003,4331817685798757,6230506958295046,1658655506263912,5393542021263209,5931910122377066,4205949990817643,128193919684463,7608321932418705,432851552595826,2607700352701075,9043993917362037,3110264498483063,2285022911368511,8320414012223357,4320727234572950,759792694684993,7782030915719049,3196918725209994,6406088431292300,8461490382802830,5233997589909391,9017120230756240,5151730426064785,9023682714635587,3942173392146324,2105421957386135,7783529430437793,5939168103550888,8650777516105031,5135155413594028,4262554455629284,3725142694096814,7396609193209776,7491666646341691,8669105575213827,1554553066926003,476200675053493,6340056884178870,8410292803768247,6599449512108038,5583254120003509,5895424083324860,9112298630445840,1983891713068992,6313689283233583,5084315600244675,3831779813904324,6292616691331014,365764802342855,4248143040270281,4937447859523531,6299303641404066,2160041626914769,2642922851905490,1413037298216915,2233391669604308,4359032030760917,5230354501758934,9058742202036183,7136565157482456,8369455047976870,4266189702049759,220429236260832,168321536479203,7289703906592483,7764288474287884,8371791644642641,4799683831345128,864245961641961,2161872339000513,7604321550038257,3467616426315756,6863741382725614,4934592425693169,2365497524432883,5337061483311093,3904618052063222,1517587211055096,8533904186290169,4049443352211450,2045400352051195,8644188407047124,5561695305638570,46068023742462,8300305007131989,3872140978573312,848016730312706,4885245922140843,900712300597252,4052757100040197,5714444713111558,3271259846381575,4977949940502538,2190072000835595,2837535854579724,4854761297818285,5420760444219408,5943023915806739,11760695750676,1347039077961750,8270836040232984,2164698719891482,286062312909114,1487739308494877,1272983486803998,761642076016671,23373489991713,791760562425891,6330907249397800,2420420508282921,6605139785299975,7407025221349420,5757106443579438,8744128216594947,8136250424879862,7733414208450610,3102770718347315,2633788861050933,2384907909394487,4075045724049464,8522965937730228,9163889637462075,8957338531016764,7063684461230090,5865737937924051,3593413601570883,7025207289032772,8096921518411848,8020204709613641,5902221326443191,4088572360159308,5170997008642125,8774248687117155,8215236618604625,3672660020506706,1639043051655251,1586156557283412,8893332833661651,8539861067550810,8556282692134927,4533127671803997,933897310867550,1870429341241440,2195067966419041,6779545976590434,9069791447549203,8557191224671281,4974906662154346,974656663924843,5558922227183724,8106146027538450,8591137825042544,5593784726704245,5072784077749609,79294598115448,6414256051262664,2302826321715903,908471366692988,5398468613967997,7675116423041150,6570279618572416,7370262375805060,5439668780159112,416557177204873,8583356027859085,6267564336402574,2974707244257423,6079126733566097,9090171152027794,4695096899793043,5732636729602196,6698006446608533,5639112611716315,1264698773803163,5479251939954846,3028587133841567,2758496363368608,6492003189628004,6378706029015203,923479549759654,821383118462321,2438584688234664,7820238986999836,4649127557862087,393385335074988,3488654574063789,5530688368201903,1384375526903984,719476188893896,2970932212453554,932893396488371,4210925935915189,6757658606564041,6354187053871288,8293125270278329,3024781507023034,3508122781659324,3192819106427070,9177007189986677,8640955035365568,8244348260248042,380512858845379,8437024990064836,7541175155074913,767358300131527,6190942899613897,2777932119077066,2123366888549751,5898765516034252,7727059034478626,4098369302188238,2805903487054032,8306859276439761,4114809077141715,3315523404099797,8221174424121558,5689025412190423,7720435778326744,8877049435582683,9078905689788637,164916046033121,5289446936170722,6229233523757285,366345005854951,1170744769442024,5927144819665575,2962482424754415,8879104314708208,4509402184626417,3014554014872275,9200037055164661,6048932812091638,1758555130319095,1550804694323448,6113876549300473,8614426447787208,1695706304778497,2675434351169795,3453016771645700,7717201555895968,2633476217393414,1658767989853752,2697140644663560,4971099255312654,7854010440166076,3542811089694992,191975913648401,6785222362362131,1593546937676052,459133414117655,6835269500213295,2616001379356956,8360109303517469,726793748238624,8101716096340257,2858547928125730,4427455952728356,7769719464735013,8876296691565276,119877272351018,3915619808435591,8549670545975346,3267321262957277,2063837336113456,7329933289402675,7556205321095483,6124571355386170,2339676269325706,514897136914751,5580336676720961,7725746894557835,7506557079908679,5962192706834760,2322379519982988,5065168542986571,2111599677190882,5788219937648975,6741981876367698,4117590066688341,5222278090237373,8182621222736218,5667712758766991,5992029650661728,3921000597401953,4917894735810915,2006961657803109,6835880540131686,5188406844928360,7380646987464409,2541366393024875,6272761737081198,364579779704893,2254967947940208,3705493358686952,6541923913544050,3469727539810676,7264870638711157,3751415915352438,2132543395491220,3836042406850938,5585891266001047,4905197140152702,7413864447860117,820743379259777,5621276297523588,4006931308417413,3568699194503561,3513573180608906,6548772925730199,6018847646339470,8778262505005805,1386334743122320,2704619170935185,1678402795147669,5597646208733590,1113766913200535,2832378287485341,74280625467806,2248946825887131,512009492492714,5501212973101483,8358816044233132,7685383263605165,7975884564282781,7842952874873200,5086828165181874,7061028887981553,2915175990104505,4338864336531898,8795639015324432,57971430691265,7864924286513605,2757242382938566,8230791576433095,1976156599038408,369982910034379,496260835660236,274003158880717,7330301635449296,299422204645842,6480993042633174,1948018261094872,4287269420528089,1414609482027482,5139228781736412,5077812552184285,7000953641783774,5977171725602213,1429916593959597,1994934300258786,2834348336599524,2136468224774629,2618511620313574,8142612769542631,1275966215533034,4263337409625511,8572185117839389,8355596658285992,1999609474451539,1180702364004854,7952716903019002,1145732456935411,7371896903762832,1292752533418499,4333860994429445,7727341247091457,5482324138521101,2475708161061390,7965030482448911,7476672109883920,6499083336184338,3894544492367278,5215512376201750,9028712908034583,75355495567896,2764061143536154,6496085337015415,8667756216709660,4480474039489054,7448567742116384,3033641934787106,6869058968302117,7777898767847977,5337310722298410,5884036832571947,4078399763214893,9220628450412637,7946684107551281,1416019171594802,5263273880195635,4745207579021876,3132162912916023,439823272746916,4416398725984829,3493883151766078,6495398159843347,6531785592771138,450131296547595,817253600866887,6165057853104923,6063242832343625,3465672530113098,1690840572203600,2283637214138963,6613927386092116,2747956919808598,346238064235095,5988978536534617,7509464382444123,4834409950969274,1181927741731422,1000558243074655,6145386109737792,1941651710300769,4578937017029219,352638541789286,3215789721981285,5939223209456232,5312560961548905,3925973676610154,1292025662460523,7018373753467500,3142927620854382,8363279080598230,8493007664658536,532429987295864,1083091883848313,3766284558299771,2617361532678780,6969942371447423,7073572038414976,5228726182187649,235167720264322,3555822247473797,38211494064774,2838103912600199,7516050425770635,8818927215014541,6290078292482157,6590980260491920,5790775767626385,8375715279884946,2193906437403283,5352023448777366,8235411590525591,2091970958889624,3506991389700763,4506918610580124,4007444738282143,761956491956897,248025710457506,3839726412456731,8060500276400805,4897813639983782,5912718394790567,3116005287178920,2032980603843241,1935675302711980,1834482679083693,7429906927235758,8991687299802000,631095400411826,4327468676076211,8202209822211471,467513932346037,6871256833610422,6143409383682743,6345075143152312,4631785068098233,8098532781861249,2692059161088700,5834814334186174,8479132202816193,4565163451691717,2806396311540423,361654634394312,6024874332918473,7189658146019447,4244292730933964,6244457783825101,4909438206472910,8227713823847119,3023262204318419,4179929254662868,1721285793772245,8875227403243966,3425924624093913,2272753166668506,5098298417042141,6044944983992811,590722029662944,5555457440076514,6360244378568827,4968083422245605,2337530069840614,2060886597533137,1159891474862824,8589534387951174,7505888086179282,8841758794727159,7273058150765298,7675034321759699,8757295513213083,4359564359815926,549071305839401,6453829897630459,6724447828103932,6232469450852307,8056473252773993,6912367044852563,3695126803133186,4127854635528963,2100795278299908,211883810632453,675016621560585,6527058920313610,5441382832296715,7291333725313154,3059568490590990,4598222196683536,5630568948781841,6182697924533721,3473422642492184,4915409222185753,4941635542299418,8325785012581147,3003772977500956,8927006822221957,1286389891527457,3304943599883043,4427302649180969,5150416186632327,4333693117297454,7381704142279472,2923385705960242,3577467409105715,6472612673311540,7892136195666742,6905596072227640,4345675871793979,3728833496557707,7656052528010053,1557313650791238,314913566551521,3590330679505736,8891821156944012,930726812201802,3506879499408203,6627074733149666,1585186917765967,1170676159001428,1328440519226198,354050598130520,1569778952090457,7035393055258791,1438627667448674,6506243328209767,1145913560331114,7685058205674769,6798156870702871,6547624167240562,6754285343437683,4141626184577908,8292951544729065,5157118835733368,7769232291812217,6715191852741500,5027769466925857,6860357619405694,6317491342389184,5604380620328427,1474222421308292,3862004197045126,6346347188466567,1192117935158154,1379684766701719,7734415392985998,3478120910665641,2204064169022354,1742310271251347,3823877200178670,6346611588442265,6727217763956445,6844593059992473,2366032073552794,8562580473361307,6862417777882018,7346318489267185,5230066308936518,3892352791565223,7416596125602734,4228424621600243,7309393870001076,5261976286671797,4009559671075766,4885795386463160,5988654768255929,3248731668026299,8206344921076669,3412163799815103,8546496625595328,2714235715709088,6198672652555202,1549131476699297,2514441788814282,6921770854814667,6238686075540430,7577265703639458,1365487326770129,3134016421491669,7076563229406167,3353319683929050,25905721750491,2802100094983449,9048545942859258,8690134187788453,7250998071448546,4296049691816934,3914510178866152,1744174973656572,4217235578352619,2088859616547820,5632788573205488,2989230230459377,4427953734521842,6389172776850419,5914952928408564,3599361182233589,7260488362776177,6917514670478328,8592138105735807,3271336905716735,8629417372867179,5136625779484843,2238446901719894,6749252819825670,7170076147536905,5231729650324490,2148541102773261,518984608052238,5872623877493775,5063972360180752,1228597058646140,7533643915136577,6996305032344409,1468487442338840,1216021383910425,7833796421932059,5658627633476637,9049482448625537,3276934559803568,5086890020418594,5819813274260516,5984771869897767,7325032187651899,4447889548858381,7201269787478194,8340453953270830,7985683852718941,1030399388775475,3032691528250420,5796699319055416,1980940126450745,8927672058418234,8875218856973371,4948044262757436,6155914390397792,3699786628756550,7061625075668040,1083604011217993,8255679541867594,5949777419671735,7810218368303686,569252380857421,329618730587214,2480665999079565,4168933282370641,3199411535705171,6276622952641620,2665400847897685,3923917484145412,6809129141823673,7917092826960989,2427700611191902,5649394871637091,5485180121166949,8674553548169783,1790600023633425,8685854096921704,8924109968276007,6833750482064491,5493791948076141,2483749370238062,1977257231021167,4422283620570225,3949879087666291,4104715882484852,4893288566223992,457873866323075,4630175955604613,1028512033059975,7447912386221194,7672925178662423,1661685075200194,2394004446565518,6187361426335140,4231278577341586,2731321355424916,5125198438433646,3447360734450839,95574140286107,5422930644680218,2961228496385182,6804446602491042,4294296440378533,4855890249610408,9005160636069034,4488322444342443,3080193678611628,7385033212630189,9183703474599086,5791750955660464,1950984692233399,6260526497076408,5868401980896442,8038011763487931,917751513969852,3279824137393341,1707952060454080,6528131034109220,4427751944066242,116260748670147,431709693449412,1973870333179077,95295473407176,3955533812970697,5846180235772422,8568344419783543,6960244154004684,5813049185137871,6762971315393747,1268230010787031,1132745187497176,187611667281114,5429225991822433,5223257519772894,1514506037624055,1394039242323168,6646107470050529,8593511955398701,2389987372766436,8085195117221093,2891892071109862,7388274075279359,6469862003183244,896197231015151,2076190638322929,7139704138328275,34758834623735,2263712875738362,8429804581647235,8631917827847921,3185479444894974,7504831285238137,7363831847843072,8204567587245152,8135477587547394,5479031910579755,1253061035545860,6211516288366806,7748065837094150,8383624451883905,5378719204865289,2225328094926091,3546887202682124,3708154358603309,2390966267172113,6506494724895619,3607261890221336,4192176295761179,9028856413500641,5112081579271045,1662415099680032,6042209200815664,4890513982395682,2421623902000420,5324566494069638,114756981830953,1693546084291882,7780050648441052,5395438566700334,2336268563641647,953171425989939,4347604422210870,7029916292990626,2143358415607096,591614652003641,6012637562762555,311990612874556,6103026343982398,2163462195500351,968398880544065,6960273475072083,7122459966231435,8893543788557637,4449632982037832,1569407243507018,781400992322892,4930472726132048,4771617146781240,171017591706962,5513844618253651,5284468978038100,8864952600454030,2091222381450582,1734910381421911,5895732385264984,4810412064388442,1781004880811355,8065801358185821,7932660937186523,5874151831729503,601613526373728,2270259339436944,2385197042341218,5379015116084582,7454174989218705,5933369922295145,4517766293837162,3091625771717995,2435480087401837,4385714439787888,7093489533991144,422613253174643,6281756269473297,3096251860661621,4251957171737981,4492295686395262,8536981549929855,6336687693100417,2425476345189762,667370365376747,6305473353299334,6042532042841665,4037246995953900,4055543097292170,9015508123923351,1519286763779468,41692982867341,3118730774730126,1821996983702927,5230432471711299,2185072409539990,131679454082455,2948811467560346,94979959295138,6995534067180889,2699000454256031,6902080199538081,3630080839972483,8430166733002147,6616919227258276,9073994908848291,3159227915408806,4624684239023605,688328581060008,4932628501763498,6150925489075627,283779938743725,8789164109764015,3468540239263152,8106147266850289,2078607772612023,8202357183242719,3756053328369083,679591283758524,7858480386151873,7763910767818179,3446521530193348,6097008665482694,62182236059079,8510266744911497,4078944258586058,9050188598334923,8524540827850188,8175734075409314,7193414141644365,7238021457827281,5189937147499986,5175908421539283,4006211812922837,6625761763341783,1121018445338072,8643768194347011,5234012450657761,4469958294713830,4843174587913704,3501244246136298,6142940919235495,5182479164126702,5289032262555119,4854385585960432,4133220459422632,1804420242879988,9216115786561014,4070482427901436,1661165138286079,8330650804336128,8689104230261408,7308327764823497,2726784800814599,1188022125057546,7784482461601367,290856412784898,3707070427420174,3244790517061137,7452293906839811,2424396052854292,5998685341570581,739306051950103,6092422037383428,4091969493055003,5643302030915100,335555217675806,3736968554042914,8007262108112419,1926599705056804,5032327805433381,7772061034108455,1139696457692712,7455994753873450,3218719867844139,3535775984427954,8952672453293615,648804241708593,5662987759613491,9189856170677813,3013121988130359,9018525809391163,9216273163393506,8826762142682230,1868293701645886,1248776796263999,9104428338460405,8239500673490784,7183853053974086,1227730115835464,7598762280294668,2683829641205323,5131700941207117,5114243878123086,4570680016836175,3662800791270992,1170379608954449,5035474928776786,259813620201043,3900494389327446,6818112670430807,5756585252462180,5028038749197914,7889138761401274,3900050537797214,312543249323615,3781955888993888,2241769475831393,6618525449647714,3930560350778299,3069101500208740,2152018111313509,5802645705840231,1953867950503530,118296475604587,7461305482688112,5084637502281329,7533869715814004,1438875994950583,4814135769347007,8129885960304252,5450979031029374,2798358484137599,3978737009776256,6368884018488256,7659644878526082,1372825918248579,2600386121979525,75461820831366,3268852323050433,1002134514046601,2002627374503562,5219435375138443,1697306230871692,2832029007664781,7958500104304270,885109970450063,3343591039516270,7056355509159700,798358373897881,7107156439381658,2616490712430235,2560644040930972,6582017336066735,3968407459845790,3795161378838176,1420641321154217,8908453847618151,1387642555741869,5197301998212783,6389053371446960,8135025750529713,9107787921766066,6952969422933489,4883367736243892,4584120616318646,7372756733966008,2501036350609081,1023488141989562,3456789311428283,2075194182235836,7314532177167306,594595219658430,1600625564106357,7801856632403648,7705627087533761,8836106284799682,1632580360746691,2226766782641861,6657661262583494,3241483967452871,3529966685345758,2706396989865591,7067743149864652,7234996161574605,2794947696752334,8181378814139971,7045699450943779,6012297402840790,4893194289485527,371505338726105,3971482327848666,4515114324091855,7589521908119260,3158377925940957,8215359552247518,2944009596737247,3913329926608608,4375880406189008,6535106014754530,806713116866275,6229248816096412,2886797330986725,1880336872108705,5064176337376999,5771026813499113,2235161058388263,2127729588917996,2653249527011053,4562866128541422,430039385620093,7692129337652976,1385380114151720,885000182052594,948853003654899,434191084246773,6611899509012214,2996195806869239,463927493669456,2891070549590996,115031297146495,3900414054668029,8994383499070795,4074383220668159,9089220157846746,4648838224992001,7844656134919938,6135088809842435,3293971766753030,8035465036392748,4010580127872781,3465134410716942,8245931964722819,2936544717158167,4119496435496729,8538923881600794,1810723487191403,1377840254891805,8911457523982405,2800551445223199,8299040014546720,1720221495121697,6121687811733282,8209629159221997,5635893667862310,6364807721531176,7558234543600604,3204995653859116,9182618118022109,4566831350183729,4922651902842674,8185007933749043,8738043622324020,4261068279166774,8824184875767607,6676998129580340,2797948618798911,1049885884094272,3756812648421186,4765707091949379,9098032820865334,2725707673630534,6138892879664967,197494406059849,1142985124542286,3206272630462287,4183991813928786,1916792304162643,2431166572697428,3565523697981269,1510769831876439,2923456079632216,369348437219162,5171139309786973,8316917965943226,5077115002566496,2209602959710049,1351222211311459,4656215924864869,2938987806979942,852106798954343,3230418757605224,70742734498108,6309855274761587,1807275649046382,3571017419454319,4435686662018928,8682583761753969,5386212871681906,4505081604904819,2776841018890100,4201249864087414,3566767790520183,2379514032576376,3879170223380346,7139802085427519,6075215015326156,1500570680776574,7667909433653119,8525329245978773,2618663615657857,1611331824325611,3938604997851012,6582603717826438,7537888455539020,2203184066287496,6737492445517707,7795700009498510,6187627069519762,1177815800846227,4644852119189398,3564865846605719,2261670414694297,8415897156147101,7669379958691743,6585353185033052,3004877478975397,2696867485956007,5194516337866665,3957238508303346,3764560196523950,3926060805576623,2284292388435891,434203397928885,5131232950826934,7049865797048248,2931440191231929,839468150644383,1575765952296893,3697924637856757,8512778506274948,3660234119346116,3927028193441735,7247600561917262,1625341823055817,5542852308490189,4241535976732622,2799250403563474,5740278401343139,6344824120473556,8071188005803990,4451471981454329,2579302146095064,2186676860303322,6901529414334799,8379186567641052,9084679392101370,4800874702534622,5672126454495200,8275002451908578,4720192308115429,1343410319153129,278434394451623,6323386578974700,3999487854000110,8301869681694703,2646489812875248,4247984384746494,7237873985845241,3848966020904955,4848361656711165,2513902998747134,531440601967161,4341848526903303,5676363565897736,9126029122410505,2502204475160586,8299260470221561,7892253146351960,8305616383588370,8169069141825556,3625286883239568,1459268805541551,7617075379898503,8016444203907101,2995540491827232,1238470165698594,8206540014007931,8739563317286949,1572712856369191,2836722952788008,7721292640921948,2580557346371626,126761111320620,5080449494497327,7317338047977520,5297407398000689,7390225343887413,850627480631351,6490482604177464,1754806708942907,6343020394633276,977317165455421,7667718727301182,5577636910829237,1323871878371392,1096120466798658,7571870285781059,7937484269287492,391742667692101,2273628581863444,6958885982124104,6303001594259810,3309548122232911,3739857380989008,6260211930801520,8786622671537197,8861439005148174,3314017994515756,6598512665172057,5020044340320346,8182137817094236,2781328775961067,518844734249056,1023062138239076,2548055424931942,4912566158596200,8850634405279850,5965593870882923,4517141952895084,2607136538720365,4468384375101550,6612421739589309,1665469171992936,8791764080064245,5941983468673141,2987576330494220,191587477387383,5951704028993659,2696285264722047,2655909443818205,6292063346833539,7971233597470853,556381453733569,3830432582058210,65777784174731,4752345989118093,6912147989526670,2207992906365071,4682021306636433,2851000728008852,183410704316566,3862494647338009,7006624906278919,9222628508450500,7502786434521242,590939386632559,3581490320554140,6073302930798752,5113638377896097,7244938767276197,886966455195815,1791973511993512,3560825689700522,6070911299172525,8551066216546086,8521503499243208,1558631576311986,2245744688740531,363324678412470,3294542225078455,1925530734534074,938197211207881,4505634804496591,6819845449451896,1903465414187220,761655832195714,2382379352258937,8190365946640601,3900519281400026,639938841278685,6277214537260441,7700263645951856,1712510301083874,5296793707583867,2874460849649894,7030122036181224,6672689232443625,1123314559580395,2779805689428204,6045660805486973,7445360695048432,3804609690597617,4921369922427122,1380870284368115,8084002646710427,2491829177842046,4152546152847610,8620449200527743,8687999664372096,6035566021507331,210488069511431,2339095869880584,6826379996455980,7092508588328404,6894903145940013,4462036604041493,1752631266864857,8065372894074610,4148490562681115,1035853058480412,7504408446062590,7025815914316848,6516976864991523,2663963789293861,43739069028646,1630782068136232,3076704609065257,4703412992244010,5890799772241629,2069203048806706,3641544070969651,999800879610164,1774212927871285,6297341262272905,5211172509350200,5272824267523124,8772692350329400,8200065667438909,3841520462002495,8456837727902016,4830969642318146,573048270743947,8064941071292077,2341448197200198,4460729405618503,6017368952346953,42981452872012,7131483480127821,8618552414329166,1375371918940495,167874738895184,283718216153428,5952111657351786,2712648218040667,3002264048785756,1269369132898653,6444167932615006,499139813013855,4961630975981920,5032458485856612,9179312572275045,7294672742579127,6243134924944444,5489889683700076,7646660307900781,6608175477430638,5159060153530735,1909056289519985,8929356287400306,4869493969672563,4534302358854006,7999799694457207,3333269495421304,5394312879610233,297690005993851,1941235473832317,2846381666867582,6421675349821845,630066569664896,8076645221767553,9138502171979499,3080223746472324,3039983774366085,2529883321126733,8189217928664129,878386611386761,5323070483077347,6299995364190615,236385837455756,5969843844364685,7853037270202766,6743539960863121,7261803379194258,6794599453366678,4404785302618845,8358599472241054,6401379765008799,2205010926767856,1271275715426722,1672071737727395,4115457690007972,4048110397127077,5379587372317094,8572443081989655,7833807991658922,1122920519547308,1022561768685298,6922164425550237,3115656173279664,601578705803323,5837427153219074,5767495894753011,8502428150409630,5002495638541385,6935752729713080,7773338642143677,8547517459611381,2218463124224448,1970331668552129,3099570552453570,7947055492864451,6078098537478596,1323279741532613,3665786913438151,9146347983690185,5080093794900426,8223026877325047,3887419205643114,1510398512216527,5104784997022161,7200119707892178,8295957759351203,299862894025172,3165291586738645,1500240473430486,7155411470823161,8160220562463192,403808588143066,7950698090928604,1341063223525114,4339138583124447,5326407457241568,6103721142876641,3920050390718946,7074935631118075,2876462166284772,2372681585326502,5641268056807913,3436249770473963,4292653846338029,8201068906427469,3568023907228149,3260951300995574,6259893347754265,8543393480841725,6041816677397589,3263189550193152,1150769619237377,1527335733541379,7420318863374852,5331553647974917,3649829525486087,6579305000024492,2988115416414730,8093410837648471,4876675994532364,3845075746208273,5779708335446546,7281858809707028,1003288950143509,1387355245451801,5616996435819034,8524505842877559,2264336091830814,2660117523397152,2340919783250465,1726103710210594,3786575080544803,8895101729528357,2918608504166951,6925398531400796,6190780533460743,2957850431722509,2606248466479661,1614367615187505,6398698591877683,6452417346927157,1170730441793289,9191808086637116,6968469713149706,2588758722173502,3782674927680063,8069019796957073,1125936423443011,2742258188950085,5559502660893257,2609375859038795,4041466433493581,8288460667457293,709103239985745,8477190700610659,321807816096345,5463338943602447,699607431281244,4734583979948637,8490465913717796,3474389640059488,3866856004500065,1606431239952995,4457283858307684,8310782016055740,882630563797610,125117768596075,5325474683099761,8141232133528183,6823768439147657,1551034762599034,6871429328919163,7665022903170703,7301772992068222,8759487413344356,6916984656638216,5456816123861636,1699716951267973,943617521785478,5082528430602689,8862279159667138,2674691801979536,2061846792280722,9164750192802454,6267165690059415,8751131003623876,687458921667226,5922138896397423,8147684872759853,5993365271435934,8217604700428960,8282503583825691,2454820941388457,1597960636463787,2499960429697708,7455383121280797,8552952499968688,2555200656173512,4563612103834290,3408312637919387,1654323157097143,4413910878051000,847998846171834,789845488540347,5115126601235132,8746835963894461,8110001342266047,5560616940606073,4814009890052808,5731970084496503,18789057985229,4529669087099598,8270647196048082,3550500090567380,863030550387413,2115498790099670,2994942698789591,9211389257857753,3787044574255834,4896783675292381,8224132241784613,3161742935079649,8213152978320099,7743699727637221,1125292054641383,2850728663010623,6265241372818156,2863814286592466,423507596253934,4899558495550191,3878796172626386,4721106971253489,4720075804613362,4784035005438707,5233368062376692,6445923025214198,5044982492248823,5203215063522040,4167283341884153,8417013484395258,1587336208136955,6792499777600252,7299006733772593,6465839833047790,5122308940930859,4226112196320004,996492537854726,4446103868816135,3619352716778250,5552218634484492,5633551476051448,2673148275916589,919864066882320,3654420108335892,2451584609385237,7863521746259111,6349595472725124,8057953922882421,8936763569871644,2662090545486621,8321739414269403,2261335601994527,5281954819922722,8500747731974948,6508548426111781,4753294358084393,2916231939134599,7825578383620908,4164246920215343,3808913287838512,9208941859707697,802918102342451,5014734051162933,6239040334625590,8454327146265399,4576943742663480,4744236909108026,4583509937297887,301645549697852,5790413884447549,7962321729502015,1182688391682880,2472172921224001,2167783756921666,7552556046719812,1383281430387306,4014968145582919,1010115438639944,5364618665605963,8848820782390821,1470606537775950,4814210050947923,2209702662741817,5482629742082904,8608002013895515,5828884969380700,8264085127125853,5281488157104991,5864309604891488,2118946920172365,8006476684663651,6827177814673411,1296947247536998,2959442647464807,253746403599942,3984701983906669,3827442132843375,6484507494086585,5365379748797298,1661454060837747,2448542620924789,4207969238727543,6214937596558201,2473180128303995,678337993595772,1639396139047805,5546001921907582,268212578007935,2145767678114283,7822542354070404,4687802704542598,6571177010895753,2147238570687371,4074515549731725,2837926018825102,3007568502004627,8312661019597716,4825229527759765,4946972340362134,4582919924669336,5231420488072089,2242539767544730,414337181096861,2106018138864542,1108699350191660,2185835893062562,1111148151716772,1179757226803014,1879544294849449,7460920328223659,5933722659535788,8651717695904687,6649951232641523,729733802711988,5073386750393269,4314946751151031,4878541708803000,5429583528057785,4627124260311954,7749200678697919,8866814080990144,3162570006592450,763183260646339,8763994852981701,8505782706404295,4673240189303752,8574554620677527,2447426791584343,4680193307728844,6580525331137698,3622542635826127,5347327408069585,4811730335005650,1384296101460947,2102043359730648,8143047144381883,2796665120627674,6208316234636251,3753510284721116,251457751260125,4600671068421086,6967402579074015,2531952431717346,1187170755263463,2920720282470908,5608356577991658,4485618338186407,865425607252972,4152208174431213,3812493486898159,2999291251293168,6408806779501553,4416697465494514,5197358406949875,5087700074347508,4724013516962807,2623328457776120,1778886715423737,8620717773831163,3250437908577280,8429267913612289,7647350598401026,144016256596995,5639102093491205,2831759145912833,5160469030870027,5710832985923320,7770819168910350,9105746298764303,3947796567006224,4070666733231121,2343505437719570,378714943200275,310671338363924,6999355537720494,4533753901808663,1633983294225432,7158989480333459,6081469861134780,4377985289608225,2681750969121827,4700825583090724,7034465415535653,3862727856774183,7296432101678120,2157125457784668,2081352236506155,1825797522390061,8444229981572999,3449293162060850,7284822581413751,8411978890880708,1509730742672437,5828529494608393,1239785946061883,3182998153190460,3214769948023869,968537321487425,6237318226861122,7164751461349889,5803397358844522,2360129943731271,4715329327856713,5852825693051978,1845480993504331,2084562617482316,7971306836234082,30858627652686,7055374979374159,210085401697363,8609690624627930,5252423805844569,8173006126595163,5472024391400810,4749766635699294,3815686010261349,8867383343881312,4306448340933729,3900380717309028,7459836745849957,3101753754704998,6056624245005418,4512704753437858,2293472325885037,6145091044398368,7715490032688241,3906787549346930,1606861552622707,4488101616237685,5555918750448760,5331366381141113,6071839543345855,8561020614483072,7336587558542466,5154668086641616,6279078484049029,7419740200131718,9132541101579400,6845906079005833,432021740158095,4553896124882065,6708270634327186,8997407381082959,912523531680917,1087824078666902,1154343777467543,8146019625257954,1502715792030873,3375243582348442,6429149850840943,4678432288726173,2733533231748293,1438653334805665,8204093899512995,6502269175279428,7147212477562026,8340701323022073,7886732949003436,5514643841514670,3354912777901256,3773592469552306,8604806213319860,3465691404303541,4462000090733754,4353103533259963,8994574684437693,4429388222504719,1011600725753025,8559563505886290,2590512425197430,5555447539596490,892603413470411,2738303532243490,1073378034875598,7130883967565007,1498405917285584,9066863368675192,4471435052727508,5740106578017493,8123210850257668,4521763200285911,1567581108092123,6921779008038775,2479223052549344,2609425789107822,5159209373850855,4638164935146728,2288286768929319,1612726703873260,836023483063535,2585531946482928,3156582331563249,8191641008171977,4273183498116339,4839237436030196,4653744181353718,665844481309943,2166853101141241,2823125129911546,740920090295547,7811862382443772,6675358026530045,6191648688782590,4970357320637695,794365040205056,3084749450329345,3040109987749124,6935796723662085,5768359105126273,5030991968646359,3318146583149836,3152098133163278,7994959165660431,5496457318012120,5352112584138002,7223573262409603,9051506329593083,1891823721405721,6756784416157198,5243352671436059,5197707403935004,85233370332445,1492456357575966,466510677245216,6887971495828769,1974745694133538,2849122052316452,7377162627521829,2925041804590374,6130851380714792,1107004879502633,612382957559082,5830033035812139,2242497821523245,1415499184389423,6996299874286898,6885838283816244,4190005210185015,3576253795705126,4667690858151225,4739383563738429,4171629164179215,4390459877203265,7722561211374914,6143613087932299,8999030051642692,4560692439244101,1994658425503047,6035992175910796,6933993121684810,3399261080591691,9007176291828962,92289387076942,3551512314725744,2066935134496939,2602022521068886,4988970190241111,6816092311567704,233554283797849,2601631025741146,6247947750031247,2632053265390942,4143899183463775,424422399000464,1326756946468194,2751279494544739,5679397110019302,3798622883773799,2573334991175017,3725074827799501,8982473390701117,4255516527320433,6723137416248690,4046352629957609,2773317501386102,2265407294381432,3619588610224020,7819513461000799,8771065313942878,6572634809376129,7947153800674691,5424097234140549,5179045239078279,3132311459732873,3827745566686604,3590620750118285,1158960644193678,3628722409594255,2066418774015376,8214000720157387,3299698939058755,6857308628478035,1753327316819353,2009090969869723,5385728692583837,7312414823578181,7810399204851106,2133436141928347,5290028972457381,1133707880897959,2793650807217576,8129810291022117,7899936808025515,182916927962540,2665373546413486,4626362624146863,3565794297095411,2605141375101513,1560123719392696,4030717217832378,5569732364746171,6206544286096828,6513940961877437,3722015205006782,5189393809202623,1765440825220544,3111786355654081,3982278164143554,6428702067087947,56686711823815,7417093603180542,8456509743417319,2730600658214347,7573846164184525,5781347583335888,327970802517240,6136307509861842,2055230681816534,5663105281247592,2066156175678937,2313712481967578,7826017804008923,1312681115956474,6461553425546718,2163562961059295,2244282597883363,838078199258596,1614194585796070,5145249460747752,6887617198456297,3927427280616938,5063597935017454,1151035929001456,3574556061359603,3738342456458740,3572496431930869,5345884909894810,1477216257293817,5882654439493278,388431759252988,8814637195066879,1847793437957634,6652951397080580,6309481383861767,2588202776391596,5013266697305611,1239123485826572,2425305005587982,9014830955937297,22077071900179,5848376351545304,8549680231819865,4065003529000196,3117051276819994,8564960207568414,6696914240945697,7116776886722082,8033706376100443,1409838916173349,578443609918044,6933716565679658,5315382899965483,6962896955440684,3629125801754157,3012264385084974,2723938417090095,1635414218284592,1888290882412082,6859348964597299,1145891470532149,4215777844133430,3257859952827960,8346218709122618,3208830061054559,2090664007566602,2097347429981759,4633201021410881,8460028463455810,4623607370128963,5511488977927749,7322650425031539,5968780799925831,6276592415252042,8553379634163058,7323183122249545,1560114685378488,1075569898765907,5273513531047510,528356331069016,4390355712940644,6962857766100570,7355332314603099,8767833789668958,7959309240932843,5261877651160673,822079570152949,623057807752806,5787939284940049,4725616821254695,1749139462250091,384221538451052,4799455735291501,3623345308925550,6176654379417075,7937123066822256,3286234000186993,4004984526228496,6923071652848915,3855317605891700,3574828565692021,562057047228023,503522307956345,9074932936384123,4018444265447037,4289876313636478,2606045542865712,8423374210883200,4313860223401601,2009739224202883,8420930039013313,522528748371593,9066405870441795,2727998866816654,653874539503247,3303725249789584,273988897701521,8792138201820494,4697533093760652,8894829291871895,7245772138143384,6131268072959940,1629016008564379,5020937394478749,358583458676382,613953442102943,627127047486044,2064120551587490,2224925486617883,6887354663132836,5250504153931429,1736828670746278,1542749681998449,7337985600691881,8409628026257066,9175172128915115,3203901475389100,6928614113803949,6307086155562670,2104814327160495,7570334145454533,2177817312329398,811498013376183,8302805963521727,4636622344675008,2931358882569921,8827010433539779,3522543043010244,3116692676730565,2545527985462982,1572494890786508,168845645921997,2703898082877135,7018991960277944,4386398003456632,26726058745554,2861310422154967,4091431805722329,6371489420869339,1621244878569183,988410102587105,9090083372211938,6534323484172004,2239765079982033,8252035446301209,3312590706114290,5556386798444275,7734957221920500,6024982700662517,3580566623528233,2200464202751736,550699332976378,6811482601135867,2244066252242686,5796380939954259,3492188083605462,4357641197413676,2185966016531649,6243218223590018,3903762355117839,7636737062461201,2789836649078546,8151139453581955,4960012079570708,8979093818922775,863418006150934,1875289249480471,2469221006144815,879607110295324,3123168685219613,7165038194753314,3688548400455461,7918105791560417,166961444683560,2258248819662633,7638346745585450,4727847407361835,5198503861853997,986000595820335,6384607217426224,5369015496998709,496474712719158,8361178393092217,2996241404976953,7537789440873818,6781058159626890,2091272042348350,3523147566448447,5850342525394752,5970821371879392,6795002579693651,4587313672232772,3797076680671046,6434728476081996,7305114755986744,2585429739175762,3721472801914707,4362272716676948,6238865550737237,5931467980750678,6340366504658233,5229854693392217,1613541943811931,3251279871024989,2416643969783051,3323101669678944,6988652507651937,7780920880141627,8488754762723488,3238513277689702,417073578278760,6872328604270442,3830222747606895,1272961363890152,1923463400103794,2262545021042547,3099826312666998,3445563636203383,1627268287176568,7151467438546812,3695723156070271,6916380727017344,1996190028472193,2667068239462379,2575892301561734,2263712816480136,5507376196722569,7506334117809605,4654286578777995,3106871059447692,6163592261944642,1749622369943438,2466410892853135,169836769746832,5241701206556562,3766646000787347,1018366217600917,4780447063408535,2506875907776409,1231472717823898,3694917249302427,2207543628562332,5073680764419997,3487746285526943,4423903982469025,1118605648994211,1426640483499940,6538670543167397,3039786341265393,7082363234131880,6005686893993897,9065279836381098,6208038769590187,4512802445508524,5253360675274669,6583515872641686,4129320403339933,8292505190932400,7822892193636273,2607087046492082,2628648902107059,6245244813442999,3737549735772088,606849405271995,1946473745571772,1431339418697661,6259575551293167,6287308865707969,1773244691480515,7698835422722572,7491724734988233,519554974277578,5183135088082891,3068080106971085,5710134312312784,5100037510176721,6880121901162451,1969282957746133,320555874844630,7249645697146873,4093184912424920,1636115990773721,9125618783985279,5422139772829660,2812799790804986,6539549800116244,3338565331528357,5050396951254555,4755419142373346,8789152442572772,8179576729264260,6162782887026684,4172900998220455,8164688760870291,3160000521114962,1593008646717423,8238797963485170,4763395536209235,7385327650803710,6728332752835924,4697172654014459,3129426287633364,6658055519518717,2076510590083070,3889105343275007],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/7574dd67e829221b9ae553692c2d5258",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001086245.1/GCA_001086245.1_6680_7_7_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CKRL01000001.1 Streptococcus pneumoniae genome assembly 6680_7#7, scaffold ERS020477SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"7574dd67e829221b9ae553692c2d5258\",\"mins\":[2490021567844352,4351975041236993,1488203822587906,269347042549419,1437297775765508,8300538758595958,707981604208646,2925634619170823,4673037467680776,3680868880746507,1440440334817293,7399917768027480,7440728196618259,6763239755290648,454179274108955,8652663190726686,8722226075563319,5474886157553698,5282130208907299,5880943850727460,5627447984425990,8394486892685811,226286311893033,8204875963108691,994461212282923,6051657791739948,5246393105405997,7553180956999729,1914294714538034,8534962898191027,8114401761218732,5708833000374325,8779772472426550,6022284450248759,1669056870281272,6128401535670329,9156419442896902,2383410257381727,4994768899348540,2621642705029181,4823469834571839,4964245868144705,2745507764901954,6511915988359235,4297776730667076,6302970232279109,3613057720922182,8942309949689927,3111834298552392,4290481007822922,3331152991451149,1776087530322000,134468824600658,8142249097168979,4516192492929108,5532234932309,1466889659963478,349172897908824,4951944264425562,4514250238802959,6173416138940510,3737605011646559,5136001407117409,4998390552927364,3110938088623803,4861316824440932,4200829096786022,2206042134198382,1211501835327603,932939659109054,1275854055323769,2432715640828029,3391039039561854,8548860201986945,1148370269192321,580815074306179,2330614697059101,5536570902161545,3527237585035403,5310090009725069,3146616663973812,6355352420626633,7532005729964183,6277665320904856,1162045228484764,2009848877923283,4683283242315935,2115001910163483,3297787692927686,980192377581737,1133123495342250,2988549387186347,1664274172526764,8694717712389490,2155519832156334,4193665318563867,6132059653494962,3263791994380471,6724670200826041,7118354882747,6319452818284732,3810339031535807,7864615723232779,7770099724170272,6964039427588290,475250277257590,6151954217586886,5791280792189128,3974075940614345,1324055369967823,1399425991991507,9147228867461332,1364953103081687,3679829348522200,7466089022603482,8776291713706205,6326114462978270,4688577208256735,825710040733921,8669534285877474,283468914983139,2605431880233190,6344465336072423,507047544240257,3726409662025963,5417988368226540,5779310548923420,352283252400025,8880369686798577,91628013461750,7311974106865913,7018694071513340,4791540077424894,720802622216453,5299943952340353,516850987546888,5987052939749641,8455127976022285,2544299747985679,8306057612983681,976164703652114,1355402763045251,6201790073579797,6594131641811224,6063665282355763,4793887306531099,2281767462301980,8370786843652381,8531691436980613,5026368732809506,5488174607540614,3557549382027655,1903636238151982,8513314683164978,8541725039939635,2723888685203765,6694857484673334,1230668051200313,8336423228010811,2764398245419324,9023537540604222,6895963736646368,554285687178635,8929339709987141,3554120367073611,623884981012816,484438152493394,2097515763822933,8009832590596570,9102193747892568,6513499778688740,2200853753678171,2961322738770269,8456019526418782,611447939993951,332690941931873,4051079873329507,476383323027813,2000240846479723,830520445073772,6379490887988285,1809045374171504,6191367153049969,1948190278576500,4834252471546230,1796387695120763,2553156594620030,4191810702242175,3392721843818883,1308465505982853,760872949647750,3814951233972615,69308857477512,5321362813071753,5114377345982859,3747019539474498,657948796645774,7672931439647121,9116625032655253,5487972184275350,42333614958999,6504968290881944,7627382569474457,2904893712978335,3723068793053607,6145182714708394,8537689949698475,7039274875393476,7460393318239645,4895421267919280,1254190396827379,2690909527771573,4972814070550967,6640718785178040,149865775516089,7736745512751711,259054668161439,4116542334042558,1914383484592576,3214391173607876,8904808781979305,1821235306916296,7395876564784204,1633467053007307,9025037046725069,8762669865929464,5270623963666898,4533275629345235,2789215096261077,258785826191097,7562975836533210,3596856859445327,8887776877306332,1611329518436829,2292427128957406,8771414131157471,4224869793313248,7286961056348641,79613614485986,8344663634414053,4596494124825062,9197272968673767,6000761850597864,6688832447887850,2674036456466925,7683012709065198,959217804704243,8389816593560054,8891097309954132,1540645225411068,5104163354698242,5160325325427204,1883306435691016,7505674307494552,2887405562332930,7448024752431631,1814118463982100,9013164930507286,7586467174415449,6006028418963992,6688590052082204,2513735956150813,4134159845040671,4534224411662880,979010812860962,3611763202015779,7095014571945942,4894966286332453,8342107316258225,1729188591448620,6837019012753965,5551338971394606,452013917844015,3760429834302000,2910953926861361,5040961609722419,5446474236185140,3637213022202425,1259522514681602,6096777306792031,7228077656558143,7455222171714112,3787006737359968,1045068351257154,8827608513733188,3523956689437254,79987704382023,4689104140466761,6821591534152266,8328602541206967,4475477334655564,3067410791858765,1889791297981007,4068408567984720,5322606574414417,9116669510993607,7025045086915213,6659677961820756,2793089844357720,1125271304614489,6631464134980186,9094979629572699,2970460363812820,4430340049973855,4916985421484643,1439590350873188,4597631171254374,9057626374089322,4569670021597804,1494478600946285,8664103508363886,89466973000305,8525496742161014,2429288270746729,4821400422546040,2085918250089081,3177162077424402,1004620706534015,7406125158982275,4413386339627654,6172441611898305,1117264602786442,5412724151647682,5238325991672463,1396966693474867,5006136790411922,7703075926127251,4310983456486037,5265260134400793,3152588199846552,6481230181503641,4526856273216155,3545672137884316,4253178763887261,6488408307679903,2627940344449696,7315639731587746,2016679163142939,1186237668727461,1652455566897830,5663652953692839,5933533752402600,135393034402588,4500535921685163,8077066856411821,2020343516893748,7442475329401522,7983535929938035,2044247346991797,2912264992228023,8113330625450066,8348648835260443,8350360891189947,5143326630329020,3207808915317438,60378415039167,2073885644873504,5929017663554243,8075157434973474,4317983831065286,8483091066002721,4984030148805328,8660141082893010,1767849525993251,1563448413792980,2715678463453910,5895351909212281,5646759405398744,4644834818911466,653143408136922,9118551576648207,1580033656064736,2956125740380898,5441846297987811,8913980908404249,612459631170277,4447198327452391,5330066487716588,1287224183323375,5593481517662960,5445952212138451,4706193404512382,6348999048702710,8268929968020216,7357425928652806,79154056223483,7949117381620478,1840451770995455,2946488938281857,4075097623739143,8831685062214410,293307759844107,4578748100848396,8792876362328845,413785940919054,5481554530069265,3629291002895122,7908674072684675,8718130070170389,7704677599349526,1054275711273751,5127489177279257,6943126497512218,1300504386493211,1906772735918876,1920876945800666,8683545464674779,5072196046592808,251239388773162,497152178971435,150440999740204,9118370368068397,7180863571114799,5958310396539696,8363848866757285,6883706139687731,714694405620535,885983410047800,7383490596973370,5824798078608522,4264313248451392,7270547944368962,5267166088434827,39034603146053,4329269684898631,2090506758120265,7418089449595724,3073597626975054,1075043958593336,9126112069464914,3514528151384916,202103031626582,1380595904292665,4340345205721948,7144507632053350,7757517497877740,1964507021788005,7497865165023036,3802418303941482,8081066633892715,379653756107628,8580136266029934,7327565150008125,659232984585072,8444746418532846,5750361275085685,3135001589832566,6950617235891689,3974437427874680,2439170305147769,3598219982521212,8902012397867901,8401625192446846,748492369918847,1668584343051072,4278090677943172,4366419722453893,731854695534338,2498288362482567,272587809915784,5333586270317450,4250192010793867,7617373435337614,6962516688455832,8210223966297923,7591455912848277,5246123548898199,2994617725708100,4513006423851932,8263082455192480,6303715628297121,3697870177602466,1118919509873572,5507078447218054,3651172586578855,3147001637462952,7884858337205161,4364702169275306,6450576479017799,4395681874742189,5815271668153262,1908601069992880,2899359577765410,315268865262516,2580227738750111,1309665620693948,2867758479877053,7423993512512449,4278162006700996,2333481361980358,7698818978630599,9205393091786718,6744432996269345,3147154239203827,3929669296469897,7571139692075986,1527689071442083,3545618863303636,5544611548236622,2394415813764260,2805789493626706,883265817000927,7197613786377187,8132507938296657,3211110987899880,3689429510032361,4189553090192365,5350555326647281,8217474494227442,1556533368370163,3206124317975541,1060823881155577,4075482473804799,1969941769417733,1329166564469766,8109930570260652,5851798716328970,8387267156012045,1222383880604687,8961816181681168,200727777616913,4850981921555478,7229143454402712,5143489273005083,147170583428124,5855524488018973,3764687194645535,790654064985120,2418126448520225,7013083902301220,4154815498978341,3624246052604968,699102757783517,3593090483125292,5031087046749231,3114416684469296,5692527180121137,8579640750636546,4900581805020216,6161451051914299,467170594012221,7704172396776510,5046778326587183,7067723060898067,2651298661731398,3358412410164297,6362250025532599,2075779771468876,6135267517848653,1379548157285454,7118012639168734,4181496314496082,472032253574229,6716286728506455,540880812876889,5788326877807706,2042757503042651,2998221197220956,3169540776328285,2309243201922144,9114971915073723,6838386676890724,5474947324025958,6183994657211495,6727301883196520,1376950582336617,3187041371548779,6195355817827436,3171556555326671,6875423877790909,6990839388701706,6845819246845042,5187901924232310,8618105943522424,4235781659098235,4780176415622268,7073924535239806,7367310935398946,9198328797389954,4146160279934083,3232819629134980,5905231224501382,2544371227360392,5322002520433802,2628231161425035,5277264721894541,465302470372495,7135851497668237,4153421342784659,1540312648084628,3920674684394647,3329415862656154,4221823475113115,5611408740910236,1795715635543199,6987677723286689,5764523469739171,66754698210468,9204896954687686,7897615896297329,6810211446934698,5282851945495723,7804893704516781,9069150556764901,765875772978359,4535046787179704,6113770072569716,1837533424983229,5709006516163775,1838960946691265,3098637385784524,7823645116391064,552955381451980,527683205612749,9087426803002707,5159075771251919,2052858832106704,7784501631454072,469792880321059,6297460346930949,4268318840757113,1188056172174219,3094060545559770,4344785205300431,5070918857901279,2112213802902753,9005602502100194,2377424607290775,7128771960501798,8616672720866513,8273719449674984,4399994482969833,369499245411562,6042056660438251,3573475823172844,6622249050451182,570567275910383,1067247138215152,5454169691073778,2096781579850997,5615038250050806,5370745106134264,6338137699896532,6635324373912826,9182970227121184,4117599307216124,1440064159872554,4012140846466302,2166883391794432,2644015486018817,8865976484930105,6197147197632043,4645115293969671,3874679130076424,2018873126552842,3758920081052940,2704398406520078,1708382316018960,908888945192210,5922302214251795,2743555501954328,7725189339933881,9203930780471855,5667554861026593,3609776238564642,8812057437226203,8752071806827812,4181568995199537,7588027957026088,2277290711678250,6449639556661127,4218585492534572,4385494166398257,8266042070351154,850918761057587,329966863613237,8633895739856182,4122598182896951,2564593615848761,5930869980553439,2861115776294205,5234943150794047,8523638786856256,1386457056136515,5062361211761991,2405135808095561,5688522463096138,4929627019541838,4858788048921935,1351350294324560,8125769174003026,3567926616897763,7202355516964865,1987248962639190,8017098291406393,6309518686066008,6680501502330203,8178137748272479,3364332293508448,2282055807684496,896853198855522,3175948293156195,8611558589451621,7309780817653094,319625677180264,7063521322085738,9127293340278123,3673065535319404,2002844782261618,2209850578288226,5915515094523254,3731877215679864,5736973784173948,4101177121291498,1810193964803456,2733504937158017,4931271922198530,1002500276193174,1344498423909766,8504274081955207,6159584902313881,6035402791274732,6017037957524875,145076693646734,7844815092368783,8625333227380485,9154959961896341,7246054262044054,4019911281737111,4047195022474649,4282500139321242,5059174134916518,229739354590631,3244981624243628,124724284315057,5829617881185715,5429216854398389,5586064349939273,6410372882068923,7409751882020284,7206619084989888,1770739082872257,1794127634275778,9209524204227147,1210330967139780,8280307856141766,1217851987066314,6848076141327823,8969727571934674,5994819469727188,6426530345041367,468620098749912,8455408277401508,1022541550912986,4305687560529371,7875439475477360,4856406997425633,1848123976048098,455490147282405,9098813923404140,5620058134965500,7484787540505511,1389212279856621,6954467049856494,1830611976336296,6960387171864147,1819280158531060,8368711574510846,5381869512607223,3793613813775956,4041823586119162,7248071156819452,369157768830462,568751031799296,5102499362057730,8700488499688363,8501487769626116,9040625095319050,5931956914269707,1673554010523148,7483971843172269,4291450951892499,4306895014213141,6579032172064142,7287622131942936,4092422032979481,3567176523658778,7584168312018463,2958023290367522,4352016916551204,8369553900946981,2590282051065382,4699958768361000,3947151360867932,980834165894698,473082175130887,5482500727930413,8443773584726352,300812385172744,8768991265914420,2826428722986549,4072915558657590,5014327851210297,4511712800822843,3625714571103807,3878426713060930,3259658702069315,6441750141939268,7447683711131207,5825219713459785,2409840279301707,3487335213438541,5323534501080657,1845837113667155,5238555274180180,8871662812751449,3458791146288730,5262717747066460,4298721637977693,7249659962476128,4522373948296802,4445175106844261,5033505858907752,1882297645368252,7193981743679082,4096985620477553,6869368645336690,5627277066124563,6949652654890615,9101338701276793,5106497930608250,8909944273004155,5521230674065021,299145771413118,1192632080975488,13306890006464,1588109343624835,4235032164587140,1220400307789446,3166565117857417,1769445018494602,4070366731198091,2537487380643468,1001196601284237,2815796982423184,1216264555253393,3855680930676370,8165864252866195,797615135829654,6992732071726744,4194416405429913,3447937894743707,8515914895089309,3600219413003935,4048449310987936,223912658032290,3159752761460388,2350703927892934,9163376872275622,3085514994581159,8436333510076072,5746500977658140,287418009536170,1432827578279595,5332390274954926,4592941668822704,8680281739153074,8362039703764097,6437980416657076,6146884155743926,7381673105354423,8701099386291896,5176683580835514,4766700513111739,7044393658122186,8849683899871823,8886167084279489,4671475720554178,6263493700198083,8599816598564548,1296248454342342,1617332937576135,5319043952088776,9029912302055114,272350359316171,7281004667510050,4945003767830222,3223223636188879,5859894009587409,5000971237682900,439221566129879,2396041509228251,2024130444633820,80857262636766,3286701371021605,6858705048481506,6745962241930979,3510826732033764,728421941085925,4746761069117159,5292795240902376,6880471424544490,8728774733032743,8751613534081273,6051374124254793,1993003255219953,8538876453388018,1957225587047379,3840030970646260,3516222783540981,8215516250631926,2890490800047864,4419324504063737,4799705321260801,4613384163815170,7316447601633579,1492187469176581,8854944393594497,353157195998984,3258211975390991,6951624807428757,8008509496764178,6475544428936980,5544325936351534,8647717074001687,814631417812764,2394157127339805,3912204798107424,4075417394827041,8207114150879010,628966953463587,2071733380642596,8438475352979078,6310446370789294,187307144339242,4788406414337836,6083790178045742,2307574320041775,4532876642998066,3749791102222132,1652697002921950,4881617624346424,4012476262782777,3601446652716860,1339143413692223,8248966879860055,430448660268867,2207893604742980,4944170770362182,5033832590100295,2948798154096459,5294913715074893,6116060004975245,4016302710255440,681921309540178,2669633349924691,8929001777037142,8958220082990770,7303694905055120,7882602832449375,368151546179424,4774025048110945,8350040003192677,1607930457671532,1747771398453105,1031383124647796,7747014866028745,8343019957792632,1999886316711801,7727362345795451,1970831653236607,7359943690084226,2287904013680515,2799159832856452,159488153558919,5911673329315721,2041530094928535,3880180667858828,493683253919632,7265754901190545,2788532276903830,2908150875031449,5294600729448346,3314151215368092,4090374638159775,6109448380381091,7536197985687460,2746121921770587,7171010035299655,5202153282101164,4489980880689069,5629311925249966,2009354823049136,4339380780212148,1672563843819448,5728066511669181,6629435825731518,6901487045957567,3392795600406464,784713650704032,2224459648190405,8748586416623388,7225660297650120,2403430883938250,1441357170177996,3968836039213005,7120322138912225,8946307404822483,5080071713128404,3028469485907926,6444402771993593,4378057457211357,848657156116446,7741295275234556,6882877678276576,7801601576284496,1930717645236196,7368366257379491,8298197945327592,7110392114133694,5107935744880619,1719825264803821,6060645221894824,6040298245971283,1240329659639797,8380279870793718,6940869907483305,8100528757670480,4147451924205561,7058638927982586,1777148605384701,1376198492106750],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/7d859a1c0be4c97c9e1c6c8272950772",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001994135.1/GCA_001994135.1_ASM199413v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MUWD01000001.1 Burkholderia cenocepacia strain VC5305 VC5305_contig-0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"7d859a1c0be4c97c9e1c6c8272950772\",\"mins\":[1614537610731520,1672150108028928,5302385228963843,3087246836768772,6544638895792129,7582159238971401,7221594245603339,1065030908002316,4437497293111312,2942658332295185,2695560199139331,8461053839933460,8256712808136725,3274281873997848,6992820520050713,5325822790983706,1917285262999580,162170520018975,2050623273009185,2522890793656354,2437595911135267,8075628818997284,2421320073052199,8063456115990568,6452226495291434,2600839247470636,5800466137137198,2726924380233778,3281686287409203,5209097965789236,3831911202578487,2819152007031476,6188294433177658,610989337149499,3892921415368764,4145125431844926,3648310938304575,2424843473028448,4164847311405122,2124789101297731,7175418934280260,810903713374278,7054998715752525,796520298750031,7753124800887997,6653092889649241,1123524342415450,8124889703486973,5459921342201948,9168352883507294,6448143786967135,925932268544096,1069819280842849,1557511501848675,2063971994191206,4960018692939793,4557012712841322,8165362975391851,7875134968741998,3889061625749615,8121442865643634,1757088718610549,585402762985591,7304258221645944,7050576973496442,4132311197794427,8371755375403132,1568534674579581,4167586944556881,1422896266494079,1435299798801088,575856408961156,2732513577779335,2081841423646860,2217397217876674,1200452951637441,1370662573432980,6596118134740496,6559848870322327,8647656031156932,7547588763459742,9007418299297462,9155159014285472,8293421002760354,4070152053817509,7518517270077607,2728498140061864,8101441135468713,929177370255530,8906588033770168,2429590148145324,6926346870723954,5656539561672881,2863045633797438,8240780025749686,1557627327430839,4982372355367097,6231961140625595,8648258063896646,2806167036723393,6719775155232963,4844219392131269,714742554869961,2735604121223202,606236211405007,6470622112391383,6015299943227608,485925854844315,8559007756263648,3221962412564705,6327854971879650,7120012423381220,3408944217866470,7412613424528081,6309221806547176,6814269243842793,3130616572584170,7152939843952880,3862528046858484,1346654241145085,4297465589776639,7560205479002370,7061363329368323,6968428562210833,2001612306931975,8186586654941448,1155899137085484,1181727824208140,777177868498306,2957429633630479,7429009247445265,6412225171702034,989155982622998,2706431120834840,5816808074330395,6626690279252253,5508271522357534,2918064227189023,1092163991929123,5443982311981348,3833565833707813,5013212574408998,4607912911765799,2409124688625960,4152787541303596,1506581195743536,6440982810485041,6767305161367858,4502187607130419,1710344326799668,5041601047527737,3072858527719738,5525905391477053,4113506173788479,2610143287484737,7770301837558085,4170473453855047,2205434376828300,7133281382515019,2394933767635278,4146895668076879,4905845570347344,3031306388906323,4525422098874708,8727095733133654,7816450490695737,2697658491896153,4126043686265178,1104666805846365,7405321886908769,7383245658693986,1102998766231907,2815537110810980,5551636483383653,6659111880335718,7083124743783825,1645196984246632,6054565440487484,1670328593785195,5996102339428716,2987880499405166,4089087586599279,9050143858985704,5354334996742518,5847631713722744,6734563764748669,7238357130527105,4332702556414338,2028866277679493,1279349671846278,8428556121440321,2061156922745224,2381930677038217,2598796382781834,9050538099261836,3261596958302610,1690486567674259,2097401946210710,2642763633828249,2938051808879002,7742197244133788,3593322931175837,8520742491988329,4910180854718880,2080350017921442,5903890863060379,7524514493931941,5093126131212712,1476171609907627,6507416399882994,653144572715439,8450447463145906,415654275817908,5480198428598710,4003678694449591,4882717875495352,4280529556627897,5568233767772604,7162670000644541,3703664106990612,8620504325636546,4997443972678083,7911687458241270,4455816383742410,1002324843643340,6625294986199501,4598421568045522,5074372244267475,5530550353822164,7426392605399464,3273824494811897,5807395243491803,2695616846333349,1637607663116768,4572894235369953,3129322524918243,2085679239545317,4566741199622225,1853610753483242,4190979559875051,4479021552697838,3871166221484527,3817132906357238,3013708588368375,8756563961390715,6502920004895226,165001748636158,4573016045404671,2724902338740737,4690664590008834,1151687145706923,9080896950702843,4108865604092426,640064740131339,1856172365193740,4819569272234509,7778345845474801,3922837610906131,475077231338004,9160446607867483,6885844609496495,7347106073342042,391082155532834,6087067386392667,2714880937943589,1115908107076135,5769509634310696,935851241742889,879495197262379,7302907767405093,1918149086159405,7101399017398831,1261831761183281,5966832497066551,1428893762077240,8978031697379897,5859824214663739,1912247307239996,4549188140628746,3088285529702975,3305638350479938,2708154468606532,9205633535091270,3924223948710471,5939633418281544,7597940190720859,6415861952677303,94625746182732,3790562278556240,1196686520926801,387450601521746,5021292478480981,2501889043006040,4516494041023065,5223725729276506,7013127881466461,6401835207844448,8543932418663009,9157008515659195,1584909085786724,3490085864356625,98506038100586,8759139473973867,3821992780620396,3865727440233069,6922827819819631,5039990850962032,1569367260996209,5678148989643539,8455757768082036,5336768755810935,7651702942147192,1996714165723769,711591039804028,5331538257052285,8404176944022142,2700824262656640,9093883890924310,6660872172419283,5979526711042695,2058721924645512,4183980689072778,2526575982117518,675280428999311,7750107365163664,6178695426278033,4359720546378387,8055547679040153,141198542742170,6379590884213406,8443467842060960,6136881290961569,6112750771315366,7467614261440300,5080585812624040,606437243396779,1408206293967533,7295662568972974,1991202418724004,4895940389694083,1841348389989150,2663099079492278,7833647334941368,5420979304784570,568217907126971,2542571753759420,4805506853102269,7887733102330558,8000188642560468,4262951371662017,7068675328155027,2013196533449413,3933313496343238,9073926985832420,920247153263307,5232429927473869,2082408394875492,4480716530516690,4807527188992497,4492607295685332,1261515757007473,7210173246315300,8162422224380634,3205287332930267,1859061051523804,5427761958945501,6891320993246033,4421429037122273,7738045422398300,9186784730681637,5921985229759206,52417653650897,8686884331791082,7650241550680815,104608920519410,8118582766707443,6792828604850933,6727899874296567,6049564133917433,9182966685065978,5390195707880189,3605247459915221,8572262789361472,8523529778250498,1291027431301897,299154217452298,8873373041083863,6921271185695503,4287719927964228,5819990282478355,2029007642379029,6957592405416024,3339632273727620,9177528367522588,4942139468366621,4611075855909664,355641920447266,5158551945093925,3059015816113036,7374517579309867,4328546250361650,4735510500000560,5637286539972744,8263906419473203,6057641478578997,1959703783129910,1143361036419896,2781150822122299,7751700126532414,8538218053903167,7149862979653911,8813873102675629,5969665994621764,2786021550179142,4599762687968072,1690784253272204,5240006971024202,4388966703358795,6400237707789135,3355669233533776,7288557509981667,7187898775397208,7049598183695193,4827604335636623,1153824062063458,5011568025674596,1464770841314149,2632233125962598,1700835365954408,7210379649235042,1156983965504999,2936451013641070,2468597993128816,3503150890779506,4646356380124020,5293625080947573,2402255485826537,6422771762733945,8001890492214375,7438682147128188,8063443016008576,4957438499685249,7410159519482755,3842344821752716,8592563933373325,4114245049918351,1013578542744464,8339424635446162,5827293538935703,7762833435894682,8060723739530735,2940469825561501,6630308140573965,6482117240808352,3118530775453851,8220255062895430,891273925026726,6963130624266101,4303169809425320,6736021616092073,54219156603818,1708837289984942,4416448424756143,542447409513392,6599218441577393,1145634363982770,1840087701382067,3737203740558261,2245969994605494,6672032474367859,8052873113493344,453378100868597,6294017726907331,6050157320651716,6830241319191958,4545884949242823,4023195875943369,8972609856541450,8111326798947275,1251952865600463,7505191747154831,3086592211821522,7418143818982355,9177733065673134,4458751773900287,876963832390616,7738862114759644,8195800481170225,5447303091085477,244152382317543,38880525755369,1519341895885802,6054515730998254,3502099098059759,91489123795954,1000694516155902,1300017045488630,3148462127203319,1905113439224825,6654507243676669,7307782649414654,7221300853082965,2614045906368000,7222746062668802,8634338704909317,3971081894749193,8571652676051978,2994249003926541,8457338710180013,8614434280543965,6561201550117720,1965004403090450,648383121499155,211950148502548,3158189582967830,7661845883132761,5173201839457304,5115156108641305,8725523651781659,3076795960796188,4684652262843424,6083967426929700,6211922990769189,2161092539472732,1903072943154220,1230046742537261,4163592935482414,2169288118002735,3164163115639856,1868354275911176,3483470182900788,2365208034763829,7086914490483766,4890583185941560,577825075291194,3137555451094076,2449266923963453,1637381425341502,6575621535122495,7437281864950848,2350506847888451,6015697091093575,446502856410184,6624036131152970,5681078989439159,2968641292026956,4784889905893323,5154568647246928,2747975172334673,8632423660427503,6377568946250835,4479073447715924,7753253644928088,957221810291802,2423945313895516,89577224438877,8178742531613791,9064939439809632,1590044764657168,8174677043773627,1637258304037988,4776680771011685,2609674962895976,629195314840681,751388394883943,1649145032631404,4870579255198833,7148929416438898,7269166739809396,6824047992741815,4061662781203576,6002087519683314,1881610704143483,690991021925501,2105460311082110,3627128253973631,2613109152490625,6946672159474819,4485682903581830,8654805441765569,9027791965936492,2800498540148247,1606672777143436,4764003851429005,4097074318386318,4960545469088912,455819942102161,3661052031165586,6874146184709269,998692291347607,8363001978692761,8419813948082946,4211090444633243,6702208828520404,2732766854341792,141283939853474,5048833823827107,2703084393364337,591561420006568,7638641205504144,2824410613671082,2243061746599087,5515751417639112,5692287060264115,1203074833859764,8687982128276661,4617327249593856,3630541163488440,2438889518295924,3056396770665656,956186360849596,685018371343551,3958351662261440,5686163242124485,3732827618018503,5198488909595848,5694361893921996,1347704846271694,5169235559465165,152677144323280,7602421112333521,3839975363069139,110127260181717,892688760587479,1372545250378969,2239461176242383,8629795519251676,6274840073045217,1213900193758075,7935989934097636,2456829891064017,2171350686926058,2383179160409639,5442844907349228,6721482624877807,1053493683553524,9199653953373430,6763234437825783,7331098811808351,9069881699460347,172083924387072,3351687133168903,4492442407978248,3278366433936649,2965798370657547,2786662825608461,4576193785554191,3509821627688208,2615160231920914,5927626260790147,3457804445746452,4012947018847645,6614884399446916,2758182991406364,6611263164032287,985741521495329,6716775315948834,8600402297763454,2210235354113316,3384973147325734,8312122667489533,9161690128360745,5843711574893866,5279384702543147,2166308725318956,729335366952237,5986234768876846,4988312095212848,6391330335305951,189412279682368,7306826391758146,943211545126211,2231343460377925,4043099467220294,5256899772616929,1188230109275465,6120722478245194,4839776492234295,141541439407436,2189248013845837,9017309508034619,6510732175238479,7770790264194389,7928856206091405,897635817571675,2343826887951709,7870220372332773,747154289370464,6175583378023777,6455616364864867,8129010775180644,3777686350636389,3608412664538470,1794462576158055,4784390951126378,6935897709167980,2469804826584429,3399677097690482,175552485033331,8926448384114921,3264008281777529,3341864107885948,7015668566752149,2814330431341954,5929443408889219,7449694451664261,2736792718394761,4027033497068940,509348991703960,2540128823010707,5913912016307604,799691751769494,2352316875752861,8276342076499525,4045323850641,9075354206676387,888772666418597,1846956913026470,4281577013896615,2409627521123752,8008744242314140,1936946477802922,2806796943156653,3729314773910960,449654477079985,2982963372287410,6405394953807284,1057373204366773,1345117300180406,2604782269597111,2851423704237498,576358567617979,7370221089060426,1273814820996544,3526199300810179,7438422636086724,2095552738092485,9134751186953671,4363910878253303,1221068311037388,1040561729201613,1699283322578383,6657425691428304,6139469117744593,1642003627582930,4634555992770004,1965271449494997,6276832963280947,3799762072110551,8017734892389967,7395980098020829,8470809660311007,8330289298090637,7775122607015396,3183743191855039,8730727895336422,6821483374773735,3371259923899882,2449235271435758,1937564903810543,1109394295421864,9067809396201324,844243405719029,3339991024496895,8466028435917738,951771587257854,663588107880021,2965861985262465,1288477431834115,7510350808737771,3307032875394566,1917733736351240,8905536803931657,7326657808815212,3096564017800716,6650175745885709,1203381103093263,222775189431829,2356568300938774,8859044353738263,1773560476927512,3393064791115291,5560750744151582,1338123295049248,197751211492900,404236567602728,2106503335757353,7030853360084437,8650930768201261,1162420411360814,5762020044223288,5975972697212465,784923912120703,4079100033687817,4931159479510584,2170736368830010,1589337556379195,7241541984896574,6868235469129280,6490401263347265,7800261959910978,7323382353217093,6075361567802950,3116200582866507,5523328205383247,4321696411625042,1417157199197795,5899964889744981,3273225690916439,3105744460219996,3808949874222685,2388722154333793,2102295291299427,3649057621829220,6676730175477350,7696169689667198,2008208105948782,7396477899444479,3608737233962609,4798397407241845,7432622362109553,2234113937041016,6340588691195514,1654769850500731,2310375271884413,2173956859528830,1231318611224191,5513131114505859,7191774476523619,8473260738184839,9159173750797932,7519167661606538,4579704270186123,5288885324293772,101621870290573,8361082902708382,1111384226170511,4317325934773905,3201024108521106,6790909482518163,7434121498231215,7680184515171856,1891612720563866,537989168367259,8943709038399770,1234649699437509,4196636936177313,8692782664492706,3126113182017187,1300789673354918,2118660288255601,1729051134641833,6632539871102636,3676249497994925,5970042484057776,1545694293976754,3883637075525918,8405384779739203,8162344476780218,8668491884712223,972821992695484,3360850274769866,7312277942863550,4608855243998911,4667064325220032,5277557044366284,342727268837066,7750467428217363,7501012062111439,5941871404410576,8044839906707064,3960190793033427,9026580072700031,1497319534462679,6531828854800676,2965879257908955,7026400374146780,288055513761503,1247381176157920,3669867576862434,5819041392735867,5210854402588966,1223263938209511,2795672857331433,1641554727536367,8012878182078670,7469768091820328,6259496447231730,946061110754259,455293943654132,754642686084853,320012604064104,2887807825192695,6099006449829628,8951184098543358,2655672131430144,2927815048103682,3777875745220355,7742776557455110,6766101346764554,2828825160853259,4757551934088972,45379880560397,8395846057365805,6982767085591512,6034907114481283,3117788092065558,2919439772772119,5693128930010908,4122851247172570,8359009350983984,9013231279889371,4921672541390628,6839822404986663,7967872432865750,6191751289390889,3210951938033451,6947082668377900,9058230815991597,2886301849896751,9223224001038129,8787868466399026,4723860840392499,1402628603086645,2368585395308342,6901936384063113,3920225869367096,6340427929372477,7587616914507584,6240687561041729,7863573147693450,6872436244457284,3603361977542469,828294727230997,6083760022472520,6530167944152906,2687014320539470,8208688046888589,6967735546341204,9197949824354133,1993656352565083,1262176102912314,5438258273675103,4882752350873442,7455806545536868,269080314177384,1418269455574891,4896617881692015,9125018268452720,8155915322902386,5130882108712819,1171119649048436,2140609534658423,4889045348886396,3056864128969706,9040164183833204,6942608797942966,2350892058079641,2125212345296772,9184635797579655,9061006309402504,6178405550868362,5715113388902285,7476257208747918,5751990693717905,7817861193828242,3772013584934803,2708748101674900,5142740668499861,1782011511900054,4128254644037528,1653698795235228,2002468729997215,6947364334782368,3325078434473890,6437213465487269,7575956444735398,4761801376958375,6635590972082091,3797146798614444,5546250580401138,7800001604831150,7282902760425394,5149392396820809,2053379540191167,17164613273536,6474460311996353,1980514067875778,8829784708712389,6788281590271322,2658598260238279,2719180598626249,5094659977684938,3927616145098699,5598315969357774,812563071059919,7253512745469906,5074805413283798,7681601397204952,371377719216090,6748140428003293,2728367361670139,3079352913663654,7997909880831118,8875047348802547,3252049322624679,3411552196765677,4592127144757230,7910339615303663,1659436351670256,4867772397692914,2514811790460915,7250582624897012,602869786126325,2270858790258678,7666404953073321,777131553196025,4288956496127994,772022638209022,276739703171074,2935014397782019,5380541450848261,6325893269751816,7618457168939018,2385583767758859,8586952495622156,736604600543245,5323465693644817,6120023604384030,3249737299016825,2580668940036120,8942024558536729,4673870722803738,5618035857684143,3738478347470878,9190887693712389,3986655284348961,1637476480239651,1272906355239465,2631337264924710,1543578112100391,7675208516487209,7645387610834986,4388630508570668,4097007696742445,7948528586090546,7178543189760984,1489457220929589,3034248738482230,4325325905871992,5250728761010235,5266933324359740,2146041819744319,7140016743458880,2055068231745,6078016632318019,5415150671333444,4905717077391279,5880231427876936,6974129399973961,5491117400000586,4561263615879244,2184323845130318,2144073799002192,2278941673541987,8741898268713316,2340464060139610,5731884010129499,3995627975903327,6101593543034976,409664784500833,4986996138477668,369616012396645,2568942716004456,1535941278054076,8505537077528151,8489567939569771,2359891978831981,4943301193623664,1372125646547057,2403217336944754,4911404480678005,2309369730394231,4125685640014868,4463761225205882,6438282721290365,3899518576986241,87364483164290,7425828192010038,3531853126248581,6206015793825927,4332785493330056,1011835689871499,3068441247705232,7739399387605139,8789068481122833,6179229861218456,2852185127774365,6407665131514014,3511968948152479,897161019590820,6298876334696614,2569125672167591,2174254532716714,5684853884966599,6755711870265516,4758913214048429,5474824782530735,3664378460088498,2843850216179893,2351832720468155,3619763970541757,8809276713027774,2238109128506193,2582436032972995,2307452507801800,1004827258955978,7041771287889021,5033259667841400,3061037491054803,2233668606601428,9119004498856151,4314720941615320,5019505672880442,1946241375867258,7970469653965023,5154976779012322,7890520767916260,5601082675382501,7224504642731150,398320048933095,1153215262402793,1015191943751918,8249676288926709,6334754010310897,4524955558532819,391097988155636,5469093066805630,4696343092324600,5937160160245460,8403451250315647,1595255301966082,312345383667972,5003662713342214,8408207457972646,3715878359410952,4548126646216972,8498450100371842,5857981888014611,5109454350960917,2190996617988374,7628945084893463,8328213530052890,4581953976912155,7514044585765323,131314190829857,4365819636352731,3647277899213094,6780406244100392,2005055820581161,8951167238459551,7709828025006450,8226825088731439,3595672273054001,5097884203510066,7839638354278207,8841788987279669,280902001658167,7570262504282832,684811601150346,1471899080345593,2368231130048831,5612129101272800,7412950742281283,8929327226382660,4959016217618758,1990792161290568,2973638785534284,8619591445568213,922312794785507,1045164994627924,9074889154505864,2423985345735004,1642004523526493,2346816835701086,4719596963695675,5847195776264548,5976566502041960,2786506959415657,2872733471746418,86103110125943,9062380893049236,7985654775303231,5189687344531839,4797975833373058,873117257738633,3725918947101066,6108119112438167,7030967481919885,6456558000032142,1857854142531985,2782177339877779,582681510226325,5780645786243481,4641591563741592,1949926047320475,2023211783929682,4499537453080986,2332397557742661,7579791692291142,77115537967528,317435687389609,9001039835269546,6153605679073707,4289540466084268,4190353852058030,571930359663023,6097544641128880,8003930329426360,4552464949495540,2272617943771579,6532370739498058,4648814387931582,73190509135605,557904017844677,5346859864385992,2733835806886345,6372542351043018,4344300827199223,2240496120867280,4661453859858898,1769171918055891,7143943968360916,2377071783677006,2194072435657175,6394835830371777,7696134351483650,6771243995564508,635283561639615,8490927764636069,1246266702031328,7801675119086049,2292526230096357,5606570471803367,3907901373229544,1667675968309737,7802134617089073,1243514657253873,9055211627301362,1926788108790261,3247322522020343,9199852752450142,8894531228312675,4032100739787260,1235734979234301,8008287829682686,7110233202436607,5853439556006315,607450314471750,1067010708924934,2462646815984136,7699752695583148,6724182249892366,3562057833955908,8327253480294929,9062851373746707,637660066023958,7837228851407383,2887597512059418,4233827205130779,4841592301799965,5049646310664738,4992011376273956,7984324206234150,1011281604774439,2744230425045544,3138947886934569,1110299242007082,6339962529032750,6669564752497204,5635645777627702,5583912419918260,1903090973507978,2960381230617013,1578166976621122,2073008188467779,3169350775704134,4100017446955594,7628659651772855,6691585812630096,5183504073515448,3088156639685203,3433399218186839,173939705719387,4974730440854113,2888480963758691,8330253503015528,2957161323833961,4488133838817899,6748405247978092,5566511108180589,7936030020976473,263990615098916,3032402879670904,9204564616374907,3261933473090174,3399336709105845,5177467022827652,2467331571059331,5046588049795716,1833635757599366,5711382317664903,861215347018378,2879268609305229,3561808329992847,1690760237050514,7604508097176003,3601406212672148,5913856269812143,2286293644315293,6379850001738398,7701079339403938,1819655072328510,1498378649176740,5035561338063527,2382191930485416,4648262656936620,925372077525680,2637883977525937,8005434341878450,7821231476229227,3943329861970612,6499822441138869,6113400371907255,3988439205161658,8591523908160532,5076176255298677,2093438333135554,4849930103335619,4722281981823685,6328112135465670,6459532547295943,9074443197891020,3383085468081271,4235225316759330,6949643275782863,2573801043491960,7962694725421778,320134505049373,395769760910037,6742944180857558,1059213505113209,9106348801472794,6134843368237788,6908139826490077,4057165757901537,6796971400891106,1270847587748987,2393301657234148,3089707609787109,6522611935769041,8526217133418186,8713134495189543,3653613554739948,5063545066932973,7405766874011837,142723861138162,1054414979009267,9022392562592501,5703243426900727,8265316701702905,5350112210283647,4820282806020861,4608945585302271,8702460329600292,3941825046227714,7335983176567557,352419337718534,3350875981409409,8517309284510472,8975529215910315,5485059782069003,6975549577358466,8535471530017335,8680197411433231,8072855275957008,6651037694458191,5364756243942531,20201782299415,3668699505969944,2593529540648068,2484418198752027,3056430548085533,3492846169901854,199257435302687,4661495910148897,8710804292651810,6957807903329060,3550996153821989,1320865318130215,3687479900457770,4340576266406699,9104790413859365,7252897590238344,346118179965746,6214967160466227,4113161430633271,698528260041529,3675750674852666,1185353483799355,6845953568910140,3615987315329854,8051696241301301,4503560990559040,2997711861927547,952769130326852,3509823206643614,7983403835294177,548849466461324,3733449347754827,302066198367053,8639237608647502,4362386372234064,2597956802612049,4747069287648082,2958453031512915,3145107514111911,5781392946875224,1527809932274523,726280128039772,9040069242268511,1970804694297442,3086506620439395,3501710303152999,5767640044661608,6158086492097386,887957931879275,6059412828949650,6825199301946224,4156637680659313,3159370071968628,5945158980683765,7548479407213509,5206502887541627,1694071120300928,4909149337176966,7421106594687879,7922374037015432,8480707396463499,5681663176674188,8832261089733517,868182253185935,1282198364113808,353304353057683,8344085225939438,5628039062571928,2698804543810458,8667882863641071,1836000417196956,1373194600090529,4953607696837538,5732395716610983,740570829933480,4253140655664041,5833089329646506,8059925319583559,7617702549449644,8660618065980336,7900218845189960,9022061139627304,7450232410254260,1090440669260732,5291396964944829,8600006966275006,8419709459939359,8297456545901508,2015293325986757,4914791658515398,6205206238923719,355902918249416,8105763846369783,6080216922541004,7280711856209919,7103307539606482,8253758395222996,5138228773202351,2651943715032022,5774769961906681,5346542619970521,5271439904992218,4432150208973787,5197608659226141,5117343861115870,4028209910688740,3886615632365894,4767007701896169,6028496172387306,7239428770966508,6123418856885229,1739087401184239,5683544659848177,6042075859520502,6632615762250921,7596792238700146,5457154791377915,1493010707450876,1419519805123583,2035718490164224,2831743867071489,682181687135234,3849190536580100,9209575370899969,8447112632028174,4556599988169748,6787253846608917,5468990588546070,7626763792755735,7163739606260620,6132886117381978,7006418510302238,3215789559589923,3548018666597412,5136236529626154,280868610100272,3157439894441139,7690870239063093,2001808589073462,7361393259359287,8061815440485432,8922844421010347,4487405740248123,4236638370393150,3305565156641855,2638422683651136,3794031194942530,2809708619123779,6491994540936260,6899610244312133,1984463431511113,5060924345093194,8090112147639372,474785178324046,5175844183510095,24507008691281,508141284846675,1408998423448661,8029924307807323,5303442668694620,2336139953589341,3674281531534431,7741093506690144,7812692758719585,7322998181637220,193871665548389,6278817727402341,7627446566183343,4600713349131369,7096400650841523,6727614812740797,8879632990137456,8548115136187505,1729791529020530,5014462078169619,4223049384758388,5197220232457333,7187772524145782,5092708644326521,5817468748917883,931163353820285,948335633345663,3408827718503553,5612235077708930,6207961188042603,6880946799520900,3231029663394949,6707200979872902,8949270748490888,4203057732851564,8967820209331329,4450323842034827,5900172078034060,7965764409405500,1493334280875154,4849467026115732,2212138097167511,4352764993326233,8747159028197231,688891378936989,8070421195443358,2144709860895903,8754038805432424,1835501408447649,7736125898937736,817969798761636,1914294277015487,7720726598585510,6315768361069735,8636456568853851,5424024470588585,7628555430191986,9070058326453419,8580312369351855,7637483294543025,7428828812020914,1172699110698163,2009175472868532,8848495432612570,1439267622948024,1795662577609915,1509529349246141,8829000954278433,2880629035535563,5988658802958882,2218950140857550,5468968945765583,5033663355718864,4331851528842451,469185143221463,6236166424186074,8560909981043933,671125928463582,566900265028831,8373079604044999,324703527767266,565535923402619,8062232152509668,6551675476435511,5862534085496039,412001184293415,9048072178925160,8084792698219259,6968874978866538,2042512034458865,1628610150870258,3694387872746741,7797290409255270,7683723037805815,4062501726735609,306401453354235,2345199621529003,2499308565196030,4987600035024127,3885196415388928,5499072650276097,8869906913124907,5798543140678916,8863700228421421,851282137296134,5152903062121736,443463269379337,1046998176984332,4925755569685037,2181044782910738,9217464612230247,8050990746283286,7803402425610475,4050287013522712,1125999054753051,79699745934621,2446219976797470,4312953017560351,1037060564987168,8193474416274723,6812752260604465,3736250020130088,8820042723101994,1677131078257964,8928309866122541,7736373707713838,2699443194465583,2964721868295472,7966097874636081,1559921505316062,8888491241360694,1596240468897080,8958784952073807,7308434853961457,1588861472812350,7172038306135651,7509636293434592,5510552787168579,9108079981571398,3465565692906824,314047315291467,3927139144699212,7034138290818384,3619460285268536,3579724183661909,6821164887248214,627251277434202,1872402921155931,3416001576308060,2471245836512605,6496931895975141,8790296090447200,4762469329833313,4987998429038481,5264547194020412,6192386072472938,1169368871783787,7369023151426925,6573599533452654,5261484006736445,4203021966249334,4046970109308279,944340191070100,4991836450999675,6194760837746044,7556566314676309,2862122298378133,5169314628701568,7811939728723329,473950073490821,6496953725358657,956957857566089,5861506159357322,3155489944890763,8290096049892749,2630761244994958,7326245993966781,1834061071388050,2454713943346579,3788145007496597,3776533833952664,5062678749925956,7342911804233055,7707309717712285,5990738942848241,2300833108061608,4762019887066537,6742649765236138,5240351178517931,7482323318566316,3879810226350463,4701921009208752,5018851759091123,8730020520660404,4582507293628318,6276676513205686,9037831749985686,1930766082960828,4524701050990013,8113084776181183,8210211485535680,8758084109348290,2972465820095051,2399160121863624,3582584725843402,2641785685880267,3380954723551138,2765340567137745,5412924533337555,7267071274503638,7585280946810105,7221755192180522,4507346595196378,6683827965365724,5399516908797337,2684465665076708,6252338219781605,4347236673416678,5810056290651624,5411561210012150,3285147034258922,1633791459194791,4886551688801773,7309789385387502,4178020841229807,5531292192337394,3937695098506743,5101261578685946,7745108651445756,8885752449019390,7693839588601343,4820141850897920,6028005386817025,1340400822193667,2123001799462408,7266611884199435,4985330454367756,2914864975220240,8078236694597137,236177519775251,3632925254151701,1242303547228761,2388331324517913,6261390931422747,5269595964498522,4510903947636256,3040787833974307,4979769406983717,5706457645665837,2947070356393518,28905474592303,3943417593408776,6306565012860467,4364471419891253,5702006865223777,5812676622896703,6815048272260673,4482894762094152,5124328502848780,7601347088885687,3666900911738444,5093098261007952,2444037966589522,2565317758291542,898227444051545,2051160033144411,392672773140060,6740809790160575,5018586652061279,4963753005264481,4286237859573347,5107281565094245,4149562967486057,2146102923120234,5052325143932525,6590882229497454,1664521960746608,3609594376547957,2095028410879606,3497379525095033,3467782324170363,7248414590411370,7433604467948821,9127014030405248,5776242108345985,3734919291661955,9004137612013188,3929439485398661,5291557173939848,5026970587844233,8410691601005847,1482072318316172,7145481067255746,796371620130446,7078679415231085,8614672042970772,6528691756625196,6127724171243160,8752130752780383,2305730430938779,2369471350058658,3039356584726180,4666971723017893,294931974418086,2960555197984423,8381931844521640,5139085716827818,4359880691019439,7342578950180531,2689941626269364,5696309094960822,6336083386461879,8098528650581470,9039777762018326,992202238946591,4481102823771839,8831852644052672,1411863690702330,6545581800353477,555088903712454,7413896351706653,5735227268869833,6181134668132047,8947562244608632,440713883504338,6744734843039445,5043466900950742,2106843462643420,4349308845715167,3277148409655010,1971493360414436,148701669977830,4966776944742122,9105846799830311,8779164904935149,8520044777303790,9142167031063165,8305631710842609,1238823616196340,283982704619253,1242468561432311,1016367135338233,4597701851041530,1685881328324347,6614816531009276,2182594501799677,7869481211539980,3085358238879492,5366431696277255,2605129737326344,5710883584068908,933208036511499,6352042878717887,5375032241991445,193121518120727,6774288920506138,18732863872303,3853268222684957,7584549143588638,1237405419949855,3442648713105187,2561437052145444,8961800998137637,5606887811632935,5243760237252395,4651402976579372,8536329215436765,6859318390812464,7328370309173042,350350933569332,4502340056239925,5292592593990281,3465881593237304,8311782679121721,4256337938640701,6036110839025470,85997835956032,3417382350352199,8616475592191816,1524117192167241,2317702091648842,5606967888285516,6471181766930254,6557880616398136,3678662341390163,3519395568045913,5636156466704220,9212964110975533,4659923055898462,2625304032333664,6877613246639970,2976475747888995,8416898044325733,1588716116496233,292505321869164,6798136647913325,2336885327531887,2271562067431281,5100503628902258,6027842251763573,4181063626207094,8686424476381047,113061362790265,3488424262496122,2577966744514432,7443211999907715,3538524126416775,3921892848045960,3959830538235785,219236611633036,3660135151873937,6503486718046099,1371164090412953,4817281208217499,2754091536936860,6858661135917722,2514863848558495,3383287691202466,5475341906046884,6554639561330597,6720869919248294,271182160072615,1761971770421160,4656566591016874,6322816304410540,8686204816813997,7049136431845295,9222584821721245,2084002355750899,7040426626518964,2582512639160249,3050412367513589,8821615927087040,2532250175795137,747841832878753,8675425900924872,859155304839159,7575646237511628,5707214414481063,581770953895887,7350361093969912,8931413613203412,8810154560311253,4242795623041017,5528574457171928,6764354507927513,8442153704624094,6797250261371171,8152803741888482,6726304222482405,6450061427888102,4464877358567402,7262963051122668,7546500794082737,1603446696300526,4116447160520687,3885251530608635,3655068606189564,3973595104055296,1853343804149762,2581496901406723,7338423162671110,7566446442197001,6351250715750413,8205752989569039,9196101431844873,1998413448351767,6519481604568477,5476476049805337,4843826029301786,6873644207984668,4738273097437213,1474430101572675,4776199751026693,7572560207507488,6152396138696740,1608152661372967,2313309056487464,349553107754332,6535452748091435,343364802048044,1164865872531502,7441259713121629,6877696121416455,5564570254331955,8523072687029336,6848221167267898,7913183053148219,1978335322034236,7044540591162037,3850778536251457,593820060766275,8338227623133834,4025824887476296,3855759339728969,1776584670376011,1777128096223310,4333583458977805,1544921946771537,5602117496934485,875441037291607,3351112087154778,6192197919608923,6820990698008674,3204056930447460,5287741679227177,127857660260458,7138118357454955,5007469654093933,8041123441271485,769782478286961,840703485718642,8659065582792819,698897377284212,6238718647324794,8058427711484027,6870054959116414,6422228705400853,6168455864987778,1753819387482243,2713080551166087,5084206025109640,7886243107254414,2673523179942031,1705378037745688,4430437321535634,7251306974831300,2029025063751835,55379056603292,8801636934318106,2801471415550661,6504458401714336,4565594008563873,3276326414377670,980192377581737,4916589622456491,8725879140012206,2064587266019509,2038297771430077,7605684857884862,6845204474204353,6914857627939012,1039991660531912,7533388456317131,6576975952974028,6832232643670221,5301957234012366,4291580079301325,2435279479320785,3893586245218514,2939473656516819,1526345055334613,1972685271175382,6963409610453207,3634070007099613,5215414646051039,5759428798066912,2956854919672033,2875303982846179,2419729259972646,9149058320183528,4355396507700604,3093615858438379,7894624690540377,8006418362142959,7243420463419632,1260909555773682,2181769529938163,3693750442655102,6804991505894115,3656787473281271,5560658276118776,6596767048028884,7111747293720826,1382936854655227,4651385934731306,758940446975,575094242471744,1570620541866241,2346890548678914,4532484304548102,3611936218296584,141573834477834,8273400317792523,8208807311266061,1821500921237775,7355026788430096,6878792237904146,2787309734303790,5813299493114135,587745283526937,6803075734819098,3739489810542875,3608801200304412,502786269974813,1805752905863454,760482496163205,5364901516758278,8716945696412657,7142510722881471,6505823886807334,2591581096522025,2534827634544939,4019770218975533,1003896942473518,6074698955288880,2122546227810609,5225176670689331,6486882311785865,9025187951219000,5547133200199993,1679913919803706,1368628686945155,7057196333846845,2952650566502453,3639607892062528,792948880003394,4388256950309187,8118344890184005,4506172228211014,3010080163017031,2405749237240137,2349671849111882,1314099224670542,112918284071247,8666873566818642,9183550332227923,4803710172090708,7890423709309898,1118283659882841,7514903742755165,7474319694926175,7452137886085472,8640485855007073,5884929902211427,3101487011172709,7994704658035050,8352076955644647,388479971701101,9167914952632529,7121268197642607,5894595848810867,6745763342713799,4065275043295608,8466981194903929,2817927668683130,1487312096145787,3738405333537150,7375388636503445,7052560115890259,6904845135372582,4189958039474567,1455631797744008,3153365806420362,4138500614148494,1351061697556881,3513967706249283,7333591203410324,1558242295574935,2174756775358873,7953916537254298,7928724210065004,7614504677237338,3023610023842214,5299841256267776,8773140668338601,9047348364644778,3885083255140779,3030125807694252,1882243686871469,304363513581999,954823528690101,8697630382954569,8865657232478649,7452695715140027,8422171471737276,5723406805562795,6849543518687682,5109863603532231,5433210722947528,8522323267177535,662461683855818,4773866038497739,1582947606991308,3153248332616141,4592976982995406,3164349085526839,2086970340102620,4357491504935391,4043253348202889,1415250829210083,5212597614178788,6165100253934055,916854035165673,8929072013169131,3130138817130988,2299507573453293,3142231595979249,959508408947187,1843603312529908,1969311632956841,3441530410381817,6782834221560314,8265515526779387,3376284453220864,9159068940292609,4856298444141059,1725192791980118,5342551199494662,3030697904394761,4498457579246090,2076200396804620,1495865702404621,2735749523804686,7862369531343375,7042074034491920,429248776352273,5955388162060819,7369146796528148,7383089196864021,3600681234671282,955196551934495,6158061504164385,8444135168201252,5276416511712744,7154563251208858,4780025136296487,5146038954316328,4889713629475370,3805027276542507,7449466434163249,1147602152346162,6608493796528691,7987400648663817,7627047993355612,5344811152290361,8605767103801439,1720601757016842,5079839170949696,1074501000759392,5514422629044804,6232110969188935,2728013856420427,1555244697514573,8214658842824651,9210235279290960,2786693659333203,4164486549901911,7001593542674532,2267818010284634,7807632256377615,5394210944283230,126520875956325,7014324963627617,4005260965163619,6490369266340454,6702732956890647,8504826233261500,8634759183659627,4748215136088685,3121484321346159,5438458729908328,4387609538769523,1800793200480884,6719663477052023,8905100871027849,5261504596611705,6660590580019839,1141086975677058,6245184364745351,4135249969304201,619856461460107,1906599735366284,8457742131054644,2558772643000975,123065687085712,8811607590302356,4894902416675477,4040173613470358,517822103384727,8556306507404893,8130826713838235,6813470215115421,4079953784959646,2988906144215713,809445550723749,1601377167962794,4914243750523564,7283234665629810,2798790381327023,9215772636297974,3948498253312692,7456107352863414,6582216659251895,406366861537980,1391129191469757,8853477888544463,8063585875612355,8086385387442977,7493755880163447,8381275838058321,8302174205204731,5630311687451342,9093944411386576,4717482572813012,5036527443981013,1165095349424858,6884059623051995,4090985530787962,2185339193406176,3406285850123728,6650694081819363,7713872124547813,7169928444095953,4482125635736296,239008390740092,4129278934364906,5238856178422511,6847347405132585,3194971208504059,3289408338287489,2748379471721218,7698146352634438,721865022075652,369631554713729,8489071006552842,3591513321364951,7417091265673346,8076966291542798,1995109298557711,1507548624958224,8493021179088304,3449920949605141,3643208604463894,3870956093330201,8967919919644613,4800989786903323,3517135645864732,5099463834587933,7963962474951456,302616733020961,8253578027324194,9142574902932259,1505244039541542,8106217795244839,2165707930792745,8186552182207274,8242928511759148,9203515478809872,1653778367435567,1705122147947312,8366928754221875,5471659196953400,8114229917922105,4622921630217020,2740517006594878,7089452989793077,2116777169212224,9059418573069792,4436576157295414,7757383394194246,3449859179295559,9116944570615930,3468352122368843,6310938704548684,2470546020987726,7399243852305231,4909902901719864,9154309411861331,814885804176214,9077524402598743,6301891590240399,5470494785508188,346015277806429,1277150887277407,3436885496427360,2125102342017889,4299876412666727,6929337483203432,3841365029106537,4092962023789419,4336622795043692,2191807347597844,7125568143684463,4777973122061168,4150055698543473,1048865169029267,4861102288196469,9150321708266358,6740742979090580,5279681065481085,4528084130910455,1578563441105046,7853325230601098,7518540341318541,4185931871153645,2174357380068241,8690887889017307,7028176917926803,7574580218475412,4413255155889047,5211565338235801,8096488494756763,1797635801920413,7142225854439753,7205544767378336,4385945874469793,184500155610018,6131323159638947,1588532687836070,6943708301441381,1899782278763432,3562183679251370,2512455800853419,7380960519523826,6967050502244509,966295390180273,1655792660943794,849656569541555,5051970159670198,1084491232883647,7196266833613762,5486671522673483,7116107502834628,5394608172209095,4094560354751308,5465910320321482,2310184587473868,7933282077815757,3130174468365816,6281769151706066,1432203895952339,9199112965092308,6833570646856663,8329510190494680,6950604055316644,7169928304858076,5537600134190045,1363894442544618,43029531079651,5771333570425829,5756747073278955,7037882290886824,4251352128926707,822934328182837,7970862698910709,5715595414967286,1907515988669432,3860411921863675,4051697416549373,1412728937698302,170448788116479,2953659496403968,443723462921728,3062862702867458,1615016677775531,3034000778571265,1453959238112270,5063328226055183,5656528561665042,5453819916588052,4298605716272151,2770632007652378,5480919443403804,7529751860870661,545369740342307,6423790080168796,1218474642453546,808863137748012,6115239178627250,5488238789760047,6527173590769161,828907607905338,8835909413408220,7916286583419965,2292363221947454,519725821569205,8539663936351000,4459123435216395,6822295734219844,7562657523446854,8224167901066317,6054316373185615,4435127447655504,1252913640731730,3460121821713493,7799283236484183,6956921191044184,4152392226526299,7768388146377820,1541413509018718,5996968794500624,1951586947052647,4708157401551978,7381262434620523,4684971302737004,873549404386415,3803862206313584,5193660832625779,44184354937022,5797790690882678,6448643660526712,3600077411284089,7845679763084410,7478969384114685,2392793798571133,9158729057539199,3309599163908032,1849548952441992,5957011632318475,449647315055761,6368391237544131,2580674359506074,2482812918011035,8053408233886877,961505518294177,2784821558662306,731570859512996,6293117466580133,1791982483977386,7912812003657567,237786763146413,6367985636029615,592190481314998,4960132306232180,2005275686311098,8463222079591612,806036157561034,306715918652606,4605610846016703,7505645149582530,7914212801969697,2671685478012104,89914566571213,8450833966943779,2685647906657492,4438329698055381,1170386113254620,1468592223384797,1026430686549217,6202056125502691,7209775727758763,7851099744463057,2525061230826731,2324201584850159,294634896585970,5040034455877843,8498400850605300,7511259834717429,2169363488642294,7473398994476585,6452146331677945,5209843886109949,7059743473546494,6150964412265728,8085708725736705,8100895108625668,5812129810814213,3448176126899463,1979411730961672,3408164420769034,2851099330385173,5768371004994841,4778016748893466,7347007241581851,9163658247640355,3130572428037681,6715481065261916,6889224557314484,62598256874797,7113444979356974,4730453866345777,5518893518288180,3421844031640885,7336224572011830,6353090680452417,1359687622645060,271692096320839,6943940399358860,167274420958538,2510405249963339,1279190865474893,2924809315759441,5608361189700949,4560743380251990,1464000217732443,7665414634550621,461008789104869,4585823410885986,940356036670819,5164533597402468,2485792919327633,1721240697689450,4636469387449707,6310866800506223,2452644086347121,4097925363381618,3345722235540857,4747230974793086,2716304953226625,1471931953182082,6044727280145798,1813227906717063,7514335890527052,372001288000906,377975815599500,4380867655660941,4334267426862482,7619555220872771,489901539038612,4536093181319406,8587660206019993,5732291402528154,3933400728843675,684184001394077,1019858751198627,7381611871930609,700756933080491,2739200008050092,30727487059374,5583647625790365,5803758346016176,6577173247822143,6177718943239753,8051847331084532,4717720464553402,6832250833086502,5802205926790588,8771266708559293,5617357735384510,6438544880842175,8610952918208011,2076950462371265,8958570185512388,7694295642240453,5037557043566024,472090662524361,4598267304596939,4360775201863116,3289198597215138,7737713634230717,4241390817793487,3407862531257808,5115139744216529,6621144099632594,7196711452476328,5034850101499349,8556539730613720,5521888700388825,4631404959053275,2200362417133020,5635151647421918,898210690864611,295104923629031,3629792376444393,4811655868241388,6234204309173741,4020733195359727,3218017600599536,6996919917659048,9142209480274234,1257992179398133,1973443796399608,4181876398495226,6380057609770493,6309606715709949,3491264537794048,6366517329352193,3482618297250731,3059793908274692,5944599300765190,8727473316403804,494657632450056,4034471396095498,1053977790576142,1425014263076368,2619905536628242,4166538756371987,703790212421141,9002115654737221,79360098842135,3677211645810202,4263166910227375,5673267987494429,8950617552860702,7340610297321733,3447518678398496,7117973222728624,6841928626370082,103830332003875,7466259107960357,6919395536922819,5992011225650727,6697602296403498,7540080867563051,6379772141041197,2760804617664050,3982716937500214,4876817511446074,5381656159565371,6513789514585660,2492358180189757,3791806775875134,1770433163719606,1795196580146785,9054189520959048,921720598459978,8347056076412492,8082723644810402,1408833099847247,8139786131535440,5590856318867026,5937675503023699,7008696870147669,1811854598903383,817786357716570,3321997738399323,1467667182294620,8032178394551901,4353049663723102,3516367257892448,348066347079267,4560990374467174,2912451899332199,8526103361828459,5861578681611884,3523841627551343,4391731634148977,1126380138255986,2669213009622643,716336240776826,3550324538914427,8920431901822570,589693039113854,8562476475291263,1994598872331904,915242522531460,760064870340229,7066743788648072,6808497320705644,2852232335314194,7809182936315533,1697229129619086,8909922901020195,9056753750410179,133133451081365,8611808724989593,7816277578045083,1843349893346973,1318035880375973,2552022719379110,2651066883200682,5888282377836203,5043224916391599,1600516685829808,6117509850437299,5455396166850846,1820382655370934,8673166372890972,2640367121577658,3534141112751803,491964570015420,579587352106685,2457569239070407,4452917668238284,3843614432491210,2125342759032523,920665520912077,8837453979582931,7125072880391887,4974361757120208,3817046403995345,4650558686852819,3625681281324756,7795130956256982,5447690577581783,690074690803418,4328483332200156,6244856251307741,4834276062287584,512278010369763,2566529733687013,3400570116724456,8242822022259115,282123782985452,5823480034563822,164486336354034,4640300692837331,8435001859708660,2613379144259317,1013630571681526,3548015883216382,6443635586619130,4616042621327100,6152358487856893,9004877163837182,7542819507181312,6178182662084356,5412874848614149,3413687045486342,1962708617680647,6839261676476168,7351956412561161,8195553055836435,332686610560780,2998582119651086,3497079673812756,3133824882718489,7561824147349965,3862136741672732,691309029611293,769747903815301,8733939739178785,2329111399061282,2422508102399782,3732524801120041,6413135433004843,6498418251544364,1914321217247538,6394966814258990,3104485520742195,7807957982934837,4214283793372983,1048131656529720,5886143071156025,7212377246144316,1758431876544319,8849453443569472,1942105387374401,8029190125963136,4369302309215883,6566151429027656,64847304210252,6913641894082384,7753686799766636,1764582408367758,5340530858235735,3284913072486234,4331974108731227,8850504319632894,8158323591081369,2332416438401123,2567945370662758,2968617693960041,6744147079218151,2830339795384172,7162588846160189,4301847278851954,2688522525302419,2094033031747444,6577118382815093,8473570781954487,3615810134644603,5216032417060733,1372778846148481,5789497749698438,118275989485451,1005363033397133,8441986642835342,6880209612372239,1085259797329813,7100847339141015,4385876620785562,5183243971123100,1655252406572957,1572117630384030,2289643425839008,1735229280139170,2237544300452166,3986108702447526,6039056767924135,7931426519938985,7974832060692394,4220143030925228,3022820315387821,1701486434367407,7083951521363891,2939062779238324,5963811030693816,9004984141928378,1541523089012670,563147540513781,7157645910177728,6234329865172930,6008286466864118,5186829823740236,6646977426202274,3359775613687761,4512167580098211,6202946036660180,8790176716748758,9185112307773357,8892586239670234,1005615310010331,7919499657320412,8427526410309285,7768074191216187,6015575964383203,48171868338148,3611010529990630,1118787645577192,5775133620049898,5628359928985582,7554475807826941,4415422612865058,7222101806544881,7839370389932371,1305619033004022,5796868013078519,7252544017561592,9188051580418042,5080297612572669,8198930481330175,2579607113888768,2914318166202370,4291145418651651,8550646715414534,624284027017223,618834665658383,8337520969766929,3418938734147603,6083285372999701,2832614897776664,2399637800351770,6977845106628636,2641454125815839,7466915143178278,3539602432817192,8388793410718044,1106827209701418,1365265536841771,3177551013705774,2495638388660275,4726054539851828,7976179756980278,7713845187254327,5269242984241208,4348149327427644,3783371993561151,1463226710612032,8510735744456769,3387475752122434,3108363230926915,3394908660267076,2084062124570693,6582673758206023,6699495680358472,3891742193064009,2096638010660939,1122595546282064,8483423534725201,6680586830829651,3406182880082004,3464848199530582,5054843943254103,1900753435818072,7168406463723610,7491101211506780,8503910967613533,3426246100514911,4872100941215842,3313005997906019,2825490126501989,5971887646292070,5119940110112876,5874442432338034,5726836703967351,456284197296251,197091412465788,7332854142171263,2628844753213569,5191302420551810,2789176848562307,8164903189313668,4277542888396933,8806289736920949,7021803879970952,917102876547212,9180141152243902,6343828852791439,9156251054045329,4738130776119443,3369046466009236,5563043379484822,315859863396036,1220089623099549,8416605143079070,8702358581319839,1595571707394211,7538821435029668,4528306814597287,241988869159080,6295188430095388,2173308756203691,6259230785931634,1836253187274931,4362061605296311,29784325363896,78061580122297,313011841980603,4029102111529149,4625460347476158,1670705046853827,1289424881260742,4108900116429000,2325909388474570,6267084925761739,4539338241775822,3198470048446674,1052370006643747,5451172197300439,5937819962538201,405155334699227,1219803101976798,4370147477313759,5401446368663776,2331474813548770,2152505924688100,2708820065695973,7385360201203409,7691064962431211,6117299089758446,3369002854693103,2014355115088112,4670453477804106,3644137837246709,3209801381790761,2543671390902520,6827512084773114,5337913366210943,3085130331763754,2217139083509325,6108529628141823,5986680233793796,3070261201305302,5263152979133976,970883387513095,3375028863607852,7708486954891530,2650811056773387,2368201253845378,7984771860011278,3928950609778959,1094851484252432,5624710183264461,7567637945850134,3631020331637015,8676009548552474,6205652745820445,2635038836480286,8119479580957061,7773897119588745,8721150443829539,581507421419812,1052100138981669,7256030852061479,8377766812643036,7244950637492616,1998767539222834,2933013351577907,5516148423629111,961909437544760,5571610057644348,2545945787504957,7301850784843781,1389303044888896,8915287337262816,5465908857026883,7575149290371396,4096483643316549,5887036492200262,8387757942266183,9053684387789171,8361891771750732,3947635313383757,6847814113615,8183826127170798,7552108160407890,2560565938018646,4860975632103772,848439026869306,1333348338391391,5263045207292256,6056814908348770,8713889868757347,1201280047978853,7456831693158759,2771982087592297,2266821822101869,62895137997852,1115900906464317,7416688687053169,593292487473522,2347109962185075,2349864095409615,3356610114738552,8548665536835813,6575070132566398,6561147721800065,2510424379636098,1740431538272643,5234931692697989,4836738141755782,5816580819384711,7204140262971784,1008783913965961,5023389963991437,7356230790994318,1323804304660880,148129182316945,3373493967217731,2429101609073050,3503417299982749,2061697505982878,2900549354764707,4713853341333924,4962315919940007,5409743641467304,3360373073566123,615268581325228,6957462374709661,7083725495876017,1214575416424882,5218925149215158,9063126152452461,6916040616346698,2920871585552831,2423068949584322,8390134520599033,5418319882885573,4815508888314956,5909275570133450,1022468918475211,1209874952976844,5325326332033487,7932494234900944,5208405560515029,1487547306195414,5260307416209828,2084466896615899,6029514778196444,2957520851024349,4149539181877726,8924924378281040,2353823833209314,7006275616848356,7874290001437777,8633643462539756,1226880738810351,2213999963339248,4127919637580200,1589203857971699,4129169692572152,7743648188234234,508874095294971,5804912496089597,5260550537427454,6392440582268508,4121529119514368,5415443293108738,7691955952179627,7375721366853332,8662006996681650,7997251560331789,8691901458840082,5678623507986963,3676148730190357,6854025887808023,2939434866399770,1692942125562395,502203119901212,4891649958533669,2641077539969574,1678555105262119,4368534815701545,500187564026000,9086895496556295,1463235765295661,6284964641102383,9200170346551857,1963090774391348,1468068589589598,261660671687222,4242671197780535,8457778390279263,2751000235186748,3905490344565309,497897866861118,55569022892608,6996153042394618,5297945313868358,9077608161375329,1676727910300234,4173740618218060,8771879502412370,969065711245907,8941074233719381,6653911874107990,2258543229442648,185003117124185,8474092270247695,7874415407782492,4932755027393117,1368955521096286,5751777552229477,990495804508603,5872175595092586,1887286763770983,6806013231513363,6330324300962420,3125146194860664,537958394911354,1747436335184507,3649473519155837,6679001145203326,3434083307403903,4363880025782912,8004491885394561,3983327009391736,6736459960886379,3528062732352132,5412632364898949,6551377271691910,8461783044265999,1016841054463084,9101892564179595,3190306429115030,1288267294096023,2332148617853592,3501369232823407,123796605493074,8501194712054431,6245678774557344,7004898716801700,4425195940010661,3876995840383655,4773400462269096,3603242118191785,5789388564953772,2596426462859037,8113592469592752,3037510718122440,6765902708341426,5401482138753927,6881159939643187,7190955632245436,7714515222366666,6133407359744704,3484599314266817,1640568269314754,3464281881926339,7768887061592772,5077851029797574,7237694030904007,2287364181637832,1258982089218508,1137124295629514,6636769707563727,1669838057159376,3560446314824824,7165062366042834,1550058207432483,3676844373064404,7328118661634219,4408881672575703,6873414982851289,3519569897405146,4239565333535455,7447035151473380,6598155096398568,2522942874988327,2029043654277868,6824482568098341,8377986134750594,3053433135510653,7191992340691696,7108894437079793,5490902749223670,4818953688922873,7449737776792703,4322988905667324,1883254811638525,7937765519702485,451579383175938,926708025335595,7535050477697796,4676821933881814,840391772947585,7323023152880392,6576381993516844,4637159829969674,605471278873356,3624428446808849,3365571886603027,161678418279189,3541510756416278,4656689111857943,502944875043609,6484316927671075,1552905547287439,9177675878382375,3538703132425000,3575460466785065,3339130116209451,8857091576986077,1516984738822962,114385143446323,4531172227988276,4169715337345502,5042708276550456,8186205280341812,7296155998239547,2227458274861450,2194514101410623,64966986660673,7729558532365123,1741347974881078,7052795572017990,270651384724296,4989760574896971,7988934436092748,3610738943384399,3348379906898769,6704061370595972,2320856564480851,9109159281691548,3746327089437526,3647982261369687,4852004648213336,1535759823027033,4931109952985947,1909811031505756,7720330102219897,1930020826577758,1598271318932321,6026144698782865,1997978369973096,4478848852967228,8648557306968551,2946011488353132,1596424884697965,747563049106286,1586008000014824,5517353877601143,7186707507821433,6360504715811707,7110750587845501,9083228382919550,7773075821460352,991471932275585,2055516344130435,2454314127203204,528467997514629,6891148395436934,6248525888985991,5657721892035464,430335092554633,3427193770048395,4004478821587852,2167239967047301,4472487904566162,731530412366739,4941207975074709,6031026129599383,2076642430581656,4123820397394844,3443984025688991,3414024018885104,1797183621366939,9143404133948325,6876020646799857,5996831900253096,9060086168935337,1895039095888810,943472426744748,60162560342957,4241102294522798,7613218204113840,8670870327425969,8879796284394783,1416299220908983,6713650811255736,6301797801786297,1973214167178170,9035805264542651,7424892992846780,2322306196082506,4810596056644544,2215747992067009,6784643150642114,8592501458694828,4046991539166148,5587567521119173,1198938243357638,5358027776233292,4161077244017610,7986057794128375,4917697280615586,6699824830086094,1311051497774032,8338200042081241,5316693202451411,891415067507672,90503452531675,6553458972515294,223648497114080,7754200030714854,1959725667810279,5100473199651324,569629000195050,151949958921197,2058242825649135,7778980554286172,3081904964033522,3155581316086771,6306051537148921,6484345240968186,5438616185183227,8550115638287356,5678225583037440,7168465280449539,9042922222931367,5105468991236307,3433309245141917,6996176178510857,7394937101089802,2084323974798352,1584954524277777,8815609018917572,4067100113648663,8226724925996056,4270754692570137,5800578021465114,6571934734736411,3562939096456220,7757381504080928,7319987845651569,2221461979311964,8374466831629358,8113745020410927,6157470621219889,6645510705800371,9034604023192630,1137104951442488,8483755119680569,3271678763367488,1144589899398209,2367827689200708,4425812568704182,6485532208839750,7920408542313544,4768256269179980,3320658773630029,3235156037811279,5156632427717816,2904621202029650,6656670856556387,15130076305319,742340205354072,6121194377026650,1746408386919803,3848237015227484,7771410244802931,5033648314023781,269327692244155,1764339151314790,800357916154982,3319728596229223,8187920693608295,1480083650223214,1699488991272047,4182150020316273,4458274895551603,3187057922940020,5934328023882871,4898478757960824,1873952860159097,1842809341779069,538604242738302,7894695313234453,4967956567465089,3138543667666050,5458056815860868,2596001878973576,3072730276011147,8925733166529676,6525349698870413,3189957881592974,6556015890595693,5053093284494480,242506923695250,8031239826562200,3067080950359956,5686507506392219,9069462814523295,6843165505952935,4165216169874756,9006621265877532,5854181632302250,7931001604807851,8114094450719917,5716233557015727,8968405083185439,59189465382066,5968750068423861,5425598684273850,1407987466943675,4686233948101821,2853409456086206,3204575836639093,9079822033345728,6263961979935937,3162788714740935,3585334321398944,2070101058968781,5680422012452047,3779897984165850,6324621208245859,7230924532882648,5399987285191204,6244113208204511,6830270095891680,2201448566365411,5138619359590950,3371034674889584,2577874897427687,6395549612685782,9105143755758826,8455639212292647,2315609761316633,2199496791088365,3143452554190064,4369935714835698,1639161003801843,4450974377172215,3801292881476856,476927156288762,7682349658045692,8657044293863978,9008876846615412,6093134834138369,2215498908138754,7306613928918275,4823399190437124,7224776030199048,4767193170689291,3784669381459213,1657801111173677,1438714923949328,6558168719082214,4449542315619792,4928471653743891,6905400191909141,7148161465331947,6812040372114794,8361426390031646,667769495059744,2970723080289573,3026620151074649,2473276156042536,1715913877888297,7644271371369771,4952693291078682,4807206526221615,652662350098313,4455858645720377,434663105740090,8104802785557819,5736750167339824,9110768866893122,4181743616572739,2103809137875510,5229340020800838,6384512328357089,8505317817481647,7461711682498444,8696258642156875,3489230368198881,2770365846232398,2001886196743503,600350173404499,6570893914692948,7350286138129749,4173008429227351,7619497696714072,4183753669713241,6314907133320538,4250688117939547,4942626129788252,8046104530795869,2026400587103585,4608185393872228,8147565632314725,3869262171430246,2712567818219409,3020377712041320,8162035933773161,8928348727246186,110889435381099,4904649360711022,6895535933545021,3111350713097584,6391952895343986,7260534974823795,3591030216641086,5411439142673785,1606612055547259,5869396802715006,355341724015999,8634388791143084,7612865290558857,7651934617574796,5977955467754893,8761456001400728,5466700459203987,8594461755936777,6472043339103637,4521184611021312,4840231702175127,6510637354802584,927874525543833,7110127391014414,5473104898809246,7181998906178118,1405839267462566,1743802683000230,966120289476009,4820137413033386,1311903743720875,3578085314682285,6264038341991854,3334196611693999,5433538138176946,3286325938532149,879005708819895,1166772112801208,581338440703419,9080733293084092,7670357485818787,1043572880858559,2701454425202112,4183729310268865,3042316348759491,2693790244953542,1016861200932295,5290759897890248,1295976804163019,2026173576486818,3741499828985295,4820710719077840,672770242633171,4929072084295124,4103599177842135,5015313663163864,7159990886776282,8577303551403338,6405779506527712,5997965232111074,3846762562928101,6091389580959208,6595841407991273,8832730250788330,8689302055681959,2860373068881388,9155441418876157,3938224164379219,1164456872222200,3819665817640442,9126405794651643,5087088356335100,827260733775358,5661745650916863,6292953209079040,8893086221680131,7431480309267972,6837983391193686,3910984611765769,9151316342619658,4927891402587659,6110472705785357,2998672853827086,4865269597330959,3273575314332248,5766318029430291,6722871576321556,493689233858069,3675971526467094,4972196646665751,4660096919330329,3670502711983644,8069088090187698,4699597119167669,6231107601514018,93777942019619,7119695903587876,643152060440101,5778866334072358,451402852482600,6818206614855209,2020050084888106,454954559446571,3837199939378733,498123823586862,631622603038255,2210031822732848,141257293405748,7748388363519488,4219205021081144,5972403185425977,2627884200844859,4474329065714954,1566619460322571,9196123179321953,1106977271258698,4415387428519499,3413622995246668,3936079110454861,1472171780384013,6880396700559971,2023801990839892,8510988316716985,5826716650798683,5522214106906204,3510102319119966,7419385333399135,8870642657754721,5974211735060067,3062275178184293,4310007411809896,6810878245224042,297683867876971,2635708643008108,4035624520679029,8209058417526173,7874627371990648,8573531873402490,3711931269299835,7422793886031484,7378642432067262,6225789871522802,7069041932697220,3768131798220421,4959618672631435,1050384345554575,9076380663629315,8558142159963416,7961254478716562,3431909150342803,8277152984022676,8668656736812693,4281696878403224,9107539692265115,3021313077591710,8104882751799237,5813758736580256,719189479120545,5766320733068962,5148626457304739,1545955492765348,255259056864936,2915460274765484,7405055402958509,1919460883840687,4377628880412337,368471941340857,1215064931303099,6222470353985215,4331361315036864,1889951248613058,5074491031404227,2629542226337476,6501560333541061,3604287136349900,5237516358532814,6078114273361615,4439159575554680,4832591651389141,3505592822281361,5256493140180696,8404658360303321,2023386862640858,8035961444679631,7404125607812828,7941127746820730,5614547659824862,1779619189497567,8442425241312992,9133321612394209,6022924447563490,3093366741604987,5375958161032486,5645232066772711,8502347399904344,3808162666495721,6101476302364396,8743939319537390,2439672365891313,3509908686356210,8537532487835379,8222832348225268,8109767885519486,2417638053543671,1230163537264376,661276613984213,6293080417230592,7329482776657665,7398331135467269,4444248295524993,1050611329703688,3777506419437257,7446200934809357,8561076419839427,1339229421790509,3768987666292497,5951285131157267,8721764053835540,12189652705045,4283270894239510,7907538918891287,1472234887744132,5884909427882629,6186411283783459,7156351231844353,469334348846385,6561813685632810,2844265989851783,4619143957659436,4093625201360685,6626860580495325,7408637886988081,2683447476051762,9034586617897132,150815293300534,1773548870745911,6075763016105785,4978509811701457,6250598120963900,1246571104042816,7874655206139597,404538008928068,5813353287253830,5079285249326921,8956189982970815,1351796054220620,3231247886060173,8678764140224336,5121508896735057,1488212322246482,7769272420527231,1744995587587929,8760470664675163,7969217518354271,6377528943296352,7475993043517281,5072052238220420,8120298350829411,3877630402559845,507865243494,2141941143232359,1590058613661544,1654187199389546,3098255657385836,4653633463402349,7579903101525872,4657316520886129,6763348449054421,8897960421072757,5778198204702582,7442040402412402,8950543476940671,7705391418638208,553292810051457,3191230975978282,115608667373448,8545716204457964,2827569506721680,592815624306577,336851411771287,7181772537995160,4521360985841561,7787302050901999,1833341979262876,1690236277617553,7382923929224517,1937963781726113,3011378395897762,4402658615943076,511993348186097,3447755731500968,5867356692396,6633660701679536,7826384089325489,3994647709147058,7228515380212361,1278319547391927,8459564262547384,2313265279156156,5134222740706634,7400676202381246,6325510853083072,5751178417528770,5252977773092803,3535855485091780,2762758986022853,7335098442940359,8601855943581644,7941675026366413,2209034282786766,7607178635363661,2388286726275024,7429958522970065,6056134974955475,1124527427567573,7618332708487128,2633979622173348,7904701713702874,6650696271380443,5636805705654237,7372108405604318,8980104283135976,1130852278345705,2460231561613964,1153036467175409,873653667332083,7315286959366134,5876696593031159,2349073462730751,6679674153746430,1939584691847167],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/7ddb71d74edc6d1e0c724a8f1bd3c8cc",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900127925.1/GCA_900127925.1_17175_2_10_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FQQC01000030.1 Staphylococcus aureus strain 3688STDY6124881 genome assembly, contig: ERS746454SCcontig000030, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"7ddb71d74edc6d1e0c724a8f1bd3c8cc\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,6405856860266512,5378024996409363,4304708589903892,366038575566869,4366044986945560,8256268793606171,2156504318697501,7000457640026142,7896021307777056,6479806504648738,7372327805427759,7488881899288584,7367538968457269,1450316729684023,6506000896569401,785307879182395,7140729989324865,6397009867735051,3982547558838340,4230071825489989,2375917415634273,4660665155473483,2343748905513037,1666958170144846,6887170202234965,3506453766344792,8044186767290461,1028053574107231,8774502673891428,5695996928335975,1109376234840171,1307705680961644,5434311755829359,7284609180405873,7199198146764916,3662919159013483,1788090151867071,5343877533479039,4823510936105092,9173197031722616,1840877050794124,2687238688096398,5940834273493135,6968438657196176,6423458840264849,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,5285546252951712,979588139913384,980192377581737,7932357643723463,1816213056534246,2529585517518760,1451999676301492,7999157878374581,5421768685998262,2652050212024505,3173772744495291,4161461091909821,8260608504786293,4275434089636035,2611212703698294,2229206715879623,3896588604084428,3907965771116578,5356500413587662,2138247811834065,2929787349803218,31276153639126,8288761955963096,9069156878573787,5763937543921884,7810828416770269,1415129293988062,3249203375431907,9100377281368294,915883713245416,6675745817342186,5445372293271789,1133486263984368,6101035983073523,1832112930046198,8091788112306423,549043327607033,1302574224109821,8212410875969790,5619546432701021,948489885540616,5507799003255049,7476293558784267,1316115594879244,3963523983684994,1655653727666446,3590799175020818,1803490896380179,5827553282294039,1100178234351897,1613233089708314,2199184934228253,2660901546139013,7318609661925379,6842795510731045,4034436112523558,6087520097550634,3660772568489351,8091310037205295,81794309968176,777026232017201,8985645944647986,6922370832007476,2133264542323422,1477786791149878,3871300378636600,4040110223393081,5262783650406716,6992758984360253,7445078125691199,8895922000216384,2602070490546912,4948197190627650,6853668853055811,3247571112300869,3674047191355718,9089878662127943,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,4530178457788475,9198749196284261,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,7966931912851836,1737521935278467,2906015216222599,6979728325214600,7689915868344716,162751473398158,3734458897543567,5940376136597911,2972258577203608,3810421167948185,2243509869687195,3242446598427039,2968451845775780,2246725717416689,8807863722766761,8952362163265966,3299864180793775,7745961481458097,8055901273809331,5347282112979384,740802614878651,7357884307374526,2995332410417909,2767098068603329,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,285153183728083,3018049546973653,1088563540505048,2245992685781466,7302934211303503,2628535144231391,3405658398716384,9088616725393889,1960882994242018,2583875797723899,8940994346209769,7034832356020714,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2188170162708984,5379302182240766,9020434483069439,7070848760263171,162688560886278,7497816545194504,6797842274607627,8926864159879698,6748402791805460,1991856884875801,8875968855564830,68515416416801,1283325847532068,237184967045669,8303975859675687,8246219929334314,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,333806946517562,8082439380873789,6161629781725758,8285967442735679,1301466934951885,8792974406386243,861160734184004,239261345014344,2956783960371794,2591352585302612,8437928995717718,9035496088180836,7863282501620314,3375377095430747,7266335543571037,425416416223838,4888768950592097,1576704700666466,7016685056307815,6970959074628623,8074218591388266,6240582334678461,3466699351597682,2418223084651124,4891494248387191,4162813093515897,5003940428440188,1337146668794494,4194303986672257,4260895368577666,4283429268783211,2166267691369095,985997338583691,4627768844518037,635178958910103,3008589367177883,2868277602058914,8473257377227436,3692897477640877,8821595848045232,3297380990788894,5686723358601907,962398808360384,4046389695603382,7447126361371325,4279968232481471,3087196799197888,2119165660984001,204269439025862,1939633497252551,6559343506969291,8499668649452236,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,6286493618604155,78000814482148,3066294121266641,5538283699811048,387851009274606,3997317780447984,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,5728661481177863,1801073945726423,3724983289750286,8203435196351247,8979225803649813,1863691628282649,2274688364516123,4216267683599133,5520319973442338,6266053838983975,3650169611711273,3894727865107245,6318228701848370,2610327495815987,3599981441475381,175361492751158,5622224862577464,7117595573932866,8823214936765253,5098524814869318,4447327968161932,1397154956147511,4293065844762082,4989843487044431,2642347481506640,6035570396930872,212186904118100,3043432314913624,5749232718713690,6709902552658779,8248516013412496,7244890770803515,8072469350093668,2275693130250305,4291307568565735,5137988816335725,2413571986957173,4935474003620735,4117238218216331,6770526131303234,4857625534343785,5547694202340241,3220718305670034,1314889990042517,4417325011829655,2837844155729392,3898274480092066,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,6833222729797864,410144451802613,3145083147473858,3507253187924811,8509175563707333,2512865056413175,6177526526477266,8076461447820243,1365302130443223,8794208264791002,122015909989199,1338323295265756,2994560223626205,3428447854789601,6362463964017639,5274301660094267,7027985096934380,3122988145693678,1625254992364527,6176712354587633,3089495541412855,8480537016632314,7122517469537292,7415738719983789,4459857427442097,1880410170582036,7969234882208792,5042862487835677,3353246143173665,297946451506210,3935278357799971,6307772441596965,6433529401226280,4828638417458217,68026310562860,5809124145472559,2719967621366833,6104920293028914,3421913526150195,3161510797841463,6664851025699898,626515935265851,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,488525264173008,7169548162306233,5906462950118488,1017054735021145,144929027286108,5784971519988835,6490932119479400,318390755435626,4325735311524974,3895465852974193,9166612212995189,517359220212855,7498960818033784,851815340897403,9193508402337585,6432046918378622,7867843017488576,5176930235041436,310401436513421,772117120378000,7279634878366865,5424923310544019,1890986035680404,4414964609014638,1596244949587094,29860417139863,2185485247435928,7190948106835105,8783891734748017,698042668139691,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,4227702754264245,693796660573370,1996572511122975,2193269920048317,4196751721354430,1880512750785729,8996739144828098,835668183033027,3371516753958085,7280597082649798,81635630112972,93901772698828,2781157967312077,3864648699065550,4304771496076498,1971104120004146,8115575334364382,2239126453073124,3426729133401137,2287535748633830,5990617355047121,336938091775208,704012195243245,936638823216367,2086682841597170,4451688021447929,2744843007502163,1920011015468284,1859721248011520,5195275595142404,8291164134043862,8427394283750668,7588963357979917,9052202512041238,9059221439596761,6988101536453914,3070134228672047,6993101992809756,3671565933241630,7949201316488479,8413427240301859,4911190400468269,1336059428508981,1618472691987766,3642893317608759,2262947123078456,2427434620065085,6974450251494718,4925763159749515,4819719989986640,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,7468607511573858,2752520230327651,8668036368331665,7319951751783787,6756462740694380,5155360444663152,5474832406320497,2949336396957044,2952168537830773,391700864198006,51745215800695,6610124020532606,8535608270551957,48510366725506,2218257629603393,6570381896951176,843457896101259,6475115975964047,8567589419816342,6168498495991364,8935830662170010,7455948431881628,5130704189359686,8707847105430950,4110707986027943,7152093423583475,550323193349556,2732774152586685,5052182129870271,3073162778047936,18846434743745,1993005114900043,2417632473485558,960356550845894,6138704418343841,3492790410601929,3233673095160055,15177571706316,5186129727423953,897316570514903,5469018164704731,3885943932519902,2181274350118370,3877569505863141,4936027117872614,3494788355780177,2397618178008552,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6390296585315838,402247873566207,2121072079353345,6451364401675179,5077643932915205,9086189712409516,130457181976075,8111919630915087,1603137902355995,6141646980806917,2376738954628699,702798501799460,2850576000013862,319524505622058,2864627209774636,7502333181040182,6868805569935625,4601472696178233,4620747332527681,8068985491437122,7530221302335046,5907535925622345,1033361534550956,7026580404491854,1106191012378192,5799343132662063,5701137865421070,5145351730722391,7611734689027677,2128625191036514,1931792235046501,8906959415711334,6752084920206951,8902901908022888,2904355576731244,2506883728483949,3901721509594734,7317744998774384,4512180937213558,6635096463206009,2271529603798650,6455297058208703,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,819530571867797,55532696639127,7641407504271001,6274847488566940,3442643861129498,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,4063887283164850,462594584405688,6368094493092127,7672125054567770,1639747824223934,2361765179657163,560732034878399,651657068725962,75607106131659,8084476987051640,9208243591808722,1050472124757718,7747403098466007,8726995670906588,4304259375339229,1545195813721824,8647056119409616,2521189072553595,4870118807992038,3647586521282279,5078643480934121,2923610052501418,7384508985915121,4892101304640467,8716100204173046,6229246082365175,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,887468836411156,4210999028688662,5587667073572484,8143513944316657,467300572956444,7641917531428638,5182734109921584,7327034779342626,599196216102534,8909030726132017,5117258784737064,8552312296191785,7553352169367338,175758243073672,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,7598272163776324,3218183812310854,500006684268363,2339293216622415,4974610471645496,820079529219923,3716488083994452,8059723177205390,8019225952256313,5360518378600282,3300357632857948,8617233707472737,731807987644259,3843618476357477,465037166274408,407494504056686,6293385368209263,3827221495609203,7677689495709556,1209024400287606,2266518188165352,4579041725200255,8462257808402312,8245677561885676,8154597807642509,418382005626769,8497320404037205,3527286274848660,8066402932709271,5145085675848898,834351233189787,6655834216400796,8449499606388378,8402034128308126,2959466822535072,8935628239632291,1136734073223076,7640718988732325,7740913804166812,4285562358224810,5300625464223660,7687547568949165,1629503790397358,1586163045525149,3700712461854642,3086808181540789,7046481273812920,4324521905919930,1963403643070399,1229878691049804,8326254200203212,5550023567304653,4265524355446736,4494745225119689,1055754057562072,624885245548506,153369867168896,7665487907133093,9047382457047000,2783293737744357,8189536530413545,3831897473120234,6481384689440749,3001959122151417,2344705120843770,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,5649816903928151,8960623108675600,2819257305679889,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,32727294916642,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,838713961601070,1684420266620981,3404645514262587,985445610055745,2380585982662722,5330443437426759,3669669445212233,6994098420947023,6445197233936468,2614524117768281,4224499299092571,6415637455083613,7323875920791652,6106536950036582,4898691182037097,7613883562408042,6556700142631019,5183821081331824,3685508581812338,1435058818705086,935264543787126,4403747301046395,4706193404512382,7647986012981381,5227765085489292,7589956941211795,164072296102038,8021177217775772,6511809285281959,4079964453292203,527250636097708,450088546953389,5524874001115311,707296662751413,1826572334769866,1224794385881280,4370251230234817,4938927696959683,6585493558229191,4995812233531084,4062696346530850,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,2101930659715286,7302327451478233,1683181509208287,7670540484323560,1219768655680734,2057763371387131,2809509062039806,4037615708129537,4735068303730949,245232068421897,73265497950478,7846237798144273,4415067719221635,2067257304910100,2221340687153433,1290139896432922,5068399066556699,4152741756651807,150144952449313,830388703421489,4722534397663531,8823763859310893,5369751621683502,932244993407279,8995213276330288,3264293452933428,5085323617671478,8656843213650242,147960819489093,3755199397484871,4887250507123017,5608160409942348,7393489351358797,1544646640245073,1602227073784151,1676612448274780,4633515119782238,1923663661255013,2528889561520487,6247490209868140,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,7515897034787212,5084161271253393,8774224672823698,2110937203020185,5602292474825115,2096841890683293,7064012510296479,5584756052421024,1541713433336225,8105508678531491,2949081325283748,5779924749805990,9130305682536177,424135353727401,5081406681463197,6054745340379082,1333593272314289,4410947517753780,30172216461750,2774005338483129,7413661131340191,8069172111739324,2016823776880454,4260640978303429,5292946014976455,7203516452268491,4865769618012623,6117415709833681,3429891841847111,1346942731454932,1725888322763221,7769295295371735,5840344637290916,7873984218462683,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,3568367659125226,6846105922922987,7553111683168749,3182861987777006,272132654860783,818483388234224,3700692511144435,6399543881865718,4341759536675241,7773766781864440,1383270956448250,6574721260816894,5917290617760258,9179669523560966,1788226934370049,3283597017790984,253300033591817,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,207892688386593,1354074465876514,211721470048805,1145167706642982,912784943237671,9118918071159336,492140695218739,1948452292414006,69505479293499,1353157041773116,1981234046790208,6676116454906435,1161313153448519,7869558584781385,384651385379405,1631879280163412,4746826772617814,1768705500031582,8361022599817826,2486587751163665,7990979687406012,7464799420283500,3279510064929392,1965966511262331,5677483308395132,2209184500886142,7867463027661439,3388045959506560,3610777620634241,4063411599092843,4220498566294151,7505984773102219,8603296405064333,2192532495772303,1219403438168728,6254528881375899,3796894009887390,3022351940359963,4115418516888233,5078604763028139,8325883311024816,2885561946520247,7779913425963705,5461973998553790,2808788935436994,3981187881433797,1636073587214113,8334953150270153,8469606663949007,7434508546284241,1368864330996436,2027494681635543,1390679848778457,8691345688738530,502448148560611,4687284809224657,4349788433550060,2852146856205037,4391111533566703,981946939239152,4952730055523057,8153231274774995,8165238363474270,7439205940817097,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,122792911215063,2496496658012942,5791949031062287,4137408430182872,3683306400086802,210402935216919,8600761421888281,64784909585178,2947196173888283,3343132780332849,970330114464553,4304614427552720,2100493461572402,7161054261140279,4021653090544442,6632433388350267,7088305201981920,8711986948082498,7467931263134177,2060828393827469,4752895990487891,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,7255001061059048,3408611869207412,8441358375734134,1164683235056503,3479272006413177,1239923617995242,4396390006889344,8489320569743851,3425299686538116,181638314539909,4986151868590983,5675853195025288,5558787509439373,1552378516372366,4190213662030738,5216262217616277,5550878840171414,4807517851032471,3130118261376836,4786383361944475,7530063864933276,593012990819230,642495775441392,6368298802715554,2099648782044067,6669022222351268,7269154615335845,4797301698399142,3471569168190378,8952231969012651,8075354013268908,1297442792150451,1336054165273524,9126554829507511,5092881070193593,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,3414992782928838,7057729200712647,4461197842708983,5695909244033996,135329339445992,2562320086883280,8044654462276088,9100812111035348,6899487686306776,4859866816269273,6860946644216314,6672925459491813,1082376892709864,2680596330777581,8506618169158638,2573596889369585,1299923441830899,4704429005052921,966689432144890,4912195048307707,4993770055057868,4855337625377795,6353716854512644,4875381475535879,7920984055155720,5796384473230345,4964781251513354,3254764124227565,4122319891667983,3884489623182358,8636005329198105,8946967760567322,8390372701215772,2198108027522077,7164125418732578,2908244240583723,2486727883959344,3649154946395190,2907874448857610,5356878132681790,3331986316520629,88288992812097,6855779845853707,3711070083308612,5675714913627212,633105738161232,9157569010814040,5768890711293017,5097534116879451,4955365087054941,2482249484835934,7643972193975399,6002583963081835,1960247201090669,6606127180495997,5520592147606656,3128705817382019,8158821542825094,5256643637594029,8195896781188236,3916028288464066,6220211775753359,2470905977298066,8540182034447509,1531526026639043,7766724721261725,8292399427181726,5241091670625443,1238619339054246,5514768509078696,8494210442632362,7129634646088877,1515192525290670,1893040465097246,6086409751379126,8707651019648183,2456047920420724,8644146702531103,9182108430318780,5107270389779645,7293093929815232,8783786815601862,8197445232532681,2109431893175501,7464689979698382,4229487205903567,1840117489511632,6740820460158161,1019530360671445,4086615967075543,976293987540186,8223148645510366,7315979768499426,1378353318702307,958802972458216,4463836312960238,7666194411646192,4836608690859249,2688817209527540,1009185351310588,6444896304143614,700523669716226,3567107464158468,5816011168292101,1448775314115846,4180542909013889,5683388936101134,1561783378768429,6644821181082899,5287326670494996,6443436682398999,5000612806597850,2441027742764320,7642964956253477,4983361146858790,7122905104739627,2440693706419500,4069712352202031,7851797183089886,4593537943493944,8381523732258105,551545615669644,4739190100540731,4906250419473725,4037012370431297,2757742046635708,7466387834002757,7678005521333574,3185768657300807,5351668498910539,4770308599258444,3285144305491278,8738842111253841,8632273026333923,3735333997858134,6214703578960851,7882993032424802,4856610212101475,5323332702567656,7429050244083061,5392923544264054,7957847919705466,9140899795443072,5151281455619461,356405237001607,6341820508011913,1791508917364631,9051053538184605,1169438882554352,3289590076870051,1378102746791153,9185892931558825,8360155893836359,6403894935227820,5926443562442162,1476335672319411,856884970847672,5947103608716731,856408145649084,4238595947917216,7776477814955458,2877754653855172,2690941375331784,4782498127412683,5110086792326606,61926092041681,1293316954136023,3579720778661796,7385626605825504,4736904158449123,6548287328611815,4368166270504425,5132762411359723,1239033518398956,7864494568558061,2967758255443441,4717078305738226,1541930783479721,3152905102806522,3549731255033339,1800517128877994,5336395954564607,6149574672191403,3677235441902166,2760855083342295,1987340210712077,3053911408508430,8205328358469135,7906524426948124,1185378970902048,4870364243930658,835582845963811,1345534315535910,177161577352745,8051651537114466,6152554647457326,2499002377216605,4393052211822129,6930698324287026,1586380436214366,6430315154239030,5168981785230906,8453583119834684,7906973945146948,7156388644240319,2110899098619464,5201583327452746,1663633658035787,1251060182680162,4159408676081230,3041547689324113,4803260508523042,7682210448059988,3556579375844622,2160427630619264,2665622691527951,2474976062656096,5603043202166369,540113038163563,2069399351119471,1780374020345457,3563874166663785,4556601114480248,1826626455842425,2479347599965821,4155506935291518,8204114985614978,7428929518419587,6497917926444676,7958382104108678,5643554321571463,8293699458965128,5553553040481934,6837386060818166,5432594957360786,7579475400625813,5263199465725590,8336559698878103,896023919447705,6810715537882778,6142827993272943,8752350049566365,6607041102383728,8732222410051235,3213809958264492,4725106938598002,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,90076065684274,3186681823395517,6133069365415617,3555666348039874,8660225691913923,9203831550168772,2087609977097925,5816608308592328,7021215523782799,7374706893274831,7154763136518251,587253656190676,2169107663986396,6128252439805663,984499184574177,5500657232277221,8556996361134716,1730022945555957,8180593313316588,3834083608280817,3931973464080121,5985406373330682,1553419814780673,1262523435581188,2729482319322886,510046744203017,8399396488744715,1205143099420432,5395011470851857,84834187095829,519866312761111,6247058132823833,5490276726882074,4363284863173231,5716331084570405,4440186563960617,8253731522256683,2452142369648428,2604709679968045,4282404060483374,6412229720137523,3881211648824768,1203079434555191,3989388368871224,6737890810986299,2559496497311550,6414585907380037,5142156492693319,2827287352397642,555164866154318,4050500137410385,793823372574692,7473358281035614,6086204123819675,5615591727492962,6256027916509031,7383880699617129,7535376972951402,2241933783404397,3333979680154941,965077211664360,7486165624184690,2253661544079221,1607268386283382,1835863488040824,4494558117785472,2569719125127041,4848772203458437,7039911616343950,486995003146127,8599745542954899,6556071619964822,6527583680225178,6303151162171294,3197109218230176,6119538918195108,5707862725947303,7428180479475624,5917734646341545,5972497682370474,6135375769182123,6718325252018101,2345917413478649,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,1072873520201676,1351605086977997,8974862207918513,4001936773421731,6015913189748693,392326751543259,168902776664030,4276573756637151,7724391001129743,6113307333423076,7711136695439333,1879504332029927,2669250979570882,2402161890443244,4629281300140726,1503829884784624,7969431343923191,4933256683220991,2199283201691644,3109360564465662,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/7e22d796abc7a6c49dadb94c4dae16b3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001027825.1/GCA_001027825.1_ASM102782v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JQAG01000001.1 Pasteurella multocida subsp. multocida strain THF contig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"7e22d796abc7a6c49dadb94c4dae16b3\",\"mins\":[2095722485155840,4508503603132416,5175684487915526,5077991374962695,2993114047309832,1529645771841545,2259027156901898,169668635973643,5616666825824268,1440994215790606,6532276578607863,4507912093868049,7806540636809234,8901748243773459,5122738804189205,7149175443967321,4917639179302936,8216961703780377,1689590514966554,5208752652013597,377333559420959,6608379982301217,140969224618019,4233076956588068,2790837809956901,5565928414345255,8220437206861114,4441528170256426,9196907458465835,7691765547112477,2570857829437485,4601425930346542,4504405544142895,7233516190285872,4057469918650418,2166934797735603,6901656391787171,3578001229731895,7130309102835770,7408187587054943,514522711003200,9103265271127594,5308899993446411,4564580026892356,7598469559546550,6498447320244294,4100122087534663,5146941207504971,2455971223789645,8690500547403854,4249058942638159,831271420127312,7971906100338627,1333902908256348,92951778780603,6063424920822641,2663427304986720,1588113833369698,4324653450093243,1459980451321956,2476055484067941,6822813139585127,193104640139371,1675143220639853,7621471498221680,7474092513409138,1887700807802996,1348902232696949,8140330339752054,7893724828959423,8915741103586011,5104265257003137,7977700589486392,9116640306384445,976978860939398,1882657163653256,3296758891360393,2363407091411083,8012126049560717,122386089504910,5847988901992472,5637439890745491,7713730444782033,6027981250803736,1818092580763314,3874954847336602,4037139830128795,5898665226389660,389421762500767,7412374468505456,543337832743074,4649432136069285,499014123798694,3442832041693352,4906889017968809,6168088660869603,2754259842580657,6803378102972596,3267404696775710,4812694437730488,1727218179584031,6797481042434236,6959104534464701,7464436926877887,1894677480321216,8083193769658561,7168994550601922,3938492122218691,7492800699949252,1327309823578311,5049939308480714,6703813804495054,2701368743964879,6309112488272081,3272274636464338,8241194087479507,2246363463235796,7910351346849946,352572006844636,3270145110915293,1548516888043742,5771422591064287,2357875162506960,1973701620379875,4280236611576038,4898864717983975,8597223522187734,7081350147393771,2206476957016301,8779695075800092,6664789414375455,5691070771712244,948282601535805,2945880334463222,4060096298524919,1258930479663352,3599755217201401,3466906940475642,561798774268155,5130499795233020,610715158247677,3002197745051902,8516931650771199,3023732869130497,2594672456757506,7910642739753220,5326866440366342,764227846574343,5547004791620070,3062551609352459,3129377288282380,1535752485333261,4018566949548303,4798259556051216,4425950280694033,3876342574434578,6594870796779796,8371585514386478,7113173244341977,9119543523897624,8537858865127885,3003697403926811,8649513032509146,4353942214414622,2082641475986821,8920258955301936,1796745602560291,5269701585178916,4521901886279973,6766243846133649,7048891514190897,8840520065589757,2247307113077035,3465575199034418,1685250486614318,2194572404409063,3001666159391025,4450984637811422,4296988899504440,4300158595793209,8650466195617310,545941941901629,4388498482864447,8664447232339680,7307873590756747,8538719776692143,7190472007465286,6100535744252231,9158592422236695,5088456455963640,7239088247777610,4007869818757175,75552410622286,6513672157327697,3531921834957139,4393785808983870,4182573141268823,6497899961626968,8609802851308260,2947339054346586,7094200244373851,1559583177550173,1056260604559713,3031569192337762,1363932997607779,8699707647482458,2589982120464743,8736288545476968,3283817273624938,1603227501107563,8080631410532719,8800304441728236,7320740048177522,7832899340622195,716520934777206,1480058689667451,8484469254485431,8885602730699265,3255644277465152,994885655931266,4990003941470595,2204191865680262,829259765688711,976144595104137,5572284673630602,2004427351841164,3332573043317485,3090582971920784,6993261006730808,5704131457322734,4042348914286999,7960800521437593,3155855491631514,2009322596548335,4313343624280474,3426716655977541,2939583011127712,4368773873899938,269637399736739,4198366251522472,2849986547392938,8716736767931463,6360956367290796,6230406567639469,8876197143609774,6678739708090103,3010519595864496,844339276466611,2123618798537142,9197243564397884,5318472761390836,7583959259393439,2315877935432126,8777103376059125,3301452953917856,6351433309288899,3959670693904836,171184368783813,6036707836430791,6008978526888394,2731479201885943,2119949411639757,308090177663438,5125803605139533,3300418177243600,823607920005585,1294047783903702,8738362478390327,3578970646319578,5085620260579407,4425227680713182,1893902389665189,2446360417648720,2155054152321506,2185970568119190,5735387545545189,5296353546562022,6568453274217553,6633300401715688,3507352792670697,5265675222041066,5989164391365099,8869549673546221,6472932780371709,962167849585141,6566602685682166,7430094025843796,4041027544007162,4512623744600571,2492512594196989,3711702174736894,1428202027899391,4845275488853547,5609059115777741,5378730086824451,4862761650893316,6920534120824474,7996976069147257,2227481306654124,7162254641418762,7251154046014551,3278894660903436,7981313750692365,5016831151395343,5012720298312209,246856931320338,4607857148217875,5545286522012518,846921220950550,1842051371998297,39460236177945,3848453014617516,2786426756629020,958577406898717,5778599077736992,8037043244624417,3044107447065127,723115995652188,8008129435808298,7066440094673453,2256806474355246,2184126341302831,1454782575669809,2580891290272306,6165184571822644,3873683454468662,2003392365099575,709669376033338,774810306384443,3328029137357372,5920204847624765,5263780056113727,4435159412689472,3050524730421828,5257909622020534,6542631791747655,9205598919541352,7830989539146315,380346081376844,1880382467580002,1448838170198607,3017984689265232,8513863284114004,2525895909807886,7302490308090454,6726486786079161,2089344376474202,3559590335154779,5477552671461477,4490208426033761,1375906630240867,3745848385184356,1068091191198309,6508525481363217,4186694868423272,96867507954282,8517440068815467,2577652892568173,7400728467024541,548713062007408,8699193544680050,3539392757215860,3724586840889790,9200391571524215,665849693297273,63951175524986,1817938282879613,2403355379212812,6808711851862656,5879410527444416,2528018978306694,3720579154190983,8969878801570440,672749994904201,7317616058096267,7976238666752656,6290682986343192,7408775956483208,8297854150743875,7450149090824644,3659389930904219,8716327548672668,2928611573627549,3421399232606878,7962169991502277,4009229103721120,7157284902797986,2094372662612327,7142482466802340,6831705732428453,9100366895893158,2158065426526889,6343302825089706,7898090283072029,3575351374924460,472041075812296,8825184597740393,8606079537932976,4440286514170545,7507301724770994,360741353718451,6419205322640372,3588309546785461,6458980739451814,6157607272839863,2069732020523707,5028337931819710,4485748132672191,5099864760715973,7671988075063019,9199729698915016,5234178283092454,8435210411088586,5865911179150027,870802162016972,1028057475715533,3433653074815699,5676258848301783,3012175135775448,8184965056125747,4768585267008218,6561822693856684,4515118613977822,2962096436036319,1258087469945568,8434266743468772,4724967552447206,1035472339268327,2356045342092008,9218469548008352,1109566406220523,4890946243982802,6552394055072494,6112165830761199,9142339967062769,3806041429648115,7828873777148661,3780890570068777,5858475156398841,4913386389072635,8827312294365948,8581650699981566,7994982150775551,1491242300338944,2410584525464324,4035059288361733,4234275311203013,4521944703777547,2355975207117580,8154500126671629,7159469359715087,6443687752803088,6305845466162755,7441984540162447,6252042430935828,5616396407673604,2653832774329112,7672641078469051,5889237493975835,8379078482820694,372065257745183,5696279841627853,633424212476707,621499370065030,1268914960022310,6028118351804854,3575893344582440,2266662450676521,5238838149913386,7668029129365031,1401366243887918,1203279559848752,4204460934803592,7572269047210803,8364113746341766,3572811975498552,5319798392582969,324865896710623,229308177349440,4997436240683842,2763531758410209,8447097840305310,3886163666152588,6845291782937421,6771366411309903,6441127245658961,3992678893387235,3920121348176840,2144862503735438,1737644408954681,6855918497454426,8952497009630045,3550150320223070,7967468045966177,4711427044166459,8428813932917604,2719819255644646,5058993302086502,7226374902579638,7168507799905129,2279930091717483,7446839363806295,7968527982191737,8805969926644590,2269131633884017,7408186648543379,3398665336497012,1649345276562293,8412368301012870,3427121881004919,8338498440362876,3816672315917182,4731327548937088,3082182848762754,4790253140794244,6121193809376134,5992972623730156,4241899420416906,56233739299650,5229442487026574,8824866833886443,2860696808265820,6685280225919890,5982358949141395,2325928655072750,1345584911719318,4241272299619223,3469527669195672,6558975275909679,6148303583271834,8758455632483227,8223116661158812,3926868694985629,8305093330252702,1324328768177056,6604811621862306,3204964172129188,2408960937833382,4903775761963943,7639166815545500,3533028272646983,3613606560199596,5181226500475823,5445613876667313,8531276276104115,2646980923673524,6101724879074229,6191068830884790,7390185257370552,6764726724035515,7474914840572315,2766639696084810,12351996175294,6557116288132597,573459220569024,6394602044709825,6296182228640706,6822330185212867,333970107611835,6316083545506758,3957247012617159,3624243000669128,6618137490488267,4303317491909581,7871866702988619,7547932093891536,6722088505398776,1296415710321621,701144534195158,1215565410970584,5651584130786267,2673105484559326,1976053028670629,5530662360925156,3436961393597413,4240365316359142,8532931470042620,2717864009591975,3983076217259858,5819082657800701,4065381238285298,8067856083422195,3583363309308916,7661768988676606,5790422090832041,5096425523069944,4229165481397241,6853289892842492,5594445020838911,6961335074036736,5874926232469197,2498263929406468,4142434389244933,660623093431303,5229671076738056,7801065082756105,2628664634711050,5879504234193751,8902329254079596,1055444106703891,6369759325572117,6657814523680601,2095813615728398,4780079875099674,3869479399564315,3191833143325724,8238179615991642,3263582309391390,2649499961812000,6346059537587235,3233242687935529,8130286493745671,6322218263395506,751244745716782,1281620479025895,8845547719211490,151382018221105,782727374509106,1947532079109171,666922088885300,8851633792404534,4570051356662839,3471630487344185,6214140391934133,3118510457619520,6216959290731585,3136186478699586,8342582091874827,2286226077690949,5015525866892358,2517808590915425,3371202517724233,1976293639900234,525150258099276,6485265649065826,6827893171670096,4665321884969144,698817734745170,5239961231387731,850758520384596,2764158887933013,338948103138391,1865232094186585,120455563224155,6393313144536156,112742870025311,5651601556380768,2412763099122534,7879766570927208,3528104661054570,1481286354902123,1139757446065260,1360678869159022,7924119374292312,4503895277468785,8915562629186678,165169970806633,1258182209363065,338109342137467,9221811917098108,987930559167615,4955900739339393,2100324892544134,3468457584565384,6245773089670281,1059567462392971,282685591524492,3760086041404557,7633336604798695,7794848715633808,7972529359207960,2784365298197652,3740864808101013,9137408822949014,1999528287898775,1806312919790749,3655949995607198,9091510163389637,6850627862251506,2723698652982437,2091411949651111,5674558194922012,8284711112261831,2745545710644397,7872387694862877,3645032026409475,1850479929285809,1618574744007858,7283603514121395,7505125654301877,4737648829940918,2649592740314295,8036969143661428,8582455061127179,7605562557888111,1325108751424701,3658824442114933,5010834228815041,3982440569859902,1135165899629765,6668392937216887,4648306870250653,7829705441365197,1097238372981966,6132811588767235,245571457457362,6614523603772622,5678671826374098,4429010791857368,4458796185827627,8193309068676314,956234035064027,6055120840073550,3522074821498080,9068152767243472,6601490173584610,4692158834529509,2168123479477479,2239787505411304,1650526753981675,3985412773713132,8505547365711085,318424052497650,7300927895840638,5924148428774953,5327026931303672,7136355324654842,5778786976736507,3542861659018493,2883205175471358,6655522061595904,4512493151589635,7753357516174757,2297758614365453,544367201889552,4890578677544152,5305271439631634,8585320730305399,1444290102797588,1405283069312558,4810886673306902,4367751772501271,4147546854779407,4444713718602628,485833745685786,1545201752986159,4850378176644382,441795643233570,517171441886499,1600844120130852,7852411973999909,3528017478006055,658172732845353,6823729451383174,7307911105209881,7789286194595489,6971334464578057,9069628512795953,8930933991841331,7910120175140148,3284880278123830,6160709285981816,828040411366714,6106526808030524,755893019722634,7586678824828086,802892940410177,7722016873674050,8918823314214795,2362428972715333,8648027209192776,3514345100524875,8856020532664154,2220911583073614,137046124643665,586112201198930,1062462917741454,4164589193540951,3068180383114584,6399065041522009,4434140330845530,5691246573189304,113285875381597,6300438452321137,3269738782741856,6487465805023120,6925161718768996,2204513779132305,7042289512149564,7516637813255533,8943919028657519,2818995921456496,7934821541813617,3154234390287730,1362866365400440,3753701373867385,8662478628042106,4261073416127871,6781868763725184,7216270592482691,1311743331296644,4337442115853701,7997792619490247,1278903966156168,8383072920208893,6597446710310807,6284709496275293,2700487648920978,1689002054090131,9218441370020420,1424653708062107,1168981292121500,5223294333918621,6055361041310277,547961942261153,5350017403233701,2889043277548966,6222660072459690,3912942094034348,1026399432693165,7144413405176615,9104285586738927,2363345145777585,6908127294178738,8035434236981845,1012918195930550,6648419577451959,5271954390658489,8521770139399610,2231015903911355,7216838058438076,688282668760511,1456628361465280,8833378114686117,326775310601666,8462956430560844,4408050773372364,7397892604132814,1589472539823567,1806044638119376,7800278863030754,2009262792773074,7083029989535201,2754951234277336,3031784464020951,9133635614907865,4746529385600474,7804624441520719,5545416663585360,8452027411244514,791608245988835,392969683662309,7769437009466854,6336801208591781,6788288010184169,6083537444951818,1977475229013484,2704026047837678,6642158564408874,1391975869992434,3848625364088308,4230856901690622,9005700000372215,364989133131256,2996667461877244,4859306254394877,7240497835654213,4748661107740245,3088421728011776,7124870503321089,6419090057264642,838579890771459,5496881555813892,4246421819799045,5531308979944971,1875634981892354,5123738854745614,6197597282965421,6442277669486099,1491830196205076,6462835404731925,1930214416789016,6560423572247087,4406482636064283,4511809592622621,8634784385906009,8373943013882159,8835451062430299,2833061480732196,2026628503244327,5706551175796264,4959881149195868,5801645997399594,1228324938821163,8798371130625904,925846960631342,503431092270641,8042353243680691,2535933432407607,6841643117004344,5132118575961658,6788667768819259,1328496464754237,15488565063230,8269420184274495,4707230163506752,2741973376998977,3943149947448899,6992211537540676,8108985728168886,5275587429273160,6707479852588453,5412845455472203,1092865688546892,3145230339167822,1602686860510477,752391967448657,8803769131109797,588374117977685,5435366359789142,7612579871455931,8001727643815747,789462027476572,8706845110157656,3024567146155280,8820840697232996,6366280528408166,5520967395446375,2454292560297576,8279220625445820,6527720242099819,6772512765650540,261150130187885,7202111487274607,4567968354717296,9037058913308264,7528650194531955,6830826733122601,74734004725367,1372837403119224,2402146720085625,2322786903887482,6702095692148671,5495251170397820,6237901847932541,6919575134725397,7549446352701057,8671108110110339,5730205931115195,8751464249607785,3437691286720140,3006910007620991,7902024367140500,2269590333222549,3376116842086038,7020609812082327,5097825079531430,3440947418027144,1835527851042459,4076265137366684,5839253537894989,3220625815801503,8834710150700704,2518937288899184,7072943587027791,8193796514452763,8013640026420902,8746942151067566,7857344559744683,872169517633197,3104848747630254,42325696623560,167617394624178,4805850073542323,1963414816976564,6133219224753846,3900221566572222,8754116245254351,2796615436007961,9145597824513733,8214225761996488,318618888379682,6441027498972878,8163005044580047,3677251648851664,565369309003473,5823660097597141,6600963895904889,4624865987053860,4347016609228506,7672041910417115,3535814585568988,6777846560904925,7241248743661278,7428686944116138,386368609701600,7662831980526771,6489411041976039,5214769990964969,1647017969333543,7602837919663853,2827819458778862,3392260790755055,61570262872019,3520317123442420,4380607724487294,1744494923558646,5074720738410231,1991598565447418,241062871011068,224883188865613,380379931541248,7521924089473465,3396166880157389,2212535401503404,172532020451076,5949870060039126,2238823744138987,1730032582635273,795994973493002,7780668187033355,7979662265120524,4312883281899277,4400383956713230,3923766861676305,5370143016783634,8597700121820948,4430377435561750,270448123011871,4369516118860936,5350491825256219,1703211129831197,6031059111661189,4648657287229220,8348712479046278,7242754155005734,3606226018121512,4311210169546540,3233588669599533,963204109262639,5207029103949616,409978777298738,6465490737644510,269265643347767,1058014946066232,1431614242836700,2132963029169978,7124504117836852,4592452623023932,4011015412862782,3150149493397315,766005332571972,1775408811634504,6817048019670857,2086248226549578,7502612609371981,3887241996259793,7148701386856930,4605784801683282,3784784866279253,6254828048844630,5140803649601367,137823933091672,4995979896100697,1213573041723226,2867224632534877,5346579441844065,2726066882121570,6327534882287460,7937885427541862,8916645466521680,1816500002039657,6729164781238122,8696934616794992,4867308545425725,5000247174424432,6671067984486259,2526163890405237,5451417765334903,2267999894302584,7456496034715514,7745949013376883,4103519594336124,437668525504646,4665893775234946,238775486916485,1899183290644358,6820688789062977,7090777136193417,1556515466907531,6860882956011404,4333784111769485,4070124334107010,1643289445258221,2991363505295248,4347166547926929,7198940961439634,4176467840530324,3346208544352151,8462946112817049,1850285121376155,2652235522717596,5556785109669789,5874599591005058,8182191012384378,6732717206130215,560151669292962,5268157516908454,8409651628328873,3748216753661867,2799990096021490,3680392472442453,6347703308907165,8029006257813424,8735785685553073,7731843635933106,653837643222963,4173586780123063,3150265760262073,6732824080330683,8516903178033085,714484285822911,4216611960836032,597161132825931,9088559483142875,1265927184377799,4545038894318981,2582824839094218,8758181883942861,8133217580937166,4003118939840465,1973049299196579,2485547881334740,3196108896452565,1854968996669398,198631690624984,9138410214049754,7018531445437034,8056603055894522,7301456928428856,2095627558445025,8503763760323193,3821549974513639,2624851659960296,1084488937054186,2703285734127596,8741799570802763,398758917902319,6674980630265841,5361539774470130,9043472748972371,4478461337196532,6915879960000502,3595973937076218,1983353147916287,3945885122043900,4062108760674302,4516720084918271],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/802dc6bf5787992180db6ca259313edf",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000424665.1/GCA_000424665.1_ASM42466v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AUKI01000011.1 Salinimicrobium terrae DSM 17865 H148DRAFT_scaffold00001.1_C, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"802dc6bf5787992180db6ca259313edf\",\"mins\":[7227307956940800,7551649009057793,7895076869558277,3202025013712897,8142034868162570,1163918722023439,7520085381091344,7678130884785496,2945570110455826,8825904901775380,2435533735591957,59185946841112,5743125972447258,1047898902409245,7394179784044574,6076334629494815,758751137443872,8905241113452579,5918278446270821,1863442131849259,5849893274972209,1797468757629619,1927803411513398,1877558510383160,6591148520943675,8557488249917500,3784059540656195,630504148828228,1475672658104392,7001797772845131,725434190362117,3905463399493709,4734630188376142,5964403909673656,5727703996723282,9062815483562530,6728932207579220,8519060683374677,4446723706781785,7520779629604879,491521067724893,8248470626201695,7984868791955552,3079363725643875,827864419229796,4656325987913833,6927720981639274,7105063842660370,2358366660481135,5489879518561842,6227496144449651,6593981948625012,8126583413160638,5776948550758523,2570303846101118,5186278308280341,8670917349423808,1027916890349699,3794951532101765,7493695876558982,7172191431102600,169008216117390,6289620142682258,1393887466516627,4676809196773526,2091401868292247,2572664561246361,8698466785046682,2540415293583515,3239525004009629,3952655898792094,8495245337895080,4632843072008361,5389395336790187,2220084613348722,3995816062152878,6661333972664349,2616631571842189,8213947128459442,6781450952003763,6000533875110071,3433180526426785,6665467888107709,1652071297753278,6953706591359008,8386683543494850,5230397113594051,2982504600219844,3571199300227270,7639271918805191,7286276819001544,2182594953830601,241499807961292,1155148469235918,4914089478951124,1783469993447638,3153375567945949,3765369176494302,2161688367035088,4605698889261282,4056665182765286,1790913136378087,7163819975957202,2004015095103730,1895480644702454,6434774453244152,5922387587821817,8970161308724607,6042054252847361,1332612076986627,3814562033385735,5457578745954569,8984058366909143,872432593669506,6526206012449041,6397431492280594,8906652921613699,980925332046100,8970183812274222,2044848307788505,2953985464381721,727189541126427,6889812999553312,7264199278584098,3606900654874917,3393024465236267,8041474808299820,3929188690436397,7591291658887471,702699630186802,8591540541710644,881755623141690,4981000499380539,2512941383314826,6714731767218497,7726844956709187,5740609938751815,6681937485706636,8297403078644045,384885946364238,4460141474013519,2741811472257363,1932755455992150,2833413093664143,3240029629927774,8633771209671397,3348923969352032,4218589082763618,5802778136846692,4761959156789605,2670883567911271,5840750941487464,5519512178086254,7371168129311087,7150142087180656,6497167237004691,216384561123702,1557322120462711,4482455711777145,2458002570822010,5947142675194235,2924149335581053,1619479088800126,1860017269379459,4226858602049924,6702427897275798,2649955289440649,5262266375905674,8797191307694479,1740993065931154,8396422238585236,1455622812586389,1267848158142870,776123585458244,2322354303040239,6362098771153311,1557960397083041,3590551134507429,3810733153874343,4097245645476266,4616767810797997,3963840259441071,5277115262869936,2993071016298568,1533143414944178,89965704868276,4309958392369589,4103266888147382,7525022526874040,7030587964875194,7078374782370549,1055803603712075,777849373389261,2630468505473486,4480232759869904,6885506230854098,8948734787654101,651834607018457,5789743702761947,2344119248077278,863972502163937,71489112003043,8586163854630994,5782931941499379,729180477724073,4325780046590457,6115249560917418,7288763454300671,5392665882657284,8063934463717278,8179515271034284,3558171854049802,4978491101807117,2485175926977039,8774603703046673,3316897258888894,4801931569672724,8154232501144226,3917143550247447,2694590981370393,6507847755059738,2414821632917613,6195331367662110,3451338193453599,4399854355911203,8625302828696100,6066992910316071,4324112428343850,8199339622245487,1738760657825885,8268959102298512,2686611156385492,5834406919103031,2341751048053304,8336447648491477,1023766086857275,5713496886022718,6778951978667445,9006974148067079,9026557090277165,8007328101862155,3355792661975621,7688494616253001,5248321124295244,5205749887117410,7619487347200591,8950947819627960,5221732734743123,1096860173697624,7450464272786010,8041325890986588,4446678227522141,7042301394002526,5074125421045861,6574693006848609,3122459826405989,9197226537987217,5813161182171756,7093223303123567,2304414320306280,8946581347336820,7411102962594422,6198507416850537,1134348198707834,292641478910588,8690130868286079,1901024107643522,1810436689011334,896277134414471,2597613972738696,9099031895196300,3140909100257389,2969385962472216,2975769307198099,4975695381156500,2145056050758294,329783133295385,5460927348425368,515347640464025,5977428682633882,2942603178332954,3486827075207840,3875847518118561,7546639558030515,5290873623345265,8661456467014314,1287402385957554,8619991544361652,4229187596288694,7153856613159607,3705214076019384,7052117709611706,6681352044589757,2287070807659198,2123501292597955,7670327166300868,6295853403755205,6295563425080010,3101177007207115,4844429719999184,694524355928790,1432353016468184,3538048143074011,3489837552047582,8976976130151443,4677657460744929,4142910366941925,8211667151528680,7487021247982375,5240170318324464,7804251658802842,5005764126880501,7763876073836292,9057292508226299,3007385191547644,7778256269841152,4528806417240834,2007024270258947,5741778322719502,3128205672443352,4506048319628051,4734096961864471,1046528601981720,6987232824693529,5792332688417562,5184887842390811,2049705913439004,8159589229985925,5592849991193377,2293700008227621,6454451411981094,6367045317047080,4025212134581033,8625375252636461,1786368298664751,7228645007893296,3354446074098481,6369126786970418,8316244319358644,508029290328885,2464132104160055,4068417734484792,1590857410042676,5659484540187450,369347894289211,2241651052184381,6190424412197694,6224447236289343,7160165825530678,5390670622135111,1402792964797256,8292948769796940,6694957542712144,5880850826162318,6366826164548438,1665656596697944,4831581564072794,1248213220262747,7560323697300316,3378437288026974,5677501903545183,8661253847606274,2443348172755811,3357541619103206,3256274298205030,8214878774989677,2868675857003368,1608332505981802,8201131181618027,7446919375991660,2402658750112621,2547165439023251,3869541422719861,120936455720593,1494536939103097,8369165118792570,6456415044776828,4303732213027712,6185915363644291,151601380479876,2018466986689940,4918612533702807,953818920002446,2372736459350927,5214943468733331,6662491369751445,1665063918683030,6322161096704919,825520455889817,358907103650716,2224335589958562,363185004667813,3269792290790897,7861510329365418,5965465670642503,2109328225125292,5706692107961261,8463963329029038,5055069054742685,2006198310071795,2144135169393589,1677687137612728,8278359021447421,5672401227228092,2888041443804095,2024003361891266,6788711927002052,1733486776370121,3639272819509977,2065524200879607,3794751161748984,6351286623347668,5321537023092900,5538273330365402,8829403717137373,6544157762511842,1310175993267171,4008473717289956,7128823562671077,7989070328566764,3420973113611245,6893780887167982,3451955670754813,2615526710604784,8342710542496333,4830168495129590,275227088458743,1363039477233768,4434901391123455,1489179360441345,4238064946340866,7634698186511474,2665545719927816,3001524760503306,8097392972129292,541597588288526,3284676901987344,5527598846981138,5249814380962835,3618250687738901,3735933481755671,4003239213761560,6468189611837933,8807093605053274,3128277831230495,2056687453135907,6049784310187046,9001260142407175,4754435012883501,2690061143371272,365014679221299,8025527124046900,7342497533437261,1611181931754551,6119959591171129,6153338950587454,2279901437281344,8265725944344075,8248359255876678,16099679876167,1611610404648011,1825470138324044,7089370262131789,6723723439436878,6169535349311672,6413706763883606,2139277682500698,3997338071376990,4438752853607520,2448260148237409,5009466946577512,2356158927881321,482031561819242,1277115514639467,2035064381367407,6667055937238130,7313425198650483,3728957409951934,6641558705726586,4524297086141563,4066248791524476,3995281936647293,5827539145606271,1797623992448129,3107866289435778,4882128763711893,8283824916604041,2984337678443658,6113353268851851,6691546658595981,2448531782947983,422754440074384,6943636002665621,1950306635793560,5623048930604191,8720801739241842,1212655498445985,4840091697210531,6927857245877412,5352849226548389,779852027300721,8109177665053864,7545797133534382,1834199007069360,4994184820298611,8964073401345204,6322839308620982,1380712661323977,6027233564628153,7384937399334074,2543291397797053,1095303249114308,8725289396090065,8108531124941434,5777706172921045,5287446419338454,4103794179171544,7434275548054746,7521655692498139,3788773997065438,5491546673378528,5737064847004898,5364395491976419,8011093224461542,6164892413156903,1495139511706864,6136794043688177,605470527452404,2493273268708599,4027190933526632,546343646364930,7292124121708075,2400242653447428,8111909594833110,6545094862681353,618217010627854,3884957886104847,7733971710320954,218683333580049,6197998213571858,2980317437220115,1867720118314260,8075583122732314,3115040092890397,5461849900283166,3708957572438917,4639693629011232,7223398479213857,6765561235862818,3864498544334118,6182957380932904,2753243846608170,6930508906054957,363252529632558,8351376447140809,8807933144241460,8800987781104950,2609262280504632,4316390250112316,895331408944693,522336116569409,4353635972031812,8219320392660298,3346746369066317,2213894599406932,5239348572033934,4847180668241239,3475994254890328,4005558604621145,7974493278300621,3378512462349659,9146058915001692,6491421094315359,4880348530615649,2071707422381412,6819433420240230,2253868142941545,7609065045539495,869961695139185,5423545998345589,7472379655787894,3527744180501396,2283646095619451,610926897128830,4567409272300927,5986089566232128,8246492156380547,1494348421332545,5107105045681544,38227012736393,2150139493028633,1105157466125711,2616143705830800,3104250530698641,384048340235668,6412884343264662,4671560804612265,2159033997591962,353002608367003,7533164349879708,8378700290509927,5635197210117534,4061333580699039,7607708371330465,7002077670794658,4919400291542436,2505096988960165,3390374608381350,954582743151516,2543631521682858,1008399099356588,271450309256629,1062766352262584,1435561441105338,3540716679636412,3883665485807862,8099794374723015,7494802408437193,6231928230086090,7471037170099660,5797040836584910,7163306790374989,5937561687688656,9145275823000549,3021327190171897,6451005750769115,4246128097076700,5069928487847390,3850027598017445,7200153503065572,2052636817331686,6784631615792616,8909135200228841,7899499638989735,3300182831699437,3227725018211822,3436885452944879,6764780572517872,1340067509167601,5365360449709555,26203889849844,3731432693929463,2154933309302264,6206568033326585,4247016011998714,2864307566765565,4872478781474307,3448887087445509,8399783122167302,8589000406210055,3857114410620424,2267063931650988,2640058280011275,1822805564610062,3217550390228497,582500339725847,1094127234774552,6344691913586202,685632806266396,3317034056406558,3324263165515295,492898577233449,7262115319501063,6120782961632812,7951649235375663,1020126982067762,4353284225226292,660489134384693,6863036551209225,2323728646559288,7107995833015887,929569337431613,5376912975296062,6576608099687349,4150724591342725,1612981055309377,7180857496254018,1219297744575960,8843519578965574,7001696187827783,1776536320085656,7826447061182029,6004394829928015,2794348067444309,3374173901567579,3413697133139550,5731666972188261,6278570115110498,579383894644327,7359177112083111,175770361771632,3428925928711794,6362017758710631,172641834451220,4884162909701055,4501007373706876,3103294960082411,6761593290005440,6903884261987970,2151415266641542,1047996232201863,2903726728898185,7600608261644567,1834213604466285,435029392299665,552376788117140,1760062371485334,4448213989983263,1143975665112730,613984096482971,6523318341277340,8340147840669,4434375398037153,6514893583648969,1378264913409703,809224644425384,8343630197450409,6296295832549034,1424431377389227,6442174191363756,1948394520585901,6714459362907822,6453444096153263,7024478027007665,8009494635988659,7442951345899190,1509499480856247,8476524031129274,1836067061862078,6116842207834310,3558838461826753,3774073056876226,8547624921900739,317358453319437,6949205950342854,1821720644388551,8330929674102474,2283474244390519,1825161552791245,7235067451504336,6448466995795666,7600671440787155,5033851457959642,8292609704882761,443987653764829,8644741351315166,4259374060828388,3130758221628369,1521473603106536,2799109468399337,5747936760182506,2255018696885996,8745816902663153,6480671260272368,8744990031611634,2802124250447788,5478905292437240,5297607684794111,869593609115392,5457243810328875,6667085258172167,2373739264575240,7935342122293002,4623516071261826,6124631426942735,7073014636918545,6979451177633561,7112318807278554,8780627757274914,8515834939840293,6041594742081323,4228284877297452,2614059300849453,332010614490929,267976190822195,3029220883334966,3462234959730488,7102973114533690,1702575917901627,1081691310626620,1604983623644989,8574416554355097,6628014116938088,6437451156064066,2921153276493451,3891670885242693,5781561158592326,1329387979700042,4554466663606091,8351441112274765,5474570151778127,3974885319912419,7090974160668501,1161006153656150,6903178361399128,6859354597652313,7938619959695195,99976941807453,7667871586882533,4015626677036896,7447443285006178,6590606229446289,8622269063927658,1792281231415148,6448254806423411,957281019770740,259652244580213,1466766244244276,945287598868347,3448579121149820,3426467056502653,2795979652761470,6092397232555906,1189944522149526,973091932796806,7672214921557899,5002125701937039,2266895571988120,7126734049819439,6462880556808085,5906185718605721,2604842837071771,7041240118302620,2379073010370461,3060223624284063,7951798498170784,8575816359098902,8025402122798747,1527604490336166,8199595203540903,3626403356017728,1568574608758587,9191108114079579,6335089414662059,6568262250518444,6268686538069934,269703772534429,3431994217664505,1277554444220345,2665209199372219,8157650498185693,922830243268541,2848208086179420,8106335385229251,8718562141333304,8890235366160026,4868762037077960,7391046279239625,1308118103975883,4666116941801422,6584938370328909,751985809053652,5369333264716110,951137203283933,2364311990310879,7765641799686112,8209439888746468,7999229110761445,4389382281594857,5475131812028071,4619037529874771,975082242620414,7774863599402665,6327354923444216,476237785401684,7231679942466559,4225971944380412,7127440984659626,207101897541630,1303308523190271,1029859313960961,5940978228480004,7605660520015401,3576648717572103,857967844743180,3035950809187330,661392265791502,7420427427710994,2378640121047059,7099713169429,664167521204247,7771072801805171,4531010068375582,7038946551076895,2636001193842720,7678238674588463,6951690898728995,9170806821141510,7959890696262737,3140403046463527,1882213570424650,2461972391643181,7125959846885209,7814875325317684,4991266604255280,7149599406778417,4551891905611830,4407737758107705,8664565384911199,4092504314370109,7161035656689726,7159744744608603,6352419431782472,8498537896400969,823619410159691,4309158606800972,2440205092022357,8495922318929299,2818975671765082,4933316536129629,4025346754793829,7587429956782176,8881217235400801,4187848357861474,4188126339577957,7222347407800422,6765438019389543,560539117971560,8214105293961323,2604582623729777,5634132586772595,6706115370002549,2761140080482428,3332064892414077,7126711990834197,4564519669377152,8926178231994497,981575250966660,6393059347245189,4661530133428358,3187823249000585,5452132370839690,5448125274782743,7265868993915021,1094713814825104,4094493530540179,1862916933988718,5824859339876503,8484211789785241,4313328317454703,4623317615196317,21150132541598,7178746563951079,2687872637348003,4177704301639844,458488204940998,9120882883782824,1040629651360796,3805666851436716,7912780398131373,3109974331881646,6018701392521393,4688416812669106,5065848651352243,7533659279546549,9192321355560269,1067196710579913,5632845606205624,4161180280899771,6628675948456126,3114523451977256,7907341611079872,4456521699945504,8640277787900098,43618755324102,8359149296871623,6987504024635593,2465860598813047,2711784994262050,6058077158602959,1761924193700048,6656328873838802,7011368835528915,2678006521911510,4568513998791033,3569569166526680,5222428854008026,1058615028174543,7629640536039467,2523997521639648,2720217542359271,7398094417987965,6698006074054896,3413875650672887,3486219433258560,3483637930041044,6076743218669818,4508293177649404,7231229217073922,7730067462088958,858881730214143,6586794031569152,1859211945270998,9122117150797557,2215910268041480,4621923976199212,7977745398532371,5593153248348438,4071870621550874,8613648950023898,2251490482108702,5609758091917599,7257736409180454,8411233523722414,5293341882090,8661954127379427,7310972585584940,605685822159150,9003390621443805,3579038279292590,3159082874914125,1097838828441993,648862972840249,5752175312384394,8762548141988162,3682760584022340,5946470931343685,5511284861778252,1141580439374157,866977509665102,8190615492944,384654181996881,118312368773458,8028596953049427,2189134710114644,4008291182860629,5738119446911318,6047510152378711,8667772114078042,5524192636406107,281570170657116,8875543252400478,8302161071565151,3776796203944289,9011640978647394,2786268781783395,4901350725540196,5005044190116197,9067997672593772,1393581551516015,4431488470833522,1492190062745971,8689004226836854,4035061090064765,2418017658374527,295713556609409,4234509581425030,7001246506633609,5904900134328714,5332695817337229,1578008014225133,1222528136124816,7048245726951833,6980590800451993,3130151649905050,7771094861523356,3609450321278704,3184632943606181,2534990816299439,2927003921918384,8487140399720886,4594194183629241,1770859696634302,2643340910612213,6423210613848512,3155935654132165,286550122334664,4526761458461130,8172193245104587,6473707797817066,1976002834176462,3029728275675601,8601275966132883,9016898004661326,5473983946226135,2082106750917081,7499375467043290,4210221683272157,1586296019274206,2003761748130213,2539531985988066,2523507490367975,4703856408857064,2874326455306729,586383645071852,5247805098633709,5207475970324977,1687195067890163,8601987402762742,7106394911803895,368823081303124,777775338961402,8527530718568191,8993524942944764,3925299110754813,6653950728870398,994924466153984,2755880218659329,6407599759149573,5825841675729418,7546689848011275,2890129645870850,127466017294864,7969606330849810,6307169360390675,5330575672490518,6772047096977945,4635125948869146,6767981439400476,4085733413128736,4706341282806305,6669486334720546,4270293796989476,2819324247104041,1338648442776107,20070702145970,2549481554516528,8994840598791944,7487936339075065,9027985844959797,6410649201100254,3292800924123572,6318639776893498,5089902606518846,9027379751078472,3148037144063756,9199874768018137,2655746396920399,3353839094598226,6309491107580501,3655413463677527,7003067082140251,2768528118418012,6867177052498525,8618097718983262,3112309011507812,3188525952428648,2437831106431593,7135572649204330,1632788809501799,7234003782769263,702793834928753,7506619326610036,7753724721738175,8590478607757077,932447110040193,7290640542272130,2630940750355563,3926207106394756,4500109936962186,6123452891286157,1598859062495889,8248484945115794,8676737474529061,4717118801832600,782328127566959,4380798464437804,6149055244163745,5807013526846114,7475476746545982,2879279028681380,1477425989323429,4138830158043815,2339128586488489,1587939984517804,7199498190486189,1989957240289966,2662526884604595,6461178588162742,3012162561444536,7772959759342265,1676210997160635,7432284588706492,502943596694206,774997226349685,3555134101539520,9035674640226763,6442907214535365,7935792650504903,2973773171477195,2071519912295118,1122780554156751,960553840220881,3291982118689490,6478958335650516,8698704339729110,3969985967377111,1153873293695705,9162025774963418,6654245845072605,468729748060895,7015672784480995,6384053859183333,5531393628109542,3333233225145063,5203777571314413,22621889129198,4371690218810095,546464104958704,3945464102460148,6670920758020866,1027876094810883,807255304874760,5256002373065481,1548648950872842,4316019098213131,6594506794662668,1734025297440406,3095880277874477,6046180863515409,4860738658212634,7489187211514901,5296351555914527,111273507732257,2998952620473126,2447973307287345,2226839269968684,8166944498686765,773430442093359,6895922267724592,6857383373114164,2518534114957790,2244199040392655,4191746385869629,5516866399603518,1697088156515135,1599948693453632,1300395932420929,780595776682818,7340699498638147,794360117848900,1144922962647878,1412561073593159,7886255656934216,5691824795073241,5199248040852299,792833462880738,4612272021281614,5397378953722703,7482946196216656,4155019538504529,2352978716826065,1502728163912533,3298923216624470,918874305609529,3236396974148445,3679286172629854,7459398744574816,547067787379856,4238261299575651,861024983980903,1627813277371242,7066126056049515,8398260114988178,3326712589233009,5242349704166262,5717943516502903,2878284711906170,572850203929468,8772318376490133,670844526566277,3840900682926982,8510448235330439,2493836255746540,8133372227464075,8725800133131149,3804914604821390,2888362671455119,991164217883540,6240416069208981,2806884266392474,1618611472133274,3574829816388511,4498703862959010,2875814431983430,1955816525491112,2027543662587037,8025755018927024,3359984535804853,5887818804616118,6281701074290506,6698792952019902,4703850121747391,6096820271156160,8961564087756412,621758322682820,5240827144993735,2413069739957192,1237234467457994,6154334286457803,518749383580625,8397167814011017,6700267771841492,8794172807729095,4404734045772761,1704830425574363,5023712871197661,8744482320718814,6746137367948259,8921498693442532,6022759610727397,7685130823312237,2368739817229288,1653400668503018,7952636657734823,9173065797700589,6788493157821423,6214256308833264,3047168425573361,186179004070899,5534963198151670,8892643347427400,515061821754362,8505648796515324,2536064348392446,4680698834414591,7426257493296643,3857164390653782,541968264612870,3877104318426121,5721398610602734,7216550682254351,3232952327466000,9184629370629137,6793610412444691,7426601758915605,3756079308635159,5035582529788953,3993252614220828,3386173344459806,2660122353597472,1848004568136737,3048770537757730,8448839938006051,4032917133974567,8320914770115624,5625754229124138,5695627542809644,6617583416372275,3178232858516533,2819978766887991,9142755308819674,2242444205054474,7387089790807102,9173005308153013,8096489955851330,6466103445453894,8318996295502922,786531451309134,6688582591261779,141358454009556,1102694834404441,1461630320053339,7897167375772766,3861917338846227,8547577755594998,8825188213697635,8386787308473444,1741084946918503,4667630533262443,8526838680353298,4113566126484590,8130709720935538,1191484230438004,6672532497734775,2558493321624697,5772326055398522,6511540814949502,926854819953792,9196486808119288,4942252283128964,5335425041886341,6089746745698775,2693119209764687,4418936940862604,7643390022491278,3492568065502353,2019476170943634,692184721394835,6707668316118164,497360693751662,7017442161746457,5553194473036952,2341979249388698,4985983288977946,514791176727710,2143535787265183,8948064117701792,8547098223447201,8843861707820194,1947933470014628,6490107275582629,8249172666477738,8981129349045419,2156023235108012,8589144475770032,5994733144054961,7351387668404083,3573835458284725,3405328616549559,8930534607322297,9010316385389757,751472584686782,2452702912993141,5429597685288129,4844452698864836,1008829675891909,6558126468852936,3288691344631671,7711065226476066,6659395229215950,7291884546899154,5524620752927956,2915989724297764,2536739788602586,2045909061168347,2379277492018397,6177609309158624,5859319038926050,340754487422843,6845592779943141,4468074214513895,4061586369416424,7465984391127591,7838972433411310,8906884972418941,1061055725886311,3179466791980276,3822770960346358,6464094703301162,1556749990296830,5247054907067649,8105529662393603,8141074782051591,1505678903246088,5303012147174665,1574277137501451,617936865672461,5827057894165776,8301815236259090,1145105073462489,4667802099597611,2849695573273882,2097639349243164,8551962286329050,1391780378393886,8879955225890079,2513614616259120,1967498990001371,7388941859540260,133270629231909,380260709989670,6144708163464487,6996602966404403,6225697890145502,376852713196857,8919929395391802,1798459898543421,5291771242282304,2149207851097410,217965364403523,5099290796887367,77827788602699,8287047679520079,4649533660990801,8618688795962706,3560954622545236,333753071467862,2626700605570394,4346745025925691,3510489745883025,1519007004413293,1042919883648367,1746175740300658,702361419627892,7068098246302270,3180134359805302,7572067709459832,3339525493816698,2175529348152700,2012772173426046,3695510387015039,3702783707028865,1911848415378818,4589609493634435,7490503104891027,8336774771355542,7520177863699849,4679424110247306,7171085031984523,1078015574945170,2654541726899603,2002222068358550,1601527445765527,4551102161603996,1973237315878810,3243729646923169,9110615218171298,4549489530457510,8835235412908210,3738637297809308,2388681846623659,5952055924923823,6615916638657968,5099000496202859,6234575545470388,3290224536550837,8160675255126983,6306113462840759,4143448650112440,5198281929383353,989723911962045,8386477027929534,9095502490461820,7306597714644815,6379249018580419,6221616904523204,7557334946393542,1817913644879307,5356551999475148,3539969590214093,5013352265670094,1008460043137613,4365244267900369,8987478319191971,7400440581004758,2872504138755543,170389321170392,2363137446186916,2721616199605723,4216921954872796,2410584920677855,7020126869872105,1112559227747818,3653560588729835,6410592022146540,1009925123085730,4276701298150899,5060606742883829,3992099422379510,6209776026934776,3756041318243835,8965859096346109,5651027695734279,94960862240264,4719969543704492,7522410580422154,252988528963083,3418249698242067,49552350498734,6276146944196120,7968589153836570,5267840975568414,1494994739174956,5891286210870816,2734231782878755,6434483471126055,4967588753518120,8754454549954089,5528877494062636,4870979073801773,7304163827883568,1335841427504690,5604894460403253,4851677871787273,2881681959722552,8208044528303674,6259886118728287,5719361000635966,4893834278919744,2454627900894785,5891277316218434,8998550404320052,3070273266609741,6844845233192526,2092709279841549,5169788158697043,6312124523503193,3505347620269660,7856381324242874,2395065425612382,1482121220047461,1699533230227042,5756307465637477,8698101873753704,397355491704154,3013806080865554,4987992337256047,7514748224945776,4113640364022376,5210260798293267,2590163752675945,1529530929262200,1550377792630396,2570793358184067,3582048966827654,5429823483412103,8102454795284104,4151877678612107,4844009107689410,1999768886009487,92169019342480,3564591020760721,1845652358508178,5205199188070038,1983187621645976,9079365209125487,7703829844135194,6441511163588254,8829565101661250,3547327485469297,6187534173162780,6641846220091050,5175027608612523,1792895852539283,7197898085940909,1015571042520751,2269170322454472,5142054967058100,2916552034950837,1240095824350902,5110159155736247,6622327504101049,532035390766782,5557469029338815,8920114328895169,212454032989890,7085202442583748,4720794137288392,5518203091304137,619774097034954,8785454530629323,1384440657465038,4841655425203919,8603229984624336,8390635354848977,6474982432222930,6008144763289300,473987231276757,5405744383381206,403598428566138,8719075500101343,9174302655626976,577447466872785,6015572608683752,4226489394499307,4793712409923309,3824977808965365,2474791416004346,9011410240750207,1753694872417860,4422852103241471,6020791594614530,7516539270446851,6216826152931076,7435474538139398,6187516663725831,4301782386466570,1861039648034571,4004086015090444,3539896465411854,9144420688946765,8870918764813859,4838870819671826,1957269193111529,5961012519376174,7189282223536772,674440152411933,3783331659053937,8736921113825058,1927687538138917,348968846561064,1576529839812394,4952990816563847,7175911074823981,7352773910478638,7410185457446703,858260418277169,5070648343678770,4915042491379508,3153123733315383,674568482107192,5152248285404985,9216822941219697,8752493258819551,127392406531901,1526021062422339,4488866599673668,7663946300762811,5979206689300296,59542610870090,80285239119693,7199563296897677,952814506909521,1464697626476370,920741134663508,3154945937751894,5808930326335320,8305851262727336,6365602773036892,3626808649437022,7539676121276332,1665530721087333,96938668289894,9045589724299113,5757538211226524,5639185346326382,963971919536787,6605123061612407,245633655140020,4623496697868158,2280478120718208,3885201085910913,2568880466878339,4024031715517078,7641329425940460,664906566168459,7966934796380384,6050466369542808,17045666627474,389033701437270,697054933450305,8121424019481241,865500317892506,8071572993486749,6181638259040158,6437204855709600,5888434357500571,642668498759588,6876447534075813,4851774068301735,3617520272809897,587996048998316,6868594732859310,6010677716442869,3365997447942068,2509379496214458,7177442528717471,6925180855988162,4790893602820036,1659754882691014,2718143895581345,3250482282000328,117220914892746,2007385549418445,5308327754145743,6543228104159185,7294215756644306,8787404437072678,5339322910023636,1814737179148247,5122960991526872,9217285827309529,2294852456996834,5936265871466470,3778593119991804,4827603434811371,2471301981970412,7704848024813549,4980461624283121,7417203094169598,6750568401022966,6030411308904440,6330368803319124,3407712750325754,6195835376844796],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/81d3020367359d305b0e21933faece1b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000209595.2/GCA_000209595.2_ASM20959v2_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AFFA02000029.1 Brucella melitensis bv. 1 str. M28-12 M28-12_contig029, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"81d3020367359d305b0e21933faece1b\",\"mins\":[4245753171505153,2290817701912578,2520444369952771,4683594109063173,6304829074173959,3607741966991370,860854740538755,137097808793613,2020684051038223,7210327278645264,4041075251888148,137166301118491,4190829792878620,3985231178469408,3394319707250724,3173401212870694,7093913991806983,1449450757095477,8071648607907895,7211598120990047,2109168891392060,6417390810804285,4750742242103359,1910396042055744,2100310727041091,2183399784435780,7485233235714119,4666677458182217,2727408528875595,5484608396214349,6700302807597134,7355270854766671,1736098421235794,6484445602418778,8867089545310301,3923038379028580,31193643442279,2724076745605820,8667094127911019,415636529688684,5117921160364142,6056849018056815,3963061615415409,3162176490156150,344001773023352,2023812919414906,3890706066100349,1199254905696382,5230542207737984,3255380582076545,6414585093922949,5951988214194311,6156594773270668,3099201762840721,690409298407572,6952367580565654,1732268302836420,2595144686563491,8454705966973095,3908841125671081,467974087639212,2082943862874292,3209981037953207,3646503878734008,2748878943223995,6977895549816864,2874737039134916,3887235299090630,535166306619591,1624820659622088,1618531664543946,6137036859568333,8825931866431698,5781646272872667,1533698870714588,8256042549444833,96103180812514,7117992120942820,6588583825592358,1065028925833448,5646508784128235,7548475009655024,4100201390342387,4241273870973245,4930222381256950,9141945358532856,1824700836077819,355069176484094,833081838407937,4430944611799298,5222242264281347,7568860121956612,7343137095827717,9172062364844294,3329988121178375,1090128310649097,1543360017457879,1212476833887619,2967419176087822,7284077277459160,6633741813310851,3506700240953623,3561998316746116,8576889257136410,6627938663932187,8389264377166739,2279314250088736,2260802754699555,770808557363492,3162141922246949,4987523898347816,6777743184422279,5698206537953581,8285652286546224,618845968744753,6532059679301940,144010128146741,6699311731224886,1852456467022135,4203004412088632,8925353106277087,2186359222272319,5196306207379776,6790467319472452,6223556295397701,9134698133741895,114607168024905,1457430624694605,4386958971187536,2322492544807249,4679347888914771,7359102208024919,1931166526312792,1591127436425956,7175234778030426,8408248245633371,8308492330807647,5117256667079008,8750879892078651,8530887283450215,1712608915710313,7169808710381934,3692217601053039,6445065016373616,2103021074053864,5825998122279284,121529512313208,3208894235640186,6510588920390013,2211446021968619,8158950884282757,6390781098623368,7270126469665162,952850089537931,8085418945646988,5494757498470798,130598429458832,7082179393081745,2554951473516947,4806434481824151,4264563659952537,8410333512911763,8128830878675357,598487745362672,3536262225698203,4497187182176326,7714921026916782,2465189947240880,5260694797427122,8633369417452958,4942191353967030,73881871684023,6381088239514040,3772080726090169,1001521630568891,8129231871817414,4067876289417663,4705867693965764,1211648695607752,2464927184906508,8802646008761049,2795640270299599,8545828960973264,3185410340520401,2357165788230098,5315695730168277,5484889544835542,6090179240919512,3735972780740004,7540350558421475,3312646364557797,1758410348884455,8135206181155304,2768327971267050,9156876579163559,1114816454402543,2132439604302326,6668301537777748,3877982874690043,4069809237185020,4938099411286410,3212657407001089,2152615792480771,6863914807345673,540576674652682,3965914681926155,5695013643825677,3530953701339663,8034404789302740,571760365629972,581287480848917,6269285286269463,8113350684037656,442088164200985,3635054359618074,8496142539850271,5465558403469857,4881662816154146,8690415708688932,5101815407682085,8023035018916393,9117639903953450,3648210532598318,6419955146809903,7527205037179441,2232852027626035,8964625885786676,1989156370137653,3768031231435320,5826808361624121,6390935469507132,8501908957725247,7752139363050050,900937415668291,1525444462469703,3712345762251336,4993225712816714,4311032333664843,1113376423653966,1984988832268884,7045089456710230,6529472941199959,7680824164635224,9124113602437721,1611691547853403,2541912316719710,307366400004703,3950894981485328,2141238760247908,8752831202429713,4189929301409895,4907516734493292,3610550345278061,7029562815468142,3173769014551151,7585997656515185,8781900546675318,2611724295303800,5126154817548923,3998487236964991,8303399053853312,862151239032256,7356380653331074,2911619278762628,998771029967496,4211464982872715,6530791363650188,5315009685205645,6025145385996944,7146792122823313,8628239847751790,7779902744996633,9106273152251332,6835596371718810,4353219059573403,1109948662297250,3454047523424566,7469497862861477,3082351390560934,8908133763482670,2502819558650541,5291905258291889,2339341559222962,1945481249739444,3493893223775006,7575428398699191,1856999926796988,7451984930677441,5336256072913604,7991298733916869,4620645803451078,8636435987869132,5608455356547792,6145849206280915,1454569309864662,4110792943706839,415877296763608,2560260190458585,8954564660327887,2558308744180447,149224697926370,9130037742523108,2402177874588391,2169642090984171,3088703932494572,3619544162280173,8972434017628910,2152136658457329,6340490272055422,6775920204536617,5782854586278648,1946450463598036,2602642570986234,2712520800170752,6394881092386944,8897813605376889,6647521601159949,6518904040973070,1600927680543533,3438937891218192,8079968718200280,6595656309543699,7720371056235285,8773247773350692,972070678926105,3263831436886810,5726720484221728,8444899391830454,4749775839413035,157429806416686,739808607937329,5239846728768307,8760463265764148,8795867285087030,2319465071334200,2090560974267193,1218413673530170,2984728932660028,4420040920654653,821804969304894,6906413939991359,6928810146614752,4739686454805322,1397615101263330,7503836344631989,2164681075127123,3720528968972557,4558851800163157,7508818643500283,5981883851764573,4663884084773726,7100668865463135,8310500322382689,2507010836759394,4242360895210341,663203389035367,8860705221546857,8033771603526506,3328471114453868,5127632428778350,2446894411080559,7458847243379571,8610620557366132,6882598821487479,2257839142753144,5177567792554132,7192291731141439,4889495840106645,9076041798215542,9035098046432133,3439076386128774,947033642005383,2386378493842312,3296361695099714,8014420147286927,2693040299578257,7401830565139347,2492029065507733,4568460641784728,6964175580158788,7447379555824542,9199389055974159,8091356516896240,5235383357318052,2797637837009829,7145224654096481,7514627204662184,1003516728525737,4730573623546919,7924830831739821,2102320866724892,7222071485944751,666866506372018,9007522953249717,7408666872382390,7307574944703420,8265725016245182,6986380158305218,6362237798990787,5238492489454534,5405035942934690,5252529575642063,5822968157615056,3848373697958865,8420936091243474,1797291522655187,2816844051776468,2341679471313878,8277187934860250,6112092274938843,7268501923062748,2393761012241373,2643045896070113,5817059574342627,3027961067672554,6051771518526443,300993840337903,8675565152901147,7473968293278706,5043061178065747,6731473392739317,2306265762740393,1111097211917304,4132806604284922,729170992260092,6477556435768318,7016600663172608,4482233069786119,8250909929219083,6371077266621453,2854066408539150,5875838330717199,4999665973717848,9156965961737235,7171855291343893,8617663238075414,3667302528841517,402874808572841,5502917965964319,8857339580720163,2300064893684785,5293915609650214,7009475213673511,1830994028430376,2352137327858730,6785341265859629,1582631667983406,6287095004636207,6896312559682615,5038340012414021,3385760806521697,5666321965663304,4062701393556553,192368797701197,4595723302929488,9152759931098193,9152999890023514,1517092850840667,4716002656232544,6627161243223137,8429431222506594,701490227602532,158672223642727,6356331724502120,6395653058016362,4230138689688423,7682921838445686,96010580800632,298600519009403,7521364353643645,5510277533955198,2154874505380993,5872835822728326,1253391153214599,3652437936465032,2062577086915436,4457773429106837,5296758348965251,3447026174518413,692596438221967,4339266844812434,4826675125867670,2130066420712608,8217085377828002,5536239062582435,3746445712287147,323493486642348,1380452078331054,1358119737504943,4070476560942258,3307711285220532,5474754142082231,8203654356878527,4268391174038724,3864275231907361,2868200816190665,8891775460334455,8340194101822669,5445675113350354,5818960694236025,6619779088790744,8023991668524251,5046057773325861,8671152518382817,6346858252948707,4460056820163813,8177110580189509,5320021184943337,1546916389278954,5651641128576239,3592589422904564,6919579355133173,2111854951171318,1995167287596279,1052071060747512,1629343175611263,8837421278744106,1937049111741694,3236311376114944,5732224813417730,706436341040387,7902629974799621,4950180697539846,6439758065100039,881176457688328,8606385766958347,2520990363464978,1674754504930580,7733111668466966,369110709012697,2256965757805849,2607115778217245,5007452335277345,8249021272786210,1252888683779364,6899998734710055,7732948515454713,7863364601742639,2311939264543624,8183520470824242,8390017095550259,4809382409254197,6956370082764086,736344495686967,1310944401941818,4994787060495678,89701261681983,5857433964271840,4691307017184582,4463851836269897,3270505427313995,555340657722700,4061734129268047,8504641372132688,6593093943518546,4141503253083475,274822050383191,112780997686620,6217312389784927,623471891150181,1281272790848872,4511555590059374,4083061944935795,4702713273554295,5588842036893049,9179185312999153,5245445217293692,4116867417609597,2226731822568341,3606702473483650,4145072229097707,5721816832980356,3126577281291653,8792916907869574,7417208655185287,8621512244176450,1058642260727182,839820542236423,4464123728516499,1384537167443359,4545379899794848,4004659930416545,2280076473387249,3466413654963627,2154524065928622,6963474145506738,8584807388685748,5945242927698846,884161949071601,7402284268271032,5039027459152116,8653456188364222,7574706408939765,8349067416122816,4874642681099715,3468627447490496,2144815442352374,7496036634547657,5477903587891435,4501941666239947,1066742116709836,9184545055794637,6510608066827727,8974492178961279,6437010336921041,6279716494157268,2276970250020309,7799538329617880,8441960848119262,7142881785439712,6324390730790369,3020724649321955,546150452975080,8183228208756202,5223376601295783,4395751024334316,5208489981900271,5483431158756854,6626092617483177,1176686556362232,5468990901855741,92366099650048,5772667544237573,6794565607130631,2348171536160264,3077503924336145,2493554520333913,7674550810412574,5020399072777759,6609866394195493,3138804730422824,8124699805028010,3257774339429933,1843490465465910,1618625989936695,4120498114766397,2559533710116418,4069105216312901,4252176142091849,3539296225961547,3911750210844237,6950675396916814,4500691480909391,1454191125947986,2632418953295444,5319457921341015,945462011106908,4940570713871966,5105109694133857,4641840851400291,1536572454229604,2037682459829180,9185471430489248,5677011787019886,4317166239531934,5620808593049207,5622796998911608,7525400851097876,5387691866392187,3928948646594174,4274845021636224,1888124163520129,4202356024495723,1024497909958285,3671721940215461,2375951446374267,3405394318874262,4784441125693079,1917242357642904,5344011060102810,7712631836235375,1502691833751196,2181959465264805,4287261947488694,7496268025521832,1485837072496302,1652743211566767,6117509850437299,6425822359291574,8337223725971127,5987107420477118,4896952256218815,4516013607143106,6333548089157315,6854737028892358,831822198609607,6089289341179592,4354502908876489,2824841020368503,7084962381444812,4721851011112491,24953941608143,5626107221767888,7837478042040596,443959514396289,1433669411858138,5792880069588702,2990563106846433,5716424772929251,2786976677566184,6471573174876455,7188935495292654,4520271307355887,1730521960224496,2429371767060209,8834063529305043,7556853350246132,6425986659825397,5000289734063060,6585594790491899,7517422312142588,2729799828842238,8334429535037184,5856397196160640,5539527826917122,6003899072907011,3520351880573910,5853849571276417,6832448471336712,730734919964425,4178433173497612,2820868867577620,1193182205167382,799739935374297,7919518239090457,2415837463320350,8251228768896800,4908782461654818,7748570467982299,4499541543843629,3660260068287453,9072523533227825,1274358616540980,6335063486654261,6402592500905787,5080992642959164,1086568248932159,1101827874181430,3132503597029191,4908308421302089,5613246273193803,8561079666534029,1815871431804752,3365695426094252,262675222755156,2326616043554648,3091444767041369,6220016135726955,7976550949726062,7188159604685117,3856249922848624,793630657910641,370231272187763,6270246808016756,2285942708995958,8302362303965047,7290004627603775,9188841838196605,931487631058816,5288518455446399,5342173639124867,1796930520594314,2805899344607116,2395162796353421,8904094699730831,7422580541343632,3094894892959640,1788262499509231,6818817664800671,3767684575504289,1243104550287269,8510965393250216,5063846700443292,235074628118445,6485060140066734,4864970587662256,6595776605988785,4435140586866612,7051788556900280,8420228246153146,4870703032645565,4403831543281600,2519001454446535,2448846468110283,5821475076593617,6296853652666322,7494092679264211,8785652178696149,4792095692236760,9018364960913370,6143777775871967,6132895380496630,2563981887158244,5963188245407719,6696916488220539,153595353774061,4641800662910025,7788243230443505,2904107619132414,2944755000327391,1546455405344760,6750874999979690,1678014183819263,8940958848186371,5123267576227845,6610586750109704,6303187964938251,5979765201860620,6496898669996046,566258867062801,9053452993329171,1581176397850646,3986802609921665,2330420755630107,4063806046365728,3390642738870305,8397035317975076,112426544737286,6932567176189990,1599631227123753,4011706642565163,5140378205222958,5279738613520436,337861712870880,7673234322282550,7536729220299103,336835498354757,2226200361035846,3959754811439178,2226686449753833,258810028176397,8986198931873845,6153533231679572,8444136805513301,6932246869203030,2218751198115927,1007654589802584,5189448821438553,5361315694848093,3863893244246110,8889104522895883,4116144343664737,7244694692386914,3322600827844707,1245125091305572,2854834589825131,6897956472283148,5482885196568699,2966017043904637,2182944418588798,5047181064779909,1880006514251910,3696530594195594,8800203628319767,853554239522960,3560555169147029,2563599219968151,1547481485269144,1743154011043995,2378194698618559,406008895650,5188950767335589,4482853415151782,7296268686612647,3569716356065449,885175931148460,8813539598810511,3516371434772665,8950191776057530,1185199258056892,4698002943015105,7585496059545794,322351271257803,1612745347463364,8238366169680070,3567195219187912,3079627883849929,2239284168161484,1780880912435406,3199502331463891,5471849363204308,224623718602967,1496917323856088,3051617747495129,6237569281538426,1793863341263072,5556804984518884,1260949231577317,4229484139964646,8951210634893544,3786268135479529,7589687429683434,7217902049413355,5800825335761132,188362453141741,8192906355726218,3355232095750384,3654049304836337,4722466848065780,4260287917033717,3550232738900214,8629342688036564,2693949533698305,2833584042199301,4750356564715785,317867482528012,3022626207930637,7352718060599568,1306021498910995,1474977540339988,7366013715695893,586722740148612,5898142700493092,7502080113207590,983310774253863,8542462070020394,8811308128076168,1184837311572276,3531502320466229,4554623007803702,7320864427202874,277792478943547,6530122119985468,2408073105336637,7253958698525067,1625940374162486,2309543916874055,9009823638219086,220105957828950,8069375078667304,245889449408372,8330928067197274,3290821990926685,6583148104599903,6593512415361376,4310232479480161,2145364989430116,8402388342917482,8680120695196012,5717311680813422,5800286423263599,8758911400229238,4636645304999657,6125119923009913,7417208719673722,9213546056501627,3060405788977533,5345454156982660,8263965875341701,4877314099747206,3737123098675591,6435776241031560,473811430836618,5308584275360139,1617019823324226,7501976271325589,4186439275200075,5309995211757980,9172341528856990,6083703279372706,3679416277858723,3390318535682470,3882123588700583,1201493110017095,4673783624710573,3955036880161198,1413181163096497,2801305053661622,6532421813524919,6231692333058493,1095422764919233,3969271323670978,389635404429763,3531615784257990,3071207454545724,1584484919466442,7022326552676813,7657947811568079,3526264926325200,7742221582117331,7998663267307480,976811735022038,4815737361910231,2912291779087952,8358319180519902,8632790904403070,630480346491363,8334505275029990,7882649003494416,5262626254150124,788304461404654,374688741317105,7274659328813555,5483879409248756,2470434365581818,6188101118720510,3664045121079808,5341595616721411,4399200032881157,7198343620176390,3174246195730958,2650180661631504,4396472583456515,3684019014634008,1911049843071514,8949976711105346,5250815413242397,4314760239348254,8822871078316576,5648735555881505,7549394504829474,6541256468855331,2714697279093284,5853017349499430,4946829407189544,8875330555845161,1175341005020935,6752328993150988,6640450229164593,2079121469167369,4756144653654584,9157519691668027,5911354367269438,1080756195633733,769062952884806,5131046730365511,5701184200542792,634384426887753,8364886521772619,4055818790668883,76380073867869,3783706727512670,1258193363847775,1644011628059234,1200274920919483,2737395421932135,4235867576879037,6262240372456044,4972693720140403,1429140009466489,7687729734486651,4670149825391235,5694949606820488,3098745882413705,4050738971296635,9139896903961026,6330336583187088,8952721340914321,1292341697759891,1563445327567509,7007112270047896,3050659772164183,2086971930524319,3307836031453857,6568969319398051,862427430726086,1363650371238567,1917624187718315,5416898632481454,8573203309550255,5914993788727752,8906403271806108,8190234704325300,8107353793787678,1879556460378811,1823927862893244,7595949083089599,4083906380331712,8742340699708097,2952879039797963,3711239151999692,3116649515522767,4385014944643795,4175059536600868,214039102651099,3475814532500189,1984744038197983,4770959498832609,1229586868181730,9101936406805219,6973401874737892,8936928373246693,6733120608037608,7345050878974699,6291307345767148,1215723593849584,9163504359958082,6222851947813621,1235125389736694,3422521964169982,687950426139393,7505162469329666,2372606104115977,6226537574652682,4133890072341260,211809594167085,8517016530381272,1716919886289683,8809122985742126,5652777658260247,4808840026622745,9153713216442032,2673726311397671,690283622726430,2416102901439265,7582040304884515,3791807829285668,267360813001510,2277027056540455,4386876479109928,7615276076346153,8644359061560106,2595868200844077,8657808869257119,7180041150020400,3315771908766513,2970762139634482,3887160463059763,1817817663815669,2217490898508601,395465849411381,1812947217652546,4858581085662019,4698726481853252,5633814320790341,1766097753570118,4814332870237001,8520637878658322,4587685316787022,6895942172453711,572625289489235,6921505993881869,2311873693391704,2865045757066077,5339778146196319,191164571331425,2518844393823075,5709601305963665,2841554601737064,7707387816213353,7308219440257902,408626302692211,140852205043963,3645588206074744,1724524346919803,3278578870907370,3856628643339135,297782654626688,4244290423516037,708141454715784,6052846827539337,3031497104612236,6453612841323406,7418709392292751,7497659216837520,3979939284037443,5044636965837716,6290221716273646,5008898154605007,4982939758758807,3846205301746584,579848890338205,949362779110302,7098985024650143,8083358246542598,6970475498769316,2254774502844913,450013723520156,9004193408871339,159927148886956,6121260164111277,3819769648135089,2497784207395763,9095416675617720,3863646550756282,5121854456117176,1982225705204668,2060203234573245,5469727356181438,1585082358991807,400657908046785,253904541003595,9216159837387726,2942623237393361,2196872054098899,1677870665305044,2422917085117398,5724912560688088,5635796098874329,3600637775309787,1666817882618844,9135750201260538,5758725458963423,3584559841815522,5448039998782123,5545245189921766,186490238566058,3510632608672747,6181500692339693,7817536993270769,8960437027936083,5037274942503928,4220871480613884,7736658297555969,8712319910587394,7083402601147398,957777128854017,144940459027465,6183271965142027,5025177859501068,5577225400974349,4771144143617039,5716822783409168,2936377992179544,5126155041706499,8441317071283374,4761168337337372,6290208116568717,1940135960378402,4996086935735331,557009384176678,1369275648801831,7447956332609372,5136833053412396,3681606105480241,9137041650081630,2546083642674230,3829728847209652,5540845115763770,5274475981421629,7276292735654978,2072769360179723,7901782872300612,6428995288128582,1821310298123335,3244233517595730,909246453034851,7021860637797460,5434612238519385,5674895189303823,890275066244188,5683852644535389,8853598854417502,7239101619235936,1460183450229857,8793955393133670,3175154594324202,7843629855452266,1605591907314804,8032099240868984,6902012760829049,6186310843247743,211460923026560,179968811388779,6722884983467142,7889172342439051,8801685517307020,5191015338187917,8671314554040380,4020124114795664,2426057600867473,8173734091529363,157892707757208,8526911150945476,1286252639579290,4412730077117595,5817568751664284,3895070639073136,1061810524126375,8384326129523880,53853039946922,4633717448515442,119629769387184,8177066357824691,1639730263698612,4509100645764277,2707515204627638,945086305565880,6968802320919737,4061794488188093,6720062067547328,8898481172815045,193838659988681,8575658145619146,3099456707986915,8302934895083939,2189416882695379,4797266815159510,4789515482160343,2695671219895512,4338723007315162,7969772111580381,99158895850021,7801809189394299,828898479291621,3907779762330854,6997719098043632,5519491072953586,1853308490444020,3566462857985269,5340025624759547,2671364070006018,4124599406988547,6212661645835524,2589567554768134,3389532609826058,1940737442520962,8901938890808591,2621156694527251,714979111161113,5233504060538140,4797158659398941,1665347313773860,6069191775497509,8001771352603945,5575341459447082,5986946332036395,5655103310056748,2905457101565230,8416798360100744,2597168523197746,1207324297690421,3496108380028216,2350115324710201,2036156478610655,3121307732266300,3535871439898506,8306581782162752,2404816854883649,5493773938147211,8222018444344644,8456325961256263,624929369029961,2506052358221130,9108484298493260,1875412306210125,160661205572943,1718903413792080,7862130947423571,2588803938975063,3834776539995482,2841454242139487,2367842491473248,6126419801847696,8501459049520379,8802482823449960,2897628654701930,8593443313712495,9017133435784560,1716204291370899,5959564272790901,3641953074294134,8341249035808119,7130729815637384,1566556835089804,6361567444663693,7815408014523791,4415310803488144,4181071454129553,1621418390928787,8932911276211604,8684741574184341,6649137264950678,3738328397456255,7733002579938712,2368210501006575,3560556820802974,3442203577367968,3733914509475234,4836021492075940,4802181019822662,8740913582611879,467247904259497,8525782812004935,7065419595963821,5472342092230062,2093133000125871,5584379010301362,6645683779091891,6623418277764533,6498248073387451,7427927791394240,810243643678147,8838702378022134,6231910600859078,4076538669293002,6599680707890635,3337028202995148,1481881535090125,2483527265754575,7707531600408018,7261575506349524,8067742311570903,4911245120552408,2226039012384220,8026013711740381,3506575429375909,3298386136112608,2181885579394530,7261112889122275,1251564471639526,5818647503101418,5994941326720491,3129824910208496,2236051182271987,1444478619549179,4949776832069117,923611345366528,8563337070685699,1137286161214980,9129365115215366,5671102213676552,7255530757361163,2070788413124108,3178829591522829,3103163312307732,8288996205010456,1313402075373082,5568792310693409,7124168121545307,58026789871140,7331396068167205,3806533985601457,8010921460014634,7046479332533511,4818936118895198,96895268500063,7875156168023617,8426863336259143,6040028461756899,2051633186123337,6705003553066571,1380475108982352,5163697769822136,17934382755769,3465752518828644,8774057228955227,4177445042802268,5072191271284320,8234275037511267,9105230149099113,1754861180276330,3421411642207851,3470883254509164,4086496103429394,4792158120271471,6820522356866673,6022361963253366,6342307066457728,4907017123815041,6942660831866499,8436507795790444,5625115194184983,7038227260157580,8879135225409165,6654300882517652,2887539483528473,1742426295418520,3007300509466265,5326065525542558,5402058123738783,4037418716851872,8510440613772966,6349752729161386,5072929611443887,1069727593193136,2791637339823793,2200972828253875,8273778918923961,1258257804398273,3851116627005123,3626005984960197,7921704938054945,4599705276288712,3322214162050771,5416180324216534,7643640581156568,6061739561803945,6388714905706206,2767893443034849,4699059167710946,323283438313193,3168877456285418,5788280570502897,7220632942276341,3631843645898465,1924610494471929,1728368100835066,8704711871028988,7883752168328072,6370920510701310,7142967689236223,7658907270131456,8096773837997355,6795845271736069,4870429448343302,1727002570211079,1437282048740652,6339011116957453,5648456000810766,2064343632941016,6394799205842706,8868267508103811,682381717249326,3409116680085271,3067550054469400,9109593881595193,2335001842323230,6992221220241183,4312114364972836,7338062669532967,5412996565520169,7342284656021290,2430311327280941,3166540328308526,8849815303470896,147674409155208,8861313936670519,6722212991917881,7319809966378812,5602444795031357,759593316736830,4504276581269315,8292606633508653,6519327393341255,6427422669664075,6493078212779852,5780745718869837,3844943376465198,4110059280825657,2729999935410008,6002724877373276,2587211225014110,551962080431971,3686088967450469,2775261241040742,4915993755836266,6285948256243563,7952952785518445,8943332054171502,9210036731170671,7329040132263794,7965107056705400,4963427971452793,7233776333180794,433515796230011,1227027098652540,6104416590684029,5751888000024450,2598653627260808,2240516115702423,6247319974014860,8288321914699661,3179155733475309,3104075337850179,6478087889411989,8254559167696792,7428978915803033,6956741217439642,6557792600457117,486343351259039,6648945476436335,4743634511476720,8416452363038627,5069214115229612,685321700112359,1370141272238064,8132732348669878,7954128922791241,374781667073977,3516148357455802,5228529575712757,9135195087343552,66110438535105,1642409262960578,5655193221218244,6377119839805430,9032147609096137,2999085945835467,4448979310493644,8906744070459341,252009579749329,6097164772683731,749039141388247,6184624901017560,4748915907563481,3444240429921615,2805173902094300,3165169515791119,5982328633438178,3879154403799020,4710971350275410,2641121137364975,8608021696184217,4554487170641909,7047609203473562,7483458248736759,4807446425718778,1450902960660477],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/826776746a37223786ffec552e769c88",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000677655.1/GCA_000677655.1_Myco_tube_BTB06-467_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KK356137.1 Mycobacterium tuberculosis BTB06-467 genomic scaffold adOVb-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"826776746a37223786ffec552e769c88\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,5418062808039483,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,1175255165046942,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,2923510362923231,3763250848071904,7360353228668770,8565956005666883,1040222343557347,8107698973558784,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,5834613430713663,3389796438417746,5701223353913683,7917710442910040,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,5088842780258710,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,2283304356921823,7314338592498144,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,4137376921317903,1061063064457745,7159968837036431,1187901877805590,2545127928916740,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1302359929369349,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,200567419970091,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,8317273743308856,1316623911576283,1441617725723357,7242017614672608,630218890143184,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,7982695525856751,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,3484862622000394,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,57699281020215,9065337811883320,5773274897704249,3759695846797535,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,401375166743886,7909480428320079,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,2017544242919815,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,4875820081283327,4092526301791731,1360710405096951,6524009387461415,2918737215086164,1396209862055419,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,1488198135089416,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,4664806243059342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1210773197399855,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,6460791612430260,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,6791892515245752,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,4011267514259560,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,2319684329502984,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,5831782303045342,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,4178271357348231,1850530644323394,6758841238363515,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,1083562831182273,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,1691698663883279,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,8407988312059771,8604592003787340,6080461698973453,2604591035267665,748229802113619,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,8006582758969940,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,6877880405244490,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,8231770211109563,7415354355732938,4347965398190108,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,1465119817186046,3512269597022975,3371227852355083,824318627486465,3353033711752117,1219346125085444,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,3800473786085855,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,9204369274743686,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,4078178645109658,4365553993789935,6079591429914092,8250547302394784,1574557184023457,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,1304685120252858,2876473268262047,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,2716904792644568,1274694984461273,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,4968444302564358,6253041493555713,950359505054730,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,3853897425318415,2389972737829980,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,6926842923352601,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,6701303819095037,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,3807266757341739,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,544430685777215,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6593886642091233,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,4321169255298363,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,8651815331507604,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6391470707425866,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,8076524559055492,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,857152097086937,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,1485577514818131,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,3725399501188629,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,3050832973948215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,8215276774560757,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,6211098553917295,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,5081905779899711,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,872305360830382,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,5842852661052750,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/8276440e3138e74a1c91b4d91f21072b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001375515.1/GCA_001375515.1_Rubiinfantum_massiliensis_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CTDX01000001.1 Bacterium SIT6 genome assembly, contig: contig00001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"8276440e3138e74a1c91b4d91f21072b\",\"mins\":[5801170502438914,3361332493336580,9141242295087110,7525815898341384,6310631088840714,3279243020809559,1001105721319675,6874417003339793,6784918625529874,91916392308759,1897962260496409,4541019190444067,6941617189445672,1854650876571689,4547006837776434,3422343038758965,2606019462455350,4610779674202168,8908545588068413,3567189934481470,3859153231855681,5010488470880322,6377915415224387,8968369345744964,8332727716200460,7674623530188880,2389772551356497,5904072518799443,1247362271961178,134070931984482,6489269880094819,763189040537585,113130987098217,2295664221909109,6047249634713719,4427033176801402,4971602794246267,3938579990089853,1124310070636674,7928765337657475,1672597836202116,6676923932459141,3144084451254406,4494497367113866,3646307195875351,2096633765544079,551293736693904,6993343873065118,1654028558225568,3365232445178566,980192377581737,954698144657579,2498844802511021,3269161057255599,7530695457624242,2209118087602357,1304943202049487,6814450305089719,4674270909001915,5156287625978046,8275920615162048,3798477302603969,5629414144860875,5592452370630,3228598140539079,3613693170737352,26681947930829,5317772164313297,4905078417465555,4078178880803029,530663085146328,845929558429916,5733694183911645,6232460663754974,7332035106006815,2972617458446564,3242356548792549,4643158779105510,9005052270977256,6712262952124653,1820088574853361,6619468755890217,6314856714117368,4545673231642873,1912664849408251,1053826425606398,6755871973814527,5802741185456171,1035126212542724,775275608998150,3930109644370185,8660714083995917,3313981806948623,1143552782033172,8572124311396630,7836847598194968,4254877301313817,9007432143806750,3454885360980256,1345069704909097,5789726332235826,4026724281098973,5409816585236786,1085250880217397,7090476084086552,149075291078970,9081038958690619,4623301335380284,4985297891397949,8218145943056702,5085879377319989,4473753716547904,4705339549712707,5913819336347702,3557110696112455,3886440183148878,1193694696264015,4402763293711758,481735731089750,3040027855545743,4508544254292318,253523055104352,3425427402298768,5386347151249764,1679679166292329,6097496845472106,1933130103557522,8536491269722479,6850271999693171,8136344442261877,386179425169783,5984443483771256,122564719509885,5507537009299838,775019703046529,589993588502914,9195296176779652,3857064684917125,809292609794444,4846983465369997,9078743239410413,7541535555445137,3707973666689432,9164794185302426,66485163057563,5609636038844829,3556666839658913,955067957686690,8595221675364777,2565840311792044,4638963307737517,8952362163265966,2164795608535478,6647233020457407,6548533502775744,5069411935829408,224962131280322,2689403508072902,1122346515169741,5584767532491214,5595321688650192,734498972551246,5446687531078103,2402321391710693,7860246238859759,1624549425213938,4857874539889142,2460375043314431,8513098647699964,1325692380218794,5128476250616319,877903267021314,5372871426691587,6382302574891524,2007826288755211,1569030293623309,7124449434006030,6173462900105743,5445201295038552,4688152872579604,1706047736721942,6922360832315929,6579839843197466,1332257283645979,7662310310683169,528890612699686,5907942605275687,5907518836904491,7517380605628974,7585418676216367,2200344784515634,2552093467709352,6869734246408756,7370749330235958,7400074675030433,2515653823763001,1427202157687354,5090909020217916,4739800276374080,7548050082763329,4606579542692430,4399906231837264,8781694767233148,3840423970443858,9044609911894115,488538091677796,4161974974487039,8595176788906589,923842138886753,1933279754887778,1533624437654117,7153183136072295,4404508633457258,2989898816080659,5725592622019189,9146877001982057,345668613390970,78099381752444,6350483183231616,2714662311887493,2010071960182209,1314615322964616,1173031966858628,1466145553302157,4324568777970324,4616552858083991,3152588199846552,850825303717316,5275692572590753,2362829295467292,8451620799156911,6976021392442032,7630957413150,8816617492861622,7143625103946424,4969208254579385,5892601562264252,4070396258554557,7309811047740094,983627639595712,7854375429141185,219465147032259,8146263645868741,2212170165228230,7826561955246793,7448554661552842,19122945749707,2244367786672854,6266337805845208,8419697114472617,1690644731396826,3422993380246235,1894156995138269,3662833911345890,5552844314149604,2925344802386726,2203784661988073,4361417983038187,6492042523992812,8335944494891757,5120100269818607,2156017391321843,2021396611179258,9011653791716092,1140295655830271,7006364016587523,2036075579495177,9179912976884492,5310804221502222,1815216397253422,4851698956563222,6997798233649945,5522423915729690,9084812273357595,5342206333874973,2831726895678238,8643706730709797,4134344952300326,9089997022680307,6748803953759017,538101290316588,9149062996063021,6209326737597232,9176630184489778,5759736862229299,2907371450815286,7058667202129423,2046401419432761,2825541624177468,1647938623226692,4524641859011403,169021612873186,3474337803879246,2503574659832614,8228689935889237,3144524181259094,8915866717102936,7301256283038553,8109163109672722,8263284779516048,3766760977015650,3166988529230700,8812387808707437,4663224203309934,660040947794802,4985928557392756,6920944968143735,2569469367179412,3269410180600704,4392332085453699,4038854627513220,9080405587223430,4582860377691017,276792482640784,8267982050079636,8087609833956246,2104169135522711,6669986067506072,2704406908265371,6072377414292382,6652503910347681,8825101128610722,7755205400807579,2289961716454310,7205959210152881,6224188874174892,6210334078981053,2054380758807488,7132560225072070,1938335726212040,1098500183167945,2099163198915530,6583978323916279,3882121094980560,1045527031033336,2707395112084435,7580349980111828,7062373772637144,2607374412338137,4337087844701148,1834280209617886,5229059041903584,7863827756504035,3664282604938212,6072089752962023,4378497871766504,1067272682959849,7332103206806507,8488274713764844,6588961201398765,8760486854783982,683415096427503,4383740552758258,4610721753186473,6910915708142587,3290145356956668,8223882470093821,4340860967134207,4932861537956864,6719465898943489,2595515091870722,1440589323252743,2151866334422024,6966692313068556,3476495391069198,1799194130416472,4690283403887637,7349693286618136,6466708071646234,4865368788956189,3718745303208990,1979445127615521,1169517770290212,5358440325358629,4507411247690790,4219369711670314,4597894231180335,2868384881636400,1337797747409973,4644797168915510,6216923335753225,4073495792370745,303628122133562,1997432788243515,3301332675335230,6408168548393141,5541952046011456,2387645628146754,7197417546695747,4900647176797026,3695925629305934,4236845293741137,5304243948184658,5586597197263956,3550946527306841,2715054851564634,2938311527851099,4572880108909666,5751978271092241,6016447053370472,5088915522663530,6456164674401393,7735284345549228,2760319160596196,5626078296880246,3103981471143031,5913053098697852,4122194786645117,5540496105645187,6362505310155910,2718825987162305,3999732352836747,3264512719271053,30151286860653,2042773638202512,7659137416573806,2039890722804886,8381531471062172,7987459564651686,1752688426362023,785126070461609,2658574341084330,4887772696220843,5153722350011573,759316954961078,7947125270750391,6098779095602368,8382673790952641,1050578713674947,2385399945700548,8428641721423051,6948647503541452,6669710632793293,351238936610000,4053667549799633,7323100729586898,8975181135738068,8174431315715287,402646967567579,1911005891146974,6975729925711071,1873951392519402,7698883825292524,2734613180245229,5345961319948499,1227534703203572,9002652824450298,2110440760079611,6411829659702650,6141684343620864,8153058363929857,9130374445044996,6814876554560775,30107506042122,1314888582976782,3558032336356628,1523473984908846,3186876433188120,1689972524332313,7290346970068250,5188979549500701,3134736915457310,435698865300770,2386082804946218,5731396885243181,1195450502677809,7818581766435038,4993016138340753,123646836131130,4730486060845281,4785815956464968,5101687417808206,1415635609101651,8186758806984023,8532076931687768,4006935796809957,4447422914372961,6187063414251750,5118958572613180,8944729001989482,6852282326975856,1719521375130993,1177630243968371,3015620538086772,2292381204600183,3800222772974968,3053466371384698,1960071852725627,7821530122339710,959480035546499,1476633209701769,4003538190620046,6685121528780175,3047274262943120,2244559104693651,7806649041011298,8596380034540950,4056531906059844,2739616336020356,613733693544063,7021256415839650,4331870342391204,5273278839977382,5704256458522865,4854692060738986,4647035601712557,6404395016955312,3479420620600755,652821900113332,527827193612532,2951023492634043,5344608997885377,8877542335940036,3233296347481544,40305782272247,1720377363887569,7538893448046158,6300043967383007,3551033348580834,8882324501698019,7601454974166501,433268525856232,3184724814284265,4220697505998315,8134536097822188,425064254178898,3182630941771247,3719299219461619,1363975713777140,8872708125062647,5346349278605725,8216866881095162,9217289289537019,4762091853923850,6501088934569483,8467567166710019,8147957018410497,1236510494570005,3125458074451764,3548016366528772,6249137899120159,686104778524192,8171488651224610,5538631939794467,1545476160960037,2060535456794155,2184047410673197,7618135224722992,7334081603634738,6523816327353908,153852939179585,7941634691933762,6416394672289348,9052862867387973,6362841953900108,824746057709133,1303981108599820,9113415630214735,245299048621650,5362640311764566,7581092059838039,3052020046906970,9044635955314820,6801407794624101,8035199961458274,3511659172263523,757526326990436,7145266818479717,6027477071689319,1855856140422076,7206783186208359,1791715269719657,5035075541931647,4878718770153088,5672444666270071,2757427227043460,7867984006735493,8521846615905928,6499277951751820,4851482511447694,7960487838727789,2757543464687249,7534275464222355,7929131437733524,1604472378349206,57080530515612,953313849582775,60391294920351,7114709469189794,5491090971424419,2649607408645797,4062530697365163,8588938309056247,749807826544306,4267426627098291,4840177884296884,4757224446252725,678021325723323,523250149328572,3048066337380031,9210053857986848,7202536511346364,6620216832063175,651657068725962,2701932738836173,1104594408793812,5862887390205653,3727001374537430,520296667764439,4090282803271385,1742945174800091,6227504163120861,3299046675748575,7863480427108064,7863922662049508,3528662253905640,3024848114246961,671821434754799,3341245129971444,240786926069495,4567600007485179,4942063884556029,2999787519188668,947765991587337,6893170750994181,7210847935694598,6531324100097800,4354367474906892,5442496705312530,4531243003201155,8620789406704145,1887796874013657,5995338618648344,887072470030105,1750075790320367,603457682437920,7912377548276018,2086264721569583,4674014398895920,5107214778009393,5238380923500829,4173106232403765,4626475502540599,1041735532022388,8505819133122130,3494623196186434,5186873312397123,2380742642898758,5935220176938823,7884517710489421,5472629792978766,5256216786425682,6216474711963475,1470433237985109,7396023311198039,178118288729945,4453024367265423,7376418971334492,2881228563046714,4370114579011422,2103559999977314,3906433366820708,1131788432648039,4974718229228609,6385147171710834,5804274773014388,7251883501361019,4973852918765436,3208885052827521,2791152082081666,5815329154423787,4840073673684879,3347940467828627,6174647318558612,4743008046892950,3709493082273688,550183565047709,4047485988759456,268898256250788,8315261553366959,8374409713924016,8810374448327667,6498078119573430,8840943078680223,3169617644734399,4639222779434944,3586515057391554,7874137345341116,6928972720035780,8162793485457349,8261183608768460,7512044950927311,7313636162050003,3860906840803285,5222080016639959,4220768595462104,3303910786590686,2883778284881712,4607203268896738,676392097732579,8416911608526825,6450779132344299,8786645130823668,577225233344504,3927105596014933,8929338340214784,1679385812654081,3525518222022662,4816254070880265,5091349200455698,5171515471158597,7871849731061783,4514256025692184,1981538250405914,4403006016435903,5886068534081574,7266018085107751,156637900941355,3315773506972815,6346177432098862,3157201818839087,875238350231603,2154849468573749,8136067820193852,8422323325421629,6570086687369278,4030475118569536,4585919139563593,7073842454464588,149058110289998,3749159693367376,9020808301340754,5914749173160023,403452415879256,5045934459365466,1605463864617051,3895567477647460,4552932314335590,1662326746113041,5477734810843240,2491182750201961,3436355213695084,4194415059212400,7589373729695858,4739705849612408,3902000818043924,1389437023213247,5069078030100604,6385276292331646,8917623692322943,3457462762580098,4544113911392399,3645903535896721,4609858579376275,2513653973334164,5303641000675483,7538872056043677,3242006269421729,2639923570493602,433063945300135,1873472323131562,7421835509848239,2676282773439518,8084452544637112,3420642948774075,2597438134335676,7039247494228157,3034006425020615,1164200939280585,928550618491083,3111667864311501,2653390797187280,4527810132175062,9216552070027480,5902886103010340,1320265386649819,3393982951778529,6928936113363171,1537319969810660,177046948385830,668946629351654,4762696572963047,8482747871598824,3565639470315756,2919497424316658,287565208271092,9195697707891753,7782107084491004,1003081580439805,7149980278438143,2358790132091136,4813445431638273,1617568782547204,1349029986859270,5571880292149511,4204490292975881,2719890649803018,5079447874566412,8722919186280834,4640277743376665,7211908901054749,215935746935071,944811981101344,6281593092045092,5311543528540456,856575354161449,561962555681067,4762944695593262,6130840949688029,6840766273300784,23954537761073,6477214124271922,7631573829187894,19757037701431,2340153742158136,9163549843568953,8933374241433918,7118379937397058,3793900582324547,7390316411169095,5272201499633992,5208741683345737,7455992139413836,2761875091200340,2506470223971385,3833686652516696,1062254813888228,1575629251447132,582021265918302,8577066313275743,1126551812205627,1410660005131330,6482649228323174,4092188312988049,9217491852327279,1146629323700592,7790176534608244,4001655922469239,2698747769260409,8649740604807552,4945919361829250,5319115830053253,5442984503687,6629589689375116,8864351351761293,1005990318901647,4326340747680145,326192417761682,212717160166467,1944694495091093,4036357179090671,7623692888316321,2879682793318818,8124649609406883,5669981521066407,4503639080259997,676924087209032,2051606755700216,8499462381730232,5067275092568505,616284547469045,5476149063805376,3262386473507265,2604066576021956,1972652871383457,8521818121705929,5578127763450315,7956939307305420,1057017393555918,4199792234318288,2913790509496082,3112977760782816,6373461733767649,7561651104684516,1200967721052646,6070549381663143,622122799843820,2991045265151058,8244980729379313,7345561544074324,3470737712564732,3790535788816895,8951656107923968,4090018550483463,862307165792777,2899248490506762,5521167876737547,1027754614553101,3460337760762383,2551582445271568,9139551314553363,8185000481016340,4464838674364950,4059213718172761,4067372228318980,327352891795998,5847253876143877,8000126189746721,5331577644484317,7800740182846555,4246437429709348,5038456942766631,6162808813685290,3761187735165487,743453273831987,3436586091321910,1264466365086263,8866205020731966,5527703047515232,81400783535431,6582862003440196,8117197289667144,3614677083781705,230081664498257,8038155954887250,4944611708181075,2490618652707418,8855387385317981,1947492552227425,8089258651728482,9088771088650001,1159643220150889,87408400828178,5519948177259123,2784124136491636,2454580657269365,2627670160288374,8410437836199763,8901835015414207,2084611647265407,5742024301038209,8137852904233602,3186085832448643,9029996284931180,3268367121107594,111030042703639,857340488723084,2799681952414351,4979621509462672,1599859287046801,8724820273212050,866772233874067,8929147788434073,8481760568396443,7957719555832483,3763881862613670,5768975136736369,2033044462582440,7966958790240937,2157978929986218,5812595083152046,5551414259674932,8440686911363762,912596398645022,2733758151862971,223541607975612,3228020341172931,852056710294212,8445150707858119,6855413461359306,8454495237003989,5646867746142934,7798570025036503,1166367575055064,8243445096487642,4634086804232934,5983086262938343,6417128908077803,9211872288434928,8913449327872753,5151147768724213,2669058320689914,1469224387185405,8191226919385864,1748714555882253,6503164071561998,8120614158723855,2134164122204944,6391325409196818,2792858882398995,3975312835820308,1695363189996311,464582608825116,4410573278436125,6348864177908512,5952466596817697,1511651315283078,7641048941452070,3440642764241706,6805591116905259,3322419190062898,7066539293961006,491643514694450,3233098355788601,6323944361339708,2767709414972221,7233033143130946,4002583990748299,1517838664076104,3527195332614987,5458007201535117,4750368327891792,1328244984170296,768747945454418,6325004654717781,8718274190961494,6961715142069079,410467705175183,6514005396728668,7121486691822429,1164790782037057,1797299393301347,6947293382744932,4619522412181990,5648978360785770,4160879235783533,6465721592130420,361199037475701,2541099481238390,8924727504665465,8589096014273403,2922759044320125,1432708989156225,7795665234770819,1327128971832196,5013595518032781,6132685985393552,4987985214671761,4923041635781524,2723609371388823,6673075110829210,5971681096808907,4524788266728352,7671777664457633,4246025864674212,7548004145724325,1425670980520877,100854625274799,2050033996303281,7938588391295927,1176115683519417,8690779599535035,1897902304222140,547955708894141,4554847348329406,7844887400954817,5292615439256516,8920657758612428,5261170578242512,119904543009745,1139393591196627,139226535640021,5987804315904982,7829692651416535,4908886579006425,2467183750904805,8949564740647910,3321707632880616,1471698641169385,8194469877345258,4232660212683943,3659138409249772,972535639505904,3755358352395250,4090404513598451,165458837109751,3260037289614328,2910282308484091,532886150380543,3958940131122183,8702330513059671,5583133787036684,7492976790754316,8927400176218627,8738703512443924,5136079107681301,5389065977326905,4566206052289566,4974382844565652,555215348414299,2727110892837924,4070533285305382,6798377186368553,5541622201592880,6232711567531057,3460951665617978,1249402156833851,2866107339017276,6738654643264574,2575310884486207,672675442547777,6425964646628421,2832735286430790,5423809855052872,6929211279014987,7911944900582479,2517261206781013,3102371150224470,5926387245386843,6998575347944544,1655776275038737,4404961464360042,3623742752140396,3990688491756656,4405857180703860,9173945538849300,1008309901421690,9171603537783932,3926811793861765,8452029466193035,7070751448624271,8020446855269523,4878312878378132,4299648833957013,5639421010922646,5163909385559191,7923704839556250,8694512297421981,3389133886487717,3236612756085929,3832920050063013,3455581943635124,4147744894151864,5734719358635195,1351792066469054,1513914339904873,3580580228451522,6288683003153603,8775970168599138,3845946647506121,7676264039087307,5821198207265996,3058761214344401,7321951136991779,2518308933172436,2553868726406358,5587088274984008,2837278380227802,4255438481312991,3652533124570862,3519881880947940,5621741770116326,3602688336459644,6910408935062997,2145105319732434,7866796726389998,1524328811642749,5477237357620467,9186540329276555,7467033693707509,5436916807183606,7619586120092921,1982597672697094,8403199393996045,8338400483896594,6087163849555219,6726795224268053,3420624310820121,4874676967393839,6592016388242720,6712089152183586,6947902589716705,9154629369611759,6858994775133478,4285431061060904,4526563941379373,7061903241866553,6561729954434363,6729267349458240,5965510197607746,779872122469699,7657713494831170,7936365372402022,4164894998224199,5971667080133961,6922270928002380,3892441441160526,3458880801029457,6731668834553173,2167598784626614,6102372600311128,2916663551188318,5095220410400100,4348942442769765,4952865516997992,2698590145985897,6195230999178605,7076007197928817,7880651533159794,899092274288532,6458930235352298,1192536294366593,2730241632423300,1165803343533974,7848783482731913,4125495785807767,902412429700492,5551567267085709,2944722164858254,7520297118408082,5831526621732256,5669881798249890,3268861498342823,5561624006311338,5351614089088427,2678454493842861,2253584573128111,7862211517701363,2404676649291188,7862614535757726,3273852002532793,9022506829877167,4565889135681439,1517612427689406,1716763390074784,1864832055451075,7533446933487049,5778298531587555,7848544614739410,804409061826003,7516335475506380,8035780165844437,7680982509706713,6655013684215259,1015545121734108,5683289493339616,7735004962438626,344897888608167,6597257450081773,1807944633860008,3530184863596019,8554787024285172,489028289052152,140388695743996,6169237048774142,5158413706931711,2284126159654400,1260197596847617,3417927456218628,9170384883639553,2190282965802505,4316066440881944,8639544302857743,6195344806022672,8396842166103569,1033219271970322,8645300746141204,4450175830441495,1889723898404376,5960322267733531,1963167683592794,3351007278210591,7298623699287302,5099644455244830,5347435196079659,6919000409943598,628907775934002,7883019517050420,2196328903073333,7240583346327100,5298396316626499,6614955234635332,5384247575281590,9015415154383457,4972178893172296,9099303760318028,4335728237264461,5737661230685775,2414249967328848,2081446840143442,3059010006601300,4412091399302744,6376281180581467,1921306298392156,6408339665246000,3995814921899282,1968023276150382,1030112493944432,62313311395442,8637337884216949,816834889551481,3776710198484609,5361257928404610,6896488547253897,3933783548262339,5019863816662678,845159290800216,355068627889818,2399090199441051,6514735270272670,1718751258230437,5348732205309607,7337985600691881,7780127337823917,1285371277516463,4066364602785456,4028297821900465,6147188901142194,7369668855954797,2227576345968313,6168563936607932,7903587081087605,9106204960210624,2308652331515590,2440223778782919,1172441394065098,7317482707582667,5134532968828621,4628583340502740,1505833596657365,8421209176092375,409997581876955,6993276265553634,8567200338738915,7917812809580260,1089115441610471,7564583818137320,3181012786536174,801395864637168,906956816670450,6256506176233203,6457589982027508,8891396894412533,7186684641939191,6443729727393748,3100757420003066,6317845357623935,4467096164623999,9090019844640515,8851861876461320,4933107309215500,7006394860592910,5234138763284240,2208888264482577,5759902754234135,6057836852256536,1916194006146841,7632896804708122,6766986912587550,8676684987771680,1239743479873315,5881653550133029,6940114800647975,959898068836137,8907855991344939,8755522901212972,7498509578280753,7033470257307442,3941670091116339,2923379298643764,9191564212059965,5015079891701568,7205326680690506,3340150148751179,4448054296575823,607453003366226,7984464457755961,7207835897683805,2134087638065125,7939885373161313,3405247417675620,9139906900053861,485169391505263,1645012653408112,2983416757059444,7647567296556917,8770789308039034,6448308019904379,5709886917427069,2109207644733320,522274271190926,8083111135358865,2492615327879058,5040897816747924,7806619583348629,2031902463291286,4933554627710871,8049512982744388,996990324481948,8289714321014686,5213413495184709,3820780084961184,6863890958507940,6926614064267249,2040064189493160,481540213141419,8911411549503407,7338567696146354,4431454579875765,7133458383003574,9194776426246075,4269436505477056,1723672925835211,3581421339267022,243582187671504,2059353368174547,8339870408773588,3114083867054039,2959955795746785,1056545895329762,4990119561154533,529106355666918,6559746720566609,5214346238201835,1594833387802609,4419378802876402,2335846844243958,2625640540082170,87128664170492,453293689322923],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/82e0290a438650db9a93ce29276f931b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000394315.1/GCA_000394315.1_Ente_faec_SF1592_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KB946569.1 Enterococcus faecalis SF1592 genomic scaffold acvKc-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"82e0290a438650db9a93ce29276f931b\",\"mins\":[5878696517939201,2371842369683458,6537844540490411,7630252690849796,4641721637752838,1444424674291720,3914162681757709,6296906352537614,5871898286587920,416995513430034,2229162172731415,5436228443463708,3211652701233187,3307859805749284,1300072895483943,432772961128489,6569753572098094,7775385366364211,318179816390710,3401683157807160,6364234027331643,5622663359889468,5617068704614410,4902524767633472,8807567850254402,671954576576580,526645786570822,4267388594565191,2113594773225544,4802620745920588,5900397597126669,4746682469699664,1003497833558099,623096618528853,1855496712499293,9049721616232542,7235298022789217,8594780421832803,5407632938967143,2972796880905575,905737585721362,1677875714060398,8047881076015215,4490006136983666,6203552620617843,8566436144717940,8258436606659945,4182560544026744,4440401863839866,9151732832489597,292945365979262,2491468063875208,4825856099550572,3458781948948619,7220201734286,2672811611533458,33701923594390,3737032335413399,2449370260617925,7650716123152544,5938552110624929,8133240728674467,1331959910379684,7861175250186950,3351987437691985,495569514352808,980192377581737,2188504067952810,8153440481001644,1102943759995053,4888407843176622,5844496226025184,1261060127387827,6996681099468984,8327050203570361,162311614992573,9001370581147844,7433802231365655,4708233475522762,239577624118647,4997883366505076,3047212169400526,4623038614896851,5063031245922517,73840147534038,6380051526222039,5418529306288349,8929957407174879,2117632454615264,1125610682294498,600165702693094,1031682279301354,4593355526589138,2834485413421294,8821298734817522,89914277683443,4442159521738996,296309343125749,2623222690124022,4140760679645225,1479861920600315,4476472547488005,9128074959433990,5368582947964289,4407003458363662,1685628956320018,4776502882189588,8705678776413727,7890021309767961,714102790603034,4017594271897647,5397550091055393,4884952798413092,3575577117905192,4362439670305065,2340853435867434,1548737565815083,2688831533388077,5141626879349039,3942169424281905,3784261813846324,4691124921170654,7944622417556873,7077947884147002,6360384661418299,2293885474279740,1264824594215229,248053301721824,5697061994905928,70973549658444,5098250593186127,1149998526157138,2720951627014484,1911745172402517,6907661536764246,5708991284867415,2640321604649308,3488812095582557,7469781969127996,7141064580804960,2292324223217040,355383122317669,2291989862187366,672840200290665,2274630812216039,2413427439665517,7453463131615598,8988341313552751,2519840720613754,4332973478793601,5789355874636163,7847396221538841,5851359002575238,7013738882445704,4234407531393419,5413555582194061,5317877329924495,4269360811020688,7147412367692518,6132124130169234,7417658504176023,458468491329945,1191256022266275,6225002645467557,3485978224382763,5204453377507754,632735137030574,4920681764856240,7687753543770184,5467794665791923,4751359115665844,4910817852150198,3872114046058937,6636603045425596,7444102596317629,2200546375882827,6695021063143876,4962684138672582,6336426605426081,3279357700547016,3686548851306954,6504961134432715,5431906627862989,1132365096079830,2288960877326811,1738343144915420,7676700481835485,709687716463071,1091414847817126,1564723078648294,7506803596644841,7266150384439788,3614830029180920,3114265257042414,7488064645961811,3122268416258548,5714640620458487,8247262424773112,2490438437872122,3724920717750780,4572333233541634,4595099635057155,6285856327930374,3290688636990209,9185137113768458,2806535082693131,8018025614648859,6402143126331924,944620232618518,874402525491735,294388163719704,4752417689158169,6641947250520605,4188535334302238,2632646977241633,3320251938611755,5299636369322543,6069530614559281,53089969885747,8727610487304759,6796089644352057,1787467567436349,5058785264898623,835383990018625,3494322861302338,7963021031797315,7269528297812549,4934642967302729,6866420955750988,5712554427011665,2046600455631443,4366092172617145,1522393467269723,7710190592062045,3138192100659806,5356981239702112,6326540430111332,8764579402957418,5557133124829805,7802522718999150,6091513349755504,9055773672294504,6699267077984882,8468235010970228,3971120264028790,8819134553389079,1181468687798907,8180407566652028,2504319338709632,9015513821921923,688094539879044,7221629924766344,1070716444574345,4738659493196426,999799549624429,391222476813763,143967890548846,7329596496499351,271950206378648,1829562454793668,2744717369782940,4978389343349530,8346458587493022,1776077493207711,2920990580359840,3986738706207401,7362360776282795,7709412031664814,7724172085506737,290412173484723,8737938265399994,241699103344074,330671526273727,4356556052394694,3717783294255815,7323058233692875,7941786962826018,4984030148805328,6287507498074232,4003215957845454,5792865537348314,2734401931842270,7050139576255205,5246416756667110,8125553024479976,1535522116399849,101667761828589,3617651424723694,6397321356440305,2431107903996714,8935829007160063,708707669754624,2007249825702657,3448535845794563,6754265062216452,2641922143773446,7406398746740866,7589224641213201,8371186050355992,5292443596493593,1204525904053018,3846372724904731,6766022098260765,6220668677568645,1085110064290608,5520319973442338,2400567352746794,4486920852308779,1444704086512430,281961379496752,6764645170721587,8654972989005961,8111788201853754,3305145666704191,4318835432835119,880944936260418,9004470333778309,7563956514898758,7891574156116807,4872282035061576,5686477407105865,6902848798801999,613196225073997,6665969098277710,3672986629927761,8131110543151962,1762870000702300,8617202252571450,2743036405400414,3969760974037855,4705960937878370,7379969146299243,7857157075075948,1956874176013168,1800582779684158,5225438995782462,6767414378791802,7778692038058876,9018799714296640,5846387627303812,5594097604046998,5403499508904838,8095646996816776,6628490708865929,4250192010793867,3770474978173838,7845345455457169,4959458866516882,7346359753855892,2580970936222613,5661539703956379,8451394437669791,555064206955434,1619050377991083,5276737893766064,2380453926099784,1419524221795827,2099890291012532,4697029424219062,5882477878735802,1847691379712955,1818469039178684,5944123425956797,1889247458542531,7399995155960772,4206703434191817,2269342184969162,1616918931690444,6831678573274064,8667230609994714,2447633882485730,1732930759828458,1812036776096748,8086056825820145,4466668668126194,439633279505401,1028455693988859,4928313503585290,9206192247876439,4010170041611282,2572879589254165,6825870909457432,3438068396990763,2230049309864986,6289272076010526,7638123624956959,6679572357522469,4296309002621990,1982070945809447,7470225393554478,4255053537313844,5070334302934073,6091849742045335,1394110803813437,1491327935349824,2709331885007945,4768361188410443,8226427297518434,6175412393120846,4056437191389368,1012466801972306,7128712988759126,3699363315967065,1363220263154780,1587278329123933,4917307302671454,8040937972823135,6994846824449120,701957697438817,5570826581951589,706410266956905,2356560087015129,2468544907732076,6066865359119474,8017067893077107,2510159168767092,4469787924382838,3580525419063487,5779067890849943,16326418310270,8982264713942143,6665212829107331,3295198537684103,5393413127685256,5824798078608522,9210340151784589,8028593724777617,5460098905183379,6626081720048494,4114702947157529,7292922572679364,6402390473348253,7098229526619294,6900258632144032,6901815904982177,2714323006592163,7271681538016420,3353254705202342,4957631498724523,7578227797632176,6988899132007601,2630461623881247,1466435187590334,7176260846816360,2281766585535350,2053003409380555,8036344752620749,1748761380466211,6849818535346382,8384042260702426,7341307130356959,7691136145372391,6226868627563756,3589693749847282,9052716660266227,323596301141240,8216045835405524,885593607341307,2752692021830909,6670892437817557,4406492505806082,7988370944460035,3278563742759126,3961823257785606,4566168139506952,4286373418099978,6625951949042956,309971089442062,4552156185916688,6438146925950227,3034209056785685,4191943309853978,4741073521857820,8319652296861892,6149063494300961,1685859890382115,1652587438204196,7118846455757702,4588363326113063,1765148741072169,557721158448008,6953902591558965,6041039333680438,6576908143964328,3657844540654908,5733105989145917,4008888189285694,3869924814042432,8176222383211842,4296786373940548,2933516786885959,5791320500336687,4464837410264394,2799257190778187,6300464186099020,3486028119673741,3935820350182736,4841779429176661,4643317770450265,3660912577754458,2043484502103392,2925585827431781,7425669877310823,4420288795344444,4931081599419755,7240009369253228,508265933162353,4121847829693809,7410582267078002,4256611156690295,4603237110961531,1557320853493120,7306110259713409,652878438888834,7512200403215753,2120135176013194,4700926370805132,7279002536527900,2933681691207055,6732633796122000,7649953650006936,5010353388426645,2890576830961050,1687851035481499,4779915844842913,7271285287572899,2503637756888485,7646519553439142,4409034027830172,4434185593398698,4007202357118379,6804686973696925,2238001140269299,5749329268807094,4862216097378548,5373172045338044,1632371776021952,1752525861848515,3363703174778328,4723039067641285,6429386886174150,6204219606173130,836336456564983,8051435306591692,4314523554989518,7249624317781455,2286121542698450,5590654729631187,4347759499200761,2452445132109272,8484946928768473,7195475143882202,803005476414940,6383556767999454,7280790901241311,3068503147017696,7182624738655607,8514005521118692,5693199636649450,6659346812745196,4993671941084655,3350792372598256,8239989919307251,2246863260743157,1587067025036791,1443290160891386,5039818627507708,8772108269597610,6240239664494081,8312994515529302,5979388457727498,8006155366643212,1649118405633551,7038619793192469,7334873168393750,7255208446580247,4871481796924953,1002088587032091,5321744337597981,5727477263861278,7174408869742853,2741255366853553,4576776010754891,4714878382614059,6543559644154802,1562642289124910,8287345758619183,8042602519058768,2091687612847665,8385666893043250,8723786178340408,1525444594923068,4515714012559671,1688766193314005,5982651883034182,6705423615157834,4301852025615948,3241450548360783,8267161255413333,4262953492325977,609935241004634,4644988988191674,6512707079237554,6343696337038225,605965554034274,81441013629937,2498830640346726,6563143329506918,2031569284769383,8235088033362876,4613680661857898,5861733364356029,5794029206002236,1558642168804979,3919842369148532,7435225509116420,3034316847674998,4285751045814295,3813143181186681,1978261977437820,7180491461447910,7779566467655302,6825957276186903,2387216675206796,256239994017426,5560139766984302,456698704918166,2452027041948612,5527306788664943,5096131234385955,2188913703319203,2542380352325289,6002091904980658,6036819438300787,6216998686758581,682847590905526,698419116041844,9161276998325949,6352217802606271,3222902366607041,4422600471123651,857593898387143,2965743766218440,4065409019033295,6152412645426896,1222086237832914,4880027127596755,5848442856003285,9043585144760022,3348718914774747,1666269181728476,7319421148759773,4415591275837152,1911308702844642,8848528281999080,461740576102121,1060314291672812,6514624313784046,1903659515779368,3269770016560882,6617922695120627,6818391620380405,5477386094417658,5324974399469307,3948668660176636,6171805689196842,1053193818224387,4643014505053143,5236794712172300,1062856513177358,4107025652842797,1750188499486482,1546128779052820,8052424481388846,5993983692195608,6029037070776091,4553187474427525,2343211745400609,6126796654577442,5313748575829139,8762476870203173,8820508018214695,2135950102251305,8396905523018098,5315819074574129,4126539310467379,3037633508611895,712395058108217,5017125897705277,1401491963303743,5160832502175554,3658649448711819,4032163042916164,5103840308356935,6111842044831560,8148492459127095,422113070113985,1433779594507892,8460967226918740,8047936524486485,2126020354901846,1632882464261979,7443753354658106,7878250210690910,7335288011921250,4037980753020771,2815370805389156,5114596316759909,6703120324566617,8518234585655143,5529568401127274,3465932429199212,4275318844467517,7673791121868657,8149216041949050,8904817873307516,4205144376924029,5580029093551823,5975102336788117,4819115369985924,5257396834191237,1957913258096518,1173973982152587,7676499496871821,3378232796243856,5144943937755028,5541360854300565,8183326684174233,5555833971156891,4090374638159775,158838930560928,1970446904301476,2200512584710053,6142598255911921,4211585194330026,7908597039216556,6751718472353709,5632719221991342,7634088664827823,7448437165844407,7465750217877440,2973082453346241,7609454590248901,6943217498617505,111230851304439,2543914668590020,6912295228946384,2228385611937749,3046299146262487,6001044647475160,5213174926585508,8550336375551963,6316198188575056,1575845088630756,1301253239977961,6695255549130730,7271960630659052,321905279231801,9202838134794222,2309314454026228,3920971158439925,8737922153578153,6660182000461816,5240176360482809,7572196065217535,6356555689043964,1921195392567293,30728802899966,2990624498673664,8969731463108611,23232413198340,5029919174453256,6933842275756209,2480425044596746,3731797265233934,2618659328333844,981575742155097,7052457800103961,7088247064393756,5135647953635359,8752980152296985,2779716971591717,8198405290526758,7238676413495335,1029735005972521,5963731580032690,8405418483458450,22608690743343,579100406749077,585921249200185,3565908085510496,7862851081291842,1018627744696389,3814982948620362,3855196053223499,4370857352838840,6295802170677331,5902188182964308,6448678641466382,5178296210085977,2640839803467870,7595788268148836,5287924980463717,2148828527655016,4501152006403057,4239268700825710,6497559747410036,4655866435016829,4706193404512382,660624470648959,1580821992679552,8996130393538240,6222600999331970,6220142662449285,1665790659430534,3517027465316033,8298923760019593,1786795074308246,7515845436574745,886121704708248,3522778864990361,2693718156302492,2381054139041949,7675842211870878,2210480759261344,3236059129112944,9054162748934306,4619270626646188,5403220359284909,6632105153423537,3267161193343156,6007215402648606,1566190811056310,3051346115254456,4771253681453242,2658482099576642,970863783422143,7023802121849025,9075674501564610,3574339870628036,4048497725814981,4474522855971016,1935142465091786,9050067347646669,46621340318745,719086248777941,1037919808841942,5944685023824088,1263416183077083,6657711643551964,1219502817851614,2491525968132320,2909276743366352,7082766595217634,9004743361890683,6655784541026536,1398020800297199,8499795434696341,3444320136067321,8165028043712766,4719679162190079,4020677964376320,5912107992164609,383206549211397,1345957541304583,3797998046996753,680924759595286,629839409494295,249245521672474,5918034075425051,2531250060085532,371895955265821,1738682984859935,1862019328682273,6990204690958626,594313906080035,2043368522074407,6350726528903464,7373482686114089,5299713069517098,8782509945772332,5989026305333549,2794510125771054,977288665454895,5157142980553011,671304026503479,1162497096374585,7772361455049018,8107813148055867,4823229720832317,1885674888972606,5142019636532960,590237848529218,37951885756740,1398942549666188,4778740959955277,710472652745040,6003744056674641,3323209432628963,6890674997414231,1399264935864665,6774011668023644,4870114716556346,6014264965245279,4858832416397667,3702345893050724,1141335470892092,7518420804368749,2510680880142704,7433194740287858,3932977104410995,3293218245364090,4443501701200251,508780726843780,959374959683973,7628296664791430,1092610402724234,5879627612567948,6647987482495374,7149491235723339,1120398130084243,1723750095011566,7226103730370966,1789362280257947,9039369267980701,2253670105323944,5800699187722666,7926935276169647,9061117719996848,5048960977742258,2333856627697395,4580626687949236,5352603648715191,562524250114489,1549923306387899,6814082886752700,3808624783338570,4593261319838149,4217507141396934,1556452455070154,8867769894328779,3299441711987148,8000825639082445,1738735243028943,2394393792487160,4974784321382868,542590353566168,3266928135117274,4344358254102266,1329459480517092,3422623722597977,1989790886222311,3051865564367339,5313617650772463,1724978710120944,2519128051375188,2385337652894207,4160670951270912,622895078607362,408689146214916,809166814992901,6817676167440907,8461030695393804,3722728918505998,7190590755117583,6675146418919952,2168708440050194,8415897948723731,1799275550512217,5087005766474265,8918430285740463,411440501971485,2708005668014623,8000732505981360,7717934149074962,1286637021637157,1682310523529766,4127705317816874,7433486770371116,4477650637916717,7222866149419566,7663656148907102,2143633305561655,4258602009586236,4993379552414269,8252562674297413,6732942045899335,4318886083561228,3149003956660811,3228878643919437,3548653841193550,67817828645456,1905249056074321,8875401645918804,5313221668330071,573647619917583,3012693812094053,130707327642211,5933485551848036,4336114716162661,8367947938376298,3000776220301934,7556309626524093,5536562584013928,2644611646589556,1610559526034042,2458296875498111,6782763663649411,3374311318157956,1994989590923909,4584398473529995,4854433434917517,9145918893308560,5009592701635222,8741767362595479,5926515818326680,9178607516437150,1765481965120160,9173735966534316,6349155739060912,871615885175475,952503034071732,125118543864948,3200919789275834,7784264530234047,2497551091509956,5474197072353989,3258593858783942,2155292835134151,2062151605770953,8970552597285579,6864231584673570,7365912255011535,5538603843619538,3226780118452949,3040754194369240,3447333950466781,4714411779611358,2778335207828191,4474836627229408,6315866643081953,9133467161783012,6918699546639077,3139745478540006,6588853739191015,4777800233810666,4025239755770603,1911774360595189,3434592957565224,15486402992011,3751902146337545,7025932227971850,293307759844107,5806766246681357,2034048980261653,4033132017077018,6033306993224475,8053196510477086,6012595573398305,605550867979043,1431189243804806,7451479681862791,9120890297499251,3901860279610160,5184283798977329,84235506888499,1866631133592373,1764102047550262,1486122291764024,3205220986981182,1215367802817344,7717721929508864,5085985997646664,3185114544156471,6444805061221207,2591809470249144,2014066793122658,8465588704373604,3713630263146902,6122938221636457,8866532082886572,3576827415317358,292057775278959,5932506880858992,3744889778342771,3337006507027316,6540108473061725,2267140866669433,3305912780663674,8242509277800842,2673511928900481,2389084944165762,6475836333869957,6243995689851782,7379829968853896,3429680550988951,5487075533467458,5051660440165265,3480244563344275,9015338278898580,3866809955392406,2388458349259672,5907358679788442,4324924807740316,2644166403480477,2648138721524639,8916078406654884,4692357545814950,8916403849780380,6126812501064620,482981748255662,648296794975152,573552274074546,7679017234583369,394435626580922,637960934820795,6529568710601662,6071258639096772,8500144455359430,947039951981512,3675328967351241,4508854018702284,1462865613175762,8734987591206051,8416985560965161,738145071111126,2551499846163415,4566690651200475,535980492303332,367566475336677,708773741927404,3963039301532655,2473849914227696,857833406467059,396666605734900,2898309714156535,9030300654649172,4082016521255934,1158386151820287,1133707309923329,67185945734146,376528587926534,1584025617460235,8104229107522573,7513943332641806,4690675613887513,2227719114325020,664855006817311,5975051691318305,753412068572194,3331275205881009,6390214201080874,2594367815535661,9210200562002990,1219153091591215,6961125299984345,8586563349642292,7152001456282680,4486627552177210,5743719099972672,8170406397811780,3108382554680391,7860038869142602,4394697482443860,4051557716770597,2097304578901860,389534799936603,4761346602982492,5409417538255969,2985952167095394,3192837176745059,294059568385124,6008386235284581,7989143082519656,3728195079105988,4668987891006573,7773777247820910,8638636294902714,3680186385693809,302444080311414,3539298131283069,3378351674969214,9002536240311424,3362389401832579,4879551095262342,2372516771064967,5077699897622380,8429587729190030,4254226235497617,4153421342784659,4097769688652949,1760143335787671,3691722265992344,7424615037656217,9000197004926106,6118771119078556,8364738418386117,9134259388771488,2471304272518306,4613895881189233,2968097922313388,4623027750755503,8173560247061681,4272090233126071,3585443622718649,4794537546119711,6180633024134332,9039413318061258,519317131873471,5517217691980321,5142720963497160,858346821979338,2360605979561163,8098752996203725,6950291108609229,7872124986674389,1832676210420950,6296198678530597,3555906437774560,5293227928186082,9097110990535907,7853228187323620,6349814662646310,3329366512347542,3906442749427123,3031575791544189,2231862864346352,4750168611921139,2182856114900212,4234151606328567,4187755731385597,2992267071569153,7930556109954307,409048438045964,3229423784406286,3941585576344850,7397408495521043,1300077951397140,3519103754882327,182894473639812,6702098081369370,8623762731048219,1056291891215645,1647301916466463,1762167038237984,3352343518653730,6975176201743661,255721847721751,8494941634530611,669715609759028,638713908870454,45510523280695,118850792160568,3461279296101690,1035852071759164,7245130650393918,5958310396539696,6652156427906371,4665367531289927,5906045567769935,8954980136168784,2071292293119313,595990611369299,6520928972053848,8760454551018843,6847594244808028,467842783739230,7746301654142305,622468728720738,6649849018223971,4993821332671849,1424250345606506,8009423552965995,7297121946553709,2760870183529841,3357782822956403,7436742215986550,6119273507978615,3335214725995899,3649292104101247,3030549787726054,4815304487574916,164159743683975,2370646807948681,8844086343749002,6267645763674690,4411699529170320,2708849786207639,1034784625724826,8390720333724911,2256765633588638,653939230784929,225202513225627,7154627868116210,3972055687531951,7410107040562608,7897693642436019,9214595157327284,2277439719386550,1489094287072695,6500861610704317,64527490346435,4419839435926980,379493815282397,9005924087004407,3550126208331214,8515172390669776,8399174400496888,8930960127753684,351108970225109,1822621142429143,7198676068515288,3469237703912922,4047483895381467,8443895695453668,5214060026282577,4915386772274667,4549179989208561,8028951835008499,3204581065199092,5738074852257271,7912420132130296,9097088830193146,8375837556614399,3972455628799484,9055361185443330,1906540437442054,5718134991449345,3909582453508012,7864615723232779,8489552829826306,2820492071194129,6840391961624082,4319413834821139,1772939526778388,8969334026273979,8121419597504026,7503485825228319,128816891805218,4379690661350947,705446714433060,2568878986853925,820394455686695,2940781806895753,309606158851629,3147101268692533,78274576199222,8111723595419193,1979781070458426,772766945844796,6798290912415294,766988000693825,5872676409843268,5121307788178625,5112264209264205,2419640507002449,5470787892245774,6796121780268630,1564918442703460,8938131610152547,5789155628273256,4764068694986345,7761572431384170,1479410955222638,8583831278247537,1278030743110931,8773867709611636,7056283644591160,2471560177974904,5955819215748731,8965990864823557,3990042661576323,2969040215920261,1283599874485898,2226073280441995,3654522950291084,7414224308044397,7957640710258325,5788356327403159,480436623970244,4175175464644250,2285483878674082,7423955930152612,8397980423859878,2825231052230313,3250874724105901,8471824074650701,3243064334823087,5341841813434035,2397455164276407,5703744713424568,7307106574503609,48189693652669,8285663616666985,8749612964843200,1492005587099329,4705121209716420,6036093765795526,5049162503798472,204369693064908,5032165887618765,336828499295950,3729875874668239,6795752393858769,9032659238981330,1315803965678884,4932613923790554,8583844230659807,2427152487059168,5746628872325304,153392442154723,4092293004074726,1778403038011113,5062367468975399,7134596113325806,8138417025478384,6941341258072248,7725451158945540,5406037395115795,897739235569431,3393518721306393,8876979638280091,9035880987504416,2817591628377890,3089191838256931,4413048658267941,7558252083740455,5668017635589930,6543723640803119,2633991740651856,6411084763733811,3364937116159798,5421222717350537,3905608876674877,8144550919171906,45643311818038,8663052178206689,1462207275765577,3188087112486730,6447859081650001,8597145275563858,4270490275327827,5811701756243796,7684452332666716,2192207013920607,3053021703765990,6826216311742311,2456214276181868,2327933107962515,3663980560999742,2164967973474166,3580786659577719,1090936130195320,4577134788280185,5404264228616170,7344418551766910,684240108703617,5533754349584261,975841842376588,105394020700046,8922371617161103,679955435454352,1910050102770276,3676586999299986,3892122285604163,7447391526203285,8822386188267415,352312902218888,4813760881250203,9200384108342666,7206391591448480,1972160450375590,1926577103970221,3446592284958639,6756981552648114,5937019684089779,6030549289807798,1136841622142904,3222102448775097,7997523536310943,6295096726775489,5961328317609290,2141977517432768,3243943319852363,5659024196263876,4784738786328518,5124961729411763,3324635727951180,7719469493067724,7021979659327480,3908036558323666,219824613683156,7400643931094999,3791127551516632,6726128026705231,7221355426709472,5229918773800929,8026034986700771,6057091886861635,6807165367185389,7148748972892142,7596813825384431,2619379149884755,1226354329169908,4399641196470261,1607463124791288,6031941113864185,2775060870184954,5729626494808059],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/849cf867719c1edecd4ec5cf2fb01a32",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000231325.2/GCA_000231325.2_ASM23132v2_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AEYY01000053.1 Streptococcus suis R61 contig9, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"849cf867719c1edecd4ec5cf2fb01a32\",\"mins\":[920707953610752,3710788530683905,3969680559321091,1651016481951749,3813756138080262,9019803702147073,4673037467680776,5863397707016201,2716291562034519,3270705421697037,7503250862651053,1297996611057681,5869229548704013,7021724128667669,9203607171314009,6292387433898982,4470334684678170,8040258422089755,658661577611292,5955159063961831,7131659300497440,5235687033468961,3379326469888035,900512413736996,107850506008614,4002992082235431,8528176429915484,8722858002960427,3471026647736366,28297533282351,1744175100907568,8994495385380923,140018627395635,6910882852395060,538645691768885,1013883426656311,7973641932968479,7154333411081594,679568779339835,6956210491600956,4865577617100861,616563665374901,4272847868815424,1286383688366148,4797451377856581,7602618725470278,7241392574368097,2715070960064585,4107758453647434,744225807958091,3235918675793996,4897708626149457,2553516982704210,7304433911443924,1781561793629881,8624837604380760,1002874274467930,7879504806663748,3710744711866465,576640951570530,8592701434876987,248936661102694,2090191529275495,345464082507880,4870866558093417,7989269393948779,2952698961789037,5169777862713455,4480680724449392,6440225722591583,3064983410770036,7591560925259893,8005889875590505,1360860862709881,8578455738919615,2432715640828029,1017027163859070,221928193134721,7847413931077763,8145629454607382,4539988128958598,4603307351746697,2541404504101003,4043188865904781,9151602021230479,3365192324847760,8022323248504978,2945747219502446,1588856049559703,6332825461018778,2285363781228699,8215712061597213,5034776428769437,5694119029485726,7605485815947425,1539449005719714,4781067049578659,9129333645417158,7823630237970598,980192377581737,7849422396230250,6321442685816049,7137670884036782,2742531915372719,955712234481840,6402031103355058,3402168264728758,9149058245857993,2660714245927098,2364096720306364,6192451849656010,5656315120961726,2739360088350911,7620442427660480,8847858825872750,563216670714053,4360065918916806,5024740326023367,144560085020872,6458512845217996,6890830381633741,1540241389965520,1421895182973142,1542015726377175,5900545680054375,6608190345396445,178791745065182,8583757536949804,6268116066627808,8608517961312482,1998636166316259,1115363189444836,6202262907191526,2909010947320039,6981496880312553,7395067313148139,6865628680516138,8047760525698694,829687055548656,307934552766705,8698207768776946,7054434850599163,2224303576371448,5086795107381497,2221703666131195,2894448833515773,1340098237124864,4604804977676546,7215861556540189,3090828312017157,6966089964474969,6452186665891201,5001539821283592,1002148925554953,478852593600779,3456751725867394,4226575133212943,2740245354433240,1902249082273489,3142145000558869,2164810991149335,1756635964199991,9037350776682778,9105195710626075,6386066478911772,832252414118173,3846719370000566,3104956028387616,172233913352481,3132051180031366,2098735906367783,8403053063158880,3191969796372778,5125641575107975,4254789351188780,76911279407408,5378437138499889,5115643056517171,6651365772906812,6715335976793482,936866361844030,1534198166716736,3757818030457153,4140543489659203,889907017584967,2330326014585161,7331708010271050,3123429143725111,3036136861086028,4614173180287309,492234968901968,4766817910972753,5893132862667090,5923407094137171,3950403644338516,3995170540968277,1960838965025111,3515086007681764,6810162517008730,858664214610267,265931086172509,1001495899803587,5449576302020959,4531443703257440,3894310300342625,8160682750722402,8051721722406971,4546782693142885,6711253542293862,6313056866011499,6126032955452818,8448676614310257,7270264330379635,9012310261623870,6225372069101942,2022361459883071,4079056162953596,177829488066941,7947274800437632,6585211352702247,5689176769485186,5510182207667947,4476464814522756,1968141587265942,2305192451475846,3201980604647815,6814994385321708,796503919669642,1783007393048972,4837552257345934,4626439597732240,3787766862268818,5297190121445781,3361032616737174,2793713872443802,4107938238212507,1335706688784796,4151287906263456,1064105330395555,7955430206065060,4830034241046949,7658874029762137,6136577051013543,8967734127611204,2705297015351721,5993265514752434,1480409082137011,4795749680135582,8036474357196873,8493508478286267,7301773601950141,9031749186578879,7045546096286112,5921873774805442,7513109267001800,4045179773280332,7412631363677943,872682563301836,2741741645849039,6028619719270864,6827307080438225,5538743938081234,1542768312420820,7067475824738773,8529739948788183,7106010866743768,8043184858820104,4277898507207134,2370660853522911,8747271767251307,7253913373224016,2196163266664931,8778901846938084,1853502202079717,1315073439836646,6119186709002729,5560551730282819,5124774643728875,8469033991380540,6992279527451117,6461004991912701,7476457136937456,6141224814146035,8976878314469105,4721837456984566,1637448455698938,3936671474629115,7281465917080060,4284351273456125,4360186847705598,7197613786377187,7879944060498432,8197959542774528,3616513560648195,7303128134215467,7217935469146629,861169439228422,6713374163429895,4492851506338312,6888932817320457,2288248750526988,1242320202709517,4357764411939343,8813423419404816,1662399289383441,1825510432641558,9154474959223319,6269801831056132,4309120326502938,8654142647439899,3929822988482650,1217626071013125,5305518116907554,5146569634165851,6061946832398884,2788737567541800,3452141865257514,6504619078150700,8627088826120752,6209681669047160,1471706607397426,4040693718526515,2776727785432841,2802532984298041,486670826689082,6947908830112319,2500886178923073,1922309706760773,843385659601478,717056425155681,5438668565150281,8289444240970315,2382061366258252,5843266658750562,5662499366472271,7815163033258576,1877943373374035,1690102437616213,4847018470572633,8542512498500188,5651514477881950,2407098317632098,5276047157738083,7062165135680101,6965997573085232,8283705902084615,1020771396625001,2321311520985706,3699319216377959,1345580236792429,3114589513855216,4250383556407920,7160139251722591,6744214868832019,4821400422546040,1607003113994873,1584638564043386,7568787486710396,8344472201742975,8116900106179564,2792497731811972,5966159218379397,4505886079417452,6108547401058764,5045232290943629,5053490605697133,1355291571569300,3152588199846552,4681453926757018,1533686506613403,3328670341530268,6362807920742512,1414988881355428,2776290975197862,4284566014984874,1905467914527403,9196690490815359,6004061467690781,2954349727001264,6686604321374899,7099842774658428,7928481161449246,3317987112452791,2381867803359928,4740447687752377,8937225497402043,9013345091468746,3958058211494590,3998147928835189,1109010590567104,3812178517297857,2192926132724419,7496730802853905,35411154463430,5857398296598305,5809359762260844,469226692595612,7089643710379444,6792384569971404,154221195729615,7173699805284135,1124035823927075,2695779920540373,3845344304462550,5958496034585303,4829455666569944,2848337673870042,2835608504883931,2753306043994845,2158504634268382,8660271071562944,7414139982441185,5477225661178596,1284512733289189,8533259532277389,1273137678768873,3041684490304234,6425115735460587,7455737290383826,1430528666512111,851686300945137,3998393963731698,4487333855011903,3419820812855422,1131716451412726,2594724540476151,1901150018212600,5746182306163449,6922826841793274,5780272751438587,1747007327038205,4947293057370878,720096307428096,8705662486859132,598523973507842,6981990381367083,1627701826646788,6423222929105669,8863139310193415,2731637573706505,6272786828711383,2044388185895693,6997637783018257,5316943144469268,213762938612503,7722979383919384,7217142490983556,74676903879451,6972144572097308,6576006180607450,2980759128626309,3522016230338011,4457355503452964,6757265759372072,5820671746925354,8153337390386311,6862396473606956,7868137826095945,2211037579430703,6266393125805877,6579996435084086,6424877797348152,738729367214135,5988147418759994,6424081375757115,2723372731325244,971951004236606,6171459293386739,7935396550171457,901469967616834,3463993835930435,4751173229029393,5488092924350692,6803935291032390,3495894733413191,2522441358791496,6642350870534985,5273602867725130,464202325310283,7195367793449101,5580184233870162,3392805497324372,6361666693837654,8041429587272505,1450118802387801,7044900998308698,5690236836164751,8217620413485916,6639355658423133,1562829503840741,5834240932772705,1783978992411490,4646333860839910,2377451656332134,1251617500056425,6129976606669674,2356244587799404,6130323757691757,4335821445923694,4969111458802546,2368223979811700,2500519265041269,1597165174238070,6659959221455337,5143556747680632,576837030751099,7212946810667498,685929796324223,2174056106632064,305609701337987,7303697891036038,904191620533127,5389452397224841,3124797717183370,5979791419339660,7340233240167314,9207021757550942,1481340988353431,720115990641167,8020529713980315,8563303627883422,4613964997419937,1118919509873572,5707520748929958,277256561902503,6981007944240040,483776484162473,193695532483499,7748858333385885,5035262503709616,584638193560497,3323366722139058,7356931683748339,7868793779056798,1103976796285878,6179369410497463,5902555063428938,6701169060385727,2466309596492736,6919316733506497,612176082437963,6075697404964342,5622373519044798,1661324671149008,6403712801815505,7523757535081426,1937524998384597,94762446089175,7184449931469784,2186278660838362,6532586015126583,8465469536011228,51740536982494,1788620696646623,6282529136645088,283505744833505,6456908489761275,6835304135658253,3567931349857253,3720283461434342,1771800889250791,7217421385135080,7522825120566250,3804787631500268,2795873522494445,5983853238420462,216938067571695,6515103979186202,8083174112472051,5734337029039092,4840945752713726,8387049364103589,5978780305372153,3043436777462055,8745299786802174,1560122658855938,9170041942182915,139900172755972,7392088683821910,5540185462838279,3252403600401416,7429271184268297,9031393745468427,8002747693986830,2239118242612242,3613501594236726,3632786948877333,3624322301666326,7192697564320950,3864218689565724,6696930213927967,5246269725355044,3317193386773542,8683322758937777,7705919407312058,3954911385533482,6415515756348706,3476387265559598,6795138342588720,8511296536404255,6978432772937224,5901751630861581,1796285873073024,813711676728375,4355817009261624,8646817580706873,7896129864204711,630662374974523,7603058696285464,1142231764204607,431888152466496,5632265916804161,7281990247703618,6531224636496963,4455862393408694,261122841902151,8526629107559499,6397981661516876,6106766628490318,8439187529417229,949934653135952,5914648417958993,4254569946256473,8316193382164421,4392445285934607,3358523015070812,3711677277772986,6869732893757285,2126693082979424,471715360453729,7800767727909987,4802160839894118,8006536480543847,8238020921771112,7950391740197993,7588816640769130,2111718917475436,7561027996310772,1489403767477365,1230104222174328,6978750543563898,3605123404674171,7313837549548670,7214516880860861,8114636713036992,1207454844640387,4177030126836868,61536535798294,7309347464809439,3027634326756545,1239746263241865,7917604718122122,4540299333883019,3525970127838348,8825007405231212,914506755208335,6875693151689872,3616821481669779,316554645044372,8907362378762094,6881260543474296,6232178001378455,248934806074525,7682679530542277,6176097677236080,8199703435479238,7393467101044593,6805236241661096,3596195835600041,1895756870986922,8879530861031161,8330948597358205,217763642276722,7701961665723566,6158173686072495,4233537758473392,8552735262348465,7877717952470629,8115706231035719,3007790731898038,3609463642483897,3308111337811130,4862626375469435,6247017866228924,4825585043031231,7378020791296241,4471150378462401,2321311808347333,5803284580459719,6054763995532489,3900746207747276,1189452395615437,7762410822800591,458050448735441,571752398814418,49895064732886,6180000836405113,6837647221418532,7777888681255525,6500931993865595,361927369266397,3040850259905758,1043568537652447,42816809045216,7013042189657313,7736743848441059,4690207995671782,8757788448273639,6394186014500072,4283343907835113,2361681548428522,8737132398489012,4631537530014930,5025686648134894,4792071506377256,2183967207660786,5923026846287092,4858341664775413,8000681874245983,791738421296378,8869912897601834,4440585266072828,6839961072034346,631865562797310,958229468241153,7485706354904278,8990037452043526,7100164790779144,1808269097721097,7839238651766026,5970026317272331,908947519593740,1275000497211176,625194328596378,2633103816717586,463826799439124,633257267561749,6565487531649551,1492991819916570,6520632632251675,2615202483531036,208557789003653,5422770340113698,6063312265957396,8694969582990561,5802848239009329,589197730090280,4421288869315882,5726611104352135,6110644373300526,6817440917759279,4385494166398257,7566724716256819,5461440369870132,6709630122743006,2772318960997257,7229983654095700,6268545964889401,8863780960244059,4627018329208124,6144770633962378,4518908294143296,3789713311186241,3410769797080764,6230584671741252,9185695449978182,4324942605751623,2439108627144009,3112499306360139,8981179128780110,7570994610326864,2448068076621138,7766515353388371,2324298149819732,263320842812759,4355778246099172,2555410898173275,5110226634646876,3108703404719453,7461986201585895,4269405782545761,397211752176995,3095640523584869,4017094407570790,9070037654996327,4150879731690857,3277611400998251,2391011382787437,3950913743979886,8114085038930224,338724998411632,7159340526445800,940620980770162,8443944029212015,2184435465641333,6526123271576809,4709871184838009,1627384408919418,4346751240184187,5157391120940412,3816007393461629,3394613354587518,8935857293510549,5989508040349057,9063005273814246,589149429519748,6713033909452165,3977364931992966,4118929883450945,6988277776857324,440290995002561,1767289376005515,8254624836499761,5450413257844926,7458383603313560,163158516286866,7531001353933866,2236518222753172,9125314364079510,8105678637633433,4454239937512856,1800033198527897,6233697688194458,8132434159875483,6785350626431241,3457087666627997,3617102764498334,1632418068873797,4039520297297312,779083822674160,1868046029841831,1560253347421608,3032721622709673,1581325971451309,3620527893642671,7732280629370440,3960123684971956,1682332412394933,7285945927487055,6963105316830647,4861719114698169,152019413454268,1574330165423549,1732389710648768,6079305217836481,7279521061655457,6652409619341900,5294166584202639,6691782852296140,4708262466778574,8101530584229327,4871732364041680,6292738166233336,8371881995564498,8267891362864597,367180852862422,5783456465103097,5083602743277016,4911311029181913,1513977699931610,1894830296149467,396247896569308,2409408383551739,9110116586165621,4235884621047269,5475230925772262,8095057134200298,1324559718658983,6113563973199340,823728565601774,269071940302320,730723790683633,8971969706981971,7349298366590452,2434271738561790,2811353606667766,8180000358033321,8453756259186168,2481856494245369,2426636113393150,2617929152187903,7734809255206010,1745310364148651,2109738196706820,6067768315242070,7745223289298765,8351083406683655,5591961136180434,7502822021268462,825994486677004,4802772738760205,2120051194793487,2625884019353104,8720212195329554,8532676691496467,1244798845493849,4063139392622104,8138776254119449,2490316910034459,6141828774358557,3654141484555806,7458651204761119,4205795544166695,1722628640644643,1060610563278372,4056367610070565,4074797708416550,9138397453506088,5699912123626559,1284951547457068,3729838151216685,6162995806494256,209847445747249,5773890145525299,9173551197612638,3309329050365495,7419775182491193,98144704196154,3370056846603835,3704182799900220,7404769696177726,3890543519473217,6536097692487234,1681795784869443,5717042267906384,8030897839891382,2061822239800904,6793430889602636,1668090799378362,4395082745693776,7710418686939596,3324698849060434,7214117325602062,1356913264125526,4441282898091607,5324642433265241,5637101909098075,478349369724509,7741106936782431,800309622967904,8087897509254753,7671407388967938,6138299546873444,318055950806630,2215975947689574,750809975242343,7074113257395816,4103189802227305,8776434955932653,1701206331403538,306342148408135,6913583077881459,6713069800406633,9096319421808251,6974614651137661,7417069638529612,7376900318526400,3718603119871619,3767343590514310,4923146414116487,7170480479200909,4369306642491023,1712897202333329,4976828295241363,6628500115006527,7159214096490136,522423118880410,8112111728184987,1486340927237788,7860748084373149,6441401138398878,6957109927493279,7248595090545264,3626277722701477,8194033217072565,8182898888175274,780610456338093,6680438976845486,6531043645132463,5091660198719157,3690562948517559,656271618283193,3133074050021051,3808953257699004,7061549448627901,7038594431016638,1063550329718467,5062409178588868,6017037957524875,4244039380881697,305305978431176,2043891780501194,1630147105146572,1631695555163853,4285658452475598,4151626391730808,2457848580338340,5828568098219734,4869149453560940,8406013156040411,8886354104428382,5540498567737055,3323247376556327,4072173490226924,258630115659503,6005251197617904,7728243574967592,7106202677032691,6432413450721013,199046847497974,5091006604019447,3787692320392952,2681899297282851,7662376945315578,373085347779882,1310703462070014,7435681403602687,6980471645632257,4760883817858820,3109425182985989,4424387310860038,8366915414624007,8202105009413896,22623938769196,5271339033370380,9175034710784479,6248619992551184,7804283696199442,189078098575123,9207650241206752,1435119156306487,3162804268369687,1669273586591514,2645722409836316,501194968764189,963359981750046,4075417394827041,4455232586020643,756062021895973,8831693558990630,6656284862803317,1174481431641896,79242557400875,4843633500178220,6183493053323229,6228549365546800,481977703765809,6216767185512755,5783349748971317,2077355096430390,915041756099209,7522941473617720,2145016740839227,8068244695997118,2899288304480064,1614934529484611,9204458140985156,5693588744366080,6024727366428487,7845133979703112,626746401861450,3140551538874187,8392202679414604,2439351253743437,5298753850000013,8837313478815568,6086146456526674,5456832828145491,2157082881595223,499063915073370,8776902378168975,4317267062550366,7251020874808077,4490452960657253,6597593491965798,7378063765530472,8395004610914936,7650851565967214,6007573482478971,4442191280086896,6359188111294321,2083523329785715,311355226832756,8650242994792766,9121985532852086,5196747393918841,445868057046906,6533833729148795,3374634417700732,8583948863958911,2297813085041984,3892902649661314,2772186163093381,3305084118187910,698136960604039,2921473926993801,7927987699566474,4188441638847159,2248448023988110,2384878902056847,3873383712205123,1444557411188718,3308613346608038,424291665969049,5588855287558042,2213709083912091,2067667575304092,6668412686443576,2230795233892255,4838836931184546,4062020205033863,8561432841348081,1562170802193114,6108772211734172,8742043247413164,187753217382317,1636668291549102,3063000400469800,460017694263216,6405102108182449,4897093270601715,8822574440464936,1856829670541238,293741557926139,7397909380696598,4775075402250170,6790068935551355,3184652566058940,7822860109752650,5024282605506496,6368161417682881,4931180405755211,1901722848720886,2988440153456584,364508493594569,8357973940273098,7891226802583873,2855558689343436,2430743024854989,4399570466828238,3513734193033167,6220238462629880,2238825436129235,1268326672017365,6499328403386831,6089427814832087,1437027106461656,2818533569239001,9189881524015066,1241755738169338,1747350959398879,4195891374536673,8026034986700771,6773040100691942,7075776659579900,3984773372071918,2243123696416754,5504424021558509,5875054412437502,92545662134670,599945028098040,130740848526846,5486730798387194,8631856925251579,4330414679058430,6058990085193727],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/857129e817ea9f95c22893d652c98a23",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000939755.1/GCA_000939755.1_FHI43_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LM996052.1 Escherichia coli genome assembly FHI43, scaffold scaffold-1_contig-16.0_1_1401_[organism:Escherichia\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"857129e817ea9f95c22893d652c98a23\",\"mins\":[4992640029655040,5859080619220994,1635838075559940,3728622142857222,3936481708941320,3484985178759181,910260459544594,1030989443989523,4166152299904854,3391826174525466,1040906481516572,3990693506301981,2261620935442464,3205569263312945,8981126744596535,1470093577691192,5862130321367097,3533801781903427,4028438952951877,6739609084084295,8176761357492296,330642771468364,6819720967376909,2591063679385680,3545494450790484,201265791500373,4588882368847958,5510527001436249,780927423520861,3589031359889510,491199959981751,5568630790840431,3576991172001906,318427908817011,1836408434376821,3459151149293686,372708354924664,2344109037412480,3397773105741955,8539004164948100,131111881973894,2158723229016200,1529771851866253,1561211337072795,6450230006775964,4279099998765082,5809570678718622,8324706907900613,3089609529942184,8520891560951836,5916556218769580,8044184034230448,8325523366535346,6781713908506803,2664362379264181,4986328008868023,7359845544648893,8417413703262398,8918452353679553,4594386927288514,8424605680853187,7832654526906569,8044927660368079,6552739233923280,5089565009928402,3189533497565395,8822754571518167,1228794839154904,6763584774734042,1452769867915484,237629023248605,7929936158056671,832839452246241,3628376511791330,2430236048871462,785648654295272,3529317775237354,635136383123691,4785950324501575,1223472291905776,7305824813293813,2144861695090934,7503106689917176,8537884731810044,2119151366529277,606392454750462,234488146968831,6485806308532481,1639927227006797,7416859535778063,5962730765967637,3262363570020632,2638357482914074,2174974481998107,4849657711811290,4256472601616674,3653439517311268,1328257188593957,21150285087017,772117172191532,8150994036996829,8606861947601201,5277353545212218,3625832106907018,3495517882196287,2088069525771659,7867289030074694,1787998382186824,7470985706406218,3713786577838412,3119791007357666,3485528599363927,3907407941673306,5333169923062285,7803850822918494,6459771538178399,8654755319554400,2237273971800845,5113003385821926,6344111587721574,1085464144855401,1122474689470832,2239183959286133,8631931222106492,320413748797826,6258939950604677,562273227383174,3043362163532172,8656156206547857,7977902631756178,4120780341174339,7215055957377431,2564237403603359,730627061744034,7922006282224037,6859671838925226,4858254758601133,2177821880959407,379935127364017,7710114327355830,965770318045625,7887496498389439,2187371118363080,5510921714606156,7685169946280396,3109437597065678,8996701607342157,6304638001390035,3215349969969621,2834613235985145,7305037143368153,6824052985741391,7457366942433760,425106164556257,4818984406655458,6634543832547812,1623756785893861,7500043172495846,2931571972751850,3261513360556526,4657428946461168,8009831577100785,4107450076209654,2966200342921724,3279814386115069,2409391466709503,3637533446136323,86205975593482,2139538089042443,382644013236755,7407170124071446,2483232887628313,3058265525461530,79103686168667,4479140437973766,5789573214511659,1748337339925036,3477204020958642,4693005131825245,6835847231583714,7976867571786294,7727464238473795,3692356022403655,4626708574213782,116925212033615,2272874058326608,5539170023359057,1525557707760212,3848836181647957,2164808574747226,5080508310012510,7010006138765923,8384970864149092,6533317938438246,7668082082085649,1308106938819177,8940081059791467,3024423721812592,5045175309042292,4594897880871017,4120589373940346,2897095043949180,4889826673729378,6522676544610944,2397689414378114,2679207567196806,678285722124935,2766065063510668,1265127932322445,2353730651177615,2019585422459536,113269032034961,7478109265101460,5339577517900437,1497370230207940,4356419988349594,126141660684959,3504564547469991,4273289964511912,4011135044584903,9079227696518600,7148313253921459,1753771755791029,5664545369785014,8934365746774711,2041358419321528,1560440145576633,3496369553818299,3212616315093692,6564781728314826,3375494323790526,5912127355224777,6241345841922762,2555252183827150,8278752712221393,7298738867790550,1550977950057176,7978166717801177,5294766748025565,6957996808897246,7088170934731489,4898968024122083,4704426556949222,2492778624172776,857241360966379,16356710474478,3672224951714544,7195725468017394,803647069838303,5842392311423734,3812086123586299,2106232978768637,768473419178753,5810464076514051,3022689456030471,545034796114697,1280168115413774,8432821866570514,1021838098774831,2372682746946332,3506712906728223,2311740509119264,8983104269525793,110100254491429,2437385865757479,8720797758260008,2004039151534897,8782375079969586,1751698265555764,9011426629690172,8535130076816191,8833428846519109,3580844672500550,753153853702987,6652001087071052,3473052769015266,816503841678163,91491949740885,3826247007101787,2385032288854876,7405781378130782,1147610223223647,6297328210846560,3122758425690979,6966002038825829,6134002501714791,68792473092968,4960729051461095,284796527510384,8931187842712434,8016739934946164,6047489833534326,5617027811771255,1590631988888441,7522030212350844,3813469322421121,979340250776451,3168575450833798,2962956961735562,6124171288552331,4331047018382223,4626252930179984,1934324536599441,3721431724647317,7556093500883867,6141663376171933,3541206393355077,7929910898655387,2441464999887780,8451504177177513,4953149820658604,269236596949933,767973926198089,3527308810683320,19431607690174,4610472403542975,7497510951280476,1157467251442626,3584901329069000,7670053797333836,2801309394576330,8859992315560909,4616453495653326,6940868016210900,4794640989479893,5387187980387287,5939311640732632,2958714226869210,3774411384146786,191598411457504,3992945688581627,6230881572242407,6131691779643163,9106313778422761,4895698867184619,4294068497886562,7291819492885487,1140012540019696,1035348009397075,5803210749600756,4670831696962552,4257900630729721,8123509697168382,5221164721529855,2830811517908480,1172164637492226,4871056328320003,4430331254932484,3424706376942600,2115819507100504,7322925576389650,4765676198175763,2314307504759831,5886505977742360,909557781804548,7695949051159580,6035460513596455,1002190466327595,8316110361879604,3162205284303925,3809968830055478,4678660553863348,2715140864083002,3182324679992379,17551373616191,7132268710888512,5542898849719363,7328693529453638,9078229346763847,2471969595081801,5826009492259914,9132365090202699,9014271563277388,5234429116408909,5108976790643793,4189633671095822,1886679501595740,8686785194624095,1156936765056096,7094419813844070,652324546143338,2569081629764455,6752954868679789,8671955716333758,7062224376218745,3496300154555242,4449343608685694,4485906862390123,8587632077169796,6267289656534151,4706110060348553,6508832892249227,1500384124740750,8276861582435471,175896512464017,4512763559527572,3747058568012949,3398123071628439,7270256983434393,6571479611229343,6907437044057248,3769592583143344,1693082404291748,51298443256998,8550510119265448,4728552000332971,3406486889866418,8277556558095539,1995986330027191,7059993799656636,8659657583609024,7262014036550850,77910711329991,2587157541471436,8548858264888531,6410956210734303,4970771199730912,2657628209997025,8179864612635877,8679329479869672,2607549250757871,8583313711604976,7483188100228337,5962016065201394,2342397466617075,5875823132640500,612498938365174,324230192022775,3354456329798908,6747852412978431,4816650163512579,6997393881425157,2249465920644360,2206802331641388,7747901425624332,7107325412566288,3259397157512471,3341964779300120,608678462596380,5774736280085790,524550263956769,8320452755817762,2144295051339044,3780659210183975,5677957517164764,7380061455852844,1953999342060852,6023117795517750,6782376617551159,7387311707809084,8763922766160948,3293236782540096,2546086870418754,7252195414804023,3709841507632462,1668731490461007,5038763940545872,5987756404344145,6480735812289876,2562883673752919,2051033510438458,2517505051346271,1051896060691813,7468684804760934,1171002909830033,3904442915841386,1913472879708869,2750408660657524,1554384620856693,247026401478011,9087679400519040,8293206027224450,4289934097810823,7298749349184906,2796934217008523,4150969856927121,3433564635899284,8926606378878358,7760729728165271,5229504741713306,8918711840621986,391890777097640,1943034316989866,2923577133860267,2227481306654124,7889004868186354,1615805749241267,8445002148701621,8426435958556086,785842719842079,2370522626729401,6570859109336510,8180128669803967,2109338263586241,3375965378037189,6895490497021383,5118222967801288,1876207015413196,8694040690017741,5978101212931544,5175421243229775,7794364401796572,6695301922022877,4798505570624993,749169256974776,1012693995966716,907310714922475,7253633366222317,5846423235364337,2241011611182580,8372994542765557,4764367314893737,598274857897757,1648687757559290,6694977618002022,6095385139958016,8325086660239617,7866375711778317,8259532203304462,5604425601271311,4132399988794902,6707424487466522,6995725621601820,976819860882976,1138218115835429,7174852107896358,1277145842427434,7627623774447148,9223118495385181,6533315474228785,876228623607351,2696906355795514,8852576203826756,5212727640540744,4803330485364300,2475314713904717,3182112634136143,333578810836565,398701726680669,7929349078771294,1056399742412383,4904957393430113,5744717720528482,1917462362719845,5225705399453287,7716612187915885,5398645320607343,6009858873992816,2127019697219186,5279339470612089,4175742948443770,3158629316560507,102505731352189,1844865274898047,7084825750111874,167043047663236,3084853977048713,7035581127345803,5019550983284367,5000616578918036,3132925813753493,5528795322517142,4311554702672154,4703163501472709,4474401173651393,6606461111108186,2135096604875718,4494109223323307,1209073613719220,4237539074401976,4933073889617594,7656413098012959,5509066692568764,3807404653684416,7695029361133250,3481807649892036,9089085191472838,8485547671291596,4728324470884046,5701235894830803,6880273180763769,5365372356470488,7364359081713956,5535262954522235,5333287473071844,4121111078545127,8712435249152093,8893864147363567,4136554599835377,6061204575086325,760199217039095,6758977532749560,4584997588444931,4523320794685740,2723780123659223,5327896939939600,7245559411074837,9198290539502553,1858217593308953,861763781830808,3951148041963291,7737197085779742,7777725809903396,3791666338809637,8162162674861865,8837424549836423,2251884510464989,1831883332937520,5880176664774281,6290117943740219,6267931029091624,1967916335809068,861506284070722,8891253442758468,2458992410273605,6042509842663245,7689901963544398,2943776093321108,8344953922283345,5101381471946582,6138503405774680,5376315427923806,6134118650839686,7307199296628589,5560746404964207,8586276927833969,7970309105624946,822834791155571,1405577059608436,4382998701631350,8719382970615673,8732260374593855,6771221685192572,4923473416263317,4758366609581954,7114833387841411,4209896144758660,8216227390351237,4027091273770886,3217544566048649,3114442623444875,4270927373993869,8035612788213646,3517811915720599,5622037961426840,5775331168375108,2352976016156570,2976245038557084,7984135389022111,4661444297934752,148554695608225,4166793510987683,5606715795629990,623778310110194,6541199343695517,6398653369909576,5888716618704822,4165154245126075,7352562116380613,2366122170656712,3691655301359562,1917220597480439,3555009350805453,1074386720163790,4615902923122643,742449454393303,7221238490466267,8182461428179241,5714161394790736,8151325185288164,1801275206256617,4616502799477236,772304653207534,4141210681509872,378825751291891,3309153399130101,6572476717303798,3213988571539449,8744065506162346,3970807947683838,5854400033650347,690623632202753,6416467504922967,6133098333456397,8196437216307216,8405880525875218,7616506808324348,7506647272007704,3657162687556612,8422945844541103,7710606709803041,1027100588271656,4181281779263537,259088076671028,8462131047278645,1366139758544952,4586823680090463,3074702185506880,40135001466946,2172287414552644,8909732310045403,1709208928259084,4755616487254090,4553790569252939,3427966188243021,7039665049380947,4573413309990996,2494415491640334,1691442091018326,5018214250924126,7661250562885728,3816796472084155,349767623575653,4368193544776721,3156944276864018,587121975208051,4642336363096181,7719607665346679,6991461334364522,6843224483555455,5785367427631234,5942866442619014,7296085688592519,3554172356249736,3937964249420140,1954489883617421,5650733108758676,5615136964724887,7456519085926552,5714351036205212,714533868554397,8268762812580208,290069175568552,3738568221599915,3367062585985197,746472455915695,5968997109409970,8279833769011380,1571845198751926,1957701014063289,5051432539269306,2072399125399749,6480414174873798,8927947075315916,7917519337266143,171696315934934,7446006819547354,3029860654573792,5229881463572707,4025859161688292,2268996645005542,5431843803654378,3384681920227564,8124745803352303,4975547522894065,3734908231985394,4537776651978997,6294159053277434,8439847584426235,2616708825090300,5394532950534398,8445169186490623,1270621240174851,7949556095600901,1525562526492942,472429909944599,9132746182173073,3005208739989786,270873324267804,4578832966617374,3427723993909535,4351681771030816,7735252799121699,4936040132552997,1211839407822556,8795530547726637,6056199433070894,6246375846283571,159311917533494,2312878396041528,5417985527343417,6805822537238843,8386241549871420,4869013562108223,8419392984143584,9120110479075663,8036829034228052,8724133974849252,3950002242062682,386621431482715,2435995871201630,2589398439520608,5370976620489060,2033357991446887,2152655889025385,7489510163736939,9211057801100349,483348184811890,2408363197917556,8942444219240852,4650726365129083,1021792592595328,7947015422593409,7680496756181378,881208268630405,5662130762230153,7121871589837194,2916591282014603,1923519840848274,9202252780635886,2220943948307820,357097696307611,5009004006689308,3095274585087045,3697015043361184,8871498119137699,5783914855246244,2066381598165413,7220025238817193,198176128092587,2087057658268076,7922745855910140,1094962604173747,4974879756798388,281787080075701,8405523286193306,4810915518237111,6187809768630712,7660643565502879,5735395064302013,7142166602656190,5340323227027905,5942065384086603,3282079768381895,7537762956503496,2596002053130697,4719003487095243,8484877622602188,7501664645802449,4908425852193234,8975008361441751,190599583623642,6986109377038813,8710259763702239,1206109020850657,8076812926519782,2478204206131689,8517490940843428,8934248685185517,2399109144087028,5782781792037366,5117041546701304,4452597574728789,7942824813963784,2623747523193354,2833767936535060,7217428546751000,7439836754389529,5912602551437850,8426313691556379,5194539365141020,1293840135957021,4572260837272094,2773983446002210,5021704593009190,6391604629121578,8395130278021678,4215526892169777,7754364577516082,546390065056310,313805160671801,2772284167605343,2818908710349372,5549771844520511,6989024585214528,5550837495056963,7325513255430728,1204751753802167,970379093068365,8588972619104446,4913061698824785,5983223634987603,6421972862233173,4908725345386937,6407545686026840,468082959264345,4726764845140570,7357265337543260,6082723240413795,7254842316319332,3256898306976357,6404438765513322,4043655672769131,682622198819436,5119567509555823,8470058638469745,5144875337206388,2488857113487989,7685377066969718,8805719932889721,4328787862760058,5631906963008124,5523040514984573,8323243820731007,1786106073311873,956958540040835,7046263851764358,8292647137397384,5630437433838225,819228047714963,9006213841505390,1753308552137375,5004535343352480,5769665019062947,6268954209479333,2827861308312231,6545724660796074,5723311075347116,5981944925907629,1537020432648880,8725800200456881,5397498067905209,3491525351451326,9204064322864965,5426426969901761,7976546815879877,1950257317448391,4777231968717514,5207468986378955,1874542107503308,1285480463289037,4942284316191441,8610160831974098,7602789181628878,23555715885782,3923851352328919,4448745313818404,2885435925236443,1004403388656351,7925085763300068,7336486854462182,5426883999288039,7641508116359913,2017863976585964,2986301274485202,4085094571961077,6982012547558134,6290564952099575,6331496692656889,7422031609059705,6834292678634241,8676341257128707,2559951211121412,1306937454668551,1378241694567182,4844344744913690,1347659037780763,4746402769931397,2023409032137504,6984789661944611,3243666353441572,2805197600615205,2217824728075048,6057766533247452,7018641336748842,2526240495254663,6584841380211501,1278839460809518,7618392932141871,7473210472082224,3744681283873588,6691631711775541,3608650679937847,3858229711407928,3385759904131899,3324783922465598,470333684362051,1947362805623621,5187375448574791,3829536338807628,6336152938842963,207114001673048,5689850328001370,1929741658729314,1350584707787619,3387950719650663,7643703300975466,8348394730450875,5192118225382254,1669903458003823,9157142940314481,4652880439531383,7171691819395958,5452767111498616,6082291677947974,6382701539852778,3461738536258430,3933762238540672,3641062808497026,8065217190085064,1709558837767045,9026192641616774,5547319169652545,8790794176916631,274792493025090,6245168367201167,6833986613242769,6484820882770838,7485615743339416,6154036893141919,1833417472609184,2516513634028452,3703190419827622,8315031461396977,1161781685103529,7551743307844527,2391614908888951,2269985197005983,7302732293254078,1653536633998271,1518556890623136,4583489982030326,5391085785500616,269557356063693,3380426655255503,3510002526563280,1058355358276771,4497569962052564,1733894802409294,6637431292005335,5412811201063896,638821914299356,8138960554642397,8932915527732192,2502397184612176,2224917765082082,4664038408080363,6370714189728750,4052179076041713,7981934680624115,190279090039797,8425155291761656,1708154517788500,1862613280883199,4260932176202748,7802019207343106,7136366336519339,5691257654103044,694366846684166,6982049195887623,4610348469972140,2868199030500362,7778505994521611,7145452691901452,3542325868530701,5313636444859406,2597745694426968,5058667766615059,2765356004920344,7192890840165403,4625536036531231,7368934697151520,700059310672934,9149955693775915,1951801563728943,5950527330869599,6910292243573939,3193808567004217,7928726925117917,4546673823771707,2367014159726613,4230534457396287,4922802361003079,3305961102863438,3132682207292497,3455946454821970,2215280247524439,4406349697952856,7747383978789978,8805767887449179,6476371168455773,2388427212098654,6688461578349663,116289689660513,5873398543133794,7569060977110121,4165001901288554,8486090814467180,5324358032551022,6053610728696946,7409718335048819,8267681113672820,6425500222246007,2341001259207800,4524912841100479,377510398200963,7329623042501765,7175986637786248,875134964763787,8889762527702156,4496429783542932,105265929440405,5384659971673238,5682351946484887,481883942840175,1260309167729824,6168335431371938,3020314390764917,7922138867600555,7958635627392172,1598805435575473,4697969527860403,8077700732685503,7627974237867202,5572853476764868,1001921970146503,3047840294672247,5551596145208530,3827295790337235,2747225172085976,8181072562001786,901931471834337,3791747377302766,6781179540163824,4062523304463602,6608254712237299,2809260436606201,6442476629616109,7268794764750076,7626651674324221,5222580097109250,8557551783120136,5652897946529033,6216094863617291,6413744492081165,6568326263744387,3810328094993686,1214549316562201,7950659746327834,6435137973929861,6909954439336496,6002518857215269,1956939094953262,3148897366994230,3844780248437300,2109825994698043,357076974931262,3965288345267519,7783436286160192,7369614243540291,8949696555437386,4126783858257228,4954506615336270,4581979074080080,2729750267833681,6420081045149121,436440873577812,8510668751457623,8031406990306653,6087468610956638,4769816767098207,252861414296929,4929961495629154,4274823311166822,2375072351792490,7094250651766126,2861402905415023,4192581360332145,7105582433646484,6373238951857531,6178443105488255,4139834785718600,5740758977031556,6921739629677957,4435463934004614,6091645937185345,5333201194077577,2782490558721418,8677984716836238,3365541559217554,2132734055665043,5402893284117908,3113226145811862,7708207138613145,6672989957410201,27362219888026,5016591687962014,9005565350800801,2058786262142372,4593429204483313,8406285518876081,3461011284749746,2289534317079988,6947510681365941,769954764926391,1561347891957177,1565506340163002,7011604556329546,2435191429074368,3670928756870593,7674151613951427,5342238240909217,5749942729657806,2254856356195795,2055835598859733,6683574890925532,922005921377760,2743220549660135,3544375496805865,924694737817066,5248656855829997,8300249861066236,3173424444231167,3225178300018176,8649348406275586,8659205105741316,2120418862012154,2814788311379466,8854351558372610,7733252321283603,5043345090874901,1352371759672857,4820800956558874,7746018193678938,5896561533201953,673908089802275,3942606670972849,2953543609151018,8971377746628141,3412193769311791,8790139427952277,1632545932299825,9168096297381430,492909452725815,4101024717622840,169624182697529,2100350594100799,7124479225921311,7270687386734146,2985173944610375,2524786641473097,924337930096207,6817438024151651,971475441995351,6822100204277336,3348809923047007,1526039318580833,813707845928891,6543550232460548,6564680067411559,53825696345704,9142606822982247,7823074499849842,7856027163315829,8272734013451896,2201189900979833,8595028790210172,4079078097235584,2833087346273922,3544965026508429,8471416538238614,7581180148436635,9008409451359902,1350281300930207,7635830782829168,8662299423280802,5054654202682792,7495193030954660,3761600094219947,4221618855090431,5723360613174961,1184469739507378,4963030464041587,4277335625461429,6931880560750517,1438819105992382,5824178611957440,8838840152329922,5204018368753349,2031192927792843,6848926219890382,3688537180270287,8151673896275664,2054710580080339,8932240705804459,6349307440250205,8506062973629049,4835385556209368,6294279373254361,8843712291188450,5450391152627428,4551215811366631,2549594476769003,2498401103564525,4192794161777106,1646305274637223,7979780218957566,3715024365014783,7143190133141251,3490271597518843,6712009357664898,72656062656272,2440967105688895,245157799366419,7121847652167444,5593545597857557,9054282374667368,3894385258729243,8200159383064348,1969367771650010,5786714652692255,7822350133554977,8547389958967076,8373835249831717,1002750953623334,7371963542662951,7886030753738537,7640961431793450,2535876467420972,241518479363894,4111711852744504,293594257952573,3347159629025088,6393962549382978,6724375905699695,8993411905553036,8519953483517770,8583974846336850,4225686076387155,2187887423180628,1526388199669049,6019388182359896,2428235422771172,2016164553764703,5368348382295822,6241052815601507,621014487617382,3512032577594001,3304166496816853,7423169727770483,7444257571000180,275037120221046,5923439901028217,2052003813551995,1025212805705596,3509864058867581,5417276690014869,6415697815498625,8411982046670723,2403884218355596,6036467608063887,3112190251462546,4726650901227502,7724897940688790,1285226976702363,7646609744973725,2177527681517552,5054369835044772,6543243339476903,6405314730487721,2605011208343467,32603191963564,1093529392287663,4882316627972018,5335523765858227,2375382411513780,6586311591924382,2681841310609335,8774051203846072,8871264898674617,8091840416174010,8472127821312671,4364710580399434,5027736341551093,376057577697219,6483571136966597,1104080838638807,3693763861548999,1177183468310475,892684572200909,5138344280182735,3308465573850446,7081922194272214,8247927936389079,3234906712772568,4020199739027417,7783357175270736,3260719496343522,3405103093370854,25771393241063,5195899241148398,5647137858793460,8782668410220533,3008131021697016,3151917161098580,5314744005980154,9017151640285181,1073757075132416,337396029616132,1370484209987595,9146733986738188,1528444436721677,4694241603280216,2657920817778708,8091267809079323,5478482300284956,3269648229920800,63017134968870,1764838771920937,9049022559096876,1874239187120175,4187579349364784,7909662547087412,3262376948747614,7249876427247675,1165329981141053,1303380529786948,3338013074967905,2182398795403341,7617224437416632,6749844396871765,1338426797289558,2128219652771929,6077663536853082,2368906433310811,5394219840704607,1949272156942432,4532998204641377,8920527252377698,6147782503108707,6363223884542052,1390675320180837,7846455472345190,5723838671777895,7501741814739049,3923093987138919,923547613745274,6721778213326971,3468478413435006,6958783073384469,3909360239325312,2098982571856576,229192511254658,5967571945766252,2569804992065676,6593782365859983,3238514465894546,4479098013347991,8110756269551769,5734108983005338,4577706923735066,355068611980657,3948758422548656,3370100951126196,6358535365272265,2513321267851452,1506544743870655,54267487195332,3920674891829445,4551746334601414,5705596755349709,320800131693944,1958335824154835,1226848664686811,6071655422456028,200757532242146,7426313509187811,4466484413501668,2158501526794469,4285889479766250,7303145929355499,956777688150257,3281571388109042,898796590584532,4685739954195839,6840341648085244,772022488682750,4746016443060480,7915640336060678,106776035873039,7475233032843542,8098712991035756,2996113024528670,3854343283052831,7984362957312291,5043297164816679,8454552488218924,7786927314188338,1983503147569462,5498454157423152,5386975842144570,1752908108796220,7765584890341429,3346776127533380,2791711361773895,9040259016362470,6920749447696714,6840677897515341,6280700631560527,5357647940497744,4567546034963171,8775685911277911,1853196278886744,3643628911563101,6717894818345313,6903200412788795,3296962647322980,5760795239805290,609934825034092,1981067029344623,6017310024020336,3512898337591665,6364201369596275,5930833310617972,7237325245337973,8054862788604280,7475092350742905,5634897811501434,5803893689332093,2432349329428862,3822882072310145,4905932281966984,740607477961099,1936255444455825,662293556334996,6227358377586073,6803710638264728,7670831243653529,7606562266386842,5168331105685918,5598583034696096,4313903103881637,2063008413757867,3951993819025843,6046018190438837,6251498761466295,3760926935470523,633612319568320,3029341628273089,6504600138650052,739730488963525,1586830628155846,5164107154379208,923446557520329,6103640832397770,4158643801731532,2602896093442509,33355113951698,2029010057673557,7089005307711959,1415164117193179,4044594957775324,1327269823386077,1762630490657248,2855125351690727,3195488200716776,418367352246763,8814854711972332,6694779096151247,1316262047470064,7281161084531185,3287276111505491,6497007459127797,2064909134066172,7115565510267391,3641581373166083,4138952658170373,3706241000403472,3836834437558808,5054421719249433,6089688536683034,2521002441265700,8196924189913638,6134251212337707,4661750933574192,1882484501008945,1416727865545266,1125038647685684,5061816688071222,2965832364118588,877463201362698,9182545715384894,3230869729714732,3579134126674497,3579826204570180,104956482810437,6951728823145031,2316787462754888,1820959062880842,2472140177142350,7232934290060045,3334521995297550,2756071361360475,6798941970354787,6486115054342759,568000522973802,746921786421867,717184002945645,2793097290789490,4553428221923955,8073178195030644,6141598417310328,7049445218833017,5352271227420095,3678391577621121,6232967090696835,1724031441810059,4783788878858123,518593397944982,1792071081980571,3176686928818846,2215385946845855,9042985953004020,8331699153711781,75069432902313,111250015466157,6251521348096688,6528647032779444,3763145072980668,7775585762742974,5788626177394805,8882223087596224,8340146385933088,4039196619215554,702823900590788,6682597705495239,5560778908603081,2209227890905803,285411947115217,6202748544676564,239945629602519,3765783960883930,7373328206410459,4964056350806748,3711510044373730,3992764934730471,7604050999448300,7977555933352688,149390783820530,1787259017597685,5069302333174521,8525553255043837,6309456752497408,6242013984625409,7974398139912969,3429852718600970,4477098239914763,3655348890841869,3551046760035117,3312750158140177,7754409884422930,8663807444742934,6618163993244445,6320444637377312,2069696959583009,8722933495968554,1789900134822701,9150178791237768,3777954798801716,4845256832766776,2904670804484916,6221238639424316,798868643812160,7302752899863368,7456846622528333,3285863149081422,2741660511556431,1541037172577104,1419703420392281,5902878662718300,2493777281889121,1374833818530662,3640921402798955,9165150150047383,4710684819043182,2476206116754290,5250346004804468,249343933607083,1589935211180918,5915206698595191,3753675332473720,9096998713694357,8033248447320961,981336760890243,6886829094818693,7252939129262988,3715399430058895,1995644919788432,6754969415480209,7559991823487892,1866877044741014,3764174567576474,98055163335582,1193194748379973,5472728336085921,1062265454900130,2493587897258919,2524334410544041,2654315936224170,2685377166349227,6430263639840926,3840123825705920,4918060478186315,559336936231878,2882933581583305,7217687799256012,5939516504077263,8294501393942780,9221187093427159,2856215005730980,8123516906542043,102565214680028,9076818340918242,7058671308764133,2606343929152764,7465025655098876,8071133620720621,4682269492392951,8649394277585912,2909449267180539,1501840430117884,6378674551886846,5594499785696085,9058835486569475,143345725674503,2935382216684553,9136688507909132,3953063107825154,3233217934193683,6463112871925935,1171980783285280,3067442679313441,7668647640888355,2114613282968616,3898855284159541,8732822431732790,5345587754044,3567568958665792,8810737386038112,5354733807924299,1807919049290829,6714171095823444,2885684181587029,4135324637967446,2513275657722041,8504418124477528,1570668393428058,2920066062038110,4656754749973349,1515481216234594,3453716837938022,4384444165534822,1417152008445458,4269724246881393,3391858706936950,3748471822677112,4188255520863355,8646895613981820,1153526756527497,3322417381274756,4961473957147782,1974598399054984,7791564038861968,1312981719396037,8373324529021636,1233203795965079,6142411939673242,3472461633787037,2651809316853810,3151103808181412,1594708228551845,71889932481702,7330181486482605,7513685569442993,8714570880644275,7989757861196980,2937407604864182,195539820147899,6623373924644029,278740376483011,8794292999173316,8198047787697014,8534658835680801,4353201186133199,2206896186809891,8364770154452180,2581034133583066,7059564896941279,1372323191428327,2751890801645518,531992828663018,3452169951694375,5510891111339247,5547926800643312,2194026537071857,4856702291195128,4343694220170491,6057434412714033,5522511505913085,7728415271490819,2114111736337670,7350518350345482,3579385405969678,341008182162706,6268452584076569,6299110844259887,2520217370555684,4494474321814406,3151615756252456,4198112666613033,1710580230436138,8550617951311148,2538038350386480,1113350138803505,6031427847992626,3517727528637750,7561407903356217,5005989433111868,4482911242683274,4776754467501375,2325350755879136,732780580443461,6886851722761100,8968468988253516,6821379578000721,7450634403829075,4100933971711323,2923707812386141,9160263416373200,2909476481185125,8794616942453649,6103095659902312,4072628948342122,4390468767561071,2198394350572915,9198330007516532,3932987724551543,8740314210710904,1136441185432963,7991087747544458,1248171481961867,2633509876997698,4998564553872782,641497577649551,2254104781395345,3514751407928722,1437404333118871,1323683905492377,3963252660082076,1020487038711202,1719461470643099,3633897363477924,4463444224929401,8495035540960680,6016527992034729,7596734866439751,2862025196574124,806065740141997,8876703278388657,4103871071876530,1351283444356536,2854308058944956,257814287504831,3542568308544960,5948496119125441,4585567380870595,5442223378945476,8557913976427973,24997698352584,6572195292820938,9148948744115669,6283479070741976,8698332590274010,6281497035855328,1213973224068578,751349278225892,1009557435291109,2284608054539751,113769038976489,4987596047791595,4870222823667181,2961425221989873,5456282387240438,112288126498296,2697621990856187,5851095604147710,6089652439225856,5138977312765444,18527544120842,7260653943633419,312258088334861,2365414048390744,4969201455027730,185135589226004,3808516667364885,7529438714615318,650399733249559,8477884285614509,4256472345023807,849299192264220,5483272129254941,5069989781222943,7923291333080608,3661328151696932,6091551223592494,6904263360566832,5720391017313842,1072351958742583,6371200743200319,112565798999620,5546537427220037,5980965779543623,3133576049751625,4363046466308744,1532231731304012,8494530443286103,2212822234758756,3046942532736602,1712021931808355,2811749323396711,448223986562665,940920938149482,788699946358381,3237005651498609,3863911068636789,5685593768310393,616882705096529,3101732378482309,1044693020825223,7646580068996746,4639717892154306,4486813295335059,8024652806198933,8135003317843606,7095756527081111,5754686370494109,5265123120101022,3696808032433823,8951164523607715,4192146299426469,273169705301671,3360793887233705,7229128039700138,1950351940048555,3744877234597490,1465483891283631,1668867092387505,3658380591429298,7878723653932724,7505548277348022,3141363853260471,4445653405824699,4015043301177020,4413295314859713,2868657437681302,777079255471824,3703694776023,5242697689642713,1443986292471515,8234328640607964,6664010515355359,3395256208930528,2723127493261026,4867127090386660,5276790254786279,347197665990378,2927923311056621,2626231062845166,6751401486718704,4265012663107047,4019129042671349,5910987841361654,367745128085240,3159271588902650,7542096303740669,5565350668760832,4442569168074503,1156519831795465,1053649852479242,5143254703216396,268359922841358,7904539759793941,8655614835185430,4665359213123355,4910385864103709,1233591354898210,8715180780574500,6596985881040677,6934013651703590,1052289371649832,6598240466007851,4274270668896048,4637319826560818,7243207238129462,418142356576564,978850611402558,3211021148488672,1336791348942658,1907536247032118,6839546289682250,6442802221397837,8207544012289872,2871273779153208,311935564800556,8046903434229589,6506436218615639,889716034582361,4004088876922718,4214333815701925,5617553253758826,2026236631086964,3394733054252918,5598442556102519,2273838361048952,4481182332098426,7531348323445055,5418779628058492,4208729280354175,3671439528499520,6185492340510358,7538004910208903,1659848504113041,8730098826024850,4160126022031252,8143701867665301,2137309594802075,7085671967952539,8482553776723882,8452554968545197,5794939160967088,3532119970224050,1420415050020789,8104617108215736,8632367232677308,7099137001969602,2263586660612036,1285144604825541,2262168460414625,2025746269927368,5978794435033034,1156577842927566,7431652391409616,7539256865675222,9201102619219927,8127598629312474,2392936587491291,7514710390989046,1941848674514915,1830268693993444,6482774423107560,8884338078849004,6751881844570093,8827803687770094,5983240135415793,9170083329751026,1262212902098933,1113547510077440,2959250607480491,2104519934924809,5707762488350730,5572566756811778,2738453673972739,2641068255975445,2039697840715802,7685344253958174,8706243286947872,5101683099736098,1158716490930212,4669780111865897,4561601483175980,2167242595203119,4941779457685554,2570304484972595,8911890218514485,3081894958282806,4795426756147258,7445570533627963,1076579573766205,2774956265109566,7506658358073407,8938620010911809,6041958250575939,8039903998695492,1422646266615883,4516368021698637,4756206974506970,642572636960849,1625388712794197,2469283444599140,2511751773952091,7986810274920541,406558773073729,6592237653317740,4490937060186221,2707154566713022,7283943628126328,4653852890331257,2428502945921146,3857000952405695,6616110992083307,5453101510752391,3687598771689608,3469118840043658,6364092936832023,3889415131871372,7935729833474190,3634597400467599,2723446825937667,6091619280590997,8519892691163288,7200669157685402,5487175665236125,7378306770819230,8802100285823135,4109559446648992,6228409984407714,2509715549919396,8720147859560615,5260622941534376,3717724958857386,131359518570667,8301344556431535,6166747151939761,27141746342066,1765399490975923,5442997139765430,1667965263247545,6142577941764813,1024116778875076,8808750699026631,4286209765112011,3332031864527052,918834079791315,8417900494846165,3636429086234839,7777935864305880,3888349480073435,5591261034281181,5995058603178206,2302143995115746,2709854642839249,9012936261589228,6291118634244334,2729012306712815,4528338812834856,4212108572342521,7454634398513404,2540081242224894,484076341778687,1848614151469314,7647411007617283,2805513475496196,7687155926907142,7358445198547209,263511612897560,8168079143819653,3998279071529250,4300140535437606,956794137753897,5883171429841194,1817302344161584,3697871907363122,7958237890115892,3124544497793334,4781661328942132,1999653908166971,7431919924779326,7392626678856000,1022825183910212,5331438226405702,6047907013613903,3102736794392912,4338663515134290,1981154059288291,8476083316963670,5861321244440919,5832840342272345,8644919563745805,7445697565000762,829780933409130,5476843305777528,2521410044033401,4483687460215168,5271087950494085,2495673317636489,8714981293881738,3974902811720075,5940203619654028,6311380195694991,6651201905129873,7122424513468821,6511931844303254,4414231401725679,90466295445917,4886868911864222,5410299663605749,1468435389131163,5426707122600356,4551856378886566,9197956372912551,220404521261480,1203355550243244,585844926888365,6408366099364270,6838508322437553,399955652229534,4603016361605558,2292604692341833,5924556079905210,5448333877590463,6889719627880899,7366436478212551,5445580157196750,3994372702534107,3066520441915813,7793252700781024,7679109584230881,7669699350084066,4664960338958822,3790555233065450,6536875056044527,2122276175174129,1740395278342643,4651069572233717,7439773260511734,2752423935891959,6717357464484346,3688960327768571,4791886401550845,8617779800635902,7832780204751361,6835792989035010,8695347109493251,5506034138503685,2949484647451052,3301669530810893,5170477133153893,5694496806640046,7168742817012246,1855176227306009,377160756419098,1337823682935323,3167718230972956,2290713827170847,815093038111264,1969003266570787,4206599056973574,7091845478439465,2994454008158770,4112215828220339,8348967741192757,3172226460506678,442379340315192,1735998386338362,3955606250837087,1399138228058685,2407186399323232,9037916445556738,76535402502726,8530075959912888,4647502112306274,5910871919376974,5223914490829391,7593967918787000,6088118995540562,4368264860752467,1887627906882134,8442323623131737,5097923645594204,4563477645695586,2917966323538534,1327617093048938,7962449713306220,7266068570217069,2213129570848532,3170370480028284,252863754782006,3713280205748872,7544321577704074,2646300381403787,5943804311894669,569808323885710,7834245858351555,5479900336921243,4279237597338269,1161495065754275,4483026856942244,92718753643175,3932786086263464,3835549956411164,7361861297192733,6098876790831795,7109476990114490,668015719307963,4552055457790656,9102477959568065,268748182387402,1850941908679371,4916393700293324,3580903455144653,7761554913336234,8005200134666970,6853818491443933,6765387127028450,8887486014659299,3148514413817638,5250521463216870,4279881745844689,7344905684425450,4984850771041004,8429228251806445,6943981820680942,6897455443221232,7161289865100019,5396793497098998,2616091809828649,3202400544324347,5010252471820074,7263682308089939,2644740716631333,2410197458295558,6294373965183751,3224023476960008,6951647377689047,4654119389281036,8625386877098765,5690144975050629,5904640643619601,4504734637316882,4054825354459926,7915470645951260,3677744119175966,4869853174897440,1672690280184610,1614004530920232,7130606621063980,4990934060489517,3156480916105693,2973186577349424,7707589327869064,1703437916199732,3715464516467511,1955338981628383,7228366762040125,7912365981145922,7938505541344069,2332595734174534,2557471253289799,6969224908585800,6443784898034505,5196902031227723,4097782020987724,3862179124214605,7592843571452753,7610846748320910,3874849752767318,7305521157520216,8850295154768729,7293683406904162,4339841998240612,5382521049324389,7310376553528171,6838513652210540,6398465238080365,3960985728187248,7097091652696946,8674514921962359,3320900876696445,3032025711852414,3676005960022917,3735719011408786,4270892819553179,8548911320652701,8244853440076704,1934678717528993,1933040317668259,3533346461072296,2437548500827049,8563051323956138,5329499696528308,7501546713299896,6673075227376569,9078859797314490,7101997526506427,3223034165546826,2458019191831029,6670316638313408,1093706599324609,8676858659765187,8006215754709958,100178539101135,3005312060169169,4537551142681556,7520651489393624,278519986812068,4471565907508186,5973120922098652,3496543980542943,2291131537136610,4026157818993147,2054121759032486,2350095992175591,6117974944136169,6909413559933930,8776679386799087,2331036032591016,8688414473272306,2281558473473012,7412837595126774,6348053234957303,2830259086277627,9054867349584892,3131734316784638,4762751895985153,4035769082387461,2245893536341001,8014596945296394,5177795095801687,3875855472385039,9071633823952728,5071865775455250,3326614806453267,8794310088809494,3067617749310490,8407583826000924,4894759928995674,7223953172495394,5351690995211302,1355565657226279,2915178544995369,7285601081433131,7910855219076144,4670046822136882,5903758834940981,7317037294844983,3694629211962424,1632042571373627,380669326629949,7425948651289662,8679736572304451,4882325880806469,2618291197369414,5364884025867336,6742509007600715,4650047259597900,4226025292930125,8333886829919311,636729285540945,8888318446984276,3959220638104661,4728085340953686,3933430968146447,1428791016283229,7170971931843680,4773995158363233,4455923178929251,1154625347894374,7381503273319528,5288382662827114,8674328407850091,5527276576259182,7171213599159485,7584569400147060,7947639378574454,8955759719473001,2346698706320505,4438518309526653,2423211172870677,6033477696003203,5237456350821511,6820507053972618,4018724785429646,7323385419660435,4039708618955924,5420519881276565,4011465562278425,4772316598254744,390926245878939,4569580551293466,7315743139347615,3578996623416481,5779594307760308,8245287469210789,2564931009789095,6258783638895785,2624878766120106,7087420823153181,5951537149328562,6164115505409907,8688632851627192,7197362048159604,581975715634328,6117684355693757,5274495159024834,90754929048773,532224739114182,2091321387752649,248202950098135,5909444756462808,8898041383738587,2940092630809820,6858062779555707,7409653968190693,7917771061107945,3260711832345837,7465235511844081,6946423621487146,1761374391450879,1041944326585600,5413068254633220,2073715707596673,2259632172825864,5739030585818378,6581963536019371,7510868637162769,1710027843350456,2370192225385749,5619665844670878,6193677916929305,5243256295096602,7545041443454243,1808464570083889,6719064569552170,7323538908970284,1271152529340978,3456378584522031,7394559187953561,5242396316088883,6168158116535609,2746740739822815,7282706113200010,195908969986613,2616447217909057,1345552894532943,8509392281324262,6939178355866962,3628811576442195,6375221759576633,6750112766491992,5643764392172893,5573572253900134,8487042812984679,8300669204332624,7178382123982185,5242769956470122,3743961606118764,6450686656314741,5088556791717240,1502483749131498,5186697947970948,1930759754111553,5918351178710411,469119490768269,5616456994585998,9065139632741776,8625407358164370,448962290097556,3073611520703893,993024786300312,8379742054915481,7807464250039709,4514245792812955,4867381152996773,1397245118305521,4005664091823528,5581874784452012,1025475811135389,1250420615792499,8992257804410303,5051031092256192,6970771112091077,8190096274275782,4326387855506888,6108826269531599,4999562061905366,6269258288094679,5838923403099623,8353241065684457,2061913944260074,6635311873605101,3441475510943216,4499667272269301,5615689609387511,9084202317463036,4364323455303165,1401111668989440,1205148966280707,8311019152317956,2409861074473399,5486519803952658,5648553106906646,768617718185904,8388466622357027,8416499520380454,8079967605040719,6481777437923932,65617729843018,2896849837071917,3069588084448814,393907298139695,2763798479519293,4664309204082239,2211096632368775,6063316204944962,806540983549507,219127232708164,2750369727553093,8568508094717510,6652035869015623,7171396542324301,1124632343461454,3265854206172751,6226583599488952,5483969637555796,8109200655040088,8496592722004580,4810411704371813,5729895524392544,4431596131499618,2779551068544955,8839471949512292,2392544648101477,2122484177682025,1735392745832045,7928561941044846,7543300918315436,244134414032510,3254156206685824,8188669259415170,1031418968211075,2983947831910337,8562292831641226,5694163690438290,1056815373995971,3987702310780566,8237707056594585,1699078812835482,5992708612483695,1328441656852124,3037301542633117,8227906039488158,3417344214880197,2731948431343265,8206673693474466,5658908378594987,3203298087861934,6503573632024239,3421829275385521,7206166905503411,8851811738050228,5333487387721398,5091866321682103,1214229549227707,1802457946327669,748493633127713,5639932700145093,1853315620847307,3101997301587662,9014023793106641,4227138625642446,2802885629650446,5195683384221407,1130056091934672,2830165140481448,8917186760867558,4374531858158,2027378035780221,7053276770107121,2508983603584979,7747804385140471,3075220407582460,6981729297519914,2203909323521797,6721297124794118,1732130588516103,2406418852781832,2431147396931338,1872575906889485,3683461550546707,3156079150759700,2158963069681431,6347070686084891,7062710668107549,4753827992887070,6608093928636191,4724731890605856,4719429313871649,8456953390800682,6419121075288712,6242121013485364,4121067860008758,6823609602121527,54928807149369,2133746750881594,7399478461767483,8976303730622268,2777956427972420,116589162149174,517330267815754,1320911465824075,5506106076471117,7308569498722126,6817611207663441,5533242089897810,7755102393884502,5939766083862126,494826214448988,8717884886900573,5725732533993314,4162564648951652,4532618279395175,36460262049084,3556170538121875,8194476540993400,5855779389325177,1930505532183871,4189143409770368,3577303382597507,5399031890362244,1073290951532423,7523497609699210,4011387404033931,558735877332876,7074722524225421,5963590795353999,1255742993842066,4222482100625301,5256658960261015,7865022085201816,5185292997025691,2474177960075165,2948535438196643,7778635003461543,3067907804815275,4606987865481132,1756687539404719,2203602782592944,6898433679531955,6122783274049461,4224430592808265,6913993190481848,3396327423037428,3164525091077613,8501902506724551,3917053492559807,1980568214822849,2746684881174468,1057325894737863,5578012417638346,416778665820110,1423739714641872,2025586042383011,2153136934395861,3076244208144327,5282269621559255,8301207175020504,4799691354193883,2764657354948603,5515833410822118,8549586904743920,6167372250939378,8950452669456373,5364423909433339,9063700865359868,1812744655888381,611156861902846,8540540802686975],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/85ac23fb1585cbe148318b4947a702b7",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001180545.1/GCA_001180545.1_P7_London_17_VIM_2_06_09_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CVXP01000001.1 Pseudomonas aeruginosa genome assembly P7_London_17_VIM_2_06_09, contig P7_London_17_VIM_2_06_09_CONTIG1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"85ac23fb1585cbe148318b4947a702b7\",\"mins\":[1825648980148224,2242875306508290,3447194786553859,1341059202809862,7730391996751883,5982935351779340,8307038279450626,8339764044176045,3778695907909648,8686731819999249,8049255821115410,5675642116325398,4707508246839320,5732729845055513,3981791856091165,5982357417443359,692050547335200,9149531896266786,4851085510025253,295956355178535,5568173203071019,7767473861999282,4738128340140078,272357204590640,581138295488562,6346294272499763,5522652506992649,5653747224885940,5461770361495613,3125038653521982,3466706848956479,6117705741090880,3393461148163578,8609705022554178,8372113748394051,7031111501029445,1708900610834503,335152522969161,5858417270046794,8421648900948044,152461611925582,4507216513810512,5461362154872917,445764562059351,4195156250796124,7507244859457631,1292057396764768,8335225580183568,8738838463688933,3582094885978213,7240419952304231,2716528174121066,7826302066413586,4977560401076337,5987983297273971,2255912029675639,637725561069693,7742343059169408,1783166304212331,8277965979620894,4960453765070986,4162116280017037,870684408455310,8724388857300397,4887172988952600,1780773663989907,325785438532974,7670499108433945,8708081261904024,8647656031156932,1584430685126815,3379363041263776,7330579976134819,2058418906267813,1727912374419622,8590990476263591,2696321150820522,4778283574558749,5533047061520560,7241782625280182,4800599959240890,7133990131736607,6549768251449532,9157911550763197,4944011556847806,5811326081348981,6255227318501568,980761336053954,2249355887780035,3005449996525765,1583177986564294,1812578367029448,9189182673696932,2706305621852365,3726539573731535,7806551105429713,8413439499185079,807009928451449,8592053240834767,1989705972433119,8499485706003835,530049830420714,2421320073052199,4141142043164909,1815666573754608,7890493133652209,6169169452876019,4817048900788473,5642898925969659,5873991309517053,273394857230592,4197209708118273,5960914941210667,4703323368497415,2070647225172235,2296029916233996,2533600211230991,8437883122042938,7144646073172244,2609918354374935,8488090624377116,5043199974801456,2670236492824866,3303930568220969,3614588092325938,3152437228470581,1061908461019446,1875635783140745,758836948943165,968802884829502,4042003609350909,446373638218052,9221304002658630,6821676494987591,1243312057983305,4763323462443339,7409758545720717,2045226299531604,8236459778606478,3214521610428758,175705287735531,7325932532474491,8311487957256932,660734179279196,6994586431316318,1108104819720544,1664197454422370,7970546297545059,895332462715239,1756132578550122,8029926179529068,5513447266443629,8460694935461949,7589989133478418,60697040355700,6429091812335990,2255302134784379,7919298333081980,5546508894552446,5601666975752575,1260870695289216,1291109736677761,2681265936982403,6585487681757573,4518854675259782,669196826050952,7336948876660523,2676523746071959,5624148591092113,7033561292669331,7455209331966364,4699202875449757,4471291618508869,3165758903802608,2776872995594658,8584579235545507,3571134258150129,8022862563762600,4099279638340009,1263841826972074,5423624015847852,8797318172541360,187812751753649,6810430454456754,2770227102540211,3419500886114745,1011452024398266,5146751103350175,967880405524924,4423288408657994,412115780428223,4070916419715523,8732447265956292,2194933038653896,4610691766460883,7575014179217486,6271058919211478,3466905053887225,5561251237883983,5722025083314659,8548282705428965,2851241135669736,5886474745299435,4762846919614958,7153662514618864,3201737096978930,3582402698928628,343961015542263,9178557679845883,3669292656198140,3922592968032766,8630948905796096,8081252838261253,9213521775156410,1313275117666829,1409409868022287,684259923157520,7494457439391832,2184443154514452,7474892771923374,1689000284627479,2347247535882776,1486616169495300,3562039006528029,2545219659432479,3505901892838832,4079759344656937,4125272178450986,979316247904814,4431559944143407,582400086893105,5066124605845598,2031245685187127,8765338575127096,7438839079501570,2532448444138043,2383741723320895,3122300085715040,6652297482707522,166104364425797,7875375041192518,2037397494948424,6208735047716470,8656137116787278,1173881909363280,2371553995122714,6428685828858451,3735949564920404,5477662529561174,18650490225240,7771890646567695,779206551806557,3791776890495584,4639199783723617,944108388680293,8253391879848552,4960997388616297,494722871911019,5748590688305777,1546013737648755,2518876397838965,1850824917049976,3705154907144826,3398157430465147,905930312598140,1778988980413053,6233948556477054,9204529580927765,8976826211549824,58538094731038,7637165806215368,8040494651400838,4659440085140104,7851871946654345,7587119897150090,3441651795223181,1070773832499856,803979742315155,7958111668404248,1452317551172377,4675223172006555,9071399904084636,7231428411736734,7903058862858912,3882629053894768,7780873358992037,6835955587687078,7521089406042225,2408780095890088,459826256618153,8217087918224839,3675052909601452,8947814064643377,1448572499092143,1382596604527281,1498810562708148,6334818111521461,6283390489502392,8599969595753151,7092940405277376,4739668043684640,3930112922092226,5474232144462531,1357990135349957,8932513620460233,255429886452426,6152567895965815,375527135126221,796598326371022,3613324903425485,1016430956470993,6983120939557587,3386576172122837,912196485087958,5609817655689951,3745008015139554,662145299776227,780184025277156,2575989633671911,7258847561466604,747384259199725,8658920927414174,8861447239076648,7391481408758514,5802979297067763,4271363780494076,7206582549963518,3094186713720277,4858546652291847,3527115957142280,4936667947248428,4550074267034379,2058933928002319,1057055539970833,7298880171459346,635793318170421,4834371862135576,6444509444621082,7787115972548058,4910698101916446,3420290618426147,9038017041056538,8005958356037767,7100988808913709,102171739587374,5868237455156016,6107546038420281,668151234372415,2562981368390469,8391817829014327,1728242116690764,7978385459716941,7277980287492943,4722530526757714,565641661539155,8505675617869966,2175024872489815,8051407155626840,7719451757957263,1798333451338588,1627950342046563,4086403730113380,2397511039353702,4520738976785257,8525953865351197,3401633414677357,3663762797699951,2468597993128816,738709509689491,1310651690853238,4855395494167417,4865489732944763,8160713070789505,4975264603603843,4706231506609028,2416785594082181,6221688874394505,1801588512310157,4902400085628397,5677952806409599,4483056433374100,320731309253525,8447156999594904,7762833435894682,4805293445391263,1150357960303522,196692764074915,2912577443267493,2405905957553065,1006820556661676,7883071421359024,3330981070779891,2746080421856180,3874389672231862,2110542840505271,3640304752255933,7106930217206719,6355761970881473,4780109512336323,5751414965302775,5210470135753550,8219493761835991,8226822531343325,4267822170800293,1240475997881315,2942203506828262,2892527411684327,1441083353678825,2464840438514673,4964302171038706,1863945816671222,8753508465875796,1343289626018811,4233842410775549,5604484083860478,3728695897293826,137094921896964,6334481470628869,8068571590915348,2297781950489607,3141797164024840,6475758706951683,7694260815936108,8574270120018969,568107180753947,6774570101130269,2411630639547423,5718593543455776,7397828813292577,8879277032825890,5089618229601315,2822415313503274,52691376849965,7381756636281963,3236466793465352,479269639119927,848996882613305,1045151965733946,7506426148719455,7285794211619906,5964892479358022,6162704597255239,7026702528144458,253795542352971,5288015226971213,6192298839852110,5229044830635092,6877561486210574,8640445684171865,2671896395826269,1439362296251487,9176175920637024,5972890795385953,6591565996401762,2463206314460260,1303341412361318,7367269211292777,5438915647071338,561634983887981,6233314059936878,4107676089771121,2769740513887349,5754684039709814,2853837061227640,6916493166765181,584165697037438,7764787273647238,5123883283244167,1499613532013707,6105164528641165,7785954381169807,1856793424725138,2506734241229678,4783385754461334,7192659330565275,6750932526490780,2427900247336093,8752704753160122,8146224151864859,4616870265250980,1634433417505649,1672118996296872,6661061041087657,6757791400125610,2906221614720173,377366102066351,2379854942986440,1380192880247986,4287711848715806,650068441932983,281717282219193,611289534973115,425506933679295,8104608707527878,7487328481936583,2255312465870790,6189906536547535,7635387568940240,6287915705768824,1075654807038903,2726414915716311,540132752123096,2379170032706777,5598935149277391,3541790429054172,7374686899322500,1461378370053342,1236882747278560,4237550679844065,1076753588569314,9221284880319715,7582718790378728,4938584074462441,7350343363614247,2171065290892526,2186931886916847,5754878247093491,1053493683553524,4337008812049653,4917525670336041,3867810136433915,1191178564350165,933427214091523,7871837166492545,1165756976375048,2181423001421065,6649130563495180,3265526883685933,8919072624563357,4890486343558418,2388340610860307,5599194888733972,2379218459714839,4032146489099546,4806371108771375,4329813166368028,5429926521259294,2688255907756153,3874101255390497,8242672688612645,489535446779175,8584516909587335,5453957234550062,3460976505113480,44798075708723,8587841127933492,6821741102671163,2248360630297916,461758241523253,7464605997478253,326957079651651,7045938497135941,5156804979393866,8908436001956990,550306757379405,6842275916080462,6976153716745553,3098247804904786,3488085019952467,3583905369400660,3617571094308181,8018060629280086,8118614773720407,2741602193343832,7944286668154201,2257242554926428,3607050580927838,5961609067417829,7063258035684704,1900050048419176,8462859108476267,6913013882692978,863520313361783,7655004521366906,8203583702123899,5011844600530302,5724597873687445,841803076756865,4852983115949442,8202085754650859,7876417608620950,3460813827608812,3932656345672599,7033893094860174,2708640822486422,5103223662093719,6100446366045764,7459494959146394,3638304768959900,616444676326813,719525577844126,818954808984992,1420571704051106,8734771909887395,7381793617279900,5220581478303147,6258660517414316,4587737443378605,5677648697951664,2993279566579121,3885092685710773,3392507246880184,5889329718117817,3478102610044350,8907805890160063,4105404784199106,4756911305221122,515490452235718,8924556838476603,4805280468075978,6514884485883339,4527987959924173,3346183337653837,1014506952533457,6856758205736402,2100305623296931,1994114190378453,4000298493527513,8988419710813775,1586121131533788,8365162718586333,3224711245555172,1064767034385893,1157587158820326,7624875898652140,299186729281009,1984304708961779,465868061730298,2972787178819839,7357715305954218,5477788394890752,2517769504243968,5992087869965826,15525478368771,1747580209497604,51016350684973,2313691588306438,599781281441287,5021111797204488,7846601795435642,8448172757419531,9094567406200333,7305695843796497,5552449934143747,3109393718986260,9035523760277014,1019537707017754,1124448443680283,5771541289657885,3290840134968862,7575188965983775,9162314986654525,5737276429919778,8521902574970404,820608301409832,1840547580921385,554936117732907,2850212615767599,9113338924260275,2198586172835380,2631163758667317,7031535076230716,5782009917042954,2170213631747651,7648129565386308,2247101242885703,7715504363103818,4861392948872779,2102799013586511,2031130103231773,182784770893411,2070489576613461,8651765958411864,3344588604687962,407324879939165,4147666028725855,2881736088471136,3702616186660450,7033941757552227,4783730030495332,3109891331696445,6064080526149223,8508319114782313,5541831766959722,3497634148075119,1774237891929712,7432622362109553,4788408733140595,1476059969524956,8952644861691509,2234113937041016,6647491770992249,8943792793609851,7243369574781205,7813282681824900,632267151017605,8073928522188422,2079261225952903,7640577873689376,4769822210795148,1318207372396173,787338698073742,5014523760428688,6917025746073198,8654120297703062,6297285050697367,724862280043460,1278257708332655,3946040774084254,803113948096159,7625548745524896,5096233580201584,4983168834995874,6342976057157285,3321355409213094,7063536414942887,5817776089106090,205725871552114,8438686680852145,8869010765330035,6126874319210168,9072019487082170,6517539734455995,4019307431610044,411594520061629,8989754420954814,2599541398841024,7788634028836547,1337759803500228,6880074198832758,2739634523296394,1686563810723529,5475908167173835,8969482135881420,4510987392721186,2419547738924752,842311826622163,7020766647428824,6537163609048795,6869623704028892,7806304686093527,4920261907359455,4021799015925474,922312794785507,6392749796779749,2722998909216487,6839761041450728,2837351521044201,4970145318635,3336697764644588,3532439747684077,3368273701783278,8704774922290928,3890723008620273,4134107242694386,74483328973779,9043358184571177,5585745852524287,2208621494896385,5502656164456196,8089671349626630,313074296235783,33621298964234,4828190329628428,5460748222734637,5790142845814544,2093949930981140,1842353789347611,3586084679919389,1220494130448158,837922871396129,6980079451342628,5888136499799848,7778407891983324,1736117878392618,3117093582931755,569591621519149,7525828336469811,896978631976758,262495373182779,7374658377227824,2310869186078525,7297211047348030,1972081420124469,181558880544577,7410029920888648,2893217903241033,4150657603487563,6386557308880721,7553457956432776,5483704810710171,8429096798948343,4934717584582490,4520833107994461,5736193498446673,6737110387525471,9011529193854336,5531333799421795,6219928217028455,5224375892211346,4487329759430510,4254702633109363,8708261867333492,3273080538792254,1077036016191351,3343207744169849,4022862580508538,3363955026716539,2635397832888640,2357278954571654,260817215921132,4363231059347338,3740248674461582,5172933099554706,1521076426486083,1812907740186517,1557888616061992,6539508685301657,308372247029659,2850944440788892,2325616806840221,6250934357092254,783414740739999,7509266528012195,5423129093384101,5649617802102698,782518070691755,1152444526192557,2763403050747823,5125407045273520,4272702843766706,8112498429093811,6892407813326774,1166479755823036,2734130352703422,1987748071367651,865452593530817,3722014854604739,7093487290099361,41333394622409,5289606594660299,5500566343690189,5448299522189263,6904528639096483,3131398938249175,3275626527811544,1804949782300634,4712285744834526,4569093177468897,5089280359606242,4743579364730534,2994351751628774,7019744728426473,7508443371620331,2752659753442671,9091435389962229,5078534890121206,2362268968511482,6500316467595261,8005492568124129,2349839281620997,7458892672755725,8410664087156568,6553732895329247,2891079468296215,3301769272248346,3595837121005595,8286386103699199,2751296428270685,2166989778566709,5884645834057774,4888260514056243,677601310220638,2855265152796726,7051066290251833,2025829383757391,2856548743096379,7213538106689596,6098654719412285,7200229207328833,641730380228678,53936673597513,229714441758795,3087724489189453,1600355723855952,8987545906774371,7621008374204500,2019177321875545,2674328770767887,2021645118203996,4686975239743581,6751298672944827,888561828816997,199968667043942,9189511668648039,7427145146754748,4478591463319662,4255049407719535,3525835040950389,5178187033454712,6723845004806268,3133642685088106,8102068834300492,5911676104321154,7936766486248470,8172466573117574,5983608124344456,2228054000846985,3766864980930925,1781011146639504,4613993023566549,3104698387237011,3278119729612950,825089629276312,8072554134786509,4301452372674715,2669033484856346,1723434365995168,1416128530188449,1872495504509092,7608599192856051,8529352084785318,5656401498323446,6156340972996778,3626989927528933,2734432587565229,1715626690488498,6499428004432051,6290108149286601,6404191643953339,818848584247484,1346448736897216,7200702852631584,8794511835336297,5980796575762125,7145582227140984,8159799601676619,6254678103451861,9119004498856151,7169697483819224,5155061539268831,5891100560287971,603948534466789,7360800777324780,4739006935013074,5555943460791209,3693483339843831,4356166577023224,4309278008150265,7880933882954111,1860692312303869,5047359090018559,5097957971577090,5869103121967364,2887969760495878,436429363188097,7201152917760264,802543633115405,5585121776870913,61106294802703,6297916734630162,3283744411052313,1519405139683612,3799121863026974,524476104796448,438459725293859,7702838433321350,5809432070096604,6906039930562858,9105273355512114,2616834941643059,4281306124249398,6698278816715145,5106382710319420,1365693793331519,3405150987643202,3678298718921099,5088299399486518,6878556750276935,2793704712472907,1666104380524876,4061393831724770,5113354598068621,6833314453408085,5439825521023049,7123089388369422,984855164070235,8673166372890972,1972755556796765,7812328905959775,3578396665489761,1652401780672866,1448399338419948,114817155606886,5350945539813777,2381433421384764,6101328722905451,1473957826864872,459741609625970,8577239876663481,9096416529156476,3314768617449853,4565420998398357,4215510340323712,6697155123243393,5680763669776771,6345904988916104,4087622844107145,1478166905317782,6006227927542169,3083528067344795,6224738621876636,7544580027517342,1231637158014021,8770826167478000,539952343468450,7989783117719971,4431689851079078,4293736972241320,1801439101094315,108321592588219,1197968207317422,8889462754091421,5984483539642810,8057111407848965,8315830390204866,1076611326077379,8159931678136054,2500879502223815,7424077867854281,381782126925559,8160589781453264,5120746422626769,8331886295861714,5766181539637720,2283918477339101,1261277460408799,6202964187333732,2281956094962146,5335651264657147,1530964743899622,8637545298930155,7116985279072750,780168235059699,7601481588582902,8892220545206776,8647444670892537,1979006445586939,6470178355954090,5132272502114814,8336517337188863,4439634738825728,6256456632306182,6828487550673324,7120967904086538,8135120210487819,3646196150901567,2157357314894350,5389198081804817,6413330709514770,6672346005326355,1050549190330903,118718608222747,543560742750748,9020655146289693,756443186498079,8621543250690441,6522695089048097,2977004590246436,3963272209155847,2354652597291565,4145901585826227,6863104705759796,1083889784015413,4574704530197047,736055114139402,5014149963893310,9176986242796095,6577074562959937,8737395895913034,4826579481055671,5702169650514510,631832763697744,8094847934909011,1204674483915349,7093682537245270,6159398792800855,4094512231549529,2800376573823579,1031236674447966,2692781524683359,5854425289992800,1898224980592400,8239368394197603,9098619701255270,5979024870197863,2914217530692028,1189397047348327,7582064256821869,7424471285049873,5655543627745905,1565623565167219,659607136422517,5748979197381238,4434774127168119,1453348653959805,2153924495526528,5689495219260033,2629690465749635,5156662950595205,18006726052487,707439295474315,5361676288363149,6411639381142161,741503232065987,2745322521021076,7814562810042137,2092866870897776,4105087639423655,67389009652394,1517071387311218,1408476039326383,2919508513262260,2750250105686712,2307444293675708,2912828541414080,2556350734830274,2075011526781635,4983857279773381,5129240706034374,8126771347074167,2892471568337615,6114111943822032,5350801021889233,8187357186075347,710654020676308,1244885723851478,423184458341497,1064125653600986,5265285478705884,4405923737533562,2328576667773663,6221226918578913,6406696758735695,7737440598223995,2663829005200100,995230795582183,1044192497437416,7830327839566570,112368647826158,2594365469592701,6806919729261298,435898573867763,2999286599068404,151737939938037,7609719625779962,3749192565861115,8685850890069209,7436926980182485,7315122943054851,6152282086075137,2625884585855747,9205050683091716,1864010195847943,963050109979400,4743316343802638,1751405529863981,8507942330784434,5544817702759189,8812528430172950,6726404808819686,988818070457114,5252515229780771,7602469515552396,8599674920528678,4644774444378919,560817418275624,695162161335083,5428228989479724,7191370303900462,9083406286187656,7993102396287795,451168061426485,1695072076565302,5028680683842359,4991756612938552,4667558135663417,8671050538216250,744408451470682,7923759156993162,3146126560873279,8351287750159168,1049972089604936,5330521388215113,7962223237260445,5563422622870350,1227230157384530,5125686702713683,217214059528851,4010250590456664,6777422741973849,1067297977387871,8600915875699856,8039093544240955,3801042868964196,9116574870670182,3788988590705511,3374655543282536,4780940703959918,2350897655932733,4068985202641777,8315470742006642,1369392084208504,887156973620089,8793555998919546,6546728858815356,7823267583961981,8338932879502209,6916075934526340,2590336095996805,6907421781011335,5581526532295560,2597665152445321,6128676050758542,5442141682062037,6798433376521111,1546673484819358,4036946366434207,5963969682074531,4537903984823206,8478640488106920,6819173355719594,1010718843194284,378536936065966,3589279209450415,6790867747662769,4644350975110068,4803439983848606,8161006826539958,1854279896532809,986860893391800,4612788061121467,4977744855559103,5046578576500007,1936533606108099,1879679962188740,4646791886080968,1438882400611275,9050917751458764,305938853186509,8209293391382957,6950498410302418,5454830021462999,6893164680244190,6531069308185567,8707277495479267,8388880001616873,5663816205994987,5340671128509608,7967087249787457,1590555504782327,714696875092985,5410295012404218,7059821247556605,1798771770829823,7487516166925314,4548924520901635,7577324317666308,1207465805941768,319127354870793,8578710629862410,7939804492428496,6416540561288205,7227531949566991,1937981608999784,2028098386766869,2316934598970391,2117490349106150,1999371400965146,8290675593977925,3047276721097760,9122722033974448,1700220898585634,5533524569566246,1950936647846954,5140431600872496,6841996715795032,5061708529871924,1296781295373365,6368616022174775,7175015413124153,4719596963695675,7006738425941052,1763778432863294,5753777481321535,6820525364792384,1207909707589146,2809708619123779,5159762360847428,6135578419080261,2389022826540102,8690785845668940,1215095148530766,8575329922785805,8270185897472415,4722197057670226,6838275404928437,1936160448474196,8791861973625941,7329922593246296,446566574517337,5088452242058330,4697071465718287,2081749098843229,7899263149480785,8990242450738272,6782359156460641,5698061732973671,8741464605256808,1803955474402413,8505374158367855,699698288979056,4685332054459083,7997893525048436,108682595675326,4131760287370359,1225056529239163,2702558898637948,435990103420029,1733431613648000,2413875722693762,5140552771663723,4737828313689221,5036453460610183,3957169066929288,5463931799923824,7257781297122443,6661714455227535,8687411883152,6655880321102360,8705990428978322,9161937510673603,2758188969471128,1160645203283097,6761245306186906,5161251421490334,6051109999070369,3747220216828604,3321515718479013,908791722847398,7944567090719912,8342006818983082,601778922417328,5965017188641969,1648777718167411,169929898618057,1611301293943992,5129390140968121,5740353840639164,1302893187476670,8397721133698240,6420423175363,489389557583046,5880566802091212,7943192566671223,4553204929408204,5926403388411093,5473690401900409,1939055425690831,4635757890981090,8282243386028582,3796038994971880,2074698571968217,2735942189182193,6005098722512117,733872285256955,7272169192811772,5616731539000573,4185651847793919,1017620116827394,61345496411396,8653046912466134,1508180705316102,8114937280908553,8682542425096661,1425351357395980,2704923698998543,8999564188159248,8199637199316667,6085348448083161,7334636340948249,1388841239162138,5453736713171503,1827619080965405,4480909678719536,7048771574172962,4801516296298891,7886242219052335,7667667381808432,8961643496680753,5475342956578697,8542958703553850,5380703477624125,7328401544817984,3910450855095618,1166116063472963,7917294711909702,151593106877767,4042741367369032,5460798167821649,2064879062764882,5767587820031316,57620679511382,3541043990113631,6636015295698832,6732062626955835,151891348499815,789094620319088,2147624293637352,4730149758709107,7911126965267829,52004509797753,1079323976953211,351427702869372,3464002313030233,4278121920400773,4489539177213318,5245465548737931,7822578948173202,918374552145300,2371088507039127,118135917776285,8819319823216030,5057030311636383,8049632463318444,1448309353581997,6534301676137907,4966074889592889,6276676513205686,8076066712849853,2316716568489406,4553666074635712,7629100961525186,3976470039215350,1111565633478056,6819353932377545,1275034078334411,4179609112882637,6911685958479312,6962299487866321,328760410041811,4380801864756698,2518107083484635,6254038641380836,6771056816057830,8345527749463530,4278164994518507,5891314905189869,1709760422194671,6884783518445042,7128521600340563,2304190849764853,4652924773404152,2271145205837305,4663913172946426,2980715216801276,5904434399333885,8568705156591102,373776110095740,1607617037331972,3983964013112837,7290289553913772,8341514382093835,1132636799192590,2197538559618575,632558900629008,5694750530039313,5385461289717270,4395044209683992,3486087824059929,1177593273306653,1727313656401442,1809387807692721,4572495293156905,7989367233170986,2082212922601003,3629041858653742,5340511912308277,190633263795768,7601378948443706,2248506087404907,7030398874484107,6117081943518783,8879105380704864,4706049834724930,7011047562128963,556331050962500,5434322014776901,3381912499285575,1843996232181547,4432747689078348,2057230410112269,6501611318887255,6116249124925012,3247469456928014,1083000616163257,179181561491032,4110723853825783,6663420796587610,9090055443037455,162427548700252,8528545370009182,907737595383395,106503742377576,1947406614998633,3429263340342893,3682495649435246,5160564710534767,3309892025020016,2463880522681969,1655574458322547,6228592871272054,216286392438400,5340491751952001,8450254135485894,8127526639201923,173059719417477,8378411452960390,5197810517093488,2054303716937354,2729643884908174,5219674136235665,8606917709852306,7974116936837059,8637907380588180,74627860329070,3400814664781463,3090774650752669,7886242552950430,6678918615076511,7578527490739881,8015273422425771,9065771554315586,5590843352714925,5611589913882287,1321121479749296,161436365459122,8949146968068723,7652174364257977,1272770145767098,5571522633142901,5317836490182337,5905980444374987,3092086064139974,4603127167127241,7541948980735690,5590645865105357,5324624245051092,5444889425637080,5705694990429913,8218656600500175,4722889428430558,7693991133605599,6132293388029664,8889928813620962,6649643212558051,7725351762521830,4646438159259602,8305631710842609,6108373419575251,2313697478700789,6191231385915129,4912142653904284,5831636441568897,7131106419683071,6262209182003840,8494662009502218,5366431696277255,4982370437558026,3234436432523020,1558330804023054,7187341170446095,1029252999982865,5414326221786899,4512696732741396,4950232146743064,1551753217748762,7726611765547653,8784802231299873,7276515108714459,4523596711916166,9073963403808550,6312323284835633,8383336530579240,7911568464435164,3038750758883975,6403779406016301,1245688498922120,3343660257816371,2441252594272222,2072341918576438,4068119528689464,4280259090157369,6259189833297723,4472023932523146,8431453100170619,1508298577809217,2821670005893089,3095719783771976,5447442000574628,881199321318029,1779658447523665,1690277905313619,1369923080220501,7977809493512022,6067991991521986,4058778017001305,111766749073242,2854251640418141,5240905884829669,8575867282158351,5114979985253008,6594073212653410,6010714277683041,4900939857792870,3669873011191657,5840622175981418,7772538120187477,3426861304720701,1664484899868529,5814313977139058,1120920571814547,6196336338648382,8308245892722551,8826717845720953,8788532173565818,7000240716418942,7659877168683986,2783158206001026,7606431954434114,235302775738245,5792515412537222,6179823348264844,2762998051179842,6486253134827407,7193130321235860,7156754966998933,7327286056342169,6211690711682970,7299330788028320,602891187105698,4079996818878375,2332148617853592,5016887254085553,4730422732025781,4746641993658294,7936254010701812,8091840416174010,3895494717771707,6813623784665021,4792545103426208,5289678283534274,3679423824269251,6431873135366084,130551540469701,3217570951458758,5652439913951180,1671914716175112,1543410274471862,8894493442322393,3604960841609178,1431960664190940,2611208979402718,9190944632737759,6205178344112806,2134487453163357,4107906972069863,8749577454161897,2092715525878439,3177072032018414,6396378417760253,8445607867081384,5435605074481138,5242125263775801,7517101473074516,9056684136140794,1175614536364028,699158477656064,2330032313757697,919392467189353,629424065245193,6867065420697612,2858810865520657,5870013472436242,3454533486653461,8432765853257750,6249730969587735,2829993310072856,275891709483851,4747129986822173,8088876982194208,7468902614310235,3795454357549093,8680238313615398,3834091080347687,8542993757104272,4699994375114795,3689767912099884,7867208817602608,5095730381754418,5207957664542771,6298057326555192,7482603108978746,240378678661180,4186625426264126,7564737122063029,2706526091661381,5170283890667590,7688568131046753,5482108677345352,615644862107721,1436897274114122,6934328682524747,7036589959950414,6463086518292559,160010046738515,7769088532975700,2713007844160185,6552628258082904,1003061248741465,2873505478201435,4693185372565596,2915650493296734,4170492827488352,7621352552976481,7890583908356194,5018499629150312,195417497899708,7284605282152557,881119234166895,793384128426096,1353912562923539,5372346241306743,7673370736291961,2013262548308092,5715280603148413,6826361718435967,7811316467462273,385755144794242,5139229371437188,3614614728519815,1801427820761228,1368436294758541,8943246785310862,6933484138459279,4726962273513619,7779832937699353,4286890228863129,2296646198800538,2649356206452891,4611604819038365,5842931287392965,8416669580564854,2677817976049832,1207038172582057,1877858555965610,8690854046429356,8188698063212720,8110688086216051,8812121050403529,4749396075434168,2937460315951290,4026941163212987,4951189731209406,8650985567939957,2454056366657728,7605906963107501,2989922693615810,7317984045093059,8865811775910084,8014605329535174,183798263435463,3445529875042506,4400431963762892,2596775812072141,193320142803152,1528548446425299,2993253232595157,545195466281176,4412952006709465,1833585153896668,100173299888351,3074563508310240,7189318104215779,1692953438408933,3396415930003686,383493755926649,519773133256117,3439414049706220,5508857439596783,204116002500848,5457553560359153,2457520313880819,7312455714574584,6236129712951548,7976895063855358,969062890205439,7931840182984064,264685101125891,7954195652194564,6820033037988102,378021337624841,141573834477834,7743140872147671,8496855180661005,3678382910935310,7466938019412013,2906536239501584,8830141835959683,8399499254149396,7243277173035285,4030374274461974,5591104236941593,5388630965178659,4171424251104646,1513115051294087,8954129491252621,363908824289594,5053386516865759,7727052479451453,117335743443264,641892985680193,23974554022211,463602080796997,6730479648379207,8100304772804936,37511667970378,2961803009560909,1324151027839319,5831062157242712,8772322114392411,2698852554125661,3833538080051551,8335617363939681,480637148680548,958125524136297,7529702052180330,2565719368528237,5206556218700144,6066244133261682,5451979860250999,1176751949533560,8264538289993791,3069894601568641,1728377831895428,8940367238967685,4413530488721798,1820915545444743,1210453051101577,1714579623686792,1794134937047437,8633168137712015,1272428950434193,362447947829651,5489170709000597,2534949387596182,3558887677972887,4182234371895706,1177097955152283,7164188539867548,9007981687804317,6236960171594143,6522282719465888,8796418218881441,6876482750198182,352166042759592,458521285259693,9155623336578461,5002432741142963,7150289831047607,410019515887007,728163354702268,7335204336480703,3383967935132096,5795733695762881,3130800055800261,2440276838093254,6067240845431243,9197223091673881,2327773525160397,2122214986248654,2181552663400911,4573872640094673,5315695730168277,949948121756120,2639049635336666,2717534466306523,8766175792026077,1453112692997541,7962465309010000,5964779165217250,5005030633507908,5508202042409724,3066207113073130,7720017730589163,3710033554911726,2179769924948463,1073859174306288,5329215910679025,8288948733948406,1211675839723641,1942080122982905,8444639912972794,2892441974632959,6242844671900186,1254187522881623,3207210189451788,1252176142168589,8385797332374032,2142968976683537,7940921608213014,89363552776728,8731592709094504,2508118302601754,678653601337883,3614574299025949,3513299933819422,5845630400205350,6485039927740508,633847595115271,788055899476525,6442849273819695,1183809730761264,6772116749300276,1504600635322933,4093065884290183,8577443818812170,2803812283683392,915552841029728,3573939076493890,6361378611786308,8375280165621174,5418563764253254,4659704309756487,3385816656648205,4471370872517197,746494579642962,3782094289171027,7922572271713721,8586717693588058,3576073123083023,8902053734142558,295268117959263,3815992842998371,4251544711358566,7971111733219942,8735881230540220,4634440689357418,6690052171403886,6038481224757871,2109041576653425,5491915104686707,4835136876687988,4437055990534773,7572348244593271,4711444247728768,5947711580770945,2944205150107518,2188984623821446,5573932355162759,3190633159119496,1986830285951626,7070527924941451,6613956011250317,3772662846419600,4761440340120213,4040173613470358,583227522405016,6139101076402841,1901925133783709,742688204952224,3021242068488870,274529720292007,8425321307898765,8599899915858601,5755891285577159,2798790381327023,3779587207951024,9111426978722482,4724289737757365,6435007587823049,337245653185209,3711075883340476,4911666785366718,1366872552999029,2366747200459456,7187995642704578,1510016630305475,8731616296671350,7904734603608229,5928673843204807,8368006527658030,7942397700585591,6090657553322705,2038210427040467,3713581515936469,2523428823283833,8573454732398414,8038534826654302,7953562272353744,7580343161158102,3647244896293609,6476155342476018,1550891582132980,7214073671026745,2174708789719798,8880724775973626,4866191304258299,1860693630022396,2427458968531709,5689800666067712,1683855464559403,5749573433905928,7495269291610889,6875555456201482,5903365895361291,813115746677519,1775508494668566,5769023562609439,5371475245814560,3252261137208099,1224349940306725,5410944516117288,5961474889872171,464524958495535,7591286726325043,1987515954615093,7817234234284169,6997020688536381,8490155680813887,9019447938900686,1574700462445381,3449859179295559,3180383572063055,1318387961942865,7127976060212055,411773542527832,5565256774553060,933854838305626,5317518164718427,8074654652795486,4604545701286753,2356167025013602,4269383703884645,4864472437937000,148938568840041,7500765262574445,2549196355998575,3564821538337648,4758500107219830,8716302165824377,2122991481533313,7460891122848643,1175723634755734,2963855933412231,2870566998848393,6809477167454359,1174371731288975,8946332494762385,724621096768401,4353512147432338,5837012027331476,7515008683152278,1866301441414043,7193273067385758,3104384780678049,5653757243872163,666363034727337,6868995695522732,9060092651235485,4418015947412403,2430254335988661,5418147183662006,2148714277426103,4869163533513659,7744871944229820,4872590668338109,1409785158538182,516698370451617,2172544198726604,599098488230861,1539947340534742,6800429115487191,2837391147045848,5314656414405593,1551605634749263,3444171462284253,41028542190566,3399181597979626,1167174263837675,2412920939828206,7093789087249396,739001993016310,1413209826431994,7079517407523837,1634286765069310,449031789671424,6583591710929923,3093524474229764,2499122163053574,1324249696883721,5674011977946123,3468250521515020,4310980028478479,5404584320524638,521996040048132,4187298409886747,7466736909373249,676910235258373,7646098135323680,4471406198658082,7805203269186595,6737395326489637,7558936749118502,990478654567463,3797173733012521,2114788469003311,6395894039666184,8085877337330483,6577585086583860,3935821108114486,8240243260404792,270480234386490,8758988022330430,1088567884117055,3079261890919947,3784135096022084,5790040709461061,8349395878105953,8602903127689359,5929992403588170,6571816062686284,7349304861955149,8693255782494965,2225916188161111,7510748863517786,5714807743575131,1425941382599772,6860194012345189,7650068842402914,7653148258071651,4066222387516516,972414271689830,8796698853453329,4501007753516136,8647175771525568,877371145557098,3809006445474923,1927811734418540,21269167019126,3633433064317801,6937980995318904,5320275155238420,3805280330478714,5884730499544187,2689484811981950,122636687586433,7861111459329155,181538459801793,1131125115155592,3021773740520585,6222321593332874,1980160705123467,3194983580628112,6653472801353240,7970075667576890,1453576769730908,1718894020736153,2799704236000111,41440392688797,8713648000791710,8405611246318751,2497662947451760,4877596472431778,3356468254856355,3655027379696805,3054933485524134,6791410172818602,7092586602722486,3342257951937722,6701876604376508,6018042295686332,864127928005825,5371657931863236,9181646262441157,573545061708998,3069190476387533,8987357365387731,8050311605769423,4279718182376656,8271147424232658,6440832417141974,2010341021603031,2482428179985624,1587903041008860,4649114049049821,6883640480232671,7055037948097761,8977407241151355,1772431437174993,5299797937951979,636104303588589,2078663603475696,8986068174648564,513199995139317,722389546087673,7685105092433146,8534617049773307,7469419719767292,5460781841904894,6139378792740095,727610916738305,4715050518107394,5875394408297732,4653539874280713,4636632942236939,2454666017050458,6751121999623437,9062772253594894,525716408218900,6621472811609646,5626105994597654,5728269735073052,1609252139234589,3532320322199088,5637136810292514,8191444593210661,326848704419110,2878861855855918,8715022564742447,1881262431720754,4912131982923061,3677811277362486,424865371882377,1634346533983544,3450684393370075,530151578431029,7155819201262912,86139204826436,3282434966196094,7232932768180823,1652354140509519,6280170469225809,902869266437460,3027089806382421,9165493897920057,8495180020356440,3877407798859098,5994072961332571,6414388357838178,2789752147686755,106087554151782,7118671689618791,346546331227496,1476609122563435,4681520393819502,8524768274570813,5411112898024817,3270109632427379,8813174365263220,4082174455649653,2849502394749844,277909581452666,7018921615201663,3748258934879616,5265241410607339,8032851864892807,5207517876817474,6509939122419086,3829387070125459,3533151424419221,2142932648940950,1024061409678743,5004983654847897,6248293643842971,6583057948726684,3591569770804637,2855542702560670,5060041665820063,3780360283034523,4041495660737957,761686412121511,2529664394335656,7179174551295406,555453075289519,8109019027879833,5292938443281842,6678838912504734,1834354841139444,5969665358689722,1835195592734140,4514789601670591,6553373535540672,4598678059931073,1765926488937923,1000441112196550,4015277670782407,8035138601997769,8051226287158730,5939244600423890,3119058306717139,3573082752931286,3539196398024154,6642633633347035,3548726672119261,2079128375460773,2567740498747067,5532416862639586,7522481071470053,7607446921123302,1912350870722025,225502558852589,5758073021969903,8487995272099312,6644079646332403,1448744561309175,2093635845862904,1639424433878522,9127756839569663,3827636663145983,3158893303993859,4327361276278277,6555069516207622,5281362864018951,3515321753605036,6998819710776843,1935937738118668,820811793847821,2785204834842126,2115797313476113,347389977703954,3504553802749790,5771125783991832,8287854254901508,1015246938887710,510514832815650,6421627371583012,7314267375121959,8068758264837672,3987420409443881,5300590170297898,187928647308844,3712489008772653,3520623494567471,6847753205388848,3124775272994355,116053770352186,2769889388191327,619539124393532,829497610827326,1415850928675647,1303968608351810,4569784064579140,6793984534001222,5571595290539592,5988720293077943,97830294271493,276591794247245,4899363888032013,7042524506748497,2014065719963235,4895462979081812,1467667182294620,2506567296603741,5180199201887838,3581016076662367,7299698745521760,4274805424359101,554406343833186,8197616638596027,7590383626305127,1803386883577454,4598286695572413,947038921528946,6821519956751987,4228135168587382,6173259183517289,886224401249912,9095085671716473,8542441873810367,6311102901712510,1494796939613825,766410890966658,8935111186413187,6336438172538503,156390326228617,8269894869907735,3086009624131218,1856103042569875,1710395123422868,8550260875374190,4249089798723223,309031068456600,5535573549815450,990561487369885,4273681948087968,8347804465671792,6460801418139299,3592782720562854,1143581770716841,4121554230572717,2200446928516783,8524664427730608,4543755922962097,1856715080963770,8915204900714171,2288993770124988,6855934739011269,3550637156316871,1473679797163723,2507296291018446,5561141410304973,4154643711178448,5710041819018961,3193165981423122,5998617988208349,1445921312929505,5600351303546597,6482000094467818,277611667797740,1065093179487984,2777454095530128,5254998128310006,2485815404435191,916544799880954,3980142245132027,8003897259407100,1766639744134784,3342085229041410,7879241581672195,8760363735652100,1372062086928134,3305005755438856,8688973088371076,3652846793832208,170616021661459,5716729112637010,2577459858986773,1256139526783974,2785389606836003,897688885704491,4025207034083117,1026626203514672,8853018425218530,1213777262778164,7313956991751989,8602384548304694,8321327526593511,4283324856383289,269339716335422,6592011058943810,6872907206907716,1917988964641078,36978091431750,1660153763600200,8994977451018551,2612408944416592,7738016062076753,195724801185619,4261627976685396,1733515682092886,2166770477266775,4135072310564696,115931207939931,3666300961437533,2670147489609566,6231901462648674,2113005628331875,2305113401205734,4467382534690663,4432261887842153,1953402490320747,8647400125171432,5218849745975150,7416185416275823,1175324309952368,2932660557895539,5065988835153780,5010616462820329,9089202494699385,8660016777910140,7200246185449342,9200383070750627,1087556420083350,4933806227445643,9025133862745998,474234917787536,8020274697443218,7895768190613401,7443981703182235,8145751013070748,2714333422147491,2166138972682149,2428902665328550,93349196117928,172831603578795,4673799705925548,8146796280502191,1938294100047793,4274478035548082,2254772894955443,9053114485599902,8402344001935288,4493522934076404,6724122227054523,4829406891612093,2414923669510078,3730380037240768,3865007557175627,9125047471617988,4803958938412022,7578862218491848,5508979361986506,3846422762936267,372189846861772,8299686161045456,946894104057809,21968976672722,2500009359792086,2841343626655707,5606965135857628,8558591985252317,5502429555931107,2991295470401509,7472655622174695,5578813451786217,3498686638815211,1022453074924541,3829704868266125,7703301467822068,5808538120738805,5960888199968759,8589776122624803,3808311231920123,9079721360553981,2389759303497727,8636760876156687,4361954183739393,3302693982943236,4656798335105029,5699812906588169,4759366720370699,2505536711492610,1800995096297133,9125599532701712,5102690039469059,1581827357915156,6394369422669845,203112558057494,5039388902348824,6305656363407385,6173969417754650,5876099974707227,639397922830365,7773365200607263,4231811366344736,5344965087967269,2503857315526696,6611904913020969,2801286274279568,2446897897084973,3364297766819888,4020948848859185,5714824561383477,7710265134241847,1452990443059257,3771393561918535,1042628912134204,1983450515421245,3860678662314046,2775027395131455,7111612194781250,2444402035341380,5339333805430853,8665087531415905,5461132300752969,2965051855353930,7457016140036172,9141620247086644,567147309234259,7602140694960213,5212845212031062,5991381506373719,1589211641763929,4552716065764367,6162354654361692,6581040739514462,8125944217450853,3440181336266848,5218747353962594,947056495040611,1482570443962470,1591926002030696,1357522239166570,5564446240823414,7335399971674231,2621662149998713,5004781145391483,6262525369473148,3855545739835517,4076529156028544,3722168037709955,5647671372609669,2487953694034911,3088183621261447,5986380963076233,159041396177034,6496371426637966,6068202692933776,8048466653673620,3543115820021911,7193168744347800,7792047189342362,2564324713568411,7606351658760720,2444479123371613,7001903060555935,438376344795298,8947612647415208,1232011017582756,3655490513562055,5937774256568494,4449996023969967,6011541325494448,7330949609306289,4314234431658163,3284857504700598,7315786649655479,4736665120823481,8495522883401914,1198298415883296,1758036751268037,466067796048070,7403212474057761,7425723256174793,8816160036403403,3193749853216391,1798517306112206,6219539284375761,5381303928207570,6636988783991002,6618755756398811,4528166076291292,4944532888099038,8285494614399200,5006474184014050,9153427054504035,7766447402899684,891061121964262,3413758151817448,7526841335716220,3692119157528811,4095516083861748,4392201312631030,2464117636471032,3382301614815481,8322653668186363,4204686294931709,6108529628141823,6800199703746817,8171214827612584,7228685916379397,8972794542790922,1074496499726603,9121341124000020,436752725842199,6917330019825944,4174468815419678,3298233907869983,5199947797207328,5915800597518627,9192502019168552,2488390956874025,4621508122048810,6731679700056365,6943160240683312,4006911592890037,536415548700981,2429524713047853,922595865606460,3349976039741760,3229315632527681,2821572964251970,8049932800440643,6709413304367430,2777804102195535,5300353452906836,1533766722222422,5800020563107556,6047644391979356,123754923299898,9020047819669221,1318905205512545,9058498362399074,4074554923678052,7625638938375905,6874084810774886,2015672916410087,6590004680259953,3037518430280050,9137214877677941,2294710360422774,3356610114738552,5991575055186324,4363837921696124,4601238773348735,4225708756892034,422561155792619,1534303502268808,541640246106507,4322141784725901,4060178588653967,4429238852831942,7459065003947075,6310687572244884,3336299088492950,6124131264018841,3475182182545817,995361564113309,3488929672001950,2806242989152671,4691666132982177,1740481775417104,4636756327847415,3819189937945000,6194607373351337,7601423879199151,6403765709748657,1383947438365107,1625040854940084,8493065883933109,8540562538641849,4065740743588283,6847889312830538,5437451892808129,4895770654382534,8768976982809033,1556239279020490,6567294581661856,2280312978209234,6110432158284243,4377831658707412,868627370564054,7361072006764581,1105644603382234,2828486624025053,6459199892666846,6148612287586567,5231378410461669,481632156629479,8761228085352937,3811003890620908,1509859104340461,4263134747621873,5607340096512309,5324850413042165,4222441398630902,880995652057592,6154953465507583,842344207211004,8779852078078461,4988929125579265,5849993811016195,749038659456769,8038907487156744,7318501668452873,3586376976013834,5713773625712386,2846960564054445,2971526189316624,1563714468452886,7975741695146519,3212411367201306,6757822078858331,2415988235909669,8678470283917862,4372282179974236,3152054337919532,1657801111173677,7690180909136430,1426691481541167,7857154769174280,2600621835639219,555487427153474,989728012098105,8481059574146143,2844395321899583,8385429490044670,4257184884914755,2018623980083780,3377470659058246,3055332216765003,6966104292500578,2663901212949072,3233512714762833,6508220482157139,8580642765896278,1478434827043940,6195041307015772,6558531295734202,1401132339837534,8701543681729717,4338837028878947,4062837620120165,5461954127084134,9104988338360081,5872175595092586,4825368146917996,1630723021111058,7638223988742589,8831711296983977,6963410295265912,7633232742347766,4187399219739259,5396837173721724,6270320637418112,4438194028059265,838329178643076,5576687663243030,6490119896955530,498610935274123,347918729575053,5332820571421327,824347867699856,978055887899075,2045141888064148,3888149962226327,3190349884922520,8440319856573084,3221229644372637,7749971929365156,3426516913224359,3906696774843048,9041829001460393,6757304991111851,7739170566814381,2575561063725742,1689531554306738,2034760649980596,2118726580566709,3910553736493750,3316045318708393,2001519638567610,3440675240458939,3140296388819646,7347975970194549,777687277709771,7768887061592772,9168838358586486,3436184868027080,2729880875612877,858685963393742,3692961781922519,9217767518894808,9029750154894042,2951508493238053,7480405960479867,5529514922590570,1085453122214631,7581171637811944,5009228542302953,6371670645422826,6038308917478525,159425618164464,4715146946755313,2105460311082110,6002799212919545,3146441286507264,3057315154464555,3487297681177348,1881448296332037,1703316202928902,6534920572500743,4940929685347080,5081081460439818,1266043127569163,5363808509745932,8846177327250193,4546582426376979,500505865493271,6120686759213849,1320322476587802,4940910579809056,680866426092323,3040119726185252,3182797387086632,6978156399262505,7356584231285398,1771565044431325,695232742906673,1111428498773129,7653720579275577,64938819709407,4157105140308799,8206648465562438,1615740800015175,4989760574896971,4252783705094988,2968717010852686,1302589489675087,3847759944883025,327164716342100,7462476398792505,6071482522016600,4457852388817754,7793676583582556,1952364378438493,3360448598629214,3198324651629407,3143018973526884,5385979792198118,4296046998772584,7090069395929961,4089118207253358,4643898293328751,2275116566575985,4045687158569842,7749942396750534,5555892276304760,7375558944521082,1272555640281979,6640332989586300,1491568405150593,2055516344130435,194454585662341,6689253387500422,1458873022069639,4571369597016969,39732878367626,5606343632904002,2087189827140499,7095818567252885,5757456196066198,5922369154341784,159294186232730,5346650473077660,6085221154528157,3109178595097507,9065842115091364,572508593568677,8795049125116839,114482205072296,832203547540394,6331150617781405,1269751755721203,1941743001303994,8250132239527307,4460337932336061,1319465834134467,5944442825808836,6616094820752325,8251729698356169,1143736900033484,8133299865678031,4855590591731738,2012059341659091,4210647262108629,5079690337623000,2883647596048207,7174803963001820,7571122346277853,7979713945582558,6794414302116831,9155982549188201,6647947931057127,5934722163809256,8057716827282409,3790171288148972,1160630248930285,4599904484932590,2823971840428541,8041254568664048,7172519876942834,8908572968174761,4681332493605880,4808461532472490,3369841660451838,8677387166863189,2840489272302592,5783989333666304,4598520915360771,3982737843100679,4027733846367240,8283069168532492,8037651891289101,1483663594839054,3497059301194771,1759708401335316,4104383097427570,2309948016892950,972462962564119,452154814997427,7037975305246,9211922073196313,4205631132187683,7722249590873124,4359505058323496,6488276842609705,6846198807305263,8768777974848562,6120729687284790,2988516916918793,6908803407338552,2896860899499065,3899336267565533,1656220976995389,5603057719321781,5973075737026400,2369994435894338,5136790687726659,6334699180021159,5908275078003783,4945148031199756,8178253955628113,8608485868076115,8733548440914091,6415455370345558,6099292997098583,6802661887425624,2758672718347353,1737703868520975,6803118148852830,2414732602604641,3868711070858340,4468655224994918,3323770660404327,6155367671266408,7661463840152681,2615730021973099,3691778234391660,6392829613390957,948180632419827,6442526129691761,479351898102898,3402718458471401,400129150622836,2057224471411833,6788270244945018,9029077062417535,1890613022416000,4818343244774529,5131794488499331,4399207829167238,8324733758438535,9001286252740460,3173103199321226,2515505303960720,7255031116913811,8123953337798510,7367103301147798,3966149641043096,7537745635630233,2337368385952923,6870302245861914,7340627638250011,4372108389881030,6527149131783336,6270822014450857,6074639408290988,6215811871608690,6492325472640174,8541905262247088,5398668422192311,7520573939367098,8949573316541634,9051302581370125,7271621865684166,261839901973707,6466028278563965,8976401560034515,7034558473477334,6158065039883481,6115263980944607,3255217161247096,1080775083891943,768148122369256,8621632311820773,4114819352583406,7837537633040508,3721667714661621,7254799744040182,322724722539768,7123221473533181,7232643159858430,7567076589840939,5858137335987460,8023306892672261,3659731610295560,1728828599360777,945391500344587,4800973294174082,9020576023762083,3381002772374744,6727259943105821,500334151875862,5120996276845847,5360164131421469,1374662094470434,2466821065609094,5998477646740776,4029510697915612,6627175312776492,6608967621399773,6601924898200880,964120853216561,5489967664800990,5554914789686584,434663105740090,4533026897706301,4603851534138686,2516717252394306,3351601368210755,8377359610035525,1061216184048968,7696693820276832,6592997913971255,6486845152279886,5067480498085200,8683298359795028,7644812712550164,849948163423575,1670455141014875,2499539824942428,2801860639120741,6123356694199654,453745360485738,2796738001870189,7074327489232238,5748507413183855,8467769680313715,3601143570996597,8346773454871103,3047576859540860,538582789201277,2125601411293077,557614322269568,1205783918124417,8167679894783211,3343545083657605,3774491859885447,3193898285000962,869873178353035,5977955467754893,4425510118964622,7588129590173073,6700983513209411,6814115723926934,8652629393161623,3940142306064964,1652307608976796,2209892500487584,5818869061221794,8226853089077435,4143450050229606,8709574873625600,6725863418928552,1132888718917033,1737962258365869,6987600868638127,5896774230635401,879005708819895,1165257885348643,4352603433049531,7751372056313276,7334348776316351,3254832061758913,6633348590353861,8852214119513542,7032746743332296,6200613581356492,6386034813844942,1752894315675087,3587418396630480,708516434017745,1254127728942551,1241637433515486,7426415841320415,583109847014880,1438381635419617,6606260526949627,6439739231829478,8921697609585916,8928553565695251,8912594332564978,1106199631740403,8760826524909044,4431783417470454,9120732517105143,3732000985021944,5917313034616314,8489351888654250,8286269765696715,2335149227539967,546117861727744,4857556358970882,5693382968210689,2678773517942280,1152496887913995,4580069425356300,7872394658602509,4875457169677838,7780347803573775,1102260502519312,3358865997692433,8706052379385363,6722871576321556,8097089559526934,533677204421209,4089796306530701,8542579854597659,4370586720583196,1777835802328606,5534381848796703,8396008244682276,4171125255396902,8281064559251377,8227612750806568,5709432793341483,2454279477526062,5883514695425584,2072095094310152,232707764526642,4467277210975795,2621123812301406,6146048477773366,2442254655037364,6633298581446205,8029747724531716,3913805392331470,6688654403673666,4031415808327237,9196123179321953,7841808179977805,789455951877389,745411932970577,3699757106998314,2808915303661145,5826716650798683,8432832165121978,7874939131625054,3155004858596959,3147859464027744,6028515532111458,5974211735060067,6908196951924324,6087930950155878,4323139039673959,1392855817395816,3825450200604265,8636700822022759,6174135957234962,776534875013054,7107783730273913,3858659934699132,1981961496657534,4176047723285099,534876373786244,1341973376827015,903635535289992,5732569572219500,4584956184190603,817574416175042,8503837196656270,8324950980558481,2028187245091752,8807036115246184,4592842487479958,7210574162394776,6812801700871833,6406931733534855,6353407286320798,9105117696065183,1093192254504608,4325490435671323,8386398003294030,3276824315740102,5919917647191719,8127473982783144,8618184823923996,3483074122522282,1001275928125101,6937764470300335,1536689513037492,5703273892824350,8805204698349241,4708334367858362,5448505842810555,78357334436469,3021901970763258,3367073954168515,8602209781557878,7462393669240097,1415204006903498,1606249252511435,1519704725348045,7518169796214482,3574267606064855,7672693217435354,6741975400554204,355708522725087,6346362329153248,4635245869857647,6916388997398244,4750962687229669,2724803466378982,724519046414055,5058680227364587,8033417907797740,2411726123458286,9211670786155092,4810498579136242,7745247612239827,4334741323103993,2037731130875648,6000351955484418,5943452196560643,2648109482639108,5023622973800197,713293323837190,340027210664577,3446583399611521,9128413024788233,1211738067066634,6646309104066316,265870615043853,3174706687827726,8379034900043833,5943195928370962,7196363467693844,8771349231707438,6689406718189334,2315609761316633,4512018752151322,2900803924844318,8137664565254789,2756112973471520,1569275591270177,7230501769289509,5329427935520587,6894792334860079,7437439639158750,4742008536506166,1938379301732158,7343568737754945,6760919043333954,8842809886747275,5247587648918838,3972045156974408,5476767812403017,7075736172896075,3866538071007052,6736965661436501,6980211126771535,7564348498538051,3295422365957976,5033865590603610,6307774400608911,8417932355470227,2122322741796701,774943879454558,6444607631228768,2486424702343824,7870622540499002,2874035275636580,8557755788602001,5488510259257196,8162784529629042,7061462669033331,6032552331198324,6107473325113207,3757987012773183,8100761143590781,6605249957396353,736718817017730,4152066311921539,3545473911021548,7725073372282764,896200435171213,3230664942485391,2962332549898129,5753292263890837,3250938677043096,1303302276038559,108766189830049,2229769575604131,7599674074980260,3108595682647973,1654471997321202,8141495570374578,3806748701736883,1515702173212596,4956105745342389,2058443869413302,8621918217830328,7011439643246524,1645395842236350,2069672634826690,4546099039117254,1268359284514759,3853901546921928,6806171925796259,5109828314669008,242751165636563,6692188116615124,1701954503139285,4643770553144655,5341894049857500,3371065396810967,8363813017550815,5420848264511462,6879095226885457,8798245844216700,6791788363456491,7330985173417964,3153319960551406,7322356297973743,7130746195344248,5505199234760690,6995486100643828,3928416784015354,1816842737934335,3672194579537919],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/8963a3ad29f88d2b9869c51ac102ddf6",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001781095.1/GCA_001781095.1_ASM178109v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MFKU01000001.1 Candidatus Kaiserbacteria bacterium RIFCSPHIGHO2_01_FULL_53_31 rifcsphigho2_01_scaffold_12122, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"8963a3ad29f88d2b9869c51ac102ddf6\",\"mins\":[7516291754909697,468685028125699,3517541198556676,514968300666373,5252076396457990,107189934617607,841920647923720,4352731414885036,6182733049063474,8203658704367723,3768824593501197,6850051209442318,2128578526715919,2309748552759094,4258050680155156,6108989228014193,7053149592460929,8048254388092008,4815561942142622,8593648417287675,6330334015365150,2061071130458655,2437912546145827,2230226956999205,868227119912394,8394368968092348,3556379977623085,830780709122606,482311618586674,4554478104385587,621862874291767,2181798066358328,5904909005489588,4520385306901563,4497759764261948,6487752887926709,4728800130038787,9131908519322983,7929327278176857,4021687609056329,5285187807744587,762050341420621,2875383920659534,8554921384009807,144733166377552,7780845128642641,1998526484463698,4546950894039635,1180296816616532,2187578484897879,2958570379217508,4508199882481755,5874667587890099,3850687851260512,5232095166220897,7747139679491171,4630358049582180,2125372871884392,385311176976489,3293314229236071,2282126669679724,8443690150355218,111977790632558,535579280127599,1850177500410992,3014949370653800,7534106783396469,8533639843079102,80662757320312,7336452756728936,9166504022263179,6512083513178236,211101994964606,8118789874541695,3598302397282432,1556330593945792,4739443887100035,5454225840454276,7469886064479750,8362462951603905,2613050814830218,5008379420980363,8353770714970252,4621642822329999,9021639338238096,4723681642840512,9192581651790997,5535485851825814,983059609974425,1025577033846427,531966574226646,6177459536864925,3251214122889374,7917671165063931,5966563004510881,773573787646114,1631238654498981,4451265378707622,4770148591089831,2394356831186601,5272561233255111,4272937071337644,8840478881768109,1743436505893550,7930887681843485,7997029211435393,5797575674799560,8889209217586023,4748816501351606,7794674869355727,7911397068898489,8355626306471610,2372507284164283,2294617334453948,4462343835678397,7149186084247230,1350596109668543,2364933500112576,7943154903211774,1643875706040523,8122767995859790,926458750519495,8492992193643179,1483312171684043,5487717278468303,6911900018285176,5645076240099972,4178995869461027,530401892294357,3352019499557590,611737673688791,3888095805664036,7411629551761103,7130338038843613,1636846644824799,2670551381584608,5242440415566288,750935979648226,8183757371349351,4478132091559141,3080333728351463,6118460874758377,4732784132663185,5155465639187693,7371003565215577,5967364670519025,828622851187442,1090524282572499,5455411856249076,2066475342216318,3563527366385910,5598153891751721,1331599243319545,505236154080506,3732466415163643,8031533769799420,780847141286142,8070481260008917,2211493725713155,926500298391301,1758535738680070,1969533771733255,9115856231062282,7398412174929676,1554007266810125,9175048561323250,3634454665606957,7289865576991504,3131580122688786,4582453279916819,9079576552487648,3701326760290584,3015699019176729,8926799808556877,6660497422007886,7139309145618205,2186308723479840,501865192118049,1865649902798114,607908040856539,2517763758706980,8007187311286868,112923516153640,2266588074622428,64568551788330,3781873765018923,7119513951350572,3328044898973997,8575217460581176,6272227133239601,212249672402738,5531001332977462,3463969697972534,2021602600693559,8218542428314371,4526500433205049,1352210430576351,556576050961727,5098155942522177,6317594399400258,6740354437739659,6541512087067972,1302672071028022,8773202790591815,494601393140041,1403277120226637,1613255986118990,2438662931274063,1227194870184272,281957426644305,3923788607226191,7834160286471036,9058803632473430,5585082862546777,7951244687964299,1083220859718491,1028706347068254,1649951583514978,7830623856216891,1196093969077095,4180689562451307,9174507081772987,5048623619900751,6325093201090428,3729497984658292,1715820355288437,7493874878802827,2346683155708793,7486134556843965,6477418433172287,78838173692284,7218790222844285,7920208618115576,248326420397951,6480614964021824,4151726742965123,9114538714650916,3397137350363525,8657518484260636,2785479787251591,2875605748324234,40282495328651,4708835729144719,151750164901265,8916075599385411,3722400888629140,8806072371827605,7076421420051353,4645165380200345,7794735649526255,4038487480688543,493548436232608,2606811993274275,3750252728690597,8184217002771366,6252435070205937,1514035425741221,1124056708694444,5159771370255277,6961279828948913,5229830286815987,1854582010423732,4012832043883678,5761733939151689,5587063877103021,5198322498913722,6620343095866811,2577802912389564,4647299212611117,5358451478636990,4326170315028928,3902232036079041,7720718061068550,8092318248794187,389663632904645,7720802136666054,4131197338491336,7555746944698313,813457425223114,7403236949936631,100822810001356,5239082774343904,7799383002588110,2284849248965965,2967033106429904,6759115284528173,3023229541104594,4587950429634638,5480114975304663,709012006223695,4420865778764764,5857971394145530,6058145603794910,4712788760206815,6389770582417888,474131979526907,5257774155501222,3386542853195320,6571523151482260,7865980925595114,7803469590670886,7285801473109184,7552996441415661,2346526836084718,895316528697839,5118283112429041,3870019699786738,7464345301604686,806210949110773,248217695737846,5758350844379639,798927940477432,6197732323376947,1806813823385083],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/896f1c578904fad60f17061146946732",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001978285.1/GCA_001978285.1_ASM197828v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LWYQ01000001.1 Burkholderia pseudomallei strain NAU2B-5 NAU2B-5_10, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"896f1c578904fad60f17061146946732\",\"mins\":[7746553504251904,4859505372020745,2717509936750603,8187669162330803,349773608591376,8862655047638384,8229362479976682,7803126866419732,665667000179374,3472111535824920,2030963875831833,5851439248670746,8870436874936348,1200028927156254,5153116669239329,8473644107200481,309534868643876,9101386872414246,37967617687596,4713975900782637,6898819322740783,3281686287409203,1091418020167733,6039615470788663,3349204288110648,8119188477042745,2535093790310459,8149401278038082,5595151229927491,7903214845821000,7773611234009163,8567341077128547,6127715860488279,5162993710497880,8213525392280250,6664704707379295,5629909614338144,1069819280842849,2233318294585444,5006028136915046,3777712339501160,5367885602013289,3562022201090155,7214682490437741,1613924864385134,8807240960191548,1717422750613616,7161438631903346,1812457552937075,4431976967250036,6465559202126526,493133997940857,3296344574230650,393297268334717,3224183994278016,6230747701436548,1328395305107592,3257696334676105,7499941074075788,4833310481178766,8312505234982403,7692595702390808,6426701193412755,6994561849213077,4534185795551383,5696991050342552,2473958480755396,2600001938563227,8968940591151813,2836455211442336,3780686974107810,3654345070182564,1217052589015205,5776872417583270,1969048551735465,125926274736298,2396718715650223,6228501984272560,7960146002849785,6350303070560439,19435939619000,4982372355367097,3175736049205434,3290760634419914,6162416284713151,6786873677693122,6403364525588677,3493147636809926,6856122472792097,3883650267652299,4525405676847309,4248968737104079,6517166374731986,4021800632803542,4241674264879140,7314114970632410,3245133312884956,4981109903466721,1399956061077732,339401912748753,6060069874852073,1221430310379757,2563159167402223,7225201810448625,2893067736441074,3388851662170835,379542628450548,7244321710326005,908938666156281,2152813028565242,6728257185841404,8914666386915581,4321468431089918,8464620533669257,2171212294521089,6095911134241029,4481633112932616,4710445192061193,890431091400970,3761145753051405,3143943789863185,397548190433554,2098000573989139,3302305938313262,989155982622998,1864610684062425,3079877184323864,3376329319555358,2918064227189023,5837580770320673,891217191944483,5309264978370853,8988094890762534,2152530276843816,6914156956401962,7748144734150956,318125183968495,7341349627677447,6130843098693940,5475058498945336,3389130068083001,3072858527719738,8870074993926459,3108669233676604,7739095147111818,8129532377393885,3908011621261636,6911280516841797,8545132195436256,3796009539567946,6420829914906955,1155840539263310,250358740746577,153107342410067,1553088056123734,7904793672573273,8781464801059167,1359130555474274,6396790377562467,7730265486025060,6781071974769000,5883396419711036,1993799498604906,8431829107786094,4399096904941940,1122920504975733,6375177398436216,1842778008174969,7130768395583869,863308814693784,9016539823710599,5011695708324232,2950965244756362,2740216180711819,8827847575847309,7386509178184078,2574877696852368,2925007913230737,7379271804412310,7179343568142746,1250488172954013,1459423074034082,3597953945182627,754549001789861,2555438499520936,9046131501293994,7617325997494343,6294706025759153,1127576170193330,7957233805484467,8473570781954487,8668696188617145,5978278318367165,5821063610024384,7057569090413003,2383206941213133,1869537946182094,3308836348993999,5325623937507792,4532590551763704,6675092738982354,4942828338733523,6088773091746262,1148764263006680,65061700075995,4217887666627039,774515346711010,6406765967057380,9160106585748431,7138341469220945,2159646441611753,3241835496217341,7007811383845362,3142529960321527,2663075449389560,4812323753075193,1038767408759294,1365395808854527,4479361592738304,2329620003822336,1847574842705136,328115653313030,6962503532306951,4859877392032264,8798202886734346,4819569272234509,8403782748774926,6570025689776657,1983281738457618,2576968092236547,2397547533340242,2625898732814871,2358930838561304,3523046914818587,2142240532292127,8173208583791139,1853724825141799,1567117647938090,2633426184575751,5694630357902770,6289226097992243,6315645555089972,5365589777109086,7831537410610612,6912608050774586,1908286874772027,49649330045500,696442189488702,4567453011231298,6608986441671238,3062964041687625,5914045624689233,387450601521746,2583731065987667,3251133471965784,799394944410202,8764181659535581,4482009664307811,9128797916229734,1889339001938535,8949729127281500,6481310756307570,7888126025784083,6627581020979829,8909426219147895,7651702942147192,3548720757670521,3875152078750330,7685169291526780,161678418279189,1250960673890944,2603490995765889,1638259334472323,3084157894941462,353874484450753,1685992038261384,2203339556569738,1485826745336459,5881971876930188,2834837957485198,1230710656860820,2165883487068270,9081568207954582,8778641491534487,8866309287183812,6472631084630688,3456585573703792,6219544386011812,6112750771315366,4494538691842162,2104917818172082,2171913600197299,1749553360755486,8460763311415991,7833647334941368,2548470717814218,1095918438558496,8068151722779330,5972630758208971,4605660163973829,1744107352564422,4046225857454796,50917966947024,5869419737981649,8105715647335203,5052027497997012,7826459532128377,6821437627892441,6333920249553627,3955987382805213,7196694557958878,7054870264693472,3066633021932258,6098176622420708,6258806321423082,827606701048555,5729095050510446,8879608918614766,2366448785261295,4092091579761392,7599615066391281,9177770968127574,2412529587364598,4614806791201527,1694045073974008,4890752916480762,5295387637367550,4187902736573184,5927621723849474,8251335656110658,1989066099229444,3780687373771525,1068290211234572,1429186033959695,6973454410089232,3431865554122200,3021450942219028,5002316448285461,4277613303399190,4942939650556695,5988828614714137,2922294353593114,3165020664415004,2504806269567773,6591306339812127,786573784941346,4099540120760455,1567549641171756,4233048600945454,3831294653219631,7209287437749043,8035330161435444,6825055707341621,2791295648629560,6821036742140730,2781150822122299,8896741830632252,1893926862758717,8414254896554819,40481159138102,8700673694081862,1133012510573384,7679931444960055,4207478363276110,4082907256652623,2232825474286417,715241043903316,3894484428489557,677803543577430,6943769224004441,574261289657180,8713553002734429,6789869255861086,9011147240735584,5217079795778403,2941631956337509,7865655590806378,2796095104271212,5495513711559533,1029177621037936,7442040402412402,4960132306232180,3306025134515063,4263782812566392,4015728010011515,5412653957260156,8474260806165373,3668712071152513,5585947806643691,1385043945864001,2848837495915400,1899995478926217,4108913355034775,5629567698477964,1997713957381007,1013578542744464,8045910240773009,4313036948112275,4782175337038742,445966530503577,6012908707931047,7066986479035304,2024200224785321,6409629858513837,4416448424756143,7503698791439111,1155300950000565,7357451859067831,451579383175938,4104564331340730,6717140261962683,2720751129338813,8142709745533886,1985856485950401,4780109512336323,4599216129311686,6745763342713799,6900034076443593,6472301867082700,8814126040928418,1690293767414737,6469953791222738,3835146109379539,4492114901550039,7358430655448028,269076298761722,5295554178850981,3702913722549217,8995078549304663,6470196413807441,694696446370794,2346131095826599,8082305205229,6054515730998254,5992930149360624,6063480038772904,4461525252039669,3148462127203319,5202627083576313,5540244887503870,617090076353536,884416067634178,2761071356576771,7989948117894150,637242913465351,7623719695950856,653632374033239,5207210350150668,913362812380175,713329799144465,8260544521397266,1388358672270355,576206960935956,1842153086329881,2838899988243483,4188823684432925,5450714961994782,7056642579183109,6264159609930784,1520355455058978,8018734147119699,1517565012083750,1490580124722216,8946207072625705,4585332410287150,1466088258208823,3137555451094076,2138334478009405,150844580793184,7729437438494219,3134977718223940,2112617043928138,7977099839221943,1578300065565538,4233395426698318,7143291319047693,8183115683229430,1211138451424341,5773430550824026,8332519798478530,4344309441995874,6249816307057764,5916100195148902,8405857365657106,8097308621668541,5650583813981297,6035951286346866,1963605019640947,3910677264663668,7376077466657910,4325325905871992,7353518944607082,8190280091399701,6851157638390915,5355917560579205,4485682903581830,1943937928332423,1148258386642056,4128379569661065,8259282174461066,3651305007965323,970630523110541,4523718962046095,455819942102161,7159327372305556,4683914068149397,7518909464454295,8782459777036179,7689440137503898,4186844757050523,4515888762234012,3482138209658013,8203268878168994,3896271799149728,141283939853474,8267184495830179,4914426830242980,693183627750257,3138612711540252,5588202083026093,5123860551935151,1968049884841137,1061395225658546,4174756901151926,1225415870022839,3170117751334072,5007296405914809,3460043747673274,3216090609886398,3902283199941493,2869637037327905,2099964787918025,3096557608835986,7274497600152781,248168506565842,760634902201558,9185991147881691,6922093298762972,701558209357021,2964689854997727,8828806201140452,3288291111101672,5248009370141929,7629918936900843,3514374978905325,6817911154549999,930253819798768,7777016211137780,5272272262530300,398791786546429,851054077994239,233571450217728,2140918170428674,7078777668035846,8431159608329488,8409799242089746,2590328552604947,6091776466748694,9030788642891033,1207869136823578,8024724899746324,6581551567389980,973418089104673,7750140881282338,7708159549678883,5075608676549924,8903389979059495,828423569990953,7600501093500202,4421903679464747,8314246212511020,5225042430608686,867569085703472,5657721892035464,3481148094350642,6825420445361459,1075319761667383,715361098106169,3298134319949114,5167620557849917,3403799281747264,8749342979881867,6980360164607300,1798205563107068,5256899772616929,2134919652803914,4184320875357515,7339874175088184,8401100463894755,1790012403918168,7120012423381220,3663449456633179,9003415536092509,1049294657504607,3044585703720288,2235059739313505,1846202708551010,4543513825908283,9024391753920742,4383363035022701,3910256034792814,5181826012341617,6235352411727218,675058479916403,3243244793382260,2334092508194366,1775757835814263,5848050358191480,8428111777498491,3341864107885948,3041141266564477,1569470446929279,5384270448407960,8623870787159427,6974205576888077,4004027816691079,7125836342044042,3702659731932558,6129665122985360,2969885282993555,8073584087051724,1870793906931093,8303191814089625,214234800055704,3207383600981402,2195722154156271,8263625210021276,8986864963766924,5304375303128479,469951365662114,250094093375047,6313713964197292,5469271715538349,4861975300818351,7928856206091405,2232047226422706,8628381316785587,5417470883628470,1825531111441847,9012040793089464,651288360256953,7230851129473951,7239184753018301,6013795580061122,7438422636086724,2626171718387143,8110230430598600,18548549117385,6482768869713354,2125427559122379,1928349318079954,1974252024358355,2238098386650580,300987936499158,8533610075940886,3417648328639964,1857106579146205,2437531256309218,7023210070902243,3004691185411556,6753941483137958,7350286138129749,8350293220025837,2449235271435758,938428139767281,4166979565610483,4581547127177470,6355566813152758,2552233481586167,2289661629326841,4459735323403770,8162347610727932,1670818741771178,8850504319632894,8916743195579989,475444143580675,7547184283641353,1918538614556170,2757708355044875,8165542052840974,1524485506817733,8804857718466067,5311579043243540,222775189431829,8545447107899652,1671596400264730,7504522794720175,6480521156584988,1498560907858087,1044151471941151,123956760577569,1163881311331877,3331398201837097,6018389059823149,5675788468569647,2116801345275441,3862813297968694,364565087667767,6150828045706812,4709395442042430,4577890798216773,322048970171977,4704380599395917,678768327706190,7140157519020301,4925241561343568,7875134968741998,1146874715752019,2767874127349337,4054759182452316,5371514867777809,2751429091149416,6129245471704682,3351604862510699,7929752000685679,3608737233962609,1504481140056339,694868810548852,8675579969095286,7804511451457145,3348483824092794,6285760540034685,3886972318287487,494206942537346,7653230573952082,1742152301110926,6757112697685648,7734877369454872,808792816330387,3520947663980182,8134018103600791,6803075734819098,471991007413920,224008718763681,5528013872228003,2034744982570660,6692590113736357,1657825720583846,1447392944596648,6125624980956841,5255449718793899,4837708498265774,4587997998909108,1540813202523829,7353465689708356,9072019487082170,563358748403387,1431057601849020,2113814776702654,8844573262030528,1381869149562561,7756658036934340,1251884258846405,8617066629857569,2168307709003464,3696532255357900,7094928917276364,189509016004301,3352267281909457,2165877775197906,1758350162200277,4400183338895063,6312772911580889,8671051772954331,6054298928522972,1845640583116410,5105130676356832,6480958516184802,515027294179979,3731275924473575,5543269870630524,7494747769554667,7661810683504365,3183380241032829,7275432420124243,5975825224615671,2102165935097592,8151589436401401,4524428899133179,1831215473534717,8151379163192277,3053229552371458,1273448870106753,1820971328874249,6861729529734924,659152744908561,5784748737185554,6255669643298581,2662742655289113,3978080251946779,3100365476579101,6358938291676959,2464684926805794,5830194688575267,3068402812561191,3219289273394987,8796891829561132,30755883304749,5918886830393141,5428439840900919,44043707361083,949437252392586,4708689889421118,2052609856972607,4511771631986498,2932954125756228,664758416115529,8000153877677899,1039619994355532,3507669907064658,4038841912338260,4363303545483577,2162526196926296,2277540194977626,3318615736164666,9216639267342177,5866859189405540,6191147282696037,3236747508934508,728380825327250,8398974016799037,6672032474367859,5603776735029109,8157558414632822,4743362860795771,8583377730791292,980986892232574,1140731906238335,6167645832284032,1798996760102786,3834328103995269,1441944601552774,6983283670574984,4198655242258313,491621630560140,4472245918951311,6873693510838162,5965375694309269,356496265815958,7179270542247832,4034497010870172,5035096453384093,9221630110443422,7683639116449695,6947364334782368,624769261709219,5144198216927140,3862769250289573,8486978037122982,7593121114221553,1052673583589290,2197035839907755,7757338842310573,5818630818777010,1307356310309876,4768593063593915,9188618168543164,4222689965017023,7255595691648672,6353889403529155,1572664855553988,728572155103173,559836934712579,6041282363992010,5879881113503693,6046249653856206,4648332297168849,8760128216682098,6427080589904889,519673728411614,3912493719578592,402431977834466,7726665260903419,5908021519943656,2133040507045865,4422267096541164,8666873566818642,4611074027374575,8100079125242195,5263853367306230,4293441147029496,3728094536468474,8890643880045567,5148438708785493,669373727885312,8062179208301568,276739703171074,7530869780424708,2060053326718983,3118562307434510,3767086764181519,5903909266237456,4056905045715971,1656954541877270,9020734029304009,6427990427609119,6808677296302114,145932815992867,2465542085994534,1963709931506695,3808968984987695,3113669186161672,603268054738995,5167429001531742,1900681014798391,2298017514522680,5363694913955899,7842960578030602,2146041819744319,6966052473817152,6675986737677346,5582264331380803,2279523615066182,916054347892807,722606829226056,844552806303817,2081256270727242,6155326372746935,3226179510929487,2144073799002192,5529718116735569,8658475829720445,8170989585394703,4505528641874015,4063072518195296,6621742931882342,3939597907806316,475985962920045,1540337266247792,2403217336944754,1209815183419509,8183992430139923,7478528374376568,4463761225205882,8682110540949054,7544654737375594,898327746324610,4678160227870851,5588431526652037,5242078222329990,6286320585885377,1005110760032394,8005729597758487,3405340558624908,7792287402669762,3244654392707220,2072725139081365,6865828609362072,5334667481286810,2799488787368092,4193658517768352,197193485813921,8530135538961435,5823616772516004,3296302533183655,8968349939706025,1185084312201389,192577805985480,3578969250941110,7420254402734264,5274403993561275,3651466666038017,8809276713027774,7486740870095221,1655424057026754,4604390603679939,7473025122901883,6719291002235080,882017297238218,1776141390391500,5277139520006351,5071905836476626,757276234148899,4235730020174037,3642205674062201,5997178583320793,1783264816802010,8261728446568534,2844525548832989,215339685325026,95601053911271,2952974292240619,5702216830290156,5332701883721966,395427792251119,3641856689498355,1488067374205174,5179168256944376,7528729085978878,8625056355846401,5003662713342214,3715878359410952,3123628443265290,5792646403475726,2109130021153837,5899481469028626,914254067624211,6596576071411989,1969399086884569,2324618448931098,459319119210780,1658753792297247,4448985838032603,1438123059267876,326614401247530,1430120074258734,8569147077028143,3550174297237808,4841416003987761,4495498543900978,5330942094100787,1902801008314676,7911259704625461,308588942698811,7263332445898613,6494012868929856,626976970303809,3027575746939203,4400163621669188,7720851334842693,5491484323096904,7648561908386126,2969767277087056,1191552714746193,2355912918640978,4880140409104723,990659294243156,1498005138032981,8334834923342168,9170917971937625,29747093850462,8809473519225185,4245367917267300,3014055704578407,5808986804332905,8749046194340065,1823874086774858,1571955340822896,2872733471746418,8531950867777907,3330105634574293,7868124102216059,8897671631686013,5337913366210943,1412927148239234,2742312958519683,5625228999231877,473610785212807,3254857658304905,3782408444160394,4009804285102475,4400535026264460,816724129048974,7252373173419312,2446776833026449,5975270695971218,8042235743516534,639788866783638,2710409811708311,2920431833532824,7115396197248068,79734328043930,6255349770889628,3994371455150495,4427527316244899,7462366217193894,3615328999336361,8699658076391850,2665073671212103,2017753397430701,2350918764380573,2548503161883057,9159665017632499,4918473768651188,2034787481315766,2347410857699767,8003930329426360,4520308177668537,3264988251875772,8210731912636863,3708603003431360,5622374967143499,4661311391795652,1710319396628933,3371174935988681,748580600408930,7367943576871330,140503559408080,3031682552572370,2701253126613,6205123438135766,4879831091079639,7073582048250333,3774156190532005,4723635885844960,4028979858983395,3435148645919204,5540878022185382,122694139963878,4460120253958631,3590212551227132,5206484342655466,1321210848520685,4876161637476846,3696342022490607,7844542142957838,850516054100468,1273454163225077,3824937462163958,4430058643106297,1858739076422741,8196762809068034,524484911450627,6301675337435654,6314905433369095,5216631260129803,82123616348685,576766035929614,8700026577431056,5964524530749743,589344487803411,7937745420913172,8557760532523542,5147606207802457,2751322935880226,8076975408015907,1007966909573669,2194955323034151,4689413240343081,4508577488119559,6517204841916975,5760046560578096,6438220135746099,1482447705926196,2788115731360313,7620656615139900,4000730179471934,8292612935756356,5779565797386824,4100017446955594,8543538832355767,1378730394610787,5411655942425178,6517544807402076,7613259898227115,6248890868943459,3374479353145958,5875529574195621,842324826425962,4488133838817899,2549355847576176,3665227913833576,566196285450866,4544655612250741,6707052036524663,5280860591729275,6942354164943486,6239610297693973,4313875193580160,1599851393870469,1799261851060871,6232184364731016,7570341041498761,7909109138172556,2322030111820430,5992021685832344,2977934984448665,4853844011641499,6748495939144348,3013194406103709,2949664260142875,7543471188923358,7332854142171263,2261630159850157,9164747113146687,3521558255938227,3379795408718516,6021841916340918,7573535099931320,2400058019916473,3156986187418298,7432840747018941,6799368484801215,8865361284022731,452614483733191,5386219690232522,3511839342015439,2940426837469903,6043144544087160,6007301676026578,334222605191891,2830740826712789,3859397863394008,4879638724365017,5752946228480733,8090633682155301,6796971400891106,3294600860242385,4455692381072104,187804754553578,3137409200301863,7839211456604909,142723861138162,7546083967558099,5556956717165304,435212849228539,4011980510071548,8178937350753021,7548193141328638,1328833398295297,10246093223401,7780317920084438,6579850628827911,7829624524222805,5720077462620941,1452079363163949,2368889114971585,2352306484996884,529537635068693,7888134012627739,2663611956857629,5767023867431712,3494625228221219,790815759076133,1827189592066854,2394245953882924,5672881407275485,5810057447533360,2602429973433137,3695234310007603,1609129657092918,3159399237954360,1723542946794298,6018344639368000,3175237701675841,6068045455862598,5217982197761494,7346057135934282,6070760571759435,3014452411845452,3643402380651341,6057105738648399,4839225547238226,1895021005425495,9003417387724465,478951350927252,7076331116586395,2034750638525280,2150786796596066,1310660919585636,8205029323320166,8253336857340776,8593517249437921,6287922435492718,6825199301946224,6614341651041137,4173218850605941,8023219646616041,179199468178296,1728511502936954,2889462867725179,2549797975247740,6284583689104253,5307789426469759,6918617004526464,1939630788840321,3007022012550019,7922374037015432,8512067737201558,4594482089700249,2698804543810458,2955077886271459,1717079513189286,679981909568423,1613532610309032,5717020213947305,6977122226899886,2369186434493365,1597756493622202,2786848918047679,8350358619417537,4076961033817030,7740651904143863,7740519546964940,8049788818549726,331490864876352,9183080822813960,691665180486630,8607133892963304,6120269624396778,3824641232956397,6664407827516398,7008293455203312,5649321009351665,3652904988735315,2605456717179892,3798733303204854,193422476594169,6850892792750591,4949628703857571,2178135651953662,5356935307930623,2046593638242905,558826002256384,8781271655287810,5354669468101635,6634287883308037,3249305268308999,6974939934903304,3749263469587466,5629207371811851,7974460272282637,8391503860185388,4160710526692367,5834960315479896,8460289933413550,4811529468931096,405638299233305,650287987149999,323618658307100,7894539759062045,5700680624436876,7099807761861667,7287286891588644,6563413855341607,8433970902223887,1199228574919723,3950132700056620,1421535532157997,6646789916789806,6417221382884402,1695902233214131,473423577320500,9062235036437557,4600659052768310,3243225175911483,4743410761124924,5419366511979584,3108613976173636,2364870318156870,6648735997537351,5970340752919624,6988789136560652,3163827281423434,5624802394696779,8640987567055950,4667587408956494,1961798541995087,3447150516636754,8011413237812308,2722915205916516,8370542931377617,8051113457095183,7454418685381730,1053143532039267,6854122108529768,8751279279770812,8915053278784964,3835147275594862,3465685931813999,5235349268622448,830682278251635,8064972712889873,5076176255298677,251328327625846,6120943274552440,2728331204897913,3131354652626045,2123182097550463,2877984937012352,5454653144026242,3178022094982275,771895709666437,745657236475016,3653690698475372,275119278279819,3639614584679566,5674176649783149,3120983849192593,66006819925140,5832981370719382,5217763879570584,3134734514424986,5924511387864225,8729392656778454,3543155126529190,5642161398224753,3860907027614888,6579379840552108,5161717680403533,1680144976088239,5718504516340913,5130882108712819,77915775282357,2897042774822070,7523735052407246,2094033031747444,8711183162630295,1629063046433981,6270310799223999,2987404941274307,5893855038557381,3600724421348550,8829000954278433,7415971742928076,1568300220247245,5961831820831954,8122335581828854,1563524158500054,5408308013378775,4291449710798725,2545450691783898,7828922946129115,3048472799972572,5783644534761339,1048673230490852,5101088868781285,464607002299622,1243159457729768,8250756119727340,6473087039622382,4543287920872688,5542696182590705,3647003534937331,5340029904522486,1870754383826169,4251627677748477,8963929286413566,3226839100878083,9159164781366533,5760024546727809,5679081236548873,1532780584865038,3614640752987407,1900858350325008,6133911396330771,6173855624752405,1013497545837846,8124211388132632,8862149019281543,7086661243030815,6534408108780836,258398857579813,7332431621631271,5483032371932461,5198315761200433,529781976575283,6630185570159924,5364674919722511,5844669393374522,7542694949436639,152375410355517,8633846749836722,8774989436226882,6783829159423300,1100719716642118,23433599356232,2996169599356236,2353397206576462,4378091133128016,4894015555693909,8096744791286329,3859047942253915,3960380108352860,7058931689833018,5184177173228899,90784618081637,1326713043316074,1169368871783787,6249545686723948,6545849122408850,4428240621129073,8287747325504882,369074147642739,4914307977162106,2839383908633979,2011542422162813,8250471565946239,4102313521253765,2086117881032070,8293350114251329,5369413388037513,5386598755675531,9031720404574786,7349843444123544,140888103415186,2737742408674710,8989063085600157,37552565710238,2347141713444849,5809147578805666,6628678398078372,7714735437581733,7293741109788133,4758745590672808,3031252884064156,223588452232622,4701921009208752,6770655928733109,684103668862392,7304159752789681,8360761926269866,6526613355859387,5972734753353150,2221655457476032,6073285721419201,3317760454700483,7132662582244738,3964981173530056,2641785685880267,5217765816831436,4460006716108242,5412924533337555,7585280946810105,7754200030714854,1890855547239543,3503314553687518,6085441857080807,5801160284696044,3070032014142958,1738196316466672,8414322980335089,468194068590066,4013159830037075,7087409760890356,3344521663999477,8247576554812847,265823091125758,9144611807202815,7829861832953344,7333219851418284,5114945348496900,798300730183177,3725997045411338,1594369545203211,4985330454367756,4199637751590413,4557845160226974,4255670935350799,6138087955992080,2106725784276497,452538969189635,4709450566217236,6841949392402350,65288001211253,4352462022315545,7569172043238941,4143464683482654,3125243239456005,7035445218954787,2326096334179876,4979769406983717,2416451402419753,1130212228787463,6905326491110958,3269379817647665,494463967141129,5899604849454649,3900313875532074,4567738423152187,2636189900936717,7597610828893757,2666362468699716,7779211300040262,4769967016316487,5297925302259276,7460028242079312,8128035234950737,6315048816324178,7001406741868115,3662621775219983,4963753005264481,3492788586335845,1028390310350440,2146102923120234,3726556101521005,4544631034999400,6724478940483186,3598674727775859,713526056431220,6761085026094709,6397349731397239,7705750462762616,3467782324170363,3474976779128444,1383487525351037,5998701966208640,8934531776571181,7922799431724678,4022777727774344,6874333071306846,9106454922087255,6868577344417428,6683839788836804,6124758111799237,6863553746189892,4762716099817123,4587857555877542,3714867725717159,37621092814506,1338723438186155,4533359539990189,4277163010518385,1004136782581424,4892689789791921,4901626130132659,6152079547641527,6628302088916664,3089230351118009,1900447947124412,7026590922706626,7359886235324100,3822725446184645,7940855047990984,1007276046331593,6381969539346124,6181134668132047,8760885243596496,3736998784742008,3279126374937253,6296839402680019,6111242785042133,5207316856423033,4537139920441049,7097610608072655,311625440702172,6850234292825821,6139305322524383,7785495575700509,2499306156742608,1825709450063586,6898751426711270,3923635651210984,3775830201257706,6553932029103854,5561318938701552,6844097170240165,5612640831688434,6929633032654579,4105392980741877,39405419941622,7150680119480057,8168950692220666,7307974078263036,4069045849288446,550228098952959,6685469338005250,2475846047362823,4857489022209801,5426957599936266,2733218440023820,407448029691282,6978902006820624,1378043861757713,1652560034869010,4929204758228755,2073224156729110,482157896806169,5701166902611742,3940493190934303,3207438747471648,7018223910877349,8698270186238051,832223734026020,8489992431399558,5344685408841510,5606887811632935,1074262187601707,5921740765114156,1250491835100976,3921690860801844,4238565375354846,2972387926282039,5004933561487160,7179535324901185,6294872461697675,6508727630297057,8616475592191816,2485916991065934,7264671558741847,3285491555725144,3026620151074649,613712441921373,7528120925466462,5290759897890248,2244709565001576,4843228237926253,4863440279883631,5411633152337897,5379565174501241,7679907534262141,6522937431756670,1301701876977535,541255874883457,6624775596819229,6292192618418054,7541038609928072,4714158113591179,6528635496304527,5163492592398225,1164930005817204,7849534864265109,8913320514875753,6389429249211716,1748162333691804,4730165225820061,6983523142340515,7943091223997766,3629808548327334,3808186395586474,6445663427956652,6089517657231277,1699531539894197,1188169568456632,2159429457988483,3656741016658233,3183743191855039,3006766741966785,4361545879310276,7074610795029153,4182276918851192,4215609340530638,2511745628827602,6856822726832085,6616259938319695,809445550723749,8965230614261729,3117647140065250,6155105389293540,203794709729254,6598289990668267,7540998432829423,1698651456540656,6675945110374670,2290924803831281,9041811001298933,7939700279504886,4443034034917367,7722205550284793,3653928720199675,5863312346688853,7310511601320652,4015156285074301,4983159308755629,4034235785596946,9025915064005294,1590980544631471,1038205348273498,2986761805918238,2707177242737342,4937404318781474,6659077064912932,2257733226590247,3047404602331177,1164865872531502,5415428459098159,4742552948198313,6884004905472051,9021347657531656,402949157195830,5486333016756279,7630946018897976,3158519319572540,5310820630319169,2515717679755334,7431429393972577,1439345279225929,7920075839017038,4566741199622225,4710024898703442,915840815860258,7467893145178199,2841315127005272,7716435144384745,2774132126814300,26596665725022,1410522309226591,3831285980254306,7060452539404387,7624051107631204,7121102877732966,6557013799022698,6611181122556015,2695384820568177,3759613080186994,2070340124512371,453906987839607,786095448625273,7588750159515771,7983091671756138,5709782354055294,52133402775679,6570495287496832,5169566203916418,4412495707795587,5491449817288836,7249337253523589,150075198787719,8355036730568841,5525260094804106,2168620026876048,8635663366066321,7685358307119250,3023451799081109,757995239893276,1405972603883671,71515713400986,233449244047386,905784471212190,8474113926394565,2777724290805921,4774549414899874,654821006643365,6465445475332262,496136890896551,4153363635499176,980192377581737,3758912589689013,1722055675809974,952056054075575,3630541163488440,3096191131693244,3955951817502910,372010013266113,5661611515605708,8544847707205834,3679669886177483,8560179787911526,1663322529738961,1835975490662611,9171955816689879,1562480095342808,731160351559898,7879285370663134,5642214746697953,2529745875022051,2043489615800358,8769182684238054,4410156431151338,7406153502699757,4421665972613360,1193234120716533,6033228097884406,3042859728498935,5588744800781012,8605337285275898,3769323659882749,6803659344883967,9024403648963921,3371900590567681,5670095951058987,3514994907320580,875844628099333,2273041898926342,6827714348200201,5835876182577422,2344743196712807,3448893444289241,1322866346610968,2877292063125786,445932418238511,3024896125636892,8989202165944606,3683667020362015,1123214616523041,8477728627776838,2618720197521707,7078158131430109,6291111587017008,8968215284805942,781026459110793,1632884051587385,7252203865239867,7098044877574460,7057196333846845,1276490478760257,5020211376909707,5429581644353862,8376954723995978,2504763779089122,882859537518927,17306392056145,7698900885926226,591767774933333,3289610064564566,4598336494080348,1025259712016734,1344223429964128,2638923411755361,1540410700662843,5195835922542950,9170393023883572,8334895522419049,1772224955150701,2393653257941359,1075006359597426,1624807817843063,8344580281915074,4261046058103163,3259647205806463,3222249159692673,7493146398732679,3678310730183048,3269824445512504,8721833800044940,8938287721493229,783849342384195,1945875634212174,3376284453220864,1558242295574935,1912489348927898,3254262717968802,3732653349617051,302527438664100,1149363933802918,6821840541225385,9047348364644778,5853439556006315,6204655554867629,4562742115013045,783702889296310,8498596476253818,1909999000793529,2472437746976842,3029472277369284,980981273825735,8448574976086472,2393824236326306,2628138698592718,2907068787110353,7670428465951188,5216876412080598,3284493916778970,523581427511771,2145264258109917,3194971208504059,5221315495572220,563892517769707,7155902367412716,2074529573655021,1076007658697204,4209534888038902,2376724837174697,6782834221560314,8265515526779387,4731754258815890,4521184611021312,4856298444141059,7371476714107397,228297552007687,4498457579246090,5502324590424588,929156335989262,3552918893755821,8552189705405677,7750467428217363,517513843855892,8055162605028100,5423265425969691,7397261318566432,8493021179088304,6060637949620775,7498925232935465,5655722530951723,3866464443953710,3710568473776688,4145068454859315,1899837692233823,3097939052769852,6844837535928895,7426079886463553,3304833459827266,1935745651093007,8570872609968908,1510719219749451,8352887559025482,8227300301950392,8873453526839892,6869877224755802,1665832563716701,5161379154184293,4245763704582753,6564565735813730,374503678562917,4117681902465640,6049176018580073,1261515757007473,1398574587212404,2932827525279166,5257966768468599,1401546273354360,3096324637258363,204812419076733,1025115837158015,3724488355500678,4155740087651777,5149813195772552,5567303692382857,3760858452734602,4923983729791627,8678452062376595,8077894994776725,4092043761316505,9193716485091995,4076263129313948,6908677979530031,1418470255727267,8851731699502406,377917348770469,3158321197306535,6367442436158122,6524886543061678,6336457840612015,2184671187079857,1207185219703475,320917593846457,220749271286559,1734629163348670,5220557082220661,1481243148923586,6795348713386691,6243742545089220,5050490475112887,6521961396761288,2248212036079052,8684491852429431,2727237911253708,1460771073143501,7719732596677205,4717482572813012,5036527443981013,2643777480594134,748498053133016,45671782437593,6830989663883994,4333821223839866,3410459103883998,3222347932201700,3189130659787558,3883301693936359,361492099625708,7656806613062381,2900865755116272,4607532626170609,6078958700131058,5077000890954486,3311910683013882,1977713518252795,623963926958844,552502712718081,2748379471721218,3915369161118468,7420651954410284,6142991243891467,1876938576343820,3848067821572877,5196472384836368,6129504052663062,7163908670133015,884653949031192,7661243789431578,130817744614171,3344138562204448,8253578027324194,3511467415393062,2345948401513258,7773132202570539,2227274225300268,3041958104249137,356331103220531,703207738110772,1914959390716725,5507728105984824,3722667676005177,2404432690901818,5175167715160891,5019552581350205,2116777169212224,597999893304130,4757058105299779,3309051661448006,9000453224562145,391849012114250,805284565226316,2470546020987726,6422688085603033,7482657877717840,5547882508919608,1469801002734420,7172462628121071,1481364169700184,4055472660517722,1717829977813852,3611193416627037,1277150887277407,7437090624123744,4174515017904994,3914064962364219,6965328953709413,4561198759154534,8965869617312616,3652882002490219,2165768213642728,316155184337778,6773290207196020,9116568327798249,4820202657420152,873625629157525,8865775474364551,1673211003261826,1876904604275589,6716808558261126,6803044891964295,789252370453384,2648468587205516,6345372697334672,2478377613489044,5086793439100839,1920066676601750,3695128977814425,7395516673872797,8017409666379248,3600147666613154,493507531854758,1344346425528742,1173221555450798,7234340838167473,1081933683889074,6673335253742516,5051970159670198,8500969782260663,4017790566591988,4821031339865018,3205798024393546,2865909102501365,9121049172889099,5559288426394562,6677911274566595,126975099581387,2979796999558093,56950385382351,8591660611032018,7505013646922709,1766756395070425,14743335097307,8812934016206674,9184430431911418,5205459236926430,405068718454949,5949637420610531,7611234044027729,8274490927870953,3787925894916263,8312779565143025,3780072002974706,227823422297075,3575116992762868,6665516993782612,7723933735689727,3578787328611326,2579607113888768,7511539414217731,2352914438173701,122322935044268,3542550234125323,2007023778165773,1482955968345105,3211444381660178,7710166425947651,5046043936109589,4275950362334230,4953953501975576,703909157555716,4109719206532122,5602484176754863,3750707945444382,2436492583760927,6830041443439650,7427539077313571,8821899198305317,9163747823916070,5251278448432168,4196375054340956,8650119132820522,602580291613742,8638141518361647,2579457354748977,8089040914482014,8003928847987551,1320262916584508,4585982619489344,1096238372901955,6822295734219844,2706554585699398,385072448967753,6570924604798026,5093505456780130,8735897277806776,1252913640731730,212074921718867,8564149508887636,634116440421462,1776854332175447,6998148468110427,4080319963018333,4810224243758175,5407234297007632,7648755579974755,2362269376959591,8603994785510504,8146562105927792,7640431683907091,3520916485657724,7274290966951038,3597859476927615,3303338974532739,7396309592667268,6951178565915781,3309099449062535,1513194272478345,2060542802187403,5241483134104716,7410241394496654,6760771487642767,7544930152838289,8512089674574019,4721728236868757,5768463219471512,3430952919643295,1343848323036320,6293746444113060,1905304432784551,854879606617260,3531416536749229,6644764392305847,8468063901340857,3519395568045913,4698214917862588,791293789557949,3497953215165630,9170953585546435,5426128216683716,3509583173719237,3488941221755084,6932697359684810,4439484922067149,7545710660489945,5784502303198755,7320739432314070,8679147080674852,1111210912863456,3309422522012897,3791173512680674,9135008219784059,6819252083995877,8363224179374289,3674799938229480,7653147660375279,4517546953823472,4763166891504883,7949358890776788,4234219561743611,5999778795522261,35599199499520,7837809123928505,6170022180672770,8889676174775214,5792127577429256,520142284551437,8381875813479694,7452318573747757,3075122593699088,2423181480367379,586947148895508,170145573287191,9220817586923655,6727259943105821,8076196085699461,2274088035354870,4658415480280357,3130572428037681,1127237265235219,1367147780715819,340749349270830,3658080396776751,162827734938931,7932494234900944,8469677991810359,4488093414219316,896119342159162,2152367829308731,5803733134054721,274538481038659,860110510536012,5421786600363341,5139218635330897,7530522912535893,2831350414095703,2486267013797212,2708820065695973,2963593620927840,6925433740580194,3620121200279099,7084134792732266,4811627260933479,7299450149943891,4178181742894653,2527681901155698,7387663436903798,6159830362011001,8535182282896763,6867858784318845,8821737011051329,777177868498306,5954045974328707,8654649890997142,2997346422297990,8829123930477960,7011073884386700,4319561238828430,4249017974289318,7394144482964881,711468550616471,5737020513654168,4140470963803545,8911348876129692,1032736486225314,8235882306860451,4916953823548836,2263286131848613,8615625982621094,62249658013095,4911784456549806,7946678245340061,2816755302501387,1518844452476337,4757889679979954,1202071946655156,5426716040689079,7403124168918200,4192433674032572,3594310605346237,6033422079145407,1132002655942081,8123967321093570,1824297824032197,2587628004414918,8393198617793993,2438849184044490,6175543030658507,8300637426013644,184500155610018,8997385412031956,4880826740831701,4833200087193048,4290871959451097,8059890226992602,8191674907213391,2200362417133020,7938504806471134,8227239584445919,5490928178869591,4944565276759523,5516707071784421,4051991466210793,509872896701931,3626298670468690,257415301887472,6209465371162097,1103350453040626,8718300317947380,8081991178286582,6778860325503913,6655403980994040,4446983467365882,40598399202817,8685389527594498,2732645472581124,5875250966869509,7991547379512842,5370503148893708,4393629649720845,9104197979770484,4158285128414740,7102804309521941,818393165182488,6578477463574042,5673267987494429,4237104312694304,3078913129788962,3758519913666083,8246650223816249,7206021466461738,5375305416521259,4251996586423855,6452167374616114,2251737390994996,4278467401872951,3677694340822584,2864645356082747,3879958226905354,6795476442469952,1697818116576835,1026643101357637,7070312202917447,8143877002245712,2502783268623953,3623985648383570,9178552663291476,6399904447059541,3437818973279161,5651563476538968,250292318189145,2688117289227873,917507755292259,1211821057054310,2912451899332199,8712576292262845,7596792238700146,8497775040026229,777028348147320,3568977450923642,2587550303688316,6645195093972605,1994598872331904,393713093932673,7267750914348674,9170298464720515,3247380074747525,901974868965002,4891658448238220,5424630633748111,6264722241009296,422280264529554,7682836289443480,2240092272621211,2341308007208608,7262682741048262,3740616530753190,4523492465481385,1258605632738986,6135773488043693,6785854041601713,6117509850437299,6779358739584695,4828601969661625,1535941278054076,7297617124404853,1620886994024128,4033928235783874,7180916759024587,5350050424084164,7239188528477893,6280661255665353,8934185639147210,5672860155303627,2431046360741580,8205714363939106,5029779185817157,9120495665616592,4385047317086641,2301905110890194,4597856913463587,2197409951512280,1069787332024612,3865418940380890,2499919844669147,8313462585134028,4834276062287584,2997711861927547,3299763870701286,6364306801800938,5503445973726957,3235586212312814,5082719606142706,3297754215544563,8435001859708660,1013630571681526,22558780577527,1789001003898620,2567279300495658,1132320114816767,5041735156700930,7789037565075324,3107951350283905,5588528137238280,6919909448095497,1679272297799298,2998582119651086,39490752821010,7722020080424723,10501603243797,3488633570375451,9044773796668859,9092245136453253,8742205797068558,7815065315661605,7921472943363882,8760397519168477,2804855396685620,6514126747809589,4214283793372983,5020160990992184,6909126727375156,8893664230315838,6727395425335108,363951976380233,1943083508766539,8262356825082118,875099460564814,3885943145805647,6960858200217427,354898472343380,6390060851451733,7547903571547517,2507890506159960,3574101185861465,139515998911792,4043848654796636,2344106012972893,4793361984378721,7826100552381523,3653064227125093,3729904158693229,837118796052336,1923015525144433,3934254398453620,2431646017771382,5104035560003448,7360400040226452,565535923402619,6857629406451580,248636181193706,2442051115390847,6106986719786881,3517508911830915,8855273308870533,5164885714900870,5975681842141063,6733533875845005,3021658757412750,8448611096500005,1421146935614231,7796498433849236,1866630933297051,4164038527187270,5101671231808497,6415112923240366,7483593720543152,8936053393738056,3678802154567603,2939062779238324,6918926421211064,5203755679872955,7701725408425920,7268727967389633,7371612537133387,5140998017103812,4490711968044999,6545954357859099,7427536492804951,990864693393354,3055032506996687,5328915849598928,1640674114926546,2691640098797523,4378933349652436,6235880396568533,8041123441271485,2052612280145881,4104920113960923,5237304554739676,1074085985843165,9059739621666820,603730186688481,3059939305627536,8894075914638331,48171868338148,3305234174893636,5821514425759722,5972031234971629,5821445509044206,118191151880175,1100331282126832,56308045035508,9071822773910699,255242989336567,7350361093969912,6573210826536953,9005370755486556,2862933750315013,8868383623682055,8498453254928392,9145169615484938,402098792232974,618834665658383,8161306950262944,1605010411010065,2032583474083862,3903898461181978,1920140937088687,3179774093056031,485720528427040,5761466486806567,8813548341188648,7725541356722524,1857381955631147,779784426887212,3215270248314927,8307336287057968,6754426018322481,7479974814797491,6914763013765172,1154957608249694,7760716906148873,3084179225671739,4071471053247499,5186363697756229,5697070752708678,7397276346153313,4169244495444040,3631976910346314,9066438853246647,4499228522469453,4643948763977806,6462956081707088,5717881265199187,7780915772586070,7168406463723610,951224472594339,9079785920673886,2075309065394271,7210379649235042,384509239531622,9102290825107561,8753153970534513,2921523986946165,7325149913033554,1453128582903928,2941528638953593,8386153355253882,3799347565156477,5988259407083647,7774464042362379,8164903189313668,3114615286806666,3010404153440395,3258647071370946,4221190311860366,7325925063374258,5788995496433812,7536132713886745,2636071909972121,2492449398405279,1894919127750819,4222754776094884,3660092626081957,8334087333877930,709991052384428,4534484742576302,4512173263091887,4779331811735730,29784325363896,8446766545541306,5277122969163963,6517820154509685,6536582771659078,4619368112470215,6680800497809608,8826095776618697,2675792851343562,3503815134001356,6263172264499405,3674881287608527,4701322878277841,3943831606376658,1213886012332244,4702234876374642,1700201241188570,7709094489702095,2955169381357789,3382727526373599,6668526368528611,7464850054441440,5578980853422309,8475299491133672,4373768290629866,5345698742540523,3651877875489011,5478341248039163,4310304083293042,1145312870365438,4302179703355647,5191143707752705,6829288048982277,3397822382414086,1089407461431562,5393891360151820,1149700634749314,5860326898497809,143910516799762,6830424910706968,6252344096667929,7839608733671130,1288244621170975,5961025006360865,2009753128696098,5593239911373091,5943644126452004,683332969085226,1750244593785132,9075557680344797,1914321217247538,7379962157144886,3062049159444788,3743269111904565,5516352205125947,569604132151008,6878971001207106,7954247556831555,1181363499178309,4681583566379334,8387757942266183,5369473525171670,1180903847762250,2656235731548491,8603267557644621,8955521881676113,527081532311950,8140272622115159,5365270230866265,1050545878899036,9028269527529822,2605609732208992,4146892530276705,5788094987286884,5645232066772711,2945087871908205,3660035492936046,6267553012726128,8672973885607656,7884932999313780,6522998190668149,1055718854130039,9135575706630523,7372593431613162,4530645078436903,8583525194553728,4852267576538176,2510424379636098,2530494332254596,5961673869617558,8134455390910855,4060178588653967,5533041890793873,7166822489856409,2455130825274436,1740541854144928,3244405220161953,5260307416209828,7421368024224838,4230596084324774,3976201068367601,5409743641467304,176991104719275,615268581325228,2996710260955566,5798782911109552,3913586913180082,9178786487446292,5015699890125240,3638957842381243,2370528531033845,2510720865638849,7162151227193796,6873825295366597,6718765789714889,29233557543373,3510613583247822,1423645179020365,6096986519640528,2136271885318610,2166014232525267,5208405560515029,6386667942164950,6341814417545688,5416390374701529,8690887889017307,4718597401909724,6953144035531229,3069642226489823,4878298610694626,2648277503646180,5256328339085800,4020332417505769,4597898629921258,8633643462539756,3346532251834863,3414024018885104,4666655966591473,5523425027734003,8388975390441214,1316595600423414,3204420412692984,6580006929673255,6002868891105793,4269709190383000,874286952225283,3424225466833412,649083129246806,4690051909327366,870359752826625,4302656415570441,6238588697270796,7236596557444231,7196866446678549,2031821623241135,6833518941248029,2991716443494946,8454217614834214,1771800186747433,5765057749334572,4223596404038066,859409962580526,4242100762268765,2847292683409968,6932920007498293,3332955117129481,2017042619972156,8419342738291263,1613457551587906,2595451160992324,2789110073203269,7698146352634438,2966212994813708,1135773007169975,6486315591129677,6905144793561679,5152235483232848,6156680898304593,5171876187503187,1660426197785172,5623886574336597,4376378634480057,185003117124185,8900415943334491,8242467013220956,1043533134150237,1456170082450015,8959250206502672,3979883415059042,3657647060187751,5872175595092586,9217464612230247,7655414231407214,3068076549102196,8587913643317450,8579191948327545,7581391033186938,1747436335184507,4363880025782912,8004491885394561,6874079519936904,7600761340661526,6072623139396234,7291548269038719,6241584987609743,4095219091077777,3351743300123283,5348932266308275,8666112313760409,2093415668800155,2138637556623813,7262960737508000,7885081165249185,4449904302766755,3303363223968422,4523828135871601,211991263460008,7137761331255978,5163375243229867,4441189010725548,3631403967396525,6180940757056174,5043561297312431,6881437319887538,798927922715315,48175527014174,5716819493382601,2231401359538878,2023947750709956,7671531985388662,7504140723395272,1439475759848139,6141192450636237,4362169028623057,7463496075934420,1358822886193881,6034767612443354,8407504000424853,3946430045690320,2764316690889446,2691979304327634,3641044711152366,4936655974816495,2221905449491184,4504017419696882,1956031128476406,4260440283609847,4384821907036920,4314471086586617,2139393754823418,3069234671311613,1660236197911296,8446151585970945,4761132258958082,6046976928176899,7484295228108540,4011749154142983,3739083966642959,292637298260755,4966129511504661,3089670242564886,1911888209369561,5412879874259742,8739392496515871,3404376314960672,7882329285935659,3017346202344227,5479394704677673,1805910800569479,1474595763764013,182785088846645,262025256127357,2655218494446391,2740226183076664,8186205280341812,4502965001943866,9165610467081019,6961954603558298,532829611154239,1246266702031328,2071831844136075,8976202589510471,8919355162590024,8281313713437513,2353823833209314,5401117384424271,8381290061839184,2238109128506193,790765711170387,7933297699067022,6173048262196833,4246078652119901,3684190753766242,4273609256885091,1824094684887909,7725963563637607,1599920094493546,6012674581404524,747563049106286,1338971131403120,7182187420621288,8712068112543198,598990654866580,5365554920721673,3975756777700225,7649691413106849,5055891544349571,528467997514629,5892851371867016,6786518002998153,4456275553500043,1225647123946380,7740526344702445,5819532891151250,4941207975074709,8615171193756566,5158872950938522,1513126837001115,5063422925839261,2464547456799650,6980900097555361,5782312220425123,1547808024402854,1109394295421864,7038372420148137,1895039095888810,943472426744748,3039040314481581,6448461239094641,3281721621707698,5042675358694323,8818920773442484,6122640795601396,6099194514676672,5093177647588512,1603869238967239,9134682107582317,5534108428860364,4986609183398862,1245829323840465,1250338918035278,5033596049202134,6982767085591512,3578502230866905,424260351474651,3955706098047964,1200649179061218,4220892113066980,3844944665844709,4550741669444582,4619927742192617,569629000195050,6917884117687275,2536393702349805,5893178643946479,5333094708861936,7405025037098999,7471495589444600,4341672174812154,4062796561554428,7707853885451252,8393750352985087,6874514360933376,379392245586946,8311636308592789,6210811935022086,8052496213502845,8938827177614345,1486902970342413,8078166907706384,941678709038097,5310989709614098,1878610211929111,2155026568193199,6900694772104220,4528718723374111,2154541274078245,4532664283307046,3686778513472552,2858888550080556,6003562833779763,1439679760923701,8401875601546294,4397656515034169,5563293479304254,7821224497298495,3540528892533826,507581926456388,6942608797942966,8509894342409286,2742634174366329,8782926658673736,500681919282250,2797335747017806,4331286172679248,5380962056715345,7141832536546386,4916498759318612,4214669109591125,3860092703710296,250485862497372,6704872450071645,6821625241672798,1806525504584809,4906464345136235,6191797256445036,2875620089125997,6513283029335150,304614745642173,307192685714544,6765994143939698,6082061425417331,3659427539172471,3489306113727608,8585481766485113,4825789752679546,6959911726701691,6915761791894224,7023081089260669,3457830716280497,514100615445634,7239093039922309,3144992956120198,4441658026466440,3778581973258715,5599406799764621,8502719740583057,5718277008637074,7103536295148692,2357651679091861,1209772424658073,8198513448688795,8008479472188584,547985720917161,5597291624006855,7804527525424232,4995954342582813,8242717186890929,7055261728349363,8726769789918019,1473961866124476,9162806226885822,4867352777833663,1595934830615744,2030859780267209,6319611454766283,526312326536396,3129038216821282,5548948138351823,3569945850182864,4911393700657178,7230924532882648,706103541647041,1019577124560094,7375998979869221,7205963347860704,5220573389184225,5541631866354915,8065320590646502,6424244317667196,9105143755758826,5257681339071723,7361509469408783,2513324378602733,4457885385800942,3161532871277809,4587635268852978,6894226255404275,9203604384464116,4859775353412859,8902819353665297,5383223594614014,7158166711713024,461782740188417,8548315159764226,5964557464683734,4811136159226412,1259045207784714,8873751016987919,9203515478809872,7343612892830993,2786760386665747,8423455045401879,6839586771795228,3028716900728097,698285873315109,644370393079082,988732306620284,6351247418031406,4198382208378077,2510899574471984,349602498043185,3335652296498483,2928611771459788,8109606237945143,8408399566060857,4198499180756282,8104802785557819,1677133773700413,5552580708900160,7139099279170884,3198753970666822,2771883139349833,162107044920650,227478532750667,2820253948411215,3883151244713296,7351047688109395,2268007129005397,8684696046626970,8806337084841303,6581050066943322,8682348728464613,5509988085366112,318753867201889,535769200098659,2712567818219409,7561257594396008,8447256902172009,3089217673837936,4871306870177139,5489336037358964,953093498707320,4003734301777273,7972493863796091,5726397753149848,8051520255729026,2126405337234821,8685433271565704,7551100225437065,5243135517472241,4551937779760526,3805864770143469,2525456963329426,3300226618703251,7957529247407512,1540317422427546,4862484404511983,2617041563647388,3613737057918366,8137139080240543,1878693710470560,6801304034739440,4878230128516515,3426925341662631,701739293703592,3390316335504809,144238735236523,5061320371150253,4495553226336840,5704487408121075,8223511334591924,599650940951992,1314319039700409,4391614263180731,4064286853840316,2042746766654909,1440024368209346,3042316348759491,5345065172139460,2305537674395057,7455841671888326,1079861764275656,2444084392738254,610656358505937,2800035416608675,3868994020195798,2371942615743965,5736457769770462,589609306160609,3907414379036130,9015453247182075,6451990595575268,6393674097237171,4086652061146598,3731799121410641,961474791636456,5756658036966652,805567635955178,31897290063339,6517309073898990,6755259289755121,3233194154562168,3088156639685203,7088487333109804,4096715400371701,630985128173481,2451114677272056,1381618515778132,6996153042394618,6352028438224380,1587413192309880,3520585928310271,7683870900190722,8834588521569795,5145926463004164,4782813123378695,4842668284255752,1633361770053129,7110127391014414,7212825566687032,7907019556904466,8437094155951637,1698404115610201,6028073531309593,2240548991671836,7888782736812634,3241539718069791,4419989167398432,7211479318871585,6886978953430050,4143017450890502,3877859303775784,7473398994476585,4183793249558058,3837199939378733,7567946207930819,2210031822732848,7445925332370248,7934582115974707,6136513785339444,5478403506216504,2196326942048180,2049891333774907,2065212793085500,6153539319643709,8964470757531202,5685476244692548,6768251422244423,6461341395926600,7556191031287372,4961188895479053,1823422280015441,6667554494578265,6913914169409114,8736534741808399,8531914678337116,2472823669489245,7408491654274654,6586186318315105,5715058933579362,4038818288975461,35753628815292,4583615753100906,6895037853990507,3031140906475119,8319477270086812,1392835206477075,5063741255917172,4035624520679029,3286872844525177,3597227978026943,2423621567042695,4010143690407553,6966416272023170,3700450087878275,7741154205859460,8446939556134537,2710616642442519,7066745558392460,2949992699756173,2635613036773007,3067005971547651,7043666847055505,7298816640384660,2139158404660887,8628372608691211,7068650257251998,4999920373898912,8462005506091632,4437033193471657,7282001962311338,8802572450193067,7971358166919794,8637470637465262,3999543767522991,8892293349318320,3635598319689393,2627583610896050,5073037400227508,8621289084231349,2142951518703396,8016842774352334,5759618655895228,2278031084158658,6477935950274245,6204251308351174,3695708689620680,2504564855750350,1122282061790927,2552506815635161,7069460798414554,2148479993806555,7742298916978396,3695295322242784,3917202416631355,1275570071412453,5926919017053927,4385781548211945,4051478297108204,6535373089038063,5478424833744624,9011812413333237,8970641725447926,8819329473699580,4672599254561650,1754157050044158,3497925177769727,4418062844092161,7821488976758059,1040344886247172,8422520975879739,9006881258495754,2541790730944267,4263715957341964,2521417818749570,3338077920477144,3716196977360660,8358598506329390,4182958607638298,8022234109509404,1031000270069534,7937537882077829,4431390979309347,1142720806092585,6352201065376749,7636528607878962,102341952995127,7756075521179449,8728841177087802,3927070386962235,3629338054549308,8045875787390782,5826259611655999,111028908482369,741530057998147,2903473254367044,3288374957948741,1563493597241161,6035214478599479,3480140655476557,4299967400714062,3810776893063139,3286620129876757,7212903216578392,3509369164332890,9140164007139983,2360920311807837,5594135849910111,1982817612316512,4070152053817509,4522020653380923,7651620112932708,3456317645217637,5490236927770470,4870579255198833,9087852138447113,9113983747252080,8502982940319605,1494313911140219,6348547972702076,5146508137185150,7134651829575553,3929652053991301,5897647205195655,3195576425766780,7878431078023050,3857766878592907,3473258043244428,2827569506721680,298282370760595,1740815318712212,4758805218648046,3132561194164119,3868452125319066,6566521435643803,6596767048028884,5489892950051118,8459030763780763,6378698863239079,2139972793199891,4839776492234295,1664233736019377,4302688789454772,1552346027179957,6683684483448759,6289250306998201,8582308617120898,4928711831676966,8183890658828224,4207308784562167,3837535974301645,2356517124693966,2627496360165328,2613030727352274,7728231136058019,1124527427567573,1293591050436567,3029102248533976,4723226312810457,2885934553844578,5253305103843294,8180400488517424,1096737336754145,6261567793856483,8824778339958756,2690938712424423,5826804855974754,5477156966391785,3363047572652012,8799288455266285,7104837153447918,4652397223657456,766209704426152,8407577884444860,3944568101470195,1574739795419127,8870216540921813,3913811695816703,6542460641738748,8710152142805674,8214620490932222,6181664778706943],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/8b5bef6feeb06603e70fde66df521edf",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000532595.1/GCA_000532595.1_Stap_aure_M1440_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KI972569.1 Staphylococcus aureus M1440 genomic scaffold adkNU-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"8b5bef6feeb06603e70fde66df521edf\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,6506000896569401,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,3234534336884842,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,5378024996409363,7199198146764916,3954324893139065,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,4283429268783211,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,6457552004919488,4275434089636035,5392923544264054,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,915883713245416,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,2345917413478649,1302574224109821,8212410875969790,2012844047311103,6276844254068996,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,1100178234351897,1613233089708314,1398163635020061,2660901546139013,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,1376387293671841,2968451845775780,2246725717416689,8952362163265966,3299864180793775,7745961481458097,8055901273809331,748884807066037,1161869623943606,5347282112979384,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,2462394055594471,8940994346209769,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2629375616291319,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,888109297701394,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,8246219929334314,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,333806946517562,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,2591352585302612,3677235441902166,8774502673891428,7863282501620314,2499002377216605,4888768950592097,4284868748911202,7016685056307815,7180711155708520,8074218591388266,4363284863173231,3939017814893170,2418223084651124,4891494248387191,4162813093515897,6047329894011514,8556996361134716,4194303986672257,4260895368577666,3662919159013483,717815503766149,2166267691369095,4658866579997320,985997338583691,3295996253844108,5223980807856784,1430121092358802,4627768844518037,635178958910103,168049742848664,2877754653855172,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,1219768655680734,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,78000814482148,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,8927309108653387,2642347481506640,3043432314913624,6709902552658779,4372354774635357,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,7589956941211795,2413571986957173,4845781658317686,7509411440202623,4117238218216331,5547694202340241,3220718305670034,1314889990042517,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,360504095483383,6177526526477266,8076461447820243,8815769383846869,8794208264791002,1863456533297999,1338323295265756,2994560223626205,1953886652294111,3428447854789601,5274301660094267,7027985096934380,8216853956002797,1625254992364527,6176712354587633,4752895990487891,3048526863073449,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,8523349380506658,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,9173197031722616,3161510797841463,6664851025699898,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5906462950118488,3730400047403177,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,7498960818033784,851815340897403,7973286791894140,6432046918378622,7867843017488576,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,5424923310544019,1890986035680404,29860417139863,2086986011604127,7190948106835105,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,6676116454906435,4227702754264245,5623483114239159,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,5522533494168439,2781157967312077,3864648699065550,4304771496076498,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3863448372494395,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,2864627209774636,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,385907700483371,5728268182717740,4911190400468269,7816698054288686,4110401245517103,1329463919809842,6261672364234035,1336059428508981,1618472691987766,2262947123078456,3333979680154941,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,6833222729797864,2952168537830773,391700864198006,8535608270551957,6713487310972290,2218257629603393,6570381896951176,1982265176835467,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,6101035983073523,550323193349556,9063963446371766,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,4003215957845454,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6445091345761787,402247873566207,8952231969012651,5077643932915205,9086189712409516,130457181976075,4396323642545688,1603137902355995,6141646980806917,2376738954628699,2850576000013862,319524505622058,5799343132662063,7502333181040182,9189100481070687,4620747332527681,8068985491437122,7476293558784267,7530221302335046,5907535925622345,1106191012378192,7177077991245393,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,985626569586271,2338670647686753,8906959415711334,7493001730442854,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,651657068725962,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,6497917926444676,8143513944316657,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,5553553040481934,5360518378600282,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,7190985601980267,407494504056686,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,2266518188165352,4579041725200255,5257396834191237,5382715700053894,8245677561885676,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,6274847488566940,1800517128877994,5300625464223660,7687547568949165,1586163045525149,1351605086977997,1299923441830899,3086808181540789,7046481273812920,2382029668347565,2009369612101575,1229878691049804,3089495541412855,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,1055754057562072,7039911616343950,153369867168896,8286237998987231,5920383623823696,8214132091116539,2783293737744357,8189536530413545,5476876315310060,5612209855076334,9044286231537648,4725106938598002,3001959122151417,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,7845638252759060,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,3404645514262587,7805354275301657,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,5090934684186756,7647986012981381,1998211285457031,7821296065001613,2893765109098643,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,6300248156747957,2736562014918845,4034678905878720,4370251230234817,4938927696959683,6585493558229191,470023763785928,5902059711862987,6932846907687970,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,6152106369186008,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8910676381798199,8292970583906548,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,1290139896432922,5250171345791260,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,4363526816403428,5085323617671478,6128252439805663,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,3115016475949391,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,6247490209868140,7630230196581438,6259851054508406,1525074792253161,821362676717952,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,7831115821488550,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,2098062209071580,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3054304020027890,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,2666970296883712,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,1912994901379617,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,5935630862422453,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,1768705500031582,8361022599817826,474326943902307,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7505984773102219,8603296405064333,2192532495772303,4909849541008029,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,4461197842708983,8334953150270153,7277156913728206,3275110843738415,9185892931558825,5402584754821847,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,4952730055523057,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,7604479172066058,2760855083342295,5791949031062287,637717087886096,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,6547833949292739,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,7088305201981920,8711986948082498,7467931263134177,3950687240408887,6821187116937698,4133002593487694,122015909989199,1635651637476176,3989388368871224,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,292057775278959,7255001061059048,8934811836040339,3408611869207412,8441358375734134,1164683235056503,1239923617995242,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,4360520181401411,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,1169438882554352,6086204123819675,4797301698399142,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,2413290341751739,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,2361765179657163,2350571174063052,8647056119409616,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,7469817883450350,626168875564015,2573596889369585,820079529219923,8045422011980286,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,2907874448857610,5356878132681790,8310818656353346,6855779845853707,3711070083308612,4882578364685381,1287098760653898,5675714913627212,633105738161232,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,3028319556770914,4926861423238243,7390098272967783,1960247201090669,510436895563625,7266335543571037,5520592147606656,7293093929815232,3128705817382019,8158821542825094,5256643637594029,8154746805587084,2669250979570882,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,6464427475104966,1238619339054246,8494210442632362,7129634646088877,1515192525290670,1513303246449841,8875968855564830,6086409751379126,8707651019648183,2771632487820472,9182108430318780,5107270389779645,4632781860469952,7986770140512118,8783786815601862,207892688386593,8197445232532681,6046314350030026,2360605979561163,4803260508523042,7464689979698382,1019530360671445,4086615967075543,5000612806597850,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,7897782769245419,3430108296223980,7666194411646192,1378102746791153,2688817209527540,4298859764904490,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,976293987540186,7858357380701472,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,5699252652330325,5890867670273372,4856610212101475,88437141712228,1945687604256107,6204666995137902,958802972458216,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,8792974406386243,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4836608690859249,6550313765640092,6403894935227820,5926443562442162,856884970847672,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,4736904158449123,6548287328611815,4368166270504425,7864494568558061,4717078305738226,9088616725393889,1951053797429874,1541930783479721,8569995544546809,3152905102806522,4285562358224810,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,8205328358469135,7906524426948124,5816011168292101,1185378970902048,835582845963811,1345534315535910,6675258019802664,177161577352745,7243701472849450,3700712461854642,6152554647457326,5619546432701021,8338634504957489,6930698324287026,5679039857864245,5168981785230906,8453583119834684,3401051871010365,7906973945146948,8763164838227526,1059006959607370,1993005114900043,1251060182680162,7682210448059988,8497320404037205,5580264614796559,5603043202166369,5862755334909540,1286345701920361,2069399351119471,8084476987051640,6355524819209492,4907233847361149,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,8293699458965128,470083491171980,8059723177205390,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,8753212753235645,6133069365415617,3555666348039874,8660225691913923,2588162975686006,5816608308592328,2300314053840585,8728167376662219,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,2169107663986396,5224110063914277,6428061299113696,984499184574177,5500657232277221,2541091443550753,3834083608280817,72583097564915,7041236094631668,3931973464080121,1553419814780673,3155522989727490,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,84834187095829,5490276726882074,624885245548506,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,1203079434555191,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,3429891841847111,555164866154318,5640100560236367,4050500137410385,3467276601790293,8920696233860951,793823372574692,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,4889885700898667,2241933783404397,2427434620065085,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,1213457523695486,4494558117785472,2569719125127041,4848772203458437,4607325484564118,8599745542954899,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,379350842564556,6562173042917325,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,7969431343923191,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/8bdbd61dd2e99b7716968338bcfe9660",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001028305.1/GCA_001028305.1_gdodcwi04_v01_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CM003315.1 Acinetobacter baumannii MRSN 4106 plasmid pMRSN4106-6, complete sequence, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"8bdbd61dd2e99b7716968338bcfe9660\",\"mins\":[8757745588109316,8813955913481558,5541473772335112,6671080412463116,8299362507427853,4891197350350862,1292920291631120,3429340745846802,7302311977078803,8813679705755670,5404646105235482,5378157474930715,3231823626928156,891464752373789,6475953998368800,6120833708240929,454181991235619,117782968741924,3998387213766693,4665219290210345,488896446894125,7575209607286830,7365913191323984,6719778623017010,4247117078220851,8156161492664372,6541420408905781,3998532803280952,7439413900734522,4520722258092098,5585335552041027,8984594707990170,7915102941918776,2120677284352073,5588110179627703,2515641832296524,976347927957583,1671489536483409,9142212978278484,7518534865377294,3370776724414552,2240459064025179,382210689966174,1537579130418533,6389645933505211,7659229213600443,492981366612071,6649798338855023,7759424718729330,2576072623026293,6047159181181053,5319376457965694,5221576612712579,941369776025732,2342644280971399,845725990613129,6288050174242955,5597694849294478,2281351507169423,2845512615956626,2230993997955219,2344662116626583,8953232116595278,319429205397662,3138201915506847,5021126274867360,7062399327297698,4790426499526819,3121494371782820,5018077335892141,5932936724877488,1457429579833525,658824871170231,6062239839703224,8426862289653945,1990348375106727,541156594909374,8874967627588981,1558939958403265,371806036046018,7488073850085572,1916785053503685,8329735357153313,4123806102409416,1535509646319817,1350249630761162,7938063863311752,7323469603926222,1223386649463501,4649903700959440,7830633741914147,695465704464420,7034736136262351,4343790555152421,8995314149011680,5899103184711910,1441070678533500,8739804342202605,8844275300503790,3563153345343727,3623751600488688,7148391783131764,3581098544226546,2651245557584595,8943991890551028,3574649936707835,4182716575240446,4032051372245717,615505945907458,7771457501718571,7878368543117579,7341939211919628,2369021456363789,6839659630899245,6502303808868625,6913616743235862,2570967554011417,4799514403119386,8325022726910477,4475801955504413,9040018063515359,3464003774875212,5425041953362209,4255969162006818,6074976559685923,3123219452809510,8209261265255537,3437741546823977,8195952952112857,8351600513204525,3337647139594544,7674596706365745,1138567244214581,1265973212107063,43709329039672,8228202118240991,3906189182034236,7807650858164541,6641870805435104,8721146026798829,6985468938121540,2981409211339079,149537560346952,7031398816564620,3527846512992587,3440242211138274,5462146422030670,5401455819776056,7327497414390100,8810997225794959,5881410430103900,1793613271593309,710504530366814,112324569416032,1182729880727909,8185777113526632,6970581835050609,3939224511983980,7501730503873938,1123266837635440,43720848507249,8297708649656690,3696515745235315,6120254816993653,8879979808364513,5701021384528250,7668960493584765,2445686666059157,4326299762395200,2799871887692163,7552306166547212,1174178706624904,6750314612674955,3850130208952718,7904503228588531,6489848494476696,5802550589354386,6365962019467667,8619923695210902,3946267222163863,5600621952364958,1919601790189985,2443253592199587,4040050176176548,863267863730929,5568416924103080,1092654338863534,3189081727898032,2572824047604146,1277697083540894,3557207336063415,2094133736616377,1032245252309434,6453214157131167,8160422900040124,1710275183493565,3749234727813566,4842052239206029,2885481322443201,1343119917539782,5066120767386056,2062980109640141,4569952001919053,7092559117500881,1156252240769491,7395112247787994,6808214708932687,8881619351004007,282130381345248,5946893571351010,6968268142740219,3189369248268772,8788366528232870,2620980705194065,1633612760801768,9185546598489574,473524408410603,6486589759156716,6491643301642733,2519079664185839,615850753548786,37376706245107,3264564156236276,6754222898889207,6908885927948792,8420366429095780,4798889966645755,8221677274862467,7026954303828479,7385868417653504,3569912952746498,447194760487428,1046099129545223,277217363358216,4112695516160521,7099183693730317,7141698505794062,8526889157440015,8829884413946671,7441596396412596,8570616685269524,3166148368209863,7115676101493508,62519730946821,5966402271314464,882823200293409,924975381750306,6699553971323428,59018722005543,4647250656207401,1117508026630699,7867575131001396,5378557211443766,4499121276924478,5374001331175999,1480026293633601,5999680069333771,8632119812339809,3888484608746057,1282030356066893,6337674148864590,8156696966582863,1665243572249170,4389468770095699,4700329797891656,7410864662233687,177836967408216,8013089547989092,7844830018239884,2969283385688668,6168243113534048,2239865050714721,2586992467063400,2214895889498738,2815168044787134,8310296381125240,6976453611434618,6147685850202748,2932343301561109,2121238882611840,1199345311974021,7788097624625283,8524491787944591,5404592418132625,3572256655603822,1899977179144854,243702193349272,4629307963298460,3505101468588826,971586476057246,7304416264073887,6217622150632096,3004584167748257,6906069264798491,7716643765679558,2384381491200680,7444957754252743,8173340442358447,3861475659702960,1180468225098418,4240443692745395,1547274787857865,4794154782716600,7396719563200628,6509437536998074,2409857410807242,2428948643840703,10192046142145,8597279320621762,8312691852571331,3666603827180228,5138555310301896,1949454307963593,8476553529942730,2337852421522127,6663295869084368,2679069301714239,948576151909074,2095083120603859,2831484674675412,6365808033465045,5576996854674134,2258075009037015,1238994794136281,4248636608967386,3739197973361372,7506903127230586,5721075235721950,8466536165358373,3575260968354528,1628466313626338,8083181782285094,914904817892817,9048884234343144,8349656920810217,2678580576658156,8816232169022192,7136382147896050,190026078601971,6177622505554676,3342726386176760,2895845106639609,7252112901387002,5696868085768955,4402948718560042,350362895622910,1085475393704747,4009776347141483,442977858757381,4132205299983111,5399339151250187,5025195542364940,6713648278045455,6825852616352530,7521032876507923,6169937826808596,2297585802634005,8847010064891228,2165524957260591,3681479835374368,4014416337812955,6498007100725382,2672197787517734,4975442418758442,3202729598477099,8399480038856213,6608888707253037,1041579883021102,1960626958021424,1377851646845745,9106112905261875,3446746715738932,7022246462743349,1398617425613622,2154140773361801,488128636244792,8494304400937785,406438340203322,1580869239169851,1295274058876510,290639733280224,8708758993249092,8095660863859728,7421433507929780,640655978607436,3092112651645774,1005377073038159,8498998175691604,1502672049283926,1945063063110487,2876188033987417,3291983806605427,5915017963896975,3208678157214557,6462802174664165,1812315206267744,7486333928945808,5761241966363491,229897556398949,531845325140839,214601581069161,9061180733469547,951531287745391,5702027847603057,4472453515424633,8944314896183773,505062753219451,1893511799767934,261844342797183,5932418746762112,9167132709163905,762902229148547,7795981357466501,2214909626602375,3468432959857545,5594135368221579,4324061674689420,1830261482488718,1108259250757101,792307096982417,1760826070942611,7425093272317049,6612717055023258,1590262880781836,6966790484059040,501872009085858,1913831387018148,5421297181381541,4831467683726247,3723890736772008,88637230670762,7753219224714055,6858882806211501,5314676570227634,7409558356767667,5649803683557534,3772912462504888,1689439999288249,4241847236215738,7905999207846843,6135986892427854,5754824483129268,4650128117158846,1670137048814527,8357169467999170,3057401079464900,4657030379406279,5119663278109640,6047716646882124,347672060364421,2286804284384209,7863680146395299,7927340175373271,5071434328220634,5771542761874395,6482889267917790,462277071647711,2146705006830561,2123821028052782,2019237027394533,219101627151334,6821188556788711,3352786174206953,4116864957895658,5036259833189357,4797522342675438,8041960489296879,2119688815571955,7305251641436933,304360781808630,7068573615866871,1398904249578489,3244306916230143,4137299424011265,5350134234113026,7480103772103683,2068143625417732,8133282013954902,174088587695112,7354363808773129,5967937695106058,4283677877498896,7177464597046787,1058736324916245,4317069979206680,5582548011189274,7474016249090906,986793099708592,2038079634138146,4421166914982948,8637453513798694,2020520575648807,2242308151759913,6909055695090731,4220668997723180,5183402545427504,5725250149532722,8001119577895991,6355168943572027,1795611226764349,4516582152700991,457746620789824,7997490791535682,8596383183841462,3116389427434566,6250423501399112,6124713796765196,6708920620287050,8799233896350795,5463376781501519,2914037979288656,3993807421294776,1245652680152146,599994426967124,3092897479410773,3608458713232470,5745123286189145,6542540030231645,4647533517632607,5287769861375072,4590205453288546,8541537437480181,1097845528290405,8331516223982933,1785167954005521,5601627950797928,2317559662060651,5382000232748141,5796144834532465,5974590019219646,3930791653979254,7649975759864681,8554611583280248,5377966799357050,3453200194184315,7511078060398101,4727516850721922,3155566994171011,4875925668294494,4034134175392902,2838528189075649,3822012744041609,4599701371524234,869374579512460,5203039712986254,5040566925776015,582545934550160,5929400162051221,4425893343180313,5797334070842520,833739366216857,8425940522054511,2160874004804764,1226121012708517,194660658795686,3527643486090097,6021884201825450,1414232214324402,4612171128751284,1156968800502967,2686712561226936,7480267081852092,3658239794771136,4760888719492290,2526197652280519,2289355550926025,5402816453477579,5245455405495500,5342369097938125,7951683636278674,5246993532137841,8470347319570784,3716866725639379,1710359809799380,4164177354675413,7422542680511708,4722687727842526,3029658946028767,6332925398512865,167322895541474,2248984702231780,2632026927310053,3582971232380134,5112070031803628,7730830417268569,8609626235028719,233733227537651,844676157252852,5121426803475701,817491968201975,2206026567108256,2651808151602429,7074092949046526,2550607369712898,541359322607147,1903148408714500,2570735830370518,8619371832587526,1333168418104583,325136628696329,181542846637324,7357846573245709,1599595210212623,6290809713084632,3761957586588947,7987244587062548,877564167333142,628696623030489,6553315127420185,8434889396833419,1707761648764188,4227550588344538,5909109466287664,2197884296680739,7397168491042085,6300988723004710,2202348057445671,2126359149147433,38370210731306,8899620076209031,2963304906106156,1068793632216365,5092347071871197,5139812837934822,1256326370305332,5570832541599030,8478876848831369,1483458098824504,1303139741074745,2035497434764651,285068429800765,6555120292468034,2749988640937285,2864936228951366,3442336827708745,2158788708152650,6168377757976119,4983198126921037,4759783637439822,6912821999613265,19188431938898,1732250518057870,6946041268352345,5586289053006735,3888522879112541,3715424025191774,705275396473713,5089540320086246,6702580783027558,6208620883432807,8050697754099093,1639698515121513,9143648440289733,4001977578551527,4538394071422316,3024061787051374,8902770070979475,5995636510004597,5047660958124265,5698808449500537,2495113640283711,2689320547898748,7918468451931517,2598221659944320,5591554332820866,8643680819365441,3526291617027464,4009132912592265,468369521284492,2486754253749826,3542510713861519,6796415852553618,4488057379272942,3075213377463704,5801921525106244,564613550466460,8260152714368413,3730187285501342,2459357963691423,6741485414749601,8575975529462683,6080349068178853,1853774718043559,7699659625801128,1738393913886123,3517484546725295,7350673750305283,2528601577616817,2968977689519538,1676316924167603,3686872063841718,5244096501630393,8185656159987130,6449791738271163,2447397642413501,3200609564607934,2267487667631552,8397427475841789,8710347175441861,6964712872347078,6643831334804385,3747281338455497,5393352544331210,3947985583741175,1591413830235596,4471571195737550,2776196595818061,1116022533203412,5781044120716761,5992670450054619,1730408465905117,2019657513240030,7206176971523552,6603023532512739,4024458151626212,111779756242410,3785639887267307,3024918768805359,6398652143756784,8191064643020273,6870250500785650,5145402147734373,8124492767254008,7864296758273530,8878539811567101,505364919653887,8857864702356401,3040462407579139,3995121241633011,8412309260756489,8586529174706238,5812206717662732,3226568614336014,3948808495683090,7945899188711683,6116838884632085,5247135062619670,2796065161795097,175782660081178,5578679005656604,3195378948507166,5173849600063008,294990201665061,1117939240871463,8214865030116905,7135955507509132,3401796986201645,5962613100590685,1207986740733534,5687258363274806,6264658933082377,7647183139290517,7757213016664379,2702003770725948,2499169427923893,4975719520278080,193960566924865,6050824296416836,3550628941817415,3065501495494216,3176977481573962,6192535931102796,6210116008633272,3875713497204309,3312740909794903,2879415806518197,5445232313357917,6236514402166366,5562802044073567,1896018465777249,1026102297425506,1771371671090791,9066919757082691,107069092685415,7531141131703916,5857795541169774,3410159249688177,6113508923782078,565629026006647,4854781964863096,6147351616951929,6074245905929851,7459553045145214,8355150181099377,6816479168829057,6561626909093483,1839789219841371,6085191965333125,5587142841382534,8448864850073223,1859368184686217,6450090757625485,8728409914234718,5819710861325970,7095814019591860,4674473771497070,5964449303789849,5411437615707801,7575499977991834,5271918403348124,2643223982683805,612777807088318,5290803440854688,6437379667392162,7477624262465187,3857552289416869,3458255222138535,3149434142029480,8266277895775913,7639741697107665,2465239241451182,4336757082495944,2317435951597236,6507753939945141,1202433074452151,5555134979012280,1754832287647418,2425194666211004,6604325275535037,4513417178896062,7418196081712757,5873679033738944,3081128215488199,8919235863164616,8718224935810679,6224463142471375,3814148394649297,4661441603348180,2388174316074709,7911973238097622,6932958119659225,7079472694795898,8342314374002398,2979426311993055,4968742245000928,2310991938774754,3440348666488547,4025367241762534,6219879427732433,7633032752482025,5695183613429483,1177946929444589,98012912633582,5038168482395890,675962781869814,8807542998229289,7884789576480504,8737938926251422,8105348680902395,4360136718735100,3982326053218602,6101387614557950,2491462741590962,428022669403904,8101665139877635,2532592666859269,2431027429820167,1721459956979468,2088555747550991,1772093084911379,5715523729770799,4542566070019871,2882354552272672,2272420497753734,1860492172458289,426756071020328,943132709836588,2507876340655918,3855684271437103,4083936699418421,4864664450299705,397034320443194,8140507117582139,7050045401384764,6445265780504381,4275320193369918,5335054735130933,164465416124224,2167945677813571,4394310079895365,2231548909872966,208287816148812,1386038051441634,4160060367443597,6958666025686864,7038354877400913,8764397652006738,8367137776678654,3404431744866134,3860969040901976,4976516243220316,3378641734367070,1353335701075807,8471622728492898,65766715299683,5291568000522084,7991354860294970,1226132485406354,3653613386643313,5040609057040244,3366476030965622,7602046333187961,5266490516445056,5405683809339266,1616427014330255,4808095820232588,2902337458829617,1405541855757293,9120331989089944,4649363102459794,8874648959461699,4288155933910933,5727618948736918,9041710011474244,2499521524066202,2735099833157531,2055218748155805,7519445762955203,6422672764766111,2268976925271970,7738404772906919,1057125785996956,9090839575290714,3924644067186333,5103329747408816,8401851795083592,2676094026486810,8043112174887923,50231029429853,5326067265419189,8401365623510966,7187163980327241,7822644131952569,7416376995256251,3078494857865148,6292873885321153,4858973914388418,7189059021654347,896450783434695,4524399109199817,7293050344516799,3803648449538002,6391702925907923,6440780254607316,6157337709631446,4150193961359319,8944870450130596,2598636506318811,4384617695160284,4443248811763677,4022863965366240,1374736294168545,583948023097315,5869221133105124,8456618711123943,2851626112329704,5752222170548201,5260230813939690,4592832641988589,2335374851721199,802894694762481,6571418702759922,6809949666379767,3397087678711809,7902229149642208,409279686853633,1926955816413020,3230008619431946,3104506928093196,3388160933189645,6602608803232991,4731787703228432,3013142690355544,1340669881595923,7509844952471572,2904128148260887,7729990048561176,3709732196231196,4285506138146846,7739527297608709,3980508881242145,4179238039996457,6166121159559210,6108578675714091,6545027571599407,2441116443200804,7324711779579960,3741720047134777,3629803956021307,8229572450928702,3843445037566015,4151527171508288,6334551925209153,8253364142323256,5667876737443914,809106099226699,4400741631948877,4600683712195597,659413527283794,5018817472444503,2985127976265817,4906751259093083,1053581526923357,419901861304417,2410350063302758,3476848574399422,184910045517500,9038972720942898,5972384858810477,294452513122414,7608680620983997,455792092424307,7109702898232013,5631036446521461,5907035971500152,1015099407915129,262813037480058,5045965136836733,3004532571097214,2975674590662188,5470244022970496,1679398313130113,3519201004517510,8236758772062344,1236165158832265,2839124983381698,5684410491615375,6343872921004176,8244752210483795,8203954998188180,5793800050776215,2474052686747802,1889099847035036,848782386464925,2863996704237731,8188598855932070,72033151029617,4468884120651945,4659964610267309,2019107382806704,2809715951450291,6240207655065782,2310756244596919,2426488239077560,9186446765734073,6472412154120378,1012685764851904,404257221925057,7322843665680579,3812020855638219,8032826457766095,7895462134098130,8747937698412755,3079028063492309,1096223361292502,2712677712615640,444438812891353,1077943002507482,5683768153725149,6538133088832005,4661845990787296,4624200941566178,4587424471587044,4467129976744165,464866107558118,3281893823580391,1412824217708777,3738904810014958,5819952474368241,930908654741749,3992652833736950,2398036707832873,4266558878247161,8134131150149882,3485258266614011,8001162687256278,4815366094993673,2410334874482954,2324532356299023,3299027854276880,5965968511351057,6428125342211801,2571678924081432,4380686250211610,6930371027011868,7326188087314720,6807638953257250,6622562766289187,8322576780912932,688559024130341,3130606410541354,773414429284743,6692313738189100,5390837595657266,2344829848164655,8580625138559280,1944755381508401,3076397614410989,8975564263122654,8679243281881402,885514339903803,2255197709818173,3147387273046334,7153319120136512,980997298436417,2179556145867074,2064439166736779,4430817028127047,5825406975256905,1641444504914251,9111822880758094,2452569199266189,1847944179747152,846112394793358,4498423412365656,8808267395762522,8382250251643228,8225450583734078,7256094313875806,2615764417939807,3809563897305442,4505100867172709,7001525575883113,8987696722831079,3069990577662322,8512820956662134,7412378645784951,9149056125934972,4576303136242042,4646390648822141,9175219536165248,8295209431366626,8393110942389801,222483777542535,1123083601394057,962267263015307,4534698136369549,1981089547990765,4614587353938323,3196166930337426,547430763477403,8449598761584788,4771513816676766,2355738008017312,425888309782947,8657687125099590,5735331629951401,4498115045570987,110578163542444,4105185406060976,3595256717915208,1000334650162413,4889607805432222,3675233722231222,7608338102901178,3599782876170687,5925340087908805,4140191993485768,5782192790301129,918455144183,2897310463789516,7527430701521922,1882153121446350,2486789950331344,8886041867926317,1630211689245141,2997907419006694,8119819222340004,3501766397543503,1813043985263074,8763321205811683,6558497359448548,5058746843417061,4651143395682790,1063462045321703,5959474783431144,9014246414477801,297476061125099,5176803442616819,1883181941225972,1875326617290494,6481832624568745,2922645562292735,3893952876608000,9121933972924929,1700061399808515,6670219378571780,5094718010411525,4116729374036748,8222445743110663,7895113244600844,4545360200788496,5512333892909587,6085694503365140,7450370201472089,1112458131143195,378294798920221,6999473038678559,3502206346463776,7419383314651681,6576361734457890,973311078554149,7851238837271078,6919205636589319,8498623585995309,7383961299530845,1671548973205060,6720361713670706,7722646054458296,5531136114518585,7307105369524796,4550797856041534,4196081591310915,8420977950341700,3910805388569159,5912983058667584,2093899575786060,1215589489650253,584201965206094,5840468464810577,4911099995526397,1873173155600980,2586197490985562,2388725271919195,2489493377083998,7057266646051941,282081405377122,7249252955587003,8197311531580005,854878905829991,7781019974726759,956165699529324,1335963601320557,7216534883685480,5271644305820276,4291772542884470,6856596376488739,4408624441608639,4196666325805692,34584861981309,5011042778933889,6553133450107523,8711959152781956,5967218836744838,1912859369202113,1213833065503374,7555607540196662,2649540752997009,3473158301211283,9029818893527581,8566876259170968,1979973436271259,5207767421123228,6475731381074589,1451263424951901,663589331405471,5021125357779620,7899731005901937,4294590606633645,2989069630967581,7524646304774833,97628710116019,5599947026782900,4338127945112245,2114788689951418,6036236624431803,1112983618222780,1142579350989502,6008587887774403,7862166293355204,3799758852352709,6112561920932550,1005352669702856,3632142612220617,1609735960550091,8620206985870028,3275413456001741,5536979225377486,4068397419567823,1301392240028368,8700054471019218,512811814120150,2622904053074647,361113832585945,2057056656337626,4821521514728157,6661306190400223,2990897161702114,8950069974230082,2297849053226791,1728247148853998,4061516845030128,2229400174611185,3471179694234355,6224072090872566,6087504131033851,4836175962233596,6102857961868029,4380963206007253,2477951409310464,3456098105223939,2637531495992068,4119771461864197,2664444456258311,6475679946013455,1783837213670160,1376311004273429,3705977457875738,4969458433239836,9132517909552351,4692207985965858,6553740990089445,3106728150117157,3558886836734758,7110824273861415,3224894176328491,5085790451136882,4510896570817326,1483142623812399,4790324169030449,6897621473513267,718993863977780,8021909895208416,2096399693040442,3162410717035323,8796964038011713,7765205003578179,9141997543844676,4418522350287685,6848505461148487,8078336265767754,1871554430745420,4628775111787323,2440390243547985,3689935833209682,8817802597545213,3739520407735125,7300218244925241,3847975807605592,6568006973268452,23325603257180,1421429390318430,5554011787586399,7394177155513184,7470842257927015,6934837888228201,4446367609465805,2439122391501675,3428782589758320,2404388378548030,504299324902263,8451501298494329,8922982978512786,3040354687687550,6744830144403264,3048962852776839,3067596576693129,3924796231060364,5360661354716045,2216266763205519,375089202514832,5537028537731985,7623921295376195,3281807020166043,3204261448346524,1934187509255069,2501452209309509,6687748374514592,1259542543625121,6659128357051298,2017576256715686,246581408816285,8172092260830129,1845820077718450,6484527543202291,3789527918873526,8440202982050043,5553573168056820,5937350208388028,1786198334966718,5468635020622783,8241206012599233,3098292069469122,7944427343113155,4391675836124100,4535912688054581,2040797906160584,7882705443127116,5923595997731788,2441862990302157,833753239108559,8032688618298320,6261490775140135,5945034235837394,7673045359942613,5656143716121558,8109099990289368,8932275206093988,9007554857619768,1564462819417053,3604040076426207,44609514728417,1758264051022818,3525009279586094,5699008485710820,6018154837154789,4747726467202022,8555098905824231,61536631258091,5559436889639921,3774870154050547,8125434999051886,4045412429335548,7049278521713834,6482740479843327,8147097965196291,209687464782850,1875687943326723,1067410565991428,2638519260333910,2779297968098310,6929624073636876,3934614435488258,5085462443879438,3967818134637583,3611695363079184,3380489327495000,3816358143966226,5149395694041603,5896880682859542,7061545100201817,698075507051547,5599636316650526,1658763296844831,8451679842868256,2000010809707556,7097260343893032,3837185421915996,1853429426990123,802779929107502,8589036098296879,8677658994517843,8750693831422472,1555281141292084,1195772908809269,3412113454910520,7208717424116916,780402208631866,1228610783763518,8149704741362752,1113111541431361,1389893927746627,2235807341014087,9123783908726913,5490322363188407,4914598086745164,2186230588132429,2137211153747023,2526550245657680,7275945499790417,9165974787499001,4631755347037388,3903461488950359,2727229049603940,6773885884595291,3667652661701729,2698862967778403,4657734269226085,7331479813397607,4525118670797928,951706224125007,6915920132245288,8428423012965486,5088324404591729,5138578338929785,3227978329185403,5683787747523712,113074066623617,1472873439521922,2100638718553219,2307646815169669,4077643206839431,2685515096849544,8809739887193225,8314761805085834,5797343928597643,1833418565680269,6400797482519696,1139489963658389,1214088013925527,6494208028155082,5923517556853915,3226700670373021,4053587952487582,8936950534648721,3874551960419489,3233507989462178,4129318292671651,596847221918884,2259070784350065,7339422979628206,8055664400059567,4577847886613681,8728939785227465,3719895753739448,2299156100533433,5085162570994207,6149844300557500,3078265496943818,3033768890019006,3678882531925183,6934277968034336,3803758111231175,1636135679208652,5277306525215946,2533703346302156,8890525397215778,9214129193995470,137256719664333,4407301122202833,2459349824493074,1158899557686488,317477997972697,7228181767208154,5870409928543455,6404749695704290,7840780851600612,6164917204475109,7390473431899367,5843250442276075,1421213882903788,3002272074951917,3682933546622190,1017881939578095,2727590714322160,3895710414400754,9040648270440862,4547280622099702,5043150754839800,7944960602158292,1046975406947578,7795016770756804,7087654345952583,3968654109158657,4711067263073538,8238037952703749,5260306592095495,1929882175028490,3127837087453342,7426733239188751,6127578590063832,2014030732332306,9096781118577943,1861070060760348,3663896078093598,7092681844923679,1976670927858978,8968203374218531,2659119107374372,1528380433513765,5390166030986534,9162418690993184,4261649654627625,8613603267548369,5308497278737708,9124957346396722,8222365405547823,6971682463026480,5252454000209800,7488952018914610,6112102855753011,5871372919291189,2878527951564087,4891855952645343,1962025874922812,4602895335238974,5813108614913343,3540270580329798,2606861031759175,5442300700507465,7659877557583180,6473178305125709,1826833659754381,8239535735565650,1492779065789779,7332732188061013,2926648757849430,7909935352341432,4162372769328264,5337180767698267,2218640333012316,2731455160501920,9164575986019680,4177863895735650,1397981449727334,2825735627648360,4207328282688873,5636383874829674,3163167136804203,8020274697443218,6665939542662520,722492416159636,8334395904789884,4489602371173757,4789166072753539,4482143524853654,6536626501570006,4974328803192204,8711948489547149,3155855560080621,1545342310210960,9146646562636355,8223879369665940,1896037389663470,1110395909848472,3254358942670234,5572542255918491,6180263996696954,2909444612472222,3230971073240479,4724433938619810,4464759533952420,2438073117531558,9109041479490988,6886036257324274,7721140231203348,5876130769980852,4199627940593077,3204862938410425,234773305318842,3083110514134459,1267545880858046,6773372274212981,1624347228401089,6905015154666948,6141962211954119,2671067399740872,5311098976320972,8784511908898722,8957988778808364,3670564804922832,1436692048362744,1302655960935891,1192372106739156,3400361368088021,960136436112854,9046249338731992,556319312231897,4583254916005338,5228949541363163,4380964209204700,7702210465384617,3542295576612320,3931795554024933,4336163550838246,7881002337356369,8302604472815083,5288869525491383,1724815169764846,679360774132989,1745982849285619,9003320892476916,8696231010061566,7447630947872246,975417858299817,1870360950443512,2714303069707774,3657990052806143,6886890991633198,1644148380086187,2679814504390148,4795393552010760,1738745423113738,2032049461235211,4943743921729036,7913849739411129,7852337549069838,1614993670120024,7091825260288335,331133729795603,4760074817416725,2075550237474327,3948850569780760,1689537896779290,9118086323043867,1642405104287263,3341638435542960,7035769763207122,1677574538120743,5791295701417512,2940067051621931,4835287565725228,8165079119564334,4939755241848367,6367141629615664,8172194914005765,3378478990662238,7423613803413047,8105544293945,2577872807751226,2889893556330044,3286901111733822,1662897005915711,8877602986853769,3257097119575618,6073909990981188,315059431371361,3113785830112840,5345662948091148,6362604811849292,4721665416429133,2096928267009616,7925709868912211,127747389120084,3280392283348566,4550937123192409,1187580344771855,6067872506089054,2432849231388257,7947292238618156,2458534791548516,6376813961911911,76573520191083,1716472092061294,830371954679407,5461000863039088,5178749507120753,235176586071666,4843735159692917,3522959105549603,4067647580110459,6381081526328956,7085581186698879,1396266265443968,851908377898625,79080737656450,1929984040025733,6829072443701185,1942513101717128,3039110292063815,8431080580843458,4272177026981518,7331591723482768,6344901165117074,4686785404026515,8419697295102639,2935011828158103,3298177536966296,4960310592179866,6816174395510427,3542686738869916,506323565526685,6218732522024901,8617629401450795,4761451335511716,2288465813687973,2494543521569283,8547528405991082,1841892429346759,4897666048306860,7792151398632061,7621720578346672,6922486007160776,1054211547471540,3304112652820151,1154688377794233,7148737623927001,625624575958151,3028001503428285,6545423854079679,7194833327672323,3770400520007362,5976464707313347,4022064116563652,4567948497997510,6405769148374727,6368987800485579,4999340326371027,175672684748503,3177191744462552,277180360154841,2788799774764767,2447294299680483,3426463707668200,2659030552609404,3205481757144359,6652971685787602,1550576627445487,4926304589735647,748116020113139,2664975241625332,1066163173404407,1501251022806783,1832734739465479,3277125395025667,6685861342007045,5814316680867590,472620061908746,842275838377744,2962233241186066,668473103552275,6284070315171611,4718551065014045,59673028849438,7696110071099167,3468139853885221,6621711105471793,7701177197682252,7824337298947885,1089817046908718,6654988036263729,8628838597357362,1139859193589555,6602804266078005,7883435593429535,5293463201812282,9161019746094389,6945444216545091,6324763420720965,5503057891888967,5822106829585719,920056880602956,1920671151533902,1497942389600084,6528739393408854,1892285979885399,1321237438867428,1332596187324250,5444862661939038,5861416851001184,5856495884140386,3535844708163558,5739327546179431,8774769415847784,8291729526553916,3361611106877291,2923875844603759,3476925976448885,5668795492765560,343785042423673,8593761701248890,1634670873337151,3518631821971325,1972407322955646,5804842472759167,8108260642070401,7638329499004802,1155366848501620,6450410234105736,118149015592842,2892318986768272,5353977546112916,5871079507263382,9009130018649210,5370966248103837,1284270858960798,1517008792606284,2850732051025826,2014030703570851,8294925454790564,9186625936711590,368440417656817,2129959883817628,4984283060051271,6798730118090676,633281886249630,6964773653344183,2102806749343672,1137284554251237,1413606754639806,1152885232476095,7063092140388289,7262684027045321,409332915208132,998057318860199,5838854941746062,1325292322078664,2975867002236876,7861251241037774,7107897494380495,8642772806870823,901579421016020,7871382954274775,8018436185164452,8041284760576331,1263539059806171,8266393513607134,2349639662632928,4088993209495522,1940380394962915,6543702431715300,8995464451989477,4429873213358054,206573390721000,3426472441233385,7951129825701414,3521869229659474,284059665076207,4781229677875185,6800735539089394,2687910789238771,3324371216474101,7575676785909752,8588689511182335,5727660260802558,4831859947529557],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/8f9573dec32c97fe824c06edaa16c979",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000803865.1/GCA_000803865.1_ASM80386v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JUFB01000001.1 Mycobacterium tuberculosis strain KT-0188 11206.MTA036.1.00001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"8f9573dec32c97fe824c06edaa16c979\",\"mins\":[8922595819179840,8107698973558784,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,5418062808039483,7448244279738428,9210906383863320,1405261972328515,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,5458380662771820,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,377871934709908,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,1175255165046942,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,8699493476897586,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,8759098068513068,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,5834613430713663,3389796438417746,5701223353913683,7917710442910040,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,8797845524066800,3456230091686385,3209607062733379,3134550890639859,9001200053843782,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,4137376921317903,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,200567419970091,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,8621946546385582,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,8317273743308856,1316623911576283,1441617725723357,7242017614672608,630218890143184,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,5741980657111840,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8446613904659250,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,7982695525856751,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,2876473268262047,4801093361738914,2735668332491939,8305475517826213,5337257462219943,8305605739410145,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5153860076094653,853042710275262,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,3484862622000394,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,401375166743886,7909480428320079,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,2017544242919815,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,4875820081283327,4092526301791731,1360710405096951,6524009387461415,2918737215086164,1396209862055419,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,1488198135089416,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,6332435649376523,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,7210704160082937,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,4664806243059342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,8794800954168279,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1232080265271068,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,6460791612430260,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,774375316289193,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,4011267514259560,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,3297712026566442,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,2689289931938043,7472057739445290,3919620721826050,5883036547938567,2319684329502984,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,5831782303045342,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,7789759667001683,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,4178271357348231,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,1083562831182273,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,1691698663883279,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,5934279795387431,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8257926837061971,8388192864485122,1820339870300688,6450898690517522,713692118690324,6846056453407151,2517828049861148,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,8407988312059771,8604592003787340,6080461698973453,2604591035267665,748229802113619,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,8471482656066153,1335106791680618,2607712702388843,5499897175935597,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,5594942415248476,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,3586889096317616,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,4347965398190108,4200556103072448,5048208825244375,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,3320688795671255,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,5252013332024431,3512269597022975,3371227852355083,824318627486465,3353033711752117,2545127928916740,6299628036135685,6059880236098542,5258456339528458,657735950363406,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,6283767821302665,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,1574557184023457,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,5368029799724191,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,6872915791329688,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,3853897425318415,2389972737829980,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5413956008035517,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,6701303819095037,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,3807266757341739,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,544430685777215,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8603409962310998,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,793191862144352,7685653964304955,553959436873060,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,6421296528170348,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,8651815331507604,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,1450867292335526,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,1485577514818131,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,5313850305142282,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,3725399501188629,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,872305360830382,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,7919257969233719,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,8215276774560757,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,5081905779899711,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7509750816624584,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,5842852661052750,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/91fea76b0361f4f812c07e7d43f434f3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900041155.1/GCA_900041155.1_7469_7_68_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FGUI01000001.1 Staphylococcus aureus strain st2044 genome assembly, contig: ERS073484SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"91fea76b0361f4f812c07e7d43f434f3\",\"mins\":[2282635019599872,5146675777052673,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,1060460441690127,3336512770453523,4304708589903892,366038575566869,4366044986945560,6433345649885209,5970779731886107,7000457640026142,7896021307777056,3907965771116578,4449147792408615,3116364401098743,6506000896569401,3863448372494395,7140729989324865,4230071825489989,2375917415634273,4660665155473483,2343748905513037,3818616056618695,7804130505932240,1928140813881432,1635397195808783,8044186767290461,5966751971373150,1028053574107231,8960623108675600,8774502673891428,5695996928335975,7906264832782440,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,5378024996409363,7199198146764916,3954324893139065,8104812828225662,8968488620206101,4823510936105092,4556601114480248,1840877050794124,2687238688096398,5940834273493135,8248516013412496,6423458840264849,4283429268783211,6060888221364372,8450313866469530,8093041849651357,4626104524247198,3981187881433797,2278346208018598,979588139913384,980192377581737,1939633497252551,3078563432313007,1816213056534246,757043825455283,1451999676301492,7999157878374581,7169548162306233,8260608504786293,4275434089636035,5392923544264054,4784671531708615,3896588604084428,6479806504648738,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,1293765200834777,5763937543921884,3342574886805726,5908374364680418,9100377281368294,915883713245416,6675745817342186,5445372293271789,1133486263984368,4410612950724851,2417632473485558,8091788112306423,549043327607033,1631611902652668,8212410875969790,2012844047311103,948489885540616,7476293558784267,1316115594879244,1655653727666446,2377197744251151,2902111595423998,3590799175020818,1803490896380179,7703321150955799,3098701157064984,1613233089708314,1090286115836191,7318609661925379,4034436112523558,4009191020419804,8091310037205295,777026232017201,8985645944647986,6922370832007476,2133264542323422,3871300378636600,4040110223393081,6992758984360253,7445078125691199,8895922000216384,4072587914527456,3674047191355718,9089878662127943,4886619860382028,1600279738216782,5620340898599248,1821374948897105,3947602212196690,4022123607998810,4425527205646684,1006677272891742,4530178457788475,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,135329339445992,481260299161970,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,4088699334455693,3734458897543567,5940376136597911,2972258577203608,2110937203020185,2243509869687195,3242446598427039,596216438858480,2968451845775780,8143513944316657,1977044871266728,3073170219135404,8952362163265966,3299864180793775,7745961481458097,740802614878651,841012279439804,2352267404956094,6689558235349749,2767098068603329,2674945199468994,4280139481391555,4335034824061381,3058448658571721,1262572732781004,4532841275367886,922638174302673,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2628535144231391,3405658398716384,9088616725393889,1960882994242018,2583875797723899,1178198406431205,401948343550438,2462394055594471,8940994346209769,726621958005230,3517087197159920,5706335401980401,4252686649659892,3908832524493301,5137838574998006,9185892931558825,2188170162708984,5911809211810301,2546695760749056,7070848760263171,3527332718576132,162688560886278,7497816545194504,7490818766929324,6855779845853707,2823650723037708,1342278520193550,3506453766344792,8111885282243091,6748402791805460,2792625553547799,1344680504189465,1893040465097246,68515416416801,2176156635736155,1283325847532068,8303975859675687,1287624144806440,4298859764904490,5749761984184876,7194270142693933,1297442792150451,2744117220422198,2644883506979383,8082439380873789,6161629781725758,4111671466041922,8792974406386243,861160734184004,6681550830809669,239261345014344,3204835458417226,5360518378600282,2956783960371794,2591352585302612,3677235441902166,5459191191773783,7863282501620314,7266335543571037,1251060182680162,2114917240898152,6240582334678461,3466699351597682,2418223084651124,4891494248387191,793823372574692,8556996361134716,6924058499905642,1337146668794494,7873500052288127,962398808360384,4260895368577666,4221257546306179,717815503766149,2166267691369095,985997338583691,7167030720094868,635178958910103,168049742848664,3008589367177883,1108575844749982,2868277602058914,2635086747951782,8473257377227436,3692897477640877,8821595848045232,4629281300140726,5520592147606656,7899833835700340,7926257273950906,7447126361371325,4279968232481471,3087196799197888,8274490618561218,204269439025862,7932357643723463,2439240982766282,8499668649452236,9180662893691682,4799709323047641,6170381369696990,4931065070871263,2602070490546912,6201873645794017,8190104329298658,3066294121266641,5538283699811048,387851009274606,3997317780447984,3950687240408887,1399315029967603,2995332410417909,1817613396386556,8499479516164862,4850545404588802,3774790396211972,5728661481177863,2836598586495752,3724983289750286,7724391001129743,2594511652127512,1863691628282649,2274688364516123,4216267683599133,5520319973442338,2389234439250729,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,5622224862577464,6770526131303234,8823214936765253,297526335300425,1397154956147511,2642347481506640,6035570396930872,3043432314913624,5749232718713690,5652844016120672,6295340198605665,7244890770803515,9036218450158436,4154170303378278,4933256683220991,4291307568565735,5085654057914515,2413571986957173,9187572004045690,7509411440202623,4117238218216331,2372154767496079,8668036368331665,7610599010751378,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1861015296496549,1471864782406568,1107583157015465,3359192181203882,8537231999136684,6482115257951149,6474396741751726,7467931263134177,6786250260919220,9025646331909048,7651082374915001,6833222729797864,410144451802613,2583472275850188,6177526526477266,8076461447820243,8815769383846869,8794208264791002,1338323295265756,2994560223626205,3428447854789601,5274301660094267,9158016872989675,7027985096934380,1625254992364527,6176712354587633,3048526863073449,8313458673687381,9188154261160963,7122517469537292,7415738719983789,1880410170582036,2657677989274651,5042862487835677,3353246143173665,297946451506210,6433529401226280,4828638417458217,2837875491333162,68026310562860,6713102526477357,6505518806582320,3426729133401137,6104920293028914,2683864114443316,4107508896191541,6653090173899838,5767721901851712,6240204079699009,4221925077075012,1378685439386693,646861831406666,6725129984717899,2583516015719502,1161506574537807,75091129832530,3504570238248024,8072469350093668,144929027286108,5685476400346215,6490932119479400,318390755435626,4325735311524974,3895465852974193,9166612212995189,517359220212855,7498960818033784,2167369577068814,851815340897403,6432046918378622,972614980180160,5452134955545734,310401436513421,9033672459342990,772117120378000,7279634878366865,4938927696959683,1890986035680404,1596244949587094,29860417139863,2185485247435928,4780732367944559,2086986011604127,7190948106835105,3312978247697579,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,2656151018808502,1751702385497272,693796660573370,7118726016033980,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,4602167547733192,81635630112972,5522533494168439,2781157967312077,3864648699065550,4304771496076498,3479272006413177,6789442171303129,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,2086682841597170,6629854081336564,4451688021447929,2744843007502163,232716207690623,1859721248011520,3600894962525443,5195275595142404,31276153639126,8427394283750668,7588963357979917,5395473031197970,6988101536453914,3070134228672047,3671565933241630,5437318788326687,8413427240301859,7064378317985064,385907700483371,4110401245517103,1329463919809842,1336059428508981,1618472691987766,3991686361896247,2262947123078456,3333979680154941,6974450251494718,2555346529826111,6091189699155264,2562320086883280,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,6560554740667744,4843831604053345,2752520230327651,8003729942197605,7319951751783787,3220718305670034,5155360444663152,5474832406320497,2952168537830773,391700864198006,51745215800695,8535608270551957,3963523983684994,2435321170326915,303994623247751,6570381896951176,843457896101259,1001268803252681,8935830662170010,7455948431881628,476228714505629,2282890545722785,9145060402161275,5130704189359686,8707847105430950,7748200313709998,4405226557478323,550323193349556,9063963446371766,2732774152586685,5052182129870271,3881211648824768,6428212826580421,960356550845894,8431983561594311,2674318196962761,4003215957845454,8860425400792530,897316570514903,8150866244466136,5469018164704731,3885943932519902,2181274350118370,4936027117872614,7127403136673260,581050367395310,4572414163289584,2713422870926837,360504095483383,199187347236344,402247873566207,6451364401675179,5077643932915205,9086189712409516,130457181976075,7425087409698325,4396323642545688,1603137902355995,1996572511122975,3517221940119072,2376738954628699,702798501799460,2850576000013862,319524505622058,2864627209774636,7613883562408042,7502333181040182,2218257629603393,8068985491437122,7530221302335046,5701137865421070,1757736763295318,482115931981399,6523795419047513,7611734689027677,985626569586271,8906959415711334,1661039179171433,2904355576731244,2506883728483949,8590428516263539,1387322670048885,4512180937213558,5590584270309652,2271529603798650,7156388644240319,27098339767934,4542558157555328,6760809165536192,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,3662919159013483,8505486301984365,3264746473492702,2973371054093974,2221340687153433,6274847488566940,2129273223465242,4666457024392133,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8318515508209328,2126217008342710,4444908075767479,462594584405688,2757742046635708,1435058818705086,8001342250198723,3128499912722119,651657068725962,75607106131659,1762891633565304,6759506089019090,1166808652568277,1050472124757718,6635096463206009,1545195813721824,4304614427552720,2521189072553595,4886591475197669,4870118807992038,5078643480934121,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,4494745225119689,8307942525970189,7711242515060495,8791259289515792,4556321790367505,887468836411156,4210999028688662,1676612448274780,5587667073572484,7327034779342626,2254292328232739,8909030726132017,8552312296191785,7553352169367338,3507837377017646,3343132780332849,8546891284027186,5320260141112286,982783900964665,5177776401921852,3478329653159746,2970622895822659,7598272163776324,2016823776880454,500006684268363,2339293216622415,3672006595839824,4974610471645496,820079529219923,8059723177205390,1290139896432922,3300357632857948,8617233707472737,731807987644259,3843618476357477,465037166274408,407494504056686,273825237814248,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,8696795531732859,5853576310753151,5257396834191237,55532696639127,8154597807642509,3421783037114254,5664055981840276,6609130413963158,1923517010253721,6655834216400796,8449499606388378,8935628239632291,7640718988732325,4918723631200166,3099173012382705,1541930783479721,1800517128877994,5300625464223660,7687547568949165,1629503790397358,1586163045525149,3700712461854642,7946192001620979,3086808181540789,7046481273812920,2382029668347565,1229878691049804,8690783830517706,3089495541412855,8326254200203212,5550023567304653,4265524355446736,514142706336480,2243252221102035,8655319023124814,8403538092447702,1055754057562072,624885245548506,153369867168896,8286237998987231,8214132091116539,8189536530413545,3390716620912619,5476876315310060,467366249592816,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,8681579408549902,1250269936830479,4814392193636368,4855337625377795,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,5767914751350448,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,3404645514262587,3441561624303680,2275693130250305,3423829195130947,5330443437426759,3669669445212233,5391072142911562,6994098420947023,6445197233936468,2614524117768281,4224499299092571,6415637455083613,9198749196284261,2879386380826721,7323875920791652,8369242804119653,6106536950036582,4898691182037097,2464176813176938,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,7647986012981381,1998211285457031,2893765109098643,2343666349557911,8021177217775772,9032222468051313,4079964453292203,527250636097708,877823276431533,5524874001115311,7656430088894642,2736562014918845,1224794385881280,4370251230234817,6547833949292739,6585493558229191,470023763785928,6932846907687970,7424197000927439,3178755594893524,9115939470275901,8121186809886935,9059221439596761,3495883689957597,1683181509208287,7670540484323560,8292970583906548,1219768655680734,2555251262871802,2057763371387131,6721401703487741,2809509062039806,4037615708129537,6141646980806917,6868805569935625,73265497950478,2067257304910100,636994868279574,7805354275301657,3442643861129498,830388703421489,7797236362615080,4722534397663531,8823763859310893,5369751621683502,932244993407279,8995213276330288,3264293452933428,4363526816403428,2084532488939840,8656843213650242,3755199397484871,3734495735626056,136723799236525,5608160409942348,7393489351358797,6929720610306382,1544646640245073,792942249322835,2449484392376666,4672484486412636,4633515119782238,3838756300679519,1923663661255013,2528889561520487,1757176140671339,6247490209868140,9049977009835279,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5502346576963992,1580143928650134,332549451344280,5602292474825115,467664463329693,7064012510296479,1541713433336225,8105508678531491,5840344637290916,9130305682536177,424135353727401,2096841890683293,7675482551941552,1333593272314289,5564848928414133,30172216461750,7413661131340191,8069172111739324,5259563716037055,8863704050444738,4260640978303429,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,7873984218462683,3681130512911295,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,3568367659125226,6846105922922987,7553111683168749,3182861987777006,3700692511144435,7122509300181493,5877863094458870,4341759536675241,4904849276455417,1383270956448250,2182315366574588,6574721260816894,2666970296883712,5917290617760258,9179669523560966,1553419814780673,3283597017790984,1458416177129993,2907874448857610,6072125870725644,5906462950118488,3498979658738194,1787508922165780,6237024926180441,3398608445229595,2555709334280732,1063417425369629,7885678641654303,2541091443550753,4803260508523042,211721470048805,8974862207918513,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,720459020642883,2085938533902923,384651385379405,420464067803727,5463030304823892,4746826772617814,1768705500031582,1707373643631200,8361022599817826,3563874166663785,1387363320081002,7464799420283500,3279510064929392,4204796266711667,7357884307374526,1965966511262331,5677483308395132,2660901546139013,7505984773102219,8603296405064333,2192532495772303,6254528881375899,3796894009887390,4001936773421731,8833716684167847,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,2885561946520247,7779913425963705,6947539044592325,4461197842708983,8334953150270153,1880421043525410,2027494681635543,1390679848778457,5119942787128028,3139745478540006,560690008429009,981946939239152,4952730055523057,9173197031722616,8124051107420916,7046896457378555,8338543371344636,1102254127540010,6216692251380481,1956410942925570,5681948115341099,5957570610092809,2760855083342295,7012232712137487,637717087886096,2057294021864213,210402935216919,8600761421888281,2110302892063516,9193508402337585,970330114464553,3252916289493808,2100493461572402,5525998140009270,7161054261140279,4021653090544442,6632433388350267,9073605860059968,7088305201981920,8711986948082498,7987192474389319,1203079434555191,6821187116937698,4133002593487694,1635651637476176,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,6828781212150625,5279738514840419,2746847273347940,5565618624165953,3042810235578172,487864828935020,2097088251825007,8783891734748017,5424923310544019,3408611869207412,8441358375734134,1164683235056503,2765804614536057,1239923617995242,4396390006889344,8489320569743851,1069535652674436,181638314539909,5675853195025288,1552378516372366,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,1169438882554352,6348876083243938,2099648782044067,6086204123819675,4797301698399142,3471569168190378,8952231969012651,8075354013268908,4015480834878386,6839738665614260,9126554829507511,4865890043296700,560732034878399,569858133703616,6399543881865718,7057729200712647,8346095201381320,7126776287083465,2361765179657163,5695909244033996,8647056119409616,6899487686306776,4859866816269273,5004638558784474,6074702285081566,4959226496953312,8996314752293859,6672925459491813,1082376892709864,2680596330777581,8506618169158638,626168875564015,1299923441830899,4704429005052921,966689432144890,4912195048307707,6056496052079616,698042668139691,6353716854512644,4875381475535879,8557212358855689,4964781251513354,70088873618451,3884489623182358,334844623043610,2198108027522077,4180542909013889,7164125418732578,2908244240583723,2191923344596014,8574345463184433,6486024147708978,3649154946395190,5723683002481723,4355633735907850,5356878132681790,88288992812097,8310818656353346,3711070083308612,6239227985996983,7867843017488576,633105738161232,9157569010814040,5768890711293017,5097534116879451,4955365087054941,5671450707164256,4926861423238243,1960247201090669,8352822593735801,2392984746015870,4018290538196096,3128705817382019,7589956941211795,8158821542825094,5256643637594029,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,230286193532068,1238619339054246,8494210442632362,7915404058193074,8875968855564830,6086409751379126,8707651019648183,2771632487820472,8644146702531103,9182108430318780,7293093929815232,7662411063549122,8783786815601862,207892688386593,8197445232532681,7464689979698382,4086615967075543,8765804629499097,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,4463836312960238,7666194411646192,4836608690859249,2688817209527540,4579041725200255,8246219929334314,4285562358224810,3567107464158468,1737746356272389,1448775314115846,7744785380621575,8518051298163980,3556579375844622,1561783378768429,3561867659214099,5287326670494996,5000612806597850,6152522718874915,9095115316180462,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7678005521333574,5351668498910539,3285144305491278,5084161271253393,3735333997858134,5183814044446040,6268301756915034,5890867670273372,713248293268830,7882993032424802,4856610212101475,88437141712228,4352903144828262,7407364839177580,958802972458216,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,1393605004676476,9140899795443072,5151281455619461,3660772568489351,6341820508011913,7526121950424472,7690101890186655,3289590076870051,7018996086578599,8163870665432488,6550313765640092,6403894935227820,5406931599163976,5926443562442162,856884970847672,7674181908761844,1458767657659834,5947103608716731,3709197275708863,7776477814955458,4646842126761412,2690941375331784,4782498127412683,1654526522764751,6765822772116944,61926092041681,1677868000382420,1801073945726423,7385626605825504,4736904158449123,1784880874720740,6548287328611815,4368166270504425,7864494568558061,4717078305738226,1951053797429874,8569995544546809,3152905102806522,3549731255033339,2923610052501418,5336395954564607,6135375769182123,3477567545936470,1987340210712077,8205328358469135,6606044422225428,8028597787790870,7906524426948124,5816011168292101,1185378970902048,4870364243930658,835582845963811,1345534315535910,7122433204903463,6152554647457326,2499002377216605,4393052211822129,6930698324287026,4005284196349875,5168981785230906,8453583119834684,3401051871010365,7906973945146948,1059006959607370,1993005114900043,7493708287558180,3041547689324113,7682210448059988,5580264614796559,5603043202166369,694729075228258,5862755334909540,2069399351119471,7180711155708520,6644821181082899,8084476987051640,6355524819209492,2479347599965821,4155506935291518,6521037990264447,8204114985614978,7428929518419587,6497917926444676,599196216102534,1478175721172618,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,896023919447705,6810715537882778,6142827993272943,1732336648466079,6607041102383728,4629811890911734,350130024791722,4725106938598002,3909095957802670,7687805010646954,1321439432887991,8156124609695416,6954175431241401,90076065684274,6133069365415617,3555666348039874,8660225691913923,2588162975686006,8332284229222087,5816608308592328,2300314053840585,4613385655691652,4995812233531084,7374706893274831,587253656190676,5730136195698393,2169107663986396,6128252439805663,5500657232277221,3317176258019053,6720662867434394,3834083608280817,72583097564915,7041236094631668,3931973464080121,1788226934370049,1262523435581188,2729482319322886,4194303986672257,7509575534522121,8399396488744715,8247560756327042,1205143099420432,5395011470851857,84834187095829,6247058132823833,4363284863173231,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,5439322017761246,8910676381798199,3989388368871224,6737890810986299,6756341285068604,2559496497311550,1364538786766656,919134658182978,8605736591634244,6414585907380037,3429891841847111,555164866154318,4050500137410385,6631465887240025,4577018362126171,7473358281035614,5615591727492962,5527959960305508,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2427434620065085,1805282352299891,189283170584910,1607268386283382,1213457523695486,4494558117785472,2569719125127041,7845117427883906,4848772203458437,5513139560406924,7039911616343950,486995003146127,8599745542954899,5902112804884373,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,9044286231537648,5707862725947303,5917734646341545,5972497682370474,6149574672191403,6241384143519661,8039034717364142,6198150788190135,2345917413478649,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,1351605086977997,3802696281022415,6015913189748693,392326751543259,168902776664030,4276573756637151,466507606347771,6113307333423076,1879504332029927,8980598175309801,6060945677271018,1189989031567342,8459448655941615,1503829884784624,7969431343923191,1301466934951885,2199283201691644,3109360564465662,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/95fd78a08b85bfc006555fe7cbd7e3de",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000414255.1/GCA_000414255.1_Resistant_454AllContigs_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ASJG01000001.1 Pseudomonas aeruginosa PAO1-CipR contig00001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"95fd78a08b85bfc006555fe7cbd7e3de\",\"mins\":[1825648980148224,2242875306508290,3447194786553859,1341059202809862,7730391996751883,5982935351779340,3778695907909648,8686731819999249,8049255821115410,8722213897478147,7931324617308998,5675642116325398,4707508246839320,5732729845055513,3981791856091165,7974116936837059,5982357417443359,692050547335200,295956355178535,4099172624924714,5568173203071019,7767473861999282,5043199974801456,6346294272499763,6872114492186678,4966074889592889,5461770361495613,3125038653521982,3466706848956479,6117705741090880,8372113748394051,7031111501029445,8373091323486278,1708900610834503,335152522969161,5858417270046794,8421648900948044,152461611925582,4507216513810512,3242658042052692,5461362154872917,445764562059351,4195156250796124,7507244859457631,1292057396764768,8335225580183568,3582094885978213,7826302066413586,2255912029675639,9104988338360081,637725561069693,7742343059169408,559774794818923,4960453765070986,4162116280017037,870684408455310,7958111668404248,325785438532974,1584430685126815,3379363041263776,238480830128289,2058418906267813,2696321150820522,5884645834057774,5533047061520560,7241782625280182,7133990131736607,6549768251449532,9157911550763197,4944011556847806,6255227318501568,980761336053954,2249355887780035,2969456938959044,3005449996525765,1583177986564294,1812578367029448,2706305621852365,3726539573731535,2892471568337615,1989705972433119,8203583702123899,467908190585065,8202085754650859,4141142043164909,1815666573754608,6169169452876019,9008729635651828,4817048900788473,8101580549169406,2517769504243968,4197209708118273,3117138682724614,4703323368497415,2141722644504840,8634456537448714,2609918354374935,2912507500052763,8488090624377116,411594520061629,2670236492824866,3303930568220969,2472365506855210,5460748222734637,3152437228470581,1061908461019446,3273080538792254,8040627360645440,446373638218052,6821676494987591,1243312057983305,4763323462443339,2045226299531604,8236459778606478,3214521610428758,175705287735531,2663829005200100,660734179279196,677601310220638,1108104819720544,1664197454422370,8987545906774371,895332462715239,1756132578550122,336570157120231,8029926179529068,60697040355700,6429091812335990,5004781145391483,7919298333081980,2562626205368701,5546508894552446,5601666975752575,2681265936982403,4518854675259782,669196826050952,6168311180992906,3678298718921099,3929483855839630,3057315154464555,7033561292669331,5045834763919764,7455209331966364,8889462754091421,8592053240834767,3165758903802608,2776872995594658,3491351727284647,8022862563762600,4912142653904284,1263841826972074,5423624015847852,8797318172541360,187812751753649,6810430454456754,4145901585826227,3419500886114745,1011452024398266,967880405524924,412115780428223,180236108841411,8732447265956292,6312323284835633,6806171925796259,8682542425096661,5561251237883983,5722025083314659,3592596865573348,8548282705428965,5886474745299435,4762846919614958,7153662514618864,3201737096978930,383493755926649,9178557679845883,3669292656198140,8630948905796096,8081252838261253,1742951819289098,1055038933795339,8575329922785805,1409409868022287,684259923157520,5527908679827988,1689000284627479,2347247535882776,6489958089155098,4715146946755313,2545219659432479,3505901892838832,4079759344656937,979316247904814,4431559944143407,4940929685347080,5066124605845598,2031245685187127,8765338575127096,2532448444138043,2383741723320895,3122300085715040,6652297482707522,166104364425797,295791539233352,8656137116787278,1173881909363280,6428685828858451,9211670786155092,5477662529561174,3766864980930925,18650490225240,3627837969165071,779206551806557,3791776890495584,4639199783723617,8763561430065762,8253391879848552,4960997388616297,494722871911019,8818161138844270,5748590688305777,1546013737648755,2518876397838965,1850824917049976,7197273160254074,3398157430465147,6809477167454359,1778988980413053,2072490620191366,1245688498922120,7851871946654345,881199321318029,1070773832499856,217214059528851,203814093644437,1452317551172377,4675223172006555,9071399904084636,7903058862858912,3882629053894768,8450254135485894,6205178344112806,2408780095890088,8879253277934251,3675052909601452,5481840160105135,1382596604527281,1498810562708148,6283390489502392,8599969595753151,4940910579809056,3930112922092226,5474232144462531,1357990135349957,255429886452426,6152567895965815,375527135126221,9019447938900686,3613324903425485,912196485087958,662145299776227,780184025277156,747384259199725,7391481408758514,5802979297067763,4271363780494076,7206582549963518,4858546652291847,4936667947248428,2058933928002319,1057055539970833,7298880171459346,3297374177734788,6444509444621082,3754079474590492,3539196398024154,4910698101916446,3420290618426147,3329133899096868,9038017041056538,8005958356037767,7100988808913709,102171739587374,5868237455156016,6107546038420281,668151234372415,2562981368390469,4391722275662647,1728242116690764,7978385459716941,7277980287492943,565641661539155,8505675617869966,2175024872489815,8051407155626840,1627950342046563,2397511039353702,4520738976785257,8527827591799661,2799704236000111,2497662947451760,4726962273513619,1310651690853238,4855395494167417,4865489732944763,8023277769403200,4706231506609028,424865371882377,8425321307898765,4902400085628397,5454332038628242,8417932355470227,4483056433374100,8447156999594904,1713878559507353,5758073021969903,5827525029405601,1150357960303522,196692764074915,2079128375460773,2405905957553065,2607037459571628,7883071421359024,7608599192856051,2746080421856180,5988720293077943,3640304752255933,7106930217206719,6355761970881473,4780109512336323,3372524130689989,7658301732681207,7726038795543500,1221882098082768,5210470135753550,8219493761835991,8226822531343325,7904734603608229,1240475997881315,2942203506828262,2892527411684327,5010616462820329,4803958938412022,2523428823283833,1343289626018811,2893811666732029,5604484083860478,2505536711492610,137094921896964,2297781950489607,6475758706951683,6774570101130269,1198298415883296,7397828813292577,4114350164485154,5089618229601315,2822415313503274,52691376849965,1093497080096264,479269639119927,848996882613305,1045151965733946,1067297977387871,7285794211619906,6162704597255239,7026702528144458,6436538191971404,6192298839852110,5229044830635092,2785204834842126,8640445684171865,2671896395826269,8481059574146143,9176175920637024,5972890795385953,6591565996401762,5682289923915449,6202964187333732,7367269211292777,2338082008376428,561634983887981,4107676089771121,7347975970194549,2853837061227640,6038308917478525,8908436001956990,7764787273647238,5123883283244167,1499613532013707,7785954381169807,1856793424725138,7317984045093059,2506734241229678,4783385754461334,5483704810710171,2427900247336093,8146224151864859,6757791400125610,118718608222747,377366102066351,4287711848715806,650068441932983,281717282219193,425506933679295,7874821023696073,7635387568940240,7130746195344248,1075654807038903,2726414915716311,540132752123096,2379170032706777,5598935149277391,3541790429054172,1461378370053342,1236882747278560,4237550679844065,1076753588569314,7582718790378728,7314267375121959,2171065290892526,2186931886916847,4917525670336041,3867810136433915,8091840416174010,8344571198170368,1491568405150593,2072095094310152,6649130563495180,4890486343558418,2388340610860307,5599194888733972,2379218459714839,4032146489099546,4325490435671323,4329813166368028,5429926521259294,3874101255390497,8242672688612645,489535446779175,5453957234550062,3460976505113480,44798075708723,2198586172835380,6821741102671163,2248360630297916,3757987012773183,326957079651651,5156804979393866,550306757379405,6842275916080462,3098247804904786,3583905369400660,3617571094308181,7944286668154201,2257242554926428,7365006836909407,8462859108476267,6913013882692978,863520313361783,7655004521366906,8499485706003835,5011844600530302,5478010235495807,841803076756865,4852983115949442,1875635783140745,1256139526783974,4163383691568530,2708640822486422,5103223662093719,6100446366045764,7459494959146394,616444676326813,719525577844126,1420571704051106,5346650473077660,6258660517414316,8724388857300397,5677648697951664,2993279566579121,3885092685710773,8907805890160063,4618267451753920,3045503677818307,4756911305221122,515490452235718,4805280468075978,4527987959924173,3346183337653837,1014506952533457,2100305623296931,1994114190378453,1586121131533788,3224711245555172,1157587158820326,6236129712951548,1984304708961779,465868061730298,8028617050484991,5477788394890752,5992087869965826,15525478368771,51016350684973,2313691588306438,599781281441287,3236466793465352,8448172757419531,7305695843796497,9035523760277014,1019537707017754,1124448443680283,3290840134968862,3089597554312737,2821455805654563,8521902574970404,4822493318294449,820608301409832,4588489414444585,554936117732907,2850212615767599,9113338924260275,8587841127933492,461758241523253,4157105140308799,2170213631747651,7648129565386308,2247101242885703,4861392948872779,3115636897818190,2102799013586511,869285742315089,2070489576613461,8651765958411864,2689332395484762,2881736088471136,5965028783990369,3702616186660450,7033941757552227,4783730030495332,6064080526149223,8508319114782313,5541831766959722,8481228935317103,1774237891929712,4788408733140595,1476059969524956,8952644861691509,8943792793609851,7813282681824900,4769822210795148,787338698073742,5014523760428688,7735498293864083,6297285050697367,1278257708332655,3946040774084254,803113948096159,7625548745524896,2306154960848545,6342976057157285,3321355409213094,7063536414942887,947038921528946,2434963572885176,9072019487082170,6751298672944827,4019307431610044,1580725474739901,6798879655634624,7788634028836547,6290108149286601,5475908167173835,8969482135881420,5980796575762125,2419547738924752,7020766647428824,6537163609048795,6869623704028892,4061393831724770,6392749796779749,2722998909216487,1473957826864872,2837351521044201,4970145318635,3532439747684077,4632763553613551,8770826167478000,4134107242694386,74483328973779,936465531656944,3285935885068030,8286386103699199,2208621494896385,4025207034083117,8089671349626630,5831636441568897,33621298964234,4828190329628428,8636760876156687,5790142845814544,2093949930981140,5649155849651990,4546582426376979,3586084679919389,1220494130448158,837922871396129,6980079451342628,5888136499799848,7778407891983324,1736117878392618,3117093582931755,2429524713047853,7285181530105648,1180164051347249,896978631976758,262495373182779,3109891331696445,5607340096512309,181558880544577,7410029920888648,2893217903241033,4150657603487563,6386557308880721,4806371108771375,5190807724602928,4934717584582490,5736193498446673,9011529193854336,5531333799421795,6219928217028455,5224375892211346,4487329759430510,4254702633109363,64938819709407,7943192566671223,3343207744169849,4022862580508538,3363955026716539,8015680413828992,5475342956578697,4363231059347338,3740248674461582,5172933099554706,4707233228157251,1812907740186517,308372247029659,2850944440788892,2325616806840221,8658920927414174,783414740739999,7509266528012195,5423129093384101,5649617802102698,782518070691755,2142004363028396,1152444526192557,2763403050747823,5125407045273520,8100304772804936,4272702843766706,8112498429093811,2664478888912821,8542488013809590,1166479755823036,865452593530817,8159799601676619,41333394622409,6960093542664140,5500566343690189,4681332493605880,8502881993664466,6108373419575251,3131398938249175,3275626527811544,4712285744834526,3177247712169825,4569093177468897,5089280359606242,5240905884829669,2752659753442671,9091435389962229,5078534890121206,2362268968511482,6500316467595261,2349839281620997,7458892672755725,8410664087156568,6553732895329247,1357453871605782,2891079468296215,2371553995122714,3595837121005595,8772322114392411,2189246007740461,8368006527658030,4888260514056243,5404584320524638,2855265152796726,4119613679094793,7214073671026745,8437883122042938,8905483556704607,8135198308591677,7200229207328833,641730380228678,53936673597513,3087724489189453,7962465309010000,5265241410607339,2019177321875545,4686975239743581,8199637199316667,888561828816997,199968667043942,9189511668648039,7427145146754748,7015987234570599,4274805424359101,9016349220997236,3525835040950389,5178187033454712,6723845004806268,3133642685088106,5911676104321154,196815346198659,5983608124344456,8602903127689359,1781011146639504,4613993023566549,3278119729612950,825089629276312,2669033484856346,35089719486622,1723434365995168,516698370451617,3711075883340476,2508144401705128,3691494962047145,6156340972996778,8733548440914091,2734432587565229,1715626690488498,6499428004432051,6404191643953339,1346448736897216,6592997913971255,1700220898585634,4205631132187683,6254678103451861,9119004498856151,8187357186075347,1401132339837534,5155061539268831,9042432493955296,5891100560287971,603948534466789,7360800777324780,5555943460791209,3693483339843831,1860692312303869,3193898285000962,8287854254901508,2887969760495878,436429363188097,7201152917760264,4899363888032013,3905340535793934,6297916734630162,3283744411052313,1519405139683612,3799121863026974,524476104796448,5809432070096604,9105273355512114,2616834941643059,8461126727346484,1917988964641078,6698278816715145,5106382710319420,1365693793331519,2040120949279041,4801516296298891,5088299399486518,5142911826651466,2793704712472907,1666104380524876,2359678683982158,4602065231694169,7812328905959775,3578396665489761,1652401780672866,6172412827945315,114817155606886,8946332494762385,7006738425941052,1335132091369834,1656220976995389,9096416529156476,3314768617449853,5489170709000597,4215510340323712,6697155123243393,5680763669776771,6345904988916104,5898421709695376,1478166905317782,6892407813326774,6006227927542169,1165257885348643,3083528067344795,6224738621876636,7544580027517342,9102722876148127,8704774922290928,7989783117719971,4431689851079078,4293736972241320,1801439101094315,2846960564054445,1197968207317422,4699202875449757,266449205995954,5984483539642810,8270185897472415,8315830390204866,978055887899075,8159931678136054,2500879502223815,7424077867854281,4110723853825783,1134423114090957,8160589781453264,5120746422626769,8331886295861714,4015566756391384,2283918477339101,1261277460408799,2281956094962146,1530964743899622,8637545298930155,7116985279072750,1269751755721203,8892220545206776,5585745852524287,6470178355954090,5132272502114814,8336517337188863,4439634738825728,6256456632306182,6828487550673324,8135120210487819,4945148031199756,2157357314894350,5389198081804817,7589989133478418,817574416175042,2954977448741400,7340627638250011,9020655146289693,756443186498079,6522695089048097,2977004590246436,7567076589840939,2354652597291565,7224176958401070,2770227102540211,6863104705759796,1083889784015413,4574704530197047,736055114139402,5014149963893310,9176986242796095,6577074562959937,8737395895913034,8094847934909011,1204674483915349,6159398792800855,3464002313030233,8074654652795486,8239368394197603,5979024870197863,4176047723285099,7582064256821869,5655543627745905,1565623565167219,78357334436469,8602209781557878,4434774127168119,1453348653959805,2153924495526528,8647175771525568,2615730021973099,2066836231891588,5156662950595205,5795733695762881,7264447337949834,707439295474315,5361676288363149,6411639381142161,741503232065987,9211922073196313,4778496127945372,699698288979056,4105087639423655,1517071387311218,1408476039326383,598053509810866,2919508513262260,2750250105686712,6221226918578913,2307444293675708,5507272146864831,2912828541414080,2556350734830274,2075011526781635,4429238852831942,4887172988952600,4131760287370359,8040494651400838,8072554134786509,6114111943822032,5350801021889233,2785389606836003,710654020676308,1244885723851478,5265285478705884,6788270244945018,8005492568124129,3703318052170466,8311487957256932,1044192497437416,7830327839566570,112368647826158,6806919729261298,5653747224885940,2999286599068404,2285590115420922,7436926980182485,7315122943054851,6152282086075137,1843996232181547,3446583399611521,963050109979400,7771890646567695,5544817702759189,8812528430172950,988818070457114,4297324755669466,5252515229780771,560817418275624,695162161335083,6159485866830636,7191370303900462,9083406286187656,6196336338648382,1695072076565302,5028680683842359,4991756612938552,8671050538216250,9162314986654525,3146126560873279,8351287750159168,1049972089604936,5330521388215113,5563422622870350,5125686702713683,4010250590456664,6777422741973849,1051605262101341,7506426148719455,2515505303960720,8039093544240955,3801042868964196,3788988590705511,3374655543282536,4780940703959918,8315470742006642,1369392084208504,887156973620089,8793555998919546,6546728858815356,7823267583961981,2826022888237950,4311556085787521,6916075934526340,2590336095996805,5581526532295560,9001694132300690,3932656345672599,5562708304047006,4036946366434207,5963969682074531,8478640488106920,8058689523682217,6819173355719594,1010718843194284,378536936065966,3589279209450415,6790867747662769,8161006826539958,1854279896532809,4612788061121467,1936533606108099,724862280043460,4646791886080968,1438882400611275,9050917751458764,305938853186509,8209293391382957,5454830021462999,1785523809856473,6893164680244190,6531069308185567,2853849870596531,6429097827473232,8707277495479267,5340671128509608,8429096798948343,714696875092985,5410295012404218,2892441974632959,7059821247556605,1798771770829823,7577324317666308,1207465805941768,319127354870793,8578710629862410,6416540561288205,7227531949566991,1937981608999784,2028098386766869,2316934598970391,1999371400965146,1345978337020957,3047276721097760,5110103931530273,8846468244843554,5533524569566246,1950936647846954,1992537076059183,5061708529871924,3504553802749790,1002566130428982,6368616022174775,7175015413124153,2381433421384764,5753777481321535,6820525364792384,1207909707589146,5159762360847428,6135578419080261,8690785845668940,1215095148530766,1313275117666829,4722197057670226,1936160448474196,8791861973625941,7329922593246296,446566574517337,5088452242058330,2081749098843229,8990242450738272,5698061732973671,1803955474402413,8505374158367855,5197810517093488,5022530125507698,5612461840632947,7997893525048436,8126771347074167,7737440598223995,2702558898637948,435990103420029,2413875722693762,1953402490320747,4737828313689221,5036453460610183,3957169066929288,5463931799923824,7257781297122443,6661714455227535,8687411883152,6655880321102360,8705990428978322,7524218787772474,2758188969471128,1160645203283097,6761245306186906,3321515718479013,8342006818983082,8034657610222768,5965017188641969,1648777718167411,1611301293943992,5129390140968121,5740353840639164,1302893187476670,8397721133698240,6420423175363,3721447194684612,489389557583046,169929898618057,7027216265014474,1077036016191351,4553204929408204,7794945101786326,5473690401900409,8282243386028582,3796038994971880,2074698571968217,4513027993357555,5928711245499636,7200246185449342,733872285256955,7272169192811772,5616731539000573,61345496411396,7034558473477334,1508180705316102,8114937280908553,3247469456928014,2704923698998543,8928553565695251,8502612383845655,1827619080965405,4480909678719536,7048771574172962,5097957971577090,7886242219052335,7667667381808432,8961643496680753,9157646000893236,3426861304720701,7328401544817984,2762998051179842,1166116063472963,7917294711909702,151593106877767,4042741367369032,4020082097020130,2064879062764882,7517101473074516,5724597873687445,5096233580201584,5245465548737931,6636015295698832,151891348499815,2147624293637352,8110688086216051,7911126965267829,925190240390520,52004509797753,351427702869372,4278121920400773,8250132239527307,6365056011742606,7822578948173202,8109019027879833,3016642777427352,118135917776285,8819319823216030,410019515887007,4163031481413024,3926127555554726,8049632463318444,6534301676137907,7201003828874678,2824435720624818,5643191964093884,2316716568489406,6005098722512117,4553666074635712,7629100961525186,8984099452652995,5755891285577159,6435007587823049,1275034078334411,4179609112882637,7953562272353744,6962299487866321,328760410041811,4380801864756698,4657296229283534,6254038641380836,6771056816057830,8345527749463530,4278164994518507,1709760422194671,5993805499674096,6884783518445042,7128521600340563,2304190849764853,4652924773404152,2271145205837305,3021901970763258,3323770660404327,2980715216801276,8568705156591102,21174142004736,1607617037331972,676910235258373,7290289553913772,2197538559618575,632558900629008,8796698853453329,5385461289717270,6653472801353240,3486087824059929,7155402469681071,1177593273306653,3284317072567844,4572495293156905,7989367233170986,8338932879502209,6621472811609646,5340511912308277,190633263795768,1015246938887710,1915816906559036,6117081943518783,8879105380704864,5207517876817474,7011047562128963,556331050962500,5434322014776901,3381912499285575,4432747689078348,2057230410112269,6116249124925012,7772538120187477,179181561491032,6663420796587610,8528545370009182,5603057719321781,907737595383395,106503742377576,8794511835336297,8550260875374190,5160564710534767,8347804465671792,2463880522681969,6208735047716470,1766639744134784,8127526639201923,8378411452960390,2054303716937354,2729643884908174,5219674136235665,8606917709852306,3722014854604739,8637907380588180,3400814664781463,4671253279100568,3090774650752669,8474250278309542,7578527490739881,8015273422425771,7605906963107501,2004943534993075,7652174364257977,1272770145767098,5571522633142901,4157172862848704,3092086064139974,5590645865105357,5324624245051092,5444889425637080,5705694990429913,7693991133605599,6132293388029664,7325932532474491,7725351762521830,4646438159259602,2313697478700789,4123013076221225,6191231385915129,8385429490044670,7131106419683071,6262209182003840,8217087918224839,4982370437558026,3234436432523020,1558330804023054,7187341170446095,425349261707224,5414326221786899,4512696732741396,4950232146743064,1551753217748762,7726611765547653,8305693744886234,8784802231299873,2188984623821446,9073963403808550,8744322797047089,8383336530579240,3038750758883975,3343660257816371,2441252594272222,4068119528689464,7462476398792505,6259189833297723,1986830285951626,9022632032849728,7466736909373249,2427458968531709,8573454732398414,3441651795223181,1779658447523665,1690277905313619,8677387166863189,7977809493512022,111766749073242,2854251640418141,8706725938111120,6010714277683041,8123953337798510,1664484899868529,5785609175609202,803979742315155,8379034900043833,8308245892722551,8788532173565818,7000240716418942,2706672107966337,2783158206001026,7606431954434114,235302775738245,5792515412537222,5315695730168277,6179823348264844,8888819299486406,7193130321235860,7156754966998933,7327286056342169,7299330788028320,602891187105698,4079996818878375,2454835100397481,8281064559251377,4746641993658294,7703301467822068,8752704753160122,3895494717771707,4792545103426208,5289678283534274,3679423824269251,6431873135366084,130551540469701,3217570951458758,5652439913951180,6742016668691789,4251285496393680,8894493442322393,3604960841609178,2611208979402718,7780873358992037,3571908914122727,8749577454161897,274529720292007,6396378417760253,8445607867081384,5242125263775801,5767587820031316,1573976389439484,2330032313757697,6916493166765181,3504117351944206,5870013472436242,3454533486653461,1476777048002582,2829993310072856,7670499108433945,1448572499092143,4747129986822173,8088876982194208,1670455141014875,3795454357549093,8680238313615398,3834091080347687,8542993757104272,5960914941210667,3689767912099884,7867208817602608,5095730381754418,5207957664542771,4186625426264126,2706526091661381,5170283890667590,4489370989736007,5482108677345352,615644862107721,1436897274114122,6934328682524747,5352088910355810,6463086518292559,7769088532975700,2713007844160185,7494457439391832,1003061248741465,4693185372565596,2915650493296734,4170492827488352,7621352552976481,5018499629150312,3747220216828604,7284605282152557,881119234166895,793384128426096,2013262548308092,5715280603148413,6826361718435967,7811316467462273,385755144794242,807059482357892,3614614728519815,1368436294758541,8943246785310862,7719451757957263,738709509689491,6305656363407385,4286890228863129,2296646198800538,2649356206452891,4611604819038365,2677817976049832,1207038172582057,1877858555965610,8690854046429356,4730149758709107,2937460315951290,4951189731209406,8650985567939957,4685332054459083,8865811775910084,8014605329535174,183798263435463,3445529875042506,2596775812072141,796598326371022,545195466281176,1833585153896668,3074563508310240,7189318104215779,5961609067417829,373776110095740,3439414049706220,204116002500848,5457553560359153,7312455714574584,2023772700946684,2972787178819839,264685101125891,7954195652194564,6820033037988102,378021337624841,5782009917042954,8496855180661005,1338100456403215,2906536239501584,8086635968565522,8399499254149396,7243277173035285,4030374274461974,5388630965178659,3774491859885447,363908824289594,7727052479451453,6615402305483071,2635397832888640,641892985680193,23974554022211,6730479648379207,3635124274549064,37511667970378,2961803009560909,7051066290251833,5831062157242712,8200406296416603,2698852554125661,3833538080051551,8335617363939681,2856548743096379,480637148680548,958125524136297,1707450553241962,2565719368528237,6098654719412285,5206556218700144,6066244133261682,2985628197654899,478814084675646,5451979860250999,1176751949533560,5129330429055354,8264538289993791,3069894601568641,8940367238967685,4413530488721798,1210453051101577,2371088507039127,4089796306530701,113161445659022,8633168137712015,1272428950434193,362447947829651,4565420998398357,2534949387596182,3558887677972887,7164188539867548,6236960171594143,8796418218881441,6876482750198182,352166042759592,458521285259693,9155623336578461,5002432741142963,4826579481055671,728163354702268,2563535924613565,3383967935132096,6171008575069600,6067240845431243,9197223091673881,2327773525160397,2122214986248654,2181552663400911,4573872640094673,7915676621197780,3169929393836501,949948121756120,2639049635336666,2717534466306523,8766175792026077,953839788601832,3710033554911726,2179769924948463,5329215910679025,8288948733948406,1211675839723641,1942080122982905,8444639912972794,1313605372318207,5991381506373719,3207210189451788,1252176142168589,8385797332374032,2142968976683537,601778922417328,7940921608213014,89363552776728,2508118302601754,678653601337883,3614574299025949,5845630400205350,633847595115271,788055899476525,6442849273819695,1183809730761264,6772116749300276,1504600635322933,2803812283683392,915552841029728,3573939076493890,6361378611786308,8375280165621174,5418563764253254,4659704309756487,3385816656648205,4471370872517197,746494579642962,2170310245478995,8586717693588058,8575867282158351,295268117959263,7014324963627617,7971111733219942,4634440689357418,6690052171403886,6038481224757871,8949146968068723,4835136876687988,4437055990534773,8714992590303862,4857718445511292,4711444247728768,5947711580770945,8907737953907333,4523596711916166,5573932355162759,3190633159119496,4472023932523146,7070527924941451,3772662846419600,7356584231285398,583227522405016,6139101076402841,4255049407719535,1901925133783709,742688204952224,3021242068488870,2092715525878439,3779587207951024,9111426978722482,635793318170421,6819353932377545,337245653185209,195417497899708,1366872552999029,2366747200459456,6067991991521986,1510016630305475,5928673843204807,1510340711076552,6090657553322705,2038210427040467,3713581515936469,7743140872147671,2758979155768025,3647244896293609,6476155342476018,6769297329631988,8693255782494965,2174708789719798,8880724775973626,4866191304258299,1860693630022396,4042003609350909,5689800666067712,1683855464559403,5749573433905928,6875555456201482,813115746677519,1775508494668566,4803962057904927,5371475245814560,3252261137208099,1224349940306725,5410944516117288,5961474889872171,464524958495535,8085877337330483,5986380963076233,7674941746025272,6997020688536381,8490155680813887,3079261890919947,1574700462445381,3180383572063055,1318387961942865,7127976060212055,933854838305626,5317518164718427,4604545701286753,2356167025013602,4269383703884645,4864472437937000,148938568840041,7888143157605226,7500765262574445,3564821538337648,8716302165824377,4898133187096042,7460891122848643,2963855933412231,2446897897084973,2870566998848393,1026722820151447,1174371731288975,5837012027331476,1866301441414043,6678838912504734,3104384780678049,5653757243872163,666363034727337,3515321753605036,9060092651235485,6955942119969715,4869163533513659,7744871944229820,4872590668338109,4431783417470454,1409785158538182,2172544198726604,5561141410304973,6800429115487191,2837391147045848,5314656414405593,6406696758735695,3444171462284253,41028542190566,3399181597979626,1167174263837675,2412920939828206,4493522934076404,739001993016310,1634286765069310,5194278963293696,5102690039469059,2499122163053574,1324249696883721,5674011977946123,3468250521515020,4310980028478479,521996040048132,4187298409886747,3983964013112837,7646098135323680,4471406198658082,6737395326489637,7558936749118502,990478654567463,3797173733012521,2114788469003311,6395894039666184,6577585086583860,8240243260404792,270480234386490,8758988022330430,1088567884117055,7459065003947075,3784135096022084,8349395878105953,5929992403588170,9047156308093821,2420049097981453,8577239876663481,7510748863517786,5714807743575131,4372282179974236,7653148258071651,5694750530039313,877371145557098,3809006445474923,21269167019126,3633433064317801,5320275155238420,3805280330478714,5884730499544187,6931531574760573,2689484811981950,4996149085770880,7861111459329155,1131125115155592,3021773740520585,6222321593332874,3194983580628112,4395044209683992,1718894020736153,8713648000791710,8405611246318751,4877596472431778,3356468254856355,4370586720583196,6791410172818602,737734851015861,3225007396648119,3342257951937722,6018042295686332,864127928005825,5371657931863236,9181646262441157,4372108389881030,3069190476387533,4279718182376656,6440832417141974,7806304686093527,3532320322199088,4029510697915612,4649114049049821,6883640480232671,7055037948097761,8977407241151355,1772431437174993,5299797937951979,2078663603475696,8986068174648564,722389546087673,5477674659550458,8534617049773307,7469419719767292,5460781841904894,6139378792740095,727610916738305,4715050518107394,2082212922601003,8160713070789505,4636632942236939,6751121999623437,9062772253594894,8068571590915348,3629041858653742,5133027386086678,5728269735073052,1609252139234589,5883514695425584,5637136810292514,2878861855855918,8715022564742447,1881262431720754,4912131982923061,3677811277362486,1634346533983544,3450684393370075,530151578431029,86139204826436,6952130458793938,1652354140509519,6280170469225809,902869266437460,3027089806382421,8495180020356440,3877407798859098,5994072961332571,6414388357838178,4143450050229606,346546331227496,1476609122563435,4681520393819502,6633298581446205,5411112898024817,3270109632427379,8813174365263220,5811326081348981,2849502394749844,277909581452666,7018921615201663,3748258934879616,3692119157528811,8032851864892807,8954129491252621,6509939122419086,7564348498538051,3533151424419221,2142932648940950,1024061409678743,5004983654847897,6248293643842971,6583057948726684,3591569770804637,2855542702560670,5060041665820063,3780360283034523,4041495660737957,761686412121511,2529664394335656,7474892771923374,555453075289519,5292938443281842,6611916529292727,6701876604376508,4514789601670591,6553373535540672,1765926488937923,1000441112196550,7347330484360647,8035138601997769,5693382968210689,2464117636471032,5939244600423890,5584028709279188,3573082752931286,7787115972548058,2025829383757391,3548726672119261,2912577443267493,7455932019936064,2567740498747067,5532416862639586,1014637947139555,7607446921123302,225502558852589,398592550016495,8487995272099312,3330981070779891,4636756327847415,2093635845862904,3827636663145983,3158893303993859,97830294271493,5281362864018951,1006820556661676,6998819710776843,1935937738118668,820811793847821,6877561486210574,2115797313476113,347389977703954,5771125783991832,5869103121967364,8277965979620894,6421627371583012,7350343363614247,8068758264837672,3987420409443881,3265526883685933,3520623494567471,6847753205388848,3124775272994355,8346773454871103,116053770352186,3155004858596959,619539124393532,829497610827326,1303968608351810,4569784064579140,6793984534001222,276591794247245,7488842009835087,3793134449012323,5180199201887838,3581016076662367,7299698745521760,554406343833186,8197616638596027,8417750607165031,841197384883815,5341768123160173,6917025746073198,4598286695572413,205725871552114,8869010765330035,6880074198832758,6173259183517289,886224401249912,9095085671716473,8542441873810367,6311102901712510,1494796939613825,766410890966658,8935111186413187,6336438172538503,156390326228617,436752725842199,5350945539813777,3086009624131218,1856103042569875,1710395123422868,3682495649435246,4249089798723223,309031068456600,5535573549815450,4273681948087968,6997064635258530,6904528639096483,3474744923158181,3592782720562854,1143581770716841,4121554230572717,5020945395824305,1856715080963770,8915204900714171,4486592372291263,6855934739011269,3550637156316871,1473679797163723,2507296291018446,4739006935013074,5998617988208349,7625638938375905,5600351303546597,1389192961668842,277611667797740,1065093179487984,5254998128310006,381782126925559,916544799880954,3980142245132027,8003897259407100,216286392438400,3342085229041410,8760363735652100,3014842970994438,8863822628869899,1740481775417104,7870622540499002,2031130103231773,2577459858986773,7814562810042137,7328409463600091,897688885704491,1751405529863981,8853018425218530,1213777262778164,7313956991751989,269339716335422,6592011058943810,6872907206907716,4281306124249398,36978091431750,8994977451018551,2612408944416592,7738016062076753,195724801185619,4261627976685396,1733515682092886,2166770477266775,4135072310564696,115931207939931,3666300961437533,2670147489609566,6231901462648674,2113005628331875,6726404808819686,4467382534690663,4432261887842153,8321327526593511,7416185416275823,1175324309952368,2932660557895539,9051302581370125,3067365383720566,9089202494699385,6633438134171515,8660016777910140,2944205150107518,1026623988782059,1087556420083350,4804285253302154,474234917787536,7895768190613401,8145751013070748,2714333422147491,93349196117928,3368867578632106,172831603578795,4673799705925548,8146796280502191,1809387807692721,4274478035548082,2254772894955443,1083000616163257,108321592588219,4829406891612093,3730380037240768,3865007557175627,7633232742347766,7578862218491848,5870144389706685,5508979361986506,3846422762936267,8299686161045456,21968976672722,2500009359792086,7276515108714459,5606965135857628,6293875613038557,5502429555931107,2991295470401509,7472655622174695,5578813451786217,4233842410775549,7936254010701812,5960888199968759,3808311231920123,9079721360553981,6022882783557630,3302693982943236,4656798335105029,5699812906588169,4759366720370699,3728695897293826,1001275928125101,6583591710929923,6394369422669845,203112558057494,5039388902348824,7779832937699353,5876099974707227,7773365200607263,4231811366344736,1974299793315876,1453576769730908,2801286274279568,7466938019412013,3364297766819888,4020948848859185,7710265134241847,1452990443059257,7970075667576890,1042628912134204,1983450515421245,3860678662314046,2775027395131455,2485722324441154,5339333805430853,9161937510673603,8665087531415905,1425351357395980,567147309234259,7602140694960213,1254187522881623,4552716065764367,6162354654361692,6581040739514462,3440181336266848,947056495040611,1591926002030696,6579767000525159,3008231807899758,3883445530441840,7315918618679410,1881448296332037,5564446240823414,7942397700585591,6090318156863608,2688255907756153,6262525369473148,3855545739835517,4076529156028544,5647671372609669,2487953694034911,3088183621261447,7817234234284169,159041396177034,6496371426637966,6068202692933776,3543115820021911,7193168744347800,2564324713568411,4437826042017949,7001903060555935,5742643424835745,438376344795298,1232011017582756,3655490513562055,5932230356908205,5937774256568494,4449996023969967,7330949609306289,4314234431658163,3284857504700598,7315786649655479,4736665120823481,8495522883401914,181538459801793,2294710360422774,466067796048070,7403212474057761,8816160036403403,3193749853216391,8879277032825890,1798517306112206,6219539284375761,5381303928207570,6187498283246627,5525532840505534,6636988783991002,4528166076291292,4944532888099038,7766447402899684,3413758151817448,4363837921696124,8126706047366183,4095516083861748,4392201312631030,2323857485043960,3382301614815481,8322653668186363,4204686294931709,6800199703746817,362471156971779,7228685916379397,8972794542790922,8269894869907735,6917330019825944,3298233907869983,5199947797207328,5915800597518627,2488390956874025,6731679700056365,6943160240683312,4706049834724930,7773964079846452,3349976039741760,8049932800440643,6709413304367430,1365807599974738,1533766722222422,6047644391979356,4750962687229669,925457030519136,1318905205512545,9058498362399074,4074554923678052,2015672916410087,6590004680259953,3037518430280050,5192490037025140,8416669580564854,3255217161247096,5991575055186324,7526841335716220,4601238773348735,4225708756892034,422561155792619,1534303502268808,6289963927525769,4060178588653967,6310687572244884,3336299088492950,6124131264018841,3475182182545817,995361564113309,3488929672001950,2806242989152671,106087554151782,3819189937945000,7601423879199151,6403765709748657,1383947438365107,8493065883933109,2289914671004092,7638223988742589,5446484962884035,1947406614998633,1556239279020490,6567294581661856,2458119661124486,2280312978209234,6110432158284243,7580343161158102,8152925572217303,1771565044431325,6459199892666846,5231378410461669,2633117908163047,8761228085352937,3811003890620908,1509859104340461,4263134747621873,5656401498323446,880995652057592,6154953465507583,5849993811016195,749038659456769,7318501668452873,3586376976013834,5713773625712386,1737703868520975,2971526189316624,5332705536326163,409294305581588,2264752289663406,1563714468452886,6870302245861914,6757822078858331,2415988235909669,8385370769626204,1657801111173677,1426691481541167,2600621835639219,989728012098105,2844395321899583,4257184884914755,2018623980083780,3377470659058246,3055332216765003,6966104292500578,2663901212949072,6508220482157139,8580642765896278,533677204421209,6195041307015772,6558531295734202,8038534826654302,4010805651536481,4338837028878947,5461954127084134,1029252999982865,5872175595092586,7694260815936108,1630723021111058,4493535942441582,6963410295265912,7644812712550164,4187399219739259,4438194028059265,838329178643076,5576687663243030,347918729575053,6307774400608911,824347867699856,2045141888064148,3913133214349973,3190349884922520,8440319856573084,3221229644372637,7749971929365156,3906696774843048,9041829001460393,6757304991111851,8339764044176045,2575561063725742,5139229371437188,1689531554306738,2034760649980596,3910553736493750,3316045318708393,2001519638567610,3440675240458939,4692182750034620,3140296388819646,2769740513887349,6319401028623041,777687277709771,3333782121028292,9168838358586486,3436184868027080,2729880875612877,858685963393742,2203253159213775,3692961781922519,9217767518894808,2951508493238053,7480405960479867,5529514922590570,1085453122214631,7581171637811944,5009228542302953,8538393641968765,159425618164464,74173699193585,584165697037438,6002799212919545,8685476349271143,7336948876660523,1486616169495300,868627370564054,1703316202928902,1671914716175112,5081081460439818,8846177327250193,8883627753265939,500505865493271,6120686759213849,1320322476587802,3380381212171037,7640577873689376,680866426092323,3040119726185252,5021111797204488,3182797387086632,6978156399262505,1373067244423312,4891609885690333,695232742906673,1111428498773129,3497634148075119,3646196150901567,8206648465562438,1615740800015175,3784179653219233,275891709483851,4252783705094988,2968717010852686,1302589489675087,7899263149480785,8753508465875796,7793676583582556,9200383070750627,3360448598629214,3143018973526884,5385979792198118,4050470875536230,4296046998772584,7090069395929961,4089118207253358,4635245869857647,7749942396750534,5555892276304760,7375558944521082,6640332989586300,7871837166492545,194454585662341,6689253387500422,8584516909587335,39732878367626,2087189827140499,7095818567252885,7876417608620950,8404269216635803,7381793617279900,7192659330565275,9065842115091364,711937787655509,8795049125116839,2028187245091752,964120853216561,780168235059699,1820935601545033,1941743001303994,1835195592734140,4460337932336061,3281685943761855,2828486624025053,1319465834134467,6616094820752325,8251729698356169,1143736900033484,2012059341659091,149573276056532,4210647262108629,5079690337623000,7174803963001820,7571122346277853,7979713945582558,1979006445586939,6647947931057127,5934722163809256,8057716827282409,260817215921132,1160630248930285,4599904484932590,2823971840428541,7172519876942834,5272386685180920,5114979985253008,3369841660451838,1369923080220501,5783989333666304,4598520915360771,4015277670782407,3982737843100679,4027733846367240,8283069168532492,3497059301194771,1759708401335316,4104383097427570,7936766486248470,972462962564119,2454666017050458,7037975305246,5710315131419683,7722249590873124,4359505058323496,4194306530851884,2134487453163357,8768777974848562,3460813827608812,6120729687284790,2988516916918793,3899336267565533,2448125702503484,8494662009502218,8701543681729717,2369994435894338,5136790687726659,5908275078003783,8608485868076115,6834369205574741,6415455370345558,7464605997478253,6802661887425624,2758672718347353,6803118148852830,2414732602604641,9098619701255270,7424471285049873,6155367671266408,7661463840152681,7381756636281963,6392829613390957,948180632419827,479351898102898,400129150622836,7846601795435642,9029077062417535,4818343244774529,5131794488499331,4399207829167238,8324733758438535,5488510259257196,3173103199321226,2890367479946380,8600915875699856,7367103301147798,3966149641043096,7537745635630233,6242844671900186,1564730571106843,6527149131783336,6270822014450857,6074639408290988,6492325472640174,8541905262247088,5398668422192311,7520573939367098,8949573316541634,7271621865684166,261839901973707,1939055425690831,8976401560034515,8653046912466134,6158065039883481,6115263980944607,8769275338202338,1080775083891943,2581611930516712,8621632311820773,3449827301448940,4114819352583406,3282434966196094,3976470039215350,7123221473533181,7232643159858430,3659731610295560,1728828599360777,945391500344587,736718817017730,9090055443037455,3381002772374744,6727259943105821,500334151875862,8685850890069209,2949843919772956,5360164131421469,1374662094470434,2466821065609094,1587903041008860,6627175312776492,6608967621399773,6601924898200880,8947814064643377,6629548982361395,5489967664800990,434663105740090,4533026897706301,4603851534138686,3305714230992192,9065771554315586,3351601368210755,1061216184048968,8153102680268107,6486845152279886,5067480498085200,8683298359795028,5140552771663723,849948163423575,7468902614310235,2499539824942428,3771393561918535,2801860639120741,6123356694199654,453745360485738,2796738001870189,8253640321645934,5748507413183855,8467769680313715,3601143570996597,8431453100170619,3047576859540860,538582789201277,7931840182984064,5732569572219500,5254282708155781,1513115051294087,7232932768180823,4425510118964622,8652629393161623,3940142306064964,1652307608976796,2209892500487584,5818869061221794,1453112692997541,4526661556477350,6725863418928552,1737962258365869,345937270562222,717689765076402,7922572271713721,4352603433049531,3254832061758913,6633348590353861,8852214119513542,108766189830049,6200613581356492,6386034813844942,1752894315675087,3587418396630480,708516434017745,1254127728942551,6953093134859736,7685105092433146,1241637433515486,7426415841320415,583109847014880,6606260526949627,6439739231829478,8921697609585916,1106199631740403,8760826524909044,8002818171379190,2621662149998713,3732000985021944,3393461148163578,8286269765696715,2335149227539967,2061899944418816,4857556358970882,6406931733534855,7843768963982887,2678773517942280,8262377723182601,1152496887913995,4580069425356300,7872394658602509,2751296428270685,3358865997692433,8706052379385363,6155018710048276,4094512231549529,5183847735827996,1777835802328606,5534381848796703,4728408690700225,4171125255396902,5016887254085553,2454279477526062,7374658377227824,232707764526642,4467277210975795,2166989778566709,6146048477773366,9165493897920057,8524768274570813,8029747724531716,2405794195004995,4031415808327237,7841808179977805,789455951877389,745411932970577,5826716650798683,1031236674447966,8432832165121978,2769889388191327,3147859464027744,6028515532111458,1427621276737125,6087930950155878,4323139039673959,919392467189353,6174135957234962,776534875013054,7107783730273913,7374686899322500,5626105994597654,1341973376827015,903635535289992,4825368146917996,9122722033974448,5541338209713805,8503837196656270,8324950980558481,8807036115246184,4592842487479958,7210574162394776,8216025407356572,6353407286320798,9105117696065183,8386398003294030,2255312465870790,5919917647191719,8127473982783144,8618184823923996,3483074122522282,1800995096297133,6937764470300335,4006911592890037,4575629362609847,875390071783096,8805204698349241,4708334367858362,5448505842810555,7462393669240097,3371065396810967,1519704725348045,4373174397927120,3574267606064855,7672693217435354,3444386371764180,6346362329153248,5800020563107556,9020047819669221,724519046414055,5058680227364587,8033417907797740,2411726123458286,4810498579136242,242751165636563,4334741323103993,3109178595097507,2037731130875648,1833559763279617,6000351955484418,5943452196560643,2648109482639108,5023622973800197,713293323837190,5689495219260033,1211738067066634,6646309104066316,5943195928370962,7196363467693844,6689406718189334,4512018752151322,58538094731038,8137664565254789,2756112973471520,1569275591270177,4460787381485349,5329427935520587,6894792334860079,4742008536506166,3276824315740102,9190944632737759,1938379301732158,7343568737754945,5606343632904002,8657412627488579,5247587648918838,3972045156974408,5476767812403017,3866538071007052,6736965661436501,249663037964111,6847889312830538,5033865590603610,2122322741796701,6444607631228768,2486424702343824,5394644190266683,2874035275636580,120313572851560,457654362619753,4107906972069863,9001286252740460,8162784529629042,7061462669033331,6032552331198324,8100761143590781,4800973294174082,4152066311921539,3545473911021548,7725073372282764,896200435171213,3230664942485391,2962332549898129,2125601411293077,6345607304011676,1303302276038559,8856506704404385,2229769575604131,7599674074980260,3108595682647973,3806748701736883,1515702173212596,4956105745342389,2058443869413302,8621918217830328,7011439643246524,1645395842236350,2069672634826690,4546099039117254,3853901546921928,5109828314669008,1905672789254098,7745247612239827,6692188116615124,1701954503139285,7437439639158750,8363813017550815,5420848264511462,1175614536364028,6791788363456491,7330985173417964,3153319960551406,7322356297973743,5505199234760690,3928416784015354,1816842737934335],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/972d83aa010954aaf5ad0a56f30f43b6",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001836275.1/GCA_001836275.1_ASM183627v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KV827883.1 Streptococcus sp. HMSC036H09 genomic scaffold Scaffold0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"972d83aa010954aaf5ad0a56f30f43b6\",\"mins\":[7745885506894167,1214930324293636,6732187105323013,570959108790279,7974987086782124,3398053590266747,4174600479527938,7274999048554510,1800364528377871,4815459624005648,2128010937022482,2192983370104851,323437601929236,6602652753041429,1545920438519831,5449001504919576,6755492196808729,6463757665415195,8190248251965470,303023636981791,7322325697155109,6426435937662641,3610785317775400,2459376462659513,3773353977733162,508875004139563,6536102850567858,6308841475686448,4977554012092468,3102722582310965,5558130993582141,4749943885905983,2493682628249664,4108011386776928,5237255965893643,1847854094723140,1181159360344417,7351953779599432,6736007448310636,4323559549280332,611013621239885,3502848667187280,3452354852479058,867322241200212,7356817033551886,7771009064222807,1839280281649243,7406259797338204,5479544326352991,5841444458291296,4356343322994785,4149289124147298,2812233326542952,1638969105311851,2253538973725299,2539226087620717,2838821160642672,8403670325916747,5504301168490612,5484684251480184,1905289297381396,2432715640828029,3467097964623998,8922202109069333,2430357398353142,1781532602753158,6335553931483271,8150241518784648,5141722278793356,3315733489227919,8896992930547857,2087372917328018,4346749751681177,4036131335542938,7964667570976924,1942792329326749,7758187017961631,8273070568140962,9131740267139431,7803881730670756,5119818320679077,5449478180878502,7736485834180776,980192377581737,4638203016253613,5859927516131505,3544349491103922,1743342386999476,3026260645519543,3060044990383109,4967392025714378,3947551853074624,2953665188874433,8834426272774339,1994043796965572,7200084341498053,1896367566221510,3806220441008327,2403665386506440,8955100809894089,7284600262248981,8170912421712077,6714958503191587,3560228705937620,6184663482622513,2185304098267350,3099923669512911,772118877407452,8267327378551504,3966763500933346,731197349271781,3068256189978855,1031682279301354,2109507371112684,29170977818861,865996418951406,1564332663333104,4134653119830257,6361337243953394,9096572428034252,4464603769121014,7883316285647243,2410714202865912,1910812978036988,7532347717429290,4661990414778622,5842988991232255,6344776454263040,53784788947202,5879321577822467,5895157052585686,8967047611355521,3781288969091338,5332283631235339,3723126319057164,43440479381773,2474439097434383,6287196354685202,5170574699694355,8939030350366997,8440501395825152,2886074231266067,6997955492576644,7114995602014497,1502647346932004,5010225398958374,2342476321722664,553364134428969,1794827466404139,6039582182760182,624474396396253,55958486716720,7350109099049266,3413554757650739,1586420879567157,1955296063373953,2820784308517940,3097175131750715,6500618335318334,7043323710968128,3292974780223810,3260955414524299,7061752088247427,5886606438701381,8252771381627206,8425319925461319,5526899722453327,3902046231603536,3603298240915796,2406363360264533,2467302807214423,4628338749143385,1597054581662043,6498560078797149,1583915571300702,1584441308936544,5291620546351457,8015619107047778,1153879012473187,1619498588848485,255778204572006,2934032762965393,3153907173253481,8252015570860711,6628506778751342,7515100713246781,2661968161380724,9129762329287742,466901218972025,4423105402464634,8982360545077652,5912110815521151,4554243676584320,8925490532399168,4732354961607043,3859768176141718,2585365975265670,3814951233972615,2798623094567307,6390667292649084,7585854855621699,1417290623957396,8456008387948953,956953435203992,6242898095562820,4107938238212507,3483184321171868,1100360344927642,5358404762972575,357949338861989,1935718588826023,6003319339700636,1149194215436716,1238075025070509,2793270378498480,2723450353215921,5541318717243826,9065167691964848,8098865579702708,1515490397657525,3386951814924731,1194061310740680,8310133285278794,1544370683095486,7961334599154113,5301398129527235,7535165453457860,1791226765040374,3049046283315654,7851558667333025,3303192434354632,6800466303827703,1861076218784204,7888076370834428,8512258147529166,4869314161885648,3835306170673617,8379141009478734,626596402975192,2531905761411545,1636425636205425,2760408604285409,1290510064726498,4039910634716241,4548909128710908,3924036490815979,1925335653417452,2526760167018989,5163312916318702,8351706294936048,5539413386469874,4710097177633267,5033799853912564,5811561537718773,8918700470512119,8550731685413368,677544401975039,9129251368448508,6730227342869930,2103176203266558,2795411769948671,1106734982606477,4804206315215276,4221084140823052,4771765209238034,635041871819283,4383259090082324,5324290291671573,8227186277728768,3043740040589849,5480215604548122,7083260393283463,848447525773853,3154161325603359,6689614740462113,4477917980178978,932178895239259,1186779160846086,1705057167120934,293307759844107,4500835949074985,5501230936840626,7222866149419566,2205592691550767,533228251765297,2512612219918898,5630511124761139,2318947062448692,6016727388101173,3330027068738102,6928730804648507,7348510959422012,7647407838421770,3760070569351742,6278987952755263,3074731315022603,2450984467884613,6746444219631957,5746937253635511,1906101459016268,273608292418125,980231430365058,2914029033738832,7127469614252100,4035755790248530,7520686275155043,2470345337021012,6373280324495118,1146882209247833,1854117026745103,8337159786734172,4132271794420317,2869822072668772,8828444920353381,5598815091765862,488494175322727,5254649923758698,7601251293135975,7754333812920010,6396235830831725,2424599423138415,4250383556407920,8070578299496552,4052748445792882,2214895396319859,1984379047705204,2946089239163509,8420455028734582,7581223505422968,1990086777629307,5155284664640124,8544982933236349,6290322758386303,8724282772025233,2769293634884225,5393276705395330,6066160852181789,4339332603452039,1870815574266508,1112236934484623,7777158039777936,8079236149284553,1952469414644374,6931709116716484,6906241090173595,4121637653103261,224493254852037,6083451943453344,4043136153544816,8393802987553563,7932161444436422,4993027147319974,6747428666028519,2933958424259241,8037638647509087,1085561198926507,8803210625497773,5372796831070895,7125488696234288,1228383557508552,8720011720241842,6297383723072627,8401648229573301,273485874440886,2555314787146425,5837351034720954,7749286378406687,7028156929299866,1442039726131909,4145126986975942,5346716707668680,204487741417932,2435570503144567,8651570273151907,8342754385156813,8607342092743374,4583781422514895,4984030148805328,4970534210886355,4284654792620382,3291645751249621,805721695650518,2776808017048280,4161832816007901,8118347973444318,7627262053339941,8263220511998691,8335445635812072,2874392362451691,3321342241995500,3159296621531261,7600770001064261,7156450203525876,3078944499591926,8824540959927035,5893647951008508,7619446772079357,4707805034373886,2192147485750016,9190011301307101,1492251486784260,8335656947153470,368740955226888,3329795469925130,3281621415506699,4892655060232975,8953229822404056,8432821866570514,3850275206925075,3398965509088022,9016946924354329,585099434228507,3386138147206618,4751480609905438,6241864526312223,880010294645538,5705665268381830,523328868326182,1259463780279079,7206062184518440,251239388773162,4845336849900338,9176523560816083,5958310396539696,31272159636273,5837013724293938,503145191037747,5143634436607454,7003383978386230,5972133665618744,8973228459544372,6614199025787707,4759206978737157,122716683612989,2094125459270453,472471849055040,782594073508673,1379557076841283,1611847346502468,8853998147986606,3407083184643895,5663604019926073,9030725854862168,4137348295830361,341354776822618,817359331253218,1691404797389668,3847102764616550,8333146531216529,4498080876188523,409050072376172,3964145196887654,3223600034470766,6555076572758896,1016415816014705,5414395420332914,4216112877345651,2759722752799605,5095102630798198,3549971138125289,5940248825002872,6538842300570489,2970182584626042,4408724138873723,4472015150539644,4078854208686973,3941711862586238,7192959561761665,2449614481689475,4501596511148935,4842548923853705,1005338566896522,4250192010793867,6525927400976640,6256465120232335,4749559399496592,4123542447502225,7933146693460462,5137985885582230,4421404974689176,462994517233476,5661539703956379,1016454242034588,5738048437017501,2560934570151749,4458725998023587,1426531157664682,6926200076206059,8390594178385790,8948263734377390,7792544386012079,3281974902901681,7818456045191404,9001742592101302,4093051554120632,8090082227057767,2996167556082621,3237371899133429,3612996123663296,1369205082721217,4561816267107147,4216300657357766,5593114550686667,5583843905027020,238119321428941,5991981154528209,6869061275769182,7764091149621070,6439386591206360,221786539574233,3850793222976474,6188993645269549,6017037957524875,6769742254814177,4305723202264034,7197613786377187,5517790552499173,1289179486411751,5554235025853417,3003527234868202,5176519069113511,6999719716469740,8616285535536133,4288040036312804,4951968113867766,2583569534508023,7331920813030394,6637416474584060,6481044003706413,5478181869769729,1560122658855938,1999653646355461,335805420239880,3060143544607754,4516237174748171,8651020756049410,4971665342331918,2572879589254165,7233170992505879,587373231488024,6495226706816636,8667042603863074,5062309078350883,1451855425504294,8868358137144465,218618447053871,5971210462258225,2109178863713332,1990972817200990,8942975923117110,5454176375079991,1660640136019001,3442747225994300,1178636490124349,5469225494673753,8058674542763072,5485169299285059,4283502931428421,6413726186468937,653623325992009,7174908036084810,7627482505239735,1581641536289870,8754386463958096,623532151514193,7294707131098196,8476846512651817,3487448754136249,2229343600335960,7025054226518526,9191040206283868,8491355176869050,1917177227365472,5370454803761170,75379106722915,6672878101273701,3640202699592807,2260779207275624,5933422219912298,7007491519859820,382549762671725,4131465460483182,580147590546546,1279452460131443,5878571743960180,5544155554870390,1181920140760183,5696731108191353,2643830939579514,4192293596170773,2381465584444544,14548618614976,1630581459799171,2597163832448132,154822611013484,5824798078608522,2593734512133259,601271868032141,6675638398170256,3720100518495377,8304720044555410,5484950513429651,7499903381806230,373640093670551,6847685066859672,5586476870859929,6796688551363740,7723245796721264,6913463783224481,2482232780412068,3751812605893798,5789465279904935,9147933641232334,7810961486262367,8862684884266404,2156350654411949,1543286812204206,5174233591862448,2185918233134257,1824144872244404,7112196106409143,4283102785635513,7282004038388922,3479079040117260,4567823400244418,2187696685204676,300075545947334,8467827101797921,424797188129993,4080755185059019,7398046079251660,5567878247605454,3707225741780176,8563489662450897,6454328009489619,6505663417736404,7035860592594133,6994161362468054,7430922500845316,5029151592889564,2881500758303965,4818737392676067,1878176851586276,7734847495255269,8530426475949286,2154017579918567,1084949981099240,7871252503714684,5589977681485034,3875664459588844,8616956064653046,3567746304686973,2928463070219506,5528663363851508,7533176941290741,1388095444333814,42867372617257,3072832372342008,8203496872795385,256618765352186,9064493445051644,114669823841533,747137179350272,9027127499119874,7675057764113622,8975003915937030,6178565701352712,4313501022424329,5852400223403274,2680107776902412,3573360247942413,3925091808402702,2989944884148781,1754495676564355,6523725575003413,5896471191731480,3099810451107097,4268094994806045,8170766685143908,6047990553009439,3783918863394081,3609776238564642,4331261096562566,2302084368528679,2439030710875432,3242417082522922,3021278781870983,8390795944092972,2719719782423854,5622962571355440,2108696766404147,7073017765053751,8696804363065908,4229439956262202,5516674936653115,8089483974192010,7733119658875445,2087578325923136,7040949930149185,4783727152889321,2306617997716807,8912566481681736,2343066659075402,7788781166697804,2726661014998360,1528343916272985,6086065958821213,7425495965349215,2200860360506720,6108221743784848,5182361721536059,6857739062666596,8820578162101606,2507699942245265,1949216357649639,8993120121490803,5734860342607220,7069176275453301,276762588728695,1689930299245443,8813786907987331,6355679202616708,394260849124246,2071436735602055,5560928694011272,4215211698746761,2947746662772106,467054035996043,1606982095562124,2129736225543566,8940022681479405,2708574317585808,5395323828891025,9207082917891474,8332628223692180,2410687390037397,5351330649515414,806849363482009,5222736786460058,7937292877919644,7777716915578270,1928028437387504,1983935728926619,4781478713951652,8619380621530694,7058928444982694,2861880072418729,6056642952768412,3251390455297452,8552703028452784,412557450901043,2811466481968562,3063109814824371,8670638061649334,1316656641344951,6110201721265592,3433114462651833,508998627534751,909464292871612,3162350095355325,4171929982137790,3116920505742783,2023276377107904,3475520903218626,5993384056784324,3489845972700406,3906517715819976,8978952786558199,5573126294781389,7436327285478862,6668489583339085,564779998352848,4342760871760120,2037541668445650,2096045439237587,228544163730900,5946994218396238,3111075155674583,2350481807134168,2952858366250916,2164897714238938,2168216352153053,4381212342857182,7988171392753124,7959166664167,96597824427497,8947142614511084,4158805276599789,3809137768871406,4946191961511165,6521958032739826,2248911491109118,7745661459631610,5418905744545277,3472154457067008,719134921192704,5514454527667714,5950556888532486,5925329090461192,7864615723232779,8581290212357995,8321026266621456,8367228559683092,7954480912337092,2622830969427481,5483857697170970,8492087877162245,2383241900012514,7450239558424100,4629556646286885,777519130922534,9005662883313192,1663013605420585,6001311476866605,4456232790478387,5476448301602359,1692111874950712,2337304462984761,7344439814606394,216115475103291,5630924496250431,4014329963730496,7264206565826114,5836432012101187,4672795096225350,7927199547204121,6357361947769798,2643026943675978,4964926805573197,8052764783766280,4896779007691021,8879010208526070,3372450823118777,99226194853464,3751114786100495,7959885257031261,1479817349840361,4455067443703394,7900811917061731,1780730788095589,2341425017837158,4768934288635495,8156844276544331,7621009901064807,535300047382125,2300222396604014,4753396524834416,5819745389110897,8182238590052805,4362288908664766,4136198134586998,4272306154737273,1156108050433660,1747000939144829,6640514042728062,785133093682815,2613783205844608,4347066209377922,3453549867148936,1385018851278475,2387216675206796,1341777891565197,514461283214992,5748144300050065,8069987517379,8983992910925460,5908806989617664,5182428587179674,800546495864476,8025528026861279,6392855210496052,6324765148661409,4904175743481507,3896671433119396,988989406948294,7136012144957094,5386497710874279,3452271881184936,7605611019520924,5391776708921004,5710596708265648,6373330772514481,862823159477938,2386918403562099,216737473498806,5572818005833399,7412991499841209,6953488243930810,3374959386541755,511240224997055,5375800335892160,3370960555224769,4897340578724811,6171245589556355,7983860816246390,6040021320961737,5491074085512906,7708430225000141,4450124038457038,3753320061171412,1597300796432334,4916189093811926,3043506314940708,7716611290015450,1611625952291307,9214145374295778,2206972604665572,2130773237958373,4450274794075879,4871796500803305,2626745603923692,8103513036957650,4430135302127342,4268011721070319,6984427312583976,6025501300735730,7799682966708576,5007282062491382,6664817502320937,8175078413362937,3368273296199019,2675369364850430,2030618707435263,6171499794036480,8641193387216641,828780722269955,1222409405818628,682858621298438,1669792714267265,8316874298710199,4439013461094153,2570894690981646,447480853276433,7024404029490963,4869295112290072,1264277139861273,9000450402393516,2205459406757660,258966123892510,6735389054023457,9035913137708834,7730804614612772,371564178634537,9036546160535339,5969491072476973,3746503437647662,8293893624385843,1956420858767156,4356482607947573,5362524805138231,6531745755082221,278424562140991,6118579559798411,52571308105540,3988100216903493,7046692682614598,890525521766366,2864299892326217,2358456798883661,5396090123378510,1968893189861005,2239451074248530,5724444932389519,5415680538298206,2669104254599007,3384549077728709,8981536781093636,150790534680423,2806615826517864,8067340183535467,3393171666491244,5125288132054895,6654449291878035,4146898539290488,4435039178995577,7323446787653498,6619486196778877,3408522629369726,5755171203260289,5758337377699714,1114921660826603,8328206332216093,3810144389207941,4687173878568838,6990269418710919,6250477461964681,2975404289093514,6177967785318287,3237022909847440,8543061920066393,759663532884595,8302591021363524,4746737383225243,4120640307091356,5809643619180445,4090374638159775,2705232223932321,2729864226776996,8743923504582590,4796655420284840,9006805388419954,6601336879388587,8325461377142700,6186058106527663,5472028793943984,4762684868288433,5587782360416178,1369870763644852,5827992647173730,7598305531500470,1122230064713657,542347747397563,4182766267917642,5324231945818046,1246183702918134,2544593755300733,4153983858100174,8665489840902854,3275267323168722,3000266998964179,6914957829818361,7562319471464100,3964273544363998,6517628072808416,54882516983779,2932440824119268,3391587970058214,4249744670939248,2004534051471339,7862972567629262,354068754173935,9188508815290358,7180162650134519,5456499875225592,4054076759113721,8698398145199786,2647109273376767],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/978c4674f45437d4e84d0a0fc11c424b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001467335.1/GCA_001467335.1_ASM146733v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LKGW01000001.1 Pseudomonas sp. ICMP 10191 scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"978c4674f45437d4e84d0a0fc11c424b\",\"mins\":[4852760785051648,8302451875389442,1180396131803139,1518601204932613,6401415630135302,1070666555624108,2030141149888522,7768907170603021,5664363071741967,4712438229237783,282973320126491,1621757581672480,610040823398433,1814817423712290,6884761610330150,7664330809081897,4106239711633462,8890768404496393,4677611963875388,8982739451603123,4971449024421958,2866976763707463,9007903220179017,5044729985359948,7947124244553806,3486222028398672,6666146340233231,1804612404453468,5359915298594910,7289657972457567,8548991433760864,1762122291814499,6583368950095972,5097392563069036,8955859546529906,5330037943337076,1764947811803255,5382602840350844,7947820103360638,3368962854944896,391368760246404,8635027379216518,3285597411273410,4240485913190542,7250957245497489,1130750028325010,436047295398035,7439208969109653,1997295932694678,3678350541299863,3284315699953819,2180225716519075,6884124542214309,4422575941075111,2819794470707368,3602247859437739,393347931545776,3526400377602225,8984789866296691,1601452239249591,5110607737384991,1655137057054908,3929265275465760,2888959769059524,199508757012678,694469891588129,3053362893798093,1171805180084437,4902194842484952,4130360197439707,6361288046245242,7740820139016415,8955278448132320,2176568525037606,1949465938542826,9110411624011965,7260431545983218,3207042770993400,937597944987898,1579659573215484,8968991166554366,7146041100714239,6824340513784069,1265721025380614,2614382230298887,1392589139890220,3674862642651404,2433117644095759,8952140185456498,7444062355587346,685388155371798,4210925327409432,8956530093121818,1573815685054747,8268549622563100,4255827599859999,1012280608694561,1225286614606114,4667997520003363,5500975609086249,2846855665221930,7359433421832493,999512044994862,2373341356376368,7928724314833208,4763181035929913,1062920566391101,8278084842914110,383214233076035,2416512596451652,7097321591216865,6809944004960586,3431657924354379,408745583337806,7201884181897551,460083462185299,6830159673827674,2045922224284000,135935294374241,4412901122589028,8149815134167398,6074105535062376,5914568166097257,5510173047341420,22829295935854,4011030428123503,4365720179851633,4570790751748467,2349035687821684,5999785152823676,328945375396225,8523913478513027,5131788755101078,3236244018815366,8821055829160001,2366147342098824,1827343582060937,7875234604892555,3284716784042382,877678593338093,3838389515141522,4060178588653967,1845625633178008,8158575259648410,3681182708826523,8678252536858011,5073325249851462,1983726003888551,4530922742981033,3339781516419498,3339430825812395,4566607266972076,3339138542009074,8490944523256243,1386775944479157,2005432647623097,7732924580356540,3246828106105281,3160278231359942,6757812549083592,658097690020599,7826804618240462,8061269304353234,4521052233007571,6829725185851861,2536478632600022,7367845571756505,2837307689992668,3077122100535777,1275872119792102,8764571174416467,402196848050678,247840867115518,953695723250179,418082901983748,4705578284696072,6443607005821698,9163230598906390,4437050539767215,3162234015973920,9114064399868452,5680667381641308,6823019099374124,1354180721377838,8054265349620272,2086614921912881,8436474290192946,2534775624623539,2915650493296734,7855932427321912,5795456364241466,5841645765591611,7346967574602300,8890358461194815,1019017883984448,8014720269492814,1461908045105933,3482843644445264,4747491315466833,82666141688402,2343453153460824,655310361543257,4482233995256412,8710956845089374,6890486114296423,986414120051306,8460403565257324,2741155835060850,1646311123174003,2096095428276855,7599835413783157,2602147027739254,380946622120567,5933812492395128,3325933149258366,3291262540907135,2499489477532788,2979622759752326,1190835672703627,4948831762178701,3733200665690766,7096766666531471,3211412063707792,792328525619859,4423029251015317,2514559123120793,2959457458692762,8261571472769691,1668187615486621,2778753076047984,5686111367283364,4202078421000870,2547864915002024,3128714391159466,2295418722550444,3928714128871538,4710733068280495,8871269208359605,3977276673402313,1193450743434015,6964934665503427,451526636061382,5985960947254732,68989457220298,3913805392331470,7748437088699087,4766410688045777,5807531055276757,2813534330200792,1702206236476126,7354685489808097,4546651755324133,1584970170491623,5176262578365161,7424641093346031,8325839926870769,79665792762610,667177629729523,819129986310901,8268235022680830,7767934424892159,8984661015102209,2510043780399874,3344140828852995,4858546652291847,1143778739381010,7418747804590867,2363835139761625,6417158718350109,9062552049459593,8637144498987811,205750130795309,5286682202997550,6806028076016431,972635318264624,2079246066451252,8743179474617142,3673365298611000,1258952895980345,336765069050683,7160880115753791,317720752931652,2778489682797382,1918988274336583,2586357643643281,1106570105742161,1293577218147155,7815503117771605,737801519965014,6751837611098967,5394798803264345,2476272671851361,4333503365243753,3862792141079403,6782696308851566,1747716852368240,8624238255887848,8757082079822711,2706267767227263,1947083518108545,8556558695588739,3203234481652617,2286625238108785,3597954767717272,5987058180121500,7603441623699610,9181863360635035,3483440590216006,4460318467892137,3142460202771374,5722421953594287,2431409350141427,3890932894468739,5064512334521271,142155276010424,2974094370931641,1203977875317694,4531140738458560,7798516341877579,1646607782822852,4759580135965643,1577694606140364,352054774801357,7656053018731471,8303049261465763,4840536601764820,6067755410686935,2649780313842650,4290727338755036,8405425767547879,5072266888564407,5867966650319016,8121103213757427,6824103357219831,2553721120891897,1073404949734394,1343289626018811,6478646357353469,410441877840894,5319205642421248,3982052697662467,8275426870502404,3730105659491335,3577569677165576,2364116922663948,3520653140878787,3427036431655953,4698211044254738,2192693756614147,4592837721523220,1679112340284440,1551776856433690,5025962886292507,714062196302877,435638815128411,1677710993294374,3689194984424487,4891505397466152,8702113051894826,52691376849965,384794958013486,7356014840236893,1098012836381747,3081300501464117,4053538161830595,8473228332658868,2118782844847162,8368142389511227,3652285841851452,3901504848380989,6149706300015679,4296661479810116,96666056197189,2638417251147959,2808265559663694,1895928585962575,9136005352427704,8903941642699858,7910489726477395,6721561389778013,8878890749731934,7798943261156448,7026824193917115,4519517975061604,7878891493868650,6728566155994220,681622626285074,4050616959116398,8176191161238639,9027660546584601,4892164863992949,5064564214555766,9049998154663031,1626543260443771,4402683393123453,4251390673757315,4612938203923590,2127800376968327,4657106096277015,858000143811725,1697207418143886,5180593959000941,4158660227056784,645485747836440,565037092380868,7186236157920410,2315290902070431,8186075941635234,7737506013745350,7549274980304042,5399434904552624,7701839222599880,3273885493257395,8691162307404980,3473266746074295,4178375120397496,721381236688057,3950489816794303,7929676583138848,47262663918786,5979809523360966,4525016462394573,4969743809848526,1186637825426641,6008131581256916,8483211207746779,7616951616668892,5870781059990750,1691709077857505,4964709685200422,374733180249318,4568412258723050,169467566810348,5041421389276397,8737168124486894,390906041967856,7579486863418609,2801847072351481,8187794342151424,2169896746042629,2424785395098886,1043672293999881,5799922099168524,7531675358815501,9059783215276248,7004031817016594,1285260157723924,4382788202923287,7862552781896580,241057854424351,1128562902754592,5407018021224667,1195000252278052,6398547584378150,5435137479787816,4203282808005929,1927221382948138,739013792859436,6908274369979693,254389008344371,8282590818772276,5889860106814777,4795513668355390,885740453274946,8394904092271939,8268876118328646,8781320338261319,3246326216770889,7075861334123852,224606946321743,3155401113052498,7164548109387092,600527649826133,1048309290845526,7416591372166487,4320827109574202,7573173860689246,331428563598224,5641333946426723,1406367258002792,3079844180002155,7133905768220015,7619653752456560,4236581683627377,8036380034884983,3058318769948025,6801800578835838,3766885786281343,4742136449656195,7757574073640329,2236258634745232,8489987064620438,6923973247194692,1558486700139931,1407186844673437,3112647928694182,5494167490799015,3676871045162410,3124170883589549,7421241707791794,2157960524350899,7245994829260216,3016472131954108,125005672138174,8735693447005635,5940435069167045,8450254135485894,6662279194469833,1071616300508618,2584044875728331,6470844011144652,6181913232565711,8309971739772368,7840255846801656,8427036362556882,1158955528480211,2387296521225687,6275484084356569,4527410213381595,1108882585821434,8688643402756347,6325377380812268,6620832411782839,7931876044047854,2164502217713136,1691212222465523,5903320741266932,360721432970744,2948418844886522,8172000582723157,9194978539283969,397908999266500,8439168480839175,4442556096857608,5090558528259601,5086696466433559,2760537144575513,2501269889443355,6659153583064614,737168356541995,2036546020853292,9516075586900,3057029930714675,5218208010954292,3757125831452213,743608359847480,4558744341603898,8693887508006459,7750939380543818,1511449192564285,3364090093332031,3487202752521793,7528799695668804,7856585706939974,3115287587923529,4658354322351699,7220869170669140,6672364873483861,8413063099475548,3146237560800861,2297926459557471,8257958583977574,543624032650855,2520505375508072,75238543246957,7115259653400175,8914709986102206,4141870829635199,3162117503993476,6128020167689863,8622692941383305,748801898194570,4666295939835533,2051930691258001,3394594503911060,1914051926386325,4942233882363543,8732177660225179,1974447064606364,8983360870975133,2097483020281502,1144499805636255,5176893162948256,6039129487701616,4701609542403746,6804639728772771,4743579364730534,1083045709604522,5697916259681963,9063741752321708,740704328820397,3619422990935726,8143530391332529,4708980464256691,4795794857993915,1847246243702465,3261490890023201,4381450315310792,4328286608819915,4614343695501014,1776874611047375,8466907903985376,2029714350393057,783827276744424,2203048056596201,1051283603908335,8161214252295920,8773383107727656,7811754500367955,4566826685794035,6409702480675113,3521982422279932,4823885963626240,2541163053295362,2076971318619094,6804442438149894,6670782550451976,7831573299656322,5477553445062415,4924595709814544,6521063369565969,2859589096015649,6808067424536355,1548508614625060,281686850316071,1182454478219051,8363211472398124,118796857345842,1481456001140535,3660092167382842,5540750265526080,4280137009768258,3808259428116294,72927315953480,1146870135785289,444607967029066,2986418090682188,47160020626402,7974718538131085,2363133037225820,2410770557339487,7710389327308641,4323908295436132,425758874994535,2963303516079976,7763336867473259,1272416908011374,7295079113901935,5979324885174128,2520060850583187,6109483312850805,2435271845837801,6686793007957881,3521085675407226,6761705069610875,5701503827814269,7343647814272898,6116062458341254,5279330497070987,4846453653735308,884169868814221,478018694014865,818430166442307,4653925801936788,3641971933554582,8701208146610071,1891700830103459,4201223840991140,9192430305011621,2404265791670184,6691609616639915,5564778345023405,4861610723674033,5668252453783475,4922125064660917,7398297311348662,6477263323498423,5974577153066937,623274813736892,8485959187030346,4237381581260734,530773564524481,5353439352416195,4669079989856196,1058422339823557,2160301406103496,3500678478202825,6504937249441746,8146046604994211,1614201472231380,2793682179803101,2248230569551838,8057790307330015,4987911539894241,7260881248741346,6579318084159459,8057252127590377,1516078476199919,2753543909181424,3718715172300785,3515262558529528,2880773461649401,5388271463355881,7235097228716047,5993368210319379,8041401659713558,8812843177776815,8934250820749430,1536718992050216,7788620747327532,7107946716284973,8554724760340527,7428588667750450,9163251013699251,3902146372773940,247133482977334,6277401120547168,2149525219567685,4803659087497288,6595313004775497,876416066103371,8952562864695372,6446148209969229,7730125627598926,6102598502287439,6863112927881302,1115383661805924,4170759106963546,8600010920527963,3522424895645794,7540552459913316,8468875674314854,1013043013830760,614710466676844,2717970034526317,5897979850074223,1516536204132712,2772362061088886,1343564122335352,7632805441980538,3480387848816765,1592675350907006,7787824735316095,674048884582528,3321922437138561,5017170516846722,5882297362466947,8222040271112324,5414541853034630,4791222625757263,8542993757104272,5230772133947537,410573141624980,7474867548588190,4616741770406047,7312254207387812,2176948590594215,1255106206000839,7469996319148206,538503785040047,6921156079012016,739193097652402,6884181383840115,5767579114776756,26600776943797,6443774547290296,1051242224126139,6600968570448060,755646464567487,344213360715970,7928010447145155,5509820929140935,2300714853981702,355142401853643,8267288297662668,8916665181571277,4133417284626640,3904890883066068,6332378727303383,7964509538765016,1332722174142681,2669713506281692,6876476762335457,135586071382242,5189915890108644,6178375519840490,2169931506559211,2870943524063471,8875890831657201,7401759005567223,6286271271323898,6970643948415227,6718292223846652,9031106391345465,7017124714719487,2758915009521920,7754997679511254,1252280252614918,657537528359177,6947667919833354,5246802785847563,3064140348958990,7984386731076653,5286558186522903,2845692505770266,6406384408815899,2771968656918814,7116097579092256,4844052870498596,534088324839538,7543296898804007,8339504220621096,6968932846045482,2210774692292914,5353752440850739,3540535495000457,6269861785479481,6594015182735679,1783515760732480,5049995492411713,3563348463192386,3572344386892171,6995134552836426,8895408670378315,3942152072104269,6493168874506575,4564675055675731,3242950431541589,6078185132190038,4350831624867762,6335438119078242,3901855934493073,1712899604220266,5989608248191344,4077563076938104,8737169280723325,1932176794642815,6950643003911232,8672629949827459,1287147887593860,7605263739726217,3820967532095882,3240690734506392,58476074928532,5998767182429252,4030325315668378,6128587834771872,4316671508728225,6422326400297378,1603921276428699,6467712888613287,10523772004776,7727944504691113,684304728811949,2258779653024174,1003659160833096,6577522172414386,7215532427937225,6232964157476329,8981457990463905,6773280872360394,3974386022517195,2541942781749711,7907156600160536,3472290061167066,8030809297570267,3077912283097570,6975358965688806,7965657821293037,1933710384605681,7556890981796338,6153792359229940,6371896888732150,5545243493075447,2124386536811000,7869601480534521,5474670178642427,7373089158023676,3403754808419839,3528872980810238,4550897493661440,3414534417885700,4594570131270152,1421726062832137,2731833166588427,552138371115532,3722853567310353,7944771205786131,8283152122210837,6536767657052694,8486799255333403,2735829265721884,7699482358144471,6311823402854951,4815879534107741,3647079502465591,2180374128577080,9001424111968693,8468438588123712,8064582279031364,4277742542129736,3340523277191753,4705993852275276,7185578539911765,2643817250955705,8783193609742938,5188057852299869,5561478509611617,8239368394197603,4458284970658404,500132977379941,6336774150063889,3654098163911279,695205828536945,9147219154930290,756521361263221,4092424119519865,1163562604300924,5734726274386561,1846358560369283,6507486278544011,8683973145856657,8193362221673108,5956082891684974,3259039673821848,2749953292208794,1754828640594587,3593224504316357,6436165476879011,6223996421917356,9182707306474157,3151011134442161,3625957998307988,4971032120281779,7993852157856436,1809189698505401,7732074503203514,1570682761915067,2968960693916059,8386460811201218,1700008596173259,416882304109686,4685085887088417,3525270559419083,2968295991421647,2981722741549776,6485633616325329,1491868236655315,166182371633876,4707769532943062,3126708879813335,7664058437176027,2659674978798300,16400314968798,9163423899732713,8075924676575018,4334701346073325,1175965293849330,1838445689326327,2115941799766780,6005295391311659,1248463061691143,6293974544067339,6127442695432973,5625106709056272,2417692872362774,3362100670081820,6961860766386973,1698407291341599,8597406531955491,1306815023401768,8361785453128496,3122586782403377,6699297171303229,7833532348508990,2623904904997696,6833431526058817,9178801604078403,4107762993400644,3363690506160965,1089100504656710,4296379984399176,5480331386661707,8806678109694798,7995688496372877,8160066345700186,590037061486394,8317157054188386,1828905781163835,6444171608492900,8048866976352753,2992817650789224,1459632852757355,2928463637048175,5988136833698674,4476240449244307,5712701474302837,8871003664395126,3580270153460599,6673554190060409,5218624929483644,6991445448217066,8013026228915070,3121057376907759,2392214890695553,4347346806623107,3526571799956356,4568280812063622,5189462562540423,7749207020169026,5635579212499854,378752242592655,2388475923999632,2514790966061970,3829943584091030,6023300743998359,7948726760213402,2662943531936667,4180155876281247,8993344107662240,5425029495942057,2930141985278896,6955736071687091,963890439146424,2515597902867386,3162405510433951,1706546858601406,5125709538389152,7813542821186501,3870230367710152,4434797052275657,4863032037403597,5950941273983951,8330071741041617,5758199971498965,2507703414402006,1937927586376663,3911695923727324,194909539519454,7942700526545890,8699062325834235,3007370272795621,710167026191336,898583220494122,166015306050541,9127858122845166,6403014979458899,4318172820868877,3532176245238791,5105573157286314,4410017033178122,2986746348301324,5821325575206744,1214485088152595,2740599854074904,4035633441939972,1949237289433858,8165226014373722,1819642010897439,6361579994025005,2145715674713135,3148230085381171,5538565017431094,8581152653028410,8156376899210302,4929875884035253,6966015802147534,6575858509728833,1286601961974853,5422867956001864,7489170208492619,1157233115384913,3976873165261917,4787514378972257,6776931664047202,5641666593918056,3587699357710183,7763235002125424,4623798440462184,2641222497271191,288567028927605,7455857021168758,7779943353986169,160484479757437,4293705984355462,5986258440203400,7962314289056905,1008388624575682,2073660246142094,2037645026913425,4938178546388115,26157818817684,7534867909298030,445139783298198,7504695798099095,96100906929305,6217111283854491,4545652151561372,5423032171613343,8197399318138016,8112203212467361,1881980133215394,7089212124032163,2766689611148452,9117882067209383,3564222854433962,6142510152297644,2691635371510958,370794251365552,95161928043697,8294840523066548,5145470957685941,8352443940760760,706896363596987,7826054873910460,9196571094730613,6112440422485184,6989291124485314,2798620824186052,1434194259868850,7467173672602825,8548040349174986,7446246214995148,3009278745578703,6953733385620689,1330962202832084,1717030745566421,7367852242914519,3699589267746016,6875205284818145,4503498604104931,2885229524430052,824323150204134,6275603682340074,882162809834732,1991587769798847,6214241576340729,2027455506468090,5430266452806910,5743830403404331,9047769560141060,1974650087312650,733300275244387,2971659846077709,1448740672933140,7011309223898395,1742911244602653,9104753438369670,4213201611762990,8132120612982064,7506806745969203,5503959934111031,3025100759567584,6911030049646475,588984420617545,364472932371907,3139568040562001,4653024443616596,6332704877464917,2375368948862295,3457547095698777,4492194373086554,4854288141266269,5962788188638562,5566909039635811,1709438643408228,173492969803109,5990090222112104,2362347808469564,8483586773728487,8016170118978701,4757614559907187,4602382916914713,6254271762843573,6394736518679930,8791371854859645,4442423520095615,2870232747532864,1832427106463106,4730885489753323,3050485260208022,7413272802872711,3267654527692169,5738715754220940,368672578833812,92190706683289,1642028225146267,2690009185316256,5048165841628577,6162375964691877,77706827177201,1942010624044461,7062971122568622,8786200773217715,1925224446496181,9045673197497783,8701900316413368,5705070376922557,864463454522816,1859874114425419,1765089257917894,5010600921157065,4211757930999242,7168366759882187,733072495136205,5550485927448022,5156443700383192,1102888275078621,4044324123512289,699635811712251,2772194288782821,7695452597046761,4586498703830511,1664316136560275,3747109208608246,4521021934562807,1302896715017720,54875157402196,6627580535752838,3892448489418242,4161101997092361,7987208427056654,925476250488336,1935763597340178,1916699568795156,5924530565721622,4134041582177817,8151176321994267,5138401371172380,1703247426678302,7148288674901535,7135433781120545,5964396754211419,2281381823639080,6568894900825644,1552628331341235,9203629482520111,2514381722349105,8138720885878432,5784704283554399,2036296504618557,7032214277598783,2708903110135360,8235313693707841,1593367254363714,3719402660754693,7354091707878983,4501253844643401,2151047584992842,5627391807884875,8177819231211084,4690424033906255,3626572585561681,6353035152690777,5102924432526939,7988269868396124,3622254516268640,5173577044651617,4973204125126243,1673562442518121,2520121099374186,4425988706121188,4338509771304558,510807579750001,1398536194510454,1329504212848250,6776263545728638,7028844052860551,1484547382546056,7661589813015148,6092257491553936,9082095876398360,8800068461080211,6967505247112853,6795576161242774,2539000481394327,2972227865235096,1008454197680068,16191530217115,7353115692590531,7918810947866273,6663826753211675,8507920273837733,8615584871938925,165189499268778,947737586273963,3873806202408628,6360697092483017,1087045502815930,5229385950285499,6814739883589246,5641621117726404,3917135612751557,7955548236451529,3764814480600468,1410894822752887,569053607702226,973773965020892,5328147559935711,8267913179246307,1545074418740964,1711925517676261,1760070240653033,114899664342765,6429899574922991,5463755056180980,5670989684223735,7479327018697343,7964056512540412,6048402543202045,8385429490044670,7131106419683071,7946518960992001,5911898037767942,1464169018339079,5499346786914060,725568712855309,5172107360677166,414973844057880,6252192279234891,1132375574507295,3674192694943481,9120197860765475,5418240423956261,7623605898812367,2761996257578791,312371582480171,4740555728121653,17834896068412,6056255127580480,1286185026989889,8449911517278019,5291672838196436,10388858957641,4167610574670333,7740359493070669,5835711361552213,5485379783331672,6772463156541412,5936303984217948,5763475828702522,38670045998943,6411140096315233,6301986694066020,8728618157533049,213775757889382,5882459880476522,7754038392704876,5657966492897138,3739204058178195,223501854510964,2171641562812277,1130691290959734,4644526781196265,2088787009580921,5945854944915322,6068328134553467,6391810018945657,9083475244994443,2077739651387276,2477006546038669,1579309046091668,1936381242191765,5864854814576534,809374314516376,7299330788028320,2676512949612450,1437922560298920,8835756506746794,2526308823199660,8607112354664367,6680433062449074,8652985102036919,4144199946448824,7904290496851899,4249954491903935,8863507263352772,3858061619565015,2833119523106760,513620999974859,9107882293415887,6032261535608789,8667342905268217,6965604428016712,946582455136220,5356248052789925,7289546218401764,9183986524618065,6723587725791911,7117543467659244,7197030222016493,6734973570961391,4279658593473192,2862517318193138,8572849188679670,1828704745426945,4676975749697116,7059739841695754,6570099874762764,7422304684879885,7279647854858264,7399166249144345,901275326106970,3404022152884255,268838958551072,484045198594086,574945059793040,1340048162377772,775616551186477,211618059071540,3493602851385399,5213711483719736,5302389664837692,5107045643423809,1449134113173570,7290486576558147,1092809142366278,4067414015471698,7025891947916643,3607696371634260,7494457439391832,4945551471824986,8839314616373340,1691490880155741,772282506301534,782499047911522,6710155211018340,3488281878576486,769151043252327,1771709252931696,1464573121949810,1219870196979731,8814379487572094,4479650697179263,4595267523809409,3476125820145796,4977219149017224,5879804266844310,8892438033502359,8998228118171800,6232086538440858,5226610972168348,7677101278351519,9065878024407067,1779369315618983,7389459798003880,4190660917612713,3410840707330227,8044332845977780,3254871059132597,7226362925281464,403529242382527,6883507266597061,3143097271439558,6271741501239496,6774194344259785,275495366308050,6896055633000483,1428569388011733,2197819217375446,7672589396185303,2767844734824664,7081961520402650,567476132023674,4970016988696798,4302625464078560,9017147845253120,8852660698935523,9079899405103335,707463418532073,1735801844682986,6191526398628075,8913920035097981,7478195788189936,71812273860854,2712664863707384,5457100764221689,7296519728910587,2149861157353363,2414585681806037,1666223377518861,2734771239014673,3697499845497114,8355240683196700,8107416790987037,1622108066115874,5464662043242792,5661470459064620,8313940049457457,1700515299833907,7302611621225182,3140032980365623,7984019120857499,2240285095317823,7295669625024833,7867972151669058,3464656484921668,7363215656081462,8800235283517767,256533736500620,8370829043241290,2434234878267724,7970529124127054,533635630870865,5609048213877079,7936799859102040,8392291464466777,9189921524314460,5722224697831773,4959858526051728,6130580170453346,2744203132105061,959504028222183,1467620060123500,3163111083348333,8290318356787571,3020222895284969,3841809968566649,94440173515131,357479457493387,6282333085610381,416345077125518,8649941063856527,2015535707500945,9205631740572056,6973672415359386,6878136809845147,2904002837352860,2188603775005086,442125864407457,6432518899175842,3466858379104676,5531296779735465,8263083873948074,5475511323955628,7990963079852462,1068718585090479,7212632485786032,215364539381833,200146242154949,2057436763959754,1338292182544843,2845837825700302,2880620427481551,310528248451543,6256131512242648,7152025760133594,1315969097552347,1643135944798685,965351572884901,2018066155164128,8832490182373858,6822057918583268,6087548712169962,8380561367839211,2561685185688047,4771500432962038,2638481361859064,8434946097328634,1612901376926463,5368167139119612,8475796805857789,5145131109134847,1032397340939008,4691530270405123,1878193888784901,4355163242099213,8556019024769550,7819934808658449,4366838381990418,4441563969073683,3968297673227695,252704061624861,9094010005719499,6754947921580577,8328571871367716,6989625318347304,4039806127043114,4524626075824683,2318579740480051,1504600635322933,6094222163407416,6960148112634426,3724703255286331,677388280533564,5038410799600189,2803812283683392,3844730762711619,4812292564193867,192075137413711,7191063949636178,927926514512468,4710201113113176,1634556151296603,120606951518813,2619560631448159,4184857385620067,4942278979449446,186001302295143,744984997483116,8321273366934126,2520053308797555,3622616847841385,6827764468724346,2396630043734660,4571892749316749,5817224966047853,6827002020942481,7493994393473683,1430061400707732,6190978828284566,3147555773960859,1722646651875999,7998307595629216,2980484804235941,3143053061231270,3745397601686183,6303672599859880,9196774393388351,4760564629566123,3123576623927981,2628987374514862,441121263506106,4044320102412997,6892283106267847,9144312772903715,5121261045038542,7890159519544023,3112007015002840,4634627391025956,7548011852985052,507638946181854,7821862874591969,4697630368438395,5296691489059556,9080506974851815,5575312420227197,5614563533304560,3001881958544114,1744277181403895,3214291659451968,6514205969574015,1951045110133500,3093352185754365,1494425859175168,3374132511290119,4921131940688651,2522186364220172,2393087532446478,1507548624958224,4086371601265425,8364483684848403,7893111432508184,2423968990647068,7602167065707520,5919372231586595,6070019184038692,1248606534333221,8965763854717138,6776769261286185,7894946147382061,8941687594487261,8832399509984052,8598575833084727,5474555628327738,4875632181777212,8321906112465034,519619936236363,4868726310843219,5278820064957271,7678554030412633,8761514020795230,5190041343742816,2870279874925409,191881424565096,2062374873281385,602039223776108,1802600200794989,6238507038823281,5870944863417202,7523828907537268,4971650306478967,3921858057917307,5357289099654013,6411317734218365,4633628563493761,4686818698081156,443879306844310,1486127642727302,9135127313462159,997605735224209,1232169652925333,1863767944599705,4857105967928216,687360997553051,9259416499100,7725790572288154,3309780504941470,4560121898881955,819320542073764,2405040268039347,4590269330690985,8441185236562858,1651294703547308,5904761579508655,2155445523002288,6684010545662110,230155542098870,4159796555147423,5164763656524732,806809947681725,6776286709691330,3013825757107139,4467709656691653,8837581802197958,6495348062327752,8591233909117900,3328205626135504,4109833316542554,14743335097307,5256441992975324,7905105726690271,8869683917427681,6552933875479526,2638624927003625,6416514913039342,3634537605665775,6647893420241910,8286105908794363,2526370544645119,3683584015303510,6423310469649415,8834203344106507,1200385207170070,6499845906879516,8416259635180578,6562354514957347,733501118968869,80281702519848,7819658477917226,4384811684197420,2176248109222066,9052991638418478,3287700328305711,9126473764631600,6696949366109233,1347667069998130,2253587727837363,5587137185616950,4067919502562364,106061780816964,5563755489342533,8703241065542,7975333694043207,4196458965491212,2379433657431117,7509939212006481,3688979916371026,3356443480029632,2215193953480206,915975270691927,3758746400502874,634791931237467,4442545558664285,978249728013406,711941035151264,8782465252742247,8059009383429225,8115617126835279,7810076142851183,2823393291277425,5848568351544434,942713961657463,5118806330053756,3633010674087042,297633986786440,5407727019397996,6528164098372748,2003857033090191,2310722892354706,2408181599769751,2809438086067355,8991654221921480,946314732500132,5029474934715557,1059535612359849,7099943544640684,5298811368756397,1674255753598128,2328461044331699,3602485169878196,7505816008592926,1908596888284308,3704633170441399,6125564111705274,4137982079573535,3206198315095229,9125576742155454,4686571732939967,243083760497860,2293093746300105,3344118932133066,8424101402121422,2172731171787985,6448722289381532,2162358657266900,6163202764477655,8020452563711196,3649871816668383,3795048615498976,3790478412084449,418380123559142,8566350023660782,8989802255235283,7081238837933301,5397454236333302,3269998746981625,6352285732287739,6282925062657276,5436144688362752,5443739947382017,8495057624306946,2429392723719429,4662983781676295,408710975788300,7133168681669901,5982473936214232,5360375062721810,7991321247741204,105675771876636,1725808121050401,4753865625449762,8562117269386531,7635555356849444,5625338148304165,3941168249943334,7293099638543662,8138653957272882,5338581247964476,5301293827437888,1914011419620674,3643145195140419,782465734694212,1593196938253637,7938277279626567,8841506455811400,3640216413033812,402236326581589,5773090953311574,7988933439944031,3409060404827488,3627288162964835,1055047863948647,3346165614810473,1631248321942896,802628902917491,8863737037460855,183529116276089,3013006299886970,2771344960591227,5773857181963648,5247368798424640,5084282234549641,8784286381036938,2902497261680011,5783366870656907,481053031626125,961289287071119,6079505606382993,6611052782949785,2990431051224475,1271964206183839,1920719738910113,8460559066043811,5245490774300079,1136857980130743,4941263355598268,6209201036645822,3851116880440907,3746735010731476,4975886504965590,8654768940733914,1790308110100730,4057762417153503,1712599407392224,198984348308961,3710598137648612,4403853567088101,3854235022859857,6798980496791016,8703260736017897,3980051068190290,581413460964847,7130943576880625,3539618943964668,3706084324447742,8940693152485703,4444296125543936,7629273253636352,8901911010190207,1703331719569302,537489498919852,915250510132749,5701930214086159,4815579317483026,4724337983456174,5755348525569560,5326824554165790,2015919924033055,2779033318684192,5840913851610032,2566294477018658,551178552217179,6088928778745385,2267653455156782,1711037213824567,5122705421030970,4548427456984636,9203643949725245,6647916523730496,7838331319973441,2285752852318475,5733604791080516,5710743144051638,3494401558354726,4612149105055303,5697106021824074,3622336095510249,3886794224645717,1033379714334467,4255061708248665,5556166467243144,217655368054368,5596883671160421,4072333140465256,7634085718087279,32303945406064,3311903845709427,7043893798860404,9122079048048233,373873608914553,2585348645254783,1290944940308098,7601440408442499,156012832929414,1131368826336905,3684862320580234,2873425038227090,8193902264456851,137943086093973,4076657898501782,7636652058678935,6265456706467482,8212263932163741,5888472246285984,4207700942067362,3683499483625123,5604948373280423,8267809172584105,1232015128057516,2698229477824174,4321332188845743,277782956775088,1549890712991409,8960411378316978,3287859448936115,5547936481736374,4967954728990402,4129807262480077,2507296291018446,4241565117839055,1743908444772054,5114410569588346,3405157096634078,2271146441905890,5834566772799216,4565604369206910,9057383189198867,7771571387589588,6338230501340922,6719380729181949,4529420844390144,4597509563195008,8260444197648131,8730948204623623,4994730392844042,2098192533026574,5138221746083604,7059787770091285,6855728904378135,2692342350840794,88848899700514,6032039358093091,6555279597433820,3558582040680234,4596454980826925,5215716193720112,5870107338528563,8989413671270196,7665177699440438,8269567561455415,1679977756882745,3908580131181535,9023832527468349,8959707244648255,9202144650958657,3814608052975426,5387910544152387,7391437320206151,2398200170698570,3173656287934285,6736664664684370,238495676946259,5284464641333696,8594419265836886,3544144597510457,578120786466648,5560816169375577,7445106813081434,731552252188508,4774339396769629,5271244611114850,7099029816571748,3954337130870631,4698435581810536,2154416401127275,4750576362477420,6011199821510511,4419690839635825,90560582940534,9147089169954682,5998870572513149,7347441657223038,8515039044253569,2406045045192578,1837000204744585,4444859980781451,7130525379352460,4473249177474960,8020274697443218,238447036116152,3490428125230997,976553291560856,7395866696865689,15158028130207,6582967509718950,7003519351333873,93349196117928,1572552383289258,1631303579277230,8882942209030067,8602734497372092,5746128204335434,2881436690307006,4554041561814977,5087869990254530,5194902130936139,3807392842864580,9165648541686364,6655389303947620,1327281524766667,703287145586339,4196066025658324,3216597680527321,4586049362717007,5878722918143964,568961850955745,756588460021730,2878962776114171,8512162529482724,7790874513610727,4264550319118314,1571480967788525,8506625697142769,6531516081190905,8063930084521979,2985253537699836,3460553295706110,1401362048243712,5537843879843841,7979107915831299,5291022775785484,7423237760538638,6864857880115217,3203274906966035,4597916089178133,2466329690880022,7776372015937559,3360075580749852,6958912317577249,7649635688912931,7752745640384550,3818046039816243,744633342523444,1063899499370550,1586158690868916,5893816135653434,5445475206920251,8948429434427452,8792414139037759,7606431954434114,344873812393164,1669206161766469,1715205041805383,5972062352422985,8903742288066635,3849017616980054,5856388459927641,4519878295361634,369198503024739,5430889074202725,9211026834439053,6220214491347049,732838059284589,730598529112175,4184498612942961,3888936034564210,2403739532630137,7233442699409531,774781080107133,9219989537986692,8689430605723781,8283560189974665,3928170392483979,4809943573485708,2684630913562765,6496371426637966,7851261729208463,6874566986184848,3165988507924626,6429963210111123,7384376909969556,5179757150607510,3512520326584472,4709634487146649,1901188344043674,9142522198595685,3649940872472944,3345571861887141,4115182679898278,6074745964025093,798970961860779,2070243443898551,7250838584359096,1658662408263866,8096670773418171,7050134849517756,4899332468076234,8586847199623361,7851480618397387,5694576942847318,2211422699067590,5158636240304329,2797915498772689,6548773447080147,8493629929388247,8327331225622744,5000393354672346,3419177410019023,2747944705464541,4999990968039650,2530540521289958,3571431286954364,5522733097829416,756878940092661,4392201312631030,3845815758633208,2897413557599956,5092735658752250,1783791598958847,6800199703746817,1922462510070022,1847403434588423,5604146927723565,4003725561198865,5483382388906258,1707721094183187,2482438939285782,1532765093730586,553834844805405,2478462864005408,2472551155947811,2878920342326466,984553717340460,1851624302016813,7348975158171954,3911119107224627,3867118688254261,2246491438569865,3211094051019066,1412917023013182,1055570001156417,5195200072399170,6756278458721486,4538029405408995,7087281244895572,2077154099034511,740665937541468,5323025271175518,2207763602422116,2688127865968998,2996809486756241,9197897226688873,3914908357720428,6366218871331190,6162261596765929,1277868757334392,3152799237683579,8507069258242428,5565429744458112,150685152303489,5900692369832323,6015666012510614,1697127822449033,4648897866398090,2116791648745870,5599947762121103,6687326637234582,6863003390522436,1963072969533494,5832133901187485,4016627474766240,1956874204077808,4418819649886619,5070925380606373,4854686379727272,1983328097892784,2923344570046903,5493132348152250,1937079634811324,8432793879960000,4305770813979074,2087889601698244,6780516996987334,7932494234900944,3117592139504082,397868715514323,4596083052141013,1320106439743959,8411824185752027,5429211135804908,6241879242848734,7477509565512163,6914363481389540,3239942242769382,2876156953319912,3793927712430575,3939398084016552,49676098506494,4812864344553975,4968765211236857,2709330268445179,8139936525916670,484297704217087,8003655679130113,6904886000556547,8616872707652102,1212323941104136,5203979615476234,4856801940937227,6659164735969811,1056867596622356,7080016359741981,8833674421811745,3856016672455203,8194614523935271,8008573643758120,2304674117717767,7418695221549612,6534964822145581,1465303246748206,7008632696207919,8179787559565435,5452528929035358,8148877742103095,8616743912913464,3884453201345083,6421884351084565,8460999158536766,2645824631822916,6482074458733130,1469048238463564,5300562071337551,6739379686636115,6841594864974423,5136654205409880,7634767790013020,7870399060204126,7347379105831519,4018492375071329,8392880820648546,7481630278548070,9201764542732903,8332608979409518,7521118691154547,6866985917930100,6699435828886135,3640791896910295,8611798976584315,6717174476235882,1655338684717696,7306876693027264,6618685039540868,8986380614236805,1571905514232454,5945984542472840,5138086074112650,3381852217760395,8701663164766860,2661185398446733,1656158898117263,7139417768835728,2343097711401619,2705236360739476,4620568121689198,1678730634885782,4726506438662810,5876048834599579,2200750667545244,2223337506740893,3251385889921694,3539562470079136,5176006200121798,263430763526823,9204999929273001,1088216243190449,5632900150819506,899824991763123,1622771295836852,7146870473898677,4398971986500280,4750441445866175,87229139188419,2470972871449286,6183494808304329,6063080401369805,6746906818191931,2486787596950225,4942664367635159,8325835698354904,935845284551385,2135801562757850,5260653562968798,5427972108181285,4165054449154512,2720815150414562,6237278624332517,6259206482926311,2294007265589995,2725416284338926,5460842606945405,4776105891118888,5922167601199858,4556733067549139,4142641414298357,509091266125609,1294751929350904,2044522004830972,6709282152823549,2722261992160002,542576209681162,3871094801697239,5850774019414799,5219753127885584,3534382556420887,2789918296804889,2182434628377370,4166790686530331,1761550250441503,2021943059249627,6168715290114854,5127393041177385,1542309566159660,4888061308435246,1159636197603805,5888830495660849,8332250898602805,8891385589603126,8317686570040119,2055968764246841,4982614098893627,6867779796302653,8846689562952843,4357782866377541,6408038415448902,8323792040885064,9139320548414604,6253807504186194,5826954528766805,5984929666874203,2317270206175718,7049850882227047,486631930289002,5543073481505643,8862021110740114,5958413193821040,5034767694838645,1828941503781752,7375558944521082,4165555135871872,1605160566971266,1878483405912964,2965533951187847,536915083901833,793723351276427,674315000265613,240241846262672,3097255917263761,4929314077899671,2284679327480729,2276242835880864,8652087866930227,7258993280076273,3919870878579630,4255062470564788,6011870019460120,6057713715627167,8705942216809404,3750246550150079,6456797709523906,9002554511514563,2366511478373316,706404944231365,3161886890572745,9067565476076493,7703505573400397,2228689980758994,5214368617855956,1151189432966101,3872587931048923,6116863783664608,1302088464964579,8780379197529060,9218656635001829,4508868323982311,6207609973762556,4127351492738030,8001559556545519,823324162956272,1934429998603249,5899928523889651,3409308566240247,4712384958184441,2757374128200702,2342669747679061,7021508194622465,3960673211300867,8594350457347077,1345226131905543,8184923007636652,4737762960382988,4497231271541773,412139171544081,3951979351931922,6127993088523284,3367949695179798,8870770017095513,4481740471041048,2980144960617498,3012764726836277,3367187677996208,8640491517705251,144132991826984,4294206350253105,1400546056272946,7721144364842035,5039375131327541,7836662153606324,6998770909674558,5410043260681281,2649153001577540,8844081399435944,8101795884440656,4007587965205586,7450703796485203,2979702260169814,1869760403995737,2429932888570973,2356348653337694,7899544593775716,5710861109238473,863800800124014,4629834186783856,1919720574712948,2992974285929589,4855018591935611,213079280428111,2941833213115517,1716369100512383,7576950992436359,6812065023491210,3798828001049739,7047168781622413,438015688531089,6805516798973124,6468641175911579,8503701351357597,5367326912511140,488223894543526,7202466238831785,5246217659399338,201815450038130,5746553009339566,195983629089967,3064538222378160,8362615181704369,6716022615628978,7985910711992179,1942154531978422,1948886566091961,8897755996429501,5412479874292930,2893859137682627,3869733145976004,5712144536420214,6239089025718272,612228465040584,1208935338024140,7371818496386253,5930771718085155,6354562062908628,7406109606937806,5987674351828183,390670448770268,5244897302944995,3164235613494502,5018130991199441,6205551104072938,4258773586296043,5200535475625198,8437399750868209,7083361616477426,4159584206314741,7141330174606584,3446877925489913,3880940656409850,4193114413333755,1576925241780358,2151830254943487,7708693274712620,1462790162513162,7206332843945963,1211634786131224,5254616885820449,3564943513238811,6619346691038495,1947816350735649,128304795704610,3956918225173796,6059323647838062,8034994066611496,1994717074734377,7012545072258348,2182984055684404,5319678855413046,7806505521642808,3727190700252474,3822529009999163,1988849205329215,7124862987058496,131162224393539,1661241847389511,1362179490913609,1137859496770894,1062041286925648,3561265223305784,8115471680683349,6839948766199128,7550459328413018,5766617269738845,2849189011369735,376342412880598,6185686246497638,3850287950625340,8926295025384813,8369735804075375,5421800064433520,4651728077733239,3485132263075732,5123081229311354,8561123524517244,8288435639377278,7633636456349057,2934661768715650,7786096948247940,5204611975650693,488562884156806,7386064424942984,6909907065003404,6621303010401680,1976335015509394,8453778315719918,4265500740352186,749350497328537,975989779578268,1467163898748319,7226576742079911,6787073466441129,5506010010754475,8775605947055534,5719909125553583,2093801848593841,4406603933359539,8964131271990709,792558181252535,4551812256636346,1931399730347935,5398113525267905,2858304106464259,2807691449006668,7350421287345610,2627603810874284,4711700746665421,6577598905867726,4694793939852752,2335073599028690,1148542635605461,8073155118916857,3026332362845256,778051026288090,4359481736510940,4145161199295967,1592017906769380,6151488365264357,5969738168196585,8054395767061995,6622801222942193,2405133027474934,4764357668601335,4579119460089337,1122487304117759,7062478834613762,8520060352790021,5255287545708038,6167827850722825,3913256457575948,1666224160136723,5526490541473306,1777835802328606,6489885762543135,8404364953837091,1739810510454312,248386744294953,7548252217138730,6194353367711277,6308645869911602,8932710971686455,1868617861244561,4518353412160095,1262221969702462,8958624460078659,3341430868901444,1304892281626184,55823119459596,4754475526479435,3009100158099143,3908758844548365,8188574574206545,5160982218784338,1616951418751164,7556040831680084,1789599655910999,7219343195766361,7249369150853579,7088578651233890,3656763977252454,8200817328987751,1979969518968424,3919916180049126,9006567415930478,5793960484988776,1638575451324016,6789778429927358,7366843551881435,5513586730738964,4903627648630394,6659033601498749,4991444178935422,6038898875006592,3659802012253831,7240580376370824,1630931920846476,2702194557910979,1850227435150996,955101026048622,5692055951875738,5619062634932847,4797553836605087,6986079619530403,8292550872719015,2663206837796520,1448090484530861,3235588827061936,2084034385968817,5105759993716402,615338832043699,5124764254453428,9086621193124468,4609470657797818,2117055024619196,1028251022925770,2925666607971915,865359928131270,416496981284129,2664441641844425,6388771732446922,7811345079131851,8582535926551842,9197832977112782,6254986512629455,8677239515471572,6956227878189689,4034893320404697,6004784749690586,4835504809737954,7970528885331238,5640529162198761,7555783549599466,8042621120765675,7634774407724783,9399215185648,3733600471138034,2003199512518387,7334399275900665,2290666530449218,8639199564496638,1475872916208871,4861885100161664,947767140409090,949518186798851,2801720636743428,2664258712502023,5995749278097163,4962851359112974,2367512997150479,8257285806849809,1059019102816899,6579221548389678,4336340523089687,4949263748661017,4916559752142620,8387173695479581,5936379892604702,9022363539266181,6117754819911461,3284441133948711,6699506969165608,6515754731720668,1540634211606314,590065385824046,4898416907820851,7065035189804853,8208192767608480,2786828408684346,7287914280349864,166118427017022,3937116686958399,3270322224840513,2897345117112499,5308077163552584,1761070857609039,7186853485584208,995494740025171,8517827978788694,1105760490028888,4698618358652768,8420635168030562,1715712009702596,9066927322775403,6579117395066856,3171476280950642,7499001127542643,444501370781556,2581112669273974,5830149471600503,5855779389325177,1785406423539580,2999748069048190,5135272125431679,6006784544595841,5648715550674923,6720497181032325,4644156976095110,4278087835238282,4033727620562830,137323379244945,5920948715773843,8637494318669717,7381576243666838,6596058714783640,9003209027878772,8865550750089116,608020867587997,1869419898478495,7309452612602523,5699478964674468,164776621014953,4110429101531050,1898944050880434,6178806327753542,5724674502696888,3994430897627124,5112488664580028,3957208893808573,7733936864133054,772580175183807,1925765749792704,6529819764604867,3711843156303814,6497581721280457,5934136391753674,7413158499508174,7225885970563023,3429665563164626,358665227222995,1812912182132694,2712152560500700,459425401372641,3299581093543908,7476666818723814,8328630053615633,1392036750409706,5997303033372651,8637102503953746,3550972605267950,9108279651298411,3954826671931380,8480055674888182,7756671581119828,767488707661683,1414442424370517],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/97c19c413385bc830c6b2ddc855ac23a",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001839075.1/GCA_001839075.1_ASM183907v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KV839941.1 Staphylococcus sp. HMSC58E11 genomic scaffold Scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"97c19c413385bc830c6b2ddc855ac23a\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,8399084963168309,6506000896569401,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,2309979171803228,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,3234534336884842,3662919159013483,1307705680961644,5936088672694382,5434311755829359,7284609180405873,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,4275434089636035,5392923544264054,197231274291400,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,915883713245416,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,549043327607033,1302574224109821,8212410875969790,2012844047311103,6276844254068996,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,5827553282294039,1613233089708314,1398163635020061,2660901546139013,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,2968451845775780,2246725717416689,8952362163265966,3299864180793775,7745961481458097,8055901273809331,5935630862422453,1161869623943606,5347282112979384,9121466416243129,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,2225116979216847,560690008429009,8153231274774995,3018049546973653,8024176702386646,3275399756366297,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,2462394055594471,8940994346209769,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2629375616291319,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,888109297701394,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,8246219929334314,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,5701705628213836,2591352585302612,3677235441902166,8774502673891428,5556463844942426,7724391001129743,2499002377216605,4888768950592097,1251060182680162,7016685056307815,7180711155708520,8074218591388266,4363284863173231,1951053797429874,2418223084651124,4891494248387191,4162813093515897,6047329894011514,793823372574692,8556996361134716,4194303986672257,4260895368577666,4283429268783211,717815503766149,2166267691369095,4658866579997320,985997338583691,5223980807856784,1430121092358802,4627768844518037,635178958910103,3498889347125913,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,1219768655680734,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,3894727865107245,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,5964542653846317,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,8927309108653387,2642347481506640,3043432314913624,6709902552658779,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,2877754653855172,5137988816335725,7589956941211795,2413571986957173,4845781658317686,8558537765561210,7509411440202623,4117238218216331,5547694202340241,3220718305670034,1314889990042517,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,3602195277108170,360504095483383,6177526526477266,8076461447820243,8794208264791002,122015909989199,1338323295265756,2994560223626205,1953886652294111,3428447854789601,8245677561885676,8216853956002797,1625254992364527,6176712354587633,4752895990487891,3048526863073449,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,8523349380506658,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,9173197031722616,3161510797841463,6664851025699898,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5279738514840419,5906462950118488,3730400047403177,8205328358469135,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,7498960818033784,851815340897403,7973286791894140,6432046918378622,7867843017488576,5002993396520070,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,5424923310544019,1890986035680404,29860417139863,2086986011604127,7190948106835105,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,5522533494168439,2781157967312077,3864648699065550,3285074995451090,8115575334364382,1310375489938662,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3863448372494395,2086682841597170,9047776546694390,2139775766095839,4451688021447929,2744843007502163,1859721248011520,5195275595142404,8427394283750668,7588963357979917,2696786955654418,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,385907700483371,5728268182717740,4911190400468269,7816698054288686,4110401245517103,1336059428508981,1618472691987766,2262947123078456,3333979680154941,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,6833222729797864,2952168537830773,391700864198006,8535608270551957,6713487310972290,2393440818972036,2218257629603393,6570381896951176,1982265176835467,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,6101035983073523,550323193349556,9063963446371766,7854647199692218,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6445091345761787,402247873566207,8952231969012651,5077643932915205,5516377730496009,130457181976075,4396323642545688,1603137902355995,6141646980806917,3517221940119072,2376738954628699,2850576000013862,319524505622058,2864627209774636,7502333181040182,4620747332527681,8068985491437122,7476293558784267,7530221302335046,5907535925622345,1106191012378192,5799343132662063,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,9189100481070687,2338670647686753,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,1290139896432922,7201761792280223,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,651657068725962,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,3817378171000599,6497917926444676,8143513944316657,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,5117258784737064,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,4360520181401411,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,5553553040481934,5360518378600282,3300357632857948,8617233707472737,3843618476357477,6990130627200871,465037166274408,407494504056686,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,2266518188165352,4579041725200255,4607325484564118,5382715700053894,7027985096934380,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,6274847488566940,1800517128877994,5300625464223660,7687547568949165,1586163045525149,1351605086977997,1299923441830899,3086808181540789,7046481273812920,2382029668347565,2009369612101575,1229878691049804,3089495541412855,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,4704429005052921,1055754057562072,624885245548506,153369867168896,8286237998987231,5920383623823696,8214132091116539,2783293737744357,8189536530413545,4891584278771691,5476876315310060,5612209855076334,9044286231537648,4725106938598002,3001959122151417,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,7845638252759060,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,3404645514262587,7805354275301657,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,5090934684186756,7647986012981381,1998211285457031,7821296065001613,2893765109098643,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,6300248156747957,2736562014918845,4034678905878720,4370251230234817,6547833949292739,470023763785928,5902059711862987,6932846907687970,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8910676381798199,8292970583906548,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,2129273223465242,5250171345791260,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,7393489351358797,3115016475949391,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,6247490209868140,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,3791359563410508,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,2098062209071580,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,9179669523560966,1788226934370049,3283597017790984,1458416177129993,2907874448857610,6072125870725644,3498979658738194,1787508922165780,7885678641654303,3527280931379745,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,1768705500031582,8361022599817826,474326943902307,4032519412886118,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7152093423583475,7505984773102219,8603296405064333,2192532495772303,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,4461197842708983,8334953150270153,7277156913728206,3275110843738415,9185892931558825,5402584754821847,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,4952730055523057,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,7604479172066058,2760855083342295,5791949031062287,637717087886096,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,7088305201981920,8711986948082498,7467931263134177,3950687240408887,6821187116937698,4133002593487694,1863456533297999,1635651637476176,3989388368871224,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,1473417792170842,580001466129551,726814415526748,5274301660094267,2746847273347940,5565618624165953,487864828935020,3869761225206638,292057775278959,7255001061059048,8934811836040339,3408611869207412,8441358375734134,1164683235056503,1239923617995242,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,2970622895822659,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,1169438882554352,6086204123819675,4797301698399142,3471569168190378,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,2413290341751739,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,2361765179657163,2350571174063052,8647056119409616,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6076641431452642,6672925459491813,1082376892709864,7469817883450350,626168875564015,2573596889369585,8792974406386243,820079529219923,8045422011980286,1894961922041684,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,70088873618451,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,4355633735907850,5356878132681790,6855779845853707,3711070083308612,4882578364685381,1287098760653898,5675714913627212,633105738161232,2771632487820472,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,4926861423238243,7390098272967783,1960247201090669,2392984746015870,5520592147606656,4632781860469952,3128705817382019,8158821542825094,2669250979570882,6220211775753359,7164537816212675,609922060758164,8540182034447509,1531526026639043,8292399427181726,5241091670625443,1238619339054246,8494210442632362,7129634646088877,1515192525290670,1513303246449841,8875968855564830,6086409751379126,8707651019648183,704029120375992,9182108430318780,5107270389779645,7293093929815232,7986770140512118,8783786815601862,1912994901379617,8197445232532681,6046314350030026,2360605979561163,4803260508523042,7464689979698382,1019530360671445,4086615967075543,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,3349404289420519,5323332702567656,7897782769245419,3430108296223980,4304771496076498,7666194411646192,1378102746791153,2688817209527540,1009185351310588,4298859764904490,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,5000612806597850,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,5699252652330325,5890867670273372,5150153258749279,7882993032424802,4856610212101475,88437141712228,2287535748633830,6204666995137902,958802972458216,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,4836608690859249,6550313765640092,3387633365577131,6403894935227820,5926443562442162,207892688386593,856884970847672,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,1092029821496793,7385626605825504,4736904158449123,6548287328611815,4368166270504425,5132762411359723,7864494568558061,4717078305738226,9088616725393889,1541930783479721,8569995544546809,3152905102806522,4285562358224810,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,5256643637594029,7906524426948124,7863282501620314,5816011168292101,1185378970902048,835582845963811,1345534315535910,6675258019802664,177161577352745,7243701472849450,3700712461854642,6152554647457326,5619546432701021,8338634504957489,6930698324287026,5168981785230906,8453583119834684,3401051871010365,7906973945146948,8763164838227526,1059006959607370,1993005114900043,7682210448059988,8497320404037205,1260771322871383,9086189712409516,5580264614796559,5603043202166369,694729075228258,5862755334909540,3112297682775654,1286345701920361,2407556246797931,2069399351119471,9113559865588329,8084476987051640,6355524819209492,4907233847361149,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,8293699458965128,1478175721172618,470083491171980,8059723177205390,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,6133069365415617,3555666348039874,8660225691913923,2588162975686006,5816608308592328,2300314053840585,8728167376662219,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,2169107663986396,6128252439805663,6428061299113696,984499184574177,5500657232277221,8835865557208807,2541091443550753,3834083608280817,72583097564915,7041236094631668,3931973464080121,1553419814780673,3155522989727490,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,84834187095829,5490276726882074,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,1203079434555191,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,3429891841847111,555164866154318,5640100560236367,4050500137410385,3467276601790293,8920696233860951,4363526816403428,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,2427434620065085,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,1213457523695486,4494558117785472,2569719125127041,4848772203458437,7039911616343950,8599745542954899,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2345917413478649,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,4205078613163975,8952951168884682,3727800611913675,379350842564556,6562173042917325,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,7969431343923191,7266335543571037,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/9893ff8c4def73d5566baa3541b0a806",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001002765.1/GCA_001002765.1_ASM100276v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LCMS01000001.1 Candidatus Uhrbacteria bacterium GW2011_GWE2_46_68 UX57_C0001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,3,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"9893ff8c4def73d5566baa3541b0a806\",\"mins\":[8034439719961275,9095898178527240,4927284392689674,1153582533763084,48673311468557,4499584430593197,8392752987621393,678713044630547,1616327916870676,8582323262046230,9161170218232855,5885210197748760,7129300247594010,5871348418859036,3090833818050590,1078167138317345,5147276276109347,4085404244799526,6389458324533288,3432864863708206,2113956736886621,2423108485566513,8213299292673074,7810437437970099,3240923692095540,9148120370169909,395814232377401,5912094627014715,6212926965966909,410182699219006,1024372509272127,7947163202914368,4273882725141856,5771319567146054,2927705611908108,4923872685509710,1251516012326991,3838300073745488,4048276187911250,969641148959829,7056669076563032,2819204882324569,7832236042253327,8973913538834527,6648406719568992,7014586534382690,2736667274226875,7085604310611045,9190715885822481,580712426630249,34952635822186,5897409017962603,1872296927457393,440298558104690,7477656995412083,4177706415582324,5862518386415977,8016482834884728,2764271230223380,5957455487926398,5923821199460482,1494669235734660,3188173483901061,4959344763858054,8724890200639976,3419177007920270,1796215570274448,934182919220369,5236019266328722,6354214107531118,7150668546933910,5418257628808343,7863108560702660,7594909080071324,9079388546155743,1970696061016224,8886584641010950,8553392773194916,5670616767364993,4140330195492008,9123816456084508,1522964746849451,449942744318125,962363081856175,7700596975944881,8770409720311155,3355472236798133,841897594541238,3366846189488311,32449644121273,2693911621635258,2567714111511071,4505060787284157,1889873266581694,5684692984645824,1809608415016129,800269493928132,8012909692725445,819829754071241,5986030680354469,5592338853414947,1189976861588692,2510177884554453,3321382667859162,4871445388889307,5822941530854620,4759243333726431,8219888485228769,3560506709684451,2727680532526308,5057495679636006,9078690808528733,3746408390284519,6920745003490537,2082279658146030,5941284921903344,8821990271972593,6478996244524274,2769803401089235,1190698943318260,1488731464589557,4915138403163383,8791717642439737,8203235618233595,5919230652188202,7751348116526293,8091871668076801,6788258309543170,7192350745293558,5608479515572487,1125743174642954,6592998913040651,3400707264810252,2322694883298573,1973285102077198,8896299420352045,57487903093056,5364659227513106,2313923893821716,6430010027030062,4216572429114756,6013419368826138,5897002379618587,7007582921909532,2238936765141278,1472760146081275,5732564636064032,5149250598839586,4708265734844707,6717108358550820,6219512608762929,7513948822365404,5916564975279402,6513359834172286,6422352969692461,5544466292992305,1115930766110003,426896913178932,7302692138367286,8738095474485560,6240756464882740,4665753030486331,3576032528228672,26928095190337,6308762061724994,6256705158372675,7053368355877189,5365504169301320,5243099555021130,4245328394790219,7523785936565493,4639031036037454,5809980895413586,2647311696705251,5773398080963924,8101175472771096,4327886531529047,2301969655886052,5471819114896730,1284915226064224,6035830324555107,3818604716262118,4212340331099494,847415304036711,4761349818333556,1009161413258609,1887615111211378,4612198169261427,714334345394548,7966682233687785,6340262728729976,3266014866481529,4089536825599354,2426152744283711,1006330031876476,473984625090942,1689287029978495,7558157513771394,5896031624871300,5579021965990277,5600011892781446,5264956253849665,4197844727030154,8943000548920215,4101631216997773,6088305608696206,5077702041660817,3478071038213528,4708113031341468,1034890309251486,4863825230503327,6741351798741408,7125545092317602,6212265819800996,1529983754004902,5618676590894504,7077968944781738,8702707606047149,8952362163265966,6470924626776989,1080309809298864,5011382955792891,5651997762871027,1326813631270325,2068495120731209,6655268856392120,6407491379209657,1761776580963770,4126233324246459,3649946774370749,4316994165789941,923394477699525,4708765814102471,2321841716816329,6835147291281438,7198106676611490,7542201987536335,1031921944520144,6179712751409618,1657369833361876,8997174221227598,4744000066465244,629652508986846,2088270769591775,5961072580491744,5745234420315216,5666823345390050,3450943371460347,8786176916956645,6740270868478440,256159365630444,7619094299164144,8689749482264050,8649670609614323,76353294691830,3405825692248567,2238699016783354,3180645665545983,3077133346656764,4314221103216126,8863182364143105,2396919230596610,6026549823441728,8321690318401114,1293852414266885,2010019984796166,2878882154102529,4546377749803528,2833082762018314,4043684626490891,5941538388892172,8040726874589713,300611021543954,5895485585429014,7537842075576856,8983938786224047,6535560146165277,5875606563985950,2049026246730271,3689009724083745,6096506601083429,2710343624662566,325095367501303,5615535173063209,1386642165828138,1687038332725805,4111135725632046,4621320973753903,6280218703268400,7762957671855668,71638658449978,1962250442587707,6329241677370940,3658570934116925,4552559938543167,4054517285887553,5878320337788485,6638297023814241,5907314640198217,3847387140637258,2456934061436491,7802690734855937,6468796412977745,1987519826040402,8410318015970915,8587472217102948,937315798966874,6708522300883548,6826630983119453,6747369931492958,2489520216879713,7276259191896674,370839366436283,1859447434577508,6805266396458600,4941146177557097,1820018728816236,966294904817262,6285148935572080,3256907230774897,1064985735363189,6285033416227433,6969917046871672,3877939107962132,1101042706770554,1022521839527548,2230100861041278,2964704215157376,284107802820225,6612403549783147,3523579199267460,3052347340419717,631882478143113,6264000235681418,1731794874930828,8299135856825960,4637764522218131,3090841477858965,4434359673388825,6728837367174810,1738688428971675,5947756895764124,8328685232524307,4366806046181026,8012527564080411,4751232355067557,1703996261516968,8649837772990527,1502269445704365,8348591342345186,3687327936599727,8244019943643824,7903089156778674,3698110865001139,1759014308811444,2138467527418549,6667030922640054,7562834603792841,9183414498973939,6142327080690363,1199766732381888,7595917856363201,3515296327501507,7407249981136477,8893097566865093,5920831287825094,20503310383931,5479840171552462,5010753369308879,4579463345841875,179909436468948,8194644602690510,8471112989809367,5371583236411096,1735389506250460,2302804601916131,4068535146553062,7962373297707299,4946978837688042,6725088975825191,8729659054465044,5802915542399726,5544486765006575,4010450684336881,1746356030165746,2162384217165555,100052279088884,4213655128853630,6344254706925302,7356280004565801,4835561900171000,22669410291451,2843312380689149,2588630680738559,5759290057017088,4384506938893057,8646388180849411,8450838684917078,349090000831239,3243010243200776,4117365807859465,632319600935692,6818384737001029,3195634681280272,8604171281698578,4406517324960532,7000772650535701,7047174706812694,9019308228120291,4300151536311065,2368594953803547,5088776141006621,9005581776596772,3457662202819365,8070659841234727,6886729262461737,7424806881584821,6177834786849584,8454727445843094,3079354467309535,494506687090493,8768793119898843,1928717183832896,5244973207216961,3284675968814974,6218334287696353,8726613395256972,6710516137737698,3133571439631185,499351510556498,4471197694186911,9095943567234190,5770232184500056,3137048592643929,5295726012976988,145070473889629,8211018332578654,4959045837356539,6089995085033312,5645569844038497,2302402186209595,4980145600895844,7069655738470237,587662290869097,2449880670223210,4071129266265964,3860753897439086,1839582299153265,8644578847964018,3316182744975219,6928122782021492,3130646789411701,4384566004998009,5710460242338836,6365552476732053,374100443018113,6917518079307652,1923709296780165,3396628579581830,5223066688807745,8163266005308396,4833661273898891,728837350014863,4514405829137298,2933242817038230,4438069964707735,704898905615256,3292211536582555,654154679994269,33563883803552,4442606528973729,4480566276377508,7520834374879141,4070548898192296,7128507176159145,2046034156764074,2035786442244093,7955380452006813,1950831645237169,1910561981182898,4759736325857023,8291415349672884,3630671018996662,4951238119567289,8851162593259450,5261272889726910,6761891890674682,9097628558478838,8881755003708359,8584985554978164,4544141678766630,8913546611520460,5065864556582562,6496687904354254,6620508972979152,8422580397447876,2599800649216479,7834758085196758,629311208357850,3831449089459165,135803603553247,3336676410168288,1522658529733602,5587536860412411,498880263003108,6224193591978981,7847927285979568,1967923112697832,4467557436743483,4394151240363558,8006123587529708,383744316226542,1858364137935855,2537615201496744,2482397309860179,7657635991275518,7470116487153655,7456611583176696,626765826414586,3583751178377213,1868098001029118,4821685259004927],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/9d3cbd4300d2ca17479b351d152ea677",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000293285.1/GCA_000293285.1_ASM29328v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ALXO01000001.1 Neisseria meningitidis NM255 NM255.contig.0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,14,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,23,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"9d3cbd4300d2ca17479b351d152ea677\",\"mins\":[38817924173825,5100259079884803,1244198544019461,5570385732253703,9170861620080648,3887000834422103,135937534973964,2636811743172621,5041372978438162,2043199588497427,3264478203080725,1219158525765654,97335423301657,6806422178992154,7797587932657691,6183416492625952,1442763333308449,836911276202022,2767304909238311,65561252495400,8361394301378601,6611453948973063,3776179341815855,5986590882412593,2292723950807092,8667447344529461,2558612762940085,5632887084619841,5156229612030019,7132792119169095,503029591396364,8070086841587786,2494183601589196,8950807782379597,7802197138038869,7382277830316111,1173016094816338,6346054786349141,2293247195533404,1373731069939805,3435916200802398,720746295142496,285723212427361,4079084656682506,2734607785963620,8076864477749354,2429430370523243,7003131705288813,924619839000687,4894809144635504,3072244036587635,2425597501583476,9084314277494901,2730966901104758,1345285696098425,4540093020545146,3372419887515669,948528291680384,7111466991622278,3325378024947847,1054194599385225,824899554597002,7583503602275276,5528158130206861,1115243511457935,2724428174370961,8724912007816899,6956802334521492,6022481978155157,7888059006226457,2956576363216580,4933895205087387,309930287669405,2547398116823199,2447705787277475,4135768060799145,6909207418407082,9095401617046215,1795767125749932,8361023115405486,5931412103647407,6254810726490290,2264439069926772,9072406389127356,3121941017014461,204524125640902,6113819124242465,5185152560838856,5737110246398155,7716032082436300,841908330348749,3396261535396048,4609209577085139,290615440279765,4730650179688662,1088251595409623,1457970859581657,1544101425852634,2922054599370972,1078685636618461,4951492156616928,3027712700834018,2495793099186404,9025058125062375,2556040328263914,864985011914791,5714785752535277,4807968632248558,9094901810425213,7870618432581872,876828316768497,7155727241517300,1174969022447998,5924732097198336,3335546624989441,1273192013863170,5283616067191851,8576725296492805,6099354700001545,8179619952347522,8701542172750098,438494691817748,4551855188754710,286937693145367,6332102138060847,5654417032450332,5239469881477406,5758500947806497,9169768952838434,8878861914022185,3594676681406766,9163323787202863,6440982810485041,2358792287939122,4580687893737782,3730783236294967,8450441695758649,7819522651684575,5217532676925758,9084842113659957,2542880816283969,3534284399731010,1541787943604547,8321722049543222,6654187076792646,7069551626416456,9163647923542346,8179932472567382,3738054415970639,1011015710785874,8798692694439532,2820855014738261,4072752704287062,1439292955947351,5487891855442266,8420743177095518,8299655244085989,7206972444613261,2369014298036577,7691761684078964,9170068578490729,4443413599029612,2698803055886701,4319590106262931,4993985943387405,5807586055434613,2747761435615606,2992668497344890,5106358351083902,6540729406071168,1778134811255169,5627244567970178,1565385567058307,4493597017004421,2861859675888006,3079851433471724,8591463206529419,2374380369777038,8227024691658353,1150818014355863,5696561597933979,1940868191244701,7814406120969987,2983269606388131,2408432292934052,3354676275956136,2285863993979305,724778520111517,5544745437112753,234511533267382,8388103382221240,6992842673122036,5591561889114554,1798300482934724,6706422806379638,7541485932741054,1980213959520704,4843250651560385,1996573371472322,6222900784710085,8630680180623436,4064590593362379,5814463478919634,8956757878650958,891854772728281,7157112269412290,2182361601028575,7291300706238945,977216858669538,7499539838466326,7084669652795881,5714584701389290,1184264251748848,741964989884913,4219398865349106,859062538021363,7540839429532149,3127063732029942,379435641041321,1764337307442505,826740018348541,6311957940855294,919452363573759,6226280637673661,7679137097906691,4130654810208775,8429473086405131,8903652066257421,7069217595134479,815850986068497,4127873538898450,7614183064599025,5749041348145686,5908511969533017,3208901578764824,3681826680144410,896816288491951,4783598675108804,5333896588704285,7037717964470815,6173582981919153,1575634138769500,6469699076737117,650886718097968,2457383750097458,7890243454436787,7162938880879156,5258433835149406,9047580475181226,4055726676521528,4628576962935354,5474479894245949,3843183596464702,2601672638474821,2434949006129249,5307937826665035,2867618226455116,4413952071615586,7348257264071249,2390955746019923,107073583743572,1406498415233624,3947284344187483,7329049421562298,3552881265249,6393423933145698,7568216766888694,5745390629976676,4542346640368229,2498847530773094,8522795138148113,823440670384744,6583683678735463,304814499277420,7359388454501821,4639948581005940,6045125276020158,7633986145008246,396336678337143,7281605801630329,155470270425722,6149868963480187,8911085938127485,1933678280299135,7776241385069184,2564972579281003,136268389118598,7364084904668586,7229576544445066,2588190740557250,3758955213795982,4678902541775503,7150107553792656,1351124319789715,995870206380694,3983222480220953,7130434489624004,1825774623849116,6805004937876125,3097530511522463,5704266029867681,723122469167707,4494924090426822,8803535299964881,1992011753994921,3131607179455146,2640463519445789,4023015114199729,8341643848094386,1327419869860531,2559378104441525,3324203025058486,3586977722428092,9126624801139392,4918258979651360,2335032944082038,752465389497031,5441656821716088,2739258920829651,4972031586185943,993629148431066,1921242722249435,4298632168940253,5601408836791008,106917029712610,2249855891350243,2495440779485990,6688193936303228,8213179247925994,615889063191275,1026336735451884,8056466661319405,2722226026599549,8142497676807976,4197526404918002,6183764543737299,5972494735960820,6015402872494291,3351280924539638,7913088365028088,5522051940477689,6404555279146530,7166095196238589,8661607716555518,1251862442520363,2113507825783560,7140839947049739,6962820352693905,4600345632975631,7516773284387600,5622472636439313,1384040177572626,8348177832422166,4361498608218905,7225899052995354,412049292149531,6337445419736538,65372587152158,1858587039982367,5017621170889504,5096858568430369,1659856879452965,1829303786474278,5924083222796380,9201795107783467,744604270005037,8996593369025326,6347122181778228,5913050263003958,3434809799306039,5992348130104122,4045311181761654,3267204482970434,3298894766166853,2209778012417506,8631560877981707,1618828893360977,4852596782904150,7758164952529039,2376643722996574,1498262160653086,8385613808159590,1886895172834151,2848642290848616,8795658023197545,4183323113614188,3209794538242925,4939686804243311,7904241158488946,6519310886435699,9220194308353450,1392373452520315,1352468053522922,6730082499195774,7422419701567002,5825987109632900,1467615254973318,8665101148629895,5572995144375176,3842631055428491,9210742782743436,4047445254364045,5515500995810192,8753758580341651,936762320933784,6945372108033178,294253865921438,1537125487557104,6204293526977443,7767312947090340,9146963695944614,4635132941738481,4107353083308968,5633451181585322,7605028079362988,6155065903813550,3293867442722973,1398164050168754,4490732610327475,4952739985814453,2062872300830598,7430848049505207,154960555271096,7410127493872569,7904320743730109,5628618709365695,1752711593008064,6090297406788548,1146979533180406,6366599543843784,8449166762585033,3456002743163852,8795754400068558,2669247088491341,7798435131669691,459951257897943,4569169665532888,5441460086660058,1098757625142235,5649530571351006,3060281480422369,3778909619626979,9009476852485092,6513537266172903,6801734451115516,4263420739814379,3552864984540141,5611513479803889,3741340230183923,2892505365010942,1959073981008886,2725284336202921,9026234989508436,5754563822560250,8318617790919677,1072807848328194,9065422581822635,2477352775582724,1632563760767830,1398085815321607,4926478228327433,4075081404797962,2968110015685645,13307624268814,1265103509892111,8204740566948882,7949901899424787,5134307584513047,5604213675936792,8995609574231068,5971974842080285,6396243460871202,8519104727407451,7581895051795492,5255307100734502,6903502746782377,2953862150870059,120937910191149,5239686779399214,8788064941774922,111719966458933,6191113057500214,7124100836070456,4005636378670141,6547850520310846,1965486406992963,2455130825274436,5652121927916613,8583517584665671,1155581647492168,2465587342222412,9158714899242961,2876343350713427,5542417335450708,1038087768310869,3135237119482966,1936468882658393,4427100179838044,6752703052334175,582395963520097,2216652191272034,1844511533818979,1465588697321318,1527759629687911,2973817145082984,8318835110231911,5978479046452335,7881612418821232,3664591120381042,181400431448626,5471125943563382,4493440294636664,6783278823328889,5975496773018746,7595957985557627,177814595456124,145806933838973,3917273671548032,8350328352484484,5093188865637510,9154159918289578,2956842461147671,9165584951559309,351329355748496,8204394891772440,6963752904324244,8612063637513143,8754084643591696,3979419248821401,4603525896287386,7455245633559407,4870410611807389,1559688127235883,3899118690198690,899280186238116,2255266406638790,7699103085022374,600626401166505,8199152421799111,5017214826672669,3559074083185841,2587852166554802,72070874111859,5760896375614646,122591059100859,3013671724557500,3191805016556734,5903805098277987,7701327492209857,8272657268059332,1290210736501957,3429891054640326,1290447015269575,2005112206576841,6790414540881098,7249066560625867,6062082001491148,6010978452723234,4375723725601998,2349631047666895,1973394574073041,334734742897877,8658631624254678,7695121821043937,5798574796604643,3529522672653540,7152114045381862,9132806078266599,7593010326576363,7191466326590701,3815811071249646,2194993540615037,1312505984748787,1478114903508212,2426847929519350,3019651862787321,704933221653757,3866905343042814,6974197775934677,6984164692323586,5688879042509014,7325224538696968,8906610364421385,8790130859358423,850196705727757,4031285852929295,8643898681793809,5137411688750356,7932339816699158,5390606968980760,308361553118489,7239031561870618,467335544828122,4621248313101600,7639416182205729,2507629490367571,2982658402557221,4857504309155113,6943653136612651,354354184287532,2325587368066349,6142096762992861,5504307514793264,3030954450785585,2170849717620024,3263765503821113,1496471551552827,2116412036992317,1334970738505022,1696067572634944,722264856208705,2094383160479043,3678999800378692,2893555157654854,789459478854985,2958520282838347,1322516209737036,9003009900832653,1233318297797969,2676406426053971,926966198617430,1946926880968023,7235532819998948,8575276342750555,3126967493705052,7802792317242717,5410453245779295,8466777905517920,1472204020141409,2371934420176889,1751039254633829,3307160175062375,454747698586984,3621141912302953,1070998481436011,5773993369439599,5274127806805361,6914931314507123,4105609634987380,3858635723892087,132404851785621,3447565734499705,2522081799505277,4787875001847701,3289981765754240,1604566336423297,5610587098123652,1354388327507333,4737809810802054,6153184805907849,660211232431498,8961975362004861,2524982492411279,2404751895782557,5472613483230610,5408574430764435,7400585969331605,5448718801153430,2826666532515223,5857973207143833,7823259634152175,8556080903241124,8454094335267057,3597227741001128,4948270307118506,8638303722065323,7760845690985901,8104390132493213,8393736644349360,1161197965690291,8285499393258398,1430948247684536,7971539017686458,5606882720091579,2642314477604284,4383552216040893,4708726813914558,9222953684219631,2315016269706688,6434577674943937,1014965356686786,5225095868194243,6405704941686232,752197058944454,6143363412630986,5974451031414219,2584174865776076,1854671545345485,1714823344162254,8192826297157072,3606493327982033,1805247577226120,5606932177509283,9117503249337220,7643011398833622,3801017117811961,5466769376437720,2536370662768090,5352221605682651,8315129726213597,8927340010864094,1183538958587361,1958689423468002,9083463905848804,6544038918141415,5341398431489514,8484070723560942,7218535184954280,7109235784162802,8863425176282366,2714728349539830,4176266151507448,3663921159482873,7678403830908159,1526245799855612,909358880660394,5268700123000318,4634855366383105,1549874787563010,3993244984518149,1219425719275015,8108796282289672,5092547519827465,5466350461044234,2693740957167115,7706304654749198,337874952439312,5423923324889688,524685636146706,9194729827936515,4826282234531348,6037820566527510,3137419614230039,7014768360250906,3886920798768668,2580357068256799,4452774479794974,4382039867493923,4106885729752620,2469737093092913,7776778810207155,2772805974816308,9073837089998390,3144617726524984,1579058748333626,1860319207714365,7925334227481929,3115568023846466,5958724597708357,5896902948161099,3755883712708173,5903310128797262,4271438154923277,7939681612396113,657818268870226,2376127778403926,6911227041517143,4289188838553176,6579773741373019,3674794047303260,5484049627983453,5591991982718558,6028712750417506,2574750927785572,2299569924036200,2400149034143339,1716270530719340,4890475442220653,7687903058595773,2910386408203888,7341778530945640,8288733761814130,5506755945719411,3724046676707604,8996151922724479,6889712909352459,5978664546569859,4062962872663685,8412144537530305,2192433435815560,7244410578144876,2136163033902731,8953559704030860,1251081614335938,5264461296365198,1082858470116973,6908756693257872,2134183214411409,7572966787454612,1586588535264917,2583237093707415,1412143593899673,537883702421147,7457463497021040,7081063796143781,2293661601840807,2614236947048104,6917215296626345,5976727332435626,5388178620876462,4451622734419636,1811502562424502,8922022351515249,7528088326902904,5533159699361466,2582558043426492,1848364684625597,7081618743399029,7395412170632897,4137925226606275,4405037053126340,5625352900093641,1229359814428363,6034283015384781,1146201127526096,2321998809495253,4461662635106013,2760711695863519,6890931717914336,8069320485228260,8730340062824401,1278090048036584,6407115936446186,2969308747767531,1982152139267820,4465868715861743,5061425343655665,3547929630948736,5349240656623350,4878127821391607,1338072358395860,1446900736558843,685773852339966,4717602042408703,9137635568660224,2952133025343235,6920919441118501,9203966702230849,4706278363551495,6604630496589100,1905929215069144,3973450018680594,4206697544707715,3034561777260308,9011816295860526,8925396247024729,6105501823514392,7684635146574810,6256064832980767,2946079566950176,7920954972808496,1730890457820962,8007174941164166,7506258097821479,555432107171624,2089077121969963,2920647794970414,129768637245231,4095691240144520,6163896575056179,2047748885620532,425194032035637,4419215330613047,8516280687636286,4631085635166017,7975359125909315,7386152610181751,8865229412179781,6702695373463366,2913507059025736,2233537797328715,7235310206857538,6020664057007949,718295377787533,1619606749112144,4447441236029265,607981555388244,4398782324948822,3223376723425111,4272731124098906,6636119953715036,6940731008456541,48593219653471,9037895178555232,4855581087168354,6833930372892515,4923828555177830,5906420102639463,1036640004964202,2736382209245037,6351461829220207,3794406391919251,643857618069366,8359945739442153,4008471171037048,2902165466267513,7838002156660603,2100510872502141,5533588775789888,6377599036731266,2491254631047043,4787864617848710,8525547614107575,4921870004367240,352533504739308,6642928343189388,4289213246603260,1184480242791405,1362804008395075,1071112768997269,1841388057349785,8469193961762713,8660741041117083,1190323512385437,3520948933857182,604074866714529,8934230356422299,7791783848023972,6245672342992805,5640447190851495,3751156433296919,1911047440279465,2243849441120175,4334443621473730,3295459893579697,4874861922768818,719704575270835,2939062779238324,2660437493014453,4742984252907446,4547400594007991,4148594506246072,4770554057557947,7611988628199357,2370159673140213,4771025758263233,6043839901548482,6257045227728836,5131066988269509,5583424580964296,6172778042544074,2451412118568907,8278082821906381,6583335954812878,2803737362835409,47191442776020,8537549705907513,1762906333214679,7180106557651806,4522012566378458,7087088700118265,3393755055370204,5886274984034422,1545018218807262,4997217716574175,8238249668362208,2224682073559010,114977286291427,9070230180308964,2889874976122854,4363346807945193,4322377661087724,3321931061522413,3856993557749743,1674739436144626,8936090967855093,4126830742638583,1137256007364601,6046999560312828,6737759419246250],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/9f1f319740e92e9632ce9255f0c57114",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000351965.1/GCA_000351965.1_Esch_coli_KTE156_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KB733419.1 Escherichia coli KTE156 genomic scaffold acEuf-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"9f1f319740e92e9632ce9255f0c57114\",\"mins\":[1073757075132416,2825661392134144,5859080619220994,4683283309838341,3728622142857222,3936481708941320,2169066504840535,9146733986738188,1528444436721677,910260459544594,2657920817778708,1364905336369173,6583645223196598,3391826174525466,1040906481516572,5903758834940981,2261620935442464,4637597938331681,3017535100342307,8405880525875218,2430236048871462,8725800200456881,1764838771920937,9049022559096876,666400861028399,4187579349364784,6982012547558134,2102621648318516,89217825112117,8810462027214902,7387311707809084,1470093577691192,4274464777506873,7249876427247675,6098545075700528,3533801781903427,4028438952951877,2664883586334794,330642771468364,2182398795403341,3484985178759181,3545494450790484,5352271227420095,1338426797289558,2128219652771929,6077663536853082,79103686168667,780927423520861,1051896060691813,3964189928181857,8920527252377698,6147782503108707,6363223884542052,1390675320180837,3589031359889510,5723838671777895,3212616315093692,8487042812984679,8699726303780972,5950527330869599,7618392932141871,5568630790840431,318427908817011,3322284621480052,1587471541736126,3459151149293686,2341001259207800,3715299619541116,5242769956470122,57032645582974,2641068255975445,2344109037412480,8882223087596224,3397773105741955,5803727243026564,2004930974167174,341545780572295,2220943948307820,4242351234474123,2569804992065676,8668139155800524,9014023793106641,3238514465894546,7786035762987157,4479098013347991,8110756269551769,1561211337072795,6450230006775964,4577706923735066,5809570678718622,9012936261589228,8940081059791467,355068611980657,3089609529942184,5478482300284956,6682597705495239,5916556218769580,7716612187915885,6639422860394525,8044184034230448,8964462087924037,5598442556102519,5779594307760308,3991881398988981,2904758868046007,8676341257128707,268748182387402,8417413703262398,1506544743870655,3269648229920800,4594386927288514,3813318153999051,54267487195332,3920674891829445,4551746334601414,794463004897481,7993142231392458,5101683099736098,7062223601894093,6552739233923280,5088556791717240,5089565009928402,1958335824154835,8373835249831717,1228794839154904,308264836456665,6763584774734042,1226848664686811,5677957517164764,832839452246241,3628376511791330,8997639549439676,4466484413501668,7401315636839537,4942284316191441,785648654295272,5249984012218601,3529317775237354,635136383123691,9213884018144637,1223472291905776,956777688150257,7889004868186354,5478954090696949,2144861695090934,6966002038825829,8975008361441751,295102052892922,7253633366222317,1012693995966716,2119151366529277,606392454750462,4746016443060480,1473303838245121,2525877720523013,1639927227006797,8992257804410303,5313636444859406,106776035873039,8942842223956241,1136441185432963,7974398139912969,5962730765967637,5243940590752022,7303145929355499,8006215754709958,5740758977031556,2638357482914074,2174974481998107,2640078475481372,7656413098012959,8207544012289872,2824235399295266,7364359081713956,1328257188593957,5043297164816679,6416467504922967,21150285087017,4523320794685740,4941779457685554,8150994036996829,1350604536922416,5573572253900134,6459771538178399,2794968621154611,7279970786570549,1983503147569462,5333201194077577,8648654270205797,5723360613174961,5386975842144570,4313045818585403,1752908108796220,7298749349184906,4068953762341182,6690545340612927,1042566742143296,6474141260722497,2088069525771659,3346776127533380,2987482276307270,5749043940032841,7470985706406218,8981126744596535,2974326800372044,8398190895329614,4463270262034769,4828143866843475,2864837300605269,8649348406275586,5862130321367097,1853196278886744,3643628911563101,6131461397608257,4586823680090463,6690676565807457,7445570533627963,3296962647322980,5250521463216870,4150969856927121,1085464144855401,6991461334364522,2139576114905451,8098712991035756,8625407358164370,674742502965615,1122474689470832,3512898337591665,6364201369596275,8686785194624095,2239183959286133,7281957947646326,8039903998695492,8054862788604280,7475092350742905,1842875044635002,8688632851627192,386044708512124,5803893689332093,3822882072310145,320413748797826,7918334635264164,3075220407582460,2298912361369990,4905932281966984,740607477961099,3043362163532172,2513155861381520,3626812324938129,7977902631756178,4120780341174339,8942444219240852,1323683905492377,3014107657863577,7606562266386842,5815625133633639,4009814563811742,2564237403603359,6897455443221232,4313903103881637,6980401474429351,6859671838925226,2063008413757867,4858254758601133,2177821880959407,379935127364017,3951993819025843,6046018190438837,7710114327355830,1204751753802167,965770318045625,5502318544981583,3760926935470523,126141660684959,5830994252219125,3029341628273089,4553790569252939,6504600138650052,739730488963525,8196411839625216,2187371118363080,5510921714606156,6103640832397770,4158643801731532,5081755700618658,3109437597065678,4516368021698637,7172499990639056,6304638001390035,1686827846148564,3215349969969621,5069302333174521,2058786262142372,1415164117193179,4044594957775324,1176067131515357,877443854315998,1762630490657248,9217923379556833,8833428846519109,3843145581710075,7059564896941279,7236117385432486,2855125351690727,3195488200716776,2931571972751850,8814854711972332,4929961495629154,8525553255043837,1316262047470064,5054654202682792,7039665049380947,6497007459127797,5923439901028217,6494719537046009,149286569235882,2409391466709503,8595028790210172,3637533446136323,4131874287599702,8631931222106492,5342657247197953,2227481306654124,86205975593482,2139538089042443,7046263851764358,6111276460391853,3706241000403472,382644013236755,7407170124071446,5510527001436249,3836834437558808,5054421719249433,3058265525461530,7275584579875355,233617928733,5342238240909217,2368906433310811,2521002441265700,2410197458295558,8196924189913638,3428279789671175,1967916335809068,4923473416263317,1882484501008945,1416727865545266,1615805749241267,1125038647685684,5061816688071222,5027875098235447,8637236898832952,5394219840704607,3429852718600970,7922138867600555,8445002148701621,1448281385951810,7727464238473795,3579826204570180,5506106076471117,4532998204641377,2316787462754888,1820959062880842,3815874058973771,3468478413435006,2472140177142350,116925212033615,5539170023359057,8482553776723882,7927344749690678,1525557707760212,3848836181647957,8031406990306653,2164808574747226,2756071361360475,478887256560220,5080508310012510,3575309775756192,3394590901326434,6817438024151651,8384970864149092,3621135234847333,7668082082085649,7861126491783069,1308106938819177,568000522973802,746921786421867,7754409884422930,8806011350241903,7635830782829168,6000046121878129,4553428221923955,5045175309042292,7501741814739049,6141598417310328,639801425130105,4120589373940346,257814287504831,2897095043949180,8611121204056701,6016527992034729,2397689414378114,2419069951679570,2914906215574294,2679207567196806,5688939500257927,1724031441810059,2766065063510668,2353730651177615,2019585422459536,113269032034961,3394733054252918,518593397944982,1792071081980571,3176686928818846,2215385946845855,9170176323221392,6858062779555707,8606414419465233,8190096274275782,3504564547469991,4273289964511912,7439773260511734,111250015466157,7125063494980271,6251521348096688,5118222967801288,7148313253921459,8606861947601201,1753771755791029,5664545369785014,2041358419321528,1349520275800762,3496369553818299,3763145072980668,6572195292820938,3375494323790526,5788626177394805,2098982571856576,8340146385933088,4039196619215554,8373324529021636,3519670054138657,5560778908603081,2209227890905803,367745128085240,2555252183827150,2029463840150225,8158267110929418,6202748544676564,7298738867790550,239945629602519,1550977950057176,2056703777883938,8909732310045403,5515763946119900,5294766748025565,7088170934731489,4567546034963171,2520219393950437,1056815373995971,2492778624172776,7604050999448300,6344674853454574,8950452669456373,3672224951714544,7268808721524665,6393030055892435,1787259017597685,5842392311423734,4285889479766250,3812086123586299,7434756525609724,2106232978768637,6242013984625409,5810464076514051,1509251897819909,7977555933352688,3022689456030471,3964893665014536,545034796114697,877463201362698,4477098239914763,3655348890841869,3334521995297550,1820382425461549,3312750158140177,1370559325721362,8539004164948100,2783251408724763,6618163993244445,6320444637377312,2069696959583009,8233857915772379,7232934290060045,2437385865757479,9198629552169769,1311630570173226,7296085688592519,1789900134822701,8132641845011933,3298104694887216,2004039151534897,1751698265555764,4845256832766776,6221238639424316,5938219966049057,5157683827615628,798868643812160,6427925479306049,8009831577100785,6279938289791812,1193194748379973,1535063496938977,7302752899863368,6631392729606284,7543300918315436,27028192131895,6652001087071052,7559891167159778,2741660511556431,1541037172577104,5948496119125441,816503841678163,7851286990590806,674505489728343,2128353777681243,6976929742103390,1147610223223647,6297328210846560,2493777281889121,3373419224413028,4656754749973349,1315453574816614,6134002501714791,68792473092968,7922006282224037,3640921402798955,4091202175181678,7228366762040125,284796527510384,8931187842712434,3339256207987572,3653452058229566,1589935211180918,117933296961001,3753675332473720,1590631988888441,6654280509582143,7522030212350844,924694737817066,9096998713694357,3813469322421121,9182545715384894,4987596047791595,6886829094818693,3168575450833798,6124171288552331,6886851722761100,3715399430058895,1995644919788432,8519892691163288,8076812926519782,7559991823487892,3721431724647317,1984882788795287,1743125229790106,1719461470643099,6141663376171933,98055163335582,1947362805623621,5472728336085921,3820152327480226,2441464999887780,6037916889265649,8451504177177513,2654315936224170,4953149820658604,6584841380211501,3656182560101298,8790794176916631,6443784898034505,3527308810683320,333276993835961,8802100285823135,4624134341211068,4610472403542975,3840123825705920,4639717892154306,753153853702987,3011153300579270,8601542577087432,4097782020987724,5615689609387511,4616453495653326,5939516504077263,7212851916969157,6940868016210900,4794640989479893,5387187980387287,5939311640732632,2856215005730980,1402469759828954,8123516906542043,2862132579312605,191598411457504,9076818340918242,2697621990856187,8114133364679655,6131691779643163,9084202317463036,755325306115051,8771157233819758,5855766651298798,7291819492885487,1140012540019696,3217129615253672,504509449585650,7132254190084947,5803210749600756,2733999854851063,4670831696962552,4257900630729721,2909449267180539,1501840430117884,6928966281204733,6378674551886846,5221164721529855,6436979288904704,1401111668989440,1172164637492226,4871056328320003,4430331254932484,143345725674503,3424706376942600,2935382216684553,6834292678634241,6365639325819735,9136688507909132,6558922133392898,8076707907451053,207114001673048,1652881559208978,4765676198175763,2314307504759831,1086330117039129,8782668410220533,8301344556431535,7695949051159580,1171980783285280,5828222574330913,1942926151545891,7405781378130782,6035460513596455,4528338812834856,1072351958742583,1002190466327595,4950379196884012,6005609251415085,4781661328942132,3898855284159541,677989565006902,7146858824778809,2715140864083002,3182324679992379,5345587754044,17551373616191,7132268710888512,7087993637987168,5542898849719363,8871322970559557,5642713442448454,9078229346763847,2471969595081801,2652846283834442,4986328008868023,9014271563277388,3774411384146786,7866375711778317,2885684181587029,5556765801968726,2513275657722041,2458992410273605,1570668393428058,376057577697219,3955606250837087,2407186399323232,1515481216234594,6364308473326712,3453716837938022,4384444165534822,652324546143338,3461284112417899,6752954868679789,72964967339119,4269724246881393,6818185452375201,4089205168440437,3391858706936950,7089927957500773,6274788398992916,8646895613981820,3275817234748541,4449343608685694,6071655422456028,3804345956543339,4349226227487876,4961473957147782,8918452353679553,1974598399054984,4478531045766283,7610846748320910,7791564038861968,175896512464017,8424605680853187,4512763559527572,3747058568012949,7556093500883867,7270256983434393,8405523286193306,3472461633787037,1955432948978846,6907437044057248,7445697565000762,3769592583143344,3151103808181412,1594708228551845,2054121759032486,9157142940314481,2331036032591016,4728552000332971,8277556558095539,2937407604864182,7832654526906569,9106313778422761,1580668012123321,195539820147899,7059993799656636,4205469570327741,8659657583609024,7923291333080608,7262014036550850,278740376483011,3164974827254980,7171691819395958,77910711329991,5075597334268108,6763307751539915,2587157541471436,7338238661022926,5705596755349709,5452767111498616,2953876267695651,5826009492259914,9204064322864965,962585394603222,6364092936832023,2581034133583066,6447797431382249,2746740739822815,4970771199730912,2657628209997025,7593967918787000,8179864612635877,3323175572722919,5207468986378955,1502483749131498,7094419813844070,2607549250757871,8583313711604976,1397245118305521,3745691804464370,3189533497565395,612498938365174,324230192022775,6986109377038813,6998027608751386,5619665844670878,3354456329798908,6747852412978431,4909275774137601,8238052630910279,7728415271490819,6997393881425157,8033248447320961,2249465920644360,7350518350345482,7747901425624332,3579385405969678,5394532950534398,341008182162706,8126137211667732,6091551223592494,8677984716836238,393907298139695,608678462596380,3082035596981534,490487552496927,1674449647588640,748493633127713,8320452755817762,4598245545783515,2144295051339044,2644740716631333,3780659210183975,6267931029091624,4198112666613033,1710580230436138,7380061455852844,3141363853260471,4515033217381680,6031427847992626,7679109584230881,1953999342060852,5995058603178206,3517727528637750,7561407903356217,36460262049084,27571760239933,7990497977595198,1930505532183871,3029860654573792,2546086870418754,6042509842663245,5574166681404743,4224430592808265,3808406860674379,5038763940545872,6821379578000721,6850844138857811,849719651726676,7029790467665441,3687598771689608,2562883673752919,4633944757675354,4331047018382223,8007845070882140,2923707812386141,2517505051346271,7093607097488272,480124617278820,2909476481185125,7468684804760934,8656156206547857,2523550622938475,6324193042654574,4390468767561071,9017113141433714,2750408660657524,3932987724551543,8740314210710904,1154427375449469,6382701539852778,4754015864153475,4289934097810823,1167272700933513,3625832106907018,1248171481961867,6063316204944962,4998564553872782,641497577649551,2254104781395345,3433564635899284,7778635003461543,8926606378878358,1437404333118871,8448003893123946,814573575468441,5229504741713306,8124745803352303,3963252660082076,3764174567576474,5040227486664094,5546537427220037,1020487038711202,6824052985741391,3633897363477924,8532839295630918,4975547522894065,8495035540960680,1767001339426217,2376631410927018,2731408912889259,2862025196574124,806065740141997,3316364698543535,5212727640540744,4103871071876530,4280283073611187,311935564800556,9125216688106243,2370522626729401,9054867349584892,5797501542288287,5073998353348028,8884136504617608,1684541581264319,3542568308544960,2109338263586241,4585567380870595,8472338038043990,3375965378037189,6895490497021383,24997698352584,1532231731304012,6564781728314826,1876207015413196,8694040690017741,441947871581650,4762505091212755,2263387216756302,7579519046260182,5978101212931544,8698332590274010,924337930096207,6695301922022877,8898164484392415,6281497035855328,4798505570624993,6835847231583714,751349278225892,1009557435291109,3255800624584166,4960729051461095,113769038976489,907310714922475,4870222823667181,7423321533400559,2961425221989873,2241011611182580,449147973354997,3010132198901238,9195540769266141,112288126498296,8372994542765557,1648687757559290,3992945688581627,5851095604147710,2221906647410175,2830811517908480,6095385139958016,3364061500454402,909557781804548,8325086660239617,7260653943633419,8632367232677308,312258088334861,4189633671095822,5604425601271311,8109200655040088,4969201455027730,7647411007617283,185135589226004,3808516667364885,7444257571000180,6707424487466522,438382781212187,5483272129254941,5069989781222943,976819860882976,3124544497793334,1138218115835429,1277145842427434,7627623774447148,2871178830644782,3618063291627055,6904263360566832,6533315474228785,876228623607351,2696906355795514,2289176586036831,6958783073384469,6371200743200319,8605107938977135,112565798999620,4588882368847958,6595576037684806,467060140985684,2455948336809545,8671955716333758,7822350133554977,4803330485364300,2475314713904717,6410956210734303,3182112634136143,8127598629312474,3894574025987000,8315031461396977,3118812205090388,333578810836565,8494530443286103,7692812274107992,3046942532736602,7416859535778063,8442323623131737,398701726680669,1056399742412383,4904957393430113,729891746252386,1917462362719845,2811749323396711,448223986562665,8852576203826756,4022435671189099,788699946358381,6009858873992816,3237005651498609,4679903305102962,8674328407850091,3863911068636789,5279339470612089,4175742948443770,2949484647451052,5652897946529033,102505731352189,1844865274898047,471980910724736,4822264984946305,7084825750111874,167043047663236,3101732378482309,3914532204471942,5273531122312844,6030562625959565,5019550983284367,204848266864272,673908089802275,3132925813753493,4626708574213782,7095756527081111,6510161575691928,4311554702672154,5265123120101022,5535262954522235,312295230690246,4453281584948902,273169705301671,3360793887233705,7229128039700138,1950351940048555,3844780248437300,5148980250990256,3658380591429298,1209073613719220,2975859727230645,7505548277348022,3820076883477449,4237539074401976,4933073889617594,3816796472084155,5509066692568764,8654212608976574,7682920159884917,3807404653684416,4413295314859713,7695029361133250,2593729243064004,5951537149328562,6804179196719920,4599602302269129,3469733676910284,1870859031836962,4728324470884046,777079255471824,4333085443960444,3292486056879827,6998004764088020,9132908525632520,3703694776023,5365372356470488,2520836106159833,8162665901676250,1211839407822556,4936040132552997,3395256208930528,7932222804051682,2377083420087931,4867127090386660,1156577842927566,1594814692912764,347197665990378,8763922766160948,9135562646338092,2927923311056621,9202252780635886,6751401486718704,7867596662869607,6061204575086325,6106680662111990,8182461428179241,4074641629243128,6301415847132116,3159271588902650,7542096303740669,332538067375870,5565350668760832,8659205105741316,2898838546032387,6154036893141919,635440561788678,4442569168074503,8319959202104481,1053649852479242,3020314390764917,5143254703216396,8188669259415170,268359922841358,5327896939939600,7245559411074837,8119862240173267,5854400033650347,7646609744973725,1858217593308953,4665359213123355,527861414171610,6586311591924382,1233591354898210,4056503767011248,3791666338809637,6934013651703590,3419021707896615,3581448968541992,8162162674861865,6598240466007851,4274270668896048,2556981141960497,4637319826560818,9107445861660467,4657428946461168,6748743842397833,7869103084287800,7958237890115892,4334239117655007,8959593688600221,978850611402558,7675181146707775,406558773073729,3813449001940802,1818139840284483,8891253442758468,159311917533494,5709386733987468,6839546289682250,7329623042501765,2291131537136610,6840341648085244,2502397184612176,8344953922283345,1708154517788500,8046903434229589,6506436218615639,6608093928636191,889716034582361,5714776007562587,4004088876922718,8512942107027297,6805822537238843,8269281409443685,1714776101275494,6154169292396391,4214333815701925,5617553253758826,7273678165458788,481883942840175,6152684317534064,8586276927833969,7970309105624946,1250420615792499,1405577059608436,7431919924779326,4382998701631350,4652880439531383,2273838361048952,8719382970615673,4481182332098426,7405884626987327,6771221685192572,6909413559933930,4208729280354175,6480414174873798,4758366609581954,7114833387841411,4209896144758660,2868657437681302,4027091273770886,7538004910208903,3217544566048649,4783788878858123,2780876524840844,8725394809885601,2115046591520408,8947235684738962,4160126022031252,8143701867665301,3517811915720599,5622037961426840,7394559187953561,8278752712221393,2137309594802075,2976245038557084,7984135389022111,4661444297934752,576254598625185,4166793510987683,1353385665705892,7867289030074694,5606715795629990,8536729476498417,8576117764958120,4025728123971468,6427825996927753,6060405081224178,5754686370494109,1961244562487216,3942606670972849,3532119970224050,8674480320068828,5888716618704822,8104617108215736,4687335738779577,9059105344673722,4165154245126075,3409505833039805,7616506808324348,7099137001969602,4844307514816452,7352562116380613,8303745815831429,2025746269927368,3713786577838412,3691655301359562,8065217190085064,3555009350805453,2751890801645518,7431652391409616,8649394277585912,8889762527702156,3854586057111507,2843456650639316,7539256865675222,742449454393303,559336936231878,7495193030954660,4756206974506970,2392936587491291,3836371620235232,3457180704697339,1830268693993444,6482774423107560,265455171421180,8333886829919311,8884338078849004,5519600492783597,4726650901227502,3378010853926895,4141210681509872,5983240135415793,9170083329751026,3309153399130101,6572476717303798,3213988571539449,7335642155118039,8744065506162346,3970807947683838,1113547510077440,4494109223323307,3356687072086021,7106548103753272,5570881785780233,5707762488350730,4997462588721495,7510247539124872,9132746182173073,6326089185019922,2367014159726613,5832840342272345,3673077083113497,2039697840715802,1465483891283631,5170477133153893,7685344253958174,971199458777122,7666739545921571,1158716490930212,5561586553339569,1027100588271656,5051828233344007,4561601483175980,4498376027717298,5138977312765444,2167242595203119,4181281779263537,2651809316853810,3082684337973299,259088076671028,7765584890341429,8805057349851190,2244330440934409,1366139758544952,7878723653932724,4795426756147258,3395640569661499,8014596945296394,2774956265109566,7506658358073407,7355375067981888,8938620010911809,40135001466946,6041958250575939,2172287414552644,5333487387721398,6082291677947974,6717894818345313,8775685911277911,4755616487254090,1422646266615883,8439637887932492,3427966188243021,7591772488079438,4778853730674770,3287276111505491,4573413309990996,1625388712794197,1691442091018326,7986810274920541,8445169186490623,8947749177960543,7661250562885728,4445653405824699,2493656341728273,8168079143819653,7763355015020081,7315743139347615,4490937060186221,7775585762742974,6944077336655986,3233217934193683,6088118995540562,4642336363096181,2586918073649270,7115565510267391,4653852890331257,8477377585766583,6843224483555455,6152968510744256,6616110992083307,5942866442619014,5453101510752391,3554172356249736,1212441472686217,5600649629001867,3889415131871372,7935729833474190,3634597400467599,6091619280590997,2649786361026710,6724075959686169,861763781830808,1096370249644185,7200669157685402,1981067029344623,5714351036205212,7378306770819230,4178331154610335,5646992187730080,6017310024020336,2509715549919396,7831757290272936,3717724958857386,3738568221599915,3367062585985197,6463112871925935,9221187093427159,6166747151939761,27141746342066,8279833769011380,1110463687231669,5442997139765430,4850188991156345,1957701014063289,5051432539269306,1616248529153055,7237325245337973,1417228982347968,1024116778875076,5864016116283589,6442802221397837,116289689660513,8548858264888531,8485547671291596,4003810151205066,3332031864527052,5476843305777528,7668647640888355,8955759719473001,8417900494846165,8783200348723414,8557551783120136,8865842697617917,3888349480073435,8462131047278645,5591261034281181,581190119307486,2325350755879136,2302143995115746,5229881463572707,5351690995211302,2268996645005542,2709854642839249,6161629748783336,7756367489771753,3384681920227564,6291118634244334,2729012306712815,2114613282968616,3734908231985394,5701235894830803,6294159053277434,8439847584426235,2616708825090300,2540081242224894,4221618855090431,1848614151469314,1270621240174851,7949556095600901,7687155926907142,4918060478186315,7358445198547209,1525562526492942,4823682473445647,4453168290154771,7501664645802449,472429909944599,263511612897560,3005208739989786,7746018193678938,4578832966617374,6258939950604677,4351681771030816,4902250823334177,4446625192065314,7735252799121699,3690577712539941,4300140535437606,956794137753897,5883171429841194,8568508094717510,97239968037938,6056199433070894,1817302344161584,7359845544648893,1187788216740146,418142356576564,1907536247032118,2312878396041528,7503254590684212,8432821866570514,1999653908166971,8386241549871420,7206850491349309,325372858587454,4869013562108223,3671439528499520,8024652806198933,3974902811720075,1022825183910212,8732822431732790,3552450997041483,7488903677008205,9120110479075663,3102736794392912,8719880353667410,8036829034228052,8476083316963670,1184469739507378,5558214964574552,2390005221267172,3950002242062682,386621431482715,8644919563745805,4990114287917405,2435995871201630,5685593768310393,2589398439520608,4163774112147810,8097362311603401,5370976620489060,8218206555527526,2981116908386663,3702246733486441,1336791348942658,7217042959914110,2764657354948603,483348184811890,9007171828946928,2408363197917556,9066566268652315,4475535060216184,4230534457396287,3858224035027324,6318698370021757,4992640029655040,4483687460215168,7748478738781248,6863321694699243,881208268630405,2495673317636489,7121871589837194,2916591282014603,5940203619654028,6311380195694991,1923519840848274,7958635627392172,4374531858158,7670831243653529,8057439109149133,1468435389131163,90466295445917,5009004006689308,3095274585087045,3697015043361184,8871498119137699,5426707122600356,2066381598165413,9197956372912551,220404521261480,1203355550243244,585844926888365,2084069143189934,6838508322437553,7922745855910140,4112215828220339,4974879756798388,5168331105685918,4603016361605558,6187809768630712,8016739934946164,5924556079905210,7660643565502879,547350398998973,5448333877590463,5340323227027905,5354733807924299,2790902519642566,3282079768381895,7537762956503496,2596002053130697,7747804385140471,5445580157196750,5234429116408909,266747475753425,6652035869015623,7606467691581758,8244853440076704,3619913149913559,7489510163736939,3156480916105693,3066520441915813,7793252700781024,1206109020850657,7408892900862438,3132682207292497,2617642930731497,3790555233065450,3875843314616813,2122276175174129,9132365090202699,1740395278342643,2399109144087028,2458019191831029,5782781792037366,2752423935891959,5117041546701304,5903292757744122,4026157818993147,8911890218514485,8617779800635902,3959220638104661,7832780204751361,6835792989035010,8695347109493251,5506034138503685,544879778970120,2087057658268076,4444823954627082,3301669530810893,3933430968146447,2160332279167505,6248106340625857,2833767936535060,6408366099364270,1855176227306009,5912602551437850,1337823682935323,3167718230972956,3087239843093021,4572260837272094,2290713827170847,7357265337543260,1969003266570787,5021704593009190,7091845478439465,6391604629121578,8142596272331308,9071651688688173,6573178773535278,1808464570083889,2994454008158770,5060624929823155,546390065056310,442379340315192,313805160671801,1735998386338362,2119430287017055,2818908710349372,1399138228058685,5549771844520511,6989024585214528,1156936765056096,9037916445556738,5550837495056963,7011604556329546,76535402502726,1922431136615521,7325513255430728,2409861074473399,838862162164301,8588972619104446,4913061698824785,4220070286039634,4368264860752467,1887627906882134,4908725345386937,6407545686026840,512562265217625,5097923645594204,7293683406904162,9216531981810789,6286699384225622,4563477645695586,6082723240413795,7254842316319332,4810411704371813,2917966323538534,1738701129210471,1327617093048938,4043655672769131,5643576754674284,5711271232432749,5735395064302013,4794614070168177,8687206110947321,5144875337206388,1802457946327669,7685377066969718,8237707056594585,2213129570848532,3170370480028284,6817611207663441,7288841753827093,956958540040835,8655614835185430,165792636480134,2242728861043335,3713280205748872,2646300381403787,5943804311894669,5630437433838225,1687738124008082,3556170538121875,2450608614533781,5205132416916121,4279237597338269,1753308552137375,5004535343352480,8510668751457623,2025586042383011,4483026856942244,6268954209479333,92718753643175,3932786086263464,8200159383064348,5196902031227723,7366436478212551,5723311075347116,5981944925907629,7062710668107549,1537020432648880,5164107154379208,6098876790831795,2366122170656712,4753827992887070,6216094863617291,7109476990114490,5786714652692255,5078906569452221,2156219194149567,4552055457790656,5426426969901761,7130606621063980,8541662831664970,8324706907900613,8836870118505158,1950257317448391,7685169946280396,4777231968717514,1850941908679371,4916393700293324,3580903455144653,7678158882417359,8720488930052816,1604112006613713,8610160831974098,6434724847528659,8151325185288164,3923851352328919,4849657711811290,6853818491443933,5691257654103044,1004403388656351,6127939693386464,3119791007357666,8887486014659299,7925085763300068,1002750953623334,5113003385821926,4279881745844689,7454634398513404,7641508116359913,7344905684425450,2017863976585964,8429228251806445,6943981820680942,3864792023555652,1052289371649832,7161289865100019,4085094571961077,5396793497098998,6290564952099575,2834613235985145,3202400544324347,5889469567901482,2571781153471230,8714570880644275,1249140625378049,2723446825937667,2559951211121412,8565454010240183,4479140437973766,1306937454668551,3224023476960008,3557677947017994,6951647377689047,7607282556350636,8625386877098765,1378241694567182,5790210632108817,4504734637316882,2864649603717909,4054825354459926,8765224037750763,3322417381274756,1347659037780763,2287829694315293,9223118495385181,1692805704518431,2023409032137504,1831883332937520,1672690280184610,6984789661944611,3243666353441572,2805197600615205,8396121858976550,2217824728075048,7990486425821660,7018641336748842,5185292997025691,4990934060489517,1278839460809518,1021838098774831,2973186577349424,7707589327869064,1703437916199732,8268762812580208,3715464516467511,5250346004804468,3385759904131899,6820507053972618,3324783922465598,1080442269838143,1213461871147841,7912365981145922,6508832892249227,3541206393355077,2332595734174534,2557471253289799,6969224908585800,767973926198089,1034854861581131,3829536338807628,8520891560951836,5063510821781515,7057537721630520,6336152938842963,1359819759430484,2029010057673557,3874849752767318,5009302459641657,2115819507100504,8850295154768729,7171896988044122,5766355933240157,7103582283582302,7134056542165855,1613625605184352,1929741658729314,1350584707787619,4339841998240612,5382521049324389,3387950719650663,7643703300975466,4485906862390123,6838513652210540,6398465238080365,5192118225382254,1669903458003823,3960985728187248,8732260374593855,6930820220468086,2478204206131689,3823300628048301,3320900876696445,3032025711852414,6404438765513322,3676005960022917,9026192641616774,5547319169652545,5682351946484887,6939178355866962,606812680768397,6245168367201167,6833986613242769,3735719011408786,6484820882770838,3310733893659544,4270892819553179,8548911320652701,409309025941317,1833417472609184,1934678717528993,7947015422593409,3703190419827622,7281161084531185,3533346461072296,4764367314893737,7761554913336234,7473863764054009,5329499696528308,8477413034275998,7501546713299896,4616502799477236,9078859797314490,7101997526506427,3223034165546826,7302732293254078,4651069572233717,8949696555437386,1093706599324609,5528889109375939,4703163501472709,2135096604875718,4505243674655687,5391085785500616,3578996623416481,100178539101135,7783357175270736,3005312060169169,7640961431793450,4497569962052564,1693082404291748,5973120922098652,6717357464484346,5790268325641182,3496543980542943,6559796418513888,7514710390989046,2224917765082082,71889932481702,2350095992175591,8379742054915481,6117974944136169,5242697689642713,4664038408080363,8776679386799087,7570045958712304,8550510119265448,8688414473272306,2281558473473012,5334160299944951,5536236203149140,2830259086277627,4260932176202748,3131734316784638,7504305573895172,690623632202753,7136366336519339,3657162687556612,4035769082387461,694366846684166,6480735812289876,2245893536341001,2868199030500362,7778505994521611,1709208928259084,7517201761811469,2494415491640334,3875855472385039,4368193544776721,3156944276864018,3326614806453267,4389089036844052,1108166494080021,8794310088809494,2765356004920344,7192890840165403,5426883999288039,4625536036531231,7368934697151520,700059310672934,1355565657226279,2915178544995369,4419939379842090,9149955693775915,1350965798512051,1951801563728943,7942824813963784,4670046822136882,6910292243573939,4458521668379657,5376315427923806,7317037294844983,3694629211962424,3193808567004217,4546673823771707,2623747523193354,7425948651289662,3556120827022399,9042985953004020,7542030449609795,1327943657339973,2618291197369414,4785950324501575,8557913976427973,4467867664522313,5942065384086603,4650047259597900,4226025292930125,3305961102863438,5333169923062285,636729285540945,3047560614153298,8888318446984276,4452597574728789,4728085340953686,2215280247524439,6939212606106713,7747383978789978,8805767887449179,1428791016283229,2772284167605343,7170971931843680,4773995158363233,5873398543133794,6814212809387109,1154625347894374,7381503273319528,7569060977110121,5288382662827114,449954328588135,8486090814467180,5324358032551022,6623373924644029,7804931837512817,6053610728696946,7409718335048819,7584569400147060,6425500222246007,611334256802936,2346698706320505,8077700732685503,4438518309526653,6358535365272265,377510398200963,7537509268868228,4746402769931397,2526240495254663,2042479209069706,875134964763787,7962449713306220,7627974237867202,4018724785429646,6880273180763769,6541199343695517,4039708618955924,5420519881276565,5384659971673238,4011465562278425,4772316598254744,8794292999173316,6251498761466295,390926245878939,6089688536683034,2269985197005983,1518556890623136,4427193176444065,6168335431371938,1058355358276771,5305863109610660,8245287469210789,2564931009789095,2167512983407785,2624878766120106,249343933607083,517330267815754,6607811912065912,1293840135957021,9040259016362470,1598805435575473,1596352562031794,822834791155571,4637182320770229,6545724660796074,5648239186193592,2026236631086964,8811772508150303,231711600020668,6117684355693757,4524912841100479,5274495159024834,90754929048773,532224739114182,2391614908888951,6975930551434444,3827295790337235,248202950098135,5909444756462808,7206166905503411,8898041383738587,2940092630809820,8181072562001786,5831065044454893,2052003813551995,7917771061107945,3978321531677930,3260711832345837,3463096568196336,4593429204483313,6110625273466067,2223986253225205,8830249760357978,8364770154452180,6442476629616109,7268794764750076,6946423621487146,6372281539175158,1761374391450879,1041944326585600,4089673460309888,8854351558372610,6134251212337707,6543550232460548,6471025134529798,6475663627837313,2259632172825864,3230869729714732,5739030585818378,1104080838638807,6581963536019371,2169218424245518,6087468610956638,8411982046670723,8512426517781780,8395130278021678,3810328094993686,8724133974849252,1214549316562201,2545335484921653,5690144975050629,5498454157423152,1696339135192354,7545041443454243,6002518857215269,5560746404964207,6719064569552170,7323538908970284,1271152529340978,1956939094953262,3456378584522031,1578041137257892,3148897366994230,1526388199669049,9150178791237768,2109825994698043,8932915527732192,357076974931262,7783436286160192,1298752578125122,7215055957377431,6406823887995446,4395014038107361,1930856731716937,4364710580399434,7491937067201079,4126783858257228,3308465573850446,7074722524225421,4581979074080080,8509392281324262,6420081045149121,3151917161098580,6375221759576633,6750112766491992,4100933971711323,6036467608063887,4020011947109724,5643764392172893,3262376948747614,4769816767098207,7531348323445055,1094470737259873,4294068497886562,4274823311166822,1659848504113041,9135012323843432,9048025571917161,2375072351792490,1372323191428327,4847982489132396,7391014372814738,7094250651766126,8212751851547693,4192581360332145,6114448137874780,3427299941551477,320800131693944,7105582433646484,6373238951857531,4685739954195839,6608967962619734,5186697947970948,6921739629677957,4435463934004614,1930759754111553,1153526756527497,6418089280867723,469119490768269,6560283084062425,9065139632741776,3365541559217554,2132734055665043,5402893284117908,1374833818530662,3113226145811862,993024786300312,6227358377586073,27362219888026,5510891111339247,6421758112157085,7266068570217069,6781179540163824,1285226976702363,4287834768088484,6167372250939378,6582013969288614,2194026537071857,4005664091823528,3841884847725994,6951728823145031,5581874784452012,5962016065201394,2474177960075165,8406285518876081,3461011284749746,6608254712237299,6947510681365941,7132469698358997,5410299663605749,3209700985683389,4770329940483519,5051031092256192,3670928756870593,7674151613951427,6057434412714033,454826083026166,5264407669386965,148554695608225,4326387855506888,6240403862388169,7038837533544935,3562717374600439,5749942729657806,6108826269531599,2055835598859733,6269258288094679,6286756015776266,7707020214527908,2042373086301659,6683574890925532,922005921377760,8316110361879604,3403071453837905,7755102393884502,1720399334120937,3225933434121706,6543243339476903,6751881844570093,4212630335229282,7626651674324221,3441475510943216,1646314243919347,2957827287256567,3082828996070904,8300249861066236,7400330699345762,7803850822918494,3173424444231167,3225178300018176,3953063107825154,116589162149174,8311019152317956,8952702227954945,751099803827720,2814788311379466,5253216930012685,1417152008445458,3758221620808616,670032730701332,5648553106906646,468082959264345,6758977532749560,6606461111108186,8794616942453649,3598426031321008,2206896186809891,8813646830911012,8079967605040719,2443922235346472,6481777437923932,4339327197772034,8971377746628141,3069588084448814,3412193769311791,8790139427952277,1632545932299825,8722933495968554,6898433679531955,9168096297381430,492909452725815,4101024717622840,169624182697529,6742509007600715,4664309204082239,7124479225921311,2633509876997698,806540983549507,219127232708164,2750369727553093,7473210472082224,2985173944610375,8541800817380939,2788599090376268,1124632343461454,3265854206172751,6001209355026003,5483969637555796,971475441995351,2365414048390744,5658908378594987,3164104797435227,8294501393942780,1526039318580833,1826096581138107,2779551068544955,8839471949512292,2392544648101477,9144045579234918,6564680067411559,2122484177682025,8194824533876331,1735392745832045,5364423909433339,3744877234597490,3743961606118764,7578470472863351,8272734013451896,605400539353023,2796934217008523,4217537591205501,6749844396871765,3254156206685824,2833087346273922,1031418968211075,5958964490354309,2211096632368775,6660514395451017,3544965026508429,6306340748892781,5417276690014869,5694163690438290,966960059485843,2474149675777685,3987702310780566,6193677916929305,3862327285702296,2263586660612036,6483571136966597,5992708612483695,3037301542633117,1350281300930207,2731948431343265,8206673693474466,7085671967952539,1458939511156390,7305824813293813,3761600094219947,3203298087861934,6503573632024239,5225705399453287,3421829275385521,4909852578143922,4963030464041587,8851811738050228,4277335625461429,2111625722039990,491199959981751,6931880560750517,8082990042849806,3468017773810975,1997508214632124,5978794435033034,2707154566713022,2488857113487989,5824178611957440,4059949927386817,2002215877474159,5639932700145093,2031192927792843,6611645103428166,5527276576259182,6848926219890382,3688537180270287,1549530261020368,3139825612758737,2054710580080339,8662299423280802,3304166496816853,6349307440250205,8805719932889721,9112419630819205,6294279373254361,8259532203304462,6821571418202746,6664010515355359,5141654754672352,8018710857953232,1981154059288291,5450391152627428,7062224376218745,8917186760867558,4551215811366631,3647315641012711,7621804322944096,5640260613107434,2549594476769003,2498401103564525,3389100120874734,4414231401725679,7053276770107121,5402288186007287,555141025967864,6164115505409907,861506284070722,6981729297519914,7979780218957566,4724566596288255,7143190133141251,2203909323521797,6794611075796743,2406418852781832,2431147396931338,9201102619219927,9209028692049677,72656062656272,3683461550546707,3156079150759700,5593545597857557,3685798503034647,9054282374667368,7328693529453638,3894385258729243,7113903204552476,598274857897757,4837764499459870,785842719842079,4724731890605856,4719429313871649,7916711067983835,8547389958967076,5803337333635718,3148514413817638,2616091809828649,5010252471820074,215261577153159,2535876467420972,3310503323115309,4363046466308744,2323515696295731,6242121013485364,4121067860008758,4111711852744504,54928807149369,2133746750881594,7399478461767483,8976303730622268,6956082611134271,2664362379264181,6393962549382978,2777956427972420,4270896664876342,7670053797333836,8993411905553036,65617729843018,1292922906566475,2967607514980173,7308569498722126,4092356590219088,616882705096529,8583974846336850,4225686076387155,2187887423180628,9006213841505390,4166152299904854,9071633823952728,2428235422771172,4894759928995674,2016164553764703,4889826673729378,6241052815601507,4162564648951652,828333694119781,3512032577594001,5005989433111868,1874239187120175,5687954605375341,8609922926145393,1993275200016242,845788823796371,7197362048159604,275037120221046,1801275206256617,8194476540993400,5855779389325177,4256472345023807,4538603488898940,3509864058867581,5339577517900437,4189143409770368,2073715707596673,6023117795517750,5399031890362244,1573107540672390,7282706113200010,4011387404033931,558735877332876,83166781250882,5963590795353999,3112190251462546,2181081730658196,8827803687770094,7724897940688790,5256658960261015,7865022085201816,8123509697168382,4514245792812955,1025475811135389,9219332721192261,2028072384929697,7467335540400034,2203602782592944,7965610324332453,167894249090983,2605011208343467,32603191963564,2280869912154029,1093529392287663,768617718185904,4882316627972018,5335523765858227,2375382411513780,6122783274049461,4790766136889270,2681841310609335,8774051203846072,8091840416174010,3164525091077613,8348394730450875,3917053492559807,2983947831910337,7130411148574658,2003627071083851,3417344214880197,3076244208144327,3127444543274952,5578012417638346,1177183468310475,892684572200909,5138344280182735,1130056091934672,1770915762339832,2508983603584979,2384313132466132,2153136934395861,5282269621559255,8301207175020504,4799691354193883,7998964700604762,8927947075315916,159970933657569,2790597388386299,6766743848312804,25771393241063,2438746107822056,7813696175579114,2827861308312231,5227228304904173,5195899241148398,8549586904743920,5482593250418674,7450634403829075,3396327423037428,611156861902846,9045908420578043,8550257921936041,3203505065127928,436440873577812,5314744005980154,3490271597518843,3723597580546044,1812744655888381,4198370554085374],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a04ede5f60924719bfaabef59c1de821",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001922645.1/GCA_001922645.1_ASM192264v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MRUS01000082.1 Acinetobacter indicus strain IHIT27599 NODE_101_length_630_cov_0.906561_ID_201, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a04ede5f60924719bfaabef59c1de821\",\"mins\":[1828617314115585,593705338339331,601413731491845,8433380826173441,551084228464650,2620175079126359,4825520309256206,2543729409769493,1222048642428950,1807955372148057,414012816228381,3886894914433029,5252084813774881,2424442992840738,1674545770917923,2954061020250150,6086850716597597,3451433569861680,7962740512120882,3385941072871475,8156161492664372,1984451249893429,4386969078509625,7249876427247675,3742857453924412,4666693443661886,8693384573685824,5719015839367236,3907624197849157,4723295660806217,3138093963839501,6115968489812049,5861179272786003,4877982522462292,6834173592719374,2616819369730138,6799031723130971,5254009550516316,1252291231236189,8109653332713566,314026043232352,203950537109601,718657269948514,4610834787725412,1317269299290213,6551024042000489,7143294664945771,7713646776225900,8744071881617518,2682684385554543,5088173941244016,7267043627331700,217053151178871,202996972777593,4824636747608186,5332838617243771,5857523640496149,706739838173312,8071843511799937,5623206606131331,6212632571080836,2978009338023958,5091607990657159,2620006036336776,1206682690797707,5256639131312269,6721805311131790,2667712147909807,2758557876330643,7645916590811161,7209451500728475,7005802400862364,2813217110392989,1538519921086622,5753804151894175,9041056551395213,983815683018916,2400628751649479,983283996516525,6661260419437939,4304727915835573,1974102342664376,221546586955968,9084358302331061,102273488474308,4106024377528519,2302190438342862,865575546228943,9214768017223892,1407623134392533,7528516353663192,4786141726677095,5507207195136220,1028767748026589,8082330553618654,5121730424987872,2243969401770209,8996058250371299,4072900595204134,8990290797756655,5049294158246129,3493464978320083,4654206868705526,4847568489013497,5781069513613562,4309473422909694,2503400408731903,645433919209731,3085498496737541,8380856041281077,1536289718919895,8528894098731278,1240754212225300,8398786906888238,348861337296227,8167099938021656,1993324823843097,6645148773503258,6318989805121819,4165370461765917,8996875923267871,7674789736853793,2006385762509092,7630224222052653,8240902430359854,2322437322125617,7104180113743923,1269275142918452,829177052758325,4610538743300407,2768114910843192,2893120285696313,4454016087064890,5204796421779771,2893197128196415,7276081193079106,7848671226533259,2685990341816645,3438763539001671,8126650808889675,7837799014521570,2444864705917263,8982961753211216,6629816856461650,6847201168511315,7200573823344981,1098504329924950,5345987342958941,275226350100831,3914069105881440,2965235050381665,6796875060549691,4065250164232548,1113218820227430,6019156614185319,2262604482752872,2065049117712745,166249554690410,7009736859570539,3472789757878637,4159812081271150,1361055917021928,4650693751075186,6740276998734195,6212212157464948,6292595501932917,1088451581227382,1225130329096567,6949664328573304,7471564728193403,5031326322430332,802683280683389,6816925184831870,6795760489783682,4566191560250091,5930928504680836,8962986828378503,7496319539401096,7167890959577481,735651642110349,2236832609554830,3091116202348943,635504700375440,3279020354572695,3120361589047364,7951716671734173,9187852510577060,935222758515109,5989243389084070,7886280476670292,8474015835427241,1987578805301676,825937676280247,8034214313904884,3912843765584319,2582731222819267,4649936171778501,4696933481476551,1570669519720904,2442450995433930,7165555201544653,4169218771149264,7496047706087891,6592871108899288,2654624362348623,6418695952871901,7876289044546014,1162486706782687,3841457640159312,2352105454662119,2962254173925870,7953253855736309,1627039649735158,5545605073138168,5319886577119740,6197398811423230,4822479832129621,75804161180160,5546972116308481,3497967969812994,1589201554977283,7361652231451140,1786813153209912,2139538089042443,8475887267648258,4469338489460141,4034932631819011,1900113910182420,1565078634914327,5712345874096664,9192751287710240,5707995068101155,7709174679675429,6571453445300316,3075407692116522,5000633122359389,5730609016623664,384753906893361,674425361371701,5397162228699707,4188291807836938,3107904460034624,8294848057155356,550747946381897,1886568233624138,7902092587360844,5086297115357282,7953428386644749,3522968632619605,6020075009147481,4939529798677082,2756071361360475,9081417406034528,3152939819713121,2828388263858795,739772508623471,4162795802272368,7111043607488880,3796499244782194,8192046221742148,7741913758560363,3710270845903493,8470610316874375,8764092271353964,8642212072673933,2688222484927118,5214879970419343,3601199168361104,4471594045117073,2727613508743826,1672277128975008,69518059664156,1877828587487915,6703820068053676,6129787610911517,346740244177586,4624180406502082,7990150095913670,1532241754005178,3013705630729733,5250439546135247,1483576634323665,8986735964431822,6369893730915031,228108788675289,6520765191557850,3739197973361372,2879050439809830,2189346397975274,6538893910360811,902553808581357,3350566220366574,379377650017009,2312974004019954,679299538559735,2473785993754208,242954347442938,4064321900843777,2906006256775938,5081225596887811,6068843487404805,8069280508470022,123292793557768,961277168575241,2977260050678540,1410327873684237,4425096782271248,2488415828693777,3726263325976707,8801257752318742,2901721543074583,8240375581538436,6982206251774748,7186087646413597,7805534657041182,36843184980768,4255896527004452,4634281909265191,2306533999562204,2836631161414444,1306155337710386,917980757619502,8800225604563760,25572397409073,4558333697696563,609799417041718,1542731003376439,2058659038298936,8186179179549500,5172278819541824,4299251517100865,5712870661267595,1119453426242372,8078910354119478,31460205847368,7981589917684554,7175431416652627,7387564197507932,4987613908689758,7164258432176991,7433616320791392,1628893106754407,48850754335593,627472838636396,1979650442339183,3957356627977074,7585093597979509,2579459855524726,2883671567242105,2036062085191146,8715083258942335,4540527509455744,1201011354190724,5330007622673285,6755330026484616,2235593047008147,1500144007328661,8845511860656281,8984663703969527,7104528905962394,6135643595944860,6563731882909,3298662787656041,3699579526841249,2363900318741410,5473569104894107,2852608789439396,3035672207111080,690208064754601,3528233409655722,7897099254282397,3540069468574641,6509829807731637,7231303358247863,4241847236215738,1112404084790209,7826613816497091,5014551925851077,3306128325526471,8517153490412488,9209427540978231,7816743510328271,5476149057807312,8659163864978386,5102326237438931,5897244817372117,18675531887574,6094715476059098,8868676873316517,4190652346778593,6185986650919906,1526848242242533,1359935810561000,2992468553724906,8452677167059947,766123452648957,2579670913790962,8517815806563838,3663569710892023,3646685715514360,5131503302794068,2684019409761274,1304952278422523,3649721792418812,5045376719057917,2066898155701254,7882662196882945,6422943037289480,2069632630719500,4527255466123437,9218962127586542,6069207604143122,6140580335162390,6897727165125655,2820672400696345,718471317398555,2400471310394396,8341911215064094,7447528260813855,6482283534799906,1868658666279981,6347506190799919,5950871910421552,5143602337518641,2924274686923833,9046266436445245,7138577246316725,4137196497368130,6768036988240965,4076999412274246,6080219666081975,5455629466037090,6985928379196494,780955409507407,5638502134755512,1582861134345313,395271389279332,6083101194253416,58426069746793,1052878020670570,9077565280326768,7161808665515122,4477148473586806,9062899029480569,9169200773527743,5594270994084989,4484956589819006,2801890931504255,7487272190542016,3766947579790467,2422945877742724,2692994758042757,7707589327869064,8743085258179721,5294902656047298,8050311616038032,8733673097770129,4131960198822083,7488073850085572,305552803935386,2466000789869723,6203158211634332,5583671871526049,6901004265837731,3517232174797992,3898351136497180,5603082215240875,1219387157034160,1075099040457907,5101495978276021,5561681656722614,643917125600440,7796346447943083,1243260549416913,5052222545630405,5757836199249098,6067402541999307,4643552757408972,5981273631757517,3397166795302097,1732798518629588,5854578960397527,5359940506735832,6441926150227161,3227689291691226,8964678473295069,6410956210734303,271089555469538,8739189889922280,4947363464053993,9185865786069348,2963366141353216,3435973062911219,4363162888070388,3883804251223285,288869423027448,6905185005778169,5920031208957178,7074092949046526,7257213197316309,4735788657894656,2340324166939520,3293314923463939,1671306246276368,4302409268548884,2974393837126933,2465497543265156,7373936202556699,2415748698334493,8378677666854175,7610396774270242,6297800305666267,6190297576670502,5046578576500007,7994269557134633,4363438889891114,3636743842547250,1176473176659247,372309619578161,1313671771772212,1572509476648245,6479204867618919,4464972393989435,2849703222637887,4627676350412097,4658545312412994,3047255237107937,7048085894567479,2995776071492943,407661876647249,5339868578395479,5183978667607385,2464432536294749,4526493545735518,2873439436178783,6953407269262688,8030773967727504,1076621469743335,1035481575531891,8135829473019253,8817397430916471,8495377830790377,8613051862963585,6210883315189123,8734019542918532,6974320149071237,139298686633350,1245283576153480,8877602986853769,4102768102282635,2559429675242892,5026921971545485,1086491472487823,4199467292792210,475462317995413,7734393818047894,7208441675773335,1676391004607897,467960172582299,4275380072440730,3553525008963141,7511259381036448,9218172188685731,4296815442093483,4684492470990253,2879822701102511,9091552868498345,4258896420697524,1874384389133304,3771220661142966,8403522597169396,5960350070740416,3745603703059907,5137511029491142,6311998213711305,6822924416210379,4172033291419595,8911654770212429,8973708402057308,8678288119354836,4313766803744219,8792527723369949,6593210936911326,5130713785669089,5179877275678178,3310047054943716,8343010388679590,8285803529438695,8997242654676456,4083628038170090,9115540793628141,6640775926072816,5719353108493224,7177173531764210,8585592533292532,7186568843355639,6364734718629368,3943883808491001,7521265691047422,8665022834419285,4855972835030528,5192188434109957,1422648439744009,3772383172015626,5695731474396684,6921904600335886,9027786728237830,5489788483646995,4163851402233433,3459367147517469,7101149744522782,154706490652195,6677750660196547,1715626690488498,4543077796242988,1880085825451565,1944147361809968,4596823979206194,25181802137139,6707955942663733,3196833954711817,8528522682521146,1172442759220831,4140287853741664,6048783863105090,2143134919771715,5514027011005253,8045052312680006,4445154346346056,485775426770507,2362877224367693,2809902146315854,1994303250470482,4055506257888851,8217655879657123,1079444396840536,5373636313122393,2123081700063503,6051956780447328,6253286687561318,7421285602969190,3479428779013736,6367060105893481,7020567592220946,8169335649856445,8393005931234930,480784632748990,3815125724042872,6281402394936957,7594889879959168,6951008055903874,487872511837827,4235790143088260,5131070150629654,5283892153869249,1736880810628745,8661934126651019,2503217019041422,9039771015652973,8254676743495960,9093608418674323,2258785538143892,6883622792513173,7079827566257816,4664976644126361,216791000557211,1652362835191453,7521989111801503,2757980028683937,1961313624178663,9017750002869924,2283617429399205,8260849850987463,5273955666757298,3780827360937654,5623665590490807,7202977381799610,3550433876747965,152143369696958,1786493144209013,4147465450305227,6060817521477324,4302386386626257,2842788550817496,6807044363821348,3505325936645851,1252573657335518,7293830665324256,7474237857317840,751154437240546,1647833186891491,4087339683432165,1319251631113961,5202780877813482,3725749530375915,4143073485858432,7905500441392765,583551042238192,2415393732181630,6720411896530679,5946975557576441,6582428037895933,6566459993888510,464346497718016,95021459179265,5155093542278916,6992759908001545,2130005553903370,7275023793731342,3128462587799312,5299216452171538,6685041420113684,3577814914336534,556106934802200,8517419523970843,7154143091365660,5249135005558559,145676342355749,8713617458493521,3431563152738091,7671665968285485,582536525727534,5354018540828463,5708264806336306,5118391477401395,8988469536728888,2907934844405562,3920861005388767,229606458730303,3123922293163841,8226427994318658,4741493535283011,1144393651988292,4599887065700171,3777472788166478,3658354340882255,8360286485391185,8261974062819155,2035490926602071,22449468524376,3823590312939151,1432708287539036,8702645189871457,8695172984508731,8859385942894225,4013162821584745,2170599769675626,436699150190444,3507666779666285,2844998414477166,40140440192879,6721178697946088,5109856519374706,3222282696968051,4619464529839988,7755796286613365,4701656425731958,8130702377985911,1413021832468344,3797033686900372,2171489646331770,5405683809339266,8622423533324163,6946365302142852,7891278462584621,673611995920264,8777170356295561,8045086121279810,4725589958457230,3341767821674385,4637926482532242,4048736165033880,5693257071622041,3632965526960028,926109768714149,9188746842204071,6909725685675945,1086535430182826,8122259639995378,3854870643943342,8425664918300599,217520354621368,38241576495035,5996879472363453,5674955689813951,2800994675868106,370620265338818,1319922446747587,1177309825996740,5029328395421646,8457502059087851,4989434960086993,7510424314359964,6649463378472611,5832053701777742,1301910394025943,6910856552761307,7922802891879767,2096742755190758,3851056308307946,3019787239761899,1506470289135596,1009041086408687,2556366409529329,9075026498229583,1457146717521909,7587077797790904,1422991360919548,6625094958016509,4130027386628094,7936884012869635,3592110281865221,2168470549170182,1794921217402893,7374598016051216,7612223697336337,2415827264370706,8538603789654036,4249141128230937,5800525303375903,231101892671521,3001804621191203,7786641508893702,2459082142414892,342594043672622,4116462187137071,5504241824663601,4571558186231858,3107951540344884,6713850192754741,3972220954310711,2893942555047992,80763641628729,4325399755436383,5907581324167228,8456018299758654,8373671772598624,4406202623363138,2127218571458628,5262333879871558,6577926190737480,340216043349004,4898017780103522,8150000840468558,1858467793086544,4880886139136081,3715237704833107,4270918618282068,801355517732953,5357194834520156,7661489206437981,6795215415075174,976075889817702,1688964482209895,4590147180550248,7752483450923113,2293480290812263,6068235766106223,7601392609077360,8690036101443944,5971509818964084,5384353607419582,3426123186952311,1244826349693051,2574721944197244,6866906803058814,8641360983251072,1326926361077891,7441848103159940,1332428757248136,6173218840459404,5489476331542669,2032000323238030,2795704096143503,3028610225637523,2336898350155928,8774505789741209,4854428948576410,3753642181810331,7433645971409053,7396261249525918,5923670367918241,5041927256643747,5202540387334308,5796345634715813,7695949051159580,6836355234961578,2045621619697836,1143896700799154,5875366737936755,5653502826535966,5295251419424951,3275828433293684,2916917588178560,6835141037023605,157958681422018,2033071735818435,6358308055952515,1196769259133125,1458909167577286,6351683667830986,5825814001555659,8740749029633594,2550109435832532,594944726886615,9014591307397338,1102388445677787,3328204320265917,8648974169575803,6847390106314982,4647401125718247,5446467571976433,3639908628621554,405147433805378,8834033565833463,4872923077331192,580824057547002,4601745160562278,8776970281081216,2943606140369160,700079102494985,456175448054027,268445514119436,5128873466530063,2540685511293202,7393373421127956,4478536060291350,4015793906014487,7832592989703960,561762877761825,5922946822535460,4317715770020913,177855330445612,3861114218395949,2544048646939904,1925101084932399,2055505380204254,7520486114928950,3136429683816762,3084801837660476,1433702830652615,340804784556353,5570838372911427,7814532552112452,8427095510243655,8189024942018973,893174986574158,8756016508537167,2973071084521808,4686572201871697,6973035530430804,4049679258151310,4799428893718872,2026222022608613,7841846764216720,6012267893213538,4172989357824355,7462264488163687,4246193830959465,252190404630890,1695302303484272,1864938514200945,1103724855974258,5462231557867891,1228610783763518,1249830882314618,2676579853638012,4419252609972606,1303380529786948,684194964724098,2521131044825486,3279696684403087,5892867793709458,5153809726777747,7145330882775445,6278037043935641,3582785298856344,7082547512494489,271536346204570,381553112742304,5631369898351009,4629253792938404,815924154722727,8187925680138665,3161942075881898,7547165979802030,2736681067874735,4600493529418160,9105837548624306,3425448959138227,3372481268095413,6627368788838841,1798204801505722,2484078873213371,6454211459328445,2771594227633692,3036351599278496,3959646931626434,2927326441900483,3447449390873028,5284171678386631,656025486027211,1753033527880141,9219623429437902,4808321377515985,4316950743480789,1467295465888215,4677534043732388,4727961515166170,7372847954889179,1652824881584604,2227031758567901,8542821020429867,3728154855131618,1975704518851942,5689675398306280,6665824149768681,7098862702115307,799351423384658,3294918130215407,3534615019411957,8122584772545015,2069224782618240,8945130934020606,6706862793894400,7959068001057289,5496777681050129,4882471379790364,5203713082199130,9020866816858659,3619889015859751,1326231589960234,6023144126863915,2113494533687854,7722356452006448,3552215165913650,388926773197363,1073834250033716,7058924525296182,7427023168436791,7173135764048442,1013569781357116,6173654881958462,7225727460567615,3016568485206596,3222596935719493,8317018574514761,2093899575786060,7792775372581454,2653392697834063,356892674157139,2065689316308750,7248228695011693,303907246090842,1523634072058459,4106562325887580,7466812435982941,5205853258803809,823435928345186,1687754330278501,7573562706295401,3931668601428586,4916460426176274,7312652901300848,3603936334918731,8136197016210036,7810277538839161,7874533478111868,1208419196775038,8908675813252203,9071917913995909,8294478482364107,8895883954113162,1945791223917195,2204806259374734,7708016749551384,9064718485162654,3571284407368351,2336318103784097,718205314808484,774975098210982,7219981204609705,213682940099242,5216889368328878,8701086159002288,6990395145292465,2885530438564533,5659381616278198,4705845104147572,3516469626935994,1109896673753789,5361728291900095,224637697940164,4814109849696965,5156712640379591,148435207568072,8667450025609929,2314907594590928,4736115550735059,3555775053454040,5188964572768985,5884495316364002,1853847122885349,4330696290999014,749973708221160,4394425904642801,1634966327974644,7855026905705205,7730857237285625,585032909048570,4295981958806274,7194907299547910,4705796516444938,8274089242131211,4319146178451245,376289703389971,4917611120372502,6950220351007193,819318393985820,6193873181088105,6373287647468320,4266891459341090,6049465308072742,3363213282622252,145813369703215,6269466810383152,3555317598354226,1589027668343606,5619205032508215,337724961504057,4547296412621626,1077062803036989,720155269077825,7567081269930821,5283792230316874,4583336381881163,7136550292937186,7204139274423118,6910726286052177,3578856689900372,5388303183268700,1421429390318430,1353651545627490,6263066378804067,8737790791946044,519596165524330,2149602604903275,5889701240867694,7701467291245424,7721839513946600,4371914392357746,3034865563165843,4728522810743674,1147233099283330,328982286920580,3060800525470604,8648784173242861,7141013703441296,3735271518738243,8822690702618113,6722109688537161,18655440030616,783355984219033,1077470716246938,7836296924175261,5249734244047775,7699050986003366,7493401351959708,3968962311154602,2592396808154027,2561247055539116,4514679395167154,6562776412371891,8391255911480246,2349798021217208,5096740294433722,70690779458493,3557209303231422,8712505062912309,2928970751265737,1421130447436747,8208431876373452,1939114437802957,1558821500066766,2906294875200466,1807398516026324,9197826982681560,6979532249611225,5824343706045404,1246547707890653,8336053462350814,298721074158559,4804250232818656,7454293996772330,4028854564944794,3272019726345384,234588943260658,3573849251605491,1212908507200502,7833842083902633,6084083959806978,4177585986587651,6747306993019908,7739527297608709,6223975714733065,906782954679308,2297913571650735,6063096334687246,6517082154335247,4865210663574544,1901274918702098,192207244409875,6363382082378773,2888085499485211,4977141303905309,7069585622866974,1777588588694562,3363752878804004,1416720950320166,4368721446234290,3784728492354600,4438077815925801,4585365551475754,3961644991650864,1179256261033010,1702913090038835,5323032701918261,3683067751554106,2852243897084989,6061313841601598,4728943495238837,3898182030851136,3174525941750915,2777616899298486,1607898983358236,202730031823943,1136334707551304,9121694526647369,6306326413782097,6388418564983890,1631253333179476,4388241556946006,6096751546834010,5891079201119323,724094892043359,5589241646570592,8332306320985188,2289861952408678,6016488384298088,4410892603923561,7253105031519339,2002158010813551,6281860805114995,5673645895941236,3842140218539198,731720610163830,8973271565487224,9071759712914553,888087210294395,8221820038552704,4882945578933379,5402033260293257,5678410273320074,5227262182634007,29742843321485,2346981032748044,7630206067010703,2688699628067985,7325608297876627,1868074558535534,5131847682370710,3446396475206807,4491138393250971,5143920716254364,2032200098854085,7950506739551392,415120776734577,842212535950504,1653656542481579,5331228001180847,7235226411945138,858363662011571,1906282554821812,6392534968556734,2924586761190598,7693239777729735,8109821018879181,3453909261573328,8643910405127383,6982953866648793,9171744856820954,2975165984836827,7612831171894492,6923798362664159,8372062090730720,4554358304572625,6945855222074602,2516359395790060,138518908779757,8094213614898414,2675581022153967,2542483838794992,1961305423437043,7077432489361961,5274855875124475,679120376070698,3233072860712190,6699760241626367,4914472097398016,3968654109158657,6186931650313474,8145852264930569,8860411649730297,9217205694086412,5750798158425362,2055221636721939,8979022920379668,7384217369754841,8431691327593752,1675659766426907,8063774375226656,8687423023181092,5233004949495077,1125534089321770,2614649905179948,7948328771435823,7753414891302193,6990491743444124,5343976278883635,6008306313395509,2907889677310516,4923377632607455,5857780690812227,8230227238033974,7723921584131398,5974285459647818,26243532545355,8819236474373346,8012506123533647,2140308004347216,8801964844502357,8336666758712663,7010694682784936,6630800692750906,1389941523561823,37445045739408,4417382941908323,6401248608752169,5943812947783014,4034318994074984,601133801785916,1563657139834219,3636795606108050,1314433874439543,8815316260146552,6149831985315699,5395306896477564,7244937033514367,8279496196451717,6685278731861385,2573510656970122,7415749939690892,2674698881670381,851263340588434,6853491548020116,7474659404848533,8184582484133785,311302603218330,1927905705184671,3730947830373792,6305337317510561,564901745126820,1457543414754731,6442374257040815,1683760740011440,6103478908530097,5933330288336115,5461240768032184,5169091790722292,4277162494537148,2475429478608318,8141045543423423,1945217677729217,6905015154666948,5715247387114060,866386954603978,6615944017339640,6658291988458962,6097232263474645,9206020350926297,6654227224948188,5148499020375290,6699920155377118,9072807882763745,3612862723808738,8479255111601635,7216992438410726,6106852052012522,6085974452325868,104919479639535,6032213150788179,3100234510790133,4891443003733929,8371659738724456,4244712251776507,2294421985234429,3892551662857726,6500672275860736,2679814504390148,6649672873836039,7932144177225226,6902072325844491,6640947454336402,1543223906922000,6431459312512530,1925076373708307,4243109136821781,9178772926853252,2939272511417881,4153006166920732,95471033191969,3021095271857699,150742418173476,6655075863240230,7711287114309160,8215577374129707,4083964963876396,7115574063775278,7802312970493490,4969600825343542,7339668662648376,3693544730140218,9211171397479999,1242840359730752,793104607301185,4154030619930178,3441196713209411,7606534256229959,8579502542044747,5257659173472866,5348519873072720,8819827890843217,7016459544694356,3050818524401238,4726934767185495,5653526189088351,2780091840806496,7225662151290465,4493712951762531,5737470469934692,2764128572169830,2196958166855273,8312836253081195,6158880904343149,544616509140592,5226337757240951,2850589654437496,2804148740939635,7271383990440021,3870068048580676,5329349437324929,8350938269691523,7873974039907972,1726060548165569,3304444244299401,6810978790841994,2083329678261899,3741172289482383,564303052144273,6984664106835302,7509321764224660,8792681023893144,2851243513178052,9092835722542393,7327828574895774,1971959061425823,2839410567327394,1103823210087707,3708784308776612,1160787122442923,8041812033774193,4469376531324586,8082040042987181,74779702365873,5760689556324018,5389632418684602,2666337348480702,5902716872101571,382118525332611,3074254668316359,82085675335369,2031192927792843,3746647432990415,5320268463759057,7420833601162965,3576009170869975,3517246696115204,8201212327558437,1676864763496401,6972946471509630,8058674781069035,3803648449538002,2992976991178478,8413949360234226,5004558441541364,821117473537783,7686428724043512,1451727361068797,4941316871765762,1303296656613123,2007678216032006,5829447907532552,3637998968610569,7554846408367882,5734340898324235,1736250524233486,5322228101619473,5157793372659475,5057750740074260,7328747218325269,7701717338033944,8837070085111577,4349094657732380,7185865570714245,6515106707738400,8146464656744225,1982812372315939,4348427971686181,6226086389306673,3514475425369896,8471016682045225,1958442102800176,5211397640589109,4705170522038071,4714496237850428,8831539816525109,749224378744641,565354530541378,5406872691109699,8625893660622660,2212025439686469,741343196241738,561904976383819,3363251781668684,4878026577407823,8753885861015376,3240101910126421,18797377486678,8758466918435132,4778143985295195,8932909371162461,8166223803133791,869048168591202,7759837174842001,5154377560428519,2590697911336814,4995151305924467,462317798870900,964827310014326,628002694602615,6532594813759352,2236814851981177,7717610261905276,2383442543787903,9190554012057472,8411982046670723,5812325323366276,7163020239771664,2265484975128455,3454510291681161,3625429547364234,5102515185344395,5463940590710669,96307906318224,719590785048465,6663185273405330,713534958182292,8018048598073239,1247168701177754,1130200248063311,2278147393871777,236399958884258,3824717423591332,1716019665366342,5915581327160576,6126158011617199,6406642306547632,6858686734442587,9161815883173812,4157496877588409,7337392377003964,3474829271022489,6379825104515009,2405510550060994,7276329078452163,4519495252160454,6389537263741669,1976182213472202,4615403259703243,6010111017182725,1807878530739050,8663181349347278,3958332410175439,4638535872995282,3807347449933784,2791752673834319,8020274697443218,7004119115255120,7254138186174439,3668911093169783,6877965520642029,3604814966591471,4406616107524081,4494312673660915,3900810123857908,2713484922482677,958684605758121,6815646635649706],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a20adff6c30627dc22e74d57d7f9b7db",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000265505.1/GCA_000265505.1_ASM26550v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP003345.1 Flexibacter litoralis DSM 6794, complete genome\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a20adff6c30627dc22e74d57d7f9b7db\",\"mins\":[2122774170525696,1390805933203457,7122120521891842,2605641466317483,6581743222026247,7123573022859272,1583311710265354,4414633712926731,2563580825763853,805490286923791,696873772650513,4078276611993618,5460558965227523,2071662070902805,1713173426823190,870187211857945,7922917343703066,1638971035525147,220257047322652,2105095501393950,6048502937788447,4468160756932640,2533158482010147,1031321052479524,6551793915373574,2610187561955369,3339143736487978,7995643221053486,4739640732454959,4601095947796528,1257114894508081,8549315763491785,8487869944287287,2301853561589816,532714772308026,664491964874079,1158229054992449,3093312943947844,1162801096814664,6865493327331429,1589774398980174,6683669682135119,8475122129801912,7059082789066887,4777623500988500,5712633329920014,176058077982807,2069446683418712,4346796476665871,2655315798581340,3054464411613200,8968431712219235,1753656725880932,470020526821477,8094500841136230,1218811561705489,1410513956679784,4393761561829481,793164435251307,2976222584873069,5928211099512943,4172880465264753,5010577955475572,5190935808659643,7786156304432489,6182619198365817,8442329492785938,5357519887831163,485430695880237,3974287042330750,3154739295486079,5227718869368960,3924284201689217,3111088170590339,7001581273514006,334735100387462,8609999171396849,9030129373565064,2956898571436169,8635547321488515,5800374615367819,2303091987841166,966833240526991,1151679993421968,8999495091150996,5398832494323447,5016073782743190,8516717925470361,7304311826276508,7465360213508256,5667541045839216,7370824570445986,8829191738922559,3754935156068517,7165110239842471,5758400161374236,4776012957511854,7842116544553135,299467918151857,1440965212352692,1590687235684382,7187763311770996,3843224756891834,2967809565823163,7373073366924210,5029792114710560,1049530262421698,3775808162226371,7474807889817796,5805789576732877,4951087132483791,9125072922038481,7720683295981778,3078411607973923,7166854121261470,4313487654392024,4403153177116900,6799968250192102,384917087640273,5810008737370347,8154960090682933,463961239871726,3159566214253949,8739686654008542,4964376928743665,5013266350977266,7591991339099518,264787300749558,3934030344732919,2827875312754937,1274944698089723,4213591451287805,1598096968601854,5479290971845333,1572493105819904,7416099791957376,1211407178769110,2925830090674438,2801895039873287,7861368229736712,2037152602571017,6739764131044055,6839508205436290,7550850398830311,4784711675658513,8136564052140306,7409368354861333,3004532538880280,6042376456275332,3971577071570233,5508174984380703,8017627780927776,7876864377247730,3350187531239714,6576981004620507,717441474150692,3374077242822949,8080919124435240,6141457168441641,3482814368825642,7917161063822727,7235433715131273,3849185485771058,2095848269472051,4005010970779956,5450989385859031,4232436635238712,8630039422886202,258103378383163,2369055573934396,4926596103128458,2341479789986112,1559013982114114,2858134342655371,1137479827530056,7577351438017932,2569778219347949,4609779200131810,7686435246993742,8846744696106381,5570966638997840,7718148482203985,2960908792033618,4358843415429460,7366890215981397,7762004770066648,7411349086974462,5504654610944348,3917183777734714,5484254171193695,5266741081444705,1789786718146916,7229403274060134,2780039744475495,495774686663874,1244193366536554,4932502226846060,3771828337488237,8173608019566959,6585920248549747,5387709896991092,5610561513424958,544648258478454,4797451075511700,867189369602427,6966492381077884,7187647226105237,7393809962271108,3310311417041286,5503817868130369,4684857666048392,7664050649787799,5310665269596558,6947944804925839,5853682207580560,7062013028482456,7025123382962243,3260160728789397,1577564468309401,2584796044120472,6115674994422170,5375295257952668,5343615573176736,8057613901975969,1340497768625283,2612035462357411,722204682305959,3439685653582248,1237361138127273,1977669880910253,6890406945046959,771525197455793,9131471520178,83001309360565,4059865098949623,8597864109015482,1116479695667643,1855310349660606,1361343881576896,4228461326041537,2353349281440194,6244910230405100,2966728591442374,4599825094270369,7011740552978508,117433202008522,202661488382411,2245956450230732,2669664783864269,5928328167702154,7530363086255408,8860529805128145,1132062798352852,7815681737032149,2381213029749206,588976460815010,3190937360589272,6329923898974681,2513602446795228,8129028038844895,4958038342037986,870848702104035,4590945477643021,7649032674517478,4562374312108520,2658219003118057,2746067339698666,1944154912367084,8954923061983314,4409359250985458,6518207495551554,7959117157606848,6435873047034990,8476832389165141,3435219897651713,5407733514293764,4915266890142213,499857301254664,2071800810111497,481717686956555,6968311992177165,2953442596925967,7465264701255188,4827338734899731,8700991636017569,7025525417759253,8126136408683030,3772387214725656,6992529382937114,5770380590002715,4766563777016349,1893040465097246,4407483919041056,285826567320098,4406820761862691,7386369611652572,2265914867515942,5082779448406567,4864336274723368,2489035196224041,8387524577026603,167284919517741,3545503179956782,6974266042720815,6419703413136124,746364187103794,1052286062551604,1999694405616183,8857811456037432,181947125018917,4771457204408891,2255617358701116,6205734760440384,6845806320572021,3119045122773573,30663263711814,3157051482763847,7957871486394952,8307261544536844,8991959066939980,3506396899050061,3428335636398670,632043963384399,8392701892584016,1884315497165393,302171814888018,6272564434432600,4978920640995428,9220585102366882,2186622631203423,1204118344118882,6211935795795762,3120463015445094,3741724427039335,3096022928265835,5441297634370157,7356850952790638,7035547407930264,4852930242056819,6295720998147633,2817480942703222,574170652123767,740976450966136,6830145189565049,9166362244174460,3696158508687998,1622656384815743,7823166239853603,7674295140795010,1652912069920875,3401473834676870,560231488135818,419554253943435,278296291492493,3789890286019215,5036172223840912,7574584155144850,8503636614315459,7313956818514521,83668127400605,6760574928171678,4958429610656415,4522983139730081,6525904998208162,7573902192997147,3936691577316004,2552674536411813,2031766027899558,3935299506799271,3544200276210345,2082433104618154,7293105424118443,2641866400613037,2254202187985582,3176950808085171,7941289189728950,8714395169052105,5022825288962744,3076468686463673,44677536932538,1427542971091061,8147484810756801,8924201312371395,5263374187188932,6985288731632325,8456574831580428,4678560797930187,8449854439047884,4734966913276706,7901293908832974,9090018373694925,1825685706277584,7886395500706595,8577425611428564,2887871595856597,4463605757833942,3092368270279383,151730901299928,8438515996586713,7575597159047898,5859375355320423,1778968910840541,4383714629198559,2060777867543265,4226285355819746,8013663521912955,6440973591190545,8537347658679865,2723800802808550,5641420710032104,6452085622833897,777410020565741,323440349614830,8995312815307940,3258267118887666,7617304195212021,4764293487338230,7166421340361513,7463640069853944,60856554058489,2379503530128122,3652303400642687,5168866290868988,2243803900429053,3710560827667198,7595161193682389,2083950099813120,1040867390845697,4544639309366019,3278075102487300,935856215995141,4175738947990278,5063710296736519,8128189929235212,1506416962577165,7532283974099731,6252042430935828,7733445992713689,4975090923119384,6963334966895385,3463939023807259,6656791547622172,7460047423521566,8825141764067461,5170254495327009,2010422134620962,2715241901540133,121534246613798,2714359801357095,869502313755433,7194435160150847,5550154568909611,588374862562092,7929921780906840,1970965674660660,3964195320247093,2761766598271798,1007605062857533,3681742845281086,3474537624122175,4597494519194432,6657053374971360,5036417773331266,1511275068891972,4005195794182981,993540269077318,4169866712077127,1284347033580361,219359357977418,1582315577097698,6195346016965454,2447686820270927,5821619972735825,6493671222345870,1318251577561942,2253953652433752,7736393766306649,1187396476702863,7583396950397788,1433256716510045,2594099082257247,7262954801257783,8634488154461030,3840624643695952,7198723793871723,4146747848524652,8674129662320115,279314778858352,2443929301910386,7689805674033982,78589438419831,9025098141107064,1914765731029882,3197195071247227,3450302838248318,1295887393280895,8636761722373433,2610382164247426,4946380861404035,4561370795529093,6865852735079305,7604011081850861,6531156968645379,3560169583420300,1912783194219330,7978819056072173,1769264106427284,3352305849222039,1478532348826520,1467703670487876,7163825204287461,8356571007853468,2532107125928861,7829351843898270,4082047429710751,3380833729946528,2487935212295073,2158407095997346,3646938313479076,1688781953799077,3622432732959655,6541822682245276,8859130112111533,831431724250030,7922652730260410,2321912318692168,4927999558562738,7585933909136307,5143389668638615,5280056666452917,3103499681629110,3744399481271223,791256158430138,393014218630075,5562221823878076,4804499310613322,156145467401153,4436283896017861,8961299514274758,6972087533130695,7550252052374472,539323403972525,1817022128430583,3357500483765196,608317853000653,870983596942288,1349024885507026,5897152572112434,6454781756253140,5744962940595022,5563097506337753,5179507344238074,946231373136862,8961762038224701,3863250725528545,5350604398261218,5693867529922726,7280936174617574,3491954071684071,6003010431464956,6459161193616363,5494210859721709,8272899300402158,570552712197629,8104917691692016,336424483464179,742835829822453,3687812616796329,3032459470963711,3813985517106178,8397875751851034,42596311245830,5274340009710599,8908699320301485,8972292876837899,6444100888859984,2705071007148888,4317749738128403,2665362667262998,4999275607307780,3356802164053018,15347840713755,5281836539962615,7894234552386592,7237174580946491,6200341725873189,8445124103980087,165867268588584,1809552222788444,5437763278443564,1725385060590638,8197058052008797,3718036098036784,178309067023409,1796463292343348,6842828537312311,4490339310240825,8911027542721594,3666140584383547,8641852081792061,1909692254639166,505199898248255,4432404339971136,6468971425565293,9053145159607367,3763404374918216,5507106222470217,1324718162195530,5023052566737995,763518280606796,298285392008270,8449065636238861,3328256441059908,3736397081551953,2178858482467922,4846699080074323,8083518227535823,7353417151161429,8358388834943577,2489325855704850,2122233151770127,2003264884319324,3995025260999773,6616885386924491,92340296897631,7183257277622999,2330113142658146,3984761816724579,5760047901987947,4489788496852076,4451781882636477,3417511884678260,2339442810143861,8681317649040504,6242499241754655,2454807736329338,8055074289891519,1218101852931196,5961784420578429,3015132914541694,5965254300308609,5097382775395459,7780126532199556,8253777627317381,2232118297972929,6632047148393608,5488985298723979,2538118701413517,511600236684430,708759366821010,6075024082616515,5001874426713236,9110404802663574,5309765540983959,4675279765501085,4928676485670046,6608667006776480,3725911633871728,9218062365562018,1586070097863844,5280071389447333,4607799112197287,7429650007328669,3413734941156522,2272251732399276,1754131056853874,8799250399510045,7264847486726257,5189193028188360,1001572481332403,6513854497952948,8185585868842165,1120374358168759,3517189850195129,1314454717953210,3767645562537147,8279709496471072,3337096503592130,2998687284323524,6573220508914885,4934011984688326,8284183408731681,2104813935539401,37961960957131,7366761214780620,3271224882296013,1701722559726798,1394506389374159,3122271911986385,1146316187030738,6849616827657763,2590986194462023,3287849921971413,8134721962312448,747886939342042,8515672312718268,7168615887672541,8386434177930466,6279155352892643,7363944899192358,4553046914344166,5686884204659945,3652126952674538,4611334156580908,1945145419699440,5743835156092145,6823788870140115,7140626028665311,2494600373888247,7030868413781240,1855591667906772,1697740171310330,1665970979484923,8496982424990973,1990098047726846,4239812872590591,1513203491411200,7116669209285892,6625248369419525,5060327996122375,2591228675446024,4866229620954378,985782888406972,2564267482084620,8722036970255629,2194694033196302,3659302971393295,3509380292576529,7104037993710293,8589234428416899,8392841830769945,2383933933429293,7283776033744155,3245108010755357,5807814638634271,6528219827008802,7802804660991267,4443157510534436,6376172741661990,2771076322886951,7367421046502696,1121760386155819,2315392169477420,4443137708901677,5565421131216175,2188324254328112,3213002887877938,5846934441039155,3708418508150070,866935636704137,2252948162360633,848468160775482,3565628453406011,3628365741983036,2325158310417725,1194889507128639,719648454104386,2590518993352004,816191673849157,1855631705916742,2223439643743559,9074561549210508,1947624104802334,8457831484403467,2738057752892748,5833229511132494,5228468464592207,3760529340639812,5637393789273427,9167623884084639,8728742777300310,4205234132481593,4297356502758745,6463506549412870,3423006667140666,4232098666997086,2287974666384737,3745047071958371,6889209085167235,6377473392483217,2418582493898088,8111756634043964,7012548811285866,1785099404080492,1526957751244141,335745412629870,2059395596449136,7512012554561384,192247048574322,6193965609985396,6962497926041949,4619972562676628,4482269978740090,1413055714805311,5960821916721173,653290866324862,6132512690861439,135927456806272,3713439864968578,2044286785066372,1715855894726023,3868320553260426,7886528570265711,1262459974149516,6998326591366722,8762793189885326,1885336547980687,326432021767325,2860891950327185,7232436047535683,4090342948689300,3991965701363094,2657177985242519,7751314080994712,9162830230369689,3300268565669276,1249548351190430,2933534007076255,2780189340001697,8571794081822114,8815537585668536,9145019529880996,7262564364363174,5317902155535783,210490126767528,6065171714069929,5457935664563101,881354017936817,2391969358413736,3047478961214900,837065387210165,1789161183106486,7030097609948346,8448530779911077,5282217165903293,7730665400046839,8284297775470015,614975887717824,1337734216807328,2579086298375755,8534206594692548,3175863813875141,6406981734950344,1055305509901769,5840946568504781,358830392546766,6351517049001423,932488425149905,2709167446361554,5611932401871779,2444161337251284,4512804197975509,1275602811856342,5057781293521145,7888041152239064,7233383472903076,5884991353329114,8589892621497819,749880693634525,3166900552996319,2601599785026964,2490091162727909,7928704300552799,8807866009912811,2492669068846573,1919960927299054,6751528289404874,2553021687838193,4719611145433342,8591407180860329,7456396063942137,1666766648055290,6483181756575999,4123025039332860,4930216153695741,6358288096067157,5324907828471296,6899504209320816,7999659749465003,587115567941124,830906117899782,4586731374986759,7888560997298292,4781997042931210,1674390603585037,3469293541611022,7025237768960156,4825516570788782,9175493875865115,4763010094749214,3429008176100896,2724306841773601,4721045834716706,2424047790235227,5238145662588453,2386251043161638,6293296120682024,677946785588777,4085943337813548,2017280346194866,949161370658351,1436807908234800,1653527930529329,6431443478821022,3667964513994294,7851612859874750,4493211020424761,3472469758318139,7462422675344854,5055390085826109,2154331548382782,529666086081461,1431925832926784,403756092745282,4605368353073419,9159524747845873,1436539728717409,839480942126007,6345922754713166,7004957735923981,7488844696151408,9119081161815636,7779310087362133,59798855910998,2265290544637529,3083085323953754,3890699759117915,5677778627003322,8492519300765505,600542227269215,4420533297415777,2656177994401379,4453411823683172,3715932624717413,1021174160858193,6334678150665148,6122907263813227,1569779109766765,6565334610171502,8648232296609393,5790289499383410,8636330494865791,6193987397745598,1409144788379254,7572135017784952,5597898907438016,2864953328567938,6562445619737471,6749290017707318,3996914127509127,5920657561265232,8634202728883853,895512980301454,4666530374612623,1078472720950930,6918495467469189,4074941221103252,4257888034098297,6247532877206829,4890644552918681,5741631050663578,5253307930515099,2068458085316252,7161076323554973,5554947837007518,8879767852852896,8811408040976540,3661127532885667,7164907362594417,594436115629736,2209383355020970,4355392604280491,7400955992752413,1489115634361406,8811312374179443,2868339853780660,1429348928417751,1933098428943465,3088023926515384,8708968380758737,8658575664453306,8555639833045516,4055904097830591,6149170492110528,3873531743233729,6914375417530051,2184752935749316,4473660586682053,5125275160032967,1706445112301257,6820939127273163,5862931213604560,8687162599571889,5244133467048227,6699242377598676,6841898586674901,706151614818006,3113237768529624,8674805827106740,8233779645084735,56834520854821,7819872383829728,4279475655321313,6299349387802339,4390763947525861,1673283657393895,1009236268930793,4148176478303980,2255324464178925,1336449873047165,7016966821586672,4895887074395889,7391036401755890,7706853438026707,3167547392269950,4459262710683383,3912675040995064,3284055806797561,7509102499905817,1835639369281834,2303934539478782,2856766553462535,7655255773538056,844267711973129,2703932401030923,7975911865951874,1258066341381906,6336370300281719,8243980642215700,8294058103079586,5868754454640408,6046802600261401,4285981628708636,3533870899693341,7908915145974528,7685761295015083,5005818975000357,5367140759455526,4717412945618727,7813086301604359,4122778321450793,3904478077933354,2682156356323116,1994354608043824,4356287671142193,4247500489330779,9149652870779870,3520452240357177,3833926343014202,3648440766372831,7713202547038012,440388095452989,4295715035055937,8660147038570709,7012921998075715,1268671862478660,5353458176395077,6172528031751137,7243638664140616,1274758960564041,1355331166844746,9195255826718262,518955016537933,6293116277393231,4342793012550472,728281684054328,8053996123445074,8879816772166495,8410484549766025,2162189233727317,4932239035291480,7270531252327664,1434397704976218,8960933454284431,3352544360691551,5188054437795680,1650391009773409,6582673605179234,3193997719562086,2997605362268007,1008814415243112,8207192122624316,8043292114265746,2815178747979631,4487543003989874,6429913648863091,1149634131355508,7922518592235381,5449336445253510,3692933809503209,710324831307640,4662756942337913,5699980989317440,2435125714315138,4748844816332675,5776979129419652,5179048209643398,2542248807856008,3085125872351115,6098321921012034,8679349242095503,6728803589371544,7708880208443282,7296600423882859,4990794298533780,8026665414237166,6097038069540759,348419709114265,2485027980691357,4507585714042784,7095327429472615,6373883502184356,6902786176453762,8193267073035249,4689862708529065,8567026994739116,6112911127529389,8321448086865839,87020656166836,2172409214523318,8952940666708297,784529361573820,8358953514366909,7763200396814272,4838929713379265,4225961927526338,5160550751635395,4043068899583940,3488613202683850,5109759317715959,667568763541452,8935975215833774,5670157116688334,3398124906682087,1657765193905468,4664823256680403,4047678498510804,5144079274260441,4153039761455066,598592822757339,197529219463132,1521249306781661,3640977639536608,3282203978426339,7986415913293941,720510813747173,8434958231465979,2293250293528552,7362120134228988,2999014370248682,7281068665883645,8738140530005672,3439892651363273,4005518578952531,6497914762135540,4717390015726908,2083749221637801,1999848216164344,4265687995511538,759964373018618,5522007084140539,8877354501782396,2080561141501610,7023810016028670,3774847380641791,1033231459829760,6531848870701062,1386109742086151,7106188326403756,1119336015390730,2575297604257805,1034223270898131,4197241530251279,2606607825590288,7064834371356690,7406480085473299,3379395352168468,8163510816552981,287967633282657,5803076677105692,467463339321374,3515202034133024,253280020748323,629702937114660,1905564054497317,3778490735982630,2420973039945767,6082124102144031,7766726998693929,7448212872130054,3111971976460331,2910837978482732,5410496476620845,5225786491226159,6209683355003979,959588831456672,1043083481229364,1633500710258534,6585482669703255,3779971941042237,1707405125089342,3368766040631359,5631388872783936,1363014445779009,6831782893647938,3702850197166147,6171406921353285,7986015023336162,3567447814105161,1829328607614665,7354886193113944,7414465585944652,860985046104141,5207590298007630,2125041748253709,2690449015486544,2651549734692945,5193215877994578,8875172356307027,45708338702422,8656317394757719,7997185875330510,8746063357552996,7624913457607311,6653122429524062,630903656020063,552761493719138,2516261853263419,2753988322736230,2113948322101351,6359844880742504,4123792742807657,8919884976191594,1418321131411563,7628742417746030,4101757940480112,6420149909518449,1370547434449013,7835066322541881,7063871168129144,7597415753132153,2458435394054267,7495928765516138,5615172027840638,191000078572565,5235717931759745,4175206375192706,8162496325626219,7452163853045777,1725669798978582,5528329018775687,4790834398623880,1758379888275343,5916836323575951,9206434851460504,2630652807071890,1255541031172243,8033899500918932,2550055854770326,6095101460048122,6523312062154906,2288167955929244,6962595804555122,3078917228243102,5923836154529951,4266028502550690,7299039176075428,4164195083331749,1798739138963622,9002528254072490,2784683090553000,906538234546345,5296112036403372,2117196935411885,822246155667630,796395529492656,1361614168119473,9005560750178675,9097805103601844,8063035855804597,3068080097384631,8382358611969231,6447678324105588,2811898659256509,4930690932390261,8324231339558603,6064801666273248,9046405756900385,4416907228031176,6804158011607241,5322206633269450,4130661102880973,4075159885670606,402277308844239,231939219044561,1339316559530195,314999491299540,8573820422692558,6376960477491577,6977141521066200,8369121946958042,7402648209493711,5306120505329884,2789167497447646,5517743304288480,7458030720644816,9037327999322340,3763777513007333,7849977142216934,664196820986087,8702058415513276,5669564087896297,8408511448308433,6030947766671598,4123540797196527,6829744272880680,1120342610134739,3773244352656425,4000789707233529,3780034886764794,4496616360187633,3655634048579837,7488955496594399,8704686944017345,1843390995159298,5336330790435075,2844536823257348,2657091627243784,6861051285653770,2688528515901707,8109453499341186,1917399562325037,5196901285607696,5793278553226523,8497353636481305,1473457750124826,2969232741054747,7146605278136604,5940339039805249,1263307004885279,407426424469793,5259701848504611,3402849336006948,5829334804838693,7432923738282278,3770021160507687,1822228636784938,7240760914244421,6582796913835326,9116533305727284,7310115893919454,5922645075695926,898064902598517,6048420886808287,2230600775280956,5950798351554877,2468710804248894,1300292086221877,8308362988755271,8764262291855689,7394888847100235,5011649144457548,5959538478845038,8499279388055593,213077252004177,6573531242113362,4680752601573715,5384362779728212,5343739897225614,8766101763808103,1772303858075991,8535688319859034,2580032531831132,8641519674534238,6328272683740901,788069449709920,8415137865169251,7751682294770020,5774427587791249,6788627705836883,270897515829611,7747792398592368,214141119274728,6936285745633652,3828784670198133,7306204400506221,1412437721708921,322010712435066,4417030877325691,7449462945807415,6565817462260800,2035217629706626,8248535767128451,1992515791681925,3427959945848556,78862508374410,6205841067073943,8482507727602241,9217960117189007,6661513794996934,2434814916180369,5826644100700562,5568543780542869,7027688115213661,3091179329694104,6880903068735898,2465576420166045,6615108815499674,4683535328283039,5573537913788832,6362344157063586,5966182583486884,574644114389414,4405898679933351,1501514512460200,9201229220012444,9211294458669469,136629413886384,3299420802921544,3706749690345908,5361449879202229,5840773842733495,1913132760881593,7156931374307771,7741811753564604,7444319075752381,4858942499105215,8963446149929410,2704138451100747,3645795433699780,7283711228619207,6125029096475081,8401005568223690,937768160369099,5288834671309218,2651229072910072,1323289980576163,1654706511534548,8918836998152525,748654825101785,8064566729247196,1333316760402398,5866764819696095,3725548725787105,8554471328229860,8364907415251430,2408309035723857,6034347310029290,898185887807911,6381388571126252,1859355159215186,1587322726922734,629938637638056,2318444237908468,4267941605250814,1941185810696694,4327936026028536,7813062727813625,839404525769584,491488718035452,3333481032784381,1086933635623422,5575572134124629,7910023669000705,227021410478594,7322751664912900,1605815979940357,7717560759304192,7230375543761415,1086380150893064,5865251186223626,2769501169023499,8185802231777804,2269396197706253,1297961993103886,4585261557017105,4441676044769810,7438611904047638,5638350177278487,4590156694723097,6161531867257370,4452933475576348,3374618209421744,5824769394233606,1625000819169829,5295258880027175,1439434122014471,4481138660801069,8131084522084911,1645204924439088,6059146501274161,7509378783558197,2514844251597366,2267240376352521,6668202477496888,8688390265070516,3844941355919932,4497001724766784,6575633728578622,2688427112299074,3860925426335499,2344835935627844,106795347941957,2310978719791686,3820619856927303,5118347634330184,5889951714273867,5724979541797454,3929796391627345,9199486434466386,7331084649753172,7344763546742542,1684773351782998,2685966053018199,3084101460179545,8734561344067086,39013735590493,771934161529439,8945900770445922,8467160257165531,5608429029493027,5952451528702570,5718664527930772,5171767099603565,2883897188465262,8052337531931069,2435226321459826,3540023868275316,4931936615195070,481724265237111,1395249159240314,9179689336945275,1988377335468492,66690638854781,3331129984541120,7989457156004483,6899331937983109,798752130964103,5611896094281345,6705611772525193,6038870565638594,1771064183437966,8799356348549007,7257905617910416,7375080999213715,6629786633427522,532526991715438,913278906361441,1643399989242520,2285971039681177,3403936836799130,5677640174658671,1903758232025756,6420873482422941,2293838566595230,6916314073451168,4243587842013858,7644340701613851,846154613050020,8503764512102399,596610857024169,3098162460007082,1434124965474759,173268457343662,759914977094319,3076494860462769,9092321426926211,2090604740079575,7645171705113033,8308796496620216,5388090650471097,6082690339588796,899980304927421,4485855246117566,5836960310495935,3646881806158529,4039532023800267,5438737578416837,2770350422273820,77032982729164,629255365532362,9119000641338060,5486038083988173,3609225336953553,6763276920242638,2567813167442647,8051537962114270,4430262382705370,1256077065456348,481249179535141,8607435759131361,2800699014482658,2411392167764683,1759732710499452,8090139630086890,7798270960711463,8298873610332908,7848682244721390,8745622319680239,4124053798136563,1710362246785780,1849666879170345,3036378565646804,2515658508225276,8710999138518826,7718330216749823,8720208422255489,8574613688244993,2866048114604803,5744446509079300,1504423980419846,3152178614737671,5581522459667209,8744909780840919,5020621303503628,3491631161170701,4035395591564047,264778101386000,7133383717748080,5029044249451282,1146912663710483,3167818189007637,2060083353246486,6459899260574489,4646849421794082,967837629143843,7610481360164103,8052915430365991,1413448365890347,3347745665706796,1389422187346733,6708069827013422,1264716475906864,1200007181908786,8278549157636915,6563320531253726,4543590531496758,6597864302811615,4239863510756157,3097615533726529,6366934267689794,3277898154412867,2616903700773700,4656091271273285,2973640993098566,1371682508962632,8255500489940791,8882391416431113,5941606095760205,4885470340131662,1021607279078225,2224290425473875,978492698274645,5292166206781241,531098092174168,6466330696547163,4536354520049750,6122990082834234,1942336632159071,408153381628768,222826507705187,6212643067894629,5761588064025446,4505019710954343,8161429377641097,1508996858977131,4133406618880877,6307479776594798,6016231222122301,2364955334753136,6164932911579624,5575176004425427,6862744791485305,2017752148659066,1192810368965499,8736189191494524,9080619397679999,4773545301980926,8818253537368131,2839245980322692,4641173810977670,2289829476354951,4394042775722889,8830452709645194,7539519944979607,5887074955692940,433782281911181,7443828978314126,1900598047042448,1031502375258106,7026850471075947,4775222281055124,24430972832661,8111884042347681,5818385064242073,3622064451337116,8641472925944733,7622308033653662,1489107667377057,2001825496128418,1737929277737891,3700998942301092,2892181701454757,724041130027942,7576461754837489,5511121260968873,2043621181610923,482289244257199,6626614171106226,8353360223875571,4669970066336692,3386990224798878,4435365079063478,1690906898904905,4595188782361076,1417200769604538,5378849791063506,6053760145185727,2918329851378624,876294200404929,5893867516591043,4757209247853509,353220044114886,6696004731540641,2633847860141001,6354491597511628,4634046579985357,6492744325958606,9064348451440248,1262041949061033,1068484286150520,6024322706509315,1476722044468183,8197457125538777,1747202314857434,1148410608009039,1305453749566431,2852607832914912,5149293970623457,6852378027686883,5084489619520485,7165032531835879,779110931246057,1118448059292651,8426472272346018,4915850745744366,7408212274605039,1572428819184624,2014773433304676,1899404537781939,6624361116682118,2270391906171895,1457292411952120,610036035730426,216680388348924,6625999822056618,7537380396170239,8696521987044679,1547299512921091,5820250202496004,7003591130426374,3516582797873665,4313656963443721,1976787875232779,2674964494040077,1523949119034541,2401344890605400,6699966671178771,1615506062576660,729555657944085,5756906055818262,4252414320389143,13529729485849,8998319142255642,150787459111965,209812425198027,4696276772237829,3765878071421984,8455202561356976,420126869101603,5471848514550820,1673134179568677,2446792683867175,5447036591316011,3476989418249260,5185402624949293,1412116980558894,7628073998187094,7478166838965912,3837990857550898,4208064762952757,647482547711031,6001999068093496,3129976496319545,4455431086787643,4786418493700936,1266428839484477,8903753106254493,2957058795781184,4941636054924354,8784079288048709,3020291898129481,5490249029946443,8519929380965989,992245650652240,4247615964122193,4935484894665810,620440436907093,5774468722191450,6834228978475565,4633736399391144,6172970684423265,2866507398646885,4986297565371494,902890025417831,3801135626718313,7606953504504939,5937318701050386,3893396900547694,7564839337823343,7801324059679856,6247691765002088,5347820466435147,3180823279627381,8454222907796598,8422720008523625,3306973215095929,4875185107161269,3682668216679552,8051218702738938,1752295173999746,827788948896899,2753786428644486,8442368692257985,6498403980091422,7504856288115852,658488873821378,2457015816705995,2810253343571087,5863665639718032,4297318959522328,3070245690494103,8064800861400216,606172092660890,7889112113032348,7212580972813469,6444600900117165,5955784223751328,8076390010129570,4410505341443236,8343336708406437,7680370092359537,6817800608046248,6089975770365098,364887208103083,5602835253726381,161762191477936,7580464333663201,5285098322840757,4805733258468535,1440390950976698,2150418111179963,7704503109065930,3356919423945918,2931584918781119,5963287365901507,2622423251510354,4274938571476165,4798317041420833,3022356734241994,5021327118793934,8753240735993705,2481042124160208,1833479159352529,7977406981266289,6045876743916757,6068901926225260,7510734107294286,2908685372243166,4832031095954655,2775428214028127,9062254989630693,8672136970345813,7646514271747281,3142832622079209,7040036175072491,9189287913901292,3789817860676846,5811596516893224,1376234755980530,8195452402989072,4434993903889652,8035284658344489,1938475086093560,2776593732513018,56801297566972,8100242322210045,8228391304627413,6184198320798978,6753176941193640,6494274405846279,2587688617467145,1221772790847362,3577248043782701,8401590346913283,195209702051091,7894022113393942,4653701592034584,2024058219949339,4930333625167132,8141824130774234,1955865957854499,4968676986054534,2685590042713382,133394441129256,8445556118749746,5617677237488942,8841621201464623,8354364113448241,683154928913714,757598006861107,7989491396394292,6305952911949109,3861796918373687,1606966295997752,3378685239312948,1645803972455741,1702387517332798,2770421531835714,1783555220237635,9194921806414956,1399853074308426,8176320682920503,8044305453043823,6037231040355663,6495071172111697,3714422219873618,6308270500781395,4990370478611796,601423543098709,1254469772258649,1549764632502159,8948006228102494,3822360785059167,7367231373102433,5571734644796770,7794631851164186,7919189817077092,141585771191655,4533539689520488,4528925613404732,1094132571221356,7771939362217874,4216776783805808,2316888468200819,2164142792269172,2582778718264694,6907943894050025,560193805327736,7634035169066361,2770785321708924,4234161919409533,7562298765676547,471292035984768,4066526078254466,2395975943343491,1779947185810820,7053121405652357,4088374948355463,7901591879177377,2127019589356938,4879844852686219,1271247420415373,5243853674253710,7464054350060943,2512764384374160,8996127257918866,4243297106316693,8137960969719190,6649730629293977,1193570535447960,4813490491518361,1400669592325533,4327162629479840,3514240767421857,5117499204623779,257500625554855,9195442115324487,3177762111962540,4349243315666349,846995368422831,6178686916964800,1600684893072818,8263675874438581,8403879094050036,8210934342999482,6834021239168443,2252543430360510,7681363340103103,3174140265373121,1668766135948127,7296958064750019,6567515731362898,2965985071525319,3324456513907954,509883683220938,3763217429904843,8118209551989287,8493818574527949,3420235783015886,9166654144380372,3458806799405646,6284299354684886,6543902412093348,1954985121877468,4676725164027357,7034263592811999,4130795979225555,5492341970886113,2474825377246690,8353059906782459,7709798177980108,5573307240553957,1424833688137194,7900081827081708,6757252783542866,4180797062495726,3120678009122288,585930036313585,8400484154813938,607879388884467,8424402541811347,977740338572789,6291480602033654,3626958029417975,9041524253709579,7779425951350265,5378165556436474,8838998422658555,5323428142711700,8555189896261118,2809424035175936,3916455339769347,2541284362403333,2186945802915334,1105746226298376,7908207547674121,3280361548578765,2018503723236878,4479900015488527,7706949819355237,516379049758227,959873981656596,3422774046792281,8651322013515002,7932616474275357,1395497846382110,6798257778189573,3318689591434784,4358859528273441,494185135443491,195880798129700,8834757545029158,6161668183605169,480646015024680,7478019980758569,2420546423250475,9063115502378540,3263402312776285,8773114515794127,2037783661870642,5734468848803380,8556329606745654,7771436328943540,3544741885996602,7044059996211807,8161885006847175,5493237726152369,3431367605808705,6211856603979330,3311942378700355,9194945419902533,6067151211662918,5092474656625337,4030964462833226,4410898901016140,1513595490373197,7046909399510285,942891242954325,8062849779252822,8100131308024372,1840603265324303,3587791941472715,5237540880784991,9124435273485920,480168087477858,4953072415465059,8012607772586598,729229691073713,3074413978001003,6290263497767612,2428437635501681,897339378343540,7351848601718389,7200824888278646,8336620216274553,1133243676954235,7445242020605564,1920950964641405,3102895574175358,1745528523931265,769420088319619,940599338700426,4329326880603787,8964334171012748,2262659141179330,4465346008661647,8301171095112260,5729658247032465,6423758682033810,2211867266138219,5907668142930542,6751898384379542,7381473834725015,8123905093566104,3431983734107801,7649596701642395,8006513280761502,8502922663468706,2795476875746587,2040713614286501,6242638715637386,3449162777018023,3295714868460828,1552482445967195,7723632108507079,4593289566445228,6238338807488174,6046745831820461,3166737562742451,8163028468678325,1966204308594358,7537064923520969,7155180953066100,1641557350153916,4289367039352509,8933125530103486,4354552289483661,6000306556231360,1950429406805699,1469853737885383,6012356917680076,2690875621904076,4661295212572365,6427582091022030,4593806177415117,6795458938945232,2057841644478161,6703027944460103,8375096186080979,6408208042127060,7829961839109412,3546329917873883,3768197229375197,4359863888450954,6641765412900133,3945085838434018,2108711435308771,481308865539813,4481942765862865,3906582031466216,532139390865129,2824078574015783,7317197310578412,7534789930024914,7397535639928558,8572803855316940,4012134334467368,4019871117729522,7651574489057781,8441342469826455,3790227178241781,4982381429612282,3877071004638972,1647989444529918,8079287140196100,9062171534202831,2818864828014343,699062670700297,1074247926406923,4393106687135500,4156255287459597,691510035595022,3405978478419727,941238508371730,1239183235510915,655178737385237,4188753086785497,172421221887768,7928409845598539,6278260474295599,4947752391347996,8758481743675165,6932937685733150,7044577340458555,7008097207711707,3375010209656612,3665320305491750,4618630924488487,3646558601005703,7850456986640051,6871920737001261,5747810831572782,8151654114549552,3798234730307379,4245587549373462,7696132805869367,7533452447813433,4152322267258682,4104411073421121,1812091325296451,432996234338117,5532072415046,5431884321591111,7452843669905224,3414873679544138,113828050296651,3904766219104079,3669608326680400,1229263444311889,5647640833371986,4882388864700244,2182735958499157,2284483650849783,2471851598008152,8397633516787684,5625125038501722,2707953204838235,7874061837557596,8447284943171421,3359649271537502,4591856372688289,1087587255345000,4873200688172905,5520806227816301,4609806016753518,435180712953149,5087980945417969,7312834713861065,8781797917794768,4704632976363381,3303776806850422,5856041944305297,6743679786090361,8903445816508059,82933267636093,6660285231344351,5187821496453781,1944546243100546,4576117531418500,4664623671051702,8378042386128776,366045161971593,8189960747941770,3188014654803851,2389151587585932,1319771576651074,3254578742237651,2980941078790031,7607114167799696,2123885869694865,1178716545998738,7697344713973651,4721766431883157,4672060691056225,3423964637978522,3835520808107933,5563445510254495,2620600906379168,6167078933151728,3168106285346722,233391684923299,7551302844743588,6590642946547621,9131926256485346,3323207864225704,3071741397741481,3365847827902379,593079241236396,4537918644989869,1578229834559406,1505853405192675,5219021012869040,4258283689209777,2221522533392306,3247867880808371,431568651853748,8307700172320696,3152670654435257,2701563958255546,32280727662523,3724306178564193,8898196047916990,161941779845057,3680290661404610,5034909232176698,7860144853427461,2491008128819142,462213401710535,8908606749769672,762771835547593,270718426501068,5225724018347981,2603425897582545,2119959129485266,8859530709948425,932349467058135,614563028254682,5317259533549531,5235538841292765,5026240116027360,233225226683728,5477377170132962,3161203959311654,4521491357487076,6072222806487718,2829180649549804,301188239450093,8719766575108093,5857280110691599,1083639872675825,8099279256070045,3690725409011185,1370485961392116,8972807431225333,3294858850156537,387159098376187,6986074798538748,1247840342024189,3413614149857278,8506471259680085],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a448b639491a6f75649c2b1c960780d9",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001092065.1/GCA_001092065.1_6593_5_15_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CKCZ01000001.1 Streptococcus pneumoniae genome assembly 6593_5#15, scaffold ERS019293SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a448b639491a6f75649c2b1c960780d9\",\"mins\":[2490021567844352,4351975041236993,1488203822587906,7505674307494552,1437297775765508,9156419442896902,2925634619170823,4673037467680776,157105024937993,3680868880746507,348850296952844,1440440334817293,8077066856411821,758340579270672,7399917768027480,7440728196618259,6763239755290648,7178800151297128,454179274108955,6282000456626207,8722226075563319,664935045507106,5282130208907299,5880943850727460,4995490059538472,226286311893033,3969027323547655,5919830321129516,5246393105405997,6759021235482067,7205626432980603,1914294714538034,8534962898191027,5708833000374325,6022284450248759,1669056870281272,6128401535670329,2383410257381727,4994768899348540,2621642705029181,4823469834571839,2200860360506720,2745507764901954,6511915988359235,4297776730667076,6302970232279109,8942309949689927,3111834298552392,9027683344666264,7381673105354423,896853198855522,3331152991451149,1776087530322000,134468824600658,8142249097168979,4516192492929108,5532234932309,1466889659963478,349172897908824,4951944264425562,4514250238802959,6173416138940510,3737605011646559,5136001407117409,3110938088623803,673932933820516,1031383124647796,4200829096786022,6513801950003307,7983535929938035,7110392114133694,1275854055323769,8869629311992545,2432715640828029,3391039039561854,1148370269192321,7908674072684675,5488174607540614,731130213964456,3945428819576514,7532005729964183,6277665320904856,2560744196669595,1522456284846236,7650803846836131,2009848877923283,2523728784908447,2115001910163483,4317983831065286,980192377581737,2988549387186347,1664274172526764,8694717712389490,2155519832156334,4193665318563867,6132059653494962,3263791994380471,1948190278576500,7118354882747,6319452818284732,4074331659937983,7770099724170272,4481888984950978,9204896954687686,5791280792189128,3974075940614345,5474886157553698,1324055369967823,1399425991991507,9147228867461332,7321783608314069,1364953103081687,6585398126285017,3244730477582554,8657116718524635,8776291713706205,6326114462978270,4688577208256735,825710040733921,8669534285877474,3567926616897763,8468960698483599,2605431880233190,6344465336072423,6729005656600168,2773963945480426,3726409662025963,5417988368226540,7421590948459901,352283252400025,8880369686798577,312919095961843,91628013461750,2103447825860290,8751613534081273,7018694071513340,4791540077424894,7119746585071871,8831929208891649,720802622216453,8306057612983681,516850987546888,5987052939749641,6552596207679756,8455127976022285,2544299747985679,8362039703764097,1355402763045251,6594131641811224,4793887306531099,2281767462301980,5942788213057821,7267731856601374,8531691436980613,5026368732809506,3286701371021605,7553180956999729,2024130444633820,3557549382027655,1903636238151982,8513314683164978,8541725039939635,5638733567242548,2723888685203765,6694857484673334,7700615634676105,1230668051200313,7881913096376635,9023537540604222,6017037957524875,5273477921116485,7815008292010310,6335413189980487,3554120367073611,2169905851308365,623884981012816,484438152493394,2097515763822933,5960049166905688,2200853753678171,2961322738770269,611447939993951,332690941931873,4051079873329507,830520445073772,6379490887988285,5235010454063476,475250277257590,1796387695120763,2553156594620030,4191810702242175,6955761543776640,3392721843818883,1308465505982853,760872949647750,3814951233972615,69308857477512,5321362813071753,4821251652040087,3747019539474498,8974091310928270,7672931439647121,9116625032655253,5487972184275350,3594002438236567,6504968290881944,5152095030047131,2904893712978335,3723068793053607,7309780817653094,8537689949698475,7460393318239645,4895421267919280,1254190396827379,2690909527771573,4972814070550967,6640718785178040,259054668161439,8060362903685647,4116542334042558,3214391173607876,8638123200149238,1821235306916296,1633467053007307,8746175933077964,7014838411866573,6560583811300266,8762669865929464,4533275629345235,7932534848162894,258785826191097,7562975836533210,3596856859445327,8887776877306332,1611329518436829,2292427128957406,8771414131157471,4224869793313248,7286961056348641,79613614485986,8017098291406393,4596494124825062,6000761850597864,6688832447887850,7394924464552427,2674036456466925,2507459211151854,6051657791739948,959217804704243,8389816593560054,1671414082531831,8891097309954132,1540645225411068,6851561300580869,1883306435691016,1345853064153610,6716286728506455,3055177985796621,1788935612813839,9013164930507286,7586467174415449,6006028418963992,6688590052082204,2513735956150813,4134159845040671,4534224411662880,979010812860962,3611763202015779,7095014571945942,5023299390900773,1729188591448620,6837019012753965,5551338971394606,452013917844015,3760429834302000,4181568995199537,5685638822152754,5040961609722419,2020343516893748,7945241780408885,3637213022202425,1259522514681602,6096777306792031,7228077656558143,7455222171714112,1045068351257154,8827608513733188,3523956689437254,8075157434973474,4689104140466761,6821591534152266,8328602541206967,3067410791858765,1889791297981007,4068408567984720,9116669510993607,6369551829891479,6659677961820756,2793089844357720,4861316824440932,6631464134980186,2970460363812820,7736745512751711,4916985421484643,7144507632053350,9057626374089322,4569670021597804,3177162077424402,8664103508363886,2834576031919208,2823539459035762,8390590880875125,8525496742161014,4821400422546040,7406125158982275,4413386339627654,1770739082872257,5412724151647682,5238325991672463,1396966693474867,5006136790411922,7703075926127251,4310983456486037,2041530094928535,3152588199846552,6955366794574489,4526856273216155,3608941228692124,4253178763887261,6488408307679903,2627940344449696,4194772685572769,7315639731587746,6576595310187291,1186237668727461,1652455566897830,5663652953692839,6060645221894824,6940869907483305,4500535921685163,7580525013547692,7296965443120242,7442475329401522,8114401761218732,2044247346991797,2912264992228023,8348648835260443,8350360891189947,5143326630329020,932939659109054,60378415039167,2073885644873504,5929017663554243,3297787692927686,7820642448659008,8660141082893010,1563448413792980,2715678463453910,5895351909212281,5646759405398744,4644834818911466,653143408136922,7519721313245917,9118551576648207,6895963736646368,8806842354137825,8248966879860055,5441846297987811,612459631170277,4964245868144705,4447198327452391,5241908520121066,5330066487716588,8969727571934674,5593481517662960,6240883769613096,5445952212138451,4706193404512382,1982894836753143,8268929968020216,79154056223483,1840451770995455,3787710878567169,4075097623739143,8831685062214410,7803956871715595,4578748100848396,8792876362328845,413785940919054,5481554530069265,3629291002895122,8625909927634051,8718130070170389,7704677599349526,1054275711273751,3232819629134980,6943126497512218,2016679163142939,135393034402588,2330614697059101,5556645389476638,8683545464674779,7739193531261732,5072196046592808,251239388773162,150440999740204,9118370368068397,6883706139687731,714694405620535,2637138095932217,7383490596973370,473082175130887,9062291704577573,7270547944368962,39034603146053,4329269684898631,2090506758120265,7418089449595724,5544611548236622,5310090009725069,8261427473738649,9126112069464914,3514528151384916,8854944393594497,554134917956442,4340345205721948,5835545835543390,8344663634414053,6095228494617440,3802418303941482,8081066633892715,8580136266029934,659232984585072,2678492216042353,5750361275085685,3135001589832566,3974437427874680,2439170305147769,1339143413692223,3598219982521212,8902012397867901,8401625192446846,748492369918847,2946488938281857,7991792524602859,4278090677943172,4366419722453893,731854695534338,2498288362482567,272587809915784,8483091066002721,5333586270317450,3085514994581159,5560503651117967,7229143454402712,4313247489485714,6582908195467245,6358246566656917,5246123548898199,2207893604742980,4513006423851932,8263082455192480,6303715628297121,3697870177602466,1118919509873572,7399635515610023,3147001637462952,1162045228484764,4364702169275306,6450576479017799,4395681874742189,1908601069992880,8394486892685811,315268865262516,4683283242315935,1309665620693948,8320168734516157,4254960412910528,7423993512512449,8968912149912514,4278162006700996,5117598467695161,2333481361980358,7698818978630599,9205393091786718,233706734607305,8089510307904458,7193981743679082,6744432996269345,7571139692075986,1527689071442083,3545618863303636,3073597626975054,3202900029821912,6959645149332446,883265817000927,7197613786377187,4221545760052197,3211110987899880,3689429510032361,4287204640877546,681921309540178,6009376924892142,5350555326647281,4820307531580402,1556533368370163,3206124317975541,5602009914506232,6444402771993593,4075482473804799,6066288248120320,1334240332463106,2717039069126827,1969941769417733,1329166564469766,720479552678919,8109930570260652,5851798716328970,8387267156012045,1222383880604687,200727777616913,5143489273005083,5779310548923420,5855524488018973,9031816507747327,3764687194645535,790654064985120,2418126448520225,7013083902301220,6460189056408613,3624246052604968,699102757783517,3593090483125292,8917625531533490,2908150875031449,5692527180121137,4900581805020216,8750017995015226,6161451051914299,2115488745194556,467170594012221,7704172396776510,5046778326587183,7067723060898067,2651298661731398,1964788267797576,6362250025532599,6135267517848653,4282500139321242,902644470338640,7246167196626003,472032253574229,2696444631278679,540880812876889,5788326877807706,2746121921770587,2998221197220956,3169540776328285,8350040003192677,3787006737359968,6838386676890724,5474947324025958,1884594995057768,1376950582336617,3187041371548779,6634050899150747,6845819246845042,3810339031535807,4780176415622268,4392739515952253,7073924535239806,7367310935398946,9198328797389954,4146160279934083,4998390552927364,5905231224501382,5322002520433802,2628231161425035,5277264721894541,465302470372495,4153421342784659,8913980908404249,5842181598534809,3329415862656154,2580227738750111,6987677723286689,5764523469739171,66754698210468,3671083199515813,7897615896297329,6810211446934698,5282851945495723,7804893704516781,9069150556764901,510863642021045,6355352420626633,4535046787179704,841755267724473,9042569462230203,1837533424983229,8704271573329086,5709006516163775,1838960946691265,3098637385784524,7823645116391064,2315256887098571,552955381451980,527683205612749,3171556555326671,2052858832106704,7784501631454072,469792880321059,4540126200321236,4268318840757113,3738706871532760,3094060545559770,4344785205300431,5070918857901279,2112213802902753,9005602502100194,10794203296998,8616672720866513,8273719449674984,4399994482969833,369499245411562,6042056660438251,3573475823172844,9171068292599937,6622249050451182,1067247138215152,7261020895755506,5370745106134264,6338137699896532,6635324373912826,9182970227121184,5620058134965500,980834165894698,4012140846466302,8862061905700981,2166883391794432,2644015486018817,5152353752603908,7265754901190545,4645115293969671,3874679130076424,2018873126552842,489185464115415,2704398406520078,1708382316018960,5922302214251795,5656380821038360,9098813923404140,9203930780471855,8540820752669980,5667554861026593,3609776238564642,8812057437226203,8752071806827812,609595994886705,2277290711678250,4218585492534572,8080907313181593,4385494166398257,8266042070351154,6063665282355763,329966863613237,6415455302921526,1829914911063351,6153735932806456,2564593615848761,5930869980553439,2861115776294205,5234943150794047,8523638786856256,1386457056136515,4228561573166405,5062361211761991,2405135808095561,5688522463096138,4929627019541838,4858788048921935,6040298245971283,1987248962639190,6144104141039161,6309518686066008,8008509496764178,6680501502330203,5941322649937466,3364332293508448,7303694905055120,3859893973718370,3175948293156195,3233905027521892,219017391224166,1750889725910375,319625677180264,111932726324585,7063521322085738,9127293340278123,3673065535319404,8438475352979078,6453194575327129,8455408277401508,2002844782261618,2209850578288226,8089635282496745,8100528757670480,4101177121291498,7591455912848277,1810193964803456,2733504937158017,4931271922198530,6401601957291243,1002500276193174,5507078447218054,8504274081955207,554285687178635,145076693646734,7844815092368783,8625333227380485,9154959961896341,7246054262044054,4019911281737111,197710447193497,5325010964440477,6900042523927966,6278377241568675,5059174134916518,3244981624243628,5829617881185715,5429216854398389,5825219713459785,7409751882020284,7076735457512010,7206619084989888,6172441611898305,1794127634275778,9209524204227147,8280307856141766,8238016746080504,731993117656530,3313513219608483,998316214287830,6426530345041367,468620098749912,4534255548425689,1920876945800666,4305687560529371,7875439475477360,4047195022474649,7120322138912225,1848123976048098,6064530979196387,455490147282405,1109432910489064,6950617235891689,7484787540505511,6170136644554220,1389212279856621,1830611976336296,1819280158531060,8368711574510846,5381869512607223,3242880043404884,7512608243797498,1161927944179197,369157768830462,5851773820067327,568751031799296,8728774733032743,9182335974008322,3000495977328133,9040625095319050,5931956914269707,1673554010523148,7216509805180430,7483971843172269,2925372886324752,3066806850889652,4291450951892499,6579032172064142,8871662812751449,7287622131942936,4092422032979481,3567176523658778,7584168312018463,6459237160933296,2899359577765410,4352016916551204,8369553900946981,2590282051065382,1440064159872554,6197147197632043,5162225231371820,5482500727930413,8443773584726352,300812385172744,8768991265914420,2826428722986549,4072915558657590,474470838691383,5014327851210297,1938211212725818,4511712800822843,3625714571103807,6441750141939268,7447683711131207,6051374124254793,2409840279301707,2979913228295757,778382169636430,5323534501080657,4235781659098235,3793613813775956,5648441614255705,3458791146288730,3947151360867932,4428600979496541,4522373948296802,8414603672746245,4445175106844261,724585827257958,5033505858907752,3715037368254058,6568603722702465,4096985620477553,5627277066124563,6949652654890615,9101338701276793,2887405562332930,5782130075072123,5521230674065021,299145771413118,13306890006464,1588109343624835,4235032164587140,1220400307789446,3955664884126316,1769445018494602,4070366731198091,2537487380643468,1001196601284237,2815796982423184,1216264555253393,3855680930676370,7442316950914707,6992732071726744,4194416405429913,3447937894743707,8515914895089309,3600219413003935,4048449310987936,3553288286240418,3159752761460388,2350703927892934,89466973000305,8436333510076072,8904808781979305,287418009536170,269347042549419,5332390274954926,8370786843652381,4592941668822704,7884858337205161,8680281739153074,6437980416657076,5263445122647734,2951034585638583,5176683580835514,4766700513111739,7044393658122186,8849683899871823,8886167084279489,4671475720554178,6263493700198083,8599816598564548,5024687197085381,1296248454342342,1617332937576135,5319043952088776,9029912302055114,4081613236486434,4945003767830222,3223223636188879,5000971237682900,7426166430785240,8210223966297923,2396041509228251,4816142233056988,5106497930608250,6858705048481506,6745962241930979,728421941085925,4746761069117159,6880471424544490,7281004667510050,1993003255219953,8538876453388018,1957225587047379,3840030970646260,3516222783540981,8215516250631926,2890490800047864,4419324504063737,4967931755681066,8217474494227442,4799705321260801,4613384163815170,7681260965780140,42333614958999,6297460346930949,2521597713528583,353157195998984,6951624807428757,2953141236813586,8647717074001687,814631417812764,2394157127339805,3912204798107424,4075417394827041,8207114150879010,628966953463587,2071733380642596,1352071667157638,9087426803002707,4788406414337836,6083790178045742,2307574320041775,2209658260033330,850918761057587,3749791102222132,1652697002921950,3166565117857417,1075043958593336,4012476262782777,3601446652716860,8758000994553661,1491763920835893,430448660268867,2994617725708100,8633895739856182,4944170770362182,5033832590100295,4122598182896951,7025045086915213,4016302710255440,2805789493626706,2669633349924691,8025769708048212,8929001777037142,8958220082990770,8607199541471204,7882602832449375,368151546179424,8336423228010811,26544996540261,5870023400765286,6580293848930157,1747771398453105,6113770072569716,7747014866028745,8343019957792632,1999886316711801,1897806429322218,1970831653236607,7359943690084226,2287904013680515,2799159832856452,8327864943675270,6449639556661127,5911673329315721,6531819320379373,2282055807684496,4933201805681304,6151794197610819,2788532276903830,6159584902313881,5294600729448346,6423336043704219,3314151215368092,7685263285676357,6109448380381091,7536197985687460,4140843038183335,7171010035299655,5202153282101164,4489980880689069,2009354823049136,5220498056406961,3404318125418418,3146616663973812,1672563843819448,5728066511669181,6629435825731518,6901487045957567,3392795600406464,784713650704032,4255756178641418,8865976484930105,7225660297650120,2403430883938250,1441357170177996,3968836039213005,105586945308664,8946307404822483,5080071713128404,6442037107476437,3028469485907926,1182436946681820,4378057457211357,848657156116446,8209956960645087,6882877678276576,7801601576284496,1930717645236196,7368366257379491,5107935744880619,2000305354317804,1719825264803821,2782079898693616,5933533752402600,8204875963108691,1240329659639797,8380279870793718,4186850957107192,7058638927982586,5116592890419195],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a532ca6bf98299efeb2915715b9a21c3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000179435.1/GCA_000179435.1_ASM17943v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AEAW01000126.1 Lactobacillus reuteri mlc3 Lreuteri_mlc3_contig_00126, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a532ca6bf98299efeb2915715b9a21c3\",\"mins\":[1274321046394880,1889289494964224,4522783557412866,3531460840878085,3111512262418092,1136771047170059,9045387446620162,8721628834133507,8524707352827922,4357811418691603,1920608980826132,3107184815052821,3377131068921878,4254625940060183,4737191249034271,8054321458810905,2438814975606810,7152800011642908,694270037975070,1707307556294687,5478146554943521,2902814792052772,7924195673075749,4564481577218086,269753670617127,308356059180380,1661610972461100,533171013787693,4615063734265903,2877620441970736,8780501342623796,7800204370804422,5180725715259446,6983790941542455,235947379236921,1751487391176762,843366193737787,2206873753888829,8091141944565634,974431102791743,5174503606919232,1571619506425921,7808415807924525,1382004578723911,7441232729317448,667821274736713,4323750428632517,6549433026553933,5122676960696398,695143812204623,316200566208592,8216373356212282,5079415848165460,1933378886068199,8386503319218264,551944736297049,8524585280454746,6592259911039067,1351847025217628,2226334623572062,3579218969602143,3199820247173216,7011669510275169,4681192262512739,8839941459864934,545479656808550,5069361809104999,5813861705810026,7000212355828310,7160324505096301,1805920738930798,3133525872988272,7011445916645736,7743877479975026,4504078831984755,4044824645132404,3995319512465525,51947693508727,4485048358062100,2659843046385787,8864679164678270,6811493192712319,2543253327609984,5245165101303938,4772653502771331,2909210408773765,1790251109932737,5805059023552649,3684976722417806,8256436909271183,6912260789016720,2426394864612376,890176416218819,1597392882040980,8243726330064871,5838380146763928,8168717007237274,1233246554118299,6081762691723423,8567175974815766,325679819655333,7928166479024294,8968674684299431,6364755053359272,2408750305745066,696741005758635,353336891353260,2788908438417586,3832483670853811,8801448716511219,5901912103553207,8648396051270004,2661298598761503,2435861906241724,7523452379078850,5463846590139083,2995970492281029,6606072012038500,8167555270521031,574281393176780,3899400810291408,7422703149625553,3057066637342930,9207043610634455,3573538425167908,8960822007204776,7194258242150620,8623532008618205,1421091025768670,7890612442028256,2331576302309601,7530111021150435,1736778029106881,6278070179972324,2124746388335313,3801812416588008,4641987438061801,7930604895429272,8307814008612903,8525008293368044,4180692339837651,4224388328253684,3751318357235957,1719791612238070,2752637664309495,1714747540779256,5944417154652409,7415749557932735,6266333510746366,3516251853369599,3395634857089408,8753208972763528,6519527611597060,7736997489324295,1669750559811848,1323462641565964,6639635840471314,2616530713018649,3715830623117595,8060431258926469,7749090223546656,147538797730081,7656393340885282,6304230776373539,262074873084196,5247179166314789,8715652673978663,8337329209909545,5357614085114155,2360653321300268,2559706741367858,1193784169009454,6355568764743983,565621016461704,6080914606922036,164787992576311,2038781425862970,5323657406240107,2613227678230844,6655341468303933,5574178703102270,1533071967164735,8748751921193280,4772876789901633,9037760295934278,6145382155464317,6052654319849803,7247032847298892,6852895259302221,4670902911215951,3717823046029649,4556306236719443,7986069724823892,1804155642165305,6232665707386885,6549122494159197,6158008144693599,8922703134452064,2298652292774241,7858726656532834,7585873369952315,472884522731876,4479570470209896,1397890077174122,5726218055364971,4545545366538604,7377488346007917,2206324375284078,2315054675960175,6838191830974832,8301363643569896,6056429056231794,4206921972283763,5004120949625204,7928725655632246,2221124570997481,3577162329313658,1132362628991355,2588231881620202,2108623893436800,6229939016202304,6427415157090695,4462458264117640,3857722534998410,7225350724579723,2628621350027661,2729616337141486,7612048319071841,6686095775390788,1413590599745946,5576967925445021,946960475928990,2114960854409632,5784195368708513,8852153370480227,901258546440612,8531502457859142,893856089723304,3578022377142697,6354715936367020,7764922197579506,274155940465053,2024909699703880,1143233173950899,8175214391808436,1714688403703881,708205067340217,6173918414784955,909375775893948,2319638057218493,1940694644912574,8457888439185855,3407184049668545,286639480058306,4576316525816261,2988651486525440,6537446438640074,7478222578889163,8501294563176908,8842177811227088,1669164519823096,5404713519625695,7628666382595269,613053486381476,4685481021508058,1496804003359196,6043595244212304,4437496812630499,471385269246438,5417328257457233,2934578932423148,6879721437391341,4418915899326959,6118340273209842,2566454389547507,6940717284897268,411237775919605,264445413222908,2817242364195325,2207513370851072,260164162411011,3673849569538565,6460454198249828,6893154764455746,7597045983863307,9044949064202327,210532145320462,671654565212687,2026657835088402,5525710179628803,2751906077428246,3444305231863897,2631266905170457,6001972703906330,8245930510955899,2053592648485405,8498963635335711,1038177471423008,3096620991765027,4824296206817829,4981906279469148,2187565074534956,5532931724622382,4729229452960303,3975942975996464,4498555436104241,8549457431181874,8056024195084362,1878430785413214,4200913171343928,9186111265233465,6714417629594170,4020324272298555,3553642599742013,5341347454749248,6800035795829314,4042879012862534,1745898346265159,4831520159867464,5913674082896457,7651137909465674,2510238097683020,1186555946160717,9085470617105499,5920774724450901,6662663733760598,839946966938041,4142518218482267,6918653814168157,334326663459422,7604522285634144,4464954059881058,4430749633323620,7555755689647889,8499003865606597,4962640275397227,4560672633928301,2827428365466045,329429244144242,685030205799028,7366288650202129,2267899279239798,7001400280959796,7480724662771605,4782636090283455,3820766480163452,2879718752653949,9164634033472126,9029608460384895,927879758121600,8208671250836929,1148997637911176,3346729983034576,7166769186357901,8846834520060948,2930213890071183,5839823170988690,731625089219219,4157307740445334,766187653999255,2993100403790488,83204145646233,2795998400010906,447046011753115,908984677350047,6010280484573856,4747021034707619,4114241506994852,1799961367052967,5719654501139112,8977645255269036,2027733742080686,3312337422860976,5147660756023985,1868861816836786,3565570904034606,9005712070484187,4678939025093303,6294633459100344,8835182819627807,1573510967947967,332598401727168,7998162863428292,7040952261036742,8557156070444615,157054710940363,5495235853787852,2089193169339088,5516066820377720,6756288589378258,2171070437188307,1518531005846229,8529119290901584,6383860884081371,926622397623004,1573912888093406,4102447594662623,2466001748730592,4426578276471521,6504426219248354,168965569253499,3196136173898468,3766656826550054,5880787313210086,3310563186533095,5786264599540457,2382017792551658,3188647773330155,9127728146227148,7337585684755185,8350015739716338,9159347570450278,50954969928442,3131241654821627,1249785100443434,3524443839294206,8117182668175617,4969780375840896,6467318900093401,4902462027843829,2351337006414596,651035496211211,7632772420088588,882402516405006,6819098422455085,7195272972716820,7178313238501166,8155639993662185,4133092261126935,5041146682837784,5615078483954457,1727573569532701,6521788590504735,7460431808520992,4300714804448731,5396225837458213,8263395063702310,8373403892057919,7922896637973288,6551898695599580,5534919430949675,4561293126165293,2064061044677424,7024723799055154,3657983664915823,5782972405570356,8657922635440950,3240247843912500,661765893498999,6800871269172034,8859306961535811,5343997019708229,2859693626172233,6340035838618765,4325090826079056,2313462979317494,2665859756927827,7137484220489870,49281628184377,4257228480140121,8255457659265883,5848744581800796,3254203335156575,7039360781689697,389505164145508,2632490471422823,7624664576582931,2563313611373421,4449085070318447,7341785880284016,6591917111604082,6101170933433203,5424391782693751,6379102076834680,5081794484695931,6174755729355644,3210443937184637,2682764361507710,3903559296664448,4461015317367958,3485509153444423,7895263631208234,4262445645419403,6324863592244109,2241227740062606,2603275065746319,4437011931577233,213014822325140,8141735244447655,3197376499110806,6490276490613655,3516348977824664,2138736194974617,8218027708811759,6077055909850266,4439822257785759,1563178325994400,5696556956509089,1482508927077282,7909331937679515,285967700243364,3134313216781221,6096391331734440,7266548300674204,2085461128278956,3201108939936685,7506542624625582,6797078602505135,3734324316169139,3558312413662132,3553817079147445,7516988157965129,1444202674412473,8002254441546237,7328998930374133,7509776734544799,8641985541232238,1491087335351241,5729470431695821,1595086645566417,1205130344547282,5998025225642963,5280856142625750,4809008070186983,6866989959504857,5344401018409946,3812599695868893,304513039671120,9016833509973746,8653748252720099,8598099768757220,3312885326134097,7377738968933352,7057205523082218,2188732408570859,4099976305957871,8228848471966704,787739244970995,3867501192834036,3001287204127733,4440435758431222,110676116868089,9223062671064059,7983335498347516,1956762053944317,6392693331077757,807257406768128,4620570483348483,4803475455216645,1858326588986090,8983770313362590,5793750833402892,616937598974989,6610558747948049,2374755936803859,2431538065599508,2232087935759382,9074496539560480,1421196444920856,26565680858628,122700907904026,7586655830338589,706600261549087,8476156489243609,2028707474033698,6048668250780712,3343509093695370,1751697674431538,6804053260016691,851472362462261,8592747570154550,6164960025470007,8805559010446392,8529121006750778,4391857381995525,9058590086603325,4411539371734080,1968083354563651,5261855236678724,7237571727432774,1976792941579336,2922884804693066,8781856827403340,2020784469431373,3731554624769104,623532151514193,619577746332754,2328074396730451,9017438505073383,8407494579227151,8634974479342685,3578905218282594,9053620518749868,5296039731478374,3891081348965478,424888840997991,6416272027034812,4857536170564718,5258511085718640,8474084337624178,3861316038732916,2852670175009909,3048874857037673,102659733165176,422593526781051,9127339708695362,3347133566491778,5399928897498244,4479469738689669,540029235428486,8998072172664472,8952341019903511,4760779191336076,1626828713389816,9041882291656992,8146295334315310,877849282296982,988400178738330,6870907668268187,5463127137268892,2596452643998877,6340468666450657,7225018264419525,8485059198745619,3171009173908642,8191197818870948,5130159448538279,7028715345003689,5449211293703339,6447580079817900,2200302811336562,7668625006087343,6260344367391603,8996590776578242,3956764291998902,371603604778167,8255810446394552,4082141355637948,6648093398756542,7984410070316576,5552700961868997,5526513212342476,5675800849652938,961307283471568,9163565986405589,6023756432669912,6436001681460442,1076125518685403,2059598830329053,8560736258895070,867325864752352,288794598649057,4859511734469859,1581410812595428,6266305777179880,1130399267902702,2341829094317295,3991313591559411,6980440162142282,8093254600006901,7027270610287145,5437378259434744,6812379230665980,4843542293015807,1511647341260032,4433395805525251,5929021597435142,1390060763942151,4188825319290125,7052662829800721,817226930949394,6330657374056376,3106466295639316,1327083227647253,759426851085596,6918009891005725,2063378696529187,7035706173312157,5466667929224487,6425459048453416,5291990706617643,4495283272414509,396188332705070,3131189611068725,3915297042189622,7159436482053432,6074875813973305,5882259960781092,3626882065630525,2315578032670015,8752151660877120,2390303530587019,4431163870455808,7684374358877513,8707569946848579,3080439292640587,7980443908662606,3191747655338552,6229669912472914,4511076801578323,5308317588489557,5468689759743321,5681101800768860,6341947007321658,6418991039231451,8884070021625183,6735824260533600,6437624484621665,639584204010850,784444323290470,8866686478968167,6663285892595049,5617186833497451,2700007042714989,7656516504737134,5290261288625519,7685816512875891,6553334423940470,5526436766060777,7726064202735671,5870745177638266,2249332448009595,1590342434649468,7262905820600213,580013954229632,7928871328540037,4234134602833287,3965404822357385,5359643959346575,8226227258260718,3771415470300566,1802955211870524,1643263248795034,730471309935855,5833761869344156,9152858420493725,8593485432479137,5596099269610916,482322019104165,3218844561257896,581007219797419,5177288005172652,4931939773396207,9033662013607264,9073197042646766,7980901085155230,771753018023350,4810356698187192,5861400817353929,1973349174797755,6898377782521276,2131639464887743,3146169945998785,3719100913845698,1749182728363595,4831351903935940,6167968671480054,2458687598728646,4906023768989128,6439968881397202,6158253462816211,7727533480062425,730916353971675,3022500301743580,7246542097569245,4293559870344670,1296481598350815,7704294203522529,2909588190637539,1801979889626597,5536844269913575,8538234354316563,4372116609187307,3179742140818925,4307309811108776,6377012538005758,7124769729495210,3516110574108058,211491402558975,6450700065687043,1528206397289988,4296012848391685,7142436507404545,7541690442041943,871106803922447,5377415907520017,785078844202514,6225436473832979,2018286927963671,7089115097994776,6807863977848346,8386586915328943,8168496583577409,2917975540004384,8789399724099504,4161756949124642,8676230910391844,3814698485134887,9179791432775208,2904540884794922,6470336347575858,7025736917907579,2435717971572318,1470476927039030,8817741227908663,2549631448696378,7429582682420795,7317992462276156,8328845379020725,1531463681166912,1275544723887684,5259357421796935,3301481146287691,7475965884257890,7507307774420558,702549375979448,2135024193871442,7530285472910898,3797906274635348,2989875803712441,8195923491008091,3679098259037,2746241547236958,434341861801569,4569193679881826,2016223391649379,2985083044195942,5689822085486183,130146161344413,7683348111274128,4697436388800108,7703705549797650,5409319201902190,5849631652814440,1564291320209011,3739071423510133,758608613508726,3990635523898999,6117154487748217,8400517035942847,2481520778694269,6408892478109313,4075989760196228,6737268644519559,3028711149962890,5085544585536109,8031063369494892,7828771200601745,2067057252621934,5938903825295000,7559081540344772,212973767237274,8295806380805571,5703853875531424,6483270171489953,965837715046052,2487278808977061,2049331938565799,2769620155098792,657300336948906,329672602939051,5861832092657324,4901274402856621,422653531303617,4758049670293167,454042211540659,8775105031448247,7710636371703083,4558588275035835,8194142501035710,199053546198721,6044341444230851,4787772760682181,2440963757365248,3779405195671239,7102023622037193,4341884046200525,153246250720974,5191960020616911,2880505893871312,4224212688080593,6384913100239258,2611825057158870,1596360393354967,5278338604459737,3688182868942554,667669807888335,9089832477699806,4695022437203681,3882734809726691,5412709872219876,897790931230440,8941450335634727,1089427492734701,3707827159729902,1227862082111215,6507041942275826,2363636918798067,2899485093375732,3843515414746870,9080025205764393,5810701582837496,7144281537857273,7484138543451898,8790755487323902,4993223603742464,7740994719303425,3342862424543531,6454492550166279,6980054238588681,2988864337424139,4945913211133708,2076526801225487,1188718649102097,2920172377085716,1160654288605486,2457305214013513,3314619614385831,2280355016927000,1804387357869852,7802648835755805,8050667323037716,4305449591422751,4100419274336038,1236134004594474,2987901778003755,4343045281548078,5430974317879088,3176479585667720,2091461415075639,3624490285158708,5960569392262144,2053186258880319,949997259067313,3779570923228994,1213944974782275,8870024299294006,8551716955132814,7887515008525281,5546104494522184,8865643789382284,4926701038485324,8351470623304333,1426202861131600,8049812270253765,8119138376046420,7697767310013659,5293861009389400,1187585043312474,5434474354726543,7050395011145424,4680604996394298,8263522146635614,8780985291182395,3466513274747985,1867486059485033,4767071352758122,5409030955843435,4037946631776108,4273421187985261,825359930435438,7526088942533949,5184617914263410,4469670454321014,3338390997604217,507495949851967,8211325089847475,5609340326670208,7009997149890434,9095289234896771,2220570717015943,4077113486456712,4024328782536586,8895281051377548,1149738970937230,237394018906001,4009316180936595,7832402055387028,6012693362826996,8027664217875097,1928097060495261,1301916583124894,7719669901842335,5655125656235938,7938274404306246,7301610665942318,1266570389397831,4451507127149061,3423601439772589,3339964619800494,1291488323966896,5292712412841905,1735535069366194,2816575926310835,3228250305972850,6490096362304325,4387061627985847,1388434149457848,2367366034419643,1354323522301884,245781707825085,3241010038880196,6123418257862597,2632426721877958,7482857348341409,447757203126216,1912096161021592,4090181246107596,5580355261736909,5471238162395087,964998258884561,34472672286674,1507194422167508,6292684116156998,5422087790893015,7235154069604314,5943982497388507,9116865575305180,6435784497092573,5879559237484510,5955422135416800,5069282859526115,7797997642334182,379515194406887,1495467844794347,8494163510128296,8414163512267091,4544985844283380,8380471660287685,6658211930028027,714248769921020,8745332415846397,2810708115108884],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a573351886e921b7204064508010fde0",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001454665.1/GCA_001454665.1_WH-SGI-V-07673_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LLUJ01000001.1 Pseudomonas aeruginosa strain WH-SGI-V-07283 WH_SGI_V_07283_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a573351886e921b7204064508010fde0\",\"mins\":[1825648980148224,2242875306508290,3447194786553859,1341059202809862,7582159238971401,1388219897577482,4732336694689724,5982935351779340,3778695907909648,8686731819999249,8049255821115410,5980588002934803,5675642116325398,7944286668154201,4707508246839320,5732729845055513,3981791856091165,5982357417443359,692050547335200,84156193210401,295956355178535,5568173203071019,8459366495428652,1689531554306738,4738128340140078,5043199974801456,581138295488562,6346294272499763,4966074889592889,4219260317818890,3125038653521982,3466706848956479,6117705741090880,1800995096297133,8609705022554178,7730391996751883,7031111501029445,1708900610834503,335152522969161,5858417270046794,8421648900948044,152461611925582,638821583888464,5461362154872917,445764562059351,4195156250796124,7507244859457631,1292057396764768,8335225580183568,3582094885978213,7240419952304231,2307444293675708,2716528174121066,7826302066413586,7521089406042225,2255912029675639,45087661849980,3791536118069951,9104988338360081,637725561069693,7742343059169408,8277965979620894,4960453765070986,4162116280017037,870684408455310,4887172988952600,325785438532974,8708081261904024,1584430685126815,3379363041263776,238480830128289,2058418906267813,2696321150820522,4778283574558749,3684154799415472,3533207282499762,793546095583412,5699396538958006,1557627327430839,1018944325664952,7133990131736607,6549768251449532,9157911550763197,4944011556847806,6255227318501568,980761336053954,2249355887780035,3005449996525765,1583177986564294,1812578367029448,2706305621852365,3726539573731535,8592053240834767,1989705972433119,8499485706003835,7668949807530216,2421320073052199,4141142043164909,1815666573754608,7890493133652209,6169169452876019,9008729635651828,4817048900788473,273394857230592,4197209708118273,5960914941210667,4703323368497415,3816397072728328,2070647225172235,8437883122042938,7144646073172244,2609918354374935,2912507500052763,8488090624377116,2670236492824866,3303930568220969,2472365506855210,3614588092325938,3152437228470581,1061908461019446,1875635783140745,4244436983365949,3273080538792254,4042003609350909,446373638218052,9221304002658630,6821676494987591,1243312057983305,4763323462443339,8954129491252621,2045226299531604,3214521610428758,175705287735531,8311487957256932,660734179279196,677601310220638,1108104819720544,1664197454422370,5961609067417829,895332462715239,1756132578550122,1670328593785195,8029926179529068,5513447266443629,5461770361495613,60697040355700,6429091812335990,160472692851064,2255302134784379,1499824902218108,2562626205368701,5546508894552446,5601666975752575,1260870695289216,1291109736677761,2681265936982403,4518854675259782,669196826050952,684811601150346,1344503039197579,8544205955588495,3057315154464555,7033561292669331,7455209331966364,4699202875449757,8290675593977925,936465531656944,8584579235545507,8022862563762600,4912142653904284,1263841826972074,5423624015847852,1042037367579056,187812751753649,6810430454456754,2770227102540211,3419500886114745,1011452024398266,967880405524924,412115780428223,741503232065987,8732447265956292,1165508153221585,8222745740976596,7575014179217486,6271058919211478,7786509248774615,5561251237883983,4507216513810512,5722025083314659,3592596865573348,8548282705428965,6785217819460074,4762846919614958,7153662514618864,3201737096978930,2591560484700659,3582402698928628,7656410334724603,3669292656198140,8630948905796096,8658661156569602,8081252838261253,4422624507086252,1742951819289098,1055038933795339,1313275117666829,1409409868022287,684259923157520,5527908679827988,7144088622694933,1689000284627479,2347247535882776,6489958089155098,2545219659432479,3505901892838832,4079759344656937,4125272178450986,3340311816249901,979316247904814,4431559944143407,4940929685347080,8380863114215986,5066124605845598,2031245685187127,8765338575127096,2532448444138043,2383741723320895,3122300085715040,6652297482707522,166104364425797,295791539233352,7485107797131850,8656137116787278,1110625200251471,1173881909363280,2371553995122714,6428685828858451,9211670786155092,5477662529561174,3766864980930925,18650490225240,7771890646567695,779206551806557,3791776890495584,4639199783723617,8763561430065762,7859221225472616,1835195592734140,494722871911019,8827927388189822,5748590688305777,1546013737648755,2518876397838965,1850824917049976,7197273160254074,3398157430465147,6809477167454359,6888619620098154,6233948556477054,8976826211549824,2072490620191366,1245688498922120,7851871946654345,3441651795223181,1070773832499856,803979742315155,1452317551172377,8055547679040153,4675223172006555,9071399904084636,7903058862858912,97742894170789,6205178344112806,2408780095890088,459826256618153,7347330484360647,3675052909601452,8947814064643377,5481840160105135,1382596604527281,1498810562708148,6334818111521461,8599969595753151,7092940405277376,4739668043684640,3930112922092226,5474232144462531,1357990135349957,255429886452426,6152567895965815,375527135126221,796598326371022,4527987959924173,8963481492415185,912196485087958,662145299776227,780184025277156,8571630030652134,2575989633671911,747384259199725,8861447239076648,7391481408758514,5802979297067763,4271363780494076,7206582549963518,3094186713720277,8173383272888484,4858546652291847,3527115957142280,4936667947248428,4550074267034379,2058933928002319,1057055539970833,7298880171459346,4803242005742359,4834371862135576,4416569064219417,6444509444621082,7787115972548058,4910698101916446,3329133899096868,9038017041056538,8005958356037767,7100988808913709,5868237455156016,6107546038420281,4386992351027287,668151234372415,2562981368390469,1728242116690764,7978385459716941,7277980287492943,4722530526757714,565641661539155,8505675617869966,2175024872489815,8051407155626840,8431453100170619,1627950342046563,8555776733799268,2397511039353702,2558966239372135,4520738976785257,9162314986654525,2497662947451760,4726962273513619,1310651690853238,4855395494167417,4865489732944763,8160713070789505,4975264603603843,4706231506609028,2416785594082181,424865371882377,8425321307898765,4902400085628397,5454332038628242,369278442652563,4483056433374100,8447156999594904,1713878559507353,7762833435894682,4020733195359727,1150357960303522,196692764074915,2912577443267493,2405905957553065,1006820556661676,2182839033127856,452154814997427,2746080421856180,5988720293077943,1771565044431325,3771732787004347,851979204879292,3640304752255933,7106930217206719,6355761970881473,275891709483851,3372524130689989,4636756327847415,7726038795543500,1221882098082768,1393545461367763,5210470135753550,8219493761835991,8226822531343325,7904734603608229,1240475997881315,2942203506828262,2892527411684327,7659335830537193,4964302171038706,4803958938412022,2523428823283833,8753508465875796,1343289626018811,5604484083860478,1095224713602048,3728695897293826,137094921896964,8068571590915348,2297781950489607,6475758706951683,7694260815936108,8284387566944018,568107180753947,6774570101130269,97830294271493,1198298415883296,7397828813292577,8879277032825890,5089618229601315,295363022152741,2822415313503274,52691376849965,3236466793465352,479269639119927,848996882613305,1045151965733946,1067297977387871,7499978048767041,7285794211619906,7241782625280182,6162704597255239,7026702528144458,7707879475684427,3602770647516237,6192298839852110,2312176910410834,5229044830635092,2065664674612309,1357516633498711,8640445684171865,2671896395826269,1439362296251487,9176175920637024,5972890795385953,6591565996401762,6202964187333732,1303341412361318,7367269211292777,561634983887981,6233314059936878,3586524801729648,4296046998772584,534876373786244,7347975970194549,5754684039709814,6916493166765181,584165697037438,7764787273647238,5123883283244167,1499613532013707,6105164528641165,4093065884290183,5049932552209553,1856793424725138,2506734241229678,4783385754461334,8542488013809590,5483704810710171,2427900247336093,6108144547914910,8146224151864859,4616870265250980,6818766237312166,1672118996296872,6757791400125610,2906221614720173,377366102066351,1380192880247986,4287711848715806,2250868865386926,281717282219193,611289534973115,1555101159187646,425506933679295,2252213141161152,5237768288347332,4502487478387909,3190067888481480,7874821023696073,3780360283034523,4687879412663504,7130746195344248,1075654807038903,2726414915716311,540132752123096,2379170032706777,5598935149277391,3541790429054172,1461378370053342,1236882747278560,4237550679844065,1076753588569314,4446785560044774,7582718790378728,4224259418064105,7314267375121959,2171065290892526,2186931886916847,7461148134581491,3867810136433915,8344571198170368,7871837166492545,1165756976375048,6649130563495180,2388340610860307,5599194888733972,2379218459714839,4032146489099546,4806371108771375,4329813166368028,5703273892824350,985741521495329,3944579652011298,489535446779175,1781011146639504,5453957234550062,3460976505113480,44798075708723,8587841127933492,6821741102671163,2248360630297916,461758241523253,326957079651651,7045938497135941,5156804979393866,8908436001956990,550306757379405,6842275916080462,5173340632073552,5886616868988241,3098247804904786,7189318104215779,3583905369400660,3617571094308181,8018060629280086,2741602193343832,5758133692728665,8351287750159168,3607050580927838,7365006836909407,8258492481304124,8462859108476267,2576693414520173,8028617050484991,6913013882692978,863520313361783,7655004521366906,8203583702123899,5011844600530302,7095818567252885,841803076756865,4852983115949442,8202085754650859,7876417608620950,4328772067853705,8236459778606478,2708640822486422,5103223662093719,6100446366045764,7259190551335552,616444676326813,719525577844126,1420571704051106,5346650473077660,5220581478303147,6258660517414316,8724388857300397,5677648697951664,2993279566579121,6410729804030195,3885092685710773,3392507246880184,8907805890160063,4618267451753920,3045503677818307,4756911305221122,515490452235718,4805280468075978,6514884485883339,3613324903425485,3346183337653837,1014506952533457,2100305623296931,1994114190378453,4000298493527513,8988419710813775,1586121131533788,8365162718586333,3224711245555172,1157587158820326,6236129712951548,7624875898652140,299186729281009,1984304708961779,8115127571015159,5359854401816057,465868061730298,2972787178819839,6819173355719594,2758835805439486,5477788394890752,2517769504243968,5992087869965826,15525478368771,51016350684973,2313691588306438,599781281441287,5021111797204488,8448172757419531,9094567406200333,7305695843796497,2527016952889603,7958111668404248,1019537707017754,1124448443680283,3290840134968862,3089597554312737,5737276429919778,6820033037988102,2405644078885809,820608301409832,1840547580921385,554936117732907,2850212615767599,9113338924260275,2198586172835380,2631163758667317,114136507699465,2170213631747651,2247101242885703,4861392948872779,2102799013586511,182784770893411,2070489576613461,2689332395484762,2881736088471136,3702616186660450,7033941757552227,4783730030495332,6064080526149223,8508319114782313,5541831766959722,8086635968565522,3497634148075119,1774237891929712,7432622362109553,4788408733140595,1476059969524956,8952644861691509,2234113937041016,6647491770992249,8943792793609851,4800871462971009,7813282681824900,2079261225952903,4769822210795148,1318207372396173,787338698073742,5014523760428688,6297285050697367,724862280043460,1278257708332655,3946040774084254,803113948096159,7625548745524896,2306154960848545,4983168834995874,6342976057157285,3321355409213094,7063536414942887,205725871552114,8797318172541360,7767473861999282,6126874319210168,5905108066617017,9072019487082170,6751298672944827,4019307431610044,4274805424359101,7788634028836547,1337759803500228,6290108149286601,5475908167173835,4596526577706700,5980796575762125,8543582070643285,2419547738924752,594823696238295,7020766647428824,1184894243407577,6537163609048795,6869623704028892,8383363650604377,4021799015925474,922312794785507,6392749796779749,2722998909216487,1473957826864872,2837351521044201,4970145318635,3368000499795692,2751017551357677,3368273701783278,8704774922290928,3890723008620273,4134107242694386,2012059341659091,618191707096828,3165758903802608,3285935885068030,5585745852524287,2208621494896385,8089671349626630,313074296235783,33621298964234,5454830021462999,4828190329628428,5460748222734637,5790142845814544,2093949930981140,1842353789347611,3586084679919389,1220494130448158,4810713872926495,837922871396129,6980079451342628,5888136499799848,7778407891983324,1736117878392618,3117093582931755,569591621519149,7285181530105648,896978631976758,4805805604136759,262495373182779,3109891331696445,7297211047348030,5607340096512309,181558880544577,7410029920888648,2893217903241033,4150657603487563,6386557308880721,6587429219903316,8429096798948343,4934717584582490,5736193498446673,6737110387525471,9011529193854336,5531333799421795,6219928217028455,8769275338202338,9079721360553981,5224375892211346,4487329759430510,4254702633109363,3173107166586740,2461244400322421,1077036016191351,4454610777040760,3343207744169849,4022862580508538,3363955026716539,8015680413828992,5807501497116549,5475342956578697,4363231059347338,3740248674461582,5172933099554706,1521076426486083,1812907740186517,5887709529473348,308372247029659,2850944440788892,2325616806840221,8658920927414174,783414740739999,9200383070750627,5423129093384101,5649617802102698,6155644697391431,1152444526192557,2763403050747823,5125407045273520,4272702843766706,8112498429093811,6892407813326774,1166479755823036,8746004958275520,865452593530817,3722014854604739,2658598260238279,41333394622409,1590555504782327,6960093542664140,5500566343690189,5448299522189263,318650437093330,6108373419575251,3131398938249175,3275626527811544,4712285744834526,2821670005893089,5089280359606242,4743579364730534,2994351751628774,5552449934143747,7508443371620331,7438124135466995,9091435389962229,5078534890121206,6500316467595261,2349839281620997,3173080713930762,7458892672755725,2891079468296215,6728906497592324,3301769272248346,3595837121005595,9007289404647453,7265080475854879,2751296428270685,5884645834057774,4888260514056243,5404584320524638,2855265152796726,319127354870793,7214073671026745,7870622540499002,2856548743096379,6098654719412285,7200229207328833,641730380228678,53936673597513,3087724489189453,1600355723855952,7970546297545059,7621008374204500,2019177321875545,2674328770767887,3244833651689564,4686975239743581,9153427054504035,888561828816997,199968667043942,9189511668648039,7427145146754748,4478591463319662,411594520061629,5752221728540785,9016349220997236,3525835040950389,5178187033454712,6723845004806268,3133642685088106,8102068834300492,5911676104321154,196815346198659,5983608124344456,2228054000846985,7464605997478253,1373067244423312,4613993023566549,3104698387237011,1175723634755734,8240613583906967,7919298333081980,8072554134786509,9060092651235485,35089719486622,1723434365995168,853578965772449,1872495504509092,8529352084785318,5742643424835745,6156340972996778,8733548440914091,1715626690488498,6499428004432051,2843850216179893,6404191643953339,1346448736897216,539480698783937,8794511835336297,8969482135881420,5451979860250999,8159799601676619,6254678103451861,3902120906975447,4326945128515804,5155061539268831,5891100560287971,603948534466789,3753621400232316,7360800777324780,4739006935013074,5555943460791209,391097988155636,3693483339843831,4356166577023224,3699757106998314,8142652402125055,5097957971577090,5869103121967364,2887969760495878,436429363188097,7201152917760264,802543633115405,6297916734630162,3283744411052313,1519405139683612,3799121863026974,524476104796448,7702838433321350,5809432070096604,5998617988208349,4609022224140593,9105273355512114,2616834941643059,4281306124249398,6698278816715145,5106382710319420,6168311180992906,1365693793331519,2040120949279041,3678298718921099,5088299399486518,5385979792198118,2793704712472907,1666104380524876,4061393831724770,6677346882333007,6833314453408085,2397864324073814,4602065231694169,984855164070235,8673166372890972,1972755556796765,7812328905959775,3578396665489761,1652401780672866,114817155606886,6579767000525159,2381433421384764,6101328722905451,7440847892343153,2937281108142454,9096416529156476,3314768617449853,9119004498856151,4215510340323712,6697155123243393,6345904988916104,1448399338419948,3532439747684077,5898421709695376,3185726886996369,488697425054100,1478166905317782,6006227927542169,3083528067344795,6224738621876636,7544580027517342,1231637158014021,8770826167478000,539952343468450,7989783117719971,8842809886747275,4431689851079078,4293736972241320,1801439101094315,2846960564054445,2264752289663406,8889462754091421,266449205995954,1232323570092470,5984483539642810,8270185897472415,8315830390204866,978055887899075,8159931678136054,2500879502223815,7424077867854281,777687277709771,1134423114090957,8160589781453264,5120746422626769,8331886295861714,5766181539637720,2283918477339101,1261277460408799,2281956094962146,4685332054459083,1661050131187452,7116985279072750,780168235059699,8892220545206776,1979006445586939,6470178355954090,5132272502114814,8336517337188863,5783989333666304,6256456632306182,6828487550673324,7120967904086538,8135120210487819,4945148031199756,6369212296858125,2157357314894350,5389198081804817,7589989133478418,6672346005326355,817574416175042,8557618338096119,2954977448741400,118718608222747,9020655146289693,756443186498079,6522695089048097,2977004590246436,7567076589840939,2354652597291565,7224176958401070,4145901585826227,6863104705759796,1083889784015413,4574704530197047,8126706047366183,736055114139402,9176986242796095,6577074562959937,8564974581320261,8737395895913034,4826579481055671,5702169650514510,8094847934909011,1204674483915349,7232932768180823,4094512231549529,8636760876156687,1031236674447966,2692781524683359,1898224980592400,8239368394197603,5979024870197863,9211922073196313,4176047723285099,7582064256821869,5655543627745905,5769351602449010,1565623565167219,659607136422517,8602209781557878,7572348244593271,2180432999737977,7335204336480703,1453348653959805,9001694132300690,2153924495526528,5689495219260033,2615730021973099,2066836231891588,5156662950595205,18006726052487,7264447337949834,707439295474315,5361676288363149,1803955474402413,6411639381142161,2745322521021076,7814562810042137,4778496127945372,699698288979056,1303302276038559,4105087639423655,67389009652394,1517071387311218,2919508513262260,2750250105686712,1225930908961468,5507272146864831,2912828541414080,2556350734830274,2075011526781635,4429238852831942,8126771347074167,4029887105215182,2892471568337615,6114111943822032,5350801021889233,8187357186075347,710654020676308,1244885723851478,4408786207099607,5265285478705884,7846601795435642,2328576667773663,6221226918578913,6406696758735695,2663829005200100,7961094013569767,1044192497437416,7830327839566570,3653613554739948,112368647826158,6806919729261298,435898573867763,2999286599068404,151737939938037,2285590115420922,3749192565861115,1128106062924542,7436926980182485,2625884585855747,9205050683091716,3446583399611521,963050109979400,4743316343802638,3627837969165071,5544817702759189,8812528430172950,988818070457114,4297324755669466,5252515229780771,6957807903329060,8599674920528678,4644774444378919,560817418275624,7450886187911977,695162161335083,5428228989479724,7191370303900462,9083406286187656,1695072076565302,5028680683842359,4991756612938552,8671050538216250,7923759156993162,3146126560873279,162427548700252,1049972089604936,5330521388215113,5563422622870350,8116665603236030,5125686702713683,217214059528851,4010250590456664,6777422741973849,7506426148719455,8600915875699856,8039093544240955,3801042868964196,3788988590705511,3374655543282536,5246471288769385,4780940703959918,1634433417505649,8315470742006642,3159370071968628,887156973620089,8793555998919546,6546728858815356,7823267583961981,8338932879502209,2590336095996805,5581526532295560,217390749920137,6128676050758542,5576687663243030,3932656345672599,1546673484819358,4036946366434207,5963969682074531,5180875672062886,5329215910679025,8478640488106920,8058689523682217,406522074475434,1010718843194284,378536936065966,3589279209450415,4822493318294449,8161006826539958,1854279896532809,4612788061121467,4977744855559103,1936533606108099,1879679962188740,8210764938068358,4646791886080968,1438882400611275,305938853186509,8209293391382957,6950498410302418,7128068817570775,6893164680244190,6553732895329247,2853849870596531,6429097827473232,8707277495479267,8388880001616873,6527149131783336,7967087249787457,3316045318708393,714696875092985,5410295012404218,7059821247556605,1798771770829823,7487516166925314,7577324317666308,1207465805941768,4119613679094793,8578710629862410,6416540561288205,7227531949566991,8410664087156568,2028098386766869,2316934598970391,2117490349106150,3047276721097760,9122722033974448,1700220898585634,5533524569566246,1950936647846954,1992537076059183,5061708529871924,1296781295373365,6368616022174775,7175015413124153,5656401498323446,2906577167516170,5753777481321535,6820525364792384,1207909707589146,5159762360847428,6135578419080261,8690785845668940,1215095148530766,8575329922785805,4722197057670226,4087605061527395,1936160448474196,8791861973625941,7329922593246296,446566574517337,5088452242058330,4697071465718287,2081749098843229,7899263149480785,8990242450738272,5698061732973671,5578715377257581,5788628803857518,8505374158367855,5197810517093488,5022530125507698,5612461840632947,7997893525048436,4131760287370359,2184443154514452,7737440598223995,2702558898637948,435990103420029,2413875722693762,5140552771663723,4737828313689221,5036453460610183,3957169066929288,5463931799923824,7257781297122443,6661714455227535,8687411883152,6655880321102360,8705990428978322,9161937510673603,2758188969471128,1160645203283097,6761245306186906,3747220216828604,3321515718479013,1457342984817832,3566015369874601,8342006818983082,2255312465870790,601778922417328,5965017188641969,1648777718167411,1611301293943992,5129390140968121,5740353840639164,1302893187476670,6420423175363,489389557583046,169929898618057,7943192566671223,4553204929408204,7794945101786326,5473690401900409,4970287216043892,1939055425690831,8282243386028582,7684531384986855,2074698571968217,5928711245499636,7200246185449342,1697198717316342,733872285256955,2319379833154812,5616731539000573,2588932240321790,3081766856625408,61345496411396,8653046912466134,1508180705316102,8682542425096661,1862766663396620,1425351357395980,2704923698998543,8928553565695251,7944567090719912,1827619080965405,4480909678719536,7048771574172962,4801516296298891,4004152941858089,7886242219052335,7667667381808432,8961643496680753,5380703477624125,7328401544817984,2762998051179842,1166116063472963,7917294711909702,151593106877767,4042741367369032,6742016668691789,8701543681729717,6900688943328593,7517101473074516,57620679511382,5096233580201584,6636015295698832,6732062626955835,4638089525128550,151891348499815,6192386072472938,8020274697443218,4730149758709107,7911126965267829,925190240390520,52004509797753,1079323976953211,373776110095740,4027658756754813,4013875219048341,3093665205916224,9077089597611243,4278121920400773,5245465548737931,3200666656050572,2371088507039127,118135917776285,8819319823216030,5057030311636383,4163031481413024,742342309391783,8049632463318444,1448309353581997,6534301676137907,7201003828874678,2316716568489406,6005098722512117,4553666074635712,7629100961525186,1356546260184516,5755891285577159,6435007587823049,1275034078334411,4179609112882637,7953562272353744,6962299487866321,328760410041811,7846634450296188,4380801864756698,2518107083484635,9020777040612828,2464117636471032,6254038641380836,6771056816057830,7272169192811772,8345527749463530,4278164994518507,5891314905189869,4146748557954543,6884783518445042,7158061112594524,4652924773404152,2271145205837305,3021901970763258,3323770660404327,2980715216801276,5904434399333885,8568705156591102,782518070691755,1607617037331972,3983964013112837,7290289553913772,2197538559618575,632558900629008,5694750530039313,5391571267964435,5385461289717270,4395044209683992,3486087824059929,7155402469681071,8113142029897244,1177593273306653,1727313656401442,851282137296134,4572495293156905,7989367233170986,5140199783353900,6621472811609646,6699500642233903,1434401432522288,5340511912308277,1728828599360777,190633263795768,7030398874484107,6117081943518783,8879105380704864,5207517876817474,7011047562128963,556331050962500,5434322014776901,3381912499285575,2441252594272222,1843996232181547,4432747689078348,3969593438833237,2057230410112269,5716729112637010,6116249124925012,3247469456928014,179181561491032,6663420796587610,4069003748208220,8528545370009182,907737595383395,106503742377576,1947406614998633,3682495649435246,5160564710534767,8347804465671792,2463880522681969,6208735047716470,4960997388616297,3336697764644588,216286392438400,3858523072042944,8450254135485894,5365076799876740,2369980185345302,8378411452960390,6474460311996353,2054303716937354,2729643884908174,5219674136235665,8606917709852306,7974116936837059,8637907380588180,3400814664781463,3090774650752669,7886242552950430,7578527490739881,8603258316205738,8015273422425771,7605906963107501,622174198435502,1321121479749296,2004943534993075,7652174364257977,1272770145767098,5571522633142901,4157172862848704,5317836490182337,3092086064139974,4603127167127241,7541948980735690,5590645865105357,5324624245051092,5444889425637080,5705694990429913,8218656600500175,4722889428430558,7693991133605599,6132293388029664,7325932532474491,7725351762521830,8880724775973626,21968976672722,1778988980413053,8305631710842609,2313697478700789,6191231385915129,5831636441568897,7131106419683071,6262209182003840,8494662009502218,8217087918224839,5366431696277255,4982370437558026,3234436432523020,1558330804023054,7187341170446095,425349261707224,5414326221786899,4512696732741396,4950232146743064,581408262926105,7584549143588638,8907737953907333,8784802231299873,9222808198942498,7276515108714459,2188984623821446,9073963403808550,6312323284835633,8383336530579240,7911568464435164,5573932355162759,8594514105847598,1714579623686792,3343660257816371,635793318170421,2072341918576438,5656312255311672,7462476398792505,6259189833297723,4472023932523146,7466736909373249,4569093177468897,8386398003294030,881199321318029,1779658447523665,1690277905313619,1369923080220501,7977809493512022,4058778017001305,111766749073242,5240905884829669,5114979985253008,6010714277683041,6127610294972264,3504553802749790,7772538120187477,3426861304720701,1664484899868529,5010616462820329,6196336338648382,1709760422194671,8788532173565818,7000240716418942,2706672107966337,2783158206001026,3697084112760709,5792515412537222,670940097408907,6179823348264844,8888819299486406,5202867498199912,7193130321235860,7156754966998933,7327286056342169,6211690711682970,7299330788028320,602891187105698,4079996818878375,8489351888654250,7221465985167275,5016887254085553,2806633579294643,2538762790612916,4730422732025781,4746641993658294,7936254010701812,8091840416174010,3895494717771707,5808538120738805,4792545103426208,5289678283534274,3679423824269251,6431873135366084,130551540469701,3217570951458758,5652439913951180,4251285496393680,8894493442322393,3604960841609178,2611208979402718,7780873358992037,6835955587687078,5460798167821649,8749577454161897,2092715525878439,3177072032018414,6396378417760253,4989572830220272,8445607867081384,1654471997321202,5637374941384691,5242125263775801,5767587820031316,7564353436913658,1175614536364028,2330032313757697,8879253277934251,8057111407848965,3874101255390497,5870013472436242,3454533486653461,1476777048002582,6249730969587735,2829993310072856,7670499108433945,1448572499092143,4747129986822173,8088876982194208,1670455141014875,6152396138696740,3795454357549093,8680238313615398,3834091080347687,8542993757104272,4699994375114795,3689767912099884,7404073544577069,7867208817602608,5095730381754418,5207957664542771,6298057326555192,453339510396463,240378678661180,4186625426264126,7564737122063029,530837835812928,2706526091661381,5170283890667590,5482108677345352,615644862107721,1436897274114122,6934328682524747,3067365383720566,6463086518292559,1393063682945105,7769088532975700,2713007844160185,1003061248741465,4693185372565596,2915650493296734,4170492827488352,7621352552976481,7890583908356194,1666567451013219,5018499629150312,3711075883340476,7284605282152557,881119234166895,3882629053894768,1353912562923539,5715280603148413,6826361718435967,7811316467462273,385755144794242,3297374177734788,3614614728519815,1368436294758541,8943246785310862,7719451757957263,4960170755700760,738709509689491,7779832937699353,4286890228863129,2296646198800538,2649356206452891,4611604819038365,2677817976049832,1207038172582057,1877858555965610,8690854046429356,8110688086216051,4749396075434168,2937460315951290,4951189731209406,8650985567939957,2454056366657728,2989922693615810,7317984045093059,8865811775910084,7392429668765893,8014605329535174,183798263435463,8273237824786632,3445529875042506,4390731846013131,4400431963762892,2596775812072141,1396200475898066,3913805392331470,545195466281176,4412952006709465,1833585153896668,100173299888351,3074563508310240,3425022835020003,1692953438408933,351427702869372,3439414049706220,204116002500848,5457553560359153,3656787473281271,7312455714574584,2023772700946684,7976895063855358,969062890205439,7931840182984064,264685101125891,7954195652194564,2064365552636166,378021337624841,5782009917042954,7743140872147671,8496855180661005,7714022309187854,1338100456403215,2906536239501584,256094935462162,8399499254149396,7243277173035285,4030374274461974,5388630965178659,1513115051294087,945391500344587,363908824289594,7727052479451453,2635397832888640,641892985680193,792948880003394,23974554022211,463602080796997,6730479648379207,8100304772804936,37511667970378,2961803009560909,7051066290251833,5831062157242712,8772322114392411,2698852554125661,3833538080051551,8335617363939681,480637148680548,958125524136297,3113988679364970,2565719368528237,5206556218700144,6066244133261682,2985628197654899,3084173933236599,1176751949533560,1256464864281509,8264538289993791,9178557679845883,3069894601568641,1728377831895428,8940367238967685,4413530488721798,1210453051101577,423184458341497,113161445659022,8633168137712015,1272428950434193,362447947829651,5489170709000597,2534949387596182,3558887677972887,4182234371895706,7164188539867548,6236960171594143,8796418218881441,6876482750198182,352166042759592,8987545906774371,458521285259693,8074654652795486,5002432741142963,5439825521023049,410019515887007,728163354702268,2563535924613565,7118260818276799,3383967935132096,5795733695762881,6067240845431243,9197223091673881,2327773525160397,2122214986248654,2181552663400911,4573872640094673,7915676621197780,5315695730168277,949948121756120,2639049635336666,2717534466306523,8766175792026077,1415250829210083,3710033554911726,2179769924948463,668772240527857,8288948733948406,1211675839723641,2072095094310152,1942080122982905,8444639912972794,2892441974632959,1254187522881623,3207210189451788,1252176142168589,8385797332374032,2142968976683537,7940921608213014,89363552776728,8731592709094504,2508118302601754,678653601337883,3614574299025949,766307356291617,5845630400205350,633847595115271,788055899476525,6442849273819695,1183809730761264,6772116749300276,1504600635322933,5822233527267900,2803812283683392,915552841029728,3573939076493890,6361378611786308,8375280165621174,5418563764253254,4659704309756487,3385816656648205,4471370872517197,5798774951064142,746494579642962,7128521600340563,7922572271713721,6643638639669848,8586717693588058,8575867282158351,295268117959263,7014324963627617,8557755788602001,7971111733219942,4634440689357418,6690052171403886,6038481224757871,5491915104686707,4835136876687988,4437055990534773,4857718445511292,4711444247728768,5947711580770945,7726611765547653,4523596711916166,3038750758883975,3190633159119496,1986830285951626,7070527924941451,2422765068645006,3772662846419600,6014984180019860,7356584231285398,583227522405016,6139101076402841,4255049407719535,1901925133783709,742688204952224,3021242068488870,274529720292007,1317737167449543,3779587207951024,9111426978722482,1995807631209140,4724289737757365,9134030604399286,6819353932377545,337245653185209,195417497899708,4911666785366718,1366872552999029,2366747200459456,6067991991521986,1510016630305475,5928673843204807,1510340711076552,8368006527658030,3329359835828942,6090657553322705,2038210427040467,3713581515936469,80971341681366,2688255907756153,8573454732398414,8038534826654302,2904610661948881,7580343161158102,3647244896293609,6391907453727474,171948473946867,8693255782494965,2174708789719798,5685731294360314,4866191304258299,1860693630022396,2427458968531709,5689800666067712,1683855464559403,5749573433905928,6875555456201482,813115746677519,1775508494668566,5371475245814560,3252261137208099,1224349940306725,5410944516117288,5961474889872171,464524958495535,7591286726325043,9089542384227126,7817234234284169,6997020688536381,8490155680813887,3079261890919947,1574700462445381,3180383572063055,1318387961942865,7127976060212055,411773542527832,5565256774553060,933854838305626,5317518164718427,4619928054133596,4716611861223568,2356167025013602,4269383703884645,4864472437937000,148938568840041,7500765262574445,2549196355998575,3564821538337648,8308245892722551,4758500107219830,8716302165824377,2122991481533313,7460891122848643,3278119729612950,2963855933412231,2870566998848393,1026722820151447,1174371731288975,8946332494762385,724621096768401,5837012027331476,7515008683152278,1222795704578970,1866301441414043,6940519235916700,6678838912504734,8151569421677472,3104384780678049,3357979383231394,5653757243872163,6532798071280549,8483877411197863,666363034727337,6868995695522732,948180632419827,2430254335988661,2148714277426103,4735509404406715,7338066350347870,4872590668338109,2304190849764853,1409785158538182,516698370451617,8789193927366750,599098488230861,6800429115487191,2837391147045848,5314656414405593,1551605634749263,3393461148163578,41028542190566,3399181597979626,1167174263837675,2412920939828206,4493522934076404,739001993016310,6901685505594366,8707321143507459,8709574873625600,6583591710929923,2499122163053574,1324249696883721,1691706392720394,5674011977946123,3468250521515020,4857556358970882,4310980028478479,8796698853453329,1340400822193667,521996040048132,4187298409886747,676910235258373,7646098135323680,4471406198658082,7805203269186595,6737395326489637,7558936749118502,990478654567463,3797173733012521,904072387859498,2114788469003311,5948851185267760,6395894039666184,8085877337330483,8389858441173171,6577585086583860,8240243260404792,270480234386490,8758988022330430,1088567884117055,7459065003947075,3784135096022084,4604545701286753,5929992403588170,6571816062686284,7349304861955149,7872394658602509,682584224603662,8577239876663481,2264532903081048,7510748863517786,5714807743575131,8385370769626204,7653148258071651,1951586947052647,4501007753516136,8647175771525568,877371145557098,3809006445474923,21269167019126,3633433064317801,5320275155238420,3805280330478714,7480405960479867,6931531574760573,2689484811981950,4996149085770880,7861111459329155,1131125115155592,3021773740520585,6222321593332874,3194983580628112,6653472801353240,1718894020736153,8713648000791710,8405611246318751,5793829762917232,4877596472431778,3356468254856355,6791410172818602,1763723428238510,5275031943230639,1546057812784306,7552818150773939,3225007396648119,3342257951937722,6701876604376508,6018042295686332,4564205182465218,5371657931863236,9181646262441157,4372108389881030,3069190476387533,4279718182376656,6440832417141974,7490403071694039,3532320322199088,1587903041008860,6608967621399773,6883640480232671,7055037948097761,8977407241151355,1641431782291665,5299797937951979,636104303588589,2078663603475696,8986068174648564,513199995139317,722389546087673,5477674659550458,8534617049773307,7469419719767292,5460781841904894,6139378792740095,5102690039469059,727610916738305,4715050518107394,4653539874280713,4636632942236939,8602903127689359,6751121999623437,9062772253594894,525716408218900,3629041858653742,5133027386086678,7392715277530392,5728269735073052,1609252139234589,7374658377227824,5637136810292514,2209892500487584,4280259090157369,2878861855855918,8715022564742447,1881262431720754,4912131982923061,3677811277362486,6221688874394505,1634346533983544,3450684393370075,530151578431029,7155819201262912,86139204826436,6952130458793938,1652354140509519,6280170469225809,902869266437460,9165493897920057,8495180020356440,3877407798859098,5994072961332571,1612738076243296,6414388357838178,106087554151782,6825405561287569,4036377764509033,1476609122563435,4681520393819502,8524768274570813,5411112898024817,3270109632427379,8813174365263220,5811326081348981,2849502394749844,277909581452666,7018921615201663,3748258934879616,5265241410607339,8032851864892807,4706049834724930,6509939122419086,3829387070125459,3533151424419221,2142932648940950,1024061409678743,1780614298588568,5004983654847897,6583057948726684,3591569770804637,2855542702560670,5060041665820063,6806171925796259,1292949006374308,4041495660737957,761686412121511,2529664394335656,7474892771923374,555453075289519,5292938443281842,5969665358689722,1172337911641532,4950699253347773,4514789601670591,6553373535540672,1765926488937923,4677735204722117,1000441112196550,4015277670782407,8661997840381384,8035138601997769,1961539657856461,7060244900681976,5939244600423890,3119058306717139,5584028709279188,3573082752931286,9217827918493144,3539196398024154,2025829383757391,3548726672119261,2079128375460773,2567740498747067,5532416862639586,1014637947139555,7522481071470053,7607446921123302,225502558852589,398592550016495,8487995272099312,3330981070779891,1448744561309175,2093635845862904,1639424433878522,3827636663145983,3158893303993859,4327361276278277,5281362864018951,6998819710776843,1935937738118668,820811793847821,6877561486210574,2115797313476113,347389977703954,5771125783991832,8287854254901508,1015246938887710,7228685916379397,7883071421359024,6421627371583012,7350343363614247,8068758264837672,4917525670336041,5300590170297898,3265526883685933,698991295403566,3520623494567471,6847753205388848,3124775272994355,7874939131625054,116053770352186,3762361713641592,619539124393532,829497610827326,1303968608351810,4569784064579140,6793984534001222,2110542840505271,276591794247245,3480660441175630,4899363888032013,3441378772907602,5316591900628569,1467667182294620,5180199201887838,3581016076662367,7299698745521760,554406343833186,8197616638596027,8493065883933109,8939967013828198,8417750607165031,7744871944229820,6917025746073198,4598286695572413,947038921528946,8869010765330035,6880074198832758,6173259183517289,2444029224949368,9095085671716473,8542441873810367,6311102901712510,1494796939613825,766410890966658,8935111186413187,6336438172538503,156390326228617,8269894869907735,6038308917478525,5350945539813777,3086009624131218,1856103042569875,1710395123422868,8550260875374190,4249089798723223,309031068456600,5535573549815450,990561487369885,4273681948087968,6904528639096483,3474744923158181,3592782720562854,1143581770716841,4121554230572717,8524664427730608,5020945395824305,7492450045359795,7475130959042232,1856715080963770,8915204900714171,5199947797207328,6855934739011269,3550637156316871,1473679797163723,2507296291018446,5561141410304973,3193165981423122,5665718879147741,7625638938375905,5600351303546597,899856647706345,6482000094467818,277611667797740,1065093179487984,8023065698105074,2034760649980596,4333268518737653,5254998128310006,381782126925559,916544799880954,3980142245132027,8003897259407100,8040494651400838,1766639744134784,3342085229041410,7879241581672195,8760363735652100,1372062086928134,3305005755438856,1740481775417104,371381410305810,2031130103231773,2577459858986773,1256139526783974,2785389606836003,897688885704491,1751405529863981,3444171462284253,8853018425218530,1213777262778164,7313956991751989,8602384548304694,8321327526593511,269339716335422,6592011058943810,6872907206907716,1917988964641078,36978091431750,8994977451018551,4170017246420500,2612408944416592,7738016062076753,195724801185619,4261627976685396,1733515682092886,2166770477266775,4135072310564696,115931207939931,3666300961437533,2670147489609566,6231901462648674,2113005628331875,5471792648623972,6726404808819686,4467382534690663,4432261887842153,1953402490320747,8647400125171432,7416185416275823,1175324309952368,2932660557895539,172577929680756,1441083353678825,1036126761842552,9089202494699385,8660016777910140,2944205150107518,5456754575972225,1849259792996226,3869901380435606,9138009791787533,4804285253302154,989019304073101,9025133862745998,5051008904075151,474234917787536,6476155342476018,8109019027879833,8145751013070748,1572117630384030,2714333422147491,93349196117928,172831603578795,4673799705925548,8146796280502191,1809387807692721,4274478035548082,2254772894955443,9053114485599902,5758073021969903,1083000616163257,108321592588219,4829406891612093,3730380037240768,4170508166477761,3865007557175627,9125047471617988,7633232742347766,7578862218491848,5870144389706685,3846422762936267,8299686161045456,4646438159259602,2500009359792086,2841343626655707,5606965135857628,1438816631936992,8372113748394051,5502429555931107,2991295470401509,7472655622174695,3829704868266125,7703301467822068,1634286765069310,5960888199968759,3808311231920123,3483074122522282,3302693982943236,4656798335105029,5699812906588169,4759366720370699,2505536711492610,5590843352714925,7315122943054851,6394369422669845,203112558057494,5039388902348824,6305656363407385,1630723021111058,7773365200607263,4231811366344736,1974299793315876,5344965087967269,1453576769730908,2801286274279568,7466938019412013,3364297766819888,4020948848859185,5714824561383477,7710265134241847,1452990443059257,7970075667576890,1042628912134204,1983450515421245,3860678662314046,2775027395131455,7606431954434114,2444402035341380,5339333805430853,1449284429748295,8768050825601716,5461132300752969,875390071783096,4673870722803738,567147309234259,7602140694960213,5991381506373719,2630438100711780,9082646038049798,7204382184403983,6162354654361692,6581040739514462,3440181336266848,5218747353962594,947056495040611,2676523746071959,1482570443962470,1591926002030696,7942397700585591,6090318156863608,383493755926649,5004781145391483,6262525369473148,3855545739835517,4076529156028544,369631554713729,5647671372609669,2487953694034911,3088183621261447,5986380963076233,159041396177034,6496371426637966,6068202692933776,3543115820021911,7193168744347800,2564324713568411,7001903060555935,3252701346044065,438376344795298,8947612647415208,1232011017582756,3655490513562055,5937774256568494,4449996023969967,6011541325494448,7330949609306289,4314234431658163,3284857504700598,7315786649655479,4736665120823481,8495522883401914,181538459801793,1758036751268037,466067796048070,7403212474057761,8816160036403403,3193749853216391,3846900629896909,1772431437174993,1957267332544723,6636988783991002,4528166076291292,4944532888099038,5006474184014050,7766447402899684,891061121964262,3413758151817448,4363837921696124,3692119157528811,4466143258450162,2223153728329971,4095516083861748,4392201312631030,2323857485043960,3382301614815481,6815353298360570,8322653668186363,4204686294931709,6108529628141823,6800199703746817,362471156971779,7340610297321733,6691692128442631,8972794542790922,428906270127423,436752725842199,6917330019825944,3298233907869983,1597309003569440,5915800597518627,2488390956874025,6731679700056365,6943160240683312,536415548700981,2141545620842889,7773964079846452,2429524713047853,922595865606460,3349976039741760,8049932800440643,6709413304367430,2777804102195535,6649643212558051,1533766722222422,5800020563107556,5180841908996495,6047644391979356,123754923299898,9020047819669221,1318905205512545,9058498362399074,4074554923678052,8125944217450853,3512761267198314,2015672916410087,6590004680259953,3037518430280050,5192490037025140,2294710360422774,3356610114738552,6310687572244884,7526841335716220,4601238773348735,4225708756892034,422561155792619,1534303502268808,6289963927525769,541640246106507,4060178588653967,4245052337058883,5991575055186324,3336299088492950,3475182182545817,6124131264018841,3488929672001950,2806242989152671,3819189937945000,3286937663920554,7601423879199151,6403765709748657,1383947438365107,8477433306241438,8540562538641849,8005492568124129,7638223988742589,5446484962884035,5643020773127244,1556239279020490,6567294581661856,8349395878105953,6110432158284243,868627370564054,6221339532160761,2828486624025053,6459199892666846,927368861243876,5231378410461669,7242684420954598,8761228085352937,3811003890620908,1509859104340461,4263134747621873,8385429490044670,4222441398630902,880995652057592,5330822696040954,6154953465507583,2833792508058112,5849993811016195,749038659456769,5194920572557832,7318501668452873,3586376976013834,5713773625712386,1737703868520975,2971526189316624,5332705536326163,1197968207317422,1563714468452886,6870302245861914,6757822078858331,2415988235909669,8678470283917862,5015057831983659,1657801111173677,7690180909136430,1426691481541167,2600621835639219,989728012098105,8481059574146143,2844395321899583,4257184884914755,2018623980083780,3377470659058246,8419916276338444,6219539284375761,3055332216765003,6966104292500578,2663901212949072,3233512714762833,6508220482157139,5427495176403541,8580642765896278,533677204421209,5608680039198479,6195041307015772,6558531295734202,1401132339837534,4010805651536481,8768976982809033,4338837028878947,5461954127084134,1029252999982865,5872175595092586,4825368146917996,6839761041450728,8831711296983977,6963410295265912,7644812712550164,4187399219739259,5396837173721724,4438194028059265,838329178643076,4283270894239510,498610935274123,347918729575053,3394547549403790,6307774400608911,2486424702343824,7445094226131601,2045141888064148,3913133214349973,3190349884922520,8440319856573084,3221229644372637,7749971929365156,4107676089771121,3906696774843048,9041829001460393,6757304991111851,8339764044176045,2575561063725742,5139229371437188,2824435720624818,5653747224885940,3910553736493750,8135775124666742,2001519638567610,3440675240458939,4692182750034620,3140296388819646,2769740513887349,8647656031156932,9168838358586486,3436184868027080,2729880875612877,4423690165025492,6204378502519296,3692961781922519,9217767518894808,5529514922590570,1085453122214631,7581171637811944,5009228542302953,6371670645422826,1537782399485053,159425618164464,4715146946755313,2105460311082110,6002799212919545,3146441286507264,7336948876660523,1486616169495300,1881448296332037,1703316202928902,6534920572500743,1671914716175112,5081081460439818,1266043127569163,8846177327250193,4546582426376979,500505865493271,6120686759213849,1320322476587802,3380381212171037,4940910579809056,680866426092323,3040119726185252,3182797387086632,6650900960336687,695232742906673,1111428498773129,5923493847292728,64938819709407,7459494959146394,3646196150901567,8206648465562438,1615740800015175,1712214443219787,4252783705094988,5812989910399821,2968717010852686,1302589489675087,4068119528689464,327164716342100,4368364244704087,7785954381169807,7793676583582556,3360448598629214,3626989927528933,3143018973526884,1530964743899622,1937981608999784,7090069395929961,4089118207253358,4635245869857647,7749942396750534,5555892276304760,7375558944521082,6640332989586300,1491568405150593,194454585662341,8584516909587335,39732878367626,2087189827140499,5724597873687445,5757456196066198,4359505058323496,5922369154341784,159294186232730,7381793617279900,6085221154528157,7192659330565275,9065842115091364,8795049125116839,2028187245091752,832203547540394,6331150617781405,1561426157861808,1269751755721203,1941743001303994,7424892992846780,4460337932336061,3281685943761855,6616094820752325,8251729698356169,1143736900033484,8133299865678031,7659877168683986,74483328973779,149573276056532,4210647262108629,5079690337623000,2883647596048207,7174803963001820,7571122346277853,7979713945582558,1650910022761445,6647947931057127,5934722163809256,8057716827282409,260817215921132,1160630248930285,4599904484932590,2823971840428541,7172519876942834,4681332493605880,7877954479913978,3369841660451838,8677387166863189,2840489272302592,4439634738825728,4598520915360771,3982737843100679,4027733846367240,8283069168532492,8037651891289101,3497059301194771,1759708401335316,4104383097427570,7936766486248470,972462962564119,2454666017050458,7037975305246,1392716943621152,2570205604314146,4205631132187683,7722249590873124,7200702852631584,5801908719205416,4194306530851884,2134487453163357,5039060235131955,3460813827608812,6120729687284790,2988516916918793,8483755119680569,3899336267565533,2448125702503484,1656220976995389,5603057719321781,1655925097028672,2369994435894338,5136790687726659,5908275078003783,650068441932983,8608485868076115,6834369205574741,6415455370345558,6802661887425624,6803118148852830,2414732602604641,7576049686166629,9098619701255270,7424471285049873,6155367671266408,7661463840152681,7381756636281963,6392829613390957,3277107873242984,479351898102898,3402718458471401,400129150622836,2057224471411833,6788270244945018,9029077062417535,1890613022416000,4818343244774529,5131794488499331,4399207829167238,8324733758438535,3173103199321226,2515505303960720,8123953337798510,7367103301147798,3966149641043096,7537745635630233,2337368385952923,105223780531362,7340627638250011,8262312901480305,5340671128509608,6270822014450857,6074639408290988,6492325472640174,8541905262247088,5398668422192311,2521827798310073,7520573939367098,4329021008125121,8949573316541634,9051302581370125,7271621865684166,261839901973707,6466028278563965,8976401560034515,7034558473477334,8308564553955644,9155623336578461,6085348448083161,7795408590871773,6115263980944607,3255217161247096,4020082097020130,2461538194988923,1080775083891943,2147624293637352,8621632311820773,3449827301448940,6238018150948077,4114819352583406,3282434966196094,3976470039215350,7123221473533181,7232643159858430,4447888327646468,526900958998401,3659731610295560,1713901735869705,168877539652823,4800973294174082,9090055443037455,3381002772374744,6727259943105821,500334151875862,8685850890069209,685918491016475,2949843919772956,5360164131421469,235302775738245,667769495059744,1374662094470434,2466821065609094,4029510697915612,6627175312776492,6601924898200880,964120853216561,5489967664800990,434663105740090,4780109512336323,4533026897706301,4603851534138686,3305714230992192,9065771554315586,3351601368210755,932156021882181,1061216184048968,7696693820276832,6592997913971255,1333584256204108,6486845152279886,5067480498085200,8683298359795028,849948163423575,3210533125126362,7468902614310235,2499539824942428,2801860639120741,6123356694199654,1591592186404201,453745360485738,2796738001870189,5748507413183855,8467769680313715,3601143570996597,8346773454871103,3047576859540860,538582789201277,2125601411293077,557614322269568,1205783918124417,3774491859885447,3193898285000962,869873178353035,5977955467754893,4425510118964622,3354597838462351,6814115723926934,8652629393161623,3940142306064964,1652307608976796,6171008575069600,3970672539030768,5818869061221794,8226853089077435,1453112692997541,6725863418928552,1737962258365869,6987600868638127,2469355395866032,5754878247093491,879005708819895,1165257885348643,4352603433049531,8735881230540220,3254832061758913,4187069639133771,6633348590353861,8852214119513542,7032746743332296,6200613581356492,6386034813844942,1752894315675087,3587418396630480,708516434017745,2229769575604131,3643814257745366,1254127728942551,2442717204356571,7685105092433146,1241637433515486,7426415841320415,583109847014880,1438381635419617,6606260526949627,6439739231829478,8921697609585916,2237086576229868,1106199631740403,8760826524909044,4431783417470454,2621662149998713,3732000985021944,5917313034616314,8286269765696715,2335149227539967,5807392009117186,5693382968210689,2678773517942280,8262377723182601,1152496887913995,4580069425356300,2446897897084973,4875457169677838,5418893137269414,1102260502519312,3358865997692433,8706052379385363,6722871576321556,8097089559526934,3464002313030233,6535128538594842,8542579854597659,4370586720583196,1777835802328606,5534381848796703,4728408690700225,4171125255396902,8281064559251377,8227612750806568,5897409071376545,5709432793341483,2454279477526062,5883514695425584,4492442407978248,4467277210975795,2166989778566709,9019447938900686,6633298581446205,8029747724531716,4031415808327237,789455951877389,745411932970577,4891925455914497,7014651665907287,5826716650798683,8752704753160122,265469962092126,3155004858596959,3147859464027744,6028515532111458,5974211735060067,6908196951924324,1427621276737125,6087930950155878,4323139039673959,1392855817395816,919392467189353,8665087531415905,8636700822022759,776534875013054,8951332651744886,7107783730273913,3858659934699132,7374686899322500,5626105994597654,1341973376827015,903635535289992,5732569572219500,1941855179808394,5541338209713805,8503837196656270,8324950980558481,8807036115246184,4592842487479958,7210574162394776,6812801700871833,6406931733534855,6353407286320798,9105117696065183,4325490435671323,3276824315740102,5919917647191719,8127473982783144,8618184823923996,2293288058953386,1001275928125101,6937764470300335,1536689513037492,4006911592890037,4575629362609847,3790082130886328,8805204698349241,4708334367858362,5448505842810555,78357334436469,7462393669240097,4434774127168119,3371065396810967,1519704725348045,4373174397927120,7518169796214482,7672693217435354,6741975400554204,355708522725087,6346362329153248,6916388997398244,4750962687229669,724519046414055,5058680227364587,8033417907797740,2411726123458286,7745247612239827,4334741323103993,3109178595097507,2037731130875648,6000351955484418,5943452196560643,2648109482639108,5023622973800197,713293323837190,8557648405806856,1211738067066634,6646309104066316,8379034900043833,5943195928370962,7196363467693844,6689406718189334,2315609761316633,4512018752151322,58538094731038,8137664565254789,2756112973471520,1569275591270177,2951508493238053,5329427935520587,6894792334860079,4742008536506166,9190944632737759,3268962368618300,1938379301732158,7343568737754945,5606343632904002,8657412627488579,5247587648918838,3972045156974408,5476767812403017,3866538071007052,6736965661436501,6980211126771535,7564348498538051,6847889312830538,1877951342485335,5033865590603610,8417932355470227,2122322741796701,774943879454558,6444607631228768,824347867699856,5394644190266683,2874035275636580,3070792232959847,120313572851560,3571908914122727,5488510259257196,8162784529629042,7061462669033331,6032552331198324,3757987012773183,8100761143590781,2106249672564606,6605249957396353,736718817017730,4152066311921539,7725073372282764,896200435171213,3230664942485391,2962332549898129,461140482285334,5753292263890837,7751785921798041,5423316522082205,7640577873689376,108766189830049,4379242772856739,7599674074980260,3108595682647973,3806748701736883,1515702173212596,4956105745342389,2058443869413302,8621918217830328,7011439643246524,1645395842236350,2069672634826690,4546099039117254,3853901546921928,242751165636563,6692188116615124,1701954503139285,5341894049857500,3928416784015354,7437439639158750,8363813017550815,5420848264511462,6791788363456491,3153319960551406,1004136998469615,5505199234760690,2154589241887246,9052848206938109,1816842737934335],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a893a18ca62dd4e2bcb3c9aaf9c1957b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001402285.1/GCA_001402285.1_ASM140228v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LBGE01000009.1 Vibrio cholerae strain YB4C07 YB04_C07_contig_10_consensus, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a893a18ca62dd4e2bcb3c9aaf9c1957b\",\"mins\":[2118490418864130,2943808970563587,419706180431877,6308746112196614,4657982368518151,1535946772001452,9199893254098263,5185618078519298,3584875456679951,4821354879229955,7593740382560276,4505873630687254,1894523847233560,7614553400492057,468697300639771,6817106661555546,6440090776739872,794629216337953,3186308597854242,4267337837830180,5038013679562789,7897189725970470,7461963426769585,43104334655528,8371197614845996,152763289702445,7992020924710958,2686269812932655,1732391563456560,142009518792753,4252708352528435,8928088192107674,7188431461605432,585825306979679,2608603678343230,6378220205195957,4286059513225280,843693188497477,958309322674871,7990748816502861,566187097399374,753809200947279,6493047292084306,8213711387725907,732370138914900,517853665778257,1441387681902683,4326394063724636,1716829789306973,6428265274937438,3147803855405151,1073917459144802,2164625819488358,9025341279701009,7844426287306732,2206865772298352,8677865256833137,4368851335364722,2232367330612585,1650906105409656,5784094891991164,4128661706149226,2865860378009727,5905328598675584,365462273577090,534332468735339,8787189943922710,1471473804644491,4257955370307725,1262441771503759,4296127103856785,6311995976970386,897193130324122,9188368623050095,2843328845878033,6107520130613405,4422793946325150,6993926456215555,452354680485232,976983195033762,3669179187863579,1248397685244068,114754972663975,1924005614239913,2686185122537642,7974357282329287,6126930710577325,2179599627354288,4868900777070769,2682178918973621,4572325144973495,7268064919701535,1575919812051132,6017542477017278,5997164437385248,8461595699860123,6446554609162273,390736511725768,3818745738043593,6192647117197514,1615602759037131,7692966477701154,8871392289849551,7811479414640850,4293948576063701,66261302796507,7794547837437279,7720788101197861,2379532602880224,6507270659866849,358643632934267,8200662509887716,1342934242586853,6219399548883174,4743006369583336,5626124842377449,6319168109498603,8549057591782055,714391923257584,7422809166995496,404345910608116,7509112239078782,2113093180076278,8122827137707942,3762441099104508,4423539494744319,5772327416271106,6707530094221325,4889409025851652,2990905833652486,8823238942734369,1737913733701898,5691494366003468,5530066000666893,6112702805516333,7307631526445328,3971376148160787,6887643712790809,1765071422095642,630288175735067,6720515886428446,2545083603150213,3399387148697888,8343381932938861,3041909863138913,2005671004315942,5566374956912935,6990517416415530,164386001327495,3018584964522285,7359553210893021,475134692987186,4786666132353331,2057880086720828,6053529182130493,761701328859454,5225881123291455,7122735966294336,3901530885845313,7691518129942851,3529883027927364,3232884332128310,217902641480,6890926505935177,7508603404642359,1435273826709837,7353450193623181,2688308070843061,3679802402763092,124474604769621,365236410347862,7875706970153306,8159743928941967,3331014700749148,3257155034390878,6950311918432608,1125590725325153,574417087762789,952237802299750,83565493768554,6413583749662098,6665954595340654,1113957420928043,7104684514812274,8970917935444530,8497497900772506,8620330443766505,7051903688742292,8576460543578493,6061319060124031,8219409174229376,6612282714763328,6655809453982084,8089374755156357,5808216168694150,4190206136045959,4928997451243915,3001470286074253,2990683974200045,5921141493203347,1075970356076949,555023417794967,8244150796587659,1086215143866779,4626110377718175,7336075216765344,1231001540944289,7486636712407459,3809730949956009,3850635804901802,4150401703047596,7008392718040477,2470305257435572,2222454848115125,2035239994651062,8540990178399514,7641337824096701,2237803478403829,4224588380033472,4310907963220417,6531823635718594,6299253270753733,2126557492535755,4491227536380364,1212764369052112,4601473584869846,286774897910231,1966522310517209,3382967451062747,4971601401045470,1602902714278373,2693161569042920,5271990184124907,6280169795396076,5844063262097903,541724928487920,869408136827379,665882653135614,4940728310440440,9134740431376889,6745989775688186,162440591081979,8847496015290879,3400783283917312,5069542222832129,2519832070709762,8906465921602056,1727505528902153,6165385896456715,9039368256946799,8928686649586198,9037734993322521,1559770881073692,7610652337611294,2757598559149488,5518686131143203,3182420681515557,828194102074801,3973951156027944,2561621764723241,49734417551914,3485618891676734,8200633694281138,2433795614732849,7845599415706162,3945344145703475,1246378934923829,620381886849590,1211410431255099,8045221103182396,1349934071697985,540566224974404,8623536230806087,8365131860730440,8490842786482483,7651161436639819,5516816278553164,3316473705009250,6451791010517582,6576228519916114,7617421634114138,7017875440317199,6371368590365276,6612338460820922,8697270950019679,7839980174373472,4413725160571489,1721491723862626,5700471677764195,8438003379272105,6477355539346021,2733856704803601,5871326718067304,6829822416996967,1465128190825068,8101533068067439,7863618597552285,7860313520145011,6113413429748340,3492300270862965,123544633266806,6479031015654010,2148714531353212,446003650396798,4061376853615234,2208487517741870,3335895269749381,5895235909239432,963028719084170,4347513357267595,7910982214341263,7327881001642994,4176860231994136,5306410618114707,4374241231921812,1324068206277272,1121351328367259,696696131539615,4663807657079456,6759695271256738,6995707008062918,7038564760109734,3462848419973916,8742762628415805,761750324392619,4664058917843628,3906556945965853,2987053468463796,6300587662471861,2296559669646007,931005873906361,1115066577818299,2963730803589822,8637355547714239,2984459283661504,8881642902893251,4260139367015108,4615518753936070,382774459749063,6238788661068488,8615078982070010,928890141192906,2775117584642093,5252194873614456,7191744158524114,7539642564674339,7640841655415509,316377834472153,8590212287542782,3721951137714908,1725617710797533,714448300659426,7857053801276135,4079837870796924,8986491567526695,7568402539528941,311005222232815,3730028271129333,6854013193802486,5338602908771063,6691361674453752,2051172101882618,2670854838534907,6123395410440958,683589742431701,3135674858914560,8144096802435200,6694761846698798,2739304833245957,5126417150903046,8999782555239179,686344595893552,570919576822544,594129494774545,5191742625354514,5147586857378581,101163199886104,4643573801521949,1369572865602338,2453859966698275,3415011764744996,1824604388795173,621262495793958,637237880455975,4917838723253032,3513987108569902,2195413528916785,756239021486898,8525166604955102,1055939350504251,381932918391613,2428443280376648,8317429203791,1988348527498065,278175749493586,357958065517395,1825402463675225,1788910089659231,7634946645971811,4986830507070308,8962276993820134,2326882411832167,1602596539736936,5856155438326633,8716685289469415,2510422356910958,8488598879158625,9012077207806833,4889840656290674,4735916265412755,3465227144667076,3575403180340085,8382156868425876,5706441684239227,2928614486372454,451864934433663,1338482301768576,8009398837408643,4969482553193348,3867018849739655,7576328036294054,5890852645294987,5466534890107789,6053766437364624,7541991689294740,8594094909870737,478481377547161,7577580787180442,2201007541994398,8519905048437663,679325266391970,6140948532906139,8257575995093924,8580990082139045,2479556396307953,2296164467303338,3551705626149804,1867327021638573,6741586894934173,790094738162609,7605886907696051,664600852939708,5598411008402365,3228307142370243,2261006548329412,3277730285720517,3285380557013962,6789682796586487,7445589788140493,719160050045902,6612967753528271,2979938602718162,8021070573791339,4017808600495060,1246148396695716,7346078732075855,8617550908249389,7983685906465761,7194093393073122,8777476534764515,4481154804712420,2327809797223400,8656263616168937,4354609879765994,4945466494927015,5599329441920509,8477713764443124,3037655562413566,6845484906116086,2642419278234617,5523121173345274,2442126436627451,1976368792744959,946494136607745,3452225504494594,5916581784081412,6113885551518725,2177120863880199,3424706376942600,534553479472138,2914382143050767,3012289198003217,483562125620242,41746936362003,6853801860701270,6065649729016853,8204621172245528,3011358779831321,3380948380715825,3064803738760222,5305979244459041,1062804250301478,6023691073173681,4557036849378345,7803676451533868,651795400238128,4679259457766450,6876842448110644,3786901169648695,1685612695708511,8544701340812351,1235759500997697,6658017385681987,5459901052941385,6191777130842979,7444001134508173,7480397930300497,5226110613779538,3035670636323923,309356064715860,2688610806125655,5998802036667480,3239918556492889,6631672678859872,8404787074733154,4130130009752675,5806367151641700,635061677007974,7036214936212123,835105937077355,5079650127803500,4299754580624496,7144553181551464,6562876324508786,795620979299443,3828838596609140,37638202684534,679358904145015,2901278906700920,2624637351072891,1675608740213884,8473146012912490,5142771619931262,2795070958494847,7504207123173953,7189766593770628,5048589611553932,3401159562278037,3027624868029977,876458001994905,7336879208098652,5671297891986287,574833075510423,4507163584488606,8822555386221727,8702606285460641,7394749302150306,6722545696433315,6630434032592036,6442591851829446,6435554836341926,6427394122196138,1141186379601067,3459535124790415,7443760853496690,6557970197705907,3973918020483273,3883942537159865,3129489640613051,6875875620152508,1025495423468733,6452044929066174,2371043955717313,5375518428861441,7210697190077637,5868072533148870,1822852207760587,3772390125098190,16116895823055,2575469970097360,4231906138864665,817809873609942,5702967385846999,5987060893783257,5152220155237595,509921400472798,3307177322546401,5488785410544867,339070362330340,7382848139938684,8312197814047286,7835320572997842,2279776491611374,3398245239252207,1491221969327345,5857774034036947,5971288796529911,2814461097309436,9033644791843112,969430124143872,4970739759750016,2742396408981035,4540550706914566,2832300457510153,7696738130121996,2582599070398492,3901832539810691,7013072026089091,6700400916362116,4154849738343706,4978727348129098,5505779718608157,5610324402844838,1432253933712672,7604299960372784,7346571444574427,8500558303126823,6279540672955688,7587550377297193,7788148857656619,6065760033301805,7599979760010543,5469728072549684,874983574775093,6105640903800119,775270304249151,8083329483208003,4898533764609348,6134985945134405,658251144418630,3020945040782663,5676787999647048,5997548833647500,2825297544746316,4636130704065869,8371538312197066,249964652619320,6537192256654361,8061953724078308,5014136794748251,4256261227976030,7172881351841119,4213006311097702,7804944453141864,700306292745577,414509944911211,5921105789945196,38376303422354,6113576438846832,1390627713564222,5777196127081850,1600349343786363,4416211191006588,9003040413378272,5507283764614527,244362173781376,356754781508993,7967219262157035,7271073911741343,6272876576978309,5399119291909511,2968162280154506,469806549439890,5888673210267027,3591503992800660,3907010713959321,2491911000573341,7339422989149853,2241673016325539,8912787096618404,3038758317553068,7334249264661933,363241097766320,6146941154514504,939160912349145,2404037689292212,6607074705663414,3524587537870409,5939786285290936,2448883844752826,2650062924181932,801981701473724,9086020310230602,77796078585279,6258666612577729,5944509211338178,638653833696707,9124048077738863,7865253320253686,5957380312540614,4884435716859336,4408188611200458,6355977624487371,6943594954634700,7307245933270478,1280889833625039,8924224501398425,9199356108133844,3396968646354389,1554222465267159,3807684220421592,3415083210114522,6209495815964123,782566498682334,7139328921953761,6239793680672228,7797913073698277,4833362705368550,7779511405753831,6001753565184935,2814781430941164,6028207740610031,3575453414041072,5706236646340081,134976126424565,1410169572558327,1301457281213946,2611066203993002,3647673287579134,8704218158036565,3860555447080448,5191279053374979,4253915160753668,8759541463418375,6932889917982216,7843614588376586,4039094329480715,2089478250842370,8178941974324141,8398064529110544,3884396979553809,1199960253752850,2797297599698455,151182455949822,521406141343258,2079039424562719,6041327712450139,2987042450957862,7329509148597852,3807949189252651,4800855292339757,3502540623414830,1043483144480310,3742043673429560,574059575449145,2913026033399391,7338418654930493,5035358029560757,3870525761484753,3583797596629259,1814414831343172,6583667327854151,4552139848156744,3328111110407754,8567025038113659,7609871271147084,811523722557007,8244356280845906,1387574203049557,9187732104398423,2496598953353487,7413577670723164,2654925222102623,6278431162750561,4598728779704841,7422167444309607,4066431736444520,6724270360213097,9210965308434023,1520095362971922,7673367404084157,7856920801252976,7273900527470194,5026298553013876,6704754746041973,8568646134179446,1363249810183803,374186798212732,2759087155635838,3989807262492287,6662629121140352,5055365871466851,9102263939298950,3906079731439239,7794977563518032,7700321842641073,2604190325012109,7059801626801773,6439681818592195,3607577770915478,7625640617338789,1619589605365400,9112424419259332,2009366238983834,4222444742018715,3085065421022877,2772704588540869,8015145182608322,4229350718391969,4880137637021347,74850736912039,6908316540167849,9198607295501938,8828146947475118,3039666263615153,4602725296305842,563513606833844,8167913452699330,6386202349700797,6478029018543806,631006037927618,6693306262588363,4724379891734212,1223379836520134,2425865975656203,4864308747433675,5072994180875981,4369135943833295,8311082810606957,3911995830453975,7021171931264728,8772790923237081,1239931460343516,7461973182159275,655751114704606,5805792660530912,4167655248561891,4260736997023777,7430378004818897,5137711455151852,5959995166385106,2218500652160753,3467286144382707,7967922422023925,1445870060975865,7223607873193723,5519527688443644,1280928418871037,6623756104324862,1745821725162453,5512762331457283,5625181832365835,5944889209218829,7026896320389055,1677524697241361,6858952489842307,606104098285332,6594984014956310,8768666063849239,1137854616061721,7451598653462298,3940648954935073,3642167591683874,5481722093159548,6770155679315752,6943153139868263,6249540039939886,4964956962969395,6458208065709568,3081750088992567,1753339714692920,87136442812221,1154562913650494,1062029690840897,7813461536409410,3510738942252867,9151572991252292,8488834206943046,9176101526276599,7270763976070985,9165834713775074,6260898322085711,5802212599550402,7307684079286098,8413901280532309,2891435655431140,8216570165290843,4235622604978012,8390240822399152,5889034999629662,7757954240804324,3739957760096098,6386953250659,5848447523555172,4503973735810920,182907955558249,7771042734913391,869729261434736,1229048782489459,8430702259074932,3847725167157566,3489122354243450,4945606500628799,1148435054999420,8852967661184893,849085459593088,2177181723236226,8128166654301163,2061863720339333,5854807984830344,1176665034174103,7567748129372044,4882568898951055,345375353014160,8742008071472792,1518186784454546,4232697213372307,7639312930613148,4810375114663840,445120486512547,1434262469691300,3976827668261190,8321165906417576,7914992285231017,936708700850091,5493105424918445,2822843085350830,6056183421368239,2720706777008048,5452503034288049,1237694772160437,3690589731661750,8095891357472695,2176239469168569,2372931463976607,5263988998363068,286068133017537,5752615854876612,3254808831338440,6805991500052427,4241535976732622,8987763567957735,4914672566077393,3475924525701075,1322106248927188,6771341938136057,1433608788666328,13313267891876,5229646795732954,2363740508975107,5050719276365793,3816651271165927,8016042010937321,5534677885925356,8306347374102509,2522505595684848,427965281302517,8424425050589403,7219231100094457,8331790654960641,768389164152830,5733205474613250,1115972465035267,6258535363371350,719270969582593,1665332015802381,6002827194742798,3626708143314960,8360503475078382,192051806959634,5638759937271829,1685947646949399,3293481020942361,1354993314660015,31840332257308,3367842443884573,2463449441580037,3438443323344928,1155719772870689,7090009471305393,417553046693928,6298651393865769,3708885774747692,3120036801497133,3825650581940272,6918755778898320,3640160827181108,1340164520862046,313256457537590,3467477996132407,1511100088240184,7343083507748532,7380939582539835,9133951851890749,8948713990724807,6601841633966144,6261226536405057,5825687723904011,2774557196910945,7460515186989129,6632700240255050,1199756306950221,9037656018593464,2404714235263331,6709689223874644,8908694699661399,4075318465824857,7323240011580431,832017891162205,6906939466058493,2867170127808607,4440246137063520,5053713567496290,9146374973107899,1116517132208228,3746601083766886,4848968030689383,57827642538089,5286575260067947,3724240970496108,7368260538135570,5640211543382127,7520280426769427,8788155273218164,1867665026193526,943277638092919,3774244684232826,3187296630884475,2625134828443772,5686577467881599,8830325432149515,4287874089302145,1819494830749830,1648698781874311,5087435917383817,2352730178594498,7710863827363984,8718528603816984,741457807128722,3960508236368019,7665541909260436,6799330109102229,181214676272153,5945336432523416,6970146077892292,3607762290391195,2003523450763428,6377960826171078,1016258022582441,8484527972284587,9068165533685932,6218908199643309,628272286787759,921760932092081,8704046424086707,8857479276935348,9059143054936245,8447571844106424,489852716588167,6411283134675133,2123469021382848,2235840872331457,1077084854425291,7352619274397893,4351402327488710,5719646302439625,7051552613939402,6682261916858061,1801987422808275,8540972225395329,6786991624047652,7335225944361179,6348263162046684,4756364463106271,4922460617259232,3771119409395937,1260631676553443,6382983802620132,8398475530441142,1124617011988714,7734931095822267,4224519602555118,4780808775436527,5834125177059571,2542462546544885,7083306841781289,7089739481028857,8839940781750523,2009844472658177,236487757814018,6531249046666283,3563172859808006,4306641935345927,7552710698301705,7494576215144714,2172008492824843,8275432380819725,1534702393587982,4442602950244623,1254899171907856,1328022618009304,272274058565906,884671347943699,8686434431285473,9083546997200601,888310163003672,6625029210171673,844088152639771,7235213011798308,3098519731743013,756253820741928,1556314606114524,184418928527659,1235560915450157,4414831464999214,254986332495720,5266976018737458,1290400698084403,7270523070777653,8638738974439734,9132573573482809,2786880956393791,538983191406912,7163445609998657,3925515567499586,139355194272067,6519244099881285,1049667699001670,3636536697174343,3628514109471052,5760378486819150,6720349648968017,7376544367651154,8027433236916567,8875928022661464,4835661893847385,8866075266906461,1824276362934625,1901157315680611,8675207152839864,8845099755237733,2231492494797162,5432054233065835,8614740495314875,2730812770040175,7357874911377777,1211419553364339,1945763095456117,5590813571185016,8009399205005716,2015818026195327,6813641150498445,813685339781507,6149983669574023,3114363375192456,2059357801421195,2879606104742288,4961379242940817,7475689264978323,498051842566548,4484614777551257,1010358077495705,4600962229254554,6330780865489307,3488913646848414,2743261896829345,3708056216560027,7045343623018225,2806020971448745,5883317949618602,1652141042817451,39869826369964,1419880297118125,363197342333358,6691524537744672,5523008800651697,341363053169074,1912942989973940,2871474703284661,5375382004947383,961931633404345,5637182089193914,65967132248508,2280547098061245,9193008449092084,5802048051009985,3656046718245314,5729582539831747,8297018010148708,9184931695323590,2890393968335303,6682964558924232,566757561596364,2971305747913165,7995171930859984,7588785413155282,5029321763166676,7102617936972245,2082305431595478,2430331321755385,4478536060602841,4373382554511836,8459487402819322,6448914413279713,2616895136901602,7743894586515685,5178553182575076,7736339510700518,1110277224742698,5642710564252136,1302489473550825,8641381539579792,3438412700781650,2158431000148465,7190789717813747,7829269142858228,5051266380947881,150789445294588,1192544531200510,2621660838836736,7772740369889793,270457283688963,1201089084774917,1468704705092103,3729285069052424,3172463604025865,1269399948268631,5634177232036952,3432551548962563,3316281572043285,4741499479996954,7919108831210190,2223471601510945,6419249626233380,1633342179879463,6662505297566248,4002157246454314,9113148033100244,4920015712754098,9119361780566576,1211453290707508,902991087614519,7447934467221940,8663901401430588,5547967427418685,591614997658177,4338592967187011,1289569525109842,883509483280965,2753067195976262,5731015137598024,1310614269475402,5266404878473805,4337599272299086,6509661039188561,154137357765202,1853315688196691,1148204730612308,2493818945432150,2024708475087448,4099214323315812,5265684921010780,8534136431172026,3583300175092327,182014832513006,8116923162950250,8589879967373932,9130422633261460,126635021994611,5716102015642232,5986222583385876,8527306028358266,1358656040687750,6755051049974401,8804564828294337,8109799322323270,2250436913638021,3862171016334661,8021692295449025,2367937507854985,6532580457241227,3717632828865164,4189026603645378,2293341604125328,4833397031993112,673639451024019,3031671784082069,6996376385517835,8675669500663578,905988786551454,8478349555083936,5205423728454306,8469947675749028,3994831304342181,5901832721693350,976696410948851,130741901548203,8091534391784562,8995433522481840,6690103605250737,8385348615409428,9062807222561907,8171222961851062,1004303220267703,5176756372019900,5572492015532736,1705797342202565,3498872054722337,103200173382344,2546397924190921,4574421966887630,4804538057239252,2876455739833045,7343234761747349,79302279518942,8954767807048415,1054806365321954,1989991756133499,999702195972839,6384669586160360,2525881828444905,3716399672343274,7315274480891687,3859368203664108,6614958432967405,6444063229602542,7556695170141309,293828202945264,7522673839488808,9139415069179235,5279559667747573,7892850843822840,7934314625067476,9029302391409402,6254163940584187,6288335793930026,1220132764887812,2800740303729110,7277090953001734,7473696454679304,6944766431901741,7987981815838748,7648547309914896,1024076845001490,348395049540374,8588115734397401,4019934042417944,6180715769142042,4413615662086940,6827682037690535,7023068779194793,5984625587952418,4714464567411163,8776097312266891,8389836325002374,8037622154504668,6079678489078571,7456500797037357,9151509031258221,4057967607511857,8664120357915444,8982917202504501,4057824299289404,1223620366986049,1385920614042435,5613873291146322,7315735405103941,9023856418351942,7782107737996103,9063578238630734,9210386015219642,8200739824035022,7006645581069139,7214663170439761,330671473531738,1597237057567579,3177381557795676,7860587733912415,8419119565917024,5266000334855011,842470911167332,2506245027961702,2565053483879,5154937947667304,1437240206646122,5680976129985389,7967735741172590,169509977283439,7661022302232924,3767529163590514,8900505347959667,357647449185140,7830911615018814,2949288881044347,7038040373472124,6699676555520430,2507609980496767,3639014549879680,3303752501935561,2431423885933443,1305964314196868,7594511120489350,8493754780441128,9100523522210696,7035750150935020,6505463171636107,4138191638403980,399971927017965,2786650597411730,5873500367874963,3069884367567765,2070450061568921,3562155294072513,2264503177640859,8339135561304989,3920205404629919,7098751587789728,5407977755995041,6419065117215651,4852798614034929,8137528212313521,142205903961009,102732205763506,7801479462575027,3474291075355806,9218486501428150,3489507153218487,6447382014991289,8986239268367291,3252106653780925,39744171699136,216598210422737,5524097994406853,5782254799150022,3659135502019528,6035685864634871,5727258915969999,1805691145444305,3095544244722645,238428451458006,3186850221964247,886921516092378,3781858913889244,4033048430545885,2753160296651746,3837916495789027,3515660338248676,5408340161780709,3849072179878886,8331637069083923,3433115111058410,5704071754505195,4875277160709100,6568264360643565,1031360825625582,6203483772238832,5284913015958514,2871361476692478,3047007766572022,6845249321921528,6581528985205755,7476342567853052,597127352606549,6850171744996352,7413711624645633,168831088278530,7800328479540395,7702704265100292,9173672634974038,4485043695258635,2196525765475341,8505947318133307,6698964764093455,8713598633094610,5800587437440018,2834348538313219,5695904391089177,3398852405537818,2226706551991323,8583720298720284,7928944275934237,6057372768554020,8547718568049703,3075045219523624,7623122477678428,4686224304806955,2746788245109804,8790848483259055,3712115505900591,3715077183495216,4006193225546803,8735886402300982,6550874233416201,7480586347961404,8742605506439434,6435940939889726,45896673635393,5426813450071106,3516782144232515,1629957687061575,708753911864394,9203405306137677,7352121096113231,2043693628689489,2458174486043730,4968120596110422,2322839006174297,3150339251625051,5801754631736412,2969739708437297,1843503102741599,8713960163880032,8620854347693153,1915262560881763,7309297142184353,7740422842358887,6811663998626603,8008258273950828,8613238224256111,5768786620435569,6885492483366532,6816614446275699,3072581400024254,2094340176312169,2938093990059129,4173256618757245,6838419690425470,166505145220223,1655626719394949,317538681506950,3707374757399687,1472143478824072,4739857752349833,6462894715722890,4478323353980043,1304757501230223,5471268769803412,8948096202427542,5670466017873047,2957083816488090,8031865492244335,8495391511395484,1061292884425700,8533982855283909,8669150117848492,4049942818565284,8219847493440175,4652509494137372,222121489587371,3880296239746220,230802730904753,6876629438568388,2202983006637235,8069307680132276,7807073737473205,1850944571215030,1921876321402040,733166059023552,2663040282254529,8514971874819267,932184405376197,8469941099338273,543022882200777,8824523067907276,6478500387585234,2201100299422931,8117774463958035,648644474346712,5467043735944418,5112965961657574,1890518934645287,1594091684154604,7366944024456402,1423035056902696,3677091706203379,5480617986944246,3295156651950633,22933626805497,6666235958338090,7780075616820992,7009457929161983,3962259248626954,5077933230918924,6350722855472398,279719084199183,2734631810940176,5844353036283096,8650905879588116,917637278031127,6381920475405593,5474928374783261,8516409947999518,4785919049780511,6018052379958560,6299350848675108,2853220690439462,7554363606549041,8816677332483368,4381992175820077,7669067721649454,6508735895055664,7782244897408904,1740890669727703,1833979185147194,1165823158353217,6980526756322626,2996982871248197,155315227563233,6596180527070536,2279621927456074,798929019350242,6653024312114510,2821713270575099,6787071215283097,3139388335291730,6785660267908436,2598443115646294,5835737486914050,9191936039693656,6750159484955993,5100364839787866,8672985977575311,1533357289950559,115103897767265,9189856829664610,5836244311822907,8167345386075543,9204245408378217,888000477187434,805515663818091,7678162453154365,3560577735634295,5423723925179771,7675646324944252,1815357544951165,6528486006902142,5867022467730815,2538006475586944,8074887894232449,1659435618909571,8139870288878980,7825670458102638,2864398710910343,1670396700548489,987787280498059,379876978408845,2212440207601038,7907978089581967,2114606336920978,6134787768225171,7022799474376084,5598838420352405,2609512411778454,2579456907419031,1489419365498265,3529643505552794,5187796651586799,1571145928347037,4641318604180895,7813184605482402,2422688557927843,8032541376101797,714815131839910,5138315466493353,945130218175914,4769004979031469,5833197565746607,775267265768880,5124249058474568,616722706865586,271750490737907,3753014875364789,2858375805668792,3368209409519034,6709951009570240,1529946641782688,8581959270727106,1913645984308679,6571154835205577,2031556109286647,3346762830224844,1723334929952205,6078369344662990,7539007976714829,4530812624874960,868670107413970,7061398897649571,3567577521602005,8257432360553944,3911619684203298,3393593539952094,6759923610490789,708054685806049,2544610846314406,6553517220965862,1147922039700049,4864696686173672,8998730128718456,3275172823468387,7222600360553964,7710774169451090,7211824424209902,5940917077437935,1028889894342128,6230578793467377,4040044729699826,1132177406332405,8305933805537876,6821624234524159,543842446716418,7011963749047811,4164403451385304,1089186006482603,7176600915738119,6979650552442412,8848270905425418,3337262806007312,7013545956829102,5894705055796758,1368071237291546,1487859210731036,8714604257340957,4604279651638816,8876939438120482,5609543995342371,5929596019142184,9058865074609705,2461092590763563,6822739521240410,4998596751392302,6683431991946799,5703234550476336,3528994210852402,2872107629360508,2958446748454458,2227080230415931,8262391056940298,3860975906098750,8712166810984288,8232363927738664,5669888803778115,454501279025078,5671904144272966,4692159980055820,3490542291752973,4007357316014690,5843520671415794,55228365196882,2239490435667897,2364278095380060,3088053327404986,7551751971688030,8020348641332832,1058337511321186,6514810129428067,8407200147746405,7280605492633193,1556461809586141,1397248232016487,920519309598316,1823537487879789,8153006415310446,861750518050418,3922229832195699,6950104412883267,7008710357581431,2677873243995770,907281052790395,3389624782724735,1297994900180610,4292518104284804,4320596886974088,6855041898389138,6055466494946963,7646424500565017,1458072281403029,3180421285994135,3924740784367556,8216459393281691,1178272520552093,4203262541790878,9105748767890532,7807560531127970,1482204519240721,2324544444931752,7995129412683036,3927087768034987,5242291344866988,5780385504284334,3934837300440349,6757305914322888,7854157747977907,4513219260563124,5176678874578614,2599498493165240,7830154707311903,7805983143101087,1306859152867006,6503726776499905,5524119370731202,7122254423752387,604735828467396,4772271525900918,3674410939055814,2872391341969666,5781981868277452,8125441887887219,2125684090150609,3194791388852542,2551081411659726,6523649597689558,5704544901639896,6888188165484249,4235652627918559,6951506730094306,7553003630030566,1229273454098385,4938782403198696,6366256798990057,7171972088823530,2788626065084143,2809687868097832,7862472162940201,4613733049425658,5677668391046907,3806773005004540,3712659170918142,3671882824929023,6288341964832512,7942908651269889,6905828310445847,7213189819006744,8053345679273735,3809665177943816,3980342204354314,5343588735172363,7034144686997261,2742075272187662,2675790087921423,3480947542904596,4132537715267706,7302311742898593,5975305716457239,6307576739946264,8621834570473241,2603583857790747,3467424061099809,665313161387811,1222518963522396,455060864176092,4521325325819690,8972187202878087,6674480149864236,7643522822033198,777019732836317,5634304706854704,7594769891217202,2334802904289076,6382930490167095,7126591673457735,7552591570231946,7682812168963647,6856674020601664,2780310603012064,2904030022987587,2051603392577348,5896886568415045,4208596424277830,2282881802938337,7344372813184840,7827919076319202,1035574754266959,8772754547986256,6647161530486612,6116713026604885,8413190596312918,6019704611401560,5196887114895193,1586134276601341,6649553157140316,476049649381153,6305387095117662,6051896968843103,5444547969224544,8384360770719585,7066565855788898,282422119837540,6766154939707237,1220287971156625,6142562577940328,6824420187602793,8552661428928362,2409007706937319,8328802064960816,4231166881664881,4166974702680723,989789821632373,4099769141555063,2590280828321657,35514869935994,7947355517497219,5411055877885829,5615343193009473,255723526774664,1901822122954633,8852953124945802,3670439833935756,292865572524791,1183572509491088,8053123471241105,1469022411607955,3112338262921109,1415916193161112,4200293585538973,4547480848379807,1218076164751265,991570785091490,3650613400691355,6235468646731686,3801167383232424,3144421066202439,6320352008363948,4582586294747055,7317318057537458,1098594800755785,4085719604076471,2457501661364153,4143346206535610,1754896903848607,9159580666908970,6454964344196426,5589532708155327,2849406936567744,2217258203905985,4599146777145346,4856328137920452,9001049113272262,2886982247849928,6109934159618225,4744482086727626,7045151777124300,8051500760608717,1593430585389008,2146241386942417,6957820118536146,9101358745702355,6216865666670551,4527171510771672,5908419102105564,4700361258143709,1758012031434720,8802062217950909,2803488380100578,4960821661155299,2554042504839141,4605840699023335,8109838069791258,2236607061537334,6258119096176622,909800104787953,9046534546182132,8966271180918782,6068422694399993,702734893772795,8218003806509507,8791664180641790],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/a897a797fc00c21ec3ef5062b38cfb90",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001070235.1/GCA_001070235.1_ASM107023v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JWCU01000001.1 Streptococcus sanguinis strain 1112_SSAN 0_6903_113542, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"a897a797fc00c21ec3ef5062b38cfb90\",\"mins\":[4351975041236993,3355798426603523,9191605153366021,8153845384734185,8488858234464258,2862101241884686,215102946279440,3746767034769425,6701512048050195,2528906330890262,7571217603264538,537649996185633,7966145102426148,2005607542577158,4228682979000359,3000793101083996,600247155961900,2805448467779630,1026505898831197,2654005919195184,3926594996420659,7577469969420342,7492674559332407,4814248893676956,7619820484653116,8337300020583093,872478129999939,2211222942330948,2569798177431622,4642354715279433,3953399581634635,8731440254275663,6988613761552469,8811904551088217,4944405983752282,4197493709840475,1231991296245854,2202260406755424,6307691714961424,7506420541204497,2389063076556905,5182524829507693,5377836831690866,3281733885259891,3015766863949940,5285904885600373,3099213824168054,521562631917687,8719750256664696,927414957150329,465603889660026,577794284576891,2432715640828029,591614534832254,6800139124854913,8479696398454914,1228620183535747,5827725436592261,5833091661070474,162765548241037,227616224321681,6494933320638613,8261648124051606,6700666649194647,5499315817545880,5520623270015684,3785514311192730,3135201929818268,3046435922907295,6618537946437659,117755197583524,8914741457649009,9008374127829160,980192377581737,340391117271210,2717039069126827,3090035201351854,8183487147614062,1110598058306249,3810515179421880,4489866739978425,5928151040213178,2200293657751741,507789173993663,3140550044139713,2029414007148738,5113952872878281,3234568202514634,2475234408329419,697547531886801,6677196327008291,2953650894270677,6291537290969303,7826153697845464,6043709202559193,1248780423660922,6326114462978270,4890740983447589,4854319539937504,4984030148805328,8415145656901860,1031682279301354,8807913977491696,7544443207823609,469051208323322,3987391131832573,4101060876259582,2096936928686338,8530106697939670,3485450038460678,7961343009872164,3149705163378952,3249368732467467,6343381457146124,1352523881853202,5982582949814550,3783077379619545,4785186082483589,5246905077547297,7763629512867287,8972495156265262,593293975314735,9092344610524951,3616006068064561,5972873863610419,897681406980410,4248158906585409,8320357057118533,2764972024906056,4086353705010288,111748588396874,5816072207667533,2566632300310863,2091499649978704,5398444453691730,7131529484390739,5279129622462804,3946152968790363,922127097033053,2112231168196958,9139280940683615,7843151541514307,4977651352629912,5078201014456688,7952929306168723,7067641800114549,6572767251607928,3019518365311358,8335621051007362,5117947622072707,86224479138182,5938259529310600,3873441294553482,538154658251150,6086256838791567,4611167564665232,832904976774552,6090743277048211,9201565831919,7901575992091036,289138466890142,4032360692687265,7635245101715874,6508868067311686,6409193823162790,728675865178535,8096984792871336,5532440579399068,940455180812719,2486113330008496,5860255707972017,782844418937266,7134637483762099,7821544779189662,887852537921975,7185789190283706,6273330645172667,7189969743329354,1099985174331841,4974536295211460,8856371662606795,5242108435841484,6420258776429005,6026555555715149,1775164274803152,3817816560562643,8649617519690196,8962851539247573,8104501100827097,9138679773446223,5965345623644402,7652955627373027,6612976061805028,4145568048562661,5054709695580241,5446051211014632,6982167387730409,1118307956752875,7574780253549038,869388691444208,358677822300658,3092685110903286,2757845593686521,5650993076253181,507317456417279,3274988475789824,1519551984914945,119383102554628,1584512974791173,8857841624279809,2115940916659629,3732828757455376,445590475035157,2554498395021846,3362199681270296,3949670625944089,719062656451100,8351504331624989,5876677319311906,469792880321059,8593493271770995,3991070910525990,1515189062132267,3070568573739564,7843381871908876,8859848877978161,8524791968395826,6518629661065779,5813648375689786,3141902402900544,3764335151104779,5077817207984708,3658281002574411,1962679610594983,3988698491642447,139431464444499,5350222818562645,3836287335756375,3856450993324637,2911386366203011,294205362227985,8880670230049385,3049955108754027,3678035465671279,4215146910824552,1727807256687225,413811569431165,992126474809987,2431355394384516,8977989742678661,4927045168640647,6079294504813193,3563009642386059,6750817912836749,7132041420575374,6237086404608655,127765816709780,4057690695348885,3311860522263321,2746563988820632,4882186634699419,8257220736783004,5176475861574303,2178330289148579,8540593540147698,8209662382187975,921538159817388,9123999153993122,6182100995822264,2834902142423741,3057722783388352,2528914207507137,7583021690974916,4148278271095494,843160808682183,8256070316880587,5748809992696527,5108152598454992,70466434659028,7598989788091172,3949654732387034,746808996696795,2544482424627932,3684902701187806,4609726976254687,5162091537104102,8399267214467195,4123793476555494,1706263104991977,3534097806775023,6417775280337651,5118997536367350,4424115448795898,6873215368692475,5564373706482428,1454625790350077,8828651948348161,8106241494205191,2731999226364680,511254269567753,7905542339355402,2012159282643723,5816822516564748,8113774384836495,4330324758385431,6985093283259161,4353593062892315,379106863280924,8998285696761989,1173849275122467,1157620685091620,4667487114036005,3444355546927910,9169908628714283,5871443649741613,5527844444926769,9023997901017907,6516336909234998,3220695844082487,5299623349449528,7119523017364281,6990779610203060,2513444326585149,7775611650548542,8387501832076768,6767593322136392,6343799620985655,2728360023562291,5873166214501198,8952216470750031,5180705082389328,4260988361349585,3233179825333075,7120360596128569,2013458884768603,7628603672154973,6545083995726686,455490147282405,3068616965419873,7582132165284410,3428900167332709,5029321725563025,7732677855499112,7433063809184617,175227867013994,8482302642353005,3001489850340206,2003696584053615,1637417237594994,2450988806288243,8922438184538998,1254238626943863,6151362256175993,5538917534135165,4646116753826689,903096163652482,8091638913696645,7432644948595590,1931661885668161,8568993247966089,6313335163876234,7405078277493646,2576641286488976,8888969172828312,2293695744922516,7827610246853528,8026260218876826,5661539703956379,6241133332849564,8536899859235747,5688787140703140,8946568706347941,6687568320160678,1289255531418535,5042521651110827,7351191218013100,7977768815682477,4872419291603888,1437851353445875,3844300621194164,3688041276564406,3771941343413176,66132454605755,2794805481239486,3291743054906303,3591444241310664,8791989475945975,3862666399613900,9184781036993451,7490061347285837,5651559395693522,7737238856610771,6352893144261589,2253903048807382,1812406171050972,8607145547023866,2583274498823134,8675982070159913,3927495160263649,2411489246667749,2766562914378728,9149592965542812,5971680802866155,918846732395346,460231010931696,5925473359929744,6400830951171059,7074611045503989,6938738365527034,5360562669884411,5127538444989436,6469840394991787,8202429788260725,5252660062917641,6137716628141067,8002747693986830,8369466739663890,2572879589254165,6663871508517912,1193403868406812,7077268908770333,8084569269195809,5484428952701677,8568747845365254,3124667597034536,3762202517148713,4732847948674092,7673803286213679,4949299359556656,5128739576276020,8579801794634808,4873645219259449,411338958644282,5450891252929595,3701608460989504,8278112593351745,3703170233537377,1486578665792584,7163298795070537,4753807285036106,7786411297577144,1207112597513298,5331183181976663,8469473264753131,7764992169800391,1823487927379045,5587650816402538,1749018166076524,7295145199805551,5609211650565232,7919554231391345,7897420837667280,3945495468647541,4970806640825462,5440711297119355,8922732570612586,7935396550171457,5794589290181760,8192325848290433,3884486403900547,7322175082218631,2905482799580297,4028660012934286,3899029804487825,6375000961815698,1552280959726744,3617794590869700,244899910038685,2534506563757580,5771607097070751,6988222183564449,4480068269569189,5136334265459880,8734495934776489,26298040513708,4955240667519858,7087842418791604,1662266638894263,4535046787179704,5627436417660089,2902102168892605,5558668419699904,6688972744004801,1229291893630148,5090595420972230,1308589997954247,4306747336611017,3354143867151562,527683205612749,3433349776303317,5004899697272029,5800941620851934,7653839947563595,4326585654609123,1740137435735278,8902012397867901,63566596046376,8788283935094002,8279487497409782,474894070502649,3941323053282554,1101686312563965,4526134546695425,1992993456514603,3395088131761413,2076593661088641,2384603221493001,2497005436347658,6491427463300363,8687916220613900,4895060752571530,9001346294760727,7953086596216092,2849510983103773,6018207234528544,1788488947455265,3609776238564642,732548558398755,8284423784228135,5303500691596584,2693237262550314,1109616426984747,2945752818054445,2596331003172145,1506787235951924,2792639127635254,1832584735266105,8298020846298914,2549873987269949,514113205851455,5393284811674946,5676525541066055,3030922222310728,8030303600452941,518103492597070,6108556528616784,1460787466392915,8391760043758933,2884741033190743,4272563557893464,8396918200065420,4421811107063132,3219080984696157,3257395500868959,3807852008506720,1456504495433057,4194711095973218,6797316038718821,8809150619526506,814789536355695,5697529714861424,4111106333787505,3061594231735666,7997839919261043,7069176275453301,4585085655647606,2796140822549879,4083210387666298,1449711313646971,6683741804754301,6234274949866883,4615369753658756,3210913866397249,7911584529982857,3165001449133451,1373099932935747,3510976383735189,5560629781734806,194340871042456,8425867705140638,1985132939400610,4962247094568357,1172333488989606,1474702746715560,2328157796283817,5125896054420906,2947293051336107,6694036382688685,4268365403125169,2737933387598067,2479915203134900,4505099308856758,6365347171759543,8463688893244857,6745567704241600,8090402517233227,6325600032142788,3746925433746885,8180847944967622,7053989143770567,3119016339084753,3019930472846803,4726822595450326,4711745105253849,7288818271405531,5787290203223518,4263616853964259,5196674802603495,2633178870244841,6116411110389226,8963738496263660,2003403737843183,6862631968044528,5659080176784881,1868271485281778,5951887090968051,1374191027860983,8925251445930088,5358561188464122,221928135165435,7307966706112000,7571810513004034,2146777528083971,6347692353086980,6782208305927687,6761169701279240,2547859354215945,5100194644649483,622891350623756,5532109419836943,6511585810941456,1059781949474331,6699616500315678,5383273358610012,3390845354952234,883784439473707,8432153423951404,7978063496033837,6348343729104431,4694917964741555,3035719481919028,8721578081780705,4480544519177785,2386223283600991,664132722124349,6366500833916479,5735529218737729,6458892536215819,8119292970015100,2607442450421320,6484457232074313,1252754222815211,5550165490406993,4904269860083282,1869061655504472,7984827646964144,1429116164015714,8408325709423547,5995094214703979,919664654131474,8934616055916143,5798257864148592,3553350892308755,4488061784060862,1351770114225782,8637402693265015,4549248268838520,5240716697371583,2659072448099965,95298725250686,5344056237614721,140774734931588,6295397301769861,7688578281327553,8119140960589454,5194116331030125,3309867074954896,9027700076136082,6088755669771927,5409786171688600,6558007970192324,6552806318991004,2684455220217501,4518759907989151,5970971379439269,2518769735505574,3083278880642727,2983210609659155,4603593674475177,5304622050612909,6500000207385544,7171473996871347,7091000290592439,4495200089990842,5888883135919803,1465435540392906,7322105060730558,5722335609812672,1177849856722625,987541012693964,7435686274574031,4868520902584016,2242677935154898,6609829326415732,8688838554690511,4075118007068965,6562694738978534,3411423057544936,172085492424317,2846533598926578,7130184918197203,984047070254838,8829355432898453,2622007975679738,8254492774651258,4183703068698367,1636531722804600,5789833710511875,7104787755729878,5761358527080198,128409523078919,2394901765408521,5873190895748875,8511673666504460,7833708441171726,8174902770439666,3812132895598355,8484335917775150,8171537914705540,1149862441879323,2246402584467229,4963538003863326,8705046573311621,58801221687074,1053251687790373,919768666052391,6156090014345001,2851895853799047,8242186833845830,1062296578975533,3033545910413108,8502783263405882,1339143413692223,7533221169915713,500481076520772,3157061769692998,8317569694422855,8949760793824059,1384820292609866,6761335422617420,7219946803816269,2840930942642009,5232750652334394,2846811392288614,1755345562353235,4128950246004592,7543054281500531,6614080529246068,6884818099210101,1651645046626166,6926230659405690,2256805928486784,1036136942917505,2860386505975684,6625836566468485,3556563949864838,2453603170699143,1365378543855496,8770844212238222,7746594399274896,4242200940631704,4043997141174165,282878630860694,5305287260358551,6230564386641819,4653831886538652,7991334673184670,36253435570079,4521890978756514,7281702178002853,1720396178294695,3069648209525063,5384125567730674,8178961281398703,2857312871620936,2617521915672498,3083379656008691,7032934431569845,1487069948594103,1375213399549881,7546063139506107,499590303774652,8194788164917183,48472124704706,7688878739908547,4295291250214853,7871963057498055,4166816327366603,5346671027125106,4328107172149198,6673968507021265,2047175318472660,549332862388181,3439722953140182,2262434285788153,4304630240874148,2391379100964834,496707799156707,4979485075757028,7136426767660710,5700187590117350,5408940346476521,1988278231291883,2352815249369071,3572689026836467,3296370657708021,5568909973088247,6346059156998136,6491974826985466,8781960839465983,3871722509977597,2892698639951870,4803846718994432,3657346382653442,679535336859654,6141047549507592,8093812180658186,1118919509873572,5294780707452589,8243320932677648,4797411726628881,6723431235516434,4363553062283288,3959902082627609,5191231722539035,7356541019762335,61792738551840,2084671819171874,5843257600034851,6936179508807717,2505090021439530,7170946207938603,6854752605686109,5162873875966000,2648033739266099,3308164168288308,1613265694189622,4200514752343047,1027754356676665,6266756832344124,6415164079315007,1167582973069378,3095094510880835,1656705870325830,5607293324978250,5955664368494669,2795578188150862,1307905225865297,5887380776630356,5610676897376341,4211283810265176,876530059343963,3877184579743418,4121131157826576,433055785834597,8799044518185062,2671934313977960,4301141275027561,4169823967909995,9153011480515602,3313654527289455,5643457296099444,3033380034950846,645148956588155,298655312902268,4706193404512382,3592803670673535,8602515269064832,57469870332033,142399296985223,5507288962345097,8510714650863756,7826696912525455,1258987573140426,2692136011793432,8083033751042194,3004587880036503,5695659325421722,8005148581017755,8615252914108573,5948735608510624,1939042363701412,8361323715014342,8569027198105766,7885527074171050,4502122332600491,5218697393420462,5632931299297456,1748646404753585,3991564298143923,3768248669829304,7139013412763833,2198629703555259,5625146808039613,5788471222993269,7992147623721154,2844181554874564,4347230765333537,9128810914021111,8720179866175693,8651189421942991,1108324817664208,1288276924610770,14353350932692,7221066116712662,7665076010428641,7251944679418235,1555901969225958,7110405577578729,733141377976557,7299846319704302,7310634649659633,1034849174231282,7438735104035059,5732793751357686,5926386740701431,2527147803097345,6889052691454210,4336400284051716,7929597177566143,5144871326551625,7257849058564359,5055491362679048,1590361219201291,3298421696755984,4717823081720081,5202409592125715,968153504549142,471987542157596,7217738507581728,2718279603657776,3274488360495394,5872185926359332,1333725834658182,1261734477565480,3080329162959145,621337385617708,916948018358573,6265226554767662,5808984416989576,7232212481935670,2934744535222665,4224836539939129,2750626511538490,5698546277763389,2697748842187829,1921455899916610,507718824819015,791664293173577,3554120367073611,3770044604545357,9108300930099537,7625106906855764,6780051437187471,6014768767310173,8141918706219358,9094471910242655,2075784095076752,4592222595709284,4706243601308006,8107895132510570,2726569288132973,6621582736030064,8631552997828977,2420900888549747,4857917031913845,922670458072809,2161973836175737,1234294695537019,3493364708591996,4886573965228414,2918833813784959,1215075041483137,5235513678289282,3814951233972615,1736452036151689,2194569085225354,4772889559955863,1431233686538648,5770934990281114,3170717931104667,145134611872158,607471533889953,7695395823372699,1588328479734180,5742410517014951,2119139057047976,7994812600224169,613373724744148,6064133789485488,4308446269020603,8613756880819073,8795355347933634,134761497582024,8895680091780387,6032066425534922,5307496269355467,8988105273481677,1111401984715216,3863685338790353,1947304403651028,908244162890830,6457492922075606,7575613396675032,3351274948938202,8023191031732700,2263151194327517,7813340349802977,1359894627039714,2194078849866214,6503189817545809,380995969698880,6463215008063911,4001076513053778,5339230329141742,6247345255553519,6465345150282225,2862381531429362,6288448189454836,4695765598226938,2063581520034299,1298809670109698,8960485958072840,6415174790142474,1052291962545239,2468957023439375,2621981474699792,9218758668020244,4959587915868696,5385887776598555,5831213838400029,1163714933352991,7945985524705824,3849036184433072,2217577870768370,7222866149419566,5577840968944176,7871701869251121,2666485008038450,2977153658096179,6701441275660858,3140225045051963,541157216995900,8994078444185355,6407938047720004,5518243428248139,1041019458800204,753255628601938,2577157569120851,666368756648534,5332801679510104,8197740633451097,5326331600239200,9090850074708003,887533611100770,4956406529956283,2048937446828644,3667805081877094,2413063976005393,5725567264803433,4977406180260462,7983603292269168,4368440463821432,2894131228637819,5001644803627644,7807716403194493,5278644072508031,17005093251712,3341846920006274,700327006474689,313519045524106,3492644419283595,5679504669330062,7471482751543952,919165392026262,7239825993310660,6195915062569626,1978076015880860,7219695995733104,2316147378022171,2722534829918890,9125456565506271,6389945364462255,3614308590975664,6982532735539893,2222509627972280,5864248011926201,5236768264923835,1229357994932927,8216463857890109,3016186868026056,7331886225261004,7701207058262730,3805888131140300,3375741579598541,4554121886001873,2614246382492370,949030812494550,5251085072325335,4467273660431065,5955101332806362,5757176135764699,8559575080447781,643276692449744,7464636341613691,125615809354469,8405522921806566,6104416456149735,8559817442543399,7462303741905645,2753784735865582,6705155276073714,6744624940413395,5488035775224566,6668318678049279,2278424127785721,2934584006925051,3639454319729406,4857996796250879,2465539410363520,8677731049478914,238131538778893,938331002128856,771125650764931,2133008813218580,6435136848890645,5218722636294939,622928699886364,3308665991699230,1641806834443690,3447706822519584,4775732735822626,2843413383211811,5202363841739229,7515114402519858,1409694307261235,111475326004020,4694052215547017,3299032730684216,8117232220154681,342448153545531,1051193009454218,2458951849237310,147973659507521,2688988012018509,5612963757685586,1771140942932819,2357980504349530,7066523943533403,3845375145290589,5642054272441182,4243002686491490,247887871896419,4036506910714724,6574308591483366,5641268014627689,893908214395367,6121030309768044,369388078885746,1335865749126737,5911807740550016,2432851062905793,917004218850179,7019077590567812,4032632310503233,1811534866430856,8908606026222475,9114295285717900,2503712449108877,4683876486286223,7635229365451722,2824258662960017,771120727399315,7604489230324206,4323375811644312,4762012752104345,1662000062684997,8502239244065697,679634859838372,8999133037779878,3849442883083179,5481010610301868,2378422459163122,7268703567584175,1882974307654578,6778899316214707,2131785152581449,336033431280568,3612314203204541,7244765374479295,7637938804796353,3258207242320836,1634496384621510,4032646512305996,3318311784430538,8366828306893771,8235135827740327,1870010068154189,2599509334629331,908259588176853,1647509950929755,3765366853962713,3890189720427482,3186833969003484,8826434737905853,2116878943464415,2386284025150432,1761643590200289,5822774312385506,7197613786377187,7869813481626790,8200893572766694,5430666163973098,6431214390766571,781152405969906,5919610930453491,3922970049735668,6335633002187765,889474406693880,6399074253298681,6010837031902202,4942982784717311,2400769499794429,6562868161223679,5978945642359809,7927765025860614,4792187867806727,8656607828302858,2620502306081806,5657081984224272,951984375192594,1804634237316117,4770716708584623,8607502868634656,5777090092657697,2558749024275491,1439650812730408,1247837023935532,7557990777240624,2607510718712882,4798094564969651,4039635750403125,4423071425883194,1785602582572091,8913775344901180,3993209351502910,4816031281806400,8131449130592486,1699000898841667,8915597001120839,2345929534348361,7511328146324558,5126913257036882,3965061900771171,2816445514710108,5647548139367518,57961120078944,7988804106293776,2650817779059816,3281010126777450,18231554612331,4376234979892338,4084821471808627,2226594971490165,8389140633463999,7546788526051413,3735180974756373,6031342514204101,2954628638006414,6232420664667280,3820463736069998,9081820952628375,7951234939870361,5462424167480476,7524012566260894,8051010081352865,8537748046399815,1370232521383078,3033984599223464,2304293797211307,5258805264059567,2392499012480177,5413622686551219,3536449862950070,5143194179642569,2044639189163193,3711677277772986,8648595167402527,6682406104890556,7368713018984309,7704798197894336,5720080722996418,4476744134859974,6529368514931919,564081773722832,4359746057980369,3909975433358547,3772735956364500,7413415506869462,7554314006338782,3319478001405154,4251537053215974,4644834818911466,3441946027175147,4377244476845298,3630829182881015,1539183931628792,1644210150415609,6533139067092220,1222565725646078,6107843901445333,3520578028289283,2369686504048513,3097817838017800,8220806221693484,7436738808401163,4789256715201805,3376338652499217,2429124478102803,8814382165381108,6290720004534763,135320241593637,4297883199855913,1471019887742251,6811141536561714,9090676251225391,7302415073078577,5143954141183282,5068619756641692,4173331827276283,2753888478969153,1609895973186884,3152956656610629,6439558208159047,4185048931880265,559117425818955,2354544071765325,2727142883417424,842873208278354,6549058544270681,6323752088091995,5532707768769885,6824197069749599,7410915894779235,6095982022667620,4647000078322918,7901380968390545,971609759296872,8583880829848939,7164435409755501,3386316308045166,4610505444224367,8085328888593777,2374263592193399,4574116882783608,5378036921560444,3421266709163391,5529962537528709,8130610236185993,6017037957524875,6102478307843468,5723203829104016,6812581501300115,7916008054115735,7211439053576772,1642039090400666,1435611695082907,4853435771993500,6177493689666974,7994261640355231,5072600033373600,7175685154401697,4852368758111653,8758371173456815,443514609358065,3742940128251304,6742663474347435,2100625682980268,497063044470195,4595452200430250,7724366382185919,4077414269993547,5659296873871718,982108810997190,4937796880846280,8607038550536704,1016024158346703,7040911093980624,621046472744404,7099501276655063,1140253799554520,626399611121115,7568811495812575,4531177264135648,1770864335326690,7732155921391075,5207118478659044,360267755392485,7832994633367015,4455396851592684,2480271701920123,246256877686696,8422713597354384,6781179904048382,5325660507307511,4862395553136120,2875443689651709,8685191657799167,7612905564229121,1111997048253955,7300376662977110,187597100469766,8104692209557420,1500142211531351,4515672165965329,7150019263213079,7625727173844506,8448425265806878,5935248260306865,3098448725409320,3094489101237802,261753763393069,7053652220894771,2890205784890935,3129700526157369,3971143082044991,9206338768031299,1722154368323142,5430286136770121,5886661339434571,5560916498357836,5435177077587536,7000431948181073,1940841358761554,5517180541661242,18150819012182,7159951894453847,1666769984728665,4072084944244315,6432400118226524,6786366659599967,2253973029088865,7288114236739170,2486192464825956,4536766175111782,5649539400580711,3876094476836456,8552730889502313,5734541735984748,7385166547058879,720825814873555,2761347430223472,7247621262691953,8009824654598804,3983396598416881,1641768194354804,4821477249011320,993690470047355,6704259234475645,3196723267722882,6885823528304260,7048743808134789,8066956300766854,6094350424628875,2188015798955660,1824666616118933,7091193111064214,5433112924405402,6289322479251101,7500937007042207,5517852567641764,3429389090414252,9104878911468829,1446968705666739,8590744813047477,5399518007271369,4804093837016762,8729004794339004,1822071934111422,337966709542594,6324104023871172,1137863582617286,3776750397927111,547543686401736,6165232836169417,6561369295486666,574308598066899,1125409378578132,3751058176523990,8506538871709399,5211662846889694,3717911493373776,8820902298984166,4509961438031825,6550949139640041,7819962235494125,2051566707810036,7018210016083241,4945401688694520,3289096169053949,6394632298034375,4613384163815170,3421119432122116,5419064181550857,468498899549962,6996207456845579,6089585954033420,222101511012109,6535680636497678,8317263513001261,1742464423718673,463704718960601,8128557977423640,6646870374190873,8485733069156123,4493617971891999,3814350475845409,4662873478176546,8789734965957744,1156941748510501,8869337251327786,3899153327562717,8827457061932848,56057032478520,4923672946720569,2002259604967226,7679056360697508,2718580000546620,6822218979372869,3009426178404321,7071853486358345,2751224692019018,4310644138958668,8214099314636770,2081740943204174,7146398816579408,7126980835032914,4860211525621498,4036322302501518,8405503591732537,410307028422489,2818491580280673,6336458314485603,3612793916514149,4858115665141606,2833485728217067,3316359601962859,5130252601729215,7625899486203758,7374851865710452,715532997361528,2023703907340948,5553643254754623,6173236309659518,6181046525501312,3974406831259521,5007647698575234,4385203712813035,7671807732370070,3658661938749319,7195876842871660,5737525405727758,7504852791624192,5580435277172625,7846000446222226,2196941392592789,1548385781693081,2070789547675546,6111064496269978,3603490682643443,1123839508704224,7263971120241083,1212929193893802,5062361211761991,5370382778740652,4660515522297773,1747160790908849,5855385735917497,8877531668836283,8942499618889660,3181926588637118,6617206383480769,8088964965879746,2889022157462859,8537093494036033,5041702951313349,5225722193186759,6967017331273673,4244102891278283,6226507925430223,5958703304769489,2352823648960471,2575740743208921,4367308265537499,780117783502813,8949077961379806,382066567819232,6178547636477921,6983280053735402,6905510757273580,41521521524719,8237494033407984,8671589000029523,4652704975372276,8756133805686774,7596381198016505,7318026923899562],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/b1ffa01e0fa86ef9025003261eb181e3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001440225.1/GCA_001440225.1_ASM144022v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LJYP01000001.1 Mycobacterium sp. H092 H092_contig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"b1ffa01e0fa86ef9025003261eb181e3\",\"mins\":[7783023768158210,3496505555484675,7235421676830727,6092384936361995,7939444984455186,1202793588408339,7734743183294486,3472480594534423,2617609040789529,5004626170322971,1756103006830624,7825486025269285,7445752532279334,2658130072936493,3422140886614062,8011729052237871,8478491329118257,1720541950722102,7271636497014845,6851634832252993,2755047694565445,2891141663359046,227764543758411,8041734120611917,4193270471549007,6661602992595024,7289913264562259,8009121591222357,6761553256705032,2272219915968600,8599926567714909,333417534406752,2068576968892513,8743493825159266,1440086405210211,439922702647398,669927286595687,3614557511377001,2763337231704175,8229133572661360,6061343577628785,4972488997421170,2945228412870772,961440179888055,9208044744496587,5033063283441794,3353244377677847,6973860950991003,2378667399889052,5139658466803869,8889287448879262,873642723117765,6382146177966240,2367780941037731,386858032259240,3613085948002473,5523619806617772,3011832194695344,6631998843084981,8903598958084279,5157257091334335,302326385412032,2401836119974085,7416576508174534,1167935617908944,6937341063299282,3333067175321812,1728000434241757,8695670080839905,8027694291673318,5261823372045376,4209833002762473,6642277535064298,2987288310620403,5008958390894837,6377369252225273,8279018713054490,1505834743898365,8693038005289220,4788609742930182,6763242591822091,7352739965559053,4456354978693165,3381936181387540,2296014777098517,3302156441608473,218850960523547,1498463970885917,8299131252326686,3656942282023199,3475163529060642,1764614826385700,5432407232921897,3550744546976045,3400915375022382,8333055343640879,1731568033603889,2009459086901560,5263037905961273,3420580874371387,2103683337363772,8273873240097088,7635338651812166,7958596891343586,3538196787413330,982420035936597,6400678651383868,2032678907396459,6801735252885869,9076109423927664,4093336296776051,3389782101213556,3541365805187451,523952530669954,1818116407239052,6025877618565520,5746449149682065,2607610088931740,6292887998132293,4321745204199841,6227278827487651,1250206743088594,5638097133470117,7323296990519719,6008601271230889,8566482009940396,4870171932011250,3694595685482927,3651148508881328,4859570021007794,5363372447359411,8679167798903220,1045742946492857,5229813248516538,966307387425211,2182372331545020,2710152386470333,259525670126016,6869501788348866,184201729753541,4217432812265927,6222059632386509,3788088672461265,1627893115912663,8550432488432090,2014334508089820,5954442294283002,3654878568407518,7607725664578299,2841076574536164,6515889125048805,608608347472359,7847531830764009,2210191902286318,6567825594868210,474902500884985,484894271365626,5031793982521852,6340629332587946,1957959112155649,1428517133620651,3636102363079172,4947512525971975,7408089064748460,5529385283371533,2702415766214061,1469516158501392,3951125918834776,1324553125102101,503999078527065,3459713198336772,386721457791514,5102528195256859,546914230172421,2045034191175374,4601854083940897,6450908430987355,7325185117403910,5310760608375334,5497499121787434,4339397600764461,6547259223032368,7142293887509051,6250040039154237,6692061742899775,311556038697536,4020121132589633,777346274222658,1837050146564875,2875583667487307,4378318732010060,231478850896462,7521598900085333,8387752759181911,3656311900815961,7320071027270235,6559391165809244,1268080522149990,7357028026843758,4691924430116285,8627681081492080,2302873193857651,3801443203441269,2689990319347931,5395640929665658,6944930306860479,2682164647984457,564473243533954,6793032762573443,6444350286324358,7245322316612234,3837471784983319,2440839469417101,4860777700379416,1027106550022803,7291691122746011,5131160001847965,3522853152883359,8905077793858211,4646534458958500,2385708790098034,3238244137468583,3991007786910376,3672190878515881,94734181794475,8438984433762996,7762164448453305,337643762016954,4608234594378433,4986892227450315,6240781779346120,3000014699373262,5412368451502802,7706432190251734,4159399803019996,3472761247567824,1764352983395110,3579939354583783,1505529279128302,4698257551657768,5523042080383730,3348688339780341,1103461991203580,8782116474520319,6236237264962306,7305753203655430,6461012856513287,4460079191089929,3202906635395853,8702350239245071,8929172048922072,5498444110881554,6921795515269907,7411258904339223,8520432464978713,9122949261665399,6321289923650332,5734497152434973,6977070486905631,8898129132577569,7458699670962978,4363177088664359,366222785930035,1317544067638070,7726520544691000,2277140599858655,251508230628161,5363339658675013,1166606368506696,8726390075597647,7639472352904027,2436974154195808,8151315523543909,5975584966165351,6470667770626927,8946655076262769,4559897645867890,1028439447536501,7938803435922296,6423629558473595,3833096974844796,6868125823705986,4206107699831684,6565765904335754,6919793408967567,8118513726505872,8508108813951890,3708309507343253,4404294943204246,9042395669521306,2135258351043483,5640920855708572,1897082578633632,4577777517937571,1788551402963882,7978252915893163,5566403293053873,5996940302759411,3680364932481973,2564108124431287,6391157608883136,7818217531535520,9111977277703109,3747938020565963,2082863274000689,6693383331636175,3862922517021650,233921354941397,4289278155047897,8906255152759774,7896596942554082,8475839902794723,7200912520446948,2125256571069413,9218604950479846,2997183106647018,5333576988615659,6094122521011183,666390185960432,1546324411015336,4998934454010869,2075705095873528,1147498273899513,6218068993975291,1406046798742524,7943253468775423,6257813291279362,1794280448836614,1028892263097352,6510360912318636,3197531082277899,599968133121037,105342703199247,5043528330716182,6564083406128152,4664951155983385,3354103025296410,8397748660749339,3730589991732254,6762933282620447,8774007818814496,1239282774942758,4745373385024552,7898135299671081,1084039895991339,9198021701379122,3069870097466422,7406097843774520,926278034531385,9117020604603625,7124908690793995,1863971227305028,1373990132466757,2222218303519585,2154420818814033,8031507342730323,1994937156387924,3511014367321714,788153762915415,6797569803363421,1693872126895200,7322480500925537,6585336321680482,137053211657316,7679950798011238,9085549785949291,4202282825327727,3182064490308720,5428502364939381,7485776296821879,3798731234346105,8027362724430015,6488063242771306,8493368274723966,2309483246322815,3760320626918531,2370325387263919,2739498103841930,3043368038220940,2903545333204110,1318228883711119,912275401319572,4263794819302549,262193884693656,6967209683570884,6838140956804253,3240002148009122,4956431194916003,8325972885243046,290267421820074,6652279224960172,3697780993352879,7474734929994935,306642160311156,1346742274770699,971313563935931,1200894398683596,7580927982937278,9080496588293311,7611462766871745,6066328929060034,3316437360854219,1656748660196556,6096209476055085,5609942495732948,7274711316426958,3749938201494742,1874946528062329,4117684496852187,8122614952756445,7840405265695966,4066732348974304,3411400286720208,5706988639380707,826507488281830,8035725125715175,1952893042435304,7919292127765737,4428348392457451,1569686237652208,7643751467623976,7859029957969143,533937335395576,7882339839320276,7608459345724670,2986795585127683,1875649824965892,6808113307854380,2948781724181770,4071017877136651,6969777088947473,9049674027271444,5341802519856411,6785674787188954,4427872206138245,1546969681954082,2522872825603364,2700353522205994,5649561763374379,6140001504658732,5036570315793715,2733637453038904,2503846713836857,6387002503292219,5194111687959868,8404447757018431,2428605854516551,3855468017843084,3725610792437066,8593361134019916,4227273457640782,1849921969128783,3085324095587896,860040138909012,4062543587870037,5235580402976090,7270672301352284,2170630662732284,6563793657423199,33945933768032,7000874467845473,2389914117358955,6405444277052784,1415405732349304,5971760571475322,3606418087323004,6359658978387327,4026237950305667,1416404060669317,845846301762950,577006485628300,4704267127043650,2527146924778894,3713011798238610,344373079491991,9111793514947994,1988160171230621,6457146353022533,5999692296652194,10850165736867,3430944002254245,4891718912189863,2881039038481833,9031843682420138,804070881772972,7157090744496370,8595563675174323,6954085002847669,5814661068309948,6913176840906175,2032890641663425,4121356072592837,7948983401866704,6983344122340817,8704811341524415,6348706025596374,4434889982961112,4876781232293338,3343258287105502,5318250048079327,1121916639831522,2970967151035876,1139988982293990,8161521694918119,4015194570581485,2794688942433779,963502844006327,3607480475682301,3574838388033022,4037545616954965,3216701067159043,6425263404254726,3089433519007243,3573892448798226,8720279393969691,6284718510564895,1841958605645351,8220010279855656,7703098182379052,6701634760369710,7177960592836145,2309112936916530,3540549093152350,2171463497238070,5023906505442871,6529646591395384,1200092498585146,1650777892030012,2531540448888381,695397465048639,2066598144206405,1693137112794698,4405256434746956,4461320944346702,4102615532095056,1335442417555043,525902614677080,8229160993285722,4790318130587232,935462917064292,7673735735862886,2426039741515369,803852047083118,121324438834415,1355760307078770,1034785776248439,7558809512887929,4983701162215035,6540918218204797,4448986973152894,136140368668287,8533188946912898,7268495938070148,6128180898629253,335264590448262,5791078266021512,265256587232906,7649571777316493,4985077191730831,1851701646403216,650173247284881,8739218630198934,436924861441688,7885515748689562,5500068694714013,8572024807949982,6688031411488417,3904341281834660,5531787176278982,425714764965542,4341126736381607,4244771513640616,205698103371433,4932934457198250,2651610445227691,3459036142522267,6479998401185457,4789919261959860,8642199256164021,3777564386330294,9072019487082170,395169970063036,1173541979522749,3516714463708865,4956013128566467,398983265068740,4140686376863430,5085799545038535,5825048981849800,1852777473623753,2673915210581710,4257749928765135,7306412972336848,3116247015671508,4937403903521060,7727064117409301,4196167721658076,4390501713856225,1338448222783204,5382972301798353,3439155476178670,7724631828305533,3862737449428720,745944780258688,5054318665082611,982854995142389,5829786977429238,6974006172362499,4293062250473221,3589740701741356,6699534705256203,9127881304745741,3468562982217488,3038688093447956,4346630691604248,628596190439194,5444887322689841,8727747561449256,4299224568170282,1937224299357995,6761616252913452,9140949326726957,3421673575606062,7982389832681096,1827819134822198,8958573119792953,5925334867363643,3465067715401354,2843098509043518,8726975131756351,8996910156678976,215496445306701,2904219843938127,7934667385849681,2605796993320791,6200692525786970,1857118515021659,9199541870118750,8240462634108561,146673880426344,3850324501833580,2425094949594989,1946034983006525,3853898169534322,4944432689997685,1744864432798697,7142758192764564,6939255546196288,9201857017235330,6385930414950276,5262112153479045,1629805678256371,2960661866243978,5825746438899595,550106425378702,2826880838600593,8399837589538708,3049830881757077,8532675856672662,2316432526649241,1704504400127898,2690233782881263,4842796606818205,3098406927533985,2136255342757797,4897941587453862,5895937159670769,5785053018482601,4600335395555243,7091063188866993,1595520555485107,3817979323533237,3392573382404023,1848430850566073,7789741961062330,8947187831023548,1533281671022527,2970695105595328,2298041512241095,7414804829997003,7547184774342607,5845662811514834,9085560092485588,3567654141446102,7675525914281945,5668838734666914,7411000073578475,6753099206666227,13024208799733,6490271647057918,3007278441465858,8755513288255495,8578299821090826,6312210773403661,6188121686454430,1516886527420433,6795549513639955,8215255929882645,2230085634336791,6230190656325658,2224773009532955,5294162664433697,1438093496961058,95179511490597,7427090069350438,8481949110020135,354973043664945,1220952553891893,3514881527097399,9020207561721912,2491919872968768,1496880666478665,3348522789824589,776595005630546,2047745930070100,7508152310409305,7405133793003614,8177792699787368,4226296510376043,7987746751817842,5441343536834678,1894342149056632,4425847326533755,7673922810456190,3677003112106116,6955624240457862,7213588251404424,7262257528326281,2488664345970827,4881723712473229,5562937184192655,2769043988973712,965954409556113,6164012746639511,4393673826805444,5339231232731292,7010981928495261,3473974718138540,5308876463605933,4634573428148401,4887751015884982,1360234920501620,9081502886496443,3160651912030396,8689007828969662,5520056227965120,3791109317888194,296680977598659,3337532602493127,5469372786611916,6817726236690636,8640774038243533,6741067221051601,3511065941354708,4643052917061326,3666512971202192,1913370810599119,4830719436613853,3026130080008414,6284456475535583,6532958602782944,4938644719380707,5355881886443749,8304281202772204,191839525112051,1867073004652789,3875381347395832,3726245442398460,5091413035235901,2036197349632254,9144947399403777,1605797937613058,3109132934277379,3861007871928581,6790818105403655,5807213628798731,304085152991504,7668833276204760,7294795499989269,8087311561574686,5510730023047557,7399529614068001,7256655749794082,1281077801421092,2646763109271846,2610377604426023,6911763211405608,2605289589074217,2787498793712020,5230593984604461,4039021740738862,4612592451602735,601778632197914,5445967446419769,526867752814906,4786553544468798,6387742334593346,3086848545458500,7682417766120502,4790738504386887,9080998742403401,2267572660275534,7876466655439183,4706689827817810,3800496881305941,5682461308881238,4597029747665244,1041030507497823,7920646201196944,8991267756654993,6636818435574844,7308224011872618,4794370350696813,3686199280142703,7863048116603260,8381802750273918,3063413874502017,2238383520065922,1461960466123139,3344338738211205,2052903260121478,4835410519189896,1554806663760268,4766047377770893,7257948466317711,3524727045164099,4503591860808084,7154064778249966,6589164089559449,8527225240783258,3719357678979487,999578993166752,4761325191997857,5466039984114082,7398179370633641,2685334741010858,6796568125966771,3791832945142196,6945704593887549,1778212098484664,7290067031304636,5673404026628541,5946324605839093,4468437978433989,3620374486469067,3840811180476876,8074662925394132,2242808892918223,6082933737867729,1393692247402965,5573176505674201,6954350311577338,9114767072768421,3835424185977313,2311982138018278,1100389447191016,6282475020585450,4467286126971374,5478972429031165,692480983640565,6044267521296886,4366871506971130,4723772209654268,8888423968068366,1360626829609475,6587555713903109,1886729690851849,7180328284850700,5171543626050062,533929904392719,6404700061485584,5909317682448131,3396967156832004,8019654049393182,988967290325538,6880297257626715,267481506728484,2325100211079719,5256570902063656,6868280022256174,7108065022362035,3126643341085237,1942198263286332,32874106333760,8342691264629313,3045367002294027,6902195743902276,4049408766716485,4624497894255174,3197389582346823,773185002187337,4174815779899978,3310660182036919,8809289698986577,7125433595341923,6815690660266425,3580066740005467,6541334892881486,8058568703339102,2078046489832034,7697058412055141,4035053122751081,4176665139821671,3561982776158830,7689362871724658,3382089893546611,1903412157598324,6048691260066422,7742774694612073,2643872445180539,5598264339163774,3459442918845055,4991986834534848,9105065051941511,1455484610202248,4955186471692938,2838434181982861,8772168069384848,4983968731482771,7091145831131797,252324193381014,7044120700011933,7826405723277981,2796130740267678,3455733484227232,3441683410312304,2575680777489060,6545427966489030,4380332691843754,6119314973952691,4241230720780982,8318610524752567,7328005869841088,8271224336607937,2966502215731907,1362851898059461,3117397217774288,2730373542947537,3252360122854099,1014044920064733,1579601124895455,6796971400891106,5057807288683235,7227967061969645,3888370666941166,5959613825673970,7243410709355646,4792656720833272,7624545398139642,492210922384123,6109145648425724,6685519945698048,4936974449289985,357788818557699,5910618368101124,875408885017349,3347788787854086,2914616119372551,4120170846931720,1613619095177994,7240573438839563,3214379356015373,8441307478493969,1203873119316756,4433704300620568,939338429951108,5305589223795482,7283351624231709,9119863764888351,2394556263459618,7663243740285732,5848735577967398,5935758412139304,7938057600445228,7513038655621933,9067765623556910,2069737043471153,4075826197424949,6556337507633975,1681029152164665,1043662746979131,7582931501624127,4220920320936768,8803138018921281,282999805496134,8000431933156174,2750898780212052,2689966238460758,201763513969501,6935303743146848,964332904911077,6158578862082924,648743693454190,2438984749804409,1463448757054333,4801644455283176,5506889267587974,8980317878927407,4434280828578699,3720094038240141,3911816984783760,8229105098697617,1698011245005714,682311033744275,3433522586110869,5706297034140566,5540822051605657,7451701020806040,6283126709750682,6435177302283204,3098694894693280,3832328717155483,3447960152886180,7686041495301029,9207705751972780,1044404955360177,7128364834917299,7978465602825141,1671115582483382,2179371063659449,2183172788923323,1661251388410812,2274336534555587,1155328037391302,7960111751252940,57603315375266,8407832532429774,8004604555078609,950774635760803,5348605264161748,7126808631561174,8063851443325911,8706497134371322,6588921744862174,1380120873860262,1233967128333289,6396784485968879,7977617702104049,6298655335410676,7766177493863428,8209409805552647,8628618125356040,7082330872072023,3323503316831244,657733120855053,2392177699515408,5186306939113987,1731617100680086,1917645084191771,541779295751199,699827473361954,3832976688180275,397249152445492,245147038501942,6895582218284089,1197590601304541,5693564729355324,5403833241209917,690814978608190,6958029697775245,2753863235767363,6640433863461956,4220970804915271,6113485581962313,858660042918987,4219287926205624,2526279893404754,5185417865972819,8836770177731669,7445742397942870,8472362821946457,3725368098778203,8824220181376094,8191713370336352,7293749404011619,4111478521786897,5372479591828584,8586529520110697,7238786628291705,4806150257351871,2595526143569021,5288013607453205,9183436030602370,6481585685171332,461701798862230,8686523801644169,9141523786265112,272228037332115,9065157185424534,4885489667271833,4312757208704879,1473404984061090,5114007430401187,5023999822711973,4054449795608705,1823113979751596,3205699540659373,7402052295822517,5577871439703222,6934638532590258,2820193204104376,9170379903757499,2132012570733760,7279030081449156,2777033542438085,2581174040759495,6509076066536652,1147777298984142,526740182666447,6038554372230352,522075634805971,6968379151838423,5507509091893797,2109344730393824,2001339963739365,6561924160482536,8081905807314153,2991361175031019,2714528157363436,8509495123359613,3227969980558576,4292473148386545,3591603110808818,1325960096517366,6200456710223322,2245922062593282,8508386986865195,8681594933734666,1296266445229880,8489642212396308,8734992538725654,6892543786110232,6400086910553369,2374545093618975,7415804260134180,1664248725115442,8695874386678942,4759991758124936,5393892868114116,8139172022332728,3587718662434110,4401601290906943,5704645869810230,1653613307268423,8978577912556874,489869876563275,4926386657447246,6879940322185784,2625710786424153,7917955233475930,5623854183951589,8107396057353568,1386343062785380,7409016215571814,6656862977609063,7227418479791464,230913126067564,5026558296690029,8832065967981117,8883071229832560,2650478093806962,8464681253023091,7346488054680809,4546919302688123,5588552918470013,7599704426383253,4622133972485251,8441586712382853,3667729207479686,1701686343921034,6772501799030156,738568318362178,4178672092278159,3282442874686865,5780386708901266,3026224696377923,6714512130559381,3977494452276631,259909427105176,7293838437347908,4174071349710235,2915625025193882,8005687167331743,5490394714680738,6582082132823459,6973263280327469,901663591706028,260508281548018,8505197429296560,8125300776578481,6057313426902450,4021359119240627,8134073787002292,315765749009849,5447850039102906,7562643791539644,4605753838652861,5384075187776958,4541826762804671,4848960999220178,8169049461239237,4487709550906823,7451202841537998,2112264254320079,5504642921295312,1368170441290583,6577182989553110,6538038132346327,1225421189320159,611440809512423,7800926014904231,485645961842157,8756757286161909,5947743439482358,3884225996860920,7404693522533882,3249127588490753,7989539166989830,3099445490069007,8720159834836497,3565175680600699,8179745003171358,3486505469685279,5614303471152673,188713871666722,6008635031495259,5631314118938150,3022010354789933,8809274135627699,4333656149675573,8731912370761273,2113730246790714,7646838506729020,6932247951461953,8983291121233477,2941829016096328,4655601122291274,5491144374603346,6648792391896659,7956830847266388,9004605879659528,1989212128374366,1441274158563941,4572174628384354,8165101691326055,4836829115281003,4645867044826734,366637224639763,8613853784977014,9060188588207380,5777846493665216,4543845738229379,5107978253946502,1035325727215241,5273658085740175,4971685441392273,6630690743684755,2753033195179668,9068876985036057,3534258027226994,671485551029922,913466147868656,2360577384795817,865241193983660,1275295946772141,4601398447730353,3930258323123892,7293282569580213,4538525814214326,2210036722192059,8375682108960446,8540320911890379,7439468794236621,7969322808159956,2927955753291479,5548541785239257,6221224900619998,2499028394217183,2305684992847585,5722331256221411,5712791370121428,1162204411662055,3922344025411304,9060594358546156,3224940659207920,3018774474231538,4137208717943722,5792657827081973,7860517601373943,6921583181156088,2381963877994234,142615658354645,3790181102882565,7286777057349384,5483242847104778,6567032481497730,4140563527307023,7253301978844946,7370901282426645,8126084228689687,2217899243892504,5252305672474393,2944428396961179,3875102972940061,6952774671937314,5607657021460262,644648396001065,4553226654134060,7062881510068014,6401056191786801,3681828152905528,1334088597630777,1615980697582901,1792402722189120,5335468704190273,7530207480647490,1793683696250692,8401267898421064,575943516163914,5021637259259725,8710570291441486,6498355681886861,2473381313302353,5207525579444051,4587606163361623,1149541465288536,2837325312716633,5122786524286815,1611314858432364,7136707841322862,5949332510027634,1753098467446643,5773539313782648,3831147962617724,8943129430798041,6974772705906572,8274974576021392,3418332270841746,8867173207879575,1962054460419995,1539915578944837,6029293034885024,5756990650822561,8264964882506395,5188085899464151,3505058501267368,531132584808361,6617871186980779,5916503218008253,2792787616974835,687411373010869,3936939251158967,5911859853927071,7057651172154698,9085487695638463,883922331594689,4518564743827394,9125135980805451,7509750816624584,6533162023546825,6183407336165322,4914083657453517,4111006175989710,9050906181226448,3360408475742161,1799946017091539,4225068692164565,2713954021863382,1940022394564571,7416332325744605,7846542908977119,5511559732154337,7067258541305829,8354103142944744,1783263368237035,6143623691022317,1823106856439792,1904052581257896,6526902032617458,6003371253092345,3100866537115642,3255335372673019,2832647542992893,7217438311897303,5073876429172737,6821016581910531,7860112692989958,3846807687884807,8562911697121288,3075849142416044,5761558291165194,583204491356162,3646907155763885,203619733896536,6122644741484562,2423580146274328,1898198888615964,5479918333586778,1745915043598367,3578699720667824,7904511994081320,1288495410199900,1631749554303020,5608686121398317,5076892151779383,3100489689608248,7305177648762939,1539295480328252,1966969446780991,7393601666396226,8395656200990788,675973425500229,2704391282613601,7276111011770440,2947414609711179,83512256257752,8444831609491537,5606670484336723,8092044670128213,8963810996313,711749491388507,7459356908171356,6429465498202208,1390326542774369,7468430363655526,1946002482016358,3397404615872615,6153415316525161,3039278842179691,6162964470190191,184136115622001,4639343799478291,1585758547538036,1430778026297280,6469989155393657,4709781355030549,95270376091777,2657378330046596,7756974258352262,7151720174432391,3707005916909707,8662972790960272,2498539979125443,1523184850342040,7032867413045401,9093523432140956,970331968497690,5390303958495390,3280520206938272,5816386816075803,1169872676991105,3175205282951338,842092681793708,2764361037312175,3446003488755894,5070662158964767,719458556514493,8032001541468350,2308626076416032,5502693775102148,4697067363881161,3201524384338122,3637525099213003,314196945531086,9029538825973968,6114068870623444,1235781218840789,4108549414092153,7330289103474904,3937008489525466,1919964747288796,3814533855670501,5735400094036198,7061231166394600,1441828260131049,1925546801100840,2584133273096434,4661106940023034,4461956138258683,4005751837208831,3130525428510977,8744924649976074,6331210199462161,4138386825654550,1056751888920856,6318020485729668,7892844903485728,5041387127812387,6214594141942052,7292073204453670,4529709269496103,2217826143301930,356372496126252,3660733463335213,2350218869133614,3080913127018799,8124832761680180,5264924601487671,756266223079741,6190196404703552,9221341912756549,6611160306190391,5500233961558348,5112793820950861,987072540873040,8736146694498360,37007819624788,2936037382241678,1679661238030682,2314977199124827,8130702474965340,5073145494925663,5905638017290598,4191409001566573,3224268027695470,5722839601729912,6570718033047933,4377119742274965,2657411862425986,1933698556768644,1302907325455766,3719652639756681,3605870343598475,3047620833808782,3109641599463825,1594506354233749,8293357355299223,4443025074470056,1398617511645601,4914445423645091,5344138909946277,1662561252356518,3414498876731820,4324447723188660,2455307239600567,1607321922474427,5224384098185663,5074204251304384,9068776525558211,22785435496901,7042415036428742,3141825787302344,3353683351163343,1717349484368339,4106288451441111,661504139792859,6939598221308381,8155636372107742,2627980397138405,1358493578392038,5395716720218604,5783977279975917,7958321927074288,3765109418119668,7960833377653237,8113993012523511,5541325946139130,6005343321342719,3074736910094845,4234800107729411,2492391592914348,6430539774784010,4202625136742924,4524123418041773,3781633244770833,7651861143712280,2651031763653149,5061998226272798,2986720166769184,9191635668275745,1452050553745311,7554374386758186,111885406003975,5996995502920242,2469858714276406,2631035354255927,6634188644553272,8943057444457908,8684419051926075,1979005192458816,1773367611462210,3287895186117188,884039740789317,3975777889866310,711094433223241,7708406966592269,2292639858815571,8544252879024725,7050961953296982,3247533618066012,4978176012931679,2973595358892640,7941409587920315,1198750314934885,3303500716200551,5744032627454574,1151299543216751,5738266107269746,5277760107532923,976915720819327,3964756018377351,1000901374800522,387392670167695,7522053058876049,6036796203216325,6829159132435111,1450194219135656,6065841056101148,8517715316191916,5094196719801005,6952806468989615,6168342426030768,2478833701114546,8259577779933878,3446816788443835,7745940102181565,5831918171280160,129395350868674,936281748640451,2032923974529737,2464797059015458,8936092848673487,6812918857069265,8475317066543827,6484041090167508,2059602476563918,7605494110556891,5238272147444446,8275723026936543,7806235189310179,7143232474321639,6936908715528937,5429375204299498,7647254674862829,4553472793473780,4677852304503546,2405881304388348,1602594626222208,6654111245734664,845446305198859,9138114290955020,3605424424227597,1353007874724622,3807431535858449,8295080382780180,7568795849216795,662510040929052,8828916114289439,5600045352547104,3524541881111333,3750320812552998,7851177807926059,6517663925695276,266916995625776,1790524059957384,8632658942776114,3354807528981299,4881804891730740,4166277678366174,3578319582603401,176692575826745,3910622409593658,1790230508884795,2373056073388862,3582596778890048,5700822349902658,1492239714087749,7645598623601478,2717116563886922,9004538094727991,3261185927443280,8091765147595604,5194681329996630,5071780722226007,4779572687868761,5727505258812250,3027730828571483,1684405420561245,4354502246765858,4724205899338594,4405598194873190,2275732058264424,8942901067854701,8951939504477038,1436856515933042,5252558494135156,2102711094629238,2085529114276730,5059457631048571,8880238131295101,1554017521316735,948118567728000,7292275867661187,7455902325703489,5135564755456904,4040884324818412,1616665971250058,3841726784385934,2005399084618641,4697229995512724,8668028562920343,4517635098612638,2683986897978181,4232879259104160,6836885602530212,2687192902420636,5037699864753072,3595306986873672,5391580075695603,1720380014818230,6280271790764987,6413382640545269,6057927737152448,7414443916981187,832101369410500,7257136816051141,5495923974656966,4857022428657825,1710128106050508,5110710574732239,4195457570501586,4485042438558682,6067496783959005,7584020557681630,1446045531927525,1722670701704167,3075240739910633,6120719379616756,7697146969568246,6521218642375671,2458045241512964,7856877515928585,8836643426997079,8821512427688972,879748451013647,4215244549633042,1714262325539859,4272509424523438,7206655281886232,5936734775227419,8521716218876956,2993719219958619,8995372730004516,9083040780145702,1625756431635500,3095368292521006,3129700314043439,2065445033972786,6466006367908926,4909938563872949,7561794537141312,325134098791947,382252603205814,1825531529674253,2983084676150352,3801491923293265,8134773975528530,8157569883911251,4832236447315034,645886681994335,5470136950748256,8464408837977188,901935968826471,6368877177738344,1244203399091307,9013216256488557,870248869737586,512695774024826,7569754237498492,1824116572525694,7377173598254210,7572480415978629,6496734618855179,3940938624627858,2033143577031827,1956795351072282,4269156555273374,9077974561430935,3407006243048740,4713230433039530,12040448464044,7401366228083570,6729543202452655,823581388543156,5647049772682782,6285087313425594,2802063772505279,6249330034341062,3262970904728778,2917420144506060,7530440384165069,876569686824147,5307235471881428,2115736249808087,396823543847049,702308083889369,4499309061936347,1706679060206813,1203205226607841,6618246217684195,1486045933622506,4944773981426923,7340154056479980,5061737175536879,8482966791951604,2446252640523509,1006092256122103,4976000312227069,5313143954092928,141675940525314,4160417263031557,5111336736535815,5044201737377032,1027795756709129,7126370230392074,1477844557927691,3610389605334573,2588851736778002,1300718574368021,1748799887004950,4478764909982999,4187089495815449,3410397234951450,6467804285146395,5737114221548834,6184271336084771,9126601424366331,4750403380606248,4401414098720041,8121664148755756,7645763679270189,1449777488000302,2322879656719671,2814869711369529,4962405957678396,824328064021386,4448560339457342,5481250716677443,1538286704416993,127657124402514,1981935335494995,8604696469312857,6706482173523291,9106177452062853,996584904416827,9176014993701094,7923565880350057,2267975152899438,7777882452718972,8977771938428285,7718133917385621,1011179618227584,8763553966871939,8338631253148566,1949266491757959,3444925574993288,4311423564633486,7295626545878420,4817832554247573,8977575990760856,1638724886861218,3895368986662311,8905669402362780,6499493124298154,7343335340455339,2176900016002476,7548739199243693,6093417406313903,2677305015358897,1030667892684210,2165236217066398,815069649917371,8357422444836285,8287003305899454,1988251296382539,1679944013714886,4329204936054219,5998061412791760,333334705864617,838574365291986,866941604246995,802383411500501,2141080235469197,766487595496922,7004325814408672,4673411682022886,8359042567812584,1304689036211694,880525794276850,3550018533291507,4677848633603574,8454797882684921,5203075189036541,8076789017744895,6664639351657984,1570584112862724,5657613363033605,3761151694779912,3221344425596426,8066001930743250,1811119384704533,8396583034607126,3167449776977432,6424236319085488,2097849362382070,7786428848846374,687311988323884,445650969859629,655597259724334,6438072648668723,6915357505025588,4405795899160124,1302359484339776,5306792537830978,1357631859873349,1513359755957833,3274813338220106,1472374989766330,1512228272240213,4783402520229464,8316287570400862,7072083047421539,6523093131597412,3528982691984998,567028229232235,3089714972726894,1507331040007800,2421393679881849,5629293120001659,614779541517948,4499345001870973,1813964802086526,2708398727460480,8899730169992834,3655062690477699,9204839128094343,5748106817599113,5795497225868938,1606854342366861,4024913972745871,6467426199020522,3945755118507667,1347349956499092,7125428835391127,1224441150854809,6065441734194844,550008154355994,3224870088046240,779975025882790,2193388080838312,4728938931802727,2912250046212734,542343672526509,6590051268654767,8810395453585072,1467991159887537,287140731317875,3530442709404247,8171712259339958,456931519266420,6052712447579834,6581973672343228,3627888991410464,9100693785240523,8770617146863222,3454656201683916,1957674306098892,3829522752902862,7122786982573776,3017915367161464,7943134116411090,8778922810504915,8315535333152472,7061683635033817,3890310164805348,6174397604148965,5968015114647270,9040859072607975,8427866952193769,6041716643968746,4080954943895275,7585112587900652,9039029962204114,4545031074379504,3554973634193704,6385110437148410,5453637099484925,3640172071122689,3467516978640642,5355290981283587,2594291722999556,2884740215265033,7131754428495626,2872871812454155,8020857865205518,2563034659550994,5920949212591894,6905887002081048,2233845818572420,9197355994543905,8146039757551395,2814842926200612,1932746282858280,5255074762282794,3581888423532335,3014134020118324,6346444836222775,7681488697972541,1330989342103358,6869504873723715,7342284779788108,134923069830990,529167559923538,7980934085261141,636610493267827,6754433310660440,9212599433475929,7288714918664027,7871716996090170,890122035434469,8853751250155361,8368462175131496,410226266249068,509523370477595,4151677829494644,1275053850265918,2508542878685048,118806750279549,4402973578655618,8839270696674283,1459444326160260,633427916298118,2561545304848263,1882065739511688,1580197500522135,1759887471613841,8509172970145053,4304895630776214,7429446838941592,5570449110882201,4196106524727195,794777179785541,6185446847494048,6239455241045892,1971493965961126,4041153165465511,2744951127959879,8846340472559533,4134047045941174,9205793007503689,576845998782392,6145874096666560,3745819035868832,7654434877765573,2117260215838247,396646853515210,3902570695514059,7813304064759757,9098270107777357,8022751583241208,2862006415841614,7128462798881785,4489559614642137,9104221178730831,6754292496152542,588935011866596,5068905231636458,6606893045241837,9196199537530862,2216728436021233,1461757301307383,1464029777827836,7552273581692928,2854438252959749,2675711401244678,123254221289479,3607605768042507,3568002001270798,8555514814874538,8642871696496671,6981473893447712,8772925817436195,7281672276154404,2611896289857201,5887400918964264,1605809534973994,6984889584441387,6850871270586421,4354299865028662,1097452823427127,5180316926523451,1650320788060221,7636107885033540,3952661129427013,5380253424777569,4784068372830288,5230781512792150,4786298630109275,4069792854898693,1490699016026205,8000349767735391,4539386573232225,5927121525505724,1330496384825453,7330978218465393,1525104273315961,2800451808327808,7358262569302146,2135320616507523,7432123473003542,6401424291133574,5293448773400712,242865731131529,4879846895671438,2007626763750452,2550634449978392,3380198651115666,3024100027748035,4589999599450260,1258593819302041,5575444412160161,6490674991403009,6323389627095209,2366911491479726,6681950689966255,1999920362789044,7944515278373918,4055630526535863,5741709051140283,397281663719626,2892766102755531,4056454990779274,3674486460922068,2522981250848981,4767676143327447,8207922335701211,5179958490495196,7041077501450462,7337524744050913,3242068478384355,6026215880300774,3121094405617895,3076983432698088,6403493099264233,8424372232698093,5191988724726006,3601971451869431,5742773557475579,1179858348636417,2029639364851970,6924157452167553,4735502226667789,3538469584386318,7538057919109393,6343355188312339,1993428013657817,2942855341603096,156112115800346,8176409983097116,4098847684294944,5990438945495329,4938579426081060,556723719706919,8508420846221608,2275320048163116,5897781373974833,4307669101697336,4179265899075898,7077342832015676,5814906683832637,6510762292009281,4407781454305605,6482567040874827,4131180790905165,7844442094565710,540293297158479,6860604438255953,5568126343059798,3009063981259100,5520122346764641,7417395036264803,5786907967215973,7551954656213350,5979526404659564,3902754428361069,1891560971973221,8263905231075700,2762090395031929,7350238072445307,1560475429222782,7706016433994111,2198497421965698,1234563045702026,2062112530667916,8636765026466193,2103594253990292,5194963595942297,9111904623131034,4695903593822632,1606747884435881,2014806143572396,4717009580939693,6690612561705390,7977362707708335,7700595558857137,668945301813686,6296833152129463,3848375699451636,6218418089189109,3141743887174048,7567021833509321,1089951035234762,6451725441325516,2649438036474317,3300009642670544,9002346752096726,1620661061040605,2308583965858270,1659881042852319,6175240396315106,3958516662712813,951467113101806,6750292445641199,8467409068876551,6793007622527477,2308031062601817,6467771791481340,2823012627102207,8900497376377351,4607270720125456,8088809273621010,6049554533726743,8516403606567452,3504668553678597,2109559729060387,8364212321090085,6105777050999334,3925958191561257,8661330499992106,4593245336803884,4091249071749679,6818960468122161,6314337483561525,3110693464676920,35399649040953,9056157582015034,3044611725818934,6396168386796093,3545777313782336,8866649321673824,3717853074291269,2694541212686920,1392727570577993,5108306706610763,1557623955487311,6959119448095314,4449583730025465,2066665414187606,789889281792600,5853883368432740,7956809329089115,8844399749790301,6978606337219171,5724373127731812,4461184142490214,3704496348478062,5932447772277359,3637788960774770,5550147916724853,5160059241994873,2571959145583723,6446096845429381,2009964219617047,3349156744837772,2201609863158414,872445378697873,5841328139508370,5004391417469591,7294668523125403,3207692761979549,2015976980253125,7250246137308272,8187685962324644,4026270343458588,7765492342061738,7269251407074418,2450118424656562,4192151960631988,6261270791690933,8175323520547511,417348397670175,497065861937852,1902484877736638,4515750230874815,6203436145631673,8178821628279491,5953318663781062,2140004157749959,1868173448452808,5455791950650057,7567248462234743,2204807161625292,978572825087778,4298103603321550,9006553356917455,2605115296774868,5526492996229847,7871774916295390,1687022640913122,6548170103826897,6081418373683944,2002189911595754,555744073071341,623459347266291,8270318396930804,4589256198200053,287791908977399,4045264599292664,4488721956535035,5385757784447741,9124207325788930,3376672999693059,3847552337017302,2434630343564038,3387018758299631,5027979523848973,733271078427407,5429730714483474,1861362452593427,7174267292406208,8990985104292631,2166950457260824,6812106038033181,7940140116654882,394572717431587,8963071720176423,5538555818662696,4175120879885098,8997633739201327,2220017744386872,2298238912043835,1328071100668734,4159072711290440,2697211574713153,3425418578926403,3965392593927990,2056891864005448,7174930895887179,1534654947728209,7706415524780884,6641050237885269,3371216234904407,5254599832320857,2161467258084187,6847319924636510,1081806809447264,7742839927765857,2793677712861670,8184794475477862,7315996955155303,3212386069027688,8371165699545962,5743210761714545,8675324022176626,751878441245556,1163898742987637,8733633949096822,6855963065211772,7034182296255358,4740776537113749,5250725152299904,7211699718396803,8942416117955461,7358977351441288,8881749060566371,5263094024575884,2795086851070061,9131595876934808,4699154814974866,1205205837052820,2565535870876568,3838277642427289,7623553620281839,9037895609867164,1803902245927837,280731397536670,9166801574377968,1188410688232355,9004572602350500,9041898431191973,8086232084822952,4358113070496688,129412463582131,1473550724807605,5847245359799232,2203384902343622,4892949716982728,2550456512969673,9175463341939663,1723184568056786,741418477026262,6836699635719129,7200842693147612,5367267808201210,8851193331612644,1256439042358630,3785731168148457,7475074737830897,6482829082917875,1471815357619190,8995998831037361,16331680783354,481343795518459,9182235300543487,1788611974929414,8427469492304904,535999698968407,3387267675914138,2616199587257363,136838685088789,5230476426378264,8224368774921241,7227812368168111,6965820427811868,7022886808804385,9117408868891682,405097058794539,8395768928943148,6741126974412761,7510868243135539,7703616144684463,5322773302819894,491151871556663,6836038929300539,2430105024592956,1448451348167741,825987190086721,497956482120779,162232834833487,3458570553375824,2077795917282391,513262000503903,5313597640306900,7417178070137958,6486839082409063,476761310297195,8643567210749038,2686930039446640,129503060647027,5118481265534143,2899755664063614,1848625991384376,5097469870619780,6352418015386758,3523750062791815,5801014045228168,2203646937480330,2389923221830797,224824548179088,1550103938660666,520455961525406,7291114249247906,4075905162665125,1684505454656678,2089595566218408,62519043775657,2943192337816746,7320502047472814,4823169798945967,6741931869117617,7706231063657651,4853761244519604,7692274918115193,6401970845785279,1580394142399682,4608754600189124,6540965696756936,1025775612976337,7193148706299090,4473287402433060,5045023309208797,4097472355327200,755867279334627,7451821149945064,5340062809316585,2601010545573104,1962375449255158,4787585506449961,5195136910105852,5427477902124246,9191742026071304,7022044638911761,6142467278028051,4863359389441306,2437887447542952,6639794575383836,8448095691988255,619357128260902,861271360077097,7010014177148203,974874493043933,935708849642805,3996528400497976,3323371953069371,9213829621071166,901633722228032,2831403052809537,1197366576215265,3726095529368905,669079558561098,7849054336073035,5190385708621134,4210950094200143,6610896601767250,1363044406402391,2501475110272344,6721419651652953,3307953936121179,8176032259104092,1160766516583777,476217621642595,844696875335013,1583400264220006,2126197363137900,418002141108797,7662985933184368,9122283796022607,4690832894943123,2097822897012089,9076753487437182,7584828869893503,9023052630900096,7019404346588547,8518934831349124,654125950868870,8762179391993068,5724534325034380,7189923670392206,4324003227803448,6467484993969553,4806208396066198,5384712166931863,315812006624667,2969308946522010,1703626175130181,5980798524540144,2103349577268642,4064892181126563,6891269709241766,345054345944490,7623666271264172,7435327416991149,4038396079783343,1167478255599026,957944340670587,7651377039400372,1101818736486985,1493033944096186,8123095107804603,2634747982069183,8839310703599040,3881619539898272,6641411767188933,5961378981002702,7162198642081232,5545415819804115,3792841110404567,5791907141565918,3250666204593639,8541631216754152,5897586133687788,6244267707031022,2521933739630064,8652019375939057,192267158183410,8078153334988275,7619661664116214,7663999171632631,8831172608007672,4223613433511850,8537771392187906,7027235066926337,1050992296525322,712265303907851,4729889776811533,4204537643130388,8948101189836310,4216430364974617,6785786028064282,5273043641221039,2060924439109149,4375194850919933,9042864883875362,5186751514300337,1115019464523304,3394050203310484,2144597122350636,514929165286957,5818656793853489,667600320593460,616407364681269,5634159643016759,5110374646824507,12103641857597,4228159633636932,4462797148593735,6658127280082871,2770828628565583,6046292722335315,1329691430035028,4217296022429269,7795420887653974,1469550388002393,7797358725070427,2502910000840285,3375391674247781,5221033105243746,8678440558336614,8144730304955665,4323636275863146,8973494834421356,7964860178415217,6469225874418373,6903431606238836,8038090384998006,384499937377911,767160604753528,7368766271889021,8253707004411518,5700658383887999,5842155277041284,8397772379455407,1319680033349254,2316437081726599,1791404447743624,8650597313650313,2909745994374499,2737716449639208,8893007411191071,8572958470373009,9075230907104916,4253201250975684,2109726712520350,347241210330784,9205784052883111,6579889830747816,9092085244731055,7682810489945779,7610565717278390,5878686940020410,3521486831361723,411006649843343,6219740943522421,8520982354828992,3093656836521666,5326254542298821,3775594978770630,8351603094757065,7641689089048266,7877588774616779,8439272465145549,5360135707950798,4109386655072205,7861618251620049,8320935170285266,6665613395361491,5386177894907606,902607413640920,2741412583292636,8817275505753822,1881186914246369,203662440431330,3223765178089187,3019368939847399,712722306866928,8282021153316594,1767976396409470,5724394874871542,6247961662182697,3341361185484318,1990011908333307,6997310775598844,3954791130881795,1978683832712964,2530718083166166,7863896335710338,9115636563492619,6933832175410961,2839251702538004,557700153818901,5306163331178266,4286722096799517,98330363615877,4552173399736283,2051263004540711,89865410363179,8037323228389165,3658949792243506,5827008272097078,7604736719503159,872785671864120,6463079648191962,6344758730506043,7335773713080133,1128721164185569,4928943814532936,2470953751166793,6353827233447755,4954361102951664,2795906097561424,1823642074644306,7210635721465279,1931714362285911,1178737878531933,432873695731552,4400961274543974,4959661656152721,4498177346723691,8167083025555310,5028459679995197,6154431013240689,4352047758896674,6993734791446389,8263488490430326,8755726740291449,7969882432965269,8970515031949186,2217854674952067,5499640907861155,1406717125328774,5402139003502471,1788789785636199,2247602760400777,4399237161197450,2345094863511439,3899907176109379,1876138862747544,1821974553534361,4713373073350554,5189500819824623,4913194982565528,8018082097954721,5010588063604642,8766705251966889,1482648808931242,1149860325527538,5850820960444335,3875291778211761,2724392873566130,771898279944119,7555042060812456,8508976012148666,4199418981276319,7780381516012841,4184842184042483,7357072843128769,5692091080130499,7677559179698116,8978411395448776,6391917458325450,7269567318413357,3783756104269780,2208490641727447,2491948155824508,2677480816903503,5308844396989093,9124027726266339,5811713013751787,1755667698098156,6528771842580477,1314230912417776,8609841211523058,6890482734546931,7769354365440950,5525940714201080,5964561457397754,1869682358239227,1327558764716028,117105879711741],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/b23715f6943b9a84bd64315d27cc8bd5",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000604865.1/GCA_000604865.1_Stap_aure_F45759_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KK093788.1 Staphylococcus aureus F45759 genomic scaffold adLYS-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"b23715f6943b9a84bd64315d27cc8bd5\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,4366044986945560,2156504318697501,7000457640026142,7896021307777056,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,6506000896569401,5364504867515723,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,7906264832782440,3234534336884842,3662919159013483,1307705680961644,5434311755829359,7284609180405873,5378024996409363,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,6060888221364372,4034229359423638,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,3730400047403177,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,6457552004919488,4275434089636035,5392923544264054,197231274291400,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,4956624512915491,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,915883713245416,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,2345917413478649,1302574224109821,8212410875969790,2012844047311103,6276844254068996,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,1100178234351897,1613233089708314,1398163635020061,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,2968451845775780,2246725717416689,8952362163265966,3299864180793775,7745961481458097,8055901273809331,748884807066037,1161869623943606,5347282112979384,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,8153231274774995,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,7121473852143014,401948343550438,2462394055594471,8940994346209769,726621958005230,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2629375616291319,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,888109297701394,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,4298859764904490,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,2591352585302612,3677235441902166,8774502673891428,2499002377216605,4888768950592097,4284868748911202,7016685056307815,7180711155708520,8074218591388266,4363284863173231,1951053797429874,2418223084651124,4891494248387191,4162813093515897,6047329894011514,8556996361134716,4194303986672257,4260895368577666,4283429268783211,717815503766149,2166267691369095,4658866579997320,985997338583691,5223980807856784,1430121092358802,4627768844518037,635178958910103,168049742848664,2877754653855172,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,8821595848045232,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,8982624997245652,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,78000814482148,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,3950687240408887,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,2642347481506640,3043432314913624,6709902552658779,4372354774635357,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,2413571986957173,4845781658317686,7509411440202623,4117238218216331,5547694202340241,3220718305670034,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,360504095483383,6177526526477266,8815769383846869,8794208264791002,122015909989199,1338323295265756,2994560223626205,1953886652294111,3428447854789601,5274301660094267,7027985096934380,8216853956002797,1625254992364527,6176712354587633,4752895990487891,3089495541412855,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,9173197031722616,3161510797841463,6664851025699898,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5906462950118488,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,7498960818033784,851815340897403,7973286791894140,6432046918378622,7867843017488576,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,8934811836040339,1890986035680404,29860417139863,2086986011604127,7190948106835105,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,6676116454906435,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3863448372494395,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,2864627209774636,8427394283750668,7588963357979917,6152554647457326,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,385907700483371,5728268182717740,4911190400468269,7816698054288686,4110401245517103,6261672364234035,1336059428508981,1618472691987766,2262947123078456,3333979680154941,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,980192377581737,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,6833222729797864,2952168537830773,391700864198006,8535608270551957,6713487310972290,2218257629603393,6570381896951176,1982265176835467,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,2733901828191664,6101035983073523,550323193349556,9063963446371766,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6445091345761787,402247873566207,5077643932915205,9086189712409516,130457181976075,4396323642545688,1603137902355995,6141646980806917,3517221940119072,2376738954628699,2850576000013862,319524505622058,5799343132662063,7502333181040182,4620747332527681,8068985491437122,7476293558784267,7530221302335046,5907535925622345,1106191012378192,7177077991245393,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,9189100481070687,2338670647686753,7493001730442854,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,651657068725962,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,7687077436237573,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,4859866816269273,6497917926444676,8143513944316657,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,5117258784737064,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,8059723177205390,5360518378600282,3300357632857948,8617233707472737,3843618476357477,6990130627200871,407494504056686,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,2266518188165352,4579041725200255,4607325484564118,5382715700053894,8245677561885676,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,3099173012382705,6274847488566940,1800517128877994,5300625464223660,7687547568949165,1586163045525149,1351605086977997,1299923441830899,3086808181540789,7046481273812920,2382029668347565,2009369612101575,1229878691049804,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,1055754057562072,624885245548506,153369867168896,8286237998987231,5920383623823696,8214132091116539,2783293737744357,8189536530413545,5476876315310060,5612209855076334,9044286231537648,4725106938598002,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,7845638252759060,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,3404645514262587,7805354275301657,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,5090934684186756,7647986012981381,1998211285457031,6247490209868140,7821296065001613,2893765109098643,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,2736562014918845,4034678905878720,4370251230234817,6547833949292739,6585493558229191,470023763785928,5902059711862987,8523349380506658,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8292970583906548,1219768655680734,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,1290139896432922,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,4363526816403428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,3115016475949391,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,7710190343358828,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,2098062209071580,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,1912994901379617,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,5935630862422453,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,1768705500031582,8361022599817826,474326943902307,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7152093423583475,7505984773102219,8603296405064333,2192532495772303,4909849541008029,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,7277156913728206,3275110843738415,9185892931558825,5402584754821847,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,4952730055523057,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,7604479172066058,2760855083342295,5791949031062287,637717087886096,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,7088305201981920,8711986948082498,7467931263134177,1203079434555191,6821187116937698,4133002593487694,1863456533297999,1635651637476176,3989388368871224,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,292057775278959,7255001061059048,5424923310544019,3408611869207412,8441358375734134,1164683235056503,1239923617995242,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,4360520181401411,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,1169438882554352,6086204123819675,4797301698399142,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,2413290341751739,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,4461197842708983,2350571174063052,8647056119409616,6899487686306776,4435153645276121,5004638558784474,5320260141112286,6672925459491813,1082376892709864,7583446089837549,7469817883450350,626168875564015,2573596889369585,820079529219923,8045422011980286,4704429005052921,966689432144890,4912195048307707,3048526863073449,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,2907874448857610,5356878132681790,3711070083308612,4882578364685381,1287098760653898,5675714913627212,633105738161232,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,3028319556770914,4926861423238243,7390098272967783,1960247201090669,510436895563625,7266335543571037,5520592147606656,7293093929815232,3128705817382019,8158821542825094,5256643637594029,2669250979570882,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,1238619339054246,8494210442632362,7129634646088877,1515192525290670,1513303246449841,8875968855564830,6086409751379126,8707651019648183,2771632487820472,9182108430318780,5107270389779645,4632781860469952,7986770140512118,8783786815601862,207892688386593,8197445232532681,6046314350030026,4803260508523042,7464689979698382,1019530360671445,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,7897782769245419,3430108296223980,7666194411646192,1378102746791153,2688817209527540,8246219929334314,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,5000612806597850,7858357380701472,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,307559265400717,5699252652330325,5890867670273372,4856610212101475,88437141712228,6204666995137902,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,8792974406386243,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,4836608690859249,6550313765640092,6403894935227820,5926443562442162,856884970847672,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,7864494568558061,4717078305738226,9088616725393889,1541930783479721,8569995544546809,3152905102806522,4285562358224810,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,8205328358469135,7906524426948124,5816011168292101,1185378970902048,835582845963811,1345534315535910,6675258019802664,177161577352745,3700712461854642,2361765179657163,5619546432701021,8338634504957489,6930698324287026,5679039857864245,5168981785230906,8453583119834684,3401051871010365,7906973945146948,8763164838227526,1059006959607370,1993005114900043,1251060182680162,7682210448059988,8497320404037205,5580264614796559,5603043202166369,694729075228258,5862755334909540,1286345701920361,2407556246797931,2069399351119471,8084476987051640,6355524819209492,4907233847361149,4155506935291518,701505411436160,8204114985614978,5587667073572484,599196216102534,5643554321571463,8293699458965128,470083491171980,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,8753212753235645,6133069365415617,3555666348039874,8660225691913923,2588162975686006,5816608308592328,2300314053840585,8728167376662219,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,2169107663986396,6128252439805663,6428061299113696,984499184574177,5500657232277221,2541091443550753,3834083608280817,72583097564915,7041236094631668,3931973464080121,1553419814780673,3155522989727490,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,84834187095829,5490276726882074,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,8910676381798199,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,3429891841847111,555164866154318,5640100560236367,4050500137410385,8920696233860951,793823372574692,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,2427434620065085,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,4494558117785472,2569719125127041,4848772203458437,7039911616343950,8599745542954899,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,8003607871717311,4918384395505602,8927309108653387,3997686878646212,8952951168884682,3727800611913675,379350842564556,6562173042917325,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,7969431343923191,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/b3068619013f7ce1bddaa4a67305a571",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001350135.1/GCA_001350135.1_8490_2_85_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CFLD01000001.1 Salmonella enterica subsp. enterica serovar Typhimurium str. DT104 genome assembly 8490_2#85, scaffold ERS157242SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"b3068619013f7ce1bddaa4a67305a571\",\"mins\":[7667242559123457,8832940841975813,33714525184007,3889674188935176,7149019143905290,3074685262462990,7020060309848079,3348913372110866,3449892164485139,3666544173096981,3250417144311833,841835917180954,8909304950004399,8644094218407964,543614722584605,6652061552234527,6426478573129761,470297017143753,7567752747511843,312543422750757,7653629477826598,507824480366631,7529431108581383,7858600439742511,9015801892982072,8781245490012168,2468692223627314,5348637647970355,5524082262343732,7547465771229238,8981126744596535,1532400603127865,5560402654953530,1086732900704315,4953237476569149,9099768538697754,8663660378956021,5150220836593737,7246535767870135,5510921714606156,2228149444509773,8373700698808399,5596152345821265,2653031016516963,4413466296205396,7699437898006542,5249095421169750,3566771203805271,4610790027702363,5951872424226908,8737067013126132,1087389546942560,8366619061999925,1041656748867553,3046934190174310,580002293616743,5258182455595114,8152600702685295,1172408151666801,6024992530792467,675798713393268,5011655231045750,7018227477992809,9223118495385181,1160729994289273,8256658137195412,6903209903747195,7616855027036284,1450361857089661,3478924149252223,7942717148176857,6504151754403971,7663983071755849,6973052897427592,7941175384120684,1118548040110219,3048697703739533,6862983510023455,6231973802160273,6295282781630610,2099869908435091,3220579656319124,42268254855319,3931994430800026,5014972273836187,4657657665306780,2996476514086938,1380881938284702,7023088342458394,936075973243044,4138536396356294,8845468004520102,5727664683118761,3981595702952107,132955391762604,1329129177767965,7055386585301168,650551306137778,2315390550597812,7301288408412341,7154164731192555,4458146038722747,8982782956413118,8400820012121461,5695311937183936,2920441813536962,391705246093507,7482507566493892,3920674891829445,7298615495521051,6417618610426813,4640032178831562,7729790265782306,6763953629155534,5717435355128016,3452273148465362,8927506911707348,132263687037143,6854210870993113,4440928227737819,7023383739617500,5682379950731488,6559427145941217,2421205544034530,6463800501988731,4466484413501668,8258305578123496,4841648755024105,7252117632917738,7323291230337063,1581957821534444,9094472384897995,1969290438471037,1307173302747377,2715288886305010,1184730021462259,2431850801565940,7289279608697077,4424877218406646,4825560274542841,5292832353345787,865865427378429,4924354120085758,1004510776971521,1807491613298946,8152503429396796,2250624551235845,1156158785220870,266407656232894,5864776072421640,3464504671396105,1578988311843083,6078599883735308,428966940319106,1142084740630573,3011652750270737,2753451435856148,2313840849371415,8634023067414575,6030579112674681,2420917941133598,8594519943042437,2482174234779936,3900541634150689,893970498412837,1297425988411687,9205620099043624,963704366062509,2512037354959146,1155664869794091,4279616639930668,2986434217500973,6924364082196785,7536866137167923,7662007804002612,3021391463772469,5440312139134345,4616912655536440,5675901661478964,6486366560624955,209777099018556,6404007857589541,5690135547568446,8030581497893183,7130062024859969,7504910951010566,8845085927907651,878547042783563,8492953013231472,2207550833701200,3057984860864849,358472893305171,2784447813493077,2239467549997113,596173146403160,4819275655426393,6915139761246554,4628636252754269,6391180946272607,3854093525619041,3335603402944867,6284824850235755,8474700753287847,2464279016109685,7823512286564722,3985105948242291,7109926634643828,1794452093776245,2760225684802281,7664637125124473,6846520126108026,4808857808662907,5418417637122430,5133649707032959,6738942595015040,4600723580223873,7309197632105246,4709752988127623,2629446602621321,2095969561760140,2288712094724493,7022747690851053,8039963334221208,3888981362831762,907806612451733,1750192293802390,8122845796864407,6083518858314136,2478756357808879,3614784003117468,4334174176510365,3256840136970655,5438984015157153,1308466320654755,4578214137905572,2421660401136037,2347551799898535,3906101247312296,85776855069098,6288016948826540,1932222325929782,6889719627880899,940213145788847,8722358232019376,8620242805401399,936168157114802,1027644789920179,6553394604352822,8183538931127970,222518498161084,5067407861301694,5375588973632245,3392660871418304,1265001215648193,471720962580931,1801266594124228,8361403304006390,4970899479007687,4864434125599176,4645519556905036,1473107342860746,191913654223307,2748361177846220,2922225705398733,4038398964289998,3603904732963279,114474105471440,3464476123365841,4906984463589842,1686827846148564,696310894365433,1164558456426969,746463714382298,6739729734332304,6266956533993948,687497605399005,5512520582316510,7983825673137081,7962500072292833,8559911958933986,4643719559987683,1294946232029668,2758264492147173,8808723415326801,1046687379259881,930872963293674,8701922676152402,997142266790383,5890424155301971,8713442385643074,651565429694965,966058389463543,5416133514588666,4411291880649212,550993955825066,340293622497790,3583119003166805,9187081215549952,4095732096184834,1404315542372867,996059339366916,1143446724145671,7731244410036744,6077713026503179,6056006527742477,8880291889525262,7502222724588047,5870545779999248,3344652105929233,2410193198547474,3641283523318531,4691692328538650,8207992784237083,7289601377673757,4877804934132254,6778040699322913,3204064587711011,2521002441265700,77528570188325,8444411046870449,6509084823900717,1209885410484782,5383196484416048,1882484501008945,5138493665624626,2300341877760778,481393158509118,5602349287350848,5652894743945312,233642889462339,1364896681673284,7890913031856711,8635755689570890,7246012776379831,2472140177142350,8482136702620239,7599602189782884,5597608394555986,5184746924267619,5575178316472916,5780427990733266,5284633093022294,4872114199741015,2196089090658907,4914140971938396,2812912326649274,4818858557407842,676744876192356,8319220080893367,9039455019639398,2336312330912359,6757364267516520,634502016692842,6054476545831531,4250308158407276,3029375299605101,216194601009774,8131742137712061,7336668602782991,3363025795113585,7425176196366962,112689236447861,7940050763817590,7189296086766420,52614158455417,4875573707653755,1724570649657981,5311467358931733,1374908026787264,8639849475287147,5917500673159812,8689212079665942,2942332323517062,6643267600130695,5103956205011592,8029245432482408,2538368041894538,5121175980137239,3723147829305997,3937952959144590,3073272315818639,8940528804162246,5015838702185240,1827317143739843,8820099366415694,2708478246412950,9100335799808663,2230754738045593,8823940150738227,2288553949987486,2215385946845855,8293247778134910,8540956756629616,6865362483176098,988496938263203,8775786567608281,32720583388614,4062422159663784,1596039444300572,5647632053756586,7941505729403885,5450101883642541,7985291668736797,6518181527032499,9152864094315730,6956363384945438,225487003730614,3750592720011960,6965728988614772,5470443723825951,4492666399863484,6373218733589181,6187691588069493,5356814370709962,687776326775490,802764168946372,8962006973175777,7398660690057199,6093675648766665,7034658147467979,6191577713985611,3686767431353039,7803479018064013,8655401750617715,79007152802595,7265214886344676,7406221699052245,4015601695991929,9095087195456217,6144407359025882,1869784025006811,4344411177177432,4983272580863440,3711510044373730,8098156786893539,8581032561058532,7551743307844527,6406337245512422,7998852131324650,3051141314798317,1348850511180527,5141715656196848,267301945004785,5258379395965686,6016797759187845,2663375620636116,9208260689028375,7475043383083135,7684691808027388,1443836017558269,4940717972017918,5639677545229781,2991609448162048,4757830880039681,4928544909193986,2151652043604739,3398775252067078,1241020761522953,973973028467466,566762934179287,3598712915329805,9156501451643786,1668972437971727,8921779137787352,5403432104702738,6609712885261075,2354873927861014,452975526679,7145764461134617,5915543436481327,2372682746946332,2735525072057119,8187312762512160,8747232437494561,5945995850982178,7492539000721609,4071866172175144,9146065559510632,5579773940218674,2791255665046318,4828795254633263,4126004650177328,3519667105339528,5573259592626994,2761768064602931,6912588088828726,8730345418511159,2741131907953466,773401014911806,798868643812160,7506074640391648,4833368247124802,983002602214213,2786959693398855,6895359992447771,9043503077340766,1798831352435531,79903962743631,7926284395672400,6533851262128977,1152732163576658,6974361000604500,2723240064279382,2545185923302231,6933973702869849,2608945270502237,7183877607502686,1257483184837472,1695999327093601,50236427273058,3620747251446628,6134002501714791,3418771147354984,6309949354548450,5470905645585259,1235250000454510,1314202262917999,2082210848335336,8450737700533106,2128438396523381,6634422979384183,4839816082785144,3256915863896212,5020937611150203,139974928528254,6993747831354810,4520272609932160,7726114096026432,4222562474337154,1487675705533317,3094912929248134,7342712596759431,3220227803063176,4822719302087561,752402452210570,5622912960534679,9154250055621450,8944160785390402,548416513213326,2162319222162319,7253121883555476,3048716174910356,1512659706889110,6963324990600089,3764174567576474,3910093462762396,1159544424768413,2428308208534430,2266490915889307,2316278106239908,2417982387782565,3648138902647718,8980657561393330,887173487123271,794562638783404,6060333225833389,7627487079410905,6071674841031599,5784390038203207,8851636510629363,4409092478354356,1475614523524021,8619431967474614,9070563492909842,8153523721307064,6111209949288422,3336605611099066,8825010094887869,872408159298493,2552156920112062,7464819275826111,5936758195385280,5981719669089222,2166596848387015,4781270823064521,2034367156126667,7972238557078476,809582485537741,6871151417497801,8504163723803469,4356116346651935,8987055669077026,1234295557108690,8340405120926676,5432334822081494,8524515802033657,5531473759649956,4688507946681307,7392154575315932,4447216729056223,3714872826934242,871709577090019,4801531112670182,7869360031254849,8849879366800893,7488866651544602,7745030029657076,3829578382779381,859476197024761,1768313843687381,3852446477775867,5647799875933181,1057165550396414,8078731081382741,7188087425274882,7136741540824068,894273844724744,8613803161537489,5972151396851482,6993319233956695,3602730159604748,2452264918451215,8229225330563731,7691162001838690,7542663025439330,2314307504759831,4392238843962392,8827959327845892,8081470350595099,7993943754064925,2860609327584288,7580535526937633,8339334594753570,672446842483748,8435536335704343,8349950503662631,1606637797276508,1309199382606891,2037723256721586,8272174740988976,5469193354794504,4789307833095218,1540130197193779,2358826453988404,256280713643061,3174683943007286,6246951338862089,2587738075083833,1464620563891258,2973437097387069,1328190663705664,8837176724567106,2090172305962053,8215700619785286,3191909348848711,6640974421730376,7870326325810249,5757686916252746,2101773243126859,13661764940876,8389453148570702,8371918168690679,8459996714603601,8805606348729187,8329635154339491,4222079261377622,377384294933592,782861886403673,2413403248510042,7101092222580239,5470776088650231,7858486086812765,1052977930028126,2672723891324281,7478166707397849,4857733530797154,4898743076889703,2053365821274300,1000837698323562,468081270490220,5267119911036014,5493851236582511,6666623700743282,6341241357210739,3216456733926519,24788755838072,7766662540512045,6395515818955903,6478693324941504,1963721387209859,7452288980348425,3164368610071689,3691265711428748,2658354862584973,7610846748320910,5746299957933199,2418637221164176,4146651274744977,1017356947838098,4927935705740437,4960581277549718,3176775879189656,900162075620506,7631417175467907,3617794764493981,6152479066919663,3149906855916704,8464230606165160,891472737961131,8592117037647021,5534376381355182,4921694918354095,9111450430051504,7352387090567016,6980401474429351,5822885168302963,4443544544104603,8265382876435637,3179806037963958,2623504852497591,4921672993346744,5183762809169081,7654755558089914,3161483059262653,6115813926307006,3716937611392191,8838522650569297,2790478672393416,5103163479418058,7676374671344503,6060785987921101,4352264832251086,920936172225743,1662526682375377,5742398999278802,6617779675137235,3287313608705236,5479017872466809,6066866288050474,4021120871982297,2168780196898011,2777033380218076,9004110310310837,2554492164353573,4056976335058144,3036570263229307,1819033329496004,6601495938585833,988828717782250,6515308128892139,3832739292545234,5308263417695623,9169586316342782,4691498178217202,5366511980242163,2600419368797054,539261405611254,8117664457475625,2215773100217593,8186464642409343,1978166079468797,7483380998448382,6560210596812032,7003518955537280,3845889825453315,2689640009000200,498851395814665,7000171664606352,1502873804653835,2855426982749452,9154247953757453,4820100822807823,8519717240329489,7784968786531604,469614924858647,7966447785586889,493622072034587,608678462596380,3266410232453338,2053245964989727,1667613825422631,6472412795471146,1322574410237227,2636674965853746,6839180700435758,6726714915592413,4363884157567880,2858050529764659,767018547668276,7494778308604140,538922793293110,6802845121622921,815968354379065,6781576977846677,6381788502875018,8597758869190197,3170965927716161,3222734562379076,8335957492069703,7584009381496137,4113101791480618,6798921647281652,2085025958012239,9153528767976556,2844732429186386,6605125460456334,6985867287209862,7393605276057828,3608164999920857,7109073690596700,33325482419549,7218956333729120,3545289693836643,5492219873251182,2638566291887462,6258504989840744,1518578390623593,8035649242548660,6441958794682489,26717466207597,8931368535989257,6523500184733040,4372807575288040,4884572939515250,8830186710233329,3516199574144375,2349567300653972,7883983063356795,6728186912397267,1101365094035008,4374102553560450,1488182483494275,651603508020612,5046549108106629,6483170352495664,3601540529979628,8867481726778263,4800392856741260,7900349104219533,5689072710702478,8732822431732790,1683568732190097,3514751407928722,2123398462346644,8389710985342626,5048928740443544,7055107521836441,2239720589739418,3713333490394523,3591212387227036,8414742353659293,874306321245598,4911422457988513,358565212403106,3894747631117733,4453036770313639,5000726219244968,8737494948546981,702065462568362,2227481306654124,7507799825498354,8350554160662540,6754270791711259,4252928194432584,338031841936818,8764898673030582,9256413976137,4348508294940088,4347967997023674,7407228233150,5254607938381247,1546197868676544,6752275299386821,5398417781896648,2788599090376268,5820795079153792,1883255014729975,1650213179831756,6773037966919117,3964646268257743,366083847570896,4467021060179409,8615754678904274,1157923615327699,5836521522128341,8929331168974294,3332708485383639,214928036955608,1552434896567887,4342464695952861,7761707923056094,8077472501913055,2257557249238496,5762248554055137,8451615345698274,1883337584244195,6830305427912164,3703190419827622,3613476809405927,3283628392613352,5524793717323243,3788885202019820,9152852213628654,6594829218051567,6807447181351900,2128808349279732,2786299327542774,25043460490743,8124889703486973,7443904670160382,7242783762130432,5752677422822918,823271298483719,2182079777469960,5897682840872457,3211080715523594,6226695216805389,9122508703573518,1670685532400557,872035560183313,7936960859923987,8709412136190894,7093807022224918,2232134182671895,7933058750323995,2062747392960025,7054749859827913,4639374453995035,8095248902506015,3567103089776162,1980107848689187,2422170018448932,6115257530426917,3088193999304230,7712899375969523,7270114471530868,3320126178838059,8281486831048237,229730930722351,6709796999637068,2896563856741938,2128604220796510,7602930519402038,4053125750769207,7962448127673912,1599652791162426,6910476868240956,3516481418544053,3715242293294658,7328014713968136,6464916939101793,2455948336809545,3822953193010763,7094303869460066,8983229070607583,6213635920042253,7510650862213406,6029898037139031,7081314123486808,4741826496558684,5305547338904506,8907873749530206,772463224850015,911058900388112,3950809959908962,7101997526506427,4945869523662436,6954781700884069,8007402726123111,8181401738344044,2046649241302637,7416514553471687,3920291554035311,4013295382001264,1673050334832241,4472440995165812,2248842372953022,6369696787084918,2329319645619834,7056074749026035,1424416469948371,8804202034652798,6380302367008383,5589625793328768,7012776745531010,9097501646935683,8148649347528399,2408993248683653,4275358506759815,6330150343472776,3251586299885194,7694331219583255,8624660576636409,7535287209014689,445333053183634,8317888860350099,5466087268333204,620844115920533,6876242254722710,950873040090775,1760823475619480,7186784560308682,2544070559975023,4586720274589343,2949897356947056,1964369945540258,521191956194979,5544217123911333,5086700650174065,4565460888479401,1657896321967786,1966029162698412,3090491217254061,1465483891283631,2644767429723826,6121314243708710,1209073613719220,3964901725763870,7999752365477327,5236796214636844,5128354617677496,6636136791344825,7227235844292597,3985229469161557,2175217154575989,2106825039062720,8422121531860673,8391544360232643,9085846138920327,2896715108882117,5417091227105569,4407834142164683,561404979717838,7845899009334221,3465624308655825,8913191152658132,4857157896107733,8967579758163370,4114752204367579,5360393208252128,6919156008389585,8042385315538659,4140826588067556,6897277844240101,6691692128442631,7552727705593578,4842591110428967,7164899059689198,8739850545337089,2869975832904779,533509815207667,393086103742197,8614894794172713,1362251832837880,4688264423161,1697392112133883,5033731931457277,6100220424144639,8690713741256448,8033033516541697,2766426039513561,5841693726925099,4211730115966724,5339962295240453,557432720008966,1991853601244936,1787347884196140,6557797094194919,4736256438204172,2874501914281741,6983724932577038,3539105648775469,9077342842191693,5829322722346769,4448483657553682,8268120286951189,1290448240297750,3646436239392368,8653219328845594,5099977234687772,7127777288072154,3591489497171742,1701932527531808,6278955061215429,1504829324158755,8778551257714310,1408255433402150,7238110203594535,4963108237248296,1240066836596521,8123269404845704,6006913746245419,4608157651699500,4027944642979629,8505742885010293,1824921467086641,2847759945615154,8084343777403337,6429776601063579,4176217626351413,247623028684598,4978929370052407,3581632945383224,7897604301570356,2022807142803258,5267795467916255,7996209448671036,8856868821143735,4704893258154293,4039079064811328,3857916781078337,990324661733186,5149732944166539,4674561936136004,5895348954294085,8807413122725702,4523652479788873,2325087454635850,646710295549771,3208220820035404,174025380063053,3493536856844113,630260428662610,3619704864651091,4058056754018132,8887928089925461,6792154760582998,8769193780307802,6379665254958942,7464474036447073,4742902463605051,5239204143814500,2891255687486383,3912454320707430,6107690259992754,7517322524010345,1309029966022507,2734910637948562,7527103004718958,8210708271458159,807543998326640,7573883049879410,6690127582099317,4198161666090447,2273838361048952,5681619792840340,3913081756628859,8513165716478954,3132925813753493,7135138689866048,1965371690703851,859452633241476,6522369232711339,1969983725987718,6596611524012353,7348159461862117,6484895535842967,4621666960222095,4134027119716240,2864322284312465,7698339915577234,960739989321619,3768676024248212,3852616135219093,1388300688154265,5876766461540676,6363344116971418,8776679386799087,1762143899301790,7709178769450911,4317306224113568,3399529205359823,4808187977606811,6363418012968868,5201974708189093,8178733033453226,4557177739372456,4814106041388700,3977407856338858,7398737924419142,5650354964412333,4885221735933870,1099516733503408,6419511443364168,1254267278784439,3054458686924734,5168095931742143,4865933837871042,1771922784188747,252133240330180,3292641942136774,4500582573676193,3220401156708296,213713219536841,2618814530189258,6510543560293367,1441494353546914,5263816100559181,653591075397283,1044805198452692,6609894173665238,6448080537816057,4521787215851460,3714562604181466,2953680235952463,7956813340698590,4092171006515167,2388146285723984,7422386338265058,1624739856092155,2428235422771172,9204653125568485,502402209470438,8162169518446571,7089899230480365,2436938215679983,7566987481294939,1817116200644947,711625844209652,6615289970508798,6572476717303798,2209075498903544,7070606820030457,6371559945058298,3924585430480893,6757340653265237,8804008150624457,5461642314091520,6514010774400683,2078384878950405,3909344174680070,5254879555438599,7501209511493598,3270023758649356,788509388883983,297717739503960,126590754007058,2591419040606230,2712603419187223,6978571046463512,2838365919078430,7069137364666400,7368375630518306,3194265969334309,647747654678567,6379431794846044,6885791500404778,542332090869805,5231131468531758,6275495927115543,8641319291096072,3927327479265331,5456567116912692,8080443739596853,7681344302491298,1992590317054008,619222914013241,8355334793566268,9151998028335167,3640538450647105,56608669681734,3563816715010681,2226956289459212,6839209387051082,841688988907595,2746759931082828,5778378437433422,1834966470621263,5077605192575056,4487384124643410,3929296231371107,3214216908011605,5541610094812070,5469901770803288,2293884384790617,478859136141402,2426041499756635,4874904316303455,7661250562885728,4427809097721955,6373948582236417,6709366269492825,3728968143865959,5437966500200164,5258637824211051,6313908136298604,7679690893620708,5307790263044206,9014852035817149,6742330448062576,6674461591337074,8972197871214536,4642336363096181,4799176339216502,1297310859131001,5494529873852538,5106999170435195,6957668849370848,5949749411465342,567656662714496,2925276112783490,765588721019016,5943693569702025,1431039489927307,3889415131871372,3453110641633421,3851755875379342,1286470239099023,563381985605783,240576739383448,3711982467758233,6519082957172139,4505213965585434,3273113800763550,1094656902413608,6762326548171120,7916022112258210,2856215005730980,3116624167209125,1911565472123049,3717724958857386,5464506387253419,8655614835185430,8085875745540274,512655358146744,6255191827925364,9159935469771807,2464828890880188,2792081300588736,175734808470560,7537762956503496,8130374111476590,1812588590115017,6714997208484043,2142322034346189,5814708524050639,8722871821014166,1348731958405334,1590983816050903,26691099330778,5128132925851867,3914714897225949,5995058603178206,1758820441692384,5275550779992443,6653260262418662,7337473510742247,5242524731693288,4167957802961129,2756050571589868,6441389764561135,3113800241694960,567624656677105,8131906424004990,4061335508363510,1493537590446327,6493604753066232,1298903626955002,7454634398513404,7501491578160732,6861804066814212,1647989894196950,4018963969520001,901382993377545,9196170655933064,8905791761032295,5175614411331853,8810441169180879,1295640808143120,1903633811736849,9162821235325795,8474239652247710,9001919699228952,9016307067255065,4860977024514330,2376784102009115,585134325225756,2435155270770394,4355265301924126,2959725902522655,2446507305564449,832107770321186,5276875870660899,3051864621504807,7339638253436636,1559964211831175,2303363406350636,7459423677113394,7771022354996166,8948072973617457,8301054501677362,1839335770655027,4209840609298741,4723936623815049,1128251921033531,537468527651132,2113964597550799,7531348323445055,6622713792518813,1185710905047361,2353045636462914,495957856627012,1654921486394422,636508945398088,1297876388792651,3239259912923469,7199375808522574,1559264567765389,8482767251781347,3567542418389334,2557360395654201,4144480892479833,8558510186481575,2677254289049948,6715524253711493,3992050605562209,5342369863289186,8166484168641595,875588512434532,7258410441613030,1940437104961894,784658345687401,1274201991285098,291439063140715,6422898244524400,483348184811890,7291735679359379,4266642012678516,3341507944806773,8514999855516023,4475489118169465,3217409610930555,1947551580498301,1093531385153918,4922365850573183,7442420044879452,4162418930272641,846945486218550,594684579641732,5849647596177798,2248768132221319,825220776753545,2534332855884172,2560549024704909,6311380195694991,1424643346762131,4197490382637460,8329462250333934,5886067841362327,7700168234265668,7888121911941436,4008786844260763,4640116648921500,3347474192042397,3488929672001950,6023108566828101,1506067859087088,57426026727844,848721535216037,3013362941720998,5197256242571688,6285124191289756,2337907999791530,2577254551016519,2087057658268076,6786094656899502,5690622287583663,1552476916476336,3830459211737521,2833973578062259,2636984404527540,3198248464791992,1351499112233401,1072301753059773,5246312295995838,5643240862239167,1795544633412032,4115262509640779,53585049435959,4666726824311240,3996843992381897,3159701697063371,5623588597438929,1778242509294034,8617033189149140,7015790396824026,70265923824091,1676796340160988,2682052126726623,5264418991348195,542505085303269,9211456307419623,8126517757397481,3641000276525479,1421602687768317,6190818471786992,2041544847788532,2875834899487222,8918394810395049,5530171697910186,4968831734237696,177541966998018,3131722725231109,3866479640349190,1203355550243244,734190807951162,5500803861051616,8511422563445262,5032779958839823,7292063695995992,1362058257287698,5925563678702100,8297307844110870,8828143227951639,7188108996200986,6084563426234799,6452537248160284,5740302599832666,797327697349150,7706587482040069,2696760442509857,1563338518526499,4461391563314950,6295767261956811,8796314743239171,9075893912813160,3647883477260844,6661782660729392,2955820541246002,4321577573481013,3325438374885129,4702122660497976,6375221759576633,5399402544327226,6445941215377981,1868723269585470,3842524200319551,4209642825718337,7175491926800962,6708416662777611,1090196750293572,7415876291168837,5109677343119942,8888762566276982,842840628849225,1134815337515594,4517013077908045,6600018023525827,2756978422852176,7195380304001617,5538930468178514,7829090135300691,4343099789789785,8715299787358795,1723841151044188,5256529027021406,68860408343653,9196123179321953,905695458785890,8802278723304036,8720638795865190,7078612381736358,6173816214542952,9168492783108540,6317547516011623,6905166401787666,5654324650715759,4211942889996803,5125200885148273,2803321859840627,7849893361469886,8485871005645430,6477809343277687,5962973093775993,261926228597370,1549101317642876,7706045317739626,3834556389313150,6752249944660607,2011206057509312,7029583296572034,8207757598399229,5238815189355141,8310670263581582,1033582737816199,4363046466308744,8784678740460652,6156443877859095,6848628917275278,2656519453145744,6571088833411729,6536315207309763,8857205691058837,7868000644939545,3484996857019032,3241824526826137,3015999469947546,3328578741406365,6698810453519007,816028610755696,3704734631525026,4483026856942244,2827861308312231,996104492968617,3795949646809772,7566332212591730,1716991140670126,7431910899758877,5269082233635272,7803130107673651,1982586379525235,5429272783895221,6563764341514118,2596002053130697,349142041262778,4657303421528765,6974979968207550,4552055457790656,3422892041732555,3893262846185781,257325879814854,1693196097063625,4761603786980042,2731215567239883,8203115445807557,8860608301697182,7714280745588975,8610160831974098,1440431595780821,9110095193161019,1122470271769306,3607534794414812,8906156552403659,8706805767408593,5294275793738467,5999096583673638,5900769690102225,8316523916948235,3743924128819945,6840788981488362,5321859951799021,1850587137350384,763881411459828,1669031183858421,1782862355208953,7684269187824380,324683648834301,8195563525001561,5324467964414721,1707953079627563,6747497791470341,8147439718750982,4373650501020423,3557677947017994,5346354558319372,1454771836984078,2419947851556653,4967896020359952,8562189316408737,633106053221139,4242808956136212,2587905060653845,4282459337575190,4945941309545239,1394352714119960,6277968515992345,9108340639063401,4147229481234906,6781921912881349,5610894564793119,7334034694511394,4986078173842211,5415639580687141,9219999120210726,6061877385427753,1523358345046826,6379936890657579,3392400392379181,3958671937493810,2918988711013171,3680468211604278,3987667524054526,928514187017019,1678764707882070,6288947743079229,4485742654401343,7685708138618899,8423600816339777,7006477861972802,3679862672968843,6127381265791812,3541206393355077,4112415658539847,427004963382412,4137854041434954,4989760574896971,4097782020987724,449764345883469,5755148248369999,258450410981176,4924746861189970,6854997912162787,4676040385473365,610038292978519,6774317987171160,236258353390052,9054144529922416,5226626858838876,3684105766338362,5366447815670623,3332795770415969,1844403335192545,6864778197236585,6875490626292586,4485906862390123,225988241742700,8070410143284370,5192118225382254,5815273360046959,8641762511504660,7203659442744178,1577776738470771,9013710678219636,7651493222157173,8095815471548891,8336817800761833,4118822455425912,7353494121470841,1774648604870406,7561213934209917,810343061699454,8936010286291840,3826303079451522,7823876673358724,1243051266110614,2178953385631553,2370614328806281,591788159794058,2619373286444183,21624830622604,3071602639223693,2771552160193422,7093690531543956,6297732664028053,7709598228405288,7534747515030431,3703468221782944,1087749313592225,1566846942448795,8794101093156637,623506968345510,876228623607351,6235694613965738,1915721120353196,4356857373629357,1842270257068974,3457020736027567,5329499696528308,6289086425975736,1441066174626745,5098039247301562,1040943956421563,7416259984048279,8350358619417537,1034714675772354,7915173084167109,7269394299128774,6691524686203850,2480739659693003,5351105988451490,6442802221397837,1362248611617744,613417479797713,8221340797434836,5703709372275379,4968846076050390,4538817020914650,2586260151843803,4337747795659740,6848715154045918,8762249175692665,7796793055394784,425303325871073,1246215536036834,2863072203533283,6369108943510500,575477822707537,7209752984738792,2395106122251242,2431286987570155,8125652386012140,4605274132618221,8243242683317231,3309352340065264,95299597556722,595994403097589,251991505562615,6615561519443270,4698634642103289,8985965630446586,2224695395187707,2568062394166268,2797465100360701,1957526157327358,7798237498748139,3004522382838784,2781804830206464,4251604574383111,6227845223521288,8806024658861065,6274217669696266,7184353675041803,8538085435298228,4303267609140241,7420264629636114,2651564593503251,5460472196103190,1986974037521449,2359185246022682,512954021885103,8572029258984479,6424427348334342,192709735873570,9028049747389668,992187272879143,6385224218438696,9018176141326926,1453655841397804,5502372834475056,681137258208307,6027553134767158,5434055855875252,6248287327636539,4614553361755198,6131890633821248,6069728631273571,4805170878549058,1805222612016196,7055332613012549,6380356678908729,5160186787630153,4778412181965899,942485145467980,3205542085692493,6703755820477520,7007387281304657,2434095161834578,7949151372371811,5216364370234453,9204064322864965,5207312869678167,7637673616637016,2329248970108772,8642820142817957,165543739419740,1882698016124090,2758523067989087,8587038146219107,8097302075825252,2245632752540773,5221848325364838,6481431658765416,6727004380413034,5104730817346667,1738440261762156,3906946772961810,6643780079885422,5151532885793903,4483056737496176,6044345273651048,6053610728696946,5253356284584467,3243473084419188,4975515712535669,7949008728069323,4367683948641399,6029021977115768,8053638026366073,5038483687607420,5370043587824765,7768428034740650,3571914698415233,1222138433469570,9201688738663555,9063105580508001,1757565792160901,906300425133190,4719633696471916,3302306111401099,7047168781622413,3264904395902094,8993294618434703,6813038456700049,7653418342145170,8656159261191315,8589163151539348,238779035250542,5384659971673238,2433898361486487,219447692176536,2742595427327131,5308248343070399,7003909459631223,4931290167299232,8410430701029232,1624628444294306,6341965661965475,7338650740165796,9202342528028639,1412974396456104,7418143099730460,4570022519684266,8973663052281642,7754480598850732,8631410209135790,9135944996019375,8829486861479188,322374640880817,7418545461981080,3180603445594654,6316214771743926,440709743422650,5272267761249467,8421898045016155,7164539992468673,3715410315993853,3090868502154436,7850884954593142,5177645688724679,1766863681289416,7388803896797879,6396907213450446,4636391883959503,6312287393610960,5132931438341329,7281809625858595,9158339605241045,2104934336867542,5909444756462808,1743355317378265,701724138761434,1174120040580303,8110724879183071,2249409236274401,4123245038427362,1861632565100411,2804674522053860,88259859180773,1838459307412711,4819586886008041,3213204488527083,3260711832345837,7406928605138813,5482388398828785,2731215814417654,590640550487252,6162894927555835,2562695284156226,8338135692152061,5887703724006656,7834782129196290,2500755247906052,8151705046617302,2070212227283419,8373475303419144,9066127881272585,2501533902798722,8075764452631108,7561540955954449,7241666060379016,4701171408325907,7373930253602068,3106839325465877,757680585356556,97218239528215,8504376026631449,4907041099283739,5571141421542684,2328400639655130,184817019104543,2145015248174370,3094465726897443,6188354740509988,3041125057503110,3273900987415846,4118511580192039,5183848285932840,9084508042341673,7047595546483882,6882505380506927,1470755860614448,7910149252996779,234600052096307,5506859514252597,7235665393171766,2368011617017144,4923183834885434,994294650625339,8797751287262526,3978904572590945,4328667611110720,3362713583969504,9187019953255223,5497711469317443,1306995003891012,3770662451658053,2524342919871814,5012702507887943,2362988176133448,6363903951281481,8087395110689234,4733582183058764,3813095621360973,5921953278172494,5852508892609531,7944623598202083,532759209565525,8510668751457623,8947182068660101,8813421552282852,5454684516298074,2262432740290447,897210929716453,1263700249378704,680843690051082,3167854745169251,7953805352283492,4170096552906085,8487042812984679,6165527512231273,3743961606118764,4394433086984765,6521419425640294,5747091809356351,2032666380553597,4050405426855294,9001142642554773,5704806173180480,4980337745317250,6704524459941099,6179708756839812,4907229094236054,689052728724871,6414820039056777,8936927474269578,4702819983039883,8678249936640578,5238794761305486,4595584729410959,1262772867194256,338763742866833,7698319053897106,7531895483210307,4303018541751702,8679790662795499,6439808764488766,2812252754570649,7026726828875162,1455195525717914,9081149777243962,5664558385331622,4005664091823528,603723544886697,1089622775373227,7181642424816882,5405913942736302,8998721014763421,5326318714572209,9054561477373362,4640741145730483,8139503603427913,1682428789198264,2679268616818105,642426740977084,237579024980554,8964935542801558,4458190157075701,2310932547259842,775420119408067,4932159476088261,4475498612432326,3739988142229409,8411470358550395,8420355092097573,8474289839959502,993037319900623,8041472400510418,4762036958961108,2055835598859733,2320417142562041,8557903874342361,5332383884406234,6683574890925532,2731163567615454,9123221996191199,6275239700614624,8699554965830224,8480359833435619,5783001957613029,3883882473106919,3636743414390248,6951475785969129,6176659937877482,638036155469291,8386000389457803,1821788769451504,6916496631274994,7934195266143871,3026526344056310,7139924508958199,7605883822722552,1667659350277625,1649230538233296,7922407005390658,5146953896353278,8806756602634837,8274609046761918,5158425850641922,2582152908189187,630338109935108,7440207515271509,4730025346698760,1520670471814665,4400879016160784,4243682561007121,6119824679149076,9097312802000814,4166112837037454,8412272893848153,8634687974557524,170159509392921,4166341274938906,5458247778803631,3682556719074844,3976857796177437,8360121306811935,2206896186809891,5057828800941605,6798561494695857,1030310028192604,2167397794914908,6249722101136938,1764333831986731,8795656055737608,5333652115476018,575808750009907,4379186958081588,5587264823807542,7191616510828090,5657379649166907,4193814242680380,6496286175436349,6931880560750517,2963931588390464,8006529920058635,4761478884777542,4775245094784584,1307085209765132,1886288263519818,9036021558466487,4856314515111500,3819766550436450,5097795614465614,4531440829718095,7435712779845200,3081080275697234,8974499613609559,8427770585341528,4500383581868644,80848488066650,6735424671204623,4916171623648862,291482944990815,5281919610588769,3234017377726050,3546619208322660,8600643100028520,2122484177682025,7891129803677291,5924457669303916,8688098264865867,1300654295630339,330786077326961,6091016057941618,3827052685028979,387346605424245,5846305864504171,5359003787251321,3585145642497983,6653627224608380,7588725161655933,983924183576191,6282996103773824,8789646288831522,3390516959981186,1710000774639235,4902303102066309,4321959984561798,6523600333708400,2887657115659914,408986989610263,1181330355248781,7266068570217069,2250602223713936,2750722205347474,8936252556427203,6296068729983598,6108079473434264,3133091751006148,2240124539485851,2035006005800604,6315521663569565,2754188550532767,3248962484850338,26287827857059,4317455470726821,1026377179139752,7172855744957357,3761600094219947,1256640649862830,40751414087343,5723360613174961,8954332891131570,1725652218955200,4277335625461429,8245057303801526,6754404320407497,3171002127912632,4359180529426105,3441473387278010,2289763518918331,1787249939386045,5947131705892542,8700380702579317,7659188190363330,8121748993658563,5673215187041988,3554990670675653,1297804887977673,2141455560052427,5422524323675854,5185320825952205,6154044390055632,7580133915541201,7971077281492691,5526367787462356,4364899301748438,4453708423537273,4308344126385880,2948428341853914,8762439273176031,6861649047318236,7345475783167709,943455554031327,7189924519128802,6101227314106083,779230802116324,5293195954577125,2179376799342310,1441515080396519,79217249615595,3118987320689108,161703652773613,4935736916954862,4376558150464446,4404284603714856,3501532163673843,969964248239860,210254306639605,3393383322623736,7482976125434495,2080218184591170,2930455752163069,7979780218957566,1832185633140479,5181701176680192,2213538970853121,7561407903356217,6831544618942212,2203909323521797,8066174717787910,6308643144269576,3946907942490071,5974276521461037,8225951075131152,3156079150759700,1362615270285077,744890819944215,5525188320743193,1123036446535450,3003977055285020,4135239890329373,2208300468756254,7794594152009504,2193568903298850,7195267284487971,8346616019299633,3635554613849897,791032629477162,1110619883694727,8109479692590287,6857270928428849,7572244253536050,7039700745966899,359096816385844,5450391152627428,382444380241718,4545598467907383,2997143991168826,1504556618186555,8659628277334637,4280786765307709,1251571050577727,4269687397535553,5150647899004738,5431563550691979,8608921512439620,116589162149174,4377640945139526,4751211928121313,2141853098602315,4395443838578509,1777196050722638,5815850934161233,8842166304411478,4632328774704983,4154508060257075,1425717323808606,7016013522095967,8580785194524512,3930269658365793,894657479102307,4681292948524900,1271418044329829,4061806001348454,8454349024366439,2179518653603688,422511308312425,2772152389676907,7038403765708000,2318304048316270,8761588900390205,10488238202736,3723937100369777,2096898035052402,7423169727770483,161079824404340,1274620100427637,5855779389325177,3085149344263487,8961340170563452,7007797886193533,1085109307207553,542070582267778,1978631044820971,4470924445011845,1206211162570630,352594963991873,9004420450410376,6687712988946313,9091339809357706,7040022769434507,4302073354706829,8817294598954894,5036798356324239,3951151769940548,330922710986642,7124671579803539,4596977725284244,6929844442427285,5057533782544278,7087909241175960,5099225536774042,5185292997025691,4157036191099546,560595737354143,4119496559112097,912864977850274,4039545094061988,216567535951781,3895255234408358,8974838263099303,4017557037637544,7285281755504556,2446448248831917,6973420924260270,1756687539404719,190736261057864,2568568963432370,2785338889383859,3990411502493753,5716179479281542,8644602754274633,7139801138402237,4957775544318088,8348394730450875,5806282386102212,3917053492559807,2383768404176832,2003627071083851,3125981650808772,1754953295925189,8562467736125383,5343561945915586,3701757881196489,4363130678030282,1935543794859979,36290201018319,1188886142685137,1949512905760723,9221614859934895,755903919173589,804790373657878,4519916921675735,898690320965592,6317814990861647,260454121447390,8026239390152057,4022759826374625,8752406983647202,8570202458542052,2135660434272230,3148414190718951,2437024342700008,4041186263318507,7925066249065882,3837588723521533,8031001385329962,5464815035281393,3901242407296026,7660657009844212,4859896893792245,3085856755960489,3983779111653368,3490271597518843,7516778771034108,6323466335563774],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/b476935e55355147395b4d4ac5c7fc8d",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900113105.1/GCA_900113105.1_IMG-taxon_2623620513_annotated_assembly_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FOOE01000049.1 Clostridium cadaveris strain NLAE-zl-G419 genome assembly, contig: Ga0070261_149, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"b476935e55355147395b4d4ac5c7fc8d\",\"mins\":[1194380906278913,5238084455043074,507418363920387,1572596749451268,3909313777696773,7000847067578375,2203445561408855,6532278303059980,1865565352116239,1458167383629842,5173709662154755,7353509130113045,9204685659955228,7942452951341049,1265124098699298,3393065288761379,4192700505137193,2179586987225134,3348394421268527,7771885536050772,55257740382260,3328521387266102,5990763617771575,6078352290607160,5922351096897597,8531108840976450,2553871738130499,1821695674884166,8922935207149639,3050582467973199,6174803647979600,3420485828400739,817062921441367,8152521727483236,63821379354715,7680979588243549,422670140387424,8221143153221729,5638218660913254,4777645075746920,7017898770776170,3803221521416210,5275820514963569,5257366058950775,5587776168652920,1799962114949241,560316190253178,4238258104258683,9148770883186813,6182231110619262,8436149296455810,4757117400653957,5586740223418502,6439031939264648,7786849828638857,4721222612021387,452199216529551,6654268643295378,8163754868928659,1723005435289748,516296679293077,131876715655321,4917792460337307,8880054905168029,3321155791503521,1219139557351590,8028708237549735,4164957655662762,2077864022286507,3831102485684397,71943507090703,6264053987012785,8098502316613814,1805775059683059,9062908509151095,5375750788882621,9207657071369589,2897558836101312,787075899905724,3065428835815034,6515784369123532,7302879221883088,2307842204049618,2730364959125716,5464188500971737,5041679368224986,3527356520456412,5547795401601245,9060201199296737,8313338616788347,2085302412787943,5425574786928876,4097836332802770,3861860407693552,5454140490125553,5832850475973331,3730286176796916,4975301370171638,4318088293390377,4076697558278868,8305166913339298,7272382321778944,161268864409857,7557220496949506,8109789572935943,1610659255529740,2010387547747714,1599946638663958,5570895670788375,4459551142871324,8931504336299976,4808348310532384,620647169114403,2492503389122853,5674123283558694,7374015747686695,812425477427496,3232892533006635,45539103527212,5228553531267123,7638406021333300,2220839920170236,1909924358918454,4056259222987063,3832109674021176,6467749318885428,5870140273852730,4333821389005115,8167468035420477,1787276958535999,5196601962406208,7221576999190853,4714806448984390,640197789176545,7607300452229450,2988928322847051,2684102567444815,5234752629743952,842209709400401,8466262812356948,7059652022096213,6943699724231000,8907672914135780,7221306328699226,526348939571548,3496999089402205,1283215058248034,2895273946333541,6896490867401064,4588903779852649,1911401963020655,9117579697652747,4494252873474420,1949622226223479,6168378356998521,1479611777708411,3036004056625537,4849670863991170,9208141816685291,1801912261186966,3029371608191724,7543301740753290,3815799546200459,8606730629697932,4872007490625933,1013284132336014,8947294214718101,6358744876695953,265710110744978,6343539918852163,7602419495619310,1379983651103126,218838177251735,6679246759063966,2355458794774945,343636933919146,506517665310109,6710645801316787,5573424687010228,908378865004982,1117122890285496,6647475264328135,6037487959888328,5272500589414476,4158878928847306,1557304809940127,3513419241939405,5078241062728142,8634057578623439,2313040916988368,5939037566128593,8456071875158482,900647780266454,2322980446573016,5480098145378779,7108887256513274,1356174035857888,3867051198730722,8607645686658306,624704969429483,315260491690478,7317773642174961,671963154989554,6474712539722227,5862774873117172,318958215246332,7594189033030142,8962858479444736,4445459518382595,5837947859755526,5921844491837960,6715183456121361,7164460079354388,5236899519726101,4399745138467352,7012517632041498,9157953667610031,3085980627456540,4584425489474080,582817158697506,2499596845290019,1442305434620454,5564785304191528,5348845352874759,8513914272972210,8641626898801200,5535148789174836,8111836343820854,5299416464871996,2079444155879998,6611554230616639,8867622838732647,3885388401746500,3229117199069765,6454302183727687,2411371683136079,615477169660496,4035268451361361,6594243090756181,3267553675518550,119996498870871,5478629337412186,1226906444685915,4934892258640476,3141687874970205,2282032454308447,5503025687200352,6721739373228642,318118544335460,8155834529718885,592162053788263,2944233436082793,7247378716643946,5284824126030449,8612120309728236,5373940413616756,7817786521555574,8059257373700728,1603023003243130,1558264429711995,2935215622898300,6876904740989034,7649666584452054,8261838592860804,721735560393351,6693381584173233,1907501750133387,5431548035285644,5782967815737999,2974677916934801,8697189433353160,2046901241864802,8825008337171094,4753144385845596,1645483399475865,1338082306024093,2283997800563358,6696702194676383,5572157894591137,9036301271532198,853513336696945,2251487211901608,4524943721558698,9144509875516075,2956230649819826,7632161507541684,5326130270474934,5709271750730423,646208634152103,1500666579378878,7938038799880897,3619954910581442,2823954909639364,4371604786528965,1557001924006602,8090988705185911,2903085357077196,4857209723871949,7163560112115149,5080263492100818,4266083383268051,6115042569446100,643903275705046,464684504924887,3738737126122200,8749302389998297,7540671857869531,3730375286973149,7877468283626206,1268144276628191,3057266440549089,6773555374891746,4825824725054180,1959935380595430,7793663873896349,8016278478787307,5975272216179436,7723897397301998,7947204055295443,2639970774921972,3640027465301460,556741675385594,2368029432808190,5278326789759744,3679858149118725,4395739214578439,8474040542614282,8856438802781655,7901753550914316,6369482763965197,1569645179212560,3028427522646803,5516671556465431,418956273914652,4624665868653342,2979460611306273,7960432835269411,263824024863524,3892533489672997,6980614961494833,4969447216354088,3043585205084971,2919747092472624,417615141353608,3993753897239346,4609042555925300,1982461476663532,9144016682156854,4838186182296376,4457553895334713,4079623332139834,2857891817252284,6700968990520125,8985726773224257,1389692439651142,1248784076690251,7164903965164370,7104538080220643,2716382857315157,9196890082384985,4243819227882329,8662630531194235,8188440147746971,8109195682149851,6494374946584037,5153012343182176,1443132591231842,5149635383157603,752827723961188,3049797132850024,8577441752609641,3414052312437611,1202442631037804,2407242963424109,242205496259440,528515269202801,3012446322144118,8236452683592567,3950624025591956,9192481358646079,2061496513409916,881609407136637,7551396931314558,3053913171538815,6430428375712641,299539514295170,1681604040737668,3362097564074885,3123770743784326,2367290969805706,5406619924521867,8529268185535379,3107005828342679,550682733372313,8660103890593437,6230443603002274,387920089625507,3823056995091365,2223476135793574,5245946478453673,5955326249976746,1972249506767787,8285882804044716,2833900204668402,5579912061485999,5954175670240177,7073444446412891,6101724879074229,7538068848092088,7198333910328249,6604571015386043,5553097866150844,1198468067128253,2419062667178943,1334903909540801,1245144095646659,9055765554836982,5802222206558369,4577488325256136,5571614418486218,4501488425497547,7764679876143266,2596626788148177,3370559046898642,8395821866521557,4977188578706397,8120135713096672,4340266990777314,1491426520327140,1588965750203366,3975304429851623,8679410987066346,7463245207483371,7020590307460076,8567047331525458,3338283548345327,1414918446171120,3917258087744497,3104153991058419,3034632037204986,5552710508872701,1419606415887189,4166645851460608,3823188970775553,2076456025334790,1403679917917191,5692364531426313,3092014917035019,2799499974796803,3842984470393876,4189483385320471,4860022411125788,4756486854001693,8878936193881120,2156424736639152,26299803567138,1216382423061541,2477303441990694,4052074087040039,2353232541393960,4850043566810153,2120865548362795,489721072731181,8737615330366512,5102134346794033,5629477352154162,1585071724434483,3788083987388002,898225423811639,9219358744597560,1244371905647678,2099326766154815,77702248547398,6077474280694855,292125016777802,6015377795069003,793208193098828,8949979081032781,6989261361634829,1359467850839120,8788021751284817,6535146661770083,854775831348312,2164567642276708,5188374916027482,6819437334860896,3825466214696034,8606561710818405,333790236525674,5181407048082539,8742930537694316,2844514383623282,7421776274203764,1719323338032247,1677941818854932,3276797403182204,4179515303892093,4043897396057215,8251314983715969,1692194140492651,1181392680270393,7440461274368193,3328944824218760,5824798078608522,8334295242622093,5894508311655567,2093495942030483,5016560246953108,2560029982610581,2651784546403478,4296238747526296,4826698354812062,982856308962463,5681354656515234,1943966793983139,9112787246552228,277229667562658,4923984880769223,1704243183717515,564737317436958,9052804628739255,6320704272606393,8443243551765692,2551359790703805,8032742465152191,4320026827527360,5601291566245057,4755846217266374,6566338082780360,5107048272053449,3961405144356043,549747664254157,9010818514733261,3531161639945424,4609031199937752,3299983914403034,2091667509294301,2753068140586206,4476880857620005,556317503902944,8659384150607073,2580461876413668,1782467008988392,6726212461544683,332046519485676,7869380409161090,6587916759844079,7881712812655858,5385070493385974,5559818502788343,3039070667126012,8292556982683178,6667525471630590,8753956039657792,6641589611312386,5580938326779142,1743687232218377,7286295781483786,3218648048461067,5580670670513420,4624704630854925,392148346873102,7560619282265361,4697539145894787,1242941551396116,8491397604039566,4423886346101459,6704519224120602,9101522365099567,5899255950734620,1785971135960351,7575179180352800,5786562912183585,2423684617270567,8952939497420072,4007832446248233,1886628510197036,8704960319910109,824473274701107,1458572011279671,69835366872377,7459453871035707,5846732900533565,5933042563175742,579724071601717,750597334398272,4250192010793867,7188316965324106,3769290366002507,3086693712690061,7460465126937937,7206522800224483,4915084443329877,6020121396049238,9048021941157433,3664633925100889,7344787870328155,9208076943428994,8363992367665023,7052572283131236,5257431303529829,2436556355274086,354086508803432,7389554750510442,1568710388095152,1555255947130221,5258902637995374,4794525948597621,4439843017860671,5679862612117738,359524750931386,4811259963463042,6457649517077891,8479218191127943,5744249951946120,1679890104733932,7740746459698572,8538990623195927,5536516250432916,4410512108025237,2993676755895702,8063138240943512,5802682961704345,3456219882177946,3186529722906012,5656047029757341,3217051656418718,7825683931588165,6538904350565792,3390740846990755,7933169582171556,4577669271093489,7080426095023531,6057109516580319,2428859904685485,6907409236151197,3517736206513584,1291116460983730,1211718821799348,4125162040030646,4572001034839479,827279824324024,1888824246116017,5735848331417018,3095275741763004,1303355392689597,2723493780776383,3847857641076160,6007501939541443,2984895289136580,314444538639813,2676439187719629,8333091058527821,6492090498987475,3869304168695255,7752663391651291,9108838352217564,6543565383710173,6308732603930079,4279836588694042,1567420498687459,2518240541980133,744241535792614,1447686843811304,7457241562129898,5026362854274539,1436728401642988,8909774050429931,5248387209672178,1678012353148499,6814756302763508,5920492915623413,3440568714540534,62656934016503,2870755304642041,8375216752657914,6570750057375227,3838253401888254,3371434390663820,5527436228679171,8809536491398660,2996620291532293,1179890350458379,1584873187882508,4856522440836621,8905463988825537,1755924688782869,1200101322384919,6050991178094108,352363653350941,3943282856142368,3061237396485667,2132871262987812,8676133464466935,7180528302155306,8854586376787499,7074567123359280,5667514119921246,252470909892150,7639179813070391,4127015663121976,6598161753536192,7594624103263360,4605844618425269,772068425152065,2448742872231390,6996862934672965,2004983374202440,1821860624692383,558364702230093,9153563315511565,8464070145393592,5861172260427347,6325107425887828,6598746911245909,6143751498864214,9158950630082137,3438900981597787,1474987244209758,6765540012418658,3945662549746619,8386697006638026,5272485688034918,961410681677418,3504190103669010,7399126637164146,8470130005259891,6925476707096182,2778905612052090,6592786203666043,5002981269689982,8433133205075583,8275311510926976,3768971627286123,3233999740864134,6580446780831367,7968021670217353,21868517910154,7584639302375051,1682874533762700,1023271931209357,6791828285896337,2204736281511570,1694110805350036,1888878584366741,7522662054265945,4413333564999319,5519035770566296,8614944192194204,5403457077733021,8967021734009973,2862109088192162,2874150742042280,7526531655607239,7200470978893486,1773898478687176,8265928135399090,7481630111205044,6613091620079285,5698021944956598,6155915996280504,8231761121524027,3103463665706682,5516562884486844,2220856947221450,4745975412893374,6064691129820864,4529116422993603,8891289017149046,8632539267364551,3241920304760520,4660113298482889,4838685844444874,3283128733255377,6365428722337496,7789173768509146,3111904531576540,6763357615879901,7826606688339678,8155425115826469,2453373674456801,2039407331165819,4886467930105582,4218487651542768,22296066566440,1090644282099442,5117876670715569,1832215973836532,558358028568190,3572100430718713,749885662672635,5787485411206909,7033928464779006,3451444752078595,4496359461791492,5798536805832453,6499682942867207,6520668820465417,987428900378381,7792449348646673,9189618192524931,8532532981792419,3701603745793814,4498418973882137,1647805633988379,5471917733558045,8814630016420819,8006262049576736,8024622632880433,1546361700742791,7283410434557742,3287311104943069,1654445474049295,5010780168607537,1928531007457074,5099935053944629,142608103114551,3244294321407800,32975391213369,7500720147363642,8418789686972405,3696501057128256,8300122726470624,7487752980432707,3112179416523062,467695097734982,2010441696403084,5286305994504010,5879428404516686,1372031704997517,7614796889134929,9060222989466595,2229296352556886,1615314219467748,1763071302780763,8354990984595721,6657885686030650,7062588999198560,3660119290648872,6171107972220771,6694234692089703,482643580946280,3715654989088618,4271724583691354,178161231955831,7402509909944184,3100951100212884,1546644430612349,2059930083681941,7906611565737856,4949157442967425,6285072650464235,7159448830782734,3932042933405575,8034023724099464,8019820750096265,2025308334643082,3806219110549143,5405284167673741,633398381197198,431620402227092,8810174265477013,463916511811478,6559206641031065,7569706613319579,2319125096216478,158838930560928,4434674912462754,1201247527536548,6425688874084263,6006592454051752,3540175384905643,4079760577243054,3616700138518173,8796995724584880,7344046275631025,6529407585413044,8917602841839543,6536979872252626,8429458403755963,3950889673652156,7927893155907914,4822650731124671,85132064765891,3718552152655813,6943593973712838,6351930388449223,5446787913344968,2993180636940234,7932663980111820,6840285935122382,5994285389199312,2400917130721235,382513963923412,2138903742318550,7096237737347031,2393081880487896,3269705172432862,5072539513333727,236764747462624,98948983803711,1027739138275298,8203160853297123,7511123506630993,4255143923808232,8035654145464300,5640132313642989,4562709132281512,3288353646766066,6032339554605731,7556144423835640,3684787907119097,1983694488070138,7654756796405756,2118643390121982,7464150191355905,4717905381939203,7914540065507332,925846656342023,937497422329864,3665212772100106,481470084237325,8949530871152301,3834337201465361,8189146664468142,588999486605334,816820501694491,5567321175652380,1522674810431517,8334238028237829,1128881614678048,3063331231049765,885138717992999,6405420147300392,6305491732162601,8860325336332331,7636618282371116,4112314208974894,9162667205545883,7632272678934578,1353208278116403,8090912145766456,1069990798657595,1251122840680509,2435449624574014,7210750544648255,1134367477078082,8384271007503371,2182031865997386,4213884571174988,2138729107120482,8544864896514126,5007148595349583,7649043057973330,5396161278118244,8139862762883728,3237216340514908,4055794108221535,2316308098960400,8318421418041466,4272542870186088,1418635248642153,790561056467050,5427436537251948,3640475551602797,1825146350864497,4146835656849524,2774078890249918,9122474569003110,4352747082776937,3443639802545172,2890088697211004,3777356243363969,438599227230338,2829520177498248,3970007751469194,4048357895578647,3709221224564879,4657338545027216,3811782459545745,7553085245441731,4368748951078335,3518352531671190,863756991629463,4015867724875929,2879086408116378,1451953058584732,3793583721478301,4720098432596130,7204403968961563,7056834671949988,7618571842562215,5983485154711720,6031036615633072,2977478691670193,5999798992865651,7723132301554401,1492917886335158,3963054453368521,3764480873310392,693766703003835,3053952229123786,4380992568761376,2842699206822082,2120086878981835,8283828413601988,2588511321245894,3129460597904417,8184966132455155,701360943104375,623266607761613,6633201308022991,7298420241689237,6323059937851604,2937338449213653,1646943163881686,5850166479167865,4092346605934808,8510913442879709,5138237207415006,2824118838376671,4606904234485987,3563510941993188,3806672350619877,2358362867914983,1662434840123626,8456939096381680,4014127211321585,415355886184830,8875613298432246,4682513281657079,4778313476229368,5303603183110394,6912709331949819,2355996905519357,8706192247757054,7352847420587733,9161546417735939,951954607143177,8943607602059530,5746171839461643,7878462553016588,1604587176491280,8446035242309106,2361717908457746,750158283426074,4265960578955549,6210652533311779,7396757613558053,2430324415510822,3905650192763175,4590680677484840,7380387963668777,2182175840831790,6802955530656049,5686491772483891,3470852819851572,7691264360636809,7313578487083875,3654205488560444,3320699421505855,6376786761476416,2648185408026945,4553141921753412,1216722162256202,4947470164821047,5106300008634702,5222221694736723,5877772421777748,29205549984086,9001799706388823,3154269778999642,674072171043164,2850216121190754,5109234018322788,4632204761057637,6685945106536813,6466961190320499,8203687784339828,8763139214285886,6228809270716794,3744938517919895,3779158136031614,7282196791482751,5559794342738310,4988734953638280,1450701729958281,6997272803694986,3326869842540941,1566189866207635,1694833972955540,2496158682728856,1924166546905498,725404918495643,3956032936237468,2348392491800990,3954886436202224,8138775521270171,7088931797170596,6330104792324519,2216914369157545,8231145305962922,1164963259363943,5881343933512110,2395992633633199,5844378340866482,6784238052870579,4552627162053022,1658177940404664,4368912938861411,6182145231985084,9104348172115923,7072419635542463,961124965272002,1412336652208579,9045077442341316,3219646292487926,8541129370343878,310032185637319,8393166306351560,4993977300400587,9206738028804556,1816868655647183,5023744693873104,5396975808231893,4216506360912343,3188951799482845,3282554182154718,1128088281946591,3295898313976291,7952272779232970,7877500717627883,2208242712795628,2603243387271664,6167880258054641,1330254002750547,7334402206181876,3610357952057086,8653748989295095,7645969656855033,7332454904146426,8019567048866301,6604222092085758,9186084852304383,4538834228173313,1020542541740549,658477983668743,9068353691568653,5394668954221076,1221536996432302,460194624907798,1330163722998873,7018972061902752,2478118024722970,7159591812546991,1013999407307293,7507441864239650,2510862123489831,8472870645844520,3591360717031978,3455217053145643,545447765338670,4445946100939314,5625035781419444,2505773003586107,1984330317400636,6174033800245002,6037785589197237,8181013397816416,7447089067579971,1488989909121604,5182094392314439,4286104961092169,2422069591053410,4353798975244878,1529725847091792,4894493812992600,4545564990159454,563331749202581,4357523386952292,4043794111748710,5228028949949031,3039958638262891,4638740791802476,8918729434062610,1087538249779825,7224152356047474,3634196930452083,1548818217908853,1959680175606390,997969057127032,2807569913645690,3378509826275963,3532645639717994,7603348147284606,1039375562144383,8986600475167361,1274429517407339,8899378527275525,3437591332231814,2638324132469383,2122866575227529,448741079521932,8271650069212269,4157644065594000,2129657736444562,4603143300119188,2267958190336661,262202161973915,7247087803129626,855454270749343,1760209281776291,8303748831926612,7518046573375943,4370701303249583,2500073674865335,5223565238692541,2656835077438581,6301032954174146,2397793372039875,7886663201372868,489157963455173,9210125316733388,7115972286802635,9005875542691723,5582929161719586,9083107407054552,4344281243900627,6834859581635285,7768705167088079,6518052795218652,6196868001528544,6656168132313552,932703791827682,6985741963127524,7035430108205521,4742497335597801,18401674185450,4056004683254508,8547871168555757,3270585795422958,2925361014688497,8833651776330482,3529276677266163,3710327512615668,1305853337713399,9105103341914872,3629875525569274,7034246803024636,785346909641470,7394508911824000,2643840107215618,6588353228778245,9152144382532358,7760222625150563,293307759844107,743963315626939,5982780989872912,5805309596510993,6025928969415811,8943923376637742,8949023521573656,1721872100092697,8141371265579803,7035366301265445,2640101876631344,5276289121258274,4338835877477162,5612284516399849,365007952094344,7232174257765172,3034581220768568,3836641909660127,5529859438394172,3679043681846410,2295709913803582,2907386096966463,7844409662733120,885242953272131,6125447487310662,8772327457266506,8710231874193207,3798088382397265,8749203674229219,344542021884757,4103299071630167,6258316805315416,7408449941113689,4004953394584411,2707323278211934,6784935868382048,8769428097279803,7990519067310949,132119713782631,3301995653507945,475801172929388,6514339486972781,4349942069914478,7365511331138418,8713306887863156,7988454560332661,3155422525078391,5770032191093624,778571380710265,2539993734351739,8424285479086973,327193022679934,3891962412211075,9028406520261782,8497943970368390,1607524249193352,203882344897004,5333586270317450,2786534896835469,4213276154469262,8565423227108239,3575801019838345,7693064066001811,3039774379348462,7005234735487894,6271762423323547,2128091011025821,1682304995093406,2494183364307871,2672260211408313,9191726910931438,8731759612053318,4165758177029031,7007345021574983,5591732155243445,7187836437818294,253790544882615,1024511664765883,4256587405675452,5196263961435069,1133191502613686,1023558756858819,5778000998558660,3570628668419015,9075233311194056,999697982073801,1031135472913354,4871262554135499,3972015871452322,6912400457239504,1307579604265937,682796293887139,2025002133248982,6509647623199706,1845235534740445,8932314857782239,2629173704526817,6930824732318234,1786736775003107,6056282321415140,4972768348871656,5889028441512939,7596737372998976,1587332413102755,4377346899434488,7260154031778809,5443250943179770,8395566282555511,8833467613076481,6915400451791874,2770589865983147,8028450692033540,3922625551510533,23711566990345,7295764490607627,2392140317424652,6603596344744974,3976877894675472,3387530699193362,9080624340102165,3213253605555375,4834151157344773,5751883437521952,7006935089937444,8948590367675490,1094295644695590,3469269436840999,3418701314300970,7704440224492039,3738841594182701,8208610009607214,9169493936325128,6184974130424885,3724798533635126,7284770811636798,3907768843246658,6516660141931588,4093873475083446,8338469141322822,1296777816489031,5457577211108424,9210114370330703,5668841774787659,2434855802903634,5293785028446051,5503143613492311,1952395140422745,2040769969032282,5614918922021981,6128697832799326,5632447896353890,4460882569632869,2541068648610919,7501692147125352,1035054846286954,8703727604108395,7394114405448813,5466894743481455,3696672937393269,4708086306278518,2026057857547384,4049206578400377,8651901190737681,7469268665662590,4550410786024576,3947373022627008,1091392184827011,5137370005028774,5249194150677643,107693840186508,6504798931455119,2370781396548758,810776629841049,762180501695642,3217362425392283,1968889245387290,6166321642187937,3062461854563491,3449956030188710,4930921732730024,1609807261654186,5690121893039275,6281252956568749,4110290666785967,7194013985645014,363911503850675,5523147002506420,2171111152760740,2574631223340214,6206409592245434,1672295237291195,4184377980927165,5801189382606017,5646794021938379,2317995834312567,3106789554322636,7307024079748304,2775820668394705,657801288088789,802239521672411,6109897714523357,2268738099772638,4344597989915879,3091044674223339,2788432990879613,7331306187791600,2379301844667633,980505005378808,8753192717356281,6805877729471739,5852005132033285,32336468913416,6678919563799822,5272830692052239,4369792417467666,4891602819243283,3200411147898133,9033831923641626,6891872877538588,7318022268321054,7754766121717023,1704498957286690,2664542573866203,7235935476645158,6498426153904378,5953696998804777,4799008837068679,1807118400081197,3075082572348719,7937189762919728,8084687838334257,6059016198524212,3194655070625078,3691609732890924,6339614128614714,6212796175453499,1773742993255744,508944178735080,7321412869754180,4017283335937658,621889354284359,4496092219510088,3815102345325899,6935017930497356,3339359575833934,8851205956659081,5227755450922528,1604055318838611,1540934378970452,1899082823965241,3410082256760152,9188455452103908,5093798844415325,1953576637066591,6656639580700001,7175290837699131,5748056203562340,1897315770338663,5562824065527144,4853574609689964,3489514826521967,3439028377386356,5414214457492030,1389442058988920,2550107992881044,3802950220017018,6441950018325883,6260785816845693,8382245889539455,8964130461251889,3316656885937387,9007868467603350,4582052027411846,4569513818299789,3923787145734733,1524640737752967,1971360232865175,8636931176152473,1481937246215578,1787306755837341,6865677552962976,7764496148770715,3780878806928804,5298489769147816,4184550109633961,6804294426127786,8849716006414919,6592354818608556,6431150886047150,2542511754354589,4068248047537585,3293602207727026,759468812518506,2217626711092661,2167157938027958,6682237244337593,8763683428228427,451887067172283,6240734790782398,2076055318515136,3022317161565633,458809155833282,6726638348844483,4156283065417156,8570176365360374,7436273867151088,2841394960551368,277985947889097,6782541601045963,494701650009549,3992597469141581,8814243172011472,3000627747233234,4525673375993300,7347061746302422,742979956035033,4375850325773789,1356537242152414,6640644866801119,4394201527958096,2434688200793573,8077115627265510,8500116687871464,678951863493884,5301904537566698,9078040829925287,4564673916136943,7386318530121200,2263719946979240,5404078383705588,9093417792155126,5508504716033528,670585446456827,2702334031666684,2299712946355711,4957572895346121,384811226639875,9091138850049540,6987357325778439,1349576264760845,2644967684210192,5861087573732882,3683912315055636,4369529028845078,5725184063616413,2421285662051865,6419947977424410,5363602292566995,7225719471316229,3470409564319264,1443231924063778,4889393495253595,1785066691853860,6870373620936229,8315025972878888,2911735219797546,4981309453766188,8479102699933230,1988648145350191,8883418291359280,4771642916486707,4363736504778293,2646490731740727,4070513407358394,1648282792451643,2893943916875327,5337419345542720,8993085541089888,2578776018751044,147482812464711,3470555027590728,8354460821552713,6613758817947211,4103437939377750,2477670210167394,3582154884046415,3083056807346104,6580140679470675,1103906152509012,4756330054536789,2925283065216603,2589534511496796,8414652059469552,1414788792434270,2086107498970719,6914704864644705,3420919171657316,5174409260052070,8465706007969384,8541766500175466,6304231461913191,2411933295251052,6802657479982703,2549785537277552,4918733684866677,4809295226228343,785108891247892,6168118204976762,6695039164677755,3787318439808641,8234841933833437,7295557028511367,8638342847442568,4715299772349036,6498373938826,5921776943173260,3581463998430861,2971005903814286,9093306399313784,5680912168537746,5374259425459862,6967566271319710,5398776440598060,3399305701949091,3139613701521061,3399793424480881,1428214576586410,6890377322921643,9046156409807156,8855102091068919,7379330579918510,5702433252146864,4136642477579953,908254759337652,1229897974883580,8348753418881454,7186259641831886,1953854970187451,6340447791682271,8827835958811253,4362737818607296,7536637356660054,4683028913450695,4650243021983435,684471751220940,4392641787748052,6924291166924501,6720741333982934,6108882296798935,6082705963699931,6083260583330426,9126119484862175,1412897383167952,4835777019563746,7426103190311547,8748240740314855,7356456604742951,4394698200207087,8643677436659820,812533720137683,3525702017892084,1611425415266038,5070330039448144,41319783010041,2172090243865215,396960191827709,5555062713306878,3650112635547393,794798486109954,586532902723331,6611852818804490,303996563468043,1029484653240080,7575552609894161,81173531934482,2461504817684243,2950625176330004,6504082118235242,8065999788531627,546757712912154,5724364735102747,7603346114027295,6948375750967073,4714318554955554,6340093207440791,2223459610509163,536340737007402,1441243343101740,1968674596118317,9170858736140079,3025923788926769,9135750787647871,8974421918936608,8177213725486905,5186885208756031,1609180297011008,1422778812981216,4280389032914755,5455935254812641,4495494769577800,647625253681804,3214072806854474,5917969825232183,1316356333215567,7730005248855896,7654925340528474,1716704530277007,4439091604475742,1789541874040673,3603325181730664,5906606844284779,7518861924633234,2490450368094063,2045561561022321,6091247380569973,1845686573121399,7889329825750904,4741324293861242,7825419448192891,5848010668007293,4169076220153726,2084973427214997,7107004981950206,3436339577638787,9080032153255812,6235062774325126,4235194984075144,4153773790760841,104789391183755,5128303705683591,8289138581204877,2637414556675982,324801056612333,6626383123349393,7504787575344121,6825896395231124,9012377808281495,7740491351207835,2904010488463261,9188753893900191,4702354672902049,2909268280618914,5391631929532326,5344826823528362,677991682256811,1706093281439662,4236983716250269,4658967866863538,5455849660256180,525831213625271,2844895041929144,3194582873841593,6812968797749178,4811746314465212,7432336697765823,2672127774388161,4122208870248387,3605821605494724,4288886286770123,1106372747435980,5761535925567440,8965693508083666,5775218641502163,2194456818716628,6042155376467925,6217076165423062,4865111920062423,6705999012540376,2512713985351645,6388029965238240,8832599234072571,4588469476815499,1091984565944293,6277974809083878,5453130106277201,8583501527705130,1614676459642858,5586868114059245,6240043772624884,2132321818077182,1607463124791288,2490415651867988,3479753539137531,3690043846627326],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/bd0ce2248788b643ddfb8276aea4b659",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000677155.1/GCA_000677155.1_Myco_tube_BTB03-012_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KK355876.1 Mycobacterium tuberculosis BTB03-012 genomic scaffold adOXf-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"bd0ce2248788b643ddfb8276aea4b659\",\"mins\":[8922595819179840,6722960525209601,4151474676441090,1938144800583683,3011555038760964,4059380718411783,742487434289160,6593886642091233,3411678347419661,5254039152644114,4975324035612693,657167258853399,7063199841447940,8558600339808341,6711382464020508,7511679475802141,7969372737794079,1474912010101424,231983630055100,6552886804635685,261230466404390,8836489568281243,588093641364829,7559891307054421,7516251846142710,3733989217968179,329391152001077,3912024142721078,1533246323449914,7448244279738428,9210906383863320,1405261972328515,1565338636333125,4322762825490502,3550153143791689,6527955921514572,530350020935757,5712368981839885,5209362597072979,2858196100384782,6981396709159002,5111662990295131,3470537447526492,7664213568434269,7589001816162401,1654732231283387,3703901753339239,494904510652525,6124602026483822,5787424860131439,5871900068028528,2608787983803752,4154170459156598,1503386464137335,416551572242555,3884367341011068,9217471504246999,7650546663170175,3775909289521281,5996827475017858,2562759431635075,7545907295182983,3423736095338632,8604411781064425,4730970837094541,8929396116043117,7218508826341520,1781673563664530,434087920717971,5286699408830613,1631015982760086,6851802163277975,5278965248520344,3018766187364506,2685910071439517,3962582899019935,5760052628024688,650095571976354,4520672936992931,8648077978742948,8455228026380453,3409641768730790,3327992631599272,2169647119376553,7206044409864903,36969257554092,3205666408588658,9037664198733998,780672773374128,5009871911559345,2352098757363059,1688784576467124,8308304193431582,5791648123089080,1126923724566715,1025574898868413,7402992575004866,5956154375696579,4395684505657540,8700533915128007,3101512308711625,28147068350666,7077040330383564,4992214606672079,2718069529751761,2302240384872659,7513847603321451,8223780463046872,1038973324669145,4286804384129243,7828694577610973,3971738794422494,3759695846797535,3763250848071904,7360353228668770,8565956005666883,1040222343557347,6036381116996305,3509349994041576,3248918279757180,8279031702655491,4877725861355761,5035802026709238,7716944208506420,8764713022862719,3431960317665533,590303523889407,1171306827202816,5569111377867012,3040656801583368,1583981678940427,4768955717988621,1031480963760401,7134510249622915,7534288118817045,195625863037207,9161322506600065,5108751413309721,8833425710080282,6792333918492,3519367816626465,7906869533496027,8139004776469894,5700542953972010,8454264251649415,6702655274541356,8530306674727461,4728749868278493,8602282083533104,8267877423846899,9162726126712094,4012171676406068,4574297117270329,1830953172676923,4460091309756732,3526100525338942,7319879427149877,5787174720389441,3054841254400322,8328060892655940,7373311542337862,762492691296583,5747358025511241,1022033319629133,2354870868390222,1891129004699021,8317273743308856,3389796438417746,5701223353913683,4137376921317903,4543266777721572,3743948754592092,3576320621760861,429059487236446,5434630290923872,1373999588247366,4882263622234466,683002671341923,9211569960517989,4607647345836391,3937589632204505,3255542203666795,3816568492437869,5237184102355311,6546291175267469,4276172147106162,4864436923754558,7451579362857335,8693494373774863,8469540124441460,4996501376901500,452507991634301,6734905004990847,6053334363955586,2898168560251268,2263790411329926,3728822952640903,2457242768667016,2626867205022089,3270024665805194,743458579259787,2951803782357388,4001848586981774,3619077639905680,5039525820420497,8077431540867474,885127872197011,8739217925083540,5088842780258710,1386188411659673,6914478892422459,8019380067207759,7465796954849691,910345625395615,2984788183802272,673246882668961,3150149677486498,8486449541902758,4183197510988200,3735667434631593,7524860168862701,3988963785515438,5166130456580527,6542051737772465,8279682058078169,1960180371030451,1196397161382324,1623925427216822,2070405690413503,1897395698168259,2280133166924228,1407276397629893,4005903397158305,8106496722706508,7172196514267594,1509195650630092,8677466780043574,5281656741482959,3538544750158293,8212042408507065,3307047214068187,9057522667853201,2268575468552670,3800473786085855,7314338592498144,3795553315160546,1788319703757283,4328580982772196,4022402595844581,7677854738824533,4080838889349609,6991445448217066,5500802798543340,9213276759184950,811327082263023,6283767821302665,3456230091686385,3209607062733379,3134550890639859,2157650872213091,6055255990866687,2533079121406037,3729425398436353,121251395252738,4310966473953795,2421716435366404,5798852670632454,581107918273281,1658379052384777,7121215836811786,807364732699147,8490722740249101,8814266194641422,3853897425318415,1061063064457745,1187901877805590,6926842923352601,1114312668008986,6675497069429275,2144332517704221,3223956797309470,1647400726901280,5330171575984674,5916057398141019,3868326464471588,567864533103143,200567419970091,4575537659187761,3343417539056178,7371068017308211,870953655817485,6897199971422773,6205219846656566,6247350609543736,1466864214508089,6657364847593567,7575416393286204,299484747379266,2592941248193091,3491210363179591,5929263915189004,929087479689802,2418289093710411,1999355421594190,4468418323391055,435211486978640,6840489066537059,75104165102164,6465134544519767,112302024962648,6069319072716302,6185260243350287,7227185819411037,9201610019288777,1012360299567919,8706561608989291,2912893769208420,3419544757928553,3593178271126124,7212575100345795,1278894352839279,1712454760313456,4746963035218548,2173108674433653,4278464524997238,7830004974985123,5897384509678204,3422268133503619,3281027729105540,7564861336031877,9088821713363590,4220558585995911,328584319189641,1289424166904459,3592513960424077,3244835144270478,6199620424876141,4339801473323665,7337971477275282,4673723926971027,4768143578710676,5575448776532629,3850581222711958,8112043826861800,302838408356505,4748366967567003,336305564258972,3260137284416157,181380874273443,5034940873179812,8151074727506597,190436436107943,3676306149761706,319217181729454,4644133554881199,4480092418036400,3069409275179704,5261677354943162,2793330040365755,3892880319943360,5290750602801858,4429477231284931,2910032134587076,8024286678241398,4061947203347143,1152706483032778,5980234019086761,842279007531734,1316623911576283,1441617725723357,7242017614672608,5080262464819937,4915081956287202,6518397047325411,8587777524977788,8734274874778855,3799273597539051,473073041715948,3375591241712367,1421795462091504,8716916777976562,7255631597514195,2646595074896628,1962810059846389,9022704922612472,1888607932363513,2541818098427,3474541931000573,2233738124464895,8427785044070348,6166476558238465,4703780267504386,1251338721104644,5123277589132037,5263938045702918,7307239306294369,5414588046017288,2778293174121225,2368956969661194,85021318499504,3143652021728012,8864183827013547,6173063377679,2544601799963408,1953172161377042,4576134714050691,4446647557051158,857152097086937,4877983625134873,2902595779265307,3652148399671930,8418889093649182,1477864457863967,3356680779371297,8838570601379971,2272765344510759,4718515398193960,3598420332954409,7920260982838059,8699493476897586,5444394737566510,6809134991999791,2570824589046576,8729658039939700,6576927291392818,5885158443701043,8095391254729119,5290901259977525,2294679854519094,308608179655479,7664020670522168,3392019899165492,2386524703843132,5267226584662845,6033837831234367,5370407554487105,3203787678040899,1409328909128517,6418132290309963,7726858204046155,8818027848835919,3399595587662672,4588949772354387,2220412858200917,1892913485202262,4557511523091288,8957502449673049,73239321503506,1518722880303964,4113412203113274,1557751134200673,5785314150654821,3886386171540326,339991010493288,5905337141222887,5841625787595581,6870296883454832,8197096003199858,5352488226005875,6542062586463093,5338480186299254,1766721557577193,1870449932387196,8236730898256765,2312114056680318,2696167956302656,2595195949028228,5234268714857350,8229866322359105,5253962026378120,4749197896905609,835156486890380,615163626775438,3948427594216335,528099555121987,9088440047190936,5655430392073028,7367684324975514,136847085507491,629776103080869,1821132074628007,3556641181340584,4370248299692969,107920285729708,4320151180845997,8287474682679453,7577493788337072,1146722072908721,6902720068619599,206935163807219,1961289989845941,1218808330388406,7318452742940403,379268074578873,4984003392721055,6247389964612540,5176900629365693,8651815331507604,2059623793099713,163039921750984,5793682520310729,9072446822121811,1446877439301111,4878124032360610,1239150521504722,5550530919400403,7878976482407380,1830711356830679,6933517768729282,4157174477099993,1460308741981147,2914383592211420,5746629290114133,6290577456952287,6391317874947040,1967281167876262,4151087089886182,7132937858536423,1547881320785404,8353644914460630,1026592140624876,3495306012857326,4960951230596079,4056531807830184,7345108305314371,888114319754227,6780297707714046,4007222712878070,5905665019919921,3203292562322424,7973729048206763,7497418490049531,5706037832999765,6534430024098821,6307393895388166,2996347554538506,5087875047416844,7785434385950210,2551767531312142,4807607896785935,8603383086347096,4354780576498706,8508796689224725,7477279466673177,2733965256045594,672555497415707,6946631283917658,5560446801212449,916876814398499,2597521746050465,1574729219724330,6270371905535495,4654916816286764,648444204028976,8226718812268040,4329208660072627,2981214249268278,4430841587352633,5601454742074428,5313850305142282,4685748926997566,3807400699803635,7414539474117697,4953263471150147,4847771084084292,664536715236421,5792524058006600,5007630237865034,6328988624708685,6296089499960398,2679163824325711,5153860076094653,7554813291074643,3378101202289749,502404629790484,2903843662373975,118347845039193,380357918991887,5715721183130717,8158466029483102,3991387221832799,5193500563895392,208507331183713,6810857731104955,6960696443540581,252114549535846,6333876767407633,7729997717219516,8860242170541163,8866491479811960,8993282372076654,5767819825304689,8959544120288450,6661679097558131,3029870453122164,413332435735675,3584207999337596,7092646636446845,5962056554935422,5550109599872128,91357145474178,1110197531542661,5643445555598470,532458869083553,1630312137647242,4707785016816781,5877656765207694,1574861172851856,4506304540517521,7714796022252667,5682131033334932,2621459689223317,8678636556484121,6945967207064431,7470204460147866,6804413119952027,1987404124611740,5368029799724191,4801093361738914,2735668332491939,8305475517826213,5337257462219943,4231448943924397,5068555918873775,3975782608311473,8729483779499189,644817629324470,8654567181408457,2894615605961913,6669327357080762,5413956008035517,3279307825077109,4398366530528450,5108821896213699,4046123017929924,5486763637162870,8433736196740294,3789040004117703,2383681511834824,4201287218197707,823995580368031,854158067856595,9125854766337350,3364832659911897,5199128498904200,1400958518145231,3685234546881757,1135384307954912,83403122894049,2636115878184162,1685883895616742,3006029842298087,4991266064426217,640681959879915,6942854334629100,5355858214589680,8688845559574056,8302774099440882,6529159136348371,6998017726280948,2347589255726326,6604558783816954,7605005745759483,7097696077362057,7347524937503998,4202663660455167,1320345924797696,406841008782208,2652441538909446,2524400862016775,2935082001133100,6701303819095037,9199700780449069,7389912938005772,3377943769408781,7744995590929111,5564696894309652,4701984071461749,1562085260858648,3562543065871641,8952329835599130,6163356516050205,4340568422864158,6694532813178144,9186861951608200,1368431200621860,2539462177559845,3089225201509937,2643473788298539,3585984418156082,3898137379435822,9177142455007585,3490325603517745,3633357373240626,3493632342693173,3050832973948215,9065337811883320,5773274897704249,4321169255298363,4007037874468156,8698409742961546,9199138096784702,6919338553485380,6367380393485633,4642897999344963,2163973868963140,2362128849880389,1642553751348550,8120758499938529,9220703060714824,913682906613065,4658487481652554,3555846289417548,401375166743886,7909480428320079,5081905779899711,787802288534866,836641347395811,213932704486741,7050534526063958,4070534920283479,633725039129946,4556770038498653,5964004506662238,8949159689140453,1727927511999843,9117892788065636,2962243797714279,5625608833721704,7218903253238123,4266941598463338,2166784540286514,4467759380223341,421441366615406,7105522889266544,463802262877553,5464701851874674,1539958543836051,2711489423660404,7919222347037232,3642389034526072,2601850254132601,2411528010159483,2946793006331262,6034206353646975,8936997153247721,1024209714394498,5441105005090180,792395005093253,649320904369542,8658107129218440,4749798292069271,9116487120885132,4355270422750786,8611128325051790,5307886443980176,2262509274834321,388874499753362,3613560389473683,683788050367896,4680617942893977,1924191518533021,8323168275453344,5200573626504609,8510551465678242,4347965398190108,8294557410583974,5111294306429169,1368421656962472,5588556887651755,3668379866330540,624219371013550,7365140687553967,4215213767583153,7238177580131764,6102614592243125,1581937127016009,3706064454084026,1553380195816891,7835816564823485,8667159894963647,3924810906453125,6594064123867138,8910273165459019,6389570934511049,8373172127210265,716811496269263,3151194594256336,362057477309347,6262266498512462,6898742263301590,7987860603173113,8260630101915098,8572266847581659,6426117382411854,4073645162014175,8523518145202633,7760858971059683,8990438746584550,416116597896785,512293069321704,7982695525856751,4092526301791731,1360710405096951,6524009387461415,2918737215086164,4875820081283327,2242744880236028,7981215549175293,1008067269899774,6435202194134530,5131595373811208,6009735148291593,4724939605366282,4695661853541899,18353424373262,1632609543500717,1085978581693969,113770963908114,8906163398902630,479970500273686,1852196433335832,6974659947222553,453471707674138,4170971450299932,8008131505039265,3275615958754850,4838062178211363,344584855901733,4865698484921265,2674416438261288,6618580629461255,6010100373902895,1488198135089416,6804214012519986,6950495470877619,8576587009578549,7813386708787858,8211890659854601,2417269555405731,1003411667121726,3517214200915519,632981584275009,3774866935572034,462079636833860,3761580756706885,3236869990516294,242005886301793,640353422009929,7302038146328687,4187213157598798,982218413819427,2455617963546211,6671154494510681,8006600211811464,5584887975893946,7820569900795902,3014327635088993,4475154262148707,7417225460461158,5094798847706726,6608105391601937,4664806243059342,3694387695691369,1527349466965610,7123408929719916,796333279022336,3725276390700655,4086149611417192,6977295655597682,997635026228851,9103165703493502,7006497796064885,618593745442409,9075279497138094,1868683665835643,6585602364040828,5264485274990207,287479749957249,2260763457123977,3539388308255189,6359321435507628,104094391162510,9037660746049171,2597955553904276,6963504471594645,2499752928708247,6495189386376856,3239042782488220,4565428442810014,6389646561457823,5023318846678692,5147427550070437,3474077647986289,5309986755875100,6178587651983018,264001978238635,5531721031681708,8834097150842544,5743744653364851,4438922446390965,4177436667258551,8633985905338040,5272074932283065,1015382299952828,738339707791040,7198408878134219,3388375570437803,7912075202161612,4059993563670220,5758248280975055,8998303790876369,7943134116411090,1392200266561236,2244650618902230,8092964271255161,6796971400891106,1547689231300315,7473294504941276,718174341285597,5831782303045342,1774008723412703,2245078100186848,1620584257562918,6121906783803111,3214175687046888,4791584362477289,2268246993843946,9222302826649324,8675618056786898,2054723207171709,1121522602858225,8630172568446706,3312220545259251,6793723774240500,570719257368309,1102789366154998,2490956459718953,3800258271631097,2884426780153596,2823913126356734,7485285006882559,4860096552404742,7106994624153217,1708733672441609,8060293801719562,1693179270042583,5831278909699852,5020442420369165,5458391754881751,6898879231672973,2835966774077202,8204014194640659,6146633883944724,7988235638052629,6007793192761986,8024908069098457,1088472769636125,926281716656536,7564487573331935,5712842319210283,4817270184654860,1304685120252858,3679834052351792,719336452515634,1943616584591156,5918886830393141,5811026113238840,8553602470622175,4458099002193726,8481895600355136,7809192334254082,3685292573427523,9217606408807067,4042756017338181,1010787532220230,3383431154276167,3124025583122249,8870271934121802,5243959471982411,4993192759326540,8569074447382350,5354291108706129,2223703875200852,5729398118041429,1753338622404438,7113786586593112,2389076773590875,2275034284668766,4230909298706271,8900960734476128,3631599196665697,7396611891849058,1958091041779387,653232831537468,4933576977660903,7610961801983852,5117558025412242,202729739945839,729400030582640,7439491388249969,4546506583136114,884941721892723,7939991495116660,4241842368788341,14440312686456,4922633629288313,7734528506296188,1099634330703742,1748255376177023,4153444053854081,7210396103126375,2757403369858950,2790201353909911,7052583604034719,8026760157668059,7320462604666767,885570969749393,484480918661010,8574367698175891,384159004411797,5166573928703895,5616480582825881,8067626504140698,7186311349094300,1557611820591005,2108741212064,4120393758767009,2086436797716388,8811163547338661,2586337028593577,7978969931245482,5230235725289387,7629630146503514,7142210428985145,6460791612430260,5817894833944503,8131485650954174,1660365463300031,5739712384014272,1300739626706882,6168447735457731,6108163019839430,9018296611192481,1552842668320713,7668771292739531,2890834525693901,6761525204510670,7486063699351504,8695870805263493,9204283226319182,2507981859985702,4802889045478393,4656935732398041,4650166306998234,8431963948228943,6477250172925918,7472786546903007,735093492127714,3478656265882619,7964612972214239,2882960995624935,1257709168601065,5141101531887271,8369242333509614,2525417664202735,2870504202041328,1303795681018195,6177157529581556,3168615830120105,5410121091512312,247978422794234,5245442490234876,5182898342325930,5112500629297150,4025646225532927,6555217894148096,3403467399952386,5691045117929475,3740329207953412,4530613454661640,2818431988872876,1030633394153484,389867292432398,288743035877392,7917710442910040,8407578854381586,640995246852119,555966717257753,2444598072290991,2425252904392732,6592309215898850,8612396047607839,4164847245260833,4746638013655387,9154798862020306,7277078303778857,6271207616105736,8442202522414087,4172600952186924,5419438040127536,8960616520829456,6223724303734839,5738966712981560,1574180967078239,104042297104446,3273337061486261,3509080374325600,564387294091330,4830169925912644,8821337113352545,3453442750482504,7176591470730269,3513970169612365,1674762201430094,2430419077687375,380327050745936,8107698973558784,3623896929224787,7109733243151760,1208021182064725,941759026554553,8011702361049179,7577770731100252,71190381054045,2507669226465375,4892772449671267,7357254875188571,2439494055196777,7645804919789676,4170968097339503,6203307628559501,5606957321578613,4518269949311097,6039855567149178,2830765241981052,6376138643798146,386836978741611,350854443108487,3014134239721608,5663392287733899,7827741369089144,1227254413865325,8694608941484088,6138813896382609,8374176647143369,325540667143909,7632352851190809,3906688477907096,2087361141817028,5789601230649498,4395861332441243,4919920569436317,4116301203081374,2494300962474145,1148426580420774,1872287688087719,1995390259239081,7083771579152556,409843312595314,2879356593268911,9142342163007666,3262385772198067,1581658956994743,4541538814675128,2951083800021180,5818035954198724,25426519554245,6065487954868422,6329157654604833,5567339530692809,1982948356708554,8476792327612791,6191564594326557,4863571035277517,1348576190748879,3454228073167057,3859748028412963,7127053714379509,351816879577303,9080338160310430,4279992073193691,6620491408234717,5698569264982239,8321270382671270,5859355538966757,3421608620136679,4500700729047272,8338172084527484,5626585264330986,5934279795387431,8231770211109563,5887494119078125,1534759672867057,7876326749857363,6422442593237235,7177200337750431,6040957480077557,9097612059220215,4867317545281236,6514323983325434,7472057739445290,3919620721826050,5883036547938567,2319684329502984,6917970654333996,4887709199284490,2347291758536971,1236476392958221,1221397070612753,8088647608842515,7627359998535956,711306867902743,4806860721690904,6568183294560540,80604229445924,4257637503252773,1381947812940070,8065141773805863,2082546232858921,3290513887656235,6607191467953202,3466548036585774,2646371735574831,3721171431781427,1578536391641396,82311232682294,5008624991828279,2659378973649209,702437560981818,19332832139580,1415452294105407,8215882583619905,7382264158582516,1019112349874500,3217523073632582,7570723703458119,8744559858798411,7440112850471243,1363682824395086,1317723005405520,5868947354630482,8257926837061971,3212519585526841,383681912863066,5470252691392859,8755688973593003,593246512736607,2681789639016848,8406760823937378,8564774497335652,5646237011372433,1612307545672047,6946291891767665,8819110728939890,912861410134387,9121563469282893,1738497188104567,6702647275952505,672185429182843,6039171749730685,8797721120826695,8933975804553391,194456494659972,9029825099475350,2017544242919815,1850530644323394,7159968837036431,2195879548254609,5767780446599572,5237286534846870,8025936863774305,3016806853061016,3952955771623833,6376543183477149,5298047847172510,4657131821734303,9138431110203810,3642321157188003,6854668797393316,3152492826642857,2411844867852714,2425238364760491,1547863819221420,5765157639870893,461975241432136,1033671695335155,548070018558389,2612105443641782,9055610096015351,1269318773524920,4262874358475193,8139315346550548,4983674791242171,6234267149920700,7913002988177250,7719325778632437,4085591088064960,6417415053071557,8908020907640566,3189978543651270,4537073623886279,8090183251011111,5149777849571787,3133922920714643,2447550244215245,4954403656985038,7380713967974863,5461858100852259,5045078635080147,3277419547199956,6515117585048654,7703200470382329,2807704173472218,4185140790618589,5510905850296803,6900807520377319,4742437790837228,2774779013634542,1051326564479400,1916042339842546,8083389709225043,173980174334452,7308248452880126,1723792686442999,7863329489046008,9049015856461567,5225576278473214,2823012627102207,8226795995613800,4098465418209793,2968658566855171,8381705309149701,5824593103538695,5770928272628232,8603241926298028,8388192864485122,6824477871026692,1820339870300688,6450898690517522,713692118690324,6846056453407151,8659656832648277,678170638527008,1425882977954907,3708480322185764,7596578410293797,6404583325162023,4066951934618153,701143801391658,4915826072635948,3491224125176366,1528606912722013,6776311209019952,7728232038233681,8781200185969075,2344684057365044,2305721864874549,8072714921628907,3358625822616121,5538851247610428,2665273943915069,7533823690836542,2894518053767743,8051645341738080,5651890027317828,416499054373302,6875366573382753,3644457848015432,3393690246830665,5989413972484175,8407988312059771,8604592003787340,6080461698973453,2604591035267665,1485577514818131,7055074752977492,8301563083925945,877388679408216,7270603007245009,5235905287076445,5432582056983136,1546868478003809,8926237069912676,3528834978807511,7528685847388940,7539273955261032,1335106791680618,2607712702388843,5499897175935597,8006582758969940,2563108188572280,1672596681611897,1530371720903290,8945141534161532,630170306693757,3601228852828798,3332266406800002,8076524559055492,8117469891086102,3382795518106248,5939464912136842,6897971196209804,5231571720489615,7978725268026768,5838761737632403,5739553342732948,7662246691646440,7221742829753173,2855936882805399,9126996645849752,4543746223037081,7581838595185273,3057605327493787,4527965548259996,1004556860375493,383811733301920,8524647299501851,808064393788068,3431086818535878,7750805401787046,6165815200488105,7204829317593770,445579582499501,5566349683681967,1369502202645171,6523485704350391,1706725439670968,6417627403831994,5790571199691451,7415354355732938,4200556103072448,4163747954567875,3036685401217735,9082487453817207,1749208279790028,8640313892313804,1466289657592527,6774683451240561,2198591822883537,4388853034797779,8307654530185941,5048208825244375,2666406893587160,6236495325924060,132964336528093,3602812658481887,5678530414009056,1383763283167970,6663335846935267,4686964105816804,7056223603845862,6245510280899303,2440157093358314,7451590057249515,5943076692167405,6056792859368174,8310591124870269,7791819800590687,5977344457078436,1525432836926196,8414202743003893,6674217805171446,6326603663317751,3297712026566442,3512269597022975,3371227852355083,824318627486465,3353033711752117,2545127928916740,6299628036135685,6059880236098542,5258456339528458,657735950363406,1684611801656079,1022905882626833,6161716407388946,6465295014808707,3853361896684308,5950133043890966,3684436272986903,9135510729493272,2029934819330841,1210773197399855,7988845293382429,3275032327396127,4182531723868960,82665702284065,5580242319092514,4255595182979879,8334323409425634,8301047685012615,7592292768451372,4391331977304877,6665707016274869,1424129661287215,2543725793364784,1837137523186481,5596227774675763,3980768301357876,1431311259671350,3122460783287098,2283304356921823,3481937022516029,5883663259201333,5496788743023424,6477429750262593,4752555288247107,3883318720351044,4074537208527686,8767228591094599,2526112591956809,639566718032715,7532024593685324,4570236392198626,1414581532662607,1517075554274128,7510723155004243,1662076734054201,7023799117136356,8648808052386652,6016891181763423,920472824048481,1085117332167528,253000014535531,8658017640323948,6349572757896338,8832557759216494,3152168666979772,8572120875682143,1850332310322035,6113041650159300,3250267765492597,3446694376663927,7299698167511928,7102792528513913,2002503579401085,6258942768888703,445777692449664,2769897562771264,4086606100950733,8567383717910415,3477863787981702,774375316289193,588746190461834,3701826433760139,7179180505148300,2083704469769101,6283916205464465,6992966031297427,1959792071596951,9204369274743686,4078178645109658,4365553993789935,6079591429914092,8250547302394784,8797845524066800,6785514350447522,5950811044811972,2674235235412901,2240005940337574,664620925708785,3075533816687529,4681150396832682,5843188627725228,3923469897870253,6402150733204637,811398847998896,8137749472086961,6052296794586034,1781181974907827,6864350700220173,4141661118974903,2063128620108730,2876473268262047,8387482201246652,2996482787766008,4816168309078975,2161394573327299,8116730466040774,6980627359820863,7680166688977137,4641800265264076,1649972945507491,5988889250626517,2716904792644568,1274694984461273,2379790871604193,6833565178383332,4049197568560101,3648601250241510,3850303582452711,7521731308089245,4729154198649834,873783772507303,6990444733496300,5351505855163373,1889790514166767,8245220683488243,8681047293123573,1259261218171894,121460584886100,552181115649468,4861911152872444,689293433740285,8621946546385582,8726001807200013,4968444302564358,6253041493555713,950359505054730,8093752715809282,3698856258452494,6354327462026413,9177256264783704,2427721004129298,5155848109132819,1595570013269012,4482981665270805,3702197443685398,8345911892778008,3978182948727833,6041440857181210,4112143657798683,5107356957391925,8158029347535904,2966684204477616,2377037203729442,5244161874881571,3901461705829412,9215693123318278,5102079993220135,4179512660872236,568060867365933,588725859703857,1409859357506610,5216390950673461,841727720901687,550921342187359,2448125702503484,7239348110498878,3305565156641855,3957460575572767,8787838048853057,5104207816293442,8368092237978693,3469241653008225,1048270470097992,1650196082080841,9209884884569162,5329575223075219,6070437471161275,4315338978028625,7342873865432147,1191316855139413,849871022988374,8184153725748409,5892337706277976,1691698663883279,3644566976154027,7122359219914597,6549150064376929,3650114024946786,7160352256568421,1465771624270950,4226301601918055,8020587305954410,9004795836173419,5252013332024431,6972511412649074,4028155840670835,6349152095288437,3579402251258999,2060046119091320,4490362807999609,9119582871293050,6579854819294331,4622958211173501,2831224566832259,7747431219854470,3523750062791815,4668159021038728,6316338357116041,4131757779352717,4292452447784081,3392579654659218,3033459818871955,6310806569528469,3922114711461017,8312077790258478,5796719235701917,324361924639903,8903078772202657,3232052740283554,3250892899912867,2794461677296805,4760054338673831,1838430252641451,2388176049401004,5376862698871981,3774831555726510,7944366247496879,5166809135508656,6435306637954227,7428290383797287,8759098068513068,7208285441789112,3623406701493434,1656014000110779,6758328907944926,4778678415731901,4245228128611521,8709783620148427,5119604396084420,6929800796691653,6655908183858375,7531104208612555,2066166774381772,6435126421126351,6782607901822840,4580106882604246,6968379151838423,5642702939409626,4597522494786779,7026521180167388,1537195505609949,5905190549617887,883638056967393,80356327017698,2580058890853603,5834906559089894,2284384149396716,1642088967003373,3234842686557422,5682778140892399,4823284028627099,1749928919969013,4505117234244854,7488007083364083,3485663885532408,9059829617216875,4915314669874428,2021355089849598,4285425684880640,3807266757341739,6722073853488380,3912179861444481,4872489374215432,5903853513710857,6514702577327370,7886823246445836,3599472704077070,4981516709940501,5030436585315606,4343016717085975,364861979254040,5993145210039578,5026544765287707,7829645654576412,5050509239741658,4068178686774558,5739649843395871,768315713391905,1198341729705250,507821535575333,2595553018887463,8794800954168279,4855618359131437,2344201065659778,9089276072387805,8796228557141881,6382392722136369,7291937551908146,220842959035699,8216959402204470,2520168393783905,1468075443776824,2166053430442548,7554494236986683,668902319760112,5834613430713663,8077310815526209,5487052133018948,5409851624439109,2842172491656518,6096888221580615,5454554109234504,6583545884376290,3288319812549966,4463009432595791,7846864064052560,2479510779469137,108275543534930,5453902214290773,8651606762871353,1072882453396825,8727819716930906,6163623300345179,7950338262203740,4958087384268125,1450867292335526,793191862144352,7685653964304955,8305605739410145,3390407773531493,8238205888748902,2640350717463911,1862227446074729,7394886616866155,165748483763565,4954351011380590,354614424333680,8028255184973169,8835565938318706,7200682335300979,6515503552028023,5082495596580217,3240461748690298,6758841238363515,5405326588542332,2062221017081749,3272003331947906,471825667526019,2261834917227911,7192270187658632,5116896707743116,1637431752338829,322171797794193,3121445769118275,630218890143184,4590025927875995,5706858201501085,3608819676302752,770320656952737,6509644260801932,8692215245086115,6222860584304036,2516256340691757,2708434268597670,7663537164213672,8062794946246131,466989206015402,4402095915859371,6288274995010988,6749144530632109,3714023450566062,1757729497079709,6014793537772979,3273197506834857,5212855141621173,7345478450838970,2254804739788220,6877880405244490,6067184487083454,3538950924733891,6021406202598646,6981629275668870,2822553383583649,2035093280717124,4684692361393392,8471831753921580,8766911081217489,2072202328522194,5744442229448147,1737318329646550,2973824988380631,708546881503140,7127066892468815,3822602152679483,3698139118996957,3662082395532768,1514697037315554,1383806835723749,4447717785889361,5617823138131433,6614035878469099,4303535777193452,7044346519375742,4031988636081647,345467667590641,748229802113619,9024960321764852,7805432082476537,3237216736919034,7349211907059195,4623805962542590,1310846698503424,2015351181938179,6815885677207044,4901799644933637,4127820740855041,6335976885284780,4601640849108490,7945320067313164,6260012342207240,6821444475313679,2753616751984145,6805096401006098,872305360830382,8001594056625686,6788907385036312,1739567629819417,6201829527891366,1436921985953308,8150828606094877,3785898890848070,7832635621346850,4645907825282596,3322867532475942,2887779503595047,6811701395357224,3277441093031175,2144597122350636,1506979888258606,3956194799320625,3688536209575474,7863540622675891,6301152167611956,8744604330135096,7372689990858756,3079541767106111,3429738239786561,5678210460143174,4139772299202119,2190111939944008,5539782790037066,1862575351602763,8473242230492449,7501604668321358,1215507871290637,8261529474301880,8601777653915016,2053284148088404,1487951153667670,8745750845106983,1465611372830306,3742265607331427,2177720467242597,2114658726899302,2745378912464488,2599328725352041,8423232680070762,8338382065725145,7460285304618607,1093141901243825,4612088273587826,3332411125730931,6703751335951992,6973542555786873,8115603318673343,8117885561915084,3108076594752106,5417765390604224,5635811732610691,7632336934530694,8498303450853996,3549101062589719,8899784366923404,6176528940214999,1445123131616911,4047173477760658,8439703883187084,8704971208122004,5417220103569045,7593972588842647,8566918847233688,6597435302190362,4784957909487262,5992018917539489,8755684354920466,6110115163384991,9117254897610409,2442107146247850,3637445257432747,8896453949681400,3704781183167773,7509750816624584,3822107254251186,6684916219076276,5020821229376798,549688697536183,1346245283565240,3316685331803833,989983299304735,8271648877241018,1305974455484093,2261279998684862,1992109452255179,1322524059422404,3312854762458822,6171177259097799,4974779053858504,6469225962737612,8754986208148249,8949236700679884,1855786139203187,8736823706172833,5153287874809554,7423660157415123,5786778088816340,2529291506163662,3866835372612217,4318359500238553,4100045226352347,1473965396356829,5865793278947038,8513601165655776,2925066655514337,9178579812159202,3155730890587875,8950431734370021,3581157912997607,8694800318668032,8826186326792829,5429861914844913,5411909772304115,6611556817865342,4086401134575352,2366124182695892,1183876442255098,7509926457261820,4242898493615869,2664750101171966,4121272903601126,5596208657243906,7595245655450923,8169274058352598,8322848836558598,275840779529993,7285360428394136,5320352399628930,7517293616647951,831762282004240,8194784683541921,8845946951044299,5270298891562772,4160660855090965,1382719954104086,7750109173538583,6906180571823897,2068342789730075,523152648329178,8654868129050398,7852667416092449,8601336255934245,5068089734606634,7923224968138539,3638041986707246,4191830384860975,5023267850194738,4204844115320629,7738111939755830,3371901887340345,7067644451110714,2934432798863327,2952602848223036,930739114467133,632928485277504,590573683085122,7140218627608860,8199001927174034,57699281020215,5579753892151949,8952347589447504,4251897947533139,384729842241364,7165060707086165,6358517092007766,2814869711369529,1079583905439577,8215276774560757,2007878839525218,5539213589274467,8099972037657747,6925670087823209,7636275909693293,2091501079224174,7629508580856225,8128009237740830,6423624889473001,6579486855872376,4381692322196116,544430685777215,6273341580509951,2720849253625725,6502089310240638,522965890887551,6188686377717633,4646424849571717,3669386703544202,2335471041273739,8938664607915917,4401957944278927,9133212599685008,8418596272752555,7128295140704149,1085349512407705,7216004371440712,3658789701893444,5875736407955439,5251757406719901,6890256472289183,3777151208890272,1402840140218273,2196442469646242,6048754191253411,2842947185086372,8718469855682469,1918451037249446,6752115634954152,8740830497968796,5713145283219371,358057124573100,7486478031392754,5133985331601326,6054080846982472,4080320584966066,4496806791038963,9151159965554713,2034333551931317,4569212851476847,118720685514680,7729416517756734,2354458174193594,8811082685192863,5667422435680191,2300409971503041,8252510810468290,7418963854495688,2404312298844105,3738571101585355,3920611818692556,8091972091822915,946616938030276,4038350591541199,8233083268710995,1128203906142883,2037223078817748,5842852661052750,5605218229088215,377746463416280,8117922764669359,5676583049232347,4533237927694303,3419679557709111,9155999213767795,20098348269545,7575126109925355,2653729950597101,4739412417376238,5445392804655090,8577099883343860,6781814772772862,8213272045143942,172144094277623,1722527072595960,1287868571856890,5153687430025211,5957669219609966,4313487948845053,6542020554670078,362893210553685],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/bf69634e838466bf0b83aa42a5fd1cd1",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000985975.1/GCA_000985975.1_NgalHAMBI1189Draft_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CCRK01000001.1 Neorhizobium galegae bv. officinalis genome assembly NgalHAMBI1189Draft, contig contig1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"bf69634e838466bf0b83aa42a5fd1cd1\",\"mins\":[6997185690755072,5477320501534723,6467883035353096,2704913441775628,473225915252749,8716963099222030,975370962051088,2623888069222420,6799437363716118,3787345416134679,556231414325273,2548054401646618,5755908767694879,6165717799026720,5937770566924976,3414611690324005,2889153033265191,903064819515432,6666438199427114,8744701290860551,5784759620403245,368711785619503,13418823434291,3552788671967241,7754902402867258,1318757438890045,3082299731075135,7154793875251264,6649782668656705,3979589383422021,5263745504444486,3141422804394055,2951421104455754,8190056402853964,7473139667558478,352326248341587,1546538891399182,7335270421479510,509114100334681,5104491894661210,249616975334074,6664704707379295,2293859044450403,1104582162920915,1249711285117040,5069169840668790,5221391418371167,1204096999547025,1692069775835282,5530712503672980,6547417566855317,5510482846408856,4678835987365914,6480373188911262,7898248869092037,222365941375136,4566574956462243,584604225921189,3391467651211435,691675047575724,1999956923932845,1062957990019246,3188267909259441,2996031041880242,6816997105361075,4001010172944566,3952174479474872,6759419019722938,8655175061274815,141805791830212,6611561819750602,7467895888511180,3863454020001998,5773379682656463,2001411391365328,2852559032770769,9125597826405753,7457918842101979,4096598733013215,2881109945237730,2263929161457891,3561396191617257,8800671071994092,919063203414253,6050242004095016,1843228548997363,3329734977298680,910650326638842,6058479824065919,8535420472803370,544535801790719,7850409361498368,3753073711751428,5898481845575941,4740976101826823,6569325562118409,2927060551033100,683501667311887,106803926401300,6615404425109781,6804852592181528,651603508020612,8019740235694127,7553917908140316,8491878916948260,4488094777852198,1187745329037608,6061924749173042,1162477156188469,6344744710119734,3801821115195704,1929717920375108,3868552237351239,8846558457061704,4152453897528716,4193558620594506,6906763369849165,7524469260276145,8974648583561554,7909255905018195,2003383747764564,4229675992834389,667520431563094,9004410370957656,2292493085558159,544524585263452,4618730218778682,974264280244576,1741332131340641,277686500516194,5596042698498403,2643583929472401,5106614137356648,6431763561636203,9093545476129132,5567712087843183,2867082956420499,1935352167014772,1319576264360310,1937629031637368,8307189511184762,1577479413457276,3574264985895299,7818456368439686,2728745099656,3139311489466761,6684809458966924,4679198468383117,8538256527131023,1737710566474129,342344119452052,7954543500861845,5567500205900185,4840759128711581,4248643091538334,5877412821844387,5204264974737828,8938026505142342,5856972340216231,6394042079568297,5574575071156978,381023343337903,4138555471307186,6072472428118451,7435770001908155,3423758512980415,5440858675405248,3222765862888864,1936605922746820,6900035696140743,5578217159311817,5839382068740555,6751088361120208,9149853467168846,1728149391745495,7805971764429274,6067768166162909,6661187953680864,2671870562386401,8139528464720354,7159664941625425,2111379873997296,2177768758927860,8463269238260213,3352487172874745,7592592951009787,564707399713276,7578321311490557,1544183752212993,1905443694019078,4863445172658695,8376477987468547,6145827887940106,693440029377035,3326094312571405,803866467197455,3034053136114197,3055369745973785,4628246838235226,3883088567190047,4827799824015907,1793773021274660,6449913444975143,3596198883451432,2575156296172075,4072535594074670,1841543460192816,5144728693926288,4457753631924787,7570022579045189,5111913009824313,9049877797814367,4185076829413958,2047950560584265,5317313619624522,1024266949657164,158865790339853,8233788259983957,529115496751702,2810501389517400,5433700962124377,1985717407965787,6058809528230497,5021460725021598,8022587649180266,858552247018095,3818321702306418,4191424839606899,7901022899610229,60741613642362,5757937147503227,936634196787838,4106276249977473,4130848797188741,4353584522011272,1122713990013584,7364097287479958,5919509301158551,3623979510244805,8476336639337120,5366237312426664,3242106419593900,7563503330181805,6743296903818013,41919437570738,6580567102177975,4076946416665272,9127296101401273,3171110300063454,1003610760979138,1059284165705459,4652689345461025,2383848120206027,2636154417631064,1917665650287314,5607556701864659,6705105872061140,3092380406407896,1297255036142297,7204405420933850,4650892654404317,8641596569420510,8562048059835104,3029827551773415,2066829073218343,192661846631149,1662436407329518,6778779809399535,3052208888726259,1000863137419677,5127416054891259,955391777702655,8582455885939457,200417071940355,2728984215102217,2042371362308885,5611219292222937,6505080456291097,6651981133202204,8183370566845222,6742421536375592,4539943893485020,1797350522274603,4530461176980268,1921592889295667,3973075734602549,2513850682080052,8522166829555850,6928209063805760,5999477255775042,1764246325683011,1072738648523589,2506608279832033,7570292322476873,8467263532450634,5075447750132556,168642019803984,5464115141518161,2171697592387043,5372166766396250,3819260132508509,3202882458551140,3756400156500837,3118797922173073,1210225665770345,8729280342778740,843128886788982,2404978737382267,8831217356104574,5907401859842197,5979822463394693,4561254514230152,1432010960774025,3152625585906572,8710505370745666,6903554358133646,5907036855133071,2177439917736853,2056458617119642,8052626623390624,2038618615350178,1686721520575396,2799651330982824,2829439154628082,3471525816533934,5142387904242611,2106403327830857,5151271025980916,499210630800317,5931281050633150,3528355857761216,3828258016379842,8436206120936390,7070423631340493,1535162620765136,8713051569356963,8250036054029817,6995784265843672,8062580527481818,1350346477413339,5505847363544029,7218409580556453,928228495893472,7513972715324387,2983945215255524,361352298087399,3350632168907754,5293428206011373,3111631244395503,9191848928248819,2382600224293876,7813861898789880,5849530513122302,472873104202581,5645371524727811,4404355989598144,8531420970394629,8048177866736649,7440810801472525,6783338979877902,1749770294821905,902423759651860,6066038985909274,738396128470047,2640261429625890,6630735865226276,6093596552487089,6463531617158184,8805026170030940,3516831398049287,3510185916728367,5678028327183408,1654274598396979,2198865218176053,6968730468230202,7605589023908925,2554571473985,1612117670675522,3579931692229705,2048863800327010,2881741587448911,4420399788647507,4475078131450965,8811778276721751,6024429155894366,4576545930541709,9165411847521808,576012196365417,2847545419916395,7415650486985838,4733519619064944,2869443738199160,4539652056335482,8502674859918460,1915249468369770,6480759866672255,4519138671649921,3431013952226436,4566500875011207,2860602038240397,4960545469088912,3720221651889006,4064287342560406,7705376392619165,4080107454981281,1058612999423138,4961428246824101,7471085641247601,3052543135442088,8027470189929641,2655974625903787,1367460331857072,2845003442504881,3160030771700917,5774298329949366,7270762264118455,138095077983420,6423271157785789,712422040085696,2354182736725188,8007527215678662,2129689129059528,908239606629579,5568356604638754,7986248341324567,1197702470237048,2603340232934612,3981915717148878,2387125643519192,3735493656372442,5724686246503646,9009458920841424,4388159362409700,9020839846478033,3553603887326440,7605860014277867,6019571260056815,4442468936942834,2205850501555443,2359452708439288,7047527202800895,3805308621620483,1778072866221682,5809989322253577,3172599285925133,5105620687226126,6911228935202064,5051306298565906,1690261283603732,8529532304393493,6494675960866070,4626952074429721,8581661757343279,8381352473657251,2797849840248094,4428356858963231,172664241284385,3423655467427107,6488787912901926,5621514391921960,1369911004611884,14186859758894,4545728719029551,6855704622941495,976870308988219,3796018667955517,482372428424513,2711436332827970,758855586331531,75954051851589,4879822350897377,3465654254265672,559001140249929,401017259173196,2806770484356429,8957080431158606,5709423754249553,6986795134477651,5176776109426015,4940632782234976,3496422283109733,7863749783381350,2310629817746794,2316970435339631,6017631174804851,6430194912626036,3575699535414647,697474714838404,4984754780431750,8155974859580811,969709000623500,5680820989411565,2941425749681552,1942050997265810,1964383283312195,9155295266514332,6282740659252122,4936045249234334,3439961378768288,8792845127329185,7297299697395107,2590323948709286,5795038844028336,8822671108679240,4468829134472629,8698069921719740,8847838151467304,2423991485883840,6756839341852101,6451016709416391,2191069253363146,2395657154495947,4713420076139980,6059340636390861,4321562023765457,6740662361728467,5532979015656916,88849097082325,3621439130174935,4498397930620377,404962385102299,7086983276766684,1500612446496221,308392548189665,6518065730864611,6962386049664488,2991267831916010,3812215510795756,7386365966132721,6785220743161330,597737865505705,3022989939271160,5987798497321215,6373617841923581,4855412373571071,4354226003561387,1915398044449708,6608430252926476,3290411075324845,2786198107031056,2160316930242136,359709152282131,7197945576914075,7047260260025878,5919561401804315,6927076923893276,8213451252819485,8559580561770014,8594398758233632,6787069489210913,1159382706365986,3458725688935971,9179683726534181,2415237365171752,5801855103540815,1563405756966443,6364345601140269,1523487334614621,5621201362290225,3956658533484082,4130289379149364,169285572093499,4616954367878716,7825203916932670,2017434682750560,7397607730431554,1931988018579012,1870419505628741,1162974218634824,5140526829438538,3677506264647243,4938548384310860,390007432357453,8352754052855395,8377451807729236,8271699745710671,1138013852878429,7322816175138398,2848491840546399,8196460958271077,6870541524461158,3192652311053929,7368703799772778,4231518662362733,4699801317181039,3571321029355121,1218908684428916,4307253032412792,3380955373812104,503491405989500,8795483999684221,9116031637530240,3751901106448005,3414314358138507,261102791108240,4861484620785297,887761062446740,1227905545651865,8521333561681565,4330805409875616,5699282707662497,8101715009480354,5150654180391073,3083141901100715,5735353194645168,7342658711250611,2678445717653173,535014226060983,725337500272313,5421519371708090,1002921745213117,826721036060355,1522969743846531,2321862739936967,7461839772182218,6144504127688994,6107940116326095,4975966167017171,6636964758496981,3007925918942935,7000640477669082,1069127510157020,475086639163110,7161288126509351,5650640813500140,2843501679232752,2131525247821553,7081072057792126,472094799234806,5880195698435832,4635104180553465,1023549870065406,3848433244735234,1647847968818947,2647308406859527,4253907952477968,4037476110927641,8303703758300954,5356316823859503,1156207054866204,5837802497689221,588210902779680,708514881316642,2350294314288931,5647383369883469,323955960358700,8729925367637805,2127665883604785,5505092803823411,8758078139382751,1560770643261066,2827227205936962,9125051852859205,8404358057125702,1223524896180039,1171456615114569,895774165313355,6234889877227340,2254592726337357,8799325810136717,117032748058448,2305411379070801,1324959325644626,5607385456404316,246399953192797,1665079984860133,9201967109285520,8043131680016228,7535035306321767,3184774884591465,8362836644315489,4851000553506677,6908318730439657,6818430742079354,3164553127077760,5386013667993475,3719442315421574,2641776209127303,6333401988859784,3522278002853771,9007479467132815,6420842989229720,4693440887072658,6296320702842774,4202143099881372,5715265504716701,2442470617048990,7773716163887952,617938790188964,3809445777123238,8820775050095601,5521340263647150,456353493895088,1164601105754036,2508966933071797,8012755557009334,4626522310666169,322816608593851,5561936441100223,1331572300359616,3252325685184452,3268972286856182,679197633898440,6868615077840844,1299535325849775,4409768309180366,2110801974585297,5809323894130642,4967897265547220,6857819857536986,3363394501806045,3315097408104414,6465228351907807,465089580525540,4299877972971857,3927046412527599,3991646291986418,5917728581625851,1994647152371712,1850038825715371,5270826985555975,1229314943182857,6451145318172683,2227754708305934,4381564107360271,1951244883044370,6334084410574868,9021804520769559,3566437469923352,2025912686962713,2609891918425093,6557397038131234,2829140523375622,799390641481766,1659193089869863,3841295766792233,8373837804947498,3432787801652231,7788620747327532,5592071313254447,1023418996303927,7775926071437368,302084215556154,5266933324359740,737009566612490,2974929922541630,3669949015197760,7664282183092293,7693911547709510,5338771087427655,8987024004275720,9107727474608202,6005464240490167,6724442020923470,3251505865164882,3683597566920789,2071231564621915,1745730143475386,4261886147659878,44921905293415,4020221282592872,2475300683696235,5443939168028785,5185002872736787,5933125466138744,7560896930973817,2920701189531770,4004691877595259,7417716766189692,6584521120352381,7204099132573824,6767600123365505,6018398671626603,947734072748166,7991680561055879,4933571491334281,5210364540258448,3758573701539989,3925479849478298,3529266262345884,4933427154380957,3940549821606769,6929840266872995,6107755091413156,3734314250533821,8277276317730989,8177519604615342,8258599599966383,5080793447114928,4070234853705908,4559443141626038,3204480247482552,4984535985031354,2735363847194811,872756326103321,5072856454899901,3057452120131777,2706508020476100,2134803600607429,2843442476894406,4919807015086279,7278127688526030,1234807882139859,1386945466804436,8694327953299150,475161999886553,7235412590029020,1723906138761437,8093773646661854,1860024448878815,1260949231577317,6979329807436007,1594679743310056,8350491651041515,9202779147102446,3329166295812336,8529280439696424,5377467864016595,3614613938006260,7735180354668789,6078024857643254,7320789519845628,6632623182314538,5192241455892734,821114255214847,388850436983041,2407318998665476,8976121923266821,364001457465607,5523451014768904,1035823251409162,8317030874195671,6953525996226828,842705134856467,6483035225450778,6568799901272347,542400611297564,7517056642697508,6286233664632540,7908378479454506,6595411878209837,6013306418299272,8740997316331826,8572418031438132,3504848888723166,7410328387668283,5534694643296572,8349095533103423,4419327340595521,7556522734364994,8327713519847749,4406214678063430,4278183620626760,4631876883089737,4885611016989005,7333354381830481,9107338314049874,1362978837801299,349984918716376,4586790090950997,3493922996775254,2120917039802712,2676317043206491,3126041529698653,5123522229643615,9134685773236576,6867240238516578,4410372888979174,8717327276910951,5222713510529384,3249141772168252,4261005065121399,7219087290567022,7324859986946416,5586703142209907,4411614884653429,2104567718152566,6901492445675924,2781252324206973,2695849636505982,3927177908816255,3575592905258732,8848171488364939,5634533084850576,8763261697198481,7886077188409746,5541094589106583,6208082176690584,5947928368621979,906383404239263,1994533907794336,5544859800594851,2105664802151494,3328717578652075,8998873653365165,7165170406263214,3356307829363101,1983385839372721,7270976957573554,1089802891671283,3252185284741556,3453975756663231,6830727886670272,1400374885566913,3315733845535170,3549968704235971,709082162260421,5250109445605831,3902140989721035,7287506712152529,6427126336793043,3466142701988311,940668244470232,1836137363024345,3031331308431834,6975669444061661,9048478014439845,6183123916106208,6263828493199842,1101547056998883,5580263789988325,2947092643416550,772571793211147,4609944777697778,2291413052271093,2945444210502135,1953846620064255,3622115785247233,6288536742267401,1843736170441229,1892882459355663,1186848831678994,1430231778359043,6160086814624278,8877246095979234,6817579761668528,1657146820512295,2813919704833116,2792447078156842,3678240653249068,5822524390705710,457579129519197,5835995910785585,4654926053036467,3628662171273781,103153925597752,4236069437778491,7937549545551626,1062168756865601,7217787251265974,6727186255612486,7928833532463690,1835781677492818,2915927958448723,5964566286101076,5777573073322413,2207984646228570,3072200090970722,8239368394197603,3181427706317414,7933223128451689,830604467817067,8736757241514606,8426272779709039,8951698021821041,7772966677187187,8477567788673652,2013808714410613,7552991650398655,2144076938783357,7344960146598529,6871593084661973,4971584852642438,5450630059616906,2404316165909133,8542433116711566,5813342357678737,3143175898573934,6376174009666198,1466812165442199,1856755461661124,7783748908444314,6915296477598149,2561534718347938,2394564535790246,5321648592947881,6057007641832107,7677108461316780,6348828375091885,8546113793551030,3858082034150074,6847574426995387,1401414333436605,5323675138083522,5353869223480003,1458453715372741,7745628721654470,6565438784465608,5286894855023306,8660716085807822,7557668727343823,3425483873274576,5569881107352273,7361174332558037,9096211336137437,4820223158987488,7637389140222416,3155082184772322,2116408114154214,8874483914289617,7327663135558376,4391502978484974,1196438038366962,5046581575273208,8356586342501113,2690410222553862,6772078227696397,1095475880962832,649194940500753,7803276305517331,6333002994535190,8145091976540633,1222984216808217,5059466476514076,1515553869496794,6056949206952737,4617344492718882,5139251493071652,292727759973159,2230223596596010,310719593122603,3977509428874029,9091854801390384,8160378720873265,8288047449508661,2876900697422985,4213219087297337,5435114809619998,1757097440168768,6886769455156034,3369363154963270,510015588535111,5003095081012041,250457758149451,9185849775696717,5001905100355384,4289358469557075,7941994022497109,8521712943901527,4657195613244251,1531667280096092,4809741567994719,183438555163490,982318848101222,3875442628356968,830296797440873,7409664795569002,647954472921964,6609234592525166,8689015531882301,8136604696734577,4717245057201048,6151285309074291,5847326812819805,7995695627979641,413739359775614,5494840785259393,5974581510417283,2231527697337224,1975174460607370,7314883553995661,8871069743262606,275777155804047,8574511800798096,5143746679679889,3316005843528595,7412775544277232,807505584417685,7798284508613527,4482397744008088,5895684027411353,4760771420351386,2835171825552286,6746535581448005,5331619026791329,6232238304668579,8197129892653989,6562889603148712,2800492407352233,6871047621069738,6188952224123819,7518007953755053,1253169280691122,49608937180084,2134257091439542,4978491566888610,7110599743892408,7161754126963188,1765006506970046,2615700660419744,4395538317593538,1883686984444867,1795670472321989,3563368506174414,2712368411780941,2223573922491349,2498249222818774,8113038053272537,5055876417014749,3045968562768862,2066930987690976,3143470679632867,1191941335944165,8228064857009126,7971468774236668,7383061734616043,798539460668396,7368456249427794,1120833439198193,8387992786471922,4162404964846582,1298422803696640,4973198701095937,5364885247462403,6072263858457605,5858364543421446,2453961611373581,4171994473648643,4383410069842965,2583325567626264,1768415456726042,86644435086366,5367651102329890,8290344046652451,4029252329483301,7632778338020394,6785704130604076,7643864723590190,8851280650871304,6019622369062918,2260726898494523,8110779681918012,5231876892068930,2340621809888325,4854366147071048,2377071783677006,7149558338939985,7007698096206223,1804647295339606,8605555906880015,6919750572215391,8661647267564640,2314682498354277,8277173383662696,3386299904437354,5751519966046055,3832194219830381,8085668591504494,8053904025334291,8750014114884724,7788961564789878,968258011204727,5065584660622460,4709729128680573,3036359366298752,9142097140984962,5698245217094787,4565701217750153,442681054719116,6742878473923726,5750838807809168,5733269439392914,3957143209921683,2677140197936278,5285331582528665,3440325456440477,1740019019279529,2133197568748714,7187191950672413,7822832099825523,845238338260169,2533827219049656,7301520521727162,486278490385595,578616652754109,7619747718466759,3763621453778121,4196708602580171,7677605777935564,5440811799850189,3785780202826958,4219112911617229,8142165712055506,5668169501199571,7797397928512724,4835864955014357,8329722351766742,4671024203940388,3067669678722255,4691352079207646,2393839536737503,5648430967852256,7136324408061153,1466556729527522,8071713184386275,4728587605544164,8271049187429605,6305914178956518,7226691320417511,8787857308724456,4069538630356202,8107206277491948,722744855530734,1860082671152368,4355215911070962,3719312966119031,4646103123037430,6471213493652730,2944469152451837,7231157537311998,1213516103290115,5433846893243652,1068384744779014,5271316325469447,6646350232187436,8250002612284684,8072459928497421,9101994397469968,5537689428749586,6271649105480981,7513744552594711,2593508573154585,3783222098726172,5181761989963040,8323685772037413,1309772611382566,7715202401905961,4210682152258858,7680987038551339,3176653885205809,7971861047692594,4266135025315125,7500422915042621,689136937217343,7458984848526659,1906797390639670,7486653924019426,8060313962237262,7996488066764111,8466344960398664,5574259442601298,4326139777551703,54239683505499,5404869901675871,5414761167039841,6931945888501091,567703458614628,3990264613678310,4646553963384166,6912419251146087,2433285409566056,1486918795193074,7371846166949227,3868285672017260,3844556926684526,1508493945122161,6273573813865843,7891770070617461,3023126620130679,1519245952109944,4477542252694907,827056854879612,8948447838858623,4594452302359911,8793587883307585,5950609790733548,1226036724051339,4516671079345549,7364117633961198,8186204800257431,3724562129882520,6834058457984412,800085496130978,46486205189539,2872567615024549,29223971990951,1993355624517033,4104156990795178,8219583639836318,7484073486470573,4627373795814832,4438868513246643,5733694104202677,4469272558710200,7248023446818233,9096493060869567,4027445941030336,6940739770092993,3142992196275653,74130343947723,8964697751145933,2468162538425806,2843439497326031,2983128681319890,1230891798580693,1427631553826264,231200608232680,5138586405604829,302984282757029,7534021265591777,3841461633461525,5013660658765288,359384400702958,2588566191369714,5379692215284307,3546752968175092,4574010567970297,3408085247176187,7881406919413244,6642581692648958,7846151169953279,29944869924361,4229409613360650,4750972121665035,1820027083279698,7393948561061491,3656281697717782,2294217454317079,8002601166646809,2390827960086042,2205555967987228,4298139975994909,2943965724880416,6789060998056344,8391761145811547,2207710037560869,6524575916591802,8513908310945321,7456188860624426,4812490001575468,8898300527980082,7666685107719733,5566522121768506,6070353421300319,7626820170452544,4879612126652987,4056867518782731,7175575221014084,1221589919606710,539949168987720,6805092228419145,7260337724124749,7698886498020942,446407338351886,7463362793654201,6714658847072506,2388250147884635,5232420349170277,845490332593763,3811761829703269,3094425182801512,3368452787392109,8502412092493423,6129657946459761,4913440093572722,8850345840688403,4844111895318133,4362327220195945,6714727424888443,5883049773728362,4043532566154879,1573371789990010,2019946387377794,7255099720363652,6506428419305095,8412538631851658,7466037746168925,9147294528745104,7401414058564888,1133374298853014,6606534936356804,9110801678995100,1853840016633502,7689770953002655,2874314773048992,6869225310318241,792103185567395,352544765103783,6700042416180904,3361470592364202,3190908279754411,2675287625977983,7468580051288690,6047275565239983,6864876113890992,7055681756929310,7820656289869495,6744805611491002,7325978046418623,2544292805160648,4166800937289676,9159100378640074,2714764268328909,7256546470817490,5098905644617428,7446321849952206,3803153641909974,4960743645359833,6654312499351260,6850234292825821,1268729866153696,773300119989989,9100553994448614,357154941013738,1325803534012143,4496580831547124,201984328658217,7845003398876920,2768756589743867,4552315307192064,2096728784817451,3770241312630492,7386201285439237,5639975031729927,8498298488934158,8643395809611535,6788807426690833,7436405029031699,3621595767967509,7239642992393499,9165555121936346,1819937840697118,6651978523717407,3771029845896994,2488973226315555,8096621738643238,5541008519024423,446425799790379,8998629267279660,4185679022075698,315360972369716,2482400531713845,569904757960502,5652588966250146,2605881416347449,7140824463691578,6777342224355134,2309615104167745,5957966045895990,5789109992509258,8143798332059469,1373168692260687,3140548421359740,5477176989028179,4168174552305496,6945942085996380,2487348401491805,7660090682601310,5135180012892003,7309099177299812,6536914913382247,3372036337842565,6580866423836521,9032423282798732,4480447493492587,2273561500421997,3496522764918077,8207080999931761,5452670013935476,8406528877019387,6227022036045696,2961259752714114,3563926056882052,1595044840758593,364636743987081,524772168347530,6339737655783307,5636665557331855,186521111613328,1535483556630418,5569287151079315,2306116282158997,314564326756246,4054811021545367,7622546982150848,8347968760598431,8376095427301280,5340714454454179,6724105559363501,1891774857785262,7661600233058223,9070152635747245,2231996770332594,2675618703282100,6553079651217334,7502777827981300,4187788588019100,1743897074741182,5703849751818176,4150039145828289,7707120199733186,6930133434142664,7790700482645962,2570477258960605,8626228034809813,7181044392210391,680667631964120,9154353735626713,5734227979227098,1628959104980962,5514080073936861,1786766189735904,197896793688059,1100590360072164,4155857370869735,6869232068472813,1823127919603696,8799243947167731,5946005601890295,1438242745200632,6291339266256889,7745851884244987,8967686305517569,8561531386077039,519018802524164,4622006158798853,6850793700216838,3295062795448327,2462056013189129,1427633473515534,4460353787432975,220677782554627,1055721629249558,6668672989728800,2287137305767971,968082482122788,2449949661573158,1975192839213096,1049711520428074,3995872472068140,5525100220731440,1259946383642673,5994915603542069,5448941743329334,2376705396961335,4151161845780538,3137985317564475,7541710187999292,1009410289594430,8566657249652800,2191745403973698,6887359370702916,7547749057916257,2025346869350476,7427968122543458,3528469661904974,907407621099599,272028120117328,3757885448179793,5679605108677987,1951898263416918,2932858264621146,376372861104220,2530297053188189,5802183377481825,8298040855056483,2160367982915685,318016754159718,4741191778857063,8928162551657148,4670938188288106,1532709546160235,4415844470263919,3694210706600048,1190847010746482,6344014036037748,8754127310467774,8816113798838292,8527180390470335,2741287850963068,2693210204704894,664882453098623,3536563067433088,2970327417901760,1346017212608642,1916170328748164,5716470708146309,92145526476938,1520478075441292,1295098519752846,6899424713934872,1169418604073106,5145487201112213,6287802329616539,5703641949638816,7152058485510309,4357120843119280,20146794434728,1418036408373417,3910291192738503,2421884624449709,5743107468718256,6744762111200627,6832012031496372,872036282609849,4166525393105083,7994159724236989,2363732518121663,8296001072091328,8572692619784385,5124886415356100,5817175187017925,7597930996412616,7277963586302153,2858477359501525,228767641137371,851333961355484,4977943852241120,2752107366838497,8455803295985890,7946371305926886,1021138779716988,906471841460458,6040099328954610,9168897217089779,383468611457272,3560867378270458,2162113387606267,4296048970592510,8316929888965333,6247411015831813,6286183317156102,7675852639449351,5987872828674312,5957302637023501,3946618834317585,1942421627605273,1144725593905199,8925703100789023,10007048868130,572103046746843,2953124052537639,1825795317346602,6755235961155883,5038488494772525,2038475518701870,3744169144381743,3253442424901938,3063643792437556,3454794900156729,1489496629104954,8950265096007998,4964852236497215,603365505782081,897458733904196,1134986630910279,8657192826417866,8262037844729228,9158202546344267,1576231832670540,5999340117897549,6728711664693582,8343927250645327,2333175627297104,2747879338668369,3867468009632086,2367394814202199,4977443629396314,8237361202522170,5699705460765022,9118545359229279,7119261749104994,6034022657249635,449639062942055,8860186447505468,3918471347045095,6181012260581741,8993063367430513,4064765510390136,3825405623374205,4247250112647550,2079416857424259,5018159039721863,1483237736518026,8905018405875095,6539900881940876,2718457177846157,8901457151938958,3947059659649423,8261686481924498,4260694921056662,1738197863788952,8900437309051290,8719678787080604,6414518940946845,3416234344026529,2106488754778530,4523143431729572,5196995954528678,3347931147309481,3283182493001799,8390646627127725,1174000961884592,132345916766280,50063046996402,3313556764561843,5316523253354933,5800504244777398,508627861148087,293253318226361,5829040803926459,1996492258652606,5084367722983767,1444379988652484,331922541212101,1848249020002760,3303031369929161,6307400384475594,4833934141936079,6857506137526737,7265462857650643,5700063402643929,5122353103262172,356111274881786,1700400855871970,4506474367554020,1947696973124069,2554377907057127,5815338637251054,8546931778687473,1759783672394226,2221561652908532,9170208248656379,1362973841863171,162345470923269,4333453202436614,630550128652808,221850814460435,7011608236593684,6639235742372373,1475876733219351,5202957322965529,3523539396776474,3692408645055006,8687020010584408,182809303238747,4383750448738854,3212926319514156,5008969832684978,818375150375470,7306550593065525,2660125187232310,3886665724068617,827734614659640,4930528725914172,8292502592287297,3499466041946694,581042033537611,6165819735593549,7301559407194705,203929661723219,8372675726996054,3199653863641687,3917778273710680,1052963894137615,8223133623259740,1879392838144606,547220313395807,4185281741509217,2276757323764323,38904658552934,384452525879913,3810198260060778,4350807175156331,4907994168160876,8071745999581806,864335158604399,3834842755953265,8650213105940145,8181959110136444,5157211798254208,8063938638541441,8862879215506050,3284187731105899,6757919993664132,7107537452905095,940955604742792,3491386263941771,3133578810118797,7788829781258896,3035419643048593,6883402271863446,4507441213198999,6211287574415346,2447178933768866,1424775861170854,3024603860071081,7914476818281130,5358339179647660,9110692646646759,5440300737147572,6124188167877301,3187006067020470,1621508445352631,6433266864313017,2030596886680250,6006732854309563,112814829466300,4354546609869501,2023371436831422,4805855685571263,3603238032839360,988659137893057,3314348661109442,6846493649875655,4273365810500297,8329359460635338,4011540701188898,676333373308365,8242489260085970,1726175221068501,1198307866432219,5969448418251485,7145166219678430,7813416864658143,5358593464931042,9037041672008421,5743043307360999,3270341236028137,3905649682969322,1043762999636730,2684444258931464,1627204460442383,3887158286480146,3855484290420235,1516089556235033,3264241063703323,2732232880886556,3848437079397149,7350381034885920,3769249962742562,4701024459371299,8870747682367622,4706017904890671,4142223480722229,867943222113078,3766217191030027,6186954942632761,903141373350718,7611805485478709,1311390362178379,3061578942856674,7309396745917265,7817282023199570,7543096147669851,4067415026234207,221965176143334,6477691840631657,3854540924448733,5742242168927085,504627159683953,4410763926778738,6791120571011955,2978127687064032,133915215557494,584670066144119,3716959995466617,2146345813078907,6957515655459709,2171999316013950,8230187375519893,4014059049360875,4698062262342532,8439122540198636,5897045337551750,3765624846029703,8612599787516808,6678673755469203,1822066251076492,6216897276572558,1015593859511183,5196683350826121,1690236277617553,1957734447223698,4492034050798488,556701565031322,306051584115525,5088166084285344,6194023421309857,6489596733207465,2707161973896106,4698643781850027,8569463842386862,2291222676935600,2156090152014769,3993983758061043,276256761664436,344754827629494,839089917412169,3259880528204729,8514863448451231,1630683348825022,8425606792819647,7989345345827778,382419774305099,4591914116019142,1708429959705543,6817475914560460,30613301031885,1351130505737166,5287281324692431,4340888906213539,6640438213465045,1860725274072022,3479219959976922,5182781160281054,6698235287303136,2918201133954017,8523922245268453,1559508259804135,8392458808570856,3303434595565052,2119234771416046,5676633189438453,3692810187363318,3023485159396343,818648478192635,3564361708639229,6689591940076542,5365503656760322,4563490075651,6593456666686468,342744063357958,8012553280975879,3416986261788845,1777124431623184,3593049561650198,3589928730358811,1780286422897693,3406174081086499,583868671448102,3646646629725225,8919672203441200,5488933134685233,9217811542496309,2626511074194487,3737222453425217,1822109064385602,751381805003843,3697977726276676,764418412500040,8795720005645394,8726938087717049,3584713648714842,1275698469491805,5299691270218597,2978714801189984,8770869530656272,2011303833664721,2918534811579502,4825901581128815,3751385538336958,7409709048095593,5876689275278456,3223765255984249,4415583490692224,4624244896904322,6891415802033283,6432816716215430,1316292737356935,5845713343919240,5577281036686473,8918483561919628,7135043563697293,3539950044026003,23742876718230,8217755937477792,8332438187154699,1190294000309414,2888464226471452,7787619564153031,8299995797755055,1290511328515250,3269605727540408,978021626713273,2996401179524640,4705087514268867,1984455774575990,1332059017639114,3806412068394189,1368087894217934,1097658219001046,2964075966166232,4832779265668316,7316615102682334,4070117974914278,4556353557345512,4576454013957361,76755026924792,8655574115682516,1113812542701184,6409420779511211,250153297351934,3747285172131071,8107202902160643,5508618694153485,370362743026963,6994311980250397,5795592462939422,2657826036249887,8570784723154214,6148704760968488,9098550292772138,1331907631215915,6789175504164143,5318891084944690,8610818316256137,2725463658919227,1093070165669182,8332225520087154,801073281447233,8124185099474248,1178735602652489,4351277873149259,7606635999171919,4896307407074640,8264380555040082,2865647364781395,6053431288796047,8695311770088796,4483952334550365,8602865948144991,2037177755954747,4447086302410084,4867138272851313,4295428687664498,8519299666015606,3188169011311993,6113624854910330,7191946783421823,5085923330199765,8348282057217411,4629831380227463,2542357572179339,5404271971833231,3197075807220632,3642377874675091,1367766261069204,5982039082988949,3700102940767642,6900767087416218,1944670149930565,7003333990159777,8243481435190691,8372687411069969,5047133390804393,888724893995461,9154417740977582,890627070473657,2168800646100410,645319610267069,1280938446345668,9072006467737032,5336949513983435,1441237487182754,6706231491179983,146127653328336,8000874950571475,8377425149122004,5670525027513814,3753807133586905,6281489896986075,8556049754338781,3271361005819362,1343499385206247,8198822393329129,1049812090729965,6201855680198128,2435323074377204,46354773784056,928160831075833,1462224736892411,8030356239144446,136519263434240,6362306655483399,708663069939210,7582712061605387,123884679943697,1136183572223506,2740680381650452,638697621181976,2202820255860996,5377450001978907,9122330413250077,4871783763097118,1230042774418975,6841928626370082,5461858100852259,6982100894135846,1172396540401194,295806709126700,8286823385450760,8587524390421427,5066042765612604,2224291141940799,8510708138546752,1985861458261571,8003269648356932,8045074767304261,8605702032528967,1595487656203850,7942757057885775,4460507696035410,227336521963096,352547639655820,8624011977119323,8570487975196252,8016055916975712,2525653740795491,4560071745443429,566673314218941,1595572543805041,795284268505363,6304714864227966,4372404653480213,1296165237929601,2679773105895042,6121610426160778,8259852643989131,3367201846736524,1243526191317954,9015341015963281,2499702357612178,667777571813015,6063361313773208,7105264078083738,1216448967833246,5915098517012080,3916042841314978,4826751933011621,1193831107950246,5597576511592109,7581055794362030,4021620243314352,5700040424699569,5912719603726004,7569686758241978,4884272945329854,2685763961370303,8697805646370497,6447229199480514,5232314823235269,3396694308763338,2772530478708427,3141133922211534,4730265750137130,6788077640160984,6889096165299929,1081294542051036,2339641436821214,863204073412324,6906005433743078,474582463895271,6098218080106218,6935833593411308,7984074685511409,5192452072716019,3511304128624372,5607099379169014,5405685001017080,1310366773122811,1457398759696682,9026700362454782,4835694686590720,7468064597841665,7646832054515458,7898469851141891,2162700205872086,1961526690815617,853999029204746,5288914029524747,318988277225233,6790834790627091,697517699389205,8155637521168151,8956357696024777,1293195064596251,1098290120418266,1769063489132327,2061110697596713,3236354830628651,8456409267807197,2889758324545329,2629065055638494,7647551530628918,5338470655571767,7055876264408888,4004198120395798,8701267868943327,4746873423558460,7821814810498877,1291143661689926,853940116772677,7894632486098763,1438478305752912,1463673172907859,4886143344686932,972273321154395,3914257993561949,6621344319584096,8480457744234340,8458516106844008,2981094574846633,6406050027116395,4620587127715692,638559974512493,2167680993949553,5820800870717299,3667049796679542,2118355128224840,8436831327786878,931331825964929,803707180969622,684664496482625,4330988496107410,6516349462992788,3043030588225430,9188205767975919,5497883445786524,8064335644923806,7745220865185695,3403451850839970,7575362669008804,2214538150393765,1326617393117097,7538449288730538,272413809342791,1563861854820271,2880812353907016,3640904927955273,1175015623038904,4870804441965556,1262383768407711,3315980429817789,7779982915459007,7962330599077824,6216310332438466,8794543627360203,2790324245927885,8136327703828430,1531175165687766,5592426123990998,4539510290364377,3823782172956634,2364338579576795,9076854410049502,7654230927063007,2053442009044962,6009420996581351,9106219945465832,3395405170472939,3962519380695378,711033363853827,8340410632165362,2690995642947571,1267310042355700,9141552355768083,3695064758114644,2651803430041594,5704372547418107,8062211619665918,3196645871253505,3806744147458050,1339439976912900,8467565115672918,4338376216475654,7982876212451671,8795598660974606,2560202088597848,6527433330718739,1944420653340692,8204275368523797,8379327043608,113344841937924,220914426689564,1922100314617891,7435314650552356,1428060389120038,4188580025341999,9096324063811638,4167517821679672,5036858399807548,5088044762721973,3328255108921409,1669206161766469,7629787478440289,3898387508484168,581063703189578,4456435590764620,5445885719107662,5299946680580177,2609286465386583,3935907380115546,6951010473260047,8797541348903269,1775693109827682,6458584239822948,3828606035990631,3411087164373096,1566043634186347,5804517473400942,8180960171358319,2679540684327272,888947635935351,7779194030930040,1641111305328762,5490427301623932,7492930671007871,1904243397032067,4573890777413765,9144809794123914,6050381968529547,433381736003727,6893909951985809,2774456301295762,341315665377440,6158508008339617,4909029021275163,758250220558506,4674388174272683,4507692660938924,425446545799341,2999298319333550,7744907788662962,1764590423521462,8475324173301943,1122219276212409,7472005261409994,6120233010804926,823441477605581,9166728653248719,2000909415430352,192536802397452,8202912254294228,511752268404952,1768792566757593,2002190853252605,4993468667492572,8890115047110878,2044414324660453,449019620178161,7709516121848050,6314293840853235,7948268895844598,981691486966359,7982513386838266,2519476355758333,6768272366622974,3472621769439490,8886396564538411,5532908695312646,2426317362174215,6754273552473815,1360168978249996,2945589997787522,37169694423315,4967289171753237,8230916391328025,7410865435080989,43936261634334,8228031725582623,8592606051801376,8985635203799329,7519164601947185,7780995393263912,2448091435956521,2814898468919594,8815521564967689,5686763387541806,2533714629933359,982601502423432,8406726998071604,7281325312645429,7181469419010360,7774742265190719,5598210802866503,3105895388911949,5309347931699538,7178169765116244,1155899327420757,4346430144190807,6707869598669144,8333814354057563,8738359695180858,8046485787703649,1734949892487524,2277883159820648,2206646588586350,5300841833748851,7823613674527095,1133051967428987,6009692740647293,1264249853942146,877761554684291,6674882821265797,2274343343782280,307968707246475,5362393427794321,6735590857038230,2783340936640920,5952527881468314,1732038501472670,4515154785487729,5663563466131867,2773673851263397,8616598128957862,2472798790769064,2913925317474729,8063181047560618,3882482896787885,3270055887968687,7885646647268424,1784553198329587,3488929672001950,1192566747896247,6485647588481464,1396019810187706,7734645637577148,846044425230781,7387042009201091,3707601845632758,2232100255496647,771683641661897,6965299964948215,4435647892314573,6109604001500428,7510056062108751,8700284840995145,2601671668881887,6445373423188448,3691061145770466,7655311330171363,136509137992167,4564903843019240,1257328596482538,8120747160395517,8353519326476785,1929212572957172,3808697759947255,8706515161537016,7143235872299515,6762198157023742,1975648783931903,3311741302684162,2717508078860804,9076408804317705,3587233797528075,801132631816717,7100269100431886,295718617536941,6858406589889041,5467342627101203,6685027410106904,6649440529738159,1523832975309342,6949999179713977,4458101331597862,2049229646567978,396552987261487,4183939711597104,4020766143011379,8146429678901816,2274679631329849,1638213449931331,4177641591159223,646057290979916,4535507325356595,7624034047127610,5077489184766552,8590816765368923,8106061657037405,6853340627843683,8412957301111396,1011514330667623,2076652372841129,6469746380599423,4778392466340461,1356023551711677,2165389089716850,1252702422088310,5160038744122473,6277737456286328,3662577129355905,8251946590730882,3801550053845441,2442329103047307,5238008681585292,2071728115313090,5318128919812750,6269218203064976,4322739555973571,5435091062428782,1372413371980438,7289714677897879,765428311030425,4914837355117210,6271341733182107,3561105168145055,8192419349682848,7381501722827427,6158693536815783,7007052762585775,4471039374178992,9035400620568350,5917849685867190,6424677246810810,2265367359437499,88523759303360,8698242812074691,7240293811763908,7747379845110469,855017549331144,2293376679221966,7669684087126477,254069407226581,6803358136972409,1140103656667867,7059404222929628,2586158964177632,5043876050837929,2099398848256739,8611178875275729,9037957470026472,1809461753830121,4721007971236587,125535243352812,2986307906124526,3437957787161074,3507272489589490,9119675411491283,770667967240950,2257625205714549,5906269109730041,3146610934627066,3195226472419115,5945129051060999,4624728488565515,8165445792135948,6244612863171466,7113310668045072,6265060407524113,6396694951389657,2931271505214234,553788652985116,8675926733601291,6594385704644025,2960049190263586,7767694342699811,6595348848139044,7896470435756837,250726432062247,708758991788840,3723347513883435,8763194335037917,8612670288681778,2721472354016052,5378964469193525,867106438757178,5853619331242463,8491443475725119,8080312709733185,3509931541707586,4134047114304323,8518261779200098,2974049355864902,8609484369473335,2388660502182735,1991611991096144,6347269455502161,9108098724133714,7526364250889045,2549138394938198,6367999697525592,9094997157411675,8088091420834655,1351310369823586,6674616230706023,6379850097474410,7269329346083697,6402499406011256,1434384751254396,4236831490653053,4184390983863885,2674016198278976,256503859256196,4798140999779478,6802974951963527,5077720133729162,5611846447799179,3609190710828866,8356600023808911,718020457692050,6245069256948627,8730210589244309,739148713384860,4112675755441054,2875091663908677,3207451088944044,2036190771612146,5120558838807473,9043498870389685,206570839014331,1592884823366588,4938195073339210,3894620357049284,6869442631171013,2699424226696137,4823664684071882,5873094606535631,6567547658763217,3913507879640022,4276279216910083,3302748887227353,2800124385549275,5984569243679708,6017496424154277,840682738219515,8738893625211876,7003306073250790,4994528376716266,8076515254402027,7968109929913325,3963579347575976,5420927388711925,3913135636601846,7266108439116579,4073020034923516,2523610030161749,2889862278085635,1614870418373636,5521179979627526,7242299883109383,5742018608700425,4572232297348106,8436500813470457,4661556493933585,1010210393021460,3231766884335088,4428832058342422,9190745488672954,3032406759791650,797006877563943,518942872837160,6878564422791004,7823849446775850,9120687633538092,6838514589850672,1249970399886386,1875210303331382,8069999322225723,6555689835633163,3001304262581317,1581327743016006,6464253820673095,5950679195991112,4718536229043273,3572470221462604,3978173903739981,7961908113587280,8126096801373265,850443675040850,5165148482826083,7380670262154425,3790701109763162,2581486849989723,6966123524766812,4610782564392029,5882261632105568,6576548421221473,26074858216554,8923737780198511,1690853266914418,6295642293045779,4221126159793270,5078488494129923,8743101562674300,939574643239699,668090599857278,8305712148053120,8042551656948928,881251590180715,2122657665719430,8968188922756232,6328200088861833,3704546475515021,8165408111475854,4020124114795664,4662580415626389,5505157983173787,1886486962298016,8293147428912291,4466053033114794,5820109151542443,1203097596320940,7594133275442351,6629322474497224,8895129157450933,910644790107318,901118242397367,3217307135881076,8670591430425788,572641237376189,5020293974260257,5757301075590348,6248795149810893,9121074227614925,336740690599121,434816819649746,7490568755999950,3014082005956583,6779190884621534,6115263980944607,8067455478324452,1760732663586026,4706856765418475,4608348498124016,169669211897074,3566127766668500,1845561992232187,3065015872109820,5382563868204285,8762220945534848,5614391003323652,1420306973408518,8689128909954313,5740108854148363,9028323320221172,609606501104910,5841834511416594,4859197230939411,1344011202600216,6540553692314905,5733503966444826,7666600885796123,7031087875595548,4474823710620957,594532231740702,1183915128225061,5310142575295784,5997743557033259,6137039542533421,5444723966303535,7072701488335411,765361150090549,6379986375335222,8015031613177143,7976331230043448,7294220351405369,8999486411431228,893631357500733,3198127402809834,4591314748964163,3704554423622987,5845086011825486,18965531958607,1626939353840978,4219092482137428,6662569160105313,7478972947823970,4368057262275939,2308341596298597,3011156176452969,5977322520059243,865399525530990,5670828934274416,6256257859667176,7090073360276854,134321305160363,7245833841360255,5978469694020994,6063810352397701,5842681546882440,3550767462464908,1810365775371661,6676659153051022,2412527541075344,685275386224017,377043249396239,908761641901466,2246168186167194,324726770245024,1802772070817185,4966094590786979,6371359846751654,6806734689967528,9146412639993257,6804118063480235,2680917487631793,6867662693268914,8931558531726773,3973692923903415,7935397626741978,4964566295854526,3853138653183423,6630894055316929,7387252357397955,5767781426896326,7700655476667342,5327189794683468,4445096401624523,4654709595291085,4597783896416163,3639076605378013,3481921756323294,5517701257969122,8620434533006819,5753337099435493,4517629881089510,8934909176790503,4732791775346152,1118841025674731,2361388403129836,3922064259218925,7591446518636014,1880480589561328,4359405330710003,5384026560347636,7127111460634106,6684572504907260,7129790805229482,6074652014779902,1344011643878915,7524561278852615,1185821334085128,2690151426874894,1246524450405903,5801815956299280,6421751742258707,1119581926112790,7908194593816088,682410131299865,406780139581359,4783585916952092,8364496565413125,6632143090548256,1142416938651065,5816084084391460,5866131206979113,4447445008521603,2441021220650541,5369391520488834,7052207281094191,4538339206512176,3701134235860532,6061988753227318,7756284172860984,4162645645044578,7445337253723709,7079748626193983,2451359527275422,1432548800912964,2401395072761418,4854917628657228,7519415707926095,6288032227294800,6149003147493811,8104419786653267,3639004433171726,1882882862964314,3652322834964059,3821695426223708,3670553702002618,7257179689680478,8554368928005727,218340994645661,6978736959358224,1994554149944930,5260774588391012,444097546067562,4436986768957035,6277536017915504,9148592410988478,340670693850743,1274037924241017,2282948403773050,5770476365528699,7911832019910272,6979937948704385,3220551875985026,8722987302383471,7903522081840774,2323831405485705,2463349306474122,369938083643022,5973500950380175,5475651302792850,5859335913031621,3013220233936535,4362327463977877,5830041919856285,8076396675464866,7757210199113383,6111989305523884,1364602448068270,3792612005707439,1351369527332808,5671847309467318,504497424162489,4555025561861818,3715831708005663,2751832607166410,6113731353116355,4525732384325318,8596566651946273,1254010487063046,5427825288412877,6857699837101096,7615754260070107,304717789331164,7848185689153245,3207219704332240,2451760000270051,2928632238849764,412028979388137,6680081292222187,4718622267781074,6748259088203502,8513174133286184,8311208800313075,1757031003078390,7511133951368951,2498848909467051,8657354432249601,4780585550012171,1778630663651089,3490049448705817,1427847019134748,1664319533252382,1943805830668063,5940712001650466,3355508739743523,1370295111434023,3397663582453724,9192659101940359,3761655844642605,2598184680095535,4137144513535802,1959210505535294,8125346444828479,6876390869581632,6034784568123201,7735529933528898,4140517994568331,6475417272958791,1979661500555080,3827735735361353,1712476396371786,4346781244849995,4306666957348685,7865205289527949,9057303416135506,2449195085758292,2608608040688270,3902482290466647,2175793024065369,3230460941672284,2226183002160990,1807283592404831,8812370599984993,1295807169494882,6149795723747177,3871869140352876,6533238080429935,7736983402340214,8350999590207351,7486011722493065,8014606278541177,5429769447153530,6418735284969340,3037121882677117,1922607847396952,2311840819388291,8036583503216516,5599903737526934,6316782841372550,2135005900390279,7679431859625865,1911124328954519,1898374722477969,2805000308498323,1351425581711255,43372504235929,377157697716122,6103131569659803,7430269122513562,5976142048436128,4360498809223835,5929130328244132,8596849005690793,7921161491759018,3095036075089835,7379568014778288,3777840190652337,9204016296492978,3147320617181108,7076199564678102,8234189440942023,3687515421302620,3513791359762381,3390903059046351,852508424183760,2041563367972818,4861739008090068,7683639547437016,5099494439616476,2185081982992357,8784471482941415,4789613981704175,6736652331016176,1648085873827829,8561156419076089,1375306806493181,3749013072871423],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c0c13a28a687b655688f8e10551e8df1",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001023295.1/GCA_001023295.1_ASM102329v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LEEL01000001.1 Enterobacter kobei strain GN02266 contig1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c0c13a28a687b655688f8e10551e8df1\",\"mins\":[9174394000928768,8350358619417537,7330826040754859,1970097281110020,4934532345810262,4055187267891208,7098891653795851,5935308952465420,5369940733192194,2173470126063630,7833562538004495,8128628964921360,1279310515974161,8953214513633257,4874784046649368,1929594834198555,2002033368077658,7475133686493214,1770715724869663,4768660175036450,5053116140150819,6870784109817060,1426025971404839,6853790728679464,6324968713437227,5208666813857837,1577576188677469,5622291443028016,2096479425871922,1776871632338995,1492650785964084,3754515351003190,258682521567288,8602920946987700,3183771204767803,2205736470011965,7735252931657791,496174552944706,5679279541248067,676667744669765,5025111387328583,8887438387438670,1993876957761613,5860968252768334,2396407965708367,8372275197214801,1139060435087443,131714527027284,8974969563144278,8082244268286039,6371038297399385,3270691507495002,2188984367153243,5471796803022942,1424325455508837,679803688431712,4148979471700066,1862043465486436,7603270596453734,2268854895710311,2969115658518632,962180366454119,5251261108064364,4242963857481837,8314986575259692,5019492388794481,7280478100111474,7306295232757875,5292519257879951,4387296483233910,48963811471479,5529290740275402,7673370736291961,6721778213326971,3156081700946044,920875627158890,3186299884253310,441072291672192,3289042465262272,6241067362156675,3476125820145796,2569804992065676,1100873166192785,6337871045558979,5353662376321175,1337064654872728,7677295406261615,7551031338533021,2505287736975518,2853320508325915,936075973243044,4058579690025125,6155378851061926,642855410217128,5949578012000425,1055259342504106,2795924386422955,6973097582645420,984441013997741,6625915420229806,3438638732226736,5246037579337908,7197175079992702,3707115140448439,8356618276668710,4185203612110196,1268284908503226,4761930861793311,4911354802733246,6898423508816063,7886954497236393,7215779146187355,1086620056850627,9112233780332122,8185895088596342,6453275045732550,4487489016784943,8359324993212674,1055385143738571,3546504779768012,8660789534118453,8849802582807775,5967984544142029,5583196662608081,5569731460890659,3699280525915790,62256777502933,3942002217459927,750055353581422,4161181296234714,1544271108255965,8306267454439704,6649285789757663,924985843993296,4875519573614818,3689545552437475,4466484413501668,7710499138355429,8785723196285649,8439490605805801,4125869170135079,4388245853751796,7123945297940719,7890959799550193,1702189834371314,144871791243507,6343072387830004,2946128697467125,906587422597367,4381599870726392,7085822322738865,372349193339131,3672900753690877,8337636422447359,7574616670665601,3654131261145345,4277588453888258,2336486114002987,586087433208069,4989453578760454,1663057583862024,1051743371133193,5055229141786890,1105201812128011,6605667529691404,1514922907300112,2033202718511832,4743709993922834,1638528789754128,6007297703915796,4789860444266774,9116721009476313,3919483724861720,8098712991035756,3708231061221659,130475057053980,4021161640579357,2124692735865120,5731594342940962,5235605218758947,6328436420722980,8389311921811749,2481821494937649,8753058681661780,5431753301459241,142829762195755,2466798835577133,2986026091766062,2821255075821619,2661575505121589,6567262305534264,3432355782369332,4535855707689274,1876203089594421,525269057945920,1861224210092353,8341736393326415,8925957063067702,7635338651812166,7088170934731489,8899983398288797,7854731348392167,6339168420486369,5937528639275340,1604859536679245,7946753735131473,8909970040852323,3485528599363927,8506937317465501,302548537241411,1396292325000591,3619419699822942,6772887468362300,3854093525619041,7580481836650850,5031744291340644,7344176925184357,9073589640745318,6402211107234151,8366379549651983,6139656545878377,7067998478664044,9088423030505838,3607409269391727,4803709196222832,1700872355131761,5836098181632371,2413522731942266,3709270451806587,802683280683389,2199641716064642,684865944101611,6302155283685765,2626850312507783,9066566268652315,108777174778249,7669459852358028,6578666286756237,9180843924283113,498482636804498,7441715539407252,1663786681323926,3195530811363737,6301324965130650,2263739719561628,3836774525002141,3890822428160414,7591077677729861,486583738646944,7439322902286754,8097326208099057,6248702942138793,8840342924812714,2271125330641324,4218604765229486,8198002360127919,6983173277274544,3771536616010162,1332934258471347,3823242398978484,7411468770681269,3410304834843062,4412411515445688,8247248503740490,8212722769378064,8133006639090426,3355038998389186,5877632267574501,2158772573659589,1586830628155846,1946607251272136,2565690168394186,5886830066553292,1257218029945293,1301441764442574,4375663320367568,4146506218430929,8301686608474578,7170951142363778,2345391318918883,3350629027291608,6052319210350631,156002413531610,6783790325866575,5865134003212765,4021435222843871,4350768771547616,2016760799384034,745660618031590,2302635509178855,5762412870730216,4776180398099196,5409574228873708,4778853730674770,8133816014041582,5282265054351855,97439505694430,8207398279148017,2622814457901554,8505905776611411,3184026344428020,18014152552951,2842093759860820,2358253191356922,8324801307365235,3449851085371477,2577122762486273,4030762657427971,3549489630503428,751558016700933,189845771145735,7181351149003272,4803490655499692,6286756015776266,8880291889525262,330976595254701,350602349011472,6773442694656529,102815735702034,5860693220102915,4518069450256918,1737958166274583,3884404692021785,6916618373062239,5768046187038127,7885472716905377,8502872291267102,1455229416784415,4946067731546656,7865364043702818,2521002441265700,8620784589256796,9056438493639431,3230869729714732,5383196484416048,2768081510670897,3006915833538654,6826108791394871,2906564559708729,4144362794967610,59067282350651,8626229961261628,5131883168825917,1412782528213568,7257953193648706,7213249491973375,1595060586353221,6543241632391750,2078783274754632,2162244627857995,6674151420692578,7881213818671695,5146610656612945,616799196361298,7395424572068622,679895561302614,6888996466954841,3284290890879579,1574278419960412,4973144691540574,468250291774048,3416794853118561,1295197378572899,3881302380188262,5151378520464145,8706190732673640,1636509422854762,612149423604333,3007968621232750,7328118150074991,6509129768997490,6812456735855219,2561064093258356,9183276816643518,7815567069799030,646018342441591,1829335896674937,8501061798120210,7029555066795455,2978968275509884,2602701328046555,5355707094192767,4158054898356633,6501195722146433,194019365528194,6532855085235461,5550995306719980,8200398629439030,6760645552833164,4100969151021710,3892301915154801,2021306438816400,5069042469429905,2111036762808978,6600018023525827,7384505200757898,1571614290238158,3213588927615640,3111581888024004,650693112578714,5325676982125213,7837617437864606,7545996557906591,5523554505986720,1023044052992675,5209051923808932,5050596687438502,1636645618356903,2464706734240424,4602311573750441,6060652336259755,2177434854183599,1528469270168242,6679238799708851,4580312784425652,7861545854108341,6831715864613558,4713289926894263,6676317908312765,7181455468655294,4642336363096181,3386987136451267,4768244905386696,564028106097353,1097107609284727,746472455915695,7349978214301816,7996880657011410,5545976856953555,355639642136493,7918932628329174,3244037673218776,6942694778131236,1613275457426138,4126947371393756,8868971629777629,8632587173180126,290379632899536,762107169780452,8380516216765222,3709239706030824,7078755888673514,2799259421266667,8124808536515309,6344674853454574,6152479066919663,6455616364864867,7482381276791540,214746693702389,600752116581111,6786758668423932,8869571776303232,8505458819912572,2343030795907843,318205095158533,8286333298535057,778486258471688,1133049901552394,1230031707988747,5690036504547844,3579698217030415,3147735033213713,6909102880748306,6611509042616451,8702959646874622,6218955500442389,6749936183120663,5496707118862468,707307476611866,8574139315467037,2826776089559838,7188189974475555,1021420829152036,4082835454797958,5014539548095270,3283956757521191,7773132202570539,548530583896877,8662502508794487,8494949029995315,7040650288374256,6098200411304760,3665994994823996,6137960429265726,1542220913779521,6446663268737862,1610424248684684,1752852796027723,464899343029068,6145437521290062,3928834182132559,6996936819114832,4158599573568312,8433460749808466,7700169130040085,4910959958176598,5695698134397783,2346499805365082,2832977594065756,8677793949406046,8806487933482469,7710776378549734,6243035160691516,3854025815696234,3652882002490219,2800394399351661,1610823525811055,5759913613853554,8849006679754899,1965717007000436,8070742289138494,4740768372093816,2883671567242105,5556537765790587,3038574027420540,8124578108704917,637447031726979,9148729687790468,1670760511608982,6942436723581171,614339352460780,6300795765382661,779248411902865,3457517571875730,8372002013148051,97554554532756,7795398446384021,1738224738919318,3119478434755480,3680117394195353,3764174567576474,2458048250602395,3366886305956764,5982912448844703,1050568081716131,1995486654321572,493178213569445,2746920271475622,9069040902747047,2448460622922664,5563825550242730,3023657886032811,3006907480241068,5629438738528187,6729911268270,3418979448838301,3825396115981232,7333489434955043,5702836793922482,2625819278405107,4234175917237172,7211216386505545,1693156028105656,2123200633820089,5473461849310139,4912493433054142,5358974760925610,5680514078860224,504252508816322,5629859725738947,5972772024144839,5938692863164909,2629156419362618,3380277546345423,4377645695075281,3176316826346451,2028767211844564,2822060571186134,1716883639014359,9019993427249316,1357810718085967,923708441953786,6070098089559006,3135200536515551,8581728033108961,9076818340918242,7353826276032257,6026240886952934,3076883472585703,1732786619532265,6081788535589031,4680738594456556,1282057354130941,3082017114915824,9154531891602417,3219221460499283,5499215553097215,1777739456988156,719063360787454,5297112512857087,3906684882236417,4563588325114882,6491717918540803,5793845689360921,3495910324417542,7258750529487881,8488495700247562,8884886432727895,7765821900782491,4394141609313294,503005475501071,8291503368709137,39259753034771,8736074900676782,1286848771795801,5089047044781080,862163638417583,5318722630550556,3716812015576094,2776492669218309,6229419484797104,3524668701316130,340033344271395,8352896013345828,2016264027796518,6166747151939761,4528338812834856,7041799434564649,8407164604585002,6698864584959019,1141132662940716,7159603642562738,7038888974431278,8337123416802884,877384317588530,3219909202846771,3465454378476597,4178538353194039,2880297310078008,2171021227279418,6116761555884895,5418703722026506,5972725723939906,6581839197615173,906182750889031,9054935978353077,2335443210600348,5567199171163211,1295595558986830,6976095607510095,5945389274973264,4010604688360530,7939226948150355,324808188798036,190041513879054,211295623775964,3675204499240024,2666136307700825,3706894835123727,2126681557705820,5058290362638522,949882414703710,6999217997409125,9196469867557984,5000226559828155,164891711140965,2105125833388909,6910885721307324,970283339797610,2738708514358379,8392224834913390,6240676352427119,4632003270100083,615128322991221,7864160388904524,8550921380832376,4778366865409556,1018008720438397,4449343608685694,1225897694058005,7249368943015175,7116649040163969,4349226227487876,4430716338603142,7749069966615688,6258683788526730,4478531045766283,1910954834666638,1924975754462351,6771687390872721,4751106573866133,302391300787279,2986798813457945,5483352226837658,2238362475598703,7669245105800349,2253465249801374,4548839124584645,3948283765146784,7854613467250738,5644375662453922,7574875653506212,4265031532856487,8534168205503453,5501999685919914,5509820929140935,5132009575613612,1703212555138221,4921694918354095,6832495631609542,3877763153298609,8383977649266259,1697182458070198,5483351102693577,3073365390267578,1725736783103519,8713076047279292,4127347807918282,1276829185627328,5556273448191169,6068774584382658,499728026948804,1465554426954950,1135533035920929,8906382308263826,686313731078348,7808746709660874,5711586390242507,7299828551132366,8929773505557713,5742398999278802,673908089802275,9155296971129038,4974844372235479,8295134514586845,5532345662870751,3950388352562400,6415826568258785,8252401283239564,5336118117483749,4369393758778598,7071171800842449,215831187301609,1208524532118762,5597465163343494,7753514809722095,6506461328532722,6642392152079924,1274028148421878,9077998204945656,8232945714995412,4387810538991475,6459129181779197,8394663380919550,1743595599525119,4446920745956858,4440988542070315,3321677236167940,5021911240848645,718261453956359,6628042923097644,3997105416583383,6070138451731724,6682919115702707,3506239774536974,7209025225045263,8144492431541522,2566317893027093,2925541860101859,1116670150432026,7700854715820508,8560235453322526,490487552496927,7156110210017222,6621127637046561,2983992677879728,8703824766264315,7431593957501258,7823708860341809,7518858366271958,2319217693082130,5029792211219756,6866580646053170,5409815616357683,8384312238072315,5936702468869144,6452512099546425,3880570584548669,7739670209138229,8325364221203777,1482364841211202,5622887089977101,331192570111301,1739540522747208,2960673825375561,1086922022156514,1356174556542286,8721637277369681,8580783446743267,6322849832170837,7853946822052855,758450740266330,6101602389891983,8252113570649436,8435005378037085,4256261227976030,2213041876039009,4884564187436387,480124617278820,88726625686885,3908315217778022,5897209889031963,1555023035499883,2224041003331133,3261157218866548,3163759888004469,4384704222152054,711522819880312,992547737916796,7594945485596414,6798752112821634,8173437407957227,4481282119988612,3461969400186246,6134038684611975,1563815290881417,6852791604385162,4731356989420048,2304253431664194,9138516725957223,4673602982622607,8612641889932184,8320347292699624,2611439619605910,3514401203611031,7642533588244036,8525566757204267,9106538483119516,3508595705660829,4646679279764895,8845175536109808,5700471239591331,3714472569206181,4489758166697382,6931646419727784,4364658620494748,7483165595084202,2227481306654124,6250822283212205,2933953989268911,7084825750111874,2284545739601329,5794541941035251,8022222369285416,851498638312888,8691699403333876,8342396218369467,9033558936501383,6219878741738942,6749716212470005,1725652218955200,4459757242262978,4658535184307651,1214872010831301,5767755528984007,3274632131286473,2416828560299468,9160689511267234,6420818061049421,4983272580863440,1628863376549330,720532285612963,8219751915828692,9014715931403733,4491051603965398,8905242881675190,81715057358297,42357953489829,4958482934372566,5231697017342203,7923450275028505,5366434309965285,3537744455972326,7314797718406633,3181978251332519,2180050571882066,6738229871765288,6156242093250034,5887318205433331,726673468851704,2185002600019449,3992935173457402,1264222504617469,6490992759438933,9129732961460480,7762134118626819,1453093038409220,6184656129657729,8813152237901318,2834141561054727,8867011108656648,4953149820658604,534565175232010,5996252149417559,6028195257759244,1423723411805709,4819266082072078,2723941198419471,9072784383235717,3617648030090770,850001943516692,440118678508462,9164856833496598,7620037329839640,6722887300010185,1789650864772635,5765687939110429,221721528899102,110935937492511,8581805502363293,5348681492588066,1671615866111579,7596464572716869,6876005789611557,6469172428703270,2575519529596458,3458225452561964,4041067557578285,6299424031348274,4818316363746227,3317110615959094,5418711710582328,8829597646042681,5433943481550395,6910476868240956,8064985729740957,9202011292433333,1667540236826176,7433496317599328,7584135181603083,112565798999620,4743585373673031,1381522980423242,8662730455803467,5477251227346508,7282499096694370,8971734078821966,6799734473708050,2420747385394787,5501351023216757,9191118588229206,5342153252023225,7609548388623960,131230629236324,6116011744204378,3841007336842843,1692431305631325,7442469501040224,4237807271040609,8269177247704674,4763910963295843,3204686536062564,4398585109349989,8151445406054361,6662084573563093,8740494441940585,231543992489580,330115449353837,5256979726607984,5038604617328241,6600875868792436,5273121315321464,1956398018102905,2377083420087931,4804695898502780,3433101296838273,1117642997425794,1157889449535109,1140857027708550,8268078856485825,4772124853150411,639026282519924,4407441740932747,2541516060849804,7847349993264781,4227086384830094,5383546641464428,7548360507368387,6956227977520788,1496177459111574,5949138240007360,5473281996392877,4352566444873370,1034913453213341,6250948830185120,5653558163103931,6526661759067811,3466342463731365,5154215883097766,1278909074138791,1088660977567400,7947321203099307,2786675381049006,7691773253730589,1454971685402289,4431489480777331,2794795170657972,7098970084230838,275020607248056,2173587094664892,3651021686679234,7175233499313859,999946191169221,9047659542656713,6827105281471242,8963603694128077,7642298274604752,8640765141464786,6459892396021459,1808252853282516,8660803959376846,3790441000502999,2500695240292056,3067862496376538,955061135021007,4446630222137052,7199361397327581,6508865569531617,49040745723619,7338964646678804,5599499834783463,4333085443960444,6453253591505191,6831185652694468,4880420478490349,3302786610945661,1001563372201712,6548016025573105,5948219247621874,5289864377970199,8702212413368053,2657518516681001,7338049658054392,3369184694875897,1846977314273020,332538067375870,4973783538222848,3254156206685824,814769821914882,2224699908552451,9102535799457540,683811968718597,6461073894045313,3262485466892041,2707110816683788,4067051156088589,3456087798195982,8143291563783951,854212250093329,4501956654741266,7335058304999726,5210365212559126,8028997235595031,4190941984147225,3879138156341018,1345395523282715,8557702959107034,6094663592275779,6267407036741407,7223493920397616,5000553955118043,2085006170875684,3897763868540550,4463344508465899,5775970361005864,7873295069927210,3164926770222893,9190647979194158,4404330972206895,3487904584447624,425815352207154,8536197740803894,6849125528153737,9082716967561016,8725657008595935,3271898178373436,794366614107967,2391362756740928,3534418577680194,6736961308932211,6027791605610309,3454631132985159,7548057127888712,3291848507580044,6772255071446858,5005434308458315,6878013813815116,2922498284492622,3716630972507983,188491271759696,4176926500353875,2294071722522453,5237762536236887,3674804698261336,4639882346854233,2223302635120474,4661659095009116,8035406138713950,4727297292588895,8790715034727183,6657066536204131,5878585289340772,2233483136972646,8911139802183527,8697418201819069,7864648699868135,1986580218333037,6945924687656816,2850734146742129,8713941204547837,2945625857542004,7654270500809015,2783372654106486,4610179110695913,7053600706700376,6656608897312173,3028956134700923,2332773367703422,5786761070589823,5150742469996864,2253043881756548,7036460231886726,1782236440344455,6477585513002888,6609666988562315,8997849530304915,3384471799334798,747673546090383,2273142713964432,9062974627829400,8515459696408466,3427010106394519,3670695778031940,8030774839850906,9145621020885235,6465088752125594,6685838838638494,7034807678764959,5045745804355488,6941013056107504,7948433369872291,8836664350145602,3503742343997352,301917057740037,3977407856338858,3328666277697451,2241341805721519,3665352628938674,3340477195035635,4791619906242486,2302923115227065,4691719412258747,1673206556444604,7288402208126909,5168095931742143,31871788656577,6540428647995330,162661525276611,7341525149435844,6619828928292805,3827833569130438,7931949591286839,41333394622409,21225658856364,7168752287753890,3176952618575824,4598667479517137,4748938881636719,8631700561941139,1555332508055509,820050989213654,3481564759087065,2113336233932762,7229923916723253,1395223121258126,7294851030648485,2939641484429283,2428235422771172,1585471360001702,123345303398737,787738703476712,8952763591459836,8092541631436778,5795846107727857,1709806509599059,4362947078505470,3354745607591926,8908309689866231,4035117924968441,1330689851825792,6432595043763199,5627927917123581,5468170874202111,1520438217091072,5097137730877441,5040332706842626,1086200028292097,3383842124912652,6621105034744834,5237181648271374,300128871327759,1007007495940112,6971915238938641,7095609912647007,4050223987795987,949116175099924,6946092050384919,8833882242934368,8910018154735642,3708704722057245,4283747749701664,2614763339560993,5101683099736098,7698978881828899,4630584401758245,5723360613174961,6758782563209605,6723660405708841,188798395861035,3181336987437100,4417939975928157,1579909256333361,4210791811098674,554560094251059,6523038729239691,487202132572213,3081894958282806,3079320871508026,2751115778836540,3673243833888437,6229442387634242,8591912485071883,1726173691095109,7888908791503270,8620877791728671,7720241316595786,1535763193437879,5762546893137998,5247901147032589,4492432941283408,2413254928324280,1766428948949074,4431098313484371,3214216908011605,7707473354377302,7857832023242840,1430347748885519,6045482422020188,8998017925177617,1239209380190302,8181401738344044,1130616284326426,757511330863205,5134709842135142,6081468720933905,4315744926996585,4735004976679522,7489347978631277,5399094869489775,637259890956400,3093805992867954,5709806985540627,6761226977294452,258383561566325,4574642568608105,8454392958529726,1956903697209465,5784454464712320,5517878338494302,2210328410097789,5949749411465342,6816678752307327,1226797655804033,3598529560033411,4521248699316356,883967851784326,7400967302701420,8539962606564527,4608715738851467,599748851513484,6280609760803181,4363491869828120,951677400615059,2453134788233365,958734755293334,2985160045525144,2644615831488667,827853872335004,3293867442722973,967319851583647,6335739291574640,6488897043125275,2856215005730980,2273014493853861,3675601509394598,3880379388180647,961450797062312,4047083103582377,4179276895299754,3519507379718315,5969247422900594,596764816717999,4155412573038768,1563813459904689,3691627311229106,3379301410617524,1642808376379573,3460540327647414,7910734060497080,7180592385648825,4961371058383034,7069907535562939,2106378577795260,2896706850441405,7448324168325904,8795093368149652,2552503464466626,2595756031318213,3992908673874118,3579454825932999,3889358255831241,2395354880551114,8021664785828390,2332494031292620,8977148698093276,8804832823171279,3375356486338769,7038732427607440,918834079791315,2358747935746260,5543708660861141,482972303325398,140193720305879,6463534753982324,6214554099362010,4612980764301532,4244015074830557,695571492481247,7938536073746128,393702221297890,4808857808662907,3989795885668583,6832579135592681,2931343532222698,2252368395368685,9114537328675055,3092592438143216,5926178419056503,1803593466058996,9100551243172928,2558105353402616,2447969690630393,2358802809342202,994636385282299,7375470430693629,1307686514223358,762525955270911,8615787730639105,6024332285741314,8632886004491307,2171943682922757,7459905953474823,3323801842833672,980746668452105,8046653355239127,5327640635144460,4302045237598477,7951264234687533,7649212564756752,8130187017256664,5679943220702254,6297186130071898,5558424609167645,6580513520132485,7090764789976795,4620356105287973,1688451245566247,5633903013899978,1428697928403241,6294378903479227,2832656484722987,4111926670836786,6791011556342064,696401797486898,9121050955898493,7072888251620491,5064781484322526,6507809405258121,8691935561099577,9203580973043877,6256213812713787,2648929907849533,1159959438808117,2283781220835040,1279265463757122,980895692347716,7096797366689760,3679125980129606,6946606028872007,5597312819648842,3828064227140663,8036417991239595,8996530927198398,1178571938158929,1928908961327442,3848856341597923,7512439527274836,3039443734133077,8581610681778818,5558214964574552,3154208373803354,4300112962021723,4444178356218205,2365711606860127,8785825793135675,3844970420758884,548930001287525,5353403658864999,2005379606083945,3714008913643882,8950326223014252,1941530967062893,826656530041199,3784356308838769,483348184811890,3992817117182323,642096471714164,5122684776909174,5624644042501865,1481315653163384,8358882051770748,1602816531401086,3242052203268479,5736569723718017,6863321694699243,881208268630405,7943428193483142,1303703654939015,806079655221640,2730063123171721,8610160831974098,5692631906851212,4350257610615181,4594297247906191,2302840757352856,7591747255274563,3785206615144855,3366254961125784,3088588175182234,3406557645748635,6126837579377050,1523916987414942,8743402253098531,5576463901845920,5822814419904240,8989788515498034,8186758030658563,6071674841031599,6769806007679398,8419944805058297,4909999973157290,2566285997070763,8194629799590316,1508387764095405,3131534230010289,1744365055183262,260046238255542,587111728154356,691239499561403,8707176123275710,6543297885180320,7205175655061955,4503039941790149,989870736349638,7048794389121479,9123148732277936,7509985034962384,8724510960039834,6279226722253265,5798735412447700,7116387516240974,3361644144728534,7719304321708635,5579088679483865,9056887381766556,3668600251771355,7660445694468592,175840266123741,5296748545989086,7704409007512124,130402753228428,5180058853792228,6805297321417126,8883634123133259,8015119813548520,209693084211689,8331522035139666,6724038986779118,6170039146297840,3212411367201306,4227717324679666,8420911764341843,1457460511451636,3279834346732021,6542462508676167,3501624016837116,162674572225021,4388608740468480,9089779998730897,2182652996348420,4653656312028929,7667257618763823,926780777589259,9123349179266723,9115657356289794,1257022313282063,8960615106075152,1677451826730072,8087141683616274,74834302216724,8073143682365221,3799302211058198,9103150163790735,2005194918656537,1274496396069402,8897939610423727,8560607325566090,7632002343606813,426938502232608,4149693794118177,5801065910930140,2393817082448421,2294161907726886,6747263234829506,7531497496709673,5681445992121263,470242731354667,4752381907596821,670914428271151,845896686848560,4236004806007103,2191092285209138,5120420997286451,3167318339312180,5828326024391224,6949433177465268,7151410276686395,3918208056920636,5431525142759997,6985248596412991,8060442822384193,9137857368440587,2390965152279109,9212075652897889,280330044066377,4839517722929738,8103756247594143,5043368910948941,4444199919848014,265870615043853,4913061698824785,6775031457524307,3783960695491158,6218447019000069,1209692254583385,8841745102462735,4877960127175262,8046598422554109,3824009360902754,8922656817790945,3883669425162853,8850701699627934,2338615536228113,8744266426168307,1327617093048938,5643576754674284,7266068570217069,3268415320390254,3179422274472560,9012872416366426,5328806550153843,3211119392488053,1380943987399785,7973890375871096,2645527732976249,5841339325338730,6752249944660607,4272076691196544,2302309959481985,3407389559040642,2273640400987243,5472239038722585,2888933230196502,2747257304304262,7353256217873031,6134251482864264,1874264737512073,3149541217057418,2378352002701963,8678921685400204,193278847515278,2580919449168527,9149691051436688,6728787989392017,2733433955838611,2584838122695316,850906915805845,4111685982571158,8944826520570521,1722697948588699,7115293237869212,8088575582182045,2780875339086496,418347495480432,3699237424695970,1168221347866395,3183040138656420,7986795395197606,5522761452342385,3269514954644140,8723326521367216,8166466288125043,6802414435936030,9107931634924215,2409379308718777,4516357200911035,7191190665972412,4552055457790656,8442630325295423,7349911396510404,7516066306862198,8130931005184710,6971467376872138,8506081825241804,1467330013510350,455208985819855,38475609914064,3648547298482898,6434724847528659,7509350884809435,3972884329802460,4480777667660509,3740933414767326,4922809658346207,3551646339394277,3199921370745575,290657945357033,1980440640572138,6079042345639202,4256123230903020,9115349682248430,3555039141379880,3721194437442292,2949777165871862,8562138589406394,3487459805395704,7609719625779962,7138642862165119,4058459774061308,8843958991918890,68870214613762,4313590760061701,3272242130922246,518016188177159,6566373212137839,7130189450062603,963473830112014,6027335571987215,4487106988825360,4489762292036056,7079083346889490,4239028626365203,3409935674075925,8121440680372768,2431212519840536,6695325882171020,6950352360796023,3527051798944541,3200157571447582,2023409032137504,6786091426738380,6397635627617058,3012785307519779,8776097312266891,6460057980934949,7555263043955494,8274089242131211,1889293924993833,2168212616096555,2470884161555245,6200238389762862,4720893782505949,421104632486704,1605480547572529,3963001209420596,1975760416942904,4709457203616571,9028172946213265,6636857554180925,6243021334645571,3541206393355077,4668176267701062,3685619017042759,6615730855902024,3000408281733961,3186185055222602,6660572700245815,4097782020987724,6595943668947409,1035348009397075,5623171427519316,7610846748320910,4021535978879831,1568528615328601,1311718625481871,881637420919645,3869115888642911,4028842579073893,1744256405822313,2959004378356587,3018673125460844,5861173411871598,8235032889847705,7557212795985719,3617101238844274,8906461744275,4385435136965493,6064115490044790,4682617647434217,5245319882460025,7664327712164731,3106873347357564,4287416964881280,5615256206231360,2686544187808642,1702964425501571,3941270476991370,1817814379367309,5595354894254573,7434039685802896,1701450919100227,213731376429972,7124144105827221,6635771162718020,3889230892129179,2397313504434108,6872697308732318,6439503427630917,6101146737744800,762145762167713,8002598569074966,6011827230493603,8502437307530148,3596511119969189,7494744479608094,92963673901991,2778793407794091,3593291984886700,4682936908331949,5602855922662557,369038925790128,4965287530994609,2220181371808691,7541889447349173,8580105352981430,6205197869067191,3597283422863860,7101997526506427,5269440532847552,6128649785115808,1134457724828611,2569679460486084,2465069632658377,343961015542263,5672698749504460,3124855700302797,2544752228207566,6498734804061135,8747129747606481,2676151636002638,4003349370260438,5683027120147418,2586260151843803,1928421535173597,511311629044702,6552818457828517,368150706244579,5115459228007397,2756904384556008,8740588127034345,6718593839965351,2471380088810476,6601518152428020,3694932353225756,8058144749132285,6717067410377712,1195921363266545,6814632366611442,5637716554673143,7104043753160516,6664509085131263,6023922512911356,7966762143329277,3884106681904126,8590326938486613,2340514353257472,8700081783471105,230588636937219,323323002257921,4043063508708360,5403719216360459,8380249183849810,3097653981195277,8910187950065965,7864919187809219,4606404390042640,758178034108248,39719655304210,4059481948789412,2989463890803736,5280460577913348,3901242407296026,7377903479227567,7258410441613030,9018758681330181,6097712675172988,3625994578656292,719671003352101,5538514249391142,4880930875493416,5636960847248425,1087239907617834,8094387528507911,3567539802021042,4921532812860462,7730266741811997,7467016232483889,5099367283301427,1129308837228382,6772049516350522,2702278656995167,4020602747362364,2824722181274687,5426810701920470,7777132937927745,7141185179888706,2653875318869059,2657053109708297,3497791613525061,3323544189017158,7838335740857415,670423024884809,1203868008993806,7062030755976888,1323403904015437,956314522299471,3234238419373139,5723502371712085,9204064322864965,1205503267646649,7888921514703960,7273678165458788,1780068676168795,1370243349071034,3432079869664350,5498083631582304,1233614866869345,7399604885326711,3366694065839204,2752090137615464,4424666755918953,1346988492979307,5225517043391596,300441851653229,2553709847964784,256412311432305,7212680378481780,8910258802654325,2442214906342518,8761387262923190,2481145929234964,8074909382342628,4990277163113598,6407849499284380,9102940030688384,445696199574720,2124509002456196,3881389528519190,64286690499718,41246111947969,4587954103221386,1176045824750103,3425338389064844,1042442065386637,7865125546297453,3789576600218768,6539991992295109,3123847164697747,3238502143213422,3916957733198999,3417607153376409,1688059134319771,5100268150827546,7117471725578422,1518556890623136,7131284214643874,6186138859076771,4218707224038565,1868955462388906,3904422537283741,5210838025739442,1482546212437171,7716008937484278,3759873974570167,4920714335111028,7763252295662781,972550063377600,1126147812665888,6596446658250705,7447199869959364,6460004456774380,4322587317894345,6140316353141962,5199172619935607,6701734533733582,8907971317120207,7860510530460880,8011810131392376,2939231115123922,7468684735076540,7484852324393571,9158339605241045,4941280920886486,7934833803676888,8732280589912612,1945799196740827,4915824169921756,4090995680419041,1999392107712379,4447103660891364,3810551592385062,1519220890909931,9012113025785070,305718430797039,9173773835615633,2794752876272881,1742080588643571,8568856587173411,7125715259563255,98904550214904,5943553377377530,8685867917327612,3722010856123649,3857124534648066,3130087668493573,6147521051999495,9052941809812695,366850546728205,8836870118505158,910575973817617,6230702414761234,9012131821755667,4541076447378708,7329140710587670,7338287778299159,6683399320759481,1635253801925914,5571141421542684,8375146698931485,5511286366084382,730563973877023,5784968342186199,1200245122243874,2329309824724259,389608978726180,1699410824903974,7662356931786323,5085214011964713,6726297269206314,3730748438867245,2389970243751703,5459710837806223,3009396521356597,8897816292490550,2214842700384929,6154695744271561,1826890884021563,8311107137072444,637869036158269,7259070398475024,7498955535737397,7574727278320960,8534996306519264,860025299606850,8605719669898145,9050064747151149,6887550711437214,5554777254395105,2425445431696712,1701017909770986,6543751195557196,5261646310710606,3152193439391055,502636506668369,1210766045089106,1438918004669780,632409138863446,3454160343280983,8090013716364632,1797354756618100,2116884943404378,6805634524564828,3837454472535389,4769816767098207,6311342942330208,1795707580356496,164432197721442,7996197279547864,1927767490043238,1554224803573095,3318372746825064,2159406928506217,4325243233578346,843684574178667,317029630451052,2164188516613485,4827830921461102,7563895310765798,749386830364020,9186296389313300,7363509604541673,6592270093429758,7900926406745465,7382584626672874,7103057605037438,2883805586857344,8331448774298859,5614479406058885,2489878891736456,5779323238227338,5822106510814606,4574077318819215,5927815224610192,8139076562722193,3673168115293587,3073611520703893,8720024484416162,7957344902393753,3294741962501529,8976813254117945,6486549689221018,6342779570113889,6471532477504929,1883007531371939,6331159252979108,234527028981157,6946989300247659,3726811455823772,6160643730464170,1636955248729517,386990167838127,6464448631872945,1339272046032759,7927967107567028,1643956068892085,1682428789198264,5106766916316605,3654154600861118,5770869100608960,1381925149902752,6161992534330818,4001155245019723,3710867376680388,60241534309622,3610174350278086,4300625982953276,5424179109281231,6763318299119059,2055835598859733,8856498998928306,8364189683738875,6040927856664484,7135578328018395,8191899952620857,9002492487108758,2753274809564639,1438381635419617,5662406811264251,670687878761961,3352296352910826,5417143935479275,1731267931110892,8066311900909038,1395203624078832,371485589908977,8533692804547434,4290685342748147,7991912411141274,4278739371740663,1381282135248379,4902538009464317,5135740703067647,401968295874051,3309530866691589,6067667239099910,8147433044388017,5252557746781708,8413724613963277,4251065002946063,3975463128350226,3945859569229331,263803206221332,2880090105839125,5291384926297623,927919242364164,8900133711175604,73361432981020,3222797665481989,5203620641091105,2206896186809891,6894412524559910,3281517683150375,1363576971514460,4106213877943850,4744714558488107,5676245473017388,8337811940281232,6507152842595889,4403573994700340,5660754155262558,8116541977227188,4039642978381371,4077596510899773,5359159031533118,7309445088528111,5192498274184770,3856274982866499,6681481373175365,1177185687830455,1211503913115213,2901374376369742,1052881097592400,5237667643076178,6156729269081699,3445490295643733,535003865136726,6242283908335545,8932487928789163,9021786941656669,5907644825737829,6650646992150112,8846554825640963,5484565785587298,694848426690491,5103021929250404,3525314939457127,2103363196857961,5481453948571243,4635546177875565,2927652349268240,5326136856881196,2919790135447152,9182603568501796,7242188920692338,147176986160755,4036138891927156,6948589204364918,2692814492974712,8725129806092132,3834791409208954,5089244046012351,1613917410680444,3737595045263978,3688834933395070,5051961028292223,3858573859012224,8237707056594585,5849927857880706,218712913149573,1363110944853638,6128581559691201,538663214284424,1257028633513609,6331494275990122,6986800288231051,4197419661364876,900282839388095,3908318410546835,2434208120583892,5390815254662805,180098157051545,8997631015739037,8818602905375208,8457516129472159,6676678262558371,8213321560127403,6932010916686484,7847525634201067,8768983925345963,7338169596453185,3474525937512111,2503338218667697,6081927730358899,4277335625461429,4854303545876151,9196787600654008,2483172852076217,4934419980803770,1893218078713119,2275122507284156,4876936726875837,1800105774968510,4628631043074677,3490734800621248,6853015255066398,3235417542715339,1613550924558020,3554990670675653,5428145491545798,5809558188945096,3210719603908298,1274225661370059,3537608285216034,1537148138786510,1788618146623187,5668567797161684,3221313972076245,4308344126385880,164569022426843,3476213528596189,3045054100217566,9138085232066271,4969066544254688,6592219286630906,3207094206873315,2078678961913126,5823038480838374,1383912568970983,288993055543017,5050239410073323,6125927763676911,7911578894066984,2707745248689909,5327660902293239,2790297796194040,8761827415209940,8932311720161019,7815183414560725,2884054968528641,5590262291869445,1049237176729352,8044209088212745,5843184425930506,3253301126931063,8481632322445585,3180647814049549,3542658152582927,6929743547174672,2153639937191698,4371274693315203,8004510286715718,9014338611716591,744890819944215,2284792749272856,5585306469984900,1718477571551002,6884230249778975,8786196215048267,3406345405591334,4913404503297832,7796126945116124,8777585474435719,5228182673432365,1262307486019905,4006270898876207,8528494224596787,8366689368123411,2689867866116062,1689321804885815,1338464936455994,1108904177901372,5592498899083071,2856373721149249,2068405475757890,4975825308819267,5991371231295245,5586613547474895,1345690806484807,5110239010090824,524883179626313,2264219264479051,6530718152318796,9062670442463053,2264615534526287,5104082190016336,1482047550340946,7229588749823828,2504531253751637,2422414325968727,3603284933046104,6585476164958180,7497158980730714,6904184191609487,6831339509370716,3317515520364382,3143159119982431,5142848984104801,8504993954430267,6135683661627236,8021610689120185,4746891825061742,8506344260755313,5159417782382451,4056969402847093,7033078747279222,4750842468585335,5855779389325177,7487563715575674,3925131887902579,3918423420485502,8493374712733567,8161154439589598,2073715707596673,8981620149085007,7720966027976583,6577525897150344,6725826732421001,2118525924052874,1728715955818383,223770624438163,1627645439053716,3271009838878613,5121776412213142,3582990351015832,5952135722864537,1455195525717914,5185292997025691,5311134844243868,4119496559112097,6760450543345571,5260816083107748,7779710307130695,1075570650054573,5893172793677632,3133544828981168,8630324952338800,5878789791088563,5152935197261748,6931880560750517,210632621711286,4430399260770231,4953461272252346,8348394730450875,7384373973225406,3917053492559807,7833349077586592,5012168223502277,3111635638316999,1699385053515720,2719415409545163,8631228406982490,3055167064661965,6718709669408718,948738601111503,3786661964533713,6788864326020935,4588947436983630,8508554339196886,9075408412604409,4869613428658137,1742784801615836,3161205751558110,1809792280403936,3164497678078458,4635366579478498,4796598632476644,4002283196665829,209379331207142,8592326008635251,7365434805936104,6908598308347882,3707282422714348,6745676050910436,624125099941873,2515095222534130,1242321258684403,1017912363667446,6433013920542712,6824479492828500,5188247736827901,1912093527910661],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c2e8e26fb3377705376b1d6d434e1233",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000617605.2/GCA_000617605.2_Ec2010C-4966_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JHML01000001.1 Escherichia coli O121:H19 str. 2010C-4966 contig1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c2e8e26fb3377705376b1d6d434e1233\",\"mins\":[1073757075132416,4992640029655040,5859080619220994,337396029616132,5658908378594987,3728622142857222,3936481708941320,1370484209987595,9146733986738188,1528444436721677,6750112766491992,910260459544594,8774051203846072,2657920817778708,1635838075559940,3391826174525466,8091267809079323,1040906481516572,3990693506301981,2261620935442464,4810915518237111,4100933971711323,63017134968870,8725800200456881,1764838771920937,8588972619104446,1874239187120175,4187579349364784,3205569263312945,7485615743339416,7148313253921459,7909662547087412,6087468610956638,7387311707809084,1470093577691192,5862130321367097,7249876427247675,1165329981141053,8688414473272306,3533801781903427,1303380529786948,4028438952951877,252861414296929,8176761357492296,330642771468364,2182398795403341,3484985178759181,2591063679385680,3715464516467511,8471416538238614,3545494450790484,201265791500373,1338426797289558,2128219652771929,6077663536853082,2368906433310811,780927423520861,1051896060691813,4532998204641377,8920527252377698,6147782503108707,6363223884542052,1390675320180837,3589031359889510,5723838671777895,4594897880871017,8487042812984679,1294795083337746,7935729833474190,5568630790840431,8557913976427973,3576991172001906,318427908817011,7775585762742974,3459151149293686,372708354924664,923547613745274,6721778213326971,4072628948342122,3468478413435006,2641068255975445,2344109037412480,8882223087596224,229192511254658,3397773105741955,2428235422771172,131111881973894,9102477959568065,2158723229016200,3743961606118764,2569804992065676,6593782365859983,7621047033376912,3238514465894546,4954506615336270,8898041383738587,4479098013347991,8110756269551769,5734108983005338,1561211337072795,6450230006775964,4577706923735066,5809570678718622,8324706907900613,7253633366222317,4192581360332145,3089609529942184,8520891560951836,5916556218769580,6840341648085244,3948758422548656,8325523366535346,5598442556102519,4678660553863348,2664362379264181,4986328008868023,245157799366419,9198330007516532,8983104269525793,268748182387402,8004793205390275,1506544743870655,3269648229920800,4594386927288514,5207468986378955,54267487195332,3920674891829445,4551746334601414,4916393700293324,5705596755349709,6552739233923280,5088556791717240,5089565009928402,3189533497565395,5774736280085790,4652021215355093,8822754571518167,1228794839154904,1158716490930212,6763584774734042,1226848664686811,1452769867915484,7929936158056671,832839452246241,3628376511791330,7426313509187811,4466484413501668,2158501526794469,8278752712221393,785648654295272,4285889479766250,635136383123691,1223472291905776,956777688150257,3281571388109042,8135003317843606,7305824813293813,2144861695090934,6966002038825829,7503106689917176,6202748544676564,6178443105488255,1012693995966716,2119151366529277,772022488682750,234488146968831,4746016443060480,6485806308532481,6251498761466295,7114833387841411,5838923403099623,8992257804410303,9049022559096876,5313636444859406,4821155732656855,106776035873039,8612752951922962,5962730765967637,7475233032843542,7303145929355499,3262363570020632,5740758977031556,2638357482914074,2174974481998107,7296085688592519,8005200134666970,3854343283052831,8207544012289872,4256472601616674,7984362957312291,7364359081713956,1328257188593957,5043297164816679,21150285087017,4523320794685740,4941779457685554,5294766748025565,7656413098012959,5573572253900134,6459771538178399,1983503147569462,5333201194077577,5386975842144570,1752908108796220,7298749349184906,3495517882196287,2088069525771659,3346776127533380,7867289030074694,2791711361773895,6398653369909576,8076812926519782,7470985706406218,8981126744596535,3713786577838412,6765387127028450,6280700631560527,5357647940497744,1591738477680696,5896561533201953,8649348406275586,3485528599363927,1853196278886744,3643628911563101,7500043172495846,4586823680090463,6717894818345313,6903200412788795,3296962647322980,5250521463216870,6344111587721574,4150969856927121,5271087950494085,1085464144855401,5760795239805290,609934825034092,8625407358164370,1981067029344623,1122474689470832,3512898337591665,6364201369596275,5930833310617972,2239183959286133,8039903998695492,8054862788604280,5402893284117908,5634897811501434,8631931222106492,5803893689332093,3722769344287103,3822882072310145,320413748797826,6258939950604677,562273227383174,8938620010911809,4905932281966984,4984850771041004,7068115976580586,740607477961099,93563182928268,8429228251806445,8656156206547857,7977902631756178,4120780341174339,662293556334996,7093607097488272,6187809768630712,6803710638264728,7670831243653529,7606562266386842,5168331105685918,2564237403603359,5598583034696096,7977555933352688,730627061744034,5118222967801288,4313903103881637,6980401474429351,6859671838925226,2063008413757867,4858254758601133,6889719627880899,2177821880959407,379935127364017,3951993819025843,6046018190438837,7710114327355830,2409861074473399,965770318045625,8316110361879604,3760926935470523,126141660684959,7887496498389439,633612319568320,3029341628273089,4553790569252939,6504600138650052,739730488963525,1586830628155846,9005565350800801,2187371118363080,5510921714606156,6103640832397770,4158643801731532,2602896093442509,3109437597065678,3427966188243021,33355113951698,6304638001390035,3215349969969621,6331496692656889,7305037143368153,1415164117193179,4044594957775324,1327269823386077,8495035540960680,1762630490657248,8300669204332624,4818984406655458,6634543832547812,1623756785893861,5572976445594162,2855125351690727,3195488200716776,6553435175424489,2931571972751850,8909732310045403,8814854711972332,4929961495629154,3261513360556526,8525553255043837,1316262047470064,5054654202682792,1958335824154835,6497007459127797,4107450076209654,5923439901028217,3279814386115069,3909360239325312,5912127355224777,3641581373166083,8550510119265448,4588882368847958,6242013984625409,2227481306654124,86205975593482,2139538089042443,9071633823952728,6185492340510358,3706241000403472,382644013236755,7407170124071446,3296000574136409,3836834437558808,2483232887628313,3058265525461530,7556093500883867,79103686168667,2521002441265700,2410197458295558,8196924189913638,5789573214511659,1748337339925036,4103871071876530,8439847584426235,8712435249152093,5498454157423152,1882484501008945,1416727865545266,1125038647685684,5677957517164764,5061816688071222,7974398139912969,5394219840704607,2965832364118588,3429852718600970,2799292310626878,3579134126674497,5769665019062947,3579826204570180,104956482810437,5506106076471117,6951728823145031,2316787462754888,1820959062880842,8301344556431535,2472140177142350,116925212033615,5539170023359057,9198290539502553,1525557707760212,3848836181647957,8031406990306653,2164808574747226,2756071361360475,5080508310012510,3021182842667616,6817438024151651,8384970864149092,7846455472345190,6486115054342759,1308106938819177,568000522973802,8940081059791467,717184002945645,3024423721812592,2793097290789490,4553428221923955,5045175309042292,5367076833108597,7501741814739049,6141598417310328,4120589373940346,8180128669803967,2897095043949180,6721858317746813,6522676544610944,3678391577621121,2397689414378114,6232967090696835,2679207567196806,678285722124935,7059564896941279,1724031441810059,2766065063510668,2605011208343467,2353730651177615,2019585422459536,113269032034961,7478109265101460,5339577517900437,518593397944982,1792071081980571,3176686928818846,2215385946845855,9042985953004020,8331699153711781,8809268300737181,3504564547469991,4273289964511912,7439773260511734,6895490497021383,8519892691163288,111250015466157,6618163993244445,6251521348096688,24997698352584,1102086618378931,6528647032779444,1753771755791029,5664545369785014,2041358419321528,1560440145576633,3496369553818299,3212616315093692,6572195292820938,3375494323790526,4642336363096181,2098982571856576,4869853174897440,7901605782565625,6682597705495239,7529438714615318,5560778908603081,2209227890905803,2555252183827150,285411947115217,8949696555437386,241518479363894,898796590584532,8951164523607715,7298738867790550,239945629602519,1550977950057176,8208050984820139,3765783960883930,7373328206410459,4964056350806748,1685976700006522,7088170934731489,3711510044373730,4567546034963171,4704426556949222,2492778624172776,857241360966379,7604050999448300,16356710474478,6752954868679789,3672224951714544,1614004530920232,7195725468017394,1787259017597685,5842392311423734,5069302333174521,3812086123586299,2106232978768637,8456953390800682,6309456752497408,768473419178753,5810464076514051,3022689456030471,545034796114697,877463201362698,4477098239914763,3655348890841869,3334521995297550,6584841380211501,1568756855591696,3312750158140177,7754409884422930,8663807444742934,8539004164948100,7618392932141871,6408366099364270,3506712906728223,2311740509119264,2069696959583009,1821681489232674,7232934290060045,110100254491429,2437385865757479,6347070686084891,8722933495968554,5453101510752391,1789900134822701,2004039151534897,8782375079969586,3777954798801716,7171691819395958,4845256832766776,1751698265555764,6221238639424316,8557551783120136,8535130076816191,798868643812160,7915640336060678,5509066692568764,6036467608063887,1193194748379973,7302752899863368,753153853702987,6652001087071052,6835847231583714,3285863149081422,2741660511556431,1541037172577104,5054421719249433,5948496119125441,816503841678163,91491949740885,7252939129262988,1419703420392281,8462131047278645,3826247007101787,2385032288854876,7405781378130782,1147610223223647,6297328210846560,2493777281889121,3385759904131899,7689901963544398,4656754749973349,1374833818530662,6134002501714791,68792473092968,5656938713936745,3640921402798955,9165150150047383,4710684819043182,284796527510384,2476206116754290,5051031092256192,1589935211180918,5915206698595191,3753675332473720,1590631988888441,7522030212350844,2061913944260074,3813469322421121,9182545715384894,981336760890243,6886829094818693,3168575450833798,6124171288552331,6886851722761100,3715399430058895,4626252930179984,7456519085926552,7559991823487892,3721431724647317,1866877044741014,2325169820894106,1719461470643099,6141663376171933,98055163335582,1947362805623621,5472728336085921,1062265454900130,7929910898655387,2441464999887780,2493587897258919,8451504177177513,2654315936224170,2685377166349227,4953149820658604,269236596949933,7378306770819230,6443784898034505,3527308810683320,8802100285823135,19431607690174,4610472403542975,3840123825705920,8537884731810044,4639717892154306,4918060478186315,559336936231878,7635490757400719,3584901329069000,2882933581583305,7217687799256012,4616453495653326,5939516504077263,6940868016210900,4794640989479893,5387187980387287,5939311640732632,2856215005730980,2958714226869210,8123516906542043,102565214680028,7991087747544458,191598411457504,9076818340918242,2697621990856187,6230881572242407,6131691779643163,9084202317463036,8942444219240852,4895698867184619,8071133620720621,7291819492885487,1140012540019696,6336152938842963,5803210749600756,6047489833534326,9201102619219927,4682269492392951,4670831696962552,4257900630729721,2909449267180539,1501840430117884,6378674551886846,5221164721529855,9058835486569475,1401111668989440,1172164637492226,2738453673972739,4430331254932484,143345725674503,3424706376942600,2935382216684553,6819720967376909,7822350133554977,207114001673048,7322925576389650,4765676198175763,698349001864214,2314307504759831,5138977312765444,8782668410220533,6463112871925935,7695949051159580,5248656855829997,1171980783285280,3067442679313441,7668647640888355,6035460513596455,2114613282968616,7886030753738537,1002190466327595,5968997109409970,8695347109493251,6781713908506803,4781661328942132,3162205284303925,3809968830055478,3370100951126196,2715140864083002,3182324679992379,5345587754044,17551373616191,7132268710888512,8810737386038112,5542898849719363,7439836754389529,5442997139765430,7328693529453638,9078229346763847,8109200655040088,2471969595081801,5826009492259914,5354733807924299,6758977532749560,3774411384146786,7866375711778317,3122758425690979,6714171095823444,2885684181587029,4135324637967446,1957701014063289,8504418124477528,1570668393428058,1886679501595740,2920066062038110,3955606250837087,1156936765056096,4647502112306274,3453716837938022,4384444165534822,8268762812580208,652324546143338,5486519803952658,7359845544648893,4269724246881393,7733252321283603,8417413703262398,3391858706936950,8301888952505463,3748471822677112,7062224376218745,8646895613981820,6503573632024239,4449343608685694,6487028432371653,7310376553528171,3322417381274756,2190787628639766,4961473957147782,6267289656534151,1974598399054984,4706110060348553,6508832892249227,1500384124740750,7791564038861968,175896512464017,8424605680853187,4512763559527572,3747058568012949,5929145740419665,3398123071628439,7270256983434393,6142411939673242,3472461633787037,2154758543967390,6571479611229343,6907437044057248,8162162674861865,3151103808181412,1594708228551845,2054121759032486,9157142940314481,2331036032591016,6995725621601820,4728552000332971,7330181486482605,7513685569442993,3406486889866418,8277556558095539,6216094863617291,2937407604864182,1995986330027191,9106313778422761,5250346004804468,195539820147899,7059993799656636,6623373924644029,8676858659765187,8659657583609024,7923291333080608,7262014036550850,278740376483011,8794292999173316,5085990596223493,77910711329991,8927947075315916,2587157541471436,4353201186133199,7416859535778063,2953876267695651,8364770154452180,9204064322864965,8342720014324601,2581034133583066,2746740739822815,4970771199730912,2657628209997025,7593967918787000,8179864612635877,1372323191428327,531992828663018,7094419813844070,2607549250757871,5547926800643312,1397245118305521,5962016065201394,2342397466617075,3461738536258430,612498938365174,324230192022775,4856702291195128,6986109377038813,8198047787697014,5619665844670878,3354456329798908,5522511505913085,6747852412978431,4816650163512579,6997393881425157,2114111736337670,8033248447320961,2249465920644360,7350518350345482,8973446714537227,7747901425624332,3579385405969678,341008182162706,979340250776451,5594499785696085,3259397157512471,3341964779300120,7456846622528333,393907298139695,608678462596380,5647137858793460,1193819064010014,7661957547971755,524550263956769,8320452755817762,2144295051339044,2644740716631333,3780659210183975,6267931029091624,4198112666613033,1107336759629098,7361861297192733,8534658835680801,6031427847992626,7679109584230881,1953999342060852,3517727528637750,6782376617551159,8835515237074232,7561407903356217,8952294614328634,36460262049084,1930505532183871,3293236782540096,3029860654573792,2546086870418754,7510868637162769,732780580443461,6042509842663245,4224430592808265,1072351958742583,8968468988253516,200757532242146,3709841507632462,1668731490461007,5038763940545872,5987756404344145,7450634403829075,6071655422456028,7454634398513404,2562883673752919,4331047018382223,2923707812386141,2517505051346271,1995644919788432,2909476481185125,7468684804760934,6833986613242769,6103095659902312,3904442915841386,6858062779555707,7324867384665452,4390468767561071,2198394350572915,2750408660657524,1554384620856693,3932987724551543,8740314210710904,247026401478011,3529317775237354,8386241549871420,6382701539852778,1136441185432963,4289934097810823,9012936261589228,3625832106907018,1248171481961867,6063316204944962,4998564553872782,641497577649551,7832654526906569,2254104781395345,3514751407928722,3433564635899284,8926606378878358,1778810603140503,1323683905492377,5229504741713306,8124745803352303,3963252660082076,3764174567576474,1020487038711202,6824052985741391,3633897363477924,8568508094717510,4975547522894065,391890777097640,6016527992034729,6652035869015623,2862025196574124,806065740141997,8016739934946164,8548911320652701,8876703278388657,3477204020958642,1615805749241267,8445002148701621,2455948336809545,2370522626729401,6154036893141919,8632367232677308,6570859109336510,257814287504831,3542568308544960,2109338263586241,4585567380870595,1497370230207940,3375965378037189,4011135044584903,4097782020987724,1532231731304012,6564781728314826,1876207015413196,8694040690017741,5528795322517142,7501664645802449,8349361536939477,5978101212931544,7971456386853796,8698332590274010,924337930096207,7794364401796572,6695301922022877,6281497035855328,4798505570624993,3473052769015266,7380061455852844,751349278225892,1009557435291109,2284608054539751,113769038976489,907310714922475,4870222823667181,2961425221989873,8996701607342157,2241011611182580,606392454750462,2437548500827049,112288126498296,8372994542765557,1648687757559290,3992945688581627,7761554913336234,5851095604147710,2830811517908480,5291964018069760,171764226221571,909557781804548,8325086660239617,8550617951311148,7260653943633419,312258088334861,4189633671095822,5604425601271311,6822100204277336,4969201455027730,7647411007617283,185135589226004,3808516667364885,4132399988794902,650399733249559,7444257571000180,6707424487466522,849299192264220,5483272129254941,3233217934193683,5069989781222943,976819860882976,3124544497793334,3661328151696932,1138218115835429,7174852107896358,9011426629690172,8710259763702239,1277145842427434,7627623774447148,6091551223592494,9223118495385181,6904263360566832,6533315474228785,876228623607351,8757371148579070,2696906355795514,3348809923047007,6958783073384469,6371200743200319,8625386877098765,7034471100354827,112565798999620,5546537427220037,5980965779543623,5212727640540744,3133576049751625,8292647137397384,4803330485364300,2475314713904717,6410956210734303,3182112634136143,8127598629312474,7669699350084066,8315031461396977,333578810836565,8494530443286103,8839471949512292,3046942532736602,4258726858208859,8442323623131737,398701726680669,1056399742412383,4904957393430113,5744717720528482,7101997526506427,7062710668107549,1917462362719845,2811749323396711,7270687386734146,448223986562665,8852576203826756,5225705399453287,788699946358381,5398645320607343,6009858873992816,3237005651498609,2127019697219186,5846423235364337,3863911068636789,5279339470612089,4175742948443770,1653536633998271,5652897946529033,102505731352189,1844865274898047,5685593768310393,7084825750111874,167043047663236,3101732378482309,206291817465479,8233432547776136,3084853977048713,7646580068996746,4138952658170373,5019550983284367,3500888688118040,4486813295335059,3132925813753493,4626708574213782,7095756527081111,7081922194272214,8323243820731007,4311554702672154,5265123120101022,3696808032433823,5535262954522235,4192146299426469,273169705301671,3360793887233705,7229128039700138,1950351940048555,3844780248437300,6608093928636191,5976145090918065,3658380591429298,1209073613719220,3797776472651446,3141363853260471,4237539074401976,1503893107066553,4933073889617594,3816796472084155,4015043301177020,9033779250124405,3807404653684416,4351681771030816,7695029361133250,8562766467393221,5197805283665610,8485547671291596,4728324470884046,777079255471824,5701235894830803,8715180780574500,3703694776023,5365372356470488,5242697689642713,1443986292471515,1211839407822556,4936040132552997,3395256208930528,2723127493261026,3158629316560507,4867127090386660,4121111078545127,8790794176916631,8595028790210172,347197665990378,8763922766160948,2927923311056621,9202252780635886,8893864147363567,6751401486718704,4019129042671349,5910987841361654,760199217039095,367745128085240,4537551142681556,3159271588902650,7542096303740669,6455865968653269,5565350668760832,8932240705804459,8659205105741316,4584997588444931,4442569168074503,6339264801363720,1156519831795465,1053649852479242,9221187093427159,5143254703216396,8188669259415170,268359922841358,5327896939939600,7520651489393624,1031418968211075,7357265337543260,5840681153922837,8655614835185430,5854400033650347,7646609744973725,1858217593308953,4665359213123355,7934922981762845,6586311591924382,1233591354898210,4448745313818404,3791666338809637,6934013651703590,8606861947601201,1052289371649832,5973120922098652,6598240466007851,7523497609699210,8138960554642397,4274270668896048,4637319826560818,8274301611715305,4657428946461168,5880176664774281,7958237890115892,7716612187915885,2604930990487357,978850611402558,1967916335809068,3211021148488672,1336791348942658,7035581127345803,8891253442758468,4412752625289029,8014596945296394,6839546289682250,8975008361441751,2291131537136610,1733894802409294,2502397184612176,2312878396041528,311935564800556,8046903434229589,5101381471946582,6506436218615639,2597745694426968,889716034582361,5233224048322395,4004088876922718,6805822537238843,2407186399323232,4214333815701925,5617553253758826,7307199296628589,8499805155911534,481883942840175,8586276927833969,7970309105624946,1250420615792499,1405577059608436,4382998701631350,4652880439531383,2273838361048952,8719382970615673,4481182332098426,4869013562108223,5418779628058492,812173553751933,4923473416263317,6480414174873798,7392626678856000,4758366609581954,6450686656314741,4209896144758660,2868657437681302,4027091273770886,7538004910208903,6921739629677957,3217544566048649,4783788878858123,8035612788213646,1659848504113041,8730098826024850,4160126022031252,7211587815200661,3517811915720599,5622037961426840,7394559187953561,2137309594802075,2976245038557084,7984135389022111,4661444297934752,5342238240909217,1980568214822849,4166793510987683,8151325185288164,5606715795629990,8482553776723882,6897186064041900,8452554968545197,7834245858351555,5754686370494109,3942606670972849,3532119970224050,1420415050020789,5888716618704822,8104617108215736,4922802361003079,4165154245126075,7581180148436635,7616506808324348,7099137001969602,2263586660612036,1285144604825541,2262168460414625,2025746269927368,4230534457396287,3691655301359562,6348053234957303,3555009350805453,2751890801645518,2513275657722041,7431652391409616,8649394277585912,8871264898674617,4615902923122643,7539256865675222,742449454393303,7495193030954660,4756206974506970,2392936587491291,8182461428179241,7514710390989046,5714161394790736,1941848674514915,3438049294862308,6482774423107560,1801275206256617,8333886829919311,8884338078849004,6751881844570093,4726650901227502,4141210681509872,5983240135415793,9170083329751026,3309153399130101,6572476717303798,3213988571539449,2830259086277627,8744065506162346,3970807947683838,1113547510077440,6421972862233173,3761600094219947,6283479070741976,7352562116380613,690623632202753,5707762488350730,6416467504922967,6133098333456397,9132746182173073,8405880525875218,4871056328320003,2367014159726613,5832840342272345,5691257654103044,2039697840715802,1465483891283631,2014658280982556,5170477133153893,7685344253958174,5786714652692255,7710606709803041,5101683099736098,7967131887810842,966600094746660,5723360613174961,1027100588271656,4669780111865897,8234328640607964,4561601483175980,1561392880694962,2167242595203119,4181281779263537,2651809316853810,2570304484972595,259088076671028,7803850822918494,3081894958282806,1366139758544952,6122783274049461,4795426756147258,5950527330869599,1076579573766205,2774956265109566,7506658358073407,3074702185506880,8344953922283345,40135001466946,6041958250575939,2172287414552644,7505548277348022,6082291677947974,6926186460981321,4755616487254090,1422646266615883,4516368021698637,642572636960849,7263682308089939,4573413309990996,1625388712794197,1691442091018326,5370976620489060,7986810274920541,5018214250924126,8340146385933088,7661250562885728,4445653405824699,349767623575653,8168079143819653,4439127438022761,6592237653317740,587121975208051,1237364010698869,7115565510267391,7293683406904162,4653852890331257,2428502945921146,6991461334364522,8579790368581758,6843224483555455,7489510163736939,5942866442619014,4413295314859713,3687598771689608,8098712991035756,3469118840043658,6364092936832023,3889415131871372,1954489883617421,6095385139958016,3634597400467599,5650733108758676,9096998713694357,5615136964724887,861763781830808,7200669157685402,5714351036205212,6430263639840926,5204018368753349,4109559446648992,6017310024020336,5121314098186403,2509715549919396,8732822431732790,7109476990114490,290069175568552,3717724958857386,3738568221599915,8143701867665301,3367062585985197,5588388934535700,746472455915695,6166747151939761,27141746342066,8279833769011380,1571845198751926,1667965263247545,5051432539269306,7237325245337973,8417900494846165,1024116778875076,6442802221397837,8808750699026631,8548858264888531,8676341257128707,3332031864527052,918834079791315,6018368925069006,171696315934934,7475092350742905,7777935864305880,7446006819547354,3888349480073435,7281161084531185,5591261034281181,5995058603178206,2325350755879136,2302143995115746,5229881463572707,4025859161688292,5351690995211302,2268996645005542,9014023793106641,6848926219890382,3384681920227564,6291118634244334,2729012306712815,4528338812834856,3734908231985394,4537776651978997,7709018728057079,6294159053277434,7423169727770483,2616708825090300,5394532950534398,484076341778687,1021792592595328,1848614151469314,1270621240174851,2805513475496196,7949556095600901,7687155926907142,7358445198547209,1525562526492942,2120418862012154,472429909944599,263511612897560,3005208739989786,7746018193678938,4578832966617374,3427723993909535,238330475088160,7617224437416632,7735252799121699,1515481216234594,4300140535437606,956794137753897,5883171429841194,6056199433070894,7906761471355183,1817302344161584,8073178195030644,3697871907363122,6246375846283571,418142356576564,1907536247032118,5662130762230153,2871273779153208,5417985527343417,8432821866570514,1999653908166971,7889004868186354,7431919924779326,3898855284159541,3671439528499520,8419392984143584,3974902811720075,1022825183910212,8720147859560615,5331438226405702,3043362163532172,6108068997945674,7317037294844983,7464155968874830,9120110479075663,4338663515134290,8036829034228052,7378292689599648,5333287473071844,3950002242062682,386621431482715,2430236048871462,7445697565000762,2435995871201630,2589398439520608,4546673823771707,2469283444599140,2033357991446887,2152655889025385,829780933409130,6616110992083307,5779594307760308,9054867349584892,483348184811890,2408363197917556,5476843305777528,2521410044033401,4650726365129083,8475625027934588,4483687460215168,7947015422593409,7680496756181378,881208268630405,4571456238381446,7074722524225421,2495673317636489,7121871589837194,2916591282014603,5940203619654028,6311380195694991,6651201905129873,1923519840848274,7958635627392172,6511931844303254,9014271563277388,1468435389131163,90466295445917,4886868911864222,772304653207534,3697015043361184,8871498119137699,5426707122600356,2066381598165413,4551856378886566,9197956372912551,220404521261480,7220025238817193,198176128092587,2087057658268076,585844926888365,5694496806640046,6838508322437553,7922745855910140,1094962604173747,4974879756798388,281787080075701,4603016361605558,2292604692341833,749169256974776,6258783638895785,5924556079905210,7660643565502879,5735395064302013,7142166602656190,5448333877590463,5340323227027905,6742509007600715,3282079768381895,7537762956503496,2596002053130697,4719003487095243,8484877622602188,8827803687770094,5445580157196750,5234429116408909,7105582433646484,4279881745844689,4192794161777106,8244853440076704,6951647377689047,5783914855246244,190599583623642,3994372702534107,3156480916105693,3066520441915813,7793252700781024,1206109020850657,206983317488723,4664960338958822,3132682207292497,2478204206131689,3790555233065450,8671955716333758,8934248685185517,6536875056044527,2122276175174129,9132365090202699,1740395278342643,2399109144087028,4651069572233717,5782781792037366,2752423935891959,5117041546701304,6717357464484346,4026157818993147,8911890218514485,8617779800635902,3959220638104661,7832780204751361,6835792989035010,2051033510438458,4315326454053380,5506034138503685,7942824813963784,2949484647451052,2623747523193354,3301669530810893,3933430968146447,2833767936535060,2423211172870677,7168742817012246,1438819105992382,4011465562278425,5912602551437850,1337823682935323,3167718230972956,1293840135957021,4572260837272094,2290713827170847,815093038111264,2773983446002210,1969003266570787,9079227696518600,5021704593009190,6749844396871765,6391604629121578,1260309167729824,8395130278021678,6476371168455773,4215526892169777,2994454008158770,4112215828220339,195908969986613,546390065056310,442379340315192,313805160671801,1735998386338362,8686785194624095,2818908710349372,1399138228058685,5549771844520511,6989024585214528,1930759754111553,9037916445556738,5550837495056963,16762326137412,76535402502726,116289689660513,7325513255430728,1204751753802167,970379093068365,4239756419463759,4913061698824785,6088118995540562,4368264860752467,5368348382295822,1887627906882134,4908725345386937,6407545686026840,468082959264345,4726764845140570,5097923645594204,5242769956470122,5547319169652545,8262922047390398,4563477645695586,6082723240413795,7254842316319332,3256898306976357,2917966323538534,1327617093048938,4043655672769131,682622198819436,7266068570217069,3215534678944367,7610846748320910,9054282374667368,3675330825172755,5144875337206388,1802457946327669,7685377066969718,6435137973929861,2213129570848532,4328787862760058,3170370480028284,2027378035780221,6817611207663441,7245559411074837,1786106073311873,956958540040835,7046263851764358,3713280205748872,2646300381403787,1993508755434125,569808323885710,5773116709747343,5630437433838225,3556170538121875,5527276576259182,6023117795517750,7707589327869064,4279237597338269,1753308552137375,5004535343352480,8510668751457623,159311917533494,4483026856942244,5299562473562566,92718753643175,3932786086263464,8200159383064348,6545724660796074,7366436478212551,5723311075347116,5981944925907629,598274857897757,1537020432648880,5164107154379208,6098876790831795,2366122170656712,7737197085779742,2596236138224312,6981729297519914,668015719307963,8220732712741564,4552055457790656,5426426969901761,7130606621063980,1913472879708869,1950257317448391,7433187477029324,4777231968717514,1850941908679371,1874542107503308,3580903455144653,9048576081886866,8563051323956138,4942284316191441,8610160831974098,7602789181628878,23555715885782,3923851352328919,7777725809903396,4849657711811290,2885435925236443,6853818491443933,1004403388656351,3119791007357666,8887486014659299,7925085763300068,1002750953623334,5113003385821926,5426883999288039,7641508116359913,7344905684425450,7371963542662951,2017863976585964,4908425852193234,6943981820680942,6897455443221232,7727464238473795,7161289865100019,4085094571961077,5396793497098998,6290564952099575,2834613235985145,3202400544324347,7640961431793450,5963136972274431,6834292678634241,2723446825937667,2559951211121412,4479140437973766,6294373965183751,3224023476960008,7089005307711959,2237273971800845,1378241694567182,5904640643619601,4504734637316882,6033477696003203,4054825354459926,8587632077169796,4844344744913690,1347659037780763,7915470645951260,7329623042501765,2023409032137504,1831883332937520,1672690280184610,6984789661944611,3243666353441572,2805197600615205,7635830782829168,2217824728075048,6057766533247452,7018641336748842,5185292997025691,4990934060489517,1278839460809518,1021838098774831,2973186577349424,5639010144242481,1703437916199732,1057325894737863,3608650679937847,3858229711407928,1955338981628383,7228366762040125,3324783922465598,7457366942433760,7912365981145922,470333684362051,3541206393355077,2332595734174534,5187375448574791,6969224908585800,767973926198089,5196902031227723,3829536338807628,3862179124214605,7878723653932724,1035348009397075,2029010057673557,3874849752767318,2115819507100504,8850295154768729,5689850328001370,2877433770758424,7922006282224037,1929741658729314,1350584707787619,4339841998240612,5382521049324389,3387950719650663,7643703300975466,4485906862390123,6838513652210540,6398465238080365,5192118225382254,1669903458003823,3960985728187248,8732260374593855,7097091652696946,5510527001436249,8674514921962359,5452767111498616,4496429783542932,5027736341551093,3320900876696445,3032025711852414,5420519881276565,3933762238540672,3641062808497026,8065217190085064,3676005960022917,9026192641616774,406558773073729,3772981564808074,5682351946484887,861506284070722,6245168367201167,1171002909830033,3735719011408786,6484820882770838,7336486854462182,8009831577100785,4270892819553179,8405523286193306,5194539365141020,2458992410273605,1833417472609184,1934678717528993,1933040317668259,2516513634028452,3703190419827622,1646305274637223,3533346461072296,1161781685103529,1074386720163790,7551743307844527,7445570533627963,5329499696528308,7501546713299896,4616502799477236,9078859797314490,6635311873605101,3223034165546826,7302732293254078,2458019191831029,6670316638313408,1093706599324609,1320911465824075,4703163501472709,2135096604875718,8868453010566087,5391085785500616,1845700655942604,269557356063693,100178539101135,3510002526563280,3005312060169169,4497569962052564,6299110844259887,6637431292005335,5412811201063896,1693082404291748,638821914299356,7928561941044846,803647069838303,8932915527732192,5528643267231568,2224917765082082,51298443256998,2350095992175591,8379742054915481,6117974944136169,6909413559933930,4664038408080363,6370714189728750,8776679386799087,4052179076041713,8216227390351237,7981934680624115,2281558473473012,190279090039797,7412837595126774,1917220597480439,8425155291761656,1708154517788500,2409391466709503,4260932176202748,3131734316784638,4762751895985153,7802019207343106,7136366336519339,3657162687556612,4035769082387461,694366846684166,6480735812289876,2245893536341001,2868199030500362,7778505994521611,1709208928259084,3542325868530701,2494415491640334,3875855472385039,4368193544776721,3156944276864018,3326614806453267,8794310088809494,2765356004920344,3067617749310490,7192890840165403,8407583826000924,4625536036531231,7368934697151520,7223953172495394,700059310672934,1355565657226279,2915178544995369,7285601081433131,2117151926705198,1951801563728943,7910855219076144,4670046822136882,6910292243573939,5376315427923806,6909954439336496,3694629211962424,3193808567004217,7928726925117917,1632042571373627,8259532203304462,380669326629949,7425948651289662,4008320215682111,5754684143286941,8644919563745805,8679736572304451,3095274585087045,2618291197369414,4785950324501575,5364884025867336,5942065384086603,4650047259597900,4226025292930125,3305961102863438,5333169923062285,1969367771650010,636729285540945,3455946454821970,8888318446984276,4452597574728789,4728085340953686,2215280247524439,7747383978789978,8805767887449179,1428791016283229,2388427212098654,2772284167605343,7170971931843680,4773995158363233,5873398543133794,4455923178929251,1437404333118871,1154625347894374,7381503273319528,7569060977110121,5288382662827114,3365631614934123,8486090814467180,5324358032551022,7171213599159485,6053610728696946,6297324804537459,7584569400147060,7947639378574454,8955759719473001,2341001259207800,2346698706320505,8077700732685503,4438518309526653,6358535365272265,377510398200963,4746402769931397,2526240495254663,6820507053972618,875134964763787,7962449713306220,7627974237867202,4018724785429646,6880273180763769,6419121075288712,6541199343695517,7323385419660435,4039708618955924,105265929440405,5384659971673238,1855176227306009,4772316598254744,390926245878939,6089688536683034,5788626177394805,2269985197005983,1518556890623136,3578996623416481,6168335431371938,1058355358276771,8245287469210789,2564931009789095,5009004006689308,2624878766120106,249343933607083,4610348469972140,9040259016362470,1598805435575473,5951537149328562,822834791155571,8714570880644275,8688632851627192,2026236631086964,581975715634328,6117684355693757,4524912841100479,5274495159024834,5572853476764868,90754929048773,532224739114182,8501902506724551,2091321387752649,2391614908888951,5551596145208530,3827295790337235,248202950098135,2747225172085976,7206166905503411,6694779096151247,2940092630809820,8181072562001786,901931471834337,2052003813551995,7409653968190693,9136688507909132,4163021938892009,2345855173598444,3260711832345837,6234712860458222,6781179540163824,4593429204483313,4062523304463602,6110625273466067,8426313691556379,7091845478439465,8833428846519109,2809260436606201,6442476629616109,7268794764750076,6946423621487146,4882325880806469,8947216549588223,1041944326585600,5222580097109250,6134251212337707,5413068254633220,2259632172825864,3230869729714732,5739030585818378,1104080838638807,6413744492081165,8006215754709958,6712009357664898,5909444756462808,6568326263744387,3810328094993686,8724133974849252,1214549316562201,5243256295096602,5690144975050629,5903758834940981,7545041443454243,6002518857215269,1808464570083889,5560746404964207,6719064569552170,7465235511844081,7323538908970284,1271152529340978,1956939094953262,3456378584522031,5242396316088883,3148897366994230,2904670804484916,1526388199669049,9150178791237768,2109825994698043,5058667766615059,357076974931262,3965288345267519,7783436286160192,2616447217909057,7369614243540291,7215055957377431,3172226460506678,1610544171425094,4364710580399434,4126783858257228,3308465573850446,1345552894532943,4581979074080080,2729750267833681,6420081045149121,3975888275688787,436440873577812,6375221759576633,4694241603280216,5963590795353999,5643764392172893,3262376948747614,4769816767098207,7531348323445055,3338013074967905,4294068497886562,2969184744463716,4274823311166822,3923093987138919,3951148041963291,7178382123982185,2375072351792490,7976867571786294,2220943948307820,7094250651766126,2861402905415023,355068611980657,3020314390764917,7917771061107945,320800131693944,2943776093321108,5175421243229775,6373238951857531,1502483749131498,4685739954195839,8918452353679553,5186697947970948,2955228411993477,4435463934004614,6091645937185345,1153526756527497,2782490558721418,5918351178710411,469119490768269,8677984716836238,9065139632741776,3365541559217554,2132734055665043,448962290097556,3073611520703893,3113226145811862,993024786300312,6227358377586073,27362219888026,5510891111339247,7807464250039709,5016591687962014,8583313711604976,9017151640285181,1285226976702363,2058786262142372,2194026537071857,4005664091823528,32603191963564,5581874784452012,2474177960075165,8406285518876081,3461011284749746,6608254712237299,2289534317079988,6947510681365941,5346589413514678,769954764926391,5992708612483695,1565506340163002,7011604556329546,5352271227420095,2435191429074368,3670928756870593,7674151613951427,6057434412714033,6970771112091077,8190096274275782,4326387855506888,5749942729657806,6108826269531599,2055835598859733,4999562061905366,6269258288094679,6683574890925532,922005921377760,7409718335048819,4960729051461095,2743220549660135,3544375496805865,924694737817066,7778635003461543,162617004641772,3164525091077613,7626651674324221,3441475510943216,5983223634987603,4499667272269301,5615689609387511,8300249861066236,4364323455303165,9008409451359902,3173424444231167,3225178300018176,4075543131479553,3953063107825154,116589162149174,8311019152317956,673908089802275,2814788311379466,8854351558372610,1417152008445458,7728415271490819,5043345090874901,5648553106906646,8044184034230448,3512032577594001,6543550232460548,4820800956558874,1756687539404719,6606461111108186,7566517455646239,8794616942453649,768617718185904,2206896186809891,8416499520380454,3452169951694375,6481777437923932,2953543609151018,65617729843018,8971377746628141,3069588084448814,3412193769311791,8790139427952277,1632545932299825,6898433679531955,9168096297381430,492909452725815,4101024717622840,169624182697529,3554172356249736,4664309204082239,7124479225921311,2633509876997698,806540983549507,219127232708164,2750369727553093,7473210472082224,2985173944610375,8509392281324262,2524786641473097,5017606432648780,1124632343461454,3265854206172751,6913993190481848,7010006138765923,5483969637555796,971475441995351,2365414048390744,8294501393942780,796766359944798,4810411704371813,5729895524392544,1526039318580833,4431596131499618,813707845928891,2212822234758756,2392544648101477,6564680067411559,53825696345704,2122484177682025,1735392745832045,5939766083862126,5364423909433339,3744877234597490,7856027163315829,8272734013451896,4463444224929401,7543300918315436,2796934217008523,6404438765513322,244134414032510,7305521157520216,3254156206685824,2833087346273922,1916948679539307,2211096632368775,3927272952766511,7315743139347615,8950452669456373,5694163690438290,376057577697219,4494109223323307,3987702310780566,6193677916929305,2115046591520408,5653921874067097,7755102393884502,5119567509555823,1328441656852124,3037301542633117,8227906039488158,6483571136966597,2731948431343265,8206673693474466,7085671967952539,7252195414804023,2959250607480491,8445169186490623,7701674584429170,3203298087861934,4221618855090431,6982012547558134,3421829275385521,1184469739507378,4963030464041587,8851811738050228,4277335625461429,5333487387721398,491199959981751,6931880560750517,1214229549227707,5978794435033034,2707154566713022,2488857113487989,5824178611957440,8838840152329922,1312981719396037,748493633127713,6771221685192572,5639932700145093,2031192927792843,3101997301587662,3688537180270287,8151673896275664,2709854642839249,82031537868498,2054710580080339,8662299423280802,1156577842927566,6349307440250205,8805719932889721,4835385556209368,2520217370555684,2802885629650446,8411982046670723,6664010515355359,5195683384221407,1423739714641872,8843712291188450,1981154059288291,5450391152627428,8917186760867558,4551215811366631,1205148966280707,5631906963008124,2549594476769003,2498401103564525,4374531858158,4414231401725679,7053276770107121,2508983603584979,7747804385140471,6164115505409907,3075220407582460,1710580230436138,7979780218957566,3715024365014783,8641449830465280,7143190133141251,2203909323521797,6721297124794118,1732130588516103,2406418852781832,6265905467059977,2431147396931338,8247927936389079,1872575906889485,8079967605040719,72656062656272,8301207175020504,3683461550546707,3156079150759700,5593545597857557,3894385258729243,3835549956411164,4161218688937757,4753827992887070,785842719842079,4724731890605856,4719429313871649,8547389958967076,8373835249831717,3148514413817638,3412866556170023,2616091809828649,5010252471820074,9088248312069931,2535876467420972,6821379578000721,4363046466308744,6242121013485364,4121067860008758,6823609602121527,4111711852744504,54928807149369,2133746750881594,7399478461767483,8976303730622268,293594257952573,6393962549382978,6724375905699695,2777956427972420,252863754782006,7670053797333836,8993411905553036,517330267815754,1292922906566475,1639927227006797,7308569498722126,5943804311894669,1802982444863312,616882705096529,8583974846336850,4225686076387155,2187887423180628,9006213841505390,4166152299904854,6168158116535609,6019388182359896,1830268693993444,4894759928995674,7497510951280476,8717884886900573,2016164553764703,4889826673729378,6241052815601507,4162564648951652,5515833410822118,621014487617382,4532618279395175,5005989433111868,8859724841631596,3637533446136323,3304166496816853,819228047714963,7197362048159604,275037120221046,8194476540993400,5855779389325177,4256472345023807,1025212805705596,3509864058867581,5417276690014869,4189143409770368,6415697815498625,1045875600224131,5399031890362244,8150994036996829,1073290951532423,7282706113200010,4011387404033931,558735877332876,6581963536019371,4379470044904620,3112190251462546,4222482100625301,7724897940688790,5256658960261015,7865022085201816,8123509697168382,4514245792812955,1025475811135389,7904539759793941,2177527681517552,2203602782592944,5054369835044772,7965610324332453,6543243339476903,6405314730487721,9148948744115669,3067907804815275,4606987865481132,1093529392287663,3769592583143344,4764367314893737,4882316627972018,5335523765858227,2375382411513780,2606343929152764,2681841310609335,1710027843350456,2289139079114740,8091840416174010,2779551068544955,8348394730450875,8889762527702156,3917053492559807,2983947831910337,8775685911277911,1056815373995971,2746684881174468,3417344214880197,3693763861548999,9149955693775915,7922138867600555,5578012417638346,1177183468310475,892684572200909,4227138625642446,5138344280182735,1130056091934672,2025586042383011,2153136934395861,3076244208144327,5282269621559255,3234906712772568,4020199739027417,4799691354193883,7668082082085649,7685169946280396,6268954209479333,7783357175270736,3260719496343522,2764657354948603,3405103093370854,25771393241063,8237707056594585,2827861308312231,6939178355866962,5195899241148398,8674328407850091,8549586904743920,8373324529021636,6167372250939378,6061204575086325,3396327423037428,5410299663605749,3008131021697016,3151917161098580,5314744005980154,3490271597518843,9063700865359868,1812744655888381,611156861902846],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c3569a0e65500c3fd92ae9b8c3ac617b",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001902355.1/GCA_001902355.1_ASM190235v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP018364.1 Klebsiella pneumoniae strain Kp_Goe_62629, complete genome\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c3569a0e65500c3fd92ae9b8c3ac617b\",\"mins\":[2825661392134144,2033189859385345,7763729381490704,2814236781314065,1099257094086677,3751257543065622,5024787871457303,7464279851319329,2324399882141731,2840796265922598,7765792662134825,3944282449616942,6269685434572847,1062292141948982,1682927358189626,1086732900704315,1178672656826433,2847644126310645,2218536580571204,7001478810361925,7318762610237511,6379649350918217,2521872904661687,1964954098573394,3049828419903572,3395790169677911,9017250487783439,8501643930320912,7820335285239910,4631714931556456,2538900348682345,53469056237675,3331198834196591,6073449176334448,6666157676773489,4821331352895606,4372886555263097,5609545506701435,830498035826814,4115664208248853,4812465005330562,7548888659140742,6437811704479883,4716057905340563,2735563165466015,8098263125385370,1045902679965851,3094016768917664,6135910154305706,9066192649833696,1591286253568175,7703632325165234,3530491534254260,613043574915256,3233486541586619,4008472451121341,3969410216886465,8986340986077391,59166982512848,1469334172341624,4123697264394450,9117191849451735,2865649580998878,4824719299649761,2178589327032546,3486037618712614,8305173487943910,1139322409017575,1322626372493158,4101145454665974,7317658126370175,7594870104498429,2733148105122047,3521858755911936,5349735887110401,8273393589985547,4404012086599950,7462833473143057,5435318982279443,8518748769141013,878398579343643,1338846841676061,2322552650604831,5241727228985632,3727672261771554,4194189042811175,5052666273718568,467825301594409,7069742635876650,5816104816836909,6227118495195439,8404913801224497,4862182933414198,2178841608364344,5384767099486525,53703970922814,7533720886591808,7079187752595510,8003766538415052,7159343043191113,3037591686002061,4886885729131235,2262168460414625,3292318577123678,6290752887447904,4633804493087073,1659712093258085,1399483282391398,7818376595194216,6269218329354607,2024276829847920,1034896722690418,4261092781080947,981932128117109,5113595740586358,395798462153080,3128567573594489,3709270451806587,4675740794913148,6642867477379818,8918326417965442,8888626409587078,6733013811182282,7424701084352907,3435851531463405,3882770171691411,4780222772175253,7849173052096920,4881403182497860,8460033107730844,3352907611824543,238164701716896,6864340470202785,970373362942374,2672391886791080,6520081022656937,1540551934157226,3509367696441778,1611667902382515,5755113694552502,8210450547810749,7390473875120574,8037199752028610,8374897291706824,9004997694915017,191913654223307,8875561096135122,3401360745841108,6155164700475869,520705803977184,2542235280515555,534398104953317,9020139935711724,6375867041280082,2738386423095791,651565429694965,2220303437275641,3371998036861437,5359249199088126,6664509085131263,7378010546086408,6258660517414316,7333244688925199,5559811070444049,5998201983631896,7782876924043801,386584893587995,5067693494190620,6718969305367069,6175980498565430,2517293162676772,2913816144675365,2556073423348265,5395228548170284,7825655052446472,7597475935248949,7065796846346806,9102749897048632,6487057550451257,5612197305655875,7117180121989700,4741846324593223,2753151611353868,106626187821643,3907430886507084,3604755309658701,6474537492095567,787159593951824,4027840721986133,5246180894999126,2156889129206361,6923589351424602,2504280552145500,3677445639152224,1086669116023394,8284756864628155,2494866234647140,1958113583776359,5594021186372201,8940081059791467,4158968382939760,5783648696418408,6134127136596595,4931803380990581,3329185533853801,7303854305580479,5386020464747135,3319882291740779,1422820991058564,3748040622015109,6205083557896841,6588161145258635,1121908702315150,3199880066138767,3046987152597648,6861216913785490,4658535184307651,2476959448965783,2735456639476377,5854825933841050,5284347799720047,4293160978703004,1754896903848607,7003201155293862,79999375952668,8226821174502060,2916656029257593,7690390056010416,2132598259393201,3775021480067767,1889951248613058,9221752096616564,2168699665236673,5874060161614532,8715396255137910,1946947811388193,676122495953699,2452564075438809,8141082866033371,5551266493391581,7782961468490462,5426623183913695,2934649590973153,6367198073979619,332336783295205,3829207690912488,3973686171960041,8143135549899498,3901034766148333,4578407154811631,3069114945078001,4592903173374708,2053258869579902,1824944872522488,159064158929662,7747934952448773,8691958274671369,5337826435662605,4797772044911383,3132123167752985,1180676476298012,8991569329308447,5080473851536169,5872800217662252,7638727145505587,5844589222003513,8172053269488442,7802351914754875,4069558538371900,6437351685169981,7743862532096833,3854607497724741,5286622382408518,6175049545122633,660285647913802,2963436823241549,5308054970696530,3748242324988759,6728594131034968,307993834029913,586549793858397,5860710116844384,2448893763478370,6491528403878760,6238359944766316,4440470618366834,9044405674324115,4609715037717364,4047073255162741,6607811912065912,3312272446585000,4989343831671676,7904993058169725,5380505832383359,4806443301086083,3873161224135557,9204760040692545,3822080127378314,645729272858652,3783817446925199,8785370327597971,484876271035288,1082644109083545,3707554817059653,5633447704454048,6073262337983393,296007772021667,5117178308330405,526030893646759,9004929971323816,5702659040175019,8962428353848238,3980024380556208,1734652526955336,1350401292698546,6286559714214840,7219192496128956,374642501583806,4289431004505024,8159423696290753,7548360507368387,2061936267125701,4097782020987724,8026439880246218,6799834773341144,1394643815769049,5494946228274139,4012631422575580,7144002539766749,4647490632975329,4202194357402729,7244452774044649,9157018892485611,1711269958124525,2751638925009902,7237677382403055,3743178898891760,2028328125391864,4906339867165690,7359412486043135,4363227588355068,8316803469652138,3445437173908478,7036246334202879,7040633558926336,2965946953197056,1172164637492226,3760422238954500,2715797942952969,3892329423488016,4063010130548227,8690188204243068,2314307504759831,3543148159598767,6264262593307676,1419255650731037,8579731528868897,5676449057350693,468181998601257,7637718697146197,9134102856039261,3669828795401264,4848290321712179,4237099745559605,5993045458265143,2729813901206469,7012644857668671,4076400841966656,4290483129451585,3617843070641218,3285040179684422,3698281033376839,7535577565168712,6216575746057292,7469877974985570,1295595558986830,52911459787855,3232955231150264,788631632249940,5075028805641306,7520656828925019,6391322642947920,8163674498121915,5676904381252711,798729136129128,7985269870183529,9128217191580782,8038097219241074,8280364453574163,3298820715168884,8523024587588725,3111699764651127,6794639379787012,4672610815337596,8161496124204163,2134883066872964,4097959989847176,4114564194018441,3353796330062986,191831031129237,1993490233726489,9017698578449566,4639488188933279,2778380183717028,1572982593283239,3980569549636779,7165454799111344,1062622262819699,2404422181553694,8571230434043068,3320021657576638,6602099338757311,3797691746215105,3458837615174850,8598330578797764,8681170486092999,437735742719179,7098295220364493,8842252617819747,7501741863666904,8889731761628379,4096283770111196,3993972127517562,6033560855749854,3353459361981664,3174843530601698,8692913826268710,9026439745799399,9175802171532525,2763591410197742,1798889755460849,3870783077049594,5662406811264251,5349153677976829,9009057945380095,4236337856095491,4916801101990785,2013197874242826,9119771990017295,6075496655553812,4403251650897178,608678462596380,8541153131169056,3677521512457506,7393334317466919,5101633847289131,7808865054844207,8414518667756848,8554554536022823,798389846167302,3898188614346035,7693315246302517,515025743616173,6570018701665599,2550674089852410,5478954090696949,2653230921114950,8183990445196076,1837100581242184,7090484478747981,4109200220816722,8935402498147669,9103631026124345,8965648140838234,4617461468384143,4144031573370208,4199406127580513,5219527146153316,7247209654011237,8173470364648807,2189328836527474,7756402203919731,678836207191413,2014533048059259,4006064256255358,4466934118212991,5193926725289352,2796934217008523,4908191968224654,9023676831892882,8356127423702420,1115165903938967,1431897930343832,5733382264595866,4070176672859547,4425547999610268,1554915886859678,7682116685751712,5682105626027425,723713907705254,4453036770313639,2227481306654124,154626730943922,1070955155506612,5116058471826870,4840995738338747,4198814503085502,2381772093982143,4170184645486017,2438544802473417,1467163494843851,8042021282219469,2609071664657997,408973028328912,4988495666537941,6363331814788004,9145877823874524,4678713182127585,6959524676371938,7642427270374885,1494190089938406,8026001265133139,451766752216566,3568640115557881,2624601790268928,6904088436130048,3317915293640197,6199468336170513,2464319457355288,5353218156209689,4529326427981338,8552943077451293,316781166446110,7291402885957151,5757494469756449,6304920741758501,2652715332986406,56677955921450,5953198862411318,2113989259683385,3622777746785851,3675223403875253,8451522476983873,404161742693954,6050934050268744,6263368946345547,3453413709071953,4763910963295843,2923784661050964,4596039513096462,5251810049902166,9010150363582735,8782718444447324,9223118495385181,5809283563371451,2054130678204007,226619838006890,718571989722732,6783289649317485,2993785101002353,7877695219377778,1098076102256245,5956494881662582,8825508448970365,7326429808420478,8970862220494463,4667558135663417,4435718607357574,6435778250918849,2994496306579081,733485373712010,8535236606019211,6460203549107852,6144641375692432,1216569729058452,2849744649823894,8881911404045976,1319214513890971,1337331536012957,3798376064263841,74621683222178,2507886369375907,4958310257616550,3528086252436423,3441542834939565,1388608100942239,283337928861372,2206937611970238,7917808686371104,530606531569347,7693012394514038,1577518672193225,5141980198504139,393425039591120,1885412383860433,2780877688522455,3710227919103706,7288098563507931,3791742231766748,5401345186027131,3934106792740583,2490441208768237,7736960458811118,2402064393459325,4752188010202864,5860141931857649,1598980361053940,7603102571046645,6334718377264891,1485625434228476,1923391073986304,2920069275232002,8217395551332100,582993563977479,7579452004034314,783853856966415,30248125556500,1145456580994837,6504363561256729,2051383352305434,2107892907997177,7419849874401055,3383099437803296,7086936937630683,8045552285070982,6822034579261223,5650130866669352,6191751289390889,3406460539488044,2675402216834865,8421054865917746,6371200050210611,3372353088694069,232143060977463,8198630606530360,7307190266832700,8044671275427466,6275762281883454,8598580851738431,8442593404634944,4512255692007234,4485745719150403,9204064322864965,4249253943052102,294183442417479,8515852449425231,8541043633825617,6794509134202706,7466812483348316,9206502014019422,4523342209697631,1460583388669793,292765571065700,9033603308099470,1109058513422186,545154038720364,2374374455289254,2590865093412718,1457698133190513,6672032474367859,9208615263995767,455992445077369,3782304344500094,5657947638280512,4785076025771907,2360789484529540,8830611479734151,8628209065183112,9012495865382794,3349200727345036,2003506267957135,2067285712586392,6894994112628640,4599340102085616,9164903519471524,6428899683791174,31462050432934,7632087085254569,3977407856338858,2265099926235051,8505277255493550,4620065500595869,5647623368345520,3307488783181746,2280946891205619,1528097240410039,2624304119310264,3552114267187137,7863078979897285,4525153188865698,7077203364259799,8814850025768920,4965091393628121,2509309322346215,5521885564880865,4236065673897955,2848821515225062,6125570438465513,3714008984922092,8769464829298669,5809719544080366,8677167980677104,655585375668211,6572476717303798,5247289870505641,4280916272572409,1795060462323706,3085897787852795,3356687072086021,2886823142319789,7772030533478416,5260380360796179,5643436474132508,8403444392880162,3969753056307239,1908219344431144,6179770572441645,2424259930286131,7494527041751092,7765584890341429,433837013264438,4829550541391930,1700646211143741,8537564361615429,4982070234482758,8938366739945517,8832550226184269,4778853730674770,4543510443264084,6245086165248086,1019155293161561,2011080954792029,2275575918717026,2270586837739620,3226434669750373,3255000539490412,4620883738134639,3375704046649704,4642336363096181,7192989056747645,5949749411465342,7593848408409739,150149551933573,9050666512263303,6364918790919133,414506057017484,6610890602932368,4358803398756497,3614357137033365,9002492487108758,1030795087472792,8123648316510575,1721578297198750,2045656610847511,3045831786907809,8289934319536291,1040565405092006,6081788535589031,3380693037066410,2779074093435052,5569459502622897,3573257375475894,4758822524815049,8260436683983033,8190244339553724,3861470011050173,498159753349311,4107895602063552,3733127234911264,4738003032033476,5532425489516746,1508539071835171,3251847253444820,1136386745460954,629786516777181,7891285500473723,2290802752054993,3984083825305833,8580672662882539,545405692553453,9104695604250862,6209700153723121,1447216836126964,8440101679237365,8235385590770729,2534822841600249,5378393677474042,6618698829023484,5330762161896804,4430992747284745,1942610469803881,492935275694479,2266696620370199,5295537725098266,8009190476499227,4749234242245312,7932384629221663,3525580015528225,4785273069956145,749730363197736,6630384960575196,8467903510671751,3459781988698417,8301054501677362,6875206967871801,6734450462132538,4621887719401788,3834307216574786,8468052211099974,4324960003418443,3101762691393872,942928616819027,1182584290955662,6313292569110871,4003096734689624,914210277280095,8937541115160932,7612165964015973,6206186400016750,4125427273378160,4553125835655537,483348184811890,8564535292692856,1385560271415674,3242052203268479,8323702198454658,6377239404415368,2381120623366551,8017004563310991,4866044389788049,5073280113518994,315193340312471,229312743008661,7861516104255900,2372675439135133,7377800022608290,5063616252266922,1965890383931821,8712416472205749,7155253886953915,8800455262874044,5735395064302013,3483859778053877,1054859647830475,1963463387843020,5863763826452941,8724510960039834,622455128074703,2599964211120594,820766606117966,4718544852134358,5931806575593945,731595127540186,4283221865671132,4509654371854814,6481540321757665,6340590894186918,1489272881262152,8746649827453424,823868833065457,1453246227343863,587152812698107,3685183462943229,4641008681396735,6026301314166055,7876463855412095,2025901636004358,865795065046786,5721276005427732,354428440922645,7907723259832861,5752949606386206,3348608521194015,658824637639203,851781227825700,4163964451473957,5378633632778159,5366986119866919,652128335981099,1409744113519157,5058220750473782,8976813254117945,6068092036672061,1241526903310912,801199787269216,780915563088451,8596103909567057,963719815498323,8974205819185748,8682781800421629,230286422739547,5920158612679781,2886298266012256,9196123179321953,1815514387098210,6140973363163579,4920678913378920,4035053122751081,9001368824146538,7258457923611245,6822427416550504,5983548852939383,6353228512316027,966915373930261,6609272901921408,4554270319626882,1833052437269132,3180737773390477,7978023304897889,235506622179986,8255399091874457,1308983972473498,76741557516058,8048338017790622,5167987718269603,1668832673688232,7665918856353564,7273464594967211,2787905993927342,8188242084113079,8142224487205564,8726049688857277,3235173626743486,605309830867651,8610160831974098,8563502951156437,3220822437571293,7459139200436958,7303450231581407,4879102511598308,8105325413894889,1284766323051242,3224112670149357,6181538370849520,7983195950123762,1130553705843446,8348911456201463,8680064237240788,7689585610214139,5203410523474686,4048896941099778,4373650501020423,7857059234908936,1667138528996105,8413871710014218,3645715425012491,3147336974240525,8501061798120210,7046192349735701,2498245057440534,515315946244888,3749053774138140,1193450743434015,8323219879734049,6757922066172707,1824921467086641,3041698096786216,7018641336748842,6897211326851883,4871882597174068,7383364860177209,3852747994188605,1737511849151294,7325251691524554,1470555726842690,8229556360416067,14775140191044,6071092113214277,7471733712366408,4193600372468557,6841496573122718,4294514868378765,6808815080601528,4333301310090073,2837365555473245,1768888099539857,1645535232640863,3281935985544040,3975840853150569,7643703300975466,3656606595959660,2854965849893742,2876807293406063,2300978766621553,5042974264650611,6251322368322420,5452767111498616,5788898047495034,7570399830059899,6537603917728636,67457673014142,4631108938058625,2881946135841668,2277341961309065,7721331473404397,2327700173056913,7326527070210962,5021701298195609,1891724051819416,9133661371009947,5937854138788767,8336297958206372,1422713436002118,8668931416198055,4530053973535656,7839210707641212,7619604800031658,8253543426706350,8464774251588533,2788118733540282,4779641621444028,4521005095868234,9113599110619637,8350358619417537,4403035729177539,2225731263156712,8290107292396486,1513792196701129,5913283146320844,6242034217913293,2532126432865231,6755424558246866,2239203233287123,519285804559320,9181236419179440,3718172036402138,4067658347861839,511311629044702,2455080912079841,7335880571874276,751221916732582,1066032611142631,4017919866031080,5394684145316747,2293013117473277,8039956896525296,438336205163505,6109336153675603,8045606663957497,3912066938924026,8413421489687550,1264111503068159,6069248613101453,7383688525351947,8764578928121688,3857320148061209,2297770150702106,2921764698016795,7101838153987931,5979378066820135,7085172602186793,6941710214450220,2395728429149231,7933399751404593,8091370172107829,5003243405557398,7576362289260383,5017480398457918,4199878475930363,687988163980362,7089341039946830,5746032249818191,3660221321825362,1381548676795475,5216364370234453,2098304666655929,4031931424885853,238673317882976,7421178038103137,8816665699527778,8395747933170789,6849522828463211,4357142562542098,3173122386545776,682213739809905,680213068672115,6425500222246007,2384179687812217,2040003798920065,5782050516151430,8905100871027849,7850509125143692,862516095290511,7884697021574289,9008059381075090,6992298180328505,7423574124260505,7184385968868511,3824677482146976,1161741075942561,8834918486314148,4484665219239078,4861338979146784,265591340313768,8803207810624681,2368373966859435,7344979209546924,4277335625461429,1672879923031219,7388996268913182,6589250764614839,5323496559886018,1592912947784891,6753248361106623,2167791119520104,7627974237867202,1249520276212931,3177192750588277,8200028932418761,3101194093759691,6206226174074145,2930041210031312,8998324443434193,5611882492095698,7635771716570331,5442808287571165,3407471145151710,4978274223164640,8799387358391521,6766272749522152,4638696333405419,7010400364050493,2429283008113903,4056461017926896,3109082032606450,2562015994178804,7248348588361598,594058566790391,7806348129619193,8332634170797309,2564612682878207,4144509239202347,3812080285428996,1799238650801413,3126115335040267,7200880370674956,3667314113219854,5410887503267715,3464824908844310,2777888941112538,5652970717383966,4626459960790303,5383196484416048,2203465853087010,6419157187087652,5953495028043047,9035422902373672,1887060261465385,1987403353753479,9035841532906801,8466452383501618,1641184597126452,1221904853323062,8703829635812667,149374212607296,6045394366254401,5773738070011206,1880023061892423,2370231089432460,1066092278541643,6396336826494284,6840196836060493,22108390657365,6694734509493590,2659021849719353,364328874749273,7013053299074959,4760839601081696,2696627273665890,2711021914295651,785692537793894,7658965512138087,2225621224885608,5860590739092028,3279199422893420,3980950491065713,8679935362731382,1073265795173753,3895420423417210,2913371701735168,6315723984063879,5801714594860424,4246760814775690,682701071322508,7132333439552909,5616525178580366,3546659517590927,2030519814795844,9077326281436562,5560302473973139,9025200095087427,3356445223824790,5214748155327658,6356093164490136,2270166621860420,8021674292006300,4332051111376794,3232545347702177,8930607983324584,5376019912388009,1159725118467498,4989640922074539,9198168229907884,1820226807451053,5598891424583087,5632994836106677,4676890792504759,5012669710970297,5982531935292859,4558785178922428,125462021950912,2310932547259842,6553391640931784,8537426290060746,5653484949016013,1323926076255695,58682170535380,2055835598859733,8545988940361175,6931003232783834,8888428138057182,7243080149298661,6346217525245220,992405040033264,3182801854852593,6247142701903348,6183849805821372,4003317154378324,6845141700267516,4058054687927807,6896139214556672,4108748845059586,5237862403984900,6857754023364248,4843528206216717,3880202159653120,5062397119319567,216363301875216,765234695613969,7075036833926404,5080049278561819,1039016675077661,843625438735904,2661598936452641,6912733301050920,4221436215709225,662905187339819,7493239301597292,3663243262217777,2459221484744247,2218751784439353,7359223573081658,9121235641221728,7999947131227716,8632287676304965,2504328516718151,8389900498251336,8426693322763849,1905734263410251,5103300985987682,8162783433676728,8556611137097298,6922986509061729,5491916581170786,3066815341375076,3584864903343717,2269402083282535,8532575549451884,1303826094943854,6841555738627695,6592905905368339,803496287030908,7217930918096509,2990131029503614,8545990242692738,8400321448513158,7820564575662700,2150019532189329,2750722205347474,4918237925985943,922234841034396,97199294353053,7014049226927774,5730713875939952,1970977381486242,4347058252820135,933760297135786,1390549666598572,1706112826855091,1497211293044405,3032005490786150,1781981332893369,2026596355346111,231222115684038,2733555158560033,5583485671952074,5334297002001015,1670839276629710,2647836075806418,3825849023041235,8027584499502804,9201471766105813,7935231424458454,1606948754968281,9024706155089627,483685398220508,4724108893925089,7066930143874789,3867454671982310,6473249607880423,6759265150602986,7712123613638379,8964022073061101,4382654424289007,1861947185983220,8784961689448181,4655389866749225,2659892870172409,1920793002372863,8562677556203264,2870420554911493,8702035752374022,1403956074950408,8510516194248663,3317005168357134,2243922036920081,7377099978343043,8914621123473175,2812193364406048,2270301329600291,1283419235659559,683438139969320,1556829539028777,3686071528959788,5040737519030063,7188270206246402,6969980581039924,6291588046491450,7255698664156989,3224555714564716,1036251468918595,2041813004136262,1102070785552199,8000049216317065,3636287588568906,3507790188048204,8549468912717645,7441218090389327,6439106263011153,6718957552562003,5865793396417166,5435832596787031,4614426871820121,7521888431727247,1129308837228382,7430933427982175,1396629807746914,6147247089299306,3102894705307500,3790996945915760,3723937100369777,5307096357654388,4252808476290935,2656703754825593,530101397950330,1743630169706363,83284182601597,6894756696346494,2073715707596673,2234686764208003,7616230150508423,3081338442551176,7884636995872748,2039221639942026,1375924375408523,261076777876802,8996753521248250,8802411154395026,5887336183418777,4556939866705824,8635935496269730,6160895709373083,6657067408117670,5420286626235036,6276035165630381,3972794261942154,447684538462131,4578296682902174,449718139498422,2266252608482633,8871264898674617,4513796960169916,2069204064653253,1939195945311564,7934776132628426,4508920978599887,3475987861925845,6381159979067385,4869613428658137,402543008485338,2607313521881053,4209776843657182,1817200856841642,2569701792734545,1474928463089640,8749577454161897,247523432787950,2909881235165169,5359767240921074,4876575744474982,1331133920333815,7432019604402168,3518327770419194,7962457687863294,6477328026914818,7642292354469891,6510353720815620,3248068538036230,8072627626938376,7420211357691917,596702589655884,1117604460804099,8278550610096152,6873644207984668,1965071025721373,8896023287484446,939193949679647,1489564892761435,462236158865447,3152961925533739,1169598513257821,1539250335240242,1094771783847987,4829204011864118,3866569293639737,8791118844866624,4658944945073504,4592551960703043,8303792955445317,1904415934648391,4564982944446477,2100388264628305,2293407346733138,7266627565391961,4897752781525083,1590596707332188,7434390786453600,8015638604828772,800787259633766,7896426703876199,6261423881179243,3493887070744687,5304427110019184,2720302046941299,7062469823328372,3175914361835638,2606640107761655,3350655324598392,4399269730160769,9147473408092199,4026761300021381,3614614728519815,3889951307837577,1538249919910032,7022738028368018,5565732600213651,969517970518165,1635969133146264,4331011023037124,5061434434826394,4250046739787932,8064985729740957,624266625749150,3590011338731687,5683139849744553,4513686909538474,367465869832364,5957457216549039,8480847921623217,52779063799996,7798807212093630,2015840408563903,6729917533147331,3001685207664674,2132962995917007,2420618075959506,4281608355696851,8858362016936654,3494443586113756,7348336928690397,272951233548514,1388850303815907,4466484413501668,2567539398881509,2610689640810535,3412100085281004,4435687686336750,4294785692102895,41819726631154,2482098524639477,2834850918379766,8298483615111209,3820416150810877,915403748102400,6065204042100994,1166201727357188,2344648449986824,6812428918829324,3571381406468141,8399499254149396,7142043002790617,5063032160284952,5815687634800921,380290004390175,3695267116839200,872109770436899,7665584797372708,2892139328254251,9140995854037293,8727634408714542,1655717665501491,1838355210202096,7135916213104955,5895837096013194,7606467691581758,2013302439301439,589108083708224,2595065572846983,350037837779269,788064239833414,3672441501307212,1437057967788370,6589637598241507,109291800436110,6040861877473626,297181810567226,4108959446667616,2748990573850979,1400456525066598,6839027949695336,4029546498543978,87326140248431,5329119606477170,7341498767270011,61484813095285,6799616968765814,7454612061532905,9111929491843875,8598183935357307,3554383313285500,3391905859735934,349280356798850,2230128463221125,6532768177508742,6930990754066823,9000985673366935,1186057699840398,9005892542112493,5275304918806934,4070342736548247,2350892058079641,710743327134110,449062926272581,7740699735364000,1532816904180142,7858205299478960,1560159274668468,1204751753802167,282565120446905,1112810544542139,4210209550881215,2384251893822158,9111431332830761,4869342666928583,69707257614794,5144070841995725,963429937653837,3469808268464592,1041698261938646,3667210776777175,1225261515174361,7785732306489823,6526398141452769,4493211233956322,5909963338150375,2733088049123816,2658021971202537,1273469840224748,5609315709997549,3919973011141102,8826717845720953,6025413565067763,2249367523561974,3529736482024873,3738286381470203,1033036149338621,3959059919794687,8334626535264770,8012197866926601,2294218065539594,1847053765597271,1882109903532562,7536713042457108,7328026813346329,5813493932642842,4656571517235740,1753740124852765,3886510765527582,3008243248869923,2521002441265700,3540570149106216,7052680998679083,826012262871599,2840473223844400,8197194571772468,7769783989219894,6059731774788151,1941571326669369,901259969434171,755982995575356,5776087124333118,4078760280830530,682566355497540,8767943215230391,6998862711345742,6473336542425683,2407297905627732,5298621327405653,3567757917467231,3428258441941600,2402708985770595,8634020806095462,823495268880999,5474754353500776,3153729375744620,8460979675435604,4243197343904370,4581496377324147,5444631889638004,7398354059121275,1818243174625922,8421255381529220,1281054009815686,1701223358048364,5671960591872650,5426145462284939,1768884985393806,6069588830335632,2270986072167060,4823940853772949,5662399924142873,698838951588506,2733878767096475,2849849152615070,7003411812004516,314953488937639,1527271747449516,3236719363838642,8652909104976563,8808106664301237,4000984668443318,2161267739155913,5607425913541305,8945083915817660,6517705159856832,7984305776603936,5301703968330438,4329945037304610,8712881620030158,6311825502466767,1419746366264025,3354869281084122,2195136313692897,6722870444864231,8594341868673148,5051149582447399,3177610395292397,2948182014025449,9095869374059249,3011146580554482,4027578075321075,4429665908549758,2875265986540278,8798385518916393,3328233319830271,5694309836018432,5093914494923521,8838194620322566,7074010647704328,7930029937365769,69380984451850,5420540593935115,3312750158140177,8485492366136082,3576794426766099,596818019521302,4010738598834969,3063164971660063,6320444637377312,6101884851417890,4368634271940059,6551442546668327,4006502321591081,4179113771438892,6388777305338673,3997315054089012,4963811966530358,3600125764999306,2725799346066253,3815097646691150,359766122993788,2349096494011219,6345083929117497,1340870102840153,639698017789356,3899046176401552,1158528409908068,193045924492134,5180261181084522,6141166737199980,897539470660469,4104546592390345,8379756141515647,1398497997943684,7637257952015237,8784754092118920,2219976442442633,6014417061876619,3943124619080591,5259799534826387,906664604513172,7561820500613468,3764174567576474,82434115343263,7872035756102564,923562537472936,4125350665786287,5840913851610032,5076155611927474,6177746647905205,6655417834730423,3784175999833016,5305547338904506,8790310417417034,3270819976516542,2410905222190020,6794764516840390,5577642627961804,1136713161930914,1896739615064909,2934551133582301,9163925663044574,7334442084570084,859697964962790,1447108006147050,4028990536504299,6070871325377362,6218244822692847,8833478251395240,7049858395239410,1182041929167859,2247330218988532,6877211069887479,6516586900607993,1998202983846907,3346367872857095,8974968307733514,920056685179917,9095159795020814,3651338085569551,2911546143183888,2656957531509783,6488897043125275,2192663958402077,369383428912162,2380324885574694,2238030028003505,2619082067874496,1878418329252912,8589594428093491,7051876659360823,6911603928679264,6344172091044932,7472356881765445,2446829866077132,1075068830638946,3519483457360975,6976533413565522,244835795506261,7920519985837148,8684041878328413,360481636799582,6892854331823201,3761401373406306,815499910804580,5114233251869797,5719697306013201,6311666784444,1965371690703851,8186494212105064,1220209027732594,2123973857598995,1505255593030772,7040953642480761,2539902398395515,1154866495689854,7116649040163969,2603316158542979,1504309389276012,6888940749386899,1912220439991450,4752614805298715,1704005480445092,71889932481702,7315994276254887,5429175460107432,2442905662903466,5354814258648237,8515939790009519,7139210160829616,1439986297583675,1752424118940852,696105114612918,4912588396246199,3203409744278713,600045732091067,1970726308595914,5207367244149952,1681750492787908,4762357905183942,1875547174073546,4790461281498315,7522485046219983,5442985996539091,1264118059260110,1819558645273814,3458410281727193,4862652606493915,8067779146634466,4842760269288678,6104705708720166,6448443905303420,2617666558350570,3683918364234991,4700078946111016,1301585569543412,2414748168420905,2955106331350267,4562173092033788,2896661463799040,3801200369923329,1075123647755532,159588506850574,5247805198079250,5343895448384788,6239672690627862,9142660315494617,8776886236001156,2022825651647770,6035310764548997,1023666371417378,7213659652699428,1939483411485990,7729189426697511,4763125576824108,2047255173846317,1452326361371951,258938446738737,3338325041239347,4437233667020084,3864617233446197,8501983390528822,4001607469724983,4334703113368044,2834253296440642,1278243461862723,2729479341905220,2247815243404614,4661098386126152,3231768481855714,175980444636497,2334565085721942,6708817470502233,2841321673393039,4038678563976547,7729360699217253,5497438354781543,7268851533018474,7489389457479020,5712333894563183,5694848920228755,6072976985691508,2091791942317429,1167275880995555,6696351937131896,2778265462633852,551432024667521,5878186172421506,269237215843716,2493527516681605,6628963120993676,7313533060117901,6412028548208018,6369971804272020,9103171510367637,2116668504346599,6412572323567000,9188167659952367,7924542797034914,319785058506147,6192345748616613,8318953987610865,5165087439410601,2574548190885292,8643546969191853,2208085171295665,158233095067059,5847067876251062,2210320050165175,7469046563313080,4589425722856889,2827373712528827,6233329772197308,4741589963961789,6637421252515262,5734778913699263,2516192003159488,1795696573822402,4976929730934211,2630096783414724,8394855626118599,5699694054143432,5483861629269449,5892506841093578,5065770710709714,7579519046260182,7087053668414935,81715057358297,7662940609926035,7568664564061654,6811182916289445,3961886763120098,2560740779922915,7533360753585745,113769038976489,4987596047791595,2792429432985071,5658999998509992,5776543382918646,3875213801338363,8124889703486973,4210251332515327,515496872941059,1117510246389258,3838625190090252,6782368651065602,4192318860973587,7574975025485336,4673187713766937,8645673041163809,4874523265898020,411158360553001,71658319968519,1058876274988588,824153461069358,4892959254427184,1278850981090865,4410482852402744,4381655709529657,2822229798196794,8041455463222368,7917924854969925,6388554262140487,8140534624974412,4235980452861517,5086381925406286,7225897875142223,4812475487573585,6067447919392345,7457999812851293,6156729269081699,3320719716365925,8362472488924778,1566351439904359,9061136202588112,357184284235376,901724240213617,6764855535744629,4042209982068342,6631623123187319,3906799373481595,2910130061416061,1288621378541183,883029899024000,6235705131161222,2825207346140807,744731285976713,2488335177992471,5906903452504644,6427431238416029,8899543422763973,2852877970773666,3006171048220325,5481486727345830,3340821601302185,2309584329186251,2382199755355823,4039288601428724,5974691907499711,4718944144488131,3239959904777924,544991229585697,8997025959453335,381245020420386,2249849073415890,9187430040787236,7375247547388879,3572428477732572,4347185799583455,3821358721701602,1647295476225766,521403461430908,9085846138920327,1820123990202094,2254771316706941,8608055273428721,6822344196511475,6869761511282420,3688834933395070,5587728811906806,2042826209375993,3993515193540223,7321334890854141,4849484844766979,8616281888249610,5680793050265355,8817737802340109,3048584777203331,1558616555624213,2660793489798935,8158290915940120,827846513227545,4404717565933338,4308586352170780,7431910899758877,796421069821728,5177477082257185,6382515385189339,6434088418907940,1642975408703793,4412107774744364,466144262662450,8394908696179677,6685147084642069,7598000613881657,3082755818256189,3103048141084981,3084393292247498,4613650054354753,3813449001940802,6679539289772959,3491504792647493,5188299072329542,6107054691604298,4021765661923147,915778171615055,7191583852885841,7118313511786323,7582410936268629,6001743098828632,4639882346854233,3327489706989403,932748445144926,2400159597557599,5494078113183586,2268195222222691,7048704933525352,3350330715969385,3481567469041516,6432931973651631,7308294159185776,5623612155705201,1936038945970040,9050796460300158,2702946374522751,5240974882920320,7051389637867393,5180148599863170,1716782947374979,8006558394529668,1522304701126533,1162224746321800,8462885237446541,5503770392639374,6351324471072656,866226226542482,4004446380390291,576593908136260,6890644001404826,5084688098850715,6657005621925788,3947331033053509,1926473727874976,2949824109442978,5755915166996387,3584396174202790,2231611231337845,6547752274393003,3914987279849391,8538346588624816,1019856573020081,8590477833213878,8802155179513784,1902359955281849,8646977177589691,8441878797055933,5168095931742143,1533263351781319,2025746269927368,1048333552613321,3434846336030667,3225190535854028,5473603428292557,7191138871728082,2284701952604116,5654511020382167,5204573321033692,4368629511395293,7276556641728478,2009272639887330,7732690407749604,8953214513633257,2174686046738410,6622478890481645,7148931401013236,4354138969487350,9181613308688375,6303507849164793,1163792182736890,8945111368677376,4087945279387651,8551443947108356,4785972059093003,6606459330902029,588943529293838,2110901449013275,4173674195662879,4155243883780130,6663098250172453,7571054177048614,9141095368323311,5701426058647593,6430803612858413,3371463899068464,6591472584005684,402443387074613,8121342468192311,3445210098243640,5035778793232443,2770760557484093,4735592143670965,1510737544788035,7302689401313348,9179287939487820,5280079084869711,6407736785303632,8190326094985298,6110475051407443,4151021140883543,5648212496627803,7187866410645600,2276499578722401,3169970142460002,2456432439531620,5873635581081706,7870579137615979,4459153422448751,7845067308213267,4539787438403575,699978214725754,555903313500284,8462942535481471,8541098037016707,8813009073109130,2314321183676555,1482006789675149,7783247438985368,3293867442722973,2053544245885086,8384706331683184,5492062401656994,2856215005730980,3459601570273448,1128454336592715,2421371229157548,232250776508589,6166747151939761,419211201280179,8969628057483444,6569201538373820,5853990852638909,6134592830609601,5194153340188867,4134058861533559,5125272015313102,8051590146562258,291437861673171,8106511055419607,5087728853448920,1785694939568345,2317722617895133,7239409286797538,3232118551943397,1989955916683494,2688320642152679,8200296494864623,5758078514305264,7942930114885873,3785731927281363,1078397948778740,753707983633301,6543736564652280,4071336951434964,907473632889215,6285234058418429,4976925570226430,2082115678640383,7483224433441026,1689070201141510,8367307632146695,1311138530333740,5102278061021453,7942489195411730,2454964122130709,6192253338958102,4379115410206425,4084690200066334,5153016546457890,3341665710332196,1829007301327143,1131172472273194,8778582088317227,3785404777568560,2127001366001973,3049646556535094,399245031717180,4976357389891903,7499615789652292,4641152248863045,2302603915292385,200447603079497,9111450430051504,8617334271826255,3092775238859091,9002350846671188,5558214964574552,1698066982213978,7547003425560923,8301970329008476,217189710305632,3408777282959760,3404105562765666,2382453660535185,1471378673626855,6444446323497324,1058811067464048,2995701602105715,4522888419735924,2672056885639543,8989844427807096,580418832447868,4431753011632511,8274451088980352,2909085733168192,7117465684662658,8899129884884715,7738630984259973,6207838834784651,4243269104130444,5111842700016013,6311380195694991,3413887595993488,6033606234306961,6335956856469906,9036124480969107,6554999655897493,6251414151436694,3406557645748635,3488929672001950,6731849383108336,6153235302357403,4619307368462756,2353743305357736,2206571644844457,7898753225652652,8435080555305390,1852430933342643,7822065513429406,6101970759383478,5250584160524727,4193549195493755,2122547652286905,4517858029099455,25515823045056,7444516912552393,6112937979197898,5908653344070092,6385376430336418,2110800251573325,1082119816378833,4451974857546196,8588162694396376,8818621394606553,8949963726690780,2298632504023519,4611773472233953,6095601360017890,5846827158256100,748466539723238,8844492792936943,8534275873372657,2783362438876927,8334719155550717,1760804450490879,2254358349740545,203150338742787,968332731455874,1155080155404816,8087141683616274,4540265003137555,6078619603982870,75269561834009,3732230593763871,4687840688282146,3770558375909923,3596601635019301,600025829429239,2405696200268329,3752646947912236,8627343242254896,5777840617142835,8417301728277598,1184828076440120,5321339443198524,3258502139763267,1062707815946821,2122164858313294,8278065269520975,3403071453837905,4220070286039634,4368264860752467,7209156623546964,2526649466190424,4845841725323866,2773602017783422,5369231590382175,5644503463115360,6596658093439586,1070447234103907,6772700797033063,7266068570217069,3449262899075696,4892057255961704,2311584930314867,8335040460192372,2340731172952695,4972903774943868,7483128530000509,1167474957384318,1757097278061183,2643290036492929,4808265535519362,7211364753771504,4642843437996679,1349336897559177,1638676094696075,6136509095336590,8680454879976080,5452944679082644,6753071551666837,6325013291203223,7576589108296345,3004322487999134,2417248920582819,2369737001974440,3380427004025513,7901339139996330,9081143025865609,8646009662290612,7036543829260981,7163693522459323,514184788294332,6462458484579005,8732892850510527,4552055457790656,1370960184015556,6286114081610441,8492992578116298,6454939814648529,8483345048115926,9132070960993401,1694118625421775,458844839779039,8271281725299425,333720853306083,6577507101825764,8659838798060262,2228927416433386,8854461432847091,7040000418716116,4227151966345978,989246317755131,5624893381647102,7709921704123135,5503405501447331,8474016507550470,1175879578581772,7335382025091858,4603427808028551,5128177780874007,4668370545206404,1259352110616367,4552653247036190,2738741104130847,7123897199131424,3620956140931548,6291921107524394,5329275373845305,2887974638254911,7889517432732481,3541206393355077,3577476186352097,6225127363623752,5463677174159586,4989760574896971,1093496800983884,1535759823027033,2732210929785690,5091948578151261,4534795008252770,3617340023233394,542986713316211,1547487885130614,101909303180151,209848282553210,7647438934014846,757248757119871,6593290864728965,5474156702088071,5945433405957271,4131560019038019,6189937230019476,8640104365259669,1051619577153343,3549674822220698,6418479520414619,7570023908629404,5166828369157022,7863621542886307,4350360410496838,2006966981704614,1690476254009841,6262295275338664,7633246247746476,4682936908331949,2877704061852590,5202251787840361,2523322873527216,116530068904882,7099760646388661,3269280739639113,9197477355707320,6919082306354107,314463564946365,5949032101493696,4300195090685554,7629397748161474,6708453208898503,2181412330470345,7060904441224139,3413957043919826,169836137800868,2586260151843803,4082249306119132,1242180386970593,7314508175373479,2784365709466611,6352852257127413,8995446421056551,6987801488809242,6932806559595517,8900788693457918,5731241720495103,4762751895985153,8305215826238467,3615216256269319,8351693233691657,3875855472385039,134094101315416,8695347109493251,3889010309751134,7964504387206166,9010157936614424,2427627073748000,2922323358344368,5937581846166564,93615118056489,1604779582946349,6873140739537968,6718669831849489,2517994342177847,457472628759609,6359384690779317,5340371733175365,3323544189017158,4659349193980999,6751078601691134,2269426590670690,5282101806062672,1663685515533222,8142162800483416,4738975717604443,364706949110876,5589241646570592,9212075652897889,8926623642573925,1589016771664999,7303073012513896,4345447581514857,3428693777489003,5567479314037868,2514168923954285,7212680378481780,6625588831298750,7863493609151611,6824196861397525,4663274627038336,4967956567465089,4420763154005867,6750050370755094,2099476552662150,2131942761397385,7047168781622413,3463086822317202,4878747211725973,7553926736669297,242504737078427,3078322918284444,3578996623416481,7283852869139619,2183872238946845,2221980230016177,2431016794913970,1559173056363700,4637182320770229,7732422240328889,3717527647173820,1123584999734462,3466435398188226,279600983958731,3472844922117321,6140316353141962,5875697166711577,1945291233647822,363736010366167,6681897608997412,1646002938191066,8690270857934056,1590655172774439,6518702661336301,1355001129540847,3241737758160661,6592346389593340,2703288168840447,3737999539813633,4172359573994755,9060989048814854,6029764222393607,8142596272331308,7250873546808587,1039946198457616,3748708681781123,1507821480336665,6770464528850202,3947404184018204,5450798789638704,5314579110720731,7439172355652902,6737083536688348,3552382996864299,8930303360204078,7425408867753267,1806401501633846,9090671220546874,4901171941678395,3688604133948733,2672114943345888,5671112507833666,6485248401947972,9220801248525640,2219005084630348,3405489463358690,744634798259534,8491656325299535,8902705749704017,6961873026555221,8013443300253015,2147684164238685,2909382454312290,6887616078167395,6953624603008356,7487661739949414,7444621854571879,7346471359511914,3813384556789099,2104100220198255,8763599707110769,749386830364020,7448694324477301,860168790334838,7900926406745465,8666546525691259,5383315078503807,5114897145486290,1941716447280514,1814601744006532,1610810487430535,4383594395754722,4375267217120654,7504282189528984,3073611520703893,6089562341940631,3541075559710107,1455195525717914,7245406122163615,5469125733785001,7215195818548650,490455055867309,9084319784082865,1693404118089139,490873904381364,3499631497485751,3588900962917817,4748887231176607,6324512100507069,8196104384355779,853143365402052,2297649563803080,8917512089288137,8160475163860429,5446878053359060,5751206997958102,520734863834584,8926044339599951,3648147649748444,8650920277106141,1617310863392223,125744811990500,4391043217210854,6743824752393703,2650827048402408,8483056470695402,5106287084174827,6762410574527058,4268999570374126,5291521785658864,907164545261048,5094660883881466,5765941987564809,2353070299176446,7019553054359039,5720189717574912,4270140023045634,8382824892530180,5312893090250246,3249838158822919,7027704085397005,1860691217350163,2765654998015509,8566770663987825,1873521515626008,6303037379395099,3915227340545568,6159879931674148,2420839376051752,8592346743791145,3400096627531307,3891894894845484,4728121055870511,850768750132788,5939590187220534,4053859708296759,7628415637986875,2341613456457280,6958023695161952,3158243324919369,3505297975598674,6518721346387541,4912067020611158,1476948476714583,7047046968614489,7256076768886370,8815197210189411,5401809081876069,6767935154650727,1485798728490600,5894650889920105,62439802756719,3442855537835633,5223252432240242,7722562688491126,9197991848369789,3077881463193215,5195335310827139,7834789624651398,1331626867285643,5090013745921678,6236029431651990,8249193751764637,1841201267408545,2265736440363633,7176853371266332,855705248480938,3825259996225203,665916319055540,9009579239931575,8675489519271611,7218729958915773,8810517600394942,2090483256344256,8707581098254018,620910554463939,6683749481971396,8297875275005637,1950739748773582,4410317768040144,1898997700583122,4064974055317203,6061973417426646,3902337417966884,6068951745511130,3045054100217566,1259462719176415,2736828467666896,8967424961257186,222474724245223,8633184675430121,6863321694699243,8162967282286320,1697827313147635,7387381171093236,1564122642824949,5846522131996406,8942411103283839,1352530209244798,2230368760192775,7360883683876618,2888415578734347,7360859956204845,343254520930064,8494416623058706,1110566121171955,984512310296350,2843535294414625,4449188984291106,8876097261133604,7132850091055751,2274641195556654,7905722570719023,2432367999391027,2266490915889307,4530556754313015,3354315154005820,2129344995087604,4057748122386246,5672041504022345,1071918759780172,7972507796995920,8574574751342421,1414985655197528,936515990077277,1999042173476704,8905437039501154,7519283641163619,5909158477774693,7725305518063462,6159353893994343,3557100023439209,6385892366565227,6775759248473964,4930980613720722,7855661948231534,3505952469311349,4085863245823862,5855779389325177,4096593796579194,5034181721964418,2928710737420165,8580532957085579,7275290820747148,1320881177154882,2534908139180014,1305016745017240,1615194279845785,6486549689221018,6320593105067935,8709749321981856,3776251604172706,9005359900762024,2111899315174364,2045425558069168,994992680953160,2534182139535284,425510663642835,6348737504561062,7551237709750203,7617382321872828,8831387034910654,6005646154121152,1673088506503110,4499317857828807,6863093397594056,8594731976875979,7277748687050061,2567436323979216,664830076390733,7591332152507828,145848984280396,2031338346758106,1357788858236891,7325982829043680,3691991712399330,9029662177468387,4148479070134244,2609408992403429,8369622431023079,2910679908687850,7072578170363883,5506369430503404,8381865811976174,2378351808970735,5285618517295088,4691539930824693,8397691923565225,3490271597518843,5465698828115965],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c4bcae8b1308ed48980134bb4d83f804",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000239915.2/GCA_000239915.2_ASM23991v2_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CAGF01000083.1 Leuconostoc citreum LBAE C11 WGS project CAGF00000000 data, contig LeucoC11_1_contig00083, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c4bcae8b1308ed48980134bb4d83f804\",\"mins\":[7722765318199297,3512555851337730,4177488253564931,167670976299012,3636572840565923,4843386681920172,2235871112937485,4132038823647246,858082330097680,1031967775127574,1826288210696218,1161251424937599,3722735217713180,7463637579259933,9164068290070558,7138731403309088,4343843143501859,7393681856243753,165425728409643,5625216192788525,3128288599275571,9150889577416030,3750663275831350,8420243863109687,4048867483646010,2738581527152699,7157485333483584,5699820146739265,6836168128766646,292243683672134,3376724166770759,3184583608168523,6236808791873612,6703731131684941,6774211428663374,2676214666995725,3818945630552145,4660551287982162,7501527911944276,1781546201090134,4545235950440535,890744608802906,4070367810818139,1701328469112924,1690363967354976,4992635115907170,8196917013079739,9005838729824359,5346602992943210,2155934176487531,219488430362733,8215661963907344,2253651096645745,1455591557767282,1462849256634485,8283184881745634,2134222617755771,1604727476273278,1897956928764035,3080475201865872,2638552315818130,7411535037653140,9097728564815214,4240581652910231,8863402496073880,726643027183769,4594198642878339,3145848518033434,1098993188102302,8120823501727903,7344762533947552,1919279507042465,7911382213590043,2487710144963682,2985340603465894,8327533356214439,7316306538711208,7048614083808284,4546687354859690,7653803125989547,2368313232814252,5502669198921901,3111065311746224,117122558630066,4537794200070324,66758696112312,6945538413736122,3184698589098171,4750302542923466,8568149919154368,3009807174838466,3421700281209027,7960927285731524,6138548098764997,4633657319612614,2573347633549511,6668832208468170,7474904390821560,4897314219081933,7586751042733875,1739838075924688,7668008019231096,5847600989800483,267712936368340,1926789078786264,8315350799315161,8397623636656347,4218636663886045,1961933517906142,8574323369601247,866315805358311,1125813802232040,8978906602971369,4556528997859563,1059014971031788,2383547622240494,2860846988644593,3178952253919477,115353345104119,533477274243322,8417148869257599,1564371859962108,8470849662912825,618297104912638,7124334713475329,3084014157269252,8787475834347905,156553364734218,4024214589644162,7111420355012880,5377881992257816,1112548190310681,8291998639743259,8128011733164319,4434281875028256,13606848524578,40838795986651,2586540119761189,8095912853342386,3472976894815929,518088814596394,5247231999117611,3961775200502060,4599456735133998,7194666866929967,3732684910033200,146461590059313,5090140712862002,7164272968508467,689185907697977,1711344789279034,5666212470663483,7561885637261628,5285123248687422,8725201854411076,2815300036880711,3758730559953225,365560778252621,641347962552656,5486571293391187,6596522949331286,5401427885941081,5760699481899355,5978330587484218,3637402448503135,110365159692641,6923428774291811,939073471651558,6570374588053864,3184705783564650,5098143634393453,1264903059392878,7832437558503791,4799169173440881,5671294067210610,1452187558525299,3077493618481526,1524377967513976,1516840031281531,7386165370098047,7845229513109555,6931383013032322,8616658865699563,1412160277369220,5596755134216581,3513798121834886,8793125150243212,3700229452864578,2262636533240207,4190301841246608,6303651704076691,5169296851931540,1432251066630550,8729426660546971,7449907213376922,6627937342232993,810139299285411,4463149381046692,4190544589187142,6480701392425385,4652611147491760,1782619998261682,262667424768437,20384622731703,7995956219626356,5691788239053242,1826764990437820,4305850220677565,4287216456577781,5527032391956929,2999144083073475,193064682260934,5385282736794017,5964266154252746,1296449013668302,6890884850688465,2826427749382690,8239243181908436,6165955393645014,3757820467554776,1857741848130011,5301196311517665,1133342654208482,2068893340154340,7741936870625766,6998822573967847,6658272776546792,7181826986099823,4868358450872810,3712421639098859,747521766570476,1925328580069869,7604242682600531,1904579527969269,9041517642523126,1020131252636152,2426116572721657,7274472889025654,4480800805753342,616390304492031,4716005714995713,4889099262638764,1521279663688196,2186095794818200,1217015858291208,2007503799583241,2361624884275884,2964250708726283,5599889740704268,205959420832272,8133189275623956,2893119713878552,2155321694870041,3865529138108957,5294414124636702,5208511681208069,6656657542349345,4803260508523042,3876501941897990,1112941896004135,4843650376419880,6382059609509980,724432261325355,2167318701433389,3763151679922736,4995856914029107,8887437884731956,822881290641974,7880725551041080,6036830369018975,8231429034059341,6608144862432352,1943456386566723,4710107444421188,4243963616035398,4667717821461063,1203240078307912,2672486428607049,909665900539319,5895171730874957,2741587077024334,7707797791576656,2185619683144273,1941397994162770,4151850202161748,7178337747307093,973586126946905,8099625293371997,6066295049282145,3430789513833059,2543610387487341,712753842700913,6760319351401076,2520814114433657,7544733281006205,5545373677642367,1085546935074786,1990493295639175,8649564136241800,2538514010371041,3503801274648685,1611559375010243,3610662955874964,4441262006413973,2606668687166102,503915537701528,3474117352651418,5772668618032239,7295395963830601,3855539256173215,7761742154635936,9147123715486371,8769306111527588,156476840049318,6364361314759339,3226110602386092,7782046802151197,3386189903195592,6103800936350387,286962249364150,5674061791351484,1080509918723318,256251041389250,4988401642214043,4071195661126774,8670032798999583,9183082595601098,4694520935897805,7926235024669392,7097835733568210,7654239182584531,1020712924164558,7035529864950486,2858028962246436,368523251434202,7070843854365404,6094107822512861,6738106828608223,6020006543925984,2431149330428641,240430036340859,8993781027440081,7468519074688124,1538481975552747,6074087021107948,3439289533868782,6120581625740017,3482710549619155,2261238023287540,4882472749657698,4052996469019385,3990394940361467,6725572671718186,5927729652398854,7174921489900295,6610709760398089,5042165472959243,1404231004584716,6259037451887373,3827292614585102,5229070276682863,8432821866570514,6261642217239315,5944805072593684,6409277737171737,3008376599530267,8411275470275360,7102310095315748,9158027959771120,8414782758578983,5131092867423018,1910903881321262,6087201436775215,6195977958222643,8044997894734645,1267714123311927,6699288213657055,5898721580434238,1086909176175427,955932704772933,3711258287862598,4302234788485959,5727835697902410,7971800192377755,5325200215071570,8974734921390933,6130291414913878,2318916651754327,296897035184612,3114930490483700,7167050824166237,5807851954844511,7827426424017382,4373968613018470,6843570537968489,3240542733222762,1475000197784428,3116842635699053,6685201069644655,484642317568881,8502140565141253,1438402019136371,5789850727152500,12741097618921,3854635846804345,1116362347246458,4144491928669052,4492091501224831,6832120198507392,2510905059687298,3528714882258411,3322914791558020,7573234870164357,7658295014152001,9102900307855748,7443704728365548,8115426074373002,8118880613154285,8334158429969296,5108024469945233,1208820041124755,2847754186889369,9068462933400472,5744976924194628,498355972740591,3412288893287325,1187644835400517,3542820510086051,2339107643040687,8676700159978406,4585922010280871,6540637797847976,6330956923027129,1663845558512555,3817014974733231,1321186438726577,7905386084242354,8572313009478579,6286456237841334,2803494797784905,7099166705684064,8721202296140730,8284824899605435,4611587940187068,3706175678190410,3332079375559615,4296042790443968,4464016943260610,4294203762293703,4196349798867915,7877587393032738,937794724070352,7382996729498578,6472386002928803,3189406021333974,7574187830717945,1086446500735961,6801163494108122,6987924636947419,2541380181343198,4644876647570401,5595573041892322,4853676562757115,3038787057486821,5192019232596966,7933326487434215,5520767233281532,8964973517208558,5533626057024500,519489231889397,4764661074203639,5054693626915833,1516218210591741,9088912078839979,380291009504261,6199413500437511,6076024244210697,7045051873094666,3494591150853132,802620676985005,8940416909849623,2748817664680984,393456513849860,3296145695910939,6284317715428380,8364301442317343,3110871187178530,7653026600518691,3020620455228452,3481462173049897,447167171779627,2640713528732717,1763855047482414,2645339383522355,7617653418243124,4015101468722234,536962599031867,8077176742304643,5821394491984957,2314050606644290,4914698150511684,2718706880410693,738251279430,7901454572125261,9177667070291128,216674184521571,3920356724255428,8214038609513557,5921395888288855,7290449502397528,4928164493169754,1674843416478815,4184801067895904,2598999767139426,6281182741375163,8578065900164196,968307081415526,4617193334416487,4437530790546620,1852395007974511,4522160908158064,1126095147170934,5661059694161020,8652824274036245,2232165979655296,1789722645628038,4880628387914888,3264512719271053,2626645803961487,1006037626311824,2460393352541332,8564863642443329,1247551377364119,2029965720319128,6602455076785305,6770182588562287,1375434355768477,4065996552694942,3151239566216355,7539108718408868,1989104772854949,1454559149487272,4101256485438633,7150497690848426,4697928629484719,7801333315472560,8863378463466355,9008531321178654,8263200399236280,3754308267084660,4701013189336251,137102901478588,7665649542174581,4515901751719110,694531570181324,1529451985505484,4899838404598306,6348016775707856,2908533723100369,4421741340456148,5154348894975191,2954788974607577,9029605153899738,7392969313846493,8426263347710160,3554749139487974,8814329208800465,5202887211179241,8912890185905389,8618774484798704,2733945151184116,3125613639105782,379156801561847,3509955374486776,3047293932263636,2738166509253886,4530228848798975,9081966505712896,7177299141893377,8355067592472483,5347039444964613,4230346703224071,6556076879955211,3212254895879437,5451962799376600,1927338406797187,8249817330146581,6586821491301655,6857236688145688,3846933917207834,5381867363519775,5556994414894368,5185020798516513,267468234753314,2653242810676515,8349828866477617,3230585468925224,89002644393258,6424653989649707,2916202565205295,8190010016095536,2302558963281201,8177889336388917,147684150168887,6677736808441146,8175831118445884,3361485643900221,3431101527899456,4132841668777282,8459134531228995,1798850820136262,1343646896860487,5356646218683722,1910369040866640,3344893018357073,3507095220596050,1251204535582035,2328591984297300,5165698087787865,4966887155273051,2089127060649308,8753336126594398,3830891876556129,8338539180551522,6268410483889507,7270560483683688,8469689192035693,1429826578378094,7113967251653999,6046008457846129,3942454271849842,7327488274083188,2224449305716087,8569861951607492,4193102429457786,980789999637883,1247889475739005,8458694147655232,5012873189485954,7919763098465668,6202569073636741,7541408971100737,836144296213897,4190247405849996,3977015040564624,1291555945285009,1609695835532691,686504942876052,533009144317334,3172462139411353,2794604500231578,6939029340102044,3091800253480351,2113149245248929,3825643058331042,1555408997350819,827191195442597,6915675288034727,1661422652644777,1978170529727915,4516140226503240,4003291221444020,8649633518591017,3687024459584951,6197550575422908,8855189810137782,5989496075427263,3472154953596352,7807486011319748,1364998758866166,3309285009845704,1730973024855497,1803396974413496,4435493727862221,2180596556281295,4187344470762961,5812486769894867,1816969189301718,8049561027878479,7937258128295390,4325464471569887,923514763507168,5434210927826402,1916789219597797,6486056144707047,3762123004319208,6622829360675068,8570802715016682,408172824595947,6426753522771436,3543902560585197,2485459276219886,3004257242045935,1919743287574000,6665906584466931,5945652156506427,4366431462526459,3066952826467836,3260920299066878,4078596444564991,979819407816193,1023580071155627,1835518239757830,8735442255466560,7485639560343468,71037165248015,2514973590955537,6511326900809234,5907366257397267,2707833290706453,3501462534567446,8778986106334743,6463506322284059,946043191225885,68515676986911,2613818611164716,2020612145483309,3955008641007150,7392054288909871,3040551740360241,7122706716325671,2734540433088052,7213286267596345,1891660973588026,1820889096570432,3971771474783809,2047300859631176,1972743754493879,804620106585677,107410056377934,2399494998310479,8985050443432109,858785366360675,3974776913526356,1537891187299925,3497778359805526,1607882304722520,991529712936537,7186448351221338,2399365953871453,6295821351065184,6250986953916001,51111473262178,7710609278342755,128745851752036,7573775690800742,7203400952024678,215742516293230,8834270844751474,1037423906852467,3302784906153588,3584555830496047,3114201861533305,1783872931313277,693937625966207,1882503365758595,2404009725732801,507273622816393,6182143833789378,503789090608783,4567637157461648,2590076493305489,6795702172602002,2964986179919508,7584274103386147,889244948735640,8633976527955161,2965492154752670,5362627785776799,8921189147114383,471797522992807,643557829848745,4924207386191532,3900926292758194,4837260645662323,9044996058599092,6110247658116790,1999460955735736,5828188760604345,8101499388644639,437061254889151,8928893287889808,7231223630332875,9057370587770566,6673587449505482,1491226292962594,8983813169362552,383337684575954,5664664910511830,8224373940328152,8218590430107353,1167930511044314,5451767287547611,3573032920682204,2069567208963807,7025095691394784,7780712670568161,1841338544172770,7015616352329443,4779593310402276,4265396615921382,8992793008023273,4973130266918636,5574305215473389,2625654752142948,551229647515378,8378346148779764,2488150150815481,2578376910042874,2108547955279611,8476621348210431,882964588547842,3107413738206980,17848168208133,5563022000187484,8273416251152140,4999014296397582,933668651779856,8818647646178947,3639491360016148,2904219435755287,6428472616570650,1128896014143259,3134672610445085,8071253957996848,4513901396897572,6953058905206565,6315221566922033,99291802013480,5077134107256098,2815726020785964,2683337390105788,7792337754244917,592713523191609,373813938579258,3880237150281533,399186577563616,2905472713774914,6277535800244036,8018053870540614,6110518975097825,4034109115236169,3747828237904162,1640374681984844,5899936661444429,8968979521109840,7381221424811425,4338953487123449,758545285429078,3514880614422359,3103110897456984,4797563316993565,5444818331187037,5318117404548958,4448593408218050,9081754573110928,1553104083169122,2844504708368699,6576822560223079,5377262645137258,2010500961531755,6564333498879853,4567344935190382,3204734043541359,1686451168178033,6888020173756274,1942153441075061,1114275576842102,8290975716099959,8895069871472507,7931522015684476,8235701352893077,8488982132885377,3091176440023903,1201341214871427,5525905545744263,7484914757818248,3710525087301513,7174266503931789,6844357132629903,5945905139220370,7829281549342618,3800778228791197,1556047339231137,6171476175096475,7123882564978596,6933080597508005,5983631180048299,1793522675955628,9187672369835950,489586488514481,1209118840829875,3549367068188599,6271249533696481,1417217492401140,6644985477824443,4663298318659517,3688792804112318,1149655318751168,1334735619450817,4810002222085961,8140000707878853,9139131748198346,7461023793508299,1365980431007694,931128034955215,4750765773799376,5031728304582610,4687174748117700,25290028828924,4501625378279383,5096295710946961,8925896216593078,164180979728351,3708161540734944,744952115367906,2433378083223526,5845500664182759,8471872623335402,8391388417017837,108514578236413,7434378277981146,8196613159137265,2641353729935346,8850530820306934,7608377359990779,1306225493551103],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c6487fc895704808bfbd28461eb5406d",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001416255.1/GCA_001416255.1_ASM141625v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LLII01000001.1 Acinetobacter baumannii strain ABBL140 contig-0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c6487fc895704808bfbd28461eb5406d\",\"mins\":[8813955913481558,5541473772335112,6671080412463116,8913780720197645,6405795182731279,1292920291631120,3429340745846802,7302311977078803,7855618737053717,8813679705755670,1978823320137049,2883942835212313,5404646105235482,5378157474930715,3231823626928156,6475953998368800,6120833708240929,1839789219841371,3998387213766693,26064418275366,4665219290210345,6650868520058924,488896446894125,7575209607286830,1126991978668084,4505119613337655,2877713952161856,4520722258092098,5585335552041027,8786133234962503,2120677284352073,5588110179627703,2515641832296524,2098521231355981,976347927957583,8594649969561680,9142212978278484,3370776724414552,2240459064025179,9067922959093852,382210689966174,1537579130418533,7877344989904993,6036236624431803,8013089547989092,6702580783027558,2906993989637479,5852189984518255,2825735627648360,2576072623026293,8859582360207479,6047159181181053,7353050310140031,5554011787586399,5221576612712579,4920696199360646,2342644280971399,845725990613129,6288050174242955,8961433857912973,5597694849294478,2281351507169423,2845512615956626,1809907183042707,3731847970943124,2344662116626583,6982848341893272,6901734199312410,3127837087453342,3138201915506847,5021126274867360,7062399327297698,4790426499526819,8919716138544241,6302471932727466,5932936724877488,3641994166766963,658824871170231,4851350662987960,1113114759831737,3425168362164410,1993041543135420,8874967627588981,1558939958403265,371806036046018,2975323822264515,7488073850085572,1916785053503685,8329735357153313,4123806102409416,1535509646319817,1350249630761162,7323469603926222,7109702898232013,4649903700959440,628696623030489,7034736136262351,6303923933155549,5199568935043294,1406622514958559,7533843091308768,1441070678533500,5987458956992748,8739804342202605,3925228834582766,3563153345343727,3623751600488688,2651245557584595,8943991890551028,1299397972693238,1352028126875895,3574649936707835,4182716575240446,4032051372245717,615505945907458,7945899188711683,8886449351819524,1801238959702742,4997560942485768,2258075009037015,7341939211919628,2369021456363789,6839659630899245,6502303808868625,6913616743235862,2494493976764696,2570967554011417,4475801955504413,9040018063515359,5425041953362209,4255969162006818,6074976559685923,8503114188249722,3123219452809510,8209261265255537,8807542998229289,7069742635876650,3693981752348974,4421845518537007,3337647139594544,4535912688054581,8877602986853769,125831864336696,8156161492664372,3906189182034236,7807650858164541,6641870805435104,6985468938121540,3144927008960838,2981409211339079,8401851795083592,7555607540196662,3527846512992587,5462146422030670,7327497414390100,8659076235609,8878539811567101,5881410430103900,710504530366814,1071935354167647,112324569416032,4425893343180313,1182729880727909,7501730503873938,3743471910273390,1123266837635440,5246993532137841,8297708649656690,3696515745235315,6120254816993653,7475741446238584,4020399402166335,7668960493584765,7647183139290517,4683995472998784,4151527171508288,8335122950099332,7552306166547212,3702512257024392,6750314612674955,3850130208952718,7905999207846843,1110395909848472,5802550589354386,387639124586899,2069465716273557,6503861991428503,2536327894692248,5600621952364958,1919601790189985,2443253592199587,8119819222340004,5568416924103080,6233733618201005,1092654338863534,8726336766153135,3189081727898032,2572824047604146,2463240177832371,8737938926251422,3557207336063415,2094133736616377,1032245252309434,8160422900040124,1710275183493565,3749234727813566,4842052239206029,2885481322443201,1336056581239234,1343119917539782,6741485414749601,6265546537545804,2062980109640141,7092559117500881,1156252240769491,742591651443157,7395112247787994,6808214708932687,8944314896183773,1171966310199778,6087504131033851,3189369248268772,8788366528232870,1633612760801768,374693988094442,473524408410603,780979472531950,2519079664185839,6484527543202291,8282840636035573,1479367181869559,8420366429095780,1829691521159674,4798889966645755,8221677274862467,7026954303828479,7385868417653504,3569912952746498,4489602371173757,1870664517927428,277217363358216,4112695516160521,7099183693730317,8526889157440015,8829884413946671,7441596396412596,8570616685269524,5850549576569366,357535429972507,442977858757381,882823200293409,8367981864595547,6699553971323428,59018722005543,4647250656207401,1622505383215658,5686357593420332,2968977689519538,5378557211443766,4499121276924478,5374001331175999,1480026293633601,5999680069333771,8632119812339809,3888484608746057,2300033039213132,5793167116411470,8156696966582863,1665243572249170,4389468770095699,7410864662233687,177836967408216,8447949312504411,5196427007738462,9006668099224254,6168243113534048,315059431371361,5802189598200420,3118454374847079,2586992467063400,7221742984729193,2214895889498738,8304388901724788,5442950546063991,2437974046642809,4981471405994618,2659030552609404,2932343301561109,7788097624625283,5404592418132625,1809981221683859,4336028735865492,1899977179144854,1345818886087320,1379228915471001,4629307963298460,7275132784982810,971586476057246,7304416264073887,6217622150632096,7607264608297755,481516224414378,7444957754252743,4563602436899502,8173340442358447,3861475659702960,1180468225098418,4240443692745395,1547274787857865,6509437536998074,2409857410807242,4732074636702398,2428948643840703,10192046142145,4432113978241730,8312691852571331,5138555310301896,1949454307963593,8476553529942730,2337852421522127,6663295869084368,2679069301714239,948576151909074,2095083120603859,6365808033465045,5576996854674134,319279825543895,1238994794136281,3739197973361372,7506903127230586,5608191301128926,5039473648005855,3575260968354528,2165524957260591,1628466313626338,3558886836734758,914904817892817,8349656920810217,4160070369587947,2678580576658156,5961530751992559,7136382147896050,6177622505554676,2895845106639609,7252112901387002,6968268142740219,8397427475841789,350362895622910,3400361368088021,8352052201517827,62519730946821,9123783908726913,5399339151250187,5025195542364940,1037747317654285,6608888707253037,7521032876507923,6169937826808596,2297585802634005,4905116582519579,3681479835374368,4014416337812955,2384653117243526,2672197787517734,8791538477888298,8316545590375211,7511078060398101,3962760115065645,1041579883021102,5984119933432623,1960626958021424,1377851646845745,57729931858738,9106112905261875,3446746715738932,7022246462743349,1398617425613622,488128636244792,8494304400937785,406438340203322,1580869239169851,1295274058876510,4594092151844320,8708758993249092,1475711888229189,991794925002209,4576688536339274,3092112651645774,1005377073038159,7670988641785315,1502672049283926,2876188033987417,7474016249090906,5915017963896975,7991354860294970,7035769763207122,7279771054289762,5761241966363491,229897556398949,8588689511182335,214601581069161,1255280681206635,951531287745391,705275396473713,5096656047485075,8957988778808364,505062753219451,1893511799767934,9167132709163905,762902229148547,5040763814056838,2214909626602375,3468432959857545,7183582379443082,5594135368221579,4638511612072845,1830261482488718,1108259250757101,792307096982417,1760826070942611,6475674167735189,7425093272317049,4722815833977754,1590262880781836,6966790484059040,501872009085858,1913831387018148,5421297181381541,4831467683726247,7753219224714055,8152591577015212,6858882806211501,8175751953056686,5314676570227634,1509085043336116,5649803683557534,6210116008633272,486768900887481,4241847236215738,1961864329466015,663459984114506,6113508923782078,6859975667213247,8357169467999170,3057401079464900,9047382970920438,5119663278109640,2065777791951818,1990905254508023,6219879427732433,7863680146395299,5071434328220634,5771542761874395,8206322718078458,6482889267917790,462277071647711,4425659810841569,2123821028052782,165360454362084,2019237027394533,219101627151334,6821188556788711,4803287363797993,4116864957895658,5036259833189357,8041960489296879,4434063454165285,8043112174887923,7305251641436933,304360781808630,6412651079308287,4137299424011265,278071342236674,7480103772103683,2068143625417732,8133282013954902,174088587695112,7354363808773129,5967937695106058,9206940665713011,3075204856251406,3899818435953684,1058736324916245,5582548011189274,9090839575290714,3092897479410773,5791225122913218,986793099708592,2038079634138146,7466814378947620,8637453513798694,2020520575648807,2242308151759913,6909055695090731,2479037383291948,2966386276516910,5183402545427504,5725250149532722,786754493277235,8001119577895991,3095430246384696,6355168943572027,1795611226764349,4516582152700991,7997490791535682,8596383183841462,3116389427434566,3595256717915208,6124713796765196,8799233896350795,5463376781501519,2914037979288656,6062239839703224,1245652680152146,4934863053706323,5666620369667156,5835762270061653,2954734925284440,8183327603083384,3226568614336014,6542540030231645,4647533517632607,4590205453288546,8541537437480181,1097845528290405,7473148660094055,5601627950797928,546135710995563,5382000232748141,5796144834532465,6170741784687734,7649975759864681,8747113265611896,5377966799357050,3453200194184315,158493163902076,1665273360450686,6745767137899647,4727516850721922,4034134175392902,2838528189075649,6955211574224651,3822012744041609,3257767583665887,5203039712986254,5040566925776015,582545934550160,3256627964454035,5929400162051221,2642240609195159,8425940522054511,4043396775490716,5411586182870173,740991795828278,9118086323043867,194660658795686,5702027847603057,8473634067555497,6021884201825450,2075630291698880,977922034844849,4156118037189811,4612171128751284,3195378948507166,5490322363188407,2686712561226936,3814148394649297,8665592220394683,7480267081852092,7342251183350973,3658239794771136,5181474223457473,1072927941018818,2526197652280519,2289355550926025,5402816453477579,137256719664333,7951683636278674,8470347319570784,3716866725639379,4164177354675413,8032826457766095,4722687727842526,3029658946028767,6332925398512865,2248984702231780,2632026927310053,3582971232380134,4760888719492290,6000195898606826,7895462134098130,7730830417268569,8609626235028719,9163591328376048,233733227537651,844676157252852,5121426803475701,817491968201975,4025727604774138,2206026567108256,2651808151602429,7074092949046526,4389497383806207,5846785023993088,592576992965889,1903148408714500,8619371832587526,1832734739465479,325136628696329,7251869744207114,6192353353385227,5345662948091148,9003320892476916,7087439968630031,3761957586588947,3745994441434388,1203606931440917,877564167333142,6553315127420185,4227550588344538,1399867308639518,2197884296680739,7397168491042085,5813647328339238,3205481757144359,38370210731306,2963304906106156,1068793632216365,3855684271437103,1256326370305332,5570832541599030,8478876848831369,1483458098824504,1303139741074745,6259299034424634,3688918051493183,5089540320086246,2749988640937285,2864936228951366,4310605822879048,3130086264829257,4267924789843137,6168377757976119,4759783637439822,8253364142323256,19188431938898,1636135679208652,4831859947529557,7161974943301177,5586289053006735,3888522879112541,8537393856468321,8433916706804989,3851530953487717,6481224969053542,6208620883432807,8050697754099093,8386096106448444,4538394071422316,8909581499483505,3158375321384308,5995636510004597,5047660958124265,5698808449500537,1662897005915711,2689320547898748,7918468451931517,5138320933172609,7028676456449410,7636125987427718,8643680819365441,4009132912592265,2355044481414538,468369521284492,2486754253749826,6796415852553618,3075213377463704,8260152714368413,1277697083540894,2459357963691423,2581510346876321,625475672243782,998057318860199,4543208832428956,3039110292063815,6243066197729439,3517484546725295,2528601577616817,1032580683208114,1676316924167603,8185656159987130,6449791738271163,4084408779056572,6891001926698429,2815168044787134,3313926630737345,467874521396677,8348104891188679,3747281338455497,5393352544331210,3947985583741175,1591413830235596,2776196595818061,4493914617628120,5781044120716761,1730408465905117,2019657513240030,7206176971523552,6603023532512739,1116445566293476,7654786379650877,4358133020857830,6999623498548713,3785639887267307,3024918768805359,6398652143756784,8191064643020273,6870250500785650,5145402147734373,301903268918778,8124889703486973,5132463665960446,7338909849892351,8857864702356401,3040462407579139,9122391191533060,6472691611309573,8891302681392650,1554254080767499,5812206717662732,4945118935143950,3948808495683090,6116838884632085,5247135062619670,2796065161795097,5578679005656604,738741847975454,5173849600063008,397332086797858,1270175239865891,294990201665061,1117939240871463,8214865030116905,7135955507509132,3401796986201645,1451263424951901,1207986740733534,5687258363274806,6264658933082377,7908243317667384,8630767690499385,6887300579735135,2702003770725948,764791812961854,2879415806518197,4975719520278080,193960566924865,8188598855932070,8797403887094710,3550628941817415,4700329797891656,4685366071752265,3176977481573962,3464003774875212,5936243269649997,7722646054458296,5107410725414482,3875713497204309,3274260720692153,2991303500908121,5445232313357917,6236514402166366,5562802044073567,7406069123939963,1600294290146918,7531141131703916,4216242473313902,3410159249688177,565629026006647,6147351616951929,6074245905929851,6561626909093483,6085191965333125,5587142841382534,8448864850073223,6450090757625485,7491928729679506,5964449303789849,7575499977991834,612777807088318,2731455160501920,5117841799345826,7477624262465187,6937911815842758,3149434142029480,8266277895775913,7639741697107665,6507753939945141,1202433074452151,5555134979012280,1295443134428860,6604325275535037,4513417178896062,5873679033738944,3081128215488199,8223017211624609,8710347175441861,8718224935810679,6807638953257250,7729377190101941,6224463142471375,1689439999288249,4661441603348180,8001162687256278,138905479657176,7216534883685480,6945444216545091,1491284225287899,8342314374002398,2979426311993055,4968742245000928,7575676785909752,2310991938774754,3440348666488547,3309951338357030,5139812837934822,7823093554709457,7633032752482025,5695183613429483,1177946929444589,98012912633582,2886311110055665,675962781869814,7884789576480504,8105348680902395,4360136718735100,1875326617290494,2141249278732047,996190480881410,4027653259843331,2532592666859269,1321666723780359,7101038559860488,5680793050265355,4584422998384791,2088555747550991,6461215721994005,6420296259540761,5715523729770799,4542566070019871,2882354552272672,2902337458829617,6915920132245288,943132709836588,2507876340655918,8514141598675933,837563157841715,4083936699418421,7300218244925241,397034320443194,8140507117582139,7050045401384764,6445265780504381,2404388378548030,5335054735130933,164465416124224,2167945677813571,6514026787915955,2231548909872966,8295209431366626,4160060367443597,6958666025686864,9007554857619768,3404431744866134,7846687027308375,3860969040901976,4976516243220316,42789987419998,1137284554251237,8471622728492898,527992249362275,5291568000522084,5322238349576038,3477130892986217,7360201095636846,2259070784350065,2119807736223602,1155366848501620,3366476030965622,3352786174206953,1147143811671928,7602046333187961,5384090112792445,4255049300457342,5405683809339266,1616427014330255,2527091574924951,4808095820232588,1405541855757293,9120331989089944,4649363102459794,4288155933910933,5727618948736918,6934277968034336,9041710011474244,2499521524066202,2735099833157531,894114807199644,411903578640026,8646215664393189,6422672764766111,8390172823229424,2268976925271970,7738404772906919,3542686738869916,1230210593793962,3034852795152300,8197311531580005,5103329747408816,2676094026486810,8103941088999402,5754824483129268,7187163980327241,7822644131952569,2235807341014087,1309892588902332,7962067026925815,6292873885321153,7189059021654347,1841892429346759,4524399109199817,8946320426187767,6437379667392162,9109041479490988,6652971685787602,6391702925907923,4150193961359319,2598636506318811,4384617695160284,8879979808364513,5869221133105124,5260230813939690,4592832641988589,2623755655870448,802894694762481,6571418702759922,6809949666379767,3397087678711809,409279686853633,3230008619431946,3104506928093196,5350134234113026,5130888723935731,4731787703228432,3013142690355544,7194833327672323,2904128148260887,3709732196231196,8808267395762522,7739527297608709,3980508881242145,7941466098608165,6166121159559210,1175334971922479,2441116443200804,7324711779579960,3741720047134777,3629803956021307,8229572450928702,3843445037566015,4326299762395200,6334551925209153,3695741112477765,273237596424263,6929624073636876,5667876737443914,809106099226699,4569952001919053,8057318689732280,1421212559751253,5018817472444503,2268164652128346,4906751259093083,7338629012679140,1053581526923357,8095660863859728,3629986348091490,4988604562466917,2410350063302758,2425194666211004,9038972720942898,294452513122414,7608680620983997,4410291974330481,3291983806605427,7396719563200628,5631036446521461,9186625936711590,5907035971500152,1015099407915129,262813037480058,7468371116244671,3004532571097214,5470244022970496,8319735679342272,1531346779392131,126866699110533,6498007100725382,5490499600066695,1236165158832265,7819813442280462,5684410491615375,6343872921004176,8203954998188180,4022064116563652,2474052686747802,1889099847035036,848782386464925,2863996704237731,2401685838489766,43720848507249,4468884120651945,4659964610267309,2019107382806704,8657078720239793,2809715951450291,7106754448664757,6240207655065782,3993807421294776,1866083386765251,7322843665680579,3812020855638219,836544408224802,5778779460098255,4542227916040402,8747937698412755,3079028063492309,2570735830370518,2450027035732186,5092347071871197,4587424471587044,4467129976744165,464866107558118,3281893823580391,1412824217708777,9196733338287826,4488057379272942,5819952474368241,3415281918160595,930908654741749,3992652833736950,2398036707832873,4266558878247161,3485258266614011,8664867950995215,8141374987901189,103541687206956,9115299505516247,2324532356299023,5965968511351057,5435375036262679,2571678924081432,4050824589883682,8322576780912932,688559024130341,865423368276263,3982326053218602,222483777542535,2344829848164655,8580625138559280,1860492172458289,3257097119575618,3997516615444790,5983120387766585,885514339903803,6886036257324274,3147387273046334,3203371521621045,7153319120136512,980997298436417,2179556145867074,4230910814685507,6307866450024773,4430817028127047,5825406975256905,1641444504914251,7833776705411404,7365913191323984,846112394793358,4498423412365656,6122127211596122,290639733280224,7256094313875806,2615764417939807,3809563897305442,4025367241762534,7186491634762813,3069990577662322,7412378645784951,9149056125934972,4576303136242042,9175219536165248,8005590614006147,8393110942389801,773414429284743,2064439166736779,2452569199266189,4614587353938323,1073587987270039,6250423501399112,197178578749851,9040648270440862,2355738008017312,425888309782947,8657687125099590,5735331629951401,559876253845930,4498115045570987,892967106283952,3304114104566856,3521903263078837,3675233722231222,3068558309333433,7608338102901178,771515434715579,3599782876170687,8642772806870823,3946267222163863,9018921004087030,4686345899514311,4140191993485768,7701177197682252,918455144183,1882153121446350,2486789950331344,3815100724406739,1630211689245141,5516623749925337,3501766397543503,419574043978832,1813043985263074,8763321205811683,6558497359448548,1720325932800485,4651143395682790,1063462045321703,9014246414477801,297476061125099,806373490211308,5176803442616819,1883181941225972,8411489504595711,2198087797699604,2922645562292735,3893952876608000,9121933972924929,2494543521569283,6670219378571780,5094718010411525,5154136774930931,4545360200788496,7623921295376195,1672233623033603,5011891280861718,7450370201472089,1112458131143195,378294798920221,954543949773343,3502206346463776,4105185406060976,6576361734457890,6773885884595291,7537197415394191,973311078554149,7851238837271078,7306721676823082,6919205636589319,8498623585995309,7383961299530845,9124957346396722,9209689729616435,1981360047046409,5531136114518585,6773372274212981,4927682818738749,4550797856041534,8998716358462017,4196081591310915,3910805388569159,2093899575786060,1215589489650253,584201965206094,5840468464810577,7567973223144547,1873173155600980,1758787176528473,2388725271919195,4343790555152421,2489493377083998,7057266646051941,6370740432357985,3514767491078757,854878905829991,8857038587060668,1267918801664618,7781019974726759,1512594739362417,5271644305820276,4291772542884470,4482298727213690,4408624441608639,4196666325805692,34584861981309,5489901012159103,5011042778933889,1461690627791490,8711959152781956,5967218836744838,1912859369202113,1213833065503374,2649540752997009,3473158301211283,8040624302926790,1273230594116249,5364627355216540,6943573199338141,9064718485162654,663589331405471,1684070873946784,7590960755751585,5021125357779620,7899731005901937,8658827618538253,4294590606633645,2989069630967581,7524646304774833,5599947026782900,4338127945112245,3321593012124342,8913735308597946,6389645933505211,1112983618222780,1142579350989502,201384130672100,379779378882336,6112561920932550,1005352669702856,3632142612220617,1223386649463501,5536979225377486,446668140981942,3035129818585808,2806087470570193,8700054471019218,2622904053074647,2057056656337626,9009130018649210,8228202118240991,2990897161702114,8950069974230082,8797890547858153,6261490775140135,1728247148853998,863267863730929,3471179694234355,6964773653344183,6224072090872566,7890150515491506,6485171246037755,6102857961868029,4380963206007253,2477951409310464,7525740062014210,3456098105223939,4119771461864197,2664444456258311,6116857891072776,6195716926520074,5695838365219597,6475679946013455,1783837213670160,1376311004273429,3505101468588826,637558589799197,8932275206093988,8466536165358373,1229823729707814,7110824273861415,3224894176328491,5085790451136882,4510896570817326,1483142623812399,6897621473513267,8021909895208416,2746697346505530,6922628931290250,2710229259225921,7765205003578179,9141997543844676,4418522350287685,6848505461148487,8078336265767754,4989760574896971,5946893571351010,2856549204593488,2440390243547985,8817802597545213,3847975807605592,6568006973268452,3376619961545871,23325603257180,5058746843417061,7394177155513184,1511263758312592,6287735085763427,1082398404647781,7470842257927015,9195692238220136,6934837888228201,4446367609465805,6920028561291751,8886209814440891,2457758692916077,5572065465498479,8031337846381424,4797461452254065,8225450583734078,296125770537855,6744830144403264,4004445730499461,3067596576693129,3924796231060364,5360661354716045,2216266763205519,375089202514832,5148178558598035,3681262395308948,7859231110159253,2762303552535448,8474186501151642,3281807020166043,3204261448346524,6687748374514592,6659128357051298,8137401373756323,2017576256715686,2160874004804764,4645290944132253,8172092260830129,4101897265671090,37376706245107,4053587952487582,3789527918873526,4059038231604151,4392245755829177,3324371216474101,1287879504092093,1786198334966718,5468635020622783,8241206012599233,3098292069469122,7944427343113155,4391675836124100,5967531883766670,3874551960419489,920056880602956,6754222898889207,5923595997731788,2441862990302157,833753239108559,5945034235837394,7673045359942613,5656143716121558,6501063061933015,8109099990289368,7085766868679844,4210418998414298,1564462819417053,1386038051441634,3525009279586094,5699008485710820,6018154837154789,4618550103346150,8555098905824231,7685633615617000,2162878878030825,61536631258091,2596605946846191,1459197307505650,3774870154050547,2123524064443383,802202711862266,6482740479843327,209687464782850,1875687943326723,1067410565991428,2638519260333910,2779297968098310,480582299024392,176010086816780,6650539492209154,5085462443879438,3967818134637583,3611695363079184,1700061399808515,7061545100201817,4267207532469272,7737598556258138,5599636316650526,1658763296844831,8451679842868256,7097260343893032,1926955816413020,802779929107502,8589036098296879,8750693831422472,1555281141292084,1195772908809269,7453353831177270,3412113454910520,8733631843023929,780402208631866,7131937182697311,1228610783763518,898950324730943,1113111541431361,1140748474985538,1389893927746627,1528380433513765,3883216622296135,498698354662478,2526550245657680,7275945499790417,8274650461363283,3903461488950359,2727229049603940,1394698478550107,5226196907215964,740769388584029,3667652661701729,2698862967778403,4657734269226085,7331479813397607,4525118670797928,8428423012965486,8565211305917629,5088324404591729,5138578338929785,3227978329185403,8472228970302591,5683787747523712,113074066623617,1472873439521922,2100638718553219,3540744485555334,4077643206839431,2685515096849544,8809739887193225,8434889396833419,1833418565680269,6400797482519696,1214088013925527,6723669747387545,2604243840048284,246581408816285,758404951817374,870165378088096,6480103788055713,596847221918884,8355150181099377,7087717279669865,7339422979628206,9029818893527581,4577847886613681,8728939785227465,7883435593429535,6149844300557500,3078265496943818,3033768890019006,3678882531925183,3977567188449824,3713860612832452,3803758111231175,4631755347037388,5277306525215946,2533703346302156,1383996726680781,9214129193995470,2459349824493074,7958182917242067,3626569214012630,1158899557686488,317477997972697,562140114435290,5870409928543455,2116388636966113,6404749695704290,7840780851600612,6164917204475109,7390473431899367,5843250442276075,3002272074951917,1896037389663470,1017881939578095,2727590714322160,2826978513624306,4547280622099702,5043150754839800,489372079811835,2470521707908349,8696231010061566,3968654109158657,4711067263073538,8238037952703749,5260306592095495,7972054499699981,9132517909552351,7426733239188751,1434579004894481,6547159493131541,9096781118577943,8759823967943960,8142852278335039,2261805915684123,1861070060760348,7228181767208154,5275548354723102,1976670927858978,8968203374218531,2659119107374372,1870286475259173,8613603267548369,5308497278737708,5252454000209800,7488952018914610,6112102855753011,5871372919291189,2878527951564087,1529086970635487,8291729526553916,3621488315153726,5813108614913343,1779652662701379,1983337682468167,5442300700507465,8039386259893579,6473178305125709,8239535735565650,8638818467335508,7332732188061013,2926648757849430,1027231809699161,9004766864850266,5337180767698267,8847010064891228,8936950534648721,9164575986019680,4177863895735650,3482062815528765,1397981449727334,5385140409953640,7307105369524796,5636383874829674,3163167136804203,8020274697443218,3661577663106419,6665939542662520,722492416159636,8334395904789884,6319669468962173,2198450669682047,4789166072753539,7938063863311752,7844830018239884,8711948489547149,3155855560080621,9146646562636355,8223879369665940,2445686666059157,6489848494476696,2909444612472222,3230971073240479,7166851099718366,8948136406220195,4464759533952420,2438073117531558,8247090317434283,2667018395790764,3895710414400754,1857493672374173,5876130769980852,4169640548707765,8294559659610071,3204862938410425,234773305318842,3083110514134459,1267545880858046,5809335512513983,2253350811717056,1624347228401089,5785671214673346,6905015154666948,6141962211954119,2671067399740872,613424256014924,5311098976320972,8784511908898722,8424942202203598,5763158978751951,3670564804922832,1436692048362744,2282384054537682,1192372106739156,6135986892427854,9046249338731992,556319312231897,5228949541363163,4380964209204700,3542295576612320,1996516860820961,6462802174664165,9185546598489574,3224604204178919,8302604472815083,5288869525491383,1724815169764846,4911099995526397,1060839602519537,1745982849285619,8251344793798840,7447630947872246,8459441131875380,1870360950443512,3657990052806143,6886890991633198,1644148380086187,2679814504390148,6128194529394184,4943743921729036,7913849739411129,7852337549069838,331133729795603,4760074817416725,2075550237474327,3948850569780760,1689537896779290,1867269691010431,3341638435542960,5791295701417512,2940067051621931,2975674590662188,5758657960310706,8165079119564334,6367141629615664,4839912109863344,3378478990662238,5038208701106100,2577872807751226,5252029398203967,1833401227988544,6366346068889154,6073909990981188,6560322526666310,3113785830112840,181542846637324,3178153569259083,6362604811849292,4721665416429133,7925709868912211,127747389120084,3280392283348566,4550937123192409,8922982978512786,3013604068142687,7421433507929780,7947292238618156,2458534791548516,3078494857865148,76573520191083,1716472092061294,8569013156495293,5461000863039088,6970581835050609,235176586071666,7119477584957044,7418196081712757,7079472694795898,4067647580110459,6381081526328956,7085581186698879,1396266265443968,851908377898625,79080737656450,1929984040025733,1942513101717128,7638596942311049,5251091939946122,4272177026981518,5082439466618511,3196166930337426,4686785404026515,8419697295102639,2935011828158103,2929450901053080,4960310592179866,6816174395510427,1057125785996956,506323565526685,8617629401450795,4761451335511716,6026752627928741,8547528405991082,7697144650034860,8249610294628013,7621720578346672,6922486007160776,7918678955613875,1054211547471540,3663896078093598,5901637372796598,3304112652820151,7148391783131764,5978180737924795,625624575958151,3028001503428285,6545423854079679,2839124983381698,5976464707313347,81961844728215,6405769148374727,7240416172909139,3522959105549603,175672684748503,3177191744462552,6428125342211801,6976453611434618,2788799774764767,4056613450473184,2447294299680483,6300988723004710,7882705443127116,2558520845506514,7792151398632061,748116020113139,1066163173404407,3322148723701034,1501251022806783,7328948081655552,3277125395025667,5814316680867590,6647612825239305,472620061908746,7871382954274775,285852390792974,842275838377744,8555028668002550,6284070315171611,4718551065014045,59673028849438,7696110071099167,7468885250916129,3468139853885221,6745998763745068,1089817046908718,5353883082633007,8628838597357362,1139859193589555,6602804266078005,8891447928033080,5293463201812282,9161019746094389,2230759098625859,6324763420720965,5503057891888967,1625589865709385,5822106829585719,6249269365141324,1920671151533902,4933537532084048,4349928790433617,1892285979885399,1321237438867428,1332596187324250,7981186681962333,5861416851001184,5106294009601889,5856495884140386,5739327546179431,8774769415847784,3361611106877291,7322352368360913,3278640037935763,4602895335238974,343785042423673,1634670873337151,3518631821971325,1972407322955646,9169343676034100,8108260642070401,3374349955985284,8440202982050043,6450410234105736,118149015592842,5457594126876557,2892318986768272,8566876259170968,5353977546112916,5871079507263382,6074764915158937,5370966248103837,6172812902858657,2850732051025826,2014030703570851,6888395475764305,368440417656817,2055218748155805,2129959883817628,4984283060051271,6798730118090676,6069733802662953,3442336827708745,3370517254696889,1710642694926268,2158788708152650,7738260418219966,1152885232476095,7063092140388289,7262684027045321,5871793876565955,8728409914234718,6218732522024901,5838854941746062,1325292322078664,850558758195146,339759106154443,2975867002236876,8995314149011680,7107897494380495,2841953630273488,4339377591390161,2221719308365780,2371798752656609,8018436185164452,1263539059806171,8266393513607134,2349639662632928,4088993209495522,1940380394962915,8995464451989477,4429873213358054,206573390721000,3426472441233385,3521869229659474,1873323544379374,284059665076207,4781229677875185,2687910789238771,6493685211226101,1424774433456118,107708633092088,5290803440854688,5727660260802558,8331516223982933],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/c787b5e7ee5160e73735755b872c0a41",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001422985.1/GCA_001422985.1_Leaf117_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LMNL01000001.1 Methylobacterium sp. Leaf117 contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"c787b5e7ee5160e73735755b872c0a41\",\"mins\":[9032228082630660,7208209257906183,1418968622096392,8970937050152970,2958723709329422,4948000212803603,4513337435242516,353178518839319,2223644902735900,2193639043416093,1236094096474146,3891897704005673,5970519601086507,8521236836515887,490708801896500,6796087724326966,8399994456039479,3003599884296250,2082164653146174,5050896632348735,2578776436981827,6396123064082501,1294780850128879,2834489446981710,5579737130451024,7472414635835483,2283401653641317,8896000568541286,2993365289148519,2660660355227757,4388905196142702,6192190636146800,6299014130114674,7878922249363571,8698804912570484,4039855976415352,8855636787953787,4079943699005564,5645456042590342,5598531820085383,3416839917609100,87352556388493,1195140266942606,4268494236016784,8043158675333269,141950569816217,1026859101520026,511356558878063,1888671512764573,6377732207403167,4497295458066592,2878074363655536,3403327153817552,3401702021111983,5409352085840048,2036856403140790,6308051281094004,8835247596658874,3221882995663036,8310737807851709,4436108939083966,5365882411212991,718740324999362,6547132492677319,8246457969565900,3967113905184974,6110135954731043,5199380862814926,1776272950796503,2036500014760152,281501623607513,1804045738844378,7892278187712732,625115017248990,6780231765311712,4910066531719889,2813650946941162,3016730174103788,3744362783047919,7986618597777655,444619026686200,2072779713782009,1572976344662266,2418327271555329,356140224250116,2817536456368389,895877256888587,1624921634414862,6843470386884653,2428969292316945,8019243129782554,6269095148978462,1081681526538527,3349054126309667,3919088174211369,8695511788183855,3172661130789171,522692464959796,704667951653174,313830329851956,8713009929658682,6869893567553852,4087452995282314,882155955765571,550233836699973,7885623714185544,5230818704033164,3450395440925410,2347149393805646,4050279532257615,7564410041123156,7586029788914005,6775726226760022,2846354934628702,4359809390158179,1958494562910564,7633460752179557,4039887310315880,9024248953389418,369779469500779,3746442325156205,5917707415372147,7082873649664062,7829430150758774,1289429476475257,4616567248056383,394906345111932,5546863517491581,8008021833916798,27599326306687,9036099574793622,6626089729114502,1439814858619628,4525996686213515,229363879231891,4449847269998997,5533379281420696,2836834299628810,6626381779116447,2111311266136483,6712388898447782,7689896767127979,7402563639820720,8141721667355062,6040694156485047,706871303553464,7662318883971514,1204271517548989,4587278076412350,7434069493531074,2079352685101507,1706162895774160,3427740144730025,5797956839670227,5758515316326869,3499087091089880,644586680164826,3881201118962142,4911540931740129,4029662923391458,7663230378901987,473380666499556,6388300891767269,7938312731812326,4265044888682983,1705784057537000,1812585752887786,3959618483831278,8504722701386223,7951233582105072,8827926915555826,6556701715399158,1452065668465144,8430239856828929,1254010487063046,1208614704177672,6223790298153481,5420085539029517,4632630747783697,7066027902665234,3989437794896643,1643501372899862,3622412984001047,5812893615899161,1614469414019610,7289599172004282,3126694588482992,5217644850913827,9152753321935396,6325829579194917,6199629028647465,8018928570769964,1932612056220210,4637086855717428,7260126470606942,1439202405302839,1350702670438969,7077831915315773,7057268257104447,1762737965748320,7508570235126340,6586304600203846,6362923575406690,705146423992913,8811420431049299,232433003496020,8783490494161494,6640088126767703,2677673491363258,8456078254711392,1444199346037350,1346342007300711,4765830660293224,7839728942945724,1071851158987370,9085534832861804,8091344221367058,59509583766126,1897018874749551,1646890540294769,7043621816566386,4487525484061304,2408233072394874,7341817495954044,3401723264737920,4216018253423236,6482597437956742,4855229808632461,2930854082421390,5807088412483693,4817346099593877,4464946111652510,6381895799415458,1427562213048996,697342490567333,2946319149281393,2425711240061608,2353941575000745,1703717569480136,7608581899059895,9151866389078716,5302226306925246,9059759735177919,7259340507374272,855162714497730,6840851494224579,3257426127012552,5219728693486286,2408094492066512,506188113789649,8276173840563742,3275784164737751,1143265135854296,8618900118610651,1527689619047132,2605365917205217,1368960216707195,7782664429273830,6857449319105256,3732736111198954,8278058882179822,3865138665751285,8869429884413396,2773676725633787,1807230605058814,4753450077954820,7957666576605957,4701555974931206,3992948939170572,3071473292395282,9190667536646932,39287548298005,2167360736906031,1829785547318048,5706073657344803,821839838364453,7942887107093289,4943416898888491,5674722350179123,1877488522265397,3753339381023543,2175140676078388,6138662335316795,9052614513656636,4979552571368255,5200653193012037,7802731510399815,2387875210314569,8277565935067979,2471344765461325,245332326286160,7375893496062803,5456022017286286,6804206991582040,4889831531979613,7539913944187745,1594475760681828,1822432415490921,882582841369452,7856098910511983,3829405754401654,7133238038799223,6980135073956730,5627217392804737,4299566927405954,3983821232243587,324783432688516,5006552975999877,8977814331335560,6669205415232394,880334270817169,4594682624795540,1958677453669270,9148363547648153,3001930449085337,2576495788550982,1799013085515932,4683658480894895,2150345361785780,4395742665671605,723040553984951,6682497558004664,6141191890527163,4453654201861622,4845157101994950,4048061091750855,1887593933153227,377387877082061,74810576683983,4344046101373905,8482720257721301,3034807184458710,6118514681979866,3400436885758952,6396477580370924,5125477110391791,8108555525030896,5394715876090868,1698333972153333,5965083991385079,5751565687718904,4584636443657209,4440216998577152,5737171851338756,6416279587087366,2565516946981895,7104477299057672,5739146537112639,1780095893963786,4774646633708375,5152267834844675,5347368533443604,396772289225749,1130628247634973,7656352930620450,6540302403912739,6731234686264357,5163944638579756,6240881055196205,2191028169139253,7077821392995383,8984651381548091,2613153413694986,6804457926501439,3270734086415424,2523127255589956,492851251946570,3544605153461323,7644539634898514,2173367213622358,746110397768795,5330181051753566,1078960668771428,7237334813238375,6948967195313258,3420498982233204,2864919161308278,1077342545790073,761477004149883,1380984128586877,7445556921640064,1404600851965062,6110255710848136,7073297978541193,5476812562013037,2692309655430288,1189466291184792,8711472232105113,6181359871501467,5864826055959714,5323128918423067,3139402444219556,2783310145863225,3072154898900134,5789935975769257,2439948571632811,2702635342718129,8830157820118199,2499341059581112,3651556562358474,6383896568579262,5517792816751807,6945369334260929,1781678122116291,6715187720225993,1231632871408844,8499415194485965,431497665645432,2541542284567762,4922623098807507,1060377938543832,711001179481306,6078661929190622,8438992880764128,7541639573152995,4553239069541608,1342395380909290,7106314833331436,8638447890973934,6606253203423443,5706169467258100,7411053045546982,3102005471986938,3972273681073403,7766147608085756,1930093585704193,4848916756473092,5293742705108229,4005289197880582,8593084820178187,4015694202135820,8283574668698894,7396843209950479,8092883962873105,1288750803764501,6485513591235863,8219538060944665,2450773256226075,6748270746662448,8146579206751522,7674041257623772,1390035073221930,640785098147116,14186859758894,3021414624585983,7027788652078390,8667563215848759,3562427720475962,4424363512644923,6629562816136511,1772950724019524,2211058018215237,11027177841993,1095154977015115,3076452749100366,2287692011431247,1681550106805585,2007084406097236,4800962251973973,2182852319069526,8244331620803931,7590428552906077,9053394064737630,1139711828018530,5632972820153700,5306330923918694,4568708910933354,5071812663502191,8483117296379251,8402817907934580,4004299751679350,4860524843978986,4595327700010369,6023036515141000,3271402098827500,5355982825055626,1221244697699724,5049588471956880,3254372980549010,1954277956048451,7652392677565846,3192786858885359,7123471690433949,3608037622384031,3432641614488998,2196826179634606,6259009753217949,3002822722127280,9056190820279731,9009054875616692,6126057787033013,1863589520250441,8141330653169083,342836455261629,3138720827024831,9059988364158402,759246208517575,984681076180424,7088543413741002,3012085068809676,3084970617480660,8784628158883285,556477654451671,8408265142961624,5766052543265700,1659677964887515,2242013516300538,224369972307422,1669301806327263,5630387296978400,7586871895344611,4400398373324262,2651582905951721,6024813195732459,689604467189330,8387744723600879,5114885390976497,2561105670055414,2691911345653246,7973523669124607,4418791216208377,3476932031104598,1341179914208776,2966681453110794,6767018532169227,6008379059111439,7707913223661073,2838834748663316,5728591969076757,3290200895464985,7271564368012827,7848116337501725,2653736468461147,4464334667589156,5918116122838569,8078989311903274,811688651310638,2956862724367919,1766424453817904,1288095456331313,363292577252916,1832780286428727,6890942325155384,5975184048924217,303369330632250,571032928454205,2334092508194366,5862980345562687,7498715190403339,616317023831620,3702057706454275,5920233182452458,2243621073280711,7631589869618768,1960567026689618,1934553894164067,5768693031577173,2566222788675158,2457704938440280,7959575938262617,5523173405640288,2997770330490467,4693101240149604,7187862150907493,3210920136384785,3649748434454127,6753079626557040,6326566089639537,6707330733139573,7096386751555191,2061903845729913,6534681341363837,5482955877828222,821855255537284,333084436211338,4560461738722955,6018582693848721,7410566236858003,2968815203829396,59493522720405,3051938426324631,2574026379552408,4515872804955806,6154935800579744,8567587630302884,7595344414975653,8757872653674151,7141778829141677,3135757458359982,8553132203779759,5713443392087730,7342658711250611,6656543654225590,2890528383452856,3002011543209657,4531402963150522,6269173465469215,4460257712359101,4546646701278913,5928615936322507,5157990733924037,4891249711113926,9097289170257607,7135752011163338,7452239048795851,7816390595389134,8297900548581075,2332350869743319,4885447653557976,3638768822839003,7936074127001308,9141685139613418,2468789748016881,5820540735817460,3104791966549749,5065908554778360,1242601410987770,5153459877455615,6603186312021762,5989344952878853,5025186376902408,8834405543659275,6229089519830805,5706492440135449,8829998329587483,221137245439772,2917619514771230,8032313584961313,3458954268247843,1548508614625060,9023226871301927,3650646757320491,3020302722451255,7610816445925176,5570910407370558,5151960888460939,5734345655592774,2475583743027016,3788304493512521,5295788142085965,3371308953085774,5963133645383507,249940237920088,3246078740506458,8747537709967195,5878437343922013,6375962204686174,7300375207069535,7844661689411430,2851443575277201,7554750829045610,4464472072554352,1861835305273204,3981971527837560,5007457291482772,6591049749882746,4796637435971452,3874113620313982,8768684688156309,5940295924426624,4449491530607595,5256145444185988,1492140617017222,2774193318964204,4145890098030474,1804351275640716,2450496154370371,1436639755577237,2113106423728022,3238593024386972,3937367126411167,3675632090269600,8195107616311201,9214679746398120,957789137282985,5057048335157162,7677280270141359,6924754149902256,1943069374372851,1140982707414964,2328157149312670,7037867160930233,7363012530653114,9187813761570463,2653403715430334,6067979453908927,6757458015578050,4109721708611525,1105584012281799,1549701087864779,554840546232268,5112862137444302,5630657240401871,8750421269293008,3615627018397652,3451328641476571,921166630472698,9165814569887710,4791304380454565,7615583691802595,4292580885792742,1275927139715047,2402738516871146,5557117693339628,3576672598149103,216987748558833,527324993783809,8819282333550594,2501123054061571,2433784584341513,4948706714765323,7696359671474188,8538188216616973,2583972935780367,3787750724053010,6994844758453252,4965296496773146,6942593434273821,8327704477673502,5887752165902369,6329667716966436,7479267192866859,1553541436729392,2994225193576499,4687177958115380,4460181337786421,8480064656230458,2471359967430715,1490233271207996,8820869557282881,1001713618823240,4242142815610955,5379905176692813,1487593403189327,6731888131926100,3005606514063033,7767164177999960,6759706685106265,881970855708763,4403520802170972,9072019487082170,5784364007376995,7902305871939685,7363590745679982,5190047510816881,8161272342358131,6603156356286581,2101205694793850,4657667930228862,894566433089664,3859059093792900,1555621124966535,8765674501378412,4699003806410890,8825332226499272,2850046704109720,2996844559304864,7628125308217506,1380768370796712,4911991851862195,5834909862430900,8321712339232951,1643203286870205,1947043607308478,1937488345598145,8872906335930567,4559308646140110,6670504091510991,4938482694965458,3232055076633284,8689003419142358,7092119033415895,1952867174041816,4409355945576667,6470703979972832,2160931948660962,2293426824743139,4013800549574885,3896831231420648,7753054177560809,8829518338058475,944015510784239,8739182222133500,8200429818931455,1397111902210305,5803628492851458,2931769895197739,7615296069175557,1432837531617550,1930050010622226,1131093716347157,2261793110526235,1187446272952604,7017827392882977,7585169783056681,320484042524971,1701290549381421,6288532161520231,235053898914972,8591814011668787,5889287353051445,7640096465488183,5516145982122298,3969040307562811,2643939326060862,6131251949496640,9033105322314049,1274656392375687,5620984170539333,3298587314211143,5878217865464136,3025502331152715,2118970992699725,113729688996177,1900311158327637,5493100404853078,6981904171264349,1303170671708510,2838767173724513,4622140620441955,7784494469089636,1317506061969766,51454772210025,6877278495066474,7102347585300845,6401097442822511,1843704301470099,1936228388399476,3311923065964918,8461771782875512,3926439213681021,6290986570916245,8389971219589504,5744314788022664,219979419937164,3258963311733134,4227651393812205,8508985881643410,9055930756519662,1456282315483542,386360785693080,8814492717246873,8818656550881691,5659401247558044,4072029737871777,9115270319630764,8859159211420080,494360222714952,3686093255289274,8551131525802428,4714019130255810,6223097813617092,7848857689606602,8723784093677303,894548251827877,5660728429595087,1394879981636050,4647437208463828,3045306976471509,465364969703896,7545937184623069,4821642122267103,1829247319550434,4333741379103203,7582547361253863,2562573365987816,1004741084948971,1974252148525549,3098656975186416,3552308346808820,7642487346375158,1616437609221204,8846155294001660,1196089926380036,5273905932986887,8277430985525775,3447186655796312,4493624117676562,7628383031506691,5083210305563164,2215764576725533,5631215803959842,566901125720613,4968604044339753,1868743079794734,5822524390705710,8557091439274543,5058007649773320,6612966686280243,7637039003208244,3541385850194485,850227327879736,6631467108969017,2425827451300414,2887923563915840,8612206851806987,2667009166963973,3223577679458742,9169095266372166,586768062630472,6190749562227273,121509936613962,8081774651058766,6932872456251983,3175403932014895,3521055055809109,7108384482765398,6167876556155483,7003825337952860,1688157701368413,3898406067997284,197922206685232,6147221505034856,3113411937823338,6594707834180589,7361953937189485,717607586073204,6484047969798773,3075096181459579,636992000387714,7864264628754198,394005556005512,3442212558604938,4620796122557070,4259770643139218,3485730027520451,3116936709106326,8931927110757016,7415371040238240,5139322580978342,8351284584941340,3732296954849970,4842188583701172,5693425516489402,8338593999186622,9218389183883969,5144832803785415,7144318574389960,1041212564441801,8270155992304334,9013017723669203,4659981861645015,3202810867074852,2502424100260576,7731497308818146,3177528214768358,8649140528140753,5074339104099048,7055187770190574,9066700701641460,4533532269079286,6812549431323386,4448237528910590,2945826441726722,7431545840338490,5469241258962326,8664456322804489,8995308035697418,1617616903703310,7982059147938575,4675536859933458,7244431984528153,5843116467869487,1732079118494492,8357419779566365,5382111270939423,1207056974916385,6952962595048227,5504406629813028,1054639586839337,7731695769111338,2199273499241263,674100826073908,7236207501921077,8898103859678009,7785473503554364,6729480230005570,3574250599820099,3607048476126021,6768106983344966,2104323946151052,1950913146678092,1940821271970274,3245649495034702,8132669706120015,8055555651890000,6986170767395670,7121605027908440,3365407830920025,6618827027554438,1940548239493985,2745927953541986,6669955581119334,7008871563832168,1343126907784047,7091039447944048,963332987923313,481597346302838,4437845235436408,2415515673455765,6421733911481216,2769121397607301,2904719236025227,170206901783438,496086901713817,125799144344481,3020957661166747,4461145620179878,6031188617346204,4719161444297643,5491557458655862,1244151095856047,7361851062355784,8472945902521267,906310011829769,1737670088887222,5896376393475913,7930287362927546,6496562845584316,8350358619417537,5866448896830406,5137793283525576,6811356580277195,3612952720722898,5766384890702812,8395808121449437,4599069914196996,3677191420349407,8724348992596962,285240849771492,2238825358092873,9065600699362279,1373786046049256,8279241017052139,6291770976308204,313413055777775,4087974304058353,8657180541692916,4422959783283706,3414286206725115,5097988035624106,1530808839670782,8748107754687487,3752687132888065,905949579291652,3011058165115911,6304026685107211,7314677682359309,2808474304785429,6792498330749974,1821487599488023,4607347564669977,5037676444748837,7208475130301484,1276940357430317,5156372102947336,7777189081016158,8047985490103355,3065536855673916,7688206964501565,9033283500674110,6399015976154976,6169433365017099,5755023404461128,3356385926040654,6554933176115725,1196283553278302,5910846692723798,6092351522331833,2377445560347743,8211898908773474,7323263115717731,2297740976008295,4236121541831786,6499369026710636,6257962964547433,1740820590906490,7832346948136059,4588487879452887,2310439921921151,4009764785851584,5582328853884039,8934072839826572,962097299688589,3083217438878865,7810151122947221,5422070540897444,2176372585204901,4620459885336433,8942197127482539,7181922356980909,3258684440972467,4068676051070132,205888737111223,5813810591657146,3515432114362229,1101009904217280,6533240384343233,7975430975859909,1308034346044614,1904535142509768,571326162046153,2230612046359755,1533685268012237,2929750875442386,5574618957342290,8645780736117974,1104193329805178,7556845219253473,628620977474788,8006295106661608,4418677973208302,3290071352421629,1962356913171714,8548442711239939,2401225069407492,3624547187576022,3720235810483462,4626256560934151,1775131783163145,5558934774033674,1066321642958096,7665862999862552,7547959964060955,632706986904861,2125980885044511,3292577958530340,2363898177047854,6432150554655965,8527668480609590,3910703431953720,6329844237517364,2135015261629755,8261327271062850,6216344263920967,2740401074507083,8044934175059277,9046971269197138,1729747415887187,5111245536456021,96350822998585,8676854422605144,3577715733720410,8823077120503133,7859419480881643,6254060467137888,6647151284464993,3334265893064034,7153208719461731,2772199429352789,6658280686906727,2700319314562408,4649000325868906,253532707439165,737728661556592,7453106721230193,8394090631949682,8680198516436341,8217219339046262,9090272397863732,9147079396210890,6851355028262265,8224585678021311,7177276740073180,4595566458326405,5335479830045249,81425899974026,4236090552814990,144204345552271,8240063379705235,8467277327666582,1920370512850327,6340344660004250,3368078246505883,3688363746607544,2343388682669477,3282083013905832,2533607489564075,5472342092230062,1595108239084977,4059252642241779,2119460115566008,7780135313345978,5523514313516959,8147391699316159,3157508503250848,3017587107327428,2439087962549701,8586135581060553,3982372745298509,7604965657218513,3822225955286482,9058774554562003,3172908768284118,8620725626777053,1927912167738848,3820230872526834,6991821642837476,9004946754992038,463142978735591,9080250537799146,2014507946012142,6439213384920562,4285919212839507,6110346306751989,7371355242868219,3667983686413821,7812306364337669,638569523752454,2222599441673738,6287178466217485,7646426516688398,2219466864725520,5625657505304083,7906494475488788,2294217454317079,4625821755887133,6271270480170527,4510903947636256,320930749238817,3345013613489698,3493104163048998,8723553676463655,866194721336872,5027188783468073,7302150149025323,4316208584781356,2690105167343151,2049180165729842,8444023614590518,9116213445737737,7221158580104760,6810994890722570,6754359567453758,3892125667651138,4997406760529475,6329904703376964,670415155592460,6856253856951883,5912283034743394,6571155681627730,4662177488522836,5311045860372054,5637334148017791,7435491323104861,3795202370293346,5820293666713190,5664138470890543,8941188677217899,7711581897993836,2197744786271866,7948606628884093,7352099669020287,1895750250794624,1734017041313416,3396148018359946,6402389801394797,4628512677277328,5817975516663441,7489118373219987,6376082155949719,7065684682256027,4688128166047392,7918841566695076,6497036145790630,5030865408528041,7204402400987079,5315631513939628,6607871670890157,1302793220553291,753479536610995,4740931286593210,619665858759967,9185510965145277,6923107005288132,5899214535831242,3573536478958815,8446529994608335,5508898196778709,7021670455774944,5941471120092897,6897119538704098,5999877325621748,3059878227603184,8789859317411570,6672192348729077,1641948531617528,5530159568768766,8101207263276799,8791934176841473,1037572884688648,1279528073604880,6498144018198293,6994016600330007,8489512670656474,6243382370840351,4818842957877026,5842176200568612,3597578709176101,5905874346176297,5542421211454722,1567052557979439,8214159691394870,1043121626361655,4000402612817828,5983285797523261,8191011363368769,647505546940230,4046609293529740,9201504556085069,4939080555614861,4997600897937238,3371005511593816,4838081551495001,5048376369327964,3122835836464989,5412942398694794,1828597897823771,3512214552596322,90335086923067,5591952974384997,4941195053002599,7953341878472559,1517082797992142,8487572260769652,1758850735640438,3224112583323514,4763992446979965,4153343142170495,9130545802457139,9174106603057043,6083389617852309,8791643320332953,2674775153225625,6542252911628187,1315603172769093,1881432765837217,1852143957544866,7514822674542500,892320591646638,7368665812463535,6488048631156656,6558913247596466,3839650574856119,499932956487608,3774274993344441,4728344459007258,2088672989622203,8320786374725568,5947637917111431,5381312287837993,292106802237382,8103150795435983,96256114757590,317577599242200,3367762498297846,5015175439609820,8822510906052577,6821104509882340,1172525492131645,4668559163822055,8841376921784300,6493589014072658,6831003596836846,8503649421217778,9022773864983891,1422246742609913,1100537827102037,6729865919426560,3554444038074371,7455647839424518,7113285470588939,1203957233610764,8504002777108493,4184256210006032,1240827687759889,144522765889555,6686661852074008,8046525126766620,6083408376393758,4946856333930531,1002478712082468,5147172618825773,6064807542845488,2282214976770097,633050832269362,3402379240869939,7290403190992951,5000088735715384,398181652009022,882035649450047,6665772982177859,5644175847805000,6456624358576201,3396761020657739,6678977013477456,3202511002341460,6164883017699416,3475547451224158,168473912340575,1066424873930848,2220352345436257,3126420451823714,3222281554825316,3730688653832293,253335689818215,3404907390652522,2557992779493486,455003460522097,870273776423035,2020155676872828,7659043286749310,482991255323328,1358340026232973,2641450707677328,330200351223955,8988472307757764,222039036407964,7485074382696606,2101558413775008,2661483762466361,1494546113114279,3120761701347503,1436476980105393,7066542699081907,6707004958099486,6871645313634489,2291853832220858,8252826723455164,6824621031780546,3001256740221126,2916499070046407,7585935606968522,1926282012284962,6994067832296455,1694913893529302,91414407611086,1889846350590671,8624252761068240,5008262986559720,232783656472809,1423666176610538,2623803617128684,4503129604124923,6630093508464895,3412203532742915,1150579622334724,771787238953223,2754186967524055,3051136134828302,3812997890486544,2763414628069649,9025483781484821,5637836799947030,716525612634395,8265801915511069,7763570739114271,7353915828302113,661965030469922,1646609972154660,8341638672470312,6484076735320362,8150356981567787,3467888153801005,4571052625195314,3225384732545331,8762872337002804,5077011005911349,3228994270679351,2878306696778042,1910511898382655,5815893817119041,666603632062793,3653244960198989,5422996303388045,6557463584403795,7686294637687125,5305075318780248,46226453899322,4233441444366891,3028832735113570,3199544226541923,7017851741221227,969490842489196,3932831682425197,4603446739518184,4409709600075155,2517983826760055,2738047505486202,7997029211435393,5344852814008706,7853114381340054,5702569411381313,1705154572635543,8568692132622734,3336135940649362,1253747599477702,5192015007895962,959328874475948,7179197727445421,9190132021326260,2707008940257717,2280303235101110,4601224678027704,3840867593146819,850787362189765,8115579233300935,3820016827650505,112257566724554,7361806852305358,8613708561658321,5315695730168277,8835373213479382,6279686289682905,5547237196436218,5412094615106014,7780353496969980,7752778305778159,3601505994965758,4706559747486200,3429140645401086,1062858128881749,3163151056499201,6986830978503170,8826275340284420,7718347061481989,8857857084437000,2598508998155692,3796456679895563,8454951970763280,7421491856958523,6212142945538580,3634787098145301,1402479778558488,3360761772470815,5732138936947232,5914008024306209,6541733725549092,3649215540490789,2064591640293928,1566765152629292,7518295747056173,988494350012974,2101654081073711,8007001312342577,3758243164418610,5697440716149300,5450260216361529,7785600061952570,632244203819589,2051021698585162,951823174046285,7818107300606542,4880755810347051,1280080590235747,7688644045656660,2766383756169061,6138338484359767,2457236937405022,8356429417689695,1312616204259938,2714880739850342,7128976639668842,5376881474056811,9082856860168813,8004138888483439,4740160687673969,7659762723959412,2217575503573621,5785337539434601,3380939662447228,7341797832651389,5267974647124607,6516350023152256,4866492605649537,8626772352201354,2720646759035532,8876602999272077,297185673187983,7058518227448465,1705378365076116,6285703078048407,6840711376294552,3318119802319513,4790900878914207,1592066554622626,7368846036202147,311672489456293,2210710207132328,2422361288413865,8654519371100842,8496152220185276,572504170476227,5472449108939460,4916213692568263,1156585348198496,5450650330018511,5739590343135952,1691947063792337,4634004754703139,7612641292849881,7107579192701659,8995689760969437,8217231945298654,1636597287432927,1021052424196834,686447954219750,8645367888089831,7631798117028584,3314002929464046,65873852693971,4098098050650872,4454885100409593,7624712932594426,28969465149567,5230019461681916,6528568438297341,8016011610968833,693937692156715,6954866513031941,1034499951751980,3448693648035907,7614769304810256,1710539010503441,3758309506970386,7599039312229141,7035130893964064,1360028504552230,7716036371613831,5500477824103212,4837214394725173,6041218236257078,3872344981656376,5319854107576917,6839489630491452,6596434080174909,6194228317221697,1272565989086018,108756201730883,8894225950741317,237282070901574,8845276619969352,8686538029806409,5536434866590539,9017918293832524,5830841884201810,8243059015218003,7757020474708825,2816987555115869,1577123518581615,1134155103228774,7275716031337,7552463798375275,5150531270161260,8245991838511981,6078000389976944,3746163715486583,4212083827168122,9062796335825727,8344544603116412,7304377520100221,8987632532681598,7712434055955263,4060044098139011,1529856103330696,367684944655247,2981495068988314,5970037788185501,5949773898400581,2703324752204705,161773802402,4464098276692900,1631267139007399,3381009647670186,690615591998380,7853197004295667,6273220037546933,6798830581937078,2488231350571960,1406606089081797,151203164361672,5676248901112780,5245451140355021,7315813385081806,3411972187476944,2970693207094226,9028016537547733,697819084936158,5440930231179429,5741928052388833,1997093220053987,2399163648209896,8480000125146089,8133115631588331,4677428052866028,862519279866706,2859336515744758,5754757666608119,2356869333742586,7935823366140925,3010587094070278,4027362714457095,1788019461329928,4655038201803785,4044150820942859,7752798168667152,2367119086662675,7973404663690267,2802799646659614,1328084093989931,8701412390237231,443006413485104,4274033727747121,5262630965810226,6519890270490519,439389807752247,899668982101055,1126012848682050,2245117105599555,2208874360386631,3032424277480521,3270670447703114,6804519940133965,944770288145486,2941742328843789,60707777107024,4333692938458193,885276917429331,6388701522932823,544809158517604,1269574770644061,1783827646936158,3255324785046623,6285933534196835,1632628747015270,6488212005484733,7705001409508465,5271617738681875,4112275151852660,6730010782594166,5719031529288823,4842785551611006,3996948642758165,1045117086069895,8381897751540872,5162720770135177,2686290622157965,5038124774421648,3285899134456978,9153136314193045,1914872776676503,7749259219563672,79678888826013,388335957155,4672652743038116,5377897941996711,4518954868307113,800295961270471,2034121910342828,5704630688666800,2229433069229233,4670478800802994,5534601474028723,1809677372118197,4774303869367479,3510918890108093,3341403998835910,5969023396967626,8717505132368759,1179917062026445,9113460913910992,4328328031687890,1742185025150499,7379057349940436,594162169104590,6983494961231064,4346638811878618,168465466971357,1340040319245861,827343336944864,2164799127289352,4068160273446124,3383658777819845,6523635653293300,1876175927561769,5514086940816638,7928984501761282,3136008183125253,2374267724608774,7778251646391559,8383775041505495,4829656725160834,6436380165838094,6174901016237331,369426822292356,2850120269354266,1224442266963503,3521042983392545,941369196366043,5626097546813083,1148412479329573,2769410897270057,5256000864335146,802523267650863,7491658381538609,1967786769593652,111832414836025,3470168208954682,5099076916098363,6954249896858941,5977614972024127,8292514744366403,8674239846749511,7896816431306060,2652367173801295,7834020621923665,6883410921754699,6163166881674579,2074465358181716,7200185663272278,8990516126979415,1260949231577317,2540573345207651,6658020236645743,1328899230381424,6621273174709619,6589317858727285,4055770027170025,2752141920048506,3445983953704319,4353887571096961,4640218560607618,5052435821077398,8560118483752334,8484081777792403,1968220448282007,4443409296602521,408027812828570,7767761827345820,6115338591056794,3654187310216606,8574822214997408,4386195794908586,2156798612780459,3628971201623468,1686106325857711,2247257543693746,2830501659293108,8614504867206582,1376651999090106,9124736737211835,7146365776205244,2277759469082055,5037557043566024,5405294896944590,4730610177447376,6612186490566098,4689270635288021,5723106131334632,4988734768715243,3323786717230572,277775939646960,5558807318733737,5919098333292799,1424974383011324,8748864236549034,1944054315341310,7677958658635266,3158893303993859,6714534502643214,9166941251851794,632096423245333,540856751639,1062027492111899,2982867634755102,338770731284008,479882915343965,1506674945766960,2760804617664050,5628407321073203,5665499427034676,5722883781670453,1828806644151863,5604458076616251,3439764239316544,1249452682106435,8737406855738953,7732071153738679,7046729727088208,1604228707325521,5660367027983954,8067023430514267,5188403765507677,6189155800872547,7250976672429674,4387941201688174,3341717515040367,4899029028615793,6798684659152501,8326354703373948,7916435603175038,203302855480962,7096053386057347,6752372048246404,3614104463324807,3698776763600492,129368784909962,4534875948988052,7629118185084570,6426055042496158,2996662957184671,5740631630509731,1301061892544165,5638904949798567,1023734250542761,6248685344159402,5627399612241580,1053748326135472,7512092652672697,3609163556517562,632634427537084,4201891595966153,7207999981500106,5639685105874356,4951963658475212,2582440652289747,4098606048048852,3958570597193430,7983394588989143,886707561387736,1982950070671065,1787484983891676,5669040993646306,7667700400145361,2933288179054312,93083758425833,6160877773551338,6797728852039403,6031697901188050,793064560604910,8053098650777327,5883212649961202,218730327258868,7314390200535337,1847302108460792,2656648760227577,1250662281361147,7298271850174209,2515032207030018,5665076999206659,1850771496892165,183530728052489,9116219253503754,3550827383789323,1328969967695637,4254308139996950,5550865351423770,6564476768639279,8815338428790558,4181524253775647,5768656981407523,7389569505433383,5853078852998959,3835215317454472,6834020004083506,5766046021818163,7471946196170551,1333644306159417,8602924260783932,3889516418335293,7538175839721278,122693802325824,5749342441420610,9193225786038083,3176224507615046,2761683980630328,6774413516052306,9141553910298457,853980828505947,9149076329797470,8823839548012383,5955522174637920,3347576266987369,8261276434184043,919274354071409,4883944129836915,5383435027832341,1199787218188149,2504721682054804,8434509200390010,1002512155449212,5981245580498813,5820759818770305,2963619191134084,5323971701702379,3419026140428172,4185978911627149,4879869224236942,931381364708333,3061644478977936,8092320019593105,2261862095878036,2689354495227797,6555083095979928,828669761124249,4850186863507356,2008127153321886,5761047017289631,3481752604932001,9153880980306236,8744515544324003,6295924329428902,7298279459166120,6436184143566763,7331295954671536,4716323537876913,8661989086230456,3795347905533887,3631357318216011,1240598732363716,6856254313059318,3315373482710990,9166955910150096,6165679975973880,6612030953537187,3844906327046106,4651607300478943,5173263920969696,28883961460705,4731433821616099,2927712000380582,4701396735023079,7179923759495148,7547742523519997,2386846772852722,8961686466828275,4452545854232569,4525644752582652,2813067082151940,5153662443190278,51121140340745,5498902547388428,1299811809892366,4537578876006061,4023990064148142,233449244047386,8123171528374299,5177595135006748,8261850135484450,7044816069654565,8418512028284966,5143574876428328,3444516796883975,3162700482631725,6770540682623022,3328941428734000,1583240949389363,8212815166838837,9159816090203145,793291125594168,5079822916950074,3368008212125756,5222268760594496,812562906470467,1095394126067783,5503280832460873,297568318216268,6055888046913616,5152950314465363,8622710693877845,7523909523985968,1138763217598552,7816830037497946,7309062271252571,1320103592163420,949360392224442,6721790315567198,7767629756643423,4823610047486048,5640249172424802,2668272600414309,7839408115079270,1577239082293352,7378173719492713,1804235582961770,9188706805109741,5552066041534572,7520696000108656,6463918679611509,4654285451135337,2358615952881784,6357973385894009,3848761335317525,4447528236611714,8784030775302276,6196066516048008,8875301313608044,8016014331746442,9205202378072776,3090543120119949,7406499238959249,2494242011773076,1914414931335318,1526481960218308,4468783499715034,961301159254178,6431161121674267,7524524961560741,8085122626025638,6793481055819945,3848947039991978,5086824856256199,4430552219211952,3215030035888307,7772862287018167,2127367875983549,7313941482879167,4268200828631232,7987672039192769,3625727270766966,837541181339847,4202578114599114,1790629201557708,8937768037368866,3301959113660626,6813604088936659,3027575499593940,447767141267669,2606707618797782,5451172197300439,4972070037647055,7762778399253979,5741114441357538,1406984849201381,7625696009384016,9116359046969577,4240652014885098,5577845149949650,654438453614834,1940017449908467,19206903412982,8328901573646586,4377613400897787,1625111791515904,3024107500140802,7325528073124109,4239839981582614,7493186159982871,5019720570861852,1743495963418330,7226125625112867,500868085094700,797438391556398,7179271885864305,3279330711583027,6789052365158709,8349259914410296,8742387490855228,75503670655295,2544456036604224,4986284884061920,8096208230136130,749182885083461,7429425492602593,4769049642686793,3837223391253559,7155276277354210,6708077298030928,5734911218964821,7801014943922521,6440402617903503,1035996429023581,4895534239859771,2107953581767012,2535672658999653,59094384073063,2238450331269480,4866427577375084,4363675973839250,2845908076738926,7464189781129586,3045978253842808,67002563691583,2161400177703292,8221428952275329,6091799817148803,6659620379679109,5443254795721097,6549043993909642,1368985675184527,1037886313896336,543671320480153,7415809698740634,4387041525324187,886335328106909,3488929672001950,2419671839087008,245148734232995,2951565234076071,8745435412730951,2871365517629854,974522465139126,3630931080754249,6771263570172344,172811310250426,1156687277046203,7095406133508542,179670967586549,4343453640325568,9015016869446731,590520614869445,8558110742550984,8858631390869964,3194273266022863,196308269070800,3440934573595089,4803956041038294,4958317076077017,8536207121506366,5242535840881115,1803662016354781,5736042587707872,5780981358698235,3210154142292457,1726526310234603,6179974254959084,4345041217772013,1253679597623791,1171755129149945,2182469060819451,4208877666212351,2702946236807681,7405943433542148,347199184789249,7717434951678478,7765879845640720,4169906427517462,6742257824242199,4995190952639002,3605989632473628,4213878714309153,7355996049889827,489365256895016,1238749342317099,6416237553965612,1463235765295661,7213178630810993,7396213770017333,7939833111214646,2295619763911223,3477918981855824,8220466952477241,2318078689270332,5326570874452544,8715674105625160,6408705599314505,1315630281734731,181628853214989,5665031858526800,7653148258071651,5583008084163156,6335823288941142,9213540333765732,5727443054128189,5433666899159254,2962592211745395,7385076870740596,562945388722806,3391325546166903,5292174308525162,864333077576318,7344666967521925,2618171238431367,6795863218425623,2089341921024654,1455293874477713,2569386723949202,4624565547473557,2514342820772503,3706523311061656,3588464190126747,1535449091332767,4082477247584931,6143691641592487,7005868590406320,1700299871599281,1899037209008820,2105104542866102,7140889482680490,3659126235462336,185846615775937,2543311344024260,8107758989793989,6754152914385617,397151585079077,854751954827990,3773035082406617,1283497693518554,3863639131396829,2384136221194974,2090919838273317,8189804606749411,4694462772378341,2950816773873987,3926343170644715,7673828958141164,5718961061407186,2472437092162288,7827256742828785,7504690458663671,941351004565290,8756971349605119,6697527980382979,4340736758332164,6130878667053526,1073244687809289,6173066516429592,7768218627496730,3571935702006234,3625920767965982,7214539965397206,7940915314318112,5398884704631589,8160237827601543,5160177377925941,4709184667974456,2682809183132475,9063853304503100,6435965248911840,5600270337104708,1773049590209349,3815185550152845,3475031647189840,4505603733642070,8427210521017175,5507807837666137,3754732894721168,3520666306583395,4308408370355045,7816847962553192,4611949763148650,6572024614427499,7878549999188845,3335876118302525,7557180407618418,2558198835018611,7151787413535605,7105822027307894,7960622099217272,5125033826302846,5440471364924858,7131470275271552,7758275276737003,759585472417034,8742343641308061,8484645420309410,3706054735701968,563881684163494,6434819272311872,8026974422039466,5085920248298412,6881264632093614,2140066019720112,4849785646455731,1382072918604729,1618974650833859,4272957049633732,2233038365514699,8522186193943505,5522066766640291,7249186042346455,3977290586856409,7102051124575202,201827659389927,6602332964214492,1048430056242157,8126188311067632,558738979101682,5297761491868659,8746844296750249,1783643711759367,4957821121699668,1563089130380287,6833949805648896,2704388797160452,4276975045627734,3264575088221196,3431243170668280,8023093467667476,4737453061287769,3788275247643140,4027099400797217,4832021837454370,1634199025761315,5029638680788006,4865796093426727,2810853849759580,5824593103538695,8968167397596206,3378827346386289,1663071676873777,3774952179538994,3589573904022579,1201436427467832,1876832219438137,895042184371261,1455453721001024,319799621975105,3271447092239434,1128157204241483,2390026385300563,6409294602116184,5896682978475100,333154891545694,5423591174790239,5371880141446241,1044004868168806,1284438051282023,6155367671266408,1517323344739433,1138552007949418,244673545203559,9058740943772784,964585593011317,6186501289163894,4351090038111353,6900977709874300,6173575271603327,5805015664565380,8414699644550277,6759636546444425,7290126490728983,7598194270772364,227557961464974,8754527473024145,471493178533059,6110045698374807,908602498907289,5638322403237019,8285118118747292,3800099079027874,4439030960037028,5563146014579878,5311502133378215,7714716252134570,8732808226258091,8715381057428652,957764706540717,5384062954339502,8561576271756463,1838658624199856,6706461514480825,6347637329829050,6861480259646666,7236152463506622,1701172810103999,3398369774206151,6690606505434313,2292114029673674,2517132216827085,492268958956750,4220541493159117,1079301276662997,2326052356537558,7488682354965720,1856681399352540,3566755891732346,222067886251238,3210385392631015,1906075588582633,4668439006452972,4420364210343805,4453053187185192,1372801260330227,4275206430883710,3150359077820554,8256921845857528,3355310222635907,2797630904188159,410362960551169,7123607544798466,7886979763291706,3260141319347464,1924949429074476,5754792119385356,99776346537236,1984936372469014,5779272203377944,4000556269763868,9008639795485981,4884428204204084,8520633060859169,1785563197185319,7137207340596521,6675405880900908,238269830159661,235414017080623,6312323284835633,3816713731898675,8232067067878708,7060127600434264,1390708383006011,4021634284281154,7343425932917302,5548629585050959,8221421130202448,6471879682440531,4741799854153048,7469938592554330,5841882731011420,3545273524927841,5030309752667492,5529794922429798,2032929601084782,6861523426557297,4245255219289460,109112205172090,404009620471167,3348789226184064,3207684321671744,3216432150773126,7016625311923591,6820322405195146,7458135959109003,3121590778756492,9092949224244456,7113213142875535,5073118944714133,5588849908298206,5297370734026138,4934922435755428,7770799265996198,2395230966332840,170384487087532,4673031676029512,5474638963686835,2057930708699721,9134222675371252,6556515104893514,7762435102326207,6033277993385411,6304196152016334,4030720626089425,976341365792211,8647176306040276,2627905577234340,2466455063936474,7559731011066447,5888229213355486,270881048186363,1991999474924112,8484814589025763,3175953962163686,5312241973353963,7843389989060076,5601733073108463,7750847811632626,9189889958624755,4393673890266614,4414104790777335,1139236081810936,3653231743339462,6508289542515700,7177026786224725,921063438835208,6527173590769161,730605552664078,8203968582884884,1448559708880405,469913821290008,2240631604837915,8720212417715740,8371998958411294,7831140244796677,44252095716897,4979988991303203,1896726696017445,5574478225448487,4119052307455530,2581202361851435,2144597122350636,5990356527439407,9212728078229044,7828329477460204,5493310384291385,203305445162556,6313229397351998,2963357024010617,3790056653676096,8985320324546120,5424798618526988,4328754791104439,6912214278626893,7851763064184400,9133746833866321,6407149735583320,2250698643955290,5804335178161758,4546177151049318,5323730693440785,331182045863534,5192215197187698,725224875236979,378630542638708,5850394104733301,2946722088681078,8954035204710007,1653801175247467,2586293121801997,5234472660344454,729508051009160,1544990306983561,6435298031328907,7159405947182732,5757473607425677,64901794487953,6686451758538387,5781226206109332,5980394052912409,437849366953625,6517008767983259,4830083976060573,6405878817087134,8847620094951071,8714141708762787,3288009763380901,837554864397991,5190735334194865,6080853646278323,4502724260960884,2335945549143738,94907300323003,3316340834492093,1645580594552513,2572114045525700,8321584550993605,2038927214362311,6260127897272010,2156824551890636,9101795783646929,6963038449385170,7376125527490260,6400316281478869,2413238450953942,7523902926307034,8668658784730849,2069014445219554,1629430769581795,4837107375210216,4237100349726441,6689568371826411,5988182445030013,8565851551096566,4340547656605150,7969133528325883,7391239301627645,8685794066824960,563720579751681,9050453048147723,1427773550739212,8676306605580045,695558393556952,8789235728637718,4986085242774831,727478615662364,7278023366249093,4527570755485472,2531768520580899,8774354038807175,8660114987826988,8792308181163822,5382955714420527,929220493123376,8580046938008200,337183013838642,7398800498914612,1387078496272191,400275000024897,8196027437428705,1393404628033354,7175818858348371,5168919311818580,7318963612139349,1049104998244182,8608121311567704,6426740594327386,1779679228886876,5607962748075871,1894953587765315,4592264541847395,33822059601765,2433319388200807,2677313913240210,5004075616608111,5172750313914229,8873075667050358,229356972785528,3674804130398074,8555830785916795,2713096333344638,2692806126870399,4713584797974402,6418332800393093,9002351293677448,633483219435405,5889370572967917,767360551881368,7289796872667027,2098178395316122,1711167346728863,4846107024898715,806156889604006,3205280744062888,1675361840488361,3081177601097642,9055195325243307,1501058861023148,6152723985551346,3058199331495856,6951059363438513,7687173191614388,493781578381482,5360056820573513,8906579539378117,3737786356490183,2082036644962254,979907976052694,237066617444668,3002640715482447,7013000281407452,6460904551153629,1278012253102047,7159707353874401,8862211230597094,8756845082304487,4253809359781866,688895075885036,3185769063380109,1033653040455663,3523619052150770,7591632309966163,2084770884247542,213230143053818,8491827968524284,8790402389197942],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/d719ca7fca663697fd096fb757b89920",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001537225.1/GCA_001537225.1_12082_2_72_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FCHS01000001.1 Serratia marcescens strain 2880STDY5682866 genome assembly, contig ERS381334SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"d719ca7fca663697fd096fb757b89920\",\"mins\":[1918869704355841,8350358619417537,3009551428136963,4940371701690372,622511163060229,3799586933239814,2887774119976961,5824641356705800,629424065245193,1000710375125002,1932655059489453,5387834518261776,6297958444388369,5322917663719427,7627103623102484,174938844286998,3404092785332247,6700226286014489,5907845713461274,1102899794128923,6873644207984668,543614722584605,4779204745680901,1270075025096738,896992418406435,4409464936837126,7517204897681447,8239614845894696,1954700874952746,7185573954117639,582035423068205,942364521558063,3987344687276080,7387283128569906,4068375343067190,2283191210954761,194995206197307,157042402193468,9187451287372869,7641621035352127,8472620455202882,7690317759597238,7767701779690382,9040059612653238,6049196603985996,3059744279019597,1402811782201422,8403924257096502,153796629880913,8081689428577635,2146765372641365,4841410235674712,7523986233571343,6003022554099804,1552637694120029,8820168686084190,4494282708770912,5967504635693566,8926815290212454,7232797435797521,2645022524731496,5470570690666604,3393814059872367,2117225590091888,6215307349263720,6056390622900339,1189114657366134,8910850227355609,3872022755184761,1298921372000379,5605556270768253,8687500361857045,1649331198763136,6584179701969025,6711523443208322,3176907188646019,4904453834346628,8432765853257750,2201840087457926,1042397497619137,8329042968404105,1159920135205003,3767411048591502,7840167795224994,3478469961134224,2428589394243729,8888169192636562,6500257719026371,1352438194811029,8479110878204055,6034453235944132,6672896841455851,841181968504175,6664509085131263,509178077343901,5799934842311365,7444267993975507,8362123414425762,6210031909023907,4646891575189668,4336256313659558,7853291778416807,9153330536525333,8460496072450076,8481321398865478,533617799438509,2967232483102898,3479031216418995,2051010952384694,8031605886482439,7761999919548127,4786043745349818,2668685823033532,1857163488608445,8222882392589641,9144080634491071,8710571936041990,1026214715568322,541561036079300,475116329853126,7967058596881456,7637165806215368,769760755564745,6223430303244490,903764864679287,9070592077414899,4376487628370126,7806551105429713,2333144800051411,4607329528312020,2993253232595157,7243616190075095,4705282381410520,6895506443567321,5537249114180807,8386666769058511,1215441942241500,2979892198359261,5046357901242590,5906330339541215,2141620964364512,8696319137321185,5797896251322594,6708026196877539,8249229737515046,1901399694573798,118526799618279,7819750360522984,8195523514155242,648197820248300,6175568076255469,8638538919368927,7333192251870008,6788988921765657,356035154021075,7611577496021830,8330833997841773,6749369570774783,4805104988168441,6333692629101769,6493039042028927,7577381757055228,4942086341230634,708326904160510,8917774685698604,8687300149039360,7739897980322049,695572312436995,6458619342782726,6439816949418519,283638737748234,6453254978539787,923195926802701,1993831460090128,661329272496401,1771085133877525,9196123179321953,6040502861717783,1099262060123524,3681071332454682,1420281602887963,5102723384074667,1678258867847454,2582410279072031,5102372791427360,4730933067845680,5500645138604323,1681825035596068,7218260286664999,4144361243328808,663782879199529,767800890383959,3929062409367851,8190395565137970,2719310071116078,5633919923295624,2561788289683762,7808297074565800,7110869889167670,7011148336738615,4116684339253560,424073003278649,3470505918628154,6692980544602020,6941889147625788,8477358210318654,7378383245296788,7087561613881666,5449737530299787,9026287929246542,1818827548918085,5802098711298374,5954093815315852,4394112182951991,5627036704084706,2088439934209117,3155958571880783,7136621486035280,3922216267354451,2915677753553237,3485528599363927,565939437773144,5804775274172761,4554239925571930,4727163648930139,3231958936691036,1862758875066717,8476202150238949,8367028616686747,4804195955179327,2471359141118306,921434713633124,6156731994854,5882577101287484,8780687834071402,4460494831080167,7703966991550789,970548299731313,1063705487393138,7143931951010163,577718000984438,5370090048598392,6263345715323257,8916861616542074,1001658402611582,3266103744266623,8811405031304210,2355723986604420,4386779160940934,429783498013420,8629559043214090,8968316610480118,79820010467729,2353605608544323,4512011822600598,8728186894541207,3885720148468120,7751737068182255,4895860762911132,8733118465779098,4460214058594718,6039019930464673,6734052112280578,9010178626484260,2638797201121700,3839811840586149,8077757826215389,259915219329449,733190169653675,4557914833666477,7799927692877267,5425068247696797,8020452343100285,2275777336246707,6090880821870487,8672872049233374,6890973303771576,7687209803409463,3426982629896634,2443306701902267,692710965006782,3191139799507393,30606150222274,4569496355451331,3493122747486660,1671150109872583,992527305216457,6946057855132106,6438238714491339,4307324431471052,3109807345376674,4785486495797711,7729128043291088,1711422389489059,3377760649080910,910540389188054,1600967391027671,6354977157632472,4059053333938651,7423864268440028,8590680591913159,1346110162976165,5142739254759906,4394810058150371,5441206917505508,5041159266005477,3988911096009190,3167959307502057,1689601628728743,3658139861135853,497719369208302,7536541197185155,1073859174306288,2379696540750322,3058467548307955,4286992284324606,7466843394331126,5779734141443497,4242791943900378,6322538236563962,3058712026825211,3409588212384254,3855394366246997,1535951791772160,6433355667923462,1640538733781511,5103381990089224,7107818115843500,8937875537043978,6035369478207575,7795885183996429,4454592045212175,3314510305526288,1625381777732117,2508490772615702,1943574927569431,2119879373337,3002537997902106,4746061900517916,2807207823964933,9121920570044960,6417207969104248,6062378638879989,2521002441265700,1929418502779429,8264701211206182,1303468589122088,3764579254065244,2478433006141994,5395228548170284,5981301813764656,6499183788198825,5602471010116146,3286928376459827,5211740056592948,8411440484614711,8749277378294328,483725777793593,7397819845022266,4539294995624507,8262659918073666,1179522552013373,6858443432331349,5698308822716991,7753622352501807,2320914541343297,1715126086992451,5462165980266773,7925394549965383,494649910866504,3141740844221001,9035969939248567,7979355738341966,8384330403261197,3184811197608528,4980312586760786,3489114187932244,5968446970209763,1570604252754519,888163702436440,1572509868690191,3123724752527964,697081304969821,705319518638687,6874055918121568,6784155501978209,4165538910179939,978085471375973,8962623658133926,1411449182101243,1308106938819177,8891673305424491,6926812916196056,1094543988544957,1822997918863987,8920036108573330,7973981175886173,9008573996782200,3066921203049083,28445439226493,4508672767132289,8756913110721154,833884798907012,5616487714941718,8483079846081158,5374660316947080,3439299914994314,6836486174522135,7607144690729612,7515963408348610,1702331482866318,2273723124695863,1914357825102482,7902100110161347,2118652105474708,5372755974390422,414966172852888,2868049839805235,6496853332648602,4847181844562587,7671883717621017,1699997489099421,6629062337770142,6992307505205924,734922852512421,5189282221159079,6148863679195915,6916971176690460,2631216085955243,1132039973114541,6368154218631854,6480652568731621,5612720500417200,1081686364803761,8150991485153395,4436969788554014,6428828391572151,4525227698819768,7271977958421177,7648877884605803,9011757649564348,6934493334564298,4663795188716222,8560784959378112,2957892799619777,62784420500162,2641785685880267,2265110226748101,3252311687275207,4493863327498952,6092501202395849,329138263286476,3346967699235533,4139489754190542,6296634227175755,3288715527746257,8951180436118408,6983120939557587,7503289202697902,6665835432350422,7582126663362833,1454068267115224,1966267616150234,8711717197189851,2314174141588188,5814545568240349,6605177033315038,2806826276913887,1956842806993634,4691901195035363,2186283825099493,4665477548917478,3498000366338791,6752626997235971,2717380932920041,5997750176973607,3915262562734828,8231320584642685,6969289906414863,2181348587524849,1286742978831090,6546966687191795,7626393047299794,7247657440644962,5007838656893687,8547624086143956,4801091749016318,2501830614422271,6737704966409869,4525779196326016,8595150422819586,4480674968953605,8886262040862849,3924071726625544,8266850408153830,801670735364878,1449337514013455,8920869647188753,3890584919368466,6457869037768835,5614504726422295,6042841800643352,3402307455988506,6695672228774703,3555000368689948,813241265345309,7124029366919969,6960413705732898,2540069349581604,6611522844914469,2612659403494183,9169802108633217,8962367726655064,4481732297973895,8452985583530928,6588063053456178,6043184950932270,4242113267815901,5537109003102344,4077225008172806,4080678613902131,7136113848091444,7665920163618270,5315291453940534,1742930090251063,2332827951219514,1983668810556219,1018226597421886,5662258718309200,7370851626791746,7210670817293123,7444203310923334,2595196816646982,1397490468983623,1551219612328776,4180991059927881,313295479288651,4576472238576461,5571480173843278,4629782205246264,1846602419385171,8035111084168021,2534804964799321,644803369653595,8309372479341403,3404694703813469,8002120489062544,1782179435828066,638001924166499,3216008212976485,2111656249962641,2623053769065320,6062341779653481,8884792829453162,434682512401259,9119913450570643,2463804303926126,5163020113787709,4255061777077105,4620861144945522,8612390455261009,1342730622713321,7109947514024824,6563269787759484,7741763573030378,6138226439939629,360976818406272,5530531839865729,7620285002552811,4375394838680452,4762824681321349,2290394963004903,3856765799355272,9155684533769343,1575829333848973,5016254340453262,7946071149474703,9073479885190041,9186822027428753,4353512147432338,7612267859420051,320731309253525,6926922284475699,1168533201621913,1955271198122906,5504189721121691,3218830302692252,7684371851432090,3322549001929630,6392809243118449,5901491282674592,8310956850480033,3977192859986946,2234015315608483,622060771758918,851297429541798,1206506044982183,386235662365609,202932550243242,7102109934228396,7234231121145330,4667519667647406,4032075213912221,6859107178080448,2311851765982129,477631426852339,4918775117206455,7188014731226023,1253552477012921,8803572348770225,5196677805654973,2211451915817920,3417343278187457,757236915680194,4989760574896971,636780112999364,147912318964679,6947363181605836,341309406241743,3999277491049424,4081699154597368,5531802691393699,1303522692309972,4868299634506574,6821164887248214,8298700610931605,5673591708260516,3548121230795740,8065847191072250,8192212580074398,5618000341236560,5768038776988645,5184580957266920,8060194926531983,2786151159888722,6308112380986350,6641905567114749,4420719099552752,8766472251860384,7288104219014283,6296300340540405,2879419131274230,8599578118168745,4994352616391150,1098927032112122,23120715387899,6570928988374013,7110727234847743,2830512751989760,2864777510022081,2239094011720707,1286423731504133,8240849771334721,3924100596282377,1982213221610507,4209257067324428,2354611919737869,6953214029386766,3318237018309650,5008078833456643,7810919021151252,965759787185175,7565378871907352,9172760860324889,9051096949205167,992702197449756,1989819603428186,1137651523618309,7294260844745762,4145754869914459,1580749993956390,109300969670833,544955803579433,6936648580714135,9153343472992496,5036748226745390,7870265293944307,6775092073600048,5182602501579825,3107103483061298,3326779376854067,2089811436479540,4253798568399927,6383493280041562,8738063421916217,9093443929517561,228235788989500,6151427390316083,5068752042206271,4528355145806912,6690841849306959,2773933874861579,8778843348558916,3411708187931717,603136182207558,948924325100385,4100904799089737,4491091923240013,7930669669454926,6357946818221135,4331692897178704,8548821574026322,8538855296655337,4848694319727700,4416699191153749,3675892555392980,5716502834720314,7695212612863438,8757185134453849,5978716926532825,857033128547420,1513087826317430,7199759884301408,3707713135445090,3489439064492219,9052297777889247,8801729310004325,8453797513167974,473805929793041,5357831526418620,3380092261659450,4353095351055468,2502127441028205,7258026047730798,2364750281039509,2017479592301681,5670364246426738,1117043415598195,1158100288738422,7175787184850040,2107612436599930,2539902398395515,660220314367100,466052878222461,4449343608685694,2081117049934975,1410929033299073,7329422410196099,193287358375044,8478680559151933,8575592279864454,3952296610896065,1522524663927944,3164368610071689,1013623783134347,1007047449415874,7643825836303503,3194983580628112,517198880539793,968660070786194,5427896726439060,3731077611934870,8769814285137047,3518266848806042,274462256637088,6073003266659491,242507779093669,1886857632703654,4468372421899121,6972690688885929,7231768710306905,9063738681718165,3557723309876397,7179220330439855,2384323585836210,8307896892114099,3161964717597876,8409642600195710,2770557854913719,2617323594101946,3977187557610684,8999177622869714,7597872324109502,5189480617829567,1188208050431168,5134327648740545,396491509703874,8423071955024733,9122094576878103,7146592912714815,7236463076332746,4790461281498315,8949488048346011,6381348990649549,728448984724686,6775369649652944,6793104444548305,8223990268765395,8254622473704660,4600773682959575,8541183354262749,2386522556794078,9154178592006970,6108150575672187,5900534197747924,3428162591192293,2768897285088486,8731876590579110,1436833786488040,3325947723150569,188842096030954,7385414806193387,4732642022831341,1464854758380783,7714079111499907,9034895894574323,272938946266356,5063421919061238,247854190388777,1097423389238521,7460146295092457,334437179397373,3389026060051712,988928008618880,4745061630608642,2535329230883030,607672745141511,8159255851107592,7786948830777842,3375273679324427,5481439428876870,4041240269612302,4699401852560655,3534903564395794,2799747384589187,8751758880651481,188320006776088,3511333689686266,5194272832046362,6392843437503773,6995104114857892,1087313580164383,1265711978349857,6745686235718948,3833086127736102,4692295015732520,1010111665497385,1995343387596075,3992978572727596,3301252191854130,7190334357640494,3267804239881519,8367248649836360,4109785250161969,5226262590309682,5775356159655475,42984796251445,7416222928856375,1944287638159302,8100409363312180,2610537687889210,7459819843903711,3045744414795068,643291289494845,3701119823930686,8508892774180405,3729003790841153,7535713047708996,3914740212245829,2971083314373958,921682697315655,2780415691629897,2853345263904074,5712834870207821,7393953589283980,6232372450481037,6976153716745553,2834351469741394,4629699603068243,6265526013527380,5214362977100686,218523412262457,5811061000205656,7677135331497331,7507674026812762,1060214626645339,5315309915043164,4973929395320157,3233210741654879,8836472681034153,7239280539589210,8881506781204394,5943555569907046,1774040791127399,1710860233532776,1783166304212331,2251777949687317,3157587561362322,1484162795038063,2733711796299120,8479507715398422,796684851255029,1212081194206582,4258603031381368,6788292861832281,7297557940625784,5188618963534741,1175776598037888,4387380741580161,3927757295519106,6160061126465771,4705468202866052,8241906742121863,4900562317518216,8663945509393801,7119605637195146,2951484640716171,564843589592462,233189435643279,6707776904835993,6047399220569489,7593265798724219,8953529075688341,2248217564390807,8191579364810308,4077418871670170,9106538483119516,221180686374301,6484704586745246,7111944514426272,3213064905362613,6033456292864923,8559748433745316,5223370854199241,7032672516785574,4453036770313639,8371256918245049,6902790399415879,6258660517414316,4965841957389741,8429697072870831,102053643122096,2390613703587250,6692894349162739,8582331641263540,3196872348618029,6890324845979063,8436255150147001,3136999431648698,9191407041811359,645319610267069,1740361008154046,7029154131453376,975764952094145,6004601787520450,499119831668299,5408907320776134,8604770521318305,6913604519585224,5483861629269449,7440573767820746,3762248245360076,6443090749019042,6945096063792590,7163887559964677,8749577454161897,4643774989151679,3528169210246614,5645617725498841,1364514763883996,4108276946999546,1193703499781598,650356720968613,8139871999080159,8551827832574779,7743001483867618,3384343722210787,7806060486435750,6871874957768166,8637427094971879,8966430896884101,129570210911721,2823448175850407,6313202321970668,8800793035665435,6097250945536253,1446597053302258,3548112867886579,8035961443893502,1004594335741430,2175595157154729,1095802004887032,8198573094778361,3875213801338363,6740508315284988,3245338315462141,9134633947313665,3158893303993859,8664072882378244,3491574998156805,6979229301585414,7101042025326849,2657053109708297,4745603586004491,5902101617468940,7977900617242125,7123089388369422,1947201628280336,3130006293923345,1094505515075091,7509695242945454,3296449630082649,2630660985927193,6809923609499162,6350696987342363,3792598002132509,7575188965983775,2676077401865136,8531370381776418,9011914982688292,83101114517029,7963090375898663,3863847325496873,3032789046502954,4707145460024875,5850621425975252,4737359799203373,7344666343831088,1278850981090865,7045470962727859,6390987310155316,8395139710793269,9216686018486231,3567390892074553,8958567681889887,4973955965081150,780206595331648,3240179861767746,3959606174807619,4025041062331376,5917615354566241,3307353028838984,1501618269668279,4225314745529932,8881853652801101,397006561455825,5075151181466552,3370603048560211,4848866641700439,791512178431576,3406303390758489,6945576551540314,8329287959247119,2528997897487964,4154747375228511,3709469060974176,4367511645189729,4641840851400291,6533775313059532,2380182725531239,2372804799281703,1979153100293738,9041769744617744,6047279538891709,5480823989671539,859936250259061,82451586254455,2062753520674426,4978436821378683,8214641191627455,3891393417692798,4127774964328063,6159687883389888,5372331448153730,3500494287218309,1075315735374785,2239755554672236,4836741785179786,9094189779173926,3961780426434188,8593311672443842,6552959002837218,1394691124184723,6957517720037013,1138879572678294,8987409301819529,5334709797209754,9130516025689711,7156073517512660,2806002083053850,5080204424693406,8214635875415711,888679139817122,1414943712016037,2004767123412649,1405217163129626,1035551476078251,3580472388535982,8329142019984328,7999192723973747,5080762386848647,1327203081729717,3273726433986230,4512101771093687,6151739445786296,5710638277990073,6002251494127290,1054600683296443,2579404867843772,9185225753433789,5648877308307134,5161720165469813,1997350347474624,5911964412563744,7826172994358219,6166226906265284,5521460012400246,2965913413441222,5622597169096391,6287876394505928,210783225284297,2763408337000138,7379744983758539,7133556574750559,6015869571708623,2887730086920683,2290802752054993,3901736913327826,8412098649588003,9206047981264600,7324198938711857,5242697689642713,2045029514893020,2894017917122271,2562144347883232,6037526838469584,1132584525608676,126751543326440,8287882846664075,2978727430575854,7314956516238965,5757964984407792,7189232341405992,83855711991538,9143838555627724,4442910736226800,3182381573392119,7596975365882836,5374022004672250,5159505386559103,602293645412092,5284595192379133,145689439049470,3730231655921407,202684486113028,2683198501205765,8803146184409949,8878566924498698,5427485954178007,6721738582954802,147018138852994,6697009559140111,599155559503632,8817236783501808,7844972847661358,812875044501270,5872727738033943,1982488959420185,1714761919010586,5168684415276827,8124889703486973,4687375957423903,4641800043796257,7232858721257250,1787239709382435,8368208053914415,1740007433705254,8058260611133745,4392005689677608,1072944163530537,5329347961222954,1775951659312939,6890346257205017,6502415559079725,8360217143499741,2542320713000753,8874826445101363,5591386600306485,4509665078720310,1734033267074697,7485262899058488,3217371113047867,7230294731714186,4978597606254398,9204064322864965,5229457482639174,6311833005902817,3193200184543048,2563899532441419,924113350269922,650565631778445,6355741980475556,6998051581093713,8174276945930066,5416329996158803,802232140466005,3523541043062614,2046903327371577,3282443805882200,7380472723842906,6194630209742683,5918335695182170,3105857821546810,4489694345922398,3214477395322719,1967799050704736,1327548955868991,2252085353981795,2724312925050724,5566866721720166,8570487975196252,1323301917615999,9059408563957384,8836008302357479,6275356656813932,6751031196923761,2900666858665842,1853659884897939,7081653731334006,6025924941719416,8895076100396922,8758326997198715,2810878759741309,4620528030685055,3180336694589313,1926543054727042,8678091341391747,7719326723278724,8808140036937605,4336326130485126,5772770150733900,4419455232579464,5520261768002540,5599168699240576,6508437311516311,699439827298189,8055201652135822,7072840507093997,3942505879504784,4373584399367097,3391074348847600,2435171092146067,8978896295828,1572564936214422,7277149798414233,3762342371727258,9069421425652719,3587319255930780,5702793378326429,1446761333991326,4776011913578399,5867517401869331,84172488881136,3604822751102882,4973267066865571,2676012104976292,5290294770067365,4923734880536486,7252404723964814,4031519613434770,1969759907854252,1059085490648733,6449043289020337,7629277741128691,4650432865281972,6243277196600990,6744432022730679,8802155179513784,7944683688700916,2903643981187004,7972129068906429,6725118610675646,7474710985085941,592766924507073,8168052485751566,188002705577923,6610675618921462,7400561137371078,3280953936984007,8265660987037641,8888178313192439,6536249079498701,8411016067938254,8266023680965529,9098717341190097,4003855352428500,7666584136155470,9192502019168552,3541391979367641,8586401792186331,5046208559507420,3649745430673373,7813594139187170,4981807409800187,5117539252965980,1757882250426343,3265429037877224,7386453217638380,3710860384675821,5942391331723248,8693837386303059,2203321244882931,7779947939477148,5424880962250741,4734699975153654,6457234571974649,6502420420488191,2282679059625642,6768617549784003,8474111948396885,5571342027995136,957168650261504,2399486495062018,2127920026396675,7814341599467524,3634805831256069,2806874662049799,8123401928655513,8382484892933804,1272265612497239,4995274298628108,3428096314554381,1665932365342735,2155312688920592,5294915095705618,6491717918540803,1168903139381159,984870649985046,2842351291602968,865736169982980,5271837746935834,1977564815716015,5400644734461980,5052194098897242,6712738633556506,1969169479481379,6648724021794852,8243083047185414,2106561914185766,739605078173737,390336286226475,4105794822928429,6298868057782318,2744003280273757,8388688845561310,8963721307150385,862347116099634,5875219993483316,1037641195202614,7624548364055561,6082485666854968,7592639263919529,640602453628987,3091336029698108,834491311642686,8789196182929077,4583553035294784,3884037539792961,7606431954434114,1364859059935299,1669206161766469,7279786626371621,132345916766280,5360999741596684,1957779728533579,5164848300046528,11020319385677,6099918732470355,2235643661114653,6490870558734421,5735604321527895,8862154917254818,1798091205154905,1203606227187035,5839901850119183,1585668044675164,1168348955039837,7238265176520799,7661250562885728,7803803689527394,2185347284674659,8361928303852465,7067366720170087,4324521634957416,3637851256842345,614197663115372,6442621949672466,2295285681305711,8693567048052568,1873922342435859,4642336363096181,7745266768541815,6136820596832379,8938668219533806,8278102345534175,8576442168281217,3722168037709955,5929738990627643,4330803753031813,5110358548150407,4769859049121928,1746947436894345,1144050560747659,1847558685481100,1889951248613058,6898244390648846,2801286274279568,3894493901285528,176572472789148,1004086789314717,5635423326083230,5847971394492575,1952128886556832,8916119333828769,5120648587233443,2553371330603172,1355534872209094,4601690052786342,9152026439441856,8511246919997611,8434827736417407,790704356169905,4209178168240307,8815215620667572,5542000566057141,3780951767886007,2087129547692216,6141065368893625,3752964469663930,1491622993386527,4704567792392380,8510664822044362,1114078791661758,2109072363268287,933750492772544,1714029498579137,7716570090723522,1173066989944378,8630558024705805,3933668942686408,5880020819556553,153974093814135,8015388577687756,4142267955275981,5737440067061967,5928043904979320,5440578520604892,397099427805398,8446139897608407,7225490099473480,1696259623422169,8455583553550959,4438827868801244,4675093560719583,2892597459106016,5697364092264144,394592133408994,3352166088431845,3929463639226599,6646793923131625,1433401016338667,666258620229868,2667429336586477,6117299089758446,1885857263933681,4821812572621042,2264100687847123,7377288532003063,2342014387349753,1488268499728634,7454634398513404,6230602111133489,5461219749295627,3509764549142785,47386719451394,5489214071347459,887886392760580,3121743219202310,7551392998693127,1831980845125335,3397176192420108,2406594087147790,8325283412114477,644751729510672,5156411432458513,4172475093682450,2402233874241812,2541719868508437,2266696620370199,6122730063038744,2738854567819545,4403176448477467,1897943731640604,2414345512646497,5012669710970297,7391392474310947,131969598863652,6444508974848293,1631828798544166,5816646969283071,5290070898185948,8633082691864876,5064682451523775,8065119276230958,5629746094956253,8634244961982856,6664050646894898,8593297160907059,1671419534018868,7497533351881013,3049646556535094,6141805372985737,2718040985647416,3819188579395897,1276657616472378,4007364460349151,3537840334928188,8279561841812393,7938046998817088,6306414624594242,7688383244269891,6392933299136837,2700427060959558,8936004325172233,6672476788601911,7609398833310028,8734771909887395,8090115287034190,3689666155694415,3101762691393872,454638093003089,5187383950555780,8305000640404985,9030735138261332,5121225256393045,1612632384080214,3904548786420056,8656391229716825,2858518584306010,985008678570332,4168814889101662,774332020829925,6757380415945104,5531028120766818,3689386313431395,6852691150940561,2129793286334825,5455554664598599,6305938052839788,7709174679675429,1504355102853487,7625605665154792,2402654009641331,3967314357574007,1766168526461305,4993092964649339,7103602617753322,2470182741281633,8480195520530613,7286829495605634,8863823627393541,5826525533694340,8510167880872342,2022480493402502,6464472301459847,8203353465162120,7238641077217673,5871218193115531,8057930595107910,8721962796499675,4230048306391440,869395794815377,3628305712011666,756785474771347,4312478111885716,8329462250333934,1673908469049752,3406557645748635,3211302354966940,3488929672001950,5846008343417925,7021591757724951,6231573856758177,8853387268396927,7158265044412837,4119073202522534,3955354614790570,856530632145991,7776690169391532,1048225200915898,201690824153521,7467996845201843,2075649997482420,5496682642780574,7673370736291961,7868738189613496,2412046102575549,1269575647615422,331852391602623,4696568307005888,5616000264436161,4944498580302274,3047571546118595,5351390282394052,2897422616803782,3349358365919690,7155116181035469,5837669153940557,324139136969168,5627212086789390,2535747580232698,5289955968723416,8771419891698138,2082777573083611,5532445215386078,5331763934632415,7846032470852441,7491129312519248,3575625557004027,594787297647076,5614183888791974,5903573198752230,7070140956850663,450954561059304,1093144081947114,6504332374063595,2571673817573868,5045850619832814,626619158194672,9030059255580665,735511358835187,1110275647662580,1140928127191541,438260822374902,5597278828042743,3181272770755064,1472571613579770,3147405182417403,4154956269713916,8029246709108281,4064406915766782,1568887976278527,7876863456090625,6835792989035010,638670597261827,2044192579672580,8330624651660374,2025901636004358,7086924634631,8456072371948234,5936528359209481,1540242978400778,6396038302089489,2162975048792589,576766035929614,7599051909934023,4723488307276306,7336113052862996,8635242000661013,6878951748815382,4981778898344471,3687488688945689,7208420405832220,5460285107451653,8151439820224157,7848948449527723,2479397409376805,7957993478056486,1744127970667047,8681703914029593,3461975742519850,999915935087147,6135082454754781,6588632146074157,9184199029230126,2402673454066223,8657549527155934,4420575893785138,1066150809943134,2818116496570422,7950997996566964,6004107270658619,8838443467868597,5729477016779331,1804546088589893,4007990200564294,9160334041000520,1815969036921417,5651630252381282,2055490841520718,265870615043853,894491799202388,8141625831177725,1423834207812183,2526649466190424,4275398481820249,4189359864810074,7553950383602267,5810101167255849,7190195485416030,7753917824507711,8261269437856354,7748899933239908,6427096405695078,8772584100854669,5416381830556266,1657321567062635,242202995382894,6942379207789167,8855718563818096,6683534775241329,1029130704976498,4260363343510132,35088574038462,3306759936080502,7010740355922552,658746058844793,5051785675328123,1014346562062973,7327065580108417,3257196211927682,1032963771316867,3430543432161924,6215709844809494,7275076561076673,5471952866134666,5171816254671499,4892864824896140,3457974294321807,3898402712160912,1760142780922513,3951377689500306,8917025610275475,9114450440907886,5578436734896790,2002845806033559,3345490834684569,8112949403391770,808324744862371,3414419022269092,5561250148252785,6477276074347177,8429423866366634,46421967080107,2774475948047020,7234183702252206,1097063390194352,3968267079277233,2825782738229941,6874321981766326,6690717708169673,8425154058865780,7822794544342899,3352209956620746,6569415006455031,4552055457790656,5919979899828929,94801978673858,1429759644224195,1475503938337476,9033098124735606,4044623925496518,2527440007994055,523794535545545,6195524028140816,7798923880422519,1960610565892814,5154182601884109,8451709447241479,5874135661144785,1860501282921171,4577220835801812,9198387187751638,7992675140433812,610733721631455,6013405659927571,3538524688247522,8903831192877795,7328102178740964,2612059279809253,3746733204615623,719222021675751,6308291697507049,2517878627511019,3322381582973676,8795143846992338,6988834769833085,3182199482551025,4430572783422197,6566136231586550,6191751289390889,967751945005816,7609719625779962,7644581498479743,3404829880523519,3354193999817473,7654359698004740,4321947376032517,3103569223207686,6301769542601479,8926846451306609,6858527888399659,1559078318846423,8074602667019020,3147336974240525,2626705720990479,4498154663193361,5058033702972178,1137471954074387,398488891882262,1849149641032334,5367739909394130,7588455936398468,7818793562601364,4772434221353755,4325935111195422,7374808518642464,4928772412344795,4839553550031652,8794112709733510,8121861635147210,4882351496882983,8046094334450963,5326776656300842,8292379651374215,56150330219310,3851451658697519,684121277330568,8630161799348217,5532736074820404,7150557666367966,3892263096998711,3858229711407928,6104164151885620,3000495778134842,427932496612155,6904758562343740,3879473173531453,9104936485626786,828357591075648,5278769085457547,3261909030251332,3707554817059653,6395949167692614,7594202144136008,6722260899606884,1017041505815370,2231812040152887,5983330922761036,7015611573553997,936651462040398,7047168781622413,2550759224429392,8240506237844305,3488707741141842,4763910963295843,5635916503960404,9190249824488280,1535759823027033,1732705419316058,1219391547874139,4776080256605020,5976343316945757,8673922464367077,692570399112033,5538149908766762,8734045310057318,2810076250303336,7868501523614569,646546252639082,3921153347103595,4982730802948972,7260529154042733,1777179138251633,18705224125298,6258083840617331,7756410809523060,982857112185719,7170729235285140,4490692214651771,5590187807660924,6421969003387773,757248757119871,9113429807169344,6871029264299060,1530837027609475,7093654336847271,7498510642862982,1236595852553095,6976835691782332,5027089262237873,5239522621255171,1873321036434317,4743546939562894,6894869675352557,7465661286800272,758193101134737,1438598121020306,7325852880451407,4933629701528469,2569139425282967,7292009503493017,9109863801559963,2128122704829342,5717021537180575,595739803024289,4199546795801683,3664356572183459,2299289816059718,3941337217899431,7879928846099341,4461643698101161,5030249877293994,8337630143512219,6901436172194290,5007884733248410,7424536548064413,1051699196226480,8015716952123208,9127355871405295,6631215722897907,4644350975110068,1893897546644408,528959771048436,6873816477789114,5927712616606879,5493598763297724,742054479379389,8114648105675253,4990129199487936,4920467291327425,7060241794513859,4004003131214326,941083056667590,7314721845640353,380205504109512,7152449129200586,6290234165463543,8040069562575820,7608114142059469,8951226783955921,6149044202646751,2239203233287123,8625444515752917,6158923047082966,3603598772562903,6883200656615105,5813832066588986,6807447181351900,1914485995506653,511311629044702,3126590105455583,4210122656763728,2172591800794082,7003913855334907,6070089096006628,123828715928550,7460663494408017,5288527040490472,4600074556206058,2979579221965803,3523741203438572,96694338157549,6954446198741019,2058204412783601,5009648109829107,1220834221571060,3364121612716542,849690504674294,6684016216755191,5691607807265993,2923279982701563,1493010707450876,6693098487895938,680282204702549,4350796424268802,590951147568299,2073092787723268,4659908072913926,5519882213866503,8993893671154025,3130654754913290,535003865136726,5980803392068622,3431249888294061,4165164793162769,1284885689154578,3160792649645075,2235667820981422,2209680420531222,7326275447499800,1821382874778116,4346916295056411,807447331585052,8755725289242458,3105173803306015,5755297590766624,4197408987237459,6613108205800484,6016327614177116,3390788969179655,8058145792281644,3429200564067373,6503824396749072,5517911039626287,3674367902657586,7956667424784539,1349806104394806,7143841787982345,6643971180817464,7828424068467815,7388676154558600,6094282508016699,5586658235913383,1763778432863294,2699641852329023,1366085678574656,8190233840198962,2809708619123779,6582831530798148,4642169506958407,3158651876236360,7283593084554313,7421220813861852,6671172255075511,76322355072076,4746519609568333,8821827574021656,8178253955628113,3722010660043859,5240052808940046,2918357622987862,1295384057793623,8893881426562136,6397383399554137,7536226056739930,2269377666280539,4608925150592092,1649483250457693,4213473392139358,1367878702636127,6796971400891106,3971344486488351,5995830028758116,7439147080962013,4717649863056487,6576152482069611,7117422017522194,5527276576259182,4938900326911089,3634550546455666,1357425639107700,8143852110552182,3599596753681527,4048656388639864,5004063025802539,6945620696444026,3671606190799995,435990103420029,1774738821446782,4967956567465089,9090473900494699,5740615586150581,3630254896643205,64286690499718,3421194401832071,8905100871027849,1627063490396695,2781531769277580,6198556246109325,7635835394105197,3455922548935824,8174145115339185,2526007961382034,7255031116913811,8411734644674205,8655734997621909,5384659971673238,6627099999750681,3199338317372570,3212904690654363,3891475284274332,349119703325853,5568389293145247,7172617188609184,1941478533631137,8722120011373731,7682318738877604,5479921239604793,6171929283697831,7748689920511144,1377545850936491,9061102825227027,3555573313076398,6361917349170351,9222524115573747,5782262881886067,4512442768186549,4858887141809335,6314940911796767,3023228314000574,2432343077833920,7308895413871374,5513642684038339,1555803793435844,9047146857909541,3089993176014023,2414635753766089,1518227571666122,3990350902713547,1212334349458637,7060988124671181,5169794614852816,1430505821138129,8889464807238276,6345680451579148,977940479241431,1714519673851097,1885013558586586,7209941499174689,6034111857200132,3722130686516447,8195207082794844,4552699709299941,6809642946587879,2548362470505705,1209328670841383,6665553274981568,8516629206036151,6965485588028654,6255040972590973,5617261374844145,3015938238786802,1924788549225716,3716614696328437,3374875159231735,7224037517583520,3871678465375482,3379287663504635,445552535121150,144428758863104,1017620116827394,3604956001311404,8646309811182831,7949918988180744,6740273608262188,431082907946250,2487456072856791,4969538615733516,1619621435276557,1496994146385166,90831459441935,1719640405978384,7223157621572326,7403286150213918,679350150403894,2585903485586649,6382671269698840,3695396241259801,4185317202034970,7588304156166458,8309183215258908,4940215008664861,6473603519614241,3689153747459362,972110745115941,8699537244728372,8571632178956619,282200252693803,2093631318269228,2761560858077746,9163273141903583,8977536809585885,5274167429179272,6590331805150515,6279683041193269,761523188682434,4700479209024826,5474650765958367,5929939469925692,2638283732299069,6531135711599936,9035204267222062,136283672718660,3399761970064709,8929685382418028,4786743027739975,2740023119015240,8937435889585869,54427143753038,7020314224880976,4641453755632981,366383376371030,1489932789149015,8931340347524324,7773738179411292,1143681447398629,9027598983071632,14820177059170,2923270886206819,4211509029328785,8961331789401448,8254295599107434,8722347089007459,5832450244611440,6844486714346866,7431382298570099,1917565169667444,5059254041259381,904871571578230,1514933594354921,3052166953741689,8227898676310434,3744954309819772,4508411903169770,8849662768209813,1302613307256194,8587172198814955,963431847189896,743596979744138,4077380680691083,4576798641364364,4019792711363981,6019539336420751,375097571999120,6418667041742744,5325537196418870,7347989254286574,2340899670367638,313910687518104,7723352376262041,7581463398073583,7747409854201244,7514899923421082,1241560646581662,8014535679736389,4789002585435552,3118565509004706,2684528952507811,2553249942519204,1772813248056741,5874712262090150,969980076621223,3171785835388328,2170472932960156,7407608172066458,4101156448451826,5640333595418034,1481911513152947,4893817325796790,1641612960539892,5692917492594824,5190383025084319,6813095250337212,4701645889834429,533833799413182,3887090047634677,8718649225743808,1933718880411075,7629930928434628,5409037183921606,2687816180747722,65721123007735,8295232145092401,7567677542943739,5388813327961553,4403818302500306,6472376373411747,360054297857492,2055835598859733,5723461902847244,677624800525783,3364358744403417,4436246968798683,7423627024424413,6419962922052612,7210829752794879,1856802254032352,1438381635419617,6844051167071714,3822436533976548,5209238401072613,4509299971915239,3628663334366696,3288697951833577,1474356690976234,634646462991851,4212630335229282,4767433124040174,8633250832281073,2454386697952754,7922743014126482,6681552372719097,3789171650835527,6741708874509819,1023180294327805,3554456367939072,8902127273139713,8032431574908418,4607379709214211,3604647234911748,1375898221145605,3639150457148673,8275179105177145,7545707728877127,7936608817851915,4612458514353676,2670399984393742,6152285899496975,3880706931006992,526963621630552,8668049324190556,3265096494878229,2917637407985174,7389701533117976,7468839056416283,4263618030972444,6143197469505215,333547362487838,5021911240848645,2323269585296929,7130034789506595,5929478155685412,4679200365956646,467753722167217,1239615480827432,3558386383064617,7358693253540683,5237908936015403,7752597978120114,4900963039768112,2231094375292466,4930249950154291,3257155732201012,1135644572335670,1736620944141880,4190751731232313,3550158462770746,3248347345063483,7474104512896572,4604106741722685,1532609536126527,6686487674978323,555487427153474,1899901071011395,7432019845422660,3092781508640326,7712694005112391,70199045025353,5795667214253642,7650830815913911,5001160085409037,2188014603759185,4612726370872916,3561395140912398,1071956361756246,4689017158499927,5426087131549272,77050392989273,5396462493392475,3164069954120976,1033435404607075,4371527062597223,5235130199207528,3211187700850620,6683051122340666,4828448461254252,6344788847352487,2422587975552622,6920423884676719,1568113631665777,2103587068309107,1144776854998645,2746333334998646,7776116805820023,8089218091212408,823598459469434,9143420513103807,8932172390238826,3218148933000832,3051401185635970,7425408867753267,4723864197975686,2351252265352839,7430891212328584,1355514573794954,5893646983851287,5523797873385100,289491659198093,1061400003735182,1670186695208591,6127291739276568,3428949051035285,8025438470419650,1285020072242839,4559486658547353,825306487594651,8104049014984348,8229147811167514,6892867993431713,8221210625126050,934130044001956,2255312465870790,5963659552349865,8628063205572266,8951256296624071,2007121764990636,1531031355599474,2770046869016239,1308901341036208,3291601860956104,4277335625461429,6935927144197814,2721000529469111,7406059362782202,714906608414393,8462386636459706,6722247116848829,864043315118734,2976954303176385,9375294873282,1676731403022021,5657749788057290,972450505080524,6543106424435773,8684150044661709,105652412870352,4257659405831889,2608080116195026,2200854845488851,5290228051490307,8889907760324558,4517372940984023,8000360626247817,8485004435445028,5804282130132698,3528362443250091,5665378297739153,1513440274050783,5649716834107104,112249294003937,6385786165761362,4789848280133347,4994700629892836,3749213178109669,3230215521591015,4317421031460585,3646884094426382,551666682543851,915129471622892,7391177177968365,2366789522378478,8257909612706429,8564210872389692,2528938887507697,3506527161261810,4264820101566196,75910947122937,6219898239954682,542507630784251,2335634456489727,9031722761404162,4856595522984518,4187071197970180,3507596449983911,4771377521032966,1654275826016007,8253165486812936,2941872969563915,3543091273477901,5894042679545614,1563787299040557,9190890407204404,8416855751517486,815663694218169,1592501563891479,8916097563306226,1449338144857881,172778189442844,7282346328246917,8895906285320459,3242972530929441,8980296905105188,8847810540168678,8977359423950636,3271861845761837,5562475353748118,818924368076591,2490406895238960,4517891214602033,6378895416304947,928410725744436,9127907818547387,4977539820404534,6398320889974584,7271421425950521,2738825186234171,8295514711356970,4691100272959295,1526467405733696,6417041270673218,7442071928667972,903949135597382,1158007337815881,3304096434179914,5215828315795275,8831195265841122,2116314138496846,4322251740704591,4640628345253712,9074717746405201,1197923290812243,4947909637628558,3130960301036567,8555796048802302,3063458291498201,3827681251631158,4968228793073500,271255134433119,8467678653736988,3512906669592418,8482341671916009,2505768433803110,4353059275829905,6945303444922968,7342031620089148,3171797125521259,3702798770539955,4987751656568125,6216731320631152,402512830842856,4533434523869042,3283448668422003,7239151662180166,8053177217564534,2695415156096887,2311734703489684,8717729817919354,4765465901932411,8242258358271007,4501655036538749,4501879600095102,8703006612848511,7386867291052897,7302205533405057,8301207017553795,1682152232664965,8014595617116040,8349571881081311,4900993959653258,1353980370590359,8641617863506217,6251290341117845,2963753388240790,5782749718344259,164816390852504,1973864224702362,8399997920014235,2135549406703517,5014113446812997,2224055702306720,8567136258187170,3568330172620021,3882033065467812,1564594096705446,786284059148199,8536760976528028,5804880647110570,5418629454340012,7926363909494523,7926142920929198,3357653753606064,2826746452254024,2562802203152306,8314136625952130,7064739193565481,7915422014158153,2218751990132665,5844843842113466,900113423298491,3980829024187392,3690518979761482,501204533546943,8763613820293059,6273355050607860,2577462450479046,7318314351714856,4015740922712008,3634421329100745,2250964223336396,8277395983658958,3500579574992849,5463365601091538,47191442776020,7643651983408462,3684563639836630,4774691684388823,8020102277753928,7476714938284708,7207072304623578,5658407774052316,3046424189845469,6404571336266967,8704077329932210,6460210617847777,1853181839855587,6403421815172032,2095209633230821,4367580588302311,284374969815017,7975614528619859,5565850193957543,5635786309137746,6165046596521969,7755764591627192,8261699150152361,1922294584205304,7237289737012564,457923043164159,566584227299326,476191212535125],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/da939f28327bdd52576eec2c516a9ad3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/fungi/GCA_000976605.2/GCA_000976605.2_Sc_YJM990_v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP004441.1 Saccharomyces cerevisiae YJM990 chromosome I genomic sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,92,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"da939f28327bdd52576eec2c516a9ad3\",\"mins\":[7492237651419137,5985899399905282,5695243620727467,7650131507052548,7430243544511830,3676502340993030,1512611683565575,1368981404172297,9208390434178371,3753168693486935,8734988846424079,7486566250894680,3842557726244882,2997983607054355,1818735052480532,3813774262971054,2624465969487894,3673670541272409,1391284292939780,1209507403737775,6088140228599836,2194338384912413,561125043814430,5014233509888033,545649515691351,8944044096471076,1508915906560037,3138332743203505,5021210187358248,8285480763657584,8997300899495943,6290784660585138,7171012497326128,1954240766836786,7592554827726899,4085819027054644,894403841843254,5731227614617656,1589118595219515,7492973703048830,8268342434917805,1937472824713279,3325163954602049,1026676708638787,8378635561438827,232294767738949,2264262613524550,3565108941455431,1061118914355272,4509104035893260,5830005223260236,2137274184171599,7772739613451649,3026433687453777,5192281089075925,8014682612121683,8174393644816083,7379011446841429,2930440507965526,7596190132857529,5928321941741659,6690405272080843,2861624405074015,4327760650403936,3963671415791716,7739632178402662,1740344224628841,3405163376582762,6956931249246855,693383712989293,1303256410128494,3555921513922671,1432904037113968,121989129199730,4207519383969811,7950744278895446,6812694667862133,8608167686807670,2435991952089207,148626584518777,4449677651787898,7052653212590203,9060898953773180,8357581277230442,961717612413054,8444868657512577,5508808984723587,3455335957848196,1525497154997215,5010344087265417,3947948746970477,860138556997776,2138582661275793,8511241375580309,4051946824966169,3292128172712088,202359817822363,7434597676499101,5265079225369587,5198707529711776,217571545964705,183727525314722,920248873238692,7719864570768402,2918484347497,7784482461601367,3576527994257580,6431183251361333,8383624451883905,1978579566051503,1052657746256048,1246514615566513,6199887831507124,3930373031723189,2750907244937399,3500452135837881,5851456742817979,8514081670643900,6496888032496330,3143849477103807,916637810180291,6793870468841669,3014147380404422,6983482835919047,559757232799946,3015364087668940,1890995794206929,7750051925291043,1405668384522452,680354650284247,862291356451036,6135723295949025,1992280781463778,8244177043194083,5146279941447908,4246859250475238,5006467820118252,6179924695146735,4018786910896369,9113810532869513,1901825483761917,5603362229993716,7994206622734313,2531886383415544,4083304694980858,1326614097158395,4534236553380093,185915791081727,4302885234229504,5161753059262721,8680443333460226,7022268785070123,4386875435507973,5225373280878855,2610519938859276,8755179778659714,8512749107609645,2328317740859667,6591485627982100,3645069236076822,6659678826127639,7420537991143704,392614636708121,8171319756292378,3040476539379997,2155802589241631,5776545224474913,7704845430411750,916562478661923,6089339481514277,770859272151334,2324634126483752,9110944847937833,4922911236055338,8064376800764205,3522838255045341,8875812622475568,4935971014943026,8734474715398836,4208467049578805,3427605946179894,8410761282618761,5937508321189940,9157211174027581,5217632044458302,8290481172406594,6345846284640580,6324222019141686,1661292211913031,3322659676717384,7015216794894665,719906311438668,9135739600044365,7625836874719288,6576303385691129,2013008274923860,4621856733558158,7385892848091478,8566860649355661,4827162655220059,1721575327424860,7880625124817637,8194253333397856,763182650581346,9217534546982142,3798349601915236,4797285603674854,8358055268344170,1450905620849003,129423268479340,185598574149997,2431951575040366,6071064037884271,5311224648114544,5701717440871352,4815370388136308,5612704314679669,2610998723002742,2549240388952441,2452292351115643,7275406840962394,2475122935456126,5988599098212735,1476174392648065,6996503445324162,1308625765515651,3977561505046916,1865660288295301,516123358445961,2047030224200074,1732983800013196,4810338246418829,7543328828148461,4035485134578068,686116594162414,7380520197300633,3934037496611226,3892453193736604,6625465589793634,5226579856646558,3197654295879749,2034320045506983,6465574984999336,3970771039027625,155191385563563,8797167380636077,6954511880602030,6707447834812847,3010675217973680,5971770974423717,7946631867613618,369934144527091,5454261102518708,7666393316106677,3549825875977048,3544237958857147,2338690888073660,3723696335668391,5543825394106814,2496231026811329,8406758891704395,8228204022686148,5918221583204805,3115687155196363,117367556751822,8050235597263,3842848319578576,704743255146962,8524238534181331,9141762114450246,4612782841700822,5398981346681303,4246993669628376,2470630350086617,8036200190771674,4850984842068443,3296764073492956,8390295333890810,6160350695293406,7564428620136927,2556946565652962,6306862356316643,8407139210592741,5940954563117543,2640270384726508,1908191394054637,7233917655253486,8370093138447101,7721763436788399,6456034572460530,346006813155827,6739761743413748,2832908590825973,4591383605142007,5782529609236984,5474792712036857,7689437077807610,1862785065945855,9206294069608957,6443090419859970,6158300521084331,7566558506246660,2626002639094278,7636200652675841,8797501560521224,6340994240344631,7220214462349835,5814587970576911,69958089196051,3505541008736792,5301186806751769,5894005299806746,8106147266850289,6218367635161515,4281688962597406,6038126761845280,4867757731635746,5818457463726627,4505629178241573,8534586532500902,6282555315984805,884278182363691,881767547830829,5306284620279901,8770818023918795,2996676521583155,5350541531013684,2370170278150709,1370082637619766,7410490093538344,5433930783547960,8460791037604903,3200755512484410,7409952552354364,5607669104255550,7380280293737026,4817156305560134,5129018468569185,114809329853000,7573786822509130,9096742499238470,4127252562158158,8694617107749645,2452403348898390,7040250352681559,872548257948249,9051506329593083,8341101649320719,7097524906345052,5919915277638416,7931706449347927,5784554565248443,403469408363108,4091826437286392,65655291626087,2735710300927420,1363801433555564,345578235742994,681552276677230,669112662336111,6997074115543666,848193635132019,7707997532635764,7449350465806965,5901077986876118,7395062977481865,134067613811321,4640848352051834,3525047019446378,6871916762700565,5771757460906624,6406289905026496,5629533176087170,5619328833061507,5557274278538006,6982843459723910,6089013535122056,6458643643327115,4139755263901805,6253056200770193,1613370162889365,4047516033958550,8270311388834585,8263963181604042,3674888169177753,7797995611404025,8372657045776893,5651902677115551,205643058766496,2077078234006178,1278566294340259,7652690566349476,7084332986802599,846839066698408,5281918420001449,1665938713240234,1464155247583915,6005149408329842,5103864038775581,6108942244487856,3017283892880050,8278156681724019,758129038369460,610347571241653,1334220662473399,4849893259551416,1234322768716475,9217638247265738,1036895654847166,3333589184135871,1832483068084928,8539290187891393,5465746060296899,904636711854788,6282894305845960,7411398335210186,8420533731086455,2049458815345356,4354056291869389,5735633761116878,7587486641488591,2679991591248594,7992646407488212,6858374493993975,1610491781735128,6500321360462554,557520223978203,7501889278837438,3318223559590010,6675130409583328,6765517283279586,6271456828600443,3155313045676774,7840072745861864,2230156607267561,8314351564383571,3792757861425901,5031963236958958,6234048795427571,5138725245838070,7212662661284599,770752704357113,2002730833306370,8604806213319860,7038245685191428,5844363109786377,7033804946102479,347415711408912,2633054430634770,848125877609237,8011307282817156,2995735273825051,609787602264865,464507220788003,6651735079000357,2770972370821927,4405371960148776,1231027692167981,5271059008291630,1049978576601906,1468601058274099,3064036523131700,2274198120751925,8374845857841974,9193067584619319,3733574844597049,2624083947560297,4095884172837696,7829825435641408,9017323031547759,449094555722564,3136862024287046,1457135609914183,3781627708965704,8066082512437685,7548421569385972,2868931045991246,7128710768689999,1503503967208272,7381801411150673,6741221683741522,5732783364735827,6873985862746964,7494605844243285,4379178994869078,7996691678135127,4349787839062872,781540710875995,8274730306511708,8682251319010141,75379588408160,5386412056929122,5881866753948475,7843052117664612,1733210527466982,8904889376310123,3630613435401068,7950184811397997,475915013415790,8056690859363949,8616801701716848,6384148668412051,5058061065233269,8821045763326843,8989989363687609,7353772711294442,7341978249560958,4198865987995505,8098065842592023,5715226575307649,8729508162397060,3206976221291397,1694487765607302,2787294327661447,7606216129528715,8943038251838274,2229570718090126,2585455160288144,4776206600692625,4132647800341394,846750660395924,4895839472927637,5744419245761430,7600179964721988,2089068589974426,7973212309272047,6852801460708253,8611883703114565,3199924874953633,6443449802866247,846904957612187,4721837381419940,6649314033214373,5020954300539815,4030392243626920,4303539328811945,7773395378660267,7026027038914181,8528344099586990,5259966006199215,1421384300446642,2610100801684403,2022950247031732,1862881676043189,1304377900319672,3337990718227385,2796856093418426,4701361357587387,7812782846678622,1748539196597749,4842935868597184,2945955713508289,4707785349972930,2629661555440459,8860594975900613,755050489463750,4361510832464842,5672827022442658,2118946920172365,192948156040144,303333715691000,4344184410596307,2254424437285844,7796578114722638,2550031001658873,5222216950293464,4006441070461092,7162885833868814,134322602453839,868169600771037,3874417737868254,6669552643099456,8030318352778209,9156278224176099,8779785864491174,933793492034537,797177971475434,5067608575443947,3680507667325932,4510682211083246,3699218111775727,2971383647831024,8094405851137009,5868406768976882,2363149957589843,6083207043777524,5525854516749303,3684650565280761,2265295591039994,6183758775342296,1820119402767357,2463909784093694,5862368037348353,2536315657896963,7722763076037462,2654071240147974,7715189236442119,8232799442773000,8077926474870956,8275349641943723,4238191644058637,4491248718930958,466406033589263,149798248031251,6264487017268244,6530536638858261,8764471368942616,1934789421606404,1832428351972378,7267552826450974,2015078832882719,6987671186145456,1629397313610788,1854174217765926,8515568477361574,3019827642237992,4290425631130665,835802040067114,6894042184734215,2488626595873836,3859330973926445,4884486544081968,8693409073153073,8450666278241331,4363193410184244,2361429896266805,4979773882131510,6451273241404033,7144347863805242,3330799910765629,7092513900429493,4555064155448384,8288369228792900,6931491840787526,9127078820332619,7970494811415628,5198307258467410,6745569406002261,8363199173583033,1012883198010456,383972143442788,2144884820083804,4762669881430202,1841929194194019,8381024984417380,780903387243621,560934875186278,7698050502919271,1446566094965607,278167467181165,7454695770612389,5199913434596464,5107261048947828,4012370433434741,8968261958042742,3532017620567159,5633551476051448,1862736794666107,2767175942161533,5708367199765630,5269435999798399,5276145414489217,3642949228422276,2577771614676103,7977894244336777,3868535798801546,7137355223961191,165817932350604,1445213076276365,8823152772783301,6411755815825603,7142659012099637,7567506315593241,13105238877336,8437024990064836,9147953609149169,176190003176604,8258071509697696,603502375085218,4314778936812707,8151990898884806,1486784145976743,254743818192039,548867486491816,8359072178800156,780285408674986,7639360274482347,5233211201553580,4954687619974317,1108301598057646,2584029773710511,7591327344968881,3694012024981985,5416918671163432,5500094812234937,3699439752488123,6624563890414780,625968174556350,1434485820531903,5404373059986626,8862139506132164,6059004826964601,6263089617429705,6887971495828769,5524979651454158,9130640761783304,942262206309587,6167651680781527,5290694975947993,3158953446434014,9093678195549682,2507995816076513,1556827159545428,8027591523206645,2701621540094062,3221567297692911,7917642660182248,5157602742199539,6101016746376062,1623942080087286,4476769681196279,1403782302377208,3804773212168404,3367913522038010,7303202750929791,4285127613777150,208583043290667,1746848868959494,7413894256731399,6198826961609992,7608641730413833,1407425008305418,5689025412190423,7463670796813581,6151187398854189,290046036055521,3771004857132310,4044296974468375,9201520225494296,6874271624153211,3989815539942682,1297047602545947,7621727186863391,4786380351169824,3796200136926498,4447778811045158,869313979344168,816959570075868,9203674322347307,1010448614229292,6274084562404654,4440020328342831,5852850241346051,8817516695537251,8646962622838323,1034539497465140,325204980671797,6001538937365817,8404262643467581,2796388295517502,7835235335823379,8663000874199101,3518222007862594,9207799658261387,3143946390734151,3675545454118221,7734103256234893,56350735038409,3769226552984915,287567222080853,6234080575202442,1934895340906041,4138434150720857,1064159485527386,2597268543530331,3503654729164124,7092731508442464,7184819823215973,6813085790741863,1756331275461992,2163838968448361,3259712292529520,6677063998514546,2481019625690686,818511300683126,6531062739667860,7138471790241146,8876311546348743,1800443404860309,3129691495916929,3661379946046851,7708947668102038,3570295290185281,5712547879420140,821957721900426,4678670921418124,8677150673716621,2563836915727257,4073573858125209,7019894183181139,5571428314539419,997008827942300,2667530137893786,7072882411971998,8352823665076568,2121142914655649,8787785337677218,5571897962603939,6081212706727332,3780315497506213,8497238899025322,5561519184832072,4191314492535027,1154418310716318,7821007672878521,9156079142774481,2913119467709883,454953660925373,848392584751773,475217837794754,6963936145180235,6071834040109478,8905463285876169,8528016794045844,7793772569339341,8681124196021837,6808091998946768,5117067982491896,1781367420069331,859003004077524,1778230032397553,8468711359137238,3367091422729499,4898460020233807,4149722043863955,6803445791393245,8691436656862686,5181032496932319,4462797266806246,7370626943903971,2142174251517416,4632305619477994,2546627924714987,7884093762700780,8217448204355053,5906784482305518,7019002806862077,3506181381219455,5673383145334258,7616326524904948,4723942306260469,652908615867305,4331845156595192,508100368041556,5492366855971071,9157366474335740,6516458875954685,5897528831247957,5220009442124032,492931981387266,9077200764451755,3186130361132548,4542809200518661,6365050037708294,8194027698367357,4430384586909194,2040659577570827,517841543464462,8874889410620333,8109868176598544,41409324418578,54704603710996,6865773977003541,5962453887545786,4890575579476228,4485367991371292,632438705821274,3438620037842462,7293232748578335,3897580408464929,8386757730633250,6636682162185819,8202188201839682,4780789375247911,579529748792874,8354314256019615,4586274658551341,4261812537659656,836084524779058,7744425578714718,6288976520300086,7512713982248503,2909282473420344,5023779163522617,2995819932935739,3717572483089984,5168774328690241,5373541196301891,7539859665479236,4730145402234438,5482097701946951,3315632678472,875882472891977,7720014008788554,1798833421182539,6850241425237580,5924270290511233,590882876974673,8153404735907427,5091338552886868,3576901459994197,6047070945150553,6738669424515827,5218709697013339,8879208676419168,9132479930730017,4758059264288354,3968851323528803,6062667128088166,3680452348233318,7863223765799269,6517970650256999,1559792289531504,6402237639639315,225359098586742,6656146777297172,6741118477887098,4148285622060668,4592352829380202,7179174887241705,971102026991233,969070361888386,3833619101968005,1861883595433607,6628483029018248,2791389709805193,2992994268702349,5130690055079566,732933933450896,8676646571700901,3987311764440724,6114915076310678,5245555775381785,7865460818626201,7472230562162330,1570661861172891,2847741195273884,6924292412664773,5563208269358704,5463649557874338,7870900485842595,314829079045797,7600304085321382,4441512224794279,1850005383448232,2984817318938284,964072099194543,5567464050763442,6907490275174003,4869774263215796,6939958346320841,7424706510538424,5309617376911647,7689495348971196,4837690671163070,5479747563177663,7629987610461888,3683730196227780,7616336113707414,467610513278663,1190348603680457,5344670841499938,3349980044748495,7659197557374314,4506717356984020,2320455050495701,7635594137835129,8422983915166467,4577829206599386,7303226988177116,2052348133050077,8651140949001950,2482805915494114,1193016372119267,4351609030115622,2792492607661798,4931393655938001,7013991177848552,6510849380214506,8166047983666923,3468956998321903,3929619233998577,3745395250382579,1151216817096436,6833794917944761,5977697827251961,1857232363595514,948251260684027,2987876761929469,2723923610994430,2438374485599999,2973180550784770,3910091466224345,7893617998333570,5261262081058574,4620292427474704,1049963895790552,8612788547249938,3309461986895635,2339643788633876,7245456480043396,6293850972038935,7504400428558105,6625785219518767,1509258500884254,1845569320126239,5036521085388581,663785810814758,5470752661464871,2112932102620969,4909246994007854,5786058914723835,2014096474957617,5150086528681779,5838252779346910,2252983237510966,177447575373449,1905178491578171,7242694605006653,4523724402870078,801965179496255,9149090040520093,3157679429109569,3607991922497163,6893962885908294,9105564826158920,5179772193826633,7074759648118603,3759738916869620,356247827007310,5419823165228686,3195772763940696,9223074109549540,5789135240624670,5201963162634075,5253736274478940,2458598732679005,6440070709684062,6814040514612197,2610142202333025,1920820938909540,6689671986964326,6821040793053034,4880769596901227,251302220130156,5410100054075246,5688105272734013,2096930562197360,1397496801716081,8131079587773692,2411309127829366,1874673358980983,8245593392064148,2002808862812026,3817294846650237,6929480796964737,314427120745451,5332028762163077,8714083833227142,8665293248753985,6942639051474825,2147715067030103,2616814707484555,1582062282360717,438746386679696,107823864781233,6273745888192405,6315462030256023,6167714665228186,1900198082865051,4617663935317916,1286256484689821,3697127863289758,1269726840309663,4455747603007394,3654441813641126,5980433155344295,4044530625300392,5266193007577001,2833426920253354,8849335506035015,3409208263247788,3359857459677101,1595006716250030,1766891008239535,8464546388402504,430144320579506,8652524396111795,5390230338664094,663223534880696,4901451204757433,5157422643292091,1819905430087614,1225864607844287,7464201559336896,6458720952506016,7631548024697163,7371477327865798,8613014489728967,4800130388214092,1133998552549322,6116316684224459,3747254197643213,2764757001357264,2416337560271864,5470437330618322,310931629819859,7976728662804436,6248799903918852,7666812483577815,4201516613093336,6620219586832350,2858523594901471,643793771603936,1127755675781089,1871515131439074,5742923390420964,7270983698720743,4081687461914600,6781345714374634,6373231696054251,5468019054733294,185940832045041,1000409717090290,4056155663075315,5907399909894132,5003553793353717,1690981711988726,3086317837355000,2775908982319100,2214779142973437,9105809798858750,803408891791362,4790492203673603,3454777857001476,7100765076031494,8703049549391880,6589003278018220,7467244217067530,9148994076777474,7114892241004558,1014109380585487,5402268307957776,7109486256595619,6693110313286659,4875555874580503,148520511670299,5017505412655132,7444020837558304,7911785363875875,183332349331492,5969415820486693,8555952146229286,4276213203150887,2203377801119784,745914865420336,309508126558257,7674527370971186,496623274240051,373298446796852,5196129406797878,5598086305638456,7635482480473780,8166070556552663,4249745920043068,6332006245491960,6489787146364991,5552674820016196,5347424267698485,3957354202687558,712681983641675,8226223635077832,3513182832408393,7097963022232673,8482690354915410,967759972321363,4316110630258772,3849519447222358,4753926079072344,9179669919880890,4088182227421278,437244085440869,2572021467179104,112639551244385,6564612962191460,1299422888836113,192994859488956,5938459503364202,590458367723629,8724468206815342,6517720944336386,1157024771786868,3418305207428798,8111775545138070,4557432686045303,5492992787597435,5076499884755072,2613955039818091,8512778506274948,2856401070238742,2149652543629447,115643688798347,4785257053939852,6012796401625229,13348610009230,9129847968598159,8973620973414544,3080168714569874,8351096759408323,5464367174166678,1562450971764887,405852392917145,9150833446848668,7911544222214302,2225496462415557,5445761764681888,1291732891019425,1181712404351138,4473637330411943,1179620482730151,8554779239689312,4623034690250923,8561153449480449,6957780127000751,4173788041447600,9095834165530472,743463668107442,8103118985847155,702199657105588,6468510468892853,4896182588721334,286579400860020,6956818198546622,8767908939026805,4366804001310914,7498847005919428,1403869218963830,886767417354438,1189458599238689,2287377704904906,1668447090165963,8705175272902816,4614682134284495,855871189174483,2500133554251989,2158835384656249,4660439116130523,7742261399021789,618559013292254,1661245543435301,2854759086565600,3174251631477115,7055415249357028,3997091892988134,3655665259505895,1418499984550124,5477452279539949,9006481961806064,2344000235276529,1697758667183959,82091556628723,8113009747887647,4867128157561214,2711611816020214,5255148178057463,6942752806071514,1500715149052157,5216835374360834,7729966555384067,6092422037383428,7429714308104577,7590706043145260,2375299563022603,3739872539748620,5519617282334740,7455187338299666,2823785152921987,596069655787225,4626924205212036,2917832561503279,1162031742421278,6325496918026527,5465400666663201,6313233200318754,4879755150104283,7489085972745427,2333912079616295,5009525610293544,8153848899938012,5197981518833964,6091888096238816,7003204001351982,5841068501169885,5110218638666032,8843925621460081,8296989141939934,2146845533522230,7481577278884151,6214531209349432,2199223946291513,4709585891240250,2357959293815099,3603261814688060,1875836462840885,774404698409280,3380273181567298,8693514870007126,3169496681359685,8204318262349984,7430425806313186,6901445986650448,600066940881233,9018729501160103,5154209516898643,7239662734123113,4921706612443480,9155592767463823,4430744536721756,1664111906679134,2824195086952801,1960288900811106,8975807580581089,9119381587206795,791983685356024,3746815683023249,4426353603176808,7379489595525482,4268587602078060,7403037335049001,981394035460463,6503060529493945,6063770433427189,1922611615639924,357987158714741,3446720385091958,8822245487238966,5861131244865912,3897428342673007,3477722607896957,7381664262244735,2112794609584513,7802593007683971,4814422005098886,8537568862264385,1607469794539244,1415017706006922,4622076052744587,6280857192204684,7930331109427597,10172399872400,6487429776558481,7764467373361555,6275859913951637,7016516356073878,6299995364190615,4063801425906074,3418081762822555,1747815954460258,3265630035298717,7862374746974622,3768621876087199,5652205360385645,7862304331197510,2701340553824678,7761543145826727,1281627227949480,8204567587245152,8181324692609492,7992212188341621,3161821883566512,8556487266460282,3773326310738355,3467561043685531,2292546862959689,6362508512848314,1994964517218748,6572345275204896,5829234695362293,2534726417484224,3288575986062533,1845480993504331,8955931421706695,4867005280201160,3858810569075788,9183936983090855,3334247006030289,2863814286592466,30858627652686,6787220818163449,1567115300383194,6819953111173597,3158208825682401,7093292788696827,696587533273573,6818850496072169,4171080308066794,3048538584771051,5348601877842414,3754250679429619,3132976875997684,2613556138748405,5684777804162493,4941380749339128,1516904480623097,1823480504289788,4198179482659325,3347879339248126,268020099295743,2831759145912833,656408923785730,4910509400508931,7974707897756164,6882377467750917,4931373355477513,7024658911013390,5421716217129488,6060573405309459,6218482349037187,6305557804378645,6409604398754905,1157121534577176,4911017599617565,5560111563672098,6367852254644773,1180775000517158,8228214531992103,4440216533264936,2073565601533020,3966791644809770,3775167771290155,3263952564832813,307215325260335,6542630634144179,662533055957558,6702538782673463,4900272456895033,2887077674584635,9084822240053820,580711660309054,6536993467420147,3158324047751744,488711025396289,1870550253603394,8114604697782854,1853730211044449,4100778364051194,8681654404018402,2551161712798818,1323657980045902,5873150110960207,4692540500355666,3187855190829652,3903954626589113,5818039320484964,6637942636358234,7601283966659721,3787876448070236,5535360206834269,136090024847967,1682656251013728,9202984166156897,6142501202733666,1747465085012580,8061394646538663,8436303945435461,201959114219964,5513844618253651,4634823584189035,1129221421787757,7826688728794899,6844124974443124,7280641810713205,7549347635833462,5492579727780472,313476517685881,8489724730632826,8401232838781564,4205052961417855,6163810811873922,2048913235643015,6807793897466505,6337475846720138,5901612653958935,6942481261669008,691920751241873,2471098312329875,528876726094486,2453515877157527,2330856485268123,643134559890077,4415334152563359,7075369075620917,8016483896157979,1992801504234149,4631882294569638,4867171411233447,2150512590465706,37505078864555,1675574103567020,4099056928500398,2667463791446703,6589567105306097,5050984464485044,7153592711588534,258020375980727,376212923763828,4664942357108511,3905631515388604,6927170626783937,5818943162130891,2300970225289924,7239200196242117,1720221495121697,339768536322508,2249695338236618,4263318639528653,464449666706126,7121843325667110,384163751037650,7059786898402004,2995891366357717,4961820890172118,2471216307772537,8388383357954776,7645265796434650,5322564495583965,7306001673710302,6254896595984848,175825223584485,3120409946745574,6655152681144937,4753571899976424,8429709232433898,7111442117105095,1595910581717741,6998440153308058,7817210689240189,1999138379188977,7107410383915765,1184057155226358,8251366906833656,3015756035934970,1679668504013563,1471520491899645,793029645216510,3781836335008511,7442749161089792,3040875839382254,1633081434770178,772609087294211,4278220904139524,1865465699388167,8119488482040962,638222365182735,2890662257787622,3058338758093586,1144527907277587,5209027797494548,1016156214029078,5126582816580057,7800937212697732,2291018155838235,9205712417254172,6159053387195835,7786095337434246,5410796597685023,3714371016248099,1916142997146758,5831109119711025,5690603413389788,8753178801236780,2836722952788008,2593840184830767,9132541101579400,3468944191318835,5499499801357108,2457893742119733,3728880506104630,3465980438481719,6611892067134264,5999477469997882,8202357183242719,8178925344124042,8046986661902878,2884964357630784,7137905510405057,2000321835659671,8179270497457974,5386547016356321,1738658516544329,2853941196745549,4160797220285263,6369002297617234,5370263133301587,7773597366471509,6899200829041494,5118970131450711,787133835094872,8367415133954460,3860176921176924,8736851557518173,4379241190509406,9142896207715951,7325032187651899,5490966005910372,5870297121911270,4901256461568871,4727678261054314,3797399891045228,2045658134743919,2757972665404273,4567369646216216,4238859023666041,7923262970038879,863855513504635,5139707600522108,913043376566762,8236906693029644,6913151393155968,5500747784271680,5491857359287005,4559356520196995,8287002126527364,552816782363525,1519439835302790,7300166082748659,369294979678700,997450486131594,6103697646955671,8551421228919692,3756812648421186,2643141825063823,2190805917649808,8892700018803673,6193512445578132,2067338361432981,7114703707900822,6799712404992579,8195106369406055,2067717925464987,6692579149310876,5306244237831069,8179588402485511,3149893458815908,7653579748669254,378042321431462,3214597676911531,5811850368060332,715756587461549,6405793657113518,6941671103081391,4108006960607894,1784864011447221,3080703114628023,140593511836600,2762824310885306,608963548855455,6251567889269237,1525995725900736,4783683900296130,6355359137958852,4471017034181573,5213862416190408,3202957475883977,5203629805289975,7750677510728652,4457174480809122,8810577929350095,3065002570378194,7245691386806777,4268670643661785,2781199097236443,8116376391125500,4292298506161119,5143046787984353,140970576169954,3049040917859299,9004741492751572,3534858314787813,625160918969511,4476333972712433,9099998992542710,8910638554074029,7736360068021418,5312650342640638,7467117713181695,7918600228604928,8030849564552195,8918575552269317,5870825106811910,6409207690251273,330946665229322,2361981776803671,8740045374181890,6582711613640001,601789726788624,2565146643953496,7227749721164818,2157221426777109,2975998706215958,7038649828576279,4291786673466392,7008197948066841,488161773186074,110408466754588,5987123601438554,772708539804703,6460398252616736,2966215408487460,18122845785125,7756115301239417,1903858651327527,3244369344616528,6972164367871017,3634767375060011,6358136008010796,1933289163463858,4578907511311407,6893344132181044,7906272136503817,1088852656770104,2871345406397497,3201535045684283,8309781141515326,2878625069546677,1814537091681345,2132464323251266,1171185221020739,4581712788851780,1577385868774582,2241713677765702,6692741582023751,3041189039418441,2220974494092364,8503833890933837,6435614580812878,601179783105615,610987745938512,9003170566932003,3561288374514190,2111924432784471,5060961402619325,134899784764508,4414117680376926,5933658763458405,3657067988290656,1249646774422625,331011802836066,8116961503403195,6847568305015908,2876973623868659,3439424991013992,7141311031807087,2583303500999792,7969263068212337,3725790273236084,1343141044063350,8268122476760186,654243252907135,3375930893831300,4105343943912582,5493535637834945,1474427536411785,3282480023112842,5176086887984268,3744397766782712,75355495567896,2328051630075075,7597207929576667,5355645685703193,94830212197528,2569089628179609,9180189820677851,8388379606849391,7885812036203767,7700263645951856,4631849113201826,5318811219758247,9121465960197290,8151099687251119,966996357999798,6782039760768183,5669402184928440,1925705506098363,5555447539596490,1722056289881278,8762485154621301,4967970939096257,256077985787075,6455794723712196,5205010679326582,8342573487852742,4704989902384327,1446431152196808,7561765885897932,940924378892151,3165331540618444,6363990486224077,2669000620432589,5285183242521808,5004178599122,5123229703605459,7634044088515790,6319223989578966,1638430505938136,9200146499067374,5172035312397530,2817887911278458,952339050097886,1714032803728608,1498405917285584,3959632518343906,5050635253648612,6733788077001958,3845968415337703,6811443579227368,4442277384776937,4304671131323626,5949717667104187,8467798085204353,6456945951962751,5940389874568437,5761487075798262,3931117249293561,1723000070409466,8823675732978941,8670152238755073,822159938563330,3265717565476099,6604612950469894,3527880787741959,4851612227046665,6949099092503821,8703592129659437,8597161629822224,598683126639889,5846417947430162,5725270226564995,1339162582748440,5211251330944282,1403305863449883,3921146679176476,1624599763021018,2252922625588443,1784957627239716,4632984952245543,9221609943602760,3988186963135787,841807170572850,1692297490722095,1755762155269424,7522952499088689,8212020631792946,7779325480387123,4139766757823561,6686490827787578,3510564301709877,6141858909987534,4343956467576032,7795712732485767,5982153010568417,401921585761609,6066087467691339,3431683237596492,8063192034217186,3777883744652622,3881649303661903,4606375383327288,5603180221730131,3646507529481558,2612980858031448,3336578905599204,7687973636631899,3363788631649632,291526647336289,8861439005148174,2001122481921786,6671598397714789,7600218852553097,1778252622318955,7152488825749891,2326122058386798,7141273714709053,5234293800234352,4885899726245234,108247266119027,2332938083306868,4117845466698302,6836257340173686,3025070090014071,6879209414454648,2096849296182649,5467077567425916,8992768016371976,4957750491139455,814885367352705,7148782443978705,2688952517393643,6706931387698564,7815942678031749,8382788493225350,8591075015167212,1561834134056330,6508015504043404,5999136911273358,7050403160919440,5766043796722243,2244496853282196,3993591027985813,4113081347225497,9022745494176887,4382420280610202,8914659686976925,3787432310795658,796061055135135,5397557505387936,3312382345792929,7905510415371682,5977171725602213,5220772225011110,3498688498617767,1254337410231720,2877266993016233,920965502946730,182208564284845,3894544492367278,5373456546303408,98255925382578,454730661346547,4726349553118644,7086674094034358,1197299198463416,876305211289017,3703274391350715,8961742825110303,7240214498610623,2577805146959296,6398728879263169,5704120298802629,7976443242106311,797108564258248,5508369399311817,3982824634166730,4346098291174859,6634592916088666,8633384320331214,4271998258826704,379661224340946,6623510147502057,6984196047142137,8063547555641252,5078995653455323,8434637206755237,4354637164294736,5987645314117090,5140595610062307,4979410495752102,4119086695673319,7641310416432616,6268483222523369,4732121891515882,2034314667866023,4137280294030830,4882919910288881,5283012667331155,5089232536735221,5333245227366313,450665419869688,7428569195803220,2018757465828858,2110568244042676,3952668772650492,7937744567716053,2060500473581054,3933525042679295,624565654326388,1288001704807938,6389224148315652,7609679861018168,1997293856894473,5278474398216791,5826462765567501,656087733308942,3034828501790223,3413723045424656,4512717154233873,3260851068841219,5858077588928430,7858047719075350,1713114935840279,1546576864759320,6127924247477508,1321489142205979,8315459678809628,7553790490162684,6424595624063953,2501570634837541,1454035394378676,6999070763830826,1545587098799659,5109470450535980,1109516317091762,6852434810883630,8656173966930525,341566663866291,6191628681072180,4344203817128542,1232785217162808,3327663459626556,2497066507701823,7416548965404224,4468652082368065,3631272646864450,6363284715368003,7224357764468295,7794527382392830,1411353594834506,8457833812880972,747992671945269,7070815264589752,4881859239210578,704260094201427,7389304418930261,411992568368726,3600323848261207,4323382973820506,8149886903172367,6919780455820892,2541859715731038,9204965016885767,3806731620806241,1450992108850786,8636527524988859,6025551795380696,5278646167711333,2795756919246438,5820908466740497,7724017536913001,4241415970393707,1438704412949778,6636563282292334,4036618710284221,7979873211033651,4316785660497521,4333313775177333,4320277587676790,3939068533649015,1629147719249529,7650634350972538,1891360596749950,5426104493076098,5959110308114051,3757410210778757,1307942984846982,7909544293107649,7936364688338568,4697533093760652,4618942904544909,3344656210972302,8857982073490297,3111189738286738,3053479284158099,4111254350933652,1733748925465198,3573645813755543,5138186843442841,5462733484175002,5882654439493278,2611503513030303,3877592976592544,7140161637256867,4851201688448676,7197935230455461,3992385928916647,507536740818204,4127231094861483,9072216954220206,9220147453296373,5318642645233331,5336447534345909,9099906260336147,3950654862896823,228377303382348,9215261820788921,3446932529688250,5950041088478909,4075937576636097,129199515315907,6143871713068400,6620219930939080,7035274176081610,8837577237635703,1144600982277838,4705776529379960,428443358621395,211569460088532,5563239498772181,4700462553969273,307936361544996,6862607692951259,4751617043042012,5763557534519005,8318165636198111,4108083793235175,3336843236880089,6167555350867691,7897981141962476,3890356894756592,8695421236932337,8370669322494586,5104882989371123,7901465769225972,6921293962399478,3655088936742648,3407574022688505,5106947637038842,1379285126393599,9024799660519168,2090834940555010,8196327056170283,3788731423929799,1060709288095495,5732575443775242,7298205204596889,539495207161612,4759185013527170,4929065315643151,2813030856327910,560426929884947,1161668455616278,5763609950506776,6472498800938777,2179230945627931,6359032009027356,1772140732665629,4425048672210723,300345994866470,5660000056274727,7349535211701844,2947257740160811,8509606952303922,1243387056402222,4422729446813489,9084039930253106,6354850861854515,7112545115754292,535081789732830,7313694113869623,35750873001784,7431393249597154,4266722685398842,5902288262481887,5637832731307842,8969902406315837,8821632353005374,211428507414336,6163502520186848,2167289596972866,6842964861210435,6502269175279428,6693284430892869,7588852296241273,9216542171192631,2129274754510669,6180876645756750,6994395089465167,2988530371096400,9192921768574264,5668268771946323,4965281541885782,1508523422388060,3586160863506269,4781404022806501,436256187559778,3664489700700003,4331817685798757,6230506958295046,1658655506263912,5393542021263209,5931910122377066,4205949990817643,128193919684463,7608321932418705,432851552595826,2607700352701075,9043993917362037,3110264498483063,2850728663010623,8320414012223357,8299040014546720,4814210050947923,4320727234572950,5349873984089990,759792694684993,7782030915719049,3196918725209994,6406088431292300,8461490382802830,5233997589909391,9017120230756240,5151730426064785,9023682714635587,3942173392146324,2105421957386135,7783529430437793,5939168103550888,8650777516105031,5135155413594028,4262554455629284,3725142694096814,7396609193209776,7491666646341691,8669105575213827,1554553066926003,476200675053493,6340056884178870,8410292803768247,6599449512108038,5583254120003509,5895424083324860,9112298630445840,1983891713068992,6313689283233583,8994383499070795,3831779813904324,6292616691331014,365764802342855,4248143040270281,4937447859523531,6299303641404066,2160041626914769,2642922851905490,1413037298216915,2233391669604308,4359032030760917,5230354501758934,9058742202036183,7136565157482456,8369455047976870,4266189702049759,220429236260832,168321536479203,7289703906592483,7764288474287884,8371791644642641,4799683831345128,864245961641961,2161872339000513,7604321550038257,3467616426315756,6863741382725614,4934592425693169,2365497524432883,5337061483311093,3904618052063222,1517587211055096,8533904186290169,4049443352211450,2045400352051195,8644188407047124,5561695305638570,46068023742462,8300305007131989,3872140978573312,848016730312706,4885245922140843,900712300597252,4052757100040197,5714444713111558,3271259846381575,4977949940502538,2190072000835595,2837535854579724,4854761297818285,5420760444219408,5943023915806739,11760695750676,8270836040232984,2164698719891482,286062312909114,1487739308494877,1272983486803998,761642076016671,791760562425891,6330907249397800,2420420508282921,6605139785299975,7407025221349420,5757106443579438,8744128216594947,8136250424879862,7733414208450610,3102770718347315,2633788861050933,2384907909394487,4075045724049464,8522965937730228,9163889637462075,8957338531016764,7063684461230090,5865737937924051,3593413601570883,7025207289032772,8096921518411848,8020204709613641,5902221326443191,4088572360159308,5170997008642125,4504148118581326,8774248687117155,8215236618604625,3672660020506706,1639043051655251,1586156557283412,8893332833661651,8539861067550810,8556282692134927,4045348029796444,4533127671803997,933897310867550,1870429341241440,2195067966419041,6779545976590434,9069791447549203,8557191224671281,4974906662154346,974656663924843,5558922227183724,8106146027538450,8591137825042544,5593784726704245,5072784077749609,79294598115448,6414256051262664,2302826321715903,908471366692988,5398468613967997,7675116423041150,6570279618572416,7370262375805060,5439668780159112,416557177204873,8583356027859085,6267564336402574,2974707244257423,6079126733566097,9090171152027794,4695096899793043,5732636729602196,5639112611716315,1264698773803163,5479251939954846,3028587133841567,2758496363368608,6492003189628004,6378706029015203,923479549759654,2438584688234664,7820238986999836,4649127557862087,393385335074988,3488654574063789,5530688368201903,1384375526903984,361654634394312,2970932212453554,932893396488371,4210925935915189,6757658606564041,6354187053871288,8293125270278329,3024781507023034,3508122781659324,3192819106427070,1657507786748095,8640955035365568,3415126515708097,380512858845379,6281756269473297,7541175155074913,767358300131527,5740013122328201,6190942899613897,2777932119077066,2123366888549751,5898765516034252,5619172377024546,4098369302188238,2805903487054032,8306859276439761,4114809077141715,3315523404099797,8221174424121558,76138862620025,7720435778326744,8877049435582683,9078905689788637,164916046033121,5289446936170722,6229233523757285,366345005854951,7673213421097192,5927144819665575,2962482424754415,8879104314708208,4509402184626417,3014554014872275,9200037055164661,6048932812091638,1758555130319095,1550804694323448,6113876549300473,1695706304778497,2675434351169795,3453016771645700,7717201555895968,2633476217393414,1658767989853752,2697140644663560,4971099255312654,7854010440166076,3542811089694992,191975913648401,6785222362362131,1593546937676052,5081137076859158,459133414117655,548352035657775,2616001379356956,8360109303517469,726793748238624,8101716096340257,2858547928125730,9112001343808219,4427455952728356,7769719464735013,8798738248837169,8876296691565276,119877272351018,3915619808435591,8549670545975346,3267321262957277,2063837336113456,7329933289402675,7556205321095483,6124571355386170,2339676269325706,514897136914751,5580336676720961,7725746894557835,7506557079908679,5962192706834760,2322379519982988,5065168542986571,5555457440076514,5788219937648975,6947228440758328,6741981876367698,4117590066688341,5222278090237373,8182621222736218,5667712758766991,5992029650661728,3921000597401953,4917894735810915,2006961657803109,6835880540131686,5188406844928360,7380646987464409,2541366393024875,364579779704893,2254967947940208,3705493358686952,6541923913544050,3469727539810676,7264870638711157,3751415915352438,2132543395491220,4905197140152702,7413864447860117,820743379259777,5621276297523588,4006931308417413,3568699194503561,3513573180608906,6548772925730199,6018847646339470,8778262505005805,1386334743122320,2704619170935185,1678402795147669,5597646208733590,1113766913200535,2832378287485341,74280625467806,2248946825887131,512009492492714,5501212973101483,8358816044233132,7975884564282781,7842952874873200,5086828165181874,7061028887981553,8728950533574046,2915175990104505,4338864336531898,5555596192075167,8795639015324432,57971430691265,7864924286513605,2757242382938566,8230791576433095,1976156599038408,369982910034379,496260835660236,274003158880717,7330301635449296,299422204645842,6480993042633174,1948018261094872,4287269420528089,1414609482027482,5139228781736412,5077812552184285,7000953641783774,1429916593959597,1994934300258786,2834348336599524,2136468224774629,2618511620313574,8142612769542631,1275966215533034,4263337409625511,8572185117839389,8355596658285992,1999609474451539,8568344419783543,8908191249306637,7952716903019002,3999837443092987,1145732456935411,7371896903762832,1292752533418499,4333860994429445,7727341247091457,5482324138521101,2475708161061390,7965030482448911,7476672109883920,6499083336184338,3251131341622702,5215512376201750,9028712908034583,4314694587273752,2764061143536154,6496085337015415,4480474039489054,7448567742116384,3033641934787106,6983420999160357,7777898767847977,5337310722298410,5884036832571947,4078399763214893,9220628450412637,7946684107551281,1416019171594802,5263273880195635,4745207579021876,3132162912916023,439823272746916,4416398725984829,3493883151766078,6495398159843347,6531785592771138,450131296547595,817253600866887,6165057853104923,6063242832343625,3465672530113098,1690840572203600,2283637214138963,6613927386092116,2747956919808598,346238064235095,5988978536534617,7509464382444123,4834409950969274,1181927741731422,1000558243074655,6145386109737792,1941651710300769,4578937017029219,352638541789286,8908453847618151,5939223209456232,5312560961548905,3925973676610154,1292025662460523,7018373753467500,3142927620854382,8363279080598230,8493007664658536,532429987295864,1083091883848313,3766284558299771,2617361532678780,6969942371447423,7073572038414976,5228726182187649,235167720264322,3555822247473797,38211494064774,2838103912600199,7516050425770635,8818927215014541,6290078292482157,6590980260491920,5790775767626385,8375715279884946,2193906437403283,5352023448777366,2091970958889624,3506991389700763,4506918610580124,4007444738282143,761956491956897,248025710457506,3839726412456731,8060500276400805,4897813639983782,5912718394790567,3116005287178920,2032980603843241,1935675302711980,1834482679083693,7429906927235758,8991687299802000,631095400411826,4327468676076211,8202209822211471,467513932346037,6871256833610422,6143409383682743,6345075143152312,4631785068098233,8098532781861249,2692059161088700,5834814334186174,8479132202816193,4565163451691717,2806396311540423,719476188893896,6024874332918473,7189658146019447,4244292730933964,6244457783825101,8227713823847119,3023262204318419,4179929254662868,1721285793772245,8875227403243966,3425924624093913,2272753166668506,5098298417042141,6044944983992811,590722029662944,2111599677190882,6360244378568827,4968083422245605,2337530069840614,2060886597533137,1159891474862824,1669289626981099,8589534387951174,7505888086179282,8841758794727159,9140487447900930,7273058150765298,7675034321759699,8757295513213083,4359564359815926,549071305839401,6453829897630459,6724447828103932,6232469450852307,1751271574704895,8056473252773993,6912367044852563,3695126803133186,4127854635528963,2100795278299908,211883810632453,675016621560585,6527058920313610,5441382832296715,7291333725313154,3059568490590990,4598222196683536,5630568948781841,6182697924533721,3473422642492184,4915409222185753,4941635542299418,8325785012581147,3003772977500956,2898118616011551,1286389891527457,3304943599883043,4427302649180969,5150416186632327,4333693117297454,7381704142279472,2923385705960242,3577467409105715,6472612673311540,7892136195666742,6905596072227640,8233544378770228,4345675871793979,3728833496557707,1557313650791238,314913566551521,3590330679505736,8891821156944012,930726812201802,3506879499408203,6627074733149666,1585186917765967,1170676159001428,1328440519226198,354050598130520,1569778952090457,7035393055258791,1438627667448674,6506243328209767,1145913560331114,7685058205674769,6798156870702871,6547624167240562,6754285343437683,4141626184577908,368482481845111,5157118835733368,7769232291812217,6715191852741500,5027769466925857,6860357619405694,6317491342389184,5604380620328427,1474222421308292,3862004197045126,6346347188466567,1192117935158154,5585891266001047,7734415392985998,3478120910665641,2204064169022354,1742310271251347,3823877200178670,6346611588442265,6727217763956445,6844593059992473,2366032073552794,8562580473361307,6862417777882018,7346318489267185,5230066308936518,3892352791565223,7416596125602734,4228424621600243,7309393870001076,5261976286671797,4009559671075766,4885795386463160,5988654768255929,3248731668026299,8206344921076669,3412163799815103,8546496625595328,2714235715709088,1549131476699297,3517777564431304,2514441788814282,6921770854814667,7788709042218908,1365487326770129,3134016421491669,3353319683929050,25905721750491,2802100094983449,9048545942859258,8690134187788453,7250998071448546,4296049691816934,3914510178866152,1744174973656572,4217235578352619,2088859616547820,5632788573205488,2989230230459377,4427953734521842,6389172776850419,5914952928408564,3697924637856757,7260488362776177,6917514670478328,8592138105735807,3271336905716735,8629417372867179,5136625779484843,2238446901719894,6749252819825670,7170076147536905,5231729650324490,2148541102773261,518984608052238,5872623877493775,5063972360180752,1228597058646140,7533643915136577,6996305032344409,1468487442338840,1216021383910425,7833796421932059,5658627633476637,9049482448625537,3276934559803568,5086890020418594,5819813274260516,3760310192501799,8717666198831964,4447889548858381,7201269787478194,8340453953270830,7985683852718941,5522111723500593,1030399388775475,3032691528250420,5796699319055416,1980940126450745,8927672058418234,7544320680555579,4948044262757436,6155914390397792,8939110502222006,3699786628756550,7061625075668040,1083604011217993,8255679541867594,5949777419671735,7810218368303686,569252380857421,329618730587214,2480665999079565,4168933282370641,3199411535705171,2665400847897685,3923917484145412,6809129141823673,6696617211810909,2427700611191902,5649394871637091,5485180121166949,8674553548169783,1790600023633425,8685854096921704,8924109968276007,6833750482064491,5493791948076141,2483749370238062,1977257231021167,4422283620570225,3949879087666291,4104715882484852,4893288566223992,457873866323075,4630175955604613,1028512033059975,7447912386221194,7672925178662423,1661685075200194,2394004446565518,6187361426335140,4231278577341586,2731321355424916,5125198438433646,3447360734450839,95574140286107,5422930644680218,2961228496385182,6804446602491042,4294296440378533,4855890249610408,9005160636069034,4488322444342443,3080193678611628,7385033212630189,9183703474599086,5791750955660464,1950984692233399,6260526497076408,5868401980896442,8038011763487931,917751513969852,3279824137393341,1707952060454080,6528131034109220,4427751944066242,116260748670147,431709693449412,1973870333179077,95295473407176,3955533812970697,5846180235772422,7159698500662475,6960244154004684,5813049185137871,6762971315393747,1268230010787031,1132745187497176,187611667281114,5429225991822433,5223257519772894,1514506037624055,1394039242323168,6646107470050529,8593511955398701,2389987372766436,8085195117221093,2891892071109862,7388274075279359,6469862003183244,896197231015151,2076190638322929,7139704138328275,34758834623735,2263712875738362,8429804581647235,8631917827847921,3185479444894974,7705260645910741,7363831847843072,8135477587547394,5315382899965483,1253061035545860,6211516288366806,7748065837094150,6608628855917000,1108699350191660,2225328094926091,3546887202682124,3708154358603309,2390966267172113,6506494724895619,3607261890221336,4192176295761179,9028856413500641,5112081579271045,1662415099680032,6042209200815664,4890513982395682,2421623902000420,5324566494069638,114756981830953,1693546084291882,3396184323330346,7780050648441052,5395438566700334,2336268563641647,953171425989939,4347604422210870,7029916292990626,2143358415607096,591614652003641,6012637562762555,311990612874556,6103026343982398,2163462195500351,968398880544065,6960273475072083,7122459966231435,8893543788557637,4449632982037832,1569407243507018,781400992322892,4930472726132048,4771617146781240,171017591706962,5323070483077347,5284468978038100,8864952600454030,2091222381450582,1734910381421911,5895732385264984,4810412064388442,1781004880811355,8065801358185821,7932660937186523,5874151831729503,601613526373728,2270259339436944,2385197042341218,5379015116084582,7454174989218705,5933369922295145,4517766293837162,7433731009865959,2435480087401837,4385714439787888,7093489533991144,422613253174643,2022483896874356,3096251860661621,4251957171737981,4492295686395262,8536981549929855,6336687693100417,2425476345189762,667370365376747,6305473353299334,6042532042841665,4037246995953900,4055543097292170,9015508123923351,1519286763779468,41692982867341,3118730774730126,1821996983702927,5230432471711299,2185072409539990,131679454082455,2948811467560346,8217604700428960,94979959295138,6995534067180889,2699000454256031,6902080199538081,3630080839972483,8430166733002147,6616919227258276,9073994908848291,3159227915408806,4624684239023605,688328581060008,4932628501763498,6150925489075627,283779938743725,3468540239263152,3538673490700531,2078607772612023,3756053328369083,679591283758524,7858480386151873,7763910767818179,3446521530193348,6097008665482694,62182236059079,8510266744911497,4078944258586058,9050188598334923,8524540827850188,8175734075409314,2183282937228877,7238021457827281,5189937147499986,5175908421539283,4006211812922837,6625761763341783,1121018445338072,8643768194347011,5234012450657761,4469958294713830,4843174587913704,3501244246136298,6142940919235495,5182479164126702,5289032262555119,4854385585960432,4133220459422632,1804420242879988,9216115786561014,4070482427901436,1661165138286079,8330650804336128,8689104230261408,7308327764823497,2726784800814599,1188022125057546,6743692560315915,290856412784898,3707070427420174,3244790517061137,7452293906839811,2424396052854292,8616299009291182,739306051950103,4091969493055003,5643302030915100,335555217675806,3736968554042914,8007262108112419,1926599705056804,5032327805433381,7772061034108455,1139696457692712,7455994753873450,3218719867844139,3535775984427954,8952672453293615,2157798138975792,648804241708593,5662987759613491,9189856170677813,3013121988130359,9018525809391163,9216273163393506,8826762142682230,1868293701645886,1248776796263999,9104428338460405,8239500673490784,7183853053974086,1227730115835464,7598762280294668,5131700941207117,5114243878123086,4570680016836175,3662800791270992,1170379608954449,5035474928776786,259813620201043,3900494389327446,6818112670430807,5756585252462180,5028038749197914,7889138761401274,3900050537797214,312543249323615,3781955888993888,2241769475831393,6618525449647714,3930560350778299,3069101500208740,2152018111313509,5802645705840231,1953867950503530,118296475604587,7461305482688112,5084637502281329,7533869715814004,1438875994950583,4814135769347007,8129885960304252,5450979031029374,2798358484137599,3978737009776256,6368884018488256,7659644878526082,1372825918248579,2600386121979525,75461820831366,4433514268484545,1002134514046601,2950849997403786,2024431779862155,1697306230871692,2832029007664781,7958500104304270,885109970450063,3343591039516270,7056355509159700,798358373897881,7107156439381658,2616490712430235,2560644040930972,6582017336066735,3968407459845790,3795161378838176,1420641321154217,1387642555741869,5197301998212783,6389053371446960,8135025750529713,9107787921766066,6952969422933489,4883367736243892,4584120616318646,7372756733966008,2501036350609081,1023488141989562,3456789311428283,2075194182235836,2285022911368511,594595219658430,1600625564106357,7801856632403648,7705627087533761,8836106284799682,1632580360746691,2226766782641861,6657661262583494,3241483967452871,3529966685345758,2706396989865591,7067743149864652,7234996161574605,2794947696752334,8181378814139971,7045699450943779,6012297402840790,4893194289485527,371505338726105,3971482327848666,4515114324091855,7589521908119260,3158377925940957,8215359552247518,2944009596737247,3913329926608608,4375880406189008,6535106014754530,806713116866275,6229248816096412,2886797330986725,1880336872108705,5064176337376999,5771026813499113,2235161058388263,2127729588917996,2653249527011053,4562866128541422,430039385620093,7692129337652976,4163794031441649,885000182052594,948853003654899,434191084246773,6611899509012214,2996195806869239,2891070549590996,115031297146495,3900414054668029,4219958618920702,4074383220668159,9089220157846746,4648838224992001,7844656134919938,6135088809842435,3293971766753030,9177007189986677,8035465036392748,4010580127872781,3465134410716942,1261388437121636,8245931964722819,2936544717158167,4119496435496729,8538923881600794,1810723487191403,1377840254891805,8911457523982405,2800551445223199,2467969503778592,592056074529072,6121687811733282,8209629159221997,5635893667862310,2896345787635495,6364807721531176,7558234543600604,3204995653859116,4566831350183729,4922651902842674,8185007933749043,8738043622324020,4261068279166774,8824184875767607,6676998129580340,2797948618798911,1049885884094272,2120166877370178,4765707091949379,9098032820865334,2725707673630534,6138892879664967,197494406059849,4194687794192949,1142985124542286,3206272630462287,4183991813928786,1916792304162643,2431166572697428,3565523697981269,1510769831876439,2923456079632216,369348437219162,5171139309786973,8316917965943226,5077115002566496,2209602959710049,1351222211311459,4656215924864869,2938987806979942,852106798954343,3230418757605224,70742734498108,6309855274761587,1807275649046382,3571017419454319,4435686662018928,8682583761753969,5386212871681906,4505081604904819,2776841018890100,4201249864087414,3566767790520183,2379514032576376,3879170223380346,7139802085427519,6075215015326156,1500570680776574,7667909433653119,8525329245978773,2618663615657857,1611331824325611,3938604997851012,6582603717826438,7537888455539020,2203184066287496,6737492445517707,7795700009498510,1177815800846227,958080704190356,4644852119189398,3564865846605719,2261670414694297,8415897156147101,7669379958691743,6585353185033052,3004877478975397,2696867485956007,5194516337866665,3957238508303346,3764560196523950,3926060805576623,2284292388435891,434203397928885,5131232950826934,7119021184981321,7049865797048248,2931440191231929,839468150644383,1575765952296893,1619362456844223,3660234119346116,3927028193441735,7247600561917262,1625341823055817,8474057515200884,5542852308490189,7647481866237902,2799250403563474,5740278401343139,6344824120473556,8071188005803990,4451471981454329,2579302146095064,4783832767893156,2186676860303322,6901529414334799,8379186567641052,9084679392101370,4800874702534622,5672126454495200,8275002451908578,4720192308115429,1343410319153129,278434394451623,6323386578974700,3999487854000110,8301869681694703,2646489812875248,4247984384746494,7237873985845241,1441092469291002,3848966020904955,4848361656711165,2513902998747134,9128194379695242,531440601967161,4341848526903303,5676363565897736,9126029122410505,2502204475160586,8299260470221561,7892253146351960,8305616383588370,8169069141825556,3625286883239568,1459268805541551,7617075379898503,8016444203907101,2995540491827232,1238470165698594,8206540014007931,8739563317286949,1572712856369191,1462316529743912,7721292640921948,2580557346371626,126761111320620,5080449494497327,7317338047977520,5297407398000689,850627480631351,6490482604177464,1754806708942907,6343020394633276,977317165455421,7667718727301182,5577636910829237,1323871878371392,1096120466798658,7571870285781059,7937484269287492,391742667692101,2273628581863444,6958885982124104,6303001594259810,3309548122232911,3739857380989008,4612291671786510,3314017994515756,6598512665172057,5020044340320346,8182137817094236,3797660457211998,2781328775961067,8357965825225744,1023062138239076,2548055424931942,4912566158596200,8850634405279850,5965593870882923,4517141952895084,2607136538720365,4468384375101550,6612421739589309,1665469171992936,8791764080064245,5941983468673141,2987576330494220,191587477387383,5951704028993659,8315439337515370,2696285264722047,2655909443818205,6292063346833539,7971233597470853,556381453733569,3830432582058210,65777784174731,4752345989118093,6912147989526670,2207992906365071,4682021306636433,2851000728008852,183410704316566,3862494647338009,7006624906278919,9222628508450500,7502786434521242,590939386632559,3581490320554140,6073302930798752,5113638377896097,7244938767276197,886966455195815,1791973511993512,3560825689700522,6070911299172525,8551066216546086,8521503499243208,1558631576311986,2245744688740531,9064135744048250,363324678412470,3294542225078455,1925530734534074,7727059034478626,938197211207881,4505634804496591,4927762429795614,7193414141644365,1903465414187220,761655832195714,7504831285238137,8190365946640601,3900519281400026,639938841278685,6277214537260441,1712510301083874,5296793707583867,2874460849649894,7030122036181224,6672689232443625,1123314559580395,2779805689428204,6045660805486973,7445360695048432,3804609690597617,4921369922427122,1380870284368115,8084002646710427,2491829177842046,4152546152847610,8620449200527743,2973380283816191,8687999664372096,6035566021507331,5219435375138443,210488069511431,2339095869880584,6826379996455980,7092508588328404,6894903145940013,4462036604041493,1752631266864857,8065372894074610,4148490562681115,1035853058480412,3293666863610143,7504408446062590,7025815914316848,6516976864991523,2663963789293861,43739069028646,1385380114151720,3076704609065257,4703412992244010,5890799772241629,2069203048806706,3641544070969651,999800879610164,1774212927871285,878386611386761,5211172509350200,5272824267523124,8772692350329400,8200065667438909,3841520462002495,8456837727902016,4830969642318146,573048270743947,8064941071292077,2341448197200198,4460729405618503,6017368952346953,42981452872012,7131483480127821,8618552414329166,1375371918940495,167874738895184,283718216153428,5952111657351786,2712648218040667,3002264048785756,1269369132898653,6444167932615006,499139813013855,4961630975981920,8875218856973371,5032458485856612,9179312572275045,7294672742579127,6243134924944444,5489889683700076,7646660307900781,6608175477430638,5159060153530735,1909056289519985,8929356287400306,4869493969672563,4534302358854006,7999799694457207,3333269495421304,5394312879610233,297690005993851,1941235473832317,2846381666867582,6421675349821845,630066569664896,4916756122428480,9138502171979499,3080223746472324,3039983774366085,2529883321126733,8189217928664129,938156270311817,236385837455756,5969843844364685,7853037270202766,6743539960863121,7261803379194258,6794599453366678,4404785302618845,8358599472241054,6401379765008799,2205010926767856,1271275715426722,1672071737727395,4115457690007972,4048110397127077,5379587372317094,7190857836382305,8572443081989655,7833807991658922,1122920519547308,1022561768685298,6922164425550237,3115656173279664,601578705803323,5837427153219074,5792379422707443,8502428150409630,5002495638541385,6935752729713080,7773338642143677,8547517459611381,2218463124224448,1970331668552129,3099570552453570,5984771869897767,6078098537478596,1323279741532613,3665786913438151,9146347983690185,5080093794900426,8223026877325047,5494821400311382,3887419205643114,1510398512216527,5104784997022161,7200119707892178,8295957759351203,299862894025172,3165291586738645,1500240473430486,7155411470823161,8160220562463192,403808588143066,7950698090928604,1341063223525114,4339138583124447,5326407457241568,6103721142876641,3920050390718946,7074935631118075,2876462166284772,2372681585326502,5641268056807913,3436249770473963,4292653846338029,8076645221767553,8201068906427469,3568023907228149,3260951300995574,6259893347754265,8543393480841725,6041816677397589,3263189550193152,1150769619237377,1527335733541379,7420318863374852,5331553647974917,3649829525486087,6579305000024492,2988115416414730,8093410837648471,4876675994532364,3845075746208273,5779708335446546,7281858809707028,1003288950143509,1387355245451801,5616996435819034,8524505842877559,2264336091830814,2660117523397152,2340919783250465,1726103710210594,3786575080544803,8895101729528357,2918608504166951,6925398531400796,6190780533460743,2957850431722509,2606248466479661,7917092826960989,1614367615187505,6398698591877683,6452417346927157,1170730441793289,9191808086637116,6968469713149706,2588758722173502,3782674927680063,8069019796957073,1125936423443011,2742258188950085,5559502660893257,2609375859038795,4041466433493581,8288460667457293,709103239985745,8477190700610659,321807816096345,5463338943602447,627127047486044,4734583979948637,8490465913717796,3474389640059488,3866856004500065,1606431239952995,4390355712940644,8310782016055740,882630563797610,125117768596075,5325474683099761,5762791765400183,6823768439147657,9216194826494511,1551034762599034,6871429328919163,7665022903170703,7301772992068222,8759487413344356,6916984656638216,5456816123861636,1699716951267973,943617521785478,5082528430602689,8862279159667138,2674691801979536,2061846792280722,7947055492864451,9164750192802454,6267165690059415,8751131003623876,687458921667226,5922138896397423,8147684872759853,1181601068505758,699607431281244,7314532177167306,8282503583825691,2454820941388457,1597960636463787,2499960429697708,7455383121280797,8552952499968688,2555200656173512,4563612103834290,3408312637919387,1654323157097143,4413910878051000,847998846171834,789845488540347,5115126601235132,8746835963894461,8110001342266047,5560616940606073,4814009890052808,5731970084496503,18789057985229,8270647196048082,3550500090567380,863030550387413,2115498790099670,2994942698789591,9211389257857753,3787044574255834,4896783675292381,8224132241784613,6297341262272905,3161742935079649,8213152978320099,7743699727637221,1125292054641383,5784541019552489,3136568552356586,6265241372818156,3878796172626386,423507596253934,4899558495550191,4721106971253489,4720075804613362,4784035005438707,5233368062376692,6445923025214198,5044982492248823,5203215063522040,4167283341884153,8417013484395258,1587336208136955,6792499777600252,7299006733772593,6101830082783701,6465839833047790,5122308940930859,4226112196320004,996492537854726,4446103868816135,3619352716778250,5552218634484492,5352147574651661,2673148275916589,919864066882320,3654420108335892,2451584609385237,7863521746259111,6349595472725124,8057953922882421,8936763569871644,2662090545486621,8321739414269403,2261335601994527,5281954819922722,8500747731974948,6508548426111781,4753294358084393,2916231939134599,7825578383620908,5263831119493934,4164246920215343,3808913287838512,9208941859707697,802918102342451,5014734051162933,6239040334625590,8454327146265399,4576943742663480,8493034642624308,4744236909108026,4583509937297887,301645549697852,5790413884447549,7962321729502015,1182688391682880,2472172921224001,2167783756921666,7552556046719812,1383281430387306,4014968145582919,1010115438639944,5364618665605963,8848820782390821,1470606537775950,3417101562395475,5482629742082904,8608002013895515,5828884969380700,8264085127125853,5281488157104991,5864309604891488,8006476684663651,6827177814673411,1296947247536998,2959442647464807,253746403599942,3984701983906669,3827442132843375,6484507494086585,5365379748797298,1661454060837747,2448542620924789,4207969238727543,5712160051987723,6214937596558201,2473180128303995,678337993595772,8244348260248042,5546001921907582,268212578007935,1831952921926528,2145767678114283,7822542354070404,4687802704542598,6571177010895753,2147238570687371,4074515549731725,2837926018825102,3007568502004627,8312661019597716,4825229527759765,4946972340362134,4582919924669336,5231420488072089,2242539767544730,414337181096861,2106018138864542,5722504789851039,2185835893062562,1111148151716772,1179757226803014,1879544294849449,7460920328223659,5933722659535788,8651717695904687,7852001124539315,729733802711988,5073386750393269,4314946751151031,4878541708803000,5429583528057785,7305421573020603,4627124260311954,7749200678697919,8866814080990144,3162570006592450,763183260646339,8763994852981701,8505782706404295,4673240189303752,8574554620677527,2447426791584343,4680193307728844,6580525331137698,3622542635826127,5347327408069585,4811730335005650,1384296101460947,2102043359730648,2555031336500185,2796665120627674,2139131759180763,3753510284721116,251457751260125,4600671068421086,6967402579074015,2531952431717346,1187170755263463,2920720282470908,4485618338186407,865425607252972,4152208174431213,3812493486898159,2999291251293168,6408806779501553,4416697465494514,5197358406949875,5087700074347508,4724013516962807,2623328457776120,1778886715423737,8620717773831163,7030409249250304,8429267913612289,7647350598401026,144016256596995,5639102093491205,6584842015538183,5160469030870027,5710832985923320,7770819168910350,9105746298764303,3947796567006224,4070666733231121,2343505437719570,378714943200275,310671338363924,6999355537720494,4533753901808663,1633983294225432,7158989480333459,8143047144381883,6081469861134780,8145419699807479,4377985289608225,2681750969121827,4700825583090724,7034465415535653,3862727856774183,7296432101678120,2157125457784668,2081352236506155,1825797522390061,8444229981572999,3449293162060850,7284822581413751,8411978890880708,1509730742672437,5828529494608393,1239785946061883,3182998153190460,3214769948023869,968537321487425,6237318226861122,7164751461349889,5803397358844522,2360129943731271,4715329327856713,5852825693051978,3545935367546039,2084562617482316,7971306836234082,2914600532917326,7055374979374159,210085401697363,8609690624627930,5252423805844569,8173006126595163,5472024391400810,4749766635699294,3815686010261349,8867383343881312,4306448340933729,8292951544729065,3900380717309028,7459836745849957,3101753754704998,6056624245005418,4512704753437858,2293472325885037,6145091044398368,7715490032688241,3906787549346930,1606861552622707,4488101616237685,5555918750448760,5331366381141113,6071839543345855,8561020614483072,7336587558542466,5154668086641616,6279078484049029,7419740200131718,5033724948638491,6845906079005833,432021740158095,4553896124882065,6708270634327186,8997407381082959,912523531680917,1087824078666902,1154343777467543,3470289717116056,1502715792030873,3375243582348442,6429149850840943,4678432288726173,2733533231748293,1438653334805665,8204093899512995,7147212477562026,8340701323022073,7886732949003436,5514643841514670,3354912777901256,3773592469552306,7257599464238739,3465691404303541,4462000090733754,4353103533259963,8994574684437693,4429388222504719,1011600725753025,8559563505886290,2590512425197430,1120840192441546,892603413470411,2738303532243490,1073378034875598,7130883967565007,159180968811728,9066863368675192,4471435052727508,5740106578017493,4521763200285911,1567581108092123,6921779008038775,2479223052549344,2609425789107822,5159209373850855,4638164935146728,2288286768929319,1612726703873260,836023483063535,2585531946482928,3156582331563249,8191641008171977,4273183498116339,4839237436030196,4653744181353718,665844481309943,2166853101141241,2823125129911546,740920090295547,7811862382443772,6675358026530045,6191648688782590,4970357320637695,794365040205056,3040109987749124,6935796723662085,5768359105126273,5030991968646359,3318146583149836,3096281341623565,3152098133163278,7994959165660431,5496457318012120,5352112584138002,7223573262409603,5661166991361241,1891823721405721,6756784416157198,5243352671436059,5197707403935004,85233370332445,1492456357575966,466510677245216,1910096789539661,1974745694133538,2849122052316452,7377162627521829,2925041804590374,6130851380714792,1107004879502633,5830033035812139,2242497821523245,1415499184389423,6996299874286898,6885838283816244,4190005210185015,3576253795705126,4667690858151225,4171629164179215,4390459877203265,7722561211374914,6143613087932299,8999030051642692,4560692439244101,1994658425503047,6035992175910796,6933993121684810,3399261080591691,9007176291828962,92289387076942,3551512314725744,2066935134496939,2602022521068886,4988970190241111,6816092311567704,233554283797849,2601631025741146,6247947750031247,3735281724766375,2632053265390942,4143899183463775,424422399000464,1326756946468194,5679397110019302,3798622883773799,4949950638095720,2573334991175017,3725074827799501,8982473390701117,4255516527320433,6723137416248690,4046352629957609,2773317501386102,2265407294381432,3619588610224020,7819513461000799,8771065313942878,6572634809376129,1995181367451010,7947153800674691,5424097234140549,5179045239078279,3132311459732873,3827745566686604,3590620750118285,1158960644193678,3628722409594255,2066418774015376,3299698939058755,6857308628478035,1753327316819353,2009090969869723,5385728692583837,7312414823578181,7810399204851106,2133436141928347,5290028972457381,1133707880897959,2793650807217576,8129810291022117,7899936808025515,182916927962540,4626362624146863,3565794297095411,2605141375101513,1560123719392696,4030717217832378,5569732364746171,6206544286096828,6513940961877437,3722015205006782,5189393809202623,1765440825220544,3111786355654081,3982278164143554,6428702067087947,56686711823815,7417093603180542,8456509743417319,2730600658214347,7573846164184525,5781347583335888,327970802517240,6136307509861842,2055230681816534,5663105281247592,2066156175678937,2313712481967578,7826017804008923,1312681115956474,6461553425546718,2163562961059295,8927006822221957,2244282597883363,838078199258596,1614194585796070,5145249460747752,6887617198456297,3927427280616938,5063597935017454,1151035929001456,3574556061359603,3738342456458740,3572496431930869,5345884909894810,1477216257293817,388431759252988,8814637195066879,296747550162432,1847793437957634,6652951397080580,6309481383861767,2588202776391596,5013266697305611,1239123485826572,2425305005587982,9014830955937297,22077071900179,5848376351545304,8549680231819865,4065003529000196,3117051276819994,8564960207568414,6696914240945697,7116776886722082,8033706376100443,1409838916173349,578443609918044,6933716565679658,5479031910579755,6962896955440684,3629125801754157,2723938417090095,1635414218284592,1888290882412082,6859348964597299,1145891470532149,4215777844133430,5378719204865289,3257859952827960,8346218709122618,3208830061054559,2090664007566602,2097347429981759,4633201021410881,8460028463455810,4623607370128963,5511488977927749,7322650425031539,5968780799925831,6835269500213295,6276592415252042,8553379634163058,7323183122249545,1560114685378488,1075569898765907,528356331069016,4457283858307684,6962857766100570,7355332314603099,8767833789668958,7959309240932843,5261877651160673,822079570152949,623057807752806,5787939284940049,4725616821254695,1749139462250091,384221538451052,4799455735291501,3623345308925550,6176654379417075,7937123066822256,3286234000186993,4004984526228496,6923071652848915,3855317605891700,3574828565692021,562057047228023,503522307956345,9074932936384123,4018444265447037,4289876313636478,2606045542865712,8423374210883200,4313860223401601,2009739224202883,8420930039013313,522528748371593,9066405870441795,2727998866816654,653874539503247,3303725249789584,273988897701521,1188556155838102,8894829291871895,6131268072959940,5020937394478749,358583458676382,613953442102943,2064120551587490,2224925486617883,6887354663132836,5250504153931429,1736828670746278,1542749681998449,7337985600691881,8409628026257066,9175172128915115,3203901475389100,6928614113803949,6307086155562670,2104814327160495,7570334145454533,2177817312329398,811498013376183,8302805963521727,4636622344675008,2931358882569921,8827010433539779,3522543043010244,3116692676730565,2545527985462982,8141232133528183,1572494890786508,168845645921997,2703898082877135,7018991960277944,4386398003456632,26726058745554,2861310422154967,4927417719979736,4091431805722329,6371489420869339,1621244878569183,988410102587105,9090083372211938,7234598172065810,6534323484172004,2239765079982033,8252035446301209,8981001266208497,3312590706114290,5767495894753011,7734957221920500,6024982700662517,3580566623528233,2200464202751736,550699332976378,6811482601135867,2244066252242686,5796380939954259,3492188083605462,4357641197413676,2185966016531649,6243218223590018,3903762355117839,7636737062461201,2789836649078546,4960012079570708,8979093818922775,863418006150934,1875289249480471,2469221006144815,879607110295324,3123168685219613,7165038194753314,3688548400455461,7918105791560417,166961444683560,2258248819662633,7638346745585450,4727847407361835,5198503861853997,986000595820335,6384607217426224,5369015496998709,496474712719158,8361178393092217,2996241404976953,7537789440873818,6781058159626890,2091272042348350,3523147566448447,5850342525394752,5970821371879392,6795002579693651,1892652218597187,4587313672232772,3797076680671046,6434728476081996,7305114755986744,2585429739175762,3721472801914707,4362272716676948,6238865550737237,5931467980750678,6340366504658233,5229854693392217,1613541943811931,3251279871024989,2416643969783051,3323101669678944,6988652507651937,7780920880141627,8488754762723488,5862130938552165,3238513277689702,417073578278760,6872328604270442,3830222747606895,1272961363890152,1923463400103794,2262545021042547,3099826312666998,3445563636203383,1627268287176568,7151467438546812,3695723156070271,6916380727017344,1996190028472193,2667068239462379,2575892301561734,2263712816480136,5507376196722569,7506334117809605,4654286578777995,3106871059447692,6163592261944642,1749622369943438,2466410892853135,169836769746832,5241701206556562,3766646000787347,1018366217600917,4780447063408535,2506875907776409,1231472717823898,3694917249302427,5073680764419997,3487746285526943,4423903982469025,1118605648994211,1426640483499940,6538670543167397,3039786341265393,7082363234131880,6005686893993897,9065279836381098,6208038769590187,5253360675274669,6583515872641686,4129320403339933,8292505190932400,7822892193636273,2607087046492082,2628648902107059,6245244813442999,3737549735772088,606849405271995,1946473745571772,1431339418697661,6259575551293167,6287308865707969,3268852323050433,1773244691480515,7698835422722572,7491724734988233,519554974277578,5183135088082891,3068080106971085,771050034794124,5710134312312784,5100037510176721,6880121901162451,1969282957746133,320555874844630,7249645697146873,4093184912424920,1636115990773721,9125618783985279,5422139772829660,2812799790804986,6539549800116244,3338565331528357,5050396951254555,8789152442572772,8179576729264260,6162782887026684,4172900998220455,8164688760870291,3160000521114962,1593008646717423,8238797963485170,4763395536209235,7385327650803710,6728332752835924,4697172654014459,3129426287633364,6658055519518717,2076510590083070,3889105343275007],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/de7c51531b29594960229029a8eb6bd3",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001249455.1/GCA_001249455.1_12844_1_58_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CWXG01000001.1 Shigella sonnei genome assembly 12844_1#58, scaffold ERS428562SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"de7c51531b29594960229029a8eb6bd3\",\"mins\":[1073757075132416,654559128137733,3728622142857222,1201025873293320,8680411053498377,7316464802643917,8510668751457623,9146733986738188,1528444436721677,2046686464765966,8435441695629997,6750112766491992,910260459544594,2657920817778708,3391826174525466,1040906481516572,3441026442502174,2261620935442464,8166316011588272,841657013022265,63017134968870,7500991021044401,1764838771920937,5560778908603081,2682827334041644,1874239187120175,8076812926519782,3205569263312945,4762664440008754,4123060268064819,7909662547087412,6087468610956638,1469799335710774,7387311707809084,1470093577691192,5862130321367097,7807324074018952,2517505051346271,4334241299832892,8746259178369717,6652035869015623,3533801781903427,1303380529786948,7048443758654134,8176761357492296,3172383269003338,330642771468364,2182398795403341,3484985178759181,7150900782876894,201265791500373,1338426797289558,2128219652771929,6077663536853082,2368906433310811,780927423520861,1051896060691813,1171002909830033,4532998204641377,6141598417310328,6147782503108707,6363223884542052,1390675320180837,3589031359889510,5723838671777895,3212616315093692,7313057819352393,8487042812984679,1294795083337746,5568630790840431,8557913976427973,3576991172001906,5552140416512117,3459151149293686,372708354924664,3898622541115514,6721778213326971,3715299619541116,3468478413435006,6751878817626133,2344109037412480,5070150220165824,3397773105741955,8539004164948100,2004930974167174,9102477959568065,2220943948307820,4242351234474123,2569804992065676,6593782365859983,3238514465894546,8898041383738587,4479098013347991,4353059275829905,8110756269551769,1561211337072795,6450230006775964,4259896889456666,8172413436432542,8324706907900613,9012936261589228,4192581360332145,3339972103970984,8520891560951836,6664849986859178,896865377362091,6840341648085244,3948758422548656,6781713908506803,3370100951126196,2664362379264181,8947339487854347,424092361093303,8676341257128707,9152768477106363,4201051028996284,7359845544648893,8417413703262398,1506544743870655,3269648229920800,4594386927288514,1850941908679371,54267487195332,3920674891829445,4551746334601414,6822100204277336,7832654526906569,8395130278021678,5101683099736098,854361017061582,1285480463289037,325405291561168,5088556791717240,5089565009928402,1958335824154835,8373835249831717,1228794839154904,4443148086571225,6763584774734042,1226848664686811,5677957517164764,2928781944388304,3628376511791330,1355348817854691,3382448170615012,4942284316191441,785648654295272,3529317775237354,635136383123691,1223472291905776,956777688150257,3281571388109042,1083684492550387,5478954090696949,2144861695090934,1361016370204919,7503106689917176,8975008361441751,3211021148488672,1012693995966716,2119151366529277,606392454750462,4746016443060480,8325086660239617,6251498761466295,1632648842858760,8934248685185517,239945629602519,7870119719103210,106776035873039,5962730765967637,7303145929355499,8006215754709958,5740758977031556,4311554702672154,2174974481998107,8005200134666970,3854343283052831,8207544012289872,2080501038903586,7373328206410459,3653439517311268,1328257188593957,5043297164816679,21150285087017,772117172191532,4941779457685554,8150994036996829,7656413098012959,5573572253900134,5430835954728271,1805596755358005,1983503147569462,5333201194077577,203011812090168,2023429428011322,4313045818585403,1752908108796220,7298749349184906,3524203248009534,3495517882196287,2355412341809473,2088069525771659,5775331168375108,9145388097646917,2987482276307270,1787998382186824,5749043940032841,6920749447696714,8981126744596535,3713786577838412,6765387127028450,5402893078708280,4828143866843475,2915677753553237,5893912393748823,1853196278886744,3907407941673306,6542922321892263,3643628911563101,4645471425089886,4586823680090463,6690676565807457,4188475825316194,6903200412788795,3296962647322980,3471140892205798,2254104781395345,3213970056970601,5760795239805290,5426883999288039,609934825034092,8644008190332306,1981067029344623,366449191321968,3512898337591665,6364201369596275,8686785194624095,2239183959286133,6907316714062199,8054862788604280,7475092350742905,386044708512124,5803893689332093,6281497035855328,3822882072310145,320413748797826,6258939950604677,562273227383174,4905932281966984,740607477961099,3043362163532172,8429228251806445,2513155861381520,8656156206547857,7977902631756178,4120780341174339,662293556334996,7215055957377431,6803710638264728,2172287414552644,7606562266386842,5229504741713306,5168331105685918,2564237403603359,5598583034696096,8288022953951984,3357470777483682,5118222967801288,4313903103881637,6980401474429351,5290346182860067,6859671838925226,2063008413757867,4858254758601133,6889719627880899,2177821880959407,379935127364017,3951993819025843,6046018190438837,2409861074473399,7573203002753550,633612319568320,3029341628273089,4553790569252939,6504600138650052,739730488963525,1586830628155846,2187371118363080,5510921714606156,6103640832397770,4158643801731532,3109437597065678,3427966188243021,33355113951698,6304638001390035,7583714277786070,6331496692656889,1415164117193179,4044594957775324,2004039151534897,8495035540960680,1762630490657248,7059564896941279,1623756785893861,5572976445594162,2855125351690727,3195488200716776,7889004868186354,2931571972751850,9105163706183547,7311203715548482,4929961495629154,8525553255043837,1316262047470064,6372281539175158,8909732310045403,6497007459127797,4107450076209654,1654546021425655,4566519836733945,3442871712997882,2064909134066172,7783144962869723,2409391466709503,1626679595848192,5912127355224777,2923577133860267,4588882368847958,7731244410036744,2227481306654124,86205975593482,2139538089042443,9071633823952728,6185492340510358,3706241000403472,8179864612635877,8805767887449179,382644013236755,7407170124071446,3836834437558808,2483232887628313,3058265525461530,4524269322417872,849087707890208,4544221920944673,79103686168667,2521002441265700,2410197458295558,3582126696317478,7925173166912042,6134251212337707,1967916335809068,4103871071876530,7986810274920541,5498454157423152,1416727865545266,1125038647685684,5061816688071222,6751881844570093,383797572878904,5394219840704607,2965832364118588,3429852718600970,3111677105652286,5170477133153893,3579134126674497,5769665019062947,3579826204570180,6951728823145031,1684912009249353,1820959062880842,8301344556431535,2472140177142350,116925212033615,5539170023359057,7984362957312291,1525557707760212,3848836181647957,8031406990306653,2164808574747226,2756071361360475,5080508310012510,442371007301092,4246632951861859,8384970864149092,6486115054342759,568000522973802,8940081059791467,8432821866570514,7635830782829168,2793097290789490,2166916793541235,5045175309042292,7501741814739049,4005771395834488,8506062973629049,4120589373940346,8992257804410303,2897095043949180,6946070093501205,6522676544610944,5051031092256192,2397689414378114,6232967090696835,2679207567196806,678285722124935,5379404288733832,5583114937950238,1724031441810059,2766065063510668,2353730651177615,2019585422459536,113269032034961,7674151613951427,7478109265101460,8537884731810044,518593397944982,4356419988349594,1792071081980571,2597332801557149,6586311591924382,2215385946845855,9042985953004020,3504564547469991,4273289964511912,7439773260511734,6895490497021383,8519892691163288,7457660503509106,6251521348096688,4815480447727048,6528647032779444,1753771755791029,5664545369785014,3072640576791223,2041358419321528,3496369553818299,3763145072980668,1037573376058045,3375494323790526,7618712693428341,2098982571856576,4869853174897440,4039196619215554,8983104269525793,3941742442509001,2209227890905803,2555252183827150,9103668915163855,1345748996399224,8949696555437386,241518479363894,6202748544676564,5749942729657806,7298738867790550,4653852890331257,1550977950057176,370153936560858,6108826269531599,4964056350806748,5294766748025565,6957996808897246,4707675190668069,7088170934731489,3711510044373730,4704426556949222,3992764934730471,7646609744973725,7604050999448300,6541199343695517,8950452669456373,7977555933352688,1787259017597685,5842392311423734,5069302333174521,3812086123586299,7434756525609724,2106232978768637,8456953390800682,6309456752497408,6242013984625409,5810464076514051,3479133807342342,3022689456030471,545034796114697,877463201362698,3655348890841869,1280168115413774,6584841380211501,1568756855591696,3312750158140177,7754409884422930,7937636816298772,4156859447968533,8663807444742934,8725800200456881,7618392932141871,2372682746946332,6408366099364270,6320444637377312,2069696959583009,1821681489232674,3441839452017445,2437385865757479,6347070686084891,8722933495968554,7296085688592519,1789900134822701,8132641845011933,2591089362379568,3687598771689608,1751698265555764,8188669259415170,1553500140704567,4845256832766776,1477708695970612,9011426629690172,7786927314188338,4987596047791595,798868643812160,5895083792086496,8009831577100785,1193194748379973,3455541699650375,7302752899863368,7543300918315436,753153853702987,5886996250096460,6835847231583714,2741660511556431,1541037172577104,5054421719249433,5948496119125441,816503841678163,5594499785696085,2355801306534743,1419703420392281,6006053982983003,3344848010822493,7405781378130782,1147610223223647,6297328210846560,2493777281889121,1374833818530662,6134002501714791,68792473092968,7922006282224037,3640921402798955,2476206116754290,3339256207987572,9183548662260517,1589935211180918,5617027811771255,3753675332473720,1590631988888441,8462131047278645,9096998713694357,3813469322421121,9182545715384894,907310714922475,6886829094818693,3168575450833798,6901376864842632,6124171288552331,6886851722761100,7539256865675222,4331047018382223,1995644919788432,3894493901285528,7922138867600555,1959472463917971,6724075959686169,3721431724647317,2325169820894106,1719461470643099,6141663376171933,98055163335582,1947362805623621,5472728336085921,1062265454900130,8406794320744603,2441464999887780,8382905449589029,3447069099127718,2790759863837607,2654315936224170,2557471253289799,4953149820658604,5630437433838225,5650224588757150,6443784898034505,3527308810683320,5762536733361986,2857818427626431,3840123825705920,135411200181186,5196902031227723,559336936231878,3584901329069000,4097782020987724,7217687799256012,8859992315560909,4616453495653326,5939516504077263,6940868016210900,4794640989479893,955510212705785,5939311640732632,6975719381820377,2958714226869210,6639842480575311,7358445198547209,191598411457504,2700711669748705,6414143064881449,6230881572242407,6131691779643163,9084202317463036,4895698867184619,902635657053166,7291819492885487,1140012540019696,3089609529942184,1336791348942658,6037916889265649,5803210749600756,9201102619219927,8806073732128937,4670831696962552,1447207739573243,4519324738618364,6378674551886846,5221164721529855,1401111668989440,1172164637492226,2738453673972739,4430331254932484,143345725674503,3424706376942600,2935382216684553,7398645495005615,8649348406275586,207114001673048,5031676755428370,3233217934193683,2314307504759831,4622031643980825,8782668410220533,6467781648278555,6317446696251039,1171980783285280,3067442679313441,8086684555007010,7668647640888355,6035460513596455,2114613282968616,1002190466327595,6380298097696463,5968997109409970,4781661328942132,3898855284159541,3809968830055478,5779594307760308,2715140864083002,4671377037411387,3991881398988981,7132268710888512,8810737386038112,470398414697541,7328693529453638,9078229346763847,8109200655040088,4797600445850697,5826009492259914,4986328008868023,9014271563277388,3774411384146786,7866375711778317,27028192131895,8550510119265448,6857309226427918,2513275657722041,8504418124477528,5454561107606372,404290363667548,3955606250837087,1156936765056096,4647502112306274,3452461995803747,6364308473326712,3453716837938022,4384444165534822,2748727722009703,8268762812580208,652324546143338,3387950719650663,6822874574181484,72964967339119,4269724246881393,6087198742722067,4089205168440437,7933109475959926,3748471822677112,7062224376218745,6252429507249274,7643703300975466,4449343608685694,1645138308592768,3804345956543339,3322417381274756,525252278916230,8918452353679553,1974598399054984,6508832892249227,8729360821515406,9168096297381430,175896512464017,5705596755349709,8424605680853187,4512763559527572,3747058568012949,3398123071628439,8621843505706137,8405523286193306,3472461633787037,6907437044057248,6656894885037026,3769592583143344,3151103808181412,1594708228551845,2054121759032486,9157142940314481,4229472544646312,8827803687770094,4728552000332971,5240781291304108,5483272129254941,3406486889866418,8277556558095539,2937407604864182,1995986330027191,9106313778422761,1580668012123321,195539820147899,7059993799656636,6623373924644029,131111881973894,9120110479075663,8659657583609024,5809455706822176,7262014036550850,278740376483011,6047489833534326,77910711329991,403533047342280,8927947075315916,7338238661022926,4353201186133199,5010110508581752,2953876267695651,8364770154452180,9204064322864965,2892682767344854,2581034133583066,8162162674861865,5810990663920141,2746740739822815,4970771199730912,2657628209997025,5195954271335650,5970012582401253,1179155664979175,3762389731804393,2607549250757871,8583313711604976,1397245118305521,5962016065201394,3189533497565395,5209967103649012,7268794764750076,612498938365174,324230192022775,4856702291195128,6986109377038813,3006981149553915,3354456329798908,6747852412978431,90754929048773,7728415271490819,6997393881425157,2114111736337670,8033248447320961,2249465920644360,5848533301183754,7747901425624332,8181072562001786,3579385405969678,341008182162706,8752921214539031,7456846622528333,347157609198875,608678462596380,3580531272766749,1445061699550085,524550263956769,8320452755817762,2831593290445019,2144295051339044,2644740716631333,3780659210183975,192784729875752,4198112666613033,1710580230436138,4935406858126636,3141363853260471,2878497757259054,2538038350386480,6031427847992626,1953999342060852,5995058603178206,252863754782006,7561407903356217,36460262049084,4776754467501375,3293236782540096,3029860654573792,2546086870418754,6175418909483915,732780580443461,6042509842663245,832839452246241,5040658325442103,1608487223379276,200757532242146,7378306770819230,1668731490461007,5038763940545872,1080255820551505,7450634403829075,6071655422456028,7454634398513404,2562883673752919,4466484413501668,8007845070882140,2923707812386141,4506683330823519,7093607097488272,2909476481185125,7468684804760934,1934324536599441,6103095659902312,7026407529956924,8856387153205759,4390468767561071,7260083367850216,2750408660657524,7996021118950793,3932987724551543,7559991823487892,3682634219709818,8725394809885601,3798049828414851,4289934097810823,1000793834431881,3625832106907018,1248171481961867,8153489318837903,6063316204944962,4998564553872782,641497577649551,4150969856927121,3514751407928722,1899901071011395,3433564635899284,7778635003461543,8926606378878358,4490205982385559,5611242976720280,3467727537157530,3963252660082076,3764174567576474,1685746476848542,1020487038711202,7556093500883867,3633897363477924,391890777097640,6016527992034729,2722975644081312,2862025196574124,806065740141997,2158209655952814,8876703278388657,3477204020958642,1615805749241267,8445002148701621,5326400466580921,6154036893141919,8632367232677308,257814287504831,3542568308544960,2109338263586241,4585567380870595,1497370230207940,4810915518237111,4011135044584903,24997698352584,6564781728314826,1876207015413196,8694040690017741,8085474088994255,8112973404274068,6393030055892435,6084433886205396,5978101212931544,6494693793629511,924337930096207,6695301922022877,1656573957604832,3473052769015266,8439847584426235,521826936206820,1009557435291109,3639144062502374,4960729051461095,113769038976489,5901457998218730,2493587897258919,1714919908509164,4870222823667181,1032156297606638,2961425221989873,2951668163790323,2241011611182580,8372994542765557,1241668371932662,2437548500827049,112288126498296,9121501347694073,1648687757559290,2697621990856187,7761554913336234,5851095604147710,2830811517908480,6095385139958016,909557781804548,6469969953138899,7545041443454243,312258088334861,4189633671095822,5604425601271311,4256472345023807,4969201455027730,2304539911632403,185135589226004,650399733249559,6707424487466522,438382781212187,849299192264220,5396049380890141,4999448341653023,976819860882976,7596734866439751,3124544497793334,1138218115835429,8662299423280802,7394479202933157,1277145842427434,7627623774447148,5638490169501229,3618063291627055,7305521157520216,6533315474228785,876228623607351,2696906355795514,3348809923047007,6958783073384469,6371200743200319,8405880525875218,112565798999620,6595576037684806,5212727640540744,8671955716333758,4803330485364300,2475314713904717,6410956210734303,3182112634136143,8127598629312474,3894574025987000,5575223360587346,8315031461396977,3118812205090388,333578810836565,6673075227376569,7545920143988312,9184548164290138,7416859535778063,8442323623131737,398701726680669,8466679623792222,1056399742412383,4800271459223136,4904957393430113,5744717720528482,1712021931808355,1917462362719845,2811749323396711,448223986562665,4022435671189099,751349278225892,5398645320607343,6009858873992816,3237005651498609,2127019697219186,3863911068636789,5279339470612089,4175742948443770,4610472403542975,102505731352189,1844865274898047,7084825750111874,167043047663236,3101732378482309,3914532204471942,8345018156611207,3084853977048713,7646580068996746,4138952658170373,5709386733987468,7364359081713956,788699946358381,204848266864272,673908089802275,104177745548946,4486813295335059,3132925813753493,4626708574213782,7095756527081111,4387175842088600,5074390165059229,8123509697168382,3696808032433823,8862154917254818,5535262954522235,4485090167125668,4192146299426469,273169705301671,3360793887233705,7229128039700138,1950351940048555,1094707686561454,3844780248437300,3658380591429298,2655394501641908,4514736590319234,2882933581583305,8874584549734073,4933073889617594,4445653405824699,8654212608976574,7630602893973109,3807404653684416,4413295314859713,7695029361133250,5837212415022763,4599602302269129,1418938699871946,3469733676910284,4256472601616674,4728324470884046,777079255471824,3292486056879827,9221187093427159,6880273180763769,5242697689642713,8162665901676250,1443986292471515,1211839407822556,548429738645214,4936040132552997,3395256208930528,1528772869977827,2390005221267172,8732260374593855,8790794176916631,1594814692912764,347197665990378,2927923311056621,2626231062845166,8893864147363567,6751401486718704,5155138033037631,5396703796983538,4019129042671349,760199217039095,367745128085240,3159271588902650,7688228076050047,7542096303740669,8932240705804459,8475159547552136,5421526603483381,4442569168074503,4523320794685740,1053649852479242,5387187980387287,5143254703216396,3208973197969165,268359922841358,5327896939939600,5412811201063896,7357265337543260,6056199433070894,8655614835185430,5854400033650347,5370976620489060,1858217593308953,696226102495002,4665359213123355,2570809912824794,6256307221329697,1233591354898210,7735252799121699,3791666338809637,8606861947601201,5973120922098652,1616818859835146,6976540002453291,8138960554642397,4274270668896048,2545335484921653,7958237890115892,3496543980542943,69673102473021,978850611402558,592914453369824,861506284070722,7035581127345803,8891253442758468,2458992410273605,6839546289682250,7329623042501765,2224917765082082,6430263639840926,2502397184612176,2312878396041528,311935564800556,8046903434229589,5101381471946582,6506436218615639,2597745694426968,889716034582361,314975620839055,5386975842144570,4004088876922718,1790960854784994,6805822537238843,7762040419215205,2407186399323232,4214333815701925,6572195292820938,481883942840175,8548858264888531,7970309105624946,822834791155571,1405577059608436,4382998701631350,2391614908888951,2273838361048952,4875402652792697,4481182332098426,1262212902098933,526853813766012,4923473416263317,6480414174873798,7392626678856000,4758366609581954,6568326263744387,4209896144758660,2868657437681302,8244853440076704,7538004910208903,298387923916680,3217544566048649,4783788878858123,2780876524840844,4157948689913745,5167755899670851,4160126022031252,7211587815200661,3517811915720599,5622037961426840,8278752712221393,2137309594802075,2976245038557084,7984135389022111,6608093928636191,148554695608225,4166793510987683,316987780945828,7867289030074694,5606715795629990,6236532602285041,8482553776723882,7060754181874181,7834245858351555,5754686370494109,1961244562487216,3942606670972849,3532119970224050,7495193030954660,1420415050020789,5888716618704822,8104617108215736,7268808721524665,4922802361003079,813707845928891,7014365362940404,7470985706406218,7616506808324348,7099137001969602,638345944520643,2263586660612036,1285144604825541,2731948431343265,2025746269927368,2032707506718665,3691655301359562,4611668183594955,8065217190085064,3555009350805453,1156577842927566,7431652391409616,8649394277585912,4615902923122643,1934642885273556,6637682849675222,1585465219251711,589306945214425,4756206974506970,2392936587491291,7245559411074837,2909449267180539,1830268693993444,6439269081049062,7958635627392172,6482774423107560,1501840430117884,8333886829919311,8884338078849004,4616502799477236,4726650901227502,4141210681509872,5983240135415793,3309153399130101,6572476717303798,3213988571539449,5019550983284367,8744065506162346,3970807947683838,1113547510077440,2542333869410305,3761600094219947,6283479070741976,2104519934924809,5707762488350730,6416467504922967,5035820082341900,8196437216307216,7980626262099986,4871056328320003,2641068255975445,5832840342272345,2039697840715802,1465483891283631,1608049624985946,7685344253958174,7465235511844081,5786714652692255,8074196417678700,77994864769058,1158716490930212,169624182697529,5723360613174961,1027100588271656,1441917924436010,4561601483175980,5138977312765444,2167242595203119,992078532290608,6057434412714033,2651809316853810,7206166905503411,259088076671028,7765584890341429,8805057349851190,1366139758544952,1209073613719220,5950527330869599,1667077910919228,8014596945296394,2774956265109566,7506658358073407,161713858152513,7758917928312881,6041958250575939,4807375879878724,7505548277348022,6082291677947974,6717894818345313,3139049017825353,4755616487254090,1422646266615883,2471359141118306,642572636960849,7039665049380947,4573413309990996,5313636444859406,1691442091018326,106269743888473,7909078543041855,8445169186490623,8340146385933088,7661250562885728,3422844413151330,3816796472084155,349767623575653,993631974471784,7339193896830773,6552739233923280,4490937060186221,7775585762742974,6944077336655986,4765676198175763,4642336363096181,1085464144855401,7293683406904162,4015601695991929,6991461334364522,6843224483555455,6315361274449161,5824178611957440,8498804388745608,7489510163736939,8794310088809494,5942866442619014,5453101510752391,3554172356249736,8098712991035756,6364092936832023,3889415131871372,1954489883617421,7935729833474190,3634597400467599,5202817753598098,4414847417299993,6091619280590997,3104551481378967,861763781830808,6670861739383652,6441120088371567,5714351036205212,5487175665236125,1983836608227486,8802100285823135,5418577314388128,6017310024020336,2856215005730980,8732822431732790,6873795952982183,290069175568552,7695949051159580,3717724958857386,3738568221599915,8143701867665301,8706267909040498,6483571136966597,746472455915695,6166747151939761,27141746342066,7660643565502879,1957701014063289,5051432539269306,1616248529153055,7237325245337973,1024116778875076,6442802221397837,116289689660513,8279833769011380,977225551182025,3332031864527052,6336152938842963,8820469014821072,4809083691972819,8955759719473001,6662084573563093,171696315934934,3636429086234839,7777935864305880,114691889174745,3888349480073435,7281161084531185,5591261034281181,4804752665503966,2325350755879136,2084704342984929,2302143995115746,2013662489618660,700059310672934,9014023793106641,6161629748783336,8631931222106492,9070810295686183,3384681920227564,6291118634244334,2729012306712815,4975547522894065,5701235894830803,4516368021698637,7938505541344069,112010714228983,194993789581560,6294159053277434,7423169727770483,2616708825090300,5394532950534398,4221618855090431,1021792592595328,4339327197772034,7647411007617283,7949556095600901,7687155926907142,3193721781111049,1525562526492942,4823682473445647,6946423621487146,4453168290154771,472429909944599,263511612897560,3005208739989786,7746018193678938,4578832966617374,8168079143819653,4351681771030816,2625992604322083,1515481216234594,956794137753897,5883171429841194,2040559331420461,2870439748577582,1817302344161584,8073178195030644,418142356576564,159311917533494,2871273779153208,3912286671615028,1999653908166971,8386241549871420,9207771226384778,5903758834940981,3671439528499520,8712435249152093,4615748110559555,1022825183910212,677989565006902,7431593957501258,3552450997041483,8996202321530594,6047907013613903,4338663515134290,5530939248102201,8476083316963670,7146858824778809,4867127090386660,3950002242062682,5351690995211302,8644919563745805,4990114287917405,2435995871201630,7335863100684639,2589398439520608,1039104718731618,3182324679992379,2469283444599140,3009046704019813,9132746182173073,9117069225142632,7184031873857897,6616110992083307,7048521249216876,9054867349584892,9065279914220510,483348184811890,2408363197917556,7923291333080608,5476843305777528,8942444219240852,4650726365129083,2336944292198780,1632042571373627,302061048252798,7122424513468821,4483687460215168,7947015422593409,5271087950494085,4571456238381446,2495673317636489,7121871589837194,3974902811720075,5940203619654028,5202091655940494,5891341019053805,1923519840848274,7031358356917315,6311380195694991,4374531858158,6511931844303254,7670831243653529,5471159988681114,1468435389131163,90466295445917,4882325880806469,3697015043361184,861392469825953,8871498119137699,2066381598165413,7053276770107121,220404521261480,198176128092587,2087057658268076,585844926888365,5694496806640046,7922745855910140,4112215828220339,4974879756798388,281787080075701,4603016361605558,2292604692341833,7593967918787000,8016739934946164,5924556079905210,3366240040235423,5735395064302013,7142166602656190,5448333877590463,5340323227027905,7495969566222786,5354733807924299,3282079768381895,7537762956503496,2596002053130697,2858773104474571,2205124924643789,5445580157196750,5234429116408909,7032066015697996,4279881745844689,4192794161777106,9049022559096876,6951647377689047,3994372702534107,3156480916105693,3066520441915813,7793252700781024,7679109584230881,6459771538178399,4664960338958822,636729285540945,2478204206131689,9197956372912551,3875843314616813,8400496262388207,9132365090202699,1740395278342643,2399109144087028,2458019191831029,3936481708941320,2752423935891959,5117041546701304,6717357464484346,4026157818993147,9150178791237768,8617779800635902,3959220638104661,7832780204751361,6835792989035010,8695347109493251,5506034138503685,7942824813963784,2949484647451052,8196924189913638,3301669530810893,3813012330342926,3933430968146447,3303954823989777,6248106340625857,7803850822918494,2423211172870677,1855176227306009,4569580551293466,1337823682935323,2953666328488476,1293840135957021,4572260837272094,2290713827170847,815093038111264,9076818340918242,2773983446002210,1969003266570787,2570342328998436,3253389873315590,5021704593009190,7091845478439465,5956055493220906,9135562646338092,6573178773535278,5242224438516272,1808464570083889,2994454008158770,4554459828072883,8348967741192757,546390065056310,6261981522937609,442379340315192,313805160671801,1735998386338362,6688461578349663,2818908710349372,1399138228058685,5549771844520511,6989024585214528,2410684384658528,5560746404964207,16762326137412,76535402502726,3982947229822049,7325513255430728,1703896678484553,1204751753802167,970379093068365,8588972619104446,4913061698824785,4368264860752467,6421972862233173,1887627906882134,6407545686026840,468082959264345,4726764845140570,5097923645594204,6078840060521053,5547319169652545,1941848674514915,4563477645695586,6082723240413795,7254842316319332,1154625347894374,2917966323538534,8232192801553000,1327617093048938,4043655672769131,7962449713306220,5711271232432749,5992708612483695,7033454540529983,245157799366419,5144875337206388,1802457946327669,7685377066969718,6318698370021757,6435137973929861,2213129570848532,3170370480028284,2027378035780221,7531348323445055,5593545597857557,1868792621846596,831742079781506,8674328407850091,7046263851764358,3713280205748872,8486090814467180,2646300381403787,5943804311894669,725612429273743,1686267532413585,1687738124008082,3556170538121875,6131461397608257,5527276576259182,3164525091077613,5205132416916121,7707589327869064,5479900336921243,4279237597338269,1753308552137375,3951148041963291,4483026856942244,6179522706575814,1060592960068262,92718753643175,3932786086263464,6545724660796074,5723311075347116,5981944925907629,7361861297192733,1537020432648880,5719996115521992,6098876790831795,5376315427923806,7109476990114490,668015719307963,6517687710788285,4552055457790656,5426426969901761,7130606621063980,4719003487095243,696766285662917,8836870118505158,7822350133554977,7685169946280396,268748182387402,86709255682763,1874542107503308,3580903455144653,8563051323956138,93640899824336,1604112006613713,8610160831974098,7105582433646484,8643954535339406,23555715885782,3923851352328919,4849657711811290,6853818491443933,1004403388656351,7688359111256528,3119791007357666,8887486014659299,8515655204187592,1002750953623334,5250521463216870,266747475753425,1655306750790377,7344905684425450,2017863976585964,2986301274485202,6943981820680942,6848926219890382,6897455443221232,7727464238473795,7217042959914110,5396793497098998,6290564952099575,2834613235985145,6187926840089338,3202400544324347,5889469567901482,6834292678634241,2723446825937667,2559951211121412,4479140437973766,1306937454668551,3224023476960008,2796165567564554,8535668077465329,4654119389281036,8625386877098765,1378241694567182,4992729261378319,5904640643619601,4504734637316882,5961699015506707,2864649603717909,4054825354459926,3677744119175966,1692805704518431,2023409032137504,1831883332937520,1672690280184610,5364423909433339,3243666353441572,2805197600615205,110288166800166,2020542082984743,2217824728075048,939487867570985,7018641336748842,5185292997025691,4990934060489517,1278839460809518,1021838098774831,2973186577349424,7175986637786248,1703437916199732,6691631711775541,7111025462831926,3608650679937847,3858229711407928,5250346004804468,3385759904131899,7228366762040125,6585370552089406,1080442269838143,7912365981145922,6493199051918148,3541206393355077,2332595734174534,11229636275015,767973926198089,1034854861581131,3829536338807628,2040014371208014,7878723653932724,1035348009397075,2029010057673557,3874849752767318,2115819507100504,8850295154768729,5689850328001370,7103582283582302,1613625605184352,1929741658729314,1350584707787619,1034885899455332,5382521049324389,3335485018852199,3496300154555242,4485906862390123,6838513652210540,6398465238080365,5192118225382254,1669903458003823,3960985728187248,7249876427247675,7097091652696946,1057228938897214,7171691819395958,5452767111498616,8039903998695492,5027736341551093,3032025711852414,3933762238540672,2246038028053380,1709558837767045,406558773073729,1053824878005128,5682351946484887,274792493025090,6992323072998721,6245168367201167,581975715634328,1801275206256617,4406434682506132,6484820882770838,5347820317326235,8548911320652701,7353444552170398,5797501542288287,1833417472609184,1934678717528993,1933040317668259,2516513634028452,3703190419827622,1646305274637223,3533346461072296,1161781685103529,1074386720163790,564367073866650,7551743307844527,7445570533627963,8698332590274010,5329499696528308,7501546713299896,4270463302302196,9078859797314490,2269985197005983,8519953483517770,7302732293254078,8532805382191605,6670316638313408,1093706599324609,8676858659765187,4703163501472709,2135096604875718,4505243674655687,5391085785500616,6507930737006328,100178539101135,3510002526563280,3005312060169169,7640961431793450,4497569962052564,6637431292005335,4835822447066072,638821914299356,7928561941044846,5790268325641182,803647069838303,6559796418513888,7514710390989046,2291131537136610,71889932481702,2350095992175591,8379742054915481,6117974944136169,6909413559933930,8776679386799087,2331036032591016,8688414473272306,2281558473473012,5896561533201953,1708154517788500,7115565510267391,4260932176202748,690623632202753,7136366336519339,4035769082387461,4107344791612424,4610348469972140,2868199030500362,7778505994521611,1709208928259084,2494415491640334,3875855472385039,4368193544776721,3326614806453267,4389089036844052,8737311327037695,7452536179982169,2765356004920344,3067617749310490,7192890840165403,4625536036531231,7368934697151520,9202252780635886,7207909486827355,8485547671291596,1118079781960742,2915178544995369,7285601081433131,57519546244140,1951801563728943,7910855219076144,4670046822136882,6910292243573939,7503254590684212,2639892256308277,7317037294844983,3694629211962424,3193808567004217,7928726925117917,4546673823771707,380669326629949,7425948651289662,4230534457396287,6789449282313280,6929971272725003,6033477696003203,3095274585087045,2618291197369414,4785950324501575,5364884025867336,8595028790210172,5942065384086603,4650047259597900,4226025292930125,3305961102863438,5333169923062285,3132682207292497,8888318446984276,4452597574728789,4728085340953686,2215280247524439,6939212606106713,7747383978789978,2269377666280539,1428791016283229,2388427212098654,2772284167605343,7170971931843680,4773995158363233,5873398543133794,4455923178929251,1437404333118871,4702020635057254,7381503273319528,5288382662827114,7104567134600299,2131871061990508,5324358032551022,6117684355693757,6053610728696946,7409718335048819,4090342487829621,7114616997158006,6425500222246007,2341001259207800,2346698706320505,8077700732685503,4438518309526653,1262366023195776,377510398200963,4746402769931397,2526240495254663,4616352188554376,6820507053972618,875134964763787,5274495159024834,4039708618955924,5420519881276565,5384659971673238,4011465562278425,4772316598254744,390926245878939,5912602551437850,17551373616191,1518556890623136,3578996623416481,6168335431371938,1058355358276771,8245287469210789,2564931009789095,3167718230972956,2624878766120106,249343933607083,4379470044904620,9040259016362470,1598805435575473,5951537149328562,1250420615792499,8714570880644275,7444257571000180,2985637906971167,485435124329661,4524912841100479,119508108840128,1539695516200130,7195113659939353,3394733054252918,8720147859560615,8501902506724551,6975930551434444,5598442556102519,5963960854510796,9072134479724939,434981863890126,2512176449268943,8837658774396113,3827295790337235,248202950098135,2747225172085976,9149955693775915,6694779096151247,2940092630809820,7279256087898279,6982012547558134,7709174679675429,5840654394674400,901931471834337,2052003813551995,7409653968190693,2548573979716841,7510868637162769,3275045253418221,6781179540163824,4593429204483313,265455171421180,6110625273466067,8534658835680801,7507032567839994,6442476629616109,3589424049233148,6391604629121578,1041944326585600,8854351558372610,5413068254633220,2259632172825864,3230869729714732,6216094863617291,2169218424245518,5909444756462808,7114833387841411,2370192225385749,3810328094993686,8724133974849252,5399031890362244,5243256295096602,7837993816116507,8803596770229534,5690144975050629,6909954439336496,2669853007211811,7627974237867202,8674480320068828,6221362529099655,7323538908970284,1271152529340978,1956939094953262,8721729471867442,7520651489393624,3148897366994230,607112132745097,1526388199669049,6527494004212005,2109825994698043,7282706113200010,357076974931262,3965288345267519,7783436286160192,2616447217909057,3114442623444875,6406823887995446,4241735492771144,4868646329079692,4364710580399434,7491937067201079,4126783858257228,1747134041328975,4581979074080080,2729750267833681,6420081045149121,436440873577812,6375221759576633,4694241603280216,5643764392172893,3262376948747614,4769816767098207,4528396427304288,252861414296929,4294068497886562,6652001087071052,4274823311166822,1659848504113041,5242769956470122,1372323191428327,3743961606118764,7094250651766126,2861402905415023,355068611980657,6844714864541587,3020314390764917,7917771061107945,320800131693944,2943776093321108,6373238951857531,4685739954195839,5186697947970948,6921739629677957,1930759754111553,1153526756527497,5524957087643543,469119490768269,3260711832345837,9065139632741776,8625407358164370,2132734055665043,448962290097556,3113226145811862,993024786300312,6227358377586073,27362219888026,5510891111339247,5016591687962014,7266068570217069,9223118495385181,1285226976702363,2194026537071857,4005664091823528,5655837810494890,32603191963564,5581874784452012,2474177960075165,8406285518876081,3461011284749746,6608254712237299,6947510681365941,769954764926391,3603565353926072,5352271227420095,2435191429074368,3670928756870593,6845439856826955,6404438765513322,8190096274275782,5342238240909217,4326387855506888,3562717374600439,2796008949358030,4083749572492751,2055835598859733,6269258288094679,6683574890925532,922005921377760,8316110361879604,2492832332619236,5069989781222943,4265012663107047,2606343929152764,924694737817066,6543243339476903,162617004641772,4212630335229282,7626651674324221,3441475510943216,1646314243919347,7553125738852633,5615689609387511,4741591851965945,8300249861066236,8151325185288164,3173424444231167,3225178300018176,3953063107825154,6581963536019371,7305022208482820,8920527252377698,8456283246661127,2120418862012154,49527390027274,7641508116359913,3758221620808616,6083556491451924,5648553106906646,4965308943456857,3512032577594001,1352371759672857,8712477724016559,7716612187915885,8794616942453649,3598426031321008,2206896186809891,8416499520380454,3452169951694375,2443922235346472,6481777437923932,8244811689408505,3069588084448814,3412193769311791,8790139427952277,1632545932299825,6200314684354741,6898433679531955,8616814245278311,2905708840230453,6732851017285071,492909452725815,4101024717622840,2447613556088377,6742509007600715,7350518350345482,2100350594100799,7124479225921311,2633509876997698,806540983549507,219127232708164,2750369727553093,8568508094717510,2985173944610375,8509392281324262,1124632343461454,3265854206172751,6817438024151651,5483969637555796,971475441995351,2365414048390744,8294501393942780,4810411704371813,1526039318580833,8348394730450875,2392544648101477,6543550232460548,6564680067411559,53825696345704,2122484177682025,8194824533876331,1735392745832045,5939766083862126,3051255902187119,1727407727988336,3744877234597490,8763922766160948,7578470472863351,8272734013451896,605400539353023,2796934217008523,4217537591205501,6749844396871765,3254156206685824,2833087346273922,2211096632368775,892684572200909,6655171521656293,7315743139347615,2012301316677261,8996701607342157,6306340748892781,5983223634987603,376057577697219,4494109223323307,3987702310780566,6193677916929305,6084354772520600,8237707056594585,1699078812835482,6358535365272265,3037301542633117,8227906039488158,1350281300930207,2262168460414625,8206673693474466,7085671967952539,902198334791333,7181031960092328,2959250607480491,6503573632024239,5225705399453287,3421829275385521,1184469739507378,4553428221923955,8851811738050228,4277335625461429,5333487387721398,491199959981751,6931880560750517,6833986613242769,8997639549439676,5978794435033034,2488857113487989,5101162188410560,8838840152329922,3231253089590982,748493633127713,8262922047390398,6771221685192572,5639932700145093,2031192927792843,319090012647118,3688537180270287,2709854642839249,2054710580080339,7081922194272214,3304166496816853,6349307440250205,8805719932889721,4835385556209368,8259532203304462,6360675825202525,6664010515355359,5141654754672352,8018710857953232,8843712291188450,1981154059288291,5450391152627428,8917186760867558,4551215811366631,5046578576500007,2498401103564525,3389100120874734,4414231401725679,6267931029091624,8036829034228052,7748057621980048,7747804385140471,6164115505409907,3075220407582460,6981729297519914,7143190133141251,2203909323521797,4583489982030326,1732130588516103,7380061455852844,2431147396931338,742449454393303,6330682841846402,8079967605040719,8953029598707772,72656062656272,8301207175020504,3683461550546707,3156079150759700,5182364117536046,9054282374667368,3894385258729243,8200159383064348,598274857897757,4753827992887070,785842719842079,4724731890605856,4719429313871649,8547389958967076,6134118650839686,3148514413817638,7371963542662951,5010252471820074,2535876467420972,4246360202440496,8292647137397384,6242121013485364,4121067860008758,4111711852744504,2133746750881594,7399478461767483,8976303730622268,6393962549382978,2777956427972420,116589162149174,8730346387850386,8993411905553036,3223034165546826,6637457876930380,5506106076471117,1899441711775566,8755977848294029,616882705096529,8583974846336850,4225686076387155,2187887423180628,9006213841505390,4166152299904854,6019388182359896,2428235422771172,7352562116380613,494826214448988,2016164553764703,6241052815601507,4162564648951652,7513131209846629,4532618279395175,5005989433111868,3637533446136323,819228047714963,7197362048159604,8044184034230448,275037120221046,522371324206967,8194476540993400,5855779389325177,3143797722484603,4538603488898940,4189143409770368,6475663627837313,6023117795517750,4211982679515012,2708478246412950,1073290951532423,3319393313206154,23956976762763,558735877332876,7074722524225421,5619665844670878,6036467608063887,5977905926680464,3112190251462546,6230844835953987,772304653207534,5256658960261015,7865022085201816,4514245792812955,1025475811135389,3544329638719390,8659205105741316,7904539759793941,8549586904743920,2203602782592944,7965610324332453,167894249090983,2605011208343467,4606987865481132,1093529392287663,768617718185904,4764367314893737,4882316627972018,5335523765858227,2375382411513780,6122783274049461,2681841310609335,6913993190481848,8871264898674617,2779551068544955,7998964700604762,3917053492559807,1980568214822849,8775685911277911,1056815373995971,3417344214880197,3693763861548999,7683691933540297,5578012417638346,1177183468310475,3713590386069453,5138344280182735,1130056091934672,1217130105655249,2508983603584979,2153136934395861,3076244208144327,5282269621559255,3234906712772568,4020199739027417,4799691354193883,7668082082085649,7789643368632652,6268954209479333,3526496639606752,7783357175270736,3260719496343522,2764657354948603,5515833410822118,25771393241063,2438746107822056,1933875011141610,2827861308312231,6939178355866962,5195899241148398,1812744655888381,6318558600655561,6167372250939378,611156861902846,3008131021697016,3151917161098580,5314744005980154,3490271597518843,785449897168893,4198370554085374],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e0de0a27b7e73c2def0370febf06b399",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000760595.1/GCA_000760595.1_ASM76059v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"BBNM01000033.1 Acinetobacter soli DNA, contig: Aso01_CON00033, strain: KCTC 22184, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e0de0a27b7e73c2def0370febf06b399\",\"mins\":[7160726457131008,5149933051785218,8454581775576406,7282666301820934,8240881570119688,6210384363933705,1626393770913805,2464359493407405,1689385501212688,721793903500632,704746499010580,8958198526731609,9077635387854878,4834795873722400,4614893548933156,532328190869541,8069123410661416,8267007529017341,5985021999071277,8041621330919470,696254264606767,1288129764696113,2346699204276915,8687322391631977,5361695143833657,207791344025659,7715564733370431,7622413381991776,5055766885822532,5848800283893829,7505657660646753,4277219559198795,1250918773391436,3944137757397005,1730633013162064,5411230398017617,4692369211002963,4441872614649941,6835422804844630,289833817481303,85086584324186,7573756103012367,7017148345720926,3048478559739999,1278627712929888,1569817602165435,8081902685442148,7800220735766122,5454154611875945,2134383777157226,2405462988259436,281723562700911,2888588239110263,1558814876397689,3518710450901114,6415937440264321,8636707785519247,690924247153772,6258978015953045,1053500455518367,8130842119144816,2114947472953506,4690197087211683,521125425938596,6904292495900837,6266741647954086,1494685885812904,4040642076229803,1896879783919775,1912486077231278,684883908051120,3154218302570673,8194779079327922,6214100024062132,4604855510033098,7037958303412414,1692892120350911,5977667860508704,7488073850085572,57028277276870,551564483641543,7140326482698443,531302627614925,536870067344929,4007630518014160,3209097849021149,9009355095338361,953224532504795,1952468775480698,5436130396004577,7858431029575906,5266099862196452,5776671393226982,4153550166487275,7133890056962284,4570682923676370,6668215466004718,7561773324783855,1802314703933686,604519551607031,462681509007608,5706583461449977,5431289671146889,7006605065392387,7993417765990661,2916651282137362,1672151023501588,7962510491689237,1653431665062167,5940100285264153,2939620583641371,82133968874988,4994308255379744,7480821814926043,8702050260317981,4894104393388330,950664214217003,4653907933113053,3467350068768015,7729607271149619,1356490595275060,2893085401997622,3415449346781495,591180827586872,6717777797058873,7784960548020545,3647691801309513,8029402470177301,6148291042099534,7924290370589017,8298955933579448,7307118954911802,3366757562601823,8470101866821737,3666549240955236,5863473289523942,6482744384622950,7850984896812567,4874510759526761,5868348512334187,3731651173646700,3196589207236975,1113059199676785,4766193909580146,5610801424687481,5817916399653242,8519468364882299,3190348168839549,7522301243896190,699849408057728,2435438137233798,8012882532966796,1824356325466510,3743588370207121,3632706761970068,5113731883418005,7768669726307737,3391888425988505,5041777569890716,6398633850614173,365249377276321,6748348044685730,5989243389084070,24277790880167,5252607902093736,3484708364980650,7110565206540719,7130503680696755,1858982925975988,7701414927325257,1149986618831288,8222167826272697,8463264633913791,6922053483749825,8000107071046083,4017626791629558,343225365483975,2324665841354083,7169091489817036,1373977149608397,2228349914931663,2308683393421776,383249739035089,6813336722194900,6337509621768663,6723982181650907,1300470278459868,3787280787722719,7125261808476640,4915617927522384,5546500308877796,4174821214777829,8563040589635665,5032157641286122,3458900083950064,6875245786808818,4537319880478803,7400064422576628,7953253855736309,4424542062277110,1472173916512759,1799860485628411,4701769054057117,2866826533962243,2115694205125126,2996013069943303,1252159149679112,7886559580990892,905197939548683,6650880368267788,6361193876726285,4173679575233044,4039451460313621,7685252309611034,2855419190288924,3635056276586586,3172561918411294,946478649074207,6352538796921378,7708876423225892,2266332352492069,2586528668115498,3811173741666859,4307842737762463,7645647079034974,2872551388688951,1008099683648058,1980178999771709,5648514556060224,2733442413122,5890531278324292,6405364327653957,3756125973484105,562698259916215,3548622153179724,3185610636829268,9106248751784533,4664740462412375,8185656159987130,3437149999055458,5952030307742308,8354945204257381,7545228108730983,1830622596301417,7271812494158226,4099827275514479,4084349401801330,6684040692085363,7594635918905973,6650570870630505,1102384331678329,1171687819010682,8133961620099178,4376542121095806,2094685808550528,101095102739077,5976311590036102,762797490872973,5372437442130574,360867885949583,2737981893837456,8013784061751954,4238074848924308,576137835141230,3025473271573956,2261515011805850,4201561025872540,6240423675347613,1025137341629086,5995082508950981,8551204681945760,399827121844898,6553512120228636,1898823040008875,4830919179790450,2701306276483763,3717047566475957,9149512218811919,4425833959432891,962812305057293,1839371411813054,7630657547825855,4908213721432769,6291160671712715,2367712432181956,3623711147266758,8119580399829703,7575431104212428,7268497202127562,6860835357618894,7075075888714449,1265937255084754,823625308074707,1214657674404568,4168136067203802,5465335809626234,8215917579731749,1880752069718752,7798112283995124,4348135126909670,8897803289715436,160207849833198,8644503259546352,5915356623213297,1192403528753910,2312942752665331,1615643641918200,1331011165905657,201185415447291,2556288638849788,2085158787224937,7267410426884866,3378924400624387,116830396056324,9181439506416391,1615609716048650,4838899349533452,7384261945066253,4703722728850190,7704543916087844,8014094727504656,2394546518332177,3764171371930387,4703883531449113,404383153136415,3774894175916832,351995008676643,2032117856883493,8940013104390954,3081394811171627,4480298919985969,263661382964018,6325193875256122,6092538676724539,264995423761933,3528413060375360,8841830463750978,4816304880980804,6170039057481185,3396923314283338,4941663366832974,2258752292004691,3939409709663065,252158289232739,7428280450663268,4164722131030890,6339847535514478,4464166035583862,1854471281275771,9183085589017470,7586974475236225,5691003992703878,5623371422770055,6192939086775176,930633674068873,3672657533824493,4395422548571028,7796148060394391,7021771660272452,2018887802254240,626453907894,3707647458583464,1423078717342633,9108214618772295,1545775482012589,6122162428582045,662740863017904,1951403376366513,6328150081397682,7571863782577077,4731897639031734,4434902442066871,2816461354079160,4241847236215738,7285778045190303,6212372894602173,2069682340275135,4431413262140352,3882643191031968,3208263639569346,7984263854629092,2345825154589638,5299022727541703,5653228964586442,4035298594468811,4566690020972024,7637242394854354,7006075801193294,6880942758552538,756165438880591,5518797319652316,1104709900661725,5189093267760094,5570413533147301,2161048260838370,8531340148409316,3508619847103462,4005097590174696,8325779253761004,3240171983709165,3552865250664616,545652378682356,6245810157761525,3343581861000185,7970834910442490,1047429312648187,8179304708862972,7648008300303359,7582893833708544,6063680884777985,4271937340605443,2774043338187781,418462321271819,2113704224506892,2433106824672269,9214775056241678,6746453073840301,7644046839043391,2579710974018579,4706282430202901,270791336674330,1014808909411359,6204529210938402,6527041617441828,6606503736611880,1379777153881130,3372423653094919,6635133392196653,8167085050237999,5032969395250224,7573318159451186,1191721027052596,7875157093094454,4368072143393852,5078280329765951,5571178997036101,198996021515335,8313181637723208,6288514614813769,6431951929279562,8086551132591181,7192802821547086,3403481972786701,3553911222969425,6885279244444759,4114295160595545,3793085040505946,7070490066957403,1263282279773276,1772378790159458,4656750964720739,7365520664814693,3595374356653158,7744445728374289,4661641804518504,100362941891690,5731106010940524,1008443733111918,1546731914933359,8885078087777811,9184472402011255,6793838279513208,8872076827604094,7705205629265031,8125735270986888,9129574669697250,1330243733763210,3272602206088727,6985906167280780,4263756070020237,4745837244085391,805446926754960,5167464671732881,6232600877757589,1217529396390411,1807771187750049,3858224143684772,75149989195974,3862345210918054,179134002922666,158463456679083,7581453184742573,685158836594640,8842375981036720,1545360224650419,2791247739733172,2981440108291253,6553511322072247,1563087458931896,9097396863509689,5941437273007294,7959673628529855,5871536805737666,8724281113052355,8103448725457782,5143470009959623,1494228284568779,4147933474641100,495921720050894,7798315113720013,4943237978272976,4918071297594581,7977732369798361,2321408300557530,3134669147350235,7016424862131420,5670677306895909,7297930325259488,6745970975986913,3201334095766756,2632026927310053,5315560535528678,6647073982706920,1364148223829226,7948311730205935,6164232495092976,5739350123779313,1809643659519223,3829190770156792,7720141467423995,4336367847855356,7626165681265536,1643817792738562,5872434214884611,3200750834505679,3479726389976244,3032027000616201,8295025260983308,1363285959361254,5553380254971155,3225595068445972,1244226704782613,2802099227768088,2339998365185306,2911065916634398,2655114817840416,6190698569987365,7247633536681255,3071427822761259,8684489499079980,7878146193904942,7712262180087088,4492282638067251,988699783804211,5432879906847625,2330576719967545,2628141278496991,1056714344838460,8679684118099262,4993165423985983,2682222822720,6508797835138371,431833403348293,6252278180091207,7978024407534476,6764796922529098,851157464880461,7720665347089743,6059958148592976,1534539868415544,8860147956118872,504102289538601,3878536575948122,6783633786815375,9135402960940620,4524742980396384,4229641387726177,2611607603307875,1284850088514919,5684042130908520,218971936564585,7421845051503981,4915968384382320,3141399441171827,4659550142490857,8299718418740608,5417166444508545,6075697316394371,4822977647609221,5450936138507657,3022999711217034,1243557837071757,4511911578842510,2741534858007951,4323466166830480,3384552634406289,8685201020593556,1582184246456312,5040169977873814,6954497724478873,3954497092335004,6821604271060381,3290583866766751,1342566823581089,7607151564686757,4839035848679994,8568417307919943,8692374289778094,4944060663920049,3298890545002376,1700231270770100,4908198237312438,1944152700581303,3207768562984378,6186452343543231,1312005548496320,8422098130945478,8099086481757639,5112582134015432,2615665542600137,3960602035327223,39377648842190,5874417321821649,4134206233261522,3240422109571162,6402382708051534,6061215332812250,4791111513343451,6411457258300896,5102487731185123,329931254019556,5322771614897640,6319316317658206,5094432132457967,3393113248216565,8668345798675369,6856638813304312,4179775485728251,2814115595425276,6380894168188414,8830066960719445,9019748705164203,3809981700756999,6338977448375816,2561247055539116,1721106335716951,1457001741846786,5161495996560910,8813491417842605,5973976787783256,4337635887485187,8834351394588182,6689432088987159,9004421419701785,336370783696410,1075399218316833,5476921740036333,1642723557162587,8718316399302180,5851848344213029,6347096160511529,8969159090857515,9196272098010669,7426440494667313,1560699766388275,2785014961538612,4599289662731831,4841583575193144,922751567374191,3194782172878394,6287057029670459,6350091115185724,5539189539632701,4809480370210370,935197635434055,1796670846723656,8207499787224650,3379588367185484,3162879310739026,7811754500367955,1125593451300438,508477958175673,8878245779613272,6291969135478362,3100320627795550,4748111283983967,6529166911161952,2342633692575681,6573887726977979,3200908856358500,9060635479619173,8241671594189255,668590030072081,6441575425279597,8560046338892487,1073846034843248,6028766591772274,5373359469262451,4850701653567097,8323911556076479,6273174123366811,4080295929431677,1145621742472811,3789596156974725,3342728771610252,4420272644765325,4849498489394831,241375598667411,2129817953408661,5266900262528665,2648278719002267,8967821549393564,1745422066185886,2522465241680837,4201371166418594,4016211598075556,8510458257168043,833756046112428,1313402625037997,3536463610697397,7651403750618807,5473640583841465,3814144586172090,1664390825025005,4981561389618876,2498486828885696,79076613396162,7630459621672646,985606296233671,9013302975727305,987100373595851,4376734785328846,183946284414673,2914330321516243,4783258103105236,7901472979867349,751439697299161,7380569586468570,4895588455806685,9079601766524639,1336295060383458,8162610090542819,7095920473572580,8878274919659990,4437072585651948,6674594991589102,7069885938517747,6563372646741753,4232824702269181,1797672063477504,9102890705078017,6720416414148355,8833065661290771,4585720973289225,5768535156750090,3935822498428689,1306371945416469,7016826155919126,7962259697104663,4425280872113948,1996079965357853,7768597428291358,395509817456417,2185537797920546,51019711084323,286078298201734,8762164394506023,3839095442507562,8965013465380653,4742255657064238,1133556774213423,5054493703341873,5199911192876850,8867739642865462,2862490211354425,3200574500410335,2456388894086797,6960821945087809,5665834980542274,752696400646454,7235665885095750,8601351713091212,6044359334164300,3670671139272527,3607960353993016,2181322020747092,2671592555063125,94367585572696,4436180276164447,8471622728492898,4590175785510755,7510632427324503,2617788466045926,1298060738517308,4317677340026731,171086630545260,995997631334255,3967085791716328,1033634073466739,7418538651776887,8932909371162461,888528918722425,6601388824336250,6184672847816571,5769130817927037,3716964604288977,3575268324575107,6236509882066820,4002667809458053,4482420781627270,6011295860365192,6338242512788460,4027287401502602,3902893121865612,5282363988207505,8020274697443218,4621604478433171,900585830086177,8852444959958938,8935644687849372,6750540343236172,7709855470757795,2377616470771620,5999969929111462,8582728372593649,5539264873998251,9005049418811308,2571601783172082,7930800580626350,4519579924142002,3774870154050547,3714528187455412,485322415810206,8776624319140169,1422057059977145,4171054447835066,4187461179877308,7181920988837821,2211227217758144,5613154491566017,6869700556941254,700675561334727,5278346626123721,1156776430921675,4709096742066127,633694436472784,1890328398354385,9016307637964436,4813716897117177,5364396100138660,1477233596991456,8443021909448675,7628675861907428,6296263614855141,8602027747239910,491756761719801,4861967371372521,8130624585652202,1732881104140268,1801968223397869,1217460862326767,6838657543168758,2138424870574066,2412056477911028,1591684116670456,2057545711134713,5544837156456443,7180312871499772,7032768725534720,5527837464770562,872648820561924,8309395042908166,5900325549950986,7646078473693500,4144627725670061,1446158791804944,5762773139196249,4437731257247769,1804839835007003,7378941725620260,5357461337027282,1970619243804712,8976518127437865,8309225602910252,4955254619670577,138067788077108,6422054638151735,3619573017630776,3369594304337978,8133431047715167,5365997573015614,3489028137736257,6823899637250115,137813076592713,20662710035193,3260594115823692,538642219087949,2060544031733840,8914311753525333,8492181606512728,134467600900452,6650421120645210,5234746969815133,8039032703346783,3693816462162016,7727592360421473,1850250982991971,5943790092265574,7015166964803687,7630407460065110,4726637389916265,777889463396462,3655565521258607,2266393197566066,1346139976870006,5906642147788920,3469647824717947,5850190432798844,275564501239938,8967431429083872,1738930383386760,6824292944803977,1984678654282775,2184613625383059,450139814574229,4368792024135830,194685176023194,9110425351907484,7171897543146522,1450177967511712,7478120383322274,9054961710430373,3404167267582321,7666462958135467,5977629139386738,5790482518407344,6283039647561906,3555662488713397,6761916402890934,5828748965750968,573407277254845,147286574561470,6375213075750603,1411781450025157,6113728243591367,7043509477505229,46603382364367,3834840045512912,3620863064119505,2240595821530593,5278526616041684,7572008609585365,6001039617757432,8979972181150756,3120078360635611,4950171719480552,1706090175039711,4680338530384098,5148390219663591,1017343779940585,3882694851881197,3711565955864816,4131424591177969,8780862583851251,3378732549081332,8592808884754814,8254905234045174,129442724010231,8677299902925048,8465401833232633,5046907794180346,5638185292472704,2850252764432642,1489592069200131,9130740786489611,209697595148556,1109974282848525,8212693960214798,4701915535739152,863529682102545,6292958717540627,3018322149005592,6258882234136863,4192615462742305,8077925751134501,7353994205894954,1767759462803759,1359852915140915,1995409636067638,8791916529386548,6912213076982075,1941324276877628,8201170859989309,3112192936905022,8495777786685760,8159262905254734,3363387267729734,185274828015946,6873311898724683,7814176373795373,8053739908532557,3173489969572174,1251220305148985,736811047627096,6087674993060185,7810752997725,1947091033499999,3934134103853408,2284960105888103,7221543787325805,2093994799331694,3911275055524209,8567072603699573,849590324132214,1237271991060856,3936722421516666,8413210745006462,7182043230157184,5976081885120897,123427458419074,5362749675895171,1524340158556552,6142859365407115,2452569199266189,8319202273311118,2049175554746770,4607124926306707,3476547654658455,8099602839730586,5183970495887771,7021316325456286,3147631815055776,7814967406987682,6004484689361307,4186905605560740,3164264444591857,1640936446986664,7960721626096028,8694496674843719,5448302985402798,1681134445423023,298342838356401,4024317752904115,6247361088174516,776293837957558,2487238395734456,5580565859101117,3781676028316094,2306326322764224,3337822222055873,8702716023045195,1603397898041797,1899153193499083,3003389315176914,2297320450520142,6376510999034326,5515875051055575,318738861504932,15131212409306,1721860933873402,473397625211358,2690971028031971,7492094639978982,5152318999738856,5026166002170345,404796570335723,8071840496469297,1947931139607022,816589193406205,8793678055504373,2775692431804920,55030599555577,7099715911518717,8391469588674304,8531256585460916,8960445766538851,5581551678257673,201516037929483,6924566911863309,583846641850897,1142760437066258,501872549501460,6586759224199701,1321215840619031,7615493443402266,7541974201862575,3614670077692445,5474365673912862,6215664499632672,801121023207969,6999734765750819,6695026002553380,3099559630731814,7905787212241449,3104554889611818,1753278425078317,103318970669615,4768826219104691,1583269393447477,4335959339878967,6342381639158333,2402928878025278,6493376289561151,3256218579802688,3527381472614981,5790953430776393,613361069427810,2681205930310222,4412050665761360,2426009008019896,2730805340101202,7964110146017875,5631277085919828,2295965207165527,5995734597724763,9111815523165151,1141028495739487,4386334280673890,3638158338005604,8132559617340518,3774911331764839,8651890353042957,8818923785017965,1064956978891379,5741051927149172,1714882412526197,7955367249742454,6539420007803513,5945625616951930,9170564603320956,5204276692171392,4397829218462342,7278077419504065,2367937507854985,3072737549195245,8792833233899077,2397793675016847,5661846936734352,9200013620349585,6392089288653934,8878654212311702,9104807741766302,2053968353290693,1243905008084117,2308390470711975,3583677388398364,224606780070570,2501822254961095,5817617250208428,7517713346861741,7980721771801263,1758097193283358,6821592387066553,1261705150933690,992399264840379,5059491851446972,9217547376343711,6263735927061190,3108396925848265,5100054217356042,8297153892346572,7867520806938402,7350731125816014,7310694937639631,2705821214456534,2256594199699919,1691410283858652,86854467865309,6823919964285662,5842465453570792,806056015964905,347000661813995,8033164217957102,737865242077937,134337193405566,8859821141662874,4041723431328507,7589817644246826,6802473375972100,4458746810964741,4573274130529031,1996796953463560,3538353634155273,2578206082177802,8684070581961175,13840503425805,5482641109484724,4033913581800212,7114202895137558,333569558481369,771333163776792,1802676853447451,4449504840751900,6685921474836896,120321048570655,4871835760159520,9200877447482148,6049465308072742,5918495390575403,125472676567853,4510896570817326,791444983622450,5132963756768053,4889777240828727,8512559308565306,4309771142830907,7729118491388734,370085172235072,7901908382493505,574797667109698,2379089208040261,7281326448835711,4577147364711241,1024340938443595,1769876967103308,3532643012008782,2790577982077775,3098495824980820,291912715509561,7840317167299416,2067861866277722,966858261580636,4979570397458917,1827455145995107,7699732460317541,1256444731886439,424831392750441,1693132900830058,2015451779308398,8950320225553264,8862785177856488,8066614256085874,2471930643102580,3305584276077430,5867853790223223,3213009185738559,770140102318972,1289184791989119,2580336978713472,8678515456637825,4509235940604805,822498693880710,3267711642053512,6751447250013065,5776830351342476,5237580386814867,6985740452436886,8783650284203844,6304610460294044,542974896401309,5795840584018849,8483339365747867,7303401619495844,4185982199303077,7418026993073065,2592396808154027,2609596770724780,5876818563210160,5208423437278130,5206983602817976,4018847751150521,5319244181466045,5031999012340896,401418847398850,3028302057356679,2236830698689014,1912719708330950,2910209384287393,3068023639829448,892533671885776,6052155776510456,1991672692526038,2015808649919449,4858663130662735,8269122573278174,8688358536982352,8810935555895803,7726666682194916,7534766493615270,2489013253045223,727551416712168,5424763038055404,494488549342189,5487751092775921,6498999346269170,7265585683636051,1532148015754228,5788027523050486,163257410459476,2901410136689659,624167506238460,3988978819333117,3993048472456191,211388472310784,2570935138651137,4177585986587651,1629658088259414,5001112814775303,4883058163956744,6381603605257226,2311847398218763,6230711035702284,9149582499220494,3230432902396944,4711218020416535,4132284844403738,1445946383207451,4549794377456668,6598294545853471,4379722681335643,4470710614572068,3843686588572166,3784728492354600,3909328911019049,8142040633977903,2612542936865844,2276557853314101,6956632811387961,6917674882886719,1634818245340224,2603609390621195,5745793506103137,5712224118676552,962618608450635,3969166608673869,1758811823189070,7477346115520355,5759985957928020,481536297892950,3997615389084759,6739094193110110,7304584262836747,2855183789005921,4433055180430434,5721419292265574,7037987228498449,6488538185538664,5823623144926316,1295320572685422,5293620064611441,1574662171683954,2591381160184948,9093078699209918,1836495589198966,7822503552702996,1625515425049722,1556531458006142,5034535733477909,4088858927778944,2654037187095732,3485834243677316,7762501716081857,3337624985085122,881829689171086,3132559996599442,2337121983138964,4643136456125592,3711755691515076,1817219275164826,2305980475445268,5209590688664736,504141009783969,8484202597780646,4637549570055338,2987116701793460,650373027660318,6994426657160382,4519727202639041,4641438211022019,5162320352435396,7881463325703372,1648499848744144,9095324557692116,4623246238797946,4971675059584215,7604642337029337,5639884183407835,4452570665551738,664110440998096,4009926990720236,2984185536818416,3048291658239218,3290426436996339,1436692048362744,6885472464059642,1035033286987004,3051114378349821,7833277991656702,8547258169988309,2762406781037825,2091484465712386,1439281848659205,1706189781560583,6388812453969161,865322589576459,5213476043762221,6741942908333331,8935859578481940,1400467817383812,4118116045437487,3762834609896734,4049997072157993,2285753076645162,2669695613754669,6202532265475374,7652487072808157,82896216822925,2128004121812273,6856215222046002,5825033918070073,754532731157820,536782481956157,564434759585086,6052754886284512,6399766373436738,4592651211926851,8910274368453956,1707867934508257,4641134623984968,825033008749899,259889220650062,5553041690545486,224369956613456,3598672740564305,6488019309253723,3917971492195668,2436704047394133,1903293291695446,5087018521845080,1544096753118553,4575117770816858,3844946450763101,1711811500236529,2969617197989216,5382618238487905,6354331727895909,3466003608725386,520091911668968,8744970441464598,1898252554784117,4069361323154809,1579760532368762,8518118903537020,7499444259458429,3157727389191551,8292075296103812,5942965457386886,1558026675219847,5336160258473353,9007600726277514,405484676624279,7537800015080845,2674983974464916,1474840799235478,550377212439960,4754054752202138,1794382475054491,5494468479344028,1487223712772677,4645672623439264,5750916588481953,1003342559497634,181948539743657,4900070036155820,2684882773843376,8339770877390259,5595156663854170,2271811437440444,2716093988511167,6080803124818507,6734679523696068,3824466471833029,4905656975789513,1027159911751116,5234069349349965,2845976619998679,7887245441501027,3054846304570844,2983393530804816,3734581078215096,9039206987771368,212438623174124,2461615623786866,460673974214133,1264778386955766,4952782567296504,6056622575078911,7525769778970112,5283383858159531,2679814504390148,7954759743442437,669079048756744,6703711134756361,6663775991571714,5893608345210382,1893371525164973,1466803580741025,4715174880108051,4653535720242711,2929703092600344,5923208191041061,3103488690179622,195135604477479,813550086491689,7047898311654954,3223904045137451,7426696705666605,9044991582793262,9052014605395891,2081144835378741,1837287507390006,8065776248673545,7473112653168184,7866139951636029,8999021447382965,7693459714596107,1789306857365061,3113785830112840,2360078952271433,3551632825626188,957969306820173,7315839390477902,8729889643885838,3652419934416472,464440626691343,825425313963618,1537440333868645,3153094885346921,5831732561284714,3403696938138215,1716472092061294,3592658668744306,8016309862841619,8896883550539380,5059711710236607,4404395072155260,2571945204489854,3422900394264512,3032069426265730,6739337702026886,3438898191715975,7914556700475016,1825892984827532,7871668259688078,8480905541104375,6844691559931536,6302772264476308,3900724721561238,303940154777241,1815693965909658,67628828997605,215650493312670,4406733904678560,5295463405997730,2393780534152475,872526860937158,6013996616294054,7546193679077650,7232735797075632,2746399945559729,1499181162659507,4684319027965622,4443995515379387,620083187076797,5479841989385921,6439828597792451,2686427534925510,4450325038743243,5441752500862672,1479197128773332,3621657044528853,7881544940625625,3131880916047823,1362971779477217,1336375422062308,6015305280839397,1221820774043366,1272709879074535,6277569708688578,1456164797777191,5706780382170860,1225164180324079,7290571657400049,2084981420228339,2453155748164222,2838292799557367,1527696821321684,1540867319324410,6048732527757952,5083078237228802,6540866332733187,7577043330637573,453895478820616,6567011558026541,5901145761697556,6115276638305926,6188595211865881,3740900096761628,8135453198290717,4866682163633950,4605836804984613,3936670922124593,5214583689522991,4562703538810677,826149089664822,288754640842551,826793335672633,4865748761710397,3761110212280127,2296048518060000,187595779399490,5229271066083140,983122057625413,6958588400156487,8601239292317513,3464859758161738,2006753886207819,1705360408493903,2979664720182356,95362890653494,3456639615860566,4444048934589480,5530912059461467,3470564112110206,5945236643164133,5985742207229793,7176788264947558,8239054025237820,3444497842474867,5807155268328766,943472054931322,7635817225254207,7658444460322686,5027311487986325,5672929540128641,4109743544881031,3141376288575371,5824423508688783,2892318986768272,1483186839891858,1664448924706115,1561737080143764,5923322865004439,6708740363472794,7789878536986523,816751597662110,6538715680243618,2212458874089380,2834421147729829,884568653852583,4563982150009500,5726966813663147,1818349008837945,4627663820055197,6938138469961032,1170078930407346,8782358120537707,6905015154666948,8273033414021050,2636788019847099,3388241736521034,5812752224178111,599285043359684,3499374803009479,6347721194614360,3129313899917260,6089477734625229,1778698298449870,5175373152399311,7476447457247184,4637180927623121,4659164079378388,5048924454629334,715930101485528,7063778934013918,8545984482526544,1055763452489698,4762682629922789,4203293592489958,258595845668841,9184592550539242,8287720001744878,6301818244562927,3113989416251380,7658577797656567,5957920875192312,3633096334893055,5233014993652394,4477432846077269],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e1595bc3bec4961c61a5304c1df226f0",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000362365.1/GCA_000362365.1_Stap_aure_M0994_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KB821809.1 Staphylococcus aureus M0994 genomic scaffold acunc-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e1595bc3bec4961c61a5304c1df226f0\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,6506000896569401,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,7906264832782440,3234534336884842,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,5378024996409363,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,6060888221364372,4034229359423638,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,3730400047403177,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,6457552004919488,4275434089636035,5392923544264054,197231274291400,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,4956624512915491,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,915883713245416,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,549043327607033,1302574224109821,8212410875969790,2012844047311103,6276844254068996,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,5827553282294039,1100178234351897,1613233089708314,1398163635020061,2660901546139013,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,2968451845775780,2246725717416689,8952362163265966,3299864180793775,7745961481458097,8055901273809331,748884807066037,1161869623943606,5347282112979384,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,7121473852143014,401948343550438,2462394055594471,8940994346209769,726621958005230,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2629375616291319,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,888109297701394,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,4298859764904490,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,333806946517562,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,2591352585302612,3677235441902166,8774502673891428,7863282501620314,2499002377216605,4888768950592097,4284868748911202,7016685056307815,7180711155708520,8074218591388266,4363284863173231,1951053797429874,2418223084651124,4891494248387191,4162813093515897,6047329894011514,8556996361134716,4194303986672257,4260895368577666,4283429268783211,717815503766149,2166267691369095,4658866579997320,985997338583691,5223980807856784,1430121092358802,4627768844518037,635178958910103,168049742848664,2877754653855172,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,1219768655680734,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,78000814482148,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,8927309108653387,2642347481506640,3043432314913624,6709902552658779,4372354774635357,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,7589956941211795,2413571986957173,4845781658317686,7509411440202623,1053060246836105,4117238218216331,5547694202340241,3220718305670034,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,360504095483383,6177526526477266,8076461447820243,8815769383846869,8794208264791002,1863456533297999,1338323295265756,2994560223626205,1953886652294111,3428447854789601,5274301660094267,7027985096934380,8216853956002797,1625254992364527,6176712354587633,4752895990487891,3048526863073449,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,9173197031722616,3161510797841463,6664851025699898,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5906462950118488,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,851815340897403,7973286791894140,6432046918378622,7867843017488576,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,5424923310544019,1890986035680404,29860417139863,2086986011604127,7190948106835105,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,6676116454906435,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3863448372494395,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,2864627209774636,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,385907700483371,5728268182717740,4911190400468269,7816698054288686,4110401245517103,6261672364234035,1336059428508981,1618472691987766,2262947123078456,3333979680154941,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,980192377581737,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,6833222729797864,2952168537830773,391700864198006,8535608270551957,6713487310972290,2218257629603393,6570381896951176,1982265176835467,8935830662170010,7455948431881628,7767754890610077,9145060402161275,5130704189359686,8707847105430950,2512865056413175,6101035983073523,550323193349556,9063963446371766,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6445091345761787,402247873566207,5077643932915205,9086189712409516,130457181976075,4396323642545688,1603137902355995,6141646980806917,3517221940119072,2376738954628699,2850576000013862,319524505622058,5799343132662063,7502333181040182,4620747332527681,8068985491437122,7476293558784267,7530221302335046,5907535925622345,1106191012378192,7177077991245393,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,9189100481070687,2338670647686753,8906959415711334,7493001730442854,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,819530571867797,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,651657068725962,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,7687077436237573,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,4435153645276121,6497917926444676,3275110843738415,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,8059723177205390,5360518378600282,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,7190985601980267,407494504056686,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,2266518188165352,4579041725200255,4607325484564118,5382715700053894,8245677561885676,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,3099173012382705,6274847488566940,1800517128877994,5300625464223660,7687547568949165,1586163045525149,1351605086977997,1299923441830899,3086808181540789,7046481273812920,2382029668347565,2009369612101575,1229878691049804,3089495541412855,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,1055754057562072,624885245548506,153369867168896,8286237998987231,5920383623823696,8214132091116539,2783293737744357,8189536530413545,5476876315310060,5612209855076334,9044286231537648,4725106938598002,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,7845638252759060,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,3311146078447655,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,3404645514262587,7805354275301657,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,4356804470376580,7647986012981381,1998211285457031,6247490209868140,7821296065001613,2893765109098643,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,2736562014918845,4034678905878720,4370251230234817,6547833949292739,6585493558229191,470023763785928,5902059711862987,8523349380506658,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,6152106369186008,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8910676381798199,8292970583906548,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,1290139896432922,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,4363526816403428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,3115016475949391,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,7710190343358828,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,5925077377812917,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,2098062209071580,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,1912994901379617,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,5935630862422453,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,1768705500031582,8361022599817826,474326943902307,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7152093423583475,7505984773102219,8603296405064333,2192532495772303,4909849541008029,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,4461197842708983,8334953150270153,1343976543156939,7277156913728206,9185892931558825,5402584754821847,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,4952730055523057,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,7604479172066058,2760855083342295,5791949031062287,637717087886096,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,7088305201981920,8711986948082498,7467931263134177,3950687240408887,6821187116937698,4133002593487694,122015909989199,1635651637476176,3989388368871224,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,292057775278959,7255001061059048,8934811836040339,3408611869207412,8441358375734134,1164683235056503,1239923617995242,8143513944316657,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,4360520181401411,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,1169438882554352,6086204123819675,4797301698399142,3471569168190378,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,2413290341751739,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,2361765179657163,2350571174063052,8647056119409616,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,7583446089837549,7469817883450350,626168875564015,2573596889369585,820079529219923,8045422011980286,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,2907874448857610,5356878132681790,6855779845853707,3711070083308612,4882578364685381,1287098760653898,5675714913627212,633105738161232,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,3028319556770914,4926861423238243,7390098272967783,1960247201090669,510436895563625,7266335543571037,5520592147606656,7293093929815232,3128705817382019,8158821542825094,5256643637594029,2669250979570882,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,1238619339054246,8494210442632362,7129634646088877,1515192525290670,1513303246449841,8875968855564830,6086409751379126,8707651019648183,2771632487820472,9182108430318780,5107270389779645,4632781860469952,7986770140512118,8783786815601862,207892688386593,8197445232532681,6046314350030026,4803260508523042,7464689979698382,1019530360671445,4086615967075543,5000612806597850,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,7897782769245419,3430108296223980,7666194411646192,1378102746791153,2688817209527540,8246219929334314,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,976293987540186,7858357380701472,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,5699252652330325,5890867670273372,7882993032424802,4856610212101475,88437141712228,6204666995137902,958802972458216,8599745542954899,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,8792974406386243,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,4836608690859249,6550313765640092,6403894935227820,5926443562442162,856884970847672,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,7864494568558061,4717078305738226,9088616725393889,1541930783479721,8569995544546809,3152905102806522,4285562358224810,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,8205328358469135,7906524426948124,5816011168292101,1185378970902048,835582845963811,1345534315535910,6675258019802664,177161577352745,3700712461854642,6152554647457326,5619546432701021,8338634504957489,6930698324287026,5679039857864245,5168981785230906,8453583119834684,3401051871010365,7906973945146948,8763164838227526,1059006959607370,1993005114900043,1251060182680162,7682210448059988,8497320404037205,5580264614796559,5603043202166369,694729075228258,5862755334909540,1286345701920361,2069399351119471,8084476987051640,6355524819209492,3567915019521659,4907233847361149,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,8293699458965128,470083491171980,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,8753212753235645,6133069365415617,3555666348039874,8660225691913923,2588162975686006,5816608308592328,2300314053840585,8728167376662219,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,2169107663986396,6128252439805663,6428061299113696,984499184574177,5500657232277221,6720662867434394,2541091443550753,3834083608280817,72583097564915,7041236094631668,3931973464080121,1553419814780673,3155522989727490,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,84834187095829,5490276726882074,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,1203079434555191,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,555164866154318,5640100560236367,4050500137410385,8920696233860951,793823372574692,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,2427434620065085,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,1213457523695486,4494558117785472,2569719125127041,4848772203458437,5090934684186756,7039911616343950,3662919159013483,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2345917413478649,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,379350842564556,6562173042917325,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,7969431343923191,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e2057ff9c72f6820163717d7ca69bf55",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000594785.1/GCA_000594785.1_Stap_aure_H72152_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JFSI01000001.1 Staphylococcus aureus H72152 adJQb-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e2057ff9c72f6820163717d7ca69bf55\",\"mins\":[5146675777052673,2315163181510658,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,2907133893206033,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,4449147792408615,7277617451196457,3116364401098743,3518770889224237,7372327805427759,6506000896569401,3863448372494395,3909397344211004,7437334004842560,7140729989324865,5055350997004299,4046441427542085,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,9173197031722616,4447327968161932,2687238688096398,5940834273493135,6968438657196176,6423458840264849,4283429268783211,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,7932357643723463,1816213056534246,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,4275434089636035,5392923544264054,197231274291400,3896588604084428,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,5908374364680418,9100377281368294,3977127583879399,6833222729797864,6675745817342186,5625039491039468,1133486263984368,6101035983073523,2417632473485558,8091788112306423,1302574224109821,8212410875969790,6276844254068996,5937898811502854,948489885540616,7476293558784267,1316115594879244,3963523983684994,5701137865421070,2377197744251151,3590799175020818,1803490896380179,1613233089708314,1398163635020061,2660901546139013,7318609661925379,2138747986847110,4034436112523558,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,2133264542323422,1477786791149878,3871300378636600,4040110223393081,6992758984360253,7445078125691199,8895922000216384,2602070490546912,843457896101259,9089878662127943,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,5840344637290916,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,481260299161970,6614587086000499,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,3316038957900173,162751473398158,3734458897543567,5940376136597911,2972258577203608,3242446598427039,2968451845775780,1188374620819878,2246725717416689,5877325657956782,74203906302383,7745961481458097,5935630862422453,6969176995176886,5347282112979384,7357884307374526,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,8940994346209769,3517087197159920,5706335401980401,4252686649659892,8499479516164862,5137838574998006,2188170162708984,2546695760749056,3527332718576132,162688560886278,7497816545194504,6855779845853707,2823650723037708,2519992179606030,6748402791805460,6314115733123607,2628169269867032,1991856884875801,1893040465097246,663267648999967,68515416416801,4224499299092571,1283325847532068,237184967045669,8303975859675687,8246219929334314,1561783378768429,8031857753711153,7128580599985587,2744117220422198,2644883506979383,550323193349556,8082439380873789,6161629781725758,1301466934951885,8792974406386243,861160734184004,239261345014344,5360518378600282,7443731089928787,2591352585302612,3677235441902166,8774502673891428,7863282501620314,5791949031062287,7266335543571037,4888768950592097,1251060182680162,2051483091522152,8074218591388266,4363284863173231,3939017814893170,2418223084651124,4891494248387191,6047329894011514,4946705701540475,8556996361134716,7613883562408042,4194303986672257,4260895368577666,3662919159013483,2166267691369095,985997338583691,7167030720094868,4627768844518037,635178958910103,2877754653855172,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,8473257377227436,3692897477640877,1219768655680734,4629281300140726,7899833835700340,7926257273950906,7447126361371325,1788090151867071,3087196799197888,2169107663986396,204269439025862,1939633497252551,2439240982766282,6559343506969291,8499668649452236,5909446257947341,8838956566890603,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,6286493618604155,61926092041681,5538283699811048,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,970330114464553,1817613396386556,5619546432701021,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,1888527096943373,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,7161054261140279,2642347481506640,212186904118100,3043432314913624,6709902552658779,5652844016120672,8248516013412496,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,2442719583213032,3399098890158963,2413571986957173,9167447170032505,8558537765561210,7509411440202623,1053060246836105,4117238218216331,7117595573932866,2372154767496079,5547694202340241,3220718305670034,2272237085107093,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,2923022378894253,58548012524462,990095007548340,9025646331909048,410144451802613,8535094002541505,2801544017978307,360504095483383,5718263849001935,6177526526477266,8076461447820243,8794208264791002,122015909989199,1338323295265756,2994560223626205,3428447854789601,5274301660094267,5596785988511911,7027985096934380,7482765729801198,1625254992364527,6176712354587633,4752895990487891,660191707599862,3089495541412855,8413332258904917,7122517469537292,7415738719983789,1880410170582036,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,830388703421489,6104920293028914,2683864114443316,3161510797841463,6653090173899838,6240204079699009,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5279738514840419,6817163184153684,5906462950118488,144929027286108,6166084614014049,6423506706900066,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,517359220212855,7498960818033784,851815340897403,430223076136060,6432046918378622,4370251230234817,310401436513421,772117120378000,7279634878366865,4938927696959683,1890986035680404,4414964609014638,29860417139863,2185485247435928,746970284205212,2086986011604127,7190948106835105,4950726440469672,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,4227702754264245,5623483114239159,693796660573370,1996572511122975,7395647341966524,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,1971104120004146,9187572004045690,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,936638823216367,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,7064378317985064,385907700483371,5728268182717740,1759748373012018,4110401245517103,6261672364234035,1336059428508981,1618472691987766,2262947123078456,2427434620065085,6974450251494718,2555346529826111,4925763159749515,2562320086883280,5811691374228807,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,6138704418343841,5274803040281962,7319951751783787,7610599010751378,5155360444663152,915883713245416,1260790606271859,2952168537830773,391700864198006,51745215800695,6610124020532606,1314889990042517,6713487310972290,7361515808982406,2218257629603393,6570381896951176,1982265176835467,8567589419816342,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,580001466129551,4410612950724851,1287137738233268,9063963446371766,6240582334678461,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,8431983561594311,897316570514903,8150866244466136,5469018164704731,3885943932519902,4293065844762082,4936027117872614,2397618178008552,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,7682210448059988,402247873566207,605192001652224,7323875920791652,8952231969012651,5077643932915205,1033361534550956,130457181976075,6474396741751726,4396323642545688,1603137902355995,7848717625751069,6141646980806917,3517221940119072,4004155958476460,702798501799460,4221990677784101,2850576000013862,319524505622058,2864627209774636,4146833238394463,4620747332527681,8068985491437122,160694334858820,7530221302335046,6073972491583756,1106191012378192,5799343132662063,73265497950478,1757736763295318,7611734689027677,985626569586271,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,8590428516263539,4512180937213558,5590584270309652,7156388644240319,4542558157555328,6760809165536192,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,6463356318623379,819530571867797,2973371054093974,55532696639127,6520130709554843,6274847488566940,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,5767914751350448,4063887283164850,2818235886003891,4444908075767479,462594584405688,7672125054567770,1639747824223934,8001342250198723,4533568422573766,1826572334769866,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,6861712285648606,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,1525877688391402,3320002371577580,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,6497917926444676,8143513944316657,467300572956444,7641917531428638,8557086057588357,7327034779342626,2254292328232739,8126008824080166,8909030726132017,5117258784737064,8552312296191785,7553352169367338,5861465820534573,3343132780332849,8546891284027186,982783900964665,5177776401921852,3109989319097994,3478329653159746,2970622895822659,7598272163776324,2016823776880454,5969289268451145,500006684268363,2339293216622415,6829961833686864,4974610471645496,820079529219923,3716488083994452,5553553040481934,1290139896432922,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,407494504056686,3827221495609203,6981944088999797,1209024400287606,4733550782715769,5853576310753151,9158016872989675,5382715700053894,8462257808402312,8245677561885676,8154597807642509,7675177204093251,5664055981840276,7469817883450350,6655834216400796,8449499606388378,6161054654166945,6086204123819675,7640718988732325,2215407908836337,2769199177598620,4285562358224810,5300625464223660,7687547568949165,1586163045525149,1655653727666446,1299923441830899,3086808181540789,2417609231026105,5296176842942398,1229878691049804,8690783830517706,8326254200203212,5550023567304653,3159560503162830,4265524355446736,4494745225119689,1055754057562072,624885245548506,153369867168896,8286237998987231,501314330843104,8214132091116539,2783293737744357,8189536530413545,5476876315310060,467366249592816,3001959122151417,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,3311146078447655,1360472241977385,5219112845465642,6087930894833708,3404645514262587,7805354275301657,4125199387330624,2275693130250305,3669669445212233,6994098420947023,7256199734364243,6445197233936468,2614524117768281,2176156635736155,6415637455083613,9198749196284261,1062207237257316,8369242804119653,4898691182037097,6924058499905642,7154763136518251,2033238974833351,1435058818705086,4403747301046395,7670540484323560,4706193404512382,2009549124475012,7647986012981381,2893765109098643,164072296102038,2343666349557911,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,450088546953389,5524874001115311,7656430088894642,6300248156747957,651657068725962,4034678905878720,1203515549264065,6547833949292739,6585493558229191,5902059711862987,297946451506210,5484048230209742,7424197000927439,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,2266518188165352,5898357841811690,8292970583906548,73407638169848,2057763371387131,2902111595423998,4037615708129537,4735068303730949,6868805569935625,2167369577068814,7846237798144273,5184617738316050,2067257304910100,2221340687153433,3442643861129498,5250171345791260,6368094493092127,150144952449313,1357719164033317,7797236362615080,928062918895913,4333565149649197,5369751621683502,932244993407279,8995213276330288,3264293452933428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,4088699334455693,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,8443367849552226,1923663661255013,2528889561520487,6247490209868140,9049977009835279,7630230196581438,6259851054508406,1525074792253161,821362676717952,3484868897319300,8532048883820939,5502346576963992,1580143928650134,332549451344280,5602292474825115,2096841890683293,7064012510296479,5584756052421024,1541713433336225,8105508678531491,2902476096768420,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,5564848928414133,30172216461750,2774005338483129,7413661131340191,8069172111739324,7612437979536300,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,2760855083342295,8260407158634968,2949081325283748,7873984218462683,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,1239923617995242,8489320569743851,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3054304020027890,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,585038334536187,6574721260816894,5917290617760258,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,340514272782864,1787508922165780,8952362163265966,6616815189441046,3299864180793775,8644146702531103,207892688386593,1354074465876514,211721470048805,9118918071159336,6714337179294251,1419291878255150,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,2527092163099744,720459020642883,3498934123428420,6875606331546038,2085938533902923,384651385379405,1631879280163412,4746826772617814,758283499566863,8361022599817826,4032519412886118,197275571292775,3563874166663785,6607041102383728,4204796266711667,8796579924642424,1965966511262331,1186578641926780,2209184500886142,6217388977945224,7505984773102219,8603296405064333,7604830844816023,6254528881375899,4909849541008029,3796894009887390,1339905113829829,4001936773421731,8833716684167847,4115418516888233,5078604763028139,7944456366951084,5132300845271730,3806717176019639,7779913425963705,7879172040727235,8328582983088836,3981187881433797,8334953150270153,2027494681635543,1390679848778457,4009191020419804,6982435519695313,981946939239152,4952730055523057,5482216705940214,7046896457378555,1102254127540010,7920821769997056,4018290538196096,1956410942925570,5681948115341099,7769295295371735,7012232712137487,637717087886096,2334075661093650,2057294021864213,210402935216919,2947196173888283,2110302892063516,4230071825489989,9193508402337585,5828810279275305,7078403057355566,3252916289493808,8183273020525361,2100493461572402,1397154956147511,4021653090544442,6632433388350267,7678991267339070,2820696871828287,1755284184296256,7088305201981920,8711986948082498,7467931263134177,8910676381798199,6985458709252940,6821187116937698,4133002593487694,1863456533297999,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,1191595029470351,726814415526748,1869739381005155,2746847273347940,5565618624165953,3042810235578172,487864828935020,3869761225206638,8934811836040339,3408611869207412,8441358375734134,4033162446019447,2765804614536057,4396390006889344,181638314539909,789663207095175,5675853195025288,6396034465909644,1552378516372366,7553111683168749,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,7530063864933276,593012990819230,1169438882554352,4797301698399142,3471569168190378,6451364401675179,8075354013268908,1297442792150451,9126554829507511,4865890043296700,3681130512911295,1189163822001088,7763557409881028,4666457024392133,2586418889903046,7057729200712647,7126776287083465,2361765179657163,5695909244033996,8647056119409616,9100812111035348,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,8506618169158638,626168875564015,2573596889369585,7946192001620979,7306522185604088,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5757452816149512,5796384473230345,4964781251513354,4122319891667983,70088873618451,3884489623182358,1677699964853271,3557713574820889,334844623043610,9029197543849729,2198108027522077,4180542909013889,7164125418732578,2908244240583723,2588162975686006,3649154946395190,253300033591817,2907874448857610,5356878132681790,4882578364685381,1287098760653898,5675714913627212,633105738161232,9157569010814040,5768890711293017,4812219920563290,5097534116879451,4955365087054941,1089272565173343,5671450707164256,7516356639951969,4926861423238243,7643972193975399,7118726016033980,1960247201090669,225636245425272,2392984746015870,5520592147606656,4632781860469952,3128705817382019,8158821542825094,5256643637594029,8154746805587084,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,1190842265513120,5241091670625443,1238619339054246,8700152929234087,5514768509078696,8494210442632362,1515192525290670,5294676599532722,3331986316520629,6086409751379126,8707651019648183,2771632487820472,7885678641654303,9182108430318780,7293093929815232,8783786815601862,8197445232532681,2360605979561163,4803260508523042,7464689979698382,367954891287765,5163187295190230,4086615967075543,976293987540186,3183706162982109,8223148645510366,8033238443244768,7315979768499426,1378353318702307,2641747955387621,958802972458216,8394425722576106,3430108296223980,7666194411646192,4836608690859249,2688817209527540,1033715359984886,4579041725200255,4298859764904490,1019530360671445,3567107464158468,5816011168292101,1448775314115846,2795829744222081,3556579375844622,7194270142693933,6644821181082899,5287326670494996,5000612806597850,6530364637157379,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,5335276921429322,5351668498910539,3285144305491278,5084161271253393,5183814044446040,5890867670273372,7882993032424802,4856610212101475,88437141712228,5253585232805225,5323332702567656,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7710155381849469,5151281455619461,6341820508011913,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,6403894935227820,1800517128877994,5926443562442162,7674181908761844,1458767657659834,5947103608716731,3555190914977216,7776477814955458,4646842126761412,2690941375331784,4782498127412683,7267065697569357,3066294121266641,8935628239632291,78084367085014,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,1878179782938092,7864494568558061,4530178457788475,4717078305738226,9088616725393889,2846284314054133,1541930783479721,8569995544546809,3152905102806522,6546299924631035,3909246984449532,7687805010646954,5336395954564607,7187688514553088,6135375769182123,8985645944647986,1987340210712077,8205328358469135,5473106693410323,7906524426948124,1185378970902048,835582845963811,1345534315535910,7122433204903463,6675258019802664,177161577352745,7243701472849450,3700712461854642,6152554647457326,2499002377216605,4393052211822129,6930698324287026,5168981785230906,8453583119834684,3401051871010365,7906973945146948,1993005114900043,3335731140628044,3365806770277969,1490649743597140,8497320404037205,9086189712409516,2376738954628699,5603043202166369,694729075228258,5862755334909540,1286345701920361,2407556246797931,2069399351119471,7180711155708520,8084476987051640,1826626455842425,2479347599965821,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,5276885771693705,1478175721172618,470083491171980,8059723177205390,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,2379313998356137,3213809958264492,4725106938598002,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,3888158542495417,90076065684274,6133069365415617,3555666348039874,8660225691913923,5224110063914277,3818616056618695,5816608308592328,2300314053840585,4995812233531084,7374706893274831,587253656190676,8303453292883671,8729737623117532,6128252439805663,984499184574177,5500657232277221,5677483308395132,3844045130731247,3834083608280817,72583097564915,3931973464080121,5985406373330682,1553419814780673,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,84834187095829,1924528878694166,5716331084570405,4440186563960617,8253731522256683,6412229720137523,3881211648824768,1203079434555191,3989388368871224,6737890810986299,6998902793404220,3510921439481667,8605736591634244,6414585907380037,3429891841847111,4050500137410385,6355524819209492,3467276601790293,8535608270551957,793823372574692,4577018362126171,4524906595225437,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,3333979680154941,1607268386283382,1213457523695486,4494558117785472,2569719125127041,5090934684186756,5598069886194327,7039911616343950,8823763859310893,8599745542954899,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,3795402138320830,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,3792348455169996,1351605086977997,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,2998549021028326,1879504332029927,965077211664360,589689774239721,358899163144170,1189989031567342,8459448655941615,1503829884784624,7969431343923191,5631626399236089,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e32a1cc092043108ec5025c1098a1dc8",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000092905.1/GCA_000092905.1_ASM9290v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CP002017.1 Kyrpidia tusciae DSM 2912, complete genome\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,5,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e32a1cc092043108ec5025c1098a1dc8\",\"mins\":[8744681584410624,5936479864363008,7614909606072323,3678504714981383,420611168098988,5827766821743959,789639946760204,7576574246445069,5521049610113042,7762198674456596,6731926802784942,6295592966823959,8373773706735604,9049592259702814,383728016646832,7008907723771938,4123693990871077,1310915477791409,2252917000581160,6473774942638123,2937031365009452,7230415946711086,302327506120752,257616196997170,7118481379205175,6806773800796217,334241431044160,5058218367651907,914633118036036,5371170305183813,1719545971511368,4992524745887756,8638143820143287,2371604982698062,5393357271806038,4091023084642391,6263172178485343,1064989273620579,8196566000705637,7259283440484454,8197468514807911,4090002363232360,2028940851855465,6339458554879335,6154086816911468,668369734269629,4318498042187889,4202634422661238,4517923300442232,3193662869184634,3558147658678395,2426356967698556,2294929573470339,3548545158418568,1082457963675787,7696304369221772,7775698764906637,7937263227179154,4875317520900243,7044932067491990,1676366202073239,4769490940260504,6880548471492761,7232589078937754,4691695812247713,7963165350396067,4562480885371044,980192377581737,9213520283467949,6680145296028360,6786944317471461,7067953556656310,4771810335432891,1663395296185717,2479322169704640,5992027594780866,1088973996815051,6776975306236100,2191148914389189,5613824769183942,1469001817715404,5050162205352140,5513038298489037,8798930245984467,2199037652582615,4272926563758297,6468349587202268,6360426020483296,4339126586204385,1820854006300902,628218927653096,3587932378337513,931734498242796,2440376542400753,2089317001040116,776327855251702,3607594883526904,1975544896405753,8944438860411221,4809248365158653,5701539679523073,8753767806808322,6178537140945155,358307802333380,1319037644423429,7302476486000903,3737629979885835,1840946828824847,3944726724829456,582566430327057,1170361662199171,9147454540431406,3188037269754134,4466031919141143,2514223724900632,6255292906008857,7108455360815386,1694248666747163,285730589711771,1207342058492189,2029880135106847,6442176172880161,8519382846284066,1061177397989667,8032621564172337,3024371098116396,8186773910774061,2921267900059951,1898261534986545,2924990800433460,50482031579446,3918349862715703,3965083807334713,93928427462972,1365472775627069,677999724605758,7707859264061762,200772761211203,2630694093992260,2540858963009864,1779509348344137,6681600407859531,5269854399635789,8675893818601806,3927298366767442,8013929963269665,1755218862842203,1415396535943519,5408730064540002,6176291000889700,3757859064508776,229442567119210,5931018456609131,8502586766618991,7959637430175123,7529834792657269,6729396219400757,4428532372521335,8267677829886330,9040568483135867,4017027622883710,4415288849199487,4009189761872256,3429731470451074,8362791970323862,4925315532173703,892001812677001,3975127395582347,8857222076207897,7517474973626770,1664920256631187,6784628056138133,3639803292393879,2802615629722008,92077858541979,3250042414244253,7053153900442014,4305771997868449,5063317772923299,4921970996210417,1545780307624360,934644138566059,7245734252347822,513657011098031,4885990163739057,9143508949922230,302585180328382,2652432916988354,6424222148036685,3851478618649042,5925495779378442,1332709798322647,6519969721295320,3786697026760100,6553623399461342,8260520934473778,7812856210265510,2704712607465963,7295622114030060,2072043489247727,6278275842593265,4347151203717618,3849821963690486,4872778601345527,911429263413752,4783676261593593,4830434632905211,3664891325809150,4855260170179073,853779118006786,1681946813035011,8335321050030598,6117368555098634,5658589306843660,8890868593340557,3446926667592211,2108941435109910,1613237009777179,280472368603676,5890504024216096,3991613056098849,5441326394528291,1793134176502310,2467549561438761,4737138938847786,2909753140613100,4001451736564270,618266028550237,4290202418958899,3914295095001653,7750866483561014,8932682583294519,6906081037210169,9056133340709434,8070245476991549,1190876519223873,4773610862596878,7952624669868615,1441041255277133,9164251107217999,8838262593774161,897191654873870,4436705332077146,2115572339020559,4965849467429468,4020764886143583,3816293700289122,7765260689564260,8513754178064486,3105457642291816,1375805750395499,8066467271578221,5024047337448048,2388399790649974,4890963979928184,6197800075605440,6748186657729302,6020662370913729,350675670197277,9065525394199183,2623346897523344,4029724554986132,2490435983693934,1969463303135894,272322213384985,4736372739338907,2188677180342942,5601298336010915,3534310655210148,2409175035295174,7412464845951657,5564264195170986,6863856186741419,2663683845919405,386002643927726,93654492099248,5306342345040561,6276900244574898,3963997116691124,3249097834795701,3384614850339510,3419252340056759,1159816652513978,4045696753286602,1637037951873726,2665781087388355,6089224579363524,1173777170412231,7008675935527624,8990347191737804,1324616406909643,4117177675129548,1373565932757709,656144892285648,7955129094951634,8348232119317966,7297328177013462,2856117375296217,326519535612635,5983021052842106,6662408252777184,4587923927724769,127017452958436,5224210833564393,3418753234752236,4397978721858286,2173130878337775,3682333496045188,6376134653793015,7845100439479041,7707077125509893,7827861729256198,509866476734317,6015690753155396,1628113507156746,699706168152846,7065077697749775,732409058898704,4017094364226323,8801141186343700,2539142469042966,174294059520793,2196053106885404,3331226739012387,4239240439436071,7059257480184621,6040184954204974,7505460761612424,2048684727481138,6339624941597505,7873171039372102,8684520806342796,8673657180230475,2767421841429325,4151539171992398,4669070955270991,6901808925385555,1979421969052500,8162432623045461,1431847823970226,2303945828107104,3033208552973155,8694397088588645,6597949894075238,6014026509173612,3585806035997549,8801783716123494,8391416447939443,1502486048207733,461485295907702,3272548678697847,2251465063527291,7459450369647484,913542305649534,6872833017602945,8880852850303875,8489707457618820,8582963901956998,8977321278795299,2146538026918803,1874229496218517,2803413354558359,1294335265674138,3213557846556106,6963614088318448,5076489385849764,7552691062723497,3879138433876909,5258651305259951,1203252080415664,8826853035826675,8126877049148340,1461183318598581,453440535733176,5590003800958452,2398917016581051,8163672032949180,8180303374488510,8866084203021813,7002671427134401,6474231636685762,6676548299379654,1160864493654985,711185152479465,1890305430561743,3400344634908152,8129486946046930,7621691363775443,9207183019562894,8547872511796046,4729110068184023,1975359745563471,3898930754810845,3302408725877728,2640324575519717,1761016796255212,7417628051858413,5811076751980712,6992169809417203,8750613862134772,7224855864198654,460397216949239,4563760767568722,8708838256108541,1132135447921662,2439854586500095,8395866021177692,1226150532350980,8597829598060024,5596781941908487,3670806942860299,5345136563348494,6501196912400557,3866380356166672,8415278450291729,4424443408151571,7732142873113622,5436296398366895,1842278567093277,8931955779553456,7566814266499269,4903212453518171,5801705832805413,5566891731485735,4824643828409384,7785901302191146,6495841915118635,4569978979124268,8821401469197832,5376295095661618,4962651944948788,4668806921925686,9171298365019191,867989414716472,8659596486989359,6477793495532602,5610511658038332,2677329376228413,3596075764433760,2802262467482691,1363116632040519,3647096938603593,4994751655334987,2455244483699788,8294772237755469,2912819670684752,6811433907962961,1309548769387605,1360634299032662,490559315481690,5460328162735200,3851375908463462,7014256017392742,5537173527143529,821198039909482,1041069415703660,7674893325870193,5120554543600755,6985834824651892,2789336425845877,6064658733036666,8457311809401980,878128570483837,1975010140968062,6595558363120767,2764795543990464,2513897954420559,1975200734983301,5251803737277576,9019850620330860,3841700685128843,1449193983980684,164547168658574,7607467354444725,358613072843923,5934671662388374,3579640019474277,5468548055296196,1300176113906846,4358297079624863,1854123086603428,9136798150082758,842707155203239,4454413682713768,5199258926859437,2367017419801775,7702425860854961,9070472519214259,8065166486353438,5860124043138230,5197534562755767,1976284640480116,2903346533401787,4079259051125621,1496839727248577,5616731924575427,8684914308760773,4071484706321607,3476242893925456,2322673039566027,1735562253018319,3325845307791209,6717350905963731,7124371481498836,8144459220849879,9013466881131736,1335218358768860,7477565188961505,61636619556066,6099217135502203,1807025832834276,5010634328184039,6990419460301113,6837083632674030,1603275838592239,6218747945637106,4190648793342846,9168519936388649,6165915893945595,3464162622866684,5724897765309994,8435287111554303,1429877648327939,1822991381505289,7643340097787146,6596294707180811,1286213304300813,381439599809806,538278188873261,1357615587886356,5451725344269589,2750998684710171,5675016594904348,8480606603023646,382178888000808,1049669918000425,7926610641458475,7213679512110386,4905163618940214,6224089329231159,189442704463160,8786271098115385,2022584745141562,450970876720295,1099326167897407,7067732827481409,4583757804643650,3644771812824388,6859510404610956,8382477637838154,5113054386914635,846703810905422,3958627025786192,4275902011540821,7873266565113178,6447123899053407,9144088754660704,5039736914294114,3133955508499811,186522548274535,5282471662060904,197066847120274,8294769880204654,1892041235305841,4787113218737524,8030195091219829,5447756073407863,6644030860113274,8177326978721593,4621035520492925,8984592355575166,5014737468072853,5982703612396931,8542546682268835,7393311500379526,8947100230796680,6231883109219832,9019974116779402,6102166056633740,4768239604647309,102334121424272,6168321510262163,2061575765534101,3516418355320214,8020410290025882,7568399829198236,565234132587933,6444898763802124,8103091710539173,2034624232506790,2131168350614951,6543381367678384,6993546704131507,5906575640106422,2517771395159479,3623915734687988,2714425851614650,5308859652086687,5166186078905788,6005823766508992,7665403346154945,1531627214366147,7177906901829062,353274493986249,4089864730629578,8846009438836173,2344908783338958,8483387191555539,5862936778966486,8921838307726244,3665307087791578,6841814591706587,627938527913439,3635133154444769,1049716543235554,5115950188889576,2983052495586793,4832822441756139,688122531710444,4427968018425326,1991699522774512,317104095499764,4578886406026741,546712112915369,7342292329768446,1065617799788035,2031085320061185,2689756187735563,7596236782695948,8946852563555859,5866809162876439,8766376959043096,5793959185405466,5175960000280093,6074386639459870,2585042155553029,4069301840406048,8074315775910832,2744983826515490,498998005298723,6180518844556836,4232089111049768,1160639051826730,5545754820056620,791329776936493,5380494946168413,3721987360118323,1003484826945084,893445366339135,3005996594775617,1461351446791748,2465173623436870,5826306837284423,537379584333385,5198053191960138,5811887730681420,2047847076685392,6652553029035604,1498768503031391,3552638728234593,7672027517167202,6838407693665892,6172224231577190,981050162165351,8678613933926156,8562561545876657,6601875163129452,5906918424528495,3222923277710962,7389967718250100,7142692077228168,6567932211078779,3216917048624764,6950496886064766,7151759038756480,2076183890179713,5256082343839362,2134418852558752,6070275750908620,4086064350312069,1923062943397511,7052961833969288,2636071798257289,4958803522754188,6174295006230157,4889055737927310,1651353499834003,5650743773103909,1724407495947928,6975265977456283,4188820724252954,7332206341965470,7264715310734277,504630627284648,4584888189724329,3190430153332395,661448414721708,2726245923701021,2886398681847473,5133255114016434,8666123995887985,3355419971065527,5999357310084792,591662973904574,935515831531199,5678043101357763,2261692874356420,5564536145999560,5665625504028362,3808774557951694,3678027077613263,6952819532994256,8258856311905230,5533660763621078,6631071302682327,8682836902745550,1398285322532569,1692073554912987,1870706074953338,864820243371742,7921004052170463,1462741043647473,5844667113015012,2741031813818086,4021419669481192,5848249880905451,3107212084733677,1735549616464809,808433197935571,7587064566638325,269979629061878,1844370874873592,7753828072086484,3290684362381052,5205348349056765,7977190926092032,5405553242502784,1409799845619461,5212306285442825,2646104303752971,6823494705612556,2118152157353741,7962092650211629,1412442594330385,4662119332423448,131979724947076,7258331533199130,4462458125514985,1256351025813277,458874207262494,1718675678111365,5788252530276129,4384331108889563,6605268683310885,5477856838850343,5570670203209512,5748849291093802,374636469220999,8592039778998061,6012529341219805,874304541111944,4028567904566408,304433852720953,1892991830878010,2251127312975678,1919897747305440,6540268643657540,9129198701451077,1701609704638282,6585361667716941,6524006324778831,412581683664722,4361405270882131,3963249158694743,8922229882878948,6952873051956739,8049898475809082,8075585211795294,2345690591762271,3775189185506278,837483913340776,1109148397852988,7988120593856362,2318431862818669,7307331598112626,8726952574477971,8151814613288826,5605269894727547,2155620493657982,590209582774730,6721636669011841,7800009658360239,5321057093262315,668165194278790,6671528205047691,955444322813838,5780614823687014,9116251446269847,5813665820039065,6703318907475869,1146602789697440,6411878535649186,7879649106286500,7564209173415845,2919395789859825,1765306667055017,584034536118191,3296592623886664,766626278885298,171693553005555,1844166002689977,6657430918215610,195620689668028,4316675985246144,7228117053841056,439565590284226,8618376976122871,5094522339325902,6256089336936402,563645303200078,5174479558712224,4374391345252312,1339042168567772,2948560509339614,1022871099398114,9004331558391581,969886352599013,1114302420883430,4823999079774183,849449737164776,5276906681260012,3231708902143983,3447893319821296,8542293736367162,5547269578528757,8602863640836086,2409350185072634,8255669063037951,6499922753427455,1586568439375872,1703788719413249,7779139975784451,2621013508319236,6873442242627590,1460113330460680,1930247181608974,8116498615282856,1175543963998226,8114481389222233,2172020691953690,3894371217508379,8952733454021637,8819766146316321,1675696371595298,8410758671022427,3104404336515113,2132113006614575,1951472868059185,312997640046646,1153366640965393,435470831204413,620681665742911,3219595434281029,2158712888354893,8127961898444472,2212581483079762,4374130450445326,5546676282497110,7509718685329500,1319253812430941,3405099253254239,3687883914447888,8242134011629618,4289031990614117,7409170496723047,1514799558092908,236234112850030,5764383786086760,2014500897691765,4639233375103095,7139810154891386,7956107661695109,4823279707719814,7873988827641992,4860613014808717,8814021370513553,8986639980738243,7872764125190299,2941979781245745,3140459547682214,3786013187754345,5751807347501216,940996612200614,8221271559563633,765917828520104,2246456312916141,7779794427717807,745888697243824,628245461989747,8690370054404281,2084684701013777,5997337220249790,532632342182079,3698496139606210,3842492729403588,8002563015250294,8094969440188616,7671371972487369,6226825646872779,8723265717086414,5065478093686994,5951114133186771,9086384287615295,9153246913075303,3598091596929246,1516197941999843,2024458860693733,2083940720860881,2917090990647529,52847281165351,1694299678677228,7522746711603438,4714075420948719,7289171423070449,8536843643980021,3884197008959737,6715403677845754,3855520765829503,4388427092044028,1959137194133757,2107886819711233,4220084551530754,8576569727734827,5248433444616454,9035219046657413,4778930117974284,3076268144232717,2534966327621904,1189407000008978,7483838883027219,1129915302996244,2549572540221719,3432620663712025,9024505323653405,4631827471300895,632587805604128,610213139306203,3636671057557796,6420638038894885,8025494137720290,5746019399111730,3037006677338421,7827469598087479,3836281499781432,2545632014627892,7035454826887482,2019099491154235,2021441500404028,5797651160369035,486518795557183,3572473644681536,324161300752718,445499571026258,1614947239283027,8075372174652277,6598881870784857,388309731453274,7749867995367771,3384595673295196,2081687292782941,2914526958676318,890042072402271,167923601021280,6837819891145057,1151409573140835,5741270564792681,4181165944517010,8362468786448751,3587325203134833,4340745406372211,7460449624635768,5693506332408196,5172193304279437,5032957315983759,3862230873133464,6033134149650835,4727294739220884,6376274850900373,3628254598510999,374026097269146,4794603946752411,2169623778068899,7372349104535972,4273040538704294,1934862634527143,5482667858700712,8824615301618091,430830573595055,3581604332931506,2635567647266547,1386219888650676,2735818393553333,6090764715547062,6633120058603960,7162192838015419,3296307354401212,2881505090791157,5374165701810625,743888718932426,1682835229697524,790031549143502,2617544324053456,8921158212340177,2304876360546770,1251934919600547,1408470466795988,8167483498396117,6510256875440598,1327875829975513,8805609359821001,3875847902419420,2849884264106463,4727118486662224,7653181976803812,603243265186277,4692868236810726,3430553727821335,8161711803689456,6743811160783346,8310820486867444,3263300953049589,3657460537608695,196855771364436,1562456395606524,2453800546114052,239040066693638,3293257926539790,4186340796381715,7849871269415444,7333701790479773,4317472433576475,8714797109729822,8502856202427278,8035063837026854,9175284235655720,3746028576516652,4158650792045109,8826071302031926,1590671242151689,3460189264071227,8775179511929406,2963011265784383,3928122335685186,6801392847579715,8047294402501189,8600773904841286,1302380244052553,2053282205002315,3414168325773917,781357866363487,7485940788160955,1765041810471524,3675084815640337,8013489237150313,6993544066955882,7550974351706732,7793277908888174,98427545306967,8813917730085493,8524521462487674,8861964812937851,5488505310243452,181179537844863,1158412373711495,8063078257421420,8724709923941003,2744606155127438,5667248892848783,3250082262829712,7420335262227092,4803064898476698,6439891754302108,5920579940787994,676572634577567,194439593101990,6858874638383783,7011324195060396,2458884776766126,6853799639739055,3301318435982451,8277028648282807,3072545125389428,4470239128693434,8233699665595068,1743426379705021,6042542332362656,5564484460870342,5659199211584205,1278532483308241,2375371791489747,2178351895571156,8781974742739673,8430050390831567,5575682643020511,7434287637600993,8914904016562916,3338125854620389,6584462284266214,2623130165873384,1635704015186669,3119981790206705,1289978628238068,1224876973968120,6442281212717524,4458201187140932,8427247698715775,8349288916065024,3964596212577409,8713352218169132,2293188172008202,8187389657682391,3959554498906892,8672007453481741,4932871155542798,4633513869187856,3214601462328086,7624293422357271,4819529284496152,7912074019896093,5974878276475684,7212862604434213,8444571326281484,6722763471362860,5190608818002737,6975846278515512,9094878660015663,7148480190335802,3757699102550844,8560938818378558,8490331363451956,457534687726402,8906238506839008,1347220851813190,4938331745004001,1699438016313732,3533007275404110,3707629935758159,4532733118798674,3625509589916501,2591369301121878,1833329532517207,2986230518647643,1566918408727391,342485536332640,8864736096672611,5614431360293735,3058464123276139,8736485757600914,1214460032170865,3108763444394866,977457242449043,64197677521780,7800671997090677,6798920343772024,6661132012649342,6294557319715989,6059994160810882,6438639027436420,2994584624008070,911197821074312,8466363441331081,1419988420185239,3487983348058515,3921322711235470,4223245674326927,6045702962920338,7301121787923347,8548801938725783,2473538164820890,5301249856600987,4517090493713311,4245870957501344,7654335126854565,8607702387192116,5479670885800872,8143642184408207,3515310703614893,7361856782109615,1070558985522096,7249743470824369,5732435163728818,5926953661639607,6660977833155515,2592876209295179,6419482866725366,931392127876038,8626018745319797,5105411590752759,5700073698868174,1480670481644497,462679832378323,4652200042744788,1254263466118103,6371526298098852,6612051899689947,2037585454978604,1263336053894112,4375714109242337,8281338926780923,6176675584949220,6039601072167910,1447235317996519,409073658891240,5978998209354236,4001641308534950,1665201005171879,6999821060340716,7279350142225389,2299191765851120,4979237827495080,3519792447142900,5122568459127797,7616511493733368,3486293143919610,6892131635076092,2821993033120771,729083058396165,3178902113696775,3951218822704139,2360682173608128,4861608410651661,5155866381114383,6106218606414864,3877306047347731,5768763493932053,1943505219611670,1978718664447227,6745318621535256,6189569768868897,4559774515026981,3299630489529382,5067369165790247,8249184901106162,6162267503139881,659189362109482,858223710665771,2617100327365681,5231312121916466,7444727869062198,2681908792523832,6454542778006588,3601789102337088,7523892004924485,1429024381161313,3722077254048840,7079592597204048,1759594817432660,906439517346901,8965052138659001,5506921912147032,2682610395167834,5186740053736539,7843903615560796,3467142718805861,1051125563509857,4022980937120868,6848458631089253,5520463763008619,6319526668741740,5126653917449327,5400027002645617,5381730552040563,6725898888805494,2788652562566263,1481022724930682,717118515671273,1514594160553834,3380746592287873,5142506221948034,4270341281270918,3924743046888584,4960139548036233,1825490784062602,4139595372289164,7880700234218637,8531701357145230,7709170537725071,2880977923222674,5092796695170195,7397549221137557,1685067063180439,8975578385058976,8275516785570331,4942993652391076,6405669703838887,3645460322553000,8422330164079787,4622052312573810,264846324079790,1686778830458035,1060621332569273,2334525393199458,3783953519320251,3060678411898049,2756850044021955,5489633594715332,2080991384992966,7973067068579015,6256603971144905,3666042580200654,1216096783428817,3930873458699474,481130906959062,8039892073584799,4200931968359643,2406501215939804,5582038934043869,4639699002940640,8228705149672674,5188869616646011,9044485480081958,5076622943845606,4392307400416465,6402030516014312,8682195484040425,3589017951984877,5183532935156227,997453071820670,3891140653497590,8154817832987900,960190374014205,4122455720619262,6861420847455487,1742768419011843,8605872650153220,975363387279233,3757364936551688,7553689649130761,1126221451082131,7370072401063189,7643990501911833,3915081743334682,6245390726483228,7671977632869661,6607065426640164,8081222682262822,3406118610111787,8382500041690417,4481402770591031,7631191008718139,3139215944892981,4348033843547459,7994467454221637,5761562856262982,4888629011062092,3974002070785359,4621307102707029,5050326356770134,7452201937341783,2705039156723036,8720083169167931,8360042042174821,8516565968424294,4076982062140775,1275085534973288,7588687066000747,6814622559664037,4640669057879405,3276367593684337,1023215628430706,8683115561196915,7591990732959093,8653640959476969,840980046650747,8374981956124028,2740410962673023,8590272178617728,7459500452154753,127535583579525,6514602613923207,9056964295450134,4590239460011405,5661648665423246,1544884911811983,4250171515956624,5180450626575764,8766335511357221,7297624710782358,7318042333726617,8873095039626648,6276619419655579,2593022609894816,2208496096640240,4104083855830434,123267616996772,8313672759760507,148943418031532,8118604182601964,9092238949292617,8144532077375391,2179049616022973,4070458974797249,8307576646401476,4061940904713670,7239024455876042,6390599196544460,1711580987672482,5083506278710734,1497685277519316,1641929511558614,6226524087299543,4968981246615003,3834038455668190,4912921781319589,1852910814871960,20449968452859,6247989999473916,2817909552901613,6783469063556590,6408411990031855,5286645936471536,7191826387842903,651142824127987,4973250452188661,7037130162994679,6459422656810488,7764455156691664,6165846953807357,2169286800711166,5335135668159096,7791308110881001,3026032397778433,8121390319857159,77686531227144,3476994827144713,5907297880456432,2080050915463085,9110975544663568,1638312709062161,3710962401590802,2129169277848835,4610521211104790,57397691440663,872766530424344,2560717004115484,6605039533874718,7922181907213857,1830686326091298,4314389250992357,3752574328512041,5245231901228586,2235570455596588,1543670881943474,2946430096465457,8382754909175348,50751678850314,3012766152957504,8201540290594059,6728805597617732,7196584650882629,2082549411921478,6674746783224418,6950090058663181,8173672253591123,1436223922978388,7825845879470692,7789113990124815,6779403132403293,4673898241183330,1590734149422691,393765806538341,8168766566887619,664642433134189,6612222305693298,3355640882085497,5923035758710396,6612054293851773,1982774434539019,6905234374119042,8770292955850217,7307458191093956,5068765963538055,8772236985458316,768641059081869,2971265788436110,4539899084213906,2233993997454617,8421434314280900,1533305845509792,3145256917601953,8963332481895708,4600720148393643,8324793554693806,8013965972848304,5960730712129203,7565246402875062,2119667299434442,1028887481011902,3247451453308607,41150268341953,7954157961400004,8818376943001285,6587403510451921,8058224312499924,7119828208574171,2584269221846748,7519464095755997,8363531021958878,8925343670650817,1466014842969827,5506272826087425,634888360947432,7467074895978219,6716147114004434,9118527682322158,116216645320432,6452271199039217,8993473131126514,8300458852044531,8409443684355829,6960003241697014,7967746457111574,6848798685449979,1803077944176382,5468054864690943,657782040604416,8112973168438571,1061585095724807,7106380825656435,8163705200001067,8614555356323605,4875727904317212,741351286546394,2960360564945541,1323158811655973,3371624849960745,8137995538801287,8393575313407788,5823696224661293,6321597261664049,2847826208857911,4670907860107065,3680630850932538,2590970578370363,52788848287548,5147346214289213,2039363991580479,801678646435650,1208550234988356,8703949423796037,6845535107202890,127721509051703,122956805644112,7887365034349880,8822966856318804,325133458128728,5692095376910992,1535833184288613,2328941994159974,7758523457765224,3320216438050665,2592193260375914,7255042645749612,1128532749016941,6035652893454190,2059007657238385,421718787727218,7009314355212149,3016691202772854,6366309315784571,7527830222311293,1533749442591178,7738802613706625,7015448177606531,3258627133022086,2572033175932908,6730098888830859,6443674561380236,4895671631056793,7570362023960474,4154322133266333,2580625084354463,4328739794976672,7291099474059173,8775192318316457,3274004523683754,1428478325342125,7539670072147887,6638336452702128,2174914259935154,3043673835134899,2046130030878646,3769756599123895,2750851899367352,2644690914103284,326377206374333,225099475136447,5115417484586946,4925941668241347,151630603608004,4837828818362309,4669156862324679,8197522383682892,1460476157431754,3919497344417740,2283155436957649,7140848880594898,4582140657233880,4966491865563098,4305644164947279,6377628273737722,4997616169844702,7318294102405088,8654704817971169,7631146525511660,7256379777900528,4215362516979700,7208177783640058,6451461073089194],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e4521446df02458bd88840687af212c5",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000296325.1/GCA_000296325.1_PAO579-1.0_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"ALOF01000001.1 Pseudomonas aeruginosa PAO579 Contig01, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e4521446df02458bd88840687af212c5\",\"mins\":[1825648980148224,2242875306508290,3447194786553859,1341059202809862,5982935351779340,3778695907909648,8686731819999249,8049255821115410,8722213897478147,7931324617308998,5675642116325398,4707508246839320,5732729845055513,3981791856091165,7974116936837059,5982357417443359,692050547335200,295956355178535,4099172624924714,5568173203071019,7767473861999282,4738128340140078,5043199974801456,581138295488562,6346294272499763,6872114492186678,4966074889592889,5461770361495613,3125038653521982,3466706848956479,6117705741090880,8372113748394051,7031111501029445,1708900610834503,335152522969161,5858417270046794,8421648900948044,152461611925582,4507216513810512,3242658042052692,5461362154872917,4195156250796124,7507244859457631,1292057396764768,8335225580183568,3582094885978213,7240419952304231,2716528174121066,7826302066413586,2255912029675639,9104988338360081,637725561069693,7742343059169408,559774794818923,8432765853257750,4960453765070986,4162116280017037,870684408455310,7958111668404248,325785438532974,8708081261904024,1584430685126815,6567294581661856,238480830128289,2058418906267813,2696321150820522,5884645834057774,4778283574558749,5533047061520560,7241782625280182,7133990131736607,6549768251449532,4944011556847806,6255227318501568,980761336053954,2249355887780035,2969456938959044,3005449996525765,1583177986564294,1812578367029448,2706305621852365,3726539573731535,2892471568337615,1989705972433119,8203583702123899,8202085754650859,4141142043164909,1815666573754608,7890493133652209,6169169452876019,9008729635651828,4817048900788473,8101580549169406,273394857230592,4197209708118273,4703323368497415,2141722644504840,8634456537448714,2533600211230991,2609918354374935,2912507500052763,8488090624377116,411594520061629,2670236492824866,2472365506855210,5460748222734637,3152437228470581,1061908461019446,1875635783140745,3273080538792254,446373638218052,9221304002658630,6821676494987591,1243312057983305,4763323462443339,8954129491252621,2045226299531604,8236459778606478,3214521610428758,175705287735531,2663829005200100,660734179279196,677601310220638,1108104819720544,1664197454422370,7970546297545059,895332462715239,1756132578550122,336570157120231,8029926179529068,5513447266443629,60697040355700,6429091812335990,5004781145391483,7919298333081980,2562626205368701,5546508894552446,5601666975752575,2681265936982403,4518854675259782,669196826050952,6168311180992906,4801516296298891,3929483855839630,3057315154464555,7033561292669331,5045834763919764,7455209331966364,4699202875449757,8592053240834767,8290675593977925,3165758903802608,2776872995594658,3491351727284647,8022862563762600,4912142653904284,1263841826972074,5423624015847852,8797318172541360,187812751753649,6810430454456754,4145901585826227,3419500886114745,1011452024398266,967880405524924,412115780428223,741503232065987,8732447265956292,8538393641968765,7575014179217486,5561251237883983,5722025083314659,3592596865573348,8548282705428965,5886474745299435,4762846919614958,7153662514618864,3201737096978930,3582402698928628,383493755926649,9178557679845883,3669292656198140,8630948905796096,8081252838261253,1742951819289098,1055038933795339,8575329922785805,1409409868022287,684259923157520,8949146968068723,2184443154514452,1689000284627479,2347247535882776,6489958089155098,4715146946755313,2545219659432479,3505901892838832,4079759344656937,979316247904814,4431559944143407,4940929685347080,5066124605845598,8132059352670774,2031245685187127,8765338575127096,2532448444138043,2383741723320895,3122300085715040,6652297482707522,166104364425797,295791539233352,8656137116787278,1173881909363280,6428685828858451,9211670786155092,5477662529561174,3766864980930925,18650490225240,3627837969165071,779206551806557,3791776890495584,4639199783723617,8763561430065762,8253391879848552,4960997388616297,494722871911019,8818161138844270,5748590688305777,1546013737648755,2518876397838965,1850824917049976,7197273160254074,3398157430465147,905930312598140,1778988980413053,6233948556477054,5544817702759189,8976826211549824,2072490620191366,1245688498922120,7851871946654345,881199321318029,1070773832499856,2298639484060305,217214059528851,203814093644437,1452317551172377,4675223172006555,9071399904084636,7231428411736734,7903058862858912,3882629053894768,8450254135485894,6205178344112806,2408780095890088,4015277670782407,3675052909601452,8947814064643377,5481840160105135,1382596604527281,6283390489502392,8599969595753151,4739668043684640,3930112922092226,5474232144462531,1357990135349957,255429886452426,6152567895965815,375527135126221,796598326371022,3613324903425485,912196485087958,435898573867763,5609817655689951,662145299776227,780184025277156,747384259199725,8861447239076648,5802979297067763,4271363780494076,7206582549963518,4858546652291847,6159485866830636,4550074267034379,2058933928002319,1057055539970833,7298880171459346,635793318170421,3297374177734788,6444509444621082,3754079474590492,3539196398024154,4910698101916446,3420290618426147,3329133899096868,9038017041056538,8005958356037767,7100988808913709,102171739587374,5868237455156016,6107546038420281,668151234372415,2562981368390469,1728242116690764,7978385459716941,7277980287492943,565641661539155,8505675617869966,2175024872489815,8051407155626840,1627950342046563,2397511039353702,4520738976785257,8527827591799661,3663762797699951,2497662947451760,1310651690853238,4855395494167417,4865489732944763,7455932019936064,4975264603603843,4706231506609028,1535359552824197,6221688874394505,8425321307898765,4902400085628397,5454332038628242,8417932355470227,4483056433374100,8447156999594904,1713878559507353,5758073021969903,5827525029405601,1150357960303522,196692764074915,2079128375460773,2405905957553065,2607037459571628,4611604819038365,7883071421359024,8905483556704607,452154814997427,2746080421856180,2110542840505271,4598286695572413,7106930217206719,6355761970881473,4780109512336323,3372524130689989,1448744561309175,7726038795543500,1221882098082768,5210470135753550,8219493761835991,8226822531343325,7904734603608229,1240475997881315,2942203506828262,2892527411684327,1441083353678825,4803958938412022,2523428823283833,8753508465875796,1343289626018811,2893811666732029,5604484083860478,2505536711492610,137094921896964,8068571590915348,2297781950489607,6475758706951683,568107180753947,6774570101130269,1198298415883296,7397828813292577,4114350164485154,5089618229601315,2822415313503274,52691376849965,1093497080096264,479269639119927,848996882613305,1045151965733946,1067297977387871,7285794211619906,6162704597255239,7026702528144458,6436538191971404,6192298839852110,5229044830635092,2785204834842126,8640445684171865,2671896395826269,1439362296251487,9176175920637024,5972890795385953,6591565996401762,6202964187333732,1303341412361318,7367269211292777,2338082008376428,561634983887981,6233314059936878,4107676089771121,7347975970194549,2853837061227640,6038308917478525,584165697037438,5123883283244167,1499613532013707,7785954381169807,1856793424725138,7317984045093059,4780940703959918,4783385754461334,7192659330565275,2427900247336093,8146224151864859,4616870265250980,1672118996296872,6757791400125610,118718608222747,377366102066351,4287711848715806,650068441932983,281717282219193,611289534973115,7874821023696073,3780360283034523,7635387568940240,1075654807038903,2726414915716311,540132752123096,2379170032706777,5598935149277391,3541790429054172,1461378370053342,1236882747278560,4237550679844065,1076753588569314,7582718790378728,7314267375121959,2171065290892526,2186931886916847,5754878247093491,3867810136433915,8344571198170368,1491568405150593,2072095094310152,6649130563495180,4890486343558418,2388340610860307,5599194888733972,2379218459714839,4032146489099546,4325490435671323,4329813166368028,5429926521259294,3874101255390497,8242672688612645,489535446779175,5453957234550062,3460976505113480,44798075708723,2198586172835380,6821741102671163,3757987012773183,326957079651651,5156804979393866,550306757379405,6842275916080462,3098247804904786,3583905369400660,3617571094308181,8018060629280086,2741602193343832,7944286668154201,2257242554926428,3607050580927838,7365006836909407,8462859108476267,6913013882692978,863520313361783,7655004521366906,8499485706003835,6937764470300335,5011844600530302,7095818567252885,841803076756865,5757456196066198,3460813827608812,6798433376521111,1256139526783974,4163383691568530,2708640822486422,5103223662093719,6100446366045764,7459494959146394,616444676326813,719525577844126,1420571704051106,5346650473077660,5220581478303147,6258660517414316,8724388857300397,5677648697951664,2993279566579121,3885092685710773,8907805890160063,3385816656648205,3045503677818307,4756911305221122,515490452235718,4805280468075978,4527987959924173,3346183337653837,1014506952533457,2100305623296931,1994114190378453,1586121131533788,3224711245555172,1157587158820326,6236129712951548,1984304708961779,465868061730298,8028617050484991,5477788394890752,2517769504243968,5992087869965826,15525478368771,51016350684973,2313691588306438,599781281441287,3236466793465352,8448172757419531,7305695843796497,5552449934143747,9035523760277014,1019537707017754,1124448443680283,3290840134968862,3089597554312737,5737276429919778,2821455805654563,8521902574970404,4822493318294449,820608301409832,4588489414444585,554936117732907,2850212615767599,9113338924260275,8587841127933492,461758241523253,4157105140308799,2170213631747651,7648129565386308,2247101242885703,4861392948872779,2102799013586511,869285742315089,182784770893411,2070489576613461,8651765958411864,2689332395484762,2881736088471136,5965028783990369,3702616186660450,7033941757552227,4783730030495332,6064080526149223,8508319114782313,5541831766959722,3497634148075119,1774237891929712,4788408733140595,8952644861691509,6647491770992249,8943792793609851,7813282681824900,1015246938887710,4769822210795148,1318207372396173,787338698073742,5014523760428688,7735498293864083,6297285050697367,1879679962188740,8481228935317103,3946040774084254,803113948096159,7625548745524896,2306154960848545,4983168834995874,3321355409213094,7063536414942887,947038921528946,2434963572885176,9072019487082170,6751298672944827,4019307431610044,1580725474739901,6798879655634624,7788634028836547,6290108149286601,5475908167173835,8969482135881420,5980796575762125,2419547738924752,7020766647428824,6537163609048795,6869623704028892,4061393831724770,6392749796779749,2722998909216487,1473957826864872,2837351521044201,4970145318635,3336697764644588,3532439747684077,4632763553613551,8704774922290928,3890723008620273,4134107242694386,2012059341659091,618191707096828,3285935885068030,8286386103699199,2208621494896385,4025207034083117,5831636441568897,33621298964234,4828190329628428,2166989778566709,8636760876156687,5790142845814544,2093949930981140,3586084679919389,1220494130448158,837922871396129,5888136499799848,7174803963001820,1736117878392618,3117093582931755,2429524713047853,7285181530105648,7525828336469811,896978631976758,262495373182779,3109891331696445,5607340096512309,181558880544577,7410029920888648,2893217903241033,4150657603487563,6386557308880721,4806371108771375,5190807724602928,4934717584582490,4520833107994461,5736193498446673,6737110387525471,9011529193854336,5531333799421795,6219928217028455,8769275338202338,5224375892211346,4487329759430510,4254702633109363,7943192566671223,3343207744169849,4022862580508538,3363955026716539,8015680413828992,5475342956578697,4363231059347338,3740248674461582,5172933099554706,1812907740186517,5887709529473348,308372247029659,2850944440788892,2325616806840221,8658920927414174,783414740739999,9200383070750627,5423129093384101,5649617802102698,782518070691755,2142004363028396,1152444526192557,2763403050747823,8100304772804936,4272702843766706,8112498429093811,2664478888912821,8542488013809590,1166479755823036,865452593530817,8159799601676619,41333394622409,1590555504782327,6960093542664140,5500566343690189,5448299522189263,4681332493605880,8502881993664466,6108373419575251,3131398938249175,3275626527811544,4712285744834526,2821670005893089,5089280359606242,5240905884829669,2752659753442671,9091435389962229,5078534890121206,6171008575069600,2362268968511482,6500316467595261,2349839281620997,7458892672755725,6553732895329247,1357453871605782,2891079468296215,6728906497592324,3301769272248346,3595837121005595,2189246007740461,8368006527658030,4888260514056243,5404584320524638,2855265152796726,7214073671026745,7870622540499002,2856548743096379,8135198308591677,7200229207328833,641730380228678,53936673597513,3087724489189453,7962465309010000,6126874319210168,8987545906774371,5265241410607339,2019177321875545,4686975239743581,8199637199316667,888561828816997,199968667043942,9189511668648039,7427145146754748,7015987234570599,4478591463319662,4274805424359101,9016349220997236,3525835040950389,5178187033454712,6723845004806268,3133642685088106,5911676104321154,196815346198659,5983608124344456,2228054000846985,8602903127689359,1781011146639504,4613993023566549,3104698387237011,3278119729612950,825089629276312,2669033484856346,35089719486622,1723434365995168,516698370451617,3711075883340476,3691494962047145,6156340972996778,8733548440914091,2734432587565229,1715626690488498,6499428004432051,6404191643953339,8794511835336297,6592997913971255,4205631132187683,6254678103451861,9119004498856151,8187357186075347,5155061539268831,9042432493955296,5891100560287971,603948534466789,7360800777324780,3693483339843831,4356166577023224,1860692312303869,3193898285000962,8287854254901508,2887969760495878,7201152917760264,802543633115405,3905340535793934,6297916734630162,3283744411052313,1519405139683612,3799121863026974,524476104796448,7702838433321350,5809432070096604,9105273355512114,2616834941643059,8461126727346484,1917988964641078,6698278816715145,5106382710319420,1365693793331519,2040120949279041,5088299399486518,5142911826651466,2793704712472907,1666104380524876,4021799015925474,2359678683982158,6833314453408085,4602065231694169,984855164070235,7812328905959775,3578396665489761,1652401780672866,6172412827945315,114817155606886,6579767000525159,7006738425941052,1335132091369834,6101328722905451,6730479648379207,9096416529156476,5489170709000597,4215510340323712,6697155123243393,5680763669776771,6345904988916104,1448399338419948,5898421709695376,1478166905317782,6892407813326774,6006227927542169,1165257885348643,3083528067344795,6224738621876636,7544580027517342,1231637158014021,8770826167478000,539952343468450,7989783117719971,8842809886747275,4431689851079078,4293736972241320,1801439101094315,2846960564054445,1197968207317422,8889462754091421,266449205995954,5984483539642810,8270185897472415,8315830390204866,978055887899075,8159931678136054,2500879502223815,7424077867854281,4110723853825783,1134423114090957,8160589781453264,5120746422626769,8331886295861714,4015566756391384,2283918477339101,1261277460408799,2281956094962146,1530964743899622,8637545298930155,7116985279072750,1269751755721203,6279596050008568,5585745852524287,6470178355954090,5132272502114814,8336517337188863,4439634738825728,6256456632306182,6828487550673324,7120967904086538,8135120210487819,4945148031199756,2157357314894350,5389198081804817,7589989133478418,6672346005326355,817574416175042,2954977448741400,7340627638250011,9020655146289693,756443186498079,6522695089048097,2977004590246436,7567076589840939,2354652597291565,7224176958401070,2770227102540211,6863104705759796,1083889784015413,4574704530197047,736055114139402,5014149963893310,9176986242796095,6577074562959937,8737395895913034,8094847934909011,1204674483915349,6159398792800855,3464002313030233,8074654652795486,2692781524683359,8239368394197603,5979024870197863,4176047723285099,7582064256821869,5655543627745905,1565623565167219,78357334436469,8602209781557878,4434774127168119,4436097664999871,1453348653959805,2153924495526528,8647175771525568,2615730021973099,2066836231891588,5156662950595205,18006726052487,7264447337949834,707439295474315,5361676288363149,6411639381142161,180236108841411,9211922073196313,4778496127945372,699698288979056,4105087639423655,1517071387311218,1408476039326383,2919508513262260,2750250105686712,2307444293675708,5507272146864831,2912828541414080,2556350734830274,2075011526781635,4429238852831942,4131760287370359,8040494651400838,8072554134786509,6114111943822032,5350801021889233,2785389606836003,710654020676308,1244885723851478,5265285478705884,6788270244945018,8005492568124129,3703318052170466,8311487957256932,1044192497437416,7830327839566570,112368647826158,6806919729261298,5653747224885940,2999286599068404,7436926980182485,7315122943054851,6152282086075137,1843996232181547,3446583399611521,963050109979400,4743316343802638,7771890646567695,3932656345672599,5627424599395093,8812528430172950,988818070457114,4297324755669466,3450684393370075,560817418275624,695162161335083,5428228989479724,7191370303900462,9083406286187656,1695072076565302,5028680683842359,4991756612938552,8671050538216250,9162314986654525,3146126560873279,8351287750159168,1049972089604936,5330521388215113,5563422622870350,5125686702713683,4010250590456664,6777422741973849,1051605262101341,7506426148719455,4646438159259602,2515505303960720,8039093544240955,3801042868964196,3788988590705511,3374655543282536,2506734241229678,8315470742006642,1369392084208504,887156973620089,8793555998919546,6546728858815356,7823267583961981,4311556085787521,6916075934526340,2590336095996805,5581526532295560,9001694132300690,7537745635630233,5562708304047006,4036946366434207,5963969682074531,8478640488106920,8058689523682217,6819173355719594,1010718843194284,378536936065966,3589279209450415,6790867747662769,8161006826539958,1854279896532809,4612788061121467,4977744855559103,1936533606108099,724862280043460,4646791886080968,1438882400611275,9050917751458764,305938853186509,8209293391382957,5454830021462999,6893164680244190,6531069308185567,2853849870596531,6429097827473232,8707277495479267,5340671128509608,8429096798948343,714696875092985,5410295012404218,7059821247556605,1798771770829823,7487516166925314,7577324317666308,1207465805941768,319127354870793,8578710629862410,6416540561288205,7227531949566991,8410664087156568,2028098386766869,2316934598970391,1999371400965146,1345978337020957,3047276721097760,5110103931530273,1700220898585634,5533524569566246,1950936647846954,1992537076059183,5061708529871924,1296781295373365,1002566130428982,6368616022174775,7175015413124153,2381433421384764,5753777481321535,6820525364792384,1207909707589146,5159762360847428,6135578419080261,8690785845668940,1215095148530766,1313275117666829,4722197057670226,1936160448474196,8791861973625941,7329922593246296,446566574517337,5088452242058330,4697071465718287,2081749098843229,8990242450738272,5698061732973671,1803955474402413,8505374158367855,5197810517093488,5022530125507698,5612461840632947,7997893525048436,8126771347074167,5527908679827988,7737440598223995,2702558898637948,435990103420029,2413875722693762,1953402490320747,5036453460610183,3957169066929288,5463931799923824,7257781297122443,6661714455227535,8687411883152,8705990428978322,7524218787772474,2758188969471128,1160645203283097,6761245306186906,3321515718479013,8342006818983082,8034657610222768,5965017188641969,1648777718167411,1611301293943992,5129390140968121,5740353840639164,1302893187476670,8397721133698240,6420423175363,3721447194684612,489389557583046,169929898618057,7027216265014474,1077036016191351,4553204929408204,7794945101786326,5473690401900409,1939055425690831,8282243386028582,3796038994971880,2074698571968217,4513027993357555,5928711245499636,7200246185449342,733872285256955,7272169192811772,5616731539000573,61345496411396,8653046912466134,1508180705316102,8114937280908553,8682542425096661,1425351357395980,2704923698998543,8928553565695251,8502612383845655,6809477167454359,1827619080965405,4480909678719536,7048771574172962,5097957971577090,7886242219052335,7667667381808432,8744322797047089,9157646000893236,2844395321899583,5380703477624125,7328401544817984,2762998051179842,1166116063472963,3381002772374744,151593106877767,4042741367369032,6742016668691789,2064879062764882,5767587820031316,57620679511382,5096233580201584,6636015295698832,151891348499815,2581611930516712,8110688086216051,7911126965267829,925190240390520,52004509797753,7750533630446971,351427702869372,4027658756754813,4278121920400773,5245465548737931,7822578948173202,7895768190613401,3016642777427352,118135917776285,8819319823216030,4163031481413024,3926127555554726,8049632463318444,1448309353581997,6534301676137907,7201003828874678,1689531554306738,5643191964093884,2316716568489406,6005098722512117,4553666074635712,7629100961525186,8984099452652995,5755891285577159,6435007587823049,1275034078334411,4179609112882637,7953562272353744,6962299487866321,328760410041811,4380801864756698,2518107083484635,4657296229283534,6254038641380836,6771056816057830,8345527749463530,4278164994518507,5891314905189869,1709760422194671,5993805499674096,6884783518445042,7128521600340563,2304190849764853,4652924773404152,2271145205837305,3021901970763258,3323770660404327,2980715216801276,5904434399333885,8568705156591102,5194278963293696,373776110095740,1607617037331972,676910235258373,7290289553913772,2197538559618575,632558900629008,5694750530039313,5385461289717270,6653472801353240,2588116369296921,7155402469681071,1177593273306653,1727313656401442,3284317072567844,4572495293156905,7989367233170986,8338932879502209,6621472811609646,5340511912308277,190633263795768,7601378948443706,1915816906559036,6117081943518783,8879105380704864,5207517876817474,7011047562128963,556331050962500,5434322014776901,3381912499285575,4432747689078348,4936667947248428,2057230410112269,5716729112637010,6116249124925012,3247469456928014,179181561491032,162427548700252,8528545370009182,5603057719321781,907737595383395,106503742377576,1947406614998633,8550260875374190,5160564710534767,8347804465671792,2463880522681969,6208735047716470,1656220976995389,1766639744134784,8127526639201923,8378411452960390,2054303716937354,2729643884908174,5219674136235665,8606917709852306,3722014854604739,8637907380588180,3400814664781463,4671253279100568,3090774650752669,9053114485599902,8474250278309542,7578527490739881,8015273422425771,7605906963107501,2004943534993075,7652174364257977,1272770145767098,5571522633142901,4157172862848704,5317836490182337,3092086064139974,5590645865105357,4899363888032013,5444889425637080,5705694990429913,8218656600500175,7693991133605599,6132293388029664,7325932532474491,7725351762521830,21968976672722,2313697478700789,4123013076221225,6191231385915129,8385429490044670,7131106419683071,6262209182003840,8217087918224839,4982370437558026,3234436432523020,1558330804023054,7187341170446095,425349261707224,5414326221786899,4512696732741396,4950232146743064,1551753217748762,8907737953907333,8305693744886234,8784802231299873,7276515108714459,2188984623821446,9073963403808550,6312323284835633,8383336530579240,7911568464435164,3038750758883975,3190633159119496,3343660257816371,2441252594272222,2072341918576438,2255312465870790,7462476398792505,6259189833297723,4472023932523146,9022632032849728,7466736909373249,2427458968531709,5996222970048325,4569093177468897,8386398003294030,2883647596048207,1779658447523665,1690277905313619,8677387166863189,7977809493512022,111766749073242,5114979985253008,2854251640418141,3177247712169825,6010714277683041,3504553802749790,8123953337798510,3426861304720701,1664484899868529,5785609175609202,803979742315155,6196336338648382,8308245892722551,8788532173565818,7000240716418942,2706672107966337,2783158206001026,7606431954434114,235302775738245,5792515412537222,5315695730168277,6179823348264844,8888819299486406,7193130321235860,7156754966998933,7327286056342169,6211690711682970,7299330788028320,602891187105698,7917294711909702,4079996818878375,8489351888654250,8281064559251377,4730422732025781,4746641993658294,7936254010701812,8432832165121978,3895494717771707,4792545103426208,5289678283534274,3679423824269251,6431873135366084,130551540469701,3217570951458758,5652439913951180,5525532840505534,4251285496393680,8894493442322393,3604960841609178,2611208979402718,7780873358992037,2134487453163357,3571908914122727,8749577454161897,2092715525878439,6396378417760253,8445607867081384,1654471997321202,5242125263775801,7517101473074516,1175614536364028,699158477656064,2330032313757697,8879253277934251,3504117351944206,329642425913359,5870013472436242,3454533486653461,1476777048002582,6249730969587735,2829993310072856,7670499108433945,1448572499092143,4747129986822173,8088876982194208,1670455141014875,3795454357549093,8680238313615398,3834091080347687,8542993757104272,5960914941210667,3689767912099884,7867208817602608,5095730381754418,5207957664542771,4186625426264126,7564737122063029,2706526091661381,5170283890667590,4489370989736007,5482108677345352,615644862107721,1436897274114122,6934328682524747,5352088910355810,6463086518292559,7769088532975700,337245653185209,7494457439391832,1003061248741465,4693185372565596,2915650493296734,4170492827488352,7621352552976481,7890583908356194,5018499629150312,3747220216828604,7284605282152557,881119234166895,793384128426096,1353912562923539,2013262548308092,5715280603148413,6826361718435967,7811316467462273,385755144794242,807059482357892,3614614728519815,1368436294758541,8943246785310862,7719451757957263,4726962273513619,6305656363407385,4286890228863129,2296646198800538,2649356206452891,2371553995122714,2677817976049832,1207038172582057,8690854046429356,4730149758709107,4749396075434168,2937460315951290,4951189731209406,8650985567939957,2989922693615810,4685332054459083,8865811775910084,8014605329535174,183798263435463,3445529875042506,4400431963762892,2596775812072141,3913805392331470,545195466281176,4412952006709465,1833585153896668,100173299888351,3074563508310240,7189318104215779,5961609067417829,3047576859540860,3439414049706220,204116002500848,5457553560359153,7312455714574584,2023772700946684,7976895063855358,2972787178819839,264685101125891,7954195652194564,6820033037988102,378021337624841,5782009917042954,8496855180661005,1338100456403215,2906536239501584,8086635968565522,8399499254149396,7243277173035285,4030374274461974,5388630965178659,3774491859885447,363908824289594,6615402305483071,2635397832888640,641892985680193,23974554022211,6155644697391431,3635124274549064,37511667970378,2961803009560909,8379034900043833,5831062157242712,8772322114392411,2698852554125661,3833538080051551,8335617363939681,480637148680548,958125524136297,1707450553241962,2565719368528237,6098654719412285,5206556218700144,6066244133261682,2985628197654899,478814084675646,5451979860250999,1176751949533560,5129330429055354,8264538289993791,3069894601568641,1728377831895428,8940367238967685,4413530488721798,558968532488584,1210453051101577,2371088507039127,4089796306530701,113161445659022,8633168137712015,1272428950434193,362447947829651,4565420998398357,3558887677972887,4182234371895706,7164188539867548,6236960171594143,8796418218881441,6876482750198182,352166042759592,458521285259693,9155623336578461,5002432741142963,4826579481055671,728163354702268,2563535924613565,7335204336480703,3383967935132096,5795733695762881,6067240845431243,9197223091673881,2327773525160397,2122214986248654,2181552663400911,4573872640094673,7915676621197780,3169929393836501,949948121756120,2639049635336666,2717534466306523,8766175792026077,953839788601832,3710033554911726,2179769924948463,5329215910679025,8288948733948406,1211675839723641,1942080122982905,8444639912972794,1313605372318207,5991381506373719,3207210189451788,1252176142168589,8385797332374032,2142968976683537,7940921608213014,6655880321102360,2508118302601754,678653601337883,3614574299025949,5845630400205350,633847595115271,788055899476525,6442849273819695,1183809730761264,1504600635322933,4093065884290183,915552841029728,3573939076493890,6361378611786308,8375280165621174,5418563764253254,4659704309756487,8102068834300492,4471370872517197,746494579642962,2170310245478995,8586717693588058,8575867282158351,7014324963627617,7971111733219942,4634440689357418,6690052171403886,6038481224757871,5491915104686707,4835136876687988,4437055990534773,8714992590303862,4857718445511292,4711444247728768,5947711580770945,7726611765547653,4523596711916166,5573932355162759,1714579623686792,1986830285951626,7070527924941451,3772662846419600,7356584231285398,583227522405016,6139101076402841,4255049407719535,1901925133783709,742688204952224,3021242068488870,274529720292007,3779587207951024,9111426978722482,4724289737757365,6819353932377545,2713007844160185,195417497899708,1366872552999029,2366747200459456,6067991991521986,1510016630305475,5928673843204807,6090657553322705,2038210427040467,3713581515936469,7743140872147671,6206769656181476,3647244896293609,6476155342476018,6769297329631988,8693255782494965,2174708789719798,8880724775973626,4866191304258299,1860693630022396,4042003609350909,5689800666067712,1683855464559403,5749573433905928,6875555456201482,813115746677519,1775508494668566,8883627753265939,4803962057904927,5371475245814560,3252261137208099,5961474889872171,464524958495535,7591286726325043,7817234234284169,7674941746025272,869873178353035,6997020688536381,8490155680813887,3079261890919947,1574700462445381,3180383572063055,1318387961942865,7127976060212055,5565256774553060,933854838305626,5317518164718427,4604545701286753,2356167025013602,4269383703884645,4864472437937000,148938568840041,7500765262574445,2549196355998575,3564821538337648,8716302165824377,4898133187096042,2122991481533313,7460891122848643,1175723634755734,2963855933412231,2446897897084973,2870566998848393,1026722820151447,1174371731288975,8946332494762385,724621096768401,5837012027331476,7515008683152278,1866301441414043,6678838912504734,3104384780678049,5653757243872163,6868995695522732,9060092651235485,6955942119969715,2430254335988661,4869163533513659,7744871944229820,5870144389706685,4431783417470454,1409785158538182,2172544198726604,599098488230861,6800429115487191,2837391147045848,5314656414405593,6406696758735695,3393461148163578,41028542190566,3399181597979626,1167174263837675,2412920939828206,4493522934076404,739001993016310,7079517407523837,1634286765069310,5102690039469059,2499122163053574,1324249696883721,5674011977946123,3468250521515020,4310980028478479,521996040048132,4187298409886747,3983964013112837,7646098135323680,4471406198658082,6737395326489637,7558936749118502,990478654567463,3797173733012521,2114788469003311,6395894039666184,6577585086583860,8240243260404792,270480234386490,8758988022330430,1088567884117055,7459065003947075,3784135096022084,8349395878105953,5929992403588170,9047156308093821,2420049097981453,8577239876663481,7510748863517786,5714807743575131,4372282179974236,7653148258071651,4277500181632100,8796698853453329,4501007753516136,877371145557098,3809006445474923,21269167019126,3633433064317801,5320275155238420,3805280330478714,5884730499544187,6931531574760573,2689484811981950,4996149085770880,8752704753160122,7861111459329155,1131125115155592,3021773740520585,6222321593332874,3194983580628112,4395044209683992,3486087824059929,1718894020736153,2799704236000111,8713648000791710,8405611246318751,4877596472431778,3356468254856355,6791410172818602,737734851015861,3225007396648119,3342257951937722,6701876604376508,6018042295686332,864127928005825,5371657931863236,9181646262441157,4372108389881030,3069190476387533,6440832417141974,7806304686093527,3532320322199088,1476059969524956,4649114049049821,6883640480232671,7055037948097761,8977407241151355,1772431437174993,5299797937951979,636104303588589,2078663603475696,8986068174648564,513199995139317,722389546087673,7685105092433146,8534617049773307,7469419719767292,5460781841904894,6139378792740095,727610916738305,4715050518107394,2082212922601003,8160713070789505,4653539874280713,4636632942236939,6751121999623437,9062772253594894,525716408218900,3629041858653742,5133027386086678,5728269735073052,1609252139234589,7374658377227824,5637136810292514,8961643496680753,2878861855855918,8715022564742447,1881262431720754,4912131982923061,3677811277362486,424865371882377,1634346533983544,530151578431029,7155819201262912,86139204826436,1652354140509519,6280170469225809,3027089806382421,9165493897920057,8495180020356440,3877407798859098,5994072961332571,135206564710629,6414388357838178,4143450050229606,346546331227496,1476609122563435,4681520393819502,6633298581446205,5411112898024817,3270109632427379,8813174365263220,5811326081348981,2849502394749844,277909581452666,7018921615201663,3748258934879616,3692119157528811,8032851864892807,4706049834724930,6509939122419086,7564348498538051,3533151424419221,2142932648940950,1024061409678743,5004983654847897,6248293643842971,6583057948726684,3591569770804637,2855542702560670,5060041665820063,6806171925796259,4041495660737957,761686412121511,2529664394335656,7474892771923374,555453075289519,5292938443281842,6611916529292727,1835195592734140,4514789601670591,6553373535540672,1765926488937923,1000441112196550,7347330484360647,8035138601997769,5693382968210689,5939244600423890,5584028709279188,4887172988952600,7787115972548058,2025829383757391,3548726672119261,2912577443267493,2567740498747067,5532416862639586,1014637947139555,7607446921123302,225502558852589,398592550016495,8487995272099312,3330981070779891,7658301732681207,2093635845862904,1639424433878522,3827636663145983,3158893303993859,97830294271493,5281362864018951,1006820556661676,6998819710776843,1935937738118668,820811793847821,6877561486210574,2115797313476113,347389977703954,5771125783991832,5869103121967364,8277965979620894,6421627371583012,7350343363614247,8068758264837672,4917525670336041,3265526883685933,3520623494567471,6847753205388848,3124775272994355,116053770352186,3155004858596959,619539124393532,829497610827326,1303968608351810,4569784064579140,6793984534001222,5988720293077943,276591794247245,7488842009835087,3793134449012323,5180199201887838,3581016076662367,7299698745521760,554406343833186,8197616638596027,8417750607165031,841197384883815,5341768123160173,6917025746073198,1278257708332655,205725871552114,8869010765330035,4029510697915612,6880074198832758,6173259183517289,886224401249912,9095085671716473,8542441873810367,6311102901712510,1494796939613825,766410890966658,8935111186413187,6336438172538503,436752725842199,5350945539813777,3086009624131218,1856103042569875,1710395123422868,3682495649435246,4249089798723223,309031068456600,5535573549815450,990561487369885,4273681948087968,6997064635258530,6904528639096483,3474744923158181,3592782720562854,1143581770716841,4121554230572717,5020945395824305,1856715080963770,8915204900714171,4486592372291263,6855934739011269,3550637156316871,3515321753605036,2507296291018446,5561141410304973,4739006935013074,5998617988208349,7625638938375905,5600351303546597,1389192961668842,277611667797740,1065093179487984,5254998128310006,381782126925559,916544799880954,3980142245132027,8003897259407100,216286392438400,3342085229041410,7879241581672195,8760363735652100,3014842970994438,8863822628869899,1740481775417104,2031130103231773,2577459858986773,7814562810042137,7328409463600091,897688885704491,1751405529863981,8853018425218530,7772538120187477,1213777262778164,7313956991751989,8602384548304694,269339716335422,6592011058943810,6872907206907716,4281306124249398,36978091431750,8994977451018551,2612408944416592,7738016062076753,195724801185619,4261627976685396,1733515682092886,2166770477266775,4135072310564696,115931207939931,3666300961437533,2670147489609566,6231901462648674,2113005628331875,6726404808819686,4467382534690663,4432261887842153,8321327526593511,7416185416275823,1175324309952368,2932660557895539,9051302581370125,3067365383720566,5010616462820329,9089202494699385,6633438134171515,8660016777910140,2944205150107518,1026623988782059,4804285253302154,989019304073101,9025133862745998,474234917787536,8020274697443218,8109019027879833,8145751013070748,93349196117928,3368867578632106,172831603578795,4673799705925548,8146796280502191,1809387807692721,4274478035548082,1083000616163257,108321592588219,4829406891612093,3730380037240768,68113945253825,3865007557175627,7633232742347766,7578862218491848,5508979361986506,3846422762936267,8299686161045456,6952130458793938,2500009359792086,2841343626655707,5606965135857628,6293875613038557,5502429555931107,2991295470401509,7472655622174695,5578813451786217,4233842410775549,7703301467822068,5808538120738805,5960888199968759,3808311231920123,9079721360553981,6022882783557630,3302693982943236,4656798335105029,4759366720370699,3728695897293826,1800995096297133,6583591710929923,203112558057494,5039388902348824,7779832937699353,5876099974707227,7773365200607263,4231811366344736,1974299793315876,1453576769730908,2801286274279568,7466938019412013,3364297766819888,4020948848859185,5714824561383477,7710265134241847,1452990443059257,7970075667576890,1042628912134204,1983450515421245,3860678662314046,2775027395131455,2485722324441154,9161937510673603,5461132300752969,567147309234259,7602140694960213,1254187522881623,4552716065764367,6162354654361692,6581040739514462,3440181336266848,947056495040611,1482570443962470,1591926002030696,3008231807899758,3883445530441840,7315918618679410,1881448296332037,5564446240823414,7942397700585591,6090318156863608,2688255907756153,6262525369473148,3855545739835517,4076529156028544,5647671372609669,2487953694034911,6406931733534855,5986380963076233,159041396177034,6496371426637966,6068202692933776,3543115820021911,7193168744347800,2564324713568411,4437826042017949,7001903060555935,5742643424835745,438376344795298,1232011017582756,3655490513562055,5932230356908205,5937774256568494,4449996023969967,7330949609306289,4314234431658163,3284857504700598,7315786649655479,4736665120823481,8495522883401914,181538459801793,2294710360422774,466067796048070,7403212474057761,8816160036403403,3193749853216391,8879277032825890,1798517306112206,6219539284375761,5381303928207570,6187498283246627,6636988783991002,4528166076291292,4944532888099038,9153427054504035,7766447402899684,3413758151817448,4363837921696124,8126706047366183,4095516083861748,4392201312631030,2464117636471032,3382301614815481,4204686294931709,6800199703746817,362471156971779,7228685916379397,6691692128442631,8972794542790922,8269894869907735,6917330019825944,3298233907869983,5199947797207328,5915800597518627,2488390956874025,6731679700056365,6943160240683312,7773964079846452,3349976039741760,8049932800440643,6709413304367430,2777804102195535,1365807599974738,6649643212558051,1533766722222422,6047644391979356,9020047819669221,925457030519136,1318905205512545,9058498362399074,4074554923678052,2015672916410087,6590004680259953,3037518430280050,5192490037025140,8416669580564854,3255217161247096,5991575055186324,7526841335716220,4601238773348735,4225708756892034,422561155792619,1534303502268808,6289963927525769,4322141784725901,4060178588653967,6310687572244884,3336299088492950,3475182182545817,6124131264018841,995361564113309,3488929672001950,2806242989152671,106087554151782,3819189937945000,7608599192856051,6403765709748657,1383947438365107,8493065883933109,8540562538641849,2289914671004092,6847889312830538,5446484962884035,1556239279020490,2458119661124486,2280312978209234,6110432158284243,4377831658707412,7580343161158102,8152925572217303,1771565044431325,6459199892666846,5231378410461669,2633117908163047,8761228085352937,3811003890620908,1509859104340461,4263134747621873,5656401498323446,880995652057592,6154953465507583,5849993811016195,749038659456769,7318501668452873,3586376976013834,5713773625712386,1737703868520975,2971526189316624,5332705536326163,409294305581588,2264752289663406,1563714468452886,6870302245861914,7601423879199151,8766996980095520,6757822078858331,2415988235909669,8385370769626204,1657801111173677,1426691481541167,2600621835639219,989728012098105,8481059574146143,8346773454871103,4257184884914755,2018623980083780,3377470659058246,3055332216765003,6966104292500578,2663901212949072,6508220482157139,8580642765896278,533677204421209,6195041307015772,6558531295734202,8038534826654302,4010805651536481,4338837028878947,5461954127084134,1029252999982865,5872175595092586,7694260815936108,1630723021111058,4493535942441582,7638223988742589,6963410295265912,4187399219739259,5396837173721724,4438194028059265,838329178643076,5576687663243030,498610935274123,347918729575053,6307774400608911,824347867699856,2045141888064148,3913133214349973,3190349884922520,8440319856573084,3221229644372637,7749971929365156,3906696774843048,9041829001460393,6757304991111851,8339764044176045,2575561063725742,5139229371437188,2824435720624818,2034760649980596,3910553736493750,2001519638567610,3440675240458939,4692182750034620,3140296388819646,2769740513887349,6319401028623041,777687277709771,3333782121028292,9168838358586486,3436184868027080,2729880875612877,2203253159213775,3692961781922519,9217767518894808,2951508493238053,7480405960479867,5529514922590570,1085453122214631,7581171637811944,5009228542302953,6371670645422826,6916493166765181,936465531656944,74173699193585,8908436001956990,6002799212919545,3146441286507264,7336948876660523,1486616169495300,868627370564054,1703316202928902,1671914716175112,5081081460439818,4546582426376979,500505865493271,6120686759213849,1320322476587802,3380381212171037,4940910579809056,680866426092323,3040119726185252,5021111797204488,3182797387086632,6978156399262505,1373067244423312,2828486624025053,695232742906673,1111428498773129,64938819709407,3646196150901567,8206648465562438,1615740800015175,3784179653219233,4252783705094988,2968717010852686,1302589489675087,7899263149480785,327164716342100,7793676583582556,3360448598629214,3626989927528933,3143018973526884,5385979792198118,4050470875536230,1937981608999784,7090069395929961,4089118207253358,4635245869857647,8294714423832941,7749942396750534,7130746195344248,7375558944521082,6640332989586300,7871837166492545,194454585662341,6689253387500422,8584516909587335,39732878367626,2087189827140499,5724597873687445,7876417608620950,8404269216635803,7381793617279900,6085221154528157,3441651795223181,5483704810710171,9065842115091364,711937787655509,8795049125116839,2028187245091752,780168235059699,1820935601545033,1941743001303994,4460337932336061,3281685943761855,1319465834134467,6616094820752325,8251729698356169,1143736900033484,8133299865678031,8892220545206776,74483328973779,149573276056532,4210647262108629,5079690337623000,249663037964111,7778407891983324,7571122346277853,7979713945582558,1979006445586939,6647947931057127,5934722163809256,8057716827282409,260817215921132,1160630248930285,4599904484932590,2823971840428541,7172519876942834,5272386685180920,7877954479913978,3369841660451838,1369923080220501,5783989333666304,4598520915360771,3982737843100679,4027733846367240,8283069168532492,8037651891289101,3497059301194771,1759708401335316,4104383097427570,7936766486248470,972462962564119,2454666017050458,7037975305246,5710315131419683,7722249590873124,4359505058323496,4194306530851884,1552691947920431,8768777974848562,6120729687284790,2988516916918793,2896860899499065,3899336267565533,2448125702503484,8494662009502218,8701543681729717,2369994435894338,5136790687726659,5908275078003783,8608485868076115,6834369205574741,6415455370345558,7464605997478253,6802661887425624,2758672718347353,6803118148852830,2414732602604641,9098619701255270,8685476349271143,6155367671266408,7661463840152681,7381756636281963,6392829613390957,948180632419827,479351898102898,3402718458471401,400129150622836,7846601795435642,9029077062417535,4818343244774529,5131794488499331,4399207829167238,8324733758438535,9001286252740460,3173103199321226,2890367479946380,8600915875699856,7367103301147798,3966149641043096,8085877337330483,1564730571106843,6527149131783336,3316045318708393,6074639408290988,6492325472640174,8541905262247088,5398668422192311,7520573939367098,8949573316541634,7271621865684166,261839901973707,6466028278563965,8976401560034515,7034558473477334,6158065039883481,6115263980944607,4020082097020130,2147624293637352,8621632311820773,3449827301448940,4114819352583406,3282434966196094,3976470039215350,7123221473533181,7232643159858430,3659731610295560,1728828599360777,945391500344587,4800973294174082,9090055443037455,4296046998772584,500334151875862,8685850890069209,5360164131421469,1374662094470434,2466821065609094,1587903041008860,6627175312776492,6608967621399773,6601924898200880,964120853216561,6629548982361395,5489967664800990,434663105740090,4533026897706301,4603851534138686,3305714230992192,9065771554315586,3351601368210755,1061216184048968,8153102680268107,6486845152279886,5067480498085200,8683298359795028,5140552771663723,849948163423575,7468902614310235,2499539824942428,3771393561918535,2801860639120741,6123356694199654,453745360485738,2796738001870189,8253640321645934,5748507413183855,8467769680313715,3601143570996597,8431453100170619,45087661849980,538582789201277,2125601411293077,7931840182984064,5732569572219500,1513115051294087,7232932768180823,7030398874484107,4425510118964622,6814115723926934,8652629393161623,3940142306064964,1652307608976796,2209892500487584,5818869061221794,1453112692997541,4526661556477350,6725863418928552,1737962258365869,345937270562222,6987600868638127,717689765076402,7922572271713721,4352603433049531,3254832061758913,8852214119513542,8856506704404385,7032746743332296,6200613581356492,6386034813844942,1752894315675087,3587418396630480,708516434017745,1254127728942551,5477674659550458,1241637433515486,7426415841320415,583109847014880,6439739231829478,1106199631740403,8760826524909044,8002818171379190,2621662149998713,3732000985021944,5917313034616314,159425618164464,8286269765696715,2335149227539967,2061899944418816,4857556358970882,7843768963982887,2678773517942280,8262377723182601,1152496887913995,4580069425356300,7872394658602509,2751296428270685,3358865997692433,8706052379385363,6155018710048276,8097089559526934,4094512231549529,5183847735827996,1777835802328606,5534381848796703,4728408690700225,4171125255396902,5016887254085553,2454279477526062,5883514695425584,232707764526642,4467277210975795,1401132339837534,6146048477773366,9019447938900686,8524768274570813,8029747724531716,2405794195004995,4031415808327237,7841808179977805,789455951877389,745411932970577,3699757106998314,5826716650798683,1031236674447966,8091840416174010,2769889388191327,3147859464027744,6028515532111458,1427621276737125,6087930950155878,4323139039673959,919392467189353,8636700822022759,6174135957234962,776534875013054,7107783730273913,7374686899322500,5626105994597654,1341973376827015,903635535289992,4825368146917996,9122722033974448,5541338209713805,8503837196656270,8324950980558481,8807036115246184,4592842487479958,7210574162394776,8216025407356572,6353407286320798,9105117696065183,3276824315740102,5919917647191719,8127473982783144,8618184823923996,3483074122522282,1001275928125101,6727259943105821,4006911592890037,875390071783096,8805204698349241,4708334367858362,5448505842810555,659607136422517,7462393669240097,3371065396810967,1519704725348045,4373174397927120,7518169796214482,3574267606064855,7672693217435354,6741975400554204,355708522725087,6346362329153248,5800020563107556,4750962687229669,724519046414055,5058680227364587,8033417907797740,2411726123458286,4810498579136242,242751165636563,4334741323103993,3109178595097507,2037731130875648,1833559763279617,6000351955484418,5943452196560643,2648109482639108,5023622973800197,713293323837190,5689495219260033,1211738067066634,6646309104066316,5943195928370962,7644812712550164,6689406718189334,4512018752151322,58538094731038,8137664565254789,1569275591270177,4460787381485349,5329427935520587,6894792334860079,4742008536506166,9190944632737759,1938379301732158,7343568737754945,5606343632904002,8657412627488579,5247587648918838,5476767812403017,3866538071007052,6736965661436501,6980211126771535,5324624245051092,5033865590603610,2122322741796701,774943879454558,6444607631228768,2486424702343824,5394644190266683,2874035275636580,120313572851560,4107906972069863,5488510259257196,8162784529629042,7061462669033331,6032552331198324,8100761143590781,6605249957396353,736718817017730,4152066311921539,3545473911021548,7725073372282764,896200435171213,3230664942485391,2962332549898129,5753292263890837,6345607304011676,7640577873689376,108766189830049,2229769575604131,7599674074980260,3806748701736883,4956105745342389,2058443869413302,8621918217830328,7011439643246524,1645395842236350,2069672634826690,4546099039117254,3853901546921928,5109828314669008,1905672789254098,7745247612239827,3444386371764180,1701954503139285,5341894049857500,7437439639158750,8363813017550815,5420848264511462,6791788363456491,7330985173417964,3153319960551406,7322356297973743,5505199234760690,3928416784015354,1816842737934335],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e5e9f136633ee06623a457e6c5bd9eac",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001529845.1/GCA_001529845.1_ASM152984v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LPDX01000001.1 Burkholderia ubonensis strain MSMB1176WGS MSMB1176WGS_10, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e5e9f136633ee06623a457e6c5bd9eac\",\"mins\":[4544965233106949,742501809515180,6016154141439319,5405006772953103,9098596828518053,7099002348101650,1058306464407572,6860619536759470,2091777491697686,7057777935683410,5639650737149274,7076554447236051,162170520018975,2050623273009185,1564963590250531,2361930760142887,8298070889414697,7980804392665130,4394220585377835,379848064712748,7407580831285296,3281686287409203,8359271824930142,1437481938092088,8119188477042745,3815401618538554,610989337149499,5671846201705824,8149401278038082,8013028726431811,2270577136861252,6112765988921415,5400656625893448,6303098672627785,530723611140171,8341096009818188,2453986332074065,6389465790152787,783565973397588,7482781085122645,2218734993185465,6054937250948452,8427215737970778,7280033104535643,3113005673857116,7328686601330782,2345482231947359,4325953210212449,976158119731303,3848524938068073,7120984775598186,7544723634845031,6517503184994412,7875134968741998,1303977443278959,1059050581581936,8194673526505585,7161438631903346,3307022479491187,5297168451666038,8368007894728825,1980416351846523,6106697523028092,3548441769222270,6745204245684354,7050800668147843,2445388954280069,9166603283348451,5909419175248011,4503433049178252,8113855798926316,4378580293247118,2469804826584429,1725908676255889,6447402772486852,5236141016679791,3293159058112670,6958009638714053,7812400388669602,1217052589015205,6822663392886950,8250233682804903,1008969757393065,7237694030904007,5630584908733046,6228501984272560,942896043712689,380808558903477,8799825909260470,7064995324083565,1407758117159097,8450639874246642,2491202557422282,124494793965758,4976715095761088,3961740653920450,8964023748113230,3222142588035105,3939241272074440,5161974571049163,6512231589265612,2782614350667981,3863454020001998,2506134787801123,7130386724272846,6993642412513758,8409069841293531,3722215547289821,1984538567639263,2906320170696929,243719344013538,4183342790951139,4790688434061540,6452797947658470,7832505197404393,4050601740386343,8623200057805223,6936957605339374,7919551022687613,6381189179597040,5320307656343795,638238022107385,2908450222678266,5174313307660541,7030103279247615,531027053912322,3162476951109894,343364802048044,5512571138343178,738003467288844,668729135538445,254344984969487,7110023859028240,1741354633543955,8998404299833620,5998597657415726,7875448943716965,8256585697724423,1539193371410715,6226932534034716,1660600432681245,2918064227189023,5837580770320673,8873472200887003,5582632716951846,5821888870269223,1242000913023274,3792770723176747,8394551322741184,8986683098317101,8129725430453372,9151171075817523,1117131272593717,730811006255415,3467782324170363,372001288000906,8549698218524990,4113506173788479,7595272942654859,3637064871575876,8497771272077637,6054885050327374,3532576888534413,7322998181637220,5711559360916195,2722080472547669,8929752939372886,834641764876631,5440710548349272,4665502848958809,3015892997882203,8516034187600228,1007609573911270,4553854433591654,7172992655294824,7767346040988009,2185346559722898,1394339804717422,2764828692636015,8480746721108337,8754161837662578,1410141235577205,1572967896383868,675313432117633,5313499970101634,7413771449911460,9037831749985686,4630954639131014,8234587097678216,1532622473724297,8493102267236744,8032973372408205,2432975025324431,863308814693784,2732548645670979,6997294764351894,7991740756763032,5544677230862745,886893219283355,1187282155790749,7065953570480543,2546121653133729,5717345238819236,754549001789861,9026059023509567,3154721167909291,4082709581398445,6637135905452224,349965962076592,5677284801257617,3511328944964023,1612791501963708,8967358365011467,2458514055274945,2062197125669314,4750936891589060,1661009568039369,1599112780194250,1235698348319180,6412836214702542,387617820156369,6751769309962707,5530550353822164,3645556333175255,2750074010640856,3355177130312154,6462957016015325,5709442410897886,4834335064637919,2907138186379744,2903648644620770,8058135255065060,4278227877741029,5440411414970449,1853610753483242,2339743822381550,2203661751319740,7058553265414646,6745004666126841,6822219948665599,4269907917136380,794555284406781,823710899806718,2296975746195969,1196209506066952,1122815605391882,6424424872034827,6461911720397570,7390612690078829,4439079047791120,2841315127005272,3087356407505427,6948623081711316,5023239499784725,1507261447840278,6653092889649241,8129029268570649,8796713115230747,8238606627723143,5333838766465568,3729314773910960,391082155532834,1071342595717430,6965692113175077,974035214116273,5769509634310696,7598638772462123,2200620026028591,4458244631806512,7519133197042226,5953718862365236,2568801926095413,1834955834597942,224766490796599,3835390152999480,5898932376027705,2775410761278010,7385230982357087,6893655467591093,7809182936315533,1968174899937858,7591658362880579,1201422624621124,8621330168955461,7857936525000801,3287074852446792,1093454442693193,5521348044300876,7832468114210427,8440806909674064,7509417958351442,7946011605000787,2496231770202708,8522575940092501,3145120189358678,3144001911530071,5235215995445849,5269595964498522,1980047670903387,1082994854167132,4747767501701725,1740451066765920,7891805055533665,2008511790162531,131768887951972,2258906353427049,4566248011874407,3572601774539376,4114271200862835,154016244015732,5444235549557366,374480994624123,251806437892734,7920450404858851,9197091473061312,7997284690313858,7138118357454955,1343867106271882,6258014924617154,6759849613132430,2524551551140497,8450226789016211,966858932404884,7562483290309269,5335587494150808,6207129716466331,5467735399711388,2647365459600029,7884587460240030,5743407238193264,7844424662951377,6112750771315366,3746822446989993,9184952535319210,8250405617223111,6117299089758446,4933946024125107,7636826665878196,1110822748743113,703833647014584,5420979304784570,3800682298884798,5913151347180223,8938027271777396,8390151950412435,5821460560184010,3968938137674444,2785168008446683,9171488442000092,5427761958945501,2935979088388831,2344249621242594,54778086097635,4228428257043175,7746290539933060,3363962823672557,8278058882179822,1714763320017647,9058381679731440,4823045314192114,4225540964926195,2826969185673972,5584905738764414,9199855834948343,9144608044076268,9182966685065978,7030853360084437,5463385504834304,8523529778250498,8932546454864643,863110050186710,1516948065723142,6573185962148615,4418693591180952,5962145412317963,5116771003232386,6193344123092851,7982156937331472,7663440681862616,4930347339522836,3918437067555605,8640358337362204,6782856924095961,376202994287388,4653594034062112,7088668003574562,2749954519147299,3627697653670693,1364386071028518,1454708259152681,6971335862797098,3438648108134535,651924833624878,8441245041227229,4316171906655027,8576154926500454,5832761293947703,4316450432459576,3253569229275962,8236909972718395,7261793787618108,8082969607416629,4224122060366660,2522165824316231,2939412186661704,1068081815290697,8103815598670671,3378770190893905,7445960957412178,4037174964740949,7889029675049103,5754132094395229,6101241217401694,872886974817121,3125576858510179,2646416084337509,5506640994480273,3794008565195625,7609707102864234,1032020285392359,5495513711559533,1322486717129582,3151840711484904,4960132306232180,5293625080947573,2300946929148790,8909535344854505,8167529897984888,98154311825593,3896092051178362,7374986390086523,7110990934844286,351512808514434,4886531220988806,4855527460160392,6119328408753644,6540951691396449,2712947767288720,2080547741385617,1350848756048787,210031349785492,8873630604568046,5562515445682329,4821527855375260,2567211221525405,1333014425699230,6830828564341663,1315830834250656,4527903187616673,4361891890160549,1565715787531174,6012908707931047,1973024651772840,6736021616092073,4979763506766764,2026948975174574,4416448424756143,2792770292630448,270651384724296,4389809355154354,5287404614730675,8474661418353588,7368347711655196,5339570595546039,6618321468367802,7996184541547338,4712627734840256,6172003125054283,7625588219276794,4545884949242823,4023195875943369,991239712097228,6116553058198478,4777105631339472,3745250266186705,9199532103173074,7577857337123795,4701764376568790,1705056738346489,6858424557257688,6986631456203739,7585612178809821,4070152053817509,2580330670130145,8180012327797730,6488755717600763,1112115402482660,6772832540266662,4070890514724439,6782070525273069,6054515730998254,4088189738763247,1073567397553139,951771587257854,7560792098939894,3148462127203319,6481514339779576,468596409174868,3304444173313019,2174865984146261,7736219760952322,6267367362610179,3971081894749193,7175891773844311,3347334325322765,1846619933492239,211950148502548,7661845883132761,22707142763546,3382984589648924,4177235135693854,6192197919608923,7473009076002992,3015974655329316,1518129087726629,1517565012083750,2854034460804135,32936206312235,7457002786996614,6521371396720136,6909167439510974,7836275276170298,8837339147426655,750518432638014,4252642328134719,7314610902156811,2296608848864324,5409404273224545,5865274019193930,5483337264276557,3709283524609103,6018518919459000,7194769934084963,5122577336558677,4982372355367097,8749966407068516,2328862191961178,309969193706590,6800500241056863,5952508976424033,8277438106745380,5751777552229477,7129111451649126,5359746173142119,7662845121340522,8779331454630064,6201617825055852,4860364163187828,5594186955645118,4061662781203576,643256998233209,789231643894906,1409735303482513,5702044849865853,5028174906008702,7449737776792703,4627618252383361,2858638093747734,4485682903581830,3651305007965323,6371482295272588,4097074318386318,8012567926474264,3489068366070931,6874146184709269,7696146690573465,7953559935779994,7160404675404955,513888726508700,4315104053666973,8923581586509811,5093177647588512,6930911624080240,2328244138943650,4948829364839589,906070708544683,4706745900614829,5392946228692143,5076843750527176,6645510705800371,2443037154550964,341935678408222,6942608797942966,5777044831274169,2476000419824830,5992873157895359,4061292274140353,6985840100361414,5198488909595848,6030720623305929,6043361423729867,3648623144649932,740789661517005,871984257883000,248168506565842,5683314502132948,2824887868406649,8103098947833245,6436078266074332,7706811232865146,6047545811420382,6205038801587067,7940855047990984,6904809443329261,2051082434929902,1835308071617775,8327090851325169,9071689811125490,8442994358093043,3294625564058869,1117161117844726,1045689469560055,2216437464851707,4623501870662911,3523836136613120,7702518149643819,7138767566087426,682138191124011,7314843273766149,9076483116415103,4714229397292295,5155844376986888,7108355530073353,1615232413238538,1566619460322571,1226630001665297,2241284295404419,7052795572017990,4871008104203541,21693519037720,905838857348379,2784377570174239,2329116312741152,3541170761794849,1834408565384484,3203181102441769,5843711574893866,5279384702543147,823389277906221,5140229760255279,8573346357658931,3930301665314104,1276813629879860,2082148612677020,2166556316303583,2771476971929491,1136352588162366,7097686152407807,7419835155427428,8790301321233732,7100865515824453,4043099467220294,3221962412564705,7652269545399626,4839776492234295,8270244074906956,267295529140450,1138935715169614,6510732175238479,197091412465788,886687437618541,5607764214203732,560456844330325,2760671541473508,7867986476606810,897635817571675,4160899362615525,4780916652402016,5965326297634412,1670753851131235,1415741796697444,7849282881316197,3608412664538470,7983697346446699,2867519502779757,2632157756622190,2767784844092783,5976075440096629,602803322103158,5287328770925943,6224780914372062,3264008281777529,5235718750373243,2960299089375466,8014890671416703,7449694451664261,6313227256811341,3224253151741319,119685380744584,8676855570518252,7125836342044042,7926328499193228,563281585481106,3881835442202005,6830241319191958,199512586888601,7076331116586395,7175382023693724,2698804543810458,3699620230383011,3816970867541415,2409627521123752,6258660517414316,2771259740145069,3259014375663022,2952132911981999,5482367028880816,449654477079985,7633992902223282,3563728899952883,3956214824142261,7984162249917878,8159469644957257,5566699018192312,3248061122921915,7584493224568352,7982905316902338,6032747837367747,7438422636086724,2784511395448261,1373194600090529,198482862056905,4915929466947019,4000386976654797,8262057383511502,5584952049780301,3202060533614033,2484966081674147,2774083154609620,1965271449494997,1196759636985302,1719220191094231,7545626134250968,1512427543702436,5592190439876175,5458298672906490,8408507586840031,2947576167343585,8671760806943616,1449941713429990,1603608541922791,1152617068856808,3253155427902953,7863705642042858,4388953653011949,2449235271435758,5573798703399165,2650600588830193,5095481772525044,4159395900704245,7014324963627617,1222711112574457,1649075717998074,7030429573800191,8632690209400316,5950333518333438,8194779092455680,3708552413963779,4752744323696132,2270776321156615,1868354275911176,7946361050045356,1811854598903383,5311579043243540,222775189431829,3122240773654038,2364636126053912,4001521802192409,7471801133262362,878242453653022,6254481336774627,110993703806496,9061355418330657,8547803879269926,8037670978825137,2569073618519593,7132535820511018,3926087297443372,2692237291169325,8855890897217074,1324959776675422,3324765754877495,1589337556379195,5491895788668476,7241541984896574,4134856891311679,6168410978813504,8272666630153793,2146323999049282,5156649059471627,4683686376973892,8953402027887542,133054891124295,4323603518260809,3116200582866507,4581336112014925,5127698361017935,4925241561343568,8505537077528151,6005209294378596,2957429633630479,4152151954318940,7723626856334943,5555631493883488,1539488033785442,8952424143731644,1011584788612714,1872126910301805,1438714923949328,4267783467558511,3608737233962609,6784337079920242,9033233068222070,5286687946475129,2295421286221434,3819556463732627,4895105314449002,920354695816831,462104667186817,1721719118390914,5513131114505859,806044815754192,2714133701379718,491418840606343,4271933790803564,7120012423381220,5828401278862989,6982634348963437,6716111064974993,3201024108521106,5176044224882325,3490192416089752,6044067302147737,795503355602586,9072629765490331,1951844852590236,1168306655495837,4203634465028717,8136385759109403,1363730442915449,8410461476633436,3928468417324714,2374980997047979,7596792238700146,4031724885608110,9090603170629295,990530311259824,4109637009942197,3081925432239799,720508480775710,1267192547321533,7312277942863550,4455087075206848,3062246391998146,7756658036934340,5872169885910725,4693073127589575,192577805985480,2800321814775499,6526755343394516,6667934307634126,1610918043125462,5356883474441849,3103589132699353,6756201343092442,2081109370136283,9186784730681637,6629711289465808,3868635037204774,9125852286551783,3768473654503144,7608928335631768,1994754848527959,2570699859904235,6253352840955630,2787993035556591,5319900103804658,63488983464915,73190509135605,2753330001872630,7631719324960383,8136420339412603,6563048497981184,2290265387099905,5999036031313667,7027149930511881,4741776789563142,5673917916722817,4757551934088972,4662198306768514,2467955565233795,8492444020652239,7659153519904533,3117788092065558,8641018579592986,5605217038157595,4611705479137053,656047018190623,4489156582967072,3986726475095003,8524392306590558,2428151824148266,894772089652871,8786874506364716,1298635849099054,2962392098793264,2986745032402739,2973202465212041,926175561514,5450355280881466,7860220805490494,6085017930004987,6240687561041729,988247475504962,8185537552852805,3193286756091720,6296089300674379,2967083403396941,589027920119630,3941346617567055,868153994012497,7771798808751075,42580395378517,6331525650138968,6631917021227827,2564052294272858,6291028514391900,4678949552326495,6351824478961829,4901200050866018,3655312174606179,6441592618444647,1899668819634024,2851035621074794,8597152845578655,7415362969947929,5674176649783149,6471505381082990,8464636244713789,7332873583642480,3873806437844849,6665358710577261,6672032474367859,5603776735029109,4089745641031542,4529673101698936,2547066120210297,1758095348475770,7923256566668634,1273208754756586,8923725919537022,2036921532680064,5062018174650242,3746954823305091,5531685257070468,8379587242076804,4972727795238791,4284741664180105,150988181825418,8465303299133534,2135406735927182,4635010625873807,6593446858844048,5641705084307096,5710988803024787,2197851866474389,6635273678798043,7021734277284065,4706180171276612,2326222832560026,8921200200435612,3130386239129501,779253968390048,5950823237552033,3507809823631266,8080250947815335,8390815703730089,8171909522574322,6592671282079664,4231183752857523,946081960224692,409691041163193,258170551216063,1485078383388610,1612894322911171,5021511225526212,8259751395245046,7664396260597069,1705884203673543,4299445208541128,5179761832776718,5881651909794807,8881002811724600,359129778636758,2469155496167383,371377719216090,3662919043991516,1793161924566010,739694361683934,3660454395742175,6901727009441760,8282924288886758,8070491235870696,1493010707450876,7594833572873895,8666873566818642,4132365093414896,1982619223565745,4867772397692914,6559275626297516,8914473877314211,2270858790258678,9012475008714745,1403870139533307,5610438731122685,4411722947684355,8997148499534166,2831743867071489,2501197528573960,4879175031961260,6797726363394391,3830018335836174,3198455522707473,1517246978574354,8700886772443155,122739312240662,4190472553652569,5585292714051608,5065582663649307,6649833956952092,8972007832610848,3986655284348961,7490742366906402,7505020743129077,8075449644989446,8336619549922993,4703318993274920,5950247022684202,2543794474043437,5432443027613742,6761085026094709,833285136205872,6373687394265137,822934328182837,7175098901841975,8256872190773305,5266933324359740,4197555264838666,2146041819744319,4973877457184833,8438389036722244,721249860749386,2534582598510667,903509074284899,4543670158649429,2617541329184858,5731884010129499,1798471905265757,8349998020528222,2677284703004767,4986996138477668,2981677256951910,590760470816871,6802837001562216,390718175119465,2359891978831981,3662541441992814,8783062378923709,3400249954576498,4055640342063220,8746060227635321,6387529560090748,8083826409638013,329865188993927,8622478865983616,8496292757382848,4149457170122882,4334326795315331,9109573230225541,4142994399283335,8704588824121392,6193952154495116,5137498127427729,7739399387605139,8574325403007297,1575786352150678,6642020156811415,7878353764026052,7277004442683546,1840383928199323,2852185127774365,234519872719007,2749868253857954,6730910094195739,6950604055316644,792136339015848,6593031050709162,1605273123399851,626991608932524,3867989434263727,7259466242131449,7130018549352630,5274403993561275,2309475175450812,2561979465369791,114861007579328,4013243846813889,5743310349494469,2577013214480583,7647746198396943,198947864611017,671041571018,6916123389284727,3152232507893964,2942359592495309,4263175180208334,2074451075268001,955314033699026,4716503762176212,5645060843730638,9119004498856151,7322221012461787,8261728446568534,6963425898651732,6592657299712226,6937940801604902,7890520767916260,711448699513061,8673871299053798,336968715585768,3395136324239740,3105211638647018,6759234676706343,935274537421036,2046773169941544,7517556336543987,9123506134444278,3001105025132791,990566404024569,7661730340153594,3926687922325756,8397787956807934,5823497698633983,8888276298896387,1199228574919723,960798420519172,4632564832757462,3025101288556806,5098358445203841,3715878359410952,5447690577581783,7844542142957838,5857981888014611,5109454350960917,7543178638231257,2133611096762648,7034008813859204,3989503522801946,9004731367002083,4330709271947553,7007247571814690,100680735435045,3654422928910630,6108651634567463,2395484090984748,3411019054873650,6413612915878192,3595672273054001,7621549904137267,3105483697391924,8841788987279669,9055965686005020,280902001658167,8273212478126503,153654283348284,1503536734136637,9122904829942837,4987998429038481,1941979161512259,1990792161290568,8218654906920617,3131265221421386,4296956910922059,6948131069708620,4162751229217103,4655631616690514,2178090204825942,2524358996625755,1642004523526493,1680371183552862,5222929752385889,2093412842867043,1725402982623589,5768357486756241,3094767814125928,8776639123469276,7497794520836461,8681753862932200,2872733471746418,1842538577463668,6756493639887224,7572350333325717,5858936982251908,3297796642228616,873117257738633,618723316771211,2014948669983121,6545849122408850,4812579603704212,3178967510610329,2860373068881388,4961127650847131,552842459409477,6727307968186784,2067638092286369,3188141328386466,1674143486331299,5765454117906854,4957227758717351,317435687389609,5911072283814316,532529333982962,4929690935816605,3785568561847388,6687041531815735,6139469117744593,7953554517703753,8003930329426360,7837809123928505,6622616248455583,565584636471740,5465806555257930,206661764417984,1817881397152193,2387075850054083,5621238020286916,5617027177613765,2818350609498529,4538785532612005,4560003650906575,986899764505040,6031694087698168,5984722785716692,9114675256155502,3971864380020711,1213661892028889,6401118567877083,3146443215423964,8363847354911197,1943246219905507,3568908295408100,7214548956910023,7471696989899244,7719732596677205,7984228024642030,2017802090711538,1775659729185875,4785327247722997,3120404150757878,2470753289941417,8926460665416189,7112487796148736,258585819433473,687328273598979,8373260217985540,2907019723999749,1811358545824262,5210691391228423,2462646815984136,8681360283904521,8367048996456971,8886709226609062,4153263674042893,576766035929614,4352363784620559,5871245369829123,637660066023958,5917294238657051,2199190620068954,7278888964701822,1312036800653859,2151682656873001,4511193750587954,2977543517743667,1730633153233409,7529343983217205,2452707806276150,7640314116942394,4649028408969787,3434759734209085,3543922158290835,6954358976211519,6947364334782368,4875530743540295,7087297875044108,3328405205789258,5084345971405239,2066019295881804,1143232266168910,3373776849447504,7506589374081617,7961919819356246,6412226832544334,4738552001096284,933837787408989,6451133216909919,7053388193157563,7673951149674529,7428571042990694,8969332794690153,2486749218622058,1494313911140219,4891752165870189,1367957524884081,4561157727300213,2272011909163638,1442233375558263,4439159575554680,8698979684182652,1196871668217621,4598097229441667,5046588049795716,7538242883272947,416656064613002,68952620124811,6555549708290700,2879268609305229,3561808329992847,5096828761868947,3406020904159892,6591628986051222,2977934984448665,2973203954428571,3679312308906657,3954546272119459,5214305594706598,2870909399673514,5109863603532231,4648262656936620,8749331689236253,8632831768722524,8005434341878450,3918643104369332,3428014021077685,7332854142171263,4255519113153207,8639983279016632,6586588057521268,301939401501374,4863135618583233,2093438333135554,408475592166083,6218088787176132,1815810380008133,2058905339185862,7769463920837068,5386219690232522,7881869149817550,2940426837469903,8622031895508771,7325063593640398,3992172115258071,1512488993942235,7788326763440865,6796971400891106,4281148383406819,2294227255577316,5353255902497510,8006978980530921,3855574064327404,5563307743365869,257222180121326,6558289011129469,4587550440893169,142723861138162,4844578764974836,538604242738302,3894590063364854,7273430520247921,397415608535801,5491117400000586,2837518963862269,5774997793311486,4608945585302271,418152272317185,3898497621887746,5314902286141227,7335983176567557,827209702697735,4467853157840684,4928008187478487,3108888538032909,3157591657548558,4490728945347343,4077289590696722,2649419706256148,1529260199185173,4978787542575895,3668699505969944,2484418198752027,7846937064227290,3765841433766686,6346646797585184,2215343757388578,5488524960361251,5203344436161407,8136042976434275,404798506437416,3461098495757097,4451807526870151,2044202936281901,1279278797867824,9074889154505864,3938131730426674,4151254812478259,8230260845993099,7631763941788469,3414131699682103,5503588846016308,3779088453724992,2119349120256833,6378558600199307,6612931926857647,4003907668855626,2275622407670603,3310574904699726,7330331641334178,4200680227064656,7999423651695442,4746717853018963,5312550212168532,2561069285157717,515503580397511,7011032474797881,3652523196599128,8219187860783588,1164218577906527,5926781658557281,3473852789451619,2374362548038500,8564651992804198,1456633444830353,8655960420166504,5691512455269226,1352246301395819,6131399971875693,6825199301946224,9008876846615412,6153771459316600,3887262689119098,3996419465246527,2548358248173097,2226625083759765,3756685036571523,3630527224613766,5047664182684551,7922374037015432,7363347936562059,7992146764172172,6470670919974040,826350085155730,4093391311203226,2135027004795806,3423790079978400,4182869819501473,9033036200192930,4725301576731555,2640524537916324,3804817079692198,740570829933480,1820801070365852,2757289959115690,5853743156947883,8313034382322604,3906707469085614,7310705242487965,8660618065980336,5705547563558711,2259940707848691,8526851664628660,5182664863820725,7449718001765302,58224628517817,8982114939482793,8152291407372155,640413794266048,8877637331782594,4737773534907331,7548479407213509,8949246495058889,7519267238505421,328215884032974,7521173484979465,683251885882531,2435462746131413,5412186564668374,6529403354532825,8249676288926709,1824844646724090,8650215745843919,7321036103199909,1865346574134241,5835314180885474,5548673622649827,1939315804228580,9000263200369639,1431952905792489,6266774523722919,2561474924533586,5520682530532334,2998708959333362,8786823446268915,3798733303204854,7765158296693755,3035928959560700,2185786121374890,8043045095122773,3376284453220864,4980059648566160,937366524423339,6324253355971715,2215229445311494,4215623224921095,1573683310996652,2422732471381002,8114094450719917,5304007146182488,9017000081820695,1721933613591576,924455830465561,3532424413883418,2731404170800155,1363582969056284,6492216820909914,5499813194353694,6643205204447749,2418331068394529,6279921316482085,3010753890290726,467917571173415,5070991127596072,2573914870909995,1421535532157997,4969984677555246,4903392008154162,780743382703283,6080531592940597,8145058338204727,4236638370393150,7593996890827839,7010326262495072,3612644279061570,7412950742281283,5605593810086980,4724129459743813,6988789136560652,4393049319910474,8789447473796093,7231556954475597,8793787400983053,7770052805606584,389522129397603,7636651053435991,1378898721111078,5303442668694620,1832629475798112,4702376260996196,240763371457641,5982329198349419,3463971944624658,2655024765701230,5881653261266031,8879632990137456,6534863287184498,8699580523001826,1811639628467316,395838092782709,6043144544087160,4587223807941823,6017510960016513,1282296179305608,4276362148200674,6410893732850826,3639614584679566,8330085211040911,4225001778795032,7452332396666051,1835432858204559,3072228968688789,5217763879570584,7784982549549517,6816824469859492,5224106428255391,7992609491971234,1455890887437475,5831474346462372,2552964260039845,2709251702885543,3108863866801322,4217908172459179,5063298316414124,1542168121298093,7990512020341640,5627622925937852,5240252069375165,7416483520955312,7664980062563526,7636167392529607,5175850395585738,7834727790357707,8010670236789964,913947391053005,9203515478809872,2443251388906701,7160734496361680,5392288571223255,8841039189649627,6236166424186074,3232181975600348,316902239653086,9164038297746038,2997711861927547,6876478292529087,8344915886353638,1985901146918119,8946364142950268,5299568847662316,8522795954269421,3488819366709117,2092712418634994,3752014767688950,3554278548861481,6796667314445524,7951935309982970,6196480025758972,2345199621529003,1957577163787518,5879085306673024,1205544484752642,559836934712579,5094326662319364,921267404500231,3401098960366857,107692038884618,4659848305872140,8029324827520271,5945770102852881,5814288098233620,3313182298049813,5240668035796247,4050287013522712,6530865453942660,2156527949622554,8434360433339675,1780445094456604,9201925954465054,1037060564987168,7792150221197187,3928813225856291,1579692741360412,4138208823717159,8345088774606120,6807613731261737,929097927560491,5710883584068908,5658040463723821,2699443194465583,1868141108170032,2996891388423474,1559921505316062,8580005420920923,1507340133761588,6695914223881530,5589860038033973,4360293964303680,3815537251077441,4426152844455234,6794348787455883,5528509602065733,3651877875489011,813776121613641,6454930085433911,3101435076971852,703144431312098,8378794060631374,7250036539608399,2028066068093052,7005030440594773,7102252992477385,5644271621565788,7429695468601867,1065337585380705,8874450780851554,7936821186194787,1682165089488230,824824961804177,6108506244836712,7171155256529468,1224590695972071,6046731341376877,8543135362339389,1125536650071409,3585650741497203,8088969576123764,6017278898916725,3056887762521462,3439023240430859,7751554386750841,3602877496503676,9040667279031530,5807182003367294,5142740668499861,5169314628701568,8600373691982400,786472377347460,2331315610591111,4124748314340742,1469096057638124,4855102141173130,3305638350479938,6504581879598451,2580562973609361,4186509733588370,6667606354619795,2139924587834773,3452538988085828,6090507918831003,4385876620785562,6278771207433632,4257068042751393,7958159144742307,3996399098588581,4591317335788967,1408515427552681,7482323318566316,470351535091117,8953538890075567,5798217668357553,1639161003801843,2955524509257140,721271104261557,1309477815245882,8965420388683194,5071135083698079,6488765500181948,8210211485535680,3142018921663937,5488078554312133,5778726572779425,8667961534726732,3309700025478602,6776692719652299,2907452271300044,5875720316759501,8072527594373793,9015634091634127,5412924533337555,680583885262292,462088698367445,6583471591648726,1653369038441943,77643562552792,5681179302743513,3408164420769034,7954940697562587,48451331943901,4602853266550238,8096703919995427,2854179291983333,4178798942449126,2132817386040808,5917309368184297,960869224353258,6034514881179116,3254087131653246,3070032014142958,1166935407169007,2888693786684914,8588411653459198,6221124857646582,4595006446075375,1202419958238714,7634928538676731,3191049094024700,6703720252419582,8369947313467989,1561734421147136,5579859738549504,5047314105183746,4555000558366211,3958597431242244,787852610260486,5620764556684808,1691073107455497,1815321288011275,3672550718107148,2967326832479758,4996861924347409,3900316928167442,1974425786101268,3632925254151701,7096833534419545,2872690694794777,949941337206298,4336547177813823,5160416176000542,9045430954527975,4510903947636256,2836874816905819,4979769406983717,7809890182229155,2292282222953052,8371933091900971,2947070356393518,6080151106465328,3130572428037681,6317364725373230,502334077152820,925877086883383,2311198287736377,8794691889573436,8006032677604926,6377982445866559,2916256059960897,8443304856104515,8107380914523716,4288923948736983,933431839592007,2509315475074632,8028939576225354,5297925302259276,4444988435394125,1687235964169807,4927838339411536,8239284433923665,4037182550527571,3251825425403482,4963753005264481,4919472414404196,7293540291923559,4759208513760872,2146102923120234,8120067204099695,8944785151337824,1573452847165045,5305710924746358,5181619536243988,7108084658212474,4698924980905919,2107374157786748,6042268966547069,4813114781019774,9220362865233173,7157645910177728,7233064197639810,2219707601112710,8311432214146695,5026970587844233,8300586569248395,3653634780851852,5447248782519951,8106159896546964,4913394891059822,6861517902474905,7642010462966383,5383050355519134,6579322841321121,5188163254210215,1132040863190697,8234472264037635,3382104497612743,4555398836300471,5598063255842477,5353713793289903,112519378202289,6532846794617461,8482419619753466,6328888243470240,6545581800353477,312345383667972,4728184494042824,7689174069776074,8063386678637175,3337740263263949,6471636983885518,8378576919793359,7782592522047186,2296783040417491,6503684093222791,2284469866893013,3668640056749783,1626209669467864,2577902044090075,8389779627292615,3715700872654557,2102390856262267,1971493360414436,3478897908887269,2454714707365606,4748351737368295,9131440162664169,8958926354040633,8294529176882928,6899671815827192,5135794860912377,4597701851041530,5730318883484496,6034046522199806,6283881183231531,3140514163134210,6347608300267478,3887153207521031,7392030014935607,7227293314584331,3165106532003598,147412793837677,4858384410693392,3228194058776337,6054290740077090,5375032241991445,4845419358793494,640704416665369,3998824390852873,6354900642666916,1237405419949855,6031050769526562,1538863779655459,3725712885509924,8234020105556614,4861658794241834,5244588934262572,9040588325891378,7633787858087899,5987428106784562,5875765832331059,8186205280341812,3286325938532149,1615624160120632,1780623353232692,4316452635594555,6089788032823100,3859238683402890,8915938998996277,5458246006361922,3333892827921718,4110942318292806,6508727630297057,8616475592191816,5606967888285516,199985743220557,8254662224293835,7219537092772493,8381275838058321,693102976569170,1001337874009943,8725947656810328,1301497437501412,5184207676387164,7569443958426938,2627987735646046,4473163549175647,5703976972111712,7424560827986576,5299456832068923,1145989686275943,6253594943098730,2502413097859047,2922649510612844,2045915148406637,7326598949836035,2336885327531887,1017897055285104,7462419912707953,6927579107553138,4516380576147628,6118121341407093,1696338509768681,5589196517347192,4837442454638457,6793388898946941,8290533983604608,8344158492897154,7579753719910275,8928644029927300,9163105708617605,8818988114333574,4637798251925383,7541038609928072,2147500656627595,5479776358180372,1580724779822991,8540801227861911,3530472729603993,509382756683675,4400993289015197,5178745174863774,6187318111640901,5528119511699365,7476331949379494,7639607540551591,3750606395633578,6819607969662962,6859327659224713,7578695175448563,7404912913758395,2440578867654582,8877826388397385,4449471227097759,2960712102006718,4483145826877035,8821615927087040,2607321358290885,9165130429292755,1949349903929287,6724202902548424,5766587749183433,8214658842824651,2679075822260173,2791177965780301,2940497756917714,8075962238210005,1758436689924055,6688653901583012,7334675706056666,1546412940832731,4949842066452446,4608441464934367,1575141005966012,3152035558780900,6403491130298341,4501096196362216,5600582979522537,4993125174972394,2214800676933612,57890590322670,1028812063674352,6303181159756456,1482207396278259,1618804152389621,3349226604613623,8172143020724216,1116392894861309,1306222313607166,8437881993080149,8560354884718593,2377219585806339,8203011685872834,7410715754246151,4255617303736331,6351250715750413,2778084348981262,8504806254728511,5759871356474329,4252886283237379,2281012963766294,1419516311343129,603752259776540,4738273097437213,473952785002529,4315647596523563,679663596326956,2062205072224301,1164865872531502,7138171803932667,3724536196976688,6710983638086323,2688522525302419,1213576987897910,8544233479917623,5666563245895739,6266537473290300,5099685809500222,6110906495660096,5310820630319169,593820060766275,1278523862167620,2530338542096455,96718972964938,8079545398158007,1733905599557709,8737697423466745,4566741199622225,5366571311763539,7556566314676309,5376135039431353,34740139044952,618834665658383,4871308494467164,6874333071306846,9172483108016223,7259656552271968,1401588311756898,7720765732352099,3572757094846564,7892884658565222,3084102796374119,3649501939568746,2725320182418791,452807647146092,6072711608594541,31791682515056,7902533972941401,8447256902172009,7521515992748152,8889707549896825,5568736704000122,12384511774850,5955807674716291,928174281044100,6137809963993110,2713080551166087,1197182699892878,4054142760734863,6458765139808400,772079601627281,6692503451308178,5015005199175829,2915642466152601,2823950115401882,2029025063751835,5616603409109149,4557845160226974,5214347165413536,6700710108082337,3279567781974178,874696374857891,4889040724242597,5212674183180454,6319783321742705,980192377581737,1262997065437354,9111327228097223,2682544463270060,3593188342673581,7384114356467805,8005062258020528,2204474586763443,6988209634398389,5705765902643382,848648111411913,156747685138616,5260248796314996,9010209587326839,6044838370603200,2193948471152834,907069396585846,3511991167422662,1460877427273928,4331906551849676,1539990305132747,7915273253591074,1341936378196174,2124962731389135,7398566443913426,6606581271007443,2724829931999444,6346581921272021,6140965101556431,5256899772616929,7998262513883836,2228665544093924,5201880645546213,8832730250788330,89217308348650,5539808782030887,1502372594290924,3266582120599790,2515119084458223,5559657425907953,620947974156531,1273492603916532,4960038203740407,1348511914709240,6596767048028884,3339991024496895,6858137481990400,6133316244566274,953680329511171,3684036014952708,8087903474471173,8805182632669493,1689969941688583,6735473409511688,6827714348200201,1855834171560203,7616508676894988,4097007696742445,5844231672860944,7725479476395018,6934251196649747,253611551928599,5682300570275204,5343676756742428,4022631465570589,1959884456279429,6498374790464401,716223217666096,6240035584807203,103001513127302,847299317297446,4992270204727591,7090407852118313,5620264030499115,4114325379027244,4962789569057070,2810349103730991,3440733044535603,7669690203162293,4793085157568823,4901386963956024,557414567792955,7057196333846845,8569692873574664,1909794444456259,7715065806926148,7827756742486698,7651934617574796,5881851972538700,7548525192376657,7698900885926226,7944124365988579,4803710172090708,2154838063640918,1955259502547287,9040662672437592,3516341849362780,6856945010159966,2373045924131170,120740043510115,6703208926638822,3832691404378474,140888103415186,8219062064615790,8896448227022113,7246492717850003,2647980248969591,1946241375867258,2012190665590847,5048171487891836,6228087891373461,5793641204167041,6980928746803586,719525693354371,4643752791273860,7655056280706454,7454236237795719,2387651561976200,1632062641140106,3832938278384012,5464267997901198,4776083448709869,3672723259249040,8493151015530899,2127993736679829,6573940222325143,3079477372359064,2350892058079641,6582143592867038,2366448785261295,5083594361311645,3896592448123294,2147840279048607,8352105495302560,8301499568435621,986999841411495,388063507198377,4285652349596074,5853439556006315,2120087343370669,7873067072901551,7102559753015729,6003945265983923,2960381230617013,789558790115767,502149764231609,4966236594606522,4577634242715039,4670453477804106,7908501228384650,3140094776088651,267440320647620,3705814991647173,3621069937824199,3275802533220808,7425824115659209,3692153051247051,5443343558308301,415202148004302,4144231656395215,5720929240560081,3631786243297746,6740367499596244,6782624518246869,136189329174998,4501612005642712,9047944075547097,3282638136299994,5096593232875995,2899156856925099,8270216014139051,1911617068290527,839508965988432,5018929313666348,8578472724271587,7854280433111524,4509250483188199,5044816572027369,2798807409840620,7479603499284562,6057194018312686,9058496584290799,2258231212265968,3083370826578467,686767830725107,2686570045115817,6654039312930900,667832269361658,5613499073704443,19681611298901,4521184611021312,7670279692789323,4856298444141059,1618800291361285,8984684264444425,4952417362448908,7678931852456461,2735749523804686,1260861950079503,2576593694265872,1984084592366098,2212300205445656,721865022075652,7281569472910894,7168406463723610,540455859417631,8829000954278433,3492161972007460,6956722981892645,3113763285717542,4929563582541233,1844137021821481,6641790759159057,7450411690545709,112073420599854,1772023899787823,5889575586247218,5879085427372595,1095063349449268,1432688211825207,3508531625030201,7615861766386235,3621276239090236,7898751216821002,4203903558207233,6841267476078091,2945799450612289,5866099289780803,6231016386179656,6662298941038007,3908361822614094,5387160384942672,5327267268079009,953934541009490,7170135592127660,4794659499799125,981691486966359,4541734624776792,6897404136854109,1826856745226847,4069174608548449,8555724658997509,7953905005430886,6702732956890647,2890124393951850,8185760590082668,3585815570207342,2246593966805615,281441496896112,1261515757007473,1488384565080693,7007551944249975,1237567469572731,506726518796924,8284666147312383,4694059427674219,4318238607315588,6653206258373254,3890483319231111,7442085492762707,279901286183561,3978481302377099,4023809380632685,123065687085712,789194475186286,3502608710800022,4970248288178843,7493601097570202,1450666531279517,130860425482911,7104857340883617,5521865180107428,809445550723749,4472637302321830,2023731661951655,132548859425448,8649951424078620,1601377167962794,4843245967610540,6806297465377453,5348932266308275,7130481224012468,7456107352863414,3826636959314617,6687418251350714,406366861537980,315803369158187,6574996736193219,5277772633232071,4848976285094601,1657884428628682,8253578027324194,7460183298055424,3284511212154317,8989738240966407,4717482572813012,5036527443981013,188507708368739,5343679122289372,3444533867254493,4507090981453746,7383775964484321,9179110421385954,3663993716847332,113817039704806,2227615165395689,5917628854186730,2051430344127215,5318800423154416,6455616364864867,6739057782798462,8657267102709378,6024288239432440,255171230799999,8454008231342844,8872689352241918,3356011130335999,2748379471721218,3619012194980611,3915369161118468,2904452149326597,5322845214757639,8797202141991837,7420651954410284,2746808802497290,4810148842205966,2226649207241721,1564239389807386,3237697166586652,5013835890692893,6787272004973342,1600935891677983,4882278362673952,2886190576341794,7999164842872283,1478408045327140,8186552182207274,4601039008065671,2227274225300268,2551807955186478,6557445699400495,9135008219784059,6727695648355121,7987761308332850,5271669267854133,7440140001121080,529461994337081,155505907151675,8141497836524349,1325036185572149,2116777169212224,7392549878231874,870162411082565,5247472924480326,2061164454925128,1750993538536266,7823465955574583,1528151402902348,1054182682765659,2241896078988110,1955195766674256,8492403641803576,1146237871674199,4426729506149211,6423790080168796,6349765863244602,1277150887277407,8515070102598500,6294011956381841,3106574025413481,4635115470558059,5951674354096274,5101910549295982,2145074262397807,3399031887991667,6239728300028789,8117364322898807,1511559873180538,4548156127654719,5279681065481085,3515494283760511,8857924397872000,5640419801551746,8283283558773635,4477823809614724,6762360910648197,9135725924037511,2461707475596168,451214688292332,3010995806901130,7716244009976486,5344738853442445,7073796939371408,6606497216590737,7785767604886354,9045668071677422,831283072693143,5969665994621764,2381708181562406,3433309245141917,6767415775564703,184500155610018,3762144353088420,7915256412987960,6018260869059497,8387152875918252,7297642291884973,1056999629452206,4023380117828528,5166455852807089,7185928490210226,3789185420620723,8783410691322804,5051970159670198,5905527764620217,5010172240761786,2413445983515466,6877900077691840,8860318332917920,5559288426394562,5013478798652356,745872603009989,2000597655589834,3937695098506743,7894539759062045,3921532217430990,56950385382351,1325072667866064,6281769151706066,6954607390902435,1315797757604820,1782487026119637,8329510190494680,5585699939824601,5193274231731162,2518075199525851,6142936594215900,1411863690702330,3313280989025246,4183945409680351,5660749234852688,4717381267465041,3740722384311272,5564284158129129,2215123163747306,8828951639679086,3182499741545455,3692403764065264,745440600699890,227823422297075,1089807291642869,1099709761688843,2908025143759866,1686261342893051,6679874432553980,2883271802827773,4639770576237566,3838987808437247,5750788332056064,5159984259576835,5860671356621828,3337504118649862,8508212835388106,4075077330400265,4802650853389323,408037435667470,7523179904226319,1482955968345105,1937809710330902,5762913289630745,8155140973188123,5951925368435743,1253548108772385,1278167177114661,8730676139586903,2673864441222186,6592758533764140,7018098357146620,6172904719963185,3950264040567861,114694769964086,6527173590769161,773770515649596,3206556796793918,856337028977728,3816843908142147,5437289343292484,9205345990569513,3568294334829638,7947298823443530,1821453714576459,5287210155652176,2855618185327701,1776854332175447,5219039096099931,5771844505220188,3102977784214621,3020135561901151,6217834081375328,6783486706260155,3293088860468325,9217464612230247,4255616100832361,7556871583857873,2721963137266796,9187475687239186,7405766874011837,7751037117063828,4043264049960054,9004380802904937,9212430005976133,8383588375475322,4325550170600572,7865655590806378,2466665466705022,1792443184221717,5600691926267011,5623880298378372,2733360678881473,2602225248851081,8280058839207527,5241483134104716,2836983580521614,2448405519840399,5638401388606612,6890868220867438,7091142606943383,1563016701965465,2274779115738267,6288144749032605,4967028169962654,5670861588564165,2562315989849249,7674546883040418,7676590803770907,5609055844201637,8201565566252200,8201768005393948,4703439124051115,1200367514342572,5267738564539570,1186197424239795,5196473281582260,4308874044517918,6644764392305847,8021568938452234,4470885657842874,2081816950928572,7826502764168053,3763073043895488,7671639332926658,6474909573174467,2538613474530500,1484481699501253,7496825648944327,1184688428463304,7383638518581452,89914566571213,5531627750085838,8041907222087885,7198073848526032,7739271652857041,4438329698055381,7003636147400630,5394238511338713,8277024666138076,7217511112470062,2035453147976925,6284448393334309,6782581815358688,2026864624080097,7851436931142883,8906588033770168,4771204704498119,8621619201886472,8226174063987781,2387513276784167,800544989353196,2900232904275182,2324201584850159,4517546953823472,2805979314640117,2453019184559351,52333821875448,4115908248422612,7317435446473599,3495268943459582,7451134036551893,4450435112514819,1500941210924298,2292996122686731,5177533290853645,3837199939378733,5886713816610064,397822693643540,2851099330385173,2710616642442519,6122388983411992,631622603038255,3757578663253276,1816512084759837,8076196085699461,5592637847622945,8681538386868160,6924015409702263,4658415480280357,5567801343925809,8386712539223338,8574159044798746,2990972822770988,812382188999982,7184829669840175,7091298370827568,7910273551032342,225000645072179,6418647633830401,896744521192761,4370147477313759,6866562777224508,4369940814730122,5419185631491390,7681898127693119,8591660611032018,390375409947969,6794218139235650,4165216169874756,6850168837699809,4264744514552720,8361687102346576,4787519783253330,1955007638328659,9013559298848084,2583553219204437,5770089299883351,9137625104438321,1774559954974042,1464000217732443,3318161479382364,3751329121287738,2655383291655518,1542736893662560,2082854578570128,4585823410885986,2925195928540516,6986486077412709,185172439749991,3247105418138985,8294640598480236,291163408332141,4045260655768942,6926346870723954,8238209320175849,3345722235540857,9071017350190459,5041334765994184,8658475829720445,9029258652759482,6838335782098304,8900415943334491,777177868498306,8880507209513691,5558423917213063,3997683925677448,1857349474588042,4281089317475723,4380867655660941,6154999531444461,4812230723245458,2952735817676179,5720397986486098,2442979486373270,5384270448407960,6863553746189892,67099099108762,4012947018847645,8812126063220130,4492795733923240,2962207988848041,8722770630431645,4757889679979954,1486656433296819,6450237214999454,5740274961282487,5839362975921593,1390499064059322,8629866688152143,6438544880842175,4508567853397440,3122651280315842,1470903209435040,1034592375969222,8188171469659585,6845397142631884,6786369697422925,6060021307708880,52417653650897,6983189259998677,7722826075838702,3655358458443229,1592029993891297,308702429615587,5271769952261604,4826839122469798,2519813625370088,7126001437559036,7774155713164778,4811655868241388,5420977569609197,6602135954861913,3421788966950383,3174162632988145,6352300676847090,7533285310250579,453378100868597,877088692139514,550168028989695,8983709722416636,8044680684932649,2585427825309183,6539925101491714,2604191893952007,6798346487313930,1573929070032396,3880873084394157,5159829967943182,7396115150804495,6534568731293202,4936617827915283,8556017390341356,79360098842135,3715012229355032,60170769765913,392536527818330,7075986260391454,3793727495345695,7081577225267105,261045912073762,3758519913666083,2457816824133156,2890633429891689,1543377012315688,7398966688224809,3918969041147435,4314414972294702,1763876422825519,2660702864242224,62010277382408,7923182338102195,1593385148659252,7438882119743029,7876281644598,8149211491210810,5381656159565371,2113766654072382,6076714811438660,2184129167423045,250094093375047,8965062478652545,2829833823951116,4939898107622986,7483407140684727,8347056076412492,3727241578124877,940400336672335,2883470354273873,9127166524683355,7380317182297959,1467336527255127,3426508172990040,4335409326296676,8929773505557713,3873034844730974,6333055272293983,5734853620243605,7599924026406499,5726445576017508,2912451899332199,6349830437895394,7137452609492586,7843413349486183,5408229181306476,5555633559721582,8836516914886256,6708971353771571,3248680679478898,5575019599812213,763993211410039,7458799570327163,8725755127101055,1994598872331904,4134656192460417,1933500223725342,751190916191875,8606335994312324,9105143755758826,2658691016816269,958154499479184,1856103042569875,311431285192341,7880766258235673,4890116344706712,2469890180331161,5183001411057309,1197450085668513,3608097366218402,1035154589488805,8271618274323211,7033733114665244,1233527281866410,6745763342713799,4233836101072556,6290417801941184,3769323733972660,8009325809673161,1252414861178553,854027454944956,5139368115181245,4969213026318014,5052786234177215,4916925099628224,8344580281915074,2095028410879606,7781923913602759,3211374727517896,5304834214631115,2431046360741580,702572094559949,3093576164652750,478989664933584,8280778168440531,3942728639788759,628331191064280,8116048414636324,8572980963995258,7513760919065994,4834276062287584,3768027386504144,512278010369763,1841935112271593,5503445973726957,2776775414410877,925188711905010,4965594017766588,6772435609384692,1134907025837694,1013630571681526,2936851714758391,1791965968840440,2901890821519097,2458352733183615,8896542517156138,7079988391106304,2669836352689923,5475502430697220,9083051915398479,2324322952673030,8908250079473281,3989814914414344,958322094208777,2998582119651086,4402753277540111,6995784265843672,3454573198391060,323663856744213,6000214198351638,2911216016914199,6421572683544350,4235225316759330,14743335097307,8860083535164764,6202643401754929,7421220813861852,6694271273188431,407133228128043,1310686896396076,3157900268566318,8837187588305885,2315013867312947,2446807241070388,4214283793372983,2596347318229300,3581867150882618,2924913697267338,308420813748031,1942105387374401,8075845775570754,95740921321285,185003117124185,7601339433415649,6726304222482405,8828210293626698,9219690954069835,8848048551696208,3685243257689937,2620978831144786,7056216333670227,928161674100321,4759346014959448,3446756105860955,4829735394981724,3123186533324638,2125418377893727,6462822243415904,5014285248378721,2885438153897826,2906968678995811,3700724583110502,8708369865774951,9134682107582317,7665406674250292,6341593909540721,6641484484804573,3431909150342803,1079448670852980,9054053464815477,6272339330660214,777372085532539,6296272740420873,1203980883398293,3737768100247424,8476598303643968,8452968929048451,1746295201453956,5637808307468165,7223517653687150,8450335613418868,2155069943969675,8150020108556611,5713945968654229,6976950477815449,7202464635918232,5775651761182617,2647186528180122,1493673160595355,85632193370012,3874142889408413,3509823206643614,4467367083055007,1735229280139170,1357833632946086,15130076305319,7974832060692394,8387757942266183,3351274288838574,5660570606942127,7072916288264113,5803847405287346,2990952160224243,2939062779238324,781180416341941,7974230085416887,230871431722938,3932735752976315,3743823668705212,7142510722881471,6113931234490304,1542278084868034,5223567114459077,858482492315590,7017708422529397,3313272710756296,7293952698546121,7879796363265015,4506226408445901,8414797141972942,769993828702171,507825062615004,5684990845531530,3923445152339937,8406925455695760,740116256670715,4513965340391396,2361809374410726,5433607435155431,1462459859048425,5045726276073450,1330927946102763,8850504319632894,7332160083810286,5925862520035311,3816828366690293,2689503219382262,7840823638425257,7350361093969912,170448788116479,322857857931260,7121471268460546,6023094835068587,477872305240068,1214243663511211,8569240747259910,7315750995457025,2018571132000266,3475781910509579,2883329160902670,2990194584115215,5802917443491858,2340022605756435,8479960867780631,2098652065273880,6014949752428570,1994397742176284,1071722713143326,8227756771836375,8574806002145312,6666528043423778,2576495181748259,3422813646051367,8195621661095978,6343563730319404,1450784874518573,714081919350838,830610553608250,5920703443671100,3757651236436034,3108363230926915,7911287026549389,7397276346153313,2986493498112074,5427646602000459,4172349767964750,4895301960087631,1122595546282064,2379517553350737,2727266153510994,3406182880082004,3129335740192853,5647387578849366,6632998093912154,647135407847517,663582527871070,6214967160466227,3711931269299835,3775247719921764,5476093917739115,4385806566668397,6657056249444816,9213051812542578,2388544082909299,8331818410375284,8469167701571702,239008390740092,4274028171860094,3266126576056447,8699788089041579,8164903189313668,6616243748403333,8033411289464514,8354660141709455,9219275130239575,2925836666697874,2057619722788547,8313628748822676,5081908423817365,7494548328962198,7536132713886745,7146349910815107,4009036902906014,4091484642220191,5993824850688160,8422211958163442,6943922271893667,7421127056177317,8043959458052264,6541013457253163,4364080581679276,2323697170864301,6664299788556464,1758510066260145,1836253187274931,6317417364060340,5399165807220921,2781466309269691,6386898839066813,4203336570222783,7044339298760898,2126751153395909,1289424881260742,8356839282833607,1256651802859720,3604287136349900,5838275618692813,2311124535752913,8064429355677909,1827120044595414,1128941160372439,4491439282731224,977394747955419,9035122632276189,1118931701359653,1234408470149345,7783273253424422,8383926321486052,803327585392869,4305513058867434,5425873067137261,3026620151074649,6051428078598383,3265415342553329,1168434022914291,5846049527527668,2548096486136053,6780562518153463,8004491885394561,1132751218383097,41850849253628,6797496036519637,1925903907805441,6829288048982277,1105798072457479,8924924378281040,1986082416597258,2650811056773387,3752870938409228,6527267309959438,3956555678891001,7607621481412886,5673267987494429,8645328052272858,3980832511514914,6880589246175524,1052100138981669,1892758948075815,2003959924939048,2151131709315369,6466608679390668,9007173550373164,1798882203310382,2182218561653869,6287115681847601,1914321217247538,2895264000309556,2456517002108638,4038078110284086,6841482416691512,2607351994652987,3651033802938685,4045549133919285,1389303044888896,4092111056066881,3722686631074115,4741152309803334,1065559607138631,8702537943769005,993950713829707,5810642440206668,3947635313383757,6160755966982478,5369636984265042,6099392053721431,6203743066298712,2005630937889115,3045382504692065,8028462364647496,6943708301441381,6989557244588528,31911237267175,4911141603957100,2266821822101869,9044861038074223,7416688687053169,6525718857406867,7858927212332094,1401967825230201,1165567500450170,4896256947231104,7348142518696321,8555207070685570,946783439935875,645214855575940,6132462666176901,6526802744981896,4581658137262474,8265316701702905,1005068015262095,8153557220456849,5095197711145363,3429934968887700,8677132261751190,7823640455326966,8614976555719069,9106209318952573,9119364766554528,5260307416209828,6445781946841510,4962315919940007,5409743641467304,717699595811241,7691955952179627,615268581325228,8505317817481647,3297517184956853,3379836334642731,6724177331384771,437328457882052,4487676202899909,8267833997621705,2803498728765900,6434711761783202,3399450856233424,2239077546105297,4892668115544483,5208405560515029,2747477897648601,8277908460419546,8690887889017307,1874655776747258,4149539181877726,3537380847294943,6013496574753248,3982855250295265,2353823833209314,7082415616678371,5841889880832484,6988636885285349,4369041465440745,4054437218810347,8633643462539756,3090184857655789,2964289973885425,4420418468051442,2366368013097459,5369707351906805,6084406892943864,8385265233590777,5147812146665979,269049853303292,7186059893814357,5726507047508481,5415443293108738,1697907726588420,7972188988578309,2785340203735558,4425835413895688,1428357790489098,1063146030725644,5021036280096502,4268847272966674,6321742589663763,9152701961367169,5273837416520213,5516152306563606,3057824534551064,8646390066784687,3311288663374364,8346689879777787,6819842733554209,1660252398269531,3044793377159716,5138619359590950,1678555105262119,5688189829503530,2514780874092295,2944664815843890,9209575370899969,7606336328145462,5426372902132279,3295403156576824,6592342520289850,1492849673550400,8076966291542798,5297945313868358,1676727910300234,771985277229643,3294633488210508,8870436874936348,7341081633299024,7232258207472210,6488048052714067,6189657811466836,4616041544145493,6653911874107990,8853231209182826,2573991496866393,7183482917159180,8501564970888975,5414623753886300,980850133351006,2388269949590111,8675764738660960,3777477351505680,7146089897417314,5492569423616611,8471335819972369,1556294923139689,5872175595092586,8622732383291563,5778513097087597,5037327642172017,1659901650164342,8763433932580107,537958394911354,9004765389601408,2499514554587777,2921446339088150,1558426557880966,4115658607196810,4338204266830476,4345830396041869,3919530380622478,1753993974594193,6782834221560314,8971731285375637,3190306429115030,1288267294096023,3483196940380612,5067229455317659,4792420128030367,2474997196188101,606724651915937,523041324661411,5988200964790948,5100278437436071,4773400462269096,5873201947982505,2640580340931242,605093860206962,5090507000838830,8685227095653039,5373952180992690,4955963921332915,5313260831677109,6330179113499320,1025408890004596,8187674705391391,3574667853724348,8324141883660989,422980620630719,1640568269314754,6085313665358532,5797790690882678,5077851029797574,1779918378154695,6786152367151822,5870454748314322,5918740047747797,6860786437585623,1867386323008216,8848495432612570,384148711729615,7194992275069660,9203309792230111,401208805104080,3662254334098147,1344871396580068,5393217637657041,2095022381325033,6511657607730775,6718029619370733,2221905449491184,5174868797056126,5490902749223670,8516448922475258,6784290289458986,1013858932374271,2628398115388161,1013578542744464,581187609737990,4128890357950138,7335684234580395,7996699855527724,4383501989197903,8035497123458407,5125756210871055,9182466279815179,3877062269917971,6962119425465108,6347297319926549,6978786949077785,8160091789844271,3658894315821852,8900297128671056,8919335655586596,8237764148551473,4715994120297256,2270030982732586,3013741907303211,4018656461249327,1921423557180208,5001447429970737,1787190917708594,4064808740346675,2982083384744757,5878526487575351,8287694053784376,3910357416278843,1691564424305469,2194514101410623,1385043945864001,6266729778772803,6908984851553094,4264467608124232,4904853499312970,8650378984110929,3767150178958162,2817418875300323,4069071166987094,2184031037640505,8201506709527384,430675272047449,4931109952985947,2886665799261020,7477598697691621,4441726501346144,5315964703939427,4582700110379876,2504674242132841,5910758856285034,1186523670829931,3135470946327406,1175105530018671,7289442193120113,8007726007409527,3865725165001592,2429994472823673,8489110827441018,921978547755900,3917687728946046,5169140873182080,2122561551293315,8881825836874628,3236674448014213,5657721892035464,430335092554633,202376425782154,8843150944720023,8870760784927562,819066455030669,5875434419305358,4023242042923923,8850041109248916,903259495349142,9191965378960279,2076642430581656,8780668604893434,6766763201772443,1715705847684134,8584484628487072,8244468840554869,3907336052628386,5280009908804515,7628249849912228,8371569319110285,1109394295421864,943472426744748,7196085590883245,2188639951428526,1189962035518383,8902658889505714,8659855262602398,5079285249326921,5324830515256843,7838102388865979,7287437128260540,4516917559024574,9042927073639360,5703232359826592,8412791218691013,7061072871340998,3043405542013896,1796449562840908,3247322522020343,3041692917242828,141283939853474,178190675631055,1311051497774032,5316693202451411,8151379163192277,4438098993036247,7991833826794456,90503452531675,233066945543132,7830216200838110,7877402118845605,7190619563793378,5047272760351227,7342667105888427,6820738613943272,569629000195050,7711276570434540,6841152333306861,2058242825649135,3046928549723120,7036494398389236,1237631654558709,7823479318748150,5716811492555767,3406943906697450,4188064251878394,8511243143436799,1160082225691650,6584993123283579,8151548390530052,4617008380500998,3690679564712970,1723605722312535,3582759934681540,7955630212619278,7966746989960219,385357488315409,8088173142862339,696366651472916,6709457742925036,3519395568045913,6571934734736411,3065600499511267,2419106505464866,1750561853078563,5123805349878822,7975254338993192,7031327321971753,4412953373776938,1083150189788203,8008398849604652,1873799920753711,4085957593529393,4803707328044082,41794863725619,2410992925531188,8774969785834549,7741093506690144,2188809049578554,1729304179937119,1096003599307107,674531347766336,1645170386287684,3132359173856325,3580711060347974,3713920667589703,1545465613564428,5689337481755722,5041852586400843,8132347351071820,4203926717729293,5380962056715345,6656670856556387,415539868802133,8872190770136249,511360988994650,7532988100189275,4471821331373148,5812375072234590,5136366893038692,1726152262655080,559171019873385,9027670808165482,6786452559998823,4418316935101550,2282563789151344,6368135818869267,5562693167668340,2930513475288182,6627335904124777,528467997514629,6959911726701691,1387395324550269,63320029445246,7894695313234453,7633561741433985,1185875048922242,6580279406091395,3184892229999748,3477315412224534,5418576670401729,3072730276011147,4016850017860749,3189957881592974,1920951991712911,5433896604818581,8091772707298864,4862109410387536,7623554314902683,4648339335978140,6773655927168157,7698146352634438,8753420262888645,3054693586484384,4324305406183963,8035673414034630,7678111626304678,4657316520886129,1995043065896104,7096400650841523,6918634063854767,6917637569767219,999524578837704,4298645229264051,8471487034989749,4511520620485816,6910122016488633,3573110852213948,4867352777833663,7269166739809396,5773759769943235,8060261175672009,7933062202227915,3227521752288106,5218319864983416,8012955710784613,1598482915433683,5986616864677076,1719551162342614,8104802785557819,60603405335771,8393029879536860,3521772803325153,2940680310815970,1029665636335483,3199599339289830,5941166399700199,8876369742011625,7421187633478890,8455639212292647,5292157781769454,8175959354850543,3008323198016755,5400423121960180,131116417072373,3801292881476856,5015437638278395,2400442027384061,415116960070912,895399681539329,7992469309111554,46357298412803,9133505124957444,1866286753250565,1818331034107145,1458649376922892,1978161902329101,63306235149582,8313562025819407,4976381978950928,6046718824488211,7611681853163968,1165038186708245,944102827203868,8856688998489373,5078810619223326,2367532678511905,3396881680006434,2394207618161956,4886940388539685,2643733848464678,3829880595307816,6922093298762972,4480992439188779,7126103433690413,5992717863206190,2448671352511791,2265666529934642,2230468062248243,4663330995109172,3651525448219957,541053051716941,5692237710726457,7118225404239161,434663105740090,1200359362985275,7993738928806591,2188855195237695,8129482752619744,2267727329692214,4463332287315272,3970279607573837,6616259938319695,38796750478675,7350286138129749,8830300629275218,4159106421898584,4183753669713241,1305509697256794,7735319435452303,6946641414544737,8459519274876264,8162035933773161,6196299461279082,3903024832241005,3473592082652526,5161456863280495,298282370760595,3722456268692852,4322002206309755,4548342809902460,6383002564943232,1082573061414273,6724091118214530,4637667362479491,2689671061446020,3204724571553157,5922638214659462,1700644206599560,9151848255438218,4096207122141636,1135281134157197,1117569020460435,3362436565171604,3085350155705750,8473570781954487,2617041563647388,1239166297251229,5369391285960095,9204054492700064,3659325813677473,1632394834238882,4826082608135588,3790774782696869,8677552186655985,1969311632956841,3523365378293163,8626286727364012,382594382642615,8554879537077688,4100017446955594,2391451469864382,633036834350325,1895099426504129,3318297926426052,339437263306182,5290759897890248,6930359862042295,1051162475599095,7504969520315855,3406285850123728,5614136365628881,8079717937473626,4401014642482646,9047002269220311,6835778016990849,3452382673526233,4560544297655775,8800113811824096,3902090571957499,9198065299023999,145824921804261,3315473748286954,8992799966035435,3346356687475075,5468691042352621,7424128591134190,3228592959856111,8576086575873520,6511579210669992,8430577201102323,7835964881255925,8265515526779387,6996153042394618,4458751773900287,2962322980978176,6044674880839170,9130243714727851,7889399199833604,4782813123378695,644041759842220,4927891402587659,8890363075722766,1417222843244047,7171410561285649,7100072671993362,3647095151199491,220200081325591,7722091764530713,6698610229198363,5837495693082140,7887698396519965,8767301214543390,5578265180593695,5807940404559392,1738086274185802,4752439763426855,2408623709478440,7848318783233578,6223434893100295,3910581727198764,3985877652168237,4688870276136495,7487221990809136,2086887827586609,3226732530916919,8797523270835768,5725749083725370,2171096274452029,3559998868364862,547955052000523,3305234174893636,2511276209233477,951392781180487,8330967464227472,3936079110454861,5820631823107994,7729176144123883,2592918891052625,5993179024480867,9175610415128148,2385635933331034,958854308183647,6241581487881824,4418724003847777,5715058933579362,5420024016166499,7040678112372200,3034228900273767,7084523023990376,4708368769236587,3796612531822188,1626268851160339,2943647654624884,7384339637223358,3915771473731191,7517131289534073,7343216443752058,3028277686435451,2759433933855338,5286786964872830,2074928616537727,3700450087878275,2791404223536774,1254112495156871,898825994116746,5751178417528770,3787902571248237,8558142159963416,8181734594483080,3523703277280915,8149906919947924,6004517490425495,6259496447231730,6027658591264415,547173200092832,6511608871689896,6821810332931356,5877523072089770,3730820796489387,943938638560941,6643161625329326,6171243734540232,1586610504277682,6757285490908854,4717494362422967,668767937838777,4067636962672317,7307845059788738,7012253334725920,1889951248613058,3563419311218371,2470546020987726,5851205357854405,5756142293615905,6003781271838408,2973815027269321,4033595231870668,6101608708259533,5237516358532814,7693244208131705,8176009227358381,3107106452610772,7398627019194069,2023386862640858,5656356145110747,8512558788847809,5950451473841886,1078290194898655,3695295322242784,8847193559293666,3863204861550313,2082902307484967,2702468166164209,6142478088699634,5099781103083252,57686173441783,273997583056632,4435180485672706,2181769529938163,3194109103341320,5809328928038665,6313232166051594,8353291836689226,7040954765346056,4738735219973904,4611128165302033,5780426788929300,3806753853136663,4207495218678404,652518811713307,786503861813020,2700803050184477,984512310296350,7542558225948447,8319475551346464,4519533604175649,7386950554584976,6004676526063579,5160910110916388,1848302814002982,3148217087852329,6561813685632810,4811186841730859,4573893938061100,2872625048239917,6625066668163037,5217278877966128,8118809754014844,477295873343282,150815293300534,1092930840756024,6180586612326201,3637616070328124,2335853727670079,7567399928258368,9073136264544065,5213550173014911,5813353287253830,6679110105620879,5087533478920009,8578837895274318,8698001442417293,1723812723072851,1453353431015253,8031101661445974,4797339790303063,8305509484232537,5566384175423325,3448925560143710,294099039428447,7819804324034478,5033648314023781,1922723730005864,5888663487908580,6989228241796973,5460318827093873,2490139250125459,5122150408634235,8131153108836221,6547172471422846,8950543476940671,6105579821113218,1803905196523395,7365571099781782,8444594099989829,5803733134054721,2606436059299720,2628026510741484,8531041040605066,7778163354975869,2680450617556876,1563311489597325,2239744596492175,2827569506721680,4506277711503250,3926343530282899,8422936903585774,730801513421465,6085213520504579,8145655103411524,2563987146604442,6566521435643803,5294371265044485,5387100188065695,3529908636416630,3162805400092577,7666743813382050,3724904153971355,5086793439100839,3447755731500968,7148913894055849,5479849481274695,6033831413505964,6896014693793709,4193525969403822,4907021906536247,1588585750944674,4340006572957619,4302688789454772,1739001352708021,7371866145562552,8739025321893817,8999797038097089,3154613998575547,6379223861411773,2574316585910206,6094388560641986,7655435009090891,4347655085105092,2321921654087622,4787615649202119,1788146734227400,444162230509513,9158103184682959,7941675026366413,4013913200551245,1335811373932496,3702886422740946,6056134974955475,1124527427567573,6299161777201110,5323920226312153,4521827267600346,3787585123516379,1544695719706588,1098348249210845,5253305103843294,2445225630433247,2955077886271459,2092169417359332,8512197802154437,6594093678206954,9182361302399655,6596597915720360,8455273007964146,1981613402906622,6542460641738748,2905989813254826,5752283432599550,7770790264194389],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/e6c06dd6393e96514f79db5d3bca100a",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001982885.1/GCA_001982885.1_ASM198288v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MLKF01000001.1 Bacillus cereus strain MOD1_Bc97 Bc97_MED_contig_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"e6c06dd6393e96514f79db5d3bca100a\",\"mins\":[2055785392914433,7246531559770795,4318099645022213,2066246638575627,856430387060749,7180515467780116,6595361973592085,6835704664703004,5736148388479005,3624832678002718,193267390701602,3974813942702115,6763181295837220,3003263054979111,6819280141049899,170338239250476,5462954550507432,7484270398726196,7169587084828725,480511804588088,2194683169824829,9022086112436235,256973861412933,1525249566376006,8109326307024969,6991280400212051,1992273004413016,3034843176531300,2104690620948574,3006562843287647,7222683957821536,3169016327241825,9139875681656939,4846244486815859,4903522332196981,232818700281193,6055672916230268,6585453651402773,9024485540388992,6340143592480899,7108635481194631,4966353768644750,6494151105699983,2028684168945809,8508611820224658,7126778996482197,8802617146146968,7278057380397212,7641556691275802,9165974340868538,2926970353246373,5165462894133415,8304674319311016,3328161274186439,9018854194094253,6054708635304112,8740375803601073,2499428796334259,648016614752440,7307857965015226,6252334072078529,7980908637569218,5322583502086342,8085746719023310,6913173276008661,5432703712223453,8001433550733539,5114043436015844,255165320765670,6939783019159786,4411171843752177,1330101061206263,4262251643199737,3327742272749819,3277803293122813,6999555342268631,8963692794728491,3698310685319433,2266606655955213,7092083245687055,6695739482219907,7913054524309781,1395054403158294,8703838460051737,7105499203199258,4603728419447069,4226147728605471,3237831462166817,5227846324265254,4107242740490538,5942587942641965,8800237405846215,668324374307122,3385585243193652,8407379787227446,5969311358738744,3980010824024379,2075100053422396,4670733326926141,37546072979622,5065910073254208,2496658962710853,5942775365869894,4899131427766601,3814771234341194,5044232927076684,2133116485960017,1389609834226004,581717473370457,3826690794357084,1801060436392103,6064049946820959,5270194255741280,2590452273979747,8383638827164004,1333391593308520,8065469046661481,917683828097386,6919615129864935,7783536174236015,5080187864064368,9012165103396243,2798671192392053,594492747645302,357894813237624,4457789180600697,6627748384948603,988780737380735,8500344793497984,2466923266285959,548152826347913,5184462708162954,7402908945351053,2080971238343054,1015819953250704,4883295208382865,1170706663899538,2254499715023251,2119044226130324,3651469108879766,9086659087360407,6310706628837786,661419899945371,8512159757541445,4326726350094753,8359910071075234,1146784836567459,4192485002453412,7331055141544361,5129580546589102,945651627024819,4915427247243701,5324132977201225,8897153328347892,8131355117452021,4947339414184386,6979349722571205,4523769463423431,2253252408123849,4991808074662347,7364674774860238,7121434213077069,8032105354731991,2527200308634073,6942747646042589,3390774825714142,317684040548833,5082477417241339,4643040002420817,3211471744705007,5967177306628592,1653309495599601,4619171782124019,5653114805259516,9131561072910839,625809529078266,81061958337019,8219977228034560,613947352539651,4081155575464457,495184120275474,8895633986339350,3610481434616343,5149918244315677,692039418006277,4662395379917344,2102217904628257,6333010768331298,3336532610384425,1298038128460332,2855106685321777,9169315525771830,409041448690231,8038652541731393,1500146537751106,758697884361283,5228981445444164,3351082649461317,2338376327512646,3748470269370955,4521273833996880,2739774452679253,3352659744678488,121204429759066,4454325134744335,2409374629298781,746196304151137,2044159811388003,4561005217292900,9131891067009809,4620929005691498,292164944716397,7455100606890608,8410617293750899,929851000455797,483377259307646,3568090843988609,3360010890420873,3729786321199756,4518369514889870,4858478078120045,65676794831507,1230325263671959,1528692055302809,6063850000532124,4138530546606753,6058925472137891,6259039135924901,1601316374286449,8148044985590443,5122053825802354,974074572898990,3141475263439535,9160321688158323,731001756156596,2700214794830518,5415049836970679,6298551342957241,5132190758421182,759595402355392,775190296560321,4809829142397638,3537460414710471,6698287203492552,1299359505138377,2484647860388554,6965746183586516,215059528737496,2163560152990425,647718174245594,6080818368807644,6381957017223904,3671132655248097,91624194654946,3867723882685156,5186129727423953,9044511023940328,5225933344203507,561287560430325,58749851116279,1258328534614783,2337150465942274,8324653353001736,6406745096406487,5793430424912654,2649492640752400,6615497376458200,5568368541139738,5355272336663326,2211335337681696,2161086844609314,1675509491655459,6111423651537700,1986581254406949,8755556150059817,5391999263023915,7378452268450606,2367236335371055,5541025181860656,5480000832807730,4882197749769011,9074842874962742,4822909291103035,3228177068204864,168741203272513,3842703576982349,5090266902537038,3622044415353691,7994436634968925,2974217976316767,3319338145522528,1180888135492453,6244560700007271,5609004962431848,6150946929173357,1310853444635367,8654631175807862,8991000889416213,2187468424905599,7055042931483522,5074091574838147,4218588312599276,5065878232013633,8447856150938504,9057513647932297,4125014128567178,5780136820286347,3506000659514252,1382221590725518,3392854736675729,5554218932618132,6856317778485321,3482646198608794,3275822547587228,2839780259783599,5029187577136048,9065585970623396,3350021944091574,3171896495553353,736435711886267,2545689571948021,277431511466948,2043397789131717,2380172767192007,3966475786847177,4137825823487479,8911156027306146,3321370759783375,2297391839691731,5908787778651093,6387203681305558,5715464780571610,3588390367405020,1817330670453725,4671217636000736,4843875323127291,3355083888305125,6078820605150182,2520966422692842,4795721600156654,4525523145991153,8507235162997746,6375615401804787,5118367312298996,1003406157267957,8634019355755513,5486972902237183,4513185396384773,4979789204185233,6907978295337994,4727206422119437,3259618003715086,7496988898499417,7555374263993372,1923842446181406,7765541136979424,2396526519755809,8335175578575907,6702955995956260,6383907018859558,995257431139368,1451027594976092,2293988919723051,2971336054400050,23093445600307,8933091623494708,5152537334572085,5072599210632246,7504578552751163,2447901102990398,7729540433880133,3265316146996294,7473324023358536,2865014867256393,2785329387848779,3389700364895311,7576789950374992,2521064878138449,8827171683165267,1892970186982484,4702169139840085,6327849729146627,6466284555592794,2081861524809231,5151886057317468,5406850765964382,5009132145804383,7832972766823521,5906217990046819,4931020689900645,535748728349798,6405088508339306,1300951684545383,3439273728689262,1345847912375412,6139739609638007,7872054827279484,2961818691699837,3305551908537470,6767065159677461,612424331674756,8185703666508933,4075207410517129,2336132338197644,3649275904181391,9129240300094608,1382640450659865,6879424367527068,5726213027751071,1524457610642592,3721073409336483,6750835697774790,1160990959912102,2711631187344241,8748820277855402,2530312839000074,8370916471268531,558036260357301,4634835072722103,1298176782492856,947143484482748,983456028738749,7530937953428671,5813302277432517,4009519960310986,5827243818820814,4976336081052881,738675104646358,8438189621691607,2705002793534681,4355058747491548,8255686807299293,6165810545091808,8426687255962849,9005929229233147,6790824760870115,7353918940128806,4015017884673258,908681115010284,7972722090488018,6692118422250742,316355423536381,7280283306394878,3514573028017408,5453777137337602,4110672095634691,336582157894921,4712718752122122,836059972283266,1473537748365223,6541861828723992,8990328122309508,4970989227312412,8582375191812997,726238803985697,5526443166041387,8858404628788786,4406702277715246,1891489161102642,586893497386291,4980346745906484,6090714648216886,102577201153337,8414605190063418,3074526886864189,1454581248861506,8722595972864907,5354478839670084,114045978543435,3939505060365644,4892523230946642,4935091095594323,120147726533973,1695796254516567,5114483788793178,6165298005820763,3176810061608506,3184362463642976,1436213135147238,1269534819231081,7433060766377323,1390273573758316,4128080008250743,8274570076538234,1996773069415803,5064800651316117,838005262280066,2138392820483459,5254367013152132,938793726510473,3663813520459147,8875358375809261,7430105561192003,3487590742443412,8568113716200853,2950124508939670,3194971495857049,160605263734168,2953427014837657,7568399829198236,6967331512247709,2590632705557918,2997914198451618,8873696084854180,9139237452694952,5553501428530076,2669556280305066,527380660331948,6404395016955312,421203093710408,5770626236134537,1991957773247931,3687885642352062,7530610867774913,9063941277713858,3633661022299590,6953579468228040,460318319281611,4151450038934434,9188455556023758,8407258696287697,8275083314759123,1935950059890135,6942084814546392,1651177932400089,5967191771063887,8011567051167259,5341622543442171,5255308822201830,5570877036340712,8140710466553321,4751249605166572,2787713472169453,7498683768529149,2255566245692912,1961730382743025,7640097878574580,734065464927735,7160176860218872,5105832289437177,5184228374193659,8732619203931051,2769272435598856,6661438337753915,7738251735008781,338162412209679,2056207748498964,4120185660818965,3490193545283097,6568507770619422,4323922314700322,2229963947410979,5052519639860773,1338552254613030,9087245782140458,6249238580700716,2918463254267439,7191343056027155,7566461530089016,3363011949476788,3646025334490683,8633743961779125,7186053041227328,5665280920069697,5793280664651330,8048626516551236,1893891415369287,4877661941737032,1729931510113866,7201283322791500,1100506249643618,7508596105995855,175106100225618,4682474196231765,2135217042762617,62069090264666,5080529489405531,8790627300140640,2229987528885857,7237286650267234,797795920135785,8329254950561388,5095407739503900,4141414579293048,2739681996881882,6616294654797417,599272591332879,5065699686958721,3570834626463367,8805797055506059,8691278303979154,8356428892800659,2339236655070148,4228467137898140,3534120832419485,4130952296572574,1251960542471839,7809679818016418,7410007893493412,907378512930469,1238877251561128,3680675834136235,1981412582934189,8677411531507374,1099409820223153,5806439907845812,9058279437526718,2360881068426945,3399831060408002,3685700158801604,5790541000849014,3947700647657761,2434499426494153,4118935034488522,2882710031009483,298134661687292,327590309217999,3714256023750355,1745445803091668,3950102504294101,5496979316885208,8707135252847567,707319942768352,8727908897916641,3407823139210980,2625235674648870,1307145867233002,8105755158144749,1956365472638704,1464888660109045,345104803301113,8515715679676159,3148990586144518,8948382608107272,3971909495064329,5989266562221183,8988173610000981,905128714176277,627424473917207,5778810107873048,7676535253255961,3654447875090202,7411158884143407,3363148384077600,6668600955266849,7205483185014570,4416558231643951,7758026041632561,8162941803620153,1229147954805727,3978649995233084,3862187335919431,7853174537430856,6837125077714761,6650623585421135,5905059358672721,6898667751868244,8105295213717337,6538099077670750,5596289849486200,6312150514067091,7867807800035189,2862737762051961,8050569270314874,6490314376759167,6612955712340288,2582899082643331,6721139455690629,5899688161625990,6247761817683851,1111101255755660,5996902711494542,1116568060495761,6204657368917914,2278719779481499,4572362821609374,3493133919365026,2198409905751972,3891629006289905,3227700727629739,6456265218164652,6521255766837166,3761443076581303,1683166204716984,9025116280302580,4475451191281594,332584334747584,6290195123091104,1371758473799618,2170295780403143,4066816745359306,6466633257289675,223862070962124,6960619405633186,5172741828640698,3968193524803537,1800850079123108,4289056162424796,775506040407717,3976343897212898,869359858345955,5768338590820327,5175651439405034,3448056296990700,3826592054365181,6152844598380533,3832078127949815,3534753713186811,3504935372654588,3609410989426687,106810992224256,4430886828648107,2270486107957252,8706190465837063,5895876620347400,5595983763269646,5235494796797967,3121409787308049,3477082560333842,2909791377688596,5832881525123094,2169668494010391,8011689049188377,1879654175000605,2238387691677727,4383477134714913,3653158860179495,444350674159656,6161736191058268,1152568854497323,1450225575282732,5533166284343341,1316880070010929,3388557079365685,1440708306667574,3692738591369272,8055535206230073,1528254123460667,8897033743976513,7359330971723842,2580026179692612,1696115914033226,9151154756020303,7459990207072337,6750438647367763,5231279753857109,6801181072836694,5731170129053790,7934229460314207,3633961122064480,8156235797776484,4032704114608234,2322902259129362,8112693177688424,1454549082474611,5811660804331198,7212631684073591,6243571601287290,810781932275838,6498164213991552,8240693754300548,3617658447272983,2579222718777487,3251837366921361,3258778418899090,5995326040688790,7262132059319221,5510904380434588,7343090720901277,6840097812727967,491226250709153,4215201458948258,4303445663565990,4742094308763822,1213715518466223,6330268739692722,546874373319710,6743253666924233,6881674553411768,8725979583457469,6436242131372225,6227557319747779,7821506210193782,7015514676373708,9182023663384269,215805833152720,2857057103126904,3164184217389268,4704848347100878,4632813255065977,474969131542746,7278167907592412,2371661944776926,6952819532994256,5058610460920038,6826730564798695,6406166471395561,2065381152106731,3248373379999980,1589716050381037,8895496425093766,6541858845751511,7350531012469120,4073192819866667,1102979627723012,3453606197004553,8733050570303756,3223509833730324,8433872512982062,5895068363139351,3239516817508638,7447903267842335,5762427303987489,3514407084689699,1108050587461924,2769137657415973,8769396503937170,728656131975468,3633746680727856,7629165525248306,2288266294430771,4981192388307253,4339212578859318,8403615379245368,5683353734433082,2844504708368699,5174406190164285,4436414789355844,2837979216780530,1816209729431886,2109433465678162,5799804874434899,698723971451224,3978855372982618,3386830152458640,4776051280316771,6194345392073060,7126380334565733,393354165274988,3581628325585298,7053595679885684,1448965522876791,1800088072248383,1532036103580028,3814951233972615,1652315419986313,1298729692842381,5280235075673912,3086719577467280,7833560967754136,2695709546236306,5683692914338198,5256067662539159,577747060263321,3111983358921115,1934452961880476,6586114505646490,3566521228487070,4230064182118815,119602426022305,91214134700452,256293911639219,6888772524525994,3348550672596039,8035215543699888,100284220320178,9034714086083000,7201929000126906,4189988837517755,2600453935545418,7373427699067326,663304576018879,5195281123379651,1524360708188614,5621631887346119,7834906548496843,9059558869625298,2418411060570580,1196150240360185,2017196050663897,7443096761453019,149732003916254,8310294575196640,24202133465572,3919175030319589,5944465610557931,7480578467678704,2865266601077233,4600771834431986,1837100831484405,9048376000397737,1571000044456442,2032980715645437,7963507071666686,4555172138363989,8135931499956737,6236919565117956,5931336315513351,1191963961469449,7466210825185807,2880477880855057,4202011907770899,7962626535584174,4719465159600674,3831894410287576,3963957251754534,7277785573804584,5892623958382343,7998924856191535,8830758217278115,6907226083953207,1213192399314015,5735634804976189,8768946060429888,5735733364582978,3921526579242763,853902489553477,614652806294087,5107939174742549,2136248880949837,2022263639750350,5671471143193171,1522273890798165,5991744774982230,5872235380904377,3275894752578136,1732836256631387,6151427081148177,5230628758997609,5884920452647532,5638005406665325,7008588527200878,5398082149902962,547605817444980,1280222425901687,3756201167358593,2861141726530181,583765645855369,2675333884152458,9160070272512776,5818813857884816,43341885303443,2023808379226773,8445589765212822,5329736801871641,1631744211724953,3026887908018842,371452402818159,5213463739026076,2697435998358173,2046569864710815,7429975486941856,4001638928067233,7250481295190691,6166456647813797,7384501272592839,2201998412434094,6878488664631986,4535131522263731,5249555912641205,3919645584902838,6903406183762615,6852799254063803,688128211380925,5418174855211713,6920046397065925,5225836867286817,4179736862567117,64265380514510,8725202185279267,8695972638360014,2724540929280726,250094454401755,4593655916215418,3532904035805918,930186490645215,3144096387410660,5634847460346597,4596654683777767,7503304094243964,3880319658357202,276627904604911,7654136027775376,2490840053050102,5663058665179896,6401037306260217,4431665705364220,3773413013252861,1240552966476121,7736604909595396,939794531977989,1036920580439169,6423458840264849,2692609377684234,3750582992521996,7652785250044689,6565621052771092,5588748970533337,7390010897640231,3777278759570216,7481320876174125,5910533727791920,1069875720407862,1620155802069815,47167197260600,7538404479724347,5364373156924225,6782574814432068,7303327332240198,5287955114953545,4476937842199373,8082114090748750,7925600724970319,830351007402832,369688352983889,8698834994785106,2516107556186970,6348635218848604,8199388457834298,1877905822681952,2579223275596642,7474311013337955,6080228294429540,6327690018351974,7102847451941740,8905837783653522,292057775278959,9037926270389106,7000760122469240,7946444278451065,2588661751180159,321435373906818,5030366196763523,4949924637453188,5312595389148037,8144179236948871,2318367874165640,2021283704433545,8215125263977354,6061806332840847,8305825386975700,5866730118294421,6207283425823641,4692181259463578,3794451625446299,4745075279612828,8840426558966685,3530663695076256,6745255177904624,326237997329315,2429807224753060,3840301205917365,599128375479210,8502357477378987,7226511482817456,4472721365221875,3409415628745653,3839639027264438,4965581041167287,2291743031708602,4818625839295419,8181282071899070,7606461474745283,4861094202461125,2393260276231110,262563698486220,7839872495119309,6581757758319566,2785158361697232,3951659029859281,74491297418196,5343047265422295,6434424360020953,7009057743711194,4094995242462171,6677229722274787,1565992617282534,3329404599667687,368889073888232,799519071112173,1202432472230896,6914344522091507,4199934441016308,8260563330534391,5995057581329403,5667110395636733,6197580363063808,6760893747268612,5891895431859205,1563195789290502,1264505818999816,1816762474007568,2754969665790467,5839872424544089,4366488144710681,4049823130184734,1193097040874527,7954705809452064,533724241980450,8855005189044059,7113159689563175,2637654716804140,4849354643319853,2953609530526766,7454516830628912,6336714421931057,2438895481105458,3293665784753203,8863715063581748,8836241109357121,8973562688842812,7017040605973568,5446480922698468,8927301136690243,6034508574026823,5175867414481992,3150977520561225,3961468928059162,4384022519295058,5107823159323733,7249475230133334,725712590195800,5495650281213019,9098576273271901,2320610175167583,5942984498672144,9021504014011493,3513839723097198,2028645766917242,9073709004428467,7589501724105920,7225944431957673,5110455141253655,5724294393588877,4495549911780496,9134184541138066,2615223165750420,5686177164225512,774042228755607,501971111988382,2327785333794299,8185675396910240,6409922025539093,6766346434940082,1194197348616051,640163559115958,7970370319920311,3547466387057848,1305083011028852,7725687048466975,4106005610805109,4917487069790752,9183783119084747,759417405836486,6407467746405579,5342800246254799,7857452730682577,3780311546326228,7812500116962510,4395867332349143,4970386126908634,8881912834886876,6946765327764702,713264133937019,7938757307337962,6132274328538348,5747091784355054,3258829462924532,4746705324166390,8612391105528361,7281845736557818,8027064607124731,4424636815166716,1397935515200773,5984502254431500,6216467083734296,1523056190024985,2860878360177946,2661885365177627,8900231766379805,5155849586634015,3352343518653730,9143118750141735,5439902468836654,8946472686234936,8189843811093829,8408475231161673,4088061858131274,7148200138386764,6318042496609616,1463131516447971,698332703698260,5423786159607127,6704927895014744,8577422979132766,1785776864292191,4787294553197921,7744401490529634,2864321328598372,1661119481611343,1613261548907,7297121946553709,2470067031223665,2402289251208565,7290542444391798,554800709373304,5115337659706745,2771811188755834,2303606437473659,198430634478975,3260392313449857,3300957147843970,3279183301741955,1200052071776833,5191726874564503,4352873847538242,5578521368751504,243226410790291,349178955836824,1518384225865113,8543471141080476,3456023930006941,2357512062414239,8132964162358689,3948310458215842,4968136399179171,6972398365901382,4127436901748134,6819966119603625,7810487133531562,3670885471587756,8118265489452461,4796737558072750,8647064042384816,8291035761749428,7892845460688309,2695970569113014,7917061166755259,9116291186467845,1059832551058884,3962531493268934,5191583922867655,5835066886958537,8043262401727951,4253936652840402,3794800963816922,3029554268990941,4789601399754206,7724587025673695,309451394608608,7711583837072865,8079489602104803,5936728101727717,6187653605076457,8316620987731439,3839157926743537,6484912365956597,672110798466554,6897189840326139,3409736862573141,5463283168816641,5701457464421893,6591654127521287,8237754711518732,2177970745478677,3764286367600151,2242787300478493,5424585699159582,8205392819818015,5568914238230049,5285590900330018,6470122148277799,8472226564001321,7060627723185709,1971107886132782,5226762499419696,5508237475434038,6530882328882744,150246363483705,4643153469304379,980882416569919,5659987265228356,4649078923783750,4806528127340103,6805136291548746,6042608399068749,6572304396349006,6628478176595536,3673023694843476,7314551181291094,8836252247502433,1207390554574443,1716270530719340,5844177145982573,8790423248531058,7659499372913607,4404463872151159,6808653089328761,3760778961473146,2418666201484925,5703866747825792,7822294460968581,1226165789642375,8958440211268205,2105204362218776,2866654646374034,4407992742964886,658154459672215,2317929193164440,4707642630155929,1530594035371674,4562562469293725,4940413587992222,2051743485996703,3160345357053602,2447061869804448,1264594665680548,7680699744874155,3825583560249005,5596296717594293,2525918750882823,6347350147935931,6040023844054986,3253629564461685,603010584301248,281117425682379,8821807303282376,1493553638971340,5684601778097869,6597263652589262,3320599277039312,5793870892035795,4133454541311709,7587739901873886,6385798453980895,8920092762918624,6185977436106470,5972982110277361,159857323060982,2702199903432450,5271435388202765,5018704936464150,1386661786937305,2862821797293848,7798505779564313,6908784259215130,1227619661426467,2899208246438629,1021206874591022,4630154130845488,7912782300254856,4518185624889923,5214847765245750,8363503857028924,358027058892607,6099147692248898,7910834410482524,7034808476733252,8453148791607948,9149615663853392,7995426447871826,6522662579810131,4909134751130254,808362797587769,6128576255348569,474783418322779,2622829475827551,3080911937089378,7419159250759524,5192198146191704,8187654072455017,8440037284843372,6693696354135917,413708998908745,5404864314945394,6699545774870388,1469896817373046,8379467449488020,3415075830047457,2837462136033152,2897186018217860,3260654622920581,581100624531336,8657464267081708,6428849272680330,4734040021118865,8964399805628685,6174196195577751,2267324753751960,8457407880318874,7611388433428379,6367961506475935,4275981504688035,7189368617422756,5233185341689765,1187422570565543,7649299605230236,1956015591272364,4801040275451823,176667391572905,2552635532906422,4719208154779577,5519153057927098,1269906370736059,9212795392581263,4426802433945533,2165592248291263,8773386401092256,3661453500895171,8002221794906055,5714340269612364,9058254461218768,7424963459928017,8297023756186275,4560301184348119,5356728834809167,4190281028190885,8598647233142096,5513074110959587,6875545800937449,9083991170404331,5564583047213038,8144316829044720,7066902606147569,4272517259948018,2875038707101684,1381801322426357,6830844635940523,7243475892757784,5981851105628164,4251535487479815,1161559496806410,3507669706223631,131520301322256,6506469482909715,8526657945473044,3944877932228634,3835759115677728,499151981548208,5730739181686818,3375861760905253,5402720844902439,110987195445289,4487933688361002,6302184507314219,1202961723101231,9108937048133683,2044702999457844,2217628200603702,402699597033528,5975860216636084,4346703444004925,129978200101557,1531446484561992,2226260663554121,6857875159068746,7142524621606987,5508296736895052,1356673531088973,6526306086482000,4512939051896913,4380482563731539,1186694071783513,9058143214260314,1722584701005916,6255478762082398,1351633494913121,447346101948514,8832216137679857,1862204676001892,149528068714599,1038660375556204,1338559144988781,4344485056360560,1203549744255089,2249420827226226,8976968489098867,5239352991354997,4144502594769020,2692723766538365,8941172851740801,3158649834081643,7082373921509509,6199168504783553,5377774149185673,5933265121874058,1389650419812375,5395342010888336,1170477184790676,611414069725209,5631312797978777,746709780762780,1714992647647390,7547042778165408,1455778942636194,762519223193763,6458376282943653,3364009987528720,6592472276054184,980192377581737,6233062243848362,4748162004824237,5959727968686257,3710757318701240,8293225533650975,4336783010214084,6326626427416774,5805018480996553,3513745378000247,4965170907893967,6166998085934456,2693190976917714,928854015881428,7944278248976601,8053213042430170,534649192607966,6756168826818785,449384950386914,2676585488355564,2961347828371693,2057534242394352,6609787672940789,3985103699808503,4204061800894718,7880054824472833,7927821832827139,3974445861687556,7701798580941062,2372297024975111,801426398220555,8713942866465040,3283995178774803,5292438267851029,1314281369506071,889091676868893,7159411886895398,3045113862574376,8907226439375621,6674298197807404,274085233472221,6295253741089074,2953629781201205,2327701339356553,3977133933228345,5834878998901051,5021033791181118,4660931830214976,2338242271945440,8806385077645635,5432811881558340,2491405850202438,2765123772592455,1476179533241740,2666119498142027,5836990905733452,2960908792033618,6655840741773651,4143430422775865,1760009238802776,7438472593805657,22654152880475,1562640966717794,3580862721970531,558457884742001,2397876904238483,7091297227460980,5935912549011829,7838672672387450,745994477439191,2465747012292991,1255310035565326,4009649717481863,8853163944333707,5647978608669068,2769525318513039,2883614617398680,3127766971904403,5077788102422932,7995648069775766,7316910735274391,5061560697622936,4439009572614558,6360201669915039,2538561593422246,852425092444590,1477526192894383,3493511086240179,5411122041926068,549496734924190,1378727652381113,6012288300683706,7888498450362812,4998454409949629,1534406774321598,8964817240486338,5143938287956420,1693013500883402,8600623633158604,9055829648486861,4007316638609873,2452639757185490,5827296476892579,1690867348918740,3084834248274394,4503540247572961,4615384633274851,4719259961556390,1793795939946982,1125076967322364,38944692859372,1072192224383469,7261362635592175,3012251054715380,2542232219226614,3495939006255609,3146122320683775,4595937714565628,4258152560620032,8953591420596740,8848809114529336,112689943466504,2887328851665666,8161105389613582,8962334275654159,5444628649513488,7036970614026769,5343334980162067,5573319546597911,5462225124831768,2865796079792901,4034013203975600,3325616244748836,7232368480432677,3610944219771432,2202274232832553,8720250692620848,5811892572885768,3371438784852533,2290771933975094,1414579761876404,8808125217370817,219780142860384,5776611323699979,4415427133159326,9171674738889287,6150567690441288,1711559964660309,1815998509388374,1175419368798308,7167532212687463,4599885673656937,1803952970707562,2962671501521518,6419029363971956,1434098254746229,8582871339889270,6715004259062392,8145297369223808,4616257466421893,2967051048358535,1170420138553992,732129449136780,7493032750387853,7347723244958351,8539974278001298,3712634922414740,57231830595694,6462116776391319,3956503741543064,6056579740363701,1768806804165274,3466739238942831,3630274537722524,2992520815858334,1519567093413849,4779923955282594,8321451805651619,7870271643709603,7128787265001585,2641446186169002,4418841714832043,6989659738305196,2205009247654573,3111640878068399,5662768132174512,5857213462852277,8820397565891254,1163324509926071,3920154502542013,8473931818209982,3681479835374368,1574832490156738,4401502634136261,4092818217937015,994578889233103,4610500681061072,3891872860533469,8071912422306527,1104295873827553,612294685070051,4351786473960164,6499182639411942,5559671800492778,5272638943179499,4129222313964271,2089173559161588,6754898400342774,93622242775801,1251945361330940,3665959501714181,1414229084590856,6151780526527240,293197380260623,6486167796134678,4808242560291608,973330686425220,7626604466909980,684961279750944,8160040082756389,6689750815314727,4860214202487595,2156660550398773,8563804367582007,1022727071953720,1279208482377183,127556624216895,389590461043522,7919922163569481,498282908005197,2778497530753870,7014191870251832,3304013972721123,1460124815176533,3651847809512279,7285725721129819,9134739151934300,2303162692629343,526373430113120,1413332024963937,4931975861674811,3119149089682277,4398870687273830,5498426366833516,7439601055279250,7466701016453999,997915986342769,3446185040614258,4564318153347955,3660607433455392,8914289251052920,1532769240063467,3020939970857110,1123006120850310,6699757156594569,3567875960984464,6144023067366294,8245048877359160,2766562304422808,4475910107001754,5454054402625007,3489603939021726,5009394812605344,528869140861860,4907645346468777,495514174182315,1503091523195823,4223964913169328,2106807699698611,7897214063276981,8065478195835831,3779628599849914,2056490771523743,3626152839459773,6635883156460479,9197850466481088,7116343049966531,3376690827932612,8015055994876871,1347296286249928,4582522404033483,2996752542705826,3956232647291858,9175963281994707,6913729606755150,1636141429674969,4623723417138138,2927053954289146,4133585495897058,4082271331275749,3442382488466406,697710718071783,1217161478583272,1922057205806057,3167156188533739,6569942555898860,4633623387526130,5030581391201268,3400128733656053,458260056003575,664342514471930,2792593701729280,5155280757437444,231810351773868,3734584505193482,1599546010858507,3084867475362830,8115933458568207,2256581195871254,3722270033433629,5564260641133599,7190827845342240,3549023212622883,8576420863480874,7672118368367659,6563149567547570,4249646128722991,3586518429791286,2485865643409137,6678253086372929,7791934957368389,3019157699597384,425442885127692,3923851232468014,6664517959480396,1375925846414413,8837175658454352,3289880478905436,752498008318821,8192794059707489,5793762242311269,2819953136317544,4489740473169004,8887087534036078,2709598337381487,488618024656403,8692980828918901,6301203229652086,2012492181558398,5673315315233927,4915795362526345,7231321563518091,4427310156518540,7919067382199440,1860109418755217,3045171228406931,3522660483182243,7636640586325529,1452087854601369,2544630592648346,7545881873847452,3946653652276383,2037322152350882,4444028189324146,5449303165932722,425815215387827,7397978773681333,3342111084688566,3516082560931002,3588691627816123,6375490245571772,4486227304912063,81576375366849,6290633095345347,1334714707760324,5862039582233801,1014700549936339,3531633234449620,3746900339029208,2097088270341338,983138379224285,3142378797438176,3071474226753650,2722703133816038,5836650649449703,6286716645430504,3315841715393770,18167979873516,9139999420290289,3031542745543922,5796002163908454,3808325929940216,5635224305977556,7938589493785851,8396560759166205,2883165925201150,7494503133304063,6207910560691462,2187069125506312,7391090991256841,6031950105384203,8703677899240716,82218923685133,2099739013543183,7286466826425619,1691799915451674,417147614713115,576959386383647,7825867653264674,6814872374056227,3035117409629479,6277605928600455,2004441807009073,8609425202017586,4347780374680886,917729876186424,2410769464374589,3382795524077650,8818565180205465,6434119085651268,7383944062571845,1665681558436603,2563423362594123,2106453874898257,8918459478160724,5938986783208790,3346490806850903,5873083837248863,1333781625091427,3727981239465316,8438201484293477,2219701148882280,5350158178524733,5779896302835061,8952362163265966,5597350709040507,9074901438322045,2383339093063039,1457883791668608,5002084041225603,7366559961929095,1948775618816236,6460334208914828,867187290723725,7905476150555903,8675705451754897,7175629398009978,4911879003788698,5760652058121634,8135470591251875,5336772156954021,1544851771053478,6259957692224935,770361571605417,5981183714973105,8091284484986291,3286281783375284,2610256261641657,5907721308526012,7396497262982590,374939487753663,2056118095893952,2032090358617538,7736017518826948,7692531463968204,2106426286061006,3538448689608144,4403439424198097,2060451988837693,225388300129751,1118919509873572,8062705349096922,5149820327123194,2571113123198430,5812581517989344,1132721671706085,2640024534572625,5782170661295593,5962552267748844,73298064037360,2516238706046452,398310823679477,6499944924829174,3610823516730871,2635030476666361,1955880948708864,7542317996865025,3185927464424964,5098137960343809,6750669444616,7346558908978697,7482126185043466,2893360978933259,2025499593569807,5685287674246673,9123590219203549,653665909200404,4611770865784341,1319447938512407,8889378064365081,1338227173750156,5461570675110831,3860912070645280,2535461160252962,3454717891638822,1922730425030184,2722366401648175,467892592834097,6068712295183922,2219173644580410,7625852345243197,8170840912385603,6665621347038788,4574319834904136,4508128677033545,4210559391774283,5286586417845836,4980238443705937,1763171709474389,4993015225587287,3524812428244569,5540247262795355,5475786269816412,7042848859248807,5335944504276575,4771971823859299,7718054595090024,6298133927999085,2392674659333748,5054686657812085,1084438770177654,2534901000330857,8573656790832765,8792473929045630,7279552139466373,4308747764323974,6894444254426764,8712959461430527,7402096067139216,3393502683698833,6912348951844499,1796515677902490,1984467514226336,4777062056883874,3949902499272355,2112209284847268,4106987601041062,1428655242688169,9217824021345962,6593285984335531,6894405698631346,3254386119900787,123844854745374,8661802577426102,5508531576149694,6645246907496128,7164148477686731,5745998517991113,7822577828078606,5097577509746380,333315345749709,2761553576589006,6706002912229072,5627955547469523,4518948862375644,8663463893432029,8374970217903839,5342498296592097,7072269317289698,8708704742784635,2491891958896359,7544877904918249,412057239123693,5292503418181360,7543986164143859,4756486785963764,5982609639675638,7031195118540537,321649286756095,2472735681105536,4577644200769285,95230524110599,538844555384585,1567950845187852,9119306833139470,8840013661312784,4036343918524177,8585118211585813,7651178641979158,1966488764749593,470136606357274,7125486559508255,4610654439716640,1911740624718128,8756569683695394,1937522523141923,1507139761256229,3931820474360796,3474449206933293,2944871848548143,2433320763430709,2126491452462903,3630802233145146,3287783507695425,616073701816132,2281230854305607,4573182761981771,8265977844660046,5929460180255715,5046639617939287,1780349621336831,3319956280286863,8476090575889120,963347648943077,3331821507909472,515407222536033,1496029975893859,1301625062963047,6472623852926836,8145135744587637,2471180581738361,8568705898076027,6762457369270142,5078280280053632,8592567512242496,6575969954837483,7556323935042915,7415050992736140,1488414045607821,6931162010466190,4219829976831890,1808654217517379,2639151638042519,2865383180880196,701183960192923,7308165377152926,4369958886356897,2239118965864354,8947182747637972,868795153758119,548441149110184,6815610474690479,3112326260889520,1452729857734580,2661682081519945,6927827506517946,6631929890518971,7494116514486205,1283516715333567,8469088542644161,156187794184130,8954804579596227,1227149343545676,1735399723284427,8201346011674572,1620082975471565,6660068174968785,3340407377460899,1704197707700182,5225860478760920,5504634780645337,5240254822930395,457388277635037,4739163380455390,7740931244046311,2232512539588584,9174325191628777,7785818845083628,4878614724106107,8831846701774830,1609426356331595,747894922852339,957003074828276,3838050793789432,9042006568499193,7195708462798844,7758205136500733,522473967646721,8778459700484098,4517893588741803,768932913887240,2088132604057611,2038629224232972,3214687825999888,7937702850557969,4426522132437651,6414644178204693,9087866203935748,9048156059531291,1959742962161693,1314132966381598,7926961508939807,1754217648559325,815885154555941,4412918034044966,2062630081689639,1164927207787876,7788829768087419,116052901550125,152911066380336,6431382032717874,293119894624309,1055261461665848,8772369661556794,4893500411145909,7869140977768519,1711515062933581,9124164394327736,1128572363282514,6553233780392974,6093005025163351,4884198375639396,549169097701470,1120997737338977,5654388748335203,6584666038818916,9208199964260458,5938047671007342,7399717558491247,8210834442639472,2879106926631272,4776564682618994,8460722130425971,4007274981873782,8002548578629752,8251919393273977,8191748808710276,8871671611218055,4992079541672073,6232197225683082,2350445387970699,6476137677019280,6231719924354755,6501533355268245,3906713449175201,4122894574639268,1596849812461734,8190691097565351,8492006196615340,3080270321094601,2248497366841522,3195267447634101,8825014103886936,420389494634690,7927302841964739,7692707819837636,3501142908901573,3821020300261575,8394779836053706,8001376102332619,8974626151708876,770287647226061,350985407748303,2143315456054307,1646863816390868,3998826525448406,7830687503554775,8706667605022940,5463540346075363,2799583726606570,2209664644110575,4506159338821874,3068340456347892,2703593011329269,717593944848630,7578476876714414,4519068845578489,7708623122987258,1594078310627580,642525847755006,8593752967919871,5418276734563371,350142890776836,7478434787653901,9083429395101966,8721264824113683,6534629871065368,6487714347718937,3141933895358746,2115691886702776,2127064172099874,1854681839180071,915629205327581,6723820441893169,8579182159288629,8914219331320119,8428262461446460,3119947745163584,1619858060085461,2285499849242947,5290726255065415,7407095580449097,2439759471360331,4583487292823884,6944345694452045,8158301213964622,1126925796759887,410276560877907,6320822548896094,8918976197638499,7276271800613224,2449073115896173,8503460378122608,7596074620205426,8028836699830646,2499628663101816,1304279782603131,7825572151843196,2827663444001275,1301361018976652,7710367021037972,1385528932006295,3809917820947381,86926956460442,4197050424141179,1350630000810400,7817352435612067,8171802440601329,9049896850626986,5981463554079148,1684421656500654,1187300967070129,6639652610562486,8865905920473530,395152320059837,1663786876049857,1350927689390530,4147732837194179,6773907097680326,767240157354440,4715837155785167,6117415709833681,1808207500458403,4080921666599381,6092785465113048,7559261243761743,1919004856941020,768706371877341,8023909720095199,6773059095517666,6392245722749414,3274824176196007,4726879013476844,3574145518025200,5273831735187953,974841210132978,9151266104386643,2451550678366708,3137359812311541,9220975246424570,8281914095229440,951172650228226,6306078384536067,4900533884254728,2497450216798729,836991790299664,6472549264275985,3855158111074834,2542398339414547,2341908671601070,525132645849623,1710692513389082,6705255251559514,4018994255543827,8737287675689506,7099001332439587,7743629385767026,2833669872900646,6625270801062441,331176812821036,5400325400590893,538932282554929,5873398565952051,911046073104953,4803822004558396,6483375418333757,3715069469030975,3315883143051841,900373446408775,3733320643828296,5193840617658953,5092570583898700,3388873341349645,6446849040497243,3276777283311783,3317805653059781,6143974433036902,8207175001463400,2365583855737451,9167785528466032,8080625872362098,8726866873258512,1439636094089847,6771875087047289,8367428528298618,7872390286494107,6421134571988074,3170103479696004,7189924345633413,4452830817311366,8127224686115466,7449945463836439,2430313273760397,3435869138664081,1602090780596882,5636637306116755,4112130125445780,7492492278727790,4726164489788055,7945191629683353,6129659880465915,7217097720699552,8550050003925666,8322439309761188,1957744427653801,3975096546327210,5343279784729261,2569565025278638,6647921941338800,2329996353051080,86781693811380,3475305953417917,4880573662804676,3163396522040007,5510408037587657,2453153650309834,767211772394187,9017571692116693,3254714519812824,1814327307401945,3444523876235727,8317624592693980,4478954747247327,4248869109308129,6987868773366500,3139745478540006,309280261757393,6191231183076076,8542713275128557,8793532141145246,797784913418993,8848707957142164,1047266364889844,2119800680078069,439686724035711,7637878789061375,8863945155435266,8443606911392515,878581545024260,5698016340556549,7719688179653383,3713505754684169,8277117197720334,7654618898414351,688857760815576,2164775719426837,8533770552720151,4234622732745496,3644063498959642,1703022327651099,4931056176790302,1774051934812960,1173331193027361,7121851362952371,2278481397447462,4154492290103772,7987851425092743,8711337465699119,5278278967294769,3108881032846132,7983214627832387,2757075466089609,8469470897609532,2599965055633888,3510317672037189,2179026723937095,7457974098115401,463107762428753,2939651989101394,5625333525969748,4227582768054073,7555335044078425,6670075759254364,973506476858206,4869065663200096,369693272980323,6888129138407910,6180030363310951,1938836693826408,8416728138808169,4938618203323243,618653741742956,4276014529919854,7629971853179760,3303194485660529,2094902909762418,3665102318287731,1582590678842230,2803315530677111,4624086055541626,3521803124579199,515579824708484,8446451833723781,3338421010963339,4090813367335820,6432995952573326,5392295383345382,121002465500053,6534307980450710,6282737744327727,7755365348785049,2153246542437276,5246481998427290,5109221252610974,8071539184212895,5881634848725920,2534295674756002,2060080578730919,8292292537156764,1400390480165804,3678099080960948,3643761186020279,1600213761653689,1292919470757023,5646678481275381,6292439226440640,6223412351130561,5587506034342850,6586307490692035,358473280256964,3730189337222088,1867103791733711,5593386234223568,4968552408521685,477481316929479,8621513366379485,229874513959902,2238565374000095,8351815093722081,1072969569705497,1626942797028337,3081263515655156,6575668520827899,5064424921758716,7525086157945863,4071088523747159,6899738511006732,3363839241746946,2675353090997263,1457973443714066,5443507496401942,6073295224536087,1566494033992729,4171655843126300,7702360096963614,4914192471727137,5913838551104547,1607735175325209,6738730097179688,3367825504107561,775097198722090,7365240797936683,4460232733572142,4587518308858927,177687272463410,5859569370692659,1347657478266718,4201720628673590,8327179455678985,325483740331071,3867195148819525,8530597193650208,2525008318594122,878621068868684,3642783437614946,4280009070132303,8272416977837140,6117155265846357,3925765029346390,1690001628278628,3671548264356959,2463439179701344,5552698471152738,8458395690450020,8117924804328549,7288160548707436,1951381813728561,4851835608235119,2350260330847518,5923026172075123,3806032585440005,8028114563726454,5090647711988858,2929472202251387,8521988104649852,8973035939667069,5905527842995327,1270707796376704,2874397998775425,6360036057545868,5732097546108048,2023941530811538,2810095839394967,1905596520733848,3155280017325209,4300965005933725,2301866220756127,1736961447255204,6793511344602278,708517456027023,4984939422101362,1931613158976199,6661288514354352,1702576026270900,281098509434039,255365917994868,8877525713165498,5385494532250812,870372721704126,2822464356949184,1315983588875457,369961937394882,1330873600654532,1033243499261814,6864175163030729,1106243532963703,2677296950549709,108768446815438,3948910352350418,1172880262479067,7802098549505249,3206755058433255,383001052773614,4294599135034609,7917431083670770,6279319093378292,8350236533341429,3329919849708801,7923522177221846,6040645019622662,4966386224413959,151604951080200,8963815492910348,1487408262970638,6925355067628077,7898359963718872,4490813174086938,5809994036272414,7994012378914081,6044628810202405,3388247578664233,4618987839872302,1731533595350237,1991641287933236,589017798147381,2036450656804745,6511227572993337,2400027038367035,4418201104178492,6563497508339005,4114151457283398,5749850300611916,4490979010641231,3662551854857552,4710865792048465,8191281431051602,4807849001098586,684710980111931,7788092865404259,1774676477099364,4270382137357542,5586894535211580,7488003554565486,5437179572218429,5370630750100850,8353222196944244,6612417208851829,3559068630367606,2794476127477111,4797545863544184,8716026488184188,720912216945898,4666927235931523,4763107520511364,1773177145560892,8006478343234796,2337569086709132,7328402096430478,1005499958553697,4252627590804701,3283813283097155,8008945596489111,8847960710487450,4358210042203044,4577749042011550,7067699418180165,8357590155216081,3572047760948646,4149392575927538,5364302854782382,8023674323254704,2699947312365470,7690843783354953,5282968409816506,1258755988094395,4482073414576814,201672977661376,3920752714718657,1903958954835394,1166113773911494,5449922316148168,591397988023753,1678799341592011,470122830208930,4005888829726163,4820581278616142,6275669963152854,253584927469476,8155944746188254,4024588280831455,4048084877622753,8403419110374885,5057706507394534,6489219879902698,7526886923853291,6824377287441900,3218516748656110,1319435711806960,3150025912999412,3788032471727607,2752048700130831,3300761524491519,3544889695010730,2520941208586837,4954859540282880,2407474172471894,165747433561933,6417737759276554,3712696423390731,2151167860145679,7279486129118738,5337775236169235,4923515397402680,3997873412890137,2030944719470106,909031945805339,5475853437320734,2118628346289697,2261046430775899,3773262356463141,4874965392055848,4189121079500331,538110141160029,104715137990197,4873599562497593,3850410246012474,5929611502558781,3908454384180798,2434874822884936,3142800250393869,1430341649669713,393388306562643,6406949595446869,5908561705426519,8433953384717913,5545582243405754,8057199831932512,2798918181264993,7965420054019682,8465893623225961,6050413444865642,202444893986411,1066067452124784,1790661133344369,3968369705333835,2158160171291923,838931212218001,3209243829227455,3603344086466174,4733181489954431,8378122970462827,9088455411179144,3631845159657100,1228567952563855,188967618256529,3765214177656468,6607165950449867,8666519262035608,8104519999807136,1700703205113505,7282913010613923,8345218752505116,7945101163870352,6712026775503024,7633434054975148,7583239629668017,6355936803872434,7166411783409609,6871959458758328,4471538169634491,8507280485613249,73982383077266,5594913669807814,4188670759108296,1192504996216522,535807745064760,8385790526388318,7909485395473698,2196537681362640,5954134169747156,5636203873566424,754611378527965,5695157551488740,6881694303159865,1043320601788369,8651979170511484,407348981317354,398120939126511,1830177044037361,1117033736339188,7171149319446264,9026477017194452,7544225423064832,3866991652475174,2935796729732870,2555235895896705,7368553685360393,6649400770977547,2738766824201996,5790511094636302,6338109530652431,8183668364238612,6701806857058948,7603389481189146,8205205259132594,6681514996268828,3373534262484765,150152233705251,5955734782648101,7308235577728807,7258578597721135,4555582034526003,3036946764335753,7433551750168376,2376182864020788,8889948380549087,2548728020148041,479910358064973,4809192694284115,6218494269415254,3280174410407767,6468132566564696,7344459254135667,4391692450856798,8528732399650348,4813572029767522,3855113983090531,6173960036867942,1591905773018985,6437746888638317,5381726873978173,8539031015563123,7806508359061481,5879072987037560,6962710950092666,2972268394151808,5063092626710401,8687500910141419,8126145311930728,4162136510390151,5788005141692297,5678227619760791,5024746433273740,1688606141456270,1799119529623439,1671542591957148,7786385125695379,8915129438027669,5492738839132825,4968664592278600,3052163370704793,81152284852126,232175959389509,7982525289476080,1851780816838562,8387699952582563,654089798942705,248866483355560,7149529422282665,1917117758996394,1355511305723820,4388180585701294,7820276895948720,8011337462103993,5525938977103802,3752608563740604,5566268735299519,1467950130989529,6829428784375115,3102746929831926,7250024624463818,560106146859130,1588736351059920,5522785051475921,8273844608524242,391523199082452,8116788866007033,903218074069014,5948523446353884,8771266293238437,481486387765217,82607309832165,4428997742190566,5895898712940519,2126197790523371,3502006548643821,5217910085623793,5770839182425958,9517329825782,1477201232701804,5298043891497642],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/ea077bf729e6510381278c68ee7c2b07",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001434175.1/GCA_001434175.1_ASM143417v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"AZEJ01000001.1 Lactobacillus plantarum subsp. plantarum ATCC 14917 = JCM 1149 = CGMCC 1.2437 Scaffold1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"ea077bf729e6510381278c68ee7c2b07\",\"mins\":[465725676875780,3450100533985285,4086124525600180,6781849552359435,8611233944848386,8438875727163406,7628174598837592,8699231110578196,4327351838511126,7116561988476932,8522307609386506,7333764576423983,4077945813545014,3812816234672183,143963584716859,8761321524047938,438875752243267,2754181907525700,1616542455921335,1519495033708621,6774211428663374,1410935356690511,6012467339444306,450927787954259,8526106648993806,2826302187700313,5508166164899855,1066473573433436,2165240785156084,7752509891436642,7410292543103675,5978498804424804,550224483934309,6787372128366696,5451920072579772,2322709435580522,2724871456051313,9125671867544298,4244737914695796,4743825007489142,3335042739243028,1157820944310401,8076769415508099,7162593257376450,1495789568925841,279742128922771,4580575601516694,342331039217007,3818603292317722,4234320521183390,7315722589618339,8537825091027108,2871918203687083,1769944949571760,7477187937812659,1207491609075892,6406112248746167,1120932870717625,3184698589098171,2548172613296316,3223488473744713,407412516675777,1613230315360453,5963806841647304,5304601731498186,4960044234064080,8424369309384914,8956488126423252,4890554677805271,2965314495901913,7934610751852763,8220050318299356,8094971976545634,770313515086046,8033607099695327,1212769869459680,6610596919750883,1671681390915812,3693798346359014,9182847644463344,3705417000067314,1546420374745332,2963124271436031,1738257955729664,8609158768279812,6207679812239621,7276474712409473,348197617221900,4386559790440720,5306964926542097,1799393599803669,3659239511335190,368842753605912,2757352870048025,4705973465669914,2152619153976251,3964493808848261,2901846970491173,4565450042130728,2648755174142265,2995219734315323,9206635613602111,3861327440761156,157985625641285,4981634025013574,5807488796356936,2342354023534926,7762328510865749,5390173320327520,5514327156982118,5931198600212839,1487306914648424,856715567595884,199474929684848,5429428795034344,5513618980995444,1914101215330677,9181348334276167,2936231632060792,3123205057651065,437448351527293,998451838701950,5730058713395589,7444024247083400,293596264849802,1884883939942798,3473801961079183,1160739632050578,170190565462419,3626983695692180,4391196018209518,522541647733147,5430959852765598,3778881598620070,1366663995376050,6203176433602997,5415566999949750,1820889096570432,5597842754568635,6245311153756917,6419634681319875,957759624434124,894188905742413,4556299456819668,6948470908191481,4182782896636377,4918050675671514,3724932461404133,3543114583740901,3634233455923687,3461030336705000,8080700126192106,1226597757702635,5492359550489068,7630099796775407,6035649512096241,1093577981509715,7660936142492150,5972121458568618,8240830275428862,8544285033018795,3346157164302857,1717585470595595,7245034061365772,6189559192355343,412430850810397,8042713528222238,8426721756586757,7866663414481440,773253301846562,3719926979220003,1610096971006505,2354953373528619,1579866919588397,5437766673998383,5837552799945265,1083993923236402,5570820251144761,1759268409541181,6683510832951870,4352873847538242,4050721089491523,50348923748303,8593851354238940,6880253713369186,8974848792908366,3676143847039567,5690242133306808,1970105970029140,8613031536450551,8964093560033880,6002935542497380,9209969194148442,7748845305025118,4232625758220895,8509541230699104,7599974066115169,8332462059053667,1623060040163940,5718843190739560,7457835374510700,5525454873393938,5554885944435310,6197281941201523,200496000426613,7767961229939321,537300139098749,7813826180907648,8299732130452928,1731934978196098,3028924542784132,8492077778492481,6380737690276488,3682913240023689,9188225531146890,3852676109137346,9144230331126414,2950025441113539,8725263387452054,2587081527425014,4444496821228189,4972921315533470,4710528095740575,385076568785572,5012412477682343,5287641079018152,6068275007005360,9163836605809329,1478465266487986,9148122495554229,6647770424763067,6113512556774076,1900766840312509,2821585430999743,1817434049962692,287061704057542,8561559466304206,2181187061535439,4602301184172757,5740203326038742,8472424139288697,2721161775095210,9075034509927888,2764801776464610,7676745897370341,2836173851571665,3222884707377898,9077925001663211,4869289813816046,7495405776700143,7425879458063088,3460765075172246,1538707935261433,7229354552460026,5405754897535739,5363257704310912,6126583798854404,1979135744840453,5986042356896519,5556652680094475,7981294842061580,6420743320670992,8039605586927064,2157220325614356,1017719034114840,4123952929276704,2361967943934768,3177985952023330,4924163113673507,6540100050735911,7543222311142184,1133324095677226,913143880512306,4460092653765423,5584521646388016,5010853253042994,4188245618889102,3727336795452218,8573197178473951,1973432351277884,2795788712493888,2095991183000389,1751479835906886,3274874558264135,7852712392439948,5468137680077642,1832608457375188,7306324174681570,1476123004236625,844222345810771,3826106132149077,861350629000022,5015782825923416,5453938179638105,1471658198811483,2887884883534684,349274745406302,8569456825619394,5009806866596705,5885226236158820,3842898602378086,4072424719134865,6632439509320552,807103595901756,5651092926825323,828089723290476,7483088216511341,2269558413132658,8340157222424260,4521301363417973,3518739757470582,6616937201137129,8721228639499128,4328930502017919,7360063579308928,1812977528050562,8122934362354564,6643745221268359,9157113570325386,8877428215346059,8039768166937485,5368994050528146,3145777015268243,4398177643398037,3968206336508822,6740300399473561,109135427183515,6808489940621466,6403147575354181,2147627177259937,7449951381996451,4099531819180964,5876948690572201,1321186438726577,6759607568729013,3148472160138166,4621747650102200,3963406888731466,6356884923655102,5670226147001279,5000834383737794,4703822381284171,9019264220603332,1996846433321925,7518118659326918,29604604359624,6328339757151179,7983632395527117,5695041982355840,6474986537776085,2549155369841622,3778415093646295,2795860413449176,3893459254621147,5820871923549149,5411502182482912,8361373553089408,8729304904020963,1026143179023333,3066213307548647,7968801917658091,2022432280577006,6668412387963887,2349563687654387,578473465046005,6442852245320694,7541864533037665,2271953443030008,5283909069042682,2464529295463253,7346762945054891,5422341393310725,8224470044320776,4392729404568586,377177446835215,400523627869204,9016868555557067,8394973313600373,80674343253064,5188618012251161,8481107989369882,66223534048283,5300841886042970,7438171353801761,2792792280826918,8400473709768573,2669084630856757,4016872715886176,3530934899086394,1957259525915707,5860073108710461,2100043926983743,7064625609610305,7586468755445942,3189701243155527,5924722625999944,6079627469190217,4052708544500811,2855027180676174,1491424636318799,648377583412305,4089777156277331,8289378293642327,6850916270842724,3354977828447322,5978382810002524,9107559873786974,5395133082752095,7041121219417184,932970825901155,4506879073768548,5704912877814630,8564657960002662,2852610680734824,7797950220653673,8143006218986602,3195344882132498,8347676026655856,8245632131322728,8369012381246578,8408274396664955,7221131749926013,5153663373112446,725025033008255,8199935544394166,7526509195782632,4814240236790918,2785664447984776,5846845175444617,7417221136680075,6758119696061581,182270735037584,4846742753215633,4751897300157589,3350123721651350,1783114386961562,4929430135608475,3595280205903005,8604098716902562,4298606692357283,3939567104332964,6885804856345769,4106816870556842,4811850541093746,3553940103706423,3476131456812208,8376027154120904,4181398473451721,502307416614072,9156630818316473,7173044447208015,341319103218876,39600842626237,7463553597141877,1285835050665152,5584270392464577,1842871677801666,3379435911497931,7051282272960740,324869625251014,5525071983338695,1695925591842253,5735926590563533,8454500417397966,993106207221347,6461084655617236,134140724798680,8415621206729946,7989645908055260,272881101788382,3003135082538534,1878342557922536,6875143136425193,8484773792130282,3082653119046891,620582981182701,6994188218418414,7703399450522865,4765067198908814,4285998689588475,693775930852605,2949668864906494,594780856611712,9049171358913796,6294484739527941,1176314826096855,6293147379980504,1687381321311790,270990864999703,610789339567384,7729376715019545,7300827187438874,6802376810669342,1904630069589281,2229902118420319,7775532611457243,7334578284213541,8882774083978534,9166687374406951,4103404424267051,3131357085566256,6838548051354929,9075449376126260,6413313079842104,9035323625997625,8417871676028219,4378116315448637,5135611930649923,4302040772613448,5552798033077577,265327197386058,6216616853296459,913862633132259,3119412210963799,2758697104352600,6144744339563865,5905661708760413,2980212066661730,8670334112113632,6425434349167980,5235274264454510,4308407891129711,7616557728052592,2600381158594792,8699154031472140,6637181702751608,6614445578216833,6469618824361346,3878046663435653,766794533762439,6032972960814472,8671441806787978,4491042424853901,2707913700459922,4391150673618325,1581243814426006,3715252397237655,1700573091046808,21277316220314,7568399829198236,8006561765279134,5434517050824098,7713290921788315,2501875399144868,7303574860191146,8490703224700487,5875734730916082,1909568887952814,6251411663333619,5355146517300661,4986119731602872,5656799258092447,1492385306809791,1006020754814400,712712340813249,375769141835202,2353138094437827,8666580150531526,4301900461618081,4287333440304586,3212443992045003,7692531463968204,465001154196943,8156896011122128,5979537701574097,3176034265744291,7584733510637016,8781817904903076,3707611935565275,4444264222557661,6005776605756325,1643801766802914,6706455349581283,225355393463781,1453570791167463,4959356738623740,7815942548833770,8828943404370272,2340242925131346,7901157300151790,1646360337266162,6715331883173459,3199816342884620,2886635702085113,4289681364182523,7282849444406782,3912129427128661,7202675376145930,3699738028475916,4419251937846797,1997668889564690,3052063583537411,1105301653845525,7268950311368217,7667688810997275,1007707970569757,1237810482374175,474143376893472,4739007164909093,4976511770904102,5714841803232807,356259097081387,4143381574161964,79445210962866,3913746688428304,6524282049480240,4952420398245425,6228667321349585,2633271455364660,403848450418229,3787967082387002,2242137567508063,7943565550302782,1631680726046272,1971735114737217,4983764574045763,771007913903684,5287080312227397,5921512931831393,5915348268361289,448831692289611,1000390879917644,5326095912830541,2116496859141714,1557666817594963,3532274179610200,3546827168548442,8114070789858907,6366748093429341,5693621480220255,8942908537075296,7612048319071841,417778513110627,6597624028624486,394822007858793,4463543177447018,5371931152638909,697690316670576,5380938934109809,6578345257256563,149264714278518,4867009544648297,1320292779873918,7341016439432832,7490362358310529,241907355457156,5466080381019786,7466835930269323,5140174273733570,1535937788253843,2503161119975063,2412195933845144,5648168136311066,5903502712419998,8508866981197471,809354190481056,5235307730667170,4310252460431011,2020048264414888,744999660488988,748057164580525,2416527304951471,2224742673553072,7241287646921672,6690906070587058,7521345416951475,4037798788605622,7846650093274810,3439867722229435,5693166650865340,2574309096924863,3254940608059072,676818000242960,929397956789954,3370961621790185,3222755860805318,4342909556418255,5797833424856788,7451351744202453,4917224016733910,7427214099519192,4787336841221849,488536752043740,2227303133947615,1390195432761057,7642589638039268,4566292716001001,8672423441757933,7032522793830127,1741714292885232,4842755291938534,3067114445559538,8269630084753139,269672526386814,495540549342967,2285438087677688,2578376910042874,418602234672892,207874938177278,7204246700168961,7614047680653061,8391188775712518,4250679007762049,2582861510092553,6477539972941581,7414290049561560,8128838528124691,4179527468648438,7202527629753306,7164037585229599,2635254671210272,7950974537946914,1800893383841571,5199985291716388,9213624498018090,6449645723326252,9012096415340338,5884216175351604,3401158678251319,1742754692024124,253989311383361,8058551704790852,5384457246437749,2250747222402888,1454187545057098,5424010520926028,8681889492509666,310847396570958,7629263726794575,7114525404088145,1842985570633555,7298404643948375,6128567043297119,8686108987692890,2597508406802270,4513513995982688,1442538247956322,2494347119871843,4003251785467750,8533690667865962,8005000129360871,2715225159186284,180237293152109,677938276464494,7377135470479216,4154451267856241,4062369557151506,3715878631065919,3146941995263868,8514031252984771,5881647220254592,8488982132885377,7735471326472513,7831310151609993,676824241039241,1271941590347415,2361657215018898,5640209131440019,6520255556229013,6832503893982873,1700140173567897,7829281549342618,7021709457479580,309168710248350,8251721765697439,7132153888823202,6133900325611431,4447742824511403,5967508344371117,3832901892806460,2289909546219440,3317702221014961,2702684153714612,892715889117116,4971408525391806,6703748055770101,3493192925263808,1258656843237316,1839735030392773,6403750394267592,7593931286772727,1108294028136019,5052814934276047,623170535364560,4933347633196513,265688016091092,8925178306054106,7578669134317532,5259366117668829,278787832072162,2380114042181603,4433924561872869,5463930086741992,8239830723975145,2955115411113964,4839058851489773,5897084736366248,3495739866826323,1552749406914548,7777868860766197,5615900764706806,3282315518015145,5608215693162489,6515457377134588,7916938517747710,2300188660103167,1348274476902402,9038724734601221,3395976472055173,1799250910619660,1202797534672911,1666273661323284,2931352930629658,3969846701111323,4240300587796515,5343963126343717,1709775145023528,7151037248509996,4920080085567154,98637985536048,4285375609772081,3208297183512439,1799852530923573,3026095133952055,7602347072899128,7507072410994751,8388014764775488,6378876550359105,938822513817666,6897871509338183,3629181626107978,5440288569038932,937062505072728,8219950657607776,1640922915981410,8997948388896443,7147430825584740,3702328444344423,3307592930035818,4505209891547243,8889700327610479,5523287616962920,8173589894097016,8423008384514173,6800613266425983,4440378096142464,704193457481858,6961422101125251,4123533351794826,1047639994931340,3361329241532098,4796682228464373,2219983824607380,2657471752648854,540854972608196,4633541832947866,7433947506047131,7055715162155166,9151554564249761,7310530632009891,2377522138986662,4987224921585835,8387427380140205,5549759389688861,5286825063941602,1799894800791731,5485858961619126,1503799380897481,5397152153454776,6487677996144827,6625305574439100,5629547252353213,3422254101283189,1918526509480133,4915452908882118,874676952127689,2219908375050443,3197834300823756,8098001858349261,5268949122619598,1412972442699983,8761566535403896,232454056478934,1317545106794711,743772073711832,8294118054451421,8401637637261534,3767858275768543,8501329490953137,4096101452716258,6386864676075747,6460411099347175,7452940888168680,8207893187807467,976143656900846,8648140945054760,1906484311120115,3609600184428789,5465910443006198,6854398441060604,6106299989674238,4450091245590912,3314734886738179,1225451491932426,3808405245249805,7595560406169870,3899483078842639,1069782122182928,3122596063516945,2628655012243730,4139137924191961,721259093108189,6908083173513499,3514863013361948,2841179727587615,8413223264246049,4851792246851876,3745180925094189,1441704550181168,3880911207729458,5073217556953401,8920689454475580,5047293602788405,4399920863717697,1694339080673602,1696821144090951,6789799973697877,795097438640470,976487222401369,8938274465814874,4155651132101007,2338397129021790,5411644120078688,244221194234209,8973686085959265,7967196333201765,2981445089876369,7209250838468972,1656812092053870,6807079876749876,5907737722653040,1778221331896693,1131509712271734,81299547003256,183107462021524,4633931993381248,6285626425842070,8494896551414150,2277303979338119,144315592190348,2399005465528718,3846044616821135,1872759061342609,912166961944978,654478604708931,2872241453981445,2947726692215190,2833355887720857,7937448349338009,2270789403965167,6582269299562911,7831662490065316,8106715354646952,1755625499351467,4551736088557996,1585720861800877,3724742190281800,5374303656937907,4960371173146356,5389839902173626,2018008420215230,2445173956741567,3185456436431299,8185657051498948,759223318396662,3914464280803783,8286513448729036,2819593670171086,21004091046352,2455219645819346,4124832248547799,5268377839299040,3617380270627297,2145791549839843,3413278884764132,6982889910745576,6631071573449193,528910276479466,1243106704574955,5755099709737452,5293114246441454,8498509413711614,1581829579610614,2630257915865594,8305029875963096,8732475685566974,7775478289435136,2681321440356870,6563434656139784,7796210139482638,7657104661482000,240051667393042,866092467304979,707051643988502,3826603224349211,2097435706493469,951049739041311,5326353994040158,2132134884571054,4578565885798952,7957211415235115,6344202901125676,702473201162801,170621579196980,6052177635363382,5185718998903352,3388096904460857,3169246685375035,5645102354023520,3956712698124866,5182424508475973,3759075310774856,5816723517004362,9097344461347403,216365813347427,3738916679752276,2770473169635928,4978688119921241,889121267903070,205502023273057,5879822463261282,5650737794525795,2431166054406756,8887364653615721,6970616702118506,943453398895213,6388303207111279,5704247871265896,424714881383026,3682163216169587,8952574828368758,3014285230459510,840550316317303,8893198836456056,7128930730171001,5741748813113981,989619804977790,1215688190753407,4179482402331270,3321637086255751,222495034850412,8875112019880586,1778086518774413,2246834432371343,1197938978368148,8848169110609007,7173550784932508,9213762155117213,9185981712317088,8194279002503843,2590181033872038,6394007407970984,6403489757808166,6901042392418988,6858805396204206,4015941883996852,5967004120054453,5052090036726455,31224209885882,259711660800700,3643965614758590,2133407549160130,2534168466995908,5474469072407237,5505614081227463,3035091928611529,4551345779821261,670127836113615,8285018820020944,206631725013713,9037193721195219,1244750360165076,2910021496146649,3777384135707354,643547613911781,2840044181039846,436496564538088,5637972772965097,7975486723517166,7644087935216368,2323824420982568,6285037227956978,5467567196146420,3534412419345141,2152358650484516,6501864475400952,2318628968948180,1582742748609274,1977971428309758,6164453466389249,8143297266257025,3086525772316460,3901693526256394,6118428418083599,5074412491332370,2331266520881940,6519408400874264,7800797453818649,8212249672888794,1739023998782239,8670924075458353,9149436985580328,3772086833744681,2582213073922858,454423986547499,8060031406672684,2372502831233838,7834662978591537,338162337287987,3469073031768885,4801299293349001,7699175139289913,762965627415356,3529586950196030,5420210359962080,2741809489514724,9156350744562505,1803862815083339,6313631764126540,1125672236133197,204193916644175,2710571303127888,2635061411994450,6281370092792659,2770613934209876,8989718219104057,1465937057545048,5608427961740121,6223356731099994,4076383762307932,7285296147176287,7139769744051044,6963596962192230,5436907053637874,7756490152186344,499856608893813,493001136774011,5936043831991164,5580966012819946,211265048300414,2143702146476928,7771693616044935,5911010829101960,2891675031042959,8662392502696849,2360827651423122,7932838869691286,4413039643642775,7827402904529817,3375211152428997,8904772285354479,2152659567664031,7243835514964898,2535969092856740,7983500123466661,7029043610786727,1986760227834794,4403334139808683,3989480769006511,5995925855587250,6575231535497715,6409900295055466,3261994198408123,8268337828837194,5782256402160575,3945596613139393,4955889579809731,3177601155156933,8914543688342689,5097227559017417,5597390060075980,7627550004665294,8365979571874770,1243310671410339,5544837205847000,4446742899964890,8544583668337630,5749436525845471,6824261405051872,1764823948471267,2134079923874788,6406409660942161,8991569615288828,6593509321694186,8677074853190635,8301695513201647,8028026126310384,1716702558668371,821612063053651,604432093740023,9222792254201415,5922250574769152,4667362232720387,2561434265489238,1225649621257388,2942302103612426,8162690868575243,1380808860560401,1622587674713107,9217843462114329,2225542127987738,8230766298528943,8145475318096478,7710442506476573,1018519452498974,5136751404387359,2222712235584552,5482813878377516,1688846679043118,7839796239629360,846111173000246,4433482431593527,535838519585851,3352088069086269,2327128480455745,993881596243010,5933147294188043,6462361230449732,7532895015668807,1598068271482722,396368597322834,8114057468828765,225105956346977,5409278371109986,3990939359292520,4342019448863850,5060371099380844,8147378484259949,4884884262980797,5589550220205173,6388816155167863,3308991125544057,1149829841808506,1099847208840316,8234827766848637,8199337927974015,5169741095599232,6891078367247552,8314408887393410,116136184237187,832358273907845,6068914367593607,3787307015356268,3266383871458442,2937372017319054,732549476207760,8844265008413847,7969830405203141,666351264251760,1318409927748777,4050433109179562,8987961159249067,7862237578476716,3555317711051951,4946726880918704,2143831310224564,353767665581237,4792752704040119,522068632636603,6346909703908541,4067445116096,625716084576800,8898117141529311,6555586441964744,6280921513778378,2670021902531787,5278387449037,8650199017700558,8014333075018957,1516761960160468,4689657779211477,1589810027576534,1982448239086810,2935368819293403,6097551345781980,4751407237471458,7979594029440228,3030191231892712,6859254596328685,2054709172669679,5125526125664808,6931503107943667,2000076701261047,3301062366121210,2550969769962749,2958375838354688,5620108366126338,3737442613820675,7905308966502273,7990686034316553,6296622503648524,1910349708025103,2384529346096400,328666939350289,2792961681849618,689619334335764,5205394685910293,5342656840879382,4796730122792217,6883272323734818,8059121762307363,2447672612416804,681874030935335,3680119177653554,8964029229088052,1452020913022174,8317531959416713,6682062123388217,3403795911613754,2615716380273979,3335847310931793,8534076069794020,7850901737516358,4284687812451655,7225242748767560,4484915302743370,7870303164034379,3084772706663756,5895895186218210,2437553536429391,8350637884185144,6378799002377555,551722483350870,9057010726703673,8590612328320344,7449812657245530,2865905296522587,1677426930437468,8116583285287997,7158013586877791,2420203270445627,4533011006791016,444616866356585,3679602729848171,8673006099537267,7728132367273333,8442359411461499,1624245226831232,7122727596158337,7135375793372549,8744576440250709,8616495093167785,6986179971911052,788356093386126,7056899878661523,4923530694619835,3702451502411673,8338501604289947,5310620790574493,1472161768902529,2202279056121250,7509430869806506,8812505783509430,5538093516365235,6537468793523636,7518495928663479,5167184239087032,8329102333269919,8757908101418435,4788127311210739,1890124707024330,3341991642181067,8291178336677324,7201130898484685,7204680182734288,8968173592518098,2876879975398867,2473438138441172,1943763400682968,710160721919450,4409369870831067,2095007232167391,530719307320801,349567158648290,8433638133019899,7090695886818792,7805612600991209,5729612901195243,8815088011234796,1819994134035951,8332156240887281,9001160772222889,2001672782015060,6897000479363289,2714570316164604,4988232133058047,1121910953713159,3370624565288457,3544380239789578,1726604353895947,2144848072072716,2255148289601041,4621676391783957,5256996103787097,4955919837003695,1596178222779932,4005126961581610,4548864050163244,3760700988194349,1619889344400946,8135675208207924,4901174854266421,2300123403861558,8282274283722935,5592143752392254,9159375658405439,29127770719499,2469015372922436,3799508871380549,6108245200707142,3037310757539399,3806286011715145,7874258197411691,6708592869026402,2616270432292430,5997626599415376,4775786320050787,1466064479727190,1118150439607900,4783901911268959,4576414803787360,87125808344673,8400318650273378,3092508721479611,3822705625140836,2084358254486801,6056225532706414,2075387730382447,9192550748855930,8324373340915647,1303635675692668,4383301966351998,8945003061847317,4497567911915137,2851477704658568,6261916034305673,127284814342888,8840595289188973,8757295700688528,7554157201141345,4810905553560857,5684998765461145,5948085714288581,1753938806218400,3519803278089891,8617434749510474,2174635566333607,6415333975731888,8038111320181363,3520473234722484,7986276145766069,40317076553398,5221222934662840,7977690035662523,2009058598830709,4642373734629060,45347669757637,3994896341091617,704298474811081,722298575269578,5096831719108301,142302378544848,4328301274021585,752882192029202,936821092277974,4754390366240471,7163687080701657,6798235968962511,7970457810448092,7496010410594013,3066775646555875,8116923022819881,5574508454035174,3244502547570409,4397404124917484,8647653960756979,5309148009979636,6984982399770358,6438545250143991,2711486437465850,2016806375959167,8401332686049022,2419008954089215,8641193387216641,4011699440058114,249452960558852,2614059982216965,6130323287256841,220017101934347,9186378757082271,5261056805273358,6104694074834705,7955592596909842,4912814314807059,5374104412720901,7815620891117558,4548043998252826,8868851876392732,6414596855086884,4150143704407847,4070493695684392,3701209027499996,25550152216364,6919546234773293,7344085364492454,1066776944928733,1723413420527408,4597298588649756,6084869291974450,5792920495750963,8057315653730102,3601279715061561,3848954299494202,1810270324002622,7600091825504067,6012856081162061,6824929927843670,2887602885717847,7540596226588504,2521947739193180,3840280535211870,1400090883622885,8251998023954276,533460091015020,6165176954983741,5537220073324400,459319219820520,2272393880117111,9192753475022643,6537663147646845,7431684046503807,3284582882931438,2640481673813995,5188504639504261,4761626873297985,3928619553202055,560639066886025,1362873558492914,958216978767773,4145771741347744,4350162997338025,501010119868055,8970794977823431,5910066630281206,4835267337650097,457215879716788,197162033091913,8918175320158136,7784654578798521,3941638002032570,6135147766280123,2789710581120959,8703701405491138,2147961334040674,1386254994042827,7409457849393100,7398138318274511,4529154844168144,3976461344432081,3446422954813433,240964332847064,5687459257421788,8190632004526051,6109715103964386,613044445556726,4430613516111850,6035019439734763,75418523693038,7309865005723645,8409058418868208,3887132934027944,7055266931253234,5615653333639155,9165903935561726,5235058469429238,9200053964513274,7384232857157629,6610069897437182],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/ecc266c69b70073c8b0f6682498d0675",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001557755.1/GCA_001557755.1_ASM155775v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"LNRC01000001.1 Photobacterium leiognathi strain CUB1 NODE_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"ecc266c69b70073c8b0f6682498d0675\",\"mins\":[6146811980926977,5557272559988738,418286144200709,8852152155251907,180263636926471,1734974052118536,9006292232818698,5169189769211915,7227593124216941,163098933973006,7211214605553679,3195633054117907,8876883338572207,6673790910018905,3024557288284187,5787785785122844,8860366270602586,7866444137734716,7102784413192224,3504865144915291,1755126035650566,8740306523389990,2184682200104999,9211239629921628,7330211159310343,5927506675884076,5536552721408046,9005919239879529,3586388187013168,4813348312375347,1440171154776116,2471476685348917,6149467193417783,5315546456083124,1483316197507130,7495954747912253,4398547829936194,3305955413422148,510552713470021,9207189431849031,8593203192668172,5076779812417610,2928064277741644,2021484983996493,2195034516635726,8266416967065681,5788655160328274,5026861224382547,2469207324221525,8102825257547622,1118434339725400,3138377958527065,64116333781082,7266348028821882,8055934559024782,3892085948805217,2380399797448804,2776951046361189,5474149901201511,7568894938452072,5616982553833579,2459270107959405,3717490796284605,8086155865276529,5989539277869075,2990783766902121,9196210817532024,618782547353721,4419946025058427,4561539975364732,136469851037822,3919994172008469,8762587495244624,440625194631872,5751296294719618,3321101643554947,7100603920384132,2137319595229317,5106626438631558,8389286767198343,5471255494865033,1760790382284941,2049180501307534,8310564996590035,123720454832275,56294186340500,7224428239863957,3952244204290199,8550687857641498,4385952773365919,6746313285485293,4025720539324578,5633074821574819,2057138443571365,3831808198254759,1720075938517160,2291135538028714,5218937320922482,9118522952126493,1874827897254064,1274517027918001,6826992449806514,7817878931448419,8962604781879479,4695312520143033,7907544438411453,170720365072574,333790982869183,8904992616079552,8730805742665760,7724425433064139,2205385191456964,4579468428255430,4619833701376199,2235346611110089,3538492672188618,2708618655563979,736239697899725,1166374084628687,3469572342984916,329576884342997,6199561927475415,1499949519364315,529548957249757,3626735561211941,4488058130690275,7053358684291300,7757818403283175,8425351524251701,664322296422634,7030027524927724,6100761479961298,5470803057301544,2470067792630003,7952068040130804,8421992536938537,8303654607149780,5843289147851002,8797892192518869,6084962279308144,8666489618329719,684169062056198,5996190626877708,7886767132131598,4186145411006736,6838271516261080,8178701441773614,8837587953753388,4266428604304772,3124327738716443,7974982728630878,1860877392724253,7784265088997236,1363122183393569,8595616751673637,9191623165129001,2004876403953962,5441456171479340,5848211688485167,5096385737318704,6809580631590477,8412510362106590,3530489403679031,1213187818484025,2458034704519484,1615730458509630,6021722919016501,7388000822997669,2363004076917057,4178484676531819,8269953305329127,3581170795123015,1649618740711753,8195348300615499,5894569206351927,4355718728900941,5289232171741519,1009214451962196,5571772053774678,2877679566596153,8332875667616089,654834006643035,3770789534359901,3423658128388446,8163906231112031,1613540216200592,5308754595651940,2329781151034086,1297388472512870,4357960904384872,3694162448030588,7996159546862311,4142357600727405,5867937325056353,1991899752747378,2632033046326801,6863557416905449,495810483454328,3729803229442426,3662736194978171,5829506865200994,6296926228054401,3478824857158020,8875659841040222,3146571585204619,1500472447365517,696740987023759,2614892148785556,8895345551793051,3457996508455322,3390148162835183,7567832505999772,8714408796488093,1173105949295006,1721591402557863,5441366820315561,3092450267042218,4735410667282860,3975960877210019,1238485981209007,1310032833165991,4054982675449928,5492697015022002,8423595299632964,6543026004877753,3363262114828731,822514850042301,9094018553971137,4230923747152322,5467089168851395,4178876900082116,1565804065272261,5995378901787079,8082328079688137,8172379460039116,8036344781185485,7453039369358996,7986857868089422,7047902533607894,5828797247508952,4305106780959194,5867867941828687,5903884182696412,6651763997848314,529332824519134,6819977536480677,5336633048236512,1174246569717729,891991778935268,7133479201386981,9060560024052198,3858224760955367,8482475108225637,8611377468182233,2249243103130093,512128419721711,8121286634845518,984902139417073,2073769108468210,5232277140271603,4395125125464565,35616687895031,2422343953561684,162440591081979,6383703284838908,6319698166186493,1649434193375742,2533157758124545,7680235214291462,7725164362903795,7362809231536648,4195283912139274,7614264575877643,1090180105134604,1821502710186509,345426227474959,8690059486716432,4310515398537745,2730369601315348,6967118841833561,1619041100562970,7659328100679087,3276487308825117,7897958124454430,6851228630708767,293010923668003,4362438098596389,5796834763547174,8495224885031464,1191019868152361,8761250852299068,3990121198850606,3707689634529841,6309357139232179,1987396795658804,6327861522646187,250518010528312,1892393597125178,1554122602603067,1708000279660115,2246684363694654,720708567323199,1036085696340544,5687455927149121,3827710744470082,2252593047351875,8727024440463673,2925921567497313,722246977733194,5509304948792759,6781721485861452,8485020652278541,5192924194247248,4276537514525265,825965869781589,6301762821952086,3253516713875316,3035229566214746,3870948779143771,4847950809145948,6953683458601565,5566366650421854,4540319141636197,2929611662132209,6497216532918484,8223458687469670,8456056635105409,3946185371237880,6899052059701866,7899218752082023,5621369907356268,4185542233903725,1838851431191152,7980279055694611,2226358443573876,6623743220173995,6978648699933302,5076684833993336,2179158596764281,7586678824828086,1653674274447998,2176630378222207,6944850561462379,6107409689086742,5312957322109575,2472393558491784,6361749897263895,1452469814010508,8230658194761154,9110876596826766,3060333719154797,8383957792330957,6213114571041560,9129266286768786,2555629939155603,6312384294285973,4611788460278423,5737320493576857,8310941104753052,4142304763754607,2496550624428700,3035457069683357,4047539101307552,4585972045853346,3099201342591652,698421951832741,590642117145255,76248688039815,3479492090061483,7030702859943754,4908738653762222,6376453111853743,1024647436014256,2741699945521842,5973991599719092,8071078401496883,2494720581692649,3541508644225725,3816552333214399,3585877945127616,3137312528683713,3899598536732107,4257808549249734,1708772416940833,1103636466143944,6147949794140873,6293898450689121,4944914222977739,7956771901741858,8756375123567316,2408982142423765,696946640183417,2580042108486360,8456308369584857,3861154418848474,1672857359410639,4802109178086112,2418922418365153,3013709934748388,8180946171487980,2167905455669990,1850729985917672,5377206917509865,8349234905416487,4961639996515052,6476687721885138,4260753094120175,7388003704398576,6279877174551281,3973710959350515,9110699742483241,2881963348562682,169806949614331,2312273684095742,2064093258613503,7823019647349507,4266308799349508,7876321939636999,7309572489835991,7669799270122252,3027345649533709,8987699025679119,7339679742610199,7977236767673816,8252611199437574,2123995895178003,4150580174045972,362877397431062,4181064441365495,7082118881018812,2866977304970009,1515008313107227,4575808125764380,7921838580047265,841723492999966,1198513534329631,6604291046912800,5987494722564897,2208966255412699,8648682478900005,7752410672749361,6607064398783272,7764546946871140,5746473930203947,8857168935391391,7218445776655152,8389078232150833,3047337213727538,5886079212860211,3541849533241207,7109785028137782,2520743284212536,8642657719558572,1590712426996540,4976380444222271,4373536533254979,2402692077572932,3524499084645190,8554324473126369,6738713268007752,6489152081310537,2855938019574603,8540380920243022,2794776213381967,1170752124814160,6726677355496274,274257797469011,4811136313496404,4407716833829006,1700693605004118,1942495374951264,5507793979360102,7211028805609617,147208471950140,746427952370538,6723818272355179,2439097810699117,3808130256442224,114056120828785,5111317216711539,7207384694784934,1280745951576949,7725478096401270,6175312243319913,7714135880385401,1387599778386810,6647307169158012,7352474453671402,8135460323430036,77870561911681,6673264211408363,7444102750814755,3469086414531393,2568454519702408,8748218989927916,7380861623296151,1539458524697484,8572414380550368,8154943009742307,4973114679978136,133047601656643,8693198551373977,1296411035698074,9104049996739483,2054331781276572,8118610937545629,4575356623934368,8102758320923555,1643917269132198,4476728571569063,626813774951336,1316190350230442,7333230550089725,5115869598061485,2283418042868657,8810524978714099,6188834559562676,8802271641509604,6691006807434167,5827640347706868,989268287140795,2174073289397180,6537186147324863,4091397685068736,6094719798924225,4038892790555594,5300724761628834,7498644608852943,5873735104549840,2592267183922680,7549127350473363,3552620959163349,7668807108256728,6798402207366627,608087366743007,6023213884322785,1648915994088418,4609589336753125,4013928396940264,994562049733609,6514043881141227,7795370493801454,2068785581822959,2156629082997744,4254578028962801,1134412617090034,6149806351098867,8130463951623157,1138195041006583,8365329524057080,614322517637972,8985737770402810,2538882706621436,6863060740817066,7203200904700757,1220387659250518,4755357518373895,6807033663829000,4653418762994697,752678283109387,5661914731791373,2718691786413071,7981626242532368,7965502913410066,2005837373490198,4964442465088535,6033977063851035,7945475029333021,9194145552067635,9187673733235748,4629143290053669,354467931046065,5660318261711914,7200973560942087,7595166828321496,8888132176150706,8550034983172957,3669828795401264,5962142719427633,2659970059838514,4204131448439861,6338130343572536,8359164583601210,374187450360891,718780544365631,5005121448145760,7327681484570123,5154230133257286,3526698652009544,522945845589065,7314072683897932,5874550211871821,834015149708370,3683844980380755,2066388730818959,2992203107935317,6374193608680535,4950441125225567,9081684991202762,1075633442415714,8146002642954427,6363276578669668,8941857198330176,7699772156965990,5333571514531345,5664173759931497,8051573389808748,9079881593104795,7144639725028201,1593231055747866,4017899233739892,7011007445721278,1781740607853687,5892850926617720,7849438064484586,2460875105563770,6588154664665279,3413141841020029,4432153807975553,7848160032998530,3311028374925150,8956272227345942,5546831071741063,5341068292887689,4363481130149002,6103027820944739,4069252571075437,8738803777082512,7827434447174764,2686885309689369,8465720817837208,7410916203339371,7474401986213020,7736148379251870,4342030733554848,5156695001220257,2396145629004962,6671472307094691,2244345985131687,7214663659291818,4022179251966151,2535605376623793,6555182278337715,6574356692681909,4630853252801718,6223207543724901,862392377599161,1880329980821023,8362914733487293,6977629682091198,3011801727517888,5517215636170884,3208150770476227,525254150339446,4108631426155719,6220802224256200,7557085549390028,8021956780569804,5007714104493261,2587507132855502,6762313260246223,7483840034129104,4061333073648504,471157655561426,4131224276767955,5221564506076372,3991437602473173,6397886604485848,2049929112761563,3383983172269276,1031036866225373,5865661052528091,1422602201164949,474674948252898,6262614673491172,6802493436395046,2662788163089640,5069680660571369,1093635617510641,976696410948851,690602673640692,2966952742872310,2094979603341107,7852251632342268,4333510701688061,4181711831192831,1375390991746304,3250301753664770,4239864002282755,7993986978395397,1435368926070022,5976689935553799,7314527077056031,8256434242958603,1175033620948236,2265065456030994,1742236080757635,4773653039547669,2499723371971862,8371815566190727,2372370376025374,6512190198125855,7791687155578144,7529583345804578,2656262311784667,4722228156871973,2091765696541990,1073788739056937,8393006300525866,1828449426777020,2418163863624251,1200059505096242,4666032656037166,712940855310557,6004375519998856,4387952194622770,2266587550111027,5579461868545332,7331527216878901,1634253762774327,2668118589318459,5286882254734654,6456069564839231,5351712484048923,2858550446572866,6422658008372547,8052712180827461,7097525884306758,6308759595615559,6663402663390092,7287659645494604,3660596510685410,7789119958586702,631482691758989,1437454790403409,8587813214758227,5880167368942932,5052806987502934,3962883686479191,6100480179438937,249593711039835,6175136263619932,2841425018516830,3055211719845216,2573553796334945,814568331978071,645246129608035,7862844990084452,2563095683630439,713353096111465,4691440424584555,2032239417259372,6031567635903853,7126447830107504,178166901020017,4065153694193010,5520072831731006,4970339126031737,5489022897505659,2153549430870250,2129344257934720,7657281108749888,2425902737511810,7378729117410481,8068347678139818,3021817595442568,8462133493204389,3510560447161738,3971189389432203,4144435351270796,2627461363721613,3523948650718606,8183711737688301,7937994327820526,366415771489687,728019185358232,9077149977744794,6324853515982235,4685408726640028,4929406098138010,5662028576794014,3659404925339039,3054451575838112,1190262845724067,6303379729917510,8762179573401001,67863595734442,5713244226119084,697594523608493,8287341250954673,3081521891059122,5231868709023987,4358735493850549,514046049981878,1042612250256823,5821596123417555,6164115845885979,5233613766460864,7809345885570497,6032185695495618,1897585535817155,7768452529740279,5877230028309960,6577603455432137,7142174612633034,3313909973919182,4171728465221071,4219451198158288,3381875221816787,131956987016705,1788433457743317,6167982411560407,1158956545906136,4171073645942233,3808639428203995,6822116860561658,4655742103328222,2754357958718943,617256781026784,3708789287011920,3239521529011413,8378522865903075,529932712379876,5420886798105510,2159129892214247,627635881077645,4896457944479209,5944211699095018,3110060575091623,7241696777471570,534220152813038,3573013658254541,769820876273235,3171834308609524,733901148833270,7637776176846327,4680797227226617,4439984383243771,3068069228344234,5814194380641792,133144695137793,5165941657224709,933047405553161,8857446698266753,8592478604952493,6464032241505808,4888138742224401,1564266764113427,3558091932210709,3230513433413142,6202695820641815,3018949069825560,8208225598957082,4036125782750751,7216048915468762,8763942331600475,7973571902595334,3556739785963046,2693991648450087,8110057585204828,1160696021972522,2396263118589949,1759787792270893,5683924223608370,6397310524175923,7215108528131678,2819132373726778,4035077399565883,3256660767901244,3609502482052669,591401376450110,2132530624583232,7234238675863105,7958617515996738,4437046025283140,5355483785214902,1451850391512646,5819730354591304,2358997317619298,395704811177551,3017007222072912,2316963674891857,6516940391204434,2185000328742483,8107667610900052,8125338290595922,4093375402456665,3657366884525658,2905235888088667,4216559031809630,6534988533597791,8572158492199482,5954294745138787,2836263483213413,9045579569189137,3365208261932649,3963192987293290,1499309963052651,2185977080776300,3372449973869,3856788914898543,3576411999585904,5430826588022387,8340641028695669,1287450836672081,2811673784690295,8105180516177528,6555429091660735,7935574864397948,986936466638462,1904016245560960,6290668624135809,4059760037353090,4531243003201155,7196860939001205,8920020951246469,3246495975810696,7737629332732780,8139966169872010,9118025831899415,142470465296014,370048810649236,2347269934360144,87593835083417,5914424931608218,5117397275834011,1393502281494270,1641916493706909,5157429392225953,4764549753164059,4223518978487974,3860393143051943,8246416696225222,8505096851590197,7688308258163919,6172886614880541,3941413165487792,1428636383311475,5416822772598452,876148389824183,4499691605137081,8154402984151327,3647975031821821,6594898573848181,8048213369562816,6315410280583869,5865443247728324,7146605208571430,4552260159293128,372944392177354,649378640672460,6694102937839906,5740758569797327,1462597615675092,3352590930826966,8586555292892850,2018380831377113,4983103905183450,5366690076169948,7257948808998522,2552962136102622,3398120536610532,1754892564412134,6417426707805928,8666835061745276,386408139953898,4314622173615852,4667521368766760,1397038940157682,511523383842547,5518202770216692,938287135512309,1432770887276280,2578376910042874,4193448359810813,1663745256125639,7928395870623360,2318079568369412,4627854066374405,6749828117448454,1715732559107847,5325519507314440,7731924414801674,8835022890612491,6554412088928014,2237494031902479,7264294543149131,1133377779308311,5807607384512280,3564304583821081,38566594062107,7811548549023516,7723059688097565,6392521804936991,3455865898604322,437525671001144,8841091236042536,223901267629865,312946857252651,874530902492974,6575355646101296,3887453695014707,6351914651020254,3203250906560746,5566082263136058,5295607990076383,522590759692092,7238649193215805,550436233480501,1722433044318016,1364363997849409,7519138556740805,2207292325128003,3147151908169540,7051672922436894,6557592926766923,8512540640928738,5892995715073871,679463407945553,7769288942962318,1408832185227094,5838749435169081,1562931346675547,6782278256158557,949436105951071,442838742595425,7903380809185595,3807065140381540,941256824022885,1053976933193574,3930799437018983,8516149577467753,5545937854506861,7861985604482926,627380520191855,8300557400090480,6860708995766131,5431853845063540,7804609701446957,3214400165006313,3119075466921848,3820506764343161,7049415691773819,1215620530804605,7091023193888641,5141331513149314,8660388053296107,2674323423152004,4314500468479879,3656895495616394,5451891751885122,6106443589670798,3855821738129295,1011876547381141,4601220461676438,4731674491639703,6241045474002512,8457213692670771,5417963551819674,1363806557430767,7837375179560745,716988546557854,6934557982664610,4926975882532771,7846213801188921,4012460266337265,6980200074927281,7666944827333830,7460633979127453,6164620170746184,332319943919538,66159013124019,2573553694484405,2287715400370102,8193248298828105,6871626985177631,188736896366387,5178740017182652,7695067309967293,2430148768786366,8087786187986879,6062632808273859,8129654030051681,6023682803312586,5630171119023095,2815523694532556,3330220812986317,1453079705114575,2671532341721040,4310727583840210,6698878367254483,6817813016564729,3117142295341018,7843830692716197,6926968527247328,8652489998497764,8707623421965223,5498593157425489,4007797897798652,3519778301691885,3633331797895152,7264657088722933,5132142720550902,3858194442604884,1117699055732730,8631584906150911,4663464272848892,4249405974202370,1627953312372741,1272587128010758,4868297665247242,6860352696592885,6489360643860493,8715283099031479,5117025737082896,5351481718532113,5404730070256643,216827444709396,939478095345685,6778257243468898,8639011194812440,7026664410773530,7561386909853723,4886673338829146,4389261989664799,5322520919820320,5636275286333473,5241394472610139,9081280720293553,2289887414429736,8299813739100201,6364852745378823,6296830443232946,4263313528801328,3547958513010737,9178429391014467,8577410905444019,1512284902557749,8188176643185641,4175949917504521,2644928019163193,2616640623720508,2827418583197757,9186876957067673,9049263050074464,3864202364127300,5575645215086661,1110022105897030,4490418736781383,2831282436089928,8963106844818444,4598732093724746,2576280031635531,5118347810637901,6465297389221966,4861403418347599,8417839400687697,7200862861498450,7843582888532051,4557340812671060,433775943018581,6665421143412939,5468796610005079,5327885003589721,8599410020005978,7550426997774428,8205935307724251,7585738572733073,6064099170703456,6842091822475361,998314784176226,1636355427344059,913538872133990,5070621131958374,459372356909161,8544127786297450,6227301849704558,2824891241265263,8312852940486768,336005864786033,1143294357866610,2794414498269301,1420738926405750,3751385445116023,2316273928996985,9055478319384698,8364197054686911,2234563069077628,6872407591135357,402293095594111,1638349310249092,3885855823059079,5634737431167568,5037265298946186,7946588240388808,5148069083588749,1630468470012048,3981233456720017,8292102332598418,5874503335356782,4891088795965591,1707954789062808,8047844651718340,8399296386182410,3160429837158556,6454318483576989,8842253941987486,2669614117251231,4050493348923553,6710326045788323,3371755642874020,1734048320731303,4631336997542056,703558547142825,4037472886458538,6662562625782130,1734096110520497,6212109934101270,3725595457468595,4547311954700469,2217113272670390,8405758331394231,2309441532160186,7454184263010491,250284973471936,316873168668866,8370122350909635,7063668741679301,7620813920598215,2751228910012791,643400532060364,4755370213603534,1735036109719761,8920607244146898,2782854076442835,6388020775885012,8046084856487630,8321286112405719,6734209288947052,8557001969929595,4627651143805149,1546653151344863,7299758345791712,8765401705257185,3300107953641698,6679825603180771,4834474151946471,4186893004170937,5399094043703530,4530845517605102,7173362530414973,844301977450738,8164526011689203,7910043449829076,5371592998856954,9159488530299131,778440227408124,7340346791457834,9150853469015947,5664758480419073,7685459818690818,4173607470135555,274434513033476,6978339180189957,949510141733126,8604739538876801,7409527937399049,9176115971287309,3822308395157776,5148985934862612,6888188165484249,322716195371289,2154126461163802,2202274515281626,5202124006254879,1398353364588833,4230267980372258,395382241418142,79016551491877,8508185695721766,6923106668611879,4176623282534696,7462202639506315,2663848277567789,3220403371125038,3052738467551536,3414904188037426,327265479326003,3566779718969652,510838861994293,2573128789707063,2530936630405432,2087951173863737,851213393684794,2045912203155771,708505823548,6711374869670205,2068570930227518,3507394182546485,3486361921071424,3616693877688642,1389396159961414,1483229990356796,996527390931272,1533853834971465,1131915819727927,2178877057317197,8954372322282788,2718152352278865,4842963346143572,5065882274027862,8023926563315684,3457623060736346,2917497351436635,7217678990322014,5380967324735839,6333193575274848,1355199872604513,9082574662128699,6530124117350756,3852709052967270,4688682212260202,3869343873321326,8118151575070440,1054238798616946,3570290058766707,4116336777759094,1104277302999415,3565732361058680,3680305719372154,7114173754427773,8186748176759166,8676057007118720,5594538460178817,8798716660891780,9038378488076676,7897264696997612,3632269426276759,4732442564299150,4140722980200173,6687644270369170,8906652637546905,1918504434104725,3447020916730263,6740106588286020,5229230713440667,6597281481263516,8112846890627482,6100013191604638,7191949502527903,6674191353203105,2066615575816610,2901939041860003,4196145159014820,5569167949486503,1845721523841449,4847210252933547,4689763269269933,6350492407767182,2073567229295023,759874773648456,5831500532443571,5102549203454390,1825270673848759,5920519201268818,883285292186044,2092314864290238,5384536807369151,371855023716800,1301634229483976,7945140865736440,8914837092325834,6221948559994615,5051410299922850,184594943044047,7039014135777744,7234851126097656,1620700148918739,8682529439521236,189040797702477,9159496547581689,6292388232313304,1073357500029401,1396516130359770,799996791941595,3315745750993374,9045307192601055,7932533959059936,6489243853749328,432785764514278,6794396748204403,5678962664708519,5576286808237138,9198234930985455,4721652489480689,442524256642131,5601297965883134,7389981303685545,6492243107549776,4508339743876180,5531975288764925,5556141069928958,959041603549695,4347221267614208,5913585997642242,2441564088859139,8992138677750276,568411961195606,3065518410144263,5582846719330824,8559593810115517,588203504200202,1661800890681032,5328120520169999,8849296726211088,3550921434475026,5740985585809939,7382317678823956,1979241389017621,3132643984931350,685811501898265,1565121036654322,4346385585609243,896922164812318,8124495575316229,980095935212066,4885482205309475,3607416741132836,9094202208752039,7074408541489585,3032266197419315,3758163515316779,3375806715087412,226547781429815,6766446904556090,2820221326074975,4077882350144061,5667220327774783,2281228967217728,4399246548347459,6913094435170885,5574228934052423,7408289637395017,6912514096486987,2070710541654605,8399555474337901,8494963809579448,5441753044253270,5240979658308185,8774430468602458,4904104017164892,1138892320238173,8544405370874981,7842569743412818,531498909518434,4891956122757731,1865698892962406,3164690539403880,3008819295611324,8068537404192211,2328479386775997,7911396350429808,2650951811316840,483052247011091,3360455947176567,7478206449650298,1283834678364795,7929546106460797,4102703531231870,1552790263193365,6025968307456640,8351070157965954,355854943120003,4353294895028870,1779205848616044,6944556344949386,8776097312266891,8532491942501005,6446368529833264,6965106841377425,5841068032682642,13375096519316,2598753099822882,533307984640662,2148674149091991,1449646846223952,8908958125890205,8792261849017201,1628515155827360,8702542204820580,3872878533147298,6878649847136429,3135881729983601,3361180010629800,8427875638962857,3160285239847594,1216311536843439,4059357914344113,5898297747327667,2156704945515188,6890318962137782,1416276097120951,4158566164277944,1911091331118196,7943027375942331,4663344151976637,9050195178052290,2444175094229699,4999843076033229,4272704456444623,2882710019795664,4692822544665297,2573763279407826,3696868616645332,2533958967253720,1554877631311652,7486298721688282,7057290575694287,1719207368567518,7003729874840287,4906988991740640,8709941765376464,7852443817523940,1447265877584614,2310793553251047,6680395760479356,1068473738771178,3798767083371244,3546979754695406,392837087872125,4630316899261169,8070304139217363,205310881052457,1944691028376313,2018622864206587,7892993295723261,6337934825323264,6262899858230018,4700698695234208,1707425406323462,2354589546067073,8144333006142216,6044975650622217,7048172524428043,3751517896907532,7118863233932308,3883395544644368,2297460700728083,1210428675369750,1345112025098713,5681441368664856,4273536196848410,8976453859891995,6809826738277149,4422289643686689,509187025619746,3296076046043132,7951286329084709,8409195792378665,5395449224510252,6823672438666594,365703379036975,482016739015473,4964823308897075,696731631012318,1258313665415875,6203684639509308,8352466538105662,8109106464623423,8114345688318849,3831506244579808,8938397583006530,7416987145042756,7628084968291141,2996927964642121,4099782590942029,8551028376419150,4611176409508687,1774708399336276,1628723093769046,4995830878478137,7848363246971737,7753716935600589,5544841027767133,2064397062036323,6348294411675990,1562652297419238,241492408109926,1953046328388455,7924306935926297,3213624648039273,2862616527190890,839074412378988,2631328390900592,8229807146462065,672883955608434,5388310393543542,1644714667809655,735420629494648,1200851531209593,9090967534072285,5370510307662716,3452965105806485,571318952561536,7533621986614145,1930005808081795,6293218357668747,457543105747852,263293467802509,4261979993414542,2545166805154711,5565655594658713,5584744985504666,345329381444507,1588698318904221,2626884673739678,7420834941373343,2583952947773573,6894580212390817,2535109280213923,5489247107550117,5633373764557734,5570600266621425,2951939162368939,4928379282660269,824802524621742,7527928121008627,7002087062440885,1212074189290422,5534316812172215,6590597509799226,6696353103504389,541066736840522,8015021665271243,1219140936362943,298896606415809,3191186401274819,4048636949056454,1640328562936776,1406119890197449,1747790649029111,4100703161117644,1053812141397154,7576912932940751,5463970748148688,5908089775147985,4607502576966611,8962395994664782,7441284050389977,3360036503747550,496769696967653,2153987001326566,1842756891302889,7942473380322284,2864340257946606,6278208455597040,8591010319654056,6647763834813428,8699195890180606,6101919134858230,8374419750792361,9008790538554944,7457121584155641,8482700708058282,719615795231742,4039804404397227,7788928904110276,1937152633233921,8041352398969864,1044965321210892,4217237099650061,7642150443957263,5796555279371284,859891305262101,4776799308692503,9066062453004804,4645960257969180,2384339858807837,8486390628416543,6240757624335392,1178475943230497,1334529775193124,6597354067840037,1312875897900070,1134053298824369,5060372016843816,4199144840674347,4454965386144812,9026847205702701,1064845701454894,5161406756183089,7182237164768307,4466742220504117,5386053696248887,4112753002445880,2137560309799996,4557269289139262,7636105374657600,1834940006308932,3011119066295365,409657612885062,6102714353303393,1652414789435234,7267724897152451,7567335400655951,4428785502956624,7428806646488145,507275837602898,7935797117992020,2175240845544534,8862925016962591,1803003264018276,4898186631863386,6272792571709967,4653150209358940,8153274025020602,5521572148505694,1728314991549535,3554527430089824,2338750455635041,3374046636960866,2321739763813475,1832933059681380,286080324164709,3844526182321256,2891255904713834,1806071459388524,2505995447442541,84870846733423,6269391597427219,5347457154280565,7833143646792826,2752621061553276,5729881268968574,3165773667273237,2227358289403010,7780124858773355,7494736231914006,4478404501298314,5072845247921296,7655009837280401,1460308215823507,3763126254263445,8146995710352580,1677817087261855,166189230632100,7529729888101815,7782704812428456,1796411855236265,2751477379304619,5227991840496814,3013774841097392,5764511265742024,2590555644513461,4459128534633654,3651347072564408,5085840565676607,3137963284679866,5103435204066491,1076176884112572,4992073386826942,6082728005766340,935524420807877,252451687115974,1449560469695688,1788408518065355,143049789053474,4503941806304463,8071637019949215,7372184246174243,6730067834817748,2818201307641038,8508264859040401,6591816946910555,2335598606027995,584291347619038,3646303169915695,896593705319651,6382216458960103,3939743304211688,4414589694704873,3686289635532011,6549402543426796,8303233532962002,996515214843119,819861400906993,6411139483720947,5337311774244085,6574774082852303,5608510299034153,2950102557404409,8695577902618012,3624605730610427,8658551346228476,8414947798598237,5335856169907413,9117070261676587,4885124195331333,6448604523954497,4014284385979656,5889764926840073,5977486318955786,396220919864587,2602774903237900,1693949787846530,4536649608654097,6403601929504843,2108359614709012,3699260579233045,6632297854917910,4578071355637017,2537112081280284,317883753114916,5895361621979866,7837537684974890,3815691762997127,2252701276470572,6833932205923535,8449457368019817,1025156488224048,2257713661156658,2076577548971315,7939635779009848,4507291520879930,4021049800441149,779028136172863,4496331912236352,4030750187304160,8798760262753602,8381307662585155,2481235594919237,1324914260137869,3653528095956298,6878863049644599,7543821567208780,5724530778074445,4393886689456013,2850278872756792,5956246560685395,5113385904414036,8909408180795278,8060389895851351,1970776168463704,735781904772442,8155679778453391,369905433587036,4449660213039674,4012752970591582,1046653476822369,2269537175952738,5033929942247995,2984080969727332,8785623349312869,3455971294166929,2056665314979177,2946487740894571,638618993134956,8478003923029029,4350944070663534,4047364251749743,3746193354349938,8694515223520032,4159251806974526,1206572346285289,4916970416655736,4549266717694527,8226305004457225,5333152886177151,8524413530159886,5284731521539460,8116126027435397,1371308756581768,126505059569034,6668386493934987,8836316950273421,7098760924077454,693977405218192,7520661639794066,1448307588841059,2879479538052503,3404615095004568,1549205120507290,8620522553183645,7513384299687327,104218507537825,2692577051344291,285723645738404,5669046886169841,2521391837146540,950219296734637,7831939312392984,860993934196143,8087654213057615,8997798238866867,6575412499152798,1584608864578999,2991950101894388,5814267423022522,2799058910215615,8042997195148738,2929053455510979,6482244932234694,7222889214772272,6305869442321864,4337270178920755,5358418866425291,5819672543510751,966833214275024,3497547377565137,5830321238339399,387231358512599,7244535169064408,7861434716061145,5546938105908699,4799847900171743,404818050904656,4245049065766371,2991537829170661,7787351384093265,9219048683912680,3502061249789417,6548313571487210,4011663157274535,2058807790550508,3454643920039408,7920190036520433,1527369647906290,7838720826068919,4749954339499511,3599230893751800,7993279031382574,8096802958970364,7264196170964481,938216439418370,8198105982436402,6462893106646533,1507399179181575,6344736293903881,7469123587520613,1622387207612218,8355289231900172,4244904470658573,3504633631186446,8614236695145999,5651032650436112,1496470553132561,460318607127811,5830153108004372,868226567413269,4258428304072214,8474948540471897,6646947183668760,3763070520811033,2259257251872282,640989676527131,7618718887894556,4368348978131546,8045896122920478,3276726507764997,2582722078686752,8047144723628749,9092697096736292,3557341601144357,4615345728536102,6611898709909032,3666404867415594,1251481649135151,8832528139607304,7091311121432499,7062117939873297,7135375488208437,2303693704560182,6837266115054857,1455827209965112,477241673645625,4857148960030266,8918018288200677,1800624302644797,4012423110790719,5963728671652867,305294302068291,8629687919980105,7031915397349303,6729502414274124,8719648437762922,1697594492542542,7515735574277895,4715467902930513,2018744251919954,7147688734136931,2741692568944212,4102409391783509,8612513489210966,9180499194140601,4754988090968542,7151511037001307,5478191121845852,8141550148403578,3393410605071966,8158378113371743,4330753811164770,3264420729785955,5599212745530981,6012758949035964,6869572173733483,437861859913325,7679012335633615,7704961564786289,4074998998462068,2769428353310325,7883576447946358,5486614530567801,5066000783728250,8281999968256618,5269843154824832,1467508545036224,7717950006337154,7793708313825900,8244135043190034,5119750943645324,8725244007235214,7832945976046189,3039582167010960,3785236845653650,3593823937990291,958615953772180,4551809555488407,4191165359221359,2621884639084192,3466037945561712,7069664185978530,9014192668872355,4243326365458084,7752049668308645,34104901553830,9110718272075999,2480091591634204,6317449067617964,3655924292406957,460978371448494,1604693915324079,8065680862744240,7070243134208888,49858644987570,7753525297393331,308079298776756,5685752803927326,7527061256609462,4822883249872571,7314679387356860,7801784020223946,4490630540041922,326433368866501,783373868252871,6472622076051144,8865617239391946,4546986452171383,240940889222860,6716152695675494,2691121522392782,4132817525759698,1988814767361753,8107959587868725,3568106250165983,4621950045277920,3163742901030625,8772203959221785,7085285849112293,8523105450385126,5732566077116141,1839532236828398,3552253286252271,4566630484705009,6625345797750517,1372103279546103,6734270133419768,3105615384219385,8413746348378751,4566153026854654,3695197866929922,33852419075844,4336432163081991,934973147447048,5852687849733897,4838210895025002,2209656591535887,7347573167955728,1216248267303555,529937248882452,3222042624120110,812905782480663,2108788824776473,8653556807212335,5052655344967455,4474548003880737,6089550589968162,5645616093118244,4252291062894373,2877849904031385,7196412760510249,795391718498090,1651207148646187,8315112867307090,189718779268912,2171026831568691,6215438471495476,4647706770399031,4763227143692089,7277194788372284,5983918874046270,1155675906445120,3998051995238211,2981401971572551,4581545043472200,3610958513516362,7037029876872547,7816833396432718,4250953700281803,5019744856299661,7937885427541862,6666485214084952,6791480561188836,4089649989091165,1954048932107523,2539973497810785,3523433048899426,8481076949624123,5403401885126500,7115997179883366,4897975900983143,946407309260775,1247432213536620,8443544266004281,8105059783950190,1708806954241903,4983732700594035,2303632234426229,3993257771096041,5371870535192441,3901094294376314,8480852269923647,6380815177248636,6736671393431019,4799213086494593,1087642525290370,7705250167263211,9220091748843841,6786868793278344,3175619784011658,7271788484176535,3755483217702797,1214790585329393,8749829499096980,8069529025990549,1210131070459187,5710915036631705,213486604111769,8862666350264218,1087029022257135,4197797972754334,65377174548383,3946545151127456,2552377592192929,921609081221026,8913482186489765,7331927216091048,5279036837532316,7725156499410859,2637348578549678,5507047335165873,297323409993715,5255675078881205,4985201220022199,63696711569336,2700671762505660,7478182889360714,7491900092731327,2849406936567744,3879345475968961,2924423509839812,7439629429536758,2062771086499782,5650506158391240,3522508084088780,8087839083282381,5469767543091407,8220377172038291,4655792209100757,8930153563430870,3116231554934777,3774852717850584,107004572135385,6602628983049551,7647979908763614,6190800176472031,8835409609673877,5107966795415521,38062731300836,5109814588325861,953624530722129,7115033047986152,708464659959785,4988466501169831,2539773608439788,5157871444963309,3154219334746095,3873313275527155,6272939172290549,4363857338793976,4362440182996308,5510287465113606,8317346599264255,8599358595155133,259310314818218,8243666666037247],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/edbfe6ac404682ef420377507d52ca4d",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000589535.1/GCA_000589535.1_ASM58953v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"JFWE01000001.1 Acinetobacter baumannii 25253_10 ab2525310.contig.0_1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"edbfe6ac404682ef420377507d52ca4d\",\"mins\":[8813955913481558,5541473772335112,1213008423690249,4891197350350862,6405795182731279,1292920291631120,8625455497351185,3429340745846802,7421433507929780,4563602436899502,8813679705755670,5404646105235482,5378157474930715,3231823626928156,7161064291309120,6475953998368800,454181991235619,3998387213766693,4665219290210345,488896446894125,7575209607286830,1126991978668084,6312177099993147,3779104174526524,1803340166914112,4520722258092098,1664127175020611,1625501389930567,2609745074151497,8130613482274891,2515641832296524,2098521231355981,976347927957583,6681370608226899,9142212978278484,8643680819365441,7833041882206294,3370776724414552,4427362319175769,2240459064025179,1252291231236189,954691547267169,4177898724043451,7659229213600443,6864347593896038,3937586185359464,7863680146395299,7759424718729330,2576072623026293,1904221617623160,3849001447256186,6047159181181053,5607353648337025,77391054389379,941369776025732,2342644280971399,5554173154545801,8575975529462683,5597694849294478,2281351507169423,2845512615956626,2230993997955219,3731847970943124,4645904835301525,2344662116626583,6901734199312410,3127837087453342,3138201915506847,5021126274867360,162067735527585,6157068730282146,4790426499526819,4007171187245221,5932936724877488,3661577663106419,1457429579833525,1821024477499575,6062239839703224,1453510771802297,1925389506977979,1993041543135420,5974590019219646,2838528189075649,371806036046018,7488073850085572,1916785053503685,6938594364793030,4123806102409416,1535509646319817,1350249630761162,7323469603926222,4649903700959440,6708920620287050,628696623030489,7034736136262351,3017637868007646,4343790555152421,8995314149011680,1441070678533500,6751688800854250,8739804342202605,3623751600488688,2651245557584595,4338028264722676,1802314703933686,1352028126875895,8917563158338260,3574649936707835,7036801302692092,6166121159559210,1351356769427710,6365808033465045,7945899188711683,5138320933172609,4997560942485768,2258075009037015,7341939211919628,6839659630899245,6502303808868625,4226404972114197,6913616743235862,8236497907405080,3224428719784218,8419697295102639,5045480089694494,3464003774875212,5425041953362209,4255969162006818,6074976559685923,8019862005368004,3123219452809510,8209261265255537,3437741546823977,7984113711183239,1812032314745133,3693981752348974,3337647139594544,2241061589975345,8140358179201330,4155721605484853,3645151689064758,9007554857619768,8156161492664372,8228202118240991,3906189182034236,255323955608288,6985468938121540,3144927008960838,2981409211339079,8401851795083592,7555607540196662,4144026820936013,5462146422030670,3533177502593359,5260560864469329,7327497414390100,6118133152923990,8878539811567101,5881410430103900,1793613271593309,710504530366814,983430354211167,112324569416032,7931115760734564,1182729880727909,7951683636278674,3743471910273390,72033151029617,3696515745235315,3897642437955956,1215751240520053,8609626235028719,4020399402166335,8938541819534860,8050697754099093,7873996541348655,4151527171508288,3592725326320008,8657078720239793,6750314612674955,5383100338700685,3850130208952718,1110395909848472,1624836110295442,8988696853533075,6503861991428503,1919601790189985,2443253592199587,8943991890551028,8806400180571266,2229400174611185,5568416924103080,4905274133819463,1092654338863534,3189081727898032,3757232242010528,399195265114548,1277697083540894,3557207336063415,1583617303388601,1032245252309434,5034827755487675,8160422900040124,1710275183493565,39440409227712,2885481322443201,1343119917539782,6741485414749601,2759430517318089,2062980109640141,7092559117500881,1156252240769491,8073734279573975,7395112247787994,6808214708932687,8944314896183773,282130381345248,6485171246037755,3189369248268772,8788366528232870,1633612760801768,4836175962233596,473524408410603,6486589759156716,6491643301642733,2136486913135086,2519079664185839,7848531489680882,6484527543202291,1829691521159674,4798889966645755,2526197652280519,7026954303828479,7065996551922177,8137516738921899,1870664517927428,277217363358216,4112695516160521,7099183693730317,8526889157440015,8829884413946671,7441596396412596,6623607007916564,5850549576569366,3608097592844826,62519730946821,6451217813685657,8335881509338813,924975381750306,8367981864595547,6699553971323428,7709174679675429,4991842926084646,1117508026630699,5686357593420332,863897512924594,8602836738224221,7175128814379568,3432178500436529,5378557211443766,8156696966582863,6561626909093483,4499121276924478,5374001331175999,7772317620175426,5999680069333771,8632119812339809,3888484608746057,6135986892427854,6557329626911311,1740647216874064,1665243572249170,4389468770095699,1953679381250646,3204862938410425,177836967408216,8013089547989092,7844830018239884,8447949312504411,2969283385688668,5196427007738462,4835946048897631,2406754736641823,4272008840516194,5077842238902883,5802189598200420,3118454374847079,2586992467063400,1129430946554475,2214895889498738,8343435896079123,8304388901724788,5442950546063991,3995639887032952,4981471405994618,8079001112457852,2039526141877013,2121238882611840,1790942327943817,5404592418132625,1899977179144854,4629307963298460,633281886249630,7304416264073887,3004584167748257,2384381491200680,7444957754252743,783290268390062,8173340442358447,3861475659702960,6390274593370802,4240443692745395,1547274787857865,6509437536998074,4205241677959869,2428948643840703,10192046142145,8312691852571331,5138555310301896,1949454307963593,2337852421522127,948576151909074,2095083120603859,4032051372245717,6073617798079190,319279825543895,1238994794136281,3739197973361372,7166851099718366,5039473648005855,3575260968354528,8083181782285094,914904817892817,8816232169022192,7136382147896050,6177622505554676,2895845106639609,6968268142740219,4402948718560042,350362895622910,5481097096229631,8704640344101634,8352052201517827,442977858757381,9123783908726913,5399339151250187,5025195542364940,4629441147708175,6825852616352530,7521032876507923,2297585802634005,8847010064891228,6906069264798491,3681479835374368,4014416337812955,4888134558303012,2672197787517734,8667355274777385,5624379729609514,8316545590375211,7511078060398101,6608888707253037,1041579883021102,1960626958021424,1377851646845745,57729931858738,1398617425613622,488128636244792,8494304400937785,406438340203322,1295274058876510,290639733280224,5838858707342151,9095229921563464,663459984114506,640655978607436,3092112651645774,8498998175691604,1502672049283926,1945063063110487,2876188033987417,7474016249090906,5915017963896975,6464605453067066,1812315206267744,7486333928945808,7279771054289762,5761241966363491,229897556398949,8881619351004007,2495509449016168,7649975759864681,951531287745391,705275396473713,5096656047485075,8449598761584788,505062753219451,1893511799767934,261844342797183,746425193698177,762902229148547,6810718610155670,8899620076209031,3468432959857545,5594135368221579,1830261482488718,5902375575675792,792307096982417,1760826070942611,6475674167735189,7425093272317049,4722815833977754,2667018395790764,1590262880781836,1913831387018148,5421297181381541,1060839602519537,3723890736772008,88637230670762,8399917328104263,6858882806211501,2802206584935344,393043518533107,5649803683557534,7722646054458296,486768900887481,4241847236215738,6243066197729439,6113508923782078,417057340490689,8357169467999170,1093825310958535,5119663278109640,7062399327297698,6219879427732433,2528157758137299,182961362387925,5920192272987097,5071434328220634,5771542761874395,8514141598675933,6482889267917790,462277071647711,3632719499293664,2146705006830561,2123821028052782,165360454362084,2019237027394533,219101627151334,6821188556788711,3352786174206953,4116864957895658,5036259833189357,8124889703486973,4434063454165285,8043112174887923,2939978885653492,304360781808630,4322136949838845,2494893973251071,409279686853633,5350134234113026,7480103772103683,2068143625417732,1170833743889413,6724858519512070,174088587695112,5967937695106058,5191571587732311,7408194032763917,1095999883064339,1058736324916245,4317069979206680,9122391191533060,2676094026486810,9090839575290714,2038079634138146,7063600760390695,2242308151759913,6909055695090731,2479037383291948,6877746225021997,6373885627741230,5183402545427504,7319647475066376,5725250149532722,786754493277235,8001119577895991,6355168943572027,1795611226764349,4516582152700991,6367546530792513,7997490791535682,9196123179321953,8596383183841462,3116389427434566,3595256717915208,6124713796765196,2839186133648458,8799233896350795,5463376781501519,2914037979288656,3993807421294776,1245652680152146,4934863053706323,5666620369667156,3226568614336014,8426862289653945,7683993061737560,6542540030231645,5145402147734373,8290057524065376,8541537437480181,1097845528290405,7473148660094055,7216534883685480,8988664527049833,2317559662060651,6514026787915955,5382000232748141,9007226546435185,4231189283016894,8554611583280248,5377966799357050,6745767137899647,4727516850721922,4034134175392902,6469508577592458,5203039712986254,5040566925776015,5929400162051221,4361204476388504,833739366216857,8425940522054511,4645290944132253,7770027033240737,194660658795686,3527643486090097,5189702969304233,6021884201825450,1414232214324402,8361785420169648,4612171128751284,5490322363188407,2686712561226936,8665592220394683,7480267081852092,8484831264949577,3658239794771136,3167534881113632,4760888719492290,5514598674479307,4166885838648516,4589169047065799,2289355550926025,5402816453477579,137256719664333,7459972854420687,8470347319570784,3716866725639379,7944960602158292,4164177354675413,8032826457766095,7422542680511708,6332925398512865,2248984702231780,2632026927310053,3582971232380134,5718451505390831,6577414522256936,233733227537651,844676157252852,5121426803475701,817491968201975,5861416851001184,4729651015967994,2206026567108256,2651808151602429,7074092949046526,4389497383806207,9075707162539264,592576992965889,2940067051621931,8619371832587526,1832734739465479,8300651884463368,7947292238618156,5345662948091148,697435119629581,2943730816996623,5901986485941521,3761957586588947,7987244587062548,1203606931440917,877564167333142,6553315127420185,880821258448431,1707761648764188,2450027035732186,7795981357466501,5909109466287664,2197884296680739,7397168491042085,5813647328339238,3205481757144359,548564063933737,38370210731306,2963304906106156,1068793632216365,3855684271437103,1256326370305332,5570832541599030,1483458098824504,1303139741074745,8337545826301242,4055989209593148,285068429800765,4235578042086719,5089540320086246,6555120292468034,8525976186492864,614143246417462,2864936228951366,4310605822879048,3130086264829257,2158788708152650,6168377757976119,8912992754910540,1400554117932366,4116454091253071,7915102941918776,3521869229659474,7778660129572180,4831859947529557,1839789219841371,3888522879112541,1537579130418533,6702580783027558,2906993989637479,4538394071422316,8499833379575149,1653842736289134,7846687027308375,5995636510004597,5844023369839990,4628637204826345,5698808449500537,2689320547898748,7918468451931517,8305358529332606,3932838005012032,5591554332820866,1553840686863751,4009132912592265,2355044481414538,6800638537028394,468369521284492,3257097119575618,7501730503873938,714557305640339,7734393818047894,2689019265594775,8101665139877635,6167052500522393,8260152714368413,1098270972216734,2459357963691423,5881470524523936,2581510346876321,7205965526342901,1853774718043559,4543208832428956,1738393913886123,3517484546725295,2528601577616817,2968977689519538,1676316924167603,3686872063841718,3787457440138681,8185656159987130,3200609564607934,2814376002877685,3313926630737345,569373227816386,8397427475841789,8710347175441861,8911895773879201,3747281338455497,6030722694534602,1591413830235596,6659128357051298,5176526445082062,6802540546368976,6721955631486420,9056908902244601,5781044120716761,1730408465905117,2019657513240030,7206176971523552,6603023532512739,6063667762427365,47527809562086,158150759347687,4831467683726247,3024918768805359,6398652143756784,4323152221414312,6870250500785650,4182716575240446,1990905254508023,8124492767254008,301903268918778,2424669153338877,7617074816901984,3040462407579139,7992831330928132,5203397921863176,5812206717662732,2205042858898958,3948808495683090,4103403715617909,5247135062619670,6821873459945049,2796065161795097,175782660081178,3195378948507166,8141374987901189,5173849600063008,7376555044808226,294990201665061,7895063047071271,8214865030116905,3196338243122730,3401796986201645,50231029429853,7409558356767667,4570406371419701,5687258363274806,6264658933082377,7908243317667384,1589621727573562,6214738474604093,2879415806518197,4975719520278080,193960566924865,8188598855932070,5801921525106244,3550628941817415,4878043531958336,4685366071752265,6192535931102796,7909935352341432,5107410725414482,3875713497204309,1689439999288249,5445232313357917,6236514402166366,1026102297425506,7905999207846843,1771371671090791,1767092070028905,4464438345180778,107069092685415,2101530632423021,4216242473313902,4099756934350447,9167132709163905,3484239602972273,565629026006647,6147351616951929,6074245905929851,5029466991482492,5274145507620459,6085191965333125,5587142841382534,3380537751791239,6450090757625485,4812337245664915,1202410575199854,3284657777637018,6606784943128175,3924644067186333,612777807088318,5290803440854688,6437379667392162,7477624262465187,8632564063925927,3149434142029480,8266277895775913,662766014748338,8965612060109443,6507753939945141,1202433074452151,5555134979012280,2425194666211004,6604325275535037,4513417178896062,8319735679342272,3081128215488199,4478301985445576,5923595997731788,8718224935810679,1802713052718798,1144364117501648,3814148394649297,4661441603348180,7911973238097622,1491284225287899,8342314374002398,2979426311993055,2310991938774754,3440348666488547,4025367241762534,4388026101585640,7633032752482025,5695183613429483,98012912633582,1889915872933617,9018921004087030,8807542998229289,7884789576480504,8737938926251422,6874110809720571,4360136718735100,3982326053218602,8367137776678654,1672233623033603,7519031755145412,2532592666859269,7101038559860488,1898584061437706,7946832271230731,2088555747550991,7631143906748035,6342660228159257,5715523729770799,4542566070019871,379779378882336,7004509987858214,2902337458829617,6915920132245288,3015475568998187,943132709836588,2507876340655918,3413569780246324,4339087251167034,8140507117582139,7050045401384764,6445265780504381,8225450583734078,5335054735130933,164465416124224,464866107558118,2167945677813571,4394310079895365,2231548909872966,6975722046302028,4664189650552653,6958666025686864,8677658994517843,2932343301561109,4526361210636118,4264638976419671,6456741980260186,4976516243220316,8728409914234718,8471622728492898,7757213016664379,5291568000522084,5322238349576038,3771031931119467,7259975188016786,7360201095636846,5388890983380849,7249252955587003,1155366848501620,3366476030965622,1147143811671928,3640202607720039,5774468489123708,5793746089408381,3408404585801365,3069058911741824,5405683809339266,1616427014330255,5894100212931828,4667272745033367,4808095820232588,4397106128734530,1405541855757293,3298177536966296,4649363102459794,4288155933910933,5727618948736918,9041710011474244,2499521524066202,2735099833157531,2055218748155805,8557451895900062,6422672764766111,980256254756769,2268976925271970,7738404772906919,3034852795152300,5103329747408816,6011485864290225,5754824483129268,6433582601004105,7187163980327241,3078948892444600,7822644131952569,1309892588902332,2132589344409534,2722061717358528,6292873885321153,7189059021654347,8620206985870028,1841892429346759,4524399109199817,6060639242676174,9109041479490988,6652971685787602,6157337709631446,4150193961359319,8908268584900569,2598636506318811,4384617695160284,4022863965366240,8879979808364513,6997801515722722,5869221133105124,3118390462805990,2851626112329704,5752222170548201,5260230813939690,7991354860294970,802894694762481,6809949666379767,1259644191148027,7361150973950727,8181894441023488,3397087678711809,5349070294145029,3289419142882482,3230008619431946,3104506928093196,8871246457381890,4731787703228432,7194833327672323,7509844952471572,4152573169838101,2904128148260887,3505648129873944,1067410565991428,3709732196231196,4285506138146846,8132503010356229,3980508881242145,5626248078235682,6355221689976867,7575499977991834,4179238039996457,5855581767129130,6108578675714091,1175334971922479,7918678955613875,6553133450107523,8466536165358373,4529565358290998,2441116443200804,7324711779579960,7095814019591860,3629803956021307,1207986740733534,8229572450928702,3843445037566015,4326299762395200,6334551925209153,3695741112477765,5667876737443914,809106099226699,4569952001919053,8867689134244371,5018817472444503,2985127976265817,1009668036384860,1053581526923357,5924737469868129,1334224515954787,2410350063302758,3874836085151850,294452513122414,7608680620983997,4410291974330481,3291983806605427,7396719563200628,5631036446521461,8183327603083384,1015099407915129,262813037480058,7468371116244671,3004532571097214,4975928189991039,5470244022970496,1679398313130113,4636443748780163,6498007100725382,8236758772062344,1236165158832265,5586953467676813,5684410491615375,6343872921004176,8203954998188180,5386648895703190,7015651386189976,4022064116563652,2474052686747802,1889099847035036,848782386464925,5929132628510880,2863996704237731,2428512856471718,43720848507249,7459595425515207,4659964610267309,986793099708592,8208054113007793,7739651292231858,2809715951450291,6240207655065782,2310756244596919,2426488239077560,7888935884604097,5672531975092415,404257221925057,2121200165984454,8553843458578632,5047660958124265,3812020855638219,7778213253351631,7895462134098130,6406577356314835,3079028063492309,2570735830370518,2158909180762329,1077943002507482,7038353767905500,5092347071871197,8326757699270883,4587424471587044,6553740990089445,2890424311994598,1412824217708777,3857653606201579,5819952474368241,8302604472815083,1976239067057875,930908654741749,5193562301831416,4266558878247161,3485258266614011,8001162687256278,103541687206956,5332919581796618,7473248021462743,3424252514982156,2324532356299023,3299027854276880,5965968511351057,518295756376339,6876834760474329,2571678924081432,8589036098296879,6930371027011868,6722365150837022,3997340995946784,5032969395250224,6807638953257250,8322576780912932,1353688551930149,865423368276263,3130606410541354,8617629401450795,6692313738189100,7660255082539310,2344829848164655,8580625138559280,1860492172458289,3997516615444790,885514339903803,2255197709818173,3147387273046334,980997298436417,2179556145867074,2970649004046659,1180468225098418,4430817028127047,5825406975256905,1641444504914251,7833776705411404,1901955647526626,4534698136369549,2550739893997283,4251701577124182,4498423412365656,9019479131728217,8808267395762522,8382250251643228,7256094313875806,2615764417939807,3809563897305442,5139812837934822,7001525575883113,2806915229315474,5361587063630192,3069990577662322,7506332920921150,7412378645784951,9149056125934972,9175219536165248,7245127572138369,8295209431366626,6671124438354310,773414429284743,9090803271924105,2064439166736779,2452569199266189,4614587353938323,5841710655961492,6250423501399112,9175727638391197,9040648270440862,2355738008017312,5601727338527137,3420646887844259,7178258539030949,8470145822910887,8655158898174690,5735331629951401,2023083420875178,4498115045570987,496548420594092,4105185406060976,3304114104566856,4029968942406066,3521903263078837,3675233722231222,4014933424360033,3068558309333433,7608338102901178,3571330278300093,4408624441608639,6463977964636576,3946267222163863,46505926957511,4140191993485768,5782192790301129,918455144183,4496592484268493,1882153121446350,5793370540775887,1630211689245141,9196557110700502,2997907419006694,5516623749925337,415195275954650,3501766397543503,6946567514900958,6596800074013776,1813043985263074,8105348680902395,6558497359448548,5058746843417061,4651143395682790,1063462045321703,2237049954277865,6240401795475946,297476061125099,1169431334521329,5553573168056820,5866686612535721,8773608874371583,1700061399808515,6670219378571780,5094718010411525,1335963601320557,6450806266202637,7331479813397607,4545360200788496,7623921295376195,5512333892909587,5011891280861718,7450370201472089,1112458131143195,9029818893527581,6685861342007045,3977567188449824,7419383314651681,6576361734457890,6355230398249509,7851238837271078,1277920151456296,3848961914690090,8498623585995309,3600751485946414,7383961299530845,9124957346396722,9209689729616435,8133282013954902,1419039991413302,5531136114518585,9035830766142559,7307105369524796,4550797856041534,1169170458196546,4196081591310915,8420977950341700,2093899575786060,8817802597545213,584201965206094,1563854679849553,1873173155600980,8720893006105176,7932032223591002,2388725271919195,8077500554189404,6641870805435104,2489493377083998,7057266646051941,1276498968119905,3705475861782971,3751033926380132,3514767491078757,854878905829991,1707116425120360,1009176304335975,3304112652820151,7820303202613872,5271644305820276,4291772542884470,7887062280739448,4482298727213690,8569013156495293,7792151398632061,5489901012159103,2940620004670082,546135710995563,8711959152781956,5967218836744838,1401246782962313,397034320443194,8448864850073223,1213833065503374,2649540752997009,6408855474387603,6859534636739224,5207767421123228,6475731381074589,1451263424951901,663589331405471,5021125357779620,7899731005901937,4294590606633645,2989069630967581,7524646304774833,5599947026782900,4338127945112245,4151024829414070,310182144559801,6389645933505211,1142579350989502,2703215096022133,2882354552272672,3799758852352709,6112561920932550,7468885250916129,1005352669702856,3632142612220617,1609735960550091,19188431938898,7109702898232013,5536979225377486,3035129818585808,8700054471019218,3985441555028692,2258875324557774,2622904053074647,5276398257072856,361113832585945,2057056656337626,4821521514728157,6661306190400223,5393352544331210,1152885232476095,2990897161702114,7240416172909139,8950069974230082,8642772806870823,863267863730929,3471179694234355,6224072090872566,5212761812908791,6087504131033851,5813237747596028,6102857961868029,4380963206007253,2477951409310464,2475627072564352,2186793038916349,4119771461864197,2664444456258311,7380069500476173,6475679946013455,1783837213670160,8405085365091092,1376311004273429,3505101468588826,186073826040605,7696110071099167,3106728150117157,3558886836734758,7110824273861415,9038972720942898,1483142623812399,4790324169030449,3907926626712374,2096399693040442,7584264706771212,7765205003578179,4418522350287685,6848505461148487,8078336265767754,4989760574896971,6047716646882124,2856549204593488,2440390243547985,969595399809874,8763321205811683,7005820087819098,6866022085031055,23325603257180,2113804977211194,5554011787586399,7394177155513184,1436692048362744,8072418547231587,1082398404647781,7470842257927015,6934837888228201,6920028561291751,3482062815528765,9014246414477801,5880345032678265,3040354687687550,296125770537855,6744830144403264,771617410116484,6168846048082822,3048962852776839,3067596576693129,3924796231060364,2216266763205519,375089202514832,6945444216545091,7859231110159253,3281807020166043,3204261448346524,1934187509255069,6687748374514592,1259542543625121,6046389967457186,2155226569251748,2017576256715686,9186863116036593,5050970018823080,2597264788052905,3226700670373021,4101897265671090,37376706245107,3789527918873526,4392245755829177,3324371216474101,5937350208388028,1786198334966718,8241206012599233,3098292069469122,4391675836124100,8223017211624609,2040797906160584,7882705443127116,963994888301516,2441862990302157,833753239108559,8032688618298320,5116214262696915,7673045359942613,5656143716121558,8109099990289368,8932275206093988,4210418998414298,1564462819417053,604741788195807,7790205438753762,3525009279586094,5699008485710820,1137284554251237,4747726467202022,8555098905824231,7685633615617000,61536631258091,5559436889639921,1459197307505650,3774870154050547,1864326302708905,4477795627453434,9040018063515359,4422886166002685,6482740479843327,1875687943326723,4951471393483780,7739527297608709,2779297968098310,480582299024392,5130823448849419,6929624073636876,4600683712195597,5085462443879438,3967818134637583,8095660863859728,3816358143966226,5149395694041603,5896880682859542,7730830417268569,2000010809707556,7097260343893032,1926955816413020,3600401999166509,802779929107502,7981186681962333,6853175533612080,8750693831422472,1195772908809269,7453353831177270,3412113454910520,8733631843023929,780402208631866,1228610783763518,1113111541431361,1140748474985538,1389893927746627,2235807341014087,2186230588132429,419574043978832,7275945499790417,8466567800847446,3903461488950359,2727229049603940,3667652661701729,7619194236517474,2698862967778403,4657734269226085,3029821931818086,5923992968252519,4525118670797928,3615039250009194,5088324404591729,1652479357217907,5138578338929785,3227978329185403,2169331811548284,8472228970302591,5683787747523712,113074066623617,1472873439521922,3540744485555334,625624575958151,2685515096849544,8809739887193225,8314761805085834,8434889396833419,1833418565680269,6400797482519696,3503881963551890,6188453096381588,1214088013925527,6723669747387545,5923517556853915,5383572666043548,246581408816285,4053587952487582,6480103788055713,3819215802842275,596847221918884,8355150181099377,6173974813125800,1662734212533447,7339422979628206,4577847886613681,8728939785227465,8103139847456628,6999473038678559,638001924166499,3678882531925183,6934277968034336,7348770334280900,3803758111231175,2533703346302156,3078265496943818,4631755347037388,5342369097938125,4407301122202833,2459349824493074,7958182917242067,7602046333187961,1158899557686488,317477997972697,7228181767208154,4329594177821918,5870409928543455,2371798752656609,6404749695704290,7840780851600612,6164917204475109,7390473431899367,8517278970715368,8984385288396010,5843250442276075,8557471241825516,3002272074951917,1896037389663470,1017881939578095,2727590714322160,3895710414400754,1650909430717684,1972407322955646,5043150754839800,2031229824417018,489372079811835,7929631032339708,7795016770756804,8696231010061566,5258637390687488,3968654109158657,4711067263073538,340377730100485,5260306592095495,7083456451270530,7426733239188751,2014030732332306,9184438940232980,9096781118577943,1861070060760348,9001688619735776,7092681844923679,8747937698412755,1976670927858978,2659119107374372,1528380433513765,5390166030986534,8613603267548369,6971682463026480,5252454000209800,5871372919291189,5822106829585719,7577014136364344,3594966709677370,4891855952645343,1962025874922812,3621488315153726,5813108614913343,1779652662701379,1491917184097606,3623158885633351,7135955507509132,6473178305125709,5321902362479951,8239535735565650,8715199483682133,2926648757849430,1978823320137049,5337180767698267,2218640333012316,1595839460306149,9164575986019680,4177863895735650,640160081136996,7754141379744998,1397981449727334,4102743904001383,2825735627648360,3163167136804203,4129949400313197,1866753473908083,7788097624625283,6665939542662520,212780559252859,8334395904789884,4489602371173757,4789166072753539,4482143524853654,7938063863311752,4974328803192204,8711948489547149,3450912449129870,1264909794061711,9146646562636355,8223879369665940,2445686666059157,6489848494476696,1256251427380635,2909444612472222,3230971073240479,219355671203232,8948136406220195,4464759533952420,2438073117531558,7014348526857642,3746708065336748,1857493672374173,1463302944988593,2486754253749826,4199627940593077,5128272643755252,3083110514134459,6773372274212981,2253350811717056,1624347228401089,5988462480256451,6905015154666948,6141962211954119,2671067399740872,3721351002349002,5311098976320972,8784511908898722,8957988778808364,3670564804922832,3135733867269585,1192372106739156,2755735458029013,960136436112854,9046249338731992,556319312231897,5228949541363163,4380964209204700,4025727604774138,3542295576612320,578801387613665,4294371425668579,6462802174664165,7342776546150993,4565204840599019,5618547140144620,1108259250757101,4911099995526397,3519607145717233,1062046573608434,1745982849285619,9003320892476916,7447630947872246,1870360950443512,2461455015405216,2714303069707774,3657990052806143,6886890991633198,2679814504390148,2441239305370881,4943743921729036,7913849739411129,1812379343035919,1785167954005521,331133729795603,1219504915054100,4760074817416725,2075550237474327,3948850569780760,1689537896779290,9118086323043867,8238037952703749,3341638435542960,8171249844979728,5791295701417512,4994131766984233,4855889105661483,2975674590662188,8165079119564334,4939755241848367,6367141629615664,16064784883254,2791777805459001,1892285979885399,2889893556330044,7656271304138305,3372336971251266,6073909990981188,6036236624431803,625475672243782,6370740432357985,3113785830112840,181542846637324,5769061761130058,2341667757293131,6362604811849292,4721665416429133,3161422568250958,7357846573245709,8457699916994488,7925709868912211,127747389120084,3280392283348566,1571411244965463,4227550588344538,4550937123192409,7087439968630031,8922982978512786,8197311531580005,673226613866084,3078494857865148,3400361368088021,76573520191083,1716472092061294,830371954679407,5461000863039088,6970581835050609,1049648180045758,5978919863828088,7079472694795898,4067647580110459,7085581186698879,851908377898625,79080737656450,1929984040025733,8028140789681798,5818649229246087,7638596942311049,3039110292063815,3683421679193740,1589542719127181,4272177026981518,2633299063343725,7331591723482768,4361421326565010,4686785404026515,7049278521713834,2935011828158103,2929450901053080,4960310592179866,1862144978395077,3979632031223457,4761451335511716,2288465813687973,3460980778413734,2494543521569283,8547528405991082,1239278789865132,8249610294628013,7621720578346672,1126362286653107,1054211547471540,5288869525491383,7148391783131764,829716069744314,3028001503428285,6545423854079679,7113111813648064,2839124983381698,5976464707313347,81961844728215,4636757516274294,6405769148374727,1387851862941384,3579904900021970,3522959105549603,3310765708766932,7177464597046787,175672684748503,6428125342211801,6976453611434618,2788799774764767,569014811148002,2447294299680483,8306065431912164,3441289850060518,3600468359245543,7035769763207122,8570616685269524,5877052802473711,853423534718705,6492934983614194,748116020113139,1066163173404407,3187568499289853,1501251022806783,4334166127820549,1981360047046409,472620061908746,7268547799904012,5608876884047149,8849643086700305,668473103552275,231949229170452,5134149781962517,1098499268149014,6284070315171611,4718551065014045,59673028849438,6232919604084511,6380873562758945,3468139853885221,4885022954721066,1089817046908718,6654988036263729,8628838597357362,1139859193589555,7883435593429535,5293463201812282,9161019746094389,2230759098625859,8473634067555497,6324763420720965,602694344286022,9075931152731702,920056880602956,1920671151533902,3257767583665887,4349928790433617,1497942389600084,6528739393408854,2696762729702180,7061545100201817,626501105254237,2409857410807242,944752645488481,3535844708163558,5739327546179431,8774769415847784,8291729526553916,3361611106877291,7476183352620349,4602895335238974,7305251641436933,3474547452819433,5668795492765560,343785042423673,1634670873337151,3518631821971325,6503821893204319,8108260642070401,6450410234105736,118149015592842,2892318986768272,8566876259170968,722492416159636,7174031798937347,4866464370405274,7169053480529819,6260659214237596,5370966248103837,2749988640937285,2850732051025826,2014030703570851,8294925454790564,4625034729770917,9186625936711590,368440417656817,7284228109955005,7087654345952583,6943573199338141,4824794413446472,6798730118090676,971586476057246,6964773653344183,3370517254696889,7781019974726759,2377548885823421,1413606754639806,3413971498319807,7063092140388289,7262684027045321,1866083386765251,6218732522024901,5838854941746062,850558758195146,4321614004649931,2975867002236876,7861251241037774,7107897494380495,4339377591390161,4759783637439822,7871382954274775,8234692890349528,8018436185164452,4665865467174874,1263539059806171,8266393513607134,5702027847603057,2349639662632928,4088993209495522,1940380394962915,6543702431715300,8995464451989477,4429873213358054,206573390721000,3426472441233385,3641994166766963,831167712376146,284059665076207,4781229677875185,2687910789238771,6493685211226101,7575676785909752,2088416434245628,5727660260802558,8588689511182335],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/f13c7b1cf4a5280dcc066d583c09bf78",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001896125.1/GCA_001896125.1_ASM189612v1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"MQUK01000001.1 Pseudomonas moraviensis strain UCD-KL30 scaffold_0, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"f13c7b1cf4a5280dcc066d583c09bf78\",\"mins\":[4071440965189637,3462720046112774,7730391996751883,4534788486316047,5889524539318288,3935131895283729,3889193103826964,8471552073007127,7188023684079642,149779512770587,6813923763847201,1539590230155298,7858148508835875,7908542909808679,4234216136900649,540710293110826,8299991506467382,2507322454466611,7587454667866164,3371979730406245,2747459733209144,6512279852703802,5480597710979134,3149549959585856,1873473676804161,2865240045979563,2476093653753925,5966317249814598,8826955868020808,3747153534738506,1418883857662027,8086710528516173,3150617401876558,6518426508116047,4074865598293959,7167675768848471,9039869019455579,6027995611365474,835209785491557,2525323765710951,5489031155023978,5573465953689707,8886178307907692,396785015816302,2408386561138801,2193999538749555,7225768214397045,6543095642259581,38841607225473,2590036396359810,2667542470287495,4784634087821636,4829850971013260,7102714876043407,5779657425387673,736743014072474,4198700364365983,3267635669573793,1639546602537122,5162541711425704,6972333019119786,9199069988793031,5470066239938732,6546994946367663,3880871395205296,2602700461325343,172314587250873,976590409875642,1969771259257023,2943680700688979,7264131719921858,2710830766973123,144121962578116,7457671058374854,7382247859806408,690052287807691,3414634518208716,1974747552940238,766808001913045,1498460082127062,6790138495017176,222541701947612,6711038660535674,8457667002425567,1531005994098912,1623289968918755,5797045613306084,6994883429023980,5981497460433140,2449443620569333,5617442211881206,7574044638281978,3209875568645503,6459782280962090,273394857230592,5382045072228617,5528047705276684,2040503419601167,2593213432676624,867628945793305,1861468460261660,3491113843269917,3883341825311009,3177507285453677,7038472383652136,5663165365928233,7934088997110060,8140745589440816,4615395756048691,6993216621723960,5781344763601209,7937644475479434,677913023504703,1559481800270147,5719407946739766,3064698733551943,3113482814920076,5422901310197815,2239963438924117,8222040271112324,1121123873358167,2506432192618840,7938500815561051,3326019645366621,1934457642836322,579237345378660,7080180587757788,3034022934790503,239908617865959,8196802917155180,22829295935854,4365720179851633,7525933368090764,6979021252911475,5571604711661940,5582325834170741,3952571601116932,6531774414397815,4491355814592888,1580021458329977,966530709217676,3628746451086058,5507435142242686,6928718327747989,5297485742522752,2949542257699563,219185291747718,3829690358931850,76655381946764,5178663952375625,2906747853291919,488343052607892,2827527165960598,5324687531999639,8236332788708762,4428738892144709,6972891317281184,6635061890826657,5120095708520868,1141186957042087,3461209578135977,4243055758598570,2400279275976093,7423599261835698,2534319341674936,864541388734905,734877151248828,4367894009905598,3960882762853109,180570445717954,6493608736481736,7242374745694665,3161551173124563,2891657692135892,2723073973240279,5749596590424539,96269746471388,553624091689437,8582569744900577,6966940150407650,5032293642256868,2264335002288617,7536822460465643,4282969180304233,7985886901379568,1256696055628276,2764235000046069,2318965753774582,804243288383994,3152728495358459,5986020273693182,949114180108801,4185846618939906,7819270268494339,651227159953924,5136788857709061,9154836088758791,5255179605984684,2732410890019339,6536117194007052,2441973608784398,8724388857300397,4510097696186897,171631889506834,525027851018771,4736869323702806,6645007389229593,580018799886877,4328047955493408,2312871738901029,6994286531207718,2370757142094376,3730890530226731,4312118191358508,7807109958312494,2106416656040497,314287535292979,7619448224965173,2136892486889567,8015381322245557,3399940951097920,3303973141701185,918146462917186,8525977104349410,1359282289554871,3181661512526605,7392653230260818,6556426622927447,6394704354738776,7067821952615004,2921718113763933,7128038204867166,3544447891895739,1415384866620004,4234033742021221,3459583335850599,3057124965630055,4005736488905491,8801215330067060,2155790012736121,3026714639069290,2241797536555646,6632799493333635,1422820991058564,5099950772339342,1229831264717592,2129104136716946,803979742315155,1996146501967982,1114450513937047,2132823079035546,4919533763895963,744945615446684,5353400581776029,7813481776759455,3882629053894768,8932797360413467,7530544661471908,6917215119925926,8644074310050471,6307479284122281,5677587247260330,4945433777603251,645584958176030,1469147476656822,6612964566909626,2191237180898725,4682689363337922,2672397367567045,5575939703087815,308657296327371,3913805392331470,5826273051168888,6329668904594211,5247351962395348,2603886004298457,2425287824048861,7131216785384158,5001036988588771,1662839620944613,4149935958688487,9104528838443752,6712212603318396,2361887973778155,2755266143101676,5328875400839918,1162161813570288,8081448427905781,4097304939414263,1415198960050937,5225613237244031,8495427905127169,4253621011227398,3261535942492937,3004811963114251,5335830837625616,2414448819602194,5667254908447534,868748746777368,342105817334554,5668038702613276,8404304569279264,6903247364719396,3244490391561574,5252786561884967,1448580483130844,2094896689693484,7586810510574383,1424884109312819,5315291453940534,8869318102319927,4723811012182842,165464565138236,7893645145875264,5838518651828657,3857687007838348,802540384273227,1001919547867982,4545447488398161,4028693967635282,5746594677433173,5858485254972247,7012347605091160,1052403342648160,2715454614831969,616405313348450,4039068161077393,7627553910219625,3104139460535151,2117581545005939,6474167182558068,1352202425467766,6014067406701433,6635034804650874,440490113362751,8947046216409981,7739352083817343,7547133424501632,4178666233316227,8597814226571414,5515570629673863,5175206149637002,134631638737805,7900613402067855,6811999501796240,1385265052582802,3638258506057198,7303159826178966,252225178616729,8014140664734619,3678077922050976,6475858972091298,630575654107442,3455690168394669,4712442922288049,3694557502604210,3838110540899827,339853944996791,163087280227258,3038296574386335,5819846375807818,2847257922511806,9140979721561030,8504775078470601,408930455926263,2645659218101196,3062295838901198,453303649428433,7946946775745490,46034092622804,4813366863946710,3345498112738263,3236175403254746,1302589489675087,8809101287416796,7744688719012833,4788634870113251,152983238910948,6270535508373670,2368676093592554,760844882199533,8808233417259375,2076767676670962,4071601899463671,4225272153572346,4323865388622845,3038573020464126,3850886999461355,7414734044840960,4887435110974465,253470389675012,4988374187049989,6307293486220295,8687110396641452,8449913217418250,4747400745624589,3644511813919761,8281095444775957,9108864404374553,5741944015479835,2418638087668765,1928981999088644,7879642725597918,922551005078563,799622882498054,8020955971281958,5088451270616107,7339650542986284,52691376849965,2256785171784752,3869012521387057,5703441716503603,3094532222796855,9079101811537418,2758591649825854,5029153946354751,6785507250332737,5428722642043974,3030074892067912,5189400696939600,3790844978218065,2496040121984088,8238669303268441,4800599959240890,631574824485983,4825532956689506,5741403065508967,1635621101823080,1464990114309227,7924856097719408,5792897498227825,8461233861694545,3513754451297399,7175787184850040,6372022465971321,9175241338627195,1980977059488893,8970235705468034,7628553175516295,5909829663138956,8434763735421122,3938584545719669,2878663439164559,7322454714081475,5449052806200174,3486357464716765,91776994859887,4957321439708316,8766461300253854,7484963396183199,7605702212471664,5541148930729122,4988948770800810,4047306988618926,1946609926424051,1052416130214548,8324873660720307,4322512205472948,4523985069373107,139840712451255,9008604457100472,3678388992550077,1814248429552830,7079627957691586,1136198650700995,5328950376793284,8068250695705802,6911742483784907,1347963907567821,5402840542890824,1369392084208504,3818860565701843,5932777996584152,3225380210779362,4370744532501738,499325033350379,2866299808433393,3122119501751539,9221425191650548,267988438705398,5390746175538429,5227212839412992,2102833144359808,7534367476540674,5994347198424324,8069840675897558,753759663097388,794541663167754,7323292144887053,5646226070504721,2388340610860307,2346974748919060,7751305451521301,451962971251992,6635806254821594,789531752367390,7530142216545568,7108856388863266,8577253546659061,51362848843045,8743634904950055,1125783427760348,3507742457174919,8085310756398381,4834465612399919,2690629061182770,7564287285134647,806172924077369,3479711149098298,8361852125733565,7150864504685901,2554429623092558,5757779917268304,4488906463552850,3818679933052245,1378494389703143,3231613868533084,8400186251535711,1073377935861090,2156864136840547,2552761968313701,6895636892271974,8731921045391736,5310328448574825,7838453201585517,8887315764069743,3290983256032630,6969578114721146,8452589335233919,2895584119965058,3941466145483670,6256540945184442,4820306920973705,5276520145962378,6303804277368204,2430411546199440,9065927835813267,38818043340185,1963234702542240,3607247850362438,2052964550165927,577660822947399,6455849292096940,4631901991530738,5322709510399409,5480833014922119,2155099707327925,2373156284917174,5883348237600184,4354799143658937,349036383610302,2840434417176821,4613881804735940,8941969078977959,695386997777863,2189033929131465,450387296216523,7098678491989454,6679997892077012,2968973883377112,8229988555818457,4322535473047003,1695287830169052,2029919174763997,1635460431455716,8008386902913276,3797932621604330,5117117296346604,4498639197226478,1758911767234035,2321244912870903,4390334152508920,519139664487930,7943540703569403,3083108902921730,5814666414966276,4242418685060613,6919505571112454,1788311786718730,5163172003317259,5045753466824204,2538160032613901,7048767976564239,8681065849005585,1785153272030746,7294785005127197,182898520999461,3936538955523626,4574541529744939,6367825116866092,1614169363613229,8324482657192077,4414640677799478,9131969772267065,4491720404805179,1707351662470716,6275569156318785,7217998093215298,8950092868380227,4350879099242055,5257354519709266,3244706890688083,6460106602997333,2356795241014872,9005190761693455,8011963517961825,6463145968584290,1210429157598822,7595328800859750,4700249477482087,2751429091149416,2490678454208108,7355112444154130,7489671861716590,3994398765549168,1766348038415998,8160604572542593,2488895540455043,693355876133825,6562264062305928,5811956260472459,9184194663122578,9002554511514563,557587424102039,3280162177648282,7827758683006619,2887921757824668,5135630748976797,8297964688890821,6439450555459233,8348217318131364,4743579364730534,3558504327980711,5445329788102313,7688394581739178,2499791099979435,245893497513644,5705107905762930,5986038148556462,2793200375588535,8693529464538808,3734253501327033,4295452033476290,4050948954578793,4132900639118966,1602491690837704,6161890620769999,1100047012169425,2849835060020953,7716078015506138,1875952510994139,1684705371170527,1242205871769316,4390150648358630,7521948106286828,7811754500367955,7523127899899637,7300231366149879,990823808175433,1734610027595519,944979568305925,6784533316069128,2673090842281741,46172359657230,5790142845814544,1693495626065681,1238781016704643,991368822892309,4315688533272342,5964332960794392,8056746976945950,7876004361373471,3877377518085922,3314898746836771,1548508614625060,4802818126014247,3024798044423976,347405151872809,7009040372770602,5400170934077227,7769137448560428,3904260817708847,8583718566750000,4332190658996019,4783705138693941,9125089255458614,4316471553779511,3108737821460283,769674154485564,5412560597485373,9040912894854976,7370323323553602,950926234109763,1276392418182981,5750596499556167,5997205610807375,3981480636368716,8948284074156344,5477555830515538,7990819885836116,8228787055535958,4513414096316250,7605892560262799,1617745422206813,7519663885633376,2066862985938787,3231555687384935,2023310882285417,7689374522435437,1695735782336369,2465067387004789,464844937594742,6439500402370425,645322886604666,8683809100621691,1729056157001598,2809207115917184,5164502417909634,7050029240215430,4329099931576200,244390430828426,3906596630054796,6411542306260878,1120914162694773,607931360569232,4343741075834769,7470958224779155,6077977621923735,7259542709858628,3974704370165658,6896286269056924,5563625662728093,5743789188450206,7934583511238561,8168482571429798,7046081227172406,9139216570673068,7287229084985264,8205879870818226,3924981001784307,940686834354105,3477089239623613,6841810411907008,608510283744929,5645287448438731,6309337647654862,1809435334821840,1348672764046328,2313000406427607,9006197149689508,5372280341374950,8982238048438247,6181063912032232,8477587493675834,3989815778121109,3369841660451838,7679925980685993,6150043848370170,7345796241819649,2279551492341368,1676853913184266,4439162284255243,5950805313128460,411021567707150,8398390738774032,621172225876312,3542217132222483,5612181399955478,3455455286265879,1670088662403104,8940712400455713,122993595844642,4577859041904675,2644597869226020,5742750245324837,5198273904748583,4040448734439464,3644754897800872,627260720269361,3287859448936115,6113513907939381,6878966461057080,964830664910908,362759948781634,3801773434538051,3177986524884620,641730380228678,2491402888308811,5095974070298701,6597537218111567,5612952615949957,8947970017244856,5869335388022870,6985269082933335,7964419525003352,7287523466807389,427514382141536,8040353089382497,1591145466472549,4853980453854225,1569022624401512,7052625664739434,5817224966047853,2697316647133162,4575372518353012,844909223774326,9159875356084343,5068944613951610,4657667930228862,5754391019268223,2633161394137216,7222549907081348,7307767755999367,6125290660726921,5125064834959042,6360418433394832,1875663824857235,1208517643470996,4288250065512599,139499316873369,6683001391818906,3715998897752459,7718403791251613,7790978102544542,4159796555147423,7526884818880673,7197445690394789,7298277364015473,4502813904251049,6127231630985390,2686111931549873,1121253360075420,9095982484050292,1598951503136955,8007872036587716,7408339075672262,6106411774224587,6633654774286540,7369133933792291,5860363240949455,3872713023861992,3417978585606374,4626890920134887,8895294490227439,8317617757874409,4604583415839783,2918664417806572,1754373114292461,1364654679697648,4644759996934386,3381772744403189,1397349914036470,2247000838269176,4735403248534177,6312672015526139,5459879796271356,8533445435058429,3456219255105790,4429157377100032,711426300283139,27185290111237,6603795650717958,6842133208688908,8473163962681616,7930834378470361,8386389409589530,9125491490655279,2579211071088925,4654881424697631,4697421169420579,7168124547590442,6664273117219115,1688549261519148,3990757708746720,5440118686492976,8663748006064520,8301054501677362,5566600310171955,1181791770028344,119519892957497,7152725681162556,7148478365731133,6303282106951999,8850697596937075,2884322383350081,7287743523645762,2437469366126915,303792810936646,4828154268166472,196096446081331,361799427631442,6606890836076884,8411799738338361,6431885780756827,6518778511026525,8458244191340895,1945612330846560,1466373923981666,2820735672854883,7308045796133221,4737509327546735,7187738267710377,8494338828299869,4364828690000958,4526260440344951,1733834564774264,2084684601100665,535477577501050,752360829258108,8963371188030592,7749936038939006,3135693545859456,3949785463351683,3629664753625476,5921138066227606,7507258291284358,8150774946941740,7638981029071241,185178629048714,3404370704755083,7624812174084503,649903727749528,7075842790459801,1008396737612186,3083528067344795,1505166884424094,9005376078825896,4954801617930670,261699206097329,2280476613503412,6418824488274358,2601041465067959,8741314387778567,1462917172742590,9127860784777663,8458454218189248,5926075140303299,7399345474570697,799631078140372,8288905227798999,5711290970530212,7203903934073307,231885725600224,1401631346747874,2840124716427747,518659846171111,7277471846402536,6542547743809959,3061444158310893,7641024090786096,7083639624554792,6846523183045715,4217505649494518,8767797597286825,882734762617336,4609300502259002,5797989429086718,1454589038569983,1835445884627456,7709504873409025,3579244404443652,8934378992945669,2270083691047435,3285634791475810,6988929809041933,6219210028157456,7966728356456979,3115012626093828,7269203861137946,2358966679169564,6945571247507998,756443186498079,1566214321170976,2035113614314017,7798520864098852,633145069849128,4877510443641386,8522953478826541,8312473806847069,3505388735834673,6275800643501150,5161357196298806,634941866658374,7590966090287687,5840493808364104,2029021603297036,4993516836989521,7771091696708178,2247254253865555,1434058468681486,891953573669463,6165364991552088,6099077009476185,4467909953038941,7763001872132702,3196386777254498,5030023668779622,3652794954443368,5030752683114940,1941751250345063,6714620145879666,547671450921589,8496481165372033,3948747398479829,4832614639069827,1455877363305092,6140900947969814,77484888386183,1790698261214999,545827643247245,4708524272249490,2028255929477779,2717637799135892,8817469924412526,74848367389334,3679331334253207,3219386779724446,162063684946591,8175245638249120,4587602304437360,1277804119018147,5635300183059110,3962724143032999,389843054160552,7801321295687792,610784442337962,3374090573015725,2486074344409776,3625957998307988,1541660058176180,4265744677628599,1329726096796347,4346891458611901,1328083076197054,4145656386325185,6705324156639009,3506246544362185,3817708600264482,293999857961680,4423003000421793,7110219903986386,5168224338085667,69022696745684,3046758204165567,3442056818780888,7022023038192346,2313567470963425,4280772757785317,5763310956661478,526060729551591,8549255824100073,3722709167459050,5636665801599723,6110255356111599,2510918121245424,3799434883285459,6071558165056245,4192250354223863,445274298417620,7953590872328954,2535786338458751,7996503119080192,4349420801911936,9000226562829058,2707090436426500,7146204593367815,7335051483988439,4457174105369357,4369390752336657,2494618255362835,2102759452011284,7438975106345752,7381294683376410,7254998237514524,7178318809967390,4801874527652997,1474921432451873,3888410967651471,6723398326927835,3441329018924439,5117258822581382,7839737950202665,3355503181978759,5059751569287980,7051113989204782,410102597984733,3548640552258357,5006484599738732,8408220348458411,337556767566654,549301080361791,3778093350325059,4296379984399176,3953297917487946,8277401421957967,451787562519378,1935848038649215,7696448068348756,3724131533146968,8502209799334745,1117410845684188,8681457995213665,6836679826615139,3855285694499685,3468150849448809,6017137807215467,151308222327661,342621057500989,6337249028459376,9419638156147,1789182455917429,8212736167322089,6116863207189368,7402866278196602,4250667297917822,4240482525653887,1556257788340243,2392214890695553,3439949346564994,7375278961200003,5006585853766533,1476580480060295,2434648130096012,1796442311183252,6373663340186518,2619976433707928,3617041046989722,6604358672992069,4989791612636065,8909624135314338,8720438866674141,7480366731594663,6246935491898282,3876824901135275,5172119560694702,1474948098911159,4870599689710522,6268225653065546,2789844821311989,6543660412120001,103525619469252,3835281973406667,3182562637303853,5771861367155667,845978092461925,3910596828384213,7173722932169686,880438698351607,4506419940608985,6542447436065758,1172597654449124,8658378547940325,6886113129352166,6054598062738417,4733484086709235,6479264619498486,84630215371768,55507175197691,7485570643930108,8419673801780221,3734233449835518,8291547130391552,8909370760956930,5520734614359044,5204936776264710,3104435636096009,150729673362442,5009605821574157,9107988582067215,7055246615682041,3101304661584918,4914786719553369,2669033484856346,5423993482094426,7487221376635397,1007473909885987,6653770947898404,4415121743137832,8917539786050601,8976427940170798,6127868389588857,1249789357386800,6355598654106673,7867458222978910,4414873342561336,4726020967689273,2440362780132114,864584386071611,6713540085894206,1065830412389447,1835577801337928,6953285159966562,7110318387571790,2123366289099861,3437020122098780,28797355428960,7882353459884560,4718522491317436,6309119774583915,6034876483087470,4682047752244336,2704547822670355,7980214406081654,1947063609633912,3647654787443835,7214229317719914,7021815387950208,6197511618227329,3826804957973635,5551232173468805,8526025652341894,1020059938699116,2998267631209610,5976444814060686,3873940151061653,2126064876989590,7240497493126299,762110219289604,885781446044832,2780831975517345,5796436335160483,3497945779834026,4747839170510023,6984715323272364,5567696036457653,3980157563915446,7957074187586746,5388313499331772,5858171060967168,7499583442865343,5253151584875040,4918505323187394,1073589848526020,7066412140791670,7568236833008838,7274202137799880,4517771552427212,198714028575950,4752862503464143,4806201068522705,6484121346370766,4088797605881721,9203605940366553,668641066011867,3844840401800413,2166611116797153,7318547227438306,6611577196784867,5485074377780464,4336147224653043,6157132568497396,4914467628002549,3995960563567868,6753460655628843,8521094157880582,5798534174084359,8068204702051594,797142316342487,3835269384563980,1418567296830735,9006509413158163,5346405026540821,7642549440302359,4179080475725771,2959325721438960,7451646572373894,4176473273429287,677636202990888,4423776184727431,1312594587670378,3621480196295901,3538615438576946,7065802968834611,3182619988684084,6477535588265272,2220257039158585,7866847048232252,8100920051804042,6473477913095494,4266385726475489,2534669346483528,4710969716354377,568565991140682,6981101512854859,739973326769487,7909615294131538,3987024053775587,222373208070031,5919437420825949,4905651457346915,3640665600249192,7196806752070605,5756040820886893,8225197025512814,7381376018812275,7604862531562868,7246709924146550,8039559162760570,9138330927705467,4062453592499919,6213703796960639,1084095835336067,8146271366668865,7010207555366280,8701208146610071,1309178386053783,6290901981187469,4321016497909134,8207714728103311,2908573095202197,5505600343985559,5909961080327576,7883075572428185,3712988423626075,1422246408859035,1942944660204961,2937956240264612,4636401279151527,1989309856058794,6836563932278187,4593460041993651,6393034419867065,7822335480286650,4105205256842687,7179770950593984,1673222388600262,2358545919897031,6002577555656146,5628219653869013,43139454119390,3523186874559971,4920911901412836,4605003181297126,591903825071591,6894435084381673,6626705556557290,5907147632561643,5441013959839212,6477072392343021,6058313791892978,8343587016912377,8896059050782204,2386120986054145,3677452487962114,2341394735343531,5411569327975940,3766216568770062,7059089084837391,7497935989116437,1528265427463708,4603751065390621,440545714083760,1510137951219235,5889327323352613,7088159055932972,3786542233620018,7121778485997107,5783278075514421,3459785317207608,2302429923593788,2036296504618557,3995216657927742,4069443226734143,8142148263507665,2742447900011787,3235875868200516,7314736120327749,1850883628396102,2970717742272071,6003879971237452,4621181706104400,2604880913296977,3243734803893843,7539979078241877,4694928293989974,5692653446671959,8842809745034843,4007138424655452,5878087973310045,3471872366571104,5844961957162593,7317234712219236,2421733706042981,8993859570971135,5329867728189372,4828448461254252,5035367691243117,8339888284880494,51560666499005,5284282422324848,2358490461752953,5536963288541715,5466068746326634,2631518819716735,550756995042949,8286315975315078,4210224882372231,206997478125192,6051851337108759,176747158154892,5110664270026358,4190666730057363,1174522742911598,3968480422964888,4769625610145435,5381055748222621,3528311343402660,3728139765592551,4963254715928232,4321726808821419,8673909279785119,3745620019244717,2392384367193780,7314329640054464,5120499175493315,6699093737336519,496608873615048,5403112341155531,9029495466864332,3749457189220397,2694408367427279,6283486604694035,7898081587310289,4003803741023957,2638865393241814,8077266883858135,7877327851400920,6204915536359129,487455575133916,4722889428430558,1765273084735200,572966249991905,241122039385826,3597070710935269,5844137774862054,523656540008170,3694638216187627,4053764211945200,2867381584552574,701290710478586,3738783287889662,5212020970622720,6286015994064641,8826175836663561,2469041438140375,4318172820868877,3267061333683983,8943110424514320,5489434795740945,4587384554893074,5414326221786899,2951826259185428,3413997221293845,3199143416565533,8611785451063474,8477900684996392,4241591835758380,7547420635074352,1778649564777780,2596644139274048,5133542834761537,2192540718960451,9154984026148676,949979837828933,1292250788695878,7540317744838626,4770862928826192,9219651720339970,8612960807622627,311021131542356,5050921070734649,6035320903880543,7720780568530785,7845823977213795,7088441551089509,8219459734589287,3390846946824041,6885137109053290,6867296656740203,4270804620935826,6671457565713043,6799561856298868,1110269154783095,7026928286011258,8648636511350652,1491350636522224,2972888237354878,472267218182805,6570262760533895,7409826180902796,5512329702256525,8993749074169744,1421961055186835,751567048863641,8230229726597018,5402005600366495,7299330788028320,9122106910904517,1500813098725283,5042555893165990,8037459077443495,6210598119522972,5970658458693546,2179632692711342,6910144979521455,4692270150102965,8990413567356854,1546188709989705,8091840416174010,72999100452796,2989724754669502,5341769391104995,4270163229716416,5289678283534274,8470492688256331,7793985589694407,2187952697716682,4769227126566859,536212052414416,137159319695314,1291864035827022,3591705295409112,5242612470960089,6147228438524154,5815022167510351,7936277597032413,6580730890236851,1784545922011104,8253145076535266,2553479998771171,1088731600924644,7745205971190438,8732765911822313,8554815614938461,9138038982578158,1498945860890608,1265944174759251,8467282713374714,910135918325762,6529721430897323,3789132731658246,752679927197703,7059739841695754,715614281150475,4323575665446924,8337012343908137,4815188149579791,5782072420511760,8939602774568979,1222772089827348,543614722584605,1722826590662540,1440990001303583,3052807039397921,2499457731620898,5418235910131035,4885174407991332,8836661755490346,3626176661393451,1338787906678829,8110031013941295,472798294708274,5385788488536115,3539225141784630,4417537211740215,986585868480570,879771671474236,5640103323963455,5758343201255494,8563793818404876,4935628492197966,2419547206004817,3607696371634260,5784205156921429,4624082269925462,8171712304033880,1308835282133690,1256893019017311,8976494200592321,4613573263511653,9178635116580966,205564922327145,1925816513466474,6297963368271982,3152109914116207,2778753076047984,6624123145117032,784551023554675,5541263155884152,2331220544721020,1770017329934463,7089413180059776,5140088494100609,7212984745537666,3476125820145796,639574600026134,4255621978583177,7963497911627915,6857082752544909,2562708015059088,899211918782609,3984237287362707,7166977641943190,3545628588288746,1472497174843545,2039883644833955,4080044048683174,301033618133160,5324927794016426,8493592611899958,169131628662957,2946760093970608,1360331673071794,3033783351433246,3717448981598391,3830294773010616,6939902530162873,5055161108746434,8737224696513227,5171409849430212,3477136873042117,5048564113510599,2905666154107081,748045109645517,6210427996942544,1635912887595217,797738810709505,3224258267721943,1289017704222937,1847905446654170,4386787303198939,5692074336030940,4285047160910058,5597288044810475,7612919953051884,1783115742204142,538582789201277,4107523177787633,1422188684906738,5396243051778291,2954595615846644,247369870201077,1316462371934454,2275016173555959,6482847002210552,3220905180836090,5614819222592895,7408707429167356,7250433230123263,5782701754822913,8171899014844678,5951947152838919,2303354958598417,4254014409601298,6872114604790040,8941201571066137,2487008618254620,8428104687210785,9159633915187492,4809502906290470,6009034562195753,3277833398333744,7287897285529908,4383487219155678,7522449983721782,117335743443264,1578185156432193,4272540516774212,4132359137440071,8326220802060617,6994835221057866,2683774241173836,3164181144169870,8287344498348377,1689986136838493,8598371545420128,2373045924131170,4223503451926886,3348272481169767,1991790658539880,2212608910381420,5416564673679726,6218345190814067,6931968296677748,946244860211581,9084377059463415,5355201068036481,865520317657474,5669817930944899,244371813642629,6644689061728646,3752345651343752,7685259698082186,3152238596936075,8271087753277842,7692357692764563,4037934904209812,8985873275392407,3316460848583066,5707387711590811,268700016365983,4482295962358176,2648541163614625,3640812870922658,2228075926326683,4275791385512006,3531119589740966,6341168694721948,8491269517668782,5488888939737521,8435101062271410,2668269115814325,6215998044811708,1671150109872583,644705457813580,4570011307188983,3446080331796942,2699214836421072,3931599860654841,6281229397455322,8453223308227035,2425874246898140,2071389614379485,6353093183197663,2911465576346081,646236877337063,3052172267131369,2277767786967533,3382079010386414,2561685185688047,6563427968291314,6724100990816756,514322658759158,1625743648961016,1499812013486585,6115355264733695,8171407483818497,5379285922935298,4613364551118251,8472424293143044,3468412374168069,7764783925088784,2953567878576625,5686343293645333,2676579070409508,5321346039550488,5119412696347161,2691937046098459,72019787772446,2972768356373024,8247753860715041,7098995470332456,2548475927032364,7505016075301428,8057156549104185,6875555456201482,8251908850107427,5726755369488966,17580447527496,6943203507839396,8224179558691404,8949508636063842,392468971459152,5589735297405522,8853495779521111,5950166159348315,8834964389185196,206863421436518,148829832876649,4236535521612394,7037633733694059,7661589813015148,1218635862471277,6690052171403886,6677515768083057,9016848808333938,8264840438919795,6543251044315770,7548360467377599,1849156270133885,3990676255036033,3079427827176066,7650367757783688,8384796241900171,2887593205363342,7319787297657488,2276334226707089,8707673523933655,6179084541506198,174092393927321,9107706704671387,6889133773722269,931114858541727,7096818156786339,4859312060781224,8011211183960747,5334868107245682,814719115547310,5014541809947311,5824865063596722,7236566776427188,5462895036453558,4676818772210361,4488225605792443,3711075883340476,7204258743120574,8644450300031679,1691378490127045,5014712476776620,8198449764315855,1671376707244752,3537131411272404,6372872370639575,6602521355317976,2596183141806811,8305605739410145,7178057384194788,3534903373763305,3769405081817837,4635264449884911,564679544083187,2843410390395006,2058198122705654,6773761282519799,7869258478015224,8031666531463934,1223842626482947,2008832106533640,7917556418679562,3616373208953612,1412723804074775,7047010826392345,5197142227707357,1180084856992540,3033537117131549,1434406246585118,3031646070698786,6086076787864357,5239450411733798,5894766516032300,4979385677886257,3060325476545331,2111518760350517,6090166204355382,559472193090359,649533487379258,6445540893881147,889990845461308,6275007567950645,7107818275459905,319044837446466,23784373334852,428868936586055,1029379243062091,5848407878636365,2439698810869577,3180383572063055,13275353692302,6099874046128983,224992115438426,3657688349983546,6739049995924320,7566662575870817,3851021546779491,6304578691752764,1192974936855402,4959067949530599,8135903515385331,6006902857626482,942939435979636,2568756775000212,89636982510458,3769141607271914,8663357912888190,1109356277175170,4829227040554475,3524241154986885,1636887718523713,6988384936186769,7303527548539796,5679971773862809,96708148835226,5302733770847140,1429131882845097,4021861390758827,4530592266358258,163394104210351,1640752656978865,845608438543283,7019777084584885,6445973278905270,923480059126601,5338924216701880,6576684644324282,4453988292187068,2112262731461565,7495737455129534,1824300679754689,4876751114843075,8699235172588398,6997994340657313,6495348062327752,1581308987331533,1059990489174991,3328205626135504,5275610345534420,6028468665750485,5430561642574807,6272711273378776,5314656414405593,1570624046194170,6188654534882271,4124647714051046,4963131493344058,5797984322630639,1161174065263603,8938803398139571,8113340337673213,8175436450534399,7516892084319234,5240847352697860,1891722132689925,8662273397593094,7691701366486025,4213309003445259,8302186267800590,3522141175714831,6490261085131792,8986318713439064,8177577348147374,4584244421162010,1591227205366811,7563957460743197,1741140370347038,8891372956562467,5189726808929316,3788151660581925,9127718926316582,2006995241907241,1311138530333740,3322794065608245,6779274416010287,8687573943805276,8220305891644467,4415962025014326,8505461497033783,3548474650465338,5751212574741570,4074531096024131,8572344567444556,7509939212006481,1099328262162279,1739581596759125,5594646432076888,6088816379901017,634791931237467,6901256385238108,4827581558387807,3299192774685795,7282666266440805,2113354024948841,8311603214920832,1354842852531362,3297351284405357,7378269468349551,5815925311280240,3126262857659507,7214343979160693,8013350872925033,3533164630594681,4398695518024829,2999651897562238,8195668322104450,7555570266870915,2230607589201034,8882014920521888,7715974124598415,7017507033396369,4341863327052946,4813786861687955,8133751436752024,3945227107129540,4145208421700764,2546815581164701,716018905519264,7554063028679843,5029474934715557,8710181816833190,3923130520727274,7927654550754162,7731186314972701,1269288391349425,5291144315274099,1972774975231156,88258050421941,6099831570322620,3031654364296384,8221055718438081,3816046361127115,6989238001997000,2769953879432435,5770549430482124,2884032529118414,324440350635216,135035528893650,484387256300755,70119821898967,5275357614183641,3431004893910234,6960343251219322,4184411000656199,7508267946161381,6114318400214247,1803633678234856,2409380607628521,8328832019783207,3306562657391859,3411488305886454,7654832911258875,227010389940437,7350276968248583,453531674963500,6751121999623437,4937940142126350,1651325976810769,8556558695588739,4877530705188117,754501424313623,7073131421185305,3606624559306011,1523466988066077,3386666723816737,2695669216430299,7019329286542629,6130052147426605,6468598609884462,7359033650271535,9031421867636016,4758061021492530,680927149493811,3338110183994676,6936243281810741,1687230068446518,1488518906213687,2793188327415141,6112786607052093,4243985181081141,7597580090930496,5468618224552103,329266710844741,5373227560858950,3681068123436364,1108786387982562,1602190057059663,9516075586900,770145016041155,802408420513112,4258135939331419,6038678290060640,988666236777825,6993253732636002,6591337940686179,8386546780500357,4501422398879081,6030727440586092,6559049730266479,7117576121103733,4539548064879991,8328390345301031,3856928969790847,777177868498306,1819081241720197,2868763349562759,4956753747129736,6857923279312266,7098352998110604,152444470343056,2204183874196885,7900648990684569,3499745292137882,8827823259597039,675368807003548,1453635602847133,8442567655757218,4570044996498851,9134503886255525,652793889953205,1738938586387895,1192433298199994,5535599005308347,5077104868365762,6905735871821251,7541796662195653,36376813401542,7775922984089032,2364166021117386,8000310418109900,1432487719196110,434154928551375,2009187874543056,6536784540931537,8593669138830803,3479722355570132,2100228832163289,6734680136472026,5537072602412509,5033414402831838,4051991466210793,7017187728618986,3697736240240107,3895945499145708,5226365885134320,9134221739259379,3310676763727349,5866509738440183,5628882285827583,4881994831394304,1521839050036737,1626938506677846,4475501447312902,5454537064192257,2488731880855048,2798457770645002,1620394708858385,3102924869850643,2853345205384728,6637079056258587,3972775355119069,294034935169969,1947933302429224,8757868122658346,3520623494567471,2734839620990513,532618813969971,7820594164258360,6684240814030431,6528235133688074,8989254681056834,6140932084946502,4773405251204681,1700792312116812,4058341449905741,6459571284547150,5269832101017171,5110810807416409,16484098438747,4918337292392034,663321279231588,1311867793446512,7528864851293810,6474711348975220,2099663352280694,4048102526711415,3811804460734075,1392177973016195,3668508226147973,8370321654101641,7544878222201105,6490597788653197,7408356887131790,4491736761259663,6685050917107348,5329107184373359,7369625938417312,2968313407753840,8597043854877777,1746825526171304,8113369012934313,658154738734771,5266766277605044,3797168565540533,3620445985601207,1565398626329681,3629079897063028,1560221537040058,1337987639850689,5418400664417986,1905576591627972,2507296291018446,3582059031369423,3993342767388369,2222558932793043,4759524923119316,4306725967894229,4593395418486486,701990804782713,3268137663665883,5998617988208349,8795894399162079,1982966677837537,4250680297256675,6167099954779876,9134366998905809,6448019152516844,1987842280132221,1317641833035504,759756593166065,1952197420332788,4432832620852982,4890419739211515,5307290095228668,4432114831984938,4923426849813461,5002596600452864,191557736106283,4536452787599108,8404681122551561,7211681686296330,460925349730060,6866843524749070,7027270067762136,4380865526601491,3296303485556501,1409337689249558,3103174163396375,5195732642584347,2239941964060444,7713801847133984,4178531548305185,7223687142577964,5202985337002290,2031700261247815,1544108306560819,5960665576838965,2231812040152887,5086655793444669,6996089698119307,476612463155013,4939478169188167,6313548178003785,1789930425866060,7717661337352013,3224822150362963,1412951227864917,7904547923859288,410363317052388,6893847952480090,8919111897798491,1665898262779742,4056043589957474,1687378918520682,2582048331765611,166952062539628,2997921402400341,6805868136970096,7757015815911281,6080135551481719,3249115449202553,3162765902874943,4654449656360597,2045177417774977,5598383467927428,3636192841725829,2247426463869249,3522810694869997,8020274697443218,7980889385003331,4861860284430228,5489442430932888,2564883022788506,1151503945436827,5977676543268775,6747636870698922,2328239668088477,208381957437360,3556855211886920,3679866697815027,8987119477651383,8863233351759801,4372265241343932,6301483933415357,7777912305817537,3706647827756994,9122953305328430,1855500808157130,4489243888474063,6354222746163152,5418429183309789,2967793244383974,6403327913310177,1162261656745954,3564004000454627,1827943397472229,5202080063682534,7544364241270759,4404511329056752,480214455512744,8589415043515390,513921930696695,9062911299115001,8601963784132604,1964701776861182,7324501505669122,4121890056329221,7279079143343105,6984241580931082,7759364524546062,6953370974033937,3200295722178581,1006510055487510,5411203842971672,426358780041241,3455355416606747,4121699898103838,3132133920577567,7762270196600215,2193444475738150,74839666685994,3825912435550557,3477105050023985,1862998468278322,858222347435699,1697723516557371,2035490420537406,4267441957099584,812074775750852,2866784219741878,1778733745879110,3807330430507079,4355935582115914,5427646602000459,3477334088161356,556091140716623,9142615934539859,3467495616796758,7213391187859153,4804737743214683,3724892668606557,961001445021791,2465240836954208,4900791677950050,7792643535018084,7446281695049830,6212668347357290,2404693591431275,1773424248813682,3810513598617715,8338989666170996,5290688768301174,3805893894637604,6380015582656645,8317647204235399,49236184062316,2051997053139104,8692210366937229,6496371426637966,2629168723531920,6848385189924547,1353189252888724,8627150892832918,2047437247166615,1257115025852783,4568013324548463,3792742581041311,557502412568736,4908031450874907,9109165837240689,2156061016905896,135523293018282,5785841435236524,8354164458550301,7101027091273907,6852166361045172,3847403468519607,3382622473312440,3795729988679867,7076043556042941,6951965863106751,8757161979639664,1843788569090244,4324070318766277,6970545581217998,3494562257537400,6184308578711763,7892572040681684,6280595199693621,1206357579938007,5461290908825819,3893320751339746,239167392807141,597801233905894,622114623674603,4734056143067375,4721562754414838,4876820459485437,1281573862914304,6800199703746817,6210296150751490,4523752636086531,4029883652077829,6414780297296135,6700347918293258,4269617711218391,5159610281154828,1572473466542350,4033930945550609,1135855791970579,7601460276853012,5481871237937429,634763964578071,2478511028451610,1169072730970397,7166324961368353,5988443568011555,4695792789469478,5985887358155048,5068289716533545,3163904314390834,5783631610487859,2815250988226869,3754848449370425,3492053050788234,1230001195039038,8193178050279743,5103165708720448,7520220024060225,1574080393423243,3750358713047365,7534596305025351,7781112740387144,6842743449344329,7221163140077898,5396968164555087,9102104700426579,779826398312790,4288530411067735,2743131018819928,6187395911801177,5577989692086618,1832453999458652,7264630891641182,5029337640483167,1060000031947104,2348299640715628,8511554875816301,7004503011006830,2699833159088495,4829993514555762,958327032183156,8458937285837886,3511345856485752,2222259588184442,745396988533117,5351601767899381,5770284326787467,8477168194607946,6558135237958029,8975264024574351,4407587523713426,3847215704848787,1712388134230421,2741948239706524,5638948789438874,2389209192700320,5926354603030948,2323559569955237,857067152538023,4661349048375720,8176445283326364,3602020029430188,5387517176423496,9163409389595038,122106528324035,5072873522338245,2403802929379784,5942003261307344,602481291737554,6385551933258196,4376512298400213,6341814417545688,5117885851572697,634237787847131,6153634142206428,4445606760847837,7122381209680352,6665059455444048,9016824998402531,6790918286719461,7161134855461351,5562115702143464,4962315919940007,9168010166024685,9114514229058032,41765065922984,1687244340828659,1294797281049076,7995545338935798,3370055688421120,7189721920469507,5753144613457665,1212323941104136,5423408543234571,7461373336132113,8346187409545747,2444978043214358,1534350957378073,7645604600371744,131760005863857,8008573643758120,1376244871813673,3658285168024106,3776202029472299,4701700777441836,6721561389778013,3113489373633074,9022793639393843,5150037791939124,1497552722942518,8928481571494455,1267918265694779,3850287950625340,7581321690356290,1358159514033931,2645824631822916,7736824653724231,8085979175402061,8255582141807182,192556469877327,5922216995224146,43385942998798,2022421083052637,3114289564990046,4139187698055775,4804102911031904,1162496771586661,5916668664126054,2336073503360957,4870571175320174,4538741621324403,2109094743399028,6679288930048629,379483520069397,3495742491835008,4266069358082689,7270496299588230,3609503492627079,693802943519373,5302687539147511,1854567252482704,6897805685176977,6338870942960067,8016525659708054,6218776023112343,2023947500468891,2153286406068892,7484665500711582,8892003638858479,307218896263840,509789324967707,7197137194588837,3070958125980327,8513300689042104,6379777239554748,7459870355249857,699536496122562,403639780596424,5911372782036087,1494754757892817,2662545105443540,6569637802638038,5257774283093113,6659808127130328,7883160859925215,7932494234900944,2401432742091493,1938442899094255,1814812075703027,734220917422839,5544184874941176,5741344901212628,2489044696260394,2786866488048382,1170120401517313,1486616169495300,1141514239916806,3549325696970540,4878920438635274,2358127100025611,7879726178155282,3848083654302488,8634524844137241,4418704247675675,7235073670970140,7794246632577822,7530464225745700,408636972054642,5325462650469158,2043249430272811,1993925771791489,7525108486544173,6730453744466742,7411184728480571,2912322309520192,1246266702031328,2345169717738308,892800551549409,3590895572687688,8212496098747532,5957031239088970,6389357968767819,1635496620269451,8000661399935823,8353993161792336,633013093145425,4213068866403157,1270823001095000,8947617715927898,3306000940242063,756426720680798,1280058368097122,2221807948471139,3561853472439140,7365137464048492,8312022523321197,7395317769386862,3750485143403375,493093602204534,8919708104326007,2627396046248826,4490016500890493,1058628352695169,8691206228958082,729058373106563,4845106995608455,6162140175719304,638964931148685,5523784376418115,6616669941103508,9095081589809628,5586107358141334,6024860613704599,5840669387840409,4815294602025887,4404476449725348,3626364642484038,7755820404358055,4809708514718876,2640002651073078,3296997695028141,746823114152879,504298092166067,2685085541067540,2397504135895991,8263358290467768,378364382632889,8564188392651715,5924838645267397,557085419326320,1472147438410696,7618436619437218,2381113355451344,53931166464978,8715388239937359,8701839573313913,1409962271685603,4044626201066469,1871369953270762,4495622196231149,5157247613688814,3526528656661489,8912581238778637,3409308566240247,3795563792423929,8839476107484156,1340826951687166,5066268151835136,1477621610716164,2169143579188231,7005801467542536,1231731337092106,5741774731795473,7234468882506926,2985961272187926,6223258559527959,8428138551983132,1096136593988639,6462428089474082,9035678607440932,6964373538976945,8795547510766633,3565060932254763,5118335887080493,8752888800542557,3047709414579256,1203381428720821,5644537998687300,8142053563849797,8394177026225703,387455046065228,9099479772617024,4040849601444945,829373385546834,2788751423522835,6934700281805908,7873734601669718,1077349247360087,2032336963202776,4251560895175770,1403515018755164,4245425211243613,7157482333289566,1792832124583007,247777446640736,1264699003321447,6155367671266408,7379514002928828,8010072993766510,7818094670543987,4884991512943734,6804161747435369,4492407262067833,817393168022652,8560486205660286,1445438346935423,2189121756189888,7954407453400194,1118163660741765,6922284198206598,4436934528031879,2967799313416044,3918976275496074,5455972772737135,1558733984160913,1735137595481234,761832446016662,9024554220610756,5606012490833052,2525321962388642,572394483596456,5246217659399338,931795149678263,3356690874662062,195983629089967,2370246692453552,7520188824263857,3345792792951986,2007526010707124,8272035862391326,7983617821277366,8095386599292087,4142605647838392,1948886566091961,3083705795656890,7192196976508094,6668181479480511,1556801454128320,5894758566558915,5144169379118279,3620283497725129,2665596159849678,5855779389325177,8536257334012510,1721648454089947,4750462040243426,1097014279102331,4379268697259238,844553872645353,8906033224506604,5026234934328557,49174721122173,1222601182567665,2285849608365267,7839173823225077,9120024941853225,125422800338169,5019809621523706,1991370803174651,7635669294078506,7121805739785471,1186909007854850,7238200617090308,3544536729443589,286532342455558,2488740082384140,4112868326677773,5209651514154255,7545647392218386,7694939556912405,6991613732945176,3564943513238811,6085296030268702,344761040731424,6407470949514530,7171718163225892,268271590854535,3720534445857330,8695522654461231,985673195183408,6672098041077043,8232067067878708,5877096624241973,6938692219592001,4379856104988555,4957477855570486,2025259959835974,4508247678853004,5619515119670785,6486845152279886,8571396698824019,5061114075962708,1714620894687060,168676751973723,6489941273279845,4345435425430887,4559683890953576,4126901361737067,7826921645874540,4399166883413359,7647883265826161,3991300257103218,4701784320255210,4727482195901823,8359680572136832,8661124147117441,839048458182018,651486473559431,5584028709279188,475127889337751,2405664592584088,5238138566770076,8035432413912477,7950505935682694,5760706407398817,1255838597709220,7321529361341861,7940723010592169,5605800150121902,7634012640247216,6466204960808863,1541845650005446,612286292696523,3961743069085137,6951989452668377,2527658008575455,1243668672470497,7623830941752802,3619894858544379,4391366296547238,4683997718543847,8054395767061995,2377170427665502,9209490904692601,975940343422451,8228999564635584,8043899478015478,8459338413723561,4328854592413178,4338160847789563,2059377664453205,5089964671108352,8032431574908418,4376579433053706,6085739710029325,4875457169677838,8367730885896792,5288857962462738,3335319601438228,7076355282206230,2290940683099671,3465220084260378,7515170935963163,831316421959197,5824845992369697,1605473730485795,6111692845301286,692384802987559,8394756822670888,1625244471893545,2857046000825607,5826666167429895,6935235408985652,7285254017580597,8410964769793289,309123126575028,5418431277898335,801950188043839,88001850285632,6652260633534017,2587349897772611,5096891775319620,4803849127689797,7865978134879816,345526658457163,884681851300450,4177849799890565,3379059420978773,1281771936865879,8979861436153434,7205124619927134,8126723437272671,5255384500723296,3274081385078370,8877697150664292,244222822669926,5338657770801443,8482278155476587,3991001089819923,4570199225130612,4246241909186165,8712526769135222,8461234741632631,8010242296069752,1887643705024121,7616035401449082,1713361105780349,5106129361337982,8220493020000192,3398899416956546,807696597565059,3600378362355333,7825779292044936,7611393645624972,6682467639557773,4513111856266896,6164622880294168,7508599551983250,2436171572043413,2869966071013014,7061169332346523,5084806368960157,4124057880734935,303111069834911,6628396267454115,5669131109539492,4754506568182147,8093079725473458,4645254087524019,3804391010934452,1449363721707190,8372738488278713,598718758690490,7653261966458559,3571530703101634,6186571447680707,8026335701556933,407985952562886,5794088533835464,461477275844306,837485443489492,4732620889120471,5284433467539164,558577638104797,2523479627865823,3910835338411745,8528553248833250,8988282818713942,5980414318763749,8932539300986717,4563132173180647,9004533807791848,7091979023875817,8896372946658599,5572409006440173,2627042624416406,3022135628963567,1862321038638836,7647793353193738,2371134285508565,6380041684025088,3491561901817601,5458398567210756,6610101866233605,5869245312229127,4148853983682314,6462163340074763,4483269022727950,302343764885265,1761975195696915,9133156687552278,7247690724386286,4462640465597743,7089464634318621,2589101062897439,8825533161455394,6084741397843931,7346581797173004,3770132880932649,4378979090169642,3529615208533981,3438128322273072,4025841662246707,6919455967186910,6060867875258168,1910557916331833,268771197740067,3785209932144451,2534235945541446,37000187379528,6221218777857865,2979797168365386,5741460525662031,3214964915158868,4566572756049749,8370896352780119,3216436973137892,3411523788635,5321861050426682,593598399003280,8420635168030562,4375963944935269,1061275548360551,4463941884854121,5299581661880171,7856368507461484,918867327221613,988388268654450,1209565397581685,2281304937209721,7982908563390331,3151716156546940,5497063699079037,6976787217424254,6780011206481159,6020029063528323,7072524571230085,6837968807214987,7089741177364364,2229948027397294,575276420882323,8664638904082324,4515748131782638,901677682999194,7614764489752476,7565262201380765,6488613157756831,2435474942902178,6030531364806563,5936143540617124,4518662760710054,7477414580051879,6781749546327977,1005581397122988,4403684393148335,5827330369847220,1138934608953270,5774382813200313,2199988702658490,8548199931363265,2783524203438020,8801095402086350,7087766582755279,4733002191445969,1715374414831674,6087024282412366,1975715474948059,1902502501351388,4788493082951645,1875885407944677,2105393930043370,3038286795948011,7134456023252974,8393053177356285,1955740849627122,712722938183670,5969590989774839,1723659181001386,8984250506493951],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/f20e83bfa143ade475b9403b9e21641f",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_001196275.1/GCA_001196275.1_7748_4_40_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"CSHU01000001.1 Staphylococcus aureus genome assembly 7748_4#40, scaffold ERS092797SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"f20e83bfa143ade475b9403b9e21641f\",\"mins\":[5146675777052673,2315163181510658,6104821307289603,913590870499332,5921337521975297,3106069035610123,9215953575108620,2907133893206033,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,6479806504648738,4449147792408615,7277617451196457,3116364401098743,3518770889224237,7372327805427759,6506000896569401,3863448372494395,3909397344211004,7437334004842560,7140729989324865,5055350997004299,4046441427542085,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,1109376234840171,1307705680961644,5434311755829359,8000093345947760,7284609180405873,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,9173197031722616,4447327968161932,2687238688096398,5940834273493135,6968438657196176,6423458840264849,4283429268783211,6060888221364372,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,980192377581737,7932357643723463,1816213056534246,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,4275434089636035,5392923544264054,3896588604084428,2722651891744976,2138247811834065,2929787349803218,8291164134043862,8288761955963096,5763937543921884,5908374364680418,9100377281368294,3977127583879399,6833222729797864,6675745817342186,5625039491039468,1133486263984368,6101035983073523,2417632473485558,8091788112306423,1302574224109821,8212410875969790,5937898811502854,948489885540616,7476293558784267,1316115594879244,3963523983684994,1655653727666446,2377197744251151,3590799175020818,1803490896380179,1613233089708314,1398163635020061,2660901546139013,7318609661925379,2138747986847110,4034436112523558,5119942787128028,8091310037205295,8909030726132017,7967446089515314,6922370832007476,2133264542323422,1477786791149878,3871300378636600,4040110223393081,6992758984360253,7445078125691199,8895922000216384,2602070490546912,843457896101259,9089878662127943,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,5840344637290916,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,481260299161970,6614587086000499,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,3316038957900173,162751473398158,3734458897543567,5940376136597911,2972258577203608,3242446598427039,2968451845775780,1188374620819878,2246725717416689,5877325657956782,74203906302383,7745961481458097,5935630862422453,6969176995176886,5347282112979384,7357884307374526,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,8804350856905170,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,401948343550438,8940994346209769,3517087197159920,5706335401980401,4252686649659892,8499479516164862,5137838574998006,2188170162708984,2546695760749056,3527332718576132,162688560886278,7497816545194504,6855779845853707,2823650723037708,2519992179606030,6748402791805460,6314115733123607,2628169269867032,1991856884875801,1893040465097246,663267648999967,68515416416801,4224499299092571,1283325847532068,237184967045669,8303975859675687,8246219929334314,1561783378768429,8031857753711153,1297442792150451,2744117220422198,2644883506979383,550323193349556,8082439380873789,6161629781725758,1301466934951885,8792974406386243,861160734184004,239261345014344,5360518378600282,7443731089928787,2591352585302612,3677235441902166,8774502673891428,7863282501620314,5791949031062287,7266335543571037,4888768950592097,1251060182680162,2051483091522152,8074218591388266,4363284863173231,3939017814893170,2418223084651124,4891494248387191,6047329894011514,4946705701540475,8556996361134716,7613883562408042,4194303986672257,4260895368577666,3662919159013483,2166267691369095,985997338583691,7167030720094868,4627768844518037,635178958910103,2877754653855172,1108575844749982,2918795761156768,2868277602058914,2635086747951782,8473257377227436,3692897477640877,8821595848045232,4629281300140726,7899833835700340,7926257273950906,7447126361371325,1788090151867071,3087196799197888,2169107663986396,204269439025862,1939633497252551,2439240982766282,6559343506969291,8499668649452236,5909446257947341,8435605503566551,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,6286493618604155,61926092041681,5538283699811048,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,970330114464553,1817613396386556,5619546432701021,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,1888527096943373,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,7161054261140279,2642347481506640,212186904118100,3043432314913624,6709902552658779,5652844016120672,8248516013412496,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,2442719583213032,3399098890158963,2413571986957173,9167447170032505,8558537765561210,7509411440202623,1053060246836105,4117238218216331,7117595573932866,2372154767496079,5547694202340241,3220718305670034,2272237085107093,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,2923022378894253,58548012524462,990095007548340,9025646331909048,410144451802613,8535094002541505,2801544017978307,360504095483383,5718263849001935,6177526526477266,8076461447820243,8794208264791002,122015909989199,1338323295265756,2994560223626205,3428447854789601,5274301660094267,5596785988511911,7027985096934380,7482765729801198,1625254992364527,6176712354587633,4752895990487891,660191707599862,3089495541412855,8413332258904917,7122517469537292,7415738719983789,1880410170582036,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,830388703421489,6104920293028914,2683864114443316,3161510797841463,6653090173899838,6240204079699009,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5279738514840419,5906462950118488,144929027286108,6166084614014049,6423506706900066,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,517359220212855,7498960818033784,851815340897403,430223076136060,6432046918378622,4370251230234817,310401436513421,772117120378000,7279634878366865,8934811836040339,1890986035680404,4414964609014638,29860417139863,2185485247435928,746970284205212,2086986011604127,7190948106835105,329215423440037,4950726440469672,7648404597621932,836252080051374,4913023526655151,6750433567802544,3475729660106173,4227702754264245,693796660573370,1996572511122975,7395647341966524,2193269920048317,1880512750785729,2669250979570882,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,1971104120004146,9187572004045690,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,936638823216367,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,7064378317985064,385907700483371,5728268182717740,1759748373012018,4110401245517103,1336059428508981,1618472691987766,2262947123078456,2427434620065085,6974450251494718,2555346529826111,4925763159749515,2562320086883280,5811691374228807,4819719989986640,227412655342932,2613315185845590,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,5776360845034855,6138704418343841,5274803040281962,7319951751783787,7610599010751378,5155360444663152,915883713245416,1260790606271859,2952168537830773,391700864198006,51745215800695,6610124020532606,1314889990042517,6713487310972290,7361515808982406,2218257629603393,6570381896951176,1982265176835467,8567589419816342,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,580001466129551,4410612950724851,1287137738233268,9063963446371766,6240582334678461,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,8431983561594311,897316570514903,8150866244466136,5469018164704731,3885943932519902,4293065844762082,4936027117872614,2397618178008552,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,7682210448059988,402247873566207,605192001652224,7323875920791652,8952231969012651,5077643932915205,1033361534550956,130457181976075,6474396741751726,4396323642545688,1603137902355995,7848717625751069,6141646980806917,3517221940119072,4004155958476460,702798501799460,4221990677784101,2850576000013862,319524505622058,2864627209774636,4146833238394463,4620747332527681,8068985491437122,160694334858820,7530221302335046,6073972491583756,1106191012378192,5799343132662063,5701137865421070,1757736763295318,7611734689027677,985626569586271,8906959415711334,8902901908022888,1661039179171433,2904355576731244,2506883728483949,8590428516263539,4512180937213558,5590584270309652,7156388644240319,4542558157555328,6760809165536192,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,6463356318623379,819530571867797,2973371054093974,55532696639127,6520130709554843,6274847488566940,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,5767914751350448,4063887283164850,2818235886003891,4444908075767479,462594584405688,7672125054567770,1639747824223934,8001342250198723,4533568422573766,651657068725962,75607106131659,8084476987051640,1166808652568277,1050472124757718,6635096463206009,6861712285648606,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,1525877688391402,3320002371577580,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,3295654926604034,9097044980250371,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,6497917926444676,8143513944316657,467300572956444,7641917531428638,7327034779342626,2254292328232739,8126008824080166,777026232017201,5117258784737064,8552312296191785,7553352169367338,5861465820534573,3343132780332849,8546891284027186,982783900964665,5177776401921852,3109989319097994,3478329653159746,2970622895822659,7598272163776324,2016823776880454,5969289268451145,500006684268363,2339293216622415,6829961833686864,4974610471645496,820079529219923,3716488083994452,8059723177205390,1290139896432922,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,407494504056686,2167369577068814,3827221495609203,6981944088999797,1209024400287606,4733550782715769,5853576310753151,9158016872989675,5382715700053894,8462257808402312,8245677561885676,8154597807642509,7675177204093251,5664055981840276,7469817883450350,6655834216400796,8449499606388378,6161054654166945,8935628239632291,7640718988732325,2215407908836337,2769199177598620,4285562358224810,5300625464223660,7687547568949165,1586163045525149,3700712461854642,1299923441830899,3086808181540789,2417609231026105,5296176842942398,1229878691049804,8690783830517706,8326254200203212,5550023567304653,3159560503162830,4265524355446736,4494745225119689,1055754057562072,624885245548506,153369867168896,8286237998987231,501314330843104,8214132091116539,2783293737744357,8189536530413545,5476876315310060,467366249592816,3001959122151417,2344705120843770,6356555689043964,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,3404645514262587,7805354275301657,4125199387330624,2275693130250305,3669669445212233,6994098420947023,7256199734364243,6445197233936468,2614524117768281,2176156635736155,6415637455083613,9198749196284261,1062207237257316,8369242804119653,4898691182037097,6924058499905642,8838956566890603,2033238974833351,1435058818705086,4403747301046395,7670540484323560,4706193404512382,5090934684186756,7647986012981381,2893765109098643,164072296102038,2343666349557911,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,450088546953389,5524874001115311,7656430088894642,6300248156747957,1826572334769866,4034678905878720,1203515549264065,6547833949292739,6585493558229191,5902059711862987,297946451506210,5484048230209742,7424197000927439,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,2266518188165352,5898357841811690,8292970583906548,1219768655680734,73407638169848,2057763371387131,2902111595423998,4037615708129537,4735068303730949,6868805569935625,73265497950478,7846237798144273,5184617738316050,2067257304910100,2221340687153433,3442643861129498,6368094493092127,150144952449313,1357719164033317,7797236362615080,928062918895913,4333565149649197,5369751621683502,932244993407279,8995213276330288,3264293452933428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,4088699334455693,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,8443367849552226,1923663661255013,2528889561520487,6247490209868140,9049977009835279,7630230196581438,6259851054508406,1525074792253161,3484868897319300,8532048883820939,5502346576963992,1580143928650134,332549451344280,5602292474825115,2096841890683293,7064012510296479,5584756052421024,1541713433336225,8105508678531491,2902476096768420,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,5564848928414133,30172216461750,2774005338483129,7413661131340191,8069172111739324,7612437979536300,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,2760855083342295,8260407158634968,2949081325283748,7873984218462683,393274085046750,5159188045658592,5104769332398561,7968941333289447,5841433499171304,2952787269913065,1239923617995242,8489320569743851,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3054304020027890,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,585038334536187,6574721260816894,5917290617760258,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,340514272782864,1787508922165780,8952362163265966,6616815189441046,3299864180793775,8644146702531103,207892688386593,1354074465876514,211721470048805,9118918071159336,6714337179294251,1419291878255150,7536464672057906,492140695218739,5869577299692084,1948452292414006,510046744203017,69505479293499,1353157041773116,1981234046790208,2527092163099744,720459020642883,3498934123428420,6875606331546038,2085938533902923,384651385379405,1631879280163412,4746826772617814,758283499566863,8361022599817826,197275571292775,3563874166663785,6607041102383728,4204796266711667,8796579924642424,1965966511262331,1186578641926780,2209184500886142,6217388977945224,7505984773102219,8603296405064333,6254528881375899,3796894009887390,1339905113829829,4001936773421731,8833716684167847,4115418516888233,5078604763028139,7944456366951084,5132300845271730,3806717176019639,7779913425963705,7879172040727235,8328582983088836,3981187881433797,8334953150270153,2027494681635543,1390679848778457,4009191020419804,6982435519695313,981946939239152,4952730055523057,5482216705940214,7046896457378555,1102254127540010,7920821769997056,4018290538196096,1956410942925570,5681948115341099,7769295295371735,7012232712137487,637717087886096,2334075661093650,2057294021864213,210402935216919,2947196173888283,2110302892063516,4230071825489989,9193508402337585,5828810279275305,7078403057355566,3252916289493808,8183273020525361,2100493461572402,1397154956147511,4021653090544442,6632433388350267,7678991267339070,1755284184296256,7088305201981920,8711986948082498,7467931263134177,1203079434555191,6985458709252940,6821187116937698,4133002593487694,1863456533297999,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,1191595029470351,726814415526748,1869739381005155,2746847273347940,5565618624165953,3042810235578172,487864828935020,3869761225206638,3408611869207412,8441358375734134,4033162446019447,2765804614536057,4396390006889344,181638314539909,789663207095175,5675853195025288,6396034465909644,1552378516372366,7553111683168749,7361833127127953,4190213662030738,5216262217616277,4807517851032471,3130118261376836,3821481937857434,7530063864933276,593012990819230,1169438882554352,6086204123819675,4797301698399142,3471569168190378,6451364401675179,8075354013268908,9126554829507511,4865890043296700,3681130512911295,1189163822001088,7763557409881028,4666457024392133,2586418889903046,7057729200712647,7126776287083465,2361765179657163,5695909244033996,8647056119409616,9100812111035348,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,8506618169158638,626168875564015,2573596889369585,7946192001620979,7306522185604088,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5757452816149512,5796384473230345,4964781251513354,4122319891667983,70088873618451,3884489623182358,1677699964853271,3557713574820889,334844623043610,9029197543849729,2198108027522077,4180542909013889,7164125418732578,2908244240583723,2588162975686006,3649154946395190,253300033591817,2907874448857610,5356878132681790,3331986316520629,4882578364685381,5675714913627212,633105738161232,9157569010814040,5768890711293017,4812219920563290,5097534116879451,4955365087054941,1089272565173343,5671450707164256,7516356639951969,4926861423238243,7643972193975399,7118726016033980,1960247201090669,225636245425272,2392984746015870,5520592147606656,4632781860469952,3128705817382019,8158821542825094,5256643637594029,8154746805587084,3916028288464066,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,1190842265513120,5241091670625443,1238619339054246,8700152929234087,5514768509078696,8494210442632362,7128580599985587,1515192525290670,5294676599532722,8875968855564830,6086409751379126,8707651019648183,2771632487820472,7885678641654303,9182108430318780,7293093929815232,8783786815601862,8197445232532681,2360605979561163,4803260508523042,7464689979698382,367954891287765,4086615967075543,976293987540186,3183706162982109,8223148645510366,8033238443244768,7315979768499426,1378353318702307,2641747955387621,958802972458216,8394425722576106,3430108296223980,7666194411646192,4836608690859249,2688817209527540,1033715359984886,4579041725200255,4298859764904490,1019530360671445,3567107464158468,5816011168292101,1448775314115846,2795829744222081,3556579375844622,7194270142693933,6644821181082899,5287326670494996,5000612806597850,6530364637157379,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,5335276921429322,5351668498910539,3285144305491278,5084161271253393,5183814044446040,5890867670273372,7882993032424802,4856610212101475,88437141712228,5253585232805225,5323332702567656,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7710155381849469,5151281455619461,6341820508011913,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,6403894935227820,1800517128877994,5926443562442162,7674181908761844,1458767657659834,5947103608716731,3555190914977216,7776477814955458,4646842126761412,2690941375331784,4782498127412683,7267065697569357,3066294121266641,78084367085014,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,1878179782938092,7864494568558061,4530178457788475,4717078305738226,9088616725393889,2846284314054133,1541930783479721,8569995544546809,3152905102806522,3909246984449532,7687805010646954,5336395954564607,7187688514553088,6135375769182123,8985645944647986,1987340210712077,8205328358469135,5473106693410323,7906524426948124,1185378970902048,835582845963811,1345534315535910,7122433204903463,6675258019802664,177161577352745,7243701472849450,6152554647457326,2499002377216605,4393052211822129,6930698324287026,5168981785230906,8453583119834684,3401051871010365,7906973945146948,1993005114900043,3335731140628044,3365806770277969,1490649743597140,8497320404037205,9086189712409516,2376738954628699,5603043202166369,694729075228258,5862755334909540,1286345701920361,2407556246797931,2069399351119471,7180711155708520,1762891633565304,1826626455842425,2479347599965821,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,5276885771693705,1478175721172618,470083491171980,5553553040481934,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,8668036368331665,3279510064929392,2379313998356137,3213809958264492,4725106938598002,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,3888158542495417,90076065684274,6133069365415617,3555666348039874,8660225691913923,5224110063914277,3818616056618695,5816608308592328,2300314053840585,4995812233531084,7374706893274831,7154763136518251,587253656190676,8303453292883671,8729737623117532,6128252439805663,984499184574177,5500657232277221,5677483308395132,3844045130731247,3834083608280817,72583097564915,3931973464080121,5985406373330682,1553419814780673,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,84834187095829,1924528878694166,5716331084570405,4440186563960617,8253731522256683,6412229720137523,3881211648824768,8910676381798199,3989388368871224,6737890810986299,6998902793404220,3510921439481667,8605736591634244,6414585907380037,3429891841847111,4050500137410385,6355524819209492,8535608270551957,793823372574692,4577018362126171,4524906595225437,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,3333979680154941,1607268386283382,1213457523695486,4494558117785472,2569719125127041,5598069886194327,7039911616343950,8823763859310893,8599745542954899,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,6198150788190135,2263958098522045,3795402138320830,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,3792348455169996,1351605086977997,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,358899163144170,1189989031567342,8459448655941615,1503829884784624,7969431343923191,5631626399236089,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/f8f0617cdbe162dec828ac596feae35d",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_000608065.1/GCA_000608065.1_Stap_aure_DAR3760_V1_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"KK098220.1 Staphylococcus aureus DAR3760 genomic scaffold adLVX-supercont1.1, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"f8f0617cdbe162dec828ac596feae35d\",\"mins\":[5146675777052673,6104821307289603,913590870499332,5921337521975297,6582452604682250,3106069035610123,9215953575108620,4736567247114255,3336512770453523,4304708589903892,366038575566869,4366044986945560,2156504318697501,7000457640026142,7896021307777056,8821595848045232,6479806504648738,3116364401098743,2084895569428526,7372327805427759,7514235585355824,6506000896569401,4530178457788475,3909397344211004,7140729989324865,4230071825489989,2375917415634273,7378411329392712,2885561946520247,2343748905513037,3506453766344792,8044186767290461,5966751971373150,1028053574107231,3251502355370084,5695996928335975,7906264832782440,3234534336884842,1109376234840171,1307705680961644,5434311755829359,7284609180405873,5378024996409363,7199198146764916,5897781912338095,8968488620206101,4823510936105092,7956408597766277,4556601114480248,4447327968161932,2687238688096398,5940834273493135,8248516013412496,6423458840264849,6060888221364372,4034229359423638,4758040116175000,8450313866469530,8093041849651357,4626104524247198,2278346208018598,5474832406320497,979588139913384,3730400047403177,1939633497252551,6366943025245587,1816213056534246,1364875385213106,757043825455283,1451999676301492,7999157878374581,5421768685998262,7169548162306233,3173772744495291,8260608504786293,6457552004919488,4275434089636035,5392923544264054,2693861704364235,3896588604084428,7112620098277410,2722651891744976,2138247811834065,2929787349803218,4956624512915491,8291164134043862,8288761955963096,5763937543921884,7810828416770269,5908374364680418,9100377281368294,915883713245416,6675745817342186,1133486263984368,4410612950724851,2417632473485558,8091788112306423,2345917413478649,1302574224109821,8212410875969790,2012844047311103,6276844254068996,948489885540616,2027494681635543,1316115594879244,3963523983684994,5701137865421070,3590799175020818,1803490896380179,5827553282294039,1100178234351897,1613233089708314,1398163635020061,2660901546139013,7318609661925379,4034436112523558,7105162908262695,5119942787128028,8091310037205295,777026232017201,7967446089515314,6922370832007476,3871300378636600,4040110223393081,3171905722474812,6992758984360253,7445078125691199,2602070490546912,843457896101259,4886619860382028,1600279738216782,5620340898599248,3947602212196690,4022123607998810,4425527205646684,1006677272891742,8661756812112227,9103353687810405,2337082763788648,7376099508842859,7997983055368557,8711593439678830,9032222468051313,6614587086000499,710033866609012,3177927013347702,4436759463043451,4415067719221635,2906015216222599,7689915868344716,4088699334455693,162751473398158,3734458897543567,5940376136597911,2972258577203608,2243509869687195,3242446598427039,2968451845775780,2246725717416689,8952362163265966,3299864180793775,7745961481458097,8055901273809331,748884807066037,1161869623943606,5347282112979384,740802614878651,2352267404956094,2995332410417909,2674945199468994,4280139481391555,4335034824061381,1001268803252681,1262572732781004,4532841275367886,560690008429009,8153231274774995,3018049546973653,8024176702386646,2245992685781466,7302934211303503,2022098656203230,2628535144231391,3405658398716384,145309604938209,1960882994242018,2583875797723899,7121473852143014,401948343550438,2462394055594471,8940994346209769,726621958005230,3517087197159920,5706335401980401,4252686649659892,5137838574998006,2629375616291319,2188170162708984,3527332718576132,162688560886278,7497816545194504,6797842274607627,2823650723037708,2519992179606030,888109297701394,6748402791805460,6314115733123607,2628169269867032,8403707204031001,1893040465097246,68515416416801,4224499299092571,1283325847532068,8303975859675687,8246219929334314,5749761984184876,7194270142693933,8031857753711153,7128580599985587,2744117220422198,2644883506979383,8082439380873789,6161629781725758,1301466934951885,2511754262760203,861160734184004,239261345014344,2591352585302612,3677235441902166,8774502673891428,7863282501620314,2499002377216605,4888768950592097,4284868748911202,7016685056307815,7180711155708520,8074218591388266,4363284863173231,1951053797429874,2418223084651124,4891494248387191,4162813093515897,6047329894011514,8556996361134716,4194303986672257,4260895368577666,4283429268783211,717815503766149,2166267691369095,4658866579997320,985997338583691,5223980807856784,1430121092358802,4627768844518037,635178958910103,168049742848664,2877754653855172,8659580478542490,1108575844749982,2918795761156768,2868277602058914,2635086747951782,3192575431303848,8431983561594311,8473257377227436,3692897477640877,1219768655680734,193153471685298,4629281300140726,7899833835700340,7926257273950906,7447126361371325,3087196799197888,204269439025862,7932357643723463,2439240982766282,6559343506969291,8499668649452236,1210126382203603,8982624997245652,8435605503566551,2577351652332248,4799709323047641,6170381369696990,4931065070871263,514142706336480,6201873645794017,8190104329298658,78000814482148,3066294121266641,5538283699811048,2019547189110781,3930736415285997,387851009274606,3997317780447984,1399315029967603,6689558235349749,1817613396386556,8499479516164862,5539309571961600,4850545404588802,3774790396211972,7080958034309894,5728661481177863,2836598586495752,3724983289750286,7724391001129743,1577519916208917,1863691628282649,2274688364516123,4216267683599133,4684977435296542,5520319973442338,3650169611711273,8557495048119084,3894727865107245,6318228701848370,2610327495815987,3599981441475381,7640058598458166,6035570396930872,6770526131303234,2963574880424771,8823214936765253,297526335300425,7161054261140279,8927309108653387,2642347481506640,3043432314913624,6709902552658779,4372354774635357,5652844016120672,7244890770803515,8072469350093668,4154170303378278,4291307568565735,5137988816335725,7589956941211795,2413571986957173,4845781658317686,7509411440202623,1053060246836105,4117238218216331,5547694202340241,3220718305670034,1314889990042517,2379518951662486,4417325011829655,7106198561424283,2837844155729392,1471864782406568,7715961799730089,3359192181203882,8537231999136684,6474396741751726,1014253516899250,9025646331909048,7474914840572315,410144451802613,8535094002541505,3841300746089410,360504095483383,6177526526477266,8076461447820243,8815769383846869,8794208264791002,1863456533297999,1338323295265756,2994560223626205,1953886652294111,3428447854789601,5274301660094267,7027985096934380,8216853956002797,1625254992364527,6176712354587633,4752895990487891,3048526863073449,8313458673687381,7122517469537292,1880410170582036,2657677989274651,5042862487835677,3353246143173665,6932846907687970,6433529401226280,4828638417458217,2837875491333162,68026310562860,6505518806582320,3426729133401137,6104920293028914,9173197031722616,3161510797841463,6664851025699898,6653090173899838,4221925077075012,1378685439386693,2583516015719502,1161506574537807,75091129832530,5906462950118488,3671183373505628,6138668841284704,5685476400346215,6490932119479400,2624694094406761,318390755435626,4325735311524974,3895465852974193,7498960818033784,851815340897403,7973286791894140,6432046918378622,7867843017488576,7265131733374092,310401436513421,9033672459342990,772117120378000,7279634878366865,6547833949292739,1890986035680404,29860417139863,2086986011604127,7190948106835105,1841805133485595,329215423440037,8783891734748017,7648404597621932,836252080051374,4913023526655151,6750433567802544,4227702754264245,5623483114239159,693796660573370,1996572511122975,7395647341966524,2193269920048317,341222631134398,1880512750785729,3916028288464066,835668183033027,3371516753958085,7280597082649798,81635630112972,2781157967312077,3864648699065550,4304771496076498,8115575334364382,2287535748633830,5990617355047121,336938091775208,704012195243245,5622596787561710,936638823216367,3863448372494395,2086682841597170,9047776546694390,4451688021447929,2744843007502163,1859721248011520,5195275595142404,2864627209774636,8427394283750668,7588963357979917,6988101536453914,3671565933241630,7949201316488479,8413427240301859,4393052211822129,7064378317985064,385907700483371,5728268182717740,4911190400468269,7816698054288686,4110401245517103,6261672364234035,1336059428508981,1618472691987766,2262947123078456,3333979680154941,6974450251494718,2555346529826111,1764341467026753,2562320086883280,5811691374228807,6198771193123042,4819719989986640,227412655342932,2613315185845590,980192377581737,8669223739008346,648548090783068,2126833649923421,6560554740667744,4843831604053345,2752520230327651,8668036368331665,7319951751783787,7610599010751378,5155360444663152,6833222729797864,2952168537830773,391700864198006,8535608270551957,6713487310972290,2218257629603393,6570381896951176,1982265176835467,6475115975964047,8935830662170010,7455948431881628,6720662867434394,9145060402161275,5130704189359686,8707847105430950,2512865056413175,6101035983073523,550323193349556,9063963446371766,3475729660106173,5052182129870271,962398808360384,18846434743745,1663633658035787,7443290551317957,960356550845894,6138704418343841,2674318196962761,897316570514903,5469018164704731,3885943932519902,4293065844762082,4936027117872614,7127403136673260,9095115316180462,4572414163289584,2713422870926837,1107583157015465,199187347236344,6445091345761787,402247873566207,5077643932915205,9086189712409516,130457181976075,4396323642545688,1603137902355995,6201335188993566,6141646980806917,3517221940119072,2376738954628699,2850576000013862,319524505622058,5799343132662063,7502333181040182,4620747332527681,8068985491437122,7476293558784267,7530221302335046,5907535925622345,1106191012378192,7177077991245393,73265497950478,1757736763295318,482115931981399,5338557318932059,7611734689027677,2338670647686753,8906959415711334,7493001730442854,8902901908022888,1661039179171433,2904355576731244,2506883728483949,4512180937213558,5590584270309652,7156388644240319,4542558157555328,7505864488856074,833092384011907,7324671778338437,5009779152705161,6776038419760778,8993975621231554,3040498248803984,6463356318623379,2973371054093974,55532696639127,7249882542909080,7173266878154393,7740913804166812,2129273223465242,4953212197500577,3404362110215844,6402742393902757,7617356865365674,8001713123239596,843789784188589,8052240336119473,4063887283164850,4444908075767479,462594584405688,7672125054567770,3246753719965373,1435058818705086,8001342250198723,4533568422573766,5695909244033996,651657068725962,75607106131659,1762891633565304,1166808652568277,1050472124757718,6635096463206009,4304259375339229,1545195813721824,4304614427552720,2521189072553595,4870118807992038,5078643480934121,8444933396903664,7384508985915121,6837386060818166,8852937330353914,8071260843120382,5282473995605759,9097044980250371,7687077436237573,8836753422432009,8080961741575947,8307942525970189,7711242515060495,8791259289515792,4556321790367505,4210999028688662,4435153645276121,6497917926444676,3275110843738415,467300572956444,7641917531428638,8995213276330288,7327034779342626,2254292328232739,4149281266452261,8909030726132017,8552312296191785,7553352169367338,8985645944647986,1956367677994800,3343132780332849,8546891284027186,982783900964665,5177776401921852,3478329653159746,2970622895822659,3130118261376836,2016823776880454,500006684268363,2339293216622415,4974610471645496,5634692818708307,3716488083994452,5553553040481934,5360518378600282,3300357632857948,8617233707472737,731807987644259,3843618476357477,6990130627200871,407494504056686,1826572334769866,3827221495609203,2456047920420724,6981944088999797,1209024400287606,4733550782715769,2266518188165352,4579041725200255,4607325484564118,5382715700053894,8245677561885676,8154597807642509,7675177204093251,5664055981840276,8506618169158638,6655834216400796,8449499606388378,1483816298908495,297946451506210,7640718988732325,3099173012382705,6274847488566940,1800517128877994,5300625464223660,7687547568949165,1586163045525149,1351605086977997,1299923441830899,3086808181540789,7046481273812920,2382029668347565,2009369612101575,1229878691049804,3089495541412855,8326254200203212,5550023567304653,4265524355446736,4494745225119689,5380248535228750,1055754057562072,624885245548506,153369867168896,8286237998987231,5920383623823696,9047382457047000,8214132091116539,2783293737744357,8189536530413545,5476876315310060,5612209855076334,9044286231537648,4725106938598002,3001959122151417,2344705120843770,8647919302797309,1355483199971933,6627806917847039,2112709756377091,6123491443828741,2194538476795912,6838275788085257,1250269936830479,8960623108675600,7845638252759060,405651569137685,286013271918614,3982264274397208,3365276175554586,2108576829356059,5967912106082650,8231034623248415,982536598759459,4575625902131236,982773563082790,1360472241977385,5219112845465642,6087930894833708,838713961601070,510046744203017,3404645514262587,7805354275301657,3441561624303680,2275693130250305,2380585982662722,3669669445212233,6994098420947023,6445197233936468,3888158542495417,2176156635736155,6415637455083613,9198749196284261,7323875920791652,8369242804119653,4898691182037097,7613883562408042,7154763136518251,3685508581812338,1639747824223934,4403747301046395,4706193404512382,5090934684186756,7647986012981381,1998211285457031,7821296065001613,2893765109098643,2403413705627801,8021177217775772,3654508277414055,4079964453292203,527250636097708,7415738719983789,5524874001115311,7656430088894642,2736562014918845,4034678905878720,4370251230234817,8728167376662219,8934811836040339,6585493558229191,470023763785928,5902059711862987,8523349380506658,5484048230209742,7424197000927439,5408957784139987,3178755594893524,9115939470275901,9059221439596761,2616401854290141,1683181509208287,7670540484323560,8910676381798199,8292970583906548,2057763371387131,6721401703487741,2809509062039806,4037615708129537,4735068303730949,6868805569935625,2167369577068814,2067257304910100,2221340687153433,1290139896432922,5250171345791260,6290480746305821,6368094493092127,150144952449313,830388703421489,7797236362615080,928062918895913,8823763859310893,5369751621683502,932244993407279,2208339315390768,3264293452933428,4363526816403428,5085323617671478,2084532488939840,8656843213650242,3755199397484871,5608160409942348,7393489351358797,3115016475949391,1544646640245073,792942249322835,1676612448274780,4633515119782238,7000127150279009,979372371695971,1923663661255013,2528889561520487,6247490209868140,7630230196581438,6259851054508406,1525074792253161,821362676717952,3484868897319300,8532048883820939,5084161271253393,1580143928650134,332549451344280,5602292474825115,467664463329693,7413661131340191,5584756052421024,1541713433336225,8105508678531491,2949081325283748,9130305682536177,424135353727401,5081406681463197,1333593272314289,4410947517753780,6875606331546038,6507431029266872,7064012510296479,8069172111739324,4260640978303429,6943237729311174,5292946014976455,7203516452268491,4865769618012623,6117415709833681,1725888322763221,7769295295371735,8260407158634968,5840344637290916,7873984218462683,2098062209071580,393274085046750,5159188045658592,5104769332398561,7968941333289447,7255001061059048,2952787269913065,3568367659125226,6846105922922987,8232251443288556,7031164972399085,3182861987777006,272132654860783,818483388234224,3700692511144435,7122509300181493,6399543881865718,4341759536675241,1383270956448250,791895276595012,6574721260816894,9179669523560966,1788226934370049,3283597017790984,1458416177129993,4355633735907850,6072125870725644,3498979658738194,1787508922165780,7885678641654303,1912994901379617,1354074465876514,9120200315800100,211721470048805,9118918071159336,144929027286108,6033496682433072,7536464672057906,492140695218739,5869577299692084,1948452292414006,6532302039665207,69505479293499,1353157041773116,5935630862422453,720459020642883,3498934123428420,30172216461750,2085938533902923,384651385379405,4746826772617814,758283499566863,1768705500031582,8361022599817826,474326943902307,3563874166663785,7643972193975399,6607041102383728,4204796266711667,1965966511262331,5677483308395132,2209184500886142,3610777620634241,1354031891884677,7152093423583475,7505984773102219,8603296405064333,2192532495772303,5143923246320275,4909849541008029,3796894009887390,6368692647324319,4001936773421731,4744035456776871,4115418516888233,5078604763028139,7944456366951084,392808146696879,8325883311024816,4064139171928755,3806717176019639,7779913425963705,7879172040727235,3981187881433797,4461197842708983,7277156913728206,9185892931558825,5402584754821847,3142547793009368,1390679848778457,4481768510552794,4009191020419804,502448148560611,981946939239152,4952730055523057,5482216705940214,4997929625017079,7046896457378555,1102254127540010,4018290538196096,1956410942925570,5681948115341099,7604479172066058,2760855083342295,5791949031062287,637717087886096,2334075661093650,2057294021864213,210402935216919,8600761421888281,2947196173888283,2110302892063516,151891453737765,9193508402337585,970330114464553,1892614339423018,1397154956147511,2096841890683293,4021653090544442,6632433388350267,7678991267339070,2820696871828287,7088305201981920,8711986948082498,7467931263134177,3950687240408887,6821187116937698,4133002593487694,122015909989199,1635651637476176,3989388368871224,4660665155473483,4965217322842963,1712595186215765,259364722940758,8447021480557401,580001466129551,726814415526748,5279738514840419,2746847273347940,5565618624165953,487864828935020,3869761225206638,292057775278959,5841433499171304,5424923310544019,3408611869207412,8441358375734134,1164683235056503,1239923617995242,8143513944316657,4396390006889344,8489320569743851,181638314539909,3457637256272774,5675853195025288,7553111683168749,4190213662030738,4360520181401411,5216262217616277,4807517851032471,7598272163776324,3821481937857434,593012990819230,1169438882554352,6086204123819675,4797301698399142,3471569168190378,6451364401675179,8075354013268908,1297442792150451,1336054165273524,9126554829507511,2413290341751739,4865890043296700,3681130512911295,6760809165536192,7763557409881028,4666457024392133,7057729200712647,7126776287083465,2361765179657163,2350571174063052,8647056119409616,6899487686306776,4859866816269273,5004638558784474,5320260141112286,6672925459491813,1082376892709864,7583446089837549,7469817883450350,626168875564015,2573596889369585,8792974406386243,820079529219923,8045422011980286,4704429005052921,966689432144890,4912195048307707,6056496052079616,4855337625377795,4875381475535879,5796384473230345,4964781251513354,4122319891667983,3884489623182358,1677699964853271,8636005329198105,334844623043610,2198108027522077,7164125418732578,2908244240583723,2191923344596014,3649154946395190,253300033591817,2651688542710843,2907874448857610,5356878132681790,6855779845853707,3711070083308612,4882578364685381,1287098760653898,5675714913627212,633105738161232,5768890711293017,4812219920563290,5097534116879451,4955365087054941,5671450707164256,3028319556770914,4926861423238243,7390098272967783,1960247201090669,510436895563625,7266335543571037,5520592147606656,7293093929815232,3128705817382019,8158821542825094,5256643637594029,2669250979570882,6220211775753359,7164537816212675,8540182034447509,1531526026639043,8292399427181726,5241091670625443,6464427475104966,1238619339054246,8494210442632362,7129634646088877,1515192525290670,1513303246449841,8875968855564830,6086409751379126,8707651019648183,2771632487820472,9182108430318780,5107270389779645,4632781860469952,7986770140512118,8783786815601862,207892688386593,8197445232532681,6046314350030026,4803260508523042,7464689979698382,1019530360671445,5163187295190230,4086615967075543,976293987540186,8223148645510366,8033238443244768,7315979768499426,1378353318702307,5323332702567656,7897782769245419,3430108296223980,7666194411646192,1378102746791153,2688817209527540,4298859764904490,3567107464158468,1737746356272389,1448775314115846,4180542909013889,4311271177415945,3556579375844622,1561783378768429,6644821181082899,5287326670494996,5000612806597850,7858357380701472,6152522718874915,7642964956253477,7122905104739627,2440693706419500,4069712352202031,6749445343825204,7851797183089886,4070080803691830,1214215888112954,4739190100540731,4906250419473725,4037012370431297,7466387834002757,7678005521333574,1316900268547399,6489786679037256,5335276921429322,5351668498910539,4770308599258444,3285144305491278,307559265400717,5699252652330325,5890867670273372,5150153258749279,7882993032424802,4856610212101475,88437141712228,6204666995137902,958802972458216,8599745542954899,7429050244083061,2611212703698294,3527286274848660,7957847919705466,7626405322157435,9140899795443072,5151281455619461,3660772568489351,6341820508011913,6676116454906435,7526121950424472,1280664833883546,9051053538184605,7690101890186655,3289590076870051,4938927696959683,4836608690859249,6550313765640092,6403894935227820,5926443562442162,856884970847672,5947103608716731,1080643777039807,7776477814955458,4646842126761412,2690941375331784,4782498127412683,61926092041681,8935628239632291,4852189765193174,1801073945726423,7385626605825504,4736904158449123,6548287328611815,4368166270504425,7864494568558061,4717078305738226,9088616725393889,1541930783479721,8569995544546809,3152905102806522,4285562358224810,5336395954564607,7187688514553088,6135375769182123,3477567545936470,1987340210712077,8205328358469135,7906524426948124,5816011168292101,1185378970902048,835582845963811,1345534315535910,6675258019802664,177161577352745,7243701472849450,3700712461854642,6152554647457326,5619546432701021,8338634504957489,6930698324287026,5679039857864245,5168981785230906,8453583119834684,3401051871010365,7906973945146948,5209236138036806,1059006959607370,1993005114900043,1251060182680162,7682210448059988,8497320404037205,5580264614796559,5603043202166369,694729075228258,5862755334909540,1286345701920361,2069399351119471,8084476987051640,6355524819209492,4907233847361149,4155506935291518,701505411436160,8204114985614978,7428929518419587,5587667073572484,599196216102534,5643554321571463,8293699458965128,1478175721172618,470083491171980,8059723177205390,8682856085221008,5432594957360786,7579475400625813,5263199465725590,8336559698878103,6810715537882778,6142827993272943,3279510064929392,3213809958264492,3466699351597682,3909095957802670,5903112494481071,2575069986725557,1321439432887991,8156124609695416,6954175431241401,8753212753235645,6133069365415617,3555666348039874,8660225691913923,2588162975686006,5816608308592328,2300314053840585,8322236629208779,4995812233531084,7374706893274831,587253656190676,8303453292883671,5730136195698393,2169107663986396,6128252439805663,6428061299113696,984499184574177,5500657232277221,2541091443550753,3834083608280817,72583097564915,7041236094631668,3931973464080121,1553419814780673,3155522989727490,1262523435581188,2729482319322886,7509575534522121,8399396488744715,1205143099420432,5395011470851857,4221257546306179,84834187095829,5490276726882074,5716331084570405,4052017900118324,4440186563960617,8253731522256683,2452142369648428,2604709679968045,6412229720137523,3881211648824768,1203079434555191,5449482098695992,6737890810986299,2559496497311550,1364538786766656,8605736591634244,6414585907380037,3429891841847111,555164866154318,5640100560236367,4050500137410385,3467276601790293,8920696233860951,793823372574692,4577018362126171,7473358281035614,5615591727492962,3501948952465253,6256027916509031,7383880699617129,7535376972951402,2241933783404397,2427434620065085,3527452038033265,2253661544079221,1607268386283382,8142494526154123,358899163144170,1213457523695486,4494558117785472,2569719125127041,4848772203458437,7039911616343950,3662919159013483,8404376376029077,6556071619964822,9091415375486871,6527583680225178,6303151162171294,3151625536802719,3197109218230176,108362677993456,6119538918195108,5707862725947303,2529585517518760,5917734646341545,2923610052501418,6149574672191403,8763164838227526,6198150788190135,2263958098522045,8003607871717311,4918384395505602,5364504867515723,3997686878646212,8952951168884682,3727800611913675,379350842564556,6562173042917325,3802696281022415,392326751543259,168902776664030,4276573756637151,6113307333423076,1879504332029927,965077211664360,589689774239721,6060945677271018,8833716684167847,1189989031567342,8459448655941615,1503829884784624,7969431343923191,4933256683220991,2199283201691644,7246227765575679],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.subset/fcc0a2c84b265a77211ff0d4bd4a413a",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"genbank/bacteria/GCA_900034415.1/GCA_900034415.1_12718_5_61_genomic.fna.gz\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"FDKM01000001.1 TPA: Streptococcus pneumoniae strain 2842STDY5753434 genome assembly, contig: ERS409216SCcontig000001, whole genome shotgun sequence\",\"signatures\":[{\"abundances\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\"ksize\":21,\"max_hash\":9223372036854776,\"md5sum\":\"fcc0a2c84b265a77211ff0d4bd4a413a\",\"mins\":[4351975041236993,1488203822587906,1437297775765508,707981604208646,2925634619170823,4673037467680776,3680868880746507,1440440334817293,758340579270672,7399917768027480,7440728196618259,6660773470304276,6763239755290648,454179274108955,3500864445003805,8652663190726686,5474886157553698,5880943850727460,5627447984425990,4995490059538472,226286311893033,6051657791739948,5246393105405997,353157195998984,457884725839919,1914294714538034,8534962898191027,5708833000374325,6022284450248759,1669056870281272,6128401535670329,9156419442896902,2383410257381727,4994768899348540,2621642705029181,4823469834571839,2200860360506720,2745507764901954,6511915988359235,4297776730667076,3613057720922182,5107935744880619,2651456718696522,3331152991451149,1776087530322000,134468824600658,8142249097168979,4516192492929108,1466889659963478,349172897908824,4951944264425562,8199609287821404,6173416138940510,3737605011646559,3110938088623803,4861316824440932,4200829096786022,1308465505982853,2206042134198382,7983535929938035,7110392114133694,5895351909212281,3598219982521212,2432715640828029,3391039039561854,1148370269192321,9127293340278123,4850981921555478,8886167084279489,2975388817277292,3527237585035403,5310090009725069,7532005729964183,6277665320904856,1522456284846236,466813902149790,4683283242315935,2115001910163483,4317983831065286,980192377581737,1133123495342250,2717039069126827,1664274172526764,8694717712389490,2155519832156334,5412724151647682,6132059653494962,3263791994380471,1948190278576500,7118354882747,6319452818284732,3810339031535807,7770099724170272,7784095452481732,6151954217586886,5791280792189128,3974075940614345,7945241780408885,1324055369967823,1399425991991507,9147228867461332,7321783608314069,1364953103081687,3223223636188879,8776291713706205,6326114462978270,4688577208256735,825710040733921,8669534285877474,3567926616897763,8328602541206967,2605431880233190,4762816047782119,3726409662025963,5417988368226540,431746833424621,5779310548923420,7421590948459901,8880369686798577,91628013461750,7311974106865913,7018694071513340,5675556364541,4791540077424894,7119746585071871,5299943952340353,516850987546888,5987052939749641,6552596207679756,8455127976022285,2544299747985679,8362039703764097,976164703652114,3392721843818883,6063665282355763,4793887306531099,5746500977658140,8370786843652381,7267731856601374,2445787464782111,5026368732809506,5488174607540614,3557549382027655,1903636238151982,8513314683164978,8541725039939635,5638733567242548,2723888685203765,6694857484673334,7700615634676105,1230668051200313,7881913096376635,2764398245419324,9023537540604222,8312988114673983,6017037957524875,5273477921116485,3846605382664521,5754366993353034,3554120367073611,2169905851308365,6380048648065359,7801601576284496,484438152493394,2097515763822933,7739193531261732,9102193747892568,6513499778688740,2200853753678171,611447939993951,332690941931873,3464225345667426,4051079873329507,476383323027813,7706037825826876,986709741121899,830520445073772,6826481890108623,6379490887988285,6191367153049969,5235010454063476,475250277257590,1796387695120763,4191810702242175,1355402763045251,558283783592325,760872949647750,3814951233972615,5321362813071753,4821251652040087,3747019539474498,8974091310928270,9067952618169069,7672931439647121,9116625032655253,5487972184275350,3594002438236567,6504968290881944,259054668161439,1181802185935600,3723068793053607,8942309949689927,8184027842648492,3247114118189486,7460393318239645,4895421267919280,3797309250194163,2690909527771573,4972814070550967,6640718785178040,2904893712978335,4290481007822922,4116542334042558,3214391173607876,1821235306916296,1633467053007307,8746175933077964,8762669865929464,4533275629345235,7562975836533210,3596856859445327,8887776877306332,1611329518436829,2292427128957406,8771414131157471,4224869793313248,7286961056348641,79613614485986,4672606186682851,8017098291406393,4596494124825062,9197272968673767,6000761850597864,6968230902190569,6688832447887850,7394924464552427,2674036456466925,2507459211151854,3237513739076079,8914378180354546,3147154239203827,8389816593560054,1671414082531831,8891097309954132,1540645225411068,5172386150595070,5104163354698242,1883306435691016,7505674307494552,731854695534338,9118551576648207,4181568995199537,9013164930507286,6006028418963992,6688590052082204,2513735956150813,4134159845040671,4534224411662880,525054099585456,979010812860962,3611763202015779,7095014571945942,8969301122095878,5627277066124563,1729188591448620,5551338971394606,452013917844015,3760429834302000,609595994886705,6759021235482067,5040961609722419,2020343516893748,6488556591844913,3637213022202425,6096777306792031,1026459496276543,7455222171714112,1045068351257154,8827608513733188,3523956689437254,79987704382023,975673974432328,4689104140466761,6821591534152266,312590849712567,3067410791858765,2948485041543758,1889791297981007,4068408567984720,5322606574414417,9116669510993607,6918057619810403,6659677961820756,2793089844357720,6631464134980186,2970460363812820,6020694009233445,7736745512751711,7144507632053350,5577674737580649,9057626374089322,3177162077424402,8664103508363886,89466973000305,6481850240270963,8525496742161014,4821400422546040,6008686343826539,8375527778480772,4413386339627654,6172441611898305,1117264602786442,6514289579348759,6116060004975245,1396966693474867,5006136790411922,7703075926127251,4310983456486037,2041530094928535,3152588199846552,6481230181503641,4526856273216155,3545672137884316,4253178763887261,7315639731587746,7801063606352547,1186237668727461,1652455566897830,5663652953692839,6060645221894824,135393034402588,4500535921685163,2330614697059101,7442475329401522,8114401761218732,2044247346991797,2912264992228023,8348648835260443,7285948059478715,5143326630329020,932939659109054,60378415039167,2073885644873504,5929017663554243,3297787692927686,7058638927982586,8660141082893010,1563448413792980,2715678463453910,4644834818911466,653143408136922,7519721313245917,6618400722678494,6895963736646368,8869629311992545,8248966879860055,612459631170277,4964245868144705,4447198327452391,5330066487716588,2194663990649581,5593481517662960,5072196046592808,5445952212138451,4706193404512382,6348999048702710,8268929968020216,7683012709065198,7357425928652806,79154056223483,1840451770995455,3787710878567169,5369396026297090,7086107307279109,5029024118172737,4075097623739143,8831685062214410,4578748100848396,8792876362328845,413785940919054,5320157055974159,5481554530069265,3629291002895122,8946307404822483,8718130070170389,7704677599349526,1054275711273751,3232819629134980,6943126497512218,2307574320041775,1906772735918876,2288006822497053,8683545464674779,6813590766439204,526362004736805,6240883769613096,251239388773162,150440999740204,9118370368068397,6883706139687731,5731070953998217,885983410047800,7383490596973370,6683315712455818,7270547944368962,5267166088434827,3943858092358429,39034603146053,1337521374808903,2090506758120265,7418089449595724,3073597626975054,5143489273005083,1075043958593336,9126112069464914,3514528151384916,1380595904292665,8854944393594497,554134917956442,5835545835543390,8344663634414053,6095228494617440,1964507021788005,3802418303941482,8081066633892715,1910593041603439,659232984585072,5750361275085685,3135001589832566,3974437427874680,1806159035820921,8004338068643647,5215696869653372,8902012397867901,8401625192446846,748492369918847,2946488938281857,6108592070931331,4278090677943172,4366419722453893,2498288362482567,272587809915784,5333586270317450,504393765835663,7229143454402712,8210223966297923,7591455912848277,156063832476566,5246123548898199,2207893604742980,4513006423851932,5169071486789669,8263082455192480,6303715628297121,3697870177602466,1118919509873572,5507078447218054,707229593400231,3147001637462952,1162045228484764,6560583811300266,4329269684898631,4395681874742189,5815271668153262,1908601069992880,1114321024474039,3750803920696248,1309665620693948,8320168734516157,3620425980992446,7423993512512449,4278162006700996,5117598467695161,2333481361980358,7698818978630599,9205393091786718,233706734607305,6744432996269345,7571139692075986,1527689071442083,3545618863303636,5544611548236622,2805789493626706,883265817000927,7197613786377187,8132507938296657,3211110987899880,3689429510032361,4189553090192365,5350555326647281,2908150875031449,1556533368370163,3206124317975541,3094060545559770,6444402771993593,4075482473804799,2988549387186347,6825531357520900,1969941769417733,1329166564469766,720479552678919,5595351390321673,5851798716328970,8387267156012045,1222383880604687,8961816181681168,1906431335353364,115653685931030,2817642922398746,4301146799418395,147170583428124,5855524488018973,9031816507747327,3764687194645535,790654064985120,2418126448520225,586632734811171,7013083902301220,3624246052604968,699102757783517,3593090483125292,8917625531533490,3114416684469296,5692527180121137,8579640750636546,4900581805020216,8750017995015226,6161451051914299,467170594012221,7704172396776510,9204896954687686,4345980822785089,7067723060898067,7811797328936004,2651298661731398,881727905905735,6362250025532599,2075779771468876,7932534848162894,902644470338640,4181496314496082,472032253574229,6716286728506455,7586467174415449,5788326877807706,2042757503042651,2998221197220956,3169540776328285,2449450445597793,6838386676890724,8732921140309862,5474947324025958,1884594995057768,1376950582336617,3187041371548779,133929418392687,6990839388701706,6845819246845042,4235781659098235,4780176415622268,7073924535239806,7367310935398946,9198328797389954,4998390552927364,5905231224501382,5322002520433802,2628231161425035,5277264721894541,465302470372495,938178345855512,4153421342784659,8913980908404249,3329415862656154,4221823475113115,2580227738750111,6987677723286689,2394415813764260,3671083199515813,7897615896297329,6810211446934698,5282851945495723,7804893704516781,4344785205300431,6524629609458870,6355352420626633,4535046787179704,1031383124647796,9098813923404140,7584168312018463,4982660330425532,1837533424983229,5709006516163775,1838960946691265,8109930570260652,3098637385784524,7823645116391064,552955381451980,527683205612749,5159075771251919,2052858832106704,7784501631454072,469792880321059,6338137699896532,2439170305147769,3738706871532760,80582666818778,3233937059849435,5070918857901279,2112213802902753,6132381393192166,8616672720866513,8273719449674984,4399994482969833,369499245411562,6042056660438251,3573475823172844,6622249050451182,1067247138215152,5454169691073778,8350360891189947,2096781579850997,5615038250050806,5370745106134264,6635324373912826,9182970227121184,5620058134965500,980834165894698,4012140846466302,2166883391794432,2644015486018817,6197147197632043,4645115293969671,3874679130076424,2018873126552842,5265260134400793,2704398406520078,344119912738349,1708382316018960,1773046154980627,7725189339933881,9203930780471855,8540820752669980,4718482245743901,5667554861026593,3609776238564642,8812057437226203,2910953926861361,2277290711678250,4218585492534572,8266042070351154,850918761057587,1491763920835893,6415455302921526,4122598182896951,2564593615848761,5930869980553439,2861115776294205,5234943150794047,8523638786856256,1386457056136515,4228561573166405,5062361211761991,4858788048921935,6040298245971283,4155597872591409,1987248962639190,6144104141039161,6309518686066008,6680501502330203,5869496864560477,3364332293508448,7303694905055120,3859893973718370,3175948293156195,8611558589451621,7309780817653094,7265754901190545,319625677180264,111932726324585,7063521322085738,6344465336072423,3673065535319404,8438475352979078,1068771920487793,2002844782261618,5915515094523254,8100528757670480,7228077656558143,4101177121291498,2733504937158017,4931271922198530,2788532276903830,1344498423909766,8504274081955207,6395832742692076,554285687178635,145076693646734,7844815092368783,8625333227380485,9154959961896341,7246054262044054,4019911281737111,4047195022474649,5325010964440477,6900042523927966,7261020895755506,8342107316258225,5829617881185715,5429216854398389,8319195474104905,2639311175933368,8751613534081273,7409751882020284,7206619084989888,1770739082872257,1794127634275778,4464603769121014,3981764549627336,2869871080682955,8969727571934674,3313513219608483,5315297682173396,6426530345041367,468620098749912,8455408277401508,1022541550912986,3959363182394843,7875439475477360,7120322138912225,1848123976048098,455490147282405,1109432910489064,1389212279856621,1830611976336296,1819280158531060,8368711574510846,5381869512607223,3793613813775956,4041823586119162,1161927944179197,369157768830462,568751031799296,5102499362057730,3000495977328133,6858705048481506,9040625095319050,5931956914269707,1673554010523148,7483971843172269,2925372886324752,5597691180262930,4291450951892499,1505287247750677,6579032172064142,4092422032979481,3567176523658778,7120038094652956,1059505823749985,2888314400331296,6459237160933296,2899359577765410,6757391593664091,4352016916551204,8369553900946981,2590282051065382,1440064159872554,473082175130887,5482500727930413,300812385172744,8768991265914420,4072915558657590,5014327851210297,5941322649937466,4511712800822843,3625714571103807,6441750141939268,7447683711131207,6051374124254793,2409840279301707,5323534501080657,5238555274180180,8871662812751449,3458791146288730,958075535627867,3947151360867932,4445175106844261,4522373948296802,6142660860636773,5033505858907752,1882297645368252,7193981743679082,5531375589601554,5483850052296305,5922302214251795,6242403401672310,6949652654890615,9101338701276793,5106497930608250,5782130075072123,299145771413118,7135851497668237,13306890006464,1588109343624835,4235032164587140,1220400307789446,3166565117857417,1769445018494602,4070366731198091,2537487380643468,1001196601284237,1216264555253393,3855680930676370,7109312668282516,7948733674040601,6992732071726744,4194416405429913,3447937894743707,8515914895089309,1957225587047379,3600219413003935,784713650704032,223912658032290,3159752761460388,4096985620477553,8436333510076072,2281767462301980,287418009536170,5332390274954926,4592941668822704,8680281739153074,6437980416657076,7381673105354423,5176683580835514,4766700513111739,7044393658122186,8849683899871823,7905722767685163,4671475720554178,6263493700198083,8599816598564548,7327565150008125,1296248454342342,1617332937576135,5319043952088776,9029912302055114,8075157434973474,4945003767830222,4193665318563867,5859894009587409,2396041509228251,2024130444633820,80857262636766,3286701371021605,252682120447714,6745962241930979,3510826732033764,728421941085925,4746761069117159,6880471424544490,8728774733032743,2009848877923283,8538876453388018,1254190396827379,3840030970646260,3516222783540981,8215516250631926,2890490800047864,258785826191097,4613384163815170,42333614958999,6297460346930949,1485932228194055,5930537209478920,3258211975390991,6951624807428757,8008509496764178,7406125158982275,8647717074001687,659778341562137,814631417812764,2394157127339805,3912204798107424,4075417394827041,8207114150879010,628966953463587,2071733380642596,1352071667157638,9087426803002707,6083790178045742,5046778326587183,2209658260033330,3749791102222132,1652697002921950,7477477464751880,4881617624346424,4012476262782777,3601446652716860,1339143413692223,6484033900278783,430448660268867,2994617725708100,8633895739856182,4944170770362182,5033832590100295,4992847438659663,8722226075563319,7025045086915213,4016302710255440,681921309540178,2669633349924691,8929001777037142,8958220082990770,8607199541471204,1729717045946205,7882602832449375,368151546179424,1803652200560481,8336423228010811,1178017944854374,2425153547661159,8531691436980613,2347909646781757,1747771398453105,6113770072569716,8343019957792632,1999886316711801,1970831653236607,7359943690084226,2287904013680515,2799159832856452,8327864943675270,6449639556661127,5911673329315721,4846600011440011,3880180667858828,7159997198901133,2282055807684496,4933201805681304,5619676911554450,6151794197610819,1002500276193174,352283252400025,4282500139321242,3314151215368092,5627848973411283,8197796402111206,6109448380381091,7536197985687460,2746121921770587,3608941228692124,7171010035299655,4489980880689069,2009354823049136,4339380780212148,616673075767222,1672563843819448,6629435825731518,6901487045957567,3392795600406464,4048449310987936,2287824495759298,2887405562332930,8865976484930105,7225660297650120,2403430883938250,1441357170177996,3968836039213005,5602009914506232,3293296611664987,2896287263780819,5080071713128404,6442037107476437,3028469485907926,8183972696989656,4378057457211357,848657156116446,6882877678276576,8443773584726352,1930717645236196,7368366257379491,3085514994581159,6582908195467245,2782079898693616,5933533752402600,3933586116620274,8204875963108691,1240329659639797,8380279870793718,8904808781979305,4147451924205561,1879731836806407,5116592890419195,1777148605384701],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.0107d767a345eff67ecdaed2ee5cd7ba.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453566_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"0107d767a345eff67ecdaed2ee5cd7ba\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    5641354835174,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14062071191653,\n                    14580861632266,\n                    18722876140337,\n                    20714320729467,\n                    22732389403804,\n                    24134363957219,\n                    30606147678309,\n                    30841792132441,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    35413666412010,\n                    37166860055638,\n                    38008340488610,\n                    38631948370393,\n                    38946626358857,\n                    39177463395973,\n                    39396232170068,\n                    40000457533067,\n                    41548684950793,\n                    42975853122398,\n                    43119393989323,\n                    43377695911881,\n                    49367718187361,\n                    49468277378328,\n                    50266038601832,\n                    51636068122286,\n                    56622962479482,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62130354354877,\n                    62702978264830,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    67872638217057,\n                    68827108109263,\n                    69134145403133,\n                    70436552236751,\n                    70880519905358,\n                    78004711377952,\n                    81502993782978,\n                    84636365982041,\n                    85239629151685,\n                    94266407193778,\n                    98142256300701,\n                    98837920540443,\n                    99930975216128,\n                    100653760748845,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    103652023867250,\n                    104130252812879,\n                    112760650992638,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120285237540732,\n                    121866736124647,\n                    122140892054804,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    128261346941417,\n                    130618284885748,\n                    131310062444107,\n                    133580282506938,\n                    139762252968300,\n                    148434659896290,\n                    150472163116319,\n                    151610888790844,\n                    151736593364935,\n                    152145317861349,\n                    154119208822262,\n                    154803963303860,\n                    164146490870545,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173503876669758,\n                    173949973069402,\n                    175345218226732,\n                    175559849681044,\n                    177057739236298,\n                    182134979074863,\n                    185526639726849,\n                    186188120396587,\n                    191078441509481,\n                    191784713609488,\n                    196150349451960,\n                    196584209022550,\n                    196853921592387,\n                    197752504251580,\n                    198597053692927,\n                    200567230796156,\n                    201179164742411,\n                    202960515626517,\n                    203378213499023,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    218586803538885,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    223103766020907,\n                    223436957406949,\n                    225216425962890,\n                    225962923363564,\n                    227026140769845,\n                    227790244540446,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    235385609463388,\n                    235438505061770,\n                    238869764444344,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244786468497109,\n                    247140303430449,\n                    248336783901894,\n                    250357693564448,\n                    253975323975963,\n                    256375919657769,\n                    259301238714261,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    267345873524094,\n                    271342665825792,\n                    274876788032658,\n                    275360996806051,\n                    275711441656065,\n                    276221877341287,\n                    277115529175674,\n                    277862338800417,\n                    280967669495427,\n                    281817613252845,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    289038917997203,\n                    289724862541255,\n                    290309864993733,\n                    294086384353867,\n                    295503963521838,\n                    296966685834878,\n                    299005107402724,\n                    300199234365396,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    305781540735975,\n                    308107503975413,\n                    308473366560206,\n                    311148974624393,\n                    311393227334671,\n                    312856558437716,\n                    314634385460120,\n                    315140251773348,\n                    316147818305256,\n                    317314266550052,\n                    318043998368340,\n                    319121931997971,\n                    324333149672473,\n                    324779561826125,\n                    326855577904572,\n                    327646715321140,\n                    332098363218169,\n                    333944737799563,\n                    334160175766170,\n                    335584394916553,\n                    335971123608722,\n                    336472954791992,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    347580313704916,\n                    348815216366639,\n                    348987115477673,\n                    350399163507829,\n                    357535517122796,\n                    358595265377108,\n                    358821394913517,\n                    359452645935849,\n                    362124977362793,\n                    366354200059782,\n                    366535672236781,\n                    369474755519844,\n                    370249620342175,\n                    372037414685096,\n                    373949557068914,\n                    374319819178480,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    379102542404949,\n                    379241504134406,\n                    379468459802010,\n                    379661395441316,\n                    382035531157070,\n                    383008100523152,\n                    383135333541903,\n                    383850900061929,\n                    384049466048679,\n                    386263487549463,\n                    389141313731258,\n                    390332660259608,\n                    393516543506060,\n                    400967959890432,\n                    401487977714282,\n                    403579902131163,\n                    406955472999822,\n                    408962716867059,\n                    409903018669983,\n                    410861197839878,\n                    414355853800959,\n                    416580890530128,\n                    418934773149726,\n                    419642123579295,\n                    421963163293847,\n                    423404494960378,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    429952924284227,\n                    430664272577516,\n                    432630098291297,\n                    434623968464695,\n                    435267549331128,\n                    435277763415865,\n                    435874505125675,\n                    437654980371254,\n                    438061138128325,\n                    438738288109196,\n                    439177016005977,\n                    445344075816835,\n                    445802335759252,\n                    446710003143163,\n                    447467518423055,\n                    449641727299803,\n                    450058424424520,\n                    450112320572118,\n                    450125274173050,\n                    452241247094714,\n                    452829154656306,\n                    454813132622585,\n                    456174765596578,\n                    456493632715805,\n                    456717723773303,\n                    461156956524045,\n                    462211497323948,\n                    463604028403361,\n                    465228093393002,\n                    466250095735125,\n                    469687793491358,\n                    471922058927200,\n                    472039595540269,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473018780652067,\n                    473772140307174,\n                    474570287539184,\n                    474912397870603,\n                    476325119891604,\n                    476526896773980,\n                    476855560317170,\n                    480232815782455,\n                    484291524803718,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    494276065129917,\n                    495846359323641,\n                    506531113930798,\n                    507871334392190,\n                    508031302306958,\n                    508934816424512,\n                    509939413858428,\n                    510737910464301,\n                    512514768813167,\n                    513350289212553,\n                    517460246914282,\n                    523321188654478,\n                    524296526109332,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    532977797373940,\n                    533221992957154,\n                    533383900955463,\n                    537527309474265,\n                    538136383284668,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    543935720187395,\n                    545273268128445,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    555828795847874,\n                    557285930201258,\n                    558008777268240,\n                    558433475619762,\n                    558892016080993,\n                    559199414492426,\n                    560748186311107,\n                    561604684739024,\n                    562789967643507,\n                    563343385252253,\n                    563775395645616,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572526115602502,\n                    573767900523468,\n                    573851852316852,\n                    576624529060777,\n                    576874504697497,\n                    578856083248351,\n                    579395263040626,\n                    579656586099131,\n                    584217116139474,\n                    587458649504773,\n                    591009756408904,\n                    592792708776319,\n                    592997432856726,\n                    594482884410814,\n                    596004492939074,\n                    596726606390901,\n                    597875929908982,\n                    600179982751750,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605545396594434,\n                    606419362199228,\n                    607833403537880,\n                    609555580824872,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620059729516362,\n                    620849299055244,\n                    621083126852990,\n                    622843084945666,\n                    623088556560813,\n                    627738708322473,\n                    628002002108775,\n                    628967244202734,\n                    630034340392901,\n                    632757066611488,\n                    634340585739407,\n                    634691502028135,\n                    635939425862264,\n                    637603178700210,\n                    637880811482435,\n                    644557275230225,\n                    644935615624623,\n                    645793929303122,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    649351154360370,\n                    653652775436966,\n                    655230244020599,\n                    668170744538822,\n                    670595660720839,\n                    671785773373187,\n                    672641554971634,\n                    672821857332020,\n                    673587502056476,\n                    676044446355190,\n                    677295740685782,\n                    679716691783353,\n                    682874745971459,\n                    682963108550465,\n                    683897063771844,\n                    685246440558482,\n                    686035384279530,\n                    687129162879229,\n                    687440351836027,\n                    688990372747831,\n                    690608944213791,\n                    691680901171966,\n                    694851976547107,\n                    694869046270466,\n                    700054088308311,\n                    701010566680671,\n                    701156706346414,\n                    702431887238370,\n                    702728791577749,\n                    703127461004015,\n                    703460523248065,\n                    705302678110381,\n                    707793984897058,\n                    707799855432305,\n                    707962189637436,\n                    707993631271976,\n                    708854130532070,\n                    710403353214581,\n                    710927468728191,\n                    711091480855740,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    724746920000049,\n                    727030394121071,\n                    727262050490847,\n                    728279662753580,\n                    730854175545196,\n                    731361512976697,\n                    734622692371860,\n                    736290151677476,\n                    737921635760471,\n                    738115824615020,\n                    739389456325310,\n                    742704052187442,\n                    746469097917429,\n                    748064810280445,\n                    749144352424687,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758543555642030,\n                    759083903793759,\n                    761260029175908,\n                    767230586289375,\n                    770167973924874,\n                    770328708409334,\n                    772165475523258,\n                    772947318346532,\n                    774312511311396,\n                    774365323868051,\n                    774964429534347,\n                    775558532281404,\n                    779330069525835,\n                    781344931111517,\n                    787747218685488,\n                    788027556261557,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    797511060014001,\n                    797622366845781,\n                    799257433888961,\n                    800060479182618,\n                    801084876663808,\n                    802340523858506,\n                    803596407436267\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.4e94e60265e04f0763142e20b52c0da1.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_2.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"4e94e60265e04f0763142e20b52c0da1\",\n                \"mins\": [\n                    250486723534,\n                    2508456406617,\n                    3114055682630,\n                    4326583440446,\n                    5166206090659,\n                    5651658843765,\n                    5888422665728,\n                    6103415363614,\n                    6235526594701,\n                    6326519491884,\n                    6878955625210,\n                    7215992153582,\n                    7263583777537,\n                    8395644761685,\n                    9072289775829,\n                    9599933508359,\n                    9851745764538,\n                    9914450265081,\n                    10636634611478,\n                    11078169853920,\n                    11850890474214,\n                    12268586466425,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15424135029274,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17427197239629,\n                    20208369434823,\n                    22648822913198,\n                    23651462508176,\n                    23928516462553,\n                    24474488157758,\n                    25171338917197,\n                    25595537972192,\n                    25977883823029,\n                    26336101344262,\n                    28005085380016,\n                    29426613300325,\n                    30912597140678,\n                    31804114294503,\n                    33283788494941,\n                    34832941612548,\n                    35206157695212,\n                    36608959952536,\n                    36699864848579,\n                    36965258409960,\n                    37923647270157,\n                    38668597630050,\n                    40072538274701,\n                    41051959531050,\n                    41163986984660,\n                    42806708117796,\n                    45549512378900,\n                    46330912571584,\n                    47932899674281,\n                    48305356021361,\n                    48422112851291,\n                    48827478905522,\n                    48988117530884,\n                    49720533077083,\n                    50336770017521,\n                    53853474657507,\n                    54546098460847,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56306387723041,\n                    56789903701800,\n                    60051688191594,\n                    62790957647340,\n                    63034352531495,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64303638595001,\n                    65401240928904,\n                    65659023305314,\n                    65794631590725,\n                    65924385841826,\n                    66254172924766,\n                    67162847056402,\n                    67207262461072,\n                    68027479033630,\n                    69023206404673,\n                    70845832854736,\n                    71648552124359,\n                    72267500733483,\n                    73600562400430,\n                    73600726148081,\n                    73938092731264,\n                    74463348702348,\n                    74757289081889,\n                    76461141982463,\n                    76601650706225,\n                    79332000470232,\n                    80480643670004,\n                    85069188519897,\n                    85513145337736,\n                    86370708776973,\n                    88205744296842,\n                    89385885763749,\n                    90136762486499,\n                    91578872290342,\n                    91791067858367,\n                    91873432718081,\n                    91947365014884,\n                    94086187561813,\n                    94879727048600,\n                    95613743229855,\n                    98324799297724,\n                    98406995764882,\n                    99368955966421,\n                    100718427599813,\n                    102632033433196,\n                    102644142538181,\n                    102882967284023,\n                    104095665010556,\n                    107278977448655,\n                    110162881433718,\n                    112325880172670,\n                    114727586194884,\n                    115711999096223,\n                    115890459170026,\n                    115990086684946,\n                    117509882155020,\n                    118006247672122,\n                    119438611160104,\n                    119862823995471,\n                    120859413131497,\n                    120869469396540,\n                    120965026768103,\n                    120980078369659,\n                    122789260675111,\n                    123464311633543,\n                    124631092323259,\n                    124750192071655,\n                    124948347574890,\n                    125648214305342,\n                    126324422909661,\n                    126386912242740,\n                    126943192152369,\n                    127838593437661,\n                    129104997236940,\n                    129661998661164,\n                    129921574005351,\n                    130381409629549,\n                    131426956400912,\n                    131670610194393,\n                    132320703016655,\n                    133074201429869,\n                    136270510397946,\n                    137011854576215,\n                    137250954972319,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    142846188486668,\n                    143166346620229,\n                    143570389373736,\n                    144015570248215,\n                    146405999815556,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150653874201709,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    153964058113210,\n                    155005702504057,\n                    156275207016386,\n                    156516659025181,\n                    156678666334181,\n                    157146773076591,\n                    158914038640710,\n                    159350162876827,\n                    159359554299317,\n                    159472244264757,\n                    159869778233041,\n                    160225475241462,\n                    161489918754278,\n                    161548850449553,\n                    162966656941363,\n                    163709351584749,\n                    165572906446902,\n                    166605601159467,\n                    167304010117193,\n                    167578307012466,\n                    168412944661902,\n                    169891545961677,\n                    171948018815208,\n                    172888919441360,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    175029718718788,\n                    177264301473978,\n                    177974381583110,\n                    178176094018343,\n                    179921783290284,\n                    180656320447823,\n                    181063160240061,\n                    181257548112038,\n                    181803993639937,\n                    183018746533881,\n                    183449325300818,\n                    184271038362020,\n                    184594169885550,\n                    184752983925284,\n                    185471680685606,\n                    187928842797492,\n                    189442327350789,\n                    189748192026650,\n                    191344453396371,\n                    191379677170076,\n                    192587291169373,\n                    193005890924998,\n                    194065250832376,\n                    194363033520822,\n                    195441337298296,\n                    195793810311093,\n                    197916541706101,\n                    199129991434152,\n                    199438795256574,\n                    199510432035291,\n                    200372412253250,\n                    200404566576199,\n                    200763792087641,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    205495097863124,\n                    206915135800075,\n                    207091233110623,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209010486710646,\n                    209240354662781,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    214695938897851,\n                    214903197314923,\n                    215248629858867,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    218536028897273,\n                    219204102261164,\n                    219891441411753,\n                    219974613748434,\n                    220343480974288,\n                    221554546582125,\n                    221729288627371,\n                    223834426416688,\n                    223984693568096,\n                    225075006031359,\n                    225198908542897,\n                    225259785351827,\n                    225688512560038,\n                    225796963089274,\n                    226620699633185,\n                    228659301550674,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231765455198863,\n                    232016464825731,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234486644060094,\n                    235151438889624,\n                    235231753660795,\n                    237490431789443,\n                    238102472767969,\n                    238536247300230,\n                    238574581938385,\n                    239320860931883,\n                    240958548895043,\n                    242434218139153,\n                    242442058293823,\n                    242559604450370,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247103593644053,\n                    247223650843273,\n                    247271784936594,\n                    248730448052989,\n                    249136603804393,\n                    255250274209015,\n                    256188918759811,\n                    256264089513587,\n                    257140177602265,\n                    258090152932519,\n                    259079953498264,\n                    260567430361426,\n                    261430613863924,\n                    261804172017043,\n                    262102779540056,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263593108768410,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264847443724344,\n                    266537010768292,\n                    269449522688748,\n                    269788172566464,\n                    271375997486305,\n                    273963009929669,\n                    274201125891842,\n                    274383394688737,\n                    275456716615408,\n                    276087711843386,\n                    276171708863992,\n                    276395310963137,\n                    277124038643903,\n                    277967939584293,\n                    278359501970729,\n                    281419217453687,\n                    282627103058306,\n                    283418694026492,\n                    283650389519323,\n                    283716381550104,\n                    285115327004357,\n                    288471586195099,\n                    288630780557211,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    291172509721213,\n                    291901191461589,\n                    293349295644131,\n                    293364784068746,\n                    293460842461919,\n                    293761737980270,\n                    294048628266791,\n                    294309017220579,\n                    297566393252293,\n                    298164502295539,\n                    299495863829841,\n                    299686419400666,\n                    300842773788181,\n                    301280787524288,\n                    304357039915265,\n                    305883937093471,\n                    307125249787970,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    308924696686164,\n                    309853660376897,\n                    310260543915478,\n                    311783912113073,\n                    312655519254570,\n                    313635798098525,\n                    315730568901909,\n                    315766966261328,\n                    316937125480217,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    321890891143490,\n                    322521825476248,\n                    323047827128093,\n                    324351935671697,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    326399280158975,\n                    328158084014937,\n                    330274652031045,\n                    331145279644469,\n                    331872454071816,\n                    335724314867453,\n                    335817092568549,\n                    338300563625880,\n                    338844220006106,\n                    340863683252199,\n                    341662236661817,\n                    341811810483352,\n                    342688543846132,\n                    343279150148526,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    347266825568201,\n                    347767039186779,\n                    348817429227528,\n                    348833845559066,\n                    349622757145996,\n                    350987533382827,\n                    351058626361688,\n                    351589420054826,\n                    354103463961601,\n                    354387066710883,\n                    355561819235138,\n                    355789912870705,\n                    356695205540256,\n                    359175499709959,\n                    359439738386632,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    364345413204186,\n                    365126424210828,\n                    365413280249712,\n                    365934903234669,\n                    366193857397914,\n                    366211725375178,\n                    366388425061942,\n                    369001359438455,\n                    372036972894155,\n                    372119412691335,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    377253494422430,\n                    378570200652257,\n                    378812352248018,\n                    378988928968399,\n                    379202966330246,\n                    379383874861118,\n                    379655211188325,\n                    380132704649033,\n                    381418800043351,\n                    383272102454619,\n                    385418400433017,\n                    385959959345831,\n                    386426924783330,\n                    387084858219758,\n                    387891260768716,\n                    389648404681890,\n                    391093344163451,\n                    391412493497363,\n                    391837889962924,\n                    392637215710013,\n                    393407397414020,\n                    393666094843064,\n                    394549480944907,\n                    394992647600588,\n                    396097144709247,\n                    398018189439516,\n                    398451260178161,\n                    399359713815504,\n                    401258033920475,\n                    401548443050700,\n                    401678403062417,\n                    402467057162382,\n                    403472959967900,\n                    403550823036072,\n                    404003416788822,\n                    404032561117566,\n                    404071682289595,\n                    404160108032790,\n                    404962546496863,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    407839904624528,\n                    408693003864864,\n                    409460547709689,\n                    409964247236589,\n                    410070177508463,\n                    411917287296495,\n                    412738866512772,\n                    412842793028086,\n                    413767389226181,\n                    414678207656526,\n                    416308367178118,\n                    416821154641916,\n                    417458112822963,\n                    417538262642243,\n                    417879179345800\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.60f7e23c24a8d94791cc7a8680c493f9.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"60f7e23c24a8d94791cc7a8680c493f9\",\n                \"mins\": [\n                    250486723534,\n                    1276320723000,\n                    2508456406617,\n                    4346223556404,\n                    5651658843765,\n                    5741639512374,\n                    6103415363614,\n                    6382184420000,\n                    7215992153582,\n                    7263583777537,\n                    8230363088713,\n                    8344183384681,\n                    8395644761685,\n                    9599933508359,\n                    9851745764538,\n                    9908321119520,\n                    12179585228825,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17520725293289,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    22648822913198,\n                    22764046638638,\n                    23651462508176,\n                    24455303556700,\n                    25171338917197,\n                    25977883823029,\n                    26336101344262,\n                    26775359856414,\n                    29426613300325,\n                    29429643624977,\n                    29716486194840,\n                    30912597140678,\n                    33283788494941,\n                    34633591199949,\n                    35265151771864,\n                    36608959952536,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37321172331310,\n                    38189684658557,\n                    41051959531050,\n                    41634658763025,\n                    42806708117796,\n                    42941620852116,\n                    43102684986874,\n                    43257012736171,\n                    44469103278173,\n                    45435629568409,\n                    45555150962803,\n                    45778211392090,\n                    46428667877491,\n                    47743166786889,\n                    48827478905522,\n                    48988117530884,\n                    49652906159408,\n                    49720533077083,\n                    51190225926040,\n                    51489867698846,\n                    51681162571203,\n                    53853474657507,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56495629119710,\n                    56789903701800,\n                    58448059219764,\n                    60051688191594,\n                    61585240896556,\n                    63136274461401,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64098752156766,\n                    64303638595001,\n                    65337560481765,\n                    65794631590725,\n                    65851646271217,\n                    67162847056402,\n                    69927546604113,\n                    71441250280595,\n                    71648552124359,\n                    73938092731264,\n                    74074344499959,\n                    74463348702348,\n                    74757289081889,\n                    75026691722950,\n                    76601650706225,\n                    77594090223745,\n                    80429502208150,\n                    81546812908959,\n                    82700429817161,\n                    83318109425074,\n                    85069188519897,\n                    85513145337736,\n                    85753551939023,\n                    86112424291327,\n                    89385885763749,\n                    89781876394634,\n                    91873432718081,\n                    91947365014884,\n                    93462948799513,\n                    94879727048600,\n                    95613743229855,\n                    97571747840697,\n                    98324799297724,\n                    98775547882506,\n                    100718427599813,\n                    102578745288578,\n                    102873080592435,\n                    104095665010556,\n                    104528709310472,\n                    105986132286860,\n                    106984945037295,\n                    107278977448655,\n                    109551654663245,\n                    109566666231438,\n                    110191507921350,\n                    110549642873812,\n                    112654122078687,\n                    113222445295988,\n                    113854916802784,\n                    116127169502189,\n                    118006247672122,\n                    118237881107424,\n                    118484253796245,\n                    118762763614010,\n                    119358605785829,\n                    119553131858167,\n                    120859413131497,\n                    120965026768103,\n                    120980078369659,\n                    123464311633543,\n                    124449616140151,\n                    124750192071655,\n                    125424514480710,\n                    125614494300765,\n                    125698882792384,\n                    126860824288401,\n                    126943192152369,\n                    129104997236940,\n                    131426956400912,\n                    132369532359260,\n                    133074201429869,\n                    137011854576215,\n                    137250954972319,\n                    137658530991775,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    141543030608061,\n                    142846188486668,\n                    143570389373736,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150561506312724,\n                    150889573263592,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    154067549446405,\n                    156275207016386,\n                    156643571858026,\n                    159204029141024,\n                    159350162876827,\n                    159359554299317,\n                    159869778233041,\n                    160021373144492,\n                    160225475241462,\n                    162966656941363,\n                    165572906446902,\n                    166307721941863,\n                    166605601159467,\n                    167304010117193,\n                    168412944661902,\n                    168609000755301,\n                    168699625286154,\n                    169208855579907,\n                    169523753644578,\n                    170917904316320,\n                    171143723926121,\n                    171243991312977,\n                    172170767228631,\n                    172842536979187,\n                    173410623132357,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    174897648514915,\n                    175029718718788,\n                    177264301473978,\n                    177857889812960,\n                    178176094018343,\n                    179017201157110,\n                    179921783290284,\n                    180059082755493,\n                    180068779789910,\n                    180414262292400,\n                    180740880110572,\n                    181063160240061,\n                    181803993639937,\n                    183449325300818,\n                    183519396664097,\n                    183571182225450,\n                    184752983925284,\n                    185471680685606,\n                    186580476523320,\n                    186949263795931,\n                    187928842797492,\n                    188086202110112,\n                    189442327350789,\n                    190807904035305,\n                    192319726776217,\n                    192393783199254,\n                    192587291169373,\n                    193005890924998,\n                    195786680138999,\n                    195987898533177,\n                    199510432035291,\n                    199650567438286,\n                    199897125905944,\n                    199958856257661,\n                    200763792087641,\n                    200811993081184,\n                    201913688816444,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    203992874733577,\n                    205007299373342,\n                    205495097863124,\n                    205586854488827,\n                    205853306198814,\n                    206336494258543,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209537101018812,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    215248629858867,\n                    215275340873070,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    219891441411753,\n                    220558792511464,\n                    221554546582125,\n                    223198782858602,\n                    223709567417754,\n                    223834426416688,\n                    225075006031359,\n                    225198908542897,\n                    225688512560038,\n                    225796963089274,\n                    226081900407695,\n                    226749405843443,\n                    227730705667335,\n                    228659301550674,\n                    229789874401174,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231270817858833,\n                    231444506729168,\n                    231765455198863,\n                    231916540191853,\n                    232974725797149,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234373571118961,\n                    234486644060094,\n                    235231753660795,\n                    238102472767969,\n                    238574581938385,\n                    241665428326676,\n                    241990049986130,\n                    242442058293823,\n                    242809521673924,\n                    243357294296588,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247271784936594,\n                    249136603804393,\n                    250033322896251,\n                    252533523398493,\n                    255869213781995,\n                    256264089513587,\n                    258090152932519,\n                    258801668971304,\n                    259079953498264,\n                    260567430361426,\n                    260653292806033,\n                    261804172017043,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264731207392290,\n                    266537010768292,\n                    270110108859339,\n                    270538381802720,\n                    271375997486305,\n                    274201125891842,\n                    274383394688737,\n                    275533107905672,\n                    276395310963137,\n                    277124038643903,\n                    277403312668335,\n                    280768685536212,\n                    281419217453687,\n                    282461563119931,\n                    283222379262666,\n                    283716381550104,\n                    283753951167536,\n                    286272134191105,\n                    288471586195099,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    290751156362843,\n                    291172509721213,\n                    293068286620317,\n                    293122482945702,\n                    293349295644131,\n                    293364784068746,\n                    293446294820727,\n                    293761737980270,\n                    294048628266791,\n                    294285966776959,\n                    294309017220579,\n                    296404313255688,\n                    297267706713144,\n                    297566393252293,\n                    298164502295539,\n                    298353836077639,\n                    299495863829841,\n                    300842773788181,\n                    301280787524288,\n                    302656802432509,\n                    304357039915265,\n                    305166459455071,\n                    305883937093471,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    310260543915478,\n                    310265191419295,\n                    311783912113073,\n                    312500518005538,\n                    312655519254570,\n                    313635798098525,\n                    314170569167596,\n                    314916970143294,\n                    315568913490822,\n                    315730568901909,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    320108891188997,\n                    321541456700375,\n                    322521825476248,\n                    323284031290836,\n                    323583450074959,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    328158084014937,\n                    330274652031045,\n                    330565598299916,\n                    331145279644469,\n                    335724314867453,\n                    335817092568549,\n                    335974005310403,\n                    336220685656619,\n                    336260335931378,\n                    336261489349740,\n                    337623845634316,\n                    338300563625880,\n                    338841443768533,\n                    340776015225067,\n                    340863683252199,\n                    341811810483352,\n                    343787907925867,\n                    344460902511425,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    348817429227528,\n                    348833845559066,\n                    349270259964100,\n                    353928548293364,\n                    354889737852692,\n                    355561819235138,\n                    359175499709959,\n                    359490965261776,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    361245631263122,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    365152687151188,\n                    366193857397914,\n                    366388425061942,\n                    367512815238907,\n                    368111726415588,\n                    368850056470283,\n                    374792067287126,\n                    374992075674229,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    378988928968399,\n                    379202966330246,\n                    379462778378127,\n                    379937459247959,\n                    380132704649033,\n                    380373432490457,\n                    380778268703892,\n                    381418800043351,\n                    381991699884352,\n                    383272102454619,\n                    385113003923218,\n                    385418400433017,\n                    385755642378984,\n                    386426924783330,\n                    387687866855442,\n                    387891260768716,\n                    391093344163451,\n                    391412493497363,\n                    391913316514326,\n                    393253943410375,\n                    394549480944907,\n                    394868976184257,\n                    394992647600588,\n                    395370668508160,\n                    396097144709247,\n                    398018189439516,\n                    398330770380060,\n                    399359713815504,\n                    400501102903000,\n                    403472959967900,\n                    404003416788822,\n                    404032561117566,\n                    404160108032790,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    409964247236589,\n                    410070177508463,\n                    412243873589964,\n                    415731791994512,\n                    415798442457945,\n                    416308367178118,\n                    417193054089403,\n                    417879179345800,\n                    417958793174431,\n                    418013395365815,\n                    418930712757550,\n                    419080351349759,\n                    421689299055012,\n                    421897504513649,\n                    422317065560637,\n                    423341155346518,\n                    424170930031434,\n                    424684625834342,\n                    425491993925697,\n                    426300532034066,\n                    427562965999248\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.6d6e87e1154e95b279e5e7db414bc37b.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2255622_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"6d6e87e1154e95b279e5e7db414bc37b\",\n                \"mins\": [\n                    215089315280,\n                    291674529868,\n                    659912036083,\n                    736968581505,\n                    944574910739,\n                    1130926917921,\n                    1140383038326,\n                    1224208891333,\n                    1519622976813,\n                    2508456406617,\n                    2726898850574,\n                    2813494374706,\n                    3047015433984,\n                    3835288040828,\n                    4231658739382,\n                    4413003150135,\n                    4870914467521,\n                    5825209928114,\n                    5871893412345,\n                    5888422665728,\n                    6103415363614,\n                    7532547771555,\n                    7594581929652,\n                    7910677492884,\n                    8182315511682,\n                    8230363088713,\n                    8394347595486,\n                    8623700758937,\n                    9739271815773,\n                    9780886482986,\n                    9836834414894,\n                    9946639466383,\n                    10104425650117,\n                    10122980714756,\n                    10229953843845,\n                    11382774219786,\n                    11828070075151,\n                    12099834582305,\n                    12132880780844,\n                    12459731847780,\n                    13935429903706,\n                    14563906465922,\n                    14758098660233,\n                    14761433865384,\n                    14898831781122,\n                    14958876677719,\n                    15317866923606,\n                    15366664740987,\n                    15764118331522,\n                    16115281956116,\n                    16219549320392,\n                    16244571079575,\n                    16363695412769,\n                    16493792210474,\n                    16852225843359,\n                    17503337897524,\n                    18262609533893,\n                    18283839128286,\n                    18393265118408,\n                    18699386411547,\n                    18865536207758,\n                    19653463755059,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    20993534689958,\n                    21309387292380,\n                    21678201955671,\n                    22228433882905,\n                    22400017100650,\n                    22481669321537,\n                    22648822913198,\n                    23075126583981,\n                    23473630895827,\n                    24228397245244,\n                    24453017104540,\n                    24729753092003,\n                    25171338917197,\n                    25470086398510,\n                    25859976628720,\n                    26034960602920,\n                    26050630874225,\n                    26811088179302,\n                    26889776861871,\n                    27379618897398,\n                    27579322793320,\n                    27877721210839,\n                    28181374991281,\n                    28987805918116,\n                    29485767733290,\n                    30645532261705,\n                    31018397527996,\n                    31804114294503,\n                    31828073872267,\n                    33174177282046,\n                    33766728674754,\n                    34293559391707,\n                    34865655278433,\n                    35594794270269,\n                    35737327561228,\n                    36023575677863,\n                    36115178283383,\n                    36296573836791,\n                    36648254328139,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37722662910660,\n                    38047555790079,\n                    39181335028291,\n                    39315707646191,\n                    39525475121988,\n                    39547908012021,\n                    39569717769426,\n                    39570762134913,\n                    39842830835114,\n                    40131183581621,\n                    40359387471137,\n                    40488805247400,\n                    41051959531050,\n                    41208453811482,\n                    41327552124444,\n                    41731966115950,\n                    41848970534226,\n                    41993387439893,\n                    42240649495469,\n                    42806708117796,\n                    42835572354395,\n                    43361270985506,\n                    43392410013225,\n                    43951532139020,\n                    44251094622336,\n                    44469103278173,\n                    45134133836289,\n                    45162468772898,\n                    45253034750040,\n                    45493022921402,\n                    45549512378900,\n                    45631191923950,\n                    45687888053031,\n                    45961575852560,\n                    46031634263009,\n                    46219814209796,\n                    46408058278807,\n                    46571511322916,\n                    46861475435055,\n                    47081622333494,\n                    47309849454170,\n                    47851830416841,\n                    47932899674281,\n                    47988023254574,\n                    48322895089471,\n                    48721945773460,\n                    49163704568316,\n                    49371043945336,\n                    49686742507605,\n                    49720533077083,\n                    50096835907506,\n                    50270049899306,\n                    50336770017521,\n                    51082727813358,\n                    51528521216274,\n                    51681162571203,\n                    52034584391811,\n                    52210140433416,\n                    53023472863526,\n                    53228660416588,\n                    53853474657507,\n                    54692295414908,\n                    54867740755084,\n                    55129376901201,\n                    55236706250225,\n                    55778862667349,\n                    56306387723041,\n                    56657193003439,\n                    56789903701800,\n                    56799175563515,\n                    58105502805031,\n                    58290341538968,\n                    58337636059748,\n                    58488541968161,\n                    58720502087817,\n                    58840242165831,\n                    59494247622507,\n                    59495718362544,\n                    59981877800655,\n                    60051688191594,\n                    60188262372837,\n                    61494212300278,\n                    61790767178261,\n                    61812779636411,\n                    62099680245497,\n                    62313609143465,\n                    62639365934918,\n                    62662601215791,\n                    62807714707992,\n                    62828283855818,\n                    63129837300858,\n                    63227673813565,\n                    63343999371796,\n                    63511319636084,\n                    63997630844999,\n                    64226287840399,\n                    64303638595001,\n                    64534788908566,\n                    64598408397821,\n                    64641070960034,\n                    64727391334782,\n                    65372884132154,\n                    65555522561100,\n                    65794631590725,\n                    65879475768365,\n                    66208953124276,\n                    66568612075368,\n                    66827922406571,\n                    67207262461072,\n                    67677675064362,\n                    68180164059744,\n                    68439185286494,\n                    68761623640864,\n                    68842406304872,\n                    68983853573191,\n                    69047394343401,\n                    69229098109696,\n                    69531629629596,\n                    69927546604113,\n                    70273121946683,\n                    70649076239339,\n                    72161895027450,\n                    72329350928637,\n                    72384590450660,\n                    72784763566810,\n                    72926015770316,\n                    74185732683200,\n                    74995142431146,\n                    76236574892384,\n                    76899785139431,\n                    76910573567504,\n                    77363880951456,\n                    77435320006613,\n                    77499348917587,\n                    77670697910565,\n                    79332000470232,\n                    79746229389501,\n                    80363874565010,\n                    80429502208150,\n                    80939112789193,\n                    80991804891201,\n                    81459515971071,\n                    81914076163002,\n                    82065184534549,\n                    82105662040805,\n                    82696690432912,\n                    83034887506486,\n                    83178028089512,\n                    83964592793137,\n                    84005077178832,\n                    84558403439851,\n                    84777164098582,\n                    84876046572148,\n                    85223814578728,\n                    85283551436014,\n                    86034559726890,\n                    86181847516411,\n                    86662916902939,\n                    87008362790296,\n                    87264350072268,\n                    87416948371306,\n                    87553087594658,\n                    87706538967451,\n                    88398210557196,\n                    88606942757476,\n                    88724621114355,\n                    89224410019537,\n                    90273256224370,\n                    91706763244181,\n                    92563002307861,\n                    92615551991813,\n                    92670714878004,\n                    92808938741689,\n                    92963671022329,\n                    93402089893230,\n                    93462948799513,\n                    93841830978049,\n                    94123707640329,\n                    94390504905414,\n                    94449201343599,\n                    95108638560446,\n                    95322147890566,\n                    95470737290984,\n                    95613743229855,\n                    96442880942679,\n                    97040758087909,\n                    97246797236254,\n                    97571747840697,\n                    98123090506182,\n                    98179513908619,\n                    98324799297724,\n                    99368955966421,\n                    99569043912575,\n                    99965133914776,\n                    100448234351312,\n                    100689066969619,\n                    100725505255788,\n                    100757191863196,\n                    101455538328968,\n                    101493231099683,\n                    102644142538181,\n                    104091683226971,\n                    104120924444187,\n                    104400591660966,\n                    104446790158566,\n                    104451867849834,\n                    105189561915429,\n                    105717627107319,\n                    106434203474251,\n                    106856438858860,\n                    106984945037295,\n                    107001680275504,\n                    107246503630802,\n                    107335243861817,\n                    109071581673129,\n                    109551654663245,\n                    109694118121197,\n                    111454367428562,\n                    111636058746833,\n                    111788278952703,\n                    112015499236465,\n                    112157193261305,\n                    113163563618295,\n                    113410539288368,\n                    114139175955629,\n                    114307819855046,\n                    114321559757180,\n                    114728471948120,\n                    114903557460790,\n                    114981716237090,\n                    115403886521159,\n                    115650470365123,\n                    115696569747930,\n                    115711999096223,\n                    116127169502189,\n                    116211838271866,\n                    116371477715368,\n                    116556039792279,\n                    116957004714210,\n                    117867146428505,\n                    118484253796245,\n                    118571863639262,\n                    118704354431725,\n                    118762763614010,\n                    118916030730019,\n                    119186746319693,\n                    119349197230465,\n                    119358605785829,\n                    119438611160104,\n                    119698878365483,\n                    121123692554185,\n                    121142462666583,\n                    121528792557620,\n                    121797541557489,\n                    121870306095302,\n                    122149310042087,\n                    123106982277866,\n                    123435887685299,\n                    123601762458621,\n                    123717654821426,\n                    124051214072843,\n                    124342491116643,\n                    124503522875964,\n                    124578586530266,\n                    124587964437913,\n                    124725729653665,\n                    124746422633510,\n                    124750192071655,\n                    124768282727566,\n                    125230114876611,\n                    125321826030016,\n                    127419004886761,\n                    127420241505431,\n                    127838593437661,\n                    128608410656562,\n                    128615562510797,\n                    129136336003338,\n                    129743357585456,\n                    130357183596582,\n                    130449489784288,\n                    130759367637359,\n                    130932431409422,\n                    131114765041506,\n                    131259713485090,\n                    131665899116300,\n                    132696169867812,\n                    133074201429869,\n                    133610721653670,\n                    133658087266350,\n                    133805949970550,\n                    134022643347451,\n                    134180001503169,\n                    134480946295095,\n                    134528309262636,\n                    135813149578002,\n                    136270510397946,\n                    136440932785986,\n                    137225082805595,\n                    138015741692447,\n                    138036515355989,\n                    138868467200948,\n                    139426803069629,\n                    140477227833971,\n                    140758407076546,\n                    140945797534471,\n                    141177726297957,\n                    141990335973972,\n                    142280730309472,\n                    142394166917163,\n                    142866591234977,\n                    143057190215748,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    143918338421151,\n                    143993203989656,\n                    144035717909615,\n                    144099850521047,\n                    144118542916339,\n                    144289220792317,\n                    144756978268718,\n                    145507507293269,\n                    145801993118700,\n                    146036048035532,\n                    147547181493835,\n                    147568633164936,\n                    148265509196629,\n                    148271320739741,\n                    149009140521356,\n                    149400470821791,\n                    149466695315067,\n                    149610030539086,\n                    150525607103853,\n                    151134340913122,\n                    151891421516846,\n                    152173033669992,\n                    152252932556929,\n                    152545355800304,\n                    152763516596482,\n                    152767089713159,\n                    153018942489979,\n                    153277687133191,\n                    153499429746893,\n                    153619074170851,\n                    153688480117844,\n                    153819767075496,\n                    153934077987853,\n                    153964058113210,\n                    154144078574046,\n                    154473683474900,\n                    154504590428422,\n                    154745677105480,\n                    154767139169904,\n                    154792465965192,\n                    155005702504057,\n                    156187447382478,\n                    156337457611871,\n                    156516659025181,\n                    156881462375449,\n                    157486234764096,\n                    157771792852571,\n                    159350162876827,\n                    159359554299317,\n                    159525033588832,\n                    159811833882343,\n                    159833415113099,\n                    160455334711875,\n                    160779614822235,\n                    162184986436543,\n                    162660721679577,\n                    162832799447054,\n                    162966656941363,\n                    163094038630874,\n                    164292320065575,\n                    164730857318871,\n                    164870234246611,\n                    165572906446902,\n                    165599790702978,\n                    166033901816340,\n                    166883822819949,\n                    167007474650516,\n                    167141620488773,\n                    167220419246069,\n                    167368164348954,\n                    167477335839938,\n                    167536779496558,\n                    167578307012466,\n                    167627584385194,\n                    167628267366836,\n                    168279076776929,\n                    168412944661902,\n                    168495462754350\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.b59473c94ff2889eca5d7165936e64b3.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453570_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"b59473c94ff2889eca5d7165936e64b3\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    3558981176698,\n                    3595680864757,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14077774510216,\n                    14958711182794,\n                    18561566035899,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    22816587154347,\n                    23694929505466,\n                    24134363957219,\n                    30606147678309,\n                    31130970675642,\n                    32760645340554,\n                    32914685791800,\n                    33190965408032,\n                    33960067474598,\n                    33972093486205,\n                    36209503859197,\n                    36836491863349,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    40000457533067,\n                    40821822920127,\n                    41548684950793,\n                    42975853122398,\n                    44318001749959,\n                    45220477427487,\n                    47205415940160,\n                    48527209372456,\n                    49367718187361,\n                    50266038601832,\n                    55281399957585,\n                    56622962479482,\n                    57082333339946,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    61074441390615,\n                    62702978264830,\n                    63272127345152,\n                    63747523251368,\n                    63753094017459,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    67872638217057,\n                    73961050027324,\n                    74203304881322,\n                    75510673507974,\n                    76301251957108,\n                    77462788932224,\n                    78004711377952,\n                    78593695483794,\n                    86080933269012,\n                    89312085426348,\n                    90302598717534,\n                    92082937491658,\n                    94266407193778,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103640879986045,\n                    106478901668282,\n                    106527047349315,\n                    112760650992638,\n                    114014805629783,\n                    114457599754429,\n                    114719330008227,\n                    114779375695317,\n                    115180661866118,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    128261346941417,\n                    129274485291245,\n                    130190959130109,\n                    130268767097311,\n                    130618284885748,\n                    131165953925337,\n                    133399630293992,\n                    133580282506938,\n                    137807029090583,\n                    139762252968300,\n                    142561908560556,\n                    143304921092381,\n                    144178457349008,\n                    148434659896290,\n                    150519487205401,\n                    154119208822262,\n                    154803963303860,\n                    155829895672627,\n                    156056750199531,\n                    159477189409659,\n                    160949002171461,\n                    163227549897255,\n                    164655854171874,\n                    165496592913298,\n                    165633097778062,\n                    166146331478050,\n                    166719940886532,\n                    166891246324981,\n                    167767324541682,\n                    173367021064967,\n                    173949973069402,\n                    175559849681044,\n                    176037192436786,\n                    181359032563838,\n                    181452042206456,\n                    182593899788192,\n                    185485707281703,\n                    186607121994479,\n                    188106044596447,\n                    191078441509481,\n                    194214915999879,\n                    194881073215824,\n                    196584209022550,\n                    198409930440501,\n                    199577187021953,\n                    200567230796156,\n                    202981877464187,\n                    208004490729476,\n                    210822710165852,\n                    211216538377500,\n                    211915017282095,\n                    215418355892998,\n                    215493649182712,\n                    215607106913801,\n                    216444054660744,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    225216425962890,\n                    225962923363564,\n                    225980008558421,\n                    228170423512561,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    233393853088183,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    238537875199759,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244255726983140,\n                    248336783901894,\n                    248851248559212,\n                    250357693564448,\n                    255343715369709,\n                    256375919657769,\n                    258616504685066,\n                    260212336791624,\n                    265736169322750,\n                    265781739304017,\n                    267345873524094,\n                    270071179263543,\n                    271342665825792,\n                    274122990498640,\n                    275360996806051,\n                    280967669495427,\n                    281897628539431,\n                    282200323162036,\n                    282342999530487,\n                    283830758206802,\n                    284620358398045,\n                    285925400570356,\n                    286736038466698,\n                    294086384353867,\n                    296514059807299,\n                    296966685834878,\n                    298791773277565,\n                    299005107402724,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    304085672582189,\n                    306426014688347,\n                    308473366560206,\n                    312407681513044,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    326855577904572,\n                    329899680983199,\n                    330331027273450,\n                    332098363218169,\n                    333944737799563,\n                    335174317746616,\n                    335584394916553,\n                    336702934772821,\n                    337731129151000,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    345448918397261,\n                    345460489054988,\n                    345741054833297,\n                    345875303722758,\n                    348815216366639,\n                    350399163507829,\n                    351292962170419,\n                    351636183165646,\n                    352167543743049,\n                    357535517122796,\n                    358375425017902,\n                    358595265377108,\n                    359452645935849,\n                    362124977362793,\n                    366535672236781,\n                    369461062038057,\n                    374615513078797,\n                    374673872059460,\n                    375780195152331,\n                    376434056729415,\n                    378592360993657,\n                    379102542404949,\n                    382035531157070,\n                    383135333541903,\n                    383850900061929,\n                    386263487549463,\n                    388013701783741,\n                    390332660259608,\n                    391711331432850,\n                    393516543506060,\n                    395113186430911,\n                    398353486663867,\n                    400967959890432,\n                    401487977714282,\n                    408778667923133,\n                    408962716867059,\n                    410861197839878,\n                    414355853800959,\n                    416391446838305,\n                    416580890530128,\n                    417681898958140,\n                    418835159902566,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    427962000123701,\n                    428646049860395,\n                    429952924284227,\n                    430664272577516,\n                    432118521614652,\n                    434109604325888,\n                    435267549331128,\n                    435940587843567,\n                    446481351575757,\n                    447467518423055,\n                    449803315024875,\n                    450112320572118,\n                    452241247094714,\n                    452829154656306,\n                    453367679371415,\n                    454813132622585,\n                    456493632715805,\n                    456717723773303,\n                    457632835991147,\n                    460076260875464,\n                    461156956524045,\n                    461171986063800,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    471195319432894,\n                    471546567533879,\n                    471922058927200,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473794754684632,\n                    476325119891604,\n                    476526896773980,\n                    477517713088633,\n                    480403157013579,\n                    482503820391550,\n                    484680531927015,\n                    485278877010947,\n                    487131235164323,\n                    487732314724511,\n                    488524886279546,\n                    491715999174683,\n                    495846359323641,\n                    506531113930798,\n                    510251560588775,\n                    510737910464301,\n                    512448947565770,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518629934480933,\n                    520568397104333,\n                    525382873389847,\n                    525762219690878,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530515351265560,\n                    534461213463332,\n                    538939534540869,\n                    539614362293141,\n                    539777176029418,\n                    539873986742508,\n                    540921382222017,\n                    541186981810837,\n                    543935720187395,\n                    545273268128445,\n                    546633122974996,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    556847877286431,\n                    558032616210722,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    561604684739024,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572186073828265,\n                    573767900523468,\n                    573851852316852,\n                    576313152716444,\n                    576624529060777,\n                    576874504697497,\n                    577153916453262,\n                    578224661471458,\n                    578856083248351,\n                    579656586099131,\n                    583350333207780,\n                    584217116139474,\n                    587065796103120,\n                    587669535192483,\n                    592792708776319,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    600583358156891,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620849299055244,\n                    621083126852990,\n                    627738708322473,\n                    628967244202734,\n                    629396495678046,\n                    630034340392901,\n                    632152787169751,\n                    632757066611488,\n                    635939425862264,\n                    640549605471712,\n                    641596035529063,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    648990703275660,\n                    649351154360370,\n                    650654068363343,\n                    655230244020599,\n                    657226217132416,\n                    657355507140185,\n                    662135736889575,\n                    663462366932727,\n                    665636043678921,\n                    667342688777044,\n                    668170744538822,\n                    670595660720839,\n                    672641554971634,\n                    676044446355190,\n                    677261185301275,\n                    677295740685782,\n                    677738022893547,\n                    679186583662682,\n                    681266465716475,\n                    682874745971459,\n                    683897063771844,\n                    685746125867239,\n                    686035384279530,\n                    686106466488739,\n                    687211424722853,\n                    688990372747831,\n                    691020029667905,\n                    691680901171966,\n                    694869046270466,\n                    700054088308311,\n                    700366400626315,\n                    701010566680671,\n                    702400887447953,\n                    702728791577749,\n                    703127461004015,\n                    704335484663791,\n                    705302678110381,\n                    706832134097576,\n                    707962189637436,\n                    710403353214581,\n                    712661928452840,\n                    715334925158742,\n                    715377268215567,\n                    715896323316677,\n                    716020219332683,\n                    716091343321154,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    723332805980528,\n                    724621545164802,\n                    726012427583803,\n                    726271575466251,\n                    727030394121071,\n                    731361512976697,\n                    733617713228542,\n                    734622692371860,\n                    736290151677476,\n                    736566880750337,\n                    739389456325310,\n                    742704052187442,\n                    745420507633982,\n                    746469097917429,\n                    747026339202991,\n                    748064810280445,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758453303481943,\n                    758543555642030,\n                    759237826018133,\n                    770328708409334,\n                    771613473168408,\n                    772165475523258,\n                    773304776019517,\n                    774312511311396,\n                    774594040074891,\n                    774964429534347,\n                    777891987478900,\n                    779330069525835,\n                    782210000583365,\n                    783959071612606,\n                    785243161415867,\n                    788027556261557,\n                    788033647567963,\n                    788617127284627,\n                    789488280089338,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    794276713525849,\n                    796762144732626,\n                    797622366845781,\n                    800060479182618,\n                    802951804704904,\n                    804618913432196,\n                    806028047443770,\n                    806167606439428,\n                    811884284377466\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.f0c834bc306651d2b9321fb21d3e8d8f.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453569_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f0c834bc306651d2b9321fb21d3e8d8f\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    2756695559996,\n                    3017280732468,\n                    8798248946328,\n                    11352616080698,\n                    11550845136154,\n                    12183113567732,\n                    14718047586080,\n                    15518147513869,\n                    17682163834920,\n                    18029472307723,\n                    18722876140337,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    23126533024618,\n                    24134363957219,\n                    25105646732171,\n                    27426095011341,\n                    28889287639316,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    34376317340737,\n                    35413666412010,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    41548684950793,\n                    42975853122398,\n                    43333283576538,\n                    43797826300341,\n                    44182822842357,\n                    49367718187361,\n                    50266038601832,\n                    51459351831459,\n                    52459209483030,\n                    54096036790222,\n                    54938371268946,\n                    56622962479482,\n                    58428533496606,\n                    58910287066672,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62424408278746,\n                    62652142008211,\n                    62702978264830,\n                    63747523251368,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    65853715307230,\n                    67872638217057,\n                    70880519905358,\n                    73961050027324,\n                    75833178093944,\n                    78004711377952,\n                    89046548749891,\n                    91970793441325,\n                    92082937491658,\n                    94266407193778,\n                    97059945956107,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    106511667935863,\n                    109026157607570,\n                    112505435116132,\n                    112760650992638,\n                    114014388557103,\n                    114457599754429,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    119998700438175,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    123453159722404,\n                    126427982409537,\n                    127302670329760,\n                    128261346941417,\n                    129274485291245,\n                    130268767097311,\n                    130618284885748,\n                    130680267494321,\n                    131310062444107,\n                    132907013766936,\n                    133399630293992,\n                    133580282506938,\n                    137450930961952,\n                    139762252968300,\n                    140619106750418,\n                    142615782998151,\n                    143304921092381,\n                    145203869062483,\n                    148434659896290,\n                    150519487205401,\n                    151659316769984,\n                    154119208822262,\n                    154803963303860,\n                    155091361216035,\n                    156355255647409,\n                    163227549897255,\n                    163905808341739,\n                    166116061393073,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173468574347604,\n                    175559849681044,\n                    176037192436786,\n                    179129454015522,\n                    179606648877738,\n                    179956173397439,\n                    181175315330322,\n                    186188120396587,\n                    189162728773831,\n                    191078441509481,\n                    196150349451960,\n                    196584209022550,\n                    198409930440501,\n                    198597053692927,\n                    200509345911594,\n                    200567230796156,\n                    202960515626517,\n                    202981877464187,\n                    210625558705034,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    219619606513837,\n                    220138017981065,\n                    221322641419906,\n                    221692515333150,\n                    223103766020907,\n                    223308827351122,\n                    225216425962890,\n                    225962923363564,\n                    227654478699541,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    236606915867400,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242779977866708,\n                    242838856557679,\n                    244255726983140,\n                    244860991440151,\n                    245130313552765,\n                    248336783901894,\n                    248851248559212,\n                    248993151758694,\n                    250357693564448,\n                    250433703280235,\n                    258315509760939,\n                    259301238714261,\n                    259835033542287,\n                    264753634717119,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    266888647546888,\n                    268179213976013,\n                    269644108985416,\n                    271342665825792,\n                    273193300451366,\n                    274122990498640,\n                    274876788032658,\n                    275360996806051,\n                    275543995846992,\n                    276221877341287,\n                    277132191503183,\n                    277862338800417,\n                    278212913088609,\n                    280877794706788,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    286555216056228,\n                    286736038466698,\n                    288091651180818,\n                    289724862541255,\n                    290309864993733,\n                    290388809460443,\n                    294086384353867,\n                    296966685834878,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    301510670432750,\n                    302667628736144,\n                    307413790961671,\n                    308473366560206,\n                    309227573740883,\n                    312587803039400,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    319121931997971,\n                    326855577904572,\n                    328849372415869,\n                    329418197512975,\n                    331238400730017,\n                    332098363218169,\n                    333944737799563,\n                    334843701246736,\n                    335584394916553,\n                    335971123608722,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    346077313264359,\n                    346299646639688,\n                    348815216366639,\n                    350399163507829,\n                    352167543743049,\n                    357535517122796,\n                    358595265377108,\n                    359452645935849,\n                    360947577332752,\n                    362124977362793,\n                    362617542158239,\n                    364155736950907,\n                    365659628340646,\n                    366535672236781,\n                    367226803013763,\n                    369117201073175,\n                    369325291998224,\n                    369559687694957,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    376434056729415,\n                    377398322708389,\n                    379102542404949,\n                    381336562045153,\n                    382035531157070,\n                    383850900061929,\n                    384211196611467,\n                    386263487549463,\n                    388499765349836,\n                    390332660259608,\n                    391711331432850,\n                    392351813514281,\n                    393516543506060,\n                    394623284964953,\n                    394996681358473,\n                    401487977714282,\n                    406196060040394,\n                    408778667923133,\n                    408962716867059,\n                    410071124049598,\n                    410861197839878,\n                    414355853800959,\n                    415194310967331,\n                    416580890530128,\n                    418088879972183,\n                    421486950473329,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424577144701529,\n                    427230335237565,\n                    429952924284227,\n                    430583031413630,\n                    430664272577516,\n                    434328269700792,\n                    435267549331128,\n                    436479092642625,\n                    437123713564004,\n                    437654980371254,\n                    437948315733142,\n                    447467518423055,\n                    448817550923236,\n                    450058424424520,\n                    450112320572118,\n                    451622661916081,\n                    452195530667530,\n                    452241247094714,\n                    453735785331029,\n                    456493632715805,\n                    456717723773303,\n                    457996242151684,\n                    458057319849877,\n                    460076260875464,\n                    461156956524045,\n                    461276801535123,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    470135419109892,\n                    471546567533879,\n                    471922058927200,\n                    472365458755346,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473082557541180,\n                    476325119891604,\n                    476526896773980,\n                    480177741395295,\n                    484639189320920,\n                    484680531927015,\n                    484810950748951,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    493125876509773,\n                    495846359323641,\n                    498279238790238,\n                    508031302306958,\n                    509308758440423,\n                    510251560588775,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518525721488903,\n                    519307267967594,\n                    519375222893422,\n                    520006459875423,\n                    520568397104333,\n                    523796133390380,\n                    525331047566316,\n                    525382873389847,\n                    525443969024288,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    533221992957154,\n                    533383900955463,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    540252372548066,\n                    542883591758496,\n                    543935720187395,\n                    544910970844098,\n                    545273268128445,\n                    551381720133873,\n                    553977959695484,\n                    555273679362469,\n                    555321949850378,\n                    555828795847874,\n                    556910957763276,\n                    557285930201258,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    559954430933840,\n                    564616206473372,\n                    565020390122451,\n                    566114305025384,\n                    568901431510366,\n                    572068367820350,\n                    572864932706448,\n                    573767900523468,\n                    573851852316852,\n                    576110831795731,\n                    576624529060777,\n                    576874504697497,\n                    578416100451701,\n                    579421699692764,\n                    579748224601908,\n                    583346960664570,\n                    583458377899774,\n                    584217116139474,\n                    585039308609199,\n                    587065796103120,\n                    591244122623354,\n                    592792708776319,\n                    592997432856726,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605527960069793,\n                    606419362199228,\n                    607649938708299,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612318401334000,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    618889806182696,\n                    620059729516362,\n                    621083126852990,\n                    621271411830233,\n                    623252370242796,\n                    626526286339314,\n                    628967244202734,\n                    630034340392901,\n                    631029322236360,\n                    632757066611488,\n                    632818738426364,\n                    634691502028135,\n                    635939425862264,\n                    635969932055283,\n                    639610417638976,\n                    639710605455165,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    649351154360370,\n                    649391604242707,\n                    652455823903591,\n                    655230244020599,\n                    657355507140185,\n                    663985456931184,\n                    668589629748046,\n                    670146496451272,\n                    670595660720839,\n                    672641554971634,\n                    673587502056476,\n                    676044446355190,\n                    677201890824346,\n                    677261185301275,\n                    678303154208507,\n                    678412732753910,\n                    680941268401052,\n                    681266465716475,\n                    682209634532220,\n                    682874745971459,\n                    683897063771844,\n                    686035384279530,\n                    686106466488739,\n                    688990372747831,\n                    691680901171966,\n                    694869046270466,\n                    698831566328784,\n                    701010566680671,\n                    703127461004015,\n                    705095159614137,\n                    705302678110381,\n                    705440295396070,\n                    707962189637436,\n                    712128120373858,\n                    712530228579255,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    725530359226083,\n                    726271575466251,\n                    726644962313888,\n                    727030394121071,\n                    731361512976697,\n                    733555199906207,\n                    733617713228542,\n                    734622692371860,\n                    735916499223944,\n                    736290151677476\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v2/v2.f71e78178af9e45e6f1d87a0c53c465c.sbt",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2241509_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f71e78178af9e45e6f1d87a0c53c465c\",\n                \"mins\": [\n                    60400386987,\n                    823577066500,\n                    1519622976813,\n                    2099558230394,\n                    2198288153123,\n                    3973909611528,\n                    4586034465171,\n                    5888422665728,\n                    6302757725882,\n                    6367937204658,\n                    7215992153582,\n                    7669958619476,\n                    8230363088713,\n                    9707684064301,\n                    9739271815773,\n                    9780886482986,\n                    11021715939935,\n                    11850890474214,\n                    12099834582305,\n                    13092799901887,\n                    13225001158920,\n                    13609959198971,\n                    14354310516423,\n                    14563906465922,\n                    14571059560222,\n                    14645306127358,\n                    16310340704441,\n                    16958276389988,\n                    17219579204110,\n                    17953084754017,\n                    19959151374003,\n                    20208369434823,\n                    21248632255890,\n                    21852731993169,\n                    22648822913198,\n                    23058172043183,\n                    23576662356304,\n                    23829375645561,\n                    25261795703932,\n                    29548113152218,\n                    29602469588352,\n                    30665779043560,\n                    30901584804357,\n                    30912597140678,\n                    31255720474308,\n                    31828073872267,\n                    32047005497326,\n                    32455199900939,\n                    35265151771864,\n                    35504563643595,\n                    36618240038591,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    38152902047267,\n                    38189684658557,\n                    38758196129412,\n                    39368843530690,\n                    41051959531050,\n                    41208453811482,\n                    42201185214133,\n                    43593801431999,\n                    44253524153058,\n                    44436694084066,\n                    44697291364213,\n                    44698336514963,\n                    44976567584701,\n                    45391001008294,\n                    46515523354690,\n                    46816178877796,\n                    47731774762880,\n                    48595334402758,\n                    49021979265101,\n                    49371043945336,\n                    49676482222915,\n                    49720533077083,\n                    49845812873381,\n                    50863756953274,\n                    51528521216274,\n                    51681162571203,\n                    52832061642195,\n                    55129376901201,\n                    58290341538968,\n                    58895316100455,\n                    58986967295710,\n                    59831458885832,\n                    60629989873712,\n                    60862427199268,\n                    61311934374427,\n                    61741300517625,\n                    62998796549670,\n                    63214224986744,\n                    63436550394145,\n                    65555522561100,\n                    65924385841826,\n                    66014450404167,\n                    68106503958474,\n                    68361070361240,\n                    68429622395163,\n                    69531629629596,\n                    69669816952364,\n                    69834076734040,\n                    69867726565078,\n                    70390489655010,\n                    72161895027450,\n                    74627935126284,\n                    75599412151037,\n                    76910573567504,\n                    76990092374193,\n                    77823679358184,\n                    79920934493212,\n                    81153675749737,\n                    83034887506486,\n                    83541004870527,\n                    84117257683706,\n                    84510016212982,\n                    84558403439851,\n                    84566106541648,\n                    84869605041559,\n                    85020470139133,\n                    86408814513897,\n                    86689484146462,\n                    87496267274159,\n                    87553087594658,\n                    89031341868186,\n                    89224410019537,\n                    90968099687792,\n                    91947365014884,\n                    92560475806357,\n                    92705312571767,\n                    92963671022329,\n                    94042470128938,\n                    94981444614992,\n                    95346285931614,\n                    95613743229855,\n                    96073201994886,\n                    97403829495106,\n                    98324799297724,\n                    98335693463023,\n                    98358008337001,\n                    98513632733989,\n                    98581447863023,\n                    99240980237734,\n                    100665877566078,\n                    100757191863196,\n                    100874197486354,\n                    101402668545174,\n                    102523882340550,\n                    103837073195515,\n                    104511770485165,\n                    104976980796599,\n                    106376197021301,\n                    106790594595842,\n                    106856438858860,\n                    107075008219968,\n                    107270211710572,\n                    108522499772179,\n                    108796977261490,\n                    109072458044113,\n                    110973691690640,\n                    111597811721701,\n                    111852579406785,\n                    112098834290105,\n                    112854535715471,\n                    113100360362644,\n                    113532609924883,\n                    113707672644737,\n                    115222086224134,\n                    115902936575572,\n                    116875710241107,\n                    117439434128933,\n                    118237881107424,\n                    118484253796245,\n                    118577458244101,\n                    118704354431725,\n                    118762763614010,\n                    120403562403398,\n                    123085302630219,\n                    124236663214303,\n                    124503522875964,\n                    124750192071655,\n                    127838593437661,\n                    129008119673637,\n                    129500120619911,\n                    130386592519852,\n                    130916995773652,\n                    131868928947612,\n                    132342877083990,\n                    132696169867812,\n                    133177175428260,\n                    134940238499518,\n                    136270510397946,\n                    138015741692447,\n                    139617655113359,\n                    140742957630633,\n                    141060355139271,\n                    141727722067525,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    144524559656528,\n                    145048941926910,\n                    145358524676284,\n                    145801993118700,\n                    146147941959569,\n                    146197332642273,\n                    147298094626620,\n                    148132313295676,\n                    148271320739741,\n                    149246624631496,\n                    149412030697401,\n                    149428289783056,\n                    149878295612908,\n                    150300472338716,\n                    150498142033726,\n                    150606394548784,\n                    151891421516846,\n                    152252932556929,\n                    152472674447245,\n                    153018942489979,\n                    153041570427833,\n                    153261172171064,\n                    153499429746893,\n                    153688480117844,\n                    154721599478608,\n                    156275207016386,\n                    156516659025181,\n                    156643571858026,\n                    157408350370825,\n                    159359554299317,\n                    159796078446483,\n                    159833415113099,\n                    159910575077486,\n                    160351486834693,\n                    161939629643864,\n                    161940609986387,\n                    162704932949945,\n                    163068263480786,\n                    164511747855159,\n                    164647714000312,\n                    164794299381545,\n                    165210023048822,\n                    165572906446902,\n                    167086347826855,\n                    167141620488773,\n                    167220419246069,\n                    168279076776929,\n                    168412944661902,\n                    168499688420518,\n                    168588153181670,\n                    168632649534409,\n                    170442460802606,\n                    171201369635525,\n                    172053856709804,\n                    172169121265773,\n                    172775324389923,\n                    174450145080469,\n                    174885454236600,\n                    175626124736457,\n                    176179703984274,\n                    177264301473978,\n                    177275301905938,\n                    177917847980823,\n                    177974381583110,\n                    178636928206636,\n                    180068779789910,\n                    181013251409814,\n                    184142039382455,\n                    184752983925284,\n                    185343297638823,\n                    186689460295987,\n                    186949263795931,\n                    187443322053286,\n                    188174311614794,\n                    190190643958498,\n                    190435386968577,\n                    191505075402719,\n                    192587291169373,\n                    192985634484457,\n                    193005890924998,\n                    195150511219449,\n                    195224591208679,\n                    195323331568844,\n                    196399956208036,\n                    197488865076969,\n                    197645431867085,\n                    197667892486155,\n                    198690669576940,\n                    199129991434152,\n                    200099494106658,\n                    200763792087641,\n                    202246005298761,\n                    202454193719832,\n                    203231046579715,\n                    203642731049900,\n                    204596961192335,\n                    205551931705237,\n                    207512012707137,\n                    207560662478458,\n                    207745988431556,\n                    208169002151386,\n                    208798692991212,\n                    209380169367696,\n                    209686709070155,\n                    209935365580642,\n                    210216741203157,\n                    210731028249650,\n                    211044888949477,\n                    211164963414612,\n                    211432561012148,\n                    211608720186528,\n                    212069282457339,\n                    212165241332190,\n                    213423868189143,\n                    213594793122705,\n                    214603931274555,\n                    214895004823429,\n                    215462220362127,\n                    216515317435923,\n                    217624364104314,\n                    218959868504958,\n                    219332462426643,\n                    219420900711806,\n                    219530707228594,\n                    219983169752798,\n                    220400177029026,\n                    221554546582125,\n                    223834426416688,\n                    224013129740964,\n                    225012348009219,\n                    225262901002064,\n                    225272976988478,\n                    225688512560038,\n                    225729121043728,\n                    225865605063898,\n                    226478191326675,\n                    226490280450555,\n                    226749405843443,\n                    228571438273762,\n                    228659301550674,\n                    230063816731086,\n                    230147740600471,\n                    231131716258590,\n                    231167269732039,\n                    231226956607413,\n                    231434168452327,\n                    231846056194211,\n                    233464870224238,\n                    233897329427385,\n                    234080711761577,\n                    234944418269182,\n                    235139431941673,\n                    236106415795883,\n                    237691017699919,\n                    237692482084117,\n                    238330510293383,\n                    239079001777789,\n                    239310431954774,\n                    239320860931883,\n                    239785978985749,\n                    239829043576634,\n                    241090707457411,\n                    241270093069305,\n                    241852865819133,\n                    242213168881845,\n                    242442058293823,\n                    243586260715005,\n                    244486101538283,\n                    244880293726455,\n                    245267018164948,\n                    245709056012167,\n                    246591135909905,\n                    246682667613431,\n                    246892463978226,\n                    247032392472336,\n                    247065219019444,\n                    247098177223672,\n                    247103593644053,\n                    247271784936594,\n                    247397470910482,\n                    249437105252228,\n                    250385372089026,\n                    251364588008466,\n                    252185328425888,\n                    254645791555521,\n                    255035361284884,\n                    256100243468872,\n                    256264089513587,\n                    260526496756444,\n                    260527113994454,\n                    260632609080480,\n                    260694307191271,\n                    260962806951214,\n                    261567562084725,\n                    262025645329226,\n                    262207826333011,\n                    262252115767644,\n                    262455939936188,\n                    262788436418257,\n                    262946168044586,\n                    264421080266300,\n                    264528896513727,\n                    264647060615723,\n                    265815365072475,\n                    266152688016901,\n                    266413794194257,\n                    267078713918965,\n                    267176377119695,\n                    267190976962390,\n                    267294416108493,\n                    267630676165577,\n                    267927798938957,\n                    269578359283844,\n                    269788172566464,\n                    270531130735056,\n                    271754338938388,\n                    272352526980268,\n                    273148755474859,\n                    273963009929669,\n                    274383394688737,\n                    274823193889498,\n                    275503278029490,\n                    276248461650896,\n                    276614092454373,\n                    278054029097666,\n                    278107042683824,\n                    279140340979356,\n                    280242842017684,\n                    280804489026790,\n                    280958622044268,\n                    283716381550104,\n                    284043008927592,\n                    285957888031159,\n                    286847587035887,\n                    286953696536864,\n                    287220289210373,\n                    287661265777051,\n                    289325450257575,\n                    290604862937111,\n                    290674026441801,\n                    290932091338198,\n                    291083660987511,\n                    291172509721213,\n                    293622260022011,\n                    293991300103064,\n                    295865985002150,\n                    297566393252293,\n                    297619063065931,\n                    297638855027375,\n                    298164502295539,\n                    298353836077639,\n                    298409391465409,\n                    299686419400666,\n                    299769726700118,\n                    300136436050699,\n                    300583122258222,\n                    300710556964575,\n                    301266799261438,\n                    301280787524288,\n                    301527407021198,\n                    301988872005691,\n                    302360612278753,\n                    302656802432509,\n                    304549554050632,\n                    306203041818970,\n                    307080590001213,\n                    307145677617826,\n                    307967534912464,\n                    308150774714909,\n                    308280991213272,\n                    308423591882698,\n                    310277246224302,\n                    310518075637689,\n                    311177999205805,\n                    312376374680562,\n                    312500518005538,\n                    313566577455370,\n                    315379360903532,\n                    315761524455196,\n                    315894474312958,\n                    315915560704609,\n                    317146165008935,\n                    317911096926352,\n                    318149703248740,\n                    318452257301876,\n                    318838378422560,\n                    319002045581712,\n                    319870839054454,\n                    320478308186860,\n                    321581854131598,\n                    323244150688113,\n                    325348339530349,\n                    325401700852377,\n                    325609668529942,\n                    325840322414685,\n                    326362555166202,\n                    327401856042864,\n                    327430526220797,\n                    327717949035640,\n                    327729120445936\n                ],\n                \"molecule\": \"dna\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/0107d767a345eff67ecdaed2ee5cd7ba",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453566_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"0107d767a345eff67ecdaed2ee5cd7ba\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    5641354835174,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14062071191653,\n                    14580861632266,\n                    18722876140337,\n                    20714320729467,\n                    22732389403804,\n                    24134363957219,\n                    30606147678309,\n                    30841792132441,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    35413666412010,\n                    37166860055638,\n                    38008340488610,\n                    38631948370393,\n                    38946626358857,\n                    39177463395973,\n                    39396232170068,\n                    40000457533067,\n                    41548684950793,\n                    42975853122398,\n                    43119393989323,\n                    43377695911881,\n                    49367718187361,\n                    49468277378328,\n                    50266038601832,\n                    51636068122286,\n                    56622962479482,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62130354354877,\n                    62702978264830,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    67872638217057,\n                    68827108109263,\n                    69134145403133,\n                    70436552236751,\n                    70880519905358,\n                    78004711377952,\n                    81502993782978,\n                    84636365982041,\n                    85239629151685,\n                    94266407193778,\n                    98142256300701,\n                    98837920540443,\n                    99930975216128,\n                    100653760748845,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    103652023867250,\n                    104130252812879,\n                    112760650992638,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120285237540732,\n                    121866736124647,\n                    122140892054804,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    128261346941417,\n                    130618284885748,\n                    131310062444107,\n                    133580282506938,\n                    139762252968300,\n                    148434659896290,\n                    150472163116319,\n                    151610888790844,\n                    151736593364935,\n                    152145317861349,\n                    154119208822262,\n                    154803963303860,\n                    164146490870545,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173503876669758,\n                    173949973069402,\n                    175345218226732,\n                    175559849681044,\n                    177057739236298,\n                    182134979074863,\n                    185526639726849,\n                    186188120396587,\n                    191078441509481,\n                    191784713609488,\n                    196150349451960,\n                    196584209022550,\n                    196853921592387,\n                    197752504251580,\n                    198597053692927,\n                    200567230796156,\n                    201179164742411,\n                    202960515626517,\n                    203378213499023,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    218586803538885,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    223103766020907,\n                    223436957406949,\n                    225216425962890,\n                    225962923363564,\n                    227026140769845,\n                    227790244540446,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    235385609463388,\n                    235438505061770,\n                    238869764444344,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244786468497109,\n                    247140303430449,\n                    248336783901894,\n                    250357693564448,\n                    253975323975963,\n                    256375919657769,\n                    259301238714261,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    267345873524094,\n                    271342665825792,\n                    274876788032658,\n                    275360996806051,\n                    275711441656065,\n                    276221877341287,\n                    277115529175674,\n                    277862338800417,\n                    280967669495427,\n                    281817613252845,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    289038917997203,\n                    289724862541255,\n                    290309864993733,\n                    294086384353867,\n                    295503963521838,\n                    296966685834878,\n                    299005107402724,\n                    300199234365396,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    305781540735975,\n                    308107503975413,\n                    308473366560206,\n                    311148974624393,\n                    311393227334671,\n                    312856558437716,\n                    314634385460120,\n                    315140251773348,\n                    316147818305256,\n                    317314266550052,\n                    318043998368340,\n                    319121931997971,\n                    324333149672473,\n                    324779561826125,\n                    326855577904572,\n                    327646715321140,\n                    332098363218169,\n                    333944737799563,\n                    334160175766170,\n                    335584394916553,\n                    335971123608722,\n                    336472954791992,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    347580313704916,\n                    348815216366639,\n                    348987115477673,\n                    350399163507829,\n                    357535517122796,\n                    358595265377108,\n                    358821394913517,\n                    359452645935849,\n                    362124977362793,\n                    366354200059782,\n                    366535672236781,\n                    369474755519844,\n                    370249620342175,\n                    372037414685096,\n                    373949557068914,\n                    374319819178480,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    379102542404949,\n                    379241504134406,\n                    379468459802010,\n                    379661395441316,\n                    382035531157070,\n                    383008100523152,\n                    383135333541903,\n                    383850900061929,\n                    384049466048679,\n                    386263487549463,\n                    389141313731258,\n                    390332660259608,\n                    393516543506060,\n                    400967959890432,\n                    401487977714282,\n                    403579902131163,\n                    406955472999822,\n                    408962716867059,\n                    409903018669983,\n                    410861197839878,\n                    414355853800959,\n                    416580890530128,\n                    418934773149726,\n                    419642123579295,\n                    421963163293847,\n                    423404494960378,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    429952924284227,\n                    430664272577516,\n                    432630098291297,\n                    434623968464695,\n                    435267549331128,\n                    435277763415865,\n                    435874505125675,\n                    437654980371254,\n                    438061138128325,\n                    438738288109196,\n                    439177016005977,\n                    445344075816835,\n                    445802335759252,\n                    446710003143163,\n                    447467518423055,\n                    449641727299803,\n                    450058424424520,\n                    450112320572118,\n                    450125274173050,\n                    452241247094714,\n                    452829154656306,\n                    454813132622585,\n                    456174765596578,\n                    456493632715805,\n                    456717723773303,\n                    461156956524045,\n                    462211497323948,\n                    463604028403361,\n                    465228093393002,\n                    466250095735125,\n                    469687793491358,\n                    471922058927200,\n                    472039595540269,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473018780652067,\n                    473772140307174,\n                    474570287539184,\n                    474912397870603,\n                    476325119891604,\n                    476526896773980,\n                    476855560317170,\n                    480232815782455,\n                    484291524803718,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    494276065129917,\n                    495846359323641,\n                    506531113930798,\n                    507871334392190,\n                    508031302306958,\n                    508934816424512,\n                    509939413858428,\n                    510737910464301,\n                    512514768813167,\n                    513350289212553,\n                    517460246914282,\n                    523321188654478,\n                    524296526109332,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    532977797373940,\n                    533221992957154,\n                    533383900955463,\n                    537527309474265,\n                    538136383284668,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    543935720187395,\n                    545273268128445,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    555828795847874,\n                    557285930201258,\n                    558008777268240,\n                    558433475619762,\n                    558892016080993,\n                    559199414492426,\n                    560748186311107,\n                    561604684739024,\n                    562789967643507,\n                    563343385252253,\n                    563775395645616,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572526115602502,\n                    573767900523468,\n                    573851852316852,\n                    576624529060777,\n                    576874504697497,\n                    578856083248351,\n                    579395263040626,\n                    579656586099131,\n                    584217116139474,\n                    587458649504773,\n                    591009756408904,\n                    592792708776319,\n                    592997432856726,\n                    594482884410814,\n                    596004492939074,\n                    596726606390901,\n                    597875929908982,\n                    600179982751750,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605545396594434,\n                    606419362199228,\n                    607833403537880,\n                    609555580824872,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620059729516362,\n                    620849299055244,\n                    621083126852990,\n                    622843084945666,\n                    623088556560813,\n                    627738708322473,\n                    628002002108775,\n                    628967244202734,\n                    630034340392901,\n                    632757066611488,\n                    634340585739407,\n                    634691502028135,\n                    635939425862264,\n                    637603178700210,\n                    637880811482435,\n                    644557275230225,\n                    644935615624623,\n                    645793929303122,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    649351154360370,\n                    653652775436966,\n                    655230244020599,\n                    668170744538822,\n                    670595660720839,\n                    671785773373187,\n                    672641554971634,\n                    672821857332020,\n                    673587502056476,\n                    676044446355190,\n                    677295740685782,\n                    679716691783353,\n                    682874745971459,\n                    682963108550465,\n                    683897063771844,\n                    685246440558482,\n                    686035384279530,\n                    687129162879229,\n                    687440351836027,\n                    688990372747831,\n                    690608944213791,\n                    691680901171966,\n                    694851976547107,\n                    694869046270466,\n                    700054088308311,\n                    701010566680671,\n                    701156706346414,\n                    702431887238370,\n                    702728791577749,\n                    703127461004015,\n                    703460523248065,\n                    705302678110381,\n                    707793984897058,\n                    707799855432305,\n                    707962189637436,\n                    707993631271976,\n                    708854130532070,\n                    710403353214581,\n                    710927468728191,\n                    711091480855740,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    724746920000049,\n                    727030394121071,\n                    727262050490847,\n                    728279662753580,\n                    730854175545196,\n                    731361512976697,\n                    734622692371860,\n                    736290151677476,\n                    737921635760471,\n                    738115824615020,\n                    739389456325310,\n                    742704052187442,\n                    746469097917429,\n                    748064810280445,\n                    749144352424687,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758543555642030,\n                    759083903793759,\n                    761260029175908,\n                    767230586289375,\n                    770167973924874,\n                    770328708409334,\n                    772165475523258,\n                    772947318346532,\n                    774312511311396,\n                    774365323868051,\n                    774964429534347,\n                    775558532281404,\n                    779330069525835,\n                    781344931111517,\n                    787747218685488,\n                    788027556261557,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    797511060014001,\n                    797622366845781,\n                    799257433888961,\n                    800060479182618,\n                    801084876663808,\n                    802340523858506,\n                    803596407436267\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/4e94e60265e04f0763142e20b52c0da1",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_2.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"4e94e60265e04f0763142e20b52c0da1\",\n                \"mins\": [\n                    250486723534,\n                    2508456406617,\n                    3114055682630,\n                    4326583440446,\n                    5166206090659,\n                    5651658843765,\n                    5888422665728,\n                    6103415363614,\n                    6235526594701,\n                    6326519491884,\n                    6878955625210,\n                    7215992153582,\n                    7263583777537,\n                    8395644761685,\n                    9072289775829,\n                    9599933508359,\n                    9851745764538,\n                    9914450265081,\n                    10636634611478,\n                    11078169853920,\n                    11850890474214,\n                    12268586466425,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15424135029274,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17427197239629,\n                    20208369434823,\n                    22648822913198,\n                    23651462508176,\n                    23928516462553,\n                    24474488157758,\n                    25171338917197,\n                    25595537972192,\n                    25977883823029,\n                    26336101344262,\n                    28005085380016,\n                    29426613300325,\n                    30912597140678,\n                    31804114294503,\n                    33283788494941,\n                    34832941612548,\n                    35206157695212,\n                    36608959952536,\n                    36699864848579,\n                    36965258409960,\n                    37923647270157,\n                    38668597630050,\n                    40072538274701,\n                    41051959531050,\n                    41163986984660,\n                    42806708117796,\n                    45549512378900,\n                    46330912571584,\n                    47932899674281,\n                    48305356021361,\n                    48422112851291,\n                    48827478905522,\n                    48988117530884,\n                    49720533077083,\n                    50336770017521,\n                    53853474657507,\n                    54546098460847,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56306387723041,\n                    56789903701800,\n                    60051688191594,\n                    62790957647340,\n                    63034352531495,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64303638595001,\n                    65401240928904,\n                    65659023305314,\n                    65794631590725,\n                    65924385841826,\n                    66254172924766,\n                    67162847056402,\n                    67207262461072,\n                    68027479033630,\n                    69023206404673,\n                    70845832854736,\n                    71648552124359,\n                    72267500733483,\n                    73600562400430,\n                    73600726148081,\n                    73938092731264,\n                    74463348702348,\n                    74757289081889,\n                    76461141982463,\n                    76601650706225,\n                    79332000470232,\n                    80480643670004,\n                    85069188519897,\n                    85513145337736,\n                    86370708776973,\n                    88205744296842,\n                    89385885763749,\n                    90136762486499,\n                    91578872290342,\n                    91791067858367,\n                    91873432718081,\n                    91947365014884,\n                    94086187561813,\n                    94879727048600,\n                    95613743229855,\n                    98324799297724,\n                    98406995764882,\n                    99368955966421,\n                    100718427599813,\n                    102632033433196,\n                    102644142538181,\n                    102882967284023,\n                    104095665010556,\n                    107278977448655,\n                    110162881433718,\n                    112325880172670,\n                    114727586194884,\n                    115711999096223,\n                    115890459170026,\n                    115990086684946,\n                    117509882155020,\n                    118006247672122,\n                    119438611160104,\n                    119862823995471,\n                    120859413131497,\n                    120869469396540,\n                    120965026768103,\n                    120980078369659,\n                    122789260675111,\n                    123464311633543,\n                    124631092323259,\n                    124750192071655,\n                    124948347574890,\n                    125648214305342,\n                    126324422909661,\n                    126386912242740,\n                    126943192152369,\n                    127838593437661,\n                    129104997236940,\n                    129661998661164,\n                    129921574005351,\n                    130381409629549,\n                    131426956400912,\n                    131670610194393,\n                    132320703016655,\n                    133074201429869,\n                    136270510397946,\n                    137011854576215,\n                    137250954972319,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    142846188486668,\n                    143166346620229,\n                    143570389373736,\n                    144015570248215,\n                    146405999815556,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150653874201709,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    153964058113210,\n                    155005702504057,\n                    156275207016386,\n                    156516659025181,\n                    156678666334181,\n                    157146773076591,\n                    158914038640710,\n                    159350162876827,\n                    159359554299317,\n                    159472244264757,\n                    159869778233041,\n                    160225475241462,\n                    161489918754278,\n                    161548850449553,\n                    162966656941363,\n                    163709351584749,\n                    165572906446902,\n                    166605601159467,\n                    167304010117193,\n                    167578307012466,\n                    168412944661902,\n                    169891545961677,\n                    171948018815208,\n                    172888919441360,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    175029718718788,\n                    177264301473978,\n                    177974381583110,\n                    178176094018343,\n                    179921783290284,\n                    180656320447823,\n                    181063160240061,\n                    181257548112038,\n                    181803993639937,\n                    183018746533881,\n                    183449325300818,\n                    184271038362020,\n                    184594169885550,\n                    184752983925284,\n                    185471680685606,\n                    187928842797492,\n                    189442327350789,\n                    189748192026650,\n                    191344453396371,\n                    191379677170076,\n                    192587291169373,\n                    193005890924998,\n                    194065250832376,\n                    194363033520822,\n                    195441337298296,\n                    195793810311093,\n                    197916541706101,\n                    199129991434152,\n                    199438795256574,\n                    199510432035291,\n                    200372412253250,\n                    200404566576199,\n                    200763792087641,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    205495097863124,\n                    206915135800075,\n                    207091233110623,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209010486710646,\n                    209240354662781,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    214695938897851,\n                    214903197314923,\n                    215248629858867,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    218536028897273,\n                    219204102261164,\n                    219891441411753,\n                    219974613748434,\n                    220343480974288,\n                    221554546582125,\n                    221729288627371,\n                    223834426416688,\n                    223984693568096,\n                    225075006031359,\n                    225198908542897,\n                    225259785351827,\n                    225688512560038,\n                    225796963089274,\n                    226620699633185,\n                    228659301550674,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231765455198863,\n                    232016464825731,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234486644060094,\n                    235151438889624,\n                    235231753660795,\n                    237490431789443,\n                    238102472767969,\n                    238536247300230,\n                    238574581938385,\n                    239320860931883,\n                    240958548895043,\n                    242434218139153,\n                    242442058293823,\n                    242559604450370,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247103593644053,\n                    247223650843273,\n                    247271784936594,\n                    248730448052989,\n                    249136603804393,\n                    255250274209015,\n                    256188918759811,\n                    256264089513587,\n                    257140177602265,\n                    258090152932519,\n                    259079953498264,\n                    260567430361426,\n                    261430613863924,\n                    261804172017043,\n                    262102779540056,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263593108768410,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264847443724344,\n                    266537010768292,\n                    269449522688748,\n                    269788172566464,\n                    271375997486305,\n                    273963009929669,\n                    274201125891842,\n                    274383394688737,\n                    275456716615408,\n                    276087711843386,\n                    276171708863992,\n                    276395310963137,\n                    277124038643903,\n                    277967939584293,\n                    278359501970729,\n                    281419217453687,\n                    282627103058306,\n                    283418694026492,\n                    283650389519323,\n                    283716381550104,\n                    285115327004357,\n                    288471586195099,\n                    288630780557211,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    291172509721213,\n                    291901191461589,\n                    293349295644131,\n                    293364784068746,\n                    293460842461919,\n                    293761737980270,\n                    294048628266791,\n                    294309017220579,\n                    297566393252293,\n                    298164502295539,\n                    299495863829841,\n                    299686419400666,\n                    300842773788181,\n                    301280787524288,\n                    304357039915265,\n                    305883937093471,\n                    307125249787970,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    308924696686164,\n                    309853660376897,\n                    310260543915478,\n                    311783912113073,\n                    312655519254570,\n                    313635798098525,\n                    315730568901909,\n                    315766966261328,\n                    316937125480217,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    321890891143490,\n                    322521825476248,\n                    323047827128093,\n                    324351935671697,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    326399280158975,\n                    328158084014937,\n                    330274652031045,\n                    331145279644469,\n                    331872454071816,\n                    335724314867453,\n                    335817092568549,\n                    338300563625880,\n                    338844220006106,\n                    340863683252199,\n                    341662236661817,\n                    341811810483352,\n                    342688543846132,\n                    343279150148526,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    347266825568201,\n                    347767039186779,\n                    348817429227528,\n                    348833845559066,\n                    349622757145996,\n                    350987533382827,\n                    351058626361688,\n                    351589420054826,\n                    354103463961601,\n                    354387066710883,\n                    355561819235138,\n                    355789912870705,\n                    356695205540256,\n                    359175499709959,\n                    359439738386632,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    364345413204186,\n                    365126424210828,\n                    365413280249712,\n                    365934903234669,\n                    366193857397914,\n                    366211725375178,\n                    366388425061942,\n                    369001359438455,\n                    372036972894155,\n                    372119412691335,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    377253494422430,\n                    378570200652257,\n                    378812352248018,\n                    378988928968399,\n                    379202966330246,\n                    379383874861118,\n                    379655211188325,\n                    380132704649033,\n                    381418800043351,\n                    383272102454619,\n                    385418400433017,\n                    385959959345831,\n                    386426924783330,\n                    387084858219758,\n                    387891260768716,\n                    389648404681890,\n                    391093344163451,\n                    391412493497363,\n                    391837889962924,\n                    392637215710013,\n                    393407397414020,\n                    393666094843064,\n                    394549480944907,\n                    394992647600588,\n                    396097144709247,\n                    398018189439516,\n                    398451260178161,\n                    399359713815504,\n                    401258033920475,\n                    401548443050700,\n                    401678403062417,\n                    402467057162382,\n                    403472959967900,\n                    403550823036072,\n                    404003416788822,\n                    404032561117566,\n                    404071682289595,\n                    404160108032790,\n                    404962546496863,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    407839904624528,\n                    408693003864864,\n                    409460547709689,\n                    409964247236589,\n                    410070177508463,\n                    411917287296495,\n                    412738866512772,\n                    412842793028086,\n                    413767389226181,\n                    414678207656526,\n                    416308367178118,\n                    416821154641916,\n                    417458112822963,\n                    417538262642243,\n                    417879179345800\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/60f7e23c24a8d94791cc7a8680c493f9",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"60f7e23c24a8d94791cc7a8680c493f9\",\n                \"mins\": [\n                    250486723534,\n                    1276320723000,\n                    2508456406617,\n                    4346223556404,\n                    5651658843765,\n                    5741639512374,\n                    6103415363614,\n                    6382184420000,\n                    7215992153582,\n                    7263583777537,\n                    8230363088713,\n                    8344183384681,\n                    8395644761685,\n                    9599933508359,\n                    9851745764538,\n                    9908321119520,\n                    12179585228825,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17520725293289,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    22648822913198,\n                    22764046638638,\n                    23651462508176,\n                    24455303556700,\n                    25171338917197,\n                    25977883823029,\n                    26336101344262,\n                    26775359856414,\n                    29426613300325,\n                    29429643624977,\n                    29716486194840,\n                    30912597140678,\n                    33283788494941,\n                    34633591199949,\n                    35265151771864,\n                    36608959952536,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37321172331310,\n                    38189684658557,\n                    41051959531050,\n                    41634658763025,\n                    42806708117796,\n                    42941620852116,\n                    43102684986874,\n                    43257012736171,\n                    44469103278173,\n                    45435629568409,\n                    45555150962803,\n                    45778211392090,\n                    46428667877491,\n                    47743166786889,\n                    48827478905522,\n                    48988117530884,\n                    49652906159408,\n                    49720533077083,\n                    51190225926040,\n                    51489867698846,\n                    51681162571203,\n                    53853474657507,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56495629119710,\n                    56789903701800,\n                    58448059219764,\n                    60051688191594,\n                    61585240896556,\n                    63136274461401,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64098752156766,\n                    64303638595001,\n                    65337560481765,\n                    65794631590725,\n                    65851646271217,\n                    67162847056402,\n                    69927546604113,\n                    71441250280595,\n                    71648552124359,\n                    73938092731264,\n                    74074344499959,\n                    74463348702348,\n                    74757289081889,\n                    75026691722950,\n                    76601650706225,\n                    77594090223745,\n                    80429502208150,\n                    81546812908959,\n                    82700429817161,\n                    83318109425074,\n                    85069188519897,\n                    85513145337736,\n                    85753551939023,\n                    86112424291327,\n                    89385885763749,\n                    89781876394634,\n                    91873432718081,\n                    91947365014884,\n                    93462948799513,\n                    94879727048600,\n                    95613743229855,\n                    97571747840697,\n                    98324799297724,\n                    98775547882506,\n                    100718427599813,\n                    102578745288578,\n                    102873080592435,\n                    104095665010556,\n                    104528709310472,\n                    105986132286860,\n                    106984945037295,\n                    107278977448655,\n                    109551654663245,\n                    109566666231438,\n                    110191507921350,\n                    110549642873812,\n                    112654122078687,\n                    113222445295988,\n                    113854916802784,\n                    116127169502189,\n                    118006247672122,\n                    118237881107424,\n                    118484253796245,\n                    118762763614010,\n                    119358605785829,\n                    119553131858167,\n                    120859413131497,\n                    120965026768103,\n                    120980078369659,\n                    123464311633543,\n                    124449616140151,\n                    124750192071655,\n                    125424514480710,\n                    125614494300765,\n                    125698882792384,\n                    126860824288401,\n                    126943192152369,\n                    129104997236940,\n                    131426956400912,\n                    132369532359260,\n                    133074201429869,\n                    137011854576215,\n                    137250954972319,\n                    137658530991775,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    141543030608061,\n                    142846188486668,\n                    143570389373736,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150561506312724,\n                    150889573263592,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    154067549446405,\n                    156275207016386,\n                    156643571858026,\n                    159204029141024,\n                    159350162876827,\n                    159359554299317,\n                    159869778233041,\n                    160021373144492,\n                    160225475241462,\n                    162966656941363,\n                    165572906446902,\n                    166307721941863,\n                    166605601159467,\n                    167304010117193,\n                    168412944661902,\n                    168609000755301,\n                    168699625286154,\n                    169208855579907,\n                    169523753644578,\n                    170917904316320,\n                    171143723926121,\n                    171243991312977,\n                    172170767228631,\n                    172842536979187,\n                    173410623132357,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    174897648514915,\n                    175029718718788,\n                    177264301473978,\n                    177857889812960,\n                    178176094018343,\n                    179017201157110,\n                    179921783290284,\n                    180059082755493,\n                    180068779789910,\n                    180414262292400,\n                    180740880110572,\n                    181063160240061,\n                    181803993639937,\n                    183449325300818,\n                    183519396664097,\n                    183571182225450,\n                    184752983925284,\n                    185471680685606,\n                    186580476523320,\n                    186949263795931,\n                    187928842797492,\n                    188086202110112,\n                    189442327350789,\n                    190807904035305,\n                    192319726776217,\n                    192393783199254,\n                    192587291169373,\n                    193005890924998,\n                    195786680138999,\n                    195987898533177,\n                    199510432035291,\n                    199650567438286,\n                    199897125905944,\n                    199958856257661,\n                    200763792087641,\n                    200811993081184,\n                    201913688816444,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    203992874733577,\n                    205007299373342,\n                    205495097863124,\n                    205586854488827,\n                    205853306198814,\n                    206336494258543,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209537101018812,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    215248629858867,\n                    215275340873070,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    219891441411753,\n                    220558792511464,\n                    221554546582125,\n                    223198782858602,\n                    223709567417754,\n                    223834426416688,\n                    225075006031359,\n                    225198908542897,\n                    225688512560038,\n                    225796963089274,\n                    226081900407695,\n                    226749405843443,\n                    227730705667335,\n                    228659301550674,\n                    229789874401174,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231270817858833,\n                    231444506729168,\n                    231765455198863,\n                    231916540191853,\n                    232974725797149,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234373571118961,\n                    234486644060094,\n                    235231753660795,\n                    238102472767969,\n                    238574581938385,\n                    241665428326676,\n                    241990049986130,\n                    242442058293823,\n                    242809521673924,\n                    243357294296588,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247271784936594,\n                    249136603804393,\n                    250033322896251,\n                    252533523398493,\n                    255869213781995,\n                    256264089513587,\n                    258090152932519,\n                    258801668971304,\n                    259079953498264,\n                    260567430361426,\n                    260653292806033,\n                    261804172017043,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264731207392290,\n                    266537010768292,\n                    270110108859339,\n                    270538381802720,\n                    271375997486305,\n                    274201125891842,\n                    274383394688737,\n                    275533107905672,\n                    276395310963137,\n                    277124038643903,\n                    277403312668335,\n                    280768685536212,\n                    281419217453687,\n                    282461563119931,\n                    283222379262666,\n                    283716381550104,\n                    283753951167536,\n                    286272134191105,\n                    288471586195099,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    290751156362843,\n                    291172509721213,\n                    293068286620317,\n                    293122482945702,\n                    293349295644131,\n                    293364784068746,\n                    293446294820727,\n                    293761737980270,\n                    294048628266791,\n                    294285966776959,\n                    294309017220579,\n                    296404313255688,\n                    297267706713144,\n                    297566393252293,\n                    298164502295539,\n                    298353836077639,\n                    299495863829841,\n                    300842773788181,\n                    301280787524288,\n                    302656802432509,\n                    304357039915265,\n                    305166459455071,\n                    305883937093471,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    310260543915478,\n                    310265191419295,\n                    311783912113073,\n                    312500518005538,\n                    312655519254570,\n                    313635798098525,\n                    314170569167596,\n                    314916970143294,\n                    315568913490822,\n                    315730568901909,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    320108891188997,\n                    321541456700375,\n                    322521825476248,\n                    323284031290836,\n                    323583450074959,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    328158084014937,\n                    330274652031045,\n                    330565598299916,\n                    331145279644469,\n                    335724314867453,\n                    335817092568549,\n                    335974005310403,\n                    336220685656619,\n                    336260335931378,\n                    336261489349740,\n                    337623845634316,\n                    338300563625880,\n                    338841443768533,\n                    340776015225067,\n                    340863683252199,\n                    341811810483352,\n                    343787907925867,\n                    344460902511425,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    348817429227528,\n                    348833845559066,\n                    349270259964100,\n                    353928548293364,\n                    354889737852692,\n                    355561819235138,\n                    359175499709959,\n                    359490965261776,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    361245631263122,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    365152687151188,\n                    366193857397914,\n                    366388425061942,\n                    367512815238907,\n                    368111726415588,\n                    368850056470283,\n                    374792067287126,\n                    374992075674229,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    378988928968399,\n                    379202966330246,\n                    379462778378127,\n                    379937459247959,\n                    380132704649033,\n                    380373432490457,\n                    380778268703892,\n                    381418800043351,\n                    381991699884352,\n                    383272102454619,\n                    385113003923218,\n                    385418400433017,\n                    385755642378984,\n                    386426924783330,\n                    387687866855442,\n                    387891260768716,\n                    391093344163451,\n                    391412493497363,\n                    391913316514326,\n                    393253943410375,\n                    394549480944907,\n                    394868976184257,\n                    394992647600588,\n                    395370668508160,\n                    396097144709247,\n                    398018189439516,\n                    398330770380060,\n                    399359713815504,\n                    400501102903000,\n                    403472959967900,\n                    404003416788822,\n                    404032561117566,\n                    404160108032790,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    409964247236589,\n                    410070177508463,\n                    412243873589964,\n                    415731791994512,\n                    415798442457945,\n                    416308367178118,\n                    417193054089403,\n                    417879179345800,\n                    417958793174431,\n                    418013395365815,\n                    418930712757550,\n                    419080351349759,\n                    421689299055012,\n                    421897504513649,\n                    422317065560637,\n                    423341155346518,\n                    424170930031434,\n                    424684625834342,\n                    425491993925697,\n                    426300532034066,\n                    427562965999248\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/6d6e87e1154e95b279e5e7db414bc37b",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2255622_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"6d6e87e1154e95b279e5e7db414bc37b\",\n                \"mins\": [\n                    215089315280,\n                    291674529868,\n                    659912036083,\n                    736968581505,\n                    944574910739,\n                    1130926917921,\n                    1140383038326,\n                    1224208891333,\n                    1519622976813,\n                    2508456406617,\n                    2726898850574,\n                    2813494374706,\n                    3047015433984,\n                    3835288040828,\n                    4231658739382,\n                    4413003150135,\n                    4870914467521,\n                    5825209928114,\n                    5871893412345,\n                    5888422665728,\n                    6103415363614,\n                    7532547771555,\n                    7594581929652,\n                    7910677492884,\n                    8182315511682,\n                    8230363088713,\n                    8394347595486,\n                    8623700758937,\n                    9739271815773,\n                    9780886482986,\n                    9836834414894,\n                    9946639466383,\n                    10104425650117,\n                    10122980714756,\n                    10229953843845,\n                    11382774219786,\n                    11828070075151,\n                    12099834582305,\n                    12132880780844,\n                    12459731847780,\n                    13935429903706,\n                    14563906465922,\n                    14758098660233,\n                    14761433865384,\n                    14898831781122,\n                    14958876677719,\n                    15317866923606,\n                    15366664740987,\n                    15764118331522,\n                    16115281956116,\n                    16219549320392,\n                    16244571079575,\n                    16363695412769,\n                    16493792210474,\n                    16852225843359,\n                    17503337897524,\n                    18262609533893,\n                    18283839128286,\n                    18393265118408,\n                    18699386411547,\n                    18865536207758,\n                    19653463755059,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    20993534689958,\n                    21309387292380,\n                    21678201955671,\n                    22228433882905,\n                    22400017100650,\n                    22481669321537,\n                    22648822913198,\n                    23075126583981,\n                    23473630895827,\n                    24228397245244,\n                    24453017104540,\n                    24729753092003,\n                    25171338917197,\n                    25470086398510,\n                    25859976628720,\n                    26034960602920,\n                    26050630874225,\n                    26811088179302,\n                    26889776861871,\n                    27379618897398,\n                    27579322793320,\n                    27877721210839,\n                    28181374991281,\n                    28987805918116,\n                    29485767733290,\n                    30645532261705,\n                    31018397527996,\n                    31804114294503,\n                    31828073872267,\n                    33174177282046,\n                    33766728674754,\n                    34293559391707,\n                    34865655278433,\n                    35594794270269,\n                    35737327561228,\n                    36023575677863,\n                    36115178283383,\n                    36296573836791,\n                    36648254328139,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37722662910660,\n                    38047555790079,\n                    39181335028291,\n                    39315707646191,\n                    39525475121988,\n                    39547908012021,\n                    39569717769426,\n                    39570762134913,\n                    39842830835114,\n                    40131183581621,\n                    40359387471137,\n                    40488805247400,\n                    41051959531050,\n                    41208453811482,\n                    41327552124444,\n                    41731966115950,\n                    41848970534226,\n                    41993387439893,\n                    42240649495469,\n                    42806708117796,\n                    42835572354395,\n                    43361270985506,\n                    43392410013225,\n                    43951532139020,\n                    44251094622336,\n                    44469103278173,\n                    45134133836289,\n                    45162468772898,\n                    45253034750040,\n                    45493022921402,\n                    45549512378900,\n                    45631191923950,\n                    45687888053031,\n                    45961575852560,\n                    46031634263009,\n                    46219814209796,\n                    46408058278807,\n                    46571511322916,\n                    46861475435055,\n                    47081622333494,\n                    47309849454170,\n                    47851830416841,\n                    47932899674281,\n                    47988023254574,\n                    48322895089471,\n                    48721945773460,\n                    49163704568316,\n                    49371043945336,\n                    49686742507605,\n                    49720533077083,\n                    50096835907506,\n                    50270049899306,\n                    50336770017521,\n                    51082727813358,\n                    51528521216274,\n                    51681162571203,\n                    52034584391811,\n                    52210140433416,\n                    53023472863526,\n                    53228660416588,\n                    53853474657507,\n                    54692295414908,\n                    54867740755084,\n                    55129376901201,\n                    55236706250225,\n                    55778862667349,\n                    56306387723041,\n                    56657193003439,\n                    56789903701800,\n                    56799175563515,\n                    58105502805031,\n                    58290341538968,\n                    58337636059748,\n                    58488541968161,\n                    58720502087817,\n                    58840242165831,\n                    59494247622507,\n                    59495718362544,\n                    59981877800655,\n                    60051688191594,\n                    60188262372837,\n                    61494212300278,\n                    61790767178261,\n                    61812779636411,\n                    62099680245497,\n                    62313609143465,\n                    62639365934918,\n                    62662601215791,\n                    62807714707992,\n                    62828283855818,\n                    63129837300858,\n                    63227673813565,\n                    63343999371796,\n                    63511319636084,\n                    63997630844999,\n                    64226287840399,\n                    64303638595001,\n                    64534788908566,\n                    64598408397821,\n                    64641070960034,\n                    64727391334782,\n                    65372884132154,\n                    65555522561100,\n                    65794631590725,\n                    65879475768365,\n                    66208953124276,\n                    66568612075368,\n                    66827922406571,\n                    67207262461072,\n                    67677675064362,\n                    68180164059744,\n                    68439185286494,\n                    68761623640864,\n                    68842406304872,\n                    68983853573191,\n                    69047394343401,\n                    69229098109696,\n                    69531629629596,\n                    69927546604113,\n                    70273121946683,\n                    70649076239339,\n                    72161895027450,\n                    72329350928637,\n                    72384590450660,\n                    72784763566810,\n                    72926015770316,\n                    74185732683200,\n                    74995142431146,\n                    76236574892384,\n                    76899785139431,\n                    76910573567504,\n                    77363880951456,\n                    77435320006613,\n                    77499348917587,\n                    77670697910565,\n                    79332000470232,\n                    79746229389501,\n                    80363874565010,\n                    80429502208150,\n                    80939112789193,\n                    80991804891201,\n                    81459515971071,\n                    81914076163002,\n                    82065184534549,\n                    82105662040805,\n                    82696690432912,\n                    83034887506486,\n                    83178028089512,\n                    83964592793137,\n                    84005077178832,\n                    84558403439851,\n                    84777164098582,\n                    84876046572148,\n                    85223814578728,\n                    85283551436014,\n                    86034559726890,\n                    86181847516411,\n                    86662916902939,\n                    87008362790296,\n                    87264350072268,\n                    87416948371306,\n                    87553087594658,\n                    87706538967451,\n                    88398210557196,\n                    88606942757476,\n                    88724621114355,\n                    89224410019537,\n                    90273256224370,\n                    91706763244181,\n                    92563002307861,\n                    92615551991813,\n                    92670714878004,\n                    92808938741689,\n                    92963671022329,\n                    93402089893230,\n                    93462948799513,\n                    93841830978049,\n                    94123707640329,\n                    94390504905414,\n                    94449201343599,\n                    95108638560446,\n                    95322147890566,\n                    95470737290984,\n                    95613743229855,\n                    96442880942679,\n                    97040758087909,\n                    97246797236254,\n                    97571747840697,\n                    98123090506182,\n                    98179513908619,\n                    98324799297724,\n                    99368955966421,\n                    99569043912575,\n                    99965133914776,\n                    100448234351312,\n                    100689066969619,\n                    100725505255788,\n                    100757191863196,\n                    101455538328968,\n                    101493231099683,\n                    102644142538181,\n                    104091683226971,\n                    104120924444187,\n                    104400591660966,\n                    104446790158566,\n                    104451867849834,\n                    105189561915429,\n                    105717627107319,\n                    106434203474251,\n                    106856438858860,\n                    106984945037295,\n                    107001680275504,\n                    107246503630802,\n                    107335243861817,\n                    109071581673129,\n                    109551654663245,\n                    109694118121197,\n                    111454367428562,\n                    111636058746833,\n                    111788278952703,\n                    112015499236465,\n                    112157193261305,\n                    113163563618295,\n                    113410539288368,\n                    114139175955629,\n                    114307819855046,\n                    114321559757180,\n                    114728471948120,\n                    114903557460790,\n                    114981716237090,\n                    115403886521159,\n                    115650470365123,\n                    115696569747930,\n                    115711999096223,\n                    116127169502189,\n                    116211838271866,\n                    116371477715368,\n                    116556039792279,\n                    116957004714210,\n                    117867146428505,\n                    118484253796245,\n                    118571863639262,\n                    118704354431725,\n                    118762763614010,\n                    118916030730019,\n                    119186746319693,\n                    119349197230465,\n                    119358605785829,\n                    119438611160104,\n                    119698878365483,\n                    121123692554185,\n                    121142462666583,\n                    121528792557620,\n                    121797541557489,\n                    121870306095302,\n                    122149310042087,\n                    123106982277866,\n                    123435887685299,\n                    123601762458621,\n                    123717654821426,\n                    124051214072843,\n                    124342491116643,\n                    124503522875964,\n                    124578586530266,\n                    124587964437913,\n                    124725729653665,\n                    124746422633510,\n                    124750192071655,\n                    124768282727566,\n                    125230114876611,\n                    125321826030016,\n                    127419004886761,\n                    127420241505431,\n                    127838593437661,\n                    128608410656562,\n                    128615562510797,\n                    129136336003338,\n                    129743357585456,\n                    130357183596582,\n                    130449489784288,\n                    130759367637359,\n                    130932431409422,\n                    131114765041506,\n                    131259713485090,\n                    131665899116300,\n                    132696169867812,\n                    133074201429869,\n                    133610721653670,\n                    133658087266350,\n                    133805949970550,\n                    134022643347451,\n                    134180001503169,\n                    134480946295095,\n                    134528309262636,\n                    135813149578002,\n                    136270510397946,\n                    136440932785986,\n                    137225082805595,\n                    138015741692447,\n                    138036515355989,\n                    138868467200948,\n                    139426803069629,\n                    140477227833971,\n                    140758407076546,\n                    140945797534471,\n                    141177726297957,\n                    141990335973972,\n                    142280730309472,\n                    142394166917163,\n                    142866591234977,\n                    143057190215748,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    143918338421151,\n                    143993203989656,\n                    144035717909615,\n                    144099850521047,\n                    144118542916339,\n                    144289220792317,\n                    144756978268718,\n                    145507507293269,\n                    145801993118700,\n                    146036048035532,\n                    147547181493835,\n                    147568633164936,\n                    148265509196629,\n                    148271320739741,\n                    149009140521356,\n                    149400470821791,\n                    149466695315067,\n                    149610030539086,\n                    150525607103853,\n                    151134340913122,\n                    151891421516846,\n                    152173033669992,\n                    152252932556929,\n                    152545355800304,\n                    152763516596482,\n                    152767089713159,\n                    153018942489979,\n                    153277687133191,\n                    153499429746893,\n                    153619074170851,\n                    153688480117844,\n                    153819767075496,\n                    153934077987853,\n                    153964058113210,\n                    154144078574046,\n                    154473683474900,\n                    154504590428422,\n                    154745677105480,\n                    154767139169904,\n                    154792465965192,\n                    155005702504057,\n                    156187447382478,\n                    156337457611871,\n                    156516659025181,\n                    156881462375449,\n                    157486234764096,\n                    157771792852571,\n                    159350162876827,\n                    159359554299317,\n                    159525033588832,\n                    159811833882343,\n                    159833415113099,\n                    160455334711875,\n                    160779614822235,\n                    162184986436543,\n                    162660721679577,\n                    162832799447054,\n                    162966656941363,\n                    163094038630874,\n                    164292320065575,\n                    164730857318871,\n                    164870234246611,\n                    165572906446902,\n                    165599790702978,\n                    166033901816340,\n                    166883822819949,\n                    167007474650516,\n                    167141620488773,\n                    167220419246069,\n                    167368164348954,\n                    167477335839938,\n                    167536779496558,\n                    167578307012466,\n                    167627584385194,\n                    167628267366836,\n                    168279076776929,\n                    168412944661902,\n                    168495462754350\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/b59473c94ff2889eca5d7165936e64b3",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453570_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"b59473c94ff2889eca5d7165936e64b3\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    3558981176698,\n                    3595680864757,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14077774510216,\n                    14958711182794,\n                    18561566035899,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    22816587154347,\n                    23694929505466,\n                    24134363957219,\n                    30606147678309,\n                    31130970675642,\n                    32760645340554,\n                    32914685791800,\n                    33190965408032,\n                    33960067474598,\n                    33972093486205,\n                    36209503859197,\n                    36836491863349,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    40000457533067,\n                    40821822920127,\n                    41548684950793,\n                    42975853122398,\n                    44318001749959,\n                    45220477427487,\n                    47205415940160,\n                    48527209372456,\n                    49367718187361,\n                    50266038601832,\n                    55281399957585,\n                    56622962479482,\n                    57082333339946,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    61074441390615,\n                    62702978264830,\n                    63272127345152,\n                    63747523251368,\n                    63753094017459,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    67872638217057,\n                    73961050027324,\n                    74203304881322,\n                    75510673507974,\n                    76301251957108,\n                    77462788932224,\n                    78004711377952,\n                    78593695483794,\n                    86080933269012,\n                    89312085426348,\n                    90302598717534,\n                    92082937491658,\n                    94266407193778,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103640879986045,\n                    106478901668282,\n                    106527047349315,\n                    112760650992638,\n                    114014805629783,\n                    114457599754429,\n                    114719330008227,\n                    114779375695317,\n                    115180661866118,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    128261346941417,\n                    129274485291245,\n                    130190959130109,\n                    130268767097311,\n                    130618284885748,\n                    131165953925337,\n                    133399630293992,\n                    133580282506938,\n                    137807029090583,\n                    139762252968300,\n                    142561908560556,\n                    143304921092381,\n                    144178457349008,\n                    148434659896290,\n                    150519487205401,\n                    154119208822262,\n                    154803963303860,\n                    155829895672627,\n                    156056750199531,\n                    159477189409659,\n                    160949002171461,\n                    163227549897255,\n                    164655854171874,\n                    165496592913298,\n                    165633097778062,\n                    166146331478050,\n                    166719940886532,\n                    166891246324981,\n                    167767324541682,\n                    173367021064967,\n                    173949973069402,\n                    175559849681044,\n                    176037192436786,\n                    181359032563838,\n                    181452042206456,\n                    182593899788192,\n                    185485707281703,\n                    186607121994479,\n                    188106044596447,\n                    191078441509481,\n                    194214915999879,\n                    194881073215824,\n                    196584209022550,\n                    198409930440501,\n                    199577187021953,\n                    200567230796156,\n                    202981877464187,\n                    208004490729476,\n                    210822710165852,\n                    211216538377500,\n                    211915017282095,\n                    215418355892998,\n                    215493649182712,\n                    215607106913801,\n                    216444054660744,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    225216425962890,\n                    225962923363564,\n                    225980008558421,\n                    228170423512561,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    233393853088183,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    238537875199759,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244255726983140,\n                    248336783901894,\n                    248851248559212,\n                    250357693564448,\n                    255343715369709,\n                    256375919657769,\n                    258616504685066,\n                    260212336791624,\n                    265736169322750,\n                    265781739304017,\n                    267345873524094,\n                    270071179263543,\n                    271342665825792,\n                    274122990498640,\n                    275360996806051,\n                    280967669495427,\n                    281897628539431,\n                    282200323162036,\n                    282342999530487,\n                    283830758206802,\n                    284620358398045,\n                    285925400570356,\n                    286736038466698,\n                    294086384353867,\n                    296514059807299,\n                    296966685834878,\n                    298791773277565,\n                    299005107402724,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    304085672582189,\n                    306426014688347,\n                    308473366560206,\n                    312407681513044,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    326855577904572,\n                    329899680983199,\n                    330331027273450,\n                    332098363218169,\n                    333944737799563,\n                    335174317746616,\n                    335584394916553,\n                    336702934772821,\n                    337731129151000,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    345448918397261,\n                    345460489054988,\n                    345741054833297,\n                    345875303722758,\n                    348815216366639,\n                    350399163507829,\n                    351292962170419,\n                    351636183165646,\n                    352167543743049,\n                    357535517122796,\n                    358375425017902,\n                    358595265377108,\n                    359452645935849,\n                    362124977362793,\n                    366535672236781,\n                    369461062038057,\n                    374615513078797,\n                    374673872059460,\n                    375780195152331,\n                    376434056729415,\n                    378592360993657,\n                    379102542404949,\n                    382035531157070,\n                    383135333541903,\n                    383850900061929,\n                    386263487549463,\n                    388013701783741,\n                    390332660259608,\n                    391711331432850,\n                    393516543506060,\n                    395113186430911,\n                    398353486663867,\n                    400967959890432,\n                    401487977714282,\n                    408778667923133,\n                    408962716867059,\n                    410861197839878,\n                    414355853800959,\n                    416391446838305,\n                    416580890530128,\n                    417681898958140,\n                    418835159902566,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    427962000123701,\n                    428646049860395,\n                    429952924284227,\n                    430664272577516,\n                    432118521614652,\n                    434109604325888,\n                    435267549331128,\n                    435940587843567,\n                    446481351575757,\n                    447467518423055,\n                    449803315024875,\n                    450112320572118,\n                    452241247094714,\n                    452829154656306,\n                    453367679371415,\n                    454813132622585,\n                    456493632715805,\n                    456717723773303,\n                    457632835991147,\n                    460076260875464,\n                    461156956524045,\n                    461171986063800,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    471195319432894,\n                    471546567533879,\n                    471922058927200,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473794754684632,\n                    476325119891604,\n                    476526896773980,\n                    477517713088633,\n                    480403157013579,\n                    482503820391550,\n                    484680531927015,\n                    485278877010947,\n                    487131235164323,\n                    487732314724511,\n                    488524886279546,\n                    491715999174683,\n                    495846359323641,\n                    506531113930798,\n                    510251560588775,\n                    510737910464301,\n                    512448947565770,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518629934480933,\n                    520568397104333,\n                    525382873389847,\n                    525762219690878,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530515351265560,\n                    534461213463332,\n                    538939534540869,\n                    539614362293141,\n                    539777176029418,\n                    539873986742508,\n                    540921382222017,\n                    541186981810837,\n                    543935720187395,\n                    545273268128445,\n                    546633122974996,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    556847877286431,\n                    558032616210722,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    561604684739024,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572186073828265,\n                    573767900523468,\n                    573851852316852,\n                    576313152716444,\n                    576624529060777,\n                    576874504697497,\n                    577153916453262,\n                    578224661471458,\n                    578856083248351,\n                    579656586099131,\n                    583350333207780,\n                    584217116139474,\n                    587065796103120,\n                    587669535192483,\n                    592792708776319,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    600583358156891,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620849299055244,\n                    621083126852990,\n                    627738708322473,\n                    628967244202734,\n                    629396495678046,\n                    630034340392901,\n                    632152787169751,\n                    632757066611488,\n                    635939425862264,\n                    640549605471712,\n                    641596035529063,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    648990703275660,\n                    649351154360370,\n                    650654068363343,\n                    655230244020599,\n                    657226217132416,\n                    657355507140185,\n                    662135736889575,\n                    663462366932727,\n                    665636043678921,\n                    667342688777044,\n                    668170744538822,\n                    670595660720839,\n                    672641554971634,\n                    676044446355190,\n                    677261185301275,\n                    677295740685782,\n                    677738022893547,\n                    679186583662682,\n                    681266465716475,\n                    682874745971459,\n                    683897063771844,\n                    685746125867239,\n                    686035384279530,\n                    686106466488739,\n                    687211424722853,\n                    688990372747831,\n                    691020029667905,\n                    691680901171966,\n                    694869046270466,\n                    700054088308311,\n                    700366400626315,\n                    701010566680671,\n                    702400887447953,\n                    702728791577749,\n                    703127461004015,\n                    704335484663791,\n                    705302678110381,\n                    706832134097576,\n                    707962189637436,\n                    710403353214581,\n                    712661928452840,\n                    715334925158742,\n                    715377268215567,\n                    715896323316677,\n                    716020219332683,\n                    716091343321154,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    723332805980528,\n                    724621545164802,\n                    726012427583803,\n                    726271575466251,\n                    727030394121071,\n                    731361512976697,\n                    733617713228542,\n                    734622692371860,\n                    736290151677476,\n                    736566880750337,\n                    739389456325310,\n                    742704052187442,\n                    745420507633982,\n                    746469097917429,\n                    747026339202991,\n                    748064810280445,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758453303481943,\n                    758543555642030,\n                    759237826018133,\n                    770328708409334,\n                    771613473168408,\n                    772165475523258,\n                    773304776019517,\n                    774312511311396,\n                    774594040074891,\n                    774964429534347,\n                    777891987478900,\n                    779330069525835,\n                    782210000583365,\n                    783959071612606,\n                    785243161415867,\n                    788027556261557,\n                    788033647567963,\n                    788617127284627,\n                    789488280089338,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    794276713525849,\n                    796762144732626,\n                    797622366845781,\n                    800060479182618,\n                    802951804704904,\n                    804618913432196,\n                    806028047443770,\n                    806167606439428,\n                    811884284377466\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/f0c834bc306651d2b9321fb21d3e8d8f",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453569_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f0c834bc306651d2b9321fb21d3e8d8f\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    2756695559996,\n                    3017280732468,\n                    8798248946328,\n                    11352616080698,\n                    11550845136154,\n                    12183113567732,\n                    14718047586080,\n                    15518147513869,\n                    17682163834920,\n                    18029472307723,\n                    18722876140337,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    23126533024618,\n                    24134363957219,\n                    25105646732171,\n                    27426095011341,\n                    28889287639316,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    34376317340737,\n                    35413666412010,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    41548684950793,\n                    42975853122398,\n                    43333283576538,\n                    43797826300341,\n                    44182822842357,\n                    49367718187361,\n                    50266038601832,\n                    51459351831459,\n                    52459209483030,\n                    54096036790222,\n                    54938371268946,\n                    56622962479482,\n                    58428533496606,\n                    58910287066672,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62424408278746,\n                    62652142008211,\n                    62702978264830,\n                    63747523251368,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    65853715307230,\n                    67872638217057,\n                    70880519905358,\n                    73961050027324,\n                    75833178093944,\n                    78004711377952,\n                    89046548749891,\n                    91970793441325,\n                    92082937491658,\n                    94266407193778,\n                    97059945956107,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    106511667935863,\n                    109026157607570,\n                    112505435116132,\n                    112760650992638,\n                    114014388557103,\n                    114457599754429,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    119998700438175,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    123453159722404,\n                    126427982409537,\n                    127302670329760,\n                    128261346941417,\n                    129274485291245,\n                    130268767097311,\n                    130618284885748,\n                    130680267494321,\n                    131310062444107,\n                    132907013766936,\n                    133399630293992,\n                    133580282506938,\n                    137450930961952,\n                    139762252968300,\n                    140619106750418,\n                    142615782998151,\n                    143304921092381,\n                    145203869062483,\n                    148434659896290,\n                    150519487205401,\n                    151659316769984,\n                    154119208822262,\n                    154803963303860,\n                    155091361216035,\n                    156355255647409,\n                    163227549897255,\n                    163905808341739,\n                    166116061393073,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173468574347604,\n                    175559849681044,\n                    176037192436786,\n                    179129454015522,\n                    179606648877738,\n                    179956173397439,\n                    181175315330322,\n                    186188120396587,\n                    189162728773831,\n                    191078441509481,\n                    196150349451960,\n                    196584209022550,\n                    198409930440501,\n                    198597053692927,\n                    200509345911594,\n                    200567230796156,\n                    202960515626517,\n                    202981877464187,\n                    210625558705034,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    219619606513837,\n                    220138017981065,\n                    221322641419906,\n                    221692515333150,\n                    223103766020907,\n                    223308827351122,\n                    225216425962890,\n                    225962923363564,\n                    227654478699541,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    236606915867400,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242779977866708,\n                    242838856557679,\n                    244255726983140,\n                    244860991440151,\n                    245130313552765,\n                    248336783901894,\n                    248851248559212,\n                    248993151758694,\n                    250357693564448,\n                    250433703280235,\n                    258315509760939,\n                    259301238714261,\n                    259835033542287,\n                    264753634717119,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    266888647546888,\n                    268179213976013,\n                    269644108985416,\n                    271342665825792,\n                    273193300451366,\n                    274122990498640,\n                    274876788032658,\n                    275360996806051,\n                    275543995846992,\n                    276221877341287,\n                    277132191503183,\n                    277862338800417,\n                    278212913088609,\n                    280877794706788,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    286555216056228,\n                    286736038466698,\n                    288091651180818,\n                    289724862541255,\n                    290309864993733,\n                    290388809460443,\n                    294086384353867,\n                    296966685834878,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    301510670432750,\n                    302667628736144,\n                    307413790961671,\n                    308473366560206,\n                    309227573740883,\n                    312587803039400,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    319121931997971,\n                    326855577904572,\n                    328849372415869,\n                    329418197512975,\n                    331238400730017,\n                    332098363218169,\n                    333944737799563,\n                    334843701246736,\n                    335584394916553,\n                    335971123608722,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    346077313264359,\n                    346299646639688,\n                    348815216366639,\n                    350399163507829,\n                    352167543743049,\n                    357535517122796,\n                    358595265377108,\n                    359452645935849,\n                    360947577332752,\n                    362124977362793,\n                    362617542158239,\n                    364155736950907,\n                    365659628340646,\n                    366535672236781,\n                    367226803013763,\n                    369117201073175,\n                    369325291998224,\n                    369559687694957,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    376434056729415,\n                    377398322708389,\n                    379102542404949,\n                    381336562045153,\n                    382035531157070,\n                    383850900061929,\n                    384211196611467,\n                    386263487549463,\n                    388499765349836,\n                    390332660259608,\n                    391711331432850,\n                    392351813514281,\n                    393516543506060,\n                    394623284964953,\n                    394996681358473,\n                    401487977714282,\n                    406196060040394,\n                    408778667923133,\n                    408962716867059,\n                    410071124049598,\n                    410861197839878,\n                    414355853800959,\n                    415194310967331,\n                    416580890530128,\n                    418088879972183,\n                    421486950473329,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424577144701529,\n                    427230335237565,\n                    429952924284227,\n                    430583031413630,\n                    430664272577516,\n                    434328269700792,\n                    435267549331128,\n                    436479092642625,\n                    437123713564004,\n                    437654980371254,\n                    437948315733142,\n                    447467518423055,\n                    448817550923236,\n                    450058424424520,\n                    450112320572118,\n                    451622661916081,\n                    452195530667530,\n                    452241247094714,\n                    453735785331029,\n                    456493632715805,\n                    456717723773303,\n                    457996242151684,\n                    458057319849877,\n                    460076260875464,\n                    461156956524045,\n                    461276801535123,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    470135419109892,\n                    471546567533879,\n                    471922058927200,\n                    472365458755346,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473082557541180,\n                    476325119891604,\n                    476526896773980,\n                    480177741395295,\n                    484639189320920,\n                    484680531927015,\n                    484810950748951,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    493125876509773,\n                    495846359323641,\n                    498279238790238,\n                    508031302306958,\n                    509308758440423,\n                    510251560588775,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518525721488903,\n                    519307267967594,\n                    519375222893422,\n                    520006459875423,\n                    520568397104333,\n                    523796133390380,\n                    525331047566316,\n                    525382873389847,\n                    525443969024288,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    533221992957154,\n                    533383900955463,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    540252372548066,\n                    542883591758496,\n                    543935720187395,\n                    544910970844098,\n                    545273268128445,\n                    551381720133873,\n                    553977959695484,\n                    555273679362469,\n                    555321949850378,\n                    555828795847874,\n                    556910957763276,\n                    557285930201258,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    559954430933840,\n                    564616206473372,\n                    565020390122451,\n                    566114305025384,\n                    568901431510366,\n                    572068367820350,\n                    572864932706448,\n                    573767900523468,\n                    573851852316852,\n                    576110831795731,\n                    576624529060777,\n                    576874504697497,\n                    578416100451701,\n                    579421699692764,\n                    579748224601908,\n                    583346960664570,\n                    583458377899774,\n                    584217116139474,\n                    585039308609199,\n                    587065796103120,\n                    591244122623354,\n                    592792708776319,\n                    592997432856726,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605527960069793,\n                    606419362199228,\n                    607649938708299,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612318401334000,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    618889806182696,\n                    620059729516362,\n                    621083126852990,\n                    621271411830233,\n                    623252370242796,\n                    626526286339314,\n                    628967244202734,\n                    630034340392901,\n                    631029322236360,\n                    632757066611488,\n                    632818738426364,\n                    634691502028135,\n                    635939425862264,\n                    635969932055283,\n                    639610417638976,\n                    639710605455165,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    649351154360370,\n                    649391604242707,\n                    652455823903591,\n                    655230244020599,\n                    657355507140185,\n                    663985456931184,\n                    668589629748046,\n                    670146496451272,\n                    670595660720839,\n                    672641554971634,\n                    673587502056476,\n                    676044446355190,\n                    677201890824346,\n                    677261185301275,\n                    678303154208507,\n                    678412732753910,\n                    680941268401052,\n                    681266465716475,\n                    682209634532220,\n                    682874745971459,\n                    683897063771844,\n                    686035384279530,\n                    686106466488739,\n                    688990372747831,\n                    691680901171966,\n                    694869046270466,\n                    698831566328784,\n                    701010566680671,\n                    703127461004015,\n                    705095159614137,\n                    705302678110381,\n                    705440295396070,\n                    707962189637436,\n                    712128120373858,\n                    712530228579255,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    725530359226083,\n                    726271575466251,\n                    726644962313888,\n                    727030394121071,\n                    731361512976697,\n                    733555199906207,\n                    733617713228542,\n                    734622692371860,\n                    735916499223944,\n                    736290151677476\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v3/f71e78178af9e45e6f1d87a0c53c465c",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2241509_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f71e78178af9e45e6f1d87a0c53c465c\",\n                \"mins\": [\n                    60400386987,\n                    823577066500,\n                    1519622976813,\n                    2099558230394,\n                    2198288153123,\n                    3973909611528,\n                    4586034465171,\n                    5888422665728,\n                    6302757725882,\n                    6367937204658,\n                    7215992153582,\n                    7669958619476,\n                    8230363088713,\n                    9707684064301,\n                    9739271815773,\n                    9780886482986,\n                    11021715939935,\n                    11850890474214,\n                    12099834582305,\n                    13092799901887,\n                    13225001158920,\n                    13609959198971,\n                    14354310516423,\n                    14563906465922,\n                    14571059560222,\n                    14645306127358,\n                    16310340704441,\n                    16958276389988,\n                    17219579204110,\n                    17953084754017,\n                    19959151374003,\n                    20208369434823,\n                    21248632255890,\n                    21852731993169,\n                    22648822913198,\n                    23058172043183,\n                    23576662356304,\n                    23829375645561,\n                    25261795703932,\n                    29548113152218,\n                    29602469588352,\n                    30665779043560,\n                    30901584804357,\n                    30912597140678,\n                    31255720474308,\n                    31828073872267,\n                    32047005497326,\n                    32455199900939,\n                    35265151771864,\n                    35504563643595,\n                    36618240038591,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    38152902047267,\n                    38189684658557,\n                    38758196129412,\n                    39368843530690,\n                    41051959531050,\n                    41208453811482,\n                    42201185214133,\n                    43593801431999,\n                    44253524153058,\n                    44436694084066,\n                    44697291364213,\n                    44698336514963,\n                    44976567584701,\n                    45391001008294,\n                    46515523354690,\n                    46816178877796,\n                    47731774762880,\n                    48595334402758,\n                    49021979265101,\n                    49371043945336,\n                    49676482222915,\n                    49720533077083,\n                    49845812873381,\n                    50863756953274,\n                    51528521216274,\n                    51681162571203,\n                    52832061642195,\n                    55129376901201,\n                    58290341538968,\n                    58895316100455,\n                    58986967295710,\n                    59831458885832,\n                    60629989873712,\n                    60862427199268,\n                    61311934374427,\n                    61741300517625,\n                    62998796549670,\n                    63214224986744,\n                    63436550394145,\n                    65555522561100,\n                    65924385841826,\n                    66014450404167,\n                    68106503958474,\n                    68361070361240,\n                    68429622395163,\n                    69531629629596,\n                    69669816952364,\n                    69834076734040,\n                    69867726565078,\n                    70390489655010,\n                    72161895027450,\n                    74627935126284,\n                    75599412151037,\n                    76910573567504,\n                    76990092374193,\n                    77823679358184,\n                    79920934493212,\n                    81153675749737,\n                    83034887506486,\n                    83541004870527,\n                    84117257683706,\n                    84510016212982,\n                    84558403439851,\n                    84566106541648,\n                    84869605041559,\n                    85020470139133,\n                    86408814513897,\n                    86689484146462,\n                    87496267274159,\n                    87553087594658,\n                    89031341868186,\n                    89224410019537,\n                    90968099687792,\n                    91947365014884,\n                    92560475806357,\n                    92705312571767,\n                    92963671022329,\n                    94042470128938,\n                    94981444614992,\n                    95346285931614,\n                    95613743229855,\n                    96073201994886,\n                    97403829495106,\n                    98324799297724,\n                    98335693463023,\n                    98358008337001,\n                    98513632733989,\n                    98581447863023,\n                    99240980237734,\n                    100665877566078,\n                    100757191863196,\n                    100874197486354,\n                    101402668545174,\n                    102523882340550,\n                    103837073195515,\n                    104511770485165,\n                    104976980796599,\n                    106376197021301,\n                    106790594595842,\n                    106856438858860,\n                    107075008219968,\n                    107270211710572,\n                    108522499772179,\n                    108796977261490,\n                    109072458044113,\n                    110973691690640,\n                    111597811721701,\n                    111852579406785,\n                    112098834290105,\n                    112854535715471,\n                    113100360362644,\n                    113532609924883,\n                    113707672644737,\n                    115222086224134,\n                    115902936575572,\n                    116875710241107,\n                    117439434128933,\n                    118237881107424,\n                    118484253796245,\n                    118577458244101,\n                    118704354431725,\n                    118762763614010,\n                    120403562403398,\n                    123085302630219,\n                    124236663214303,\n                    124503522875964,\n                    124750192071655,\n                    127838593437661,\n                    129008119673637,\n                    129500120619911,\n                    130386592519852,\n                    130916995773652,\n                    131868928947612,\n                    132342877083990,\n                    132696169867812,\n                    133177175428260,\n                    134940238499518,\n                    136270510397946,\n                    138015741692447,\n                    139617655113359,\n                    140742957630633,\n                    141060355139271,\n                    141727722067525,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    144524559656528,\n                    145048941926910,\n                    145358524676284,\n                    145801993118700,\n                    146147941959569,\n                    146197332642273,\n                    147298094626620,\n                    148132313295676,\n                    148271320739741,\n                    149246624631496,\n                    149412030697401,\n                    149428289783056,\n                    149878295612908,\n                    150300472338716,\n                    150498142033726,\n                    150606394548784,\n                    151891421516846,\n                    152252932556929,\n                    152472674447245,\n                    153018942489979,\n                    153041570427833,\n                    153261172171064,\n                    153499429746893,\n                    153688480117844,\n                    154721599478608,\n                    156275207016386,\n                    156516659025181,\n                    156643571858026,\n                    157408350370825,\n                    159359554299317,\n                    159796078446483,\n                    159833415113099,\n                    159910575077486,\n                    160351486834693,\n                    161939629643864,\n                    161940609986387,\n                    162704932949945,\n                    163068263480786,\n                    164511747855159,\n                    164647714000312,\n                    164794299381545,\n                    165210023048822,\n                    165572906446902,\n                    167086347826855,\n                    167141620488773,\n                    167220419246069,\n                    168279076776929,\n                    168412944661902,\n                    168499688420518,\n                    168588153181670,\n                    168632649534409,\n                    170442460802606,\n                    171201369635525,\n                    172053856709804,\n                    172169121265773,\n                    172775324389923,\n                    174450145080469,\n                    174885454236600,\n                    175626124736457,\n                    176179703984274,\n                    177264301473978,\n                    177275301905938,\n                    177917847980823,\n                    177974381583110,\n                    178636928206636,\n                    180068779789910,\n                    181013251409814,\n                    184142039382455,\n                    184752983925284,\n                    185343297638823,\n                    186689460295987,\n                    186949263795931,\n                    187443322053286,\n                    188174311614794,\n                    190190643958498,\n                    190435386968577,\n                    191505075402719,\n                    192587291169373,\n                    192985634484457,\n                    193005890924998,\n                    195150511219449,\n                    195224591208679,\n                    195323331568844,\n                    196399956208036,\n                    197488865076969,\n                    197645431867085,\n                    197667892486155,\n                    198690669576940,\n                    199129991434152,\n                    200099494106658,\n                    200763792087641,\n                    202246005298761,\n                    202454193719832,\n                    203231046579715,\n                    203642731049900,\n                    204596961192335,\n                    205551931705237,\n                    207512012707137,\n                    207560662478458,\n                    207745988431556,\n                    208169002151386,\n                    208798692991212,\n                    209380169367696,\n                    209686709070155,\n                    209935365580642,\n                    210216741203157,\n                    210731028249650,\n                    211044888949477,\n                    211164963414612,\n                    211432561012148,\n                    211608720186528,\n                    212069282457339,\n                    212165241332190,\n                    213423868189143,\n                    213594793122705,\n                    214603931274555,\n                    214895004823429,\n                    215462220362127,\n                    216515317435923,\n                    217624364104314,\n                    218959868504958,\n                    219332462426643,\n                    219420900711806,\n                    219530707228594,\n                    219983169752798,\n                    220400177029026,\n                    221554546582125,\n                    223834426416688,\n                    224013129740964,\n                    225012348009219,\n                    225262901002064,\n                    225272976988478,\n                    225688512560038,\n                    225729121043728,\n                    225865605063898,\n                    226478191326675,\n                    226490280450555,\n                    226749405843443,\n                    228571438273762,\n                    228659301550674,\n                    230063816731086,\n                    230147740600471,\n                    231131716258590,\n                    231167269732039,\n                    231226956607413,\n                    231434168452327,\n                    231846056194211,\n                    233464870224238,\n                    233897329427385,\n                    234080711761577,\n                    234944418269182,\n                    235139431941673,\n                    236106415795883,\n                    237691017699919,\n                    237692482084117,\n                    238330510293383,\n                    239079001777789,\n                    239310431954774,\n                    239320860931883,\n                    239785978985749,\n                    239829043576634,\n                    241090707457411,\n                    241270093069305,\n                    241852865819133,\n                    242213168881845,\n                    242442058293823,\n                    243586260715005,\n                    244486101538283,\n                    244880293726455,\n                    245267018164948,\n                    245709056012167,\n                    246591135909905,\n                    246682667613431,\n                    246892463978226,\n                    247032392472336,\n                    247065219019444,\n                    247098177223672,\n                    247103593644053,\n                    247271784936594,\n                    247397470910482,\n                    249437105252228,\n                    250385372089026,\n                    251364588008466,\n                    252185328425888,\n                    254645791555521,\n                    255035361284884,\n                    256100243468872,\n                    256264089513587,\n                    260526496756444,\n                    260527113994454,\n                    260632609080480,\n                    260694307191271,\n                    260962806951214,\n                    261567562084725,\n                    262025645329226,\n                    262207826333011,\n                    262252115767644,\n                    262455939936188,\n                    262788436418257,\n                    262946168044586,\n                    264421080266300,\n                    264528896513727,\n                    264647060615723,\n                    265815365072475,\n                    266152688016901,\n                    266413794194257,\n                    267078713918965,\n                    267176377119695,\n                    267190976962390,\n                    267294416108493,\n                    267630676165577,\n                    267927798938957,\n                    269578359283844,\n                    269788172566464,\n                    270531130735056,\n                    271754338938388,\n                    272352526980268,\n                    273148755474859,\n                    273963009929669,\n                    274383394688737,\n                    274823193889498,\n                    275503278029490,\n                    276248461650896,\n                    276614092454373,\n                    278054029097666,\n                    278107042683824,\n                    279140340979356,\n                    280242842017684,\n                    280804489026790,\n                    280958622044268,\n                    283716381550104,\n                    284043008927592,\n                    285957888031159,\n                    286847587035887,\n                    286953696536864,\n                    287220289210373,\n                    287661265777051,\n                    289325450257575,\n                    290604862937111,\n                    290674026441801,\n                    290932091338198,\n                    291083660987511,\n                    291172509721213,\n                    293622260022011,\n                    293991300103064,\n                    295865985002150,\n                    297566393252293,\n                    297619063065931,\n                    297638855027375,\n                    298164502295539,\n                    298353836077639,\n                    298409391465409,\n                    299686419400666,\n                    299769726700118,\n                    300136436050699,\n                    300583122258222,\n                    300710556964575,\n                    301266799261438,\n                    301280787524288,\n                    301527407021198,\n                    301988872005691,\n                    302360612278753,\n                    302656802432509,\n                    304549554050632,\n                    306203041818970,\n                    307080590001213,\n                    307145677617826,\n                    307967534912464,\n                    308150774714909,\n                    308280991213272,\n                    308423591882698,\n                    310277246224302,\n                    310518075637689,\n                    311177999205805,\n                    312376374680562,\n                    312500518005538,\n                    313566577455370,\n                    315379360903532,\n                    315761524455196,\n                    315894474312958,\n                    315915560704609,\n                    317146165008935,\n                    317911096926352,\n                    318149703248740,\n                    318452257301876,\n                    318838378422560,\n                    319002045581712,\n                    319870839054454,\n                    320478308186860,\n                    321581854131598,\n                    323244150688113,\n                    325348339530349,\n                    325401700852377,\n                    325609668529942,\n                    325840322414685,\n                    326362555166202,\n                    327401856042864,\n                    327430526220797,\n                    327717949035640,\n                    327729120445936\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/0107d767a345eff67ecdaed2ee5cd7ba",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453566_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"0107d767a345eff67ecdaed2ee5cd7ba\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    5641354835174,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14062071191653,\n                    14580861632266,\n                    18722876140337,\n                    20714320729467,\n                    22732389403804,\n                    24134363957219,\n                    30606147678309,\n                    30841792132441,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    35413666412010,\n                    37166860055638,\n                    38008340488610,\n                    38631948370393,\n                    38946626358857,\n                    39177463395973,\n                    39396232170068,\n                    40000457533067,\n                    41548684950793,\n                    42975853122398,\n                    43119393989323,\n                    43377695911881,\n                    49367718187361,\n                    49468277378328,\n                    50266038601832,\n                    51636068122286,\n                    56622962479482,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62130354354877,\n                    62702978264830,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    67872638217057,\n                    68827108109263,\n                    69134145403133,\n                    70436552236751,\n                    70880519905358,\n                    78004711377952,\n                    81502993782978,\n                    84636365982041,\n                    85239629151685,\n                    94266407193778,\n                    98142256300701,\n                    98837920540443,\n                    99930975216128,\n                    100653760748845,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    103652023867250,\n                    104130252812879,\n                    112760650992638,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120285237540732,\n                    121866736124647,\n                    122140892054804,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    128261346941417,\n                    130618284885748,\n                    131310062444107,\n                    133580282506938,\n                    139762252968300,\n                    148434659896290,\n                    150472163116319,\n                    151610888790844,\n                    151736593364935,\n                    152145317861349,\n                    154119208822262,\n                    154803963303860,\n                    164146490870545,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173503876669758,\n                    173949973069402,\n                    175345218226732,\n                    175559849681044,\n                    177057739236298,\n                    182134979074863,\n                    185526639726849,\n                    186188120396587,\n                    191078441509481,\n                    191784713609488,\n                    196150349451960,\n                    196584209022550,\n                    196853921592387,\n                    197752504251580,\n                    198597053692927,\n                    200567230796156,\n                    201179164742411,\n                    202960515626517,\n                    203378213499023,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    218586803538885,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    223103766020907,\n                    223436957406949,\n                    225216425962890,\n                    225962923363564,\n                    227026140769845,\n                    227790244540446,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    235385609463388,\n                    235438505061770,\n                    238869764444344,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244786468497109,\n                    247140303430449,\n                    248336783901894,\n                    250357693564448,\n                    253975323975963,\n                    256375919657769,\n                    259301238714261,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    267345873524094,\n                    271342665825792,\n                    274876788032658,\n                    275360996806051,\n                    275711441656065,\n                    276221877341287,\n                    277115529175674,\n                    277862338800417,\n                    280967669495427,\n                    281817613252845,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    289038917997203,\n                    289724862541255,\n                    290309864993733,\n                    294086384353867,\n                    295503963521838,\n                    296966685834878,\n                    299005107402724,\n                    300199234365396,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    305781540735975,\n                    308107503975413,\n                    308473366560206,\n                    311148974624393,\n                    311393227334671,\n                    312856558437716,\n                    314634385460120,\n                    315140251773348,\n                    316147818305256,\n                    317314266550052,\n                    318043998368340,\n                    319121931997971,\n                    324333149672473,\n                    324779561826125,\n                    326855577904572,\n                    327646715321140,\n                    332098363218169,\n                    333944737799563,\n                    334160175766170,\n                    335584394916553,\n                    335971123608722,\n                    336472954791992,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    347580313704916,\n                    348815216366639,\n                    348987115477673,\n                    350399163507829,\n                    357535517122796,\n                    358595265377108,\n                    358821394913517,\n                    359452645935849,\n                    362124977362793,\n                    366354200059782,\n                    366535672236781,\n                    369474755519844,\n                    370249620342175,\n                    372037414685096,\n                    373949557068914,\n                    374319819178480,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    379102542404949,\n                    379241504134406,\n                    379468459802010,\n                    379661395441316,\n                    382035531157070,\n                    383008100523152,\n                    383135333541903,\n                    383850900061929,\n                    384049466048679,\n                    386263487549463,\n                    389141313731258,\n                    390332660259608,\n                    393516543506060,\n                    400967959890432,\n                    401487977714282,\n                    403579902131163,\n                    406955472999822,\n                    408962716867059,\n                    409903018669983,\n                    410861197839878,\n                    414355853800959,\n                    416580890530128,\n                    418934773149726,\n                    419642123579295,\n                    421963163293847,\n                    423404494960378,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    429952924284227,\n                    430664272577516,\n                    432630098291297,\n                    434623968464695,\n                    435267549331128,\n                    435277763415865,\n                    435874505125675,\n                    437654980371254,\n                    438061138128325,\n                    438738288109196,\n                    439177016005977,\n                    445344075816835,\n                    445802335759252,\n                    446710003143163,\n                    447467518423055,\n                    449641727299803,\n                    450058424424520,\n                    450112320572118,\n                    450125274173050,\n                    452241247094714,\n                    452829154656306,\n                    454813132622585,\n                    456174765596578,\n                    456493632715805,\n                    456717723773303,\n                    461156956524045,\n                    462211497323948,\n                    463604028403361,\n                    465228093393002,\n                    466250095735125,\n                    469687793491358,\n                    471922058927200,\n                    472039595540269,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473018780652067,\n                    473772140307174,\n                    474570287539184,\n                    474912397870603,\n                    476325119891604,\n                    476526896773980,\n                    476855560317170,\n                    480232815782455,\n                    484291524803718,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    494276065129917,\n                    495846359323641,\n                    506531113930798,\n                    507871334392190,\n                    508031302306958,\n                    508934816424512,\n                    509939413858428,\n                    510737910464301,\n                    512514768813167,\n                    513350289212553,\n                    517460246914282,\n                    523321188654478,\n                    524296526109332,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    532977797373940,\n                    533221992957154,\n                    533383900955463,\n                    537527309474265,\n                    538136383284668,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    543935720187395,\n                    545273268128445,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    555828795847874,\n                    557285930201258,\n                    558008777268240,\n                    558433475619762,\n                    558892016080993,\n                    559199414492426,\n                    560748186311107,\n                    561604684739024,\n                    562789967643507,\n                    563343385252253,\n                    563775395645616,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572526115602502,\n                    573767900523468,\n                    573851852316852,\n                    576624529060777,\n                    576874504697497,\n                    578856083248351,\n                    579395263040626,\n                    579656586099131,\n                    584217116139474,\n                    587458649504773,\n                    591009756408904,\n                    592792708776319,\n                    592997432856726,\n                    594482884410814,\n                    596004492939074,\n                    596726606390901,\n                    597875929908982,\n                    600179982751750,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605545396594434,\n                    606419362199228,\n                    607833403537880,\n                    609555580824872,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620059729516362,\n                    620849299055244,\n                    621083126852990,\n                    622843084945666,\n                    623088556560813,\n                    627738708322473,\n                    628002002108775,\n                    628967244202734,\n                    630034340392901,\n                    632757066611488,\n                    634340585739407,\n                    634691502028135,\n                    635939425862264,\n                    637603178700210,\n                    637880811482435,\n                    644557275230225,\n                    644935615624623,\n                    645793929303122,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    649351154360370,\n                    653652775436966,\n                    655230244020599,\n                    668170744538822,\n                    670595660720839,\n                    671785773373187,\n                    672641554971634,\n                    672821857332020,\n                    673587502056476,\n                    676044446355190,\n                    677295740685782,\n                    679716691783353,\n                    682874745971459,\n                    682963108550465,\n                    683897063771844,\n                    685246440558482,\n                    686035384279530,\n                    687129162879229,\n                    687440351836027,\n                    688990372747831,\n                    690608944213791,\n                    691680901171966,\n                    694851976547107,\n                    694869046270466,\n                    700054088308311,\n                    701010566680671,\n                    701156706346414,\n                    702431887238370,\n                    702728791577749,\n                    703127461004015,\n                    703460523248065,\n                    705302678110381,\n                    707793984897058,\n                    707799855432305,\n                    707962189637436,\n                    707993631271976,\n                    708854130532070,\n                    710403353214581,\n                    710927468728191,\n                    711091480855740,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    724746920000049,\n                    727030394121071,\n                    727262050490847,\n                    728279662753580,\n                    730854175545196,\n                    731361512976697,\n                    734622692371860,\n                    736290151677476,\n                    737921635760471,\n                    738115824615020,\n                    739389456325310,\n                    742704052187442,\n                    746469097917429,\n                    748064810280445,\n                    749144352424687,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758543555642030,\n                    759083903793759,\n                    761260029175908,\n                    767230586289375,\n                    770167973924874,\n                    770328708409334,\n                    772165475523258,\n                    772947318346532,\n                    774312511311396,\n                    774365323868051,\n                    774964429534347,\n                    775558532281404,\n                    779330069525835,\n                    781344931111517,\n                    787747218685488,\n                    788027556261557,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    797511060014001,\n                    797622366845781,\n                    799257433888961,\n                    800060479182618,\n                    801084876663808,\n                    802340523858506,\n                    803596407436267\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/4e94e60265e04f0763142e20b52c0da1",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_2.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"4e94e60265e04f0763142e20b52c0da1\",\n                \"mins\": [\n                    250486723534,\n                    2508456406617,\n                    3114055682630,\n                    4326583440446,\n                    5166206090659,\n                    5651658843765,\n                    5888422665728,\n                    6103415363614,\n                    6235526594701,\n                    6326519491884,\n                    6878955625210,\n                    7215992153582,\n                    7263583777537,\n                    8395644761685,\n                    9072289775829,\n                    9599933508359,\n                    9851745764538,\n                    9914450265081,\n                    10636634611478,\n                    11078169853920,\n                    11850890474214,\n                    12268586466425,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15424135029274,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17427197239629,\n                    20208369434823,\n                    22648822913198,\n                    23651462508176,\n                    23928516462553,\n                    24474488157758,\n                    25171338917197,\n                    25595537972192,\n                    25977883823029,\n                    26336101344262,\n                    28005085380016,\n                    29426613300325,\n                    30912597140678,\n                    31804114294503,\n                    33283788494941,\n                    34832941612548,\n                    35206157695212,\n                    36608959952536,\n                    36699864848579,\n                    36965258409960,\n                    37923647270157,\n                    38668597630050,\n                    40072538274701,\n                    41051959531050,\n                    41163986984660,\n                    42806708117796,\n                    45549512378900,\n                    46330912571584,\n                    47932899674281,\n                    48305356021361,\n                    48422112851291,\n                    48827478905522,\n                    48988117530884,\n                    49720533077083,\n                    50336770017521,\n                    53853474657507,\n                    54546098460847,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56306387723041,\n                    56789903701800,\n                    60051688191594,\n                    62790957647340,\n                    63034352531495,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64303638595001,\n                    65401240928904,\n                    65659023305314,\n                    65794631590725,\n                    65924385841826,\n                    66254172924766,\n                    67162847056402,\n                    67207262461072,\n                    68027479033630,\n                    69023206404673,\n                    70845832854736,\n                    71648552124359,\n                    72267500733483,\n                    73600562400430,\n                    73600726148081,\n                    73938092731264,\n                    74463348702348,\n                    74757289081889,\n                    76461141982463,\n                    76601650706225,\n                    79332000470232,\n                    80480643670004,\n                    85069188519897,\n                    85513145337736,\n                    86370708776973,\n                    88205744296842,\n                    89385885763749,\n                    90136762486499,\n                    91578872290342,\n                    91791067858367,\n                    91873432718081,\n                    91947365014884,\n                    94086187561813,\n                    94879727048600,\n                    95613743229855,\n                    98324799297724,\n                    98406995764882,\n                    99368955966421,\n                    100718427599813,\n                    102632033433196,\n                    102644142538181,\n                    102882967284023,\n                    104095665010556,\n                    107278977448655,\n                    110162881433718,\n                    112325880172670,\n                    114727586194884,\n                    115711999096223,\n                    115890459170026,\n                    115990086684946,\n                    117509882155020,\n                    118006247672122,\n                    119438611160104,\n                    119862823995471,\n                    120859413131497,\n                    120869469396540,\n                    120965026768103,\n                    120980078369659,\n                    122789260675111,\n                    123464311633543,\n                    124631092323259,\n                    124750192071655,\n                    124948347574890,\n                    125648214305342,\n                    126324422909661,\n                    126386912242740,\n                    126943192152369,\n                    127838593437661,\n                    129104997236940,\n                    129661998661164,\n                    129921574005351,\n                    130381409629549,\n                    131426956400912,\n                    131670610194393,\n                    132320703016655,\n                    133074201429869,\n                    136270510397946,\n                    137011854576215,\n                    137250954972319,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    142846188486668,\n                    143166346620229,\n                    143570389373736,\n                    144015570248215,\n                    146405999815556,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150653874201709,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    153964058113210,\n                    155005702504057,\n                    156275207016386,\n                    156516659025181,\n                    156678666334181,\n                    157146773076591,\n                    158914038640710,\n                    159350162876827,\n                    159359554299317,\n                    159472244264757,\n                    159869778233041,\n                    160225475241462,\n                    161489918754278,\n                    161548850449553,\n                    162966656941363,\n                    163709351584749,\n                    165572906446902,\n                    166605601159467,\n                    167304010117193,\n                    167578307012466,\n                    168412944661902,\n                    169891545961677,\n                    171948018815208,\n                    172888919441360,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    175029718718788,\n                    177264301473978,\n                    177974381583110,\n                    178176094018343,\n                    179921783290284,\n                    180656320447823,\n                    181063160240061,\n                    181257548112038,\n                    181803993639937,\n                    183018746533881,\n                    183449325300818,\n                    184271038362020,\n                    184594169885550,\n                    184752983925284,\n                    185471680685606,\n                    187928842797492,\n                    189442327350789,\n                    189748192026650,\n                    191344453396371,\n                    191379677170076,\n                    192587291169373,\n                    193005890924998,\n                    194065250832376,\n                    194363033520822,\n                    195441337298296,\n                    195793810311093,\n                    197916541706101,\n                    199129991434152,\n                    199438795256574,\n                    199510432035291,\n                    200372412253250,\n                    200404566576199,\n                    200763792087641,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    205495097863124,\n                    206915135800075,\n                    207091233110623,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209010486710646,\n                    209240354662781,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    214695938897851,\n                    214903197314923,\n                    215248629858867,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    218536028897273,\n                    219204102261164,\n                    219891441411753,\n                    219974613748434,\n                    220343480974288,\n                    221554546582125,\n                    221729288627371,\n                    223834426416688,\n                    223984693568096,\n                    225075006031359,\n                    225198908542897,\n                    225259785351827,\n                    225688512560038,\n                    225796963089274,\n                    226620699633185,\n                    228659301550674,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231765455198863,\n                    232016464825731,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234486644060094,\n                    235151438889624,\n                    235231753660795,\n                    237490431789443,\n                    238102472767969,\n                    238536247300230,\n                    238574581938385,\n                    239320860931883,\n                    240958548895043,\n                    242434218139153,\n                    242442058293823,\n                    242559604450370,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247103593644053,\n                    247223650843273,\n                    247271784936594,\n                    248730448052989,\n                    249136603804393,\n                    255250274209015,\n                    256188918759811,\n                    256264089513587,\n                    257140177602265,\n                    258090152932519,\n                    259079953498264,\n                    260567430361426,\n                    261430613863924,\n                    261804172017043,\n                    262102779540056,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263593108768410,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264847443724344,\n                    266537010768292,\n                    269449522688748,\n                    269788172566464,\n                    271375997486305,\n                    273963009929669,\n                    274201125891842,\n                    274383394688737,\n                    275456716615408,\n                    276087711843386,\n                    276171708863992,\n                    276395310963137,\n                    277124038643903,\n                    277967939584293,\n                    278359501970729,\n                    281419217453687,\n                    282627103058306,\n                    283418694026492,\n                    283650389519323,\n                    283716381550104,\n                    285115327004357,\n                    288471586195099,\n                    288630780557211,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    291172509721213,\n                    291901191461589,\n                    293349295644131,\n                    293364784068746,\n                    293460842461919,\n                    293761737980270,\n                    294048628266791,\n                    294309017220579,\n                    297566393252293,\n                    298164502295539,\n                    299495863829841,\n                    299686419400666,\n                    300842773788181,\n                    301280787524288,\n                    304357039915265,\n                    305883937093471,\n                    307125249787970,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    308924696686164,\n                    309853660376897,\n                    310260543915478,\n                    311783912113073,\n                    312655519254570,\n                    313635798098525,\n                    315730568901909,\n                    315766966261328,\n                    316937125480217,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    321890891143490,\n                    322521825476248,\n                    323047827128093,\n                    324351935671697,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    326399280158975,\n                    328158084014937,\n                    330274652031045,\n                    331145279644469,\n                    331872454071816,\n                    335724314867453,\n                    335817092568549,\n                    338300563625880,\n                    338844220006106,\n                    340863683252199,\n                    341662236661817,\n                    341811810483352,\n                    342688543846132,\n                    343279150148526,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    347266825568201,\n                    347767039186779,\n                    348817429227528,\n                    348833845559066,\n                    349622757145996,\n                    350987533382827,\n                    351058626361688,\n                    351589420054826,\n                    354103463961601,\n                    354387066710883,\n                    355561819235138,\n                    355789912870705,\n                    356695205540256,\n                    359175499709959,\n                    359439738386632,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    364345413204186,\n                    365126424210828,\n                    365413280249712,\n                    365934903234669,\n                    366193857397914,\n                    366211725375178,\n                    366388425061942,\n                    369001359438455,\n                    372036972894155,\n                    372119412691335,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    377253494422430,\n                    378570200652257,\n                    378812352248018,\n                    378988928968399,\n                    379202966330246,\n                    379383874861118,\n                    379655211188325,\n                    380132704649033,\n                    381418800043351,\n                    383272102454619,\n                    385418400433017,\n                    385959959345831,\n                    386426924783330,\n                    387084858219758,\n                    387891260768716,\n                    389648404681890,\n                    391093344163451,\n                    391412493497363,\n                    391837889962924,\n                    392637215710013,\n                    393407397414020,\n                    393666094843064,\n                    394549480944907,\n                    394992647600588,\n                    396097144709247,\n                    398018189439516,\n                    398451260178161,\n                    399359713815504,\n                    401258033920475,\n                    401548443050700,\n                    401678403062417,\n                    402467057162382,\n                    403472959967900,\n                    403550823036072,\n                    404003416788822,\n                    404032561117566,\n                    404071682289595,\n                    404160108032790,\n                    404962546496863,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    407839904624528,\n                    408693003864864,\n                    409460547709689,\n                    409964247236589,\n                    410070177508463,\n                    411917287296495,\n                    412738866512772,\n                    412842793028086,\n                    413767389226181,\n                    414678207656526,\n                    416308367178118,\n                    416821154641916,\n                    417458112822963,\n                    417538262642243,\n                    417879179345800\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/60f7e23c24a8d94791cc7a8680c493f9",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2060939_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"60f7e23c24a8d94791cc7a8680c493f9\",\n                \"mins\": [\n                    250486723534,\n                    1276320723000,\n                    2508456406617,\n                    4346223556404,\n                    5651658843765,\n                    5741639512374,\n                    6103415363614,\n                    6382184420000,\n                    7215992153582,\n                    7263583777537,\n                    8230363088713,\n                    8344183384681,\n                    8395644761685,\n                    9599933508359,\n                    9851745764538,\n                    9908321119520,\n                    12179585228825,\n                    12459731847780,\n                    13647323066481,\n                    14563906465922,\n                    15574730969702,\n                    16244571079575,\n                    16852225843359,\n                    17520725293289,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    22648822913198,\n                    22764046638638,\n                    23651462508176,\n                    24455303556700,\n                    25171338917197,\n                    25977883823029,\n                    26336101344262,\n                    26775359856414,\n                    29426613300325,\n                    29429643624977,\n                    29716486194840,\n                    30912597140678,\n                    33283788494941,\n                    34633591199949,\n                    35265151771864,\n                    36608959952536,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37321172331310,\n                    38189684658557,\n                    41051959531050,\n                    41634658763025,\n                    42806708117796,\n                    42941620852116,\n                    43102684986874,\n                    43257012736171,\n                    44469103278173,\n                    45435629568409,\n                    45555150962803,\n                    45778211392090,\n                    46428667877491,\n                    47743166786889,\n                    48827478905522,\n                    48988117530884,\n                    49652906159408,\n                    49720533077083,\n                    51190225926040,\n                    51489867698846,\n                    51681162571203,\n                    53853474657507,\n                    54889967534832,\n                    55129376901201,\n                    55236706250225,\n                    56495629119710,\n                    56789903701800,\n                    58448059219764,\n                    60051688191594,\n                    61585240896556,\n                    63136274461401,\n                    63214224986744,\n                    63227673813565,\n                    63343999371796,\n                    63626796623435,\n                    64098752156766,\n                    64303638595001,\n                    65337560481765,\n                    65794631590725,\n                    65851646271217,\n                    67162847056402,\n                    69927546604113,\n                    71441250280595,\n                    71648552124359,\n                    73938092731264,\n                    74074344499959,\n                    74463348702348,\n                    74757289081889,\n                    75026691722950,\n                    76601650706225,\n                    77594090223745,\n                    80429502208150,\n                    81546812908959,\n                    82700429817161,\n                    83318109425074,\n                    85069188519897,\n                    85513145337736,\n                    85753551939023,\n                    86112424291327,\n                    89385885763749,\n                    89781876394634,\n                    91873432718081,\n                    91947365014884,\n                    93462948799513,\n                    94879727048600,\n                    95613743229855,\n                    97571747840697,\n                    98324799297724,\n                    98775547882506,\n                    100718427599813,\n                    102578745288578,\n                    102873080592435,\n                    104095665010556,\n                    104528709310472,\n                    105986132286860,\n                    106984945037295,\n                    107278977448655,\n                    109551654663245,\n                    109566666231438,\n                    110191507921350,\n                    110549642873812,\n                    112654122078687,\n                    113222445295988,\n                    113854916802784,\n                    116127169502189,\n                    118006247672122,\n                    118237881107424,\n                    118484253796245,\n                    118762763614010,\n                    119358605785829,\n                    119553131858167,\n                    120859413131497,\n                    120965026768103,\n                    120980078369659,\n                    123464311633543,\n                    124449616140151,\n                    124750192071655,\n                    125424514480710,\n                    125614494300765,\n                    125698882792384,\n                    126860824288401,\n                    126943192152369,\n                    129104997236940,\n                    131426956400912,\n                    132369532359260,\n                    133074201429869,\n                    137011854576215,\n                    137250954972319,\n                    137658530991775,\n                    137679443730152,\n                    137980519786988,\n                    140477227833971,\n                    141543030608061,\n                    142846188486668,\n                    143570389373736,\n                    148719934314872,\n                    149220396002677,\n                    150539175563116,\n                    150561506312724,\n                    150889573263592,\n                    151145866287364,\n                    152252932556929,\n                    153277687133191,\n                    153499429746893,\n                    153688480117844,\n                    153830313839310,\n                    154067549446405,\n                    156275207016386,\n                    156643571858026,\n                    159204029141024,\n                    159350162876827,\n                    159359554299317,\n                    159869778233041,\n                    160021373144492,\n                    160225475241462,\n                    162966656941363,\n                    165572906446902,\n                    166307721941863,\n                    166605601159467,\n                    167304010117193,\n                    168412944661902,\n                    168609000755301,\n                    168699625286154,\n                    169208855579907,\n                    169523753644578,\n                    170917904316320,\n                    171143723926121,\n                    171243991312977,\n                    172170767228631,\n                    172842536979187,\n                    173410623132357,\n                    174372829965885,\n                    174438446841118,\n                    174450145080469,\n                    174897648514915,\n                    175029718718788,\n                    177264301473978,\n                    177857889812960,\n                    178176094018343,\n                    179017201157110,\n                    179921783290284,\n                    180059082755493,\n                    180068779789910,\n                    180414262292400,\n                    180740880110572,\n                    181063160240061,\n                    181803993639937,\n                    183449325300818,\n                    183519396664097,\n                    183571182225450,\n                    184752983925284,\n                    185471680685606,\n                    186580476523320,\n                    186949263795931,\n                    187928842797492,\n                    188086202110112,\n                    189442327350789,\n                    190807904035305,\n                    192319726776217,\n                    192393783199254,\n                    192587291169373,\n                    193005890924998,\n                    195786680138999,\n                    195987898533177,\n                    199510432035291,\n                    199650567438286,\n                    199897125905944,\n                    199958856257661,\n                    200763792087641,\n                    200811993081184,\n                    201913688816444,\n                    201955307485122,\n                    202326103927886,\n                    202843502589551,\n                    203310112239143,\n                    203992874733577,\n                    205007299373342,\n                    205495097863124,\n                    205586854488827,\n                    205853306198814,\n                    206336494258543,\n                    208312960758621,\n                    208486516249608,\n                    208894174736915,\n                    209537101018812,\n                    209602683644597,\n                    211653200939905,\n                    212770625795309,\n                    214315498596142,\n                    215248629858867,\n                    215275340873070,\n                    216515317435923,\n                    216552601141275,\n                    217492142374772,\n                    218320196374037,\n                    219891441411753,\n                    220558792511464,\n                    221554546582125,\n                    223198782858602,\n                    223709567417754,\n                    223834426416688,\n                    225075006031359,\n                    225198908542897,\n                    225688512560038,\n                    225796963089274,\n                    226081900407695,\n                    226749405843443,\n                    227730705667335,\n                    228659301550674,\n                    229789874401174,\n                    229886666642258,\n                    229938993635203,\n                    230055660469156,\n                    230147740600471,\n                    231270817858833,\n                    231444506729168,\n                    231765455198863,\n                    231916540191853,\n                    232974725797149,\n                    233437960801696,\n                    233897329427385,\n                    234275508330269,\n                    234373571118961,\n                    234486644060094,\n                    235231753660795,\n                    238102472767969,\n                    238574581938385,\n                    241665428326676,\n                    241990049986130,\n                    242442058293823,\n                    242809521673924,\n                    243357294296588,\n                    245150853931723,\n                    246595821431335,\n                    247062508718898,\n                    247065219019444,\n                    247271784936594,\n                    249136603804393,\n                    250033322896251,\n                    252533523398493,\n                    255869213781995,\n                    256264089513587,\n                    258090152932519,\n                    258801668971304,\n                    259079953498264,\n                    260567430361426,\n                    260653292806033,\n                    261804172017043,\n                    262207826333011,\n                    262946168044586,\n                    263384517647759,\n                    263977675383980,\n                    264421080266300,\n                    264647060615723,\n                    264731207392290,\n                    266537010768292,\n                    270110108859339,\n                    270538381802720,\n                    271375997486305,\n                    274201125891842,\n                    274383394688737,\n                    275533107905672,\n                    276395310963137,\n                    277124038643903,\n                    277403312668335,\n                    280768685536212,\n                    281419217453687,\n                    282461563119931,\n                    283222379262666,\n                    283716381550104,\n                    283753951167536,\n                    286272134191105,\n                    288471586195099,\n                    289215146137768,\n                    290326069414971,\n                    290674026441801,\n                    290751156362843,\n                    291172509721213,\n                    293068286620317,\n                    293122482945702,\n                    293349295644131,\n                    293364784068746,\n                    293446294820727,\n                    293761737980270,\n                    294048628266791,\n                    294285966776959,\n                    294309017220579,\n                    296404313255688,\n                    297267706713144,\n                    297566393252293,\n                    298164502295539,\n                    298353836077639,\n                    299495863829841,\n                    300842773788181,\n                    301280787524288,\n                    302656802432509,\n                    304357039915265,\n                    305166459455071,\n                    305883937093471,\n                    307145677617826,\n                    307432091881382,\n                    308150774714909,\n                    310260543915478,\n                    310265191419295,\n                    311783912113073,\n                    312500518005538,\n                    312655519254570,\n                    313635798098525,\n                    314170569167596,\n                    314916970143294,\n                    315568913490822,\n                    315730568901909,\n                    317389260716692,\n                    318149703248740,\n                    318460348655326,\n                    320108891188997,\n                    321541456700375,\n                    322521825476248,\n                    323284031290836,\n                    323583450074959,\n                    324518564575244,\n                    325840322414685,\n                    325892124255042,\n                    326201156353558,\n                    326362555166202,\n                    328158084014937,\n                    330274652031045,\n                    330565598299916,\n                    331145279644469,\n                    335724314867453,\n                    335817092568549,\n                    335974005310403,\n                    336220685656619,\n                    336260335931378,\n                    336261489349740,\n                    337623845634316,\n                    338300563625880,\n                    338841443768533,\n                    340776015225067,\n                    340863683252199,\n                    341811810483352,\n                    343787907925867,\n                    344460902511425,\n                    345670801284685,\n                    346750065211380,\n                    346830321609431,\n                    348817429227528,\n                    348833845559066,\n                    349270259964100,\n                    353928548293364,\n                    354889737852692,\n                    355561819235138,\n                    359175499709959,\n                    359490965261776,\n                    359811593274454,\n                    361089746785973,\n                    361216987084545,\n                    361245631263122,\n                    362569008281390,\n                    362760391433907,\n                    362947945334808,\n                    363402398844127,\n                    363720834876342,\n                    365152687151188,\n                    366193857397914,\n                    366388425061942,\n                    367512815238907,\n                    368111726415588,\n                    368850056470283,\n                    374792067287126,\n                    374992075674229,\n                    375284658354960,\n                    375915764618946,\n                    376554752523768,\n                    376700955240517,\n                    378988928968399,\n                    379202966330246,\n                    379462778378127,\n                    379937459247959,\n                    380132704649033,\n                    380373432490457,\n                    380778268703892,\n                    381418800043351,\n                    381991699884352,\n                    383272102454619,\n                    385113003923218,\n                    385418400433017,\n                    385755642378984,\n                    386426924783330,\n                    387687866855442,\n                    387891260768716,\n                    391093344163451,\n                    391412493497363,\n                    391913316514326,\n                    393253943410375,\n                    394549480944907,\n                    394868976184257,\n                    394992647600588,\n                    395370668508160,\n                    396097144709247,\n                    398018189439516,\n                    398330770380060,\n                    399359713815504,\n                    400501102903000,\n                    403472959967900,\n                    404003416788822,\n                    404032561117566,\n                    404160108032790,\n                    405248198929679,\n                    405692953243932,\n                    406532712133368,\n                    407674900160241,\n                    409964247236589,\n                    410070177508463,\n                    412243873589964,\n                    415731791994512,\n                    415798442457945,\n                    416308367178118,\n                    417193054089403,\n                    417879179345800,\n                    417958793174431,\n                    418013395365815,\n                    418930712757550,\n                    419080351349759,\n                    421689299055012,\n                    421897504513649,\n                    422317065560637,\n                    423341155346518,\n                    424170930031434,\n                    424684625834342,\n                    425491993925697,\n                    426300532034066,\n                    427562965999248\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/6d6e87e1154e95b279e5e7db414bc37b",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2255622_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"6d6e87e1154e95b279e5e7db414bc37b\",\n                \"mins\": [\n                    215089315280,\n                    291674529868,\n                    659912036083,\n                    736968581505,\n                    944574910739,\n                    1130926917921,\n                    1140383038326,\n                    1224208891333,\n                    1519622976813,\n                    2508456406617,\n                    2726898850574,\n                    2813494374706,\n                    3047015433984,\n                    3835288040828,\n                    4231658739382,\n                    4413003150135,\n                    4870914467521,\n                    5825209928114,\n                    5871893412345,\n                    5888422665728,\n                    6103415363614,\n                    7532547771555,\n                    7594581929652,\n                    7910677492884,\n                    8182315511682,\n                    8230363088713,\n                    8394347595486,\n                    8623700758937,\n                    9739271815773,\n                    9780886482986,\n                    9836834414894,\n                    9946639466383,\n                    10104425650117,\n                    10122980714756,\n                    10229953843845,\n                    11382774219786,\n                    11828070075151,\n                    12099834582305,\n                    12132880780844,\n                    12459731847780,\n                    13935429903706,\n                    14563906465922,\n                    14758098660233,\n                    14761433865384,\n                    14898831781122,\n                    14958876677719,\n                    15317866923606,\n                    15366664740987,\n                    15764118331522,\n                    16115281956116,\n                    16219549320392,\n                    16244571079575,\n                    16363695412769,\n                    16493792210474,\n                    16852225843359,\n                    17503337897524,\n                    18262609533893,\n                    18283839128286,\n                    18393265118408,\n                    18699386411547,\n                    18865536207758,\n                    19653463755059,\n                    20104475080362,\n                    20208369434823,\n                    20957328601299,\n                    20993534689958,\n                    21309387292380,\n                    21678201955671,\n                    22228433882905,\n                    22400017100650,\n                    22481669321537,\n                    22648822913198,\n                    23075126583981,\n                    23473630895827,\n                    24228397245244,\n                    24453017104540,\n                    24729753092003,\n                    25171338917197,\n                    25470086398510,\n                    25859976628720,\n                    26034960602920,\n                    26050630874225,\n                    26811088179302,\n                    26889776861871,\n                    27379618897398,\n                    27579322793320,\n                    27877721210839,\n                    28181374991281,\n                    28987805918116,\n                    29485767733290,\n                    30645532261705,\n                    31018397527996,\n                    31804114294503,\n                    31828073872267,\n                    33174177282046,\n                    33766728674754,\n                    34293559391707,\n                    34865655278433,\n                    35594794270269,\n                    35737327561228,\n                    36023575677863,\n                    36115178283383,\n                    36296573836791,\n                    36648254328139,\n                    36667331783204,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    37722662910660,\n                    38047555790079,\n                    39181335028291,\n                    39315707646191,\n                    39525475121988,\n                    39547908012021,\n                    39569717769426,\n                    39570762134913,\n                    39842830835114,\n                    40131183581621,\n                    40359387471137,\n                    40488805247400,\n                    41051959531050,\n                    41208453811482,\n                    41327552124444,\n                    41731966115950,\n                    41848970534226,\n                    41993387439893,\n                    42240649495469,\n                    42806708117796,\n                    42835572354395,\n                    43361270985506,\n                    43392410013225,\n                    43951532139020,\n                    44251094622336,\n                    44469103278173,\n                    45134133836289,\n                    45162468772898,\n                    45253034750040,\n                    45493022921402,\n                    45549512378900,\n                    45631191923950,\n                    45687888053031,\n                    45961575852560,\n                    46031634263009,\n                    46219814209796,\n                    46408058278807,\n                    46571511322916,\n                    46861475435055,\n                    47081622333494,\n                    47309849454170,\n                    47851830416841,\n                    47932899674281,\n                    47988023254574,\n                    48322895089471,\n                    48721945773460,\n                    49163704568316,\n                    49371043945336,\n                    49686742507605,\n                    49720533077083,\n                    50096835907506,\n                    50270049899306,\n                    50336770017521,\n                    51082727813358,\n                    51528521216274,\n                    51681162571203,\n                    52034584391811,\n                    52210140433416,\n                    53023472863526,\n                    53228660416588,\n                    53853474657507,\n                    54692295414908,\n                    54867740755084,\n                    55129376901201,\n                    55236706250225,\n                    55778862667349,\n                    56306387723041,\n                    56657193003439,\n                    56789903701800,\n                    56799175563515,\n                    58105502805031,\n                    58290341538968,\n                    58337636059748,\n                    58488541968161,\n                    58720502087817,\n                    58840242165831,\n                    59494247622507,\n                    59495718362544,\n                    59981877800655,\n                    60051688191594,\n                    60188262372837,\n                    61494212300278,\n                    61790767178261,\n                    61812779636411,\n                    62099680245497,\n                    62313609143465,\n                    62639365934918,\n                    62662601215791,\n                    62807714707992,\n                    62828283855818,\n                    63129837300858,\n                    63227673813565,\n                    63343999371796,\n                    63511319636084,\n                    63997630844999,\n                    64226287840399,\n                    64303638595001,\n                    64534788908566,\n                    64598408397821,\n                    64641070960034,\n                    64727391334782,\n                    65372884132154,\n                    65555522561100,\n                    65794631590725,\n                    65879475768365,\n                    66208953124276,\n                    66568612075368,\n                    66827922406571,\n                    67207262461072,\n                    67677675064362,\n                    68180164059744,\n                    68439185286494,\n                    68761623640864,\n                    68842406304872,\n                    68983853573191,\n                    69047394343401,\n                    69229098109696,\n                    69531629629596,\n                    69927546604113,\n                    70273121946683,\n                    70649076239339,\n                    72161895027450,\n                    72329350928637,\n                    72384590450660,\n                    72784763566810,\n                    72926015770316,\n                    74185732683200,\n                    74995142431146,\n                    76236574892384,\n                    76899785139431,\n                    76910573567504,\n                    77363880951456,\n                    77435320006613,\n                    77499348917587,\n                    77670697910565,\n                    79332000470232,\n                    79746229389501,\n                    80363874565010,\n                    80429502208150,\n                    80939112789193,\n                    80991804891201,\n                    81459515971071,\n                    81914076163002,\n                    82065184534549,\n                    82105662040805,\n                    82696690432912,\n                    83034887506486,\n                    83178028089512,\n                    83964592793137,\n                    84005077178832,\n                    84558403439851,\n                    84777164098582,\n                    84876046572148,\n                    85223814578728,\n                    85283551436014,\n                    86034559726890,\n                    86181847516411,\n                    86662916902939,\n                    87008362790296,\n                    87264350072268,\n                    87416948371306,\n                    87553087594658,\n                    87706538967451,\n                    88398210557196,\n                    88606942757476,\n                    88724621114355,\n                    89224410019537,\n                    90273256224370,\n                    91706763244181,\n                    92563002307861,\n                    92615551991813,\n                    92670714878004,\n                    92808938741689,\n                    92963671022329,\n                    93402089893230,\n                    93462948799513,\n                    93841830978049,\n                    94123707640329,\n                    94390504905414,\n                    94449201343599,\n                    95108638560446,\n                    95322147890566,\n                    95470737290984,\n                    95613743229855,\n                    96442880942679,\n                    97040758087909,\n                    97246797236254,\n                    97571747840697,\n                    98123090506182,\n                    98179513908619,\n                    98324799297724,\n                    99368955966421,\n                    99569043912575,\n                    99965133914776,\n                    100448234351312,\n                    100689066969619,\n                    100725505255788,\n                    100757191863196,\n                    101455538328968,\n                    101493231099683,\n                    102644142538181,\n                    104091683226971,\n                    104120924444187,\n                    104400591660966,\n                    104446790158566,\n                    104451867849834,\n                    105189561915429,\n                    105717627107319,\n                    106434203474251,\n                    106856438858860,\n                    106984945037295,\n                    107001680275504,\n                    107246503630802,\n                    107335243861817,\n                    109071581673129,\n                    109551654663245,\n                    109694118121197,\n                    111454367428562,\n                    111636058746833,\n                    111788278952703,\n                    112015499236465,\n                    112157193261305,\n                    113163563618295,\n                    113410539288368,\n                    114139175955629,\n                    114307819855046,\n                    114321559757180,\n                    114728471948120,\n                    114903557460790,\n                    114981716237090,\n                    115403886521159,\n                    115650470365123,\n                    115696569747930,\n                    115711999096223,\n                    116127169502189,\n                    116211838271866,\n                    116371477715368,\n                    116556039792279,\n                    116957004714210,\n                    117867146428505,\n                    118484253796245,\n                    118571863639262,\n                    118704354431725,\n                    118762763614010,\n                    118916030730019,\n                    119186746319693,\n                    119349197230465,\n                    119358605785829,\n                    119438611160104,\n                    119698878365483,\n                    121123692554185,\n                    121142462666583,\n                    121528792557620,\n                    121797541557489,\n                    121870306095302,\n                    122149310042087,\n                    123106982277866,\n                    123435887685299,\n                    123601762458621,\n                    123717654821426,\n                    124051214072843,\n                    124342491116643,\n                    124503522875964,\n                    124578586530266,\n                    124587964437913,\n                    124725729653665,\n                    124746422633510,\n                    124750192071655,\n                    124768282727566,\n                    125230114876611,\n                    125321826030016,\n                    127419004886761,\n                    127420241505431,\n                    127838593437661,\n                    128608410656562,\n                    128615562510797,\n                    129136336003338,\n                    129743357585456,\n                    130357183596582,\n                    130449489784288,\n                    130759367637359,\n                    130932431409422,\n                    131114765041506,\n                    131259713485090,\n                    131665899116300,\n                    132696169867812,\n                    133074201429869,\n                    133610721653670,\n                    133658087266350,\n                    133805949970550,\n                    134022643347451,\n                    134180001503169,\n                    134480946295095,\n                    134528309262636,\n                    135813149578002,\n                    136270510397946,\n                    136440932785986,\n                    137225082805595,\n                    138015741692447,\n                    138036515355989,\n                    138868467200948,\n                    139426803069629,\n                    140477227833971,\n                    140758407076546,\n                    140945797534471,\n                    141177726297957,\n                    141990335973972,\n                    142280730309472,\n                    142394166917163,\n                    142866591234977,\n                    143057190215748,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    143918338421151,\n                    143993203989656,\n                    144035717909615,\n                    144099850521047,\n                    144118542916339,\n                    144289220792317,\n                    144756978268718,\n                    145507507293269,\n                    145801993118700,\n                    146036048035532,\n                    147547181493835,\n                    147568633164936,\n                    148265509196629,\n                    148271320739741,\n                    149009140521356,\n                    149400470821791,\n                    149466695315067,\n                    149610030539086,\n                    150525607103853,\n                    151134340913122,\n                    151891421516846,\n                    152173033669992,\n                    152252932556929,\n                    152545355800304,\n                    152763516596482,\n                    152767089713159,\n                    153018942489979,\n                    153277687133191,\n                    153499429746893,\n                    153619074170851,\n                    153688480117844,\n                    153819767075496,\n                    153934077987853,\n                    153964058113210,\n                    154144078574046,\n                    154473683474900,\n                    154504590428422,\n                    154745677105480,\n                    154767139169904,\n                    154792465965192,\n                    155005702504057,\n                    156187447382478,\n                    156337457611871,\n                    156516659025181,\n                    156881462375449,\n                    157486234764096,\n                    157771792852571,\n                    159350162876827,\n                    159359554299317,\n                    159525033588832,\n                    159811833882343,\n                    159833415113099,\n                    160455334711875,\n                    160779614822235,\n                    162184986436543,\n                    162660721679577,\n                    162832799447054,\n                    162966656941363,\n                    163094038630874,\n                    164292320065575,\n                    164730857318871,\n                    164870234246611,\n                    165572906446902,\n                    165599790702978,\n                    166033901816340,\n                    166883822819949,\n                    167007474650516,\n                    167141620488773,\n                    167220419246069,\n                    167368164348954,\n                    167477335839938,\n                    167536779496558,\n                    167578307012466,\n                    167627584385194,\n                    167628267366836,\n                    168279076776929,\n                    168412944661902,\n                    168495462754350\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/b59473c94ff2889eca5d7165936e64b3",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453570_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"b59473c94ff2889eca5d7165936e64b3\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    3558981176698,\n                    3595680864757,\n                    10502027926594,\n                    11550845136154,\n                    12183113567732,\n                    14077774510216,\n                    14958711182794,\n                    18561566035899,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    22816587154347,\n                    23694929505466,\n                    24134363957219,\n                    30606147678309,\n                    31130970675642,\n                    32760645340554,\n                    32914685791800,\n                    33190965408032,\n                    33960067474598,\n                    33972093486205,\n                    36209503859197,\n                    36836491863349,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    40000457533067,\n                    40821822920127,\n                    41548684950793,\n                    42975853122398,\n                    44318001749959,\n                    45220477427487,\n                    47205415940160,\n                    48527209372456,\n                    49367718187361,\n                    50266038601832,\n                    55281399957585,\n                    56622962479482,\n                    57082333339946,\n                    58428533496606,\n                    58971444597606,\n                    59372670276820,\n                    61074441390615,\n                    62702978264830,\n                    63272127345152,\n                    63747523251368,\n                    63753094017459,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    67872638217057,\n                    73961050027324,\n                    74203304881322,\n                    75510673507974,\n                    76301251957108,\n                    77462788932224,\n                    78004711377952,\n                    78593695483794,\n                    86080933269012,\n                    89312085426348,\n                    90302598717534,\n                    92082937491658,\n                    94266407193778,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103640879986045,\n                    106478901668282,\n                    106527047349315,\n                    112760650992638,\n                    114014805629783,\n                    114457599754429,\n                    114719330008227,\n                    114779375695317,\n                    115180661866118,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    128261346941417,\n                    129274485291245,\n                    130190959130109,\n                    130268767097311,\n                    130618284885748,\n                    131165953925337,\n                    133399630293992,\n                    133580282506938,\n                    137807029090583,\n                    139762252968300,\n                    142561908560556,\n                    143304921092381,\n                    144178457349008,\n                    148434659896290,\n                    150519487205401,\n                    154119208822262,\n                    154803963303860,\n                    155829895672627,\n                    156056750199531,\n                    159477189409659,\n                    160949002171461,\n                    163227549897255,\n                    164655854171874,\n                    165496592913298,\n                    165633097778062,\n                    166146331478050,\n                    166719940886532,\n                    166891246324981,\n                    167767324541682,\n                    173367021064967,\n                    173949973069402,\n                    175559849681044,\n                    176037192436786,\n                    181359032563838,\n                    181452042206456,\n                    182593899788192,\n                    185485707281703,\n                    186607121994479,\n                    188106044596447,\n                    191078441509481,\n                    194214915999879,\n                    194881073215824,\n                    196584209022550,\n                    198409930440501,\n                    199577187021953,\n                    200567230796156,\n                    202981877464187,\n                    208004490729476,\n                    210822710165852,\n                    211216538377500,\n                    211915017282095,\n                    215418355892998,\n                    215493649182712,\n                    215607106913801,\n                    216444054660744,\n                    219619606513837,\n                    221322641419906,\n                    221692515333150,\n                    222646058515199,\n                    225216425962890,\n                    225962923363564,\n                    225980008558421,\n                    228170423512561,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    233393853088183,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    238537875199759,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242838856557679,\n                    244255726983140,\n                    248336783901894,\n                    248851248559212,\n                    250357693564448,\n                    255343715369709,\n                    256375919657769,\n                    258616504685066,\n                    260212336791624,\n                    265736169322750,\n                    265781739304017,\n                    267345873524094,\n                    270071179263543,\n                    271342665825792,\n                    274122990498640,\n                    275360996806051,\n                    280967669495427,\n                    281897628539431,\n                    282200323162036,\n                    282342999530487,\n                    283830758206802,\n                    284620358398045,\n                    285925400570356,\n                    286736038466698,\n                    294086384353867,\n                    296514059807299,\n                    296966685834878,\n                    298791773277565,\n                    299005107402724,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    302667628736144,\n                    304085672582189,\n                    306426014688347,\n                    308473366560206,\n                    312407681513044,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    326855577904572,\n                    329899680983199,\n                    330331027273450,\n                    332098363218169,\n                    333944737799563,\n                    335174317746616,\n                    335584394916553,\n                    336702934772821,\n                    337731129151000,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    345448918397261,\n                    345460489054988,\n                    345741054833297,\n                    345875303722758,\n                    348815216366639,\n                    350399163507829,\n                    351292962170419,\n                    351636183165646,\n                    352167543743049,\n                    357535517122796,\n                    358375425017902,\n                    358595265377108,\n                    359452645935849,\n                    362124977362793,\n                    366535672236781,\n                    369461062038057,\n                    374615513078797,\n                    374673872059460,\n                    375780195152331,\n                    376434056729415,\n                    378592360993657,\n                    379102542404949,\n                    382035531157070,\n                    383135333541903,\n                    383850900061929,\n                    386263487549463,\n                    388013701783741,\n                    390332660259608,\n                    391711331432850,\n                    393516543506060,\n                    395113186430911,\n                    398353486663867,\n                    400967959890432,\n                    401487977714282,\n                    408778667923133,\n                    408962716867059,\n                    410861197839878,\n                    414355853800959,\n                    416391446838305,\n                    416580890530128,\n                    417681898958140,\n                    418835159902566,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424596150389604,\n                    427230335237565,\n                    427962000123701,\n                    428646049860395,\n                    429952924284227,\n                    430664272577516,\n                    432118521614652,\n                    434109604325888,\n                    435267549331128,\n                    435940587843567,\n                    446481351575757,\n                    447467518423055,\n                    449803315024875,\n                    450112320572118,\n                    452241247094714,\n                    452829154656306,\n                    453367679371415,\n                    454813132622585,\n                    456493632715805,\n                    456717723773303,\n                    457632835991147,\n                    460076260875464,\n                    461156956524045,\n                    461171986063800,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    471195319432894,\n                    471546567533879,\n                    471922058927200,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473794754684632,\n                    476325119891604,\n                    476526896773980,\n                    477517713088633,\n                    480403157013579,\n                    482503820391550,\n                    484680531927015,\n                    485278877010947,\n                    487131235164323,\n                    487732314724511,\n                    488524886279546,\n                    491715999174683,\n                    495846359323641,\n                    506531113930798,\n                    510251560588775,\n                    510737910464301,\n                    512448947565770,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518629934480933,\n                    520568397104333,\n                    525382873389847,\n                    525762219690878,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530515351265560,\n                    534461213463332,\n                    538939534540869,\n                    539614362293141,\n                    539777176029418,\n                    539873986742508,\n                    540921382222017,\n                    541186981810837,\n                    543935720187395,\n                    545273268128445,\n                    546633122974996,\n                    549484636278027,\n                    551381720133873,\n                    553977959695484,\n                    555321949850378,\n                    556847877286431,\n                    558032616210722,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    561604684739024,\n                    564616206473372,\n                    565020390122451,\n                    568901431510366,\n                    572186073828265,\n                    573767900523468,\n                    573851852316852,\n                    576313152716444,\n                    576624529060777,\n                    576874504697497,\n                    577153916453262,\n                    578224661471458,\n                    578856083248351,\n                    579656586099131,\n                    583350333207780,\n                    584217116139474,\n                    587065796103120,\n                    587669535192483,\n                    592792708776319,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    600583358156891,\n                    601000534535072,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612640334623643,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    620849299055244,\n                    621083126852990,\n                    627738708322473,\n                    628967244202734,\n                    629396495678046,\n                    630034340392901,\n                    632152787169751,\n                    632757066611488,\n                    635939425862264,\n                    640549605471712,\n                    641596035529063,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    648990703275660,\n                    649351154360370,\n                    650654068363343,\n                    655230244020599,\n                    657226217132416,\n                    657355507140185,\n                    662135736889575,\n                    663462366932727,\n                    665636043678921,\n                    667342688777044,\n                    668170744538822,\n                    670595660720839,\n                    672641554971634,\n                    676044446355190,\n                    677261185301275,\n                    677295740685782,\n                    677738022893547,\n                    679186583662682,\n                    681266465716475,\n                    682874745971459,\n                    683897063771844,\n                    685746125867239,\n                    686035384279530,\n                    686106466488739,\n                    687211424722853,\n                    688990372747831,\n                    691020029667905,\n                    691680901171966,\n                    694869046270466,\n                    700054088308311,\n                    700366400626315,\n                    701010566680671,\n                    702400887447953,\n                    702728791577749,\n                    703127461004015,\n                    704335484663791,\n                    705302678110381,\n                    706832134097576,\n                    707962189637436,\n                    710403353214581,\n                    712661928452840,\n                    715334925158742,\n                    715377268215567,\n                    715896323316677,\n                    716020219332683,\n                    716091343321154,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    723332805980528,\n                    724621545164802,\n                    726012427583803,\n                    726271575466251,\n                    727030394121071,\n                    731361512976697,\n                    733617713228542,\n                    734622692371860,\n                    736290151677476,\n                    736566880750337,\n                    739389456325310,\n                    742704052187442,\n                    745420507633982,\n                    746469097917429,\n                    747026339202991,\n                    748064810280445,\n                    753113822684627,\n                    753423569783277,\n                    755196264392026,\n                    758186007844395,\n                    758453303481943,\n                    758543555642030,\n                    759237826018133,\n                    770328708409334,\n                    771613473168408,\n                    772165475523258,\n                    773304776019517,\n                    774312511311396,\n                    774594040074891,\n                    774964429534347,\n                    777891987478900,\n                    779330069525835,\n                    782210000583365,\n                    783959071612606,\n                    785243161415867,\n                    788027556261557,\n                    788033647567963,\n                    788617127284627,\n                    789488280089338,\n                    790211243959626,\n                    790890494413778,\n                    792003960897692,\n                    792629819473398,\n                    794276713525849,\n                    796762144732626,\n                    797622366845781,\n                    800060479182618,\n                    802951804704904,\n                    804618913432196,\n                    806028047443770,\n                    806167606439428,\n                    811884284377466\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/f0c834bc306651d2b9321fb21d3e8d8f",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR453569_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f0c834bc306651d2b9321fb21d3e8d8f\",\n                \"mins\": [\n                    1877811749,\n                    1339603207230,\n                    2756695559996,\n                    3017280732468,\n                    8798248946328,\n                    11352616080698,\n                    11550845136154,\n                    12183113567732,\n                    14718047586080,\n                    15518147513869,\n                    17682163834920,\n                    18029472307723,\n                    18722876140337,\n                    20383834887770,\n                    20714320729467,\n                    22732389403804,\n                    23126533024618,\n                    24134363957219,\n                    25105646732171,\n                    27426095011341,\n                    28889287639316,\n                    31130970675642,\n                    32760645340554,\n                    33190965408032,\n                    33960067474598,\n                    34376317340737,\n                    35413666412010,\n                    38631948370393,\n                    38946626358857,\n                    39396232170068,\n                    41548684950793,\n                    42975853122398,\n                    43333283576538,\n                    43797826300341,\n                    44182822842357,\n                    49367718187361,\n                    50266038601832,\n                    51459351831459,\n                    52459209483030,\n                    54096036790222,\n                    54938371268946,\n                    56622962479482,\n                    58428533496606,\n                    58910287066672,\n                    58971444597606,\n                    59372670276820,\n                    59452528403612,\n                    61074441390615,\n                    62424408278746,\n                    62652142008211,\n                    62702978264830,\n                    63747523251368,\n                    63814532420394,\n                    64430859773984,\n                    65419869837915,\n                    65663647257358,\n                    65853715307230,\n                    67872638217057,\n                    70880519905358,\n                    73961050027324,\n                    75833178093944,\n                    78004711377952,\n                    89046548749891,\n                    91970793441325,\n                    92082937491658,\n                    94266407193778,\n                    97059945956107,\n                    98837920540443,\n                    102082282949673,\n                    102530908835648,\n                    103010972337870,\n                    103329805967682,\n                    106511667935863,\n                    109026157607570,\n                    112505435116132,\n                    112760650992638,\n                    114014388557103,\n                    114457599754429,\n                    114779375695317,\n                    115796389594898,\n                    117864921668170,\n                    119763283100790,\n                    119998700438175,\n                    120411948814896,\n                    121866736124647,\n                    122995254140976,\n                    123065069359489,\n                    123405856681590,\n                    123453159722404,\n                    126427982409537,\n                    127302670329760,\n                    128261346941417,\n                    129274485291245,\n                    130268767097311,\n                    130618284885748,\n                    130680267494321,\n                    131310062444107,\n                    132907013766936,\n                    133399630293992,\n                    133580282506938,\n                    137450930961952,\n                    139762252968300,\n                    140619106750418,\n                    142615782998151,\n                    143304921092381,\n                    145203869062483,\n                    148434659896290,\n                    150519487205401,\n                    151659316769984,\n                    154119208822262,\n                    154803963303860,\n                    155091361216035,\n                    156355255647409,\n                    163227549897255,\n                    163905808341739,\n                    166116061393073,\n                    166146331478050,\n                    166719940886532,\n                    173367021064967,\n                    173468574347604,\n                    175559849681044,\n                    176037192436786,\n                    179129454015522,\n                    179606648877738,\n                    179956173397439,\n                    181175315330322,\n                    186188120396587,\n                    189162728773831,\n                    191078441509481,\n                    196150349451960,\n                    196584209022550,\n                    198409930440501,\n                    198597053692927,\n                    200509345911594,\n                    200567230796156,\n                    202960515626517,\n                    202981877464187,\n                    210625558705034,\n                    210822710165852,\n                    211915017282095,\n                    213613291536686,\n                    215418355892998,\n                    216444054660744,\n                    216772483699428,\n                    219619606513837,\n                    220138017981065,\n                    221322641419906,\n                    221692515333150,\n                    223103766020907,\n                    223308827351122,\n                    225216425962890,\n                    225962923363564,\n                    227654478699541,\n                    228251083676258,\n                    231710804058239,\n                    233288106176435,\n                    234913577321459,\n                    235385609463388,\n                    235438505061770,\n                    236606915867400,\n                    239420157045937,\n                    241121021240187,\n                    241671335688938,\n                    242779977866708,\n                    242838856557679,\n                    244255726983140,\n                    244860991440151,\n                    245130313552765,\n                    248336783901894,\n                    248851248559212,\n                    248993151758694,\n                    250357693564448,\n                    250433703280235,\n                    258315509760939,\n                    259301238714261,\n                    259835033542287,\n                    264753634717119,\n                    265736169322750,\n                    265781739304017,\n                    266725362494513,\n                    266888647546888,\n                    268179213976013,\n                    269644108985416,\n                    271342665825792,\n                    273193300451366,\n                    274122990498640,\n                    274876788032658,\n                    275360996806051,\n                    275543995846992,\n                    276221877341287,\n                    277132191503183,\n                    277862338800417,\n                    278212913088609,\n                    280877794706788,\n                    281897628539431,\n                    282200323162036,\n                    284620358398045,\n                    284881057128884,\n                    285925400570356,\n                    286555216056228,\n                    286736038466698,\n                    288091651180818,\n                    289724862541255,\n                    290309864993733,\n                    290388809460443,\n                    294086384353867,\n                    296966685834878,\n                    299515181711806,\n                    300617258525997,\n                    301443933468348,\n                    301510670432750,\n                    302667628736144,\n                    307413790961671,\n                    308473366560206,\n                    309227573740883,\n                    312587803039400,\n                    312856558437716,\n                    316147818305256,\n                    317314266550052,\n                    319121931997971,\n                    326855577904572,\n                    328849372415869,\n                    329418197512975,\n                    331238400730017,\n                    332098363218169,\n                    333944737799563,\n                    334843701246736,\n                    335584394916553,\n                    335971123608722,\n                    338443948117005,\n                    338762957149102,\n                    341091055062112,\n                    341724341043975,\n                    343240684449173,\n                    344010897833199,\n                    345196014534640,\n                    346077313264359,\n                    346299646639688,\n                    348815216366639,\n                    350399163507829,\n                    352167543743049,\n                    357535517122796,\n                    358595265377108,\n                    359452645935849,\n                    360947577332752,\n                    362124977362793,\n                    362617542158239,\n                    364155736950907,\n                    365659628340646,\n                    366535672236781,\n                    367226803013763,\n                    369117201073175,\n                    369325291998224,\n                    369559687694957,\n                    374609596539290,\n                    374615513078797,\n                    375780195152331,\n                    376434056729415,\n                    377398322708389,\n                    379102542404949,\n                    381336562045153,\n                    382035531157070,\n                    383850900061929,\n                    384211196611467,\n                    386263487549463,\n                    388499765349836,\n                    390332660259608,\n                    391711331432850,\n                    392351813514281,\n                    393516543506060,\n                    394623284964953,\n                    394996681358473,\n                    401487977714282,\n                    406196060040394,\n                    408778667923133,\n                    408962716867059,\n                    410071124049598,\n                    410861197839878,\n                    414355853800959,\n                    415194310967331,\n                    416580890530128,\n                    418088879972183,\n                    421486950473329,\n                    421963163293847,\n                    423404494960378,\n                    423671730243916,\n                    424303224424616,\n                    424577144701529,\n                    427230335237565,\n                    429952924284227,\n                    430583031413630,\n                    430664272577516,\n                    434328269700792,\n                    435267549331128,\n                    436479092642625,\n                    437123713564004,\n                    437654980371254,\n                    437948315733142,\n                    447467518423055,\n                    448817550923236,\n                    450058424424520,\n                    450112320572118,\n                    451622661916081,\n                    452195530667530,\n                    452241247094714,\n                    453735785331029,\n                    456493632715805,\n                    456717723773303,\n                    457996242151684,\n                    458057319849877,\n                    460076260875464,\n                    461156956524045,\n                    461276801535123,\n                    463604028403361,\n                    464552508115793,\n                    466250095735125,\n                    469687793491358,\n                    470135419109892,\n                    471546567533879,\n                    471922058927200,\n                    472365458755346,\n                    472566025949945,\n                    472595419353109,\n                    472977022618999,\n                    473082557541180,\n                    476325119891604,\n                    476526896773980,\n                    480177741395295,\n                    484639189320920,\n                    484680531927015,\n                    484810950748951,\n                    485278877010947,\n                    487732314724511,\n                    491715999174683,\n                    493125876509773,\n                    495846359323641,\n                    498279238790238,\n                    508031302306958,\n                    509308758440423,\n                    510251560588775,\n                    513350289212553,\n                    517460246914282,\n                    517460549689617,\n                    518525721488903,\n                    519307267967594,\n                    519375222893422,\n                    520006459875423,\n                    520568397104333,\n                    523796133390380,\n                    525331047566316,\n                    525382873389847,\n                    525443969024288,\n                    525762219690878,\n                    526111205078257,\n                    527062179866457,\n                    527591752682839,\n                    527920198105606,\n                    530316966667021,\n                    533221992957154,\n                    533383900955463,\n                    538939534540869,\n                    539777176029418,\n                    539873986742508,\n                    540252372548066,\n                    542883591758496,\n                    543935720187395,\n                    544910970844098,\n                    545273268128445,\n                    551381720133873,\n                    553977959695484,\n                    555273679362469,\n                    555321949850378,\n                    555828795847874,\n                    556910957763276,\n                    557285930201258,\n                    558358197797024,\n                    558433475619762,\n                    558892016080993,\n                    559842863132219,\n                    559954430933840,\n                    564616206473372,\n                    565020390122451,\n                    566114305025384,\n                    568901431510366,\n                    572068367820350,\n                    572864932706448,\n                    573767900523468,\n                    573851852316852,\n                    576110831795731,\n                    576624529060777,\n                    576874504697497,\n                    578416100451701,\n                    579421699692764,\n                    579748224601908,\n                    583346960664570,\n                    583458377899774,\n                    584217116139474,\n                    585039308609199,\n                    587065796103120,\n                    591244122623354,\n                    592792708776319,\n                    592997432856726,\n                    593102065246006,\n                    597768472044703,\n                    600179982751750,\n                    601440269988372,\n                    601603906866038,\n                    602082770371066,\n                    604883041984487,\n                    605527960069793,\n                    606419362199228,\n                    607649938708299,\n                    609609500753196,\n                    611579272742038,\n                    612206643585093,\n                    612318401334000,\n                    612821302220884,\n                    617021904160724,\n                    617244669177560,\n                    617309228629787,\n                    618709483466270,\n                    618889806182696,\n                    620059729516362,\n                    621083126852990,\n                    621271411830233,\n                    623252370242796,\n                    626526286339314,\n                    628967244202734,\n                    630034340392901,\n                    631029322236360,\n                    632757066611488,\n                    632818738426364,\n                    634691502028135,\n                    635939425862264,\n                    635969932055283,\n                    639610417638976,\n                    639710605455165,\n                    644557275230225,\n                    645793929303122,\n                    646696401012575,\n                    646731502743275,\n                    646973138978211,\n                    647900742708077,\n                    648194556986076,\n                    649351154360370,\n                    649391604242707,\n                    652455823903591,\n                    655230244020599,\n                    657355507140185,\n                    663985456931184,\n                    668589629748046,\n                    670146496451272,\n                    670595660720839,\n                    672641554971634,\n                    673587502056476,\n                    676044446355190,\n                    677201890824346,\n                    677261185301275,\n                    678303154208507,\n                    678412732753910,\n                    680941268401052,\n                    681266465716475,\n                    682209634532220,\n                    682874745971459,\n                    683897063771844,\n                    686035384279530,\n                    686106466488739,\n                    688990372747831,\n                    691680901171966,\n                    694869046270466,\n                    698831566328784,\n                    701010566680671,\n                    703127461004015,\n                    705095159614137,\n                    705302678110381,\n                    705440295396070,\n                    707962189637436,\n                    712128120373858,\n                    712530228579255,\n                    712661928452840,\n                    715334925158742,\n                    715763419567022,\n                    715896323316677,\n                    717568681000032,\n                    717790011003345,\n                    719139881875323,\n                    722537026567926,\n                    722774506110892,\n                    723332805980528,\n                    724621545164802,\n                    725530359226083,\n                    726271575466251,\n                    726644962313888,\n                    727030394121071,\n                    731361512976697,\n                    733555199906207,\n                    733617713228542,\n                    734622692371860,\n                    735916499223944,\n                    736290151677476\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/.sbt.v5_mhmt/f71e78178af9e45e6f1d87a0c53c465c",
    "content": "[\n    {\n        \"class\": \"sourmash_signature\",\n        \"email\": \"titus@idyll.org\",\n        \"filename\": \"SRR2241509_1.fastq.gz\",\n        \"hash_function\": \"0.murmur64\",\n        \"signatures\": [\n            {\n                \"ksize\": 31,\n                \"max_hash\": 0,\n                \"md5sum\": \"f71e78178af9e45e6f1d87a0c53c465c\",\n                \"mins\": [\n                    60400386987,\n                    823577066500,\n                    1519622976813,\n                    2099558230394,\n                    2198288153123,\n                    3973909611528,\n                    4586034465171,\n                    5888422665728,\n                    6302757725882,\n                    6367937204658,\n                    7215992153582,\n                    7669958619476,\n                    8230363088713,\n                    9707684064301,\n                    9739271815773,\n                    9780886482986,\n                    11021715939935,\n                    11850890474214,\n                    12099834582305,\n                    13092799901887,\n                    13225001158920,\n                    13609959198971,\n                    14354310516423,\n                    14563906465922,\n                    14571059560222,\n                    14645306127358,\n                    16310340704441,\n                    16958276389988,\n                    17219579204110,\n                    17953084754017,\n                    19959151374003,\n                    20208369434823,\n                    21248632255890,\n                    21852731993169,\n                    22648822913198,\n                    23058172043183,\n                    23576662356304,\n                    23829375645561,\n                    25261795703932,\n                    29548113152218,\n                    29602469588352,\n                    30665779043560,\n                    30901584804357,\n                    30912597140678,\n                    31255720474308,\n                    31828073872267,\n                    32047005497326,\n                    32455199900939,\n                    35265151771864,\n                    35504563643595,\n                    36618240038591,\n                    36699864848579,\n                    36954802965156,\n                    36965258409960,\n                    38152902047267,\n                    38189684658557,\n                    38758196129412,\n                    39368843530690,\n                    41051959531050,\n                    41208453811482,\n                    42201185214133,\n                    43593801431999,\n                    44253524153058,\n                    44436694084066,\n                    44697291364213,\n                    44698336514963,\n                    44976567584701,\n                    45391001008294,\n                    46515523354690,\n                    46816178877796,\n                    47731774762880,\n                    48595334402758,\n                    49021979265101,\n                    49371043945336,\n                    49676482222915,\n                    49720533077083,\n                    49845812873381,\n                    50863756953274,\n                    51528521216274,\n                    51681162571203,\n                    52832061642195,\n                    55129376901201,\n                    58290341538968,\n                    58895316100455,\n                    58986967295710,\n                    59831458885832,\n                    60629989873712,\n                    60862427199268,\n                    61311934374427,\n                    61741300517625,\n                    62998796549670,\n                    63214224986744,\n                    63436550394145,\n                    65555522561100,\n                    65924385841826,\n                    66014450404167,\n                    68106503958474,\n                    68361070361240,\n                    68429622395163,\n                    69531629629596,\n                    69669816952364,\n                    69834076734040,\n                    69867726565078,\n                    70390489655010,\n                    72161895027450,\n                    74627935126284,\n                    75599412151037,\n                    76910573567504,\n                    76990092374193,\n                    77823679358184,\n                    79920934493212,\n                    81153675749737,\n                    83034887506486,\n                    83541004870527,\n                    84117257683706,\n                    84510016212982,\n                    84558403439851,\n                    84566106541648,\n                    84869605041559,\n                    85020470139133,\n                    86408814513897,\n                    86689484146462,\n                    87496267274159,\n                    87553087594658,\n                    89031341868186,\n                    89224410019537,\n                    90968099687792,\n                    91947365014884,\n                    92560475806357,\n                    92705312571767,\n                    92963671022329,\n                    94042470128938,\n                    94981444614992,\n                    95346285931614,\n                    95613743229855,\n                    96073201994886,\n                    97403829495106,\n                    98324799297724,\n                    98335693463023,\n                    98358008337001,\n                    98513632733989,\n                    98581447863023,\n                    99240980237734,\n                    100665877566078,\n                    100757191863196,\n                    100874197486354,\n                    101402668545174,\n                    102523882340550,\n                    103837073195515,\n                    104511770485165,\n                    104976980796599,\n                    106376197021301,\n                    106790594595842,\n                    106856438858860,\n                    107075008219968,\n                    107270211710572,\n                    108522499772179,\n                    108796977261490,\n                    109072458044113,\n                    110973691690640,\n                    111597811721701,\n                    111852579406785,\n                    112098834290105,\n                    112854535715471,\n                    113100360362644,\n                    113532609924883,\n                    113707672644737,\n                    115222086224134,\n                    115902936575572,\n                    116875710241107,\n                    117439434128933,\n                    118237881107424,\n                    118484253796245,\n                    118577458244101,\n                    118704354431725,\n                    118762763614010,\n                    120403562403398,\n                    123085302630219,\n                    124236663214303,\n                    124503522875964,\n                    124750192071655,\n                    127838593437661,\n                    129008119673637,\n                    129500120619911,\n                    130386592519852,\n                    130916995773652,\n                    131868928947612,\n                    132342877083990,\n                    132696169867812,\n                    133177175428260,\n                    134940238499518,\n                    136270510397946,\n                    138015741692447,\n                    139617655113359,\n                    140742957630633,\n                    141060355139271,\n                    141727722067525,\n                    143216550143306,\n                    143658189518846,\n                    143892245050508,\n                    144524559656528,\n                    145048941926910,\n                    145358524676284,\n                    145801993118700,\n                    146147941959569,\n                    146197332642273,\n                    147298094626620,\n                    148132313295676,\n                    148271320739741,\n                    149246624631496,\n                    149412030697401,\n                    149428289783056,\n                    149878295612908,\n                    150300472338716,\n                    150498142033726,\n                    150606394548784,\n                    151891421516846,\n                    152252932556929,\n                    152472674447245,\n                    153018942489979,\n                    153041570427833,\n                    153261172171064,\n                    153499429746893,\n                    153688480117844,\n                    154721599478608,\n                    156275207016386,\n                    156516659025181,\n                    156643571858026,\n                    157408350370825,\n                    159359554299317,\n                    159796078446483,\n                    159833415113099,\n                    159910575077486,\n                    160351486834693,\n                    161939629643864,\n                    161940609986387,\n                    162704932949945,\n                    163068263480786,\n                    164511747855159,\n                    164647714000312,\n                    164794299381545,\n                    165210023048822,\n                    165572906446902,\n                    167086347826855,\n                    167141620488773,\n                    167220419246069,\n                    168279076776929,\n                    168412944661902,\n                    168499688420518,\n                    168588153181670,\n                    168632649534409,\n                    170442460802606,\n                    171201369635525,\n                    172053856709804,\n                    172169121265773,\n                    172775324389923,\n                    174450145080469,\n                    174885454236600,\n                    175626124736457,\n                    176179703984274,\n                    177264301473978,\n                    177275301905938,\n                    177917847980823,\n                    177974381583110,\n                    178636928206636,\n                    180068779789910,\n                    181013251409814,\n                    184142039382455,\n                    184752983925284,\n                    185343297638823,\n                    186689460295987,\n                    186949263795931,\n                    187443322053286,\n                    188174311614794,\n                    190190643958498,\n                    190435386968577,\n                    191505075402719,\n                    192587291169373,\n                    192985634484457,\n                    193005890924998,\n                    195150511219449,\n                    195224591208679,\n                    195323331568844,\n                    196399956208036,\n                    197488865076969,\n                    197645431867085,\n                    197667892486155,\n                    198690669576940,\n                    199129991434152,\n                    200099494106658,\n                    200763792087641,\n                    202246005298761,\n                    202454193719832,\n                    203231046579715,\n                    203642731049900,\n                    204596961192335,\n                    205551931705237,\n                    207512012707137,\n                    207560662478458,\n                    207745988431556,\n                    208169002151386,\n                    208798692991212,\n                    209380169367696,\n                    209686709070155,\n                    209935365580642,\n                    210216741203157,\n                    210731028249650,\n                    211044888949477,\n                    211164963414612,\n                    211432561012148,\n                    211608720186528,\n                    212069282457339,\n                    212165241332190,\n                    213423868189143,\n                    213594793122705,\n                    214603931274555,\n                    214895004823429,\n                    215462220362127,\n                    216515317435923,\n                    217624364104314,\n                    218959868504958,\n                    219332462426643,\n                    219420900711806,\n                    219530707228594,\n                    219983169752798,\n                    220400177029026,\n                    221554546582125,\n                    223834426416688,\n                    224013129740964,\n                    225012348009219,\n                    225262901002064,\n                    225272976988478,\n                    225688512560038,\n                    225729121043728,\n                    225865605063898,\n                    226478191326675,\n                    226490280450555,\n                    226749405843443,\n                    228571438273762,\n                    228659301550674,\n                    230063816731086,\n                    230147740600471,\n                    231131716258590,\n                    231167269732039,\n                    231226956607413,\n                    231434168452327,\n                    231846056194211,\n                    233464870224238,\n                    233897329427385,\n                    234080711761577,\n                    234944418269182,\n                    235139431941673,\n                    236106415795883,\n                    237691017699919,\n                    237692482084117,\n                    238330510293383,\n                    239079001777789,\n                    239310431954774,\n                    239320860931883,\n                    239785978985749,\n                    239829043576634,\n                    241090707457411,\n                    241270093069305,\n                    241852865819133,\n                    242213168881845,\n                    242442058293823,\n                    243586260715005,\n                    244486101538283,\n                    244880293726455,\n                    245267018164948,\n                    245709056012167,\n                    246591135909905,\n                    246682667613431,\n                    246892463978226,\n                    247032392472336,\n                    247065219019444,\n                    247098177223672,\n                    247103593644053,\n                    247271784936594,\n                    247397470910482,\n                    249437105252228,\n                    250385372089026,\n                    251364588008466,\n                    252185328425888,\n                    254645791555521,\n                    255035361284884,\n                    256100243468872,\n                    256264089513587,\n                    260526496756444,\n                    260527113994454,\n                    260632609080480,\n                    260694307191271,\n                    260962806951214,\n                    261567562084725,\n                    262025645329226,\n                    262207826333011,\n                    262252115767644,\n                    262455939936188,\n                    262788436418257,\n                    262946168044586,\n                    264421080266300,\n                    264528896513727,\n                    264647060615723,\n                    265815365072475,\n                    266152688016901,\n                    266413794194257,\n                    267078713918965,\n                    267176377119695,\n                    267190976962390,\n                    267294416108493,\n                    267630676165577,\n                    267927798938957,\n                    269578359283844,\n                    269788172566464,\n                    270531130735056,\n                    271754338938388,\n                    272352526980268,\n                    273148755474859,\n                    273963009929669,\n                    274383394688737,\n                    274823193889498,\n                    275503278029490,\n                    276248461650896,\n                    276614092454373,\n                    278054029097666,\n                    278107042683824,\n                    279140340979356,\n                    280242842017684,\n                    280804489026790,\n                    280958622044268,\n                    283716381550104,\n                    284043008927592,\n                    285957888031159,\n                    286847587035887,\n                    286953696536864,\n                    287220289210373,\n                    287661265777051,\n                    289325450257575,\n                    290604862937111,\n                    290674026441801,\n                    290932091338198,\n                    291083660987511,\n                    291172509721213,\n                    293622260022011,\n                    293991300103064,\n                    295865985002150,\n                    297566393252293,\n                    297619063065931,\n                    297638855027375,\n                    298164502295539,\n                    298353836077639,\n                    298409391465409,\n                    299686419400666,\n                    299769726700118,\n                    300136436050699,\n                    300583122258222,\n                    300710556964575,\n                    301266799261438,\n                    301280787524288,\n                    301527407021198,\n                    301988872005691,\n                    302360612278753,\n                    302656802432509,\n                    304549554050632,\n                    306203041818970,\n                    307080590001213,\n                    307145677617826,\n                    307967534912464,\n                    308150774714909,\n                    308280991213272,\n                    308423591882698,\n                    310277246224302,\n                    310518075637689,\n                    311177999205805,\n                    312376374680562,\n                    312500518005538,\n                    313566577455370,\n                    315379360903532,\n                    315761524455196,\n                    315894474312958,\n                    315915560704609,\n                    317146165008935,\n                    317911096926352,\n                    318149703248740,\n                    318452257301876,\n                    318838378422560,\n                    319002045581712,\n                    319870839054454,\n                    320478308186860,\n                    321581854131598,\n                    323244150688113,\n                    325348339530349,\n                    325401700852377,\n                    325609668529942,\n                    325840322414685,\n                    326362555166202,\n                    327401856042864,\n                    327430526220797,\n                    327717949035640,\n                    327729120445936\n                ],\n                \"molecule\": \"DNA\",\n                \"num\": 500,\n                \"seed\": 42\n            }\n        ],\n        \"type\": \"mrnaseq\",\n        \"version\": 0.4\n    }\n]"
  },
  {
    "path": "tests/test-data/10x-example/barcodes.tsv",
    "content": "AAACGGGAGGATATAC-1\nAAACGGGTCTCGTATT-1\nAAAGATGCAGATCTGT-1\nAAATGCCAGATAGTCA-1\nAAATGCCCAAACTGCT-1\nAAATGCCGTGAACCTT-1\nAACACGTAGTGTACCT-1\nAACACGTGTGGCTCCA-1\nAACCATGAGTTGTCGT-1\nAACCATGCACGTCAGC-1\n"
  },
  {
    "path": "tests/test-data/10x-example/barcodes_renamer.tsv",
    "content": "AAACGGGTCTCGTATT-1    lung_epithelial_cell|AAACGGGTCTCGTATT-1\nAAACGGGAGGATATAC-1\t  human_epithelial_cell|AAACGGGAGGATATAC-1\nAAAGATGCAGATCTGT-1\t  mouse_epithelial_cell|AAAGATGCAGATCTGT-1\nAAATGCCAGATAGTCA-1    lung_epithelial_cell|AAATGCCAGATAGTCA-1\nAAATGCCCAAACTGCT-1    lung_epithelial_cell|AAATGCCCAAACTGCT-1\nAAATGCCGTGAACCTT-1\t  lung_epithelial_cell|AAATGCCGTGAACCTT-1\nAACACGTAGTGTACCT-1    lung_epithelial_cell|AACACGTAGTGTACCT-1\nAACACGTGTGGCTCCA-1\t  lung_epithelial_cell|AACACGTGTGGCTCCA-1\nAACCATGAGTTGTCGT-1    lung_epithelial_cell|AACCATGAGTTGTCGT-1\nAACCATGCACGTCAGC-1\t  lung_epithelial_cell|AACCATGCACGTCAGC-1\n"
  },
  {
    "path": "tests/test-data/2sigs.branch_0913.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/2sigs.branch_0913.rocksdb/IDENTITY",
    "content": "84e2ab8e-eb04-4601-935b-94264a7104cb"
  },
  {
    "path": "tests/test-data/2sigs.branch_0913.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/2sigs.branch_0913.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=8.10.0\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  write_dbid_to_manifest=false\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  log_readahead_size=0\n  enable_pipelined_write=false\n  wal_recovery_mode=kPointInTimeRecovery\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  access_hint_on_compaction_start=NORMAL\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=10\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/3sigs.branch_0913.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/3sigs.branch_0913.rocksdb/IDENTITY",
    "content": "65d4b146-d7e2-40ad-9036-7c7409ee4604"
  },
  {
    "path": "tests/test-data/3sigs.branch_0913.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/3sigs.branch_0913.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=8.10.0\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  write_dbid_to_manifest=false\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  log_readahead_size=0\n  enable_pipelined_write=false\n  wal_recovery_mode=kPointInTimeRecovery\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  access_hint_on_compaction_start=NORMAL\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=10\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/compare/labels_from-test.csv",
    "content": "sort_order,md5,label,name,filename,signature_file\r\n4,8a619747693c045afde376263841806b,genome-s10+s11-CHANGED,genome-s10+s11,-,/Users/t/dev/sourmash/tests/test-data/genome-s10+s11.sig\r\n3,ff511252a80bb9a7dbb0acf62626e123,genome-s12-CHANGED,genome-s12,genome-s12.fa.gz,/Users/t/dev/sourmash/tests/test-data/genome-s12.fa.gz.sig\r\n2,1437d8eae64bad9bdc8d13e1daa0a43e,genome-s11-CHANGED,genome-s11,genome-s11.fa.gz,/Users/t/dev/sourmash/tests/test-data/genome-s11.fa.gz.sig\r\n1,4cb3290263eba24548f5bef38bcaefc9,genome-s10-CHANGED,genome-s10,genome-s10.fa.gz,/Users/t/dev/sourmash/tests/test-data/genome-s10.fa.gz.sig"
  },
  {
    "path": "tests/test-data/duplicate-sigs/README.md",
    "content": "This directory contains multiple signatures with different metadata but the same\ncontents (and md5sum).\n"
  },
  {
    "path": "tests/test-data/ecoli.faa",
    "content": ">NP_414543.1 Bifunctional aspartokinase/homoserine dehydrogenase 1 [Escherichia coli str. K-12 substr. MG1655]\nMRVLKFGGTSVANAERFLRVADILESNARQGQVATVLSAPAKITNHLVAMIEKTISGQDALPNISDAERIFAELLTGLAA\nAQPGFPLAQLKTFVDQEFAQIKHVLHGISLLGQCPDSINAALICRGEKMSIAIMAGVLEARGHNVTVIDPVEKLLAVGHY\nLESTVDIAESTRRIAASRIPADHMVLMAGFTAGNEKGELVVLGRNGSDYSAAVLAACLRADCCEIWTDVDGVYTCDPRQV\nPDARLLKSMSYQEAMELSYFGAKVLHPRTITPIAQFQIPCLIKNTGNPQAPGTLIGASRDEDELPVKGISNLNNMAMFSV\nSGPGMKGMVGMAARVFAAMSRARISVVLITQSSSEYSISFCVPQSDCVRAERAMQEEFYLELKEGLLEPLAVTERLAIIS\nVVGDGMRTLRGISAKFFAALARANINIVAIAQGSSERSISVVVNNDDATTGVRVTHQMLFNTDQVIEVFVIGVGGVGGAL\nLEQLKRQQSWLKNKHIDLRVCGVANSKALLTNVHGLNLENWQEELAQAKEPFNLGRLIRLVKEYHLLNPVIVDCTSSQAV\nADQYADFLREGFHVVTPNKKANTSSMDYYHQLRYAAEKSRRKFLYDTNVGAGLPVIENLQNLLNAGDELMKFSGILSGSL\nSYIFGKLDEGMSFSEATTLAREMGYTEPDPRDDLSGMDVARKLLILARETGRELELADIEIEPVLPAEFNAEGDVAAFMA\nNLSQLDDLFAARVAKARDEGKVLRYVGNIDEDGVCRVKIAEVDGNDPLFKVKNGENALAFYSHYYQPLPLVLRGYGAGND\nVTAAGVFADLLRTLSWKLGV\n>NP_414544.1 homoserine kinase [Escherichia coli str. K-12 substr. MG1655]\nMVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQI\nPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDI\nISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLP\nGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN\n"
  },
  {
    "path": "tests/test-data/ecoli.genes.fna",
    "content": ">gi|556503834:337-2799 Escherichia coli str. K-12 substr. MG1655, complete genome\nATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCGATATTC\nTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCT\nGGTGGCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATT\nTTTGCCGAACTTTTGACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCG\nTCGATCAGGAATTTGCCCAAATAAAACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAG\nCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAAATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCG\nCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCTGGCAGTGGGGCATTACCTCGAATCTA\nCCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTGATCACATGGTGCTGAT\nGGCAGGTTTCACCGCCGGTAATGAAAAAGGCGAACTGGTGGTGCTTGGACGCAACGGTTCCGACTACTCT\nGCTGCGGTGCTGGCTGCCTGTTTACGCGCCGATTGTTGCGAGATTTGGACGGACGTTGACGGGGTCTATA\nCCTGCGACCCGCGTCAGGTGCCCGATGCGAGGTTGTTGAAGTCGATGTCCTACCAGGAAGCGATGGAGCT\nTTCCTACTTCGGCGCTAAAGTTCTTCACCCCCGCACCATTACCCCCATCGCCCAGTTCCAGATCCCTTGC\nCTGATTAAAAATACCGGAAATCCTCAAGCACCAGGTACGCTCATTGGTGCCAGCCGTGATGAAGACGAAT\nTACCGGTCAAGGGCATTTCCAATCTGAATAACATGGCAATGTTCAGCGTTTCTGGTCCGGGGATGAAAGG\nGATGGTCGGCATGGCGGCGCGCGTCTTTGCAGCGATGTCACGCGCCCGTATTTCCGTGGTGCTGATTACG\nCAATCATCTTCCGAATACAGCATCAGTTTCTGCGTTCCACAAAGCGACTGTGTGCGAGCTGAACGGGCAA\nTGCAGGAAGAGTTCTACCTGGAACTGAAAGAAGGCTTACTGGAGCCGCTGGCAGTGACGGAACGGCTGGC\nCATTATCTCGGTGGTAGGTGATGGTATGCGCACCTTGCGTGGGATCTCGGCGAAATTCTTTGCCGCACTG\nGCCCGCGCCAATATCAACATTGTCGCCATTGCTCAGGGATCTTCTGAACGCTCAATCTCTGTCGTGGTAA\nATAACGATGATGCGACCACTGGCGTGCGCGTTACTCATCAGATGCTGTTCAATACCGATCAGGTTATCGA\nAGTGTTTGTGATTGGCGTCGGTGGCGTTGGCGGTGCGCTGCTGGAGCAACTGAAGCGTCAGCAAAGCTGG\nCTGAAGAATAAACATATCGACTTACGTGTCTGCGGTGTTGCCAACTCGAAGGCTCTGCTCACCAATGTAC\nATGGCCTTAATCTGGAAAACTGGCAGGAAGAACTGGCGCAAGCCAAAGAGCCGTTTAATCTCGGGCGCTT\nAATTCGCCTCGTGAAAGAATATCATCTGCTGAACCCGGTCATTGTTGACTGCACTTCCAGCCAGGCAGTG\nGCGGATCAATATGCCGACTTCCTGCGCGAAGGTTTCCACGTTGTCACGCCGAACAAAAAGGCCAACACCT\nCGTCGATGGATTACTACCATCAGTTGCGTTATGCGGCGGAAAAATCGCGGCGTAAATTCCTCTATGACAC\nCAACGTTGGGGCTGGATTACCGGTTATTGAGAACCTGCAAAATCTGCTCAATGCAGGTGATGAATTGATG\nAAGTTCTCCGGCATTCTTTCTGGTTCGCTTTCTTATATCTTCGGCAAGTTAGACGAAGGCATGAGTTTCT\nCCGAGGCGACCACGCTGGCGCGGGAAATGGGTTATACCGAACCGGACCCGCGAGATGATCTTTCTGGTAT\nGGATGTGGCGCGTAAACTATTGATTCTCGCTCGTGAAACGGGACGTGAACTGGAGCTGGCGGATATTGAA\nATTGAACCTGTGCTGCCCGCAGAGTTTAACGCCGAGGGTGATGTTGCCGCTTTTATGGCGAATCTGTCAC\nAACTCGACGATCTCTTTGCCGCGCGCGTGGCGAAGGCCCGTGATGAAGGAAAAGTTTTGCGCTATGTTGG\nCAATATTGATGAAGATGGCGTCTGCCGCGTGAAGATTGCCGAAGTGGATGGTAATGATCCGCTGTTCAAA\nGTGAAAAATGGCGAAAACGCCCTGGCCTTCTATAGCCACTATTATCAGCCGCTGCCGTTGGTACTGCGCG\nGATATGGTGCGGGCAATGACGTTACAGCTGCCGGTGTCTTTGCTGATCTGCTACGTACCCTCTCATGGAA\nGTTAGGAGTCTGA\n>gi|556503834:2801-3733 Escherichia coli str. K-12 substr. MG1655, complete genome\nATGGTTAAAGTTTATGCCCCGGCTTCCAGTGCCAATATGAGCGTCGGGTTTGATGTGCTCGGGGCGGCGG\nTGACACCTGTTGATGGTGCATTGCTCGGAGATGTAGTCACGGTTGAGGCGGCAGAGACATTCAGTCTCAA\nCAACCTCGGACGCTTTGCCGATAAGCTGCCGTCAGAACCACGGGAAAATATCGTTTATCAGTGCTGGGAG\nCGTTTTTGCCAGGAACTGGGTAAGCAAATTCCAGTGGCGATGACCCTGGAAAAGAATATGCCGATCGGTT\nCGGGCTTAGGCTCCAGTGCCTGTTCGGTGGTCGCGGCGCTGATGGCGATGAATGAACACTGCGGCAAGCC\nGCTTAATGACACTCGTTTGCTGGCTTTGATGGGCGAGCTGGAAGGCCGTATCTCCGGCAGCATTCATTAC\nGACAACGTGGCACCGTGTTTTCTCGGTGGTATGCAGTTGATGATCGAAGAAAACGACATCATCAGCCAGC\nAAGTGCCAGGGTTTGATGAGTGGCTGTGGGTGCTGGCGTATCCGGGGATTAAAGTCTCGACGGCAGAAGC\nCAGGGCTATTTTACCGGCGCAGTATCGCCGCCAGGATTGCATTGCGCACGGGCGACATCTGGCAGGCTTC\nATTCACGCCTGCTATTCCCGTCAGCCTGAGCTTGCCGCGAAGCTGATGAAAGATGTTATCGCTGAACCCT\nACCGTGAACGGTTACTGCCAGGCTTCCGGCAGGCGCGGCAGGCGGTCGCGGAAATCGGCGCGGTAGCGAG\nCGGTATCTCCGGCTCCGGCCCGACCTTGTTCGCTCTGTGTGACAAGCCGGAAACCGCCCAGCGCGTTGCC\nGACTGGTTGGGTAAGAACTACCTGCAAAATCAGGAAGGTTTTGTTCATATTTGCCGGCTGGATACGGCGG\nGCGCACGAGTACTGGAAAACTAA\n"
  },
  {
    "path": "tests/test-data/fake-abund/README.md",
    "content": "signature:\n```\nsourmash compute -k 31 --track-abundance ../podar-ref/1.fa ../podar-ref/1.fa ../podar-ref/1.fa ../podar-ref/1.fa ../podar-ref/1.fa ../podar-ref/63.fa --merge \"query\" -o query.sig --scaled=1000\n```\n\ndatabase:\n\n```\nsourmash lca index ../podar-lineage.csv matches.lca.json ../podar-ref/{1,63}.fa.sig -k 31 -C 3 --split-identifiers\n```\n"
  },
  {
    "path": "tests/test-data/gather/all-picklist.csv",
    "content": "signature_file,md5,ksize,moltype,num,scaled,n_hashes,seed,with_abundance,name,filename,license\r\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,323c1a1712b0949268dd6fb93be63ae2,11,DNA,0,10000,150,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\r\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,263c2de20b597d6e33b81ec91d8672b5,21,DNA,0,10000,485,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\r\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,dc12a6d8fd63122aa68f78facf9bed94,31,DNA,0,10000,490,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\r\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,df24140b1c6cad16b30abeaf03019eb5,11,DNA,0,10000,158,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\r\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,fd958e3b5649bc03890517ff239970ea,21,DNA,0,10000,445,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\r\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,8c22dff88a2239607762da00f7fd1725,31,DNA,0,10000,472,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\r\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,9db6efc92a041e11713ccfa8597edae5,11,DNA,0,10000,150,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\r\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,8996699a05d3e5a05fa3fe94bfa41431,21,DNA,0,10000,472,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\r\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,85c3aeec6457c0b1d210472ddeb67714,31,DNA,0,10000,468,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\r\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,74b928d3db1f7f033c0dcca6c6e52aea,11,DNA,0,10000,84,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\r\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,ba9947e078cab29e20bc7d31bc1b9f0d,21,DNA,0,10000,192,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\r\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,1bfe96d76ec9cdb60779a1a9223c424e,31,DNA,0,10000,187,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\r\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,752280e9969ce750e2c80477c1b7b0e7,11,DNA,0,10000,61,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\r\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,eba0eb3ce984cc53c36f134a752c52c5,21,DNA,0,10000,157,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\r\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,953156e9f4da8cf22e7e0b4b88261fae,31,DNA,0,10000,167,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\r\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,0f35aeadda1532ed450bd6de1e73545d,11,DNA,0,10000,148,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\r\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,405ae3300f28ca5fe5c223cbf7e28734,21,DNA,0,10000,471,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\r\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,0842f7edb426fc4fa2701c107e678279,31,DNA,0,10000,461,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\r\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,d883538a0c983a863fa4b6e5fcd19612,11,DNA,0,10000,148,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\r\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,9133bd71b86628b38c665ab7e5eb8712,21,DNA,0,10000,457,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\r\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,afadabf39aec247929e84a29fd797117,31,DNA,0,10000,461,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\r\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,feef9e4d39fecd3d9292b76c0cc72b81,11,DNA,0,10000,155,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\r\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,cc80cb247b195ca3dfa0756257d882b6,21,DNA,0,10000,427,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\r\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,bb365606acbf08d183399f139af80c32,31,DNA,0,10000,459,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\r\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,4cec832176c4831239faed42c0616ef4,11,DNA,0,10000,155,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\r\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,43a9d80a4cd995779c7538a32088dd0e,21,DNA,0,10000,469,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\r\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,d0cfbe22579f98fd5de2d41203589964,31,DNA,0,10000,480,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\r\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,328f7b0643bdb6c76135292b5afc8fa7,11,DNA,0,10000,82,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\r\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,a77789e831fcd2436c3b9e4e22fb173e,21,DNA,0,10000,190,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\r\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,50d8efd580ff2000cb38d1f8cc9cf9b4,31,DNA,0,10000,185,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\r\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,989f88420b193ef39c4dbe3b268e0049,11,DNA,0,10000,90,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\r\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,bebcd0dcc0ed3b120ad16c4e15805370,21,DNA,0,10000,188,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\r\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,4289d4241be8573145282352215ca3c4,31,DNA,0,10000,198,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\r\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,40df36a7eb411022be4b1d6a7af05496,11,DNA,0,10000,161,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\r\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,ffa92983f7e67454c407499cbfbabf88,21,DNA,0,10000,487,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\r\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,cb26db5716a213c9a6614021e7176c1d,31,DNA,0,10000,512,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\r\n"
  },
  {
    "path": "tests/test-data/gather/campy-picklist.csv",
    "content": "signature_file,md5,ksize,moltype,num,scaled,n_hashes,seed,with_abundance,name,filename,license\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,752280e9969ce750e2c80477c1b7b0e7,11,DNA,0,10000,61,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,eba0eb3ce984cc53c36f134a752c52c5,21,DNA,0,10000,157,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\nGCF_000009085.1_ASM908v1_genomic.fna.gz.sig,953156e9f4da8cf22e7e0b4b88261fae,31,DNA,0,10000,167,42,0,\"NC_002163.1 Campylobacter jejuni subsp. jejuni NCTC 11168 = ATCC 700819 chromosome, complete genome\",../fasta/GCF_000009085.1_ASM908v1_genomic.fna.gz,CC0\n"
  },
  {
    "path": "tests/test-data/gather/salmonella-picklist-diffcolumn.csv",
    "content": "name2\n\"NOT THERE\"\n\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\"\n\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\"\n\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\"\n\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\"\n\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\"\n\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\"\n\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\"\n\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\"\n\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\"\nNC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome\nNC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome\nNC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome\nNC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome\nNC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome\nNC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome\n\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\"\n\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\"\n\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\"\n\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\"\n\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\"\n\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\"\n\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\"\n\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\"\n\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\"\n"
  },
  {
    "path": "tests/test-data/gather/salmonella-picklist.csv",
    "content": "signature_file,md5,ksize,moltype,num,scaled,n_hashes,seed,with_abundance,name,filename,license\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,323c1a1712b0949268dd6fb93be63ae2,11,DNA,0,10000,150,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,263c2de20b597d6e33b81ec91d8672b5,21,DNA,0,10000,485,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\nGCF_000006945.2_ASM694v2_genomic.fna.gz.sig,dc12a6d8fd63122aa68f78facf9bed94,31,DNA,0,10000,490,42,0,\"NC_003197.2 Salmonella enterica subsp. enterica serovar Typhimurium str. LT2, complete genome\",../fasta/GCF_000006945.2_ASM694v2_genomic.fna.gz,CC0\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,df24140b1c6cad16b30abeaf03019eb5,11,DNA,0,10000,158,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,fd958e3b5649bc03890517ff239970ea,21,DNA,0,10000,445,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\nGCF_000007545.1_ASM754v1_genomic.fna.gz.sig,8c22dff88a2239607762da00f7fd1725,31,DNA,0,10000,472,42,0,\"NC_004631.1 Salmonella enterica subsp. enterica serovar Typhi Ty2, complete genome\",../fasta/GCF_000007545.1_ASM754v1_genomic.fna.gz,CC0\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,9db6efc92a041e11713ccfa8597edae5,11,DNA,0,10000,150,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,8996699a05d3e5a05fa3fe94bfa41431,21,DNA,0,10000,472,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\nGCF_000008105.1_ASM810v1_genomic.fna.gz.sig,85c3aeec6457c0b1d210472ddeb67714,31,DNA,0,10000,468,42,0,\"NC_006905.1 Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67, complete genome\",../fasta/GCF_000008105.1_ASM810v1_genomic.fna.gz,CC0\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,0f35aeadda1532ed450bd6de1e73545d,11,DNA,0,10000,148,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,405ae3300f28ca5fe5c223cbf7e28734,21,DNA,0,10000,471,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\nGCF_000009505.1_ASM950v1_genomic.fna.gz.sig,0842f7edb426fc4fa2701c107e678279,31,DNA,0,10000,461,42,0,NC_011294.1 Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 complete genome,../fasta/GCF_000009505.1_ASM950v1_genomic.fna.gz,CC0\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,d883538a0c983a863fa4b6e5fcd19612,11,DNA,0,10000,148,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,9133bd71b86628b38c665ab7e5eb8712,21,DNA,0,10000,457,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\nGCF_000009525.1_ASM952v1_genomic.fna.gz.sig,afadabf39aec247929e84a29fd797117,31,DNA,0,10000,461,42,0,NC_011274.1 Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 complete genome,../fasta/GCF_000009525.1_ASM952v1_genomic.fna.gz,CC0\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,feef9e4d39fecd3d9292b76c0cc72b81,11,DNA,0,10000,155,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,cc80cb247b195ca3dfa0756257d882b6,21,DNA,0,10000,427,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\nGCF_000011885.1_ASM1188v1_genomic.fna.gz.sig,bb365606acbf08d183399f139af80c32,31,DNA,0,10000,459,42,0,\"NC_006511.1 Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150, complete genome\",../fasta/GCF_000011885.1_ASM1188v1_genomic.fna.gz,CC0\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,4cec832176c4831239faed42c0616ef4,11,DNA,0,10000,155,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,43a9d80a4cd995779c7538a32088dd0e,21,DNA,0,10000,469,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\nGCF_000016045.1_ASM1604v1_genomic.fna.gz.sig,d0cfbe22579f98fd5de2d41203589964,31,DNA,0,10000,480,42,0,\"NC_011080.1 Salmonella enterica subsp. enterica serovar Newport str. SL254, complete genome\",../fasta/GCF_000016045.1_ASM1604v1_genomic.fna.gz,CC0\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,40df36a7eb411022be4b1d6a7af05496,11,DNA,0,10000,161,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,ffa92983f7e67454c407499cbfbabf88,21,DNA,0,10000,487,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\nGCF_000195995.1_ASM19599v1_genomic.fna.gz.sig,cb26db5716a213c9a6614021e7176c1d,31,DNA,0,10000,512,42,0,\"NC_003198.1 Salmonella enterica subsp. enterica serovar Typhi str. CT18, complete genome\",../fasta/GCF_000195995.1_ASM19599v1_genomic.fna.gz,CC0\n"
  },
  {
    "path": "tests/test-data/gather/thermotoga-picklist.csv",
    "content": "signature_file,md5,ksize,moltype,num,scaled,n_hashes,seed,with_abundance,name,filename,license\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,74b928d3db1f7f033c0dcca6c6e52aea,11,DNA,0,10000,84,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,ba9947e078cab29e20bc7d31bc1b9f0d,21,DNA,0,10000,192,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\nGCF_000008545.1_ASM854v1_genomic.fna.gz.sig,1bfe96d76ec9cdb60779a1a9223c424e,31,DNA,0,10000,187,42,0,\"NC_000853.1 Thermotoga maritima MSB8 chromosome, complete genome\",../fasta/GCF_000008545.1_ASM854v1_genomic.fna.gz,CC0\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,328f7b0643bdb6c76135292b5afc8fa7,11,DNA,0,10000,82,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,a77789e831fcd2436c3b9e4e22fb173e,21,DNA,0,10000,190,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\nGCF_000016785.1_ASM1678v1_genomic.fna.gz.sig,50d8efd580ff2000cb38d1f8cc9cf9b4,31,DNA,0,10000,185,42,0,\"NC_009486.1 Thermotoga petrophila RKU-1, complete genome\",../fasta/GCF_000016785.1_ASM1678v1_genomic.fna.gz,CC0\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,989f88420b193ef39c4dbe3b268e0049,11,DNA,0,10000,90,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,bebcd0dcc0ed3b120ad16c4e15805370,21,DNA,0,10000,188,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\nGCF_000018945.1_ASM1894v1_genomic.fna.gz.sig,4289d4241be8573145282352215ca3c4,31,DNA,0,10000,198,42,0,\"NC_011978.1 Thermotoga neapolitana DSM 4359, complete genome\",../fasta/GCF_000018945.1_ASM1894v1_genomic.fna.gz,CC0\n"
  },
  {
    "path": "tests/test-data/genome-s11.fa.gz.msh.json_dump",
    "content": "{\n\t\"kmer\" : 21,\n\t\"alphabet\" : \"ACGT\",\n\t\"preserveCase\" : false,\n\t\"canonical\" : true,\n\t\"sketchSize\" : 500,\n\t\"hashType\" : \"MurmurHash3_x64_128\",\n\t\"hashBits\" : 64,\n\t\"hashSeed\" : 42,\n \t\"sketches\" :\n\t[\n\t\t{\n\t\t\t\"name\" : \"./tests/test-data/genome-s11.fa.gz\",\n\t\t\t\"length\" : 500000,\n\t\t\t\"comment\" : \"s11 \",\n\t\t\t\"hashes\" :\n\t\t\t[\n\t\t\t\t34197227818852,\n\t\t\t\t36233190587749,\n\t\t\t\t103994484705912,\n\t\t\t\t193791340506652,\n\t\t\t\t208697210548669,\n\t\t\t\t217219574899902,\n\t\t\t\t219035221484783,\n\t\t\t\t259328670147869,\n\t\t\t\t307023780364791,\n\t\t\t\t353120507068690,\n\t\t\t\t361042278415389,\n\t\t\t\t372132864937036,\n\t\t\t\t400272597635376,\n\t\t\t\t420935853991271,\n\t\t\t\t447450737778618,\n\t\t\t\t543518175820202,\n\t\t\t\t547694691899229,\n\t\t\t\t574513820872111,\n\t\t\t\t617248294857512,\n\t\t\t\t695241889949787,\n\t\t\t\t761371690455441,\n\t\t\t\t788266052401985,\n\t\t\t\t952274238347121,\n\t\t\t\t995598624716409,\n\t\t\t\t1028348316802025,\n\t\t\t\t1052803672599629,\n\t\t\t\t1085199355301152,\n\t\t\t\t1180065737237871,\n\t\t\t\t1288024596693168,\n\t\t\t\t1298324714003444,\n\t\t\t\t1333263782951650,\n\t\t\t\t1351462533192028,\n\t\t\t\t1430930388516883,\n\t\t\t\t1435619009706627,\n\t\t\t\t1512479726435604,\n\t\t\t\t1635696065228913,\n\t\t\t\t1676224092765560,\n\t\t\t\t1698623089654010,\n\t\t\t\t1715936026126188,\n\t\t\t\t1731462535339250,\n\t\t\t\t1740725760472448,\n\t\t\t\t1789280068455153,\n\t\t\t\t1820744587508798,\n\t\t\t\t1839421561066055,\n\t\t\t\t1842229944907144,\n\t\t\t\t1862768139724554,\n\t\t\t\t1866998183586763,\n\t\t\t\t1908353899055516,\n\t\t\t\t1910641448977958,\n\t\t\t\t1942937157786731,\n\t\t\t\t1943191532040231,\n\t\t\t\t2047078532546953,\n\t\t\t\t2052186685024972,\n\t\t\t\t2055924097540047,\n\t\t\t\t2092264946506075,\n\t\t\t\t2225023812229216,\n\t\t\t\t2248954414963980,\n\t\t\t\t2254151134784331,\n\t\t\t\t2257410517722884,\n\t\t\t\t2281531302596143,\n\t\t\t\t2322176785342940,\n\t\t\t\t2331066985147198,\n\t\t\t\t2411737870188694,\n\t\t\t\t2474884162005830,\n\t\t\t\t2489663549887237,\n\t\t\t\t2496450191692797,\n\t\t\t\t2586000151247241,\n\t\t\t\t2604504178425315,\n\t\t\t\t2606567769750440,\n\t\t\t\t2657514130527882,\n\t\t\t\t2682234312346198,\n\t\t\t\t2697023132505088,\n\t\t\t\t2762234914850041,\n\t\t\t\t2767741997545979,\n\t\t\t\t2823838176020626,\n\t\t\t\t2868420066157551,\n\t\t\t\t2883935415498292,\n\t\t\t\t2906872373378483,\n\t\t\t\t2926841968267081,\n\t\t\t\t2961439244698487,\n\t\t\t\t2962123585811820,\n\t\t\t\t2988965833397967,\n\t\t\t\t2999665501349752,\n\t\t\t\t3042427477065097,\n\t\t\t\t3168858366873127,\n\t\t\t\t3180187073996536,\n\t\t\t\t3180612891263714,\n\t\t\t\t3209022776246150,\n\t\t\t\t3271616108316117,\n\t\t\t\t3291393991956420,\n\t\t\t\t3343914098223913,\n\t\t\t\t3408671051477864,\n\t\t\t\t3424841173262589,\n\t\t\t\t3426903584200506,\n\t\t\t\t3450454064118395,\n\t\t\t\t3509356539931967,\n\t\t\t\t3604116409509124,\n\t\t\t\t3642312742717836,\n\t\t\t\t3803033601120781,\n\t\t\t\t4101563619285291,\n\t\t\t\t4142776480662901,\n\t\t\t\t4175764951650429,\n\t\t\t\t4181508866480327,\n\t\t\t\t4236274675297100,\n\t\t\t\t4237843281519737,\n\t\t\t\t4243968063432183,\n\t\t\t\t4254850298812698,\n\t\t\t\t4260449621387639,\n\t\t\t\t4264274699804432,\n\t\t\t\t4285563278016526,\n\t\t\t\t4294618834169854,\n\t\t\t\t4325655045336994,\n\t\t\t\t4355499912114005,\n\t\t\t\t4361997424057434,\n\t\t\t\t4366912577949445,\n\t\t\t\t4369900441949348,\n\t\t\t\t4414403383870840,\n\t\t\t\t4450392676032958,\n\t\t\t\t4478079306117402,\n\t\t\t\t4483583035232900,\n\t\t\t\t4539148838840594,\n\t\t\t\t4614313439925964,\n\t\t\t\t4798486264469353,\n\t\t\t\t4812571774821760,\n\t\t\t\t4898345308295113,\n\t\t\t\t4899852761716919,\n\t\t\t\t4939598591766026,\n\t\t\t\t4961293921442180,\n\t\t\t\t4999252453781061,\n\t\t\t\t5126449070158098,\n\t\t\t\t5154504316281484,\n\t\t\t\t5157123362520881,\n\t\t\t\t5178173796947582,\n\t\t\t\t5219431881923320,\n\t\t\t\t5296594707962076,\n\t\t\t\t5360377740211692,\n\t\t\t\t5379355742127335,\n\t\t\t\t5393123738173184,\n\t\t\t\t5413170265684350,\n\t\t\t\t5440141765351643,\n\t\t\t\t5440539790786042,\n\t\t\t\t5467719079300870,\n\t\t\t\t5490854471057113,\n\t\t\t\t5496901207651988,\n\t\t\t\t5508329363061382,\n\t\t\t\t5535889024489559,\n\t\t\t\t5573547707710550,\n\t\t\t\t5579405703388950,\n\t\t\t\t5611294834320252,\n\t\t\t\t5638360952876943,\n\t\t\t\t5663662723224913,\n\t\t\t\t5681081225456819,\n\t\t\t\t5708013243936778,\n\t\t\t\t5816757440045245,\n\t\t\t\t5865139072686819,\n\t\t\t\t5940180841071265,\n\t\t\t\t5943085489214105,\n\t\t\t\t5972245452796494,\n\t\t\t\t6009172642550927,\n\t\t\t\t6011766291351980,\n\t\t\t\t6019706074641082,\n\t\t\t\t6119944600443698,\n\t\t\t\t6120383841435045,\n\t\t\t\t6161325726249465,\n\t\t\t\t6174989973896189,\n\t\t\t\t6285555031540945,\n\t\t\t\t6371135151407988,\n\t\t\t\t6389463308119708,\n\t\t\t\t6557545796302762,\n\t\t\t\t6563645529176558,\n\t\t\t\t6640930540374205,\n\t\t\t\t6648126561863416,\n\t\t\t\t6730199454105127,\n\t\t\t\t6742069197796919,\n\t\t\t\t6760137925910924,\n\t\t\t\t6761332839998945,\n\t\t\t\t6826569622870445,\n\t\t\t\t6897803523351265,\n\t\t\t\t6901676074701356,\n\t\t\t\t6937247694980942,\n\t\t\t\t6970369049510010,\n\t\t\t\t7000390519083332,\n\t\t\t\t7000755193887229,\n\t\t\t\t7039243971357639,\n\t\t\t\t7057087702371778,\n\t\t\t\t7064545535084652,\n\t\t\t\t7066912199055787,\n\t\t\t\t7125612917006038,\n\t\t\t\t7198079707148381,\n\t\t\t\t7223658170159823,\n\t\t\t\t7237715946244866,\n\t\t\t\t7253033664854123,\n\t\t\t\t7303613399517052,\n\t\t\t\t7335782803871517,\n\t\t\t\t7518209163563787,\n\t\t\t\t7568575797479525,\n\t\t\t\t7643658960007756,\n\t\t\t\t7681399336471408,\n\t\t\t\t7681557622123438,\n\t\t\t\t7683737425785366,\n\t\t\t\t7686861850044301,\n\t\t\t\t7700121497644683,\n\t\t\t\t7766614486568222,\n\t\t\t\t7804806504133555,\n\t\t\t\t7838521599505391,\n\t\t\t\t7853732124197158,\n\t\t\t\t8019472994929151,\n\t\t\t\t8032263863972706,\n\t\t\t\t8036246497677478,\n\t\t\t\t8051805411155223,\n\t\t\t\t8079988237297131,\n\t\t\t\t8189557278616759,\n\t\t\t\t8200278989091900,\n\t\t\t\t8259338180502789,\n\t\t\t\t8386311005712444,\n\t\t\t\t8406186678177215,\n\t\t\t\t8423887825213502,\n\t\t\t\t8477746921854612,\n\t\t\t\t8532592007423610,\n\t\t\t\t8538151308225447,\n\t\t\t\t8560480891977495,\n\t\t\t\t8567978507840008,\n\t\t\t\t8630537673557104,\n\t\t\t\t8685311041264166,\n\t\t\t\t8728240880516384,\n\t\t\t\t8789084977768100,\n\t\t\t\t8801993029781861,\n\t\t\t\t8820133271425363,\n\t\t\t\t8850351910969904,\n\t\t\t\t8877732339428626,\n\t\t\t\t8936262328628442,\n\t\t\t\t8960925818999786,\n\t\t\t\t8965084486234958,\n\t\t\t\t9029543384217101,\n\t\t\t\t9045506605344164,\n\t\t\t\t9082336047471272,\n\t\t\t\t9108143333754387,\n\t\t\t\t9123156062912911,\n\t\t\t\t9144313946356755,\n\t\t\t\t9148971144909842,\n\t\t\t\t9151183472483254,\n\t\t\t\t9177767560730791,\n\t\t\t\t9292443588546677,\n\t\t\t\t9324819557339109,\n\t\t\t\t9335360823692169,\n\t\t\t\t9343146976351426,\n\t\t\t\t9353758096949499,\n\t\t\t\t9366616833410327,\n\t\t\t\t9389776744123837,\n\t\t\t\t9450592345908028,\n\t\t\t\t9495882618364930,\n\t\t\t\t9577028736617463,\n\t\t\t\t9664480647718569,\n\t\t\t\t9706440699910452,\n\t\t\t\t9759671185439141,\n\t\t\t\t9834939308105713,\n\t\t\t\t9865969784411097,\n\t\t\t\t9884073368298254,\n\t\t\t\t9894065490843743,\n\t\t\t\t9937775544714000,\n\t\t\t\t9945463197860433,\n\t\t\t\t9956483324157890,\n\t\t\t\t9964353212242900,\n\t\t\t\t10106049567544352,\n\t\t\t\t10199217549815842,\n\t\t\t\t10212906320030603,\n\t\t\t\t10245560203640574,\n\t\t\t\t10247225514014206,\n\t\t\t\t10331422138854346,\n\t\t\t\t10452894366104001,\n\t\t\t\t10460097540612801,\n\t\t\t\t10474501410498359,\n\t\t\t\t10530053150206523,\n\t\t\t\t10601888691620654,\n\t\t\t\t10661409203548045,\n\t\t\t\t10704896224311137,\n\t\t\t\t10749446961026178,\n\t\t\t\t10801366032363796,\n\t\t\t\t10822605236579533,\n\t\t\t\t10850685860880388,\n\t\t\t\t10885616361133335,\n\t\t\t\t10980929975531580,\n\t\t\t\t11033051846762965,\n\t\t\t\t11036833959219146,\n\t\t\t\t11040899432561626,\n\t\t\t\t11061353452021278,\n\t\t\t\t11111246307452570,\n\t\t\t\t11149045850247711,\n\t\t\t\t11157320753750733,\n\t\t\t\t11194876939159106,\n\t\t\t\t11391652616499380,\n\t\t\t\t11408632033629847,\n\t\t\t\t11427938294653642,\n\t\t\t\t11515064855413516,\n\t\t\t\t11556238563445845,\n\t\t\t\t11716754105002332,\n\t\t\t\t11757066003518878,\n\t\t\t\t11822650991085304,\n\t\t\t\t11852113394128299,\n\t\t\t\t11883750358607674,\n\t\t\t\t11908460723392896,\n\t\t\t\t11919316474778699,\n\t\t\t\t11929565458219439,\n\t\t\t\t11932080645537316,\n\t\t\t\t11968717319657126,\n\t\t\t\t12001175761254013,\n\t\t\t\t12008792012644124,\n\t\t\t\t12084153362572313,\n\t\t\t\t12088135352309364,\n\t\t\t\t12221628320060791,\n\t\t\t\t12302648578960999,\n\t\t\t\t12369869110933397,\n\t\t\t\t12390250799595392,\n\t\t\t\t12472740694086739,\n\t\t\t\t12475778416796765,\n\t\t\t\t12476487198580671,\n\t\t\t\t12487842511484219,\n\t\t\t\t12496059526406061,\n\t\t\t\t12557770029671363,\n\t\t\t\t12687909208836204,\n\t\t\t\t12687998330722965,\n\t\t\t\t12698526330110526,\n\t\t\t\t12760040667776062,\n\t\t\t\t12792117071882485,\n\t\t\t\t12835088978945555,\n\t\t\t\t12841742854259462,\n\t\t\t\t12990299387000035,\n\t\t\t\t12996395695853496,\n\t\t\t\t13020507701222011,\n\t\t\t\t13030272604237174,\n\t\t\t\t13035972462199809,\n\t\t\t\t13039554291532686,\n\t\t\t\t13137920473367700,\n\t\t\t\t13158651500836393,\n\t\t\t\t13212211865983378,\n\t\t\t\t13246229680742754,\n\t\t\t\t13289251047928888,\n\t\t\t\t13426494219252126,\n\t\t\t\t13455075096046110,\n\t\t\t\t13517723292076632,\n\t\t\t\t13595982792573243,\n\t\t\t\t13607438240957802,\n\t\t\t\t13648437534305614,\n\t\t\t\t13656317138569284,\n\t\t\t\t13693352907021371,\n\t\t\t\t13707514047986883,\n\t\t\t\t13826885361920208,\n\t\t\t\t13827441604508355,\n\t\t\t\t13857572246430924,\n\t\t\t\t13934397816831411,\n\t\t\t\t13949697412311914,\n\t\t\t\t14035083379492924,\n\t\t\t\t14082529138066752,\n\t\t\t\t14110464013944231,\n\t\t\t\t14110740573593881,\n\t\t\t\t14163967944046305,\n\t\t\t\t14231674504931696,\n\t\t\t\t14241841537776958,\n\t\t\t\t14302024936377502,\n\t\t\t\t14309272716052032,\n\t\t\t\t14343044689090159,\n\t\t\t\t14399080408975937,\n\t\t\t\t14482122596987919,\n\t\t\t\t14488164264779471,\n\t\t\t\t14522801507858680,\n\t\t\t\t14558824673612736,\n\t\t\t\t14602354654840520,\n\t\t\t\t14621789377364431,\n\t\t\t\t14667648827360753,\n\t\t\t\t14721108107856113,\n\t\t\t\t14799686512144273,\n\t\t\t\t14848647738193768,\n\t\t\t\t14853708346452535,\n\t\t\t\t14875716145957934,\n\t\t\t\t14882261105509638,\n\t\t\t\t14917102243330732,\n\t\t\t\t14942807778703393,\n\t\t\t\t14978314505139180,\n\t\t\t\t14982697653503908,\n\t\t\t\t14988599244473425,\n\t\t\t\t15021476802480189,\n\t\t\t\t15043290805962345,\n\t\t\t\t15045533791961480,\n\t\t\t\t15075176899517633,\n\t\t\t\t15081964695711698,\n\t\t\t\t15114971852358982,\n\t\t\t\t15124123422020166,\n\t\t\t\t15167680153838811,\n\t\t\t\t15183402787231040,\n\t\t\t\t15252571769836452,\n\t\t\t\t15258625071699106,\n\t\t\t\t15286261407347640,\n\t\t\t\t15286407329468208,\n\t\t\t\t15305141413667370,\n\t\t\t\t15311325100498191,\n\t\t\t\t15313163442080861,\n\t\t\t\t15330390861175833,\n\t\t\t\t15365023783193414,\n\t\t\t\t15405752746645996,\n\t\t\t\t15438575299667951,\n\t\t\t\t15439963920774019,\n\t\t\t\t15525561407300991,\n\t\t\t\t15681195238236138,\n\t\t\t\t15682785516912782,\n\t\t\t\t15750442240758057,\n\t\t\t\t15802612725328426,\n\t\t\t\t15807280620692624,\n\t\t\t\t15812788463790530,\n\t\t\t\t15873448189014176,\n\t\t\t\t15904993230624899,\n\t\t\t\t15947907693567187,\n\t\t\t\t15973996183325700,\n\t\t\t\t16004619200194175,\n\t\t\t\t16021191074749072,\n\t\t\t\t16058311455062167,\n\t\t\t\t16096562850047900,\n\t\t\t\t16226741350567912,\n\t\t\t\t16366854732208109,\n\t\t\t\t16370592542425073,\n\t\t\t\t16449948530831205,\n\t\t\t\t16460464349106125,\n\t\t\t\t16476659162646897,\n\t\t\t\t16499927928260945,\n\t\t\t\t16501867677570372,\n\t\t\t\t16525469687002118,\n\t\t\t\t16559505925188956,\n\t\t\t\t16608462796081426,\n\t\t\t\t16610358152684281,\n\t\t\t\t16622405171485075,\n\t\t\t\t16690925029765589,\n\t\t\t\t16767028250889033,\n\t\t\t\t16795827812633204,\n\t\t\t\t16861430656858772,\n\t\t\t\t16917150277751554,\n\t\t\t\t16924881898653389,\n\t\t\t\t17023169834610109,\n\t\t\t\t17068426273085855,\n\t\t\t\t17075416777021297,\n\t\t\t\t17099133771265045,\n\t\t\t\t17117977144048271,\n\t\t\t\t17140692492720979,\n\t\t\t\t17218440765503812,\n\t\t\t\t17256512181870852,\n\t\t\t\t17282169375756866,\n\t\t\t\t17297245266204323,\n\t\t\t\t17311094051455683,\n\t\t\t\t17362249952554020,\n\t\t\t\t17373802202560519,\n\t\t\t\t17454519370740905,\n\t\t\t\t17469194575230715,\n\t\t\t\t17484737179329088,\n\t\t\t\t17643075738396188,\n\t\t\t\t17643476779740948,\n\t\t\t\t17645692455146755,\n\t\t\t\t17663811740057882,\n\t\t\t\t17696363900308434,\n\t\t\t\t17696815977564285,\n\t\t\t\t17762270662178099,\n\t\t\t\t17812224463455636,\n\t\t\t\t17863950832726277,\n\t\t\t\t17927305122853846,\n\t\t\t\t18009656817764337,\n\t\t\t\t18041544449330548,\n\t\t\t\t18135411241097426,\n\t\t\t\t18139308136189831,\n\t\t\t\t18154292202203479,\n\t\t\t\t18160186021488774,\n\t\t\t\t18205220314476485,\n\t\t\t\t18313523054224456,\n\t\t\t\t18320147317243900,\n\t\t\t\t18476583079621040,\n\t\t\t\t18480833955239320,\n\t\t\t\t18480941948743397,\n\t\t\t\t18522849698784084,\n\t\t\t\t18589865603403277,\n\t\t\t\t18641802443538831,\n\t\t\t\t18665409373128423,\n\t\t\t\t18693734572056700,\n\t\t\t\t18816119582765944,\n\t\t\t\t19109405470496850,\n\t\t\t\t19124374848427400,\n\t\t\t\t19149027532461348,\n\t\t\t\t19157715754492625,\n\t\t\t\t19206879394653799,\n\t\t\t\t19212961913402015,\n\t\t\t\t19275294592768982,\n\t\t\t\t19278061910739325,\n\t\t\t\t19286123822049952,\n\t\t\t\t19298103080269241,\n\t\t\t\t19312577394479167,\n\t\t\t\t19315913741867227,\n\t\t\t\t19335289025271965,\n\t\t\t\t19396573880551916,\n\t\t\t\t19474468664070355,\n\t\t\t\t19505566515300457,\n\t\t\t\t19513636643156201,\n\t\t\t\t19534486273280139,\n\t\t\t\t19560722911122114,\n\t\t\t\t19620043406688496,\n\t\t\t\t19640280892226541\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "tests/test-data/hmp-sigs/G36354-matches.lineages.csv",
    "content": "accession,superkingdom,phylum,class,order,family,genus,species\r\nGCF_000014485,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Streptococcaceae,g__Streptococcus,s__Streptococcus thermophilus\r\nGCF_002158885,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Lactobacillaceae,g__Lactobacillus,s__Lactobacillus gasseri_A\r\nGCF_000239915,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Lactobacillaceae,g__Leuconostoc,s__Leuconostoc citreum\r\nGCF_000012825,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Bacteroides_B,s__Bacteroides_B vulgatus\r\nGCF_000785515,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Streptococcaceae,g__Streptococcus,s__Streptococcus salivarius\r\nGCF_001435955,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Lactobacillaceae,g__Lactobacillus_B,s__Lactobacillus_B salivarius\r\nGCF_000484655,d__Bacteria,p__Firmicutes_A,c__Clostridia,o__Lachnospirales,f__Lachnospiraceae,g__Blautia_A,s__Blautia_A wexlerae\r\nGCF_000159215,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Lactobacillaceae,g__Lactobacillus_H,s__Lactobacillus_H fermentum\r\nGCF_000026325,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli_D\r\nGCF_000375505,d__Bacteria,p__Firmicutes,c__Bacilli,o__Lactobacillales,f__Streptococcaceae,g__Streptococcus,s__Streptococcus mutans\r\nGCF_001487165,d__Bacteria,p__Firmicutes_A,c__Clostridia,o__Lachnospirales,f__Lachnospiraceae,g__Blautia_A,s__Blautia_A massiliensis\r\nGCF_000154205,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Bacteroides,s__Bacteroides uniformis\r\nGCF_000332875,d__Bacteria,p__Firmicutes_A,c__Clostridia,o__Lachnospirales,f__Lachnospiraceae,g__Anaerostipes,s__Anaerostipes hadrus\r\nGCF_000020605,d__Bacteria,p__Firmicutes_A,c__Clostridia,o__Lachnospirales,f__Lachnospiraceae,g__Agathobacter,s__Agathobacter rectale\r\n"
  },
  {
    "path": "tests/test-data/hmp-sigs/README.md",
    "content": "Sample G36354 from HMP, plus matches in GTDB. Useful for testing\nsignatures with --track-abundance and lots of matches.\n"
  },
  {
    "path": "tests/test-data/lca/47+63.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"32\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"Shewanellaceae\"], [\"genus\", \"Shewanella\"], [\"species\", \"Shewanella baltica\"], [\"strain\", \"Shewanella baltica OS185\"]], \"48\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"Shewanellaceae\"], [\"genus\", \"Shewanella\"], [\"species\", \"Shewanella baltica\"], [\"strain\", \"Shewanella baltica OS223\"]]}, \"hashval_to_idx\": {\"2925290528259\": [32, 48], \"7397951382043\": [32, 48], \"9478766578752\": [32], \"26390034908046\": [32, 48], \"31811219567311\": [32], \"36191627174349\": [32, 48], \"39112643786682\": [32], \"46822418898135\": [32, 48], \"47180432856748\": [32, 48], \"60017138985701\": [32], \"60046869099761\": [32], \"65325381835497\": [32, 48], \"73805228897455\": [32], \"74037001801154\": [32, 48], \"75800414195236\": [32], \"81855770871884\": [32], \"83631867214312\": [32, 48], \"86442965329695\": [32, 48], \"89858161015356\": [32, 48], \"90806331781332\": [32, 48], \"95108107091043\": [32, 48], \"97258972896665\": [32], \"109728134835863\": [32, 48], \"111162670259148\": [32], \"113585458770972\": [32], \"116166720583475\": [32], \"121382935674939\": [32], \"125296899385152\": [32, 48], \"141176320451685\": [32], \"141284968207060\": [32], \"141805235471354\": [32, 48], \"147190179068733\": [32], \"149024066888166\": [32], \"153783847123278\": [32, 48], \"157255282423883\": [32, 48], \"160902593196961\": [32, 48], \"162823771630571\": [32], \"166163367169365\": [32, 48], \"174979625787948\": [32, 48], \"175032069345452\": [32, 48], \"182141449646872\": [32, 48], \"187503667710897\": [32, 48], \"191814288543916\": [32, 48], \"192890223167288\": [32, 48], \"195186364664284\": [32], \"196037984804395\": [32, 48], \"197033160819668\": [32], \"203335269479450\": [32, 48], \"204822233856042\": [32, 48], \"209233297808434\": [32, 48], \"210990374921109\": [32, 48], \"214600505227173\": [32], \"216861451361880\": [32, 48], \"217827490079709\": [32], \"224612774123844\": [32], \"227683744949779\": [32, 48], \"228540468204721\": [32], \"228644441858825\": [32], \"228848037454334\": [32], \"235478348737722\": [32], \"240579984608212\": [32], \"245029062906088\": [32, 48], \"248581735034297\": [32, 48], \"251186192464160\": [32, 48], \"258255664267571\": [32, 48], \"258924003299576\": [32], \"265587486568360\": [32, 48], \"269368370464968\": [32, 48], \"274235329360733\": [32, 48], \"287831833139065\": [32, 48], \"293035680952788\": [32, 48], \"294558365931778\": [32], \"295357672887769\": [32, 48], \"303548064148961\": [32, 48], \"303884611876696\": [32], \"306041902505698\": [32], \"307504482597750\": [32], \"309969810458414\": [32, 48], \"316701230964482\": [32, 48], \"316897730501733\": [32, 48], \"318378982650332\": [32], \"318568418472400\": [32], \"318769251839299\": [32], \"319335385321196\": [32, 48], \"324290895668437\": [32, 48], \"335605928681508\": [32, 48], \"339214912158009\": [32], \"341001360876621\": [32, 48], \"349347535027435\": [32, 48], \"351258437206186\": [32, 48], \"360700437330047\": [32], \"367327558614874\": [32], \"373471575728001\": [32, 48], \"374188784960382\": [32, 48], \"380562917179168\": [32, 48], \"384016070832594\": [32, 48], \"386412107814027\": [32], \"389279696836396\": [32], \"393985777467936\": [32], \"395356088720884\": [32, 48], \"396054053894786\": [32, 48], \"399215565767837\": [32, 48], \"399215750881719\": [32, 48], \"411030707384650\": [32], \"414934253467214\": [32, 48], \"423759820188444\": [32], \"430191392037330\": [32, 48], \"431262729545883\": [32], \"437506450440821\": [32, 48], \"438105428895659\": [32], \"438530381378884\": [32], \"439044119332850\": [32], \"444273467310604\": [32, 48], \"449680755457024\": [32], \"450506164772110\": [32], \"457138551847407\": [32], \"457671098462976\": [32, 48], \"461477875054528\": [32, 48], \"473505790593386\": [32, 48], \"481815788294090\": [32], \"487479264340595\": [32], \"489519873805078\": [32, 48], \"494381455384554\": [32, 48], \"495601542123242\": [32, 48], \"500121418104925\": [32], \"502603922576313\": [32], \"506180131137999\": [32], \"506336140549160\": [32, 48], \"516283812540815\": [32], \"518803929727716\": [32, 48], \"536385923460112\": [32], \"536713413896697\": [32, 48], \"537757852470225\": [32, 48], \"538244971589768\": [32, 48], \"540208451183188\": [32], \"540588787405694\": [32], \"542763181011925\": [32], \"549192277958979\": [32, 48], \"550069279000761\": [32, 48], \"553900351455263\": [32], \"554447489693319\": [32], \"559226934389812\": [32], \"561316274253850\": [32, 48], \"569061433009767\": [32, 48], \"578397933313938\": [32, 48], \"578899728742280\": [32], \"582924953100697\": [32, 48], \"583572058199369\": [32], \"589631402773527\": [32], \"595681341596523\": [32, 48], \"615537076898013\": [32], \"626475972546369\": [32, 48], \"632243908286808\": [32, 48], \"639824119626438\": [32], \"645743921515803\": [32], \"648018730756195\": [32], \"654100189449365\": [32, 48], \"668365295793413\": [32, 48], \"670523964406925\": [32], \"671677182717796\": [32, 48], \"671759739945458\": [32], \"676515376899555\": [32], \"677670347980377\": [32], \"684837528099741\": [32], \"687895771489510\": [32], \"693758846688308\": [32], \"694523064126211\": [32, 48], \"697547171219962\": [32, 48], \"698360853391060\": [32, 48], \"698383699159430\": [32, 48], \"699304671955329\": [32, 48], \"703696716274708\": [32, 48], \"706932232475763\": [32], \"708449170262947\": [32], \"726292867622433\": [32, 48], \"726450649964317\": [32], \"727800693698567\": [32], \"728799639190186\": [32], \"734019394597526\": [32, 48], \"735119835330596\": [32, 48], \"737721455578775\": [32, 48], \"738543439712395\": [32, 48], \"741951415758063\": [32], \"748275069435017\": [32, 48], \"750168693442959\": [32, 48], \"763201112060730\": [32, 48], \"763669867104092\": [32, 48], \"763903450865190\": [32, 48], \"767121298622699\": [32, 48], \"767417571203746\": [32, 48], \"770436202573059\": [32], \"771683466150501\": [32], \"772051111454828\": [32, 48], \"772152509572841\": [32, 48], \"787291725467630\": [32], \"798319271383660\": [32, 48], \"802162977380527\": [32], \"806341566938246\": [32], \"813805466325024\": [32, 48], \"815570804752811\": [32], \"816564335333987\": [32], \"817024725405204\": [32], \"817504754626588\": [32], \"821706687072387\": [32], \"826077010431743\": [32, 48], \"828356750400476\": [32, 48], \"831736232379626\": [32, 48], \"843025850509368\": [32, 48], \"843740928711723\": [32], \"845050451776051\": [32, 48], \"852042280696332\": [32, 48], \"857912135260852\": [32], \"871829709114624\": [32], \"873254290207218\": [32], \"875246525542985\": [32, 48], \"889897273652095\": [32], \"894040289596463\": [32], \"897620767964532\": [32], \"904962988643425\": [32, 48], \"905308801557271\": [32, 48], \"906900833647951\": [32, 48], \"909442865612931\": [32], \"912697620927191\": [32], \"913789208155712\": [32], \"916185332282483\": [32, 48], \"917277762192278\": [32, 48], \"917334002968300\": [32, 48], \"919561883055202\": [32], \"920956096920505\": [32, 48], \"929046426661708\": [32], \"930950142910172\": [32, 48], \"933691189676382\": [32, 48], \"934117578798841\": [32, 48], \"936230738064974\": [32, 48], \"938188383682602\": [32, 48], \"941861412444067\": [32, 48], \"942726201014166\": [32, 48], \"945032973428091\": [32, 48], \"947084478373286\": [32], \"948779805509636\": [32], \"951217347666850\": [32, 48], \"955636489177710\": [32], \"961017555998937\": [32, 48], \"961314440978493\": [32], \"964218423186297\": [32, 48], \"968212926455014\": [32], \"968926587713112\": [32], \"969379511837489\": [32], \"972618046502811\": [32, 48], \"974637708612999\": [32, 48], \"980196796037373\": [32], \"980565419407507\": [32, 48], \"983225283458250\": [32], \"987541215674501\": [32], \"992940514834332\": [32, 48], \"996549857630112\": [32, 48], \"998926194132937\": [32, 48], \"1014496787753945\": [32, 48], \"1017704359447639\": [32], \"1020480845863237\": [32], \"1024292399670426\": [32], \"1024634573363382\": [32, 48], \"1028460419483054\": [32, 48], \"1033874047074353\": [32, 48], \"1035843403340873\": [32], \"1037163054983442\": [32, 48], \"1039558325527817\": [32], \"1045088944681707\": [32, 48], \"1045785088974313\": [32], \"1048574231977270\": [32, 48], \"1051002783372661\": [32], \"1056506578664023\": [32, 48], \"1057491059487351\": [32, 48], \"1059437143082343\": [32], \"1059853068042602\": [32], \"1060760398971021\": [32, 48], \"1061967838052170\": [32, 48], \"1066520357980609\": [32, 48], \"1069224019506529\": [32], \"1071759691375436\": [32, 48], \"1072369963153950\": [32], \"1080440645655398\": [32, 48], \"1083957482733017\": [32], \"1085596610204486\": [32], \"1086288713384900\": [32, 48], \"1088705827145973\": [32], \"1089204340626863\": [32, 48], \"1090298523330765\": [32], \"1090505634288396\": [32, 48], \"1093123453947031\": [32, 48], \"1093780160574614\": [32, 48], \"1094807962005299\": [32, 48], \"1096801323900100\": [32], \"1103535113750718\": [32], \"1105423537109674\": [32], \"1110277142974534\": [32], \"1113000955148039\": [32], \"1118646614510530\": [32, 48], \"1119281509125641\": [32], \"1119614160374606\": [32, 48], \"1120783033143617\": [32], \"1129279349995602\": [32], \"1130113935525204\": [32, 48], \"1130881986044393\": [32], \"1132820492214112\": [32], \"1144614443668767\": [32, 48], \"1147223276986948\": [32], \"1147680055727668\": [32], \"1158195764117399\": [32], \"1163159397520386\": [32, 48], \"1163303408022562\": [32, 48], \"1164535774717695\": [32], \"1174386415542665\": [32, 48], \"1182168703505980\": [32, 48], \"1186019430315229\": [32], \"1190006012882786\": [32], \"1191391064481088\": [32, 48], \"1200797929442729\": [32, 48], \"1203248128742846\": [32], \"1208460365112124\": [32, 48], \"1225631809302250\": [32], \"1234453656762891\": [32, 48], \"1234698668275227\": [32, 48], \"1237451114108962\": [32], \"1241245219164313\": [32], \"1241546710850109\": [32], \"1241668290204495\": [32, 48], \"1242418821754022\": [32], \"1243711623939695\": [32, 48], \"1244290020173228\": [32], \"1244346278691061\": [32], \"1245003263018464\": [32, 48], \"1250484435790357\": [32, 48], \"1256754510605581\": [32, 48], \"1264563878337445\": [32, 48], \"1269060350975578\": [32], \"1270154727600023\": [32], \"1271923497273997\": [32], \"1273115659423672\": [32], \"1280559509676354\": [32, 48], \"1282472909138162\": [32, 48], \"1285880210646676\": [32], \"1287498565406779\": [32], \"1291218968991828\": [32], \"1292246474868788\": [32, 48], \"1292487278268025\": [32], \"1296553378083571\": [32, 48], \"1300214247397513\": [32, 48], \"1311078551896352\": [32, 48], \"1311449533649890\": [32], \"1313826623773576\": [32, 48], \"1314579091305857\": [32, 48], \"1322276316890973\": [32], \"1325524051301607\": [32, 48], \"1332430917176015\": [32, 48], \"1332675238905364\": [32, 48], \"1334939013056183\": [32, 48], \"1337600826833551\": [32, 48], \"1339674524726757\": [32, 48], \"1341661245836409\": [32, 48], \"1341942310569850\": [32, 48], \"1344850241954264\": [32, 48], \"1348761416973437\": [32], \"1356904466129199\": [32], \"1369078449955986\": [32], \"1370039456672284\": [32, 48], \"1370854092951821\": [32], \"1372351037556570\": [32, 48], \"1376501003787476\": [32], \"1378471035008080\": [32], \"1383348406006914\": [32, 48], \"1387085462947589\": [32], \"1387385057191781\": [32, 48], \"1388584147493453\": [32, 48], \"1390384276015810\": [32], \"1396964107951550\": [32, 48], \"1401298565016323\": [32, 48], \"1407230822931784\": [32], \"1410486644494794\": [32, 48], \"1410786461048450\": [32], \"1414537954260326\": [32], \"1418743862991832\": [32, 48], \"1420081602859846\": [32, 48], \"1424366051167663\": [32, 48], \"1431140791675340\": [32, 48], \"1438960590550765\": [32], \"1443983103542619\": [32], \"1449677011803774\": [32], \"1457429906997387\": [32, 48], \"1458641089226597\": [32], \"1458716224614631\": [32, 48], \"1459144447544839\": [32, 48], \"1461511802747479\": [32], \"1465076638017898\": [32, 48], \"1465867789405739\": [32], \"1467827467674025\": [32], \"1468663744355213\": [32, 48], \"1476939334625119\": [32, 48], \"1480237325649862\": [32, 48], \"1481088686107013\": [32, 48], \"1483592564337201\": [32], \"1492314148312178\": [32, 48], \"1498457281550692\": [32], \"1499617447616390\": [32], \"1503853002568292\": [32], \"1504262319315651\": [32, 48], \"1505172916296130\": [32, 48], \"1513668920373911\": [32], \"1519648405600154\": [32], \"1520931632741619\": [32], \"1521780633605083\": [32, 48], \"1522237249746592\": [32, 48], \"1522582599941917\": [32], \"1523518586763814\": [32], \"1528071377900249\": [32, 48], \"1529728378502178\": [32], \"1531967467499308\": [32], \"1535306641925593\": [32], \"1535658178776979\": [32], \"1539307118095840\": [32], \"1546368847550532\": [32, 48], \"1548019688923957\": [32], \"1552083355029650\": [32], \"1555637141656241\": [32, 48], \"1555928090783844\": [32], \"1556284449775147\": [32, 48], \"1558324681023092\": [32, 48], \"1560969323307091\": [32, 48], \"1569318833056381\": [32, 48], \"1573222947937990\": [32], \"1584949879718000\": [32], \"1588978430427079\": [32], \"1591204462547614\": [32, 48], \"1598261363578814\": [32], \"1600688746972553\": [32, 48], \"1603093475242546\": [32, 48], \"1605199952752847\": [32], \"1617237167349710\": [32, 48], \"1618568234848372\": [32], \"1619286790649678\": [32, 48], \"1621192910003941\": [32], \"1622309948672121\": [32, 48], \"1628201100274523\": [32, 48], \"1632271494883561\": [32], \"1633815225207084\": [32, 48], \"1634399357702189\": [32], \"1637441524349088\": [32], \"1642637371934077\": [32], \"1643195637784435\": [32], \"1643598557356785\": [32], \"1645422696089427\": [32], \"1645673596073883\": [32, 48], \"1645866259200502\": [32], \"1648716913052297\": [32, 48], \"1652765950688817\": [32, 48], \"1654033476941478\": [32], \"1658743399661231\": [32, 48], \"1659819081077302\": [32, 48], \"1662433005161059\": [32], \"1666913529898081\": [32, 48], \"1679605700468270\": [32, 48], \"1679921198649960\": [32, 48], \"1680089532480362\": [32, 48], \"1683724693448022\": [32], \"1689682641477370\": [32, 48], \"1691706033392643\": [32], \"1696089597402537\": [32], \"1705950022227142\": [32, 48], \"1714068118984789\": [32], \"1717459770518422\": [32, 48], \"1718014979380734\": [32], \"1719690455811654\": [32, 48], \"1734728075132632\": [32], \"1739172733710985\": [32], \"1745324659468599\": [32, 48], \"1747303538361662\": [32, 48], \"1749145577098552\": [32], \"1750021468273833\": [32], \"1750530525839386\": [32, 48], \"1757623281396842\": [32], \"1758538630442116\": [32], \"1761579455667380\": [32], \"1762621869823670\": [32, 48], \"1766019454242846\": [32], \"1766154871452422\": [32, 48], \"1768074570558590\": [32, 48], \"1769506068128510\": [32], \"1770988073934927\": [32], \"1778201561133905\": [32, 48], \"1778315567513725\": [32], \"1780288814569870\": [32, 48], \"1781805678833298\": [32, 48], \"1786019351090790\": [32], \"1787025898307575\": [32, 48], \"1793358709247570\": [32], \"1801404378718274\": [32, 48], \"1802232213372715\": [32, 48], \"1804215890133513\": [32, 48], \"1808123394894591\": [32], \"1808805306365691\": [32], \"1810435102767883\": [32], \"1813163351446427\": [32, 48], \"1818925318022107\": [32, 48], \"1819091566970620\": [32, 48], \"1821246620845572\": [32, 48], \"1825289420275521\": [32], \"1829618500803507\": [32], \"1831822327838518\": [32, 48], \"1832408978761242\": [32, 48], \"1835694527640110\": [32, 48], \"1837046808494825\": [32], \"1840320929072049\": [32, 48], \"1842060817177608\": [32, 48], \"1844561134226776\": [32], \"4550472317399\": [48], \"13950946236093\": [48], \"18944997319943\": [48], \"23965553957178\": [48], \"39116644913079\": [48], \"45540178190062\": [48], \"47367865367011\": [48], \"50188964065828\": [48], \"71315379183989\": [48], \"76190207226452\": [48], \"76733150364607\": [48], \"101072116806558\": [48], \"117764718466551\": [48], \"126550040779683\": [48], \"131219583539670\": [48], \"135497977128744\": [48], \"138537198116911\": [48], \"144854809628393\": [48], \"154055696317370\": [48], \"159984546139167\": [48], \"173817709369233\": [48], \"186033286918724\": [48], \"189372881188038\": [48], \"194756913683551\": [48], \"196583081113717\": [48], \"197511952689884\": [48], \"220853041487844\": [48], \"220923489229742\": [48], \"235388211895357\": [48], \"244969519314153\": [48], \"256982811990450\": [48], \"266208269658242\": [48], \"307854560177526\": [48], \"308368577694671\": [48], \"312508185357838\": [48], \"328294702120808\": [48], \"333432074251696\": [48], \"337243852456192\": [48], \"337788124062930\": [48], \"338296399583721\": [48], \"341707613453589\": [48], \"349282729367235\": [48], \"360629153151276\": [48], \"364874268407945\": [48], \"370407120162642\": [48], \"370595193569972\": [48], \"371700279077049\": [48], \"381400955129871\": [48], \"385242214102144\": [48], \"394797505266453\": [48], \"401601210843243\": [48], \"411114364557568\": [48], \"413011122735307\": [48], \"423964724934678\": [48], \"426125170072817\": [48], \"431514229123485\": [48], \"437290714565213\": [48], \"444196295289556\": [48], \"444519598728863\": [48], \"479169447884417\": [48], \"499291264639906\": [48], \"502817538324491\": [48], \"514225777616243\": [48], \"517767750601700\": [48], \"528657857026586\": [48], \"531621018151405\": [48], \"531911437550984\": [48], \"551298730569376\": [48], \"553354665477159\": [48], \"560183238975729\": [48], \"565120453207608\": [48], \"584608245878528\": [48], \"597246199104774\": [48], \"598744731403748\": [48], \"600409846627222\": [48], \"618082707842705\": [48], \"622540719875971\": [48], \"623112432173232\": [48], \"623564286058606\": [48], \"629214339204581\": [48], \"630564503284386\": [48], \"635842404828277\": [48], \"636454008801855\": [48], \"637963474663087\": [48], \"651565303681692\": [48], \"658694830193748\": [48], \"659359272720991\": [48], \"670476914395432\": [48], \"681398943911705\": [48], \"687743951317806\": [48], \"693383660447783\": [48], \"698714184393962\": [48], \"699414001750549\": [48], \"702028024437135\": [48], \"702655743925993\": [48], \"712467878162751\": [48], \"715119064036805\": [48], \"717098217279451\": [48], \"720002464362774\": [48], \"727685109931740\": [48], \"727786563214130\": [48], \"732669904526146\": [48], \"734554562642182\": [48], \"736734785664407\": [48], \"738157827715680\": [48], \"755428520351338\": [48], \"760914553470842\": [48], \"766769547808498\": [48], \"772219237112224\": [48], \"773253991876737\": [48], \"773640117883594\": [48], \"778719831734053\": [48], \"788541066253130\": [48], \"792800620274218\": [48], \"793126364353395\": [48], \"801192084570519\": [48], \"801979719204052\": [48], \"806030682122869\": [48], \"826029246264765\": [48], \"833989830989481\": [48], \"842811510495576\": [48], \"850325922079257\": [48], \"852616072150159\": [48], \"869440701256868\": [48], \"871739984144307\": [48], \"873878962991102\": [48], \"885732713802105\": [48], \"900984329565111\": [48], \"923846800950923\": [48], \"927733683191258\": [48], \"931188320066855\": [48], \"934829751321026\": [48], \"941382244559733\": [48], \"948088536983824\": [48], \"950251614016922\": [48], \"953311674641424\": [48], \"965844189572501\": [48], \"974258465646756\": [48], \"986147003709405\": [48], \"987407484206883\": [48], \"995584120548026\": [48], \"1000937685539434\": [48], \"1013410477239192\": [48], \"1040756065933066\": [48], \"1051364708814767\": [48], \"1057829590018958\": [48], \"1059199927925541\": [48], \"1060460577561031\": [48], \"1062598334481497\": [48], \"1075576974119467\": [48], \"1076194665589715\": [48], \"1076307473155886\": [48], \"1092749687333011\": [48], \"1106831352465275\": [48], \"1127740241225995\": [48], \"1141800182705337\": [48], \"1141957433258847\": [48], \"1153321625273873\": [48], \"1154225306393882\": [48], \"1167323239732974\": [48], \"1171405306002670\": [48], \"1175414485855042\": [48], \"1177706510708587\": [48], \"1185081332506550\": [48], \"1187776202203922\": [48], \"1188893606724299\": [48], \"1197375422019658\": [48], \"1202982399470063\": [48], \"1216183572752189\": [48], \"1216349299615743\": [48], \"1217760228928876\": [48], \"1229437984652935\": [48], \"1232027701338500\": [48], \"1247153420491991\": [48], \"1258709409617632\": [48], \"1261831186742139\": [48], \"1278259882696625\": [48], \"1294492972700075\": [48], \"1300724144234399\": [48], \"1304554095644208\": [48], \"1306972413335965\": [48], \"1310819837267255\": [48], \"1310835683752449\": [48], \"1313445683077905\": [48], \"1320340005211507\": [48], \"1327738097851136\": [48], \"1338522631065263\": [48], \"1346444314218596\": [48], \"1351570661987737\": [48], \"1355274635861570\": [48], \"1358877729391906\": [48], \"1362862766300078\": [48], \"1367870608065681\": [48], \"1370746553808697\": [48], \"1371431531962106\": [48], \"1377792461855597\": [48], \"1400398296107299\": [48], \"1407177952341116\": [48], \"1414568563679456\": [48], \"1417984842495635\": [48], \"1423937616614171\": [48], \"1429198692194983\": [48], \"1432423484009425\": [48], \"1443327278633039\": [48], \"1450861996451357\": [48], \"1452845116328517\": [48], \"1455020177231177\": [48], \"1466391743844010\": [48], \"1470580811951805\": [48], \"1472835164326678\": [48], \"1480539429325015\": [48], \"1484226042988529\": [48], \"1492550216115797\": [48], \"1497353541354036\": [48], \"1499289039133439\": [48], \"1505096985478881\": [48], \"1507126472384732\": [48], \"1509264042384987\": [48], \"1514218641840864\": [48], \"1519203024139040\": [48], \"1523791718968068\": [48], \"1535451811798960\": [48], \"1537397570523640\": [48], \"1538118443000138\": [48], \"1545740833177405\": [48], \"1553692785951588\": [48], \"1554071056896812\": [48], \"1559450514209843\": [48], \"1561680258145617\": [48], \"1580482970750366\": [48], \"1588956381434551\": [48], \"1592943214430038\": [48], \"1596940098556068\": [48], \"1599643181368601\": [48], \"1600494020961221\": [48], \"1602101064988014\": [48], \"1608467868376532\": [48], \"1613230042071034\": [48], \"1620827732630844\": [48], \"1623966948730132\": [48], \"1624318503960075\": [48], \"1626639019435247\": [48], \"1638727302192255\": [48], \"1642353838656017\": [48], \"1643453621271585\": [48], \"1658104204669725\": [48], \"1662485779876221\": [48], \"1669812089421733\": [48], \"1682746046505721\": [48], \"1686298869637573\": [48], \"1688481990617362\": [48], \"1690389336617199\": [48], \"1691171280116985\": [48], \"1695663032921673\": [48], \"1699809983366070\": [48], \"1709048685481388\": [48], \"1712457316704754\": [48], \"1712827460605989\": [48], \"1719016742757524\": [48], \"1720716306077049\": [48], \"1731588874078275\": [48], \"1737929931793243\": [48], \"1742230705053471\": [48], \"1744646337710934\": [48], \"1750848466069991\": [48], \"1772504621686320\": [48], \"1793456012680375\": [48], \"1797142702056877\": [48], \"1797145955746037\": [48], \"1797367475778719\": [48], \"1800147823225056\": [48], \"1800236363852916\": [48], \"1800292312232821\": [48], \"1806220280793222\": [48], \"1808685369384027\": [48], \"1812018140268588\": [48], \"1832446933549908\": [48], \"1833926924520737\": [48]}, \"ident_to_name\": {\"NC_009665\": \"NC_009665.1 Shewanella baltica OS185, complete genome\", \"NC_011663\": \"NC_011663.1 Shewanella baltica OS223, complete genome\"}, \"ident_to_idx\": {\"NC_009665\": 32, \"NC_011663\": 48}, \"idx_to_lid\": {\"32\": 32, \"48\": 48}}\n"
  },
  {
    "path": "tests/test-data/lca/bad-spreadsheet-2.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nBAR,\nFOO,,,,,,,,\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\nTARA_ASE_MAG_00031,Bacteria_2,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\n\n\n"
  },
  {
    "path": "tests/test-data/lca/bad-spreadsheet-3.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\n"
  },
  {
    "path": "tests/test-data/lca/bad-spreadsheet.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nBAR,\nFOO,,,,,,,,\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\n\n\n\t\n\n\n"
  },
  {
    "path": "tests/test-data/lca/both.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"3\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"]], \"6\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rickettsiales\"]], \"8\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rhodospirillales\"], [\"family\", \"Rhodospirillaceae\"]], \"9\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"Alteromonadaceae\"], [\"genus\", \"Alteromonas\"], [\"species\", \"Alteromonas_macleodii\"]], \"10\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Candidatus_Marinimicrobia \"]], \"13\": [[\"superkingdom\", \"Eukaryota\"], [\"phylum\", \"Haptophyta\"], [\"class\", \"Prymnesiophyceae\"], [\"order\", \"Isochrysidales\"], [\"family\", \"Noelaerhabdaceae\"], [\"genus\", \"Emiliania\"]], \"17\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Chloroflexi\"], [\"class\", \"Dehalococcoidetes\"]], \"18\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Bacteroidetes\"], [\"class\", \"Flavobacteriia\"], [\"order\", \"Flavobacteriales\"]], \"19\": [[\"superkingdom\", \"Archaea\"], [\"phylum\", \"Euryarchaeota\"]], \"25\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rickettsiales\"], [\"family\", \"Pelagibacteraceae\"]], \"33\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Planctomycetes\"], [\"class\", \"Planctomycetia\"], [\"order\", \"Planctomycetales\"], [\"family\", \"Planctomycetaceae\"]], \"94\": [[\"superkingdom\", \"Eukaryota\"], [\"phylum\", \"Cryptophyta\"], [\"class\", \"Cryptophyceae\"], [\"order\", \"Pyrenomonadales\"], [\"family\", \"Geminigeraceae\"], [\"genus\", \"Guillardia\"]]}, \"hashval_to_idx\": {\"10562995595685\": [857], \"24528731651193\": [857], \"31509610042191\": [857], \"32908974784047\": [857], \"53195498578655\": [857], \"61443799591443\": [857], \"76380403636571\": [857], \"76896235628955\": [857], \"77856691695524\": [857], \"78393786973287\": [857], \"80201418496370\": [857], \"84335993144356\": [857], \"94797936310939\": [857], \"105957940092709\": [857], \"111739097897485\": [857], \"119697732049712\": [857], \"127354562455109\": [857], \"130977421461728\": [857], \"139325971655177\": [857], \"142490108024754\": [857], \"151174426348926\": [857], \"154327016983767\": [857], \"157994752219753\": [857], \"162801649112349\": [857], \"166217352771913\": [857], \"169715989792474\": [857], \"169863005970977\": [857], \"170920680432388\": [857], \"191753223292227\": [857], \"192436309662022\": [857], \"199140768614194\": [857], \"223631234982456\": [857], \"227959088053307\": [857], \"228292122152680\": [857], \"230799060476680\": [857], \"237690943707059\": [857], \"238651698141290\": [857], \"244616410789205\": [857], \"249794725957680\": [857], \"250633618110367\": [857], \"265437294852372\": [857], \"296742971910535\": [857], \"298801648821475\": [857], \"311442628723617\": [857], \"320554964876228\": [857], \"326736309046279\": [857], \"327317391858538\": [857], \"330953274173341\": [857], \"339385806839963\": [857], \"351896981111098\": [857], \"356816418526580\": [857], \"359340910691298\": [857], \"362940229981590\": [857], \"376175245601839\": [857], \"377794951135383\": [857], \"383538170176118\": [857], \"405190826019210\": [857], \"419019366985097\": [857], \"420472333559451\": [857], \"424623099048372\": [857], \"426807067709942\": [857], \"437832945436091\": [857], \"453324490669345\": [857], \"473399468090647\": [857], \"478059425394378\": [857], \"503604636418777\": [857], \"504257645461199\": [857], \"519723726170318\": [857], \"535414352144597\": [857], \"552093329832932\": [857], \"552283533613540\": [857], \"570399774296279\": [857], \"573906057677194\": [857], \"578030841329163\": [857], \"583020969347118\": [857], \"598082272366083\": [857], \"598905067436688\": [857], \"605373826335520\": [857], \"611912905489988\": [857], \"615272357869699\": [857], \"620130259956137\": [857], \"626675316744135\": [857], \"649051783497293\": [857], \"649550945782744\": [857], \"649616107062526\": [857], \"653540232421414\": [857], \"657589154384957\": [857], \"663047496966675\": [857], \"674656380230209\": [857], \"675922779648438\": [857], \"685004638908548\": [857], \"687321683378840\": [857], \"694492312965896\": [857], \"695745560720758\": [857], \"699031394079440\": [857], \"730150568556797\": [857], \"734057025340276\": [857], \"740565381792126\": [857], \"742949974619323\": [857], \"747235481535622\": [857], \"752515870686382\": [857], \"756361936683733\": [857], \"763727751321831\": [857], \"780376662796622\": [857], \"825139122145494\": [857], \"839869267775584\": [857], \"851184409248712\": [857], \"853542869079925\": [857], \"859341146829347\": [857], \"861815061180380\": [857], \"865075607295074\": [857], \"866988879059649\": [857], \"868131709579478\": [857], \"873863704874322\": [857], \"885162648996897\": [857], \"888380375659008\": [857], \"894067906665045\": [857], \"894186216808367\": [857], \"894610565157783\": [857], \"903834492224114\": [857], \"916130229631731\": [857], \"921785542990484\": [857], \"924306363563538\": [857], \"938127756636807\": [857], \"944874643680241\": [857], \"948524492951369\": [857], \"958502896677536\": [857], \"960038736902569\": [857], \"963580423019642\": [857], \"963653929874928\": [857], \"963720246178203\": [857], \"972108907157861\": [857], \"985731993964305\": [857], \"992451870338110\": [857], \"995624953831674\": [857], \"996103503375214\": [857], \"997803575325414\": [857], \"1000011662912882\": [857], \"1000311664055126\": [857], \"1006912674469956\": [857], \"1021745703964614\": [857], \"1027748025184074\": [857], \"1030483418347210\": [857], \"1031768261765216\": [857], \"1036608450454783\": [857], \"1045589116197894\": [857], \"1058908728074991\": [857], \"1067771085497413\": [857], \"1069567961894711\": [857], \"1077834968245742\": [857], \"1084224644992512\": [857], \"1103974733230652\": [857], \"1108481822041435\": [857], \"1109210655998008\": [857], \"1124788242665324\": [857], \"1131529647066772\": [857], \"1133974402917419\": [857], \"1134108273731197\": [857], \"1135329572932874\": [857], \"1135526515964276\": [857], \"1136856536505534\": [857], \"1137423182069384\": [857], \"1145977905697937\": [857], \"1171399731365207\": [857], \"1197848560404720\": [857], \"1199631370040486\": [857], \"1203709304328798\": [857], \"1231751790677369\": [857], \"1234119016081508\": [857], \"1234306079312799\": [857], \"1244217914973288\": [857], \"1245525733018588\": [857], \"1269516800267811\": [857], \"1289883081856350\": [857], \"1305669645735399\": [857], \"1318947832296332\": [857], \"1325999332607313\": [857], \"1329738865039353\": [857], \"1336286025626736\": [857], \"1353843757418732\": [857], \"1358251717144690\": [857], \"1402728323258578\": [857], \"1403491741985422\": [857], \"1412337247758300\": [857], \"1421990762280671\": [857], \"1434953058963826\": [857], \"1455056862214256\": [857], \"1460751005182228\": [857], \"1465560043625592\": [857], \"1472751633382264\": [857], \"1474477255766726\": [857], \"1489433394556920\": [857], \"1495163680513271\": [857], \"1501829923225930\": [857], \"1520926209293455\": [857], \"1529077051927224\": [857], \"1530497169324493\": [857], \"1534512451876003\": [857], \"1540647316200246\": [857], \"1550266697655910\": [857], \"1554269472493525\": [857], \"1555272336335611\": [857], \"1566549753353769\": [857], \"1567818400392308\": [857], \"1579724710322379\": [857], \"1584244853000940\": [857], \"1592392857473058\": [857], \"1611872123553541\": [857], \"1614814220240598\": [857], \"1615576145731302\": [857], \"1620265231918790\": [857], \"1624795558860394\": [857], \"1629801288077095\": [857], \"1634047401610666\": [857], \"1656512554062377\": [857], \"1699124986331356\": [857], \"1708528274854104\": [857], \"1714816995104655\": [857], \"1720848946540124\": [857], \"1730350408446840\": [857], \"1737818062840410\": [857], \"1738979937646746\": [857], \"1741132171261548\": [857], \"1742291197013027\": [857], \"1748401923582053\": [857], \"1758197608285885\": [857], \"1762371962406702\": [857], \"1775082649400403\": [857], \"1808042893002100\": [857], \"1820409950006595\": [857], \"1839083638444324\": [857], \"1839374171578526\": [857], \"6208355280936\": [489], \"36068524887606\": [489], \"42214249218747\": [489], \"71544709011650\": [489], \"94568784164642\": [489], \"101850861679530\": [489], \"118981586209966\": [489], \"125672710456558\": [489], \"154651791843334\": [489], \"169140175408196\": [489], \"184284052028585\": [489], \"204317758636987\": [489], \"239767079827151\": [489], \"263714629172893\": [489], \"331551678570974\": [489], \"336369156248224\": [489], \"349171817389501\": [489], \"360738245491862\": [489], \"368526524378960\": [489], \"371853004922648\": [489], \"387760124074256\": [489], \"395069978924584\": [489], \"435726313541822\": [489], \"437726442738099\": [489], \"466850675798768\": [489], \"479940561795633\": [489], \"492822340800255\": [489], \"505053393843743\": [489], \"521929018897124\": [489], \"551051655243397\": [489], \"561597235124907\": [489], \"566005889210850\": [489], \"597659963739209\": [489], \"614239241054953\": [489], \"626864164931135\": [489], \"633556158776411\": [489], \"654143563027689\": [489], \"662684936798217\": [489], \"674788366447286\": [489], \"684743962823918\": [489], \"708691532271774\": [489], \"716087420122218\": [489], \"718681840111355\": [489], \"724463811374729\": [489], \"728003480372162\": [489], \"741586588681531\": [489], \"752579121317844\": [489], \"762178470455457\": [489], \"764311326727772\": [489], \"765842015450050\": [489], \"809589832990132\": [489], \"873420144034441\": [489], \"877782967081004\": [489], \"901903933326927\": [489], \"905122199674697\": [489], \"912467163508945\": [489], \"933164924288341\": [489], \"944691748856249\": [489], \"966164366078342\": [489], \"971397977417205\": [489], \"993246141593020\": [489], \"997198917842635\": [489], \"1011241770168934\": [489], \"1021990675672011\": [489], \"1086333609731042\": [489], \"1099388625108079\": [489], \"1140134026049688\": [489], \"1140612485446769\": [489], \"1155360553990582\": [489], \"1180702620252586\": [489], \"1193067522532199\": [489], \"1193501878717185\": [489], \"1194754022849329\": [489], \"1199340707253283\": [489], \"1205371088217680\": [489], \"1212018492323128\": [489], \"1218080879550847\": [489], \"1225428973291608\": [489], \"1235708232750610\": [489], \"1255653286672711\": [489], \"1280765206128263\": [489], \"1289207631287924\": [489], \"1314149194422338\": [489], \"1315482081623467\": [489], \"1323067332510620\": [489], \"1330510523930247\": [489], \"1364087674189728\": [489], \"1381232621944922\": [489], \"1382793403064174\": [489], \"1404752792392316\": [489], \"1419600108775672\": [489], \"1421128964660121\": [489], \"1447604587212791\": [489], \"1466536701554611\": [489], \"1470621573979842\": [489], \"1473723955484520\": [489], \"1483283307735980\": [489], \"1487403213599213\": [489], \"1487946879314134\": [489], \"1494694379181620\": [489], \"1495386374055437\": [489], \"1502210876116244\": [489], \"1525738270622028\": [489], \"1549136143814996\": [489], \"1557599673232977\": [489], \"1559862409288722\": [489], \"1562462382895068\": [489], \"1583002478354607\": [489], \"1585500726769092\": [489], \"1599330233273423\": [489], \"1608584956909839\": [489], \"1622299095937281\": [489], \"1624853577729432\": [489], \"1644411908722189\": [489], \"1644449340371067\": [489], \"1654488493321929\": [489], \"1676793853394886\": [489], \"1680574849583070\": [489], \"1699735640903104\": [489], \"1704695626669794\": [489], \"1726515581163405\": [489], \"1726714711365201\": [489], \"1750030548616414\": [489], \"1760373763171009\": [489], \"1783812241622447\": [489], \"1785318296981339\": [489], \"1806265091342920\": [489], \"1813955955472710\": [489], \"1820725653532566\": [489], \"1824475020928936\": [489], \"2154070670431\": [498], \"11613599405072\": [498], \"17158709879574\": [498], \"18636857977688\": [498], \"21409341449014\": [498], \"36157092385127\": [498], \"37255098028533\": [498], \"45314565001486\": [498], \"64823906011887\": [498], \"82100430654558\": [498], \"94186003905968\": [498], \"94759490856116\": [498], \"109556514734963\": [498], \"135993103089803\": [498], \"149435896456274\": [498], \"176247281074587\": [498], \"176548263614253\": [498], \"182099256907654\": [498], \"205794314413990\": [498], \"209809296460674\": [498], \"211018913675927\": [498], \"228265434919935\": [498], \"232543135703807\": [498], \"240075274555327\": [498], \"243384762378779\": [498], \"258505663669118\": [498], \"284671357618038\": [498], \"330586197522192\": [498], \"337595943587486\": [498], \"339046657107648\": [498], \"345283537889873\": [498], \"352749716046734\": [498], \"368188825499029\": [498], \"370644754347883\": [498], \"384426610613145\": [498], \"429897910485367\": [498], \"437563653949409\": [498], \"446917768548417\": [498], \"466721964091793\": [498], \"477761661752479\": [498], \"480101632783627\": [498], \"486698788494774\": [498], \"490825880012310\": [498], \"509559903656279\": [498], \"533538808049909\": [498], \"540304131043221\": [498], \"544911218549468\": [498], \"546830412201894\": [498], \"551842115140920\": [498], \"569809137269967\": [498], \"588266575028078\": [498], \"600287836839255\": [498], \"601572380093307\": [498], \"604212745462633\": [498], \"606681675605454\": [498], \"621217629394241\": [498], \"626839960272263\": [498], \"702217618459513\": [498], \"708680645325824\": [498], \"721929156533915\": [498], \"725002428163720\": [498], \"734913192234209\": [498], \"739563390819048\": [498], \"770426510223136\": [498], \"776833962758413\": [498], \"777181673746647\": [498], \"778705456285644\": [498], \"782992626561501\": [498], \"784899437026658\": [498], \"786813800880309\": [498], \"787821625319285\": [498], \"816141080071303\": [498], \"822328842780575\": [498], \"862377616321161\": [498], \"887276967059104\": [498], \"924791284639586\": [498], \"930339467722670\": [498], \"934803755076129\": [498], \"966465253494781\": [498], \"1001104561528231\": [498], \"1015378462263320\": [498], \"1018545617646649\": [498], \"1022398637712353\": [498], \"1025850380217436\": [498], \"1034583203792866\": [498], \"1049282425886331\": [498], \"1068588658892308\": [498], \"1069875943116865\": [498], \"1070897190476202\": [498], \"1085488940566427\": [498], \"1086530812302512\": [498], \"1088280727587709\": [498], \"1093395863642239\": [498], \"1111529656886488\": [498], \"1112281528512751\": [498], \"1117431791291604\": [498], \"1123491213446859\": [498], \"1125002666367134\": [498], \"1129496142367355\": [498], \"1136498413644713\": [498], \"1139585483816814\": [498], \"1139980954757265\": [498], \"1180093137069047\": [498], \"1192961511333986\": [498], \"1206951136273296\": [498], \"1215528855788399\": [498], \"1226548966332152\": [498], \"1244212530083692\": [498], \"1249718005761151\": [498], \"1266294095554016\": [498], \"1293171242050650\": [498], \"1298343549533329\": [498], \"1298772684063625\": [498], \"1302764744749803\": [498], \"1310203341171608\": [498], \"1318707003522548\": [498], \"1321148353561534\": [498], \"1340053350923821\": [498], \"1343323356517565\": [498], \"1343686747529632\": [498], \"1349355936430243\": [498], \"1379235651461118\": [498], \"1408555596863480\": [498], \"1414965904547538\": [498], \"1434481614169292\": [498], \"1435950595557520\": [498], \"1435951254461360\": [498], \"1451625789193395\": [498], \"1453240476698633\": [498], \"1472618932357513\": [498], \"1480608662847573\": [498], \"1517335615843377\": [498], \"1521500422349458\": [498], \"1534709892533053\": [498], \"1538828462063838\": [498], \"1541122250333960\": [498], \"1578275754513598\": [498], \"1583639429170575\": [498], \"1584311045209816\": [498], \"1588746849987988\": [498], \"1596894250423553\": [498], \"1606106653479381\": [498], \"1643401728406689\": [498], \"1643665429870600\": [498], \"1648082018038194\": [498], \"1668463535552495\": [498], \"1671662012111622\": [498], \"1720273421873298\": [498], \"1725064209082042\": [498], \"1726140246783857\": [498], \"1755860788110182\": [498], \"1766133708956687\": [498], \"1777492724682854\": [498], \"1786243409011575\": [498], \"1786837630790123\": [498], \"1792635871481728\": [498], \"1800434112651860\": [498], \"1820302498436846\": [498], \"1822996777733546\": [498], \"1830239223669948\": [498], \"1831496353989179\": [498], \"1842193178587375\": [498], \"1755377357569\": [655], \"3082991534458\": [655], \"37674921307309\": [655], \"51757952165147\": [655], \"83249603674977\": [655], \"98278786877433\": [655], \"110918909962148\": [655], \"158842808254794\": [655], \"181610240092945\": [655], \"186393473976269\": [655], \"256944922734799\": [655], \"280139167272330\": [655], \"280694169167105\": [655], \"282804864962014\": [655], \"283913839911121\": [655], \"302636762051771\": [655], \"333777327066418\": [655], \"352301021576746\": [655], \"374323998298593\": [655], \"376776194679750\": [655], \"415059665295686\": [655], \"450355571187752\": [655], \"496021466837136\": [655], \"513847419343763\": [655], \"533098841598931\": [655], \"551424679142865\": [655], \"572952041939907\": [655], \"598951123417882\": [655], \"644716794317995\": [655], \"666983937917321\": [655], \"698085082076823\": [655], \"725360638385089\": [655], \"733368791391251\": [655], \"742106827831986\": [655], \"754400534232483\": [655], \"766487817958725\": [655], \"779898646145378\": [655], \"805761205359981\": [655], \"827829009478471\": [655], \"842833370602399\": [655], \"851874316040634\": [655], \"873474524304755\": [655], \"884548610146747\": [655], \"885981040888197\": [655], \"1022176283628620\": [655], \"1034527341794613\": [655], \"1045561434498870\": [655], \"1066970898888075\": [655], \"1083066439970342\": [655], \"1089557102031316\": [655], \"1092307189826319\": [655], \"1163108229994126\": [655], \"1195232383066510\": [655], \"1227740186477789\": [655], \"1234304032112874\": [655], \"1236049686644348\": [655], \"1236103830273404\": [655], \"1274575616589903\": [655], \"1277966237493615\": [655], \"1281400730121564\": [655], \"1286543961158837\": [655], \"1303073895065136\": [655], \"1311399934673648\": [655], \"1360492291793115\": [655], \"1373617058836495\": [655], \"1385213264271922\": [655], \"1411848806120784\": [655], \"1425195440803466\": [655], \"1447443911041043\": [655], \"1452335535856863\": [655], \"1469763754212350\": [655], \"1474859751633660\": [655], \"1499096632133739\": [655], \"1510971336998315\": [655], \"1511246723267502\": [655], \"1521617215738831\": [655], \"1534975016520539\": [655], \"1552308262926966\": [655], \"1558028922023637\": [655], \"1559228200332082\": [655], \"1568191056575073\": [655], \"1589695304546038\": [655], \"1631609804784143\": [655], \"1651663982109362\": [655], \"1662077561907561\": [655], \"1663726558028104\": [655], \"1691585161752441\": [655], \"1705150598608802\": [655], \"1710530657401696\": [655], \"1722736552312198\": [655], \"1724637120505434\": [655], \"1731222305115922\": [655], \"1737427055940683\": [655], \"1765562515753998\": [655], \"1780019298955332\": [655], \"1780577439636513\": [655], \"1791580146020614\": [655], \"1809303911710966\": [655], \"1816546939913041\": [655], \"1818883584260150\": [655], \"1820646094225648\": [655], \"1831642379952732\": [655], \"1836615616867670\": [655], \"4990130232391\": [816], \"8368817863658\": [816], \"39247586010559\": [816], \"88223530165769\": [816], \"91012099780685\": [816], \"91204535361819\": [816], \"98472195315695\": [816], \"102329372072305\": [816], \"118451811599376\": [816], \"124307475703783\": [816], \"132828672506666\": [816], \"147843615825558\": [816], \"148401819252834\": [816], \"161753588012910\": [816], \"185137442703575\": [816], \"189845459588490\": [816], \"234071686733028\": [816], \"249961568718550\": [816], \"255811150095663\": [816], \"369018430529342\": [816], \"369112565245453\": [816], \"400975246805552\": [816], \"402808128470137\": [816], \"408659625949596\": [816], \"418425365675272\": [816], \"486432496176269\": [816], \"516618314134585\": [816], \"531219626796108\": [816], \"541375206099738\": [816], \"563606808058303\": [816], \"566132268978482\": [816], \"570999386390200\": [816], \"574915610921772\": [816], \"582556537706937\": [816], \"635910217844386\": [816], \"688678466671567\": [816], \"689433751790507\": [816], \"691494155159109\": [816], \"737311651381749\": [816], \"751541951174871\": [816], \"775850804274730\": [816], \"817517363145528\": [816], \"823842897128139\": [816], \"842780727558585\": [816], \"897897827060461\": [816], \"914563280602157\": [816], \"922542623100009\": [816], \"923741612722184\": [816], \"957646309653606\": [816], \"960481250814720\": [816], \"1003830617787109\": [816], \"1024732275999586\": [816], \"1053170459001440\": [816], \"1062093792453642\": [816], \"1071206204977552\": [816], \"1095678110806546\": [816], \"1097042701301902\": [816], \"1101094830302962\": [816], \"1104407270947612\": [816], \"1109193592292630\": [816], \"1111403307795503\": [816], \"1120685056103109\": [816], \"1192670842680579\": [816], \"1197484077672885\": [816], \"1201273993161858\": [816], \"1206023274000524\": [816], \"1208315481951471\": [816], \"1235998531395678\": [816], \"1251427518211548\": [816], \"1253529243413716\": [816], \"1294466340331850\": [816], \"1317058728803394\": [816], \"1346526936092076\": [816], \"1352975814565569\": [816], \"1381808770778725\": [816], \"1384599181425691\": [816], \"1402411386465346\": [816], \"1412108050480848\": [816], \"1413830391996613\": [816], \"1417750873237741\": [816], \"1418819848598401\": [816], \"1462974146350636\": [816], \"1466533891444695\": [816], \"1487896054930759\": [816], \"1524993903457246\": [816], \"1527385792005225\": [816], \"1527858526846521\": [816], \"1552596157462732\": [816], \"1606110187603565\": [816], \"1608979683649839\": [816], \"1631797304609705\": [816], \"1637190338761226\": [816], \"1671119091983878\": [816], \"1690684027172166\": [816], \"1755461485177794\": [816], \"1758245196527512\": [816], \"1768839507616777\": [816], \"1780829418121092\": [816], \"1789070117978249\": [816], \"1799092034120373\": [816], \"1804288360971551\": [816], \"10607336378061\": [369], \"26939532728115\": [369], \"27283909081946\": [369], \"30595562710257\": [369], \"65599300659773\": [369], \"72585696461733\": [369], \"75695590176170\": [369], \"95646383063673\": [369], \"101391057456199\": [369], \"108643162636025\": [369], \"123320862242455\": [369], \"155895662812690\": [369], \"187327501196201\": [369], \"201146171439314\": [369], \"225488005985269\": [369], \"229338502881264\": [369], \"233406517053984\": [369], \"278067824418084\": [369], \"303810296308056\": [369], \"310730711278954\": [369], \"325758510711792\": [369], \"341827029842014\": [369], \"347235557954511\": [369], \"370285270123063\": [369], \"397593722447917\": [369], \"399713105175162\": [369], \"404237983038399\": [369], \"405188498075243\": [369], \"417026024482875\": [369], \"417823040902451\": [369], \"424349738744671\": [369], \"430810160086009\": [369], \"452369621564489\": [369], \"464339071660690\": [369], \"520522148288620\": [369], \"523234657072472\": [369], \"525382025149016\": [369], \"565755888038935\": [369], \"578110690392500\": [369], \"580648884579735\": [369], \"618070161363637\": [369], \"629330925982128\": [369], \"632457349970547\": [369], \"656154754735941\": [369], \"656546567654470\": [369], \"671314740322689\": [369], \"695389515807071\": [369], \"728189167703355\": [369], \"754086344795525\": [369], \"759305600289981\": [369], \"773109908849868\": [369], \"815579247578993\": [369], \"816535193626688\": [369], \"833589020847128\": [369], \"865889840214614\": [369], \"880621753429758\": [369], \"900568472012752\": [369], \"921898937375809\": [369], \"924875973146526\": [369], \"926062088273064\": [369], \"949604818763042\": [369], \"974928607181594\": [369], \"992298576927724\": [369], \"999475118350701\": [369], \"1009314455278794\": [369], \"1018024537905198\": [369], \"1023919580270175\": [369], \"1040821499512008\": [369], \"1041988026266802\": [369], \"1057822413034795\": [369], \"1102561612587436\": [369], \"1123616285016874\": [369], \"1153319578759790\": [369], \"1170417709405424\": [369], \"1183796570581607\": [369], \"1187681356269207\": [369], \"1219174417038219\": [369], \"1257157904391424\": [369], \"1298879736495681\": [369], \"1307140606473105\": [369], \"1347511452297582\": [369], \"1359784302990782\": [369], \"1368939968260254\": [369], \"1390254002816578\": [369], \"1401196768213202\": [369], \"1408246134984875\": [369], \"1434545464533873\": [369], \"1464022149600998\": [369], \"1464248617432475\": [369], \"1472108174328225\": [369], \"1480074977212538\": [369], \"1480562148440039\": [369], \"1483432981465264\": [369], \"1513468978680247\": [369], \"1520849332803968\": [369], \"1532355471306361\": [369], \"1536694617651602\": [369], \"1549214456685477\": [369], \"1549377149912348\": [369], \"1590055647252735\": [369], \"1590163477868845\": [369], \"1593232436005719\": [369], \"1620129270582217\": [369], \"1637453738379886\": [369], \"1675102827911278\": [369], \"1690821057958241\": [369], \"1692929299795113\": [369], \"1703819575405954\": [369], \"1721768760146258\": [369], \"1724274761186054\": [369], \"1724777356134483\": [369], \"1739347265459290\": [369], \"1761741274408898\": [369], \"1770832135555876\": [369], \"1801608671517029\": [369], \"1810736283020090\": [369], \"1832067341818419\": [369], \"1842706577351221\": [369], \"5800623574443\": [209], \"25611402419070\": [209], \"35848452926418\": [209], \"47125346942912\": [209], \"69206433906837\": [209], \"70971657432220\": [209], \"74969315887584\": [209], \"87818569597906\": [209], \"88177528801627\": [209], \"88558069157055\": [209], \"108203963523507\": [209], \"108443102922307\": [209], \"112140072765322\": [209], \"130273410324073\": [209], \"132756042028828\": [209], \"136103422093559\": [209], \"138749504942907\": [209], \"145063658621427\": [209], \"157699812439976\": [209], \"160477635639471\": [209], \"160588124274427\": [209], \"175859160508524\": [209], \"183128489700907\": [209], \"185710972090876\": [209], \"199176257796918\": [209], \"199349200750108\": [209], \"201639770900724\": [209], \"215675142110152\": [209], \"232507402626946\": [209], \"233580637733710\": [209], \"257601439160609\": [209], \"281406412627527\": [209], \"315058803606541\": [209], \"317225954152968\": [209], \"327890195454076\": [209], \"332253504650299\": [209], \"337858815869507\": [209], \"364504061856809\": [209], \"392056967608320\": [209], \"396998226544071\": [209], \"401831972184201\": [209], \"407460764370806\": [209], \"414757834672923\": [209], \"429940761076004\": [209], \"430145404703512\": [209], \"430340931123862\": [209], \"459600371063076\": [209], \"461816167228748\": [209], \"467553143839147\": [209], \"467965861615487\": [209], \"469491649973613\": [209], \"476934557413763\": [209], \"483520495131121\": [209], \"486893343493298\": [209], \"495840600581230\": [209], \"513439237652229\": [209], \"517501170885576\": [209], \"524681348378723\": [209], \"535608337216640\": [209], \"536603170974993\": [209], \"550644769509398\": [209], \"554500850208966\": [209], \"556274126422139\": [209], \"570976775894242\": [209], \"575328756700342\": [209], \"596284140456213\": [209], \"606584715546302\": [209], \"609450033065870\": [209], \"629299022904766\": [209], \"646567808425539\": [209], \"649798580801772\": [209], \"660533609429700\": [209], \"672426580955871\": [209], \"705074853849731\": [209], \"721875062478434\": [209], \"727363858023132\": [209], \"738817714031749\": [209], \"738905590810927\": [209], \"750214132481175\": [209], \"750436094231183\": [209], \"756466667603633\": [209], \"768829332464922\": [209], \"778863359409562\": [209], \"783475631069251\": [209], \"792677854076447\": [209], \"799206853941914\": [209], \"808192987447956\": [209], \"808785031097140\": [209], \"829974031014041\": [209], \"840663926518880\": [209], \"845725463358126\": [209], \"856477322411613\": [209], \"859261072067270\": [209], \"862944162690749\": [209], \"872671202442464\": [209], \"880114851978841\": [209], \"886743167308030\": [209], \"897253992508278\": [209], \"899193167683932\": [209], \"899848155791521\": [209], \"900308154594725\": [209], \"918352434071525\": [209], \"919589600111065\": [209], \"937554148897245\": [209], \"940584271784165\": [209], \"957414915761420\": [209], \"1002658299430598\": [209], \"1003133984682629\": [209], \"1010716667018946\": [209], \"1019064079829955\": [209], \"1019683988509104\": [209], \"1027239003660216\": [209], \"1037594618359116\": [209], \"1057384089045421\": [209], \"1058731523030786\": [209], \"1063076775921208\": [209], \"1063954908685224\": [209], \"1071595606716594\": [209], \"1081467914084016\": [209], \"1084870721228148\": [209], \"1085075934637959\": [209], \"1094154390656889\": [209], \"1109251111784810\": [209], \"1120119584317828\": [209], \"1122003109687969\": [209], \"1124326526377180\": [209], \"1146984068615441\": [209], \"1147035753060783\": [209], \"1153973893444966\": [209], \"1158655739296264\": [209], \"1159404884914444\": [209], \"1167189227589318\": [209], \"1168299943419464\": [209], \"1172835462128761\": [209], \"1185264113450797\": [209], \"1209240599219540\": [209], \"1211219396032236\": [209], \"1212426837627024\": [209], \"1212657565188368\": [209], \"1227462289314255\": [209], \"1227993007605704\": [209], \"1228132760511907\": [209], \"1237353691632859\": [209], \"1237645566018181\": [209], \"1237873623872013\": [209], \"1242108056916585\": [209], \"1243288666319706\": [209], \"1253667784809357\": [209], \"1256332125853854\": [209], \"1258856032804609\": [209], \"1268489178536922\": [209], \"1270046182759902\": [209], \"1277339966297064\": [209], \"1280747289734350\": [209], \"1291257856393018\": [209], \"1301407042754231\": [209], \"1306865822485042\": [209], \"1334215654588005\": [209], \"1337917899836268\": [209], \"1344967568037371\": [209], \"1352100309415596\": [209], \"1353718668683422\": [209], \"1363596268422841\": [209], \"1364900030037157\": [209], \"1368643180327364\": [209], \"1369792434246639\": [209], \"1374340891384378\": [209], \"1382414274551816\": [209], \"1386823566807088\": [209], \"1400078479596712\": [209], \"1400294853580658\": [209], \"1401629327152116\": [209], \"1410844958448662\": [209], \"1417955827796052\": [209], \"1424680597014401\": [209], \"1437676718046964\": [209], \"1439678281291841\": [209], \"1442345169223341\": [209], \"1457140797890808\": [209], \"1473805881868854\": [209], \"1476954417971324\": [209], \"1478496234828355\": [209], \"1484481198755222\": [209], \"1487425672248312\": [209], \"1503936837642869\": [209], \"1516624293552334\": [209], \"1521781952277669\": [209], \"1525868732872280\": [209], \"1546677782119422\": [209], \"1551690013399673\": [209], \"1568652950303964\": [209], \"1570282376978240\": [209], \"1572262201604422\": [209], \"1575629237161059\": [209], \"1579208730637462\": [209], \"1592311088222633\": [209], \"1611240920804037\": [209], \"1615982405146307\": [209], \"1618630841567861\": [209], \"1627555959119743\": [209], \"1668331618363067\": [209], \"1678908367326276\": [209], \"1680283761417727\": [209], \"1682678871439437\": [209], \"1691135052992852\": [209], \"1699689830867968\": [209], \"1711375730214477\": [209], \"1718319376401975\": [209], \"1718408791227166\": [209], \"1733867723102557\": [209], \"1738025256080792\": [209], \"1752072381029037\": [209], \"1754064673814079\": [209], \"1762473214148953\": [209], \"1773448062164029\": [209], \"1782105608943652\": [209], \"1783578637520294\": [209], \"1784222555980859\": [209], \"1784501073296577\": [209], \"1787049549813377\": [209], \"1800523524146309\": [209], \"1801929764555842\": [209], \"1810508103241652\": [209], \"1812513619048322\": [209], \"1828660028151100\": [209], \"1830163692489121\": [209], \"1834179091682630\": [209], \"1837272077295623\": [209], \"1839082148686262\": [209], \"4544564541777\": [395], \"8581313229021\": [395], \"13858004909890\": [395], \"22109472800306\": [395], \"33243310918093\": [395], \"35046909730857\": [395], \"36002943219015\": [395], \"36803243944975\": [395], \"40925794788684\": [395], \"50300561984719\": [395], \"54925088761051\": [395], \"65148730313359\": [395], \"67973641676064\": [395], \"76325417666516\": [395], \"92860832822232\": [395], \"104860744849022\": [395], \"111871575504049\": [395], \"125329050929634\": [395], \"129188889144749\": [395], \"131536884986771\": [395], \"132973903820267\": [395], \"151766414818154\": [395], \"155289997869327\": [395], \"168141435154447\": [395], \"177548054693036\": [395], \"181315672994049\": [395], \"183757115294821\": [395], \"194222120718333\": [395], \"213139491415980\": [395], \"218773877233050\": [395], \"240860931922136\": [395], \"248846621773679\": [395], \"260236619960314\": [395], \"262780918637537\": [395], \"265790317618837\": [395], \"272636420861010\": [395], \"274046819588001\": [395], \"277912619386690\": [395], \"286605637178530\": [395], \"292973459027025\": [395], \"318322734402250\": [395], \"321838426241799\": [395], \"328850724708193\": [395], \"346478169352874\": [395], \"348380083210079\": [395], \"354246879167003\": [395], \"359178493513027\": [395], \"360239247174006\": [395], \"371785010691833\": [395], \"379094350614852\": [395], \"381077258936088\": [395], \"381442111648337\": [395], \"388577667001338\": [395], \"392358579933525\": [395], \"400440609219021\": [395], \"406038583921057\": [395], \"408330197378941\": [395], \"410163772670652\": [395], \"423234050937512\": [395], \"425218685176027\": [395], \"446090115298591\": [395], \"446453155073485\": [395], \"455236569828737\": [395], \"458856926805669\": [395], \"462486830307725\": [395], \"462595004203208\": [395], \"483166107352903\": [395], \"483704898247277\": [395], \"494244104678300\": [395], \"494639859417056\": [395], \"501192188637884\": [395], \"510675622259470\": [395], \"518201549483575\": [395], \"522168448102877\": [395], \"547850350038011\": [395], \"548618821296654\": [395], \"566297202288227\": [395], \"571007990707951\": [395], \"577781161449752\": [395], \"583275969589027\": [395], \"594912311991845\": [395], \"601236609369372\": [395], \"602107849542274\": [395], \"608271077234669\": [395], \"632062004417280\": [395], \"632109760592796\": [395], \"634727833351551\": [395], \"637278824563158\": [395], \"644971206181512\": [395], \"648533249063278\": [395], \"649287581711486\": [395], \"651968974610436\": [395], \"655856515200674\": [395], \"679849320365200\": [395], \"681103172177451\": [395], \"687704345982478\": [395], \"695282473938552\": [395], \"698348460889683\": [395], \"705162594752041\": [395], \"707306922556810\": [395], \"711072917501582\": [395], \"714754050038510\": [395], \"730705098468235\": [395], \"744079072205921\": [395], \"745952201173799\": [395], \"747016626005998\": [395], \"757542835394800\": [395], \"766146707775082\": [395], \"773178920995688\": [395], \"782994228389590\": [395], \"803727313826863\": [395], \"812750392739441\": [395], \"821574537203519\": [395], \"845836091437649\": [395], \"853742331786980\": [395], \"864887941091323\": [395], \"869671685914354\": [395], \"888435024190881\": [395], \"947456280478229\": [395], \"949367246267583\": [395], \"956491542870449\": [395], \"967048970295402\": [395], \"971202060766007\": [395], \"978931950435734\": [395], \"993056624873370\": [395], \"996975645223807\": [395], \"1007707215648390\": [395], \"1008149686779084\": [395], \"1018985563127910\": [395], \"1022692054265472\": [395], \"1027179518608476\": [395], \"1036606260474886\": [395], \"1043850921081072\": [395], \"1049874321329540\": [395], \"1075834968301467\": [395], \"1087755718865650\": [395], \"1088290622982785\": [395], \"1088308856754065\": [395], \"1097255462428957\": [395], \"1102494175504539\": [395], \"1106200855941023\": [395], \"1163422042717229\": [395], \"1199776215756672\": [395], \"1203944597053244\": [395], \"1211551163495496\": [395], \"1216224755819991\": [395], \"1216971004976208\": [395], \"1246866724202403\": [395], \"1262726525591376\": [395], \"1271821592733966\": [395], \"1295576174349907\": [395], \"1298848536168936\": [395], \"1310656662269501\": [395], \"1326048486469817\": [395], \"1327897694537274\": [395], \"1339040494856037\": [395], \"1343187481578618\": [395], \"1349479868328803\": [395], \"1351034322121175\": [395], \"1360641268612126\": [395], \"1383827641790386\": [395], \"1383888566098538\": [395], \"1399068747946805\": [395], \"1405006380107785\": [395], \"1414729661325784\": [395], \"1414734978678493\": [395], \"1420322178649275\": [395], \"1420740489306321\": [395], \"1439813556506380\": [395], \"1446126062725480\": [395], \"1463513307502000\": [395], \"1463964185955659\": [395], \"1466749058711287\": [395], \"1472274362269533\": [395], \"1472753635123188\": [395], \"1473369856693004\": [395], \"1479361489796687\": [395], \"1482158842043339\": [395], \"1485775606140555\": [395], \"1499165253592503\": [395], \"1502229061684166\": [395], \"1503510407494678\": [395], \"1505420843877866\": [395], \"1519588803781842\": [395], \"1568212279715817\": [395], \"1573568323455958\": [395], \"1574674975536634\": [395], \"1578938126273913\": [395], \"1579338155998981\": [395], \"1590684992147198\": [395], \"1597887774957974\": [395], \"1615302073601615\": [395], \"1617303401995043\": [395], \"1635926261617086\": [395], \"1637649705314274\": [395], \"1643056357828058\": [395], \"1648761532214959\": [395], \"1652982371280533\": [395], \"1654211925340972\": [395], \"1663734887887719\": [395], \"1665001711886066\": [395], \"1689681978632597\": [395], \"1696936316661449\": [395], \"1708928874057963\": [395], \"1722636935798965\": [395], \"1729879039789897\": [395], \"1730265273177045\": [395], \"1733781125039495\": [395], \"1737858152932701\": [395], \"1740860866518638\": [395], \"1746967568522022\": [395], \"1756717989991904\": [395], \"1759759973007296\": [395], \"1773532575823108\": [395], \"1782809577016768\": [395], \"1789129435832413\": [395], \"1795223687727048\": [395], \"1806483358546057\": [395], \"1806587563187986\": [395], \"1808755229329691\": [395], \"1818981796527103\": [395], \"1825012166950925\": [395], \"1829615133297992\": [395], \"15178687472614\": [618], \"23451565558057\": [618], \"29802015360361\": [618], \"32826725580798\": [618], \"35805813352894\": [618], \"36911040567152\": [618], \"39730495057510\": [618], \"43662545607037\": [618], \"49916739994841\": [618], \"54650486778209\": [618], \"60920416732028\": [618], \"69222511390780\": [618], \"72143496731151\": [618], \"72672714732841\": [618], \"73462597817063\": [618], \"74480273687593\": [618], \"81141531194682\": [618], \"85194101933384\": [618], \"85363502931963\": [618], \"89201982906726\": [618], \"92446352601544\": [618], \"95695791679483\": [618], \"96760177719291\": [618], \"98233183290949\": [618], \"99127984678252\": [618], \"107004878782990\": [618], \"108906823584505\": [618], \"110508400641155\": [618], \"117705231804942\": [618], \"124269073963100\": [618], \"127983695923518\": [618], \"128596409088529\": [618], \"136902241516123\": [618], \"137511374767260\": [618], \"161492444015182\": [618], \"163117975673859\": [618], \"164748615711167\": [618], \"174318537322611\": [618], \"176820632938850\": [618], \"189416869050819\": [618], \"189422835112559\": [618], \"198414189130615\": [618], \"199383649414984\": [618], \"199533357950869\": [618], \"202476493388977\": [618], \"214149756231580\": [618], \"219053234836518\": [618], \"219670350073289\": [618], \"224668157092109\": [618], \"225220244439549\": [618], \"235442241365554\": [618], \"239533658407794\": [618], \"239541989805406\": [618], \"241500458160945\": [618], \"242145921678807\": [618], \"244069116756483\": [618], \"244702817715076\": [618], \"247881006543029\": [618], \"260691896158530\": [618], \"266991875575632\": [618], \"271732562945212\": [618], \"277769850289210\": [618], \"282430511898310\": [618], \"289038355344327\": [618], \"296442714921528\": [618], \"300520209828541\": [618], \"302114445987910\": [618], \"309560226091739\": [618], \"310533281599207\": [618], \"314262919322292\": [618], \"315814221289185\": [618], \"318684366063505\": [618], \"320689916766499\": [618], \"329989809825660\": [618], \"335541615422531\": [618], \"336914600016286\": [618], \"343263666920894\": [618], \"346229099718346\": [618], \"350967281668571\": [618], \"352469674128290\": [618], \"361966072584608\": [618], \"362812602109510\": [618], \"364824838084435\": [618], \"366767801547974\": [618], \"376395032754465\": [618], \"380446666194789\": [618], \"381895361646444\": [618], \"388127967780721\": [618], \"389767493190720\": [618], \"394732093517291\": [618], \"396673090713581\": [618], \"397266036962206\": [618], \"400443342931169\": [618], \"404286438302771\": [618], \"406984298761880\": [618], \"409684599278326\": [618], \"411927432997822\": [618], \"413950803396897\": [618], \"417269856660241\": [618], \"418903340981454\": [618], \"421097157440564\": [618], \"424016564938797\": [618], \"429595156887461\": [618], \"431140726542088\": [618], \"432418874124012\": [618], \"439820956643196\": [618], \"440719486373501\": [618], \"441344576415933\": [618], \"441450601930038\": [618], \"443834728134524\": [618], \"451145760172263\": [618], \"455970982162927\": [618], \"458643571611480\": [618], \"459133973891985\": [618], \"461085853236504\": [618], \"462846148787292\": [618], \"468071097515930\": [618], \"469306577813442\": [618], \"469479316873210\": [618], \"473569722912136\": [618], \"473800104882275\": [618], \"481656335882710\": [618], \"487951568171543\": [618], \"489127517933523\": [618], \"491161732225795\": [618], \"494489285902441\": [618], \"497722964887474\": [618], \"501082765123300\": [618], \"505279291453226\": [618], \"507114615939805\": [618], \"513000747984813\": [618], \"513943001163427\": [618], \"513987867679122\": [618], \"518016388642070\": [618], \"523482841905638\": [618], \"524880929668984\": [618], \"534974536925031\": [618], \"536554797766420\": [618], \"545171311145688\": [618], \"554273731079886\": [618], \"557170799751620\": [618], \"562293314281180\": [618], \"574296395714518\": [618], \"578086367125209\": [618], \"578115408105066\": [618], \"580629010932803\": [618], \"580750432869389\": [618], \"605767878393571\": [618], \"605999612814682\": [618], \"610469443956833\": [618], \"613668129645303\": [618], \"614656614766476\": [618], \"623920338952235\": [618], \"625470904159488\": [618], \"630373308979530\": [618], \"630652727169289\": [618], \"637373000642442\": [618], \"638206612732364\": [618], \"638237947802582\": [618], \"640091996359939\": [618], \"641880010635052\": [618], \"646313679540583\": [618], \"647894786679526\": [618], \"653258905688378\": [618], \"654189034093218\": [618], \"656224858960164\": [618], \"661301341183125\": [618], \"667510764825725\": [618], \"671439109707517\": [618], \"680583069966707\": [618], \"682621507563573\": [618], \"683029401911453\": [618], \"683726717768800\": [618], \"689924898151019\": [618], \"698369200133743\": [618], \"699871725182884\": [618], \"701178459405758\": [618], \"708523872727504\": [618], \"711359708436115\": [618], \"712164367140431\": [618], \"712752465688750\": [618], \"714354750443640\": [618], \"719404542806132\": [618], \"722539919614169\": [618], \"723036557834112\": [618], \"723696515795479\": [618], \"729773145481116\": [618], \"731331906136269\": [618], \"734651391164275\": [618], \"735054360717552\": [618], \"738663550918765\": [618], \"738950677580647\": [618], \"745629896527062\": [618], \"758215116402871\": [618], \"785655867434817\": [618], \"788289051862859\": [618], \"804566586251743\": [618], \"804710310382837\": [618], \"806116929132473\": [618], \"807694693779237\": [618], \"815762472086184\": [618], \"819170571955111\": [618], \"823105424805708\": [618], \"826389688594034\": [618], \"828013607147998\": [618], \"829255532195024\": [618], \"832280300922711\": [618], \"847249422774463\": [618], \"885154830621151\": [618], \"893730689136088\": [618], \"894722334609720\": [618], \"899931227271534\": [618], \"907065305562107\": [618], \"909139361351599\": [618], \"914993440140769\": [618], \"915715103714651\": [618], \"918280032022503\": [618], \"919714430893885\": [618], \"929963715766410\": [618], \"933533843191779\": [618], \"944254649084499\": [618], \"945866667300096\": [618], \"947154315781511\": [618], \"953561919948830\": [618], \"958095083268828\": [618], \"960451275667070\": [618], \"965782499637178\": [618], \"976255762091898\": [618], \"976888938580640\": [618], \"989566099879809\": [618], \"993082997230953\": [618], \"1037531266927577\": [618], \"1039268429560617\": [618], \"1042962492507664\": [618], \"1046459470527133\": [618], \"1048010328238758\": [618], \"1048106859150151\": [618], \"1048485145069179\": [618], \"1050814679524802\": [618], \"1062694202187070\": [618], \"1074659743574489\": [618], \"1074783446949646\": [618], \"1078214355948717\": [618], \"1079801231402936\": [618], \"1097163944661945\": [618], \"1100244123136570\": [618], \"1101282925550194\": [618], \"1113831058406447\": [618], \"1116644960985447\": [618], \"1118987199996723\": [618], \"1120450706842038\": [618], \"1124248679539408\": [618], \"1126018438419531\": [618], \"1129271989197023\": [618], \"1135161838913390\": [618], \"1138351418989522\": [618], \"1141302318727057\": [618], \"1146866957201922\": [618], \"1153187844366965\": [618], \"1158175338239821\": [618], \"1160564511762986\": [618], \"1166756453983782\": [618], \"1167006070055984\": [618], \"1168340864401791\": [618], \"1175035903093100\": [618], \"1176648618702194\": [618], \"1183308722460089\": [618], \"1184403551943093\": [618], \"1190842104624568\": [618], \"1191409430201210\": [618], \"1192156169192797\": [618], \"1194772743824583\": [618], \"1196863382607984\": [618], \"1200825838992074\": [618], \"1200829090238985\": [618], \"1221984822520246\": [618], \"1222743055457474\": [618], \"1229526712418866\": [618], \"1244403832759646\": [618], \"1244519991567965\": [618], \"1248074792585235\": [618], \"1256646364121643\": [618], \"1269629409586749\": [618], \"1272326577333583\": [618], \"1272990421202669\": [618], \"1274464629819995\": [618], \"1278382741541450\": [618], \"1288714151957995\": [618], \"1297332192960887\": [618], \"1305627117017193\": [618], \"1312782331923433\": [618], \"1313463143795528\": [618], \"1323704055912594\": [618], \"1328489348413930\": [618], \"1328892130889058\": [618], \"1333738194596607\": [618], \"1335913448446324\": [618], \"1338219276266951\": [618], \"1342486265522719\": [618], \"1346774342645546\": [618], \"1347986557437226\": [618], \"1350081652762664\": [618], \"1352678281273174\": [618], \"1356578215646902\": [618], \"1388629028462832\": [618], \"1390639259576453\": [618], \"1394929313362456\": [618], \"1395380128283273\": [618], \"1395991370364431\": [618], \"1396284747512400\": [618], \"1397761310583618\": [618], \"1406724636417678\": [618], \"1415101073343155\": [618], \"1418244149940465\": [618], \"1431791122966341\": [618], \"1435841899080073\": [618], \"1442314223967837\": [618], \"1443833302799420\": [618], \"1455554374843881\": [618], \"1465658016958806\": [618], \"1467230134565719\": [618], \"1471454790309549\": [618], \"1488892479065431\": [618], \"1489727048643387\": [618], \"1490899414983859\": [618], \"1491598725669967\": [618], \"1493391269946551\": [618], \"1506803220535256\": [618], \"1512325758767524\": [618], \"1516257860296689\": [618], \"1517883928765799\": [618], \"1518411038946177\": [618], \"1521685264162403\": [618], \"1522142618347409\": [618], \"1524721409107365\": [618], \"1525727913174313\": [618], \"1527512699697753\": [618], \"1531164860410900\": [618], \"1538649045866534\": [618], \"1543387464648923\": [618], \"1550551532685148\": [618], \"1552845840261622\": [618], \"1557656084637981\": [618], \"1571644738513780\": [618], \"1577978353434659\": [618], \"1579518870957602\": [618], \"1584609275305850\": [618], \"1601164459728525\": [618], \"1618928173058139\": [618], \"1619557062584389\": [618], \"1624846168037522\": [618], \"1626780119206598\": [618], \"1632526429374722\": [618], \"1639230893245086\": [618], \"1641627984450915\": [618], \"1645365193555148\": [618], \"1646605052251364\": [618], \"1646673405481117\": [618], \"1646723559565655\": [618], \"1650111404529258\": [618], \"1654047218909886\": [618], \"1655518688795335\": [618], \"1659112226384148\": [618], \"1662761070778222\": [618], \"1665856754810721\": [618], \"1681762430691182\": [618], \"1687014351542881\": [618], \"1687704245009228\": [618], \"1697299379846494\": [618], \"1699881946445198\": [618], \"1702853471929077\": [618], \"1705106992950623\": [618], \"1707543787860125\": [618], \"1712032115889855\": [618], \"1712566556150830\": [618], \"1723647735347503\": [618], \"1726323240484104\": [618], \"1731221741040419\": [618], \"1733342874210664\": [618], \"1745104686252554\": [618], \"1749730533284538\": [618], \"1753254255850036\": [618], \"1755556270732219\": [618], \"1759812132157100\": [618], \"1761931876845708\": [618], \"1764279071407444\": [618], \"1764414403952527\": [618], \"1768586422238029\": [618], \"1777719274562321\": [618], \"1792071970684808\": [618], \"1793801105896376\": [618], \"1799922401902241\": [618], \"1801128718633139\": [618], \"1802818977831539\": [618], \"1803265087379048\": [618], \"1804456951012447\": [618], \"1807263145675982\": [618], \"1816344891620112\": [618], \"1828689853863587\": [618], \"36775194231930\": [457], \"53690665682443\": [457], \"66440217729400\": [457], \"70849988803673\": [457], \"75004065547398\": [457], \"77138625265596\": [457], \"117216836788564\": [457], \"119522520634848\": [457], \"128124360165948\": [457], \"134833351958384\": [457], \"139489397261097\": [457], \"148598134726212\": [457], \"155467636752706\": [457], \"156442774086858\": [457], \"170734250513575\": [457], \"177202782585710\": [457], \"201555822335801\": [457], \"205839096979867\": [457], \"209867825108086\": [457], \"212932376589913\": [457], \"220827075698986\": [457], \"225777394635724\": [457], \"231649850685428\": [457], \"240134865959519\": [457], \"246275550180425\": [457], \"255536960841770\": [457], \"256082922978942\": [457], \"262260922852672\": [457], \"264393625038585\": [457], \"280491823564460\": [457], \"313879197062375\": [457], \"335078188251392\": [457], \"379734091626639\": [457], \"381327044552994\": [457], \"391097110066965\": [457], \"393210025104184\": [457], \"410322295051451\": [457], \"413193458241052\": [457], \"423992680198431\": [457], \"447895568165097\": [457], \"458695725322218\": [457], \"500434990622315\": [457], \"518114886551987\": [457], \"525649924468956\": [457], \"525820118769158\": [457], \"526623223666131\": [457], \"531022849344618\": [457], \"563986405624490\": [457], \"569377546014527\": [457], \"573208164997041\": [457], \"595822370536672\": [457], \"627706112817535\": [457], \"662834992037969\": [457], \"673803614318024\": [457], \"697624286190058\": [457], \"707529578271543\": [457], \"711059105810546\": [457], \"712390387890604\": [457], \"713589743008108\": [457], \"713709834495987\": [457], \"718195905912830\": [457], \"720971869446471\": [457], \"731785995540160\": [457], \"760032400710324\": [457], \"767526468882682\": [457], \"768088688667382\": [457], \"805822729163199\": [457], \"815880572724659\": [457], \"816677045707073\": [457], \"820871860652839\": [457], \"831055689098631\": [457], \"848036241628859\": [457], \"851052487912910\": [457], \"860805461568406\": [457], \"892040265410551\": [457], \"893165264454842\": [457], \"904688045580218\": [457], \"908917398666427\": [457], \"909470527899184\": [457], \"912385435089829\": [457], \"942074691264403\": [457], \"945257001203801\": [457], \"946586996989034\": [457], \"948815092698274\": [457], \"957077797378172\": [457], \"960751476992787\": [457], \"962225674537810\": [457], \"972504953108844\": [457], \"972719992957481\": [457], \"974167093740469\": [457], \"979740917389663\": [457], \"995282130815736\": [457], \"1000149678699381\": [457], \"1018081123080235\": [457], \"1022073164968511\": [457], \"1056242160554372\": [457], \"1075237955167216\": [457], \"1094571337255974\": [457], \"1105046405948824\": [457], \"1112160031305766\": [457], \"1123068850079138\": [457], \"1134563133191989\": [457], \"1137321901154739\": [457], \"1141914072572050\": [457], \"1150062022139773\": [457], \"1160173792324055\": [457], \"1161621401950299\": [457], \"1190124998962973\": [457], \"1210672820792720\": [457], \"1221845510881630\": [457], \"1225378176669932\": [457], \"1227048653886895\": [457], \"1229833711136272\": [457], \"1245726973252093\": [457], \"1251825001312194\": [457], \"1254607981438920\": [457], \"1259125228322138\": [457], \"1285623330715082\": [457], \"1289455063995832\": [457], \"1306694273434115\": [457], \"1308300271521936\": [457], \"1320968607733315\": [457], \"1348329113843391\": [457], \"1348552640944505\": [457], \"1356990632384485\": [457], \"1387765654948972\": [457], \"1391534056402079\": [457], \"1397887457403984\": [457], \"1431167480168279\": [457], \"1466689593829989\": [457], \"1502216836033097\": [457], \"1514600513913709\": [457], \"1518056294074498\": [457], \"1553582070347977\": [457], \"1553890396372320\": [457], \"1576175878261193\": [457], \"1588572323054867\": [457], \"1590177099924575\": [457], \"1590234041534461\": [457], \"1610816436762599\": [457], \"1630972407871332\": [457], \"1634217073763413\": [457], \"1643225162057575\": [457], \"1644957724711698\": [457], \"1647054860269182\": [457], \"1648428886098687\": [457], \"1675754634157535\": [457], \"1684482590549309\": [457], \"1684734820141580\": [457], \"1709313640767862\": [457], \"1714892081311954\": [457], \"1724845974697960\": [457], \"1756674301683759\": [457], \"1760366106944684\": [457], \"1795379312074631\": [457], \"1807620202003202\": [457], \"1817394008553928\": [457], \"1820569595383472\": [457], \"1830413605092951\": [457], \"1833635418328175\": [457], \"1838619249589021\": [457], \"69390184559847\": [255], \"71465078358534\": [255], \"129805992591010\": [255], \"146907622731567\": [255], \"148360529061237\": [255], \"175028205147872\": [255], \"176646989586454\": [255], \"204338838188071\": [255], \"224600920538556\": [255], \"237965920669458\": [255], \"258578785600467\": [255], \"271622469275115\": [255], \"280913234396399\": [255], \"329791264683215\": [255], \"339472655783574\": [255], \"346765850389555\": [255], \"348804294035508\": [255], \"354529489782330\": [255], \"365522453696498\": [255], \"376796089927740\": [255], \"394928011129467\": [255], \"413625487319909\": [255], \"475726218760133\": [255], \"479295122707485\": [255], \"493873056924831\": [255], \"510963869014409\": [255], \"534324624993564\": [255], \"551546266431050\": [255], \"559792286612432\": [255], \"638868177603236\": [255], \"724998129164336\": [255], \"825567597043426\": [255], \"861926873219957\": [255], \"898007554964769\": [255], \"907055118654934\": [255], \"911309762934991\": [255], \"924940512669963\": [255], \"953352779526447\": [255], \"958977594215157\": [255], \"973779605043045\": [255], \"1012855977472855\": [255], \"1023973095633088\": [255], \"1044332471155994\": [255], \"1054388198231983\": [255], \"1110729128272561\": [255], \"1163080613382789\": [255], \"1240066853592539\": [255], \"1279484653240188\": [255], \"1282922937776796\": [255], \"1306424165950046\": [255], \"1379540846591446\": [255], \"1391355468255430\": [255], \"1426314459324540\": [255], \"1504923991806156\": [255], \"1595796491086788\": [255], \"1597416949989322\": [255], \"1635368678045609\": [255], \"1643130948716547\": [255], \"1657899354090152\": [255], \"1683241261076280\": [255], \"1716788870034681\": [255], \"1731139096127541\": [255], \"1739636668294768\": [255], \"1782468068830201\": [255], \"1802019441368612\": [255], \"1810396933939036\": [255], \"5280978073906\": [443], \"6595007275903\": [443], \"11148226371848\": [443], \"23984753945738\": [443], \"32051111684751\": [443], \"33073834626764\": [443], \"33673579994973\": [443], \"35218406026581\": [443], \"35528083895560\": [443], \"36634813080664\": [443], \"38752406828619\": [443], \"51576320771170\": [443], \"74836367550726\": [443], \"104279143949681\": [443], \"117698552840247\": [443], \"119127409505208\": [443], \"145809558837003\": [443], \"156082451029034\": [443], \"158150884031480\": [443], \"159182564272646\": [443], \"160235795210717\": [443], \"178156606661845\": [443], \"190394792844626\": [443], \"203071642731786\": [443], \"251050101711455\": [443], \"251306870306187\": [443], \"274255887894549\": [443], \"293207912758725\": [443], \"297978980196927\": [443], \"300795297114671\": [443], \"329372583775353\": [443], \"348758412098808\": [443], \"366696431918548\": [443], \"377733729703077\": [443], \"386118085102373\": [443], \"392345558278578\": [443], \"398838002325016\": [443], \"409644074025641\": [443], \"415317573977895\": [443], \"433616331982059\": [443], \"443629301976109\": [443], \"445829222393282\": [443], \"470303580708234\": [443], \"482132132976202\": [443], \"488829392514623\": [443], \"493657513540586\": [443], \"503598802132698\": [443], \"505377770977718\": [443], \"512738398205613\": [443], \"523139685781118\": [443], \"530122145001471\": [443], \"530367677685292\": [443], \"538140865272387\": [443], \"544390421064288\": [443], \"559588105005041\": [443], \"578131190685686\": [443], \"584548902052751\": [443], \"589504784293660\": [443], \"600494984304076\": [443], \"611484570135494\": [443], \"633859647911118\": [443], \"664085352982980\": [443], \"664222623618905\": [443], \"673066940110296\": [443], \"678943282260949\": [443], \"681295569699952\": [443], \"686267541457407\": [443], \"689471440969374\": [443], \"697071016250110\": [443], \"699465323641896\": [443], \"711451634804177\": [443], \"720169493082640\": [443], \"722929884860907\": [443], \"735963158994096\": [443], \"745731094545512\": [443], \"747968825723679\": [443], \"755031888981732\": [443], \"770489043473894\": [443], \"789434246102434\": [443], \"795365575251938\": [443], \"807283553081085\": [443], \"809854949855883\": [443], \"830200311662738\": [443], \"834293276943675\": [443], \"841414986934814\": [443], \"842846647784171\": [443], \"845941850014113\": [443], \"846679118209804\": [443], \"851129314622928\": [443], \"852002214751214\": [443], \"852359287611092\": [443], \"855002351167831\": [443], \"856786674989196\": [443], \"869389337497730\": [443], \"888215504021890\": [443], \"891304522510837\": [443], \"894911295139269\": [443], \"900108292382443\": [443], \"901586949087244\": [443], \"910842073038114\": [443], \"912727971414436\": [443], \"916164021187059\": [443], \"926434615090805\": [443], \"927979364015191\": [443], \"930329292428988\": [443], \"943584260658074\": [443], \"950167158507598\": [443], \"950512330225818\": [443], \"951521499175095\": [443], \"952999252593239\": [443], \"953282281781556\": [443], \"973816958075617\": [443], \"992397822434210\": [443], \"993920582755613\": [443], \"997479715804561\": [443], \"1010819761084098\": [443], \"1013513146530420\": [443], \"1015667209187451\": [443], \"1017578706384371\": [443], \"1019845111617572\": [443], \"1027282997328309\": [443], \"1032218217915816\": [443], \"1038730071396946\": [443], \"1048861729263009\": [443], \"1052332167111131\": [443], \"1055379867714492\": [443], \"1075484813838293\": [443], \"1088142919055914\": [443], \"1091639765595567\": [443], \"1093849865831089\": [443], \"1122386453198303\": [443], \"1140748299847797\": [443], \"1157038718893877\": [443], \"1160987074109337\": [443], \"1174463638805473\": [443], \"1206331659737913\": [443], \"1209369729791450\": [443], \"1211119848357372\": [443], \"1221812619290748\": [443], \"1241552601509230\": [443], \"1242236171697763\": [443], \"1268070508720772\": [443], \"1312738638874750\": [443], \"1320049251619808\": [443], \"1332963599208802\": [443], \"1341399776372143\": [443], \"1345971693669169\": [443], \"1369020466109766\": [443], \"1382034111995157\": [443], \"1403496857001455\": [443], \"1408172690920696\": [443], \"1426815969454971\": [443], \"1442221954802160\": [443], \"1442267932957999\": [443], \"1443289556122996\": [443], \"1447288609566109\": [443], \"1453397077002841\": [443], \"1460173477278567\": [443], \"1460596815984296\": [443], \"1462206018393914\": [443], \"1480769648885611\": [443], \"1482216446720887\": [443], \"1484961778725013\": [443], \"1505891456845581\": [443], \"1511560052378442\": [443], \"1523268995764035\": [443], \"1527652844243886\": [443], \"1540308411125502\": [443], \"1546484947647420\": [443], \"1548258906563602\": [443], \"1561220874331310\": [443], \"1576310675717522\": [443], \"1576552915988626\": [443], \"1583911083929628\": [443], \"1590745898390273\": [443], \"1609360348911792\": [443], \"1615288776873086\": [443], \"1638054118580476\": [443], \"1658229468042259\": [443], \"1660529146952359\": [443], \"1661081847646305\": [443], \"1665164212032088\": [443], \"1696630810885730\": [443], \"1704678249729101\": [443], \"1721340613329146\": [443], \"1733470885665112\": [443], \"1755196663341565\": [443], \"1762724963778602\": [443], \"1767001104484493\": [443], \"1774533783986216\": [443], \"1775119657166122\": [443], \"1792100344889574\": [443], \"1803450307984557\": [443], \"1817379944742951\": [443], \"1842343747170370\": [443], \"2330673835286\": [746], \"2959285854968\": [746], \"6537582986751\": [746], \"13316358964602\": [746], \"15341215347257\": [746], \"16470347547828\": [746], \"21314904128486\": [746], \"21568381026626\": [746], \"31892518108757\": [746], \"33981969982898\": [746], \"38507442989828\": [746], \"38679362367580\": [746], \"43745058695646\": [746], \"48987442750106\": [746], \"54353496907083\": [746], \"68415701190664\": [746], \"70755205388699\": [746], \"74551320069787\": [746], \"84019162130264\": [746], \"85114181530144\": [746], \"95470717868777\": [746], \"114941409399725\": [746], \"118041701374654\": [746], \"123600702747644\": [746], \"125639273456141\": [746], \"140518340111925\": [746], \"141937868117449\": [746], \"142408523431465\": [746], \"145246511475790\": [746], \"146704300980559\": [746], \"152403267293846\": [746], \"152429180468797\": [746], \"160097765580309\": [746], \"172227401498786\": [746], \"178878628944298\": [746], \"189106091447317\": [746], \"189628075649891\": [746], \"192420814887946\": [746], \"204865710658779\": [746], \"207942158173039\": [746], \"221746440373214\": [746], \"224577963032989\": [746], \"274751113197613\": [746], \"275092088588858\": [746], \"277051976612370\": [746], \"280325750506921\": [746], \"282282661210764\": [746], \"306461998943275\": [746], \"320143261958525\": [746], \"321911217038351\": [746], \"334763951599072\": [746], \"336624488859277\": [746], \"339056593882219\": [746], \"342910495862408\": [746], \"346163128403223\": [746], \"347943123972089\": [746], \"349107114476985\": [746], \"360772831850237\": [746], \"365376051027609\": [746], \"372026495942520\": [746], \"379877399183845\": [746], \"388970171535323\": [746], \"395681300085368\": [746], \"400014317735684\": [746], \"409528118807100\": [746], \"412587527335466\": [746], \"414885387570514\": [746], \"425125387057136\": [746], \"427238205871146\": [746], \"449087459912217\": [746], \"449765439797506\": [746], \"451259271196074\": [746], \"456615084610708\": [746], \"467684504463844\": [746], \"493268553531597\": [746], \"505000045967392\": [746], \"508255735463125\": [746], \"509215479374186\": [746], \"512928261349636\": [746], \"513755552587100\": [746], \"518491772924509\": [746], \"529015162666570\": [746], \"544184796938049\": [746], \"553703525306618\": [746], \"556531868375717\": [746], \"562483313766887\": [746], \"566294098062824\": [746], \"566600194453941\": [746], \"570707822470654\": [746], \"575386105896570\": [746], \"578029634747490\": [746], \"582130469225220\": [746], \"583738623475267\": [746], \"588797690091958\": [746], \"592465243057384\": [746], \"595848960406536\": [746], \"604222172384771\": [746], \"608593149757009\": [746], \"611468778830601\": [746], \"627165100766832\": [746], \"630372632338003\": [746], \"638836978572669\": [746], \"640223265806483\": [746], \"641417434509361\": [746], \"641770033416472\": [746], \"661546344096932\": [746], \"661646349019993\": [746], \"663597762794475\": [746], \"664217272530592\": [746], \"665070201077191\": [746], \"673601112842035\": [746], \"674501688742331\": [746], \"680356167226486\": [746], \"683710616379876\": [746], \"689480844055624\": [746], \"699133656377172\": [746], \"703097685392333\": [746], \"707493957125574\": [746], \"732437124951521\": [746], \"742736718858031\": [746], \"745552574910939\": [746], \"747021568339609\": [746], \"751281496811451\": [746], \"757876874233320\": [746], \"773263599416771\": [746], \"776490384439809\": [746], \"781894152078965\": [746], \"793838364890277\": [746], \"806222514534441\": [746], \"806712357678909\": [746], \"807179309213178\": [746], \"815065952271496\": [746], \"819774875756153\": [746], \"844123240632263\": [746], \"877827840409064\": [746], \"884923929841773\": [746], \"892147197880422\": [746], \"893352972081877\": [746], \"898105140352100\": [746], \"899457703109745\": [746], \"906817313898115\": [746], \"922964858563182\": [746], \"925036054321347\": [746], \"925999790625323\": [746], \"951215982365027\": [746], \"957786753614536\": [746], \"978174217010067\": [746], \"982837378778184\": [746], \"983500716375789\": [746], \"983594567326148\": [746], \"987050537474531\": [746], \"993724398922312\": [746], \"1001706994702316\": [746], \"1017309029775725\": [746], \"1048589473726894\": [746], \"1058767770615877\": [746], \"1079304786015578\": [746], \"1098438108789061\": [746], \"1100796367569153\": [746], \"1103124410485908\": [746], \"1104609300111433\": [746], \"1109965856372186\": [746], \"1119876917002341\": [746], \"1120586805785573\": [746], \"1127221996934178\": [746], \"1139751614159997\": [746], \"1141476324241855\": [746], \"1165377844999648\": [746], \"1170981620570460\": [746], \"1180383686274779\": [746], \"1187783927430410\": [746], \"1209852200993532\": [746], \"1224109565356777\": [746], \"1234797959709391\": [746], \"1243248834253692\": [746], \"1257553242342805\": [746], \"1258626557878588\": [746], \"1262113703022273\": [746], \"1267722108003897\": [746], \"1270792154187609\": [746], \"1272565986398442\": [746], \"1283131712953094\": [746], \"1291602129029427\": [746], \"1301484046665230\": [746], \"1302583271689052\": [746], \"1305588675675032\": [746], \"1305964429287463\": [746], \"1323456590377952\": [746], \"1326988465512925\": [746], \"1330187461808261\": [746], \"1339486161649541\": [746], \"1351638515516256\": [746], \"1355247065873243\": [746], \"1363472196973540\": [746], \"1366201253127293\": [746], \"1373140345455446\": [746], \"1373674636385025\": [746], \"1378800071096771\": [746], \"1383000084329931\": [746], \"1397116111991158\": [746], \"1402000564780127\": [746], \"1402851205017833\": [746], \"1430318364716421\": [746], \"1445739135451777\": [746], \"1457882537940219\": [746], \"1460799020135636\": [746], \"1463740710922560\": [746], \"1466093650921939\": [746], \"1473371444297819\": [746], \"1480690839774603\": [746], \"1495550566413016\": [746], \"1503223139134433\": [746], \"1505621714271433\": [746], \"1508671474919378\": [746], \"1509769969910346\": [746], \"1514868013404531\": [746], \"1522459554783744\": [746], \"1536353017190468\": [746], \"1551630146400917\": [746], \"1565730359797163\": [746], \"1573792655167330\": [746], \"1575539770927078\": [746], \"1580160700806009\": [746], \"1592926568811045\": [746], \"1593263316401150\": [746], \"1593740724233733\": [746], \"1596408888950028\": [746], \"1599117822671178\": [746], \"1617870790557365\": [746], \"1624237491221334\": [746], \"1626846368583980\": [746], \"1630450157638035\": [746], \"1641927403057414\": [746], \"1651358584143629\": [746], \"1660995934528775\": [746], \"1661867506626321\": [746], \"1689547145728802\": [746], \"1696166190970225\": [746], \"1704558828284157\": [746], \"1721542373465414\": [746], \"1727602918766637\": [746], \"1730863985437153\": [746], \"1739905483397349\": [746], \"1742705249361250\": [746], \"1743727777604354\": [746], \"1753391897155460\": [746], \"1756155151647037\": [746], \"1757521931684923\": [746], \"1762302247573183\": [746], \"1763530100539112\": [746], \"1765318894174735\": [746], \"1767992126763367\": [746], \"1779127275659796\": [746], \"1780916017804593\": [746], \"1794292334887698\": [746], \"1804253905388368\": [746], \"1812526702684220\": [746], \"1812845098141376\": [746], \"1819287634885376\": [746], \"1820776502673946\": [746], \"1830127522028182\": [746], \"1835362316686925\": [746], \"10982597372737\": [336], \"13923567703676\": [336], \"28202106536710\": [336], \"28341844880155\": [336], \"29168173373379\": [336], \"31847780341026\": [336], \"34897208834195\": [336], \"47977834266534\": [336], \"52084596312104\": [336], \"53421046628777\": [336], \"60019553626391\": [336], \"80165484312717\": [336], \"82926948845570\": [336], \"83197667442643\": [336], \"95365283640061\": [336], \"103334914855121\": [336], \"106411395141837\": [336], \"119079653260743\": [336], \"125134130094985\": [336], \"127707374028801\": [336], \"144228527443772\": [336], \"148355814310626\": [336], \"150197048185895\": [336], \"151028483634675\": [336], \"157006128784169\": [336], \"167241839728729\": [336], \"175556923057340\": [336], \"177872981478566\": [336], \"184903289988435\": [336], \"188460723769707\": [336], \"212051707057298\": [336], \"213536559298774\": [336], \"219851413966077\": [336], \"241836994057678\": [336], \"242677709446011\": [336], \"249528101617765\": [336], \"251169411919322\": [336], \"293159978007955\": [336], \"295295508551125\": [336], \"320762020206599\": [336], \"327556656730645\": [336], \"337628582763654\": [336], \"347039866874699\": [336], \"356882022232853\": [336], \"362417568708863\": [336], \"392690128275980\": [336], \"392707229817234\": [336], \"393548981792406\": [336], \"403082126216226\": [336], \"422915436848230\": [336], \"464237705878945\": [336], \"470400924876159\": [336], \"488837665206942\": [336], \"494822356974746\": [336], \"496223407020195\": [336], \"501615135337604\": [336], \"502150426444626\": [336], \"510089367758583\": [336], \"516820242178058\": [336], \"540617721003359\": [336], \"542220036034739\": [336], \"544997242593217\": [336], \"559899491069600\": [336], \"560978629421869\": [336], \"565495941350761\": [336], \"587508713705025\": [336], \"597380822465613\": [336], \"606309161713388\": [336], \"614457540105631\": [336], \"618362816794181\": [336], \"623310177907887\": [336], \"624321289818222\": [336], \"659201978131256\": [336], \"667534234610135\": [336], \"674539630191574\": [336], \"675751216289290\": [336], \"679925135106472\": [336], \"687490158267438\": [336], \"693544756949013\": [336], \"704872530230296\": [336], \"706712427536392\": [336], \"732174469748719\": [336], \"734682604252955\": [336], \"745514492970170\": [336], \"745745784853849\": [336], \"753995458333872\": [336], \"768508597096908\": [336], \"771177342646855\": [336], \"792286570150517\": [336], \"797549843533496\": [336], \"813310241455567\": [336], \"828535729051489\": [336], \"834403319549315\": [336], \"835847718355206\": [336], \"855612897812567\": [336], \"862709377218136\": [336], \"863220208032115\": [336], \"867936817357946\": [336], \"885271338236183\": [336], \"901278820878738\": [336], \"901633332686673\": [336], \"912226273640152\": [336], \"918018719537872\": [336], \"919371572031709\": [336], \"921729845364243\": [336], \"928612663367680\": [336], \"935117533567617\": [336], \"939990837013718\": [336], \"943979038006143\": [336], \"948643514299552\": [336], \"954157093982673\": [336], \"954262293627017\": [336], \"956362534189038\": [336], \"968059666283716\": [336], \"979488909917857\": [336], \"985684770078036\": [336], \"993939946500990\": [336], \"1017436935649351\": [336], \"1033516505276015\": [336], \"1035219030403169\": [336], \"1042914880931438\": [336], \"1043600451733223\": [336], \"1053537124443820\": [336], \"1054572726258941\": [336], \"1054826970353805\": [336], \"1060770044307198\": [336], \"1069253972163125\": [336], \"1069406613184378\": [336], \"1081654418792309\": [336], \"1109968642700686\": [336], \"1125308955709144\": [336], \"1147372046441288\": [336], \"1150069570883061\": [336], \"1159296427034728\": [336], \"1165145926050854\": [336], \"1185634791511819\": [336], \"1186775065067162\": [336], \"1203304739930592\": [336], \"1215185743116110\": [336], \"1224579666486702\": [336], \"1227507927686227\": [336], \"1233662991437817\": [336], \"1239044222627305\": [336], \"1243017210995229\": [336], \"1245534392820803\": [336], \"1248636534854829\": [336], \"1265156243287179\": [336], \"1287859595519405\": [336], \"1303651589019303\": [336], \"1306613161117410\": [336], \"1309398023295110\": [336], \"1321409994433162\": [336], \"1323152770146052\": [336], \"1335656267704655\": [336], \"1349143614821906\": [336], \"1356004432566869\": [336], \"1356732302753413\": [336], \"1357554770535670\": [336], \"1360369736501979\": [336], \"1363818893187128\": [336], \"1363869665923247\": [336], \"1379423734614085\": [336], \"1392192186508798\": [336], \"1395919438655506\": [336], \"1409934728672350\": [336], \"1411663003341330\": [336], \"1416886371251580\": [336], \"1424233764242696\": [336], \"1431465496512938\": [336], \"1441086215416502\": [336], \"1445505096898217\": [336], \"1446869642720409\": [336], \"1450727956814843\": [336], \"1457996432075902\": [336], \"1459542013192483\": [336], \"1460131093348694\": [336], \"1464695791734937\": [336], \"1466757175351940\": [336], \"1468635071103809\": [336], \"1480659287569591\": [336], \"1492037903959391\": [336], \"1495115632334499\": [336], \"1500244666961471\": [336], \"1507003746684355\": [336], \"1509326257529342\": [336], \"1521008358771452\": [336], \"1527043803236728\": [336], \"1535531829255331\": [336], \"1541426161301213\": [336], \"1549606560041243\": [336], \"1550789640738703\": [336], \"1557324633706944\": [336], \"1560680616896599\": [336], \"1579656848251525\": [336], \"1587018282244490\": [336], \"1594538587808446\": [336], \"1595737198596632\": [336], \"1612554678418179\": [336], \"1612940103711412\": [336], \"1626604372553915\": [336], \"1635817156717183\": [336], \"1641852276121324\": [336], \"1658455256410471\": [336], \"1664010569521982\": [336], \"1671098133955105\": [336], \"1689458917725823\": [336], \"1699085724046342\": [336], \"1704552139007504\": [336], \"1713630313820154\": [336], \"1714988630213672\": [336], \"1716361639827595\": [336], \"1731484778907548\": [336], \"1734317006998648\": [336], \"1736489852081749\": [336], \"1738064249084904\": [336], \"1768216483578299\": [336], \"1785086434144643\": [336], \"1794263691844935\": [336], \"1818773177472562\": [336], \"1835217656221289\": [336], \"1836400708796158\": [336], \"1839486140357670\": [336], \"1840808314262016\": [336], \"1843459799132095\": [336], \"4326955763283\": [201], \"7158799582087\": [201], \"23738015571950\": [201], \"24224314530175\": [201], \"42325549179236\": [201], \"64509359584961\": [201], \"65062716770777\": [201], \"83398355305453\": [201], \"92747420401797\": [201], \"124035655424003\": [201], \"127313944559960\": [201], \"132116747543577\": [201], \"133330625460294\": [201], \"144280372722709\": [201], \"144384767973149\": [201], \"145603209243740\": [201], \"150445332721306\": [201], \"156763944975614\": [201], \"161038167145035\": [201], \"163710911470311\": [201], \"188530049183223\": [201], \"194230965715185\": [201], \"205331160625393\": [201], \"205672253215890\": [201], \"211165710707279\": [201], \"224650264198442\": [201], \"230703845052601\": [201], \"235023183594108\": [201], \"241807515829080\": [201], \"255101064467816\": [201], \"279376953099972\": [201], \"298541111621688\": [201], \"299928161543665\": [201], \"307236951551041\": [201], \"327780792286603\": [201], \"353390289593063\": [201], \"361470005717781\": [201], \"372507579642397\": [201], \"392843236904911\": [201], \"396649849298484\": [201], \"406050957932272\": [201], \"408472664407451\": [201], \"430477161830012\": [201], \"434648552401784\": [201], \"439292176300010\": [201], \"445836063143558\": [201], \"446791063545911\": [201], \"476004025959057\": [201], \"490569823544854\": [201], \"491113374084738\": [201], \"507432650225682\": [201], \"513532811012889\": [201], \"514206374296874\": [201], \"522617232301446\": [201], \"531634333064453\": [201], \"601615954910708\": [201], \"602337027915933\": [201], \"602812963350963\": [201], \"623035558717821\": [201], \"625586030923293\": [201], \"627451805812462\": [201], \"641611252315184\": [201], \"643528692945958\": [201], \"645876596829776\": [201], \"658835579608551\": [201], \"677764652048342\": [201], \"682543142973118\": [201], \"684668052450211\": [201], \"685495428308727\": [201], \"686695886754969\": [201], \"692476769447259\": [201], \"704615752139438\": [201], \"740069424767386\": [201], \"745130020812751\": [201], \"756815101716293\": [201], \"763345401324164\": [201], \"772793860002582\": [201], \"779858178416795\": [201], \"780860648830821\": [201], \"783647995529193\": [201], \"785569928910679\": [201], \"800181195992144\": [201], \"820976270639292\": [201], \"830506996571544\": [201], \"835567606030461\": [201], \"836982323489185\": [201], \"860210700371585\": [201], \"870815004132635\": [201], \"876888038506266\": [201], \"884456650670029\": [201], \"893915017062331\": [201], \"902358906593190\": [201], \"937130179358141\": [201], \"947462708051771\": [201], \"958549480584791\": [201], \"991786633438918\": [201], \"1003706164087139\": [201], \"1017432414969433\": [201], \"1060964007653270\": [201], \"1075520057734223\": [201], \"1097036351240365\": [201], \"1100485334805616\": [201], \"1102709029284409\": [201], \"1108109366559790\": [201], \"1132533238161930\": [201], \"1138882566797847\": [201], \"1140334908428827\": [201], \"1140978689328860\": [201], \"1141358484754370\": [201], \"1147856635337766\": [201], \"1149859754057319\": [201], \"1156108623222019\": [201], \"1158332938137288\": [201], \"1163982198761717\": [201], \"1168856596409714\": [201], \"1188879900225256\": [201], \"1194994639145223\": [201], \"1198504034991418\": [201], \"1207705717654311\": [201], \"1217704507818923\": [201], \"1243967225052122\": [201], \"1245816885076600\": [201], \"1250394771314603\": [201], \"1275277584936870\": [201], \"1282805064459123\": [201], \"1297142062646069\": [201], \"1300734114223911\": [201], \"1304579544156546\": [201], \"1325105945243045\": [201], \"1325880536195852\": [201], \"1331620138243907\": [201], \"1340142053189959\": [201], \"1341056039384211\": [201], \"1346153539817428\": [201], \"1350573964498633\": [201], \"1352179949520117\": [201], \"1370236218149841\": [201], \"1396299747291170\": [201], \"1396737983856138\": [201], \"1402153580733857\": [201], \"1403507365256538\": [201], \"1407570060776159\": [201], \"1418672243187610\": [201], \"1442450169026342\": [201], \"1442667040617666\": [201], \"1464341697678878\": [201], \"1465570493913423\": [201], \"1487555602629223\": [201], \"1489138355617241\": [201], \"1490108744092588\": [201], \"1492210873197668\": [201], \"1500840557484266\": [201], \"1523291285422917\": [201], \"1556328723480323\": [201], \"1574673368458998\": [201], \"1582216342147004\": [201], \"1584562361477530\": [201], \"1584580201342206\": [201], \"1613756014752074\": [201], \"1620038983317120\": [201], \"1626079573118911\": [201], \"1644134626794663\": [201], \"1654097985563011\": [201], \"1665537417691967\": [201], \"1670459258658688\": [201], \"1670542546001691\": [201], \"1672801158400120\": [201], \"1674162523451589\": [201], \"1687505585245005\": [201], \"1688966133175948\": [201], \"1704469571428976\": [201], \"1715363742519159\": [201], \"1726660028167080\": [201], \"1728892087170449\": [201], \"1770175378346274\": [201], \"1778352428854204\": [201], \"1807686194229722\": [201], \"1807975427341585\": [201], \"1817145314970484\": [201], \"1824763509285723\": [201], \"10356606451944\": [248], \"50846087379525\": [248], \"69691204772858\": [248], \"159994062109567\": [248], \"176085048818303\": [248], \"218866079441959\": [248], \"254467563218666\": [248], \"254655368653824\": [248], \"266225841657888\": [248], \"274858173893190\": [248], \"304443526889147\": [248], \"323837514256167\": [248], \"351664112186742\": [248], \"357853580890613\": [248], \"361023421752499\": [248], \"373023117511905\": [248], \"448953996547397\": [248], \"530533332700132\": [248], \"550709445172167\": [248], \"562681057949892\": [248], \"567219970127035\": [248], \"594829803822288\": [248], \"623072293638711\": [248], \"629798119569985\": [248], \"634196622967593\": [248], \"639600633181945\": [248], \"670084939387183\": [248], \"702970955786576\": [248], \"710210632713497\": [248], \"723958097890662\": [248], \"725850339489298\": [248], \"727015227209359\": [248], \"735091025433632\": [248], \"742468209290382\": [248], \"761045632725273\": [248], \"780370287168793\": [248], \"795452768633432\": [248], \"796564971090913\": [248], \"805912028609014\": [248], \"806584593916395\": [248], \"819001473290091\": [248], \"828798527900890\": [248], \"857103136548806\": [248], \"869763586879858\": [248], \"870060022464566\": [248], \"879235562985110\": [248], \"889494204071226\": [248], \"908496438696244\": [248], \"913594683533172\": [248], \"918854653842376\": [248], \"919554558418488\": [248], \"920098949408748\": [248], \"921971831342467\": [248], \"942602663976216\": [248], \"944985834328038\": [248], \"978420361082895\": [248], \"981696270771844\": [248], \"1025851666534018\": [248], \"1034649941115386\": [248], \"1050496092885930\": [248], \"1058550120165667\": [248], \"1063118016013165\": [248], \"1066470319828144\": [248], \"1084693343966605\": [248], \"1104589558038365\": [248], \"1111746559361127\": [248], \"1134584691803549\": [248], \"1141135886669386\": [248], \"1179413759146304\": [248], \"1192906982945469\": [248], \"1193457251032360\": [248], \"1202256005102043\": [248], \"1203293429436001\": [248], \"1226357969679248\": [248], \"1227429511643849\": [248], \"1229582796279831\": [248], \"1287832574862226\": [248], \"1309552810571523\": [248], \"1334256502307258\": [248], \"1336932160026986\": [248], \"1339983241216891\": [248], \"1378211687471245\": [248], \"1392496801868961\": [248], \"1400956420506176\": [248], \"1424940444251853\": [248], \"1430248879040694\": [248], \"1434158231000438\": [248], \"1483328009005139\": [248], \"1484982169874087\": [248], \"1507490961306107\": [248], \"1528045813679110\": [248], \"1529934571466083\": [248], \"1549036413912923\": [248], \"1593699738436780\": [248], \"1606897465519932\": [248], \"1617822463960770\": [248], \"1628234476285176\": [248], \"1637838901614378\": [248], \"1655644753354562\": [248], \"1695856403173962\": [248], \"1704981514223087\": [248], \"1716764297525059\": [248], \"1729815585727377\": [248], \"1749225008610314\": [248], \"1768774139193729\": [248], \"1788564601859855\": [248], \"1797978536169278\": [248], \"1801618440133966\": [248], \"1819961845440450\": [248], \"6772685257758\": [504], \"7956844007741\": [504], \"8139633308111\": [504], \"14871332675397\": [504], \"16766666693099\": [504], \"17573386964148\": [504], \"22554911687551\": [504], \"30512201060548\": [504], \"51696738040867\": [504], \"76779974146560\": [504], \"80311714788214\": [504], \"93123087074314\": [504], \"99004232808377\": [504], \"111077615866021\": [504], \"119161387157333\": [504], \"135894353903281\": [504], \"141132016003093\": [504], \"193303464355586\": [504], \"204044426042543\": [504], \"207895820163498\": [504], \"217182548203423\": [504], \"242775234180487\": [504], \"253612795091201\": [504], \"255472866356061\": [504], \"262088038688129\": [504], \"270821415482711\": [504], \"271687624926332\": [504], \"308870260165414\": [504], \"319819294637758\": [504], \"319947798638042\": [504], \"342703966652494\": [504], \"390680680614162\": [504], \"396997119946091\": [504], \"403587463183771\": [504], \"406068062701933\": [504], \"406085092479009\": [504], \"409150895113845\": [504], \"412134151877840\": [504], \"443910440262831\": [504], \"451749044573877\": [504], \"451877835865939\": [504], \"495406157051123\": [504], \"497509079828828\": [504], \"504861019513426\": [504], \"506245306392901\": [504], \"514871800090554\": [504], \"518793267461215\": [504], \"520891747558015\": [504], \"527133919210056\": [504], \"534097730357390\": [504], \"555082547969915\": [504], \"556233412088012\": [504], \"558174183181404\": [504], \"566374875419586\": [504], \"570476430120600\": [504], \"576190037556108\": [504], \"576474146002029\": [504], \"586276483955244\": [504], \"590383660180725\": [504], \"597485660431290\": [504], \"600240735738331\": [504], \"608824150040077\": [504], \"610760180824427\": [504], \"625790750997538\": [504], \"632085514381261\": [504], \"663344606426047\": [504], \"687766084291147\": [504], \"695703215449668\": [504], \"696103631509522\": [504], \"722005323085321\": [504], \"724684027360969\": [504], \"740340235526952\": [504], \"759372755744411\": [504], \"795809410921646\": [504], \"795820783311775\": [504], \"800272132917362\": [504], \"804952519990862\": [504], \"811604782769610\": [504], \"813840626364744\": [504], \"818417893544296\": [504], \"832317320894474\": [504], \"846440855257240\": [504], \"846940824242457\": [504], \"861552698145929\": [504], \"890838597479118\": [504], \"891185916623408\": [504], \"898230684134206\": [504], \"911791438219422\": [504], \"918561601724450\": [504], \"933264709213474\": [504], \"938878656256270\": [504], \"944591050733560\": [504], \"972296873274865\": [504], \"994989559212220\": [504], \"1005537002530086\": [504], \"1014376379709221\": [504], \"1018137502288184\": [504], \"1021868498489438\": [504], \"1029927402972459\": [504], \"1059751655805403\": [504], \"1062620336100211\": [504], \"1090373669071926\": [504], \"1117918079837329\": [504], \"1119162842137924\": [504], \"1121203794763033\": [504], \"1139230833269483\": [504], \"1147266885130883\": [504], \"1167371635288863\": [504], \"1190024264967898\": [504], \"1207546463508409\": [504], \"1216258883860550\": [504], \"1221878525400413\": [504], \"1242682384540614\": [504], \"1253920740893069\": [504], \"1263502686377011\": [504], \"1272967324008112\": [504], \"1275322903540855\": [504], \"1276624339117663\": [504], \"1280475670307844\": [504], \"1281940989682502\": [504], \"1285058822392139\": [504], \"1305261982538101\": [504], \"1327470260761597\": [504], \"1339296051217322\": [504], \"1348498932467780\": [504], \"1348653121581243\": [504], \"1349535444775334\": [504], \"1350875039105119\": [504], \"1368165057645955\": [504], \"1368509788742396\": [504], \"1383899623996334\": [504], \"1396726704477157\": [504], \"1423695601687776\": [504], \"1425209091451988\": [504], \"1433785826383097\": [504], \"1437874942601307\": [504], \"1442999041092969\": [504], \"1480256949509498\": [504], \"1481119085455788\": [504], \"1489954540704758\": [504], \"1499003755149590\": [504], \"1507363959257160\": [504], \"1519180619455053\": [504], \"1545663483172692\": [504], \"1546711816704409\": [504], \"1547561747964156\": [504], \"1552461548792513\": [504], \"1555002951730117\": [504], \"1561353892895013\": [504], \"1565482535848855\": [504], \"1595018649879575\": [504], \"1609420913480897\": [504], \"1647242466538063\": [504], \"1655449646894147\": [504], \"1660653494622274\": [504], \"1664178639626031\": [504], \"1701361909291047\": [504], \"1704779363478047\": [504], \"1740128864215349\": [504], \"1746071430087967\": [504], \"1753810361573287\": [504], \"1762289034118993\": [504], \"1764673607713289\": [504], \"916348910336\": [296], \"10238419296757\": [296], \"60611948654397\": [296], \"70004335185916\": [296], \"83787624525377\": [296], \"95392626356876\": [296], \"106977747730570\": [296], \"107780385835749\": [296], \"168467011952704\": [296], \"173593419141263\": [296], \"176552255309355\": [296], \"184264391600645\": [296], \"190884821053794\": [296], \"208776392663494\": [296], \"209059611359375\": [296], \"219223944748989\": [296], \"226022659159735\": [296], \"229427902482165\": [296], \"275600531940460\": [296], \"320884122099366\": [296], \"321489005600381\": [296], \"332448430032988\": [296], \"336322367889481\": [296], \"344728844904652\": [296], \"350364628839227\": [296], \"363518078926071\": [296], \"384230937365443\": [296], \"408653367044338\": [296], \"427501807378559\": [296], \"465218068175540\": [296], \"516787282887698\": [296], \"563409822442510\": [296], \"571858960714115\": [296], \"584175777896186\": [296], \"585344029844817\": [296], \"587757578993060\": [296], \"590445327349238\": [296], \"603249255698076\": [296], \"617190833955199\": [296], \"644121069175240\": [296], \"688200624783606\": [296], \"693910894561117\": [296], \"704682977502677\": [296], \"705068823423813\": [296], \"721679403076069\": [296], \"731229007962505\": [296], \"733300283119185\": [296], \"736636912564865\": [296], \"740585127421834\": [296], \"752108752301147\": [296], \"755260694303539\": [296], \"766232877108188\": [296], \"790864812488112\": [296], \"805093761769034\": [296], \"814167052543007\": [296], \"815206626021245\": [296], \"817114136627187\": [296], \"820493826138959\": [296], \"822157743365995\": [296], \"823566332150057\": [296], \"842448904427503\": [296], \"851782275902367\": [296], \"900057569103936\": [296], \"905514587756490\": [296], \"910986747993763\": [296], \"932468051114026\": [296], \"933541801128356\": [296], \"935846410504786\": [296], \"938606808947391\": [296], \"942804047036243\": [296], \"970492289816902\": [296], \"997914743180773\": [296], \"1004728451047732\": [296], \"1028940863381140\": [296], \"1031524714223828\": [296], \"1041516965158553\": [296], \"1048126569503717\": [296], \"1048633098695548\": [296], \"1050133474720405\": [296], \"1074933078796559\": [296], \"1095676546353357\": [296], \"1124970058574315\": [296], \"1126828397086088\": [296], \"1135514021578142\": [296], \"1161609275326172\": [296], \"1197170436377410\": [296], \"1207433365021652\": [296], \"1207981353438158\": [296], \"1218906637093373\": [296], \"1223065840478692\": [296], \"1243288959493967\": [296], \"1256707258365001\": [296], \"1265120451720787\": [296], \"1273398107074314\": [296], \"1295121050595617\": [296], \"1307145295960262\": [296], \"1336156185513215\": [296], \"1367227167964903\": [296], \"1390390079491203\": [296], \"1401532233537586\": [296], \"1403768656552812\": [296], \"1414421961887989\": [296], \"1420525523218843\": [296], \"1428183620395538\": [296], \"1441048294111858\": [296], \"1450369887034507\": [296], \"1502245002190345\": [296], \"1502537613938621\": [296], \"1539266856944908\": [296], \"1547648269545523\": [296], \"1548620195553666\": [296], \"1556568648656397\": [296], \"1566600481636437\": [296], \"1570629455507817\": [296], \"1589685419984236\": [296], \"1595008771365341\": [296], \"1614551541628365\": [296], \"1618608500249109\": [296], \"1620987502440850\": [296], \"1632951407275338\": [296], \"1659400452967030\": [296], \"1667689398259383\": [296], \"1672817832780225\": [296], \"1688791780897468\": [296], \"1692879335637161\": [296], \"1709232882728779\": [296], \"1737300792110006\": [296], \"1741817744571278\": [296], \"1761153067772030\": [296], \"1773586482835610\": [296], \"1779329016399769\": [296], \"1809508643437262\": [296], \"1814096300112721\": [296], \"1816814515152494\": [296], \"1823386103112140\": [296], \"1824663927288222\": [296], \"26598881261966\": [723], \"26995963342780\": [723], \"34865822286684\": [723], \"61519279481085\": [723], \"69632947677053\": [723], \"74181098342824\": [723], \"76947330084037\": [723], \"78939362198331\": [723], \"83389649421811\": [723], \"95079969148548\": [723], \"100280089875713\": [723], \"106063333728477\": [723], \"121107752724444\": [723], \"126083888157960\": [723], \"133465235865445\": [723], \"135587014575394\": [723], \"136828184208673\": [723], \"137696691391627\": [723], \"138540272702418\": [723], \"164397154272867\": [723], \"174964164376104\": [723], \"177538753393358\": [723], \"184932757747729\": [723], \"194287708485930\": [723], \"198325966384583\": [723], \"208181485556544\": [723], \"224055033409067\": [723], \"241118611756880\": [723], \"268854391585074\": [723], \"275824268434181\": [723], \"280131378310460\": [723], \"296782510605821\": [723], \"299302748039088\": [723], \"303932400095607\": [723], \"326704922022891\": [723], \"328181420353325\": [723], \"337599450033192\": [723], \"342836285681129\": [723], \"347856115460301\": [723], \"349893803882163\": [723], \"361495496099029\": [723], \"363554534628570\": [723], \"371145327094989\": [723], \"372414163453248\": [723], \"447360316332098\": [723], \"453403460962120\": [723], \"470088473935728\": [723], \"486705134072346\": [723], \"490198609456906\": [723], \"505608939920105\": [723], \"513536367210561\": [723], \"522466751472767\": [723], \"527909610831435\": [723], \"535957261693406\": [723], \"543160021939651\": [723], \"557988057120954\": [723], \"558079239336324\": [723], \"562808958891209\": [723], \"596314870352942\": [723], \"605078074272563\": [723], \"607567774505092\": [723], \"613745487350935\": [723], \"619584996364355\": [723], \"621283121287326\": [723], \"624160861037863\": [723], \"625878087044058\": [723], \"632662038947939\": [723], \"635655382906121\": [723], \"635731073723674\": [723], \"640386358408388\": [723], \"641760363740515\": [723], \"653839092931183\": [723], \"654439202844920\": [723], \"660340113729327\": [723], \"671717874136857\": [723], \"684654516672751\": [723], \"685119958987927\": [723], \"686718099954881\": [723], \"692705545164798\": [723], \"700284708953564\": [723], \"702750267828607\": [723], \"713383476624725\": [723], \"717973976234650\": [723], \"731818906160344\": [723], \"735252776981246\": [723], \"738101974264578\": [723], \"743990172587019\": [723], \"745559007045531\": [723], \"751191510070593\": [723], \"753439313702476\": [723], \"791027032806060\": [723], \"795990551622149\": [723], \"796794667950268\": [723], \"805278835753094\": [723], \"812534939791946\": [723], \"816808055486158\": [723], \"826824065199109\": [723], \"828660432714352\": [723], \"831070765612389\": [723], \"839343062510078\": [723], \"841291709424595\": [723], \"847411599623815\": [723], \"867413305027173\": [723], \"876406259967109\": [723], \"876817004457970\": [723], \"886148791439184\": [723], \"892847913611501\": [723], \"911114698976031\": [723], \"929387583397395\": [723], \"940326230392474\": [723], \"941052560208645\": [723], \"942729775630277\": [723], \"943469762732277\": [723], \"945243072734084\": [723], \"946126968361956\": [723], \"950158179695402\": [723], \"960228859186013\": [723], \"979633138612076\": [723], \"992622256153927\": [723], \"996326740413727\": [723], \"1006609375190615\": [723], \"1011535519908357\": [723], \"1014906965748363\": [723], \"1017263018087669\": [723], \"1018534083610879\": [723], \"1022367112135220\": [723], \"1037084579606367\": [723], \"1041887177317111\": [723], \"1049531351568126\": [723], \"1057941375993771\": [723], \"1098908533258259\": [723], \"1099383184091004\": [723], \"1108980571505292\": [723], \"1112909274629896\": [723], \"1115429845709725\": [723], \"1118346574085705\": [723], \"1128530345052184\": [723], \"1138824295701933\": [723], \"1142374958486451\": [723], \"1154862674747843\": [723], \"1157244360230357\": [723], \"1158766669153572\": [723], \"1164459497465255\": [723], \"1184611685559478\": [723], \"1199942880359141\": [723], \"1201984333538271\": [723], \"1204226813053844\": [723], \"1229009259971400\": [723], \"1231915923827754\": [723], \"1242319410430751\": [723], \"1244802044893357\": [723], \"1257509586698746\": [723], \"1268884680049210\": [723], \"1289099521247469\": [723], \"1291799339126795\": [723], \"1311284282692722\": [723], \"1315367976909773\": [723], \"1317436915838730\": [723], \"1322101868115471\": [723], \"1322985404147926\": [723], \"1334448132274893\": [723], \"1335406028174203\": [723], \"1342099584282573\": [723], \"1357816258281115\": [723], \"1366028986983673\": [723], \"1383077160885421\": [723], \"1389913771135339\": [723], \"1390303966468339\": [723], \"1391712601113733\": [723], \"1404645013942926\": [723], \"1408248592018201\": [723], \"1409099591516664\": [723], \"1409924760511915\": [723], \"1412037829450629\": [723], \"1429791910087821\": [723], \"1431876995510347\": [723], \"1433482792947716\": [723], \"1435901694793899\": [723], \"1438280888169616\": [723], \"1440861341022033\": [723], \"1475811491088142\": [723], \"1483291683687321\": [723], \"1489860220532186\": [723], \"1502386982615998\": [723], \"1511795573007037\": [723], \"1512670204545963\": [723], \"1513807407020469\": [723], \"1521550495121377\": [723], \"1526224967867069\": [723], \"1532245049434978\": [723], \"1538179457398969\": [723], \"1538208992539879\": [723], \"1559904539229310\": [723], \"1562023798563030\": [723], \"1565882767724666\": [723], \"1566603512475682\": [723], \"1567623456564890\": [723], \"1569355103983045\": [723], \"1604729686242762\": [723], \"1606053772817649\": [723], \"1624020510392624\": [723], \"1625772058701984\": [723], \"1644929121012136\": [723], \"1647322828427900\": [723], \"1650423827356248\": [723], \"1659076995212818\": [723], \"1662733419053271\": [723], \"1679058248444574\": [723], \"1680138563850417\": [723], \"1692649602815501\": [723], \"1700312380848546\": [723], \"1700643901104873\": [723], \"1702111474939893\": [723], \"1704371624982106\": [723], \"1712974170436674\": [723], \"1715069603823713\": [723], \"1736753411072783\": [723], \"1737613180042485\": [723], \"1738472017888514\": [723], \"1740197949912181\": [723], \"1746711221570572\": [723], \"1757209303063415\": [723], \"1759744460345169\": [723], \"1774369760742908\": [723], \"1784227512215486\": [723], \"1793928342972028\": [723], \"1799690339917964\": [723], \"1801749126017526\": [723], \"1803215749086816\": [723], \"1814455795897346\": [723], \"1546382602244\": [38], \"9656868519272\": [38], \"23022543468726\": [38], \"28317189440418\": [38], \"41280726133805\": [38], \"66960113329393\": [38], \"72652244604468\": [38], \"72987082939193\": [38], \"93603632485639\": [38], \"94372221234209\": [38], \"95803555452107\": [38], \"96189277714686\": [38], \"98204962844834\": [38], \"99291828928919\": [38], \"105771165192346\": [38], \"107960764418249\": [38], \"111428825192941\": [38], \"127274207264390\": [38], \"140215841784768\": [38], \"140605527581622\": [38], \"142232850272699\": [38], \"145924186970433\": [38], \"150127562207023\": [38], \"155682932216255\": [38], \"159001134887689\": [38], \"164388214546473\": [38], \"173794201733501\": [38], \"186124795839659\": [38], \"190963456940444\": [38], \"194039429765196\": [38], \"226438983265190\": [38], \"235651723624481\": [38], \"238048993345481\": [38], \"249975135143449\": [38], \"267074725930899\": [38], \"270342483362557\": [38], \"280132684676074\": [38], \"300128441651611\": [38], \"316505175229988\": [38], \"325519145492999\": [38], \"331036651754826\": [38], \"333546831132357\": [38], \"339312791908298\": [38], \"367926290537692\": [38], \"381453341363664\": [38], \"406460060374332\": [38], \"428682354107007\": [38], \"431291775730353\": [38], \"441722950852645\": [38], \"448992122346447\": [38], \"477655250940470\": [38], \"477750102449067\": [38], \"477985950174589\": [38], \"480198316139604\": [38], \"491608171514200\": [38], \"495502740648975\": [38], \"519965149014263\": [38], \"524965228749517\": [38], \"531138835074212\": [38], \"533415256881126\": [38], \"541580701997867\": [38], \"552203173994680\": [38], \"559004439467633\": [38], \"562793249377929\": [38], \"562879802277703\": [38], \"587055287418925\": [38], \"589312120159525\": [38], \"597739816579553\": [38], \"608423992734323\": [38], \"614217354495893\": [38], \"615459930701230\": [38], \"615791016313951\": [38], \"625698543331114\": [38], \"646824347329197\": [38], \"667158191608223\": [38], \"669124584026739\": [38], \"720023354205321\": [38], \"723110102710602\": [38], \"729489459296287\": [38], \"730438631834823\": [38], \"749611574327872\": [38], \"756371653009437\": [38], \"759680015332124\": [38], \"762510262097309\": [38], \"763564254757376\": [38], \"766760371827669\": [38], \"768032693645756\": [38], \"771127212739497\": [38], \"782144581578897\": [38], \"784975368234061\": [38], \"799539922825962\": [38], \"819980663198132\": [38], \"823882385515799\": [38], \"826776608053620\": [38], \"840828370189348\": [38], \"852418152547474\": [38], \"852799198713520\": [38], \"855454436267264\": [38], \"866696616176181\": [38], \"867213129529998\": [38], \"876309521298385\": [38], \"885125028078863\": [38], \"909019726936576\": [38], \"909779712705126\": [38], \"916050873987175\": [38], \"927218551670748\": [38], \"928864246605368\": [38], \"930417395222212\": [38], \"941110207197902\": [38], \"955243957079948\": [38], \"966301070196790\": [38], \"989911402764299\": [38], \"995181259057379\": [38], \"1002350630585950\": [38], \"1012856342746104\": [38], \"1014127973930724\": [38], \"1022663693402515\": [38], \"1035776199846468\": [38], \"1038102561676599\": [38], \"1054756736331100\": [38], \"1057487646410902\": [38], \"1062472050386420\": [38], \"1078792937948355\": [38], \"1079268349078254\": [38], \"1081877113080133\": [38], \"1088174794493924\": [38], \"1119862443959162\": [38], \"1134261531316139\": [38], \"1157033641669577\": [38], \"1162236359054384\": [38], \"1167266432939449\": [38], \"1167742077190225\": [38], \"1176654542862639\": [38], \"1217545566354888\": [38], \"1226508956619832\": [38], \"1253324060639472\": [38], \"1270568848112648\": [38], \"1281774363818117\": [38], \"1299213939456440\": [38], \"1303115317709160\": [38], \"1305464820564814\": [38], \"1307819791004830\": [38], \"1309074404765591\": [38], \"1311250718219883\": [38], \"1327589370379644\": [38], \"1335123441609714\": [38], \"1348262711969291\": [38], \"1371091180108917\": [38], \"1374368677198015\": [38], \"1377678539029900\": [38], \"1391949712810566\": [38], \"1394148237651533\": [38], \"1397236581360400\": [38], \"1402428225174714\": [38], \"1428382328937422\": [38], \"1431557607118119\": [38], \"1441559140548570\": [38], \"1445089604147204\": [38], \"1448617435830484\": [38], \"1477041049132630\": [38], \"1511338704810222\": [38], \"1521422840867651\": [38], \"1537983521926132\": [38], \"1539320867575362\": [38], \"1569677530496022\": [38], \"1573488765296414\": [38], \"1577865237666845\": [38], \"1590413900683188\": [38], \"1591774836066005\": [38], \"1605993198328440\": [38], \"1611305741679768\": [38], \"1613114021117770\": [38], \"1623535737008266\": [38], \"1632442965615300\": [38], \"1636460128406331\": [38], \"1643515657796596\": [38], \"1650598737168923\": [38], \"1670067443802112\": [38], \"1671758592552230\": [38], \"1678998318119428\": [38], \"1693828967529278\": [38], \"1700524824651835\": [38], \"1702169840496522\": [38], \"1712577664695818\": [38], \"1721553791636839\": [38], \"1723798153586017\": [38], \"1729414678531026\": [38], \"1747039637991800\": [38], \"1751666526384185\": [38], \"1759510552400668\": [38], \"1761856912383455\": [38], \"1773603088467393\": [38], \"1787003318829899\": [38], \"1788164904348957\": [38], \"1799047439290001\": [38], \"1800521778298568\": [38], \"1807254257169762\": [38], \"1825859169439057\": [38], \"1826104878054981\": [38], \"1833465377439232\": [38]}, \"ident_to_name\": {\"TARA_ANE_MAG_00011\": \"TARA_ANE_MAG_00011\", \"TARA_ANE_MAG_00015\": \"TARA_ANE_MAG_00015\", \"TARA_ANE_MAG_00041\": \"TARA_ANE_MAG_00041\", \"TARA_ANE_MAG_00044\": \"TARA_ANE_MAG_00044\", \"TARA_ANE_MAG_00063\": \"TARA_ANE_MAG_00063\", \"TARA_ANE_MAG_00068\": \"TARA_ANE_MAG_00068\", \"TARA_ANE_MAG_00069\": \"TARA_ANE_MAG_00069\", \"TARA_ANW_MAG_00005\": \"TARA_ANW_MAG_00005\", \"TARA_ANW_MAG_00020\": \"TARA_ANW_MAG_00020\", \"TARA_ANW_MAG_00034\": \"TARA_ANW_MAG_00034\", \"TARA_ANW_MAG_00051\": \"TARA_ANW_MAG_00051\", \"TARA_ANW_MAG_00083\": \"TARA_ANW_MAG_00083\", \"TARA_ANW_MAG_00084\": \"TARA_ANW_MAG_00084\", \"TARA_ANW_MAG_00085\": \"TARA_ANW_MAG_00085\", \"TARA_ASE_MAG_00007\": \"TARA_ASE_MAG_00007\", \"TARA_ASE_MAG_00009\": \"TARA_ASE_MAG_00009\", \"TARA_ASE_MAG_00015\": \"TARA_ASE_MAG_00015\", \"TARA_ASE_MAG_00018\": \"TARA_ASE_MAG_00018\", \"TARA_ASE_MAG_00028\": \"TARA_ASE_MAG_00028\", \"TARA_ASE_MAG_00031\": \"TARA_ASE_MAG_00031\"}, \"ident_to_idx\": {\"TARA_ASE_MAG_00031\": 38, \"TARA_ASE_MAG_00007\": 201, \"TARA_ANE_MAG_00069\": 209, \"TARA_ASE_MAG_00009\": 248, \"TARA_ANW_MAG_00051\": 255, \"TARA_ASE_MAG_00018\": 296, \"TARA_ANW_MAG_00085\": 336, \"TARA_ANE_MAG_00068\": 369, \"TARA_ANW_MAG_00005\": 395, \"TARA_ANW_MAG_00083\": 443, \"TARA_ANW_MAG_00034\": 457, \"TARA_ANE_MAG_00015\": 489, \"TARA_ANE_MAG_00041\": 498, \"TARA_ASE_MAG_00015\": 504, \"TARA_ANW_MAG_00020\": 618, \"TARA_ANE_MAG_00044\": 655, \"TARA_ASE_MAG_00028\": 723, \"TARA_ANW_MAG_00084\": 746, \"TARA_ANE_MAG_00063\": 816, \"TARA_ANE_MAG_00011\": 857}, \"idx_to_lid\": {\"38\": 9, \"201\": 3, \"209\": 6, \"248\": 19, \"255\": 25, \"296\": 19, \"336\": 13, \"369\": 10, \"395\": 3, \"443\": 13, \"457\": 18, \"489\": 17, \"498\": 18, \"504\": 18, \"618\": 8, \"655\": 6, \"723\": 33, \"746\": 94, \"816\": 19, \"857\": 6}}\n"
  },
  {
    "path": "tests/test-data/lca/classify-by-both.csv",
    "content": "ID,status,superkingdom,phylum,class,order,family,genus,species,strain\r\nTARA_ANE_MAG_00011,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,,\r\nTARA_ANE_MAG_00015,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,,\r\nTARA_ANE_MAG_00041,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,,\r\nTARA_ANE_MAG_00044,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,,\r\nTARA_ANE_MAG_00063,found,Archaea,Euryarchaeota,,,,,,\r\nTARA_ANE_MAG_00068,found,Bacteria,Candidatus_Marinimicrobia ,,,,,,\r\nTARA_ANE_MAG_00069,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,,\r\nTARA_ANW_MAG_00005,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,,\r\nTARA_ANW_MAG_00020,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,,\r\nTARA_ANW_MAG_00034,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,,\r\nTARA_ANW_MAG_00051,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,,,\r\nTARA_ANW_MAG_00083,found,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,,\r\nTARA_ANW_MAG_00084,found,Eukaryota,Cryptophyta,Cryptophyceae,Pyrenomonadales,Geminigeraceae,Guillardia,,\r\nTARA_ANW_MAG_00085,found,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,,\r\nTARA_ASE_MAG_00007,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,,\r\nTARA_ASE_MAG_00009,found,Archaea,Euryarchaeota,,,,,,\r\nTARA_ASE_MAG_00015,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,,\r\nTARA_ASE_MAG_00018,found,Archaea,Euryarchaeota,,,,,,\r\nTARA_ASE_MAG_00028,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,,\r\nTARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii,\r\n"
  },
  {
    "path": "tests/test-data/lca/delmont-1.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\n"
  },
  {
    "path": "tests/test-data/lca/delmont-1.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"0\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"Alteromonadaceae\"], [\"genus\", \"Alteromonas\"], [\"species\", \"Alteromonas_macleodii\"]]}, \"hashval_to_idx\": {\"1546382602244\": [0], \"9656868519272\": [0], \"23022543468726\": [0], \"28317189440418\": [0], \"41280726133805\": [0], \"66960113329393\": [0], \"72652244604468\": [0], \"72987082939193\": [0], \"93603632485639\": [0], \"94372221234209\": [0], \"95803555452107\": [0], \"96189277714686\": [0], \"98204962844834\": [0], \"99291828928919\": [0], \"105771165192346\": [0], \"107960764418249\": [0], \"111428825192941\": [0], \"127274207264390\": [0], \"140215841784768\": [0], \"140605527581622\": [0], \"142232850272699\": [0], \"145924186970433\": [0], \"150127562207023\": [0], \"155682932216255\": [0], \"159001134887689\": [0], \"164388214546473\": [0], \"173794201733501\": [0], \"186124795839659\": [0], \"190963456940444\": [0], \"194039429765196\": [0], \"226438983265190\": [0], \"235651723624481\": [0], \"238048993345481\": [0], \"249975135143449\": [0], \"267074725930899\": [0], \"270342483362557\": [0], \"280132684676074\": [0], \"300128441651611\": [0], \"316505175229988\": [0], \"325519145492999\": [0], \"331036651754826\": [0], \"333546831132357\": [0], \"339312791908298\": [0], \"367926290537692\": [0], \"381453341363664\": [0], \"406460060374332\": [0], \"428682354107007\": [0], \"431291775730353\": [0], \"441722950852645\": [0], \"448992122346447\": [0], \"477655250940470\": [0], \"477750102449067\": [0], \"477985950174589\": [0], \"480198316139604\": [0], \"491608171514200\": [0], \"495502740648975\": [0], \"519965149014263\": [0], \"524965228749517\": [0], \"531138835074212\": [0], \"533415256881126\": [0], \"541580701997867\": [0], \"552203173994680\": [0], \"559004439467633\": [0], \"562793249377929\": [0], \"562879802277703\": [0], \"587055287418925\": [0], \"589312120159525\": [0], \"597739816579553\": [0], \"608423992734323\": [0], \"614217354495893\": [0], \"615459930701230\": [0], \"615791016313951\": [0], \"625698543331114\": [0], \"646824347329197\": [0], \"667158191608223\": [0], \"669124584026739\": [0], \"720023354205321\": [0], \"723110102710602\": [0], \"729489459296287\": [0], \"730438631834823\": [0], \"749611574327872\": [0], \"756371653009437\": [0], \"759680015332124\": [0], \"762510262097309\": [0], \"763564254757376\": [0], \"766760371827669\": [0], \"768032693645756\": [0], \"771127212739497\": [0], \"782144581578897\": [0], \"784975368234061\": [0], \"799539922825962\": [0], \"819980663198132\": [0], \"823882385515799\": [0], \"826776608053620\": [0], \"840828370189348\": [0], \"852418152547474\": [0], \"852799198713520\": [0], \"855454436267264\": [0], \"866696616176181\": [0], \"867213129529998\": [0], \"876309521298385\": [0], \"885125028078863\": [0], \"909019726936576\": [0], \"909779712705126\": [0], \"916050873987175\": [0], \"927218551670748\": [0], \"928864246605368\": [0], \"930417395222212\": [0], \"941110207197902\": [0], \"955243957079948\": [0], \"966301070196790\": [0], \"989911402764299\": [0], \"995181259057379\": [0], \"1002350630585950\": [0], \"1012856342746104\": [0], \"1014127973930724\": [0], \"1022663693402515\": [0], \"1035776199846468\": [0], \"1038102561676599\": [0], \"1054756736331100\": [0], \"1057487646410902\": [0], \"1062472050386420\": [0], \"1078792937948355\": [0], \"1079268349078254\": [0], \"1081877113080133\": [0], \"1088174794493924\": [0], \"1119862443959162\": [0], \"1134261531316139\": [0], \"1157033641669577\": [0], \"1162236359054384\": [0], \"1167266432939449\": [0], \"1167742077190225\": [0], \"1176654542862639\": [0], \"1217545566354888\": [0], \"1226508956619832\": [0], \"1253324060639472\": [0], \"1270568848112648\": [0], \"1281774363818117\": [0], \"1299213939456440\": [0], \"1303115317709160\": [0], \"1305464820564814\": [0], \"1307819791004830\": [0], \"1309074404765591\": [0], \"1311250718219883\": [0], \"1327589370379644\": [0], \"1335123441609714\": [0], \"1348262711969291\": [0], \"1371091180108917\": [0], \"1374368677198015\": [0], \"1377678539029900\": [0], \"1391949712810566\": [0], \"1394148237651533\": [0], \"1397236581360400\": [0], \"1402428225174714\": [0], \"1428382328937422\": [0], \"1431557607118119\": [0], \"1441559140548570\": [0], \"1445089604147204\": [0], \"1448617435830484\": [0], \"1477041049132630\": [0], \"1511338704810222\": [0], \"1521422840867651\": [0], \"1537983521926132\": [0], \"1539320867575362\": [0], \"1569677530496022\": [0], \"1573488765296414\": [0], \"1577865237666845\": [0], \"1590413900683188\": [0], \"1591774836066005\": [0], \"1605993198328440\": [0], \"1611305741679768\": [0], \"1613114021117770\": [0], \"1623535737008266\": [0], \"1632442965615300\": [0], \"1636460128406331\": [0], \"1643515657796596\": [0], \"1650598737168923\": [0], \"1670067443802112\": [0], \"1671758592552230\": [0], \"1678998318119428\": [0], \"1693828967529278\": [0], \"1700524824651835\": [0], \"1702169840496522\": [0], \"1712577664695818\": [0], \"1721553791636839\": [0], \"1723798153586017\": [0], \"1729414678531026\": [0], \"1747039637991800\": [0], \"1751666526384185\": [0], \"1759510552400668\": [0], \"1761856912383455\": [0], \"1773603088467393\": [0], \"1787003318829899\": [0], \"1788164904348957\": [0], \"1799047439290001\": [0], \"1800521778298568\": [0], \"1807254257169762\": [0], \"1825859169439057\": [0], \"1826104878054981\": [0], \"1833465377439232\": [0], \"9384929430585\": [1], \"9513224502861\": [1], \"10694710544526\": [1], \"13525121908835\": [1], \"13884726272861\": [1], \"14069218958763\": [1], \"14691127881695\": [1], \"15433493785955\": [1], \"16920736157686\": [1], \"19108521646251\": [1], \"19502303039649\": [1], \"22899505354632\": [1], \"23915488984375\": [1], \"24207026115422\": [1], \"27337901004347\": [1], \"27727571486476\": [1], \"27742199553575\": [1], \"29030647449725\": [1], \"31703229491384\": [1], \"32381621910652\": [1], \"32897728814600\": [1], \"34246213822129\": [1], \"34821974424843\": [1], \"35644187168408\": [1], \"36212986625285\": [1], \"37702400100353\": [1], \"39895866026116\": [1], \"41112501431795\": [1], \"41824335384345\": [1], \"42234472156482\": [1], \"42998999775228\": [1], \"43323418396098\": [1], \"46425122704669\": [1], \"47514198890704\": [1], \"50653301550997\": [1], \"50802886922972\": [1], \"52474551735582\": [1], \"53921332240938\": [1], \"55734725516598\": [1], \"56071775577932\": [1], \"56506399142231\": [1], \"58643529638644\": [1], \"59237242473902\": [1], \"60822556938364\": [1], \"62665955956242\": [1], \"65572742372076\": [1], \"67335935597031\": [1], \"72289811275739\": [1], \"74434913203633\": [1], \"77418725525644\": [1], \"77525409186509\": [1], \"78118950411788\": [1], \"80241726900606\": [1], \"82351955864461\": [1], \"82604128342369\": [1], \"82989771326247\": [1], \"85257841957020\": [1], \"85728375593670\": [1], \"86174191238853\": [1], \"86227609253057\": [1], \"87355384692289\": [1], \"88219022822991\": [1], \"88296563368521\": [1], \"88525854756564\": [1], \"88819507180663\": [1], \"92622208139438\": [1], \"92690056155078\": [1], \"92870352981663\": [1], \"94522721595922\": [1], \"94551513971362\": [1], \"96742246751956\": [1], \"99509808173468\": [1], \"100408042349435\": [1], \"103161501295460\": [1], \"103940913494064\": [1], \"105123985732733\": [1], \"106978566995468\": [1], \"107239073965564\": [1], \"111204579569898\": [1], \"111609707448237\": [1], \"111889584457500\": [1], \"112972675344478\": [1], \"114349042314703\": [1], \"116548942523971\": [1], \"118003632964691\": [1], \"120658463120904\": [1], \"121293149599224\": [1], \"125458873025813\": [1], \"126230595076065\": [1], \"130049558415340\": [1], \"132732019012042\": [1], \"135264258034535\": [1], \"137035756717308\": [1], \"137248857153280\": [1], \"139258132401677\": [1], \"140412191080293\": [1], \"143104424711544\": [1], \"144216637893643\": [1], \"144882454913504\": [1], \"145204518052233\": [1], \"146248935172068\": [1], \"148449580488621\": [1], \"149038816388133\": [1], \"151784752023226\": [1], \"151910446421271\": [1], \"152091101267478\": [1], \"152354278043076\": [1], \"152354617871225\": [1], \"155198129452281\": [1], \"156242774311029\": [1], \"157571231583874\": [1], \"158188141733452\": [1], \"161876830090254\": [1], \"162063851231882\": [1], \"162068007652410\": [1], \"162869364970070\": [1], \"166451908192512\": [1], \"168214939433079\": [1], \"171209806818531\": [1], \"172236667892666\": [1], \"174619979668846\": [1], \"175748505826929\": [1], \"177226851458646\": [1], \"179538171937769\": [1], \"179997764910353\": [1], \"182998890987131\": [1], \"183314514830737\": [1], \"183481103274421\": [1], \"184140469304310\": [1], \"185646508174430\": [1], \"186177671878337\": [1], \"186987890694654\": [1], \"192431948296187\": [1], \"195456225289440\": [1], \"195587724824288\": [1], \"197731019678307\": [1], \"199717251275573\": [1], \"204251896616205\": [1], \"204472646890528\": [1], \"205458705349958\": [1], \"208141571229915\": [1], \"208794100880143\": [1], \"211086110401200\": [1], \"211805349623155\": [1], \"212604959681205\": [1], \"215298965008107\": [1], \"215337124343848\": [1], \"215465128025151\": [1], \"217363034328851\": [1], \"217938530757038\": [1], \"218439314856181\": [1], \"218669497849070\": [1], \"219797174722389\": [1], \"221469365488646\": [1], \"223658999838191\": [1], \"224153762423826\": [1], \"227086150451800\": [1], \"227642044776719\": [1], \"230782299150016\": [1], \"232079797506288\": [1], \"233385364145538\": [1], \"233687852267362\": [1], \"233907911133493\": [1], \"235251837075613\": [1], \"235900782617048\": [1], \"237168653202910\": [1], \"238721566220513\": [1], \"240406243302764\": [1], \"244173802707805\": [1], \"245901011737339\": [1], \"247004268319392\": [1], \"247100238511760\": [1], \"248852521217080\": [1], \"250123169670589\": [1], \"250229853020252\": [1], \"250707987679917\": [1], \"250989516429992\": [1], \"252737210988482\": [1], \"253068781328555\": [1], \"253897388163660\": [1], \"254141220123910\": [1], \"254279085861494\": [1], \"258715618402623\": [1], \"262636845116046\": [1], \"263481285546409\": [1], \"265276936574346\": [1], \"266067658090815\": [1], \"266390634790022\": [1], \"267964730808427\": [1], \"270034526426938\": [1], \"271555118674359\": [1], \"271757549081257\": [1], \"273151252192648\": [1], \"274656605299335\": [1], \"276457546755145\": [1], \"277095040155526\": [1], \"278425916857333\": [1], \"279911187945389\": [1], \"282409272713120\": [1], \"282490498116439\": [1], \"283813166000240\": [1], \"285311602700422\": [1], \"285700092730438\": [1], \"287801610181588\": [1], \"290941404426341\": [1], \"294921958928721\": [1], \"296210359981803\": [1], \"296309817102550\": [1], \"297585003281459\": [1], \"299009430146793\": [1], \"299474512884981\": [1], \"301184530582644\": [1], \"306139222258319\": [1], \"307100981994367\": [1], \"310168320972281\": [1], \"310411551340673\": [1], \"312955381732504\": [1], \"313345456542067\": [1], \"314371372402449\": [1], \"314747261707596\": [1], \"314919601669310\": [1], \"315609637384083\": [1], \"319485045444810\": [1], \"320540642594695\": [1], \"321191136245490\": [1], \"322660849013133\": [1], \"324675614079940\": [1], \"324696338982734\": [1], \"325275518462825\": [1], \"328697226947212\": [1], \"329247203588480\": [1], \"334016370990842\": [1], \"337200032877142\": [1], \"338349771642222\": [1], \"338382718102596\": [1], \"339502315826224\": [1], \"342041453940437\": [1], \"342219283371857\": [1], \"344148075604538\": [1], \"346739737982892\": [1], \"350047871177562\": [1], \"350167482130512\": [1], \"352709993221047\": [1], \"353806512569888\": [1], \"354787036339150\": [1], \"355786040904052\": [1], \"359095923123772\": [1], \"359664220589876\": [1], \"360702525394266\": [1], \"363032982220670\": [1], \"363123762068405\": [1], \"364476590881815\": [1], \"365941727417813\": [1], \"367013504857360\": [1], \"369434407418619\": [1], \"370573159508445\": [1], \"371153080863731\": [1], \"373464958611928\": [1], \"374934689730831\": [1], \"375505856254465\": [1], \"375829025059531\": [1], \"376706414761462\": [1], \"377611592408251\": [1], \"379444628200775\": [1], \"380719933858673\": [1], \"382383386796048\": [1], \"384161395273382\": [1], \"384882631620195\": [1], \"385111408547166\": [1], \"386300883487240\": [1], \"386314879650630\": [1], \"387000046439703\": [1], \"388059835336383\": [1], \"388517166352883\": [1], \"389875392948246\": [1], \"390167763652053\": [1], \"390947799548543\": [1], \"391761160048633\": [1], \"392588769479065\": [1], \"393404737954463\": [1], \"393565324213398\": [1], \"393992263386451\": [1], \"399764765223192\": [1], \"402391767396922\": [1], \"402845882844859\": [1], \"412811515897705\": [1], \"414588189913264\": [1], \"418286505229437\": [1], \"418973611375909\": [1], \"419871607526003\": [1], \"423144063273262\": [1], \"423605640675662\": [1], \"423609354472942\": [1], \"424699830534222\": [1], \"428556122460013\": [1], \"429073097945435\": [1], \"431421580365883\": [1], \"433898361341083\": [1], \"434072187325092\": [1], \"434088606571364\": [1], \"434910849927953\": [1], \"435063800634155\": [1], \"435885342138582\": [1], \"436694504052916\": [1], \"438117922688789\": [1], \"440014243404310\": [1], \"440874716262573\": [1], \"441854447475222\": [1], \"443920405142831\": [1], \"446834394604251\": [1], \"448958509149239\": [1], \"451450601747037\": [1], \"451691772060971\": [1], \"452830057988530\": [1], \"452889917700251\": [1], \"456932487267477\": [1], \"458289798008267\": [1], \"460806335735062\": [1], \"462012528278959\": [1], \"462147123269934\": [1], \"463912533153856\": [1], \"464658520570211\": [1], \"465725666537396\": [1], \"466164800378293\": [1], \"468221471845826\": [1], \"468901496572575\": [1], \"473235548034288\": [1], \"474179273546441\": [1], \"478410714103710\": [1], \"479251256151199\": [1], \"481053015752778\": [1], \"482357958562927\": [1], \"482439019556840\": [1], \"482621230931881\": [1], \"484110734070913\": [1], \"484745656475355\": [1], \"485410325150790\": [1], \"486209866223171\": [1], \"488130308977937\": [1], \"488822471539933\": [1], \"489041980361778\": [1], \"490801511688893\": [1], \"491083298264714\": [1], \"491832121889621\": [1], \"491999320509346\": [1], \"492589927273065\": [1], \"494872493594278\": [1], \"495231594554331\": [1], \"496051719902631\": [1], \"496113765633896\": [1], \"496980130763543\": [1], \"498169047552624\": [1], \"499177967233952\": [1], \"500902023142968\": [1], \"501184785502759\": [1], \"501354656562560\": [1], \"501503703782704\": [1], \"503733863968250\": [1], \"504551168005395\": [1], \"507595243506975\": [1], \"509738188248271\": [1], \"513179745263922\": [1], \"513537125074114\": [1], \"513936355260637\": [1], \"517832242661092\": [1], \"518624571531924\": [1], \"520421220213659\": [1], \"521078509639159\": [1], \"526835153054304\": [1], \"528146792468320\": [1], \"528612625035561\": [1], \"532086467422319\": [1], \"536085413898718\": [1], \"539789430192018\": [1], \"540174844714491\": [1], \"541407780392101\": [1], \"541461157747291\": [1], \"542385985159087\": [1], \"543069830516211\": [1], \"544453355106020\": [1], \"549000519108727\": [1], \"550714989522765\": [1], \"550997953764389\": [1], \"554416503582474\": [1], \"554775088469290\": [1], \"555574366980158\": [1], \"556289096094037\": [1], \"557981349873999\": [1], \"558077532710784\": [1], \"560584791980453\": [1], \"560813485187048\": [1], \"563075885791114\": [1], \"565689400295334\": [1], \"566254256339235\": [1], \"567121556962199\": [1], \"569199490360936\": [1], \"569236988228251\": [1], \"571948915111351\": [1], \"572010471403993\": [1], \"572806946959801\": [1], \"573912459631798\": [1], \"575316829804180\": [1], \"575332380110505\": [1], \"578636848190665\": [1], \"581225445664044\": [1], \"583316550660325\": [1], \"586878249509026\": [1], \"588105213474256\": [1], \"588196227953251\": [1], \"588914844732672\": [1], \"594591141213430\": [1], \"594933220046648\": [1], \"595351928056756\": [1], \"595997576351928\": [1], \"597523005425474\": [1], \"601077054374749\": [1], \"602006467925513\": [1], \"604849998120880\": [1], \"605307796648947\": [1], \"606592393896592\": [1], \"607306380306269\": [1], \"608036204841928\": [1], \"611077295392526\": [1], \"611597115226067\": [1], \"611687075682570\": [1], \"611852941091832\": [1], \"614352705559406\": [1], \"614455152394729\": [1], \"614870512195646\": [1], \"616034211238080\": [1], \"617682682031381\": [1], \"620374574619807\": [1], \"622433629667033\": [1], \"622745262948721\": [1], \"624018620374506\": [1], \"624511090219051\": [1], \"626892042653326\": [1], \"627476803354615\": [1], \"628715236425046\": [1], \"628981403660458\": [1], \"633120412417012\": [1], \"633458681166249\": [1], \"635402544869144\": [1], \"636865382881312\": [1], \"639439572579290\": [1], \"639844036608997\": [1], \"640574550269185\": [1], \"641021579595098\": [1], \"641201948545577\": [1], \"643668913078934\": [1], \"647719265762454\": [1], \"648117550988236\": [1], \"649453313990045\": [1], \"650388789204913\": [1], \"651393898420396\": [1], \"651652685663747\": [1], \"651947669667456\": [1], \"652093532522963\": [1], \"654089246539397\": [1], \"655352237876313\": [1], \"664018874777035\": [1], \"665193576410442\": [1], \"665445749513650\": [1], \"665501525654284\": [1], \"667382118672659\": [1], \"668643157424266\": [1], \"669367393799418\": [1], \"670548064351682\": [1], \"671837839276593\": [1], \"675628945510951\": [1], \"678589978773066\": [1], \"680039161257735\": [1], \"680076753286028\": [1], \"684722260130595\": [1], \"693295336660297\": [1], \"695873273666680\": [1], \"696311302812619\": [1], \"697776019883169\": [1], \"700508911989772\": [1], \"700826309434573\": [1], \"701515034683283\": [1], \"702215527797042\": [1], \"709726649853343\": [1], \"711324293051248\": [1], \"712062923961271\": [1], \"713230326059832\": [1], \"713704564734271\": [1], \"714206500411569\": [1], \"715088917525218\": [1], \"716380268033033\": [1], \"717648872388742\": [1], \"717805694968046\": [1], \"724254950458698\": [1], \"726914057607923\": [1], \"727022289982217\": [1], \"727085891489869\": [1], \"729284823324266\": [1], \"729529589344364\": [1], \"729859995306271\": [1], \"729907263751486\": [1], \"730532284069258\": [1], \"731250758493486\": [1], \"734342440385373\": [1], \"735057027595515\": [1], \"735147341892890\": [1], \"735935573312536\": [1], \"736472286827206\": [1], \"736966386234788\": [1], \"737280225344363\": [1], \"738555926236845\": [1], \"739555068553673\": [1], \"744888541229405\": [1], \"746771571947671\": [1], \"747953676888271\": [1], \"749134504459760\": [1], \"750226931711434\": [1], \"752571135244728\": [1], \"753215710744558\": [1], \"754537491874861\": [1], \"754634799430002\": [1], \"755320966395002\": [1], \"755577226225016\": [1], \"757545029057368\": [1], \"758194285746344\": [1], \"759901458205731\": [1], \"763091304858506\": [1], \"763297803793654\": [1], \"763380848899317\": [1], \"764132675957923\": [1], \"770647739503399\": [1], \"771240278060942\": [1], \"774623218122618\": [1], \"775189259667264\": [1], \"775604635024411\": [1], \"778149562341362\": [1], \"779798471261036\": [1], \"780460163561520\": [1], \"781647914257694\": [1], \"783632502063577\": [1], \"783844509022055\": [1], \"784296363173728\": [1], \"785635434592057\": [1], \"786149397078278\": [1], \"787119851540525\": [1], \"788895114668573\": [1], \"790924695875873\": [1], \"791442318537695\": [1], \"792695522336594\": [1], \"794636268219217\": [1], \"797357099301196\": [1], \"797503443220410\": [1], \"798344300734713\": [1], \"798997597672116\": [1], \"801416967054094\": [1], \"802473981384727\": [1], \"802631787086831\": [1], \"804921131920706\": [1], \"805942594876124\": [1], \"806602061890491\": [1], \"807988939516732\": [1], \"809694230605863\": [1], \"810312684174606\": [1], \"810639121837900\": [1], \"812419812832465\": [1], \"813436507531577\": [1], \"820468156529024\": [1], \"820568817268897\": [1], \"821782146748205\": [1], \"823336088913313\": [1], \"823623650457764\": [1], \"823770332876281\": [1], \"824155459680678\": [1], \"826484215036908\": [1], \"826543714319258\": [1], \"826750415562163\": [1], \"827202837229189\": [1], \"827989226065302\": [1], \"832211083048597\": [1], \"834029126522076\": [1], \"834194932281766\": [1], \"835511007394732\": [1], \"836194868312543\": [1], \"839256169418728\": [1], \"839470680343939\": [1], \"840516237577378\": [1], \"841658746700384\": [1], \"842093004761779\": [1], \"846570234487809\": [1], \"847107566727814\": [1], \"847469039491699\": [1], \"848119309701293\": [1], \"850307412030053\": [1], \"850846587098968\": [1], \"851584439335311\": [1], \"852195297066665\": [1], \"856077299341227\": [1], \"856491564986841\": [1], \"861781891434166\": [1], \"861957559510232\": [1], \"862546295103803\": [1], \"863167306292692\": [1], \"864014465788824\": [1], \"867976402887234\": [1], \"869768902402946\": [1], \"871627657860286\": [1], \"871800740090986\": [1], \"874879573164488\": [1], \"875180759560663\": [1], \"875928218436840\": [1], \"875999514470084\": [1], \"876457992803429\": [1], \"877729800936851\": [1], \"880643983348280\": [1], \"881273545110083\": [1], \"882470636911607\": [1], \"883797496447477\": [1], \"884521547475220\": [1], \"884594061731088\": [1], \"886284233722349\": [1], \"887199074814088\": [1], \"888150056443464\": [1], \"892659640429338\": [1], \"896484212652567\": [1], \"897256084225265\": [1], \"898032136961727\": [1], \"898423771369234\": [1], \"899245491400653\": [1], \"899750070363991\": [1], \"900498058186691\": [1], \"902343490461233\": [1], \"902513515688217\": [1], \"903500732246926\": [1], \"904911344279547\": [1], \"908507282487687\": [1], \"909754530415728\": [1], \"910668743047924\": [1], \"911098888785218\": [1], \"915257179729139\": [1], \"916281532208948\": [1], \"918818134423863\": [1], \"919070331962360\": [1], \"921324434826272\": [1], \"922487947977218\": [1], \"923702123218223\": [1], \"926464718358018\": [1], \"927318372327768\": [1], \"927457156413927\": [1], \"929846624082359\": [1], \"929854312903821\": [1], \"930618790038683\": [1], \"934385197678465\": [1], \"936294561746814\": [1], \"937145857014447\": [1], \"937573496924454\": [1], \"941869144180760\": [1], \"943225519015744\": [1], \"943692249387771\": [1], \"944090705525540\": [1], \"946335147815232\": [1], \"947693328780379\": [1], \"948743619687118\": [1], \"949026830339339\": [1], \"949529945296592\": [1], \"951447860849638\": [1], \"952375966634304\": [1], \"958006234870627\": [1], \"958843598945216\": [1], \"961483448355043\": [1], \"962294838458000\": [1], \"962807126020571\": [1], \"963545700033324\": [1], \"965122059921360\": [1], \"965531424372493\": [1], \"966426135099242\": [1], \"967620896659075\": [1], \"967622243443690\": [1], \"968406847956406\": [1], \"968714685713214\": [1], \"976412116975001\": [1], \"978345217402879\": [1], \"978400924884494\": [1], \"979458134731450\": [1], \"979732428118076\": [1], \"980179500442908\": [1], \"980292993202160\": [1], \"980900802772967\": [1], \"982018440382133\": [1], \"984070433015694\": [1], \"985136506912502\": [1], \"985920008298018\": [1], \"986538248880615\": [1], \"987517249144953\": [1], \"988492805280094\": [1], \"989386543306224\": [1], \"990291085041559\": [1], \"990449343563219\": [1], \"990965155831358\": [1], \"991246089398327\": [1], \"1000637208244367\": [1], \"1004102019846020\": [1], \"1005292172744396\": [1], \"1005332457092281\": [1], \"1006534201551250\": [1], \"1006880226420026\": [1], \"1008518552104170\": [1], \"1009359731522841\": [1], \"1014448207513357\": [1], \"1015400300058940\": [1], \"1016737737789386\": [1], \"1018111673320526\": [1], \"1018884524656249\": [1], \"1020240348549830\": [1], \"1020408388241737\": [1], \"1023214921998583\": [1], \"1024732392708549\": [1], \"1026051973926350\": [1], \"1026521345045895\": [1], \"1028064840131035\": [1], \"1028225780921346\": [1], \"1028393225545710\": [1], \"1028545930630844\": [1], \"1034192675413610\": [1], \"1034482127558144\": [1], \"1035077097010040\": [1], \"1036351786795460\": [1], \"1037977600739977\": [1], \"1038118275682585\": [1], \"1040292594649638\": [1], \"1040469554416964\": [1], \"1043234353830119\": [1], \"1043341364056040\": [1], \"1043970920385728\": [1], \"1044208563801285\": [1], \"1046825705974869\": [1], \"1047646457154686\": [1], \"1049369489921772\": [1], \"1049907632141797\": [1], \"1050372949378993\": [1], \"1050884929546334\": [1], \"1056235567761865\": [1], \"1057117784035529\": [1], \"1059356424082862\": [1], \"1061459860279350\": [1], \"1061759471277280\": [1], \"1062032017828364\": [1], \"1062475813883927\": [1], \"1063385297199134\": [1], \"1063528546680109\": [1], \"1065213179089697\": [1], \"1067693381741793\": [1], \"1069225442702733\": [1], \"1069765241328905\": [1], \"1070022421341370\": [1], \"1070774158903583\": [1], \"1071826431121290\": [1], \"1072221551525172\": [1], \"1072485543548019\": [1], \"1072959229672983\": [1], \"1073211212992933\": [1], \"1079607196930125\": [1], \"1079790806999270\": [1], \"1083167228503483\": [1], \"1083979856276158\": [1], \"1086824086633758\": [1], \"1087246758303107\": [1], \"1089685402119358\": [1], \"1091611404851948\": [1], \"1091672568184574\": [1], \"1092412134695532\": [1], \"1093627101780013\": [1], \"1094921399870677\": [1], \"1096116062896072\": [1], \"1098507115531030\": [1], \"1099058020169904\": [1], \"1099952304933165\": [1], \"1100288677566866\": [1], \"1101741433116358\": [1], \"1104190588169373\": [1], \"1104960540046356\": [1], \"1105715660944757\": [1], \"1107089660309063\": [1], \"1111290410858168\": [1], \"1112992433342685\": [1], \"1116424053967575\": [1], \"1116895187134365\": [1], \"1117159871343198\": [1], \"1118809343806054\": [1], \"1119356923823775\": [1], \"1124331812349016\": [1], \"1124407702856810\": [1], \"1125790812214635\": [1], \"1126837472001370\": [1], \"1127520905106471\": [1], \"1128215279121883\": [1], \"1128781014956456\": [1], \"1131338412844525\": [1], \"1133407330006617\": [1], \"1134358436569591\": [1], \"1134747285581889\": [1], \"1136132815177758\": [1], \"1137458184235520\": [1], \"1138431327378328\": [1], \"1141674796012358\": [1], \"1143333932576612\": [1], \"1143729701282578\": [1], \"1144285854352501\": [1], \"1145093797094761\": [1], \"1148552556379006\": [1], \"1150913705106971\": [1], \"1151317215025105\": [1], \"1153164230909738\": [1], \"1153728545280655\": [1], \"1153798502314371\": [1], \"1154932944622633\": [1], \"1155584266432108\": [1], \"1156045268152769\": [1], \"1156491153431815\": [1], \"1158220105455960\": [1], \"1159127644559694\": [1], \"1159341984218297\": [1], \"1162052881213221\": [1], \"1163538260300176\": [1], \"1167797903903513\": [1], \"1170426628947561\": [1], \"1175636858264858\": [1], \"1179169749483571\": [1], \"1182068165787043\": [1], \"1182982990603977\": [1], \"1188948586003184\": [1], \"1189086134236531\": [1], \"1190826880246771\": [1], \"1192096620411786\": [1], \"1195064602204433\": [1], \"1196301744718196\": [1], \"1196455712569004\": [1], \"1202919544239845\": [1], \"1204798420898421\": [1], \"1205949280152583\": [1], \"1205971020941838\": [1], \"1206187414207457\": [1], \"1208003047547549\": [1], \"1208182722356499\": [1], \"1208449057696069\": [1], \"1210216570900457\": [1], \"1212664380498150\": [1], \"1213773789181899\": [1], \"1214266706299291\": [1], \"1217563343243527\": [1], \"1219117591969825\": [1], \"1219346492076429\": [1], \"1220335392180979\": [1], \"1220616384863784\": [1], \"1221383938605452\": [1], \"1222014572286526\": [1], \"1224254724566290\": [1], \"1226100229238141\": [1], \"1226200856244265\": [1], \"1228305661922228\": [1], \"1233954887937006\": [1], \"1234436555466242\": [1], \"1237032937883855\": [1], \"1239145575788557\": [1], \"1239339507919113\": [1], \"1243810498607173\": [1], \"1245133586716724\": [1], \"1247940790687900\": [1], \"1248051168749046\": [1], \"1248706608915280\": [1], \"1249202254062250\": [1], \"1249648750872413\": [1], \"1249655532305023\": [1], \"1255252377283829\": [1], \"1258906862843338\": [1], \"1261857219602862\": [1], \"1263201663287298\": [1], \"1263318216009230\": [1], \"1264679881957707\": [1], \"1268140222159187\": [1], \"1269343018921174\": [1], \"1270189767731506\": [1], \"1272979969318566\": [1], \"1273457265032602\": [1], \"1274457660941528\": [1], \"1275087604249899\": [1], \"1277580911249436\": [1], \"1279343685854145\": [1], \"1283260609599385\": [1], \"1284387473192725\": [1], \"1286311799178883\": [1], \"1288040761668863\": [1], \"1288778419699437\": [1], \"1290771528922788\": [1], \"1293219230347707\": [1], \"1293328556388262\": [1], \"1295078978369120\": [1], \"1296153423856149\": [1], \"1297293300936036\": [1], \"1300808368135427\": [1], \"1302641150985425\": [1], \"1304442243773585\": [1], \"1313078765175557\": [1], \"1313714169132017\": [1], \"1314213122323735\": [1], \"1314426075290867\": [1], \"1314793142574747\": [1], \"1315149012705201\": [1], \"1315716746061746\": [1], \"1316694165717524\": [1], \"1319694153005378\": [1], \"1320354776828013\": [1], \"1321565796247651\": [1], \"1321652214431386\": [1], \"1322641975569676\": [1], \"1324011933308215\": [1], \"1324912633096310\": [1], \"1326409472099152\": [1], \"1331779867021411\": [1], \"1334540092602772\": [1], \"1336308126523111\": [1], \"1338483888695361\": [1], \"1339253622709335\": [1], \"1341199030772903\": [1], \"1344910991414675\": [1], \"1345410298186231\": [1], \"1350199929931995\": [1], \"1351512066032718\": [1], \"1354302686132856\": [1], \"1356154889302605\": [1], \"1357184991366936\": [1], \"1357471996570352\": [1], \"1357753811266810\": [1], \"1358512347106456\": [1], \"1359543486509419\": [1], \"1361025446004153\": [1], \"1367119937163179\": [1], \"1367709901942540\": [1], \"1367773071990624\": [1], \"1369074343824274\": [1], \"1370726350834256\": [1], \"1378835613457150\": [1], \"1381248081202327\": [1], \"1386306459556406\": [1], \"1387495270238779\": [1], \"1389922397452403\": [1], \"1390298164990813\": [1], \"1390933089013093\": [1], \"1390983369788694\": [1], \"1392100300924345\": [1], \"1393217968463266\": [1], \"1399606615821383\": [1], \"1403317507055171\": [1], \"1403745983783279\": [1], \"1403943799860029\": [1], \"1404699212058851\": [1], \"1405532869402451\": [1], \"1406604995721159\": [1], \"1407541218252835\": [1], \"1408249754988648\": [1], \"1408657874398720\": [1], \"1413668912211922\": [1], \"1419788555072555\": [1], \"1420599960706969\": [1], \"1422752142981515\": [1], \"1427277086932821\": [1], \"1428863808477543\": [1], \"1429504535083946\": [1], \"1433457682543583\": [1], \"1435606435053804\": [1], \"1436434476583557\": [1], \"1439553679698462\": [1], \"1439915892442607\": [1], \"1440508870826217\": [1], \"1444848353238051\": [1], \"1445027197420430\": [1], \"1447256006616572\": [1], \"1453776517788876\": [1], \"1453971277877355\": [1], \"1455146321661919\": [1], \"1457281691629028\": [1], \"1457356346001656\": [1], \"1458821018066601\": [1], \"1458991877210692\": [1], \"1459026861515707\": [1], \"1461973582780745\": [1], \"1462638113586229\": [1], \"1464070890825816\": [1], \"1465200712992811\": [1], \"1465729926859313\": [1], \"1466886910182855\": [1], \"1467962703414988\": [1], \"1470283952365044\": [1], \"1471416194191364\": [1], \"1474638620996403\": [1], \"1478879011117637\": [1], \"1478944333461504\": [1], \"1483169158074609\": [1], \"1483807540752667\": [1], \"1485918098877112\": [1], \"1486328236330322\": [1], \"1486849697797305\": [1], \"1496355685638144\": [1], \"1497424397846856\": [1], \"1497841258260530\": [1], \"1500281487292048\": [1], \"1500583334693037\": [1], \"1501230823468058\": [1], \"1501876325850252\": [1], \"1503237048393006\": [1], \"1504172060146389\": [1], \"1505630216984720\": [1], \"1507555232947731\": [1], \"1508106302673852\": [1], \"1508284782767738\": [1], \"1508493756855327\": [1], \"1510619933801517\": [1], \"1513607147621410\": [1], \"1513938161219777\": [1], \"1515834574998746\": [1], \"1517380888926906\": [1], \"1519632498026078\": [1], \"1520187359632510\": [1], \"1521560235805374\": [1], \"1523636549508943\": [1], \"1524107341991353\": [1], \"1531266000743625\": [1], \"1535523703906334\": [1], \"1544456939220609\": [1], \"1545845179964061\": [1], \"1546950619301861\": [1], \"1549144689587640\": [1], \"1549524708051253\": [1], \"1550335948023219\": [1], \"1551002559653775\": [1], \"1551041536160418\": [1], \"1552376704952754\": [1], \"1554923177111102\": [1], \"1556763833558772\": [1], \"1558177323718883\": [1], \"1561284011060316\": [1], \"1562979523808008\": [1], \"1563753848481199\": [1], \"1567610868177164\": [1], \"1567981603128011\": [1], \"1568466581804421\": [1], \"1569475238596379\": [1], \"1570900757606239\": [1], \"1571686929770253\": [1], \"1573051106183234\": [1], \"1573455504575642\": [1], \"1578472192033269\": [1], \"1579558591754989\": [1], \"1579899761330636\": [1], \"1581843086817381\": [1], \"1582799698631958\": [1], \"1585451728009321\": [1], \"1586193077820998\": [1], \"1587951804321711\": [1], \"1590255930369798\": [1], \"1590778336297155\": [1], \"1591128874020667\": [1], \"1591197552974737\": [1], \"1591257470509498\": [1], \"1592134816295750\": [1], \"1592788677550558\": [1], \"1594127966354593\": [1], \"1596867723859658\": [1], \"1599569571899213\": [1], \"1603725676838730\": [1], \"1605155483138119\": [1], \"1605507869903661\": [1], \"1605643475927301\": [1], \"1605749780926183\": [1], \"1606496927349590\": [1], \"1609602290901895\": [1], \"1610504873942294\": [1], \"1611070530726608\": [1], \"1611136459707336\": [1], \"1611838508553590\": [1], \"1613983892001636\": [1], \"1616449376409605\": [1], \"1620525948473200\": [1], \"1620654324499687\": [1], \"1620828586742500\": [1], \"1622792506136230\": [1], \"1623177232951190\": [1], \"1628031603362222\": [1], \"1628427570723049\": [1], \"1628826930558098\": [1], \"1631075608093301\": [1], \"1631580735095455\": [1], \"1633956607167470\": [1], \"1634208487331527\": [1], \"1636637379355737\": [1], \"1637738995387401\": [1], \"1638608323436961\": [1], \"1648061823981851\": [1], \"1649563143492733\": [1], \"1649734648866344\": [1], \"1650123596411568\": [1], \"1650173610794987\": [1], \"1651285389609376\": [1], \"1654735665865028\": [1], \"1656727732392151\": [1], \"1657372457850347\": [1], \"1657683141643421\": [1], \"1662217332746452\": [1], \"1664972197311850\": [1], \"1666357261266686\": [1], \"1666426870941428\": [1], \"1672690124985166\": [1], \"1677294072833154\": [1], \"1677567756062313\": [1], \"1678031304317865\": [1], \"1679888975849706\": [1], \"1680207094093405\": [1], \"1681650612372020\": [1], \"1682679526241959\": [1], \"1683759465116413\": [1], \"1685934591838962\": [1], \"1686952464237012\": [1], \"1687475275751397\": [1], \"1688549635622032\": [1], \"1688840951897797\": [1], \"1692306792193613\": [1], \"1693009744449856\": [1], \"1693152180057161\": [1], \"1694446690872169\": [1], \"1696033026264979\": [1], \"1696754301745726\": [1], \"1698684589263451\": [1], \"1699445949090709\": [1], \"1700104037127426\": [1], \"1701817738393133\": [1], \"1701963912702416\": [1], \"1702762481356132\": [1], \"1703195926236352\": [1], \"1703235536180823\": [1], \"1705579104626584\": [1], \"1707402488454165\": [1], \"1709665004165000\": [1], \"1710320827907843\": [1], \"1710325165017340\": [1], \"1713551184061125\": [1], \"1715231462066277\": [1], \"1715853334929324\": [1], \"1716044732966958\": [1], \"1716524667964216\": [1], \"1718229977783506\": [1], \"1718579038309779\": [1], \"1719194544414539\": [1], \"1722376268709793\": [1], \"1722620398030254\": [1], \"1723278153800153\": [1], \"1723533020190843\": [1], \"1724562335785665\": [1], \"1726248997697258\": [1], \"1729299192259492\": [1], \"1730854786589372\": [1], \"1731670951728410\": [1], \"1732621988229187\": [1], \"1738963211794076\": [1], \"1742318999485071\": [1], \"1743759003772825\": [1], \"1743886885060928\": [1], \"1744595755680419\": [1], \"1745407833352294\": [1], \"1746150395043607\": [1], \"1746153769574551\": [1], \"1746353753833374\": [1], \"1747844463695575\": [1], \"1748342851225517\": [1], \"1748584054128624\": [1], \"1751722028562118\": [1], \"1753574829045639\": [1], \"1756411282239835\": [1], \"1763721976686007\": [1], \"1763881200629909\": [1], \"1764636074027026\": [1], \"1768278332683466\": [1], \"1771524733819442\": [1], \"1775109601743542\": [1], \"1775286866315788\": [1], \"1775423279563145\": [1], \"1775783578939746\": [1], \"1781832644050906\": [1], \"1782840121291661\": [1], \"1786027222395626\": [1], \"1786367537808794\": [1], \"1790809851613620\": [1], \"1794550986702348\": [1], \"1794618855869188\": [1], \"1796031778114714\": [1], \"1798466930762663\": [1], \"1798529498252686\": [1], \"1802183562509174\": [1], \"1802785646220595\": [1], \"1803695803895949\": [1], \"1803786233751975\": [1], \"1806503351116266\": [1], \"1806838598685332\": [1], \"1809004697139807\": [1], \"1810443800004020\": [1], \"1812212693054064\": [1], \"1813025322232884\": [1], \"1814130198337487\": [1], \"1817091663735073\": [1], \"1818789181822125\": [1], \"1819941912393090\": [1], \"1820725182659498\": [1], \"1821724132772143\": [1], \"1823928111869671\": [1], \"1824761204257546\": [1], \"1826180489776123\": [1], \"1828979341373426\": [1], \"1829165864026592\": [1], \"1829825919708803\": [1], \"1831586670874591\": [1], \"1832041421058402\": [1], \"1832358362788935\": [1], \"1834049710846968\": [1], \"1834697174350675\": [1], \"1835763120348014\": [1], \"1835832863855014\": [1], \"1837721826431456\": [1], \"1837932397479249\": [1], \"1838168009379099\": [1], \"1839509489254967\": [1], \"1840526591932034\": [1], \"1842149098517895\": [1], \"1842767001472565\": [1], \"1843284607871743\": [1]}, \"ident_to_name\": {\"TARA_ASE_MAG_00031\": \"TARA_ASE_MAG_00031\", \"TARA_PSW_MAG_00136\": \"TARA_PSW_MAG_00136\"}, \"ident_to_idx\": {\"TARA_ASE_MAG_00031\": 0, \"TARA_PSW_MAG_00136\": 1}, \"idx_to_lid\": {\"0\": 0}}\n"
  },
  {
    "path": "tests/test-data/lca/delmont-1.tsv",
    "content": "TARA_ASE_MAG_00031\tBacteria\tProteobacteria\tGammaproteobacteria\tAlteromonadales\tAlteromonadaceae\tAlteromonas\tAlteromonas_macleodii\n"
  },
  {
    "path": "tests/test-data/lca/delmont-2.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,foo,bar,baz\n\n"
  },
  {
    "path": "tests/test-data/lca/delmont-2.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"0\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"foo\"], [\"genus\", \"bar\"], [\"species\", \"baz\"]]}, \"hashval_to_idx\": {\"1546382602244\": [0], \"9656868519272\": [0], \"23022543468726\": [0], \"28317189440418\": [0], \"41280726133805\": [0], \"66960113329393\": [0], \"72652244604468\": [0], \"72987082939193\": [0], \"93603632485639\": [0], \"94372221234209\": [0], \"95803555452107\": [0], \"96189277714686\": [0], \"98204962844834\": [0], \"99291828928919\": [0], \"105771165192346\": [0], \"107960764418249\": [0], \"111428825192941\": [0], \"127274207264390\": [0], \"140215841784768\": [0], \"140605527581622\": [0], \"142232850272699\": [0], \"145924186970433\": [0], \"150127562207023\": [0], \"155682932216255\": [0], \"159001134887689\": [0], \"164388214546473\": [0], \"173794201733501\": [0], \"186124795839659\": [0], \"190963456940444\": [0], \"194039429765196\": [0], \"226438983265190\": [0], \"235651723624481\": [0], \"238048993345481\": [0], \"249975135143449\": [0], \"267074725930899\": [0], \"270342483362557\": [0], \"280132684676074\": [0], \"300128441651611\": [0], \"316505175229988\": [0], \"325519145492999\": [0], \"331036651754826\": [0], \"333546831132357\": [0], \"339312791908298\": [0], \"367926290537692\": [0], \"381453341363664\": [0], \"406460060374332\": [0], \"428682354107007\": [0], \"431291775730353\": [0], \"441722950852645\": [0], \"448992122346447\": [0], \"477655250940470\": [0], \"477750102449067\": [0], \"477985950174589\": [0], \"480198316139604\": [0], \"491608171514200\": [0], \"495502740648975\": [0], \"519965149014263\": [0], \"524965228749517\": [0], \"531138835074212\": [0], \"533415256881126\": [0], \"541580701997867\": [0], \"552203173994680\": [0], \"559004439467633\": [0], \"562793249377929\": [0], \"562879802277703\": [0], \"587055287418925\": [0], \"589312120159525\": [0], \"597739816579553\": [0], \"608423992734323\": [0], \"614217354495893\": [0], \"615459930701230\": [0], \"615791016313951\": [0], \"625698543331114\": [0], \"646824347329197\": [0], \"667158191608223\": [0], \"669124584026739\": [0], \"720023354205321\": [0], \"723110102710602\": [0], \"729489459296287\": [0], \"730438631834823\": [0], \"749611574327872\": [0], \"756371653009437\": [0], \"759680015332124\": [0], \"762510262097309\": [0], \"763564254757376\": [0], \"766760371827669\": [0], \"768032693645756\": [0], \"771127212739497\": [0], \"782144581578897\": [0], \"784975368234061\": [0], \"799539922825962\": [0], \"819980663198132\": [0], \"823882385515799\": [0], \"826776608053620\": [0], \"840828370189348\": [0], \"852418152547474\": [0], \"852799198713520\": [0], \"855454436267264\": [0], \"866696616176181\": [0], \"867213129529998\": [0], \"876309521298385\": [0], \"885125028078863\": [0], \"909019726936576\": [0], \"909779712705126\": [0], \"916050873987175\": [0], \"927218551670748\": [0], \"928864246605368\": [0], \"930417395222212\": [0], \"941110207197902\": [0], \"955243957079948\": [0], \"966301070196790\": [0], \"989911402764299\": [0], \"995181259057379\": [0], \"1002350630585950\": [0], \"1012856342746104\": [0], \"1014127973930724\": [0], \"1022663693402515\": [0], \"1035776199846468\": [0], \"1038102561676599\": [0], \"1054756736331100\": [0], \"1057487646410902\": [0], \"1062472050386420\": [0], \"1078792937948355\": [0], \"1079268349078254\": [0], \"1081877113080133\": [0], \"1088174794493924\": [0], \"1119862443959162\": [0], \"1134261531316139\": [0], \"1157033641669577\": [0], \"1162236359054384\": [0], \"1167266432939449\": [0], \"1167742077190225\": [0], \"1176654542862639\": [0], \"1217545566354888\": [0], \"1226508956619832\": [0], \"1253324060639472\": [0], \"1270568848112648\": [0], \"1281774363818117\": [0], \"1299213939456440\": [0], \"1303115317709160\": [0], \"1305464820564814\": [0], \"1307819791004830\": [0], \"1309074404765591\": [0], \"1311250718219883\": [0], \"1327589370379644\": [0], \"1335123441609714\": [0], \"1348262711969291\": [0], \"1371091180108917\": [0], \"1374368677198015\": [0], \"1377678539029900\": [0], \"1391949712810566\": [0], \"1394148237651533\": [0], \"1397236581360400\": [0], \"1402428225174714\": [0], \"1428382328937422\": [0], \"1431557607118119\": [0], \"1441559140548570\": [0], \"1445089604147204\": [0], \"1448617435830484\": [0], \"1477041049132630\": [0], \"1511338704810222\": [0], \"1521422840867651\": [0], \"1537983521926132\": [0], \"1539320867575362\": [0], \"1569677530496022\": [0], \"1573488765296414\": [0], \"1577865237666845\": [0], \"1590413900683188\": [0], \"1591774836066005\": [0], \"1605993198328440\": [0], \"1611305741679768\": [0], \"1613114021117770\": [0], \"1623535737008266\": [0], \"1632442965615300\": [0], \"1636460128406331\": [0], \"1643515657796596\": [0], \"1650598737168923\": [0], \"1670067443802112\": [0], \"1671758592552230\": [0], \"1678998318119428\": [0], \"1693828967529278\": [0], \"1700524824651835\": [0], \"1702169840496522\": [0], \"1712577664695818\": [0], \"1721553791636839\": [0], \"1723798153586017\": [0], \"1729414678531026\": [0], \"1747039637991800\": [0], \"1751666526384185\": [0], \"1759510552400668\": [0], \"1761856912383455\": [0], \"1773603088467393\": [0], \"1787003318829899\": [0], \"1788164904348957\": [0], \"1799047439290001\": [0], \"1800521778298568\": [0], \"1807254257169762\": [0], \"1825859169439057\": [0], \"1826104878054981\": [0], \"1833465377439232\": [0], \"9384929430585\": [1], \"9513224502861\": [1], \"10694710544526\": [1], \"13525121908835\": [1], \"13884726272861\": [1], \"14069218958763\": [1], \"14691127881695\": [1], \"15433493785955\": [1], \"16920736157686\": [1], \"19108521646251\": [1], \"19502303039649\": [1], \"22899505354632\": [1], \"23915488984375\": [1], \"24207026115422\": [1], \"27337901004347\": [1], \"27727571486476\": [1], \"27742199553575\": [1], \"29030647449725\": [1], \"31703229491384\": [1], \"32381621910652\": [1], \"32897728814600\": [1], \"34246213822129\": [1], \"34821974424843\": [1], \"35644187168408\": [1], \"36212986625285\": [1], \"37702400100353\": [1], \"39895866026116\": [1], \"41112501431795\": [1], \"41824335384345\": [1], \"42234472156482\": [1], \"42998999775228\": [1], \"43323418396098\": [1], \"46425122704669\": [1], \"47514198890704\": [1], \"50653301550997\": [1], \"50802886922972\": [1], \"52474551735582\": [1], \"53921332240938\": [1], \"55734725516598\": [1], \"56071775577932\": [1], \"56506399142231\": [1], \"58643529638644\": [1], \"59237242473902\": [1], \"60822556938364\": [1], \"62665955956242\": [1], \"65572742372076\": [1], \"67335935597031\": [1], \"72289811275739\": [1], \"74434913203633\": [1], \"77418725525644\": [1], \"77525409186509\": [1], \"78118950411788\": [1], \"80241726900606\": [1], \"82351955864461\": [1], \"82604128342369\": [1], \"82989771326247\": [1], \"85257841957020\": [1], \"85728375593670\": [1], \"86174191238853\": [1], \"86227609253057\": [1], \"87355384692289\": [1], \"88219022822991\": [1], \"88296563368521\": [1], \"88525854756564\": [1], \"88819507180663\": [1], \"92622208139438\": [1], \"92690056155078\": [1], \"92870352981663\": [1], \"94522721595922\": [1], \"94551513971362\": [1], \"96742246751956\": [1], \"99509808173468\": [1], \"100408042349435\": [1], \"103161501295460\": [1], \"103940913494064\": [1], \"105123985732733\": [1], \"106978566995468\": [1], \"107239073965564\": [1], \"111204579569898\": [1], \"111609707448237\": [1], \"111889584457500\": [1], \"112972675344478\": [1], \"114349042314703\": [1], \"116548942523971\": [1], \"118003632964691\": [1], \"120658463120904\": [1], \"121293149599224\": [1], \"125458873025813\": [1], \"126230595076065\": [1], \"130049558415340\": [1], \"132732019012042\": [1], \"135264258034535\": [1], \"137035756717308\": [1], \"137248857153280\": [1], \"139258132401677\": [1], \"140412191080293\": [1], \"143104424711544\": [1], \"144216637893643\": [1], \"144882454913504\": [1], \"145204518052233\": [1], \"146248935172068\": [1], \"148449580488621\": [1], \"149038816388133\": [1], \"151784752023226\": [1], \"151910446421271\": [1], \"152091101267478\": [1], \"152354278043076\": [1], \"152354617871225\": [1], \"155198129452281\": [1], \"156242774311029\": [1], \"157571231583874\": [1], \"158188141733452\": [1], \"161876830090254\": [1], \"162063851231882\": [1], \"162068007652410\": [1], \"162869364970070\": [1], \"166451908192512\": [1], \"168214939433079\": [1], \"171209806818531\": [1], \"172236667892666\": [1], \"174619979668846\": [1], \"175748505826929\": [1], \"177226851458646\": [1], \"179538171937769\": [1], \"179997764910353\": [1], \"182998890987131\": [1], \"183314514830737\": [1], \"183481103274421\": [1], \"184140469304310\": [1], \"185646508174430\": [1], \"186177671878337\": [1], \"186987890694654\": [1], \"192431948296187\": [1], \"195456225289440\": [1], \"195587724824288\": [1], \"197731019678307\": [1], \"199717251275573\": [1], \"204251896616205\": [1], \"204472646890528\": [1], \"205458705349958\": [1], \"208141571229915\": [1], \"208794100880143\": [1], \"211086110401200\": [1], \"211805349623155\": [1], \"212604959681205\": [1], \"215298965008107\": [1], \"215337124343848\": [1], \"215465128025151\": [1], \"217363034328851\": [1], \"217938530757038\": [1], \"218439314856181\": [1], \"218669497849070\": [1], \"219797174722389\": [1], \"221469365488646\": [1], \"223658999838191\": [1], \"224153762423826\": [1], \"227086150451800\": [1], \"227642044776719\": [1], \"230782299150016\": [1], \"232079797506288\": [1], \"233385364145538\": [1], \"233687852267362\": [1], \"233907911133493\": [1], \"235251837075613\": [1], \"235900782617048\": [1], \"237168653202910\": [1], \"238721566220513\": [1], \"240406243302764\": [1], \"244173802707805\": [1], \"245901011737339\": [1], \"247004268319392\": [1], \"247100238511760\": [1], \"248852521217080\": [1], \"250123169670589\": [1], \"250229853020252\": [1], \"250707987679917\": [1], \"250989516429992\": [1], \"252737210988482\": [1], \"253068781328555\": [1], \"253897388163660\": [1], \"254141220123910\": [1], \"254279085861494\": [1], \"258715618402623\": [1], \"262636845116046\": [1], \"263481285546409\": [1], \"265276936574346\": [1], \"266067658090815\": [1], \"266390634790022\": [1], \"267964730808427\": [1], \"270034526426938\": [1], \"271555118674359\": [1], \"271757549081257\": [1], \"273151252192648\": [1], \"274656605299335\": [1], \"276457546755145\": [1], \"277095040155526\": [1], \"278425916857333\": [1], \"279911187945389\": [1], \"282409272713120\": [1], \"282490498116439\": [1], \"283813166000240\": [1], \"285311602700422\": [1], \"285700092730438\": [1], \"287801610181588\": [1], \"290941404426341\": [1], \"294921958928721\": [1], \"296210359981803\": [1], \"296309817102550\": [1], \"297585003281459\": [1], \"299009430146793\": [1], \"299474512884981\": [1], \"301184530582644\": [1], \"306139222258319\": [1], \"307100981994367\": [1], \"310168320972281\": [1], \"310411551340673\": [1], \"312955381732504\": [1], \"313345456542067\": [1], \"314371372402449\": [1], \"314747261707596\": [1], \"314919601669310\": [1], \"315609637384083\": [1], \"319485045444810\": [1], \"320540642594695\": [1], \"321191136245490\": [1], \"322660849013133\": [1], \"324675614079940\": [1], \"324696338982734\": [1], \"325275518462825\": [1], \"328697226947212\": [1], \"329247203588480\": [1], \"334016370990842\": [1], \"337200032877142\": [1], \"338349771642222\": [1], \"338382718102596\": [1], \"339502315826224\": [1], \"342041453940437\": [1], \"342219283371857\": [1], \"344148075604538\": [1], \"346739737982892\": [1], \"350047871177562\": [1], \"350167482130512\": [1], \"352709993221047\": [1], \"353806512569888\": [1], \"354787036339150\": [1], \"355786040904052\": [1], \"359095923123772\": [1], \"359664220589876\": [1], \"360702525394266\": [1], \"363032982220670\": [1], \"363123762068405\": [1], \"364476590881815\": [1], \"365941727417813\": [1], \"367013504857360\": [1], \"369434407418619\": [1], \"370573159508445\": [1], \"371153080863731\": [1], \"373464958611928\": [1], \"374934689730831\": [1], \"375505856254465\": [1], \"375829025059531\": [1], \"376706414761462\": [1], \"377611592408251\": [1], \"379444628200775\": [1], \"380719933858673\": [1], \"382383386796048\": [1], \"384161395273382\": [1], \"384882631620195\": [1], \"385111408547166\": [1], \"386300883487240\": [1], \"386314879650630\": [1], \"387000046439703\": [1], \"388059835336383\": [1], \"388517166352883\": [1], \"389875392948246\": [1], \"390167763652053\": [1], \"390947799548543\": [1], \"391761160048633\": [1], \"392588769479065\": [1], \"393404737954463\": [1], \"393565324213398\": [1], \"393992263386451\": [1], \"399764765223192\": [1], \"402391767396922\": [1], \"402845882844859\": [1], \"412811515897705\": [1], \"414588189913264\": [1], \"418286505229437\": [1], \"418973611375909\": [1], \"419871607526003\": [1], \"423144063273262\": [1], \"423605640675662\": [1], \"423609354472942\": [1], \"424699830534222\": [1], \"428556122460013\": [1], \"429073097945435\": [1], \"431421580365883\": [1], \"433898361341083\": [1], \"434072187325092\": [1], \"434088606571364\": [1], \"434910849927953\": [1], \"435063800634155\": [1], \"435885342138582\": [1], \"436694504052916\": [1], \"438117922688789\": [1], \"440014243404310\": [1], \"440874716262573\": [1], \"441854447475222\": [1], \"443920405142831\": [1], \"446834394604251\": [1], \"448958509149239\": [1], \"451450601747037\": [1], \"451691772060971\": [1], \"452830057988530\": [1], \"452889917700251\": [1], \"456932487267477\": [1], \"458289798008267\": [1], \"460806335735062\": [1], \"462012528278959\": [1], \"462147123269934\": [1], \"463912533153856\": [1], \"464658520570211\": [1], \"465725666537396\": [1], \"466164800378293\": [1], \"468221471845826\": [1], \"468901496572575\": [1], \"473235548034288\": [1], \"474179273546441\": [1], \"478410714103710\": [1], \"479251256151199\": [1], \"481053015752778\": [1], \"482357958562927\": [1], \"482439019556840\": [1], \"482621230931881\": [1], \"484110734070913\": [1], \"484745656475355\": [1], \"485410325150790\": [1], \"486209866223171\": [1], \"488130308977937\": [1], \"488822471539933\": [1], \"489041980361778\": [1], \"490801511688893\": [1], \"491083298264714\": [1], \"491832121889621\": [1], \"491999320509346\": [1], \"492589927273065\": [1], \"494872493594278\": [1], \"495231594554331\": [1], \"496051719902631\": [1], \"496113765633896\": [1], \"496980130763543\": [1], \"498169047552624\": [1], \"499177967233952\": [1], \"500902023142968\": [1], \"501184785502759\": [1], \"501354656562560\": [1], \"501503703782704\": [1], \"503733863968250\": [1], \"504551168005395\": [1], \"507595243506975\": [1], \"509738188248271\": [1], \"513179745263922\": [1], \"513537125074114\": [1], \"513936355260637\": [1], \"517832242661092\": [1], \"518624571531924\": [1], \"520421220213659\": [1], \"521078509639159\": [1], \"526835153054304\": [1], \"528146792468320\": [1], \"528612625035561\": [1], \"532086467422319\": [1], \"536085413898718\": [1], \"539789430192018\": [1], \"540174844714491\": [1], \"541407780392101\": [1], \"541461157747291\": [1], \"542385985159087\": [1], \"543069830516211\": [1], \"544453355106020\": [1], \"549000519108727\": [1], \"550714989522765\": [1], \"550997953764389\": [1], \"554416503582474\": [1], \"554775088469290\": [1], \"555574366980158\": [1], \"556289096094037\": [1], \"557981349873999\": [1], \"558077532710784\": [1], \"560584791980453\": [1], \"560813485187048\": [1], \"563075885791114\": [1], \"565689400295334\": [1], \"566254256339235\": [1], \"567121556962199\": [1], \"569199490360936\": [1], \"569236988228251\": [1], \"571948915111351\": [1], \"572010471403993\": [1], \"572806946959801\": [1], \"573912459631798\": [1], \"575316829804180\": [1], \"575332380110505\": [1], \"578636848190665\": [1], \"581225445664044\": [1], \"583316550660325\": [1], \"586878249509026\": [1], \"588105213474256\": [1], \"588196227953251\": [1], \"588914844732672\": [1], \"594591141213430\": [1], \"594933220046648\": [1], \"595351928056756\": [1], \"595997576351928\": [1], \"597523005425474\": [1], \"601077054374749\": [1], \"602006467925513\": [1], \"604849998120880\": [1], \"605307796648947\": [1], \"606592393896592\": [1], \"607306380306269\": [1], \"608036204841928\": [1], \"611077295392526\": [1], \"611597115226067\": [1], \"611687075682570\": [1], \"611852941091832\": [1], \"614352705559406\": [1], \"614455152394729\": [1], \"614870512195646\": [1], \"616034211238080\": [1], \"617682682031381\": [1], \"620374574619807\": [1], \"622433629667033\": [1], \"622745262948721\": [1], \"624018620374506\": [1], \"624511090219051\": [1], \"626892042653326\": [1], \"627476803354615\": [1], \"628715236425046\": [1], \"628981403660458\": [1], \"633120412417012\": [1], \"633458681166249\": [1], \"635402544869144\": [1], \"636865382881312\": [1], \"639439572579290\": [1], \"639844036608997\": [1], \"640574550269185\": [1], \"641021579595098\": [1], \"641201948545577\": [1], \"643668913078934\": [1], \"647719265762454\": [1], \"648117550988236\": [1], \"649453313990045\": [1], \"650388789204913\": [1], \"651393898420396\": [1], \"651652685663747\": [1], \"651947669667456\": [1], \"652093532522963\": [1], \"654089246539397\": [1], \"655352237876313\": [1], \"664018874777035\": [1], \"665193576410442\": [1], \"665445749513650\": [1], \"665501525654284\": [1], \"667382118672659\": [1], \"668643157424266\": [1], \"669367393799418\": [1], \"670548064351682\": [1], \"671837839276593\": [1], \"675628945510951\": [1], \"678589978773066\": [1], \"680039161257735\": [1], \"680076753286028\": [1], \"684722260130595\": [1], \"693295336660297\": [1], \"695873273666680\": [1], \"696311302812619\": [1], \"697776019883169\": [1], \"700508911989772\": [1], \"700826309434573\": [1], \"701515034683283\": [1], \"702215527797042\": [1], \"709726649853343\": [1], \"711324293051248\": [1], \"712062923961271\": [1], \"713230326059832\": [1], \"713704564734271\": [1], \"714206500411569\": [1], \"715088917525218\": [1], \"716380268033033\": [1], \"717648872388742\": [1], \"717805694968046\": [1], \"724254950458698\": [1], \"726914057607923\": [1], \"727022289982217\": [1], \"727085891489869\": [1], \"729284823324266\": [1], \"729529589344364\": [1], \"729859995306271\": [1], \"729907263751486\": [1], \"730532284069258\": [1], \"731250758493486\": [1], \"734342440385373\": [1], \"735057027595515\": [1], \"735147341892890\": [1], \"735935573312536\": [1], \"736472286827206\": [1], \"736966386234788\": [1], \"737280225344363\": [1], \"738555926236845\": [1], \"739555068553673\": [1], \"744888541229405\": [1], \"746771571947671\": [1], \"747953676888271\": [1], \"749134504459760\": [1], \"750226931711434\": [1], \"752571135244728\": [1], \"753215710744558\": [1], \"754537491874861\": [1], \"754634799430002\": [1], \"755320966395002\": [1], \"755577226225016\": [1], \"757545029057368\": [1], \"758194285746344\": [1], \"759901458205731\": [1], \"763091304858506\": [1], \"763297803793654\": [1], \"763380848899317\": [1], \"764132675957923\": [1], \"770647739503399\": [1], \"771240278060942\": [1], \"774623218122618\": [1], \"775189259667264\": [1], \"775604635024411\": [1], \"778149562341362\": [1], \"779798471261036\": [1], \"780460163561520\": [1], \"781647914257694\": [1], \"783632502063577\": [1], \"783844509022055\": [1], \"784296363173728\": [1], \"785635434592057\": [1], \"786149397078278\": [1], \"787119851540525\": [1], \"788895114668573\": [1], \"790924695875873\": [1], \"791442318537695\": [1], \"792695522336594\": [1], \"794636268219217\": [1], \"797357099301196\": [1], \"797503443220410\": [1], \"798344300734713\": [1], \"798997597672116\": [1], \"801416967054094\": [1], \"802473981384727\": [1], \"802631787086831\": [1], \"804921131920706\": [1], \"805942594876124\": [1], \"806602061890491\": [1], \"807988939516732\": [1], \"809694230605863\": [1], \"810312684174606\": [1], \"810639121837900\": [1], \"812419812832465\": [1], \"813436507531577\": [1], \"820468156529024\": [1], \"820568817268897\": [1], \"821782146748205\": [1], \"823336088913313\": [1], \"823623650457764\": [1], \"823770332876281\": [1], \"824155459680678\": [1], \"826484215036908\": [1], \"826543714319258\": [1], \"826750415562163\": [1], \"827202837229189\": [1], \"827989226065302\": [1], \"832211083048597\": [1], \"834029126522076\": [1], \"834194932281766\": [1], \"835511007394732\": [1], \"836194868312543\": [1], \"839256169418728\": [1], \"839470680343939\": [1], \"840516237577378\": [1], \"841658746700384\": [1], \"842093004761779\": [1], \"846570234487809\": [1], \"847107566727814\": [1], \"847469039491699\": [1], \"848119309701293\": [1], \"850307412030053\": [1], \"850846587098968\": [1], \"851584439335311\": [1], \"852195297066665\": [1], \"856077299341227\": [1], \"856491564986841\": [1], \"861781891434166\": [1], \"861957559510232\": [1], \"862546295103803\": [1], \"863167306292692\": [1], \"864014465788824\": [1], \"867976402887234\": [1], \"869768902402946\": [1], \"871627657860286\": [1], \"871800740090986\": [1], \"874879573164488\": [1], \"875180759560663\": [1], \"875928218436840\": [1], \"875999514470084\": [1], \"876457992803429\": [1], \"877729800936851\": [1], \"880643983348280\": [1], \"881273545110083\": [1], \"882470636911607\": [1], \"883797496447477\": [1], \"884521547475220\": [1], \"884594061731088\": [1], \"886284233722349\": [1], \"887199074814088\": [1], \"888150056443464\": [1], \"892659640429338\": [1], \"896484212652567\": [1], \"897256084225265\": [1], \"898032136961727\": [1], \"898423771369234\": [1], \"899245491400653\": [1], \"899750070363991\": [1], \"900498058186691\": [1], \"902343490461233\": [1], \"902513515688217\": [1], \"903500732246926\": [1], \"904911344279547\": [1], \"908507282487687\": [1], \"909754530415728\": [1], \"910668743047924\": [1], \"911098888785218\": [1], \"915257179729139\": [1], \"916281532208948\": [1], \"918818134423863\": [1], \"919070331962360\": [1], \"921324434826272\": [1], \"922487947977218\": [1], \"923702123218223\": [1], \"926464718358018\": [1], \"927318372327768\": [1], \"927457156413927\": [1], \"929846624082359\": [1], \"929854312903821\": [1], \"930618790038683\": [1], \"934385197678465\": [1], \"936294561746814\": [1], \"937145857014447\": [1], \"937573496924454\": [1], \"941869144180760\": [1], \"943225519015744\": [1], \"943692249387771\": [1], \"944090705525540\": [1], \"946335147815232\": [1], \"947693328780379\": [1], \"948743619687118\": [1], \"949026830339339\": [1], \"949529945296592\": [1], \"951447860849638\": [1], \"952375966634304\": [1], \"958006234870627\": [1], \"958843598945216\": [1], \"961483448355043\": [1], \"962294838458000\": [1], \"962807126020571\": [1], \"963545700033324\": [1], \"965122059921360\": [1], \"965531424372493\": [1], \"966426135099242\": [1], \"967620896659075\": [1], \"967622243443690\": [1], \"968406847956406\": [1], \"968714685713214\": [1], \"976412116975001\": [1], \"978345217402879\": [1], \"978400924884494\": [1], \"979458134731450\": [1], \"979732428118076\": [1], \"980179500442908\": [1], \"980292993202160\": [1], \"980900802772967\": [1], \"982018440382133\": [1], \"984070433015694\": [1], \"985136506912502\": [1], \"985920008298018\": [1], \"986538248880615\": [1], \"987517249144953\": [1], \"988492805280094\": [1], \"989386543306224\": [1], \"990291085041559\": [1], \"990449343563219\": [1], \"990965155831358\": [1], \"991246089398327\": [1], \"1000637208244367\": [1], \"1004102019846020\": [1], \"1005292172744396\": [1], \"1005332457092281\": [1], \"1006534201551250\": [1], \"1006880226420026\": [1], \"1008518552104170\": [1], \"1009359731522841\": [1], \"1014448207513357\": [1], \"1015400300058940\": [1], \"1016737737789386\": [1], \"1018111673320526\": [1], \"1018884524656249\": [1], \"1020240348549830\": [1], \"1020408388241737\": [1], \"1023214921998583\": [1], \"1024732392708549\": [1], \"1026051973926350\": [1], \"1026521345045895\": [1], \"1028064840131035\": [1], \"1028225780921346\": [1], \"1028393225545710\": [1], \"1028545930630844\": [1], \"1034192675413610\": [1], \"1034482127558144\": [1], \"1035077097010040\": [1], \"1036351786795460\": [1], \"1037977600739977\": [1], \"1038118275682585\": [1], \"1040292594649638\": [1], \"1040469554416964\": [1], \"1043234353830119\": [1], \"1043341364056040\": [1], \"1043970920385728\": [1], \"1044208563801285\": [1], \"1046825705974869\": [1], \"1047646457154686\": [1], \"1049369489921772\": [1], \"1049907632141797\": [1], \"1050372949378993\": [1], \"1050884929546334\": [1], \"1056235567761865\": [1], \"1057117784035529\": [1], \"1059356424082862\": [1], \"1061459860279350\": [1], \"1061759471277280\": [1], \"1062032017828364\": [1], \"1062475813883927\": [1], \"1063385297199134\": [1], \"1063528546680109\": [1], \"1065213179089697\": [1], \"1067693381741793\": [1], \"1069225442702733\": [1], \"1069765241328905\": [1], \"1070022421341370\": [1], \"1070774158903583\": [1], \"1071826431121290\": [1], \"1072221551525172\": [1], \"1072485543548019\": [1], \"1072959229672983\": [1], \"1073211212992933\": [1], \"1079607196930125\": [1], \"1079790806999270\": [1], \"1083167228503483\": [1], \"1083979856276158\": [1], \"1086824086633758\": [1], \"1087246758303107\": [1], \"1089685402119358\": [1], \"1091611404851948\": [1], \"1091672568184574\": [1], \"1092412134695532\": [1], \"1093627101780013\": [1], \"1094921399870677\": [1], \"1096116062896072\": [1], \"1098507115531030\": [1], \"1099058020169904\": [1], \"1099952304933165\": [1], \"1100288677566866\": [1], \"1101741433116358\": [1], \"1104190588169373\": [1], \"1104960540046356\": [1], \"1105715660944757\": [1], \"1107089660309063\": [1], \"1111290410858168\": [1], \"1112992433342685\": [1], \"1116424053967575\": [1], \"1116895187134365\": [1], \"1117159871343198\": [1], \"1118809343806054\": [1], \"1119356923823775\": [1], \"1124331812349016\": [1], \"1124407702856810\": [1], \"1125790812214635\": [1], \"1126837472001370\": [1], \"1127520905106471\": [1], \"1128215279121883\": [1], \"1128781014956456\": [1], \"1131338412844525\": [1], \"1133407330006617\": [1], \"1134358436569591\": [1], \"1134747285581889\": [1], \"1136132815177758\": [1], \"1137458184235520\": [1], \"1138431327378328\": [1], \"1141674796012358\": [1], \"1143333932576612\": [1], \"1143729701282578\": [1], \"1144285854352501\": [1], \"1145093797094761\": [1], \"1148552556379006\": [1], \"1150913705106971\": [1], \"1151317215025105\": [1], \"1153164230909738\": [1], \"1153728545280655\": [1], \"1153798502314371\": [1], \"1154932944622633\": [1], \"1155584266432108\": [1], \"1156045268152769\": [1], \"1156491153431815\": [1], \"1158220105455960\": [1], \"1159127644559694\": [1], \"1159341984218297\": [1], \"1162052881213221\": [1], \"1163538260300176\": [1], \"1167797903903513\": [1], \"1170426628947561\": [1], \"1175636858264858\": [1], \"1179169749483571\": [1], \"1182068165787043\": [1], \"1182982990603977\": [1], \"1188948586003184\": [1], \"1189086134236531\": [1], \"1190826880246771\": [1], \"1192096620411786\": [1], \"1195064602204433\": [1], \"1196301744718196\": [1], \"1196455712569004\": [1], \"1202919544239845\": [1], \"1204798420898421\": [1], \"1205949280152583\": [1], \"1205971020941838\": [1], \"1206187414207457\": [1], \"1208003047547549\": [1], \"1208182722356499\": [1], \"1208449057696069\": [1], \"1210216570900457\": [1], \"1212664380498150\": [1], \"1213773789181899\": [1], \"1214266706299291\": [1], \"1217563343243527\": [1], \"1219117591969825\": [1], \"1219346492076429\": [1], \"1220335392180979\": [1], \"1220616384863784\": [1], \"1221383938605452\": [1], \"1222014572286526\": [1], \"1224254724566290\": [1], \"1226100229238141\": [1], \"1226200856244265\": [1], \"1228305661922228\": [1], \"1233954887937006\": [1], \"1234436555466242\": [1], \"1237032937883855\": [1], \"1239145575788557\": [1], \"1239339507919113\": [1], \"1243810498607173\": [1], \"1245133586716724\": [1], \"1247940790687900\": [1], \"1248051168749046\": [1], \"1248706608915280\": [1], \"1249202254062250\": [1], \"1249648750872413\": [1], \"1249655532305023\": [1], \"1255252377283829\": [1], \"1258906862843338\": [1], \"1261857219602862\": [1], \"1263201663287298\": [1], \"1263318216009230\": [1], \"1264679881957707\": [1], \"1268140222159187\": [1], \"1269343018921174\": [1], \"1270189767731506\": [1], \"1272979969318566\": [1], \"1273457265032602\": [1], \"1274457660941528\": [1], \"1275087604249899\": [1], \"1277580911249436\": [1], \"1279343685854145\": [1], \"1283260609599385\": [1], \"1284387473192725\": [1], \"1286311799178883\": [1], \"1288040761668863\": [1], \"1288778419699437\": [1], \"1290771528922788\": [1], \"1293219230347707\": [1], \"1293328556388262\": [1], \"1295078978369120\": [1], \"1296153423856149\": [1], \"1297293300936036\": [1], \"1300808368135427\": [1], \"1302641150985425\": [1], \"1304442243773585\": [1], \"1313078765175557\": [1], \"1313714169132017\": [1], \"1314213122323735\": [1], \"1314426075290867\": [1], \"1314793142574747\": [1], \"1315149012705201\": [1], \"1315716746061746\": [1], \"1316694165717524\": [1], \"1319694153005378\": [1], \"1320354776828013\": [1], \"1321565796247651\": [1], \"1321652214431386\": [1], \"1322641975569676\": [1], \"1324011933308215\": [1], \"1324912633096310\": [1], \"1326409472099152\": [1], \"1331779867021411\": [1], \"1334540092602772\": [1], \"1336308126523111\": [1], \"1338483888695361\": [1], \"1339253622709335\": [1], \"1341199030772903\": [1], \"1344910991414675\": [1], \"1345410298186231\": [1], \"1350199929931995\": [1], \"1351512066032718\": [1], \"1354302686132856\": [1], \"1356154889302605\": [1], \"1357184991366936\": [1], \"1357471996570352\": [1], \"1357753811266810\": [1], \"1358512347106456\": [1], \"1359543486509419\": [1], \"1361025446004153\": [1], \"1367119937163179\": [1], \"1367709901942540\": [1], \"1367773071990624\": [1], \"1369074343824274\": [1], \"1370726350834256\": [1], \"1378835613457150\": [1], \"1381248081202327\": [1], \"1386306459556406\": [1], \"1387495270238779\": [1], \"1389922397452403\": [1], \"1390298164990813\": [1], \"1390933089013093\": [1], \"1390983369788694\": [1], \"1392100300924345\": [1], \"1393217968463266\": [1], \"1399606615821383\": [1], \"1403317507055171\": [1], \"1403745983783279\": [1], \"1403943799860029\": [1], \"1404699212058851\": [1], \"1405532869402451\": [1], \"1406604995721159\": [1], \"1407541218252835\": [1], \"1408249754988648\": [1], \"1408657874398720\": [1], \"1413668912211922\": [1], \"1419788555072555\": [1], \"1420599960706969\": [1], \"1422752142981515\": [1], \"1427277086932821\": [1], \"1428863808477543\": [1], \"1429504535083946\": [1], \"1433457682543583\": [1], \"1435606435053804\": [1], \"1436434476583557\": [1], \"1439553679698462\": [1], \"1439915892442607\": [1], \"1440508870826217\": [1], \"1444848353238051\": [1], \"1445027197420430\": [1], \"1447256006616572\": [1], \"1453776517788876\": [1], \"1453971277877355\": [1], \"1455146321661919\": [1], \"1457281691629028\": [1], \"1457356346001656\": [1], \"1458821018066601\": [1], \"1458991877210692\": [1], \"1459026861515707\": [1], \"1461973582780745\": [1], \"1462638113586229\": [1], \"1464070890825816\": [1], \"1465200712992811\": [1], \"1465729926859313\": [1], \"1466886910182855\": [1], \"1467962703414988\": [1], \"1470283952365044\": [1], \"1471416194191364\": [1], \"1474638620996403\": [1], \"1478879011117637\": [1], \"1478944333461504\": [1], \"1483169158074609\": [1], \"1483807540752667\": [1], \"1485918098877112\": [1], \"1486328236330322\": [1], \"1486849697797305\": [1], \"1496355685638144\": [1], \"1497424397846856\": [1], \"1497841258260530\": [1], \"1500281487292048\": [1], \"1500583334693037\": [1], \"1501230823468058\": [1], \"1501876325850252\": [1], \"1503237048393006\": [1], \"1504172060146389\": [1], \"1505630216984720\": [1], \"1507555232947731\": [1], \"1508106302673852\": [1], \"1508284782767738\": [1], \"1508493756855327\": [1], \"1510619933801517\": [1], \"1513607147621410\": [1], \"1513938161219777\": [1], \"1515834574998746\": [1], \"1517380888926906\": [1], \"1519632498026078\": [1], \"1520187359632510\": [1], \"1521560235805374\": [1], \"1523636549508943\": [1], \"1524107341991353\": [1], \"1531266000743625\": [1], \"1535523703906334\": [1], \"1544456939220609\": [1], \"1545845179964061\": [1], \"1546950619301861\": [1], \"1549144689587640\": [1], \"1549524708051253\": [1], \"1550335948023219\": [1], \"1551002559653775\": [1], \"1551041536160418\": [1], \"1552376704952754\": [1], \"1554923177111102\": [1], \"1556763833558772\": [1], \"1558177323718883\": [1], \"1561284011060316\": [1], \"1562979523808008\": [1], \"1563753848481199\": [1], \"1567610868177164\": [1], \"1567981603128011\": [1], \"1568466581804421\": [1], \"1569475238596379\": [1], \"1570900757606239\": [1], \"1571686929770253\": [1], \"1573051106183234\": [1], \"1573455504575642\": [1], \"1578472192033269\": [1], \"1579558591754989\": [1], \"1579899761330636\": [1], \"1581843086817381\": [1], \"1582799698631958\": [1], \"1585451728009321\": [1], \"1586193077820998\": [1], \"1587951804321711\": [1], \"1590255930369798\": [1], \"1590778336297155\": [1], \"1591128874020667\": [1], \"1591197552974737\": [1], \"1591257470509498\": [1], \"1592134816295750\": [1], \"1592788677550558\": [1], \"1594127966354593\": [1], \"1596867723859658\": [1], \"1599569571899213\": [1], \"1603725676838730\": [1], \"1605155483138119\": [1], \"1605507869903661\": [1], \"1605643475927301\": [1], \"1605749780926183\": [1], \"1606496927349590\": [1], \"1609602290901895\": [1], \"1610504873942294\": [1], \"1611070530726608\": [1], \"1611136459707336\": [1], \"1611838508553590\": [1], \"1613983892001636\": [1], \"1616449376409605\": [1], \"1620525948473200\": [1], \"1620654324499687\": [1], \"1620828586742500\": [1], \"1622792506136230\": [1], \"1623177232951190\": [1], \"1628031603362222\": [1], \"1628427570723049\": [1], \"1628826930558098\": [1], \"1631075608093301\": [1], \"1631580735095455\": [1], \"1633956607167470\": [1], \"1634208487331527\": [1], \"1636637379355737\": [1], \"1637738995387401\": [1], \"1638608323436961\": [1], \"1648061823981851\": [1], \"1649563143492733\": [1], \"1649734648866344\": [1], \"1650123596411568\": [1], \"1650173610794987\": [1], \"1651285389609376\": [1], \"1654735665865028\": [1], \"1656727732392151\": [1], \"1657372457850347\": [1], \"1657683141643421\": [1], \"1662217332746452\": [1], \"1664972197311850\": [1], \"1666357261266686\": [1], \"1666426870941428\": [1], \"1672690124985166\": [1], \"1677294072833154\": [1], \"1677567756062313\": [1], \"1678031304317865\": [1], \"1679888975849706\": [1], \"1680207094093405\": [1], \"1681650612372020\": [1], \"1682679526241959\": [1], \"1683759465116413\": [1], \"1685934591838962\": [1], \"1686952464237012\": [1], \"1687475275751397\": [1], \"1688549635622032\": [1], \"1688840951897797\": [1], \"1692306792193613\": [1], \"1693009744449856\": [1], \"1693152180057161\": [1], \"1694446690872169\": [1], \"1696033026264979\": [1], \"1696754301745726\": [1], \"1698684589263451\": [1], \"1699445949090709\": [1], \"1700104037127426\": [1], \"1701817738393133\": [1], \"1701963912702416\": [1], \"1702762481356132\": [1], \"1703195926236352\": [1], \"1703235536180823\": [1], \"1705579104626584\": [1], \"1707402488454165\": [1], \"1709665004165000\": [1], \"1710320827907843\": [1], \"1710325165017340\": [1], \"1713551184061125\": [1], \"1715231462066277\": [1], \"1715853334929324\": [1], \"1716044732966958\": [1], \"1716524667964216\": [1], \"1718229977783506\": [1], \"1718579038309779\": [1], \"1719194544414539\": [1], \"1722376268709793\": [1], \"1722620398030254\": [1], \"1723278153800153\": [1], \"1723533020190843\": [1], \"1724562335785665\": [1], \"1726248997697258\": [1], \"1729299192259492\": [1], \"1730854786589372\": [1], \"1731670951728410\": [1], \"1732621988229187\": [1], \"1738963211794076\": [1], \"1742318999485071\": [1], \"1743759003772825\": [1], \"1743886885060928\": [1], \"1744595755680419\": [1], \"1745407833352294\": [1], \"1746150395043607\": [1], \"1746153769574551\": [1], \"1746353753833374\": [1], \"1747844463695575\": [1], \"1748342851225517\": [1], \"1748584054128624\": [1], \"1751722028562118\": [1], \"1753574829045639\": [1], \"1756411282239835\": [1], \"1763721976686007\": [1], \"1763881200629909\": [1], \"1764636074027026\": [1], \"1768278332683466\": [1], \"1771524733819442\": [1], \"1775109601743542\": [1], \"1775286866315788\": [1], \"1775423279563145\": [1], \"1775783578939746\": [1], \"1781832644050906\": [1], \"1782840121291661\": [1], \"1786027222395626\": [1], \"1786367537808794\": [1], \"1790809851613620\": [1], \"1794550986702348\": [1], \"1794618855869188\": [1], \"1796031778114714\": [1], \"1798466930762663\": [1], \"1798529498252686\": [1], \"1802183562509174\": [1], \"1802785646220595\": [1], \"1803695803895949\": [1], \"1803786233751975\": [1], \"1806503351116266\": [1], \"1806838598685332\": [1], \"1809004697139807\": [1], \"1810443800004020\": [1], \"1812212693054064\": [1], \"1813025322232884\": [1], \"1814130198337487\": [1], \"1817091663735073\": [1], \"1818789181822125\": [1], \"1819941912393090\": [1], \"1820725182659498\": [1], \"1821724132772143\": [1], \"1823928111869671\": [1], \"1824761204257546\": [1], \"1826180489776123\": [1], \"1828979341373426\": [1], \"1829165864026592\": [1], \"1829825919708803\": [1], \"1831586670874591\": [1], \"1832041421058402\": [1], \"1832358362788935\": [1], \"1834049710846968\": [1], \"1834697174350675\": [1], \"1835763120348014\": [1], \"1835832863855014\": [1], \"1837721826431456\": [1], \"1837932397479249\": [1], \"1838168009379099\": [1], \"1839509489254967\": [1], \"1840526591932034\": [1], \"1842149098517895\": [1], \"1842767001472565\": [1], \"1843284607871743\": [1]}, \"ident_to_name\": {\"TARA_ASE_MAG_00031\": \"TARA_ASE_MAG_00031\", \"TARA_PSW_MAG_00136\": \"TARA_PSW_MAG_00136\"}, \"ident_to_idx\": {\"TARA_ASE_MAG_00031\": 0, \"TARA_PSW_MAG_00136\": 1}, \"idx_to_lid\": {\"0\": 0}}\n"
  },
  {
    "path": "tests/test-data/lca/delmont-3.csv",
    "content": "MAGs,other,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,foo,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,foo,bar,baz\n\n"
  },
  {
    "path": "tests/test-data/lca/delmont-4.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,,Alteromonadaceae,null,Alteromonas_macleodii\n"
  },
  {
    "path": "tests/test-data/lca/delmont-5.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\n"
  },
  {
    "path": "tests/test-data/lca/delmont-6.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,,,Alteromonadaceae,,\nTARA_PSW_MAG_00136,Eukaryota,Chlorophyta,Prasinophyceae,,,Ostreococcus,na\n"
  },
  {
    "path": "tests/test-data/lca/dir1.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"3\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"]], \"6\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rickettsiales\"]], \"8\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rhodospirillales\"], [\"family\", \"Rhodospirillaceae\"]], \"10\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Candidatus_Marinimicrobia \"]], \"17\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Chloroflexi\"], [\"class\", \"Dehalococcoidetes\"]], \"18\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Bacteroidetes\"], [\"class\", \"Flavobacteriia\"], [\"order\", \"Flavobacteriales\"]], \"19\": [[\"superkingdom\", \"Archaea\"], [\"phylum\", \"Euryarchaeota\"]]}, \"hashval_to_idx\": {\"10562995595685\": [857], \"24528731651193\": [857], \"31509610042191\": [857], \"32908974784047\": [857], \"53195498578655\": [857], \"61443799591443\": [857], \"76380403636571\": [857], \"76896235628955\": [857], \"77856691695524\": [857], \"78393786973287\": [857], \"80201418496370\": [857], \"84335993144356\": [857], \"94797936310939\": [857], \"105957940092709\": [857], \"111739097897485\": [857], \"119697732049712\": [857], \"127354562455109\": [857], \"130977421461728\": [857], \"139325971655177\": [857], \"142490108024754\": [857], \"151174426348926\": [857], \"154327016983767\": [857], \"157994752219753\": [857], \"162801649112349\": [857], \"166217352771913\": [857], \"169715989792474\": [857], \"169863005970977\": [857], \"170920680432388\": [857], \"191753223292227\": [857], \"192436309662022\": [857], \"199140768614194\": [857], \"223631234982456\": [857], \"227959088053307\": [857], \"228292122152680\": [857], \"230799060476680\": [857], \"237690943707059\": [857], \"238651698141290\": [857], \"244616410789205\": [857], \"249794725957680\": [857], \"250633618110367\": [857], \"265437294852372\": [857], \"296742971910535\": [857], \"298801648821475\": [857], \"311442628723617\": [857], \"320554964876228\": [857], \"326736309046279\": [857], \"327317391858538\": [857], \"330953274173341\": [857], \"339385806839963\": [857], \"351896981111098\": [857], \"356816418526580\": [857], \"359340910691298\": [857], \"362940229981590\": [857], \"376175245601839\": [857], \"377794951135383\": [857], \"383538170176118\": [857], \"405190826019210\": [857], \"419019366985097\": [857], \"420472333559451\": [857], \"424623099048372\": [857], \"426807067709942\": [857], \"437832945436091\": [857], \"453324490669345\": [857], \"473399468090647\": [857], \"478059425394378\": [857], \"503604636418777\": [857], \"504257645461199\": [857], \"519723726170318\": [857], \"535414352144597\": [857], \"552093329832932\": [857], \"552283533613540\": [857], \"570399774296279\": [857], \"573906057677194\": [857], \"578030841329163\": [857], \"583020969347118\": [857], \"598082272366083\": [857], \"598905067436688\": [857], \"605373826335520\": [857], \"611912905489988\": [857], \"615272357869699\": [857], \"620130259956137\": [857], \"626675316744135\": [857], \"649051783497293\": [857], \"649550945782744\": [857], \"649616107062526\": [857], \"653540232421414\": [857], \"657589154384957\": [857], \"663047496966675\": [857], \"674656380230209\": [857], \"675922779648438\": [857], \"685004638908548\": [857], \"687321683378840\": [857], \"694492312965896\": [857], \"695745560720758\": [857], \"699031394079440\": [857], \"730150568556797\": [857], \"734057025340276\": [857], \"740565381792126\": [857], \"742949974619323\": [857], \"747235481535622\": [857], \"752515870686382\": [857], \"756361936683733\": [857], \"763727751321831\": [857], \"780376662796622\": [857], \"825139122145494\": [857], \"839869267775584\": [857], \"851184409248712\": [857], \"853542869079925\": [857], \"859341146829347\": [857], \"861815061180380\": [857], \"865075607295074\": [857], \"866988879059649\": [857], \"868131709579478\": [857], \"873863704874322\": [857], \"885162648996897\": [857], \"888380375659008\": [857], \"894067906665045\": [857], \"894186216808367\": [857], \"894610565157783\": [857], \"903834492224114\": [857], \"916130229631731\": [857], \"921785542990484\": [857], \"924306363563538\": [857], \"938127756636807\": [857], \"944874643680241\": [857], \"948524492951369\": [857], \"958502896677536\": [857], \"960038736902569\": [857], \"963580423019642\": [857], \"963653929874928\": [857], \"963720246178203\": [857], \"972108907157861\": [857], \"985731993964305\": [857], \"992451870338110\": [857], \"995624953831674\": [857], \"996103503375214\": [857], \"997803575325414\": [857], \"1000011662912882\": [857], \"1000311664055126\": [857], \"1006912674469956\": [857], \"1021745703964614\": [857], \"1027748025184074\": [857], \"1030483418347210\": [857], \"1031768261765216\": [857], \"1036608450454783\": [857], \"1045589116197894\": [857], \"1058908728074991\": [857], \"1067771085497413\": [857], \"1069567961894711\": [857], \"1077834968245742\": [857], \"1084224644992512\": [857], \"1103974733230652\": [857], \"1108481822041435\": [857], \"1109210655998008\": [857], \"1124788242665324\": [857], \"1131529647066772\": [857], \"1133974402917419\": [857], \"1134108273731197\": [857], \"1135329572932874\": [857], \"1135526515964276\": [857], \"1136856536505534\": [857], \"1137423182069384\": [857], \"1145977905697937\": [857], \"1171399731365207\": [857], \"1197848560404720\": [857], \"1199631370040486\": [857], \"1203709304328798\": [857], \"1231751790677369\": [857], \"1234119016081508\": [857], \"1234306079312799\": [857], \"1244217914973288\": [857], \"1245525733018588\": [857], \"1269516800267811\": [857], \"1289883081856350\": [857], \"1305669645735399\": [857], \"1318947832296332\": [857], \"1325999332607313\": [857], \"1329738865039353\": [857], \"1336286025626736\": [857], \"1353843757418732\": [857], \"1358251717144690\": [857], \"1402728323258578\": [857], \"1403491741985422\": [857], \"1412337247758300\": [857], \"1421990762280671\": [857], \"1434953058963826\": [857], \"1455056862214256\": [857], \"1460751005182228\": [857], \"1465560043625592\": [857], \"1472751633382264\": [857], \"1474477255766726\": [857], \"1489433394556920\": [857], \"1495163680513271\": [857], \"1501829923225930\": [857], \"1520926209293455\": [857], \"1529077051927224\": [857], \"1530497169324493\": [857], \"1534512451876003\": [857], \"1540647316200246\": [857], \"1550266697655910\": [857], \"1554269472493525\": [857], \"1555272336335611\": [857], \"1566549753353769\": [857], \"1567818400392308\": [857], \"1579724710322379\": [857], \"1584244853000940\": [857], \"1592392857473058\": [857], \"1611872123553541\": [857], \"1614814220240598\": [857], \"1615576145731302\": [857], \"1620265231918790\": [857], \"1624795558860394\": [857], \"1629801288077095\": [857], \"1634047401610666\": [857], \"1656512554062377\": [857], \"1699124986331356\": [857], \"1708528274854104\": [857], \"1714816995104655\": [857], \"1720848946540124\": [857], \"1730350408446840\": [857], \"1737818062840410\": [857], \"1738979937646746\": [857], \"1741132171261548\": [857], \"1742291197013027\": [857], \"1748401923582053\": [857], \"1758197608285885\": [857], \"1762371962406702\": [857], \"1775082649400403\": [857], \"1808042893002100\": [857], \"1820409950006595\": [857], \"1839083638444324\": [857], \"1839374171578526\": [857], \"6208355280936\": [489], \"36068524887606\": [489], \"42214249218747\": [489], \"71544709011650\": [489], \"94568784164642\": [489], \"101850861679530\": [489], \"118981586209966\": [489], \"125672710456558\": [489], \"154651791843334\": [489], \"169140175408196\": [489], \"184284052028585\": [489], \"204317758636987\": [489], \"239767079827151\": [489], \"263714629172893\": [489], \"331551678570974\": [489], \"336369156248224\": [489], \"349171817389501\": [489], \"360738245491862\": [489], \"368526524378960\": [489], \"371853004922648\": [489], \"387760124074256\": [489], \"395069978924584\": [489], \"435726313541822\": [489], \"437726442738099\": [489], \"466850675798768\": [489], \"479940561795633\": [489], \"492822340800255\": [489], \"505053393843743\": [489], \"521929018897124\": [489], \"551051655243397\": [489], \"561597235124907\": [489], \"566005889210850\": [489], \"597659963739209\": [489], \"614239241054953\": [489], \"626864164931135\": [489], \"633556158776411\": [489], \"654143563027689\": [489], \"662684936798217\": [489], \"674788366447286\": [489], \"684743962823918\": [489], \"708691532271774\": [489], \"716087420122218\": [489], \"718681840111355\": [489], \"724463811374729\": [489], \"728003480372162\": [489], \"741586588681531\": [489], \"752579121317844\": [489], \"762178470455457\": [489], \"764311326727772\": [489], \"765842015450050\": [489], \"809589832990132\": [489], \"873420144034441\": [489], \"877782967081004\": [489], \"901903933326927\": [489], \"905122199674697\": [489], \"912467163508945\": [489], \"933164924288341\": [489], \"944691748856249\": [489], \"966164366078342\": [489], \"971397977417205\": [489], \"993246141593020\": [489], \"997198917842635\": [489], \"1011241770168934\": [489], \"1021990675672011\": [489], \"1086333609731042\": [489], \"1099388625108079\": [489], \"1140134026049688\": [489], \"1140612485446769\": [489], \"1155360553990582\": [489], \"1180702620252586\": [489], \"1193067522532199\": [489], \"1193501878717185\": [489], \"1194754022849329\": [489], \"1199340707253283\": [489], \"1205371088217680\": [489], \"1212018492323128\": [489], \"1218080879550847\": [489], \"1225428973291608\": [489], \"1235708232750610\": [489], \"1255653286672711\": [489], \"1280765206128263\": [489], \"1289207631287924\": [489], \"1314149194422338\": [489], \"1315482081623467\": [489], \"1323067332510620\": [489], \"1330510523930247\": [489], \"1364087674189728\": [489], \"1381232621944922\": [489], \"1382793403064174\": [489], \"1404752792392316\": [489], \"1419600108775672\": [489], \"1421128964660121\": [489], \"1447604587212791\": [489], \"1466536701554611\": [489], \"1470621573979842\": [489], \"1473723955484520\": [489], \"1483283307735980\": [489], \"1487403213599213\": [489], \"1487946879314134\": [489], \"1494694379181620\": [489], \"1495386374055437\": [489], \"1502210876116244\": [489], \"1525738270622028\": [489], \"1549136143814996\": [489], \"1557599673232977\": [489], \"1559862409288722\": [489], \"1562462382895068\": [489], \"1583002478354607\": [489], \"1585500726769092\": [489], \"1599330233273423\": [489], \"1608584956909839\": [489], \"1622299095937281\": [489], \"1624853577729432\": [489], \"1644411908722189\": [489], \"1644449340371067\": [489], \"1654488493321929\": [489], \"1676793853394886\": [489], \"1680574849583070\": [489], \"1699735640903104\": [489], \"1704695626669794\": [489], \"1726515581163405\": [489], \"1726714711365201\": [489], \"1750030548616414\": [489], \"1760373763171009\": [489], \"1783812241622447\": [489], \"1785318296981339\": [489], \"1806265091342920\": [489], \"1813955955472710\": [489], \"1820725653532566\": [489], \"1824475020928936\": [489], \"2154070670431\": [498], \"11613599405072\": [498], \"17158709879574\": [498], \"18636857977688\": [498], \"21409341449014\": [498], \"36157092385127\": [498], \"37255098028533\": [498], \"45314565001486\": [498], \"64823906011887\": [498], \"82100430654558\": [498], \"94186003905968\": [498], \"94759490856116\": [498], \"109556514734963\": [498], \"135993103089803\": [498], \"149435896456274\": [498], \"176247281074587\": [498], \"176548263614253\": [498], \"182099256907654\": [498], \"205794314413990\": [498], \"209809296460674\": [498], \"211018913675927\": [498], \"228265434919935\": [498], \"232543135703807\": [498], \"240075274555327\": [498], \"243384762378779\": [498], \"258505663669118\": [498], \"284671357618038\": [498], \"330586197522192\": [498], \"337595943587486\": [498], \"339046657107648\": [498], \"345283537889873\": [498], \"352749716046734\": [498], \"368188825499029\": [498], \"370644754347883\": [498], \"384426610613145\": [498], \"429897910485367\": [498], \"437563653949409\": [498], \"446917768548417\": [498], \"466721964091793\": [498], \"477761661752479\": [498], \"480101632783627\": [498], \"486698788494774\": [498], \"490825880012310\": [498], \"509559903656279\": [498], \"533538808049909\": [498], \"540304131043221\": [498], \"544911218549468\": [498], \"546830412201894\": [498], \"551842115140920\": [498], \"569809137269967\": [498], \"588266575028078\": [498], \"600287836839255\": [498], \"601572380093307\": [498], \"604212745462633\": [498], \"606681675605454\": [498], \"621217629394241\": [498], \"626839960272263\": [498], \"702217618459513\": [498], \"708680645325824\": [498], \"721929156533915\": [498], \"725002428163720\": [498], \"734913192234209\": [498], \"739563390819048\": [498], \"770426510223136\": [498], \"776833962758413\": [498], \"777181673746647\": [498], \"778705456285644\": [498], \"782992626561501\": [498], \"784899437026658\": [498], \"786813800880309\": [498], \"787821625319285\": [498], \"816141080071303\": [498], \"822328842780575\": [498], \"862377616321161\": [498], \"887276967059104\": [498], \"924791284639586\": [498], \"930339467722670\": [498], \"934803755076129\": [498], \"966465253494781\": [498], \"1001104561528231\": [498], \"1015378462263320\": [498], \"1018545617646649\": [498], \"1022398637712353\": [498], \"1025850380217436\": [498], \"1034583203792866\": [498], \"1049282425886331\": [498], \"1068588658892308\": [498], \"1069875943116865\": [498], \"1070897190476202\": [498], \"1085488940566427\": [498], \"1086530812302512\": [498], \"1088280727587709\": [498], \"1093395863642239\": [498], \"1111529656886488\": [498], \"1112281528512751\": [498], \"1117431791291604\": [498], \"1123491213446859\": [498], \"1125002666367134\": [498], \"1129496142367355\": [498], \"1136498413644713\": [498], \"1139585483816814\": [498], \"1139980954757265\": [498], \"1180093137069047\": [498], \"1192961511333986\": [498], \"1206951136273296\": [498], \"1215528855788399\": [498], \"1226548966332152\": [498], \"1244212530083692\": [498], \"1249718005761151\": [498], \"1266294095554016\": [498], \"1293171242050650\": [498], \"1298343549533329\": [498], \"1298772684063625\": [498], \"1302764744749803\": [498], \"1310203341171608\": [498], \"1318707003522548\": [498], \"1321148353561534\": [498], \"1340053350923821\": [498], \"1343323356517565\": [498], \"1343686747529632\": [498], \"1349355936430243\": [498], \"1379235651461118\": [498], \"1408555596863480\": [498], \"1414965904547538\": [498], \"1434481614169292\": [498], \"1435950595557520\": [498], \"1435951254461360\": [498], \"1451625789193395\": [498], \"1453240476698633\": [498], \"1472618932357513\": [498], \"1480608662847573\": [498], \"1517335615843377\": [498], \"1521500422349458\": [498], \"1534709892533053\": [498], \"1538828462063838\": [498], \"1541122250333960\": [498], \"1578275754513598\": [498], \"1583639429170575\": [498], \"1584311045209816\": [498], \"1588746849987988\": [498], \"1596894250423553\": [498], \"1606106653479381\": [498], \"1643401728406689\": [498], \"1643665429870600\": [498], \"1648082018038194\": [498], \"1668463535552495\": [498], \"1671662012111622\": [498], \"1720273421873298\": [498], \"1725064209082042\": [498], \"1726140246783857\": [498], \"1755860788110182\": [498], \"1766133708956687\": [498], \"1777492724682854\": [498], \"1786243409011575\": [498], \"1786837630790123\": [498], \"1792635871481728\": [498], \"1800434112651860\": [498], \"1820302498436846\": [498], \"1822996777733546\": [498], \"1830239223669948\": [498], \"1831496353989179\": [498], \"1842193178587375\": [498], \"1755377357569\": [655], \"3082991534458\": [655], \"37674921307309\": [655], \"51757952165147\": [655], \"83249603674977\": [655], \"98278786877433\": [655], \"110918909962148\": [655], \"158842808254794\": [655], \"181610240092945\": [655], \"186393473976269\": [655], \"256944922734799\": [655], \"280139167272330\": [655], \"280694169167105\": [655], \"282804864962014\": [655], \"283913839911121\": [655], \"302636762051771\": [655], \"333777327066418\": [655], \"352301021576746\": [655], \"374323998298593\": [655], \"376776194679750\": [655], \"415059665295686\": [655], \"450355571187752\": [655], \"496021466837136\": [655], \"513847419343763\": [655], \"533098841598931\": [655], \"551424679142865\": [655], \"572952041939907\": [655], \"598951123417882\": [655], \"644716794317995\": [655], \"666983937917321\": [655], \"698085082076823\": [655], \"725360638385089\": [655], \"733368791391251\": [655], \"742106827831986\": [655], \"754400534232483\": [655], \"766487817958725\": [655], \"779898646145378\": [655], \"805761205359981\": [655], \"827829009478471\": [655], \"842833370602399\": [655], \"851874316040634\": [655], \"873474524304755\": [655], \"884548610146747\": [655], \"885981040888197\": [655], \"1022176283628620\": [655], \"1034527341794613\": [655], \"1045561434498870\": [655], \"1066970898888075\": [655], \"1083066439970342\": [655], \"1089557102031316\": [655], \"1092307189826319\": [655], \"1163108229994126\": [655], \"1195232383066510\": [655], \"1227740186477789\": [655], \"1234304032112874\": [655], \"1236049686644348\": [655], \"1236103830273404\": [655], \"1274575616589903\": [655], \"1277966237493615\": [655], \"1281400730121564\": [655], \"1286543961158837\": [655], \"1303073895065136\": [655], \"1311399934673648\": [655], \"1360492291793115\": [655], \"1373617058836495\": [655], \"1385213264271922\": [655], \"1411848806120784\": [655], \"1425195440803466\": [655], \"1447443911041043\": [655], \"1452335535856863\": [655], \"1469763754212350\": [655], \"1474859751633660\": [655], \"1499096632133739\": [655], \"1510971336998315\": [655], \"1511246723267502\": [655], \"1521617215738831\": [655], \"1534975016520539\": [655], \"1552308262926966\": [655], \"1558028922023637\": [655], \"1559228200332082\": [655], \"1568191056575073\": [655], \"1589695304546038\": [655], \"1631609804784143\": [655], \"1651663982109362\": [655], \"1662077561907561\": [655], \"1663726558028104\": [655], \"1691585161752441\": [655], \"1705150598608802\": [655], \"1710530657401696\": [655], \"1722736552312198\": [655], \"1724637120505434\": [655], \"1731222305115922\": [655], \"1737427055940683\": [655], \"1765562515753998\": [655], \"1780019298955332\": [655], \"1780577439636513\": [655], \"1791580146020614\": [655], \"1809303911710966\": [655], \"1816546939913041\": [655], \"1818883584260150\": [655], \"1820646094225648\": [655], \"1831642379952732\": [655], \"1836615616867670\": [655], \"4990130232391\": [816], \"8368817863658\": [816], \"39247586010559\": [816], \"88223530165769\": [816], \"91012099780685\": [816], \"91204535361819\": [816], \"98472195315695\": [816], \"102329372072305\": [816], \"118451811599376\": [816], \"124307475703783\": [816], \"132828672506666\": [816], \"147843615825558\": [816], \"148401819252834\": [816], \"161753588012910\": [816], \"185137442703575\": [816], \"189845459588490\": [816], \"234071686733028\": [816], \"249961568718550\": [816], \"255811150095663\": [816], \"369018430529342\": [816], \"369112565245453\": [816], \"400975246805552\": [816], \"402808128470137\": [816], \"408659625949596\": [816], \"418425365675272\": [816], \"486432496176269\": [816], \"516618314134585\": [816], \"531219626796108\": [816], \"541375206099738\": [816], \"563606808058303\": [816], \"566132268978482\": [816], \"570999386390200\": [816], \"574915610921772\": [816], \"582556537706937\": [816], \"635910217844386\": [816], \"688678466671567\": [816], \"689433751790507\": [816], \"691494155159109\": [816], \"737311651381749\": [816], \"751541951174871\": [816], \"775850804274730\": [816], \"817517363145528\": [816], \"823842897128139\": [816], \"842780727558585\": [816], \"897897827060461\": [816], \"914563280602157\": [816], \"922542623100009\": [816], \"923741612722184\": [816], \"957646309653606\": [816], \"960481250814720\": [816], \"1003830617787109\": [816], \"1024732275999586\": [816], \"1053170459001440\": [816], \"1062093792453642\": [816], \"1071206204977552\": [816], \"1095678110806546\": [816], \"1097042701301902\": [816], \"1101094830302962\": [816], \"1104407270947612\": [816], \"1109193592292630\": [816], \"1111403307795503\": [816], \"1120685056103109\": [816], \"1192670842680579\": [816], \"1197484077672885\": [816], \"1201273993161858\": [816], \"1206023274000524\": [816], \"1208315481951471\": [816], \"1235998531395678\": [816], \"1251427518211548\": [816], \"1253529243413716\": [816], \"1294466340331850\": [816], \"1317058728803394\": [816], \"1346526936092076\": [816], \"1352975814565569\": [816], \"1381808770778725\": [816], \"1384599181425691\": [816], \"1402411386465346\": [816], \"1412108050480848\": [816], \"1413830391996613\": [816], \"1417750873237741\": [816], \"1418819848598401\": [816], \"1462974146350636\": [816], \"1466533891444695\": [816], \"1487896054930759\": [816], \"1524993903457246\": [816], \"1527385792005225\": [816], \"1527858526846521\": [816], \"1552596157462732\": [816], \"1606110187603565\": [816], \"1608979683649839\": [816], \"1631797304609705\": [816], \"1637190338761226\": [816], \"1671119091983878\": [816], \"1690684027172166\": [816], \"1755461485177794\": [816], \"1758245196527512\": [816], \"1768839507616777\": [816], \"1780829418121092\": [816], \"1789070117978249\": [816], \"1799092034120373\": [816], \"1804288360971551\": [816], \"10607336378061\": [369], \"26939532728115\": [369], \"27283909081946\": [369], \"30595562710257\": [369], \"65599300659773\": [369], \"72585696461733\": [369], \"75695590176170\": [369], \"95646383063673\": [369], \"101391057456199\": [369], \"108643162636025\": [369], \"123320862242455\": [369], \"155895662812690\": [369], \"187327501196201\": [369], \"201146171439314\": [369], \"225488005985269\": [369], \"229338502881264\": [369], \"233406517053984\": [369], \"278067824418084\": [369], \"303810296308056\": [369], \"310730711278954\": [369], \"325758510711792\": [369], \"341827029842014\": [369], \"347235557954511\": [369], \"370285270123063\": [369], \"397593722447917\": [369], \"399713105175162\": [369], \"404237983038399\": [369], \"405188498075243\": [369], \"417026024482875\": [369], \"417823040902451\": [369], \"424349738744671\": [369], \"430810160086009\": [369], \"452369621564489\": [369], \"464339071660690\": [369], \"520522148288620\": [369], \"523234657072472\": [369], \"525382025149016\": [369], \"565755888038935\": [369], \"578110690392500\": [369], \"580648884579735\": [369], \"618070161363637\": [369], \"629330925982128\": [369], \"632457349970547\": [369], \"656154754735941\": [369], \"656546567654470\": [369], \"671314740322689\": [369], \"695389515807071\": [369], \"728189167703355\": [369], \"754086344795525\": [369], \"759305600289981\": [369], \"773109908849868\": [369], \"815579247578993\": [369], \"816535193626688\": [369], \"833589020847128\": [369], \"865889840214614\": [369], \"880621753429758\": [369], \"900568472012752\": [369], \"921898937375809\": [369], \"924875973146526\": [369], \"926062088273064\": [369], \"949604818763042\": [369], \"974928607181594\": [369], \"992298576927724\": [369], \"999475118350701\": [369], \"1009314455278794\": [369], \"1018024537905198\": [369], \"1023919580270175\": [369], \"1040821499512008\": [369], \"1041988026266802\": [369], \"1057822413034795\": [369], \"1102561612587436\": [369], \"1123616285016874\": [369], \"1153319578759790\": [369], \"1170417709405424\": [369], \"1183796570581607\": [369], \"1187681356269207\": [369], \"1219174417038219\": [369], \"1257157904391424\": [369], \"1298879736495681\": [369], \"1307140606473105\": [369], \"1347511452297582\": [369], \"1359784302990782\": [369], \"1368939968260254\": [369], \"1390254002816578\": [369], \"1401196768213202\": [369], \"1408246134984875\": [369], \"1434545464533873\": [369], \"1464022149600998\": [369], \"1464248617432475\": [369], \"1472108174328225\": [369], \"1480074977212538\": [369], \"1480562148440039\": [369], \"1483432981465264\": [369], \"1513468978680247\": [369], \"1520849332803968\": [369], \"1532355471306361\": [369], \"1536694617651602\": [369], \"1549214456685477\": [369], \"1549377149912348\": [369], \"1590055647252735\": [369], \"1590163477868845\": [369], \"1593232436005719\": [369], \"1620129270582217\": [369], \"1637453738379886\": [369], \"1675102827911278\": [369], \"1690821057958241\": [369], \"1692929299795113\": [369], \"1703819575405954\": [369], \"1721768760146258\": [369], \"1724274761186054\": [369], \"1724777356134483\": [369], \"1739347265459290\": [369], \"1761741274408898\": [369], \"1770832135555876\": [369], \"1801608671517029\": [369], \"1810736283020090\": [369], \"1832067341818419\": [369], \"1842706577351221\": [369], \"5800623574443\": [209], \"25611402419070\": [209], \"35848452926418\": [209], \"47125346942912\": [209], \"69206433906837\": [209], \"70971657432220\": [209], \"74969315887584\": [209], \"87818569597906\": [209], \"88177528801627\": [209], \"88558069157055\": [209], \"108203963523507\": [209], \"108443102922307\": [209], \"112140072765322\": [209], \"130273410324073\": [209], \"132756042028828\": [209], \"136103422093559\": [209], \"138749504942907\": [209], \"145063658621427\": [209], \"157699812439976\": [209], \"160477635639471\": [209], \"160588124274427\": [209], \"175859160508524\": [209], \"183128489700907\": [209], \"185710972090876\": [209], \"199176257796918\": [209], \"199349200750108\": [209], \"201639770900724\": [209], \"215675142110152\": [209], \"232507402626946\": [209], \"233580637733710\": [209], \"257601439160609\": [209], \"281406412627527\": [209], \"315058803606541\": [209], \"317225954152968\": [209], \"327890195454076\": [209], \"332253504650299\": [209], \"337858815869507\": [209], \"364504061856809\": [209], \"392056967608320\": [209], \"396998226544071\": [209], \"401831972184201\": [209], \"407460764370806\": [209], \"414757834672923\": [209], \"429940761076004\": [209], \"430145404703512\": [209], \"430340931123862\": [209], \"459600371063076\": [209], \"461816167228748\": [209], \"467553143839147\": [209], \"467965861615487\": [209], \"469491649973613\": [209], \"476934557413763\": [209], \"483520495131121\": [209], \"486893343493298\": [209], \"495840600581230\": [209], \"513439237652229\": [209], \"517501170885576\": [209], \"524681348378723\": [209], \"535608337216640\": [209], \"536603170974993\": [209], \"550644769509398\": [209], \"554500850208966\": [209], \"556274126422139\": [209], \"570976775894242\": [209], \"575328756700342\": [209], \"596284140456213\": [209], \"606584715546302\": [209], \"609450033065870\": [209], \"629299022904766\": [209], \"646567808425539\": [209], \"649798580801772\": [209], \"660533609429700\": [209], \"672426580955871\": [209], \"705074853849731\": [209], \"721875062478434\": [209], \"727363858023132\": [209], \"738817714031749\": [209], \"738905590810927\": [209], \"750214132481175\": [209], \"750436094231183\": [209], \"756466667603633\": [209], \"768829332464922\": [209], \"778863359409562\": [209], \"783475631069251\": [209], \"792677854076447\": [209], \"799206853941914\": [209], \"808192987447956\": [209], \"808785031097140\": [209], \"829974031014041\": [209], \"840663926518880\": [209], \"845725463358126\": [209], \"856477322411613\": [209], \"859261072067270\": [209], \"862944162690749\": [209], \"872671202442464\": [209], \"880114851978841\": [209], \"886743167308030\": [209], \"897253992508278\": [209], \"899193167683932\": [209], \"899848155791521\": [209], \"900308154594725\": [209], \"918352434071525\": [209], \"919589600111065\": [209], \"937554148897245\": [209], \"940584271784165\": [209], \"957414915761420\": [209], \"1002658299430598\": [209], \"1003133984682629\": [209], \"1010716667018946\": [209], \"1019064079829955\": [209], \"1019683988509104\": [209], \"1027239003660216\": [209], \"1037594618359116\": [209], \"1057384089045421\": [209], \"1058731523030786\": [209], \"1063076775921208\": [209], \"1063954908685224\": [209], \"1071595606716594\": [209], \"1081467914084016\": [209], \"1084870721228148\": [209], \"1085075934637959\": [209], \"1094154390656889\": [209], \"1109251111784810\": [209], \"1120119584317828\": [209], \"1122003109687969\": [209], \"1124326526377180\": [209], \"1146984068615441\": [209], \"1147035753060783\": [209], \"1153973893444966\": [209], \"1158655739296264\": [209], \"1159404884914444\": [209], \"1167189227589318\": [209], \"1168299943419464\": [209], \"1172835462128761\": [209], \"1185264113450797\": [209], \"1209240599219540\": [209], \"1211219396032236\": [209], \"1212426837627024\": [209], \"1212657565188368\": [209], \"1227462289314255\": [209], \"1227993007605704\": [209], \"1228132760511907\": [209], \"1237353691632859\": [209], \"1237645566018181\": [209], \"1237873623872013\": [209], \"1242108056916585\": [209], \"1243288666319706\": [209], \"1253667784809357\": [209], \"1256332125853854\": [209], \"1258856032804609\": [209], \"1268489178536922\": [209], \"1270046182759902\": [209], \"1277339966297064\": [209], \"1280747289734350\": [209], \"1291257856393018\": [209], \"1301407042754231\": [209], \"1306865822485042\": [209], \"1334215654588005\": [209], \"1337917899836268\": [209], \"1344967568037371\": [209], \"1352100309415596\": [209], \"1353718668683422\": [209], \"1363596268422841\": [209], \"1364900030037157\": [209], \"1368643180327364\": [209], \"1369792434246639\": [209], \"1374340891384378\": [209], \"1382414274551816\": [209], \"1386823566807088\": [209], \"1400078479596712\": [209], \"1400294853580658\": [209], \"1401629327152116\": [209], \"1410844958448662\": [209], \"1417955827796052\": [209], \"1424680597014401\": [209], \"1437676718046964\": [209], \"1439678281291841\": [209], \"1442345169223341\": [209], \"1457140797890808\": [209], \"1473805881868854\": [209], \"1476954417971324\": [209], \"1478496234828355\": [209], \"1484481198755222\": [209], \"1487425672248312\": [209], \"1503936837642869\": [209], \"1516624293552334\": [209], \"1521781952277669\": [209], \"1525868732872280\": [209], \"1546677782119422\": [209], \"1551690013399673\": [209], \"1568652950303964\": [209], \"1570282376978240\": [209], \"1572262201604422\": [209], \"1575629237161059\": [209], \"1579208730637462\": [209], \"1592311088222633\": [209], \"1611240920804037\": [209], \"1615982405146307\": [209], \"1618630841567861\": [209], \"1627555959119743\": [209], \"1668331618363067\": [209], \"1678908367326276\": [209], \"1680283761417727\": [209], \"1682678871439437\": [209], \"1691135052992852\": [209], \"1699689830867968\": [209], \"1711375730214477\": [209], \"1718319376401975\": [209], \"1718408791227166\": [209], \"1733867723102557\": [209], \"1738025256080792\": [209], \"1752072381029037\": [209], \"1754064673814079\": [209], \"1762473214148953\": [209], \"1773448062164029\": [209], \"1782105608943652\": [209], \"1783578637520294\": [209], \"1784222555980859\": [209], \"1784501073296577\": [209], \"1787049549813377\": [209], \"1800523524146309\": [209], \"1801929764555842\": [209], \"1810508103241652\": [209], \"1812513619048322\": [209], \"1828660028151100\": [209], \"1830163692489121\": [209], \"1834179091682630\": [209], \"1837272077295623\": [209], \"1839082148686262\": [209], \"4544564541777\": [395], \"8581313229021\": [395], \"13858004909890\": [395], \"22109472800306\": [395], \"33243310918093\": [395], \"35046909730857\": [395], \"36002943219015\": [395], \"36803243944975\": [395], \"40925794788684\": [395], \"50300561984719\": [395], \"54925088761051\": [395], \"65148730313359\": [395], \"67973641676064\": [395], \"76325417666516\": [395], \"92860832822232\": [395], \"104860744849022\": [395], \"111871575504049\": [395], \"125329050929634\": [395], \"129188889144749\": [395], \"131536884986771\": [395], \"132973903820267\": [395], \"151766414818154\": [395], \"155289997869327\": [395], \"168141435154447\": [395], \"177548054693036\": [395], \"181315672994049\": [395], \"183757115294821\": [395], \"194222120718333\": [395], \"213139491415980\": [395], \"218773877233050\": [395], \"240860931922136\": [395], \"248846621773679\": [395], \"260236619960314\": [395], \"262780918637537\": [395], \"265790317618837\": [395], \"272636420861010\": [395], \"274046819588001\": [395], \"277912619386690\": [395], \"286605637178530\": [395], \"292973459027025\": [395], \"318322734402250\": [395], \"321838426241799\": [395], \"328850724708193\": [395], \"346478169352874\": [395], \"348380083210079\": [395], \"354246879167003\": [395], \"359178493513027\": [395], \"360239247174006\": [395], \"371785010691833\": [395], \"379094350614852\": [395], \"381077258936088\": [395], \"381442111648337\": [395], \"388577667001338\": [395], \"392358579933525\": [395], \"400440609219021\": [395], \"406038583921057\": [395], \"408330197378941\": [395], \"410163772670652\": [395], \"423234050937512\": [395], \"425218685176027\": [395], \"446090115298591\": [395], \"446453155073485\": [395], \"455236569828737\": [395], \"458856926805669\": [395], \"462486830307725\": [395], \"462595004203208\": [395], \"483166107352903\": [395], \"483704898247277\": [395], \"494244104678300\": [395], \"494639859417056\": [395], \"501192188637884\": [395], \"510675622259470\": [395], \"518201549483575\": [395], \"522168448102877\": [395], \"547850350038011\": [395], \"548618821296654\": [395], \"566297202288227\": [395], \"571007990707951\": [395], \"577781161449752\": [395], \"583275969589027\": [395], \"594912311991845\": [395], \"601236609369372\": [395], \"602107849542274\": [395], \"608271077234669\": [395], \"632062004417280\": [395], \"632109760592796\": [395], \"634727833351551\": [395], \"637278824563158\": [395], \"644971206181512\": [395], \"648533249063278\": [395], \"649287581711486\": [395], \"651968974610436\": [395], \"655856515200674\": [395], \"679849320365200\": [395], \"681103172177451\": [395], \"687704345982478\": [395], \"695282473938552\": [395], \"698348460889683\": [395], \"705162594752041\": [395], \"707306922556810\": [395], \"711072917501582\": [395], \"714754050038510\": [395], \"730705098468235\": [395], \"744079072205921\": [395], \"745952201173799\": [395], \"747016626005998\": [395], \"757542835394800\": [395], \"766146707775082\": [395], \"773178920995688\": [395], \"782994228389590\": [395], \"803727313826863\": [395], \"812750392739441\": [395], \"821574537203519\": [395], \"845836091437649\": [395], \"853742331786980\": [395], \"864887941091323\": [395], \"869671685914354\": [395], \"888435024190881\": [395], \"947456280478229\": [395], \"949367246267583\": [395], \"956491542870449\": [395], \"967048970295402\": [395], \"971202060766007\": [395], \"978931950435734\": [395], \"993056624873370\": [395], \"996975645223807\": [395], \"1007707215648390\": [395], \"1008149686779084\": [395], \"1018985563127910\": [395], \"1022692054265472\": [395], \"1027179518608476\": [395], \"1036606260474886\": [395], \"1043850921081072\": [395], \"1049874321329540\": [395], \"1075834968301467\": [395], \"1087755718865650\": [395], \"1088290622982785\": [395], \"1088308856754065\": [395], \"1097255462428957\": [395], \"1102494175504539\": [395], \"1106200855941023\": [395], \"1163422042717229\": [395], \"1199776215756672\": [395], \"1203944597053244\": [395], \"1211551163495496\": [395], \"1216224755819991\": [395], \"1216971004976208\": [395], \"1246866724202403\": [395], \"1262726525591376\": [395], \"1271821592733966\": [395], \"1295576174349907\": [395], \"1298848536168936\": [395], \"1310656662269501\": [395], \"1326048486469817\": [395], \"1327897694537274\": [395], \"1339040494856037\": [395], \"1343187481578618\": [395], \"1349479868328803\": [395], \"1351034322121175\": [395], \"1360641268612126\": [395], \"1383827641790386\": [395], \"1383888566098538\": [395], \"1399068747946805\": [395], \"1405006380107785\": [395], \"1414729661325784\": [395], \"1414734978678493\": [395], \"1420322178649275\": [395], \"1420740489306321\": [395], \"1439813556506380\": [395], \"1446126062725480\": [395], \"1463513307502000\": [395], \"1463964185955659\": [395], \"1466749058711287\": [395], \"1472274362269533\": [395], \"1472753635123188\": [395], \"1473369856693004\": [395], \"1479361489796687\": [395], \"1482158842043339\": [395], \"1485775606140555\": [395], \"1499165253592503\": [395], \"1502229061684166\": [395], \"1503510407494678\": [395], \"1505420843877866\": [395], \"1519588803781842\": [395], \"1568212279715817\": [395], \"1573568323455958\": [395], \"1574674975536634\": [395], \"1578938126273913\": [395], \"1579338155998981\": [395], \"1590684992147198\": [395], \"1597887774957974\": [395], \"1615302073601615\": [395], \"1617303401995043\": [395], \"1635926261617086\": [395], \"1637649705314274\": [395], \"1643056357828058\": [395], \"1648761532214959\": [395], \"1652982371280533\": [395], \"1654211925340972\": [395], \"1663734887887719\": [395], \"1665001711886066\": [395], \"1689681978632597\": [395], \"1696936316661449\": [395], \"1708928874057963\": [395], \"1722636935798965\": [395], \"1729879039789897\": [395], \"1730265273177045\": [395], \"1733781125039495\": [395], \"1737858152932701\": [395], \"1740860866518638\": [395], \"1746967568522022\": [395], \"1756717989991904\": [395], \"1759759973007296\": [395], \"1773532575823108\": [395], \"1782809577016768\": [395], \"1789129435832413\": [395], \"1795223687727048\": [395], \"1806483358546057\": [395], \"1806587563187986\": [395], \"1808755229329691\": [395], \"1818981796527103\": [395], \"1825012166950925\": [395], \"1829615133297992\": [395], \"15178687472614\": [618], \"23451565558057\": [618], \"29802015360361\": [618], \"32826725580798\": [618], \"35805813352894\": [618], \"36911040567152\": [618], \"39730495057510\": [618], \"43662545607037\": [618], \"49916739994841\": [618], \"54650486778209\": [618], \"60920416732028\": [618], \"69222511390780\": [618], \"72143496731151\": [618], \"72672714732841\": [618], \"73462597817063\": [618], \"74480273687593\": [618], \"81141531194682\": [618], \"85194101933384\": [618], \"85363502931963\": [618], \"89201982906726\": [618], \"92446352601544\": [618], \"95695791679483\": [618], \"96760177719291\": [618], \"98233183290949\": [618], \"99127984678252\": [618], \"107004878782990\": [618], \"108906823584505\": [618], \"110508400641155\": [618], \"117705231804942\": [618], \"124269073963100\": [618], \"127983695923518\": [618], \"128596409088529\": [618], \"136902241516123\": [618], \"137511374767260\": [618], \"161492444015182\": [618], \"163117975673859\": [618], \"164748615711167\": [618], \"174318537322611\": [618], \"176820632938850\": [618], \"189416869050819\": [618], \"189422835112559\": [618], \"198414189130615\": [618], \"199383649414984\": [618], \"199533357950869\": [618], \"202476493388977\": [618], \"214149756231580\": [618], \"219053234836518\": [618], \"219670350073289\": [618], \"224668157092109\": [618], \"225220244439549\": [618], \"235442241365554\": [618], \"239533658407794\": [618], \"239541989805406\": [618], \"241500458160945\": [618], \"242145921678807\": [618], \"244069116756483\": [618], \"244702817715076\": [618], \"247881006543029\": [618], \"260691896158530\": [618], \"266991875575632\": [618], \"271732562945212\": [618], \"277769850289210\": [618], \"282430511898310\": [618], \"289038355344327\": [618], \"296442714921528\": [618], \"300520209828541\": [618], \"302114445987910\": [618], \"309560226091739\": [618], \"310533281599207\": [618], \"314262919322292\": [618], \"315814221289185\": [618], \"318684366063505\": [618], \"320689916766499\": [618], \"329989809825660\": [618], \"335541615422531\": [618], \"336914600016286\": [618], \"343263666920894\": [618], \"346229099718346\": [618], \"350967281668571\": [618], \"352469674128290\": [618], \"361966072584608\": [618], \"362812602109510\": [618], \"364824838084435\": [618], \"366767801547974\": [618], \"376395032754465\": [618], \"380446666194789\": [618], \"381895361646444\": [618], \"388127967780721\": [618], \"389767493190720\": [618], \"394732093517291\": [618], \"396673090713581\": [618], \"397266036962206\": [618], \"400443342931169\": [618], \"404286438302771\": [618], \"406984298761880\": [618], \"409684599278326\": [618], \"411927432997822\": [618], \"413950803396897\": [618], \"417269856660241\": [618], \"418903340981454\": [618], \"421097157440564\": [618], \"424016564938797\": [618], \"429595156887461\": [618], \"431140726542088\": [618], \"432418874124012\": [618], \"439820956643196\": [618], \"440719486373501\": [618], \"441344576415933\": [618], \"441450601930038\": [618], \"443834728134524\": [618], \"451145760172263\": [618], \"455970982162927\": [618], \"458643571611480\": [618], \"459133973891985\": [618], \"461085853236504\": [618], \"462846148787292\": [618], \"468071097515930\": [618], \"469306577813442\": [618], \"469479316873210\": [618], \"473569722912136\": [618], \"473800104882275\": [618], \"481656335882710\": [618], \"487951568171543\": [618], \"489127517933523\": [618], \"491161732225795\": [618], \"494489285902441\": [618], \"497722964887474\": [618], \"501082765123300\": [618], \"505279291453226\": [618], \"507114615939805\": [618], \"513000747984813\": [618], \"513943001163427\": [618], \"513987867679122\": [618], \"518016388642070\": [618], \"523482841905638\": [618], \"524880929668984\": [618], \"534974536925031\": [618], \"536554797766420\": [618], \"545171311145688\": [618], \"554273731079886\": [618], \"557170799751620\": [618], \"562293314281180\": [618], \"574296395714518\": [618], \"578086367125209\": [618], \"578115408105066\": [618], \"580629010932803\": [618], \"580750432869389\": [618], \"605767878393571\": [618], \"605999612814682\": [618], \"610469443956833\": [618], \"613668129645303\": [618], \"614656614766476\": [618], \"623920338952235\": [618], \"625470904159488\": [618], \"630373308979530\": [618], \"630652727169289\": [618], \"637373000642442\": [618], \"638206612732364\": [618], \"638237947802582\": [618], \"640091996359939\": [618], \"641880010635052\": [618], \"646313679540583\": [618], \"647894786679526\": [618], \"653258905688378\": [618], \"654189034093218\": [618], \"656224858960164\": [618], \"661301341183125\": [618], \"667510764825725\": [618], \"671439109707517\": [618], \"680583069966707\": [618], \"682621507563573\": [618], \"683029401911453\": [618], \"683726717768800\": [618], \"689924898151019\": [618], \"698369200133743\": [618], \"699871725182884\": [618], \"701178459405758\": [618], \"708523872727504\": [618], \"711359708436115\": [618], \"712164367140431\": [618], \"712752465688750\": [618], \"714354750443640\": [618], \"719404542806132\": [618], \"722539919614169\": [618], \"723036557834112\": [618], \"723696515795479\": [618], \"729773145481116\": [618], \"731331906136269\": [618], \"734651391164275\": [618], \"735054360717552\": [618], \"738663550918765\": [618], \"738950677580647\": [618], \"745629896527062\": [618], \"758215116402871\": [618], \"785655867434817\": [618], \"788289051862859\": [618], \"804566586251743\": [618], \"804710310382837\": [618], \"806116929132473\": [618], \"807694693779237\": [618], \"815762472086184\": [618], \"819170571955111\": [618], \"823105424805708\": [618], \"826389688594034\": [618], \"828013607147998\": [618], \"829255532195024\": [618], \"832280300922711\": [618], \"847249422774463\": [618], \"885154830621151\": [618], \"893730689136088\": [618], \"894722334609720\": [618], \"899931227271534\": [618], \"907065305562107\": [618], \"909139361351599\": [618], \"914993440140769\": [618], \"915715103714651\": [618], \"918280032022503\": [618], \"919714430893885\": [618], \"929963715766410\": [618], \"933533843191779\": [618], \"944254649084499\": [618], \"945866667300096\": [618], \"947154315781511\": [618], \"953561919948830\": [618], \"958095083268828\": [618], \"960451275667070\": [618], \"965782499637178\": [618], \"976255762091898\": [618], \"976888938580640\": [618], \"989566099879809\": [618], \"993082997230953\": [618], \"1037531266927577\": [618], \"1039268429560617\": [618], \"1042962492507664\": [618], \"1046459470527133\": [618], \"1048010328238758\": [618], \"1048106859150151\": [618], \"1048485145069179\": [618], \"1050814679524802\": [618], \"1062694202187070\": [618], \"1074659743574489\": [618], \"1074783446949646\": [618], \"1078214355948717\": [618], \"1079801231402936\": [618], \"1097163944661945\": [618], \"1100244123136570\": [618], \"1101282925550194\": [618], \"1113831058406447\": [618], \"1116644960985447\": [618], \"1118987199996723\": [618], \"1120450706842038\": [618], \"1124248679539408\": [618], \"1126018438419531\": [618], \"1129271989197023\": [618], \"1135161838913390\": [618], \"1138351418989522\": [618], \"1141302318727057\": [618], \"1146866957201922\": [618], \"1153187844366965\": [618], \"1158175338239821\": [618], \"1160564511762986\": [618], \"1166756453983782\": [618], \"1167006070055984\": [618], \"1168340864401791\": [618], \"1175035903093100\": [618], \"1176648618702194\": [618], \"1183308722460089\": [618], \"1184403551943093\": [618], \"1190842104624568\": [618], \"1191409430201210\": [618], \"1192156169192797\": [618], \"1194772743824583\": [618], \"1196863382607984\": [618], \"1200825838992074\": [618], \"1200829090238985\": [618], \"1221984822520246\": [618], \"1222743055457474\": [618], \"1229526712418866\": [618], \"1244403832759646\": [618], \"1244519991567965\": [618], \"1248074792585235\": [618], \"1256646364121643\": [618], \"1269629409586749\": [618], \"1272326577333583\": [618], \"1272990421202669\": [618], \"1274464629819995\": [618], \"1278382741541450\": [618], \"1288714151957995\": [618], \"1297332192960887\": [618], \"1305627117017193\": [618], \"1312782331923433\": [618], \"1313463143795528\": [618], \"1323704055912594\": [618], \"1328489348413930\": [618], \"1328892130889058\": [618], \"1333738194596607\": [618], \"1335913448446324\": [618], \"1338219276266951\": [618], \"1342486265522719\": [618], \"1346774342645546\": [618], \"1347986557437226\": [618], \"1350081652762664\": [618], \"1352678281273174\": [618], \"1356578215646902\": [618], \"1388629028462832\": [618], \"1390639259576453\": [618], \"1394929313362456\": [618], \"1395380128283273\": [618], \"1395991370364431\": [618], \"1396284747512400\": [618], \"1397761310583618\": [618], \"1406724636417678\": [618], \"1415101073343155\": [618], \"1418244149940465\": [618], \"1431791122966341\": [618], \"1435841899080073\": [618], \"1442314223967837\": [618], \"1443833302799420\": [618], \"1455554374843881\": [618], \"1465658016958806\": [618], \"1467230134565719\": [618], \"1471454790309549\": [618], \"1488892479065431\": [618], \"1489727048643387\": [618], \"1490899414983859\": [618], \"1491598725669967\": [618], \"1493391269946551\": [618], \"1506803220535256\": [618], \"1512325758767524\": [618], \"1516257860296689\": [618], \"1517883928765799\": [618], \"1518411038946177\": [618], \"1521685264162403\": [618], \"1522142618347409\": [618], \"1524721409107365\": [618], \"1525727913174313\": [618], \"1527512699697753\": [618], \"1531164860410900\": [618], \"1538649045866534\": [618], \"1543387464648923\": [618], \"1550551532685148\": [618], \"1552845840261622\": [618], \"1557656084637981\": [618], \"1571644738513780\": [618], \"1577978353434659\": [618], \"1579518870957602\": [618], \"1584609275305850\": [618], \"1601164459728525\": [618], \"1618928173058139\": [618], \"1619557062584389\": [618], \"1624846168037522\": [618], \"1626780119206598\": [618], \"1632526429374722\": [618], \"1639230893245086\": [618], \"1641627984450915\": [618], \"1645365193555148\": [618], \"1646605052251364\": [618], \"1646673405481117\": [618], \"1646723559565655\": [618], \"1650111404529258\": [618], \"1654047218909886\": [618], \"1655518688795335\": [618], \"1659112226384148\": [618], \"1662761070778222\": [618], \"1665856754810721\": [618], \"1681762430691182\": [618], \"1687014351542881\": [618], \"1687704245009228\": [618], \"1697299379846494\": [618], \"1699881946445198\": [618], \"1702853471929077\": [618], \"1705106992950623\": [618], \"1707543787860125\": [618], \"1712032115889855\": [618], \"1712566556150830\": [618], \"1723647735347503\": [618], \"1726323240484104\": [618], \"1731221741040419\": [618], \"1733342874210664\": [618], \"1745104686252554\": [618], \"1749730533284538\": [618], \"1753254255850036\": [618], \"1755556270732219\": [618], \"1759812132157100\": [618], \"1761931876845708\": [618], \"1764279071407444\": [618], \"1764414403952527\": [618], \"1768586422238029\": [618], \"1777719274562321\": [618], \"1792071970684808\": [618], \"1793801105896376\": [618], \"1799922401902241\": [618], \"1801128718633139\": [618], \"1802818977831539\": [618], \"1803265087379048\": [618], \"1804456951012447\": [618], \"1807263145675982\": [618], \"1816344891620112\": [618], \"1828689853863587\": [618], \"36775194231930\": [457], \"53690665682443\": [457], \"66440217729400\": [457], \"70849988803673\": [457], \"75004065547398\": [457], \"77138625265596\": [457], \"117216836788564\": [457], \"119522520634848\": [457], \"128124360165948\": [457], \"134833351958384\": [457], \"139489397261097\": [457], \"148598134726212\": [457], \"155467636752706\": [457], \"156442774086858\": [457], \"170734250513575\": [457], \"177202782585710\": [457], \"201555822335801\": [457], \"205839096979867\": [457], \"209867825108086\": [457], \"212932376589913\": [457], \"220827075698986\": [457], \"225777394635724\": [457], \"231649850685428\": [457], \"240134865959519\": [457], \"246275550180425\": [457], \"255536960841770\": [457], \"256082922978942\": [457], \"262260922852672\": [457], \"264393625038585\": [457], \"280491823564460\": [457], \"313879197062375\": [457], \"335078188251392\": [457], \"379734091626639\": [457], \"381327044552994\": [457], \"391097110066965\": [457], \"393210025104184\": [457], \"410322295051451\": [457], \"413193458241052\": [457], \"423992680198431\": [457], \"447895568165097\": [457], \"458695725322218\": [457], \"500434990622315\": [457], \"518114886551987\": [457], \"525649924468956\": [457], \"525820118769158\": [457], \"526623223666131\": [457], \"531022849344618\": [457], \"563986405624490\": [457], \"569377546014527\": [457], \"573208164997041\": [457], \"595822370536672\": [457], \"627706112817535\": [457], \"662834992037969\": [457], \"673803614318024\": [457], \"697624286190058\": [457], \"707529578271543\": [457], \"711059105810546\": [457], \"712390387890604\": [457], \"713589743008108\": [457], \"713709834495987\": [457], \"718195905912830\": [457], \"720971869446471\": [457], \"731785995540160\": [457], \"760032400710324\": [457], \"767526468882682\": [457], \"768088688667382\": [457], \"805822729163199\": [457], \"815880572724659\": [457], \"816677045707073\": [457], \"820871860652839\": [457], \"831055689098631\": [457], \"848036241628859\": [457], \"851052487912910\": [457], \"860805461568406\": [457], \"892040265410551\": [457], \"893165264454842\": [457], \"904688045580218\": [457], \"908917398666427\": [457], \"909470527899184\": [457], \"912385435089829\": [457], \"942074691264403\": [457], \"945257001203801\": [457], \"946586996989034\": [457], \"948815092698274\": [457], \"957077797378172\": [457], \"960751476992787\": [457], \"962225674537810\": [457], \"972504953108844\": [457], \"972719992957481\": [457], \"974167093740469\": [457], \"979740917389663\": [457], \"995282130815736\": [457], \"1000149678699381\": [457], \"1018081123080235\": [457], \"1022073164968511\": [457], \"1056242160554372\": [457], \"1075237955167216\": [457], \"1094571337255974\": [457], \"1105046405948824\": [457], \"1112160031305766\": [457], \"1123068850079138\": [457], \"1134563133191989\": [457], \"1137321901154739\": [457], \"1141914072572050\": [457], \"1150062022139773\": [457], \"1160173792324055\": [457], \"1161621401950299\": [457], \"1190124998962973\": [457], \"1210672820792720\": [457], \"1221845510881630\": [457], \"1225378176669932\": [457], \"1227048653886895\": [457], \"1229833711136272\": [457], \"1245726973252093\": [457], \"1251825001312194\": [457], \"1254607981438920\": [457], \"1259125228322138\": [457], \"1285623330715082\": [457], \"1289455063995832\": [457], \"1306694273434115\": [457], \"1308300271521936\": [457], \"1320968607733315\": [457], \"1348329113843391\": [457], \"1348552640944505\": [457], \"1356990632384485\": [457], \"1387765654948972\": [457], \"1391534056402079\": [457], \"1397887457403984\": [457], \"1431167480168279\": [457], \"1466689593829989\": [457], \"1502216836033097\": [457], \"1514600513913709\": [457], \"1518056294074498\": [457], \"1553582070347977\": [457], \"1553890396372320\": [457], \"1576175878261193\": [457], \"1588572323054867\": [457], \"1590177099924575\": [457], \"1590234041534461\": [457], \"1610816436762599\": [457], \"1630972407871332\": [457], \"1634217073763413\": [457], \"1643225162057575\": [457], \"1644957724711698\": [457], \"1647054860269182\": [457], \"1648428886098687\": [457], \"1675754634157535\": [457], \"1684482590549309\": [457], \"1684734820141580\": [457], \"1709313640767862\": [457], \"1714892081311954\": [457], \"1724845974697960\": [457], \"1756674301683759\": [457], \"1760366106944684\": [457], \"1795379312074631\": [457], \"1807620202003202\": [457], \"1817394008553928\": [457], \"1820569595383472\": [457], \"1830413605092951\": [457], \"1833635418328175\": [457], \"1838619249589021\": [457]}, \"ident_to_name\": {\"TARA_ANE_MAG_00011\": \"TARA_ANE_MAG_00011\", \"TARA_ANE_MAG_00015\": \"TARA_ANE_MAG_00015\", \"TARA_ANE_MAG_00041\": \"TARA_ANE_MAG_00041\", \"TARA_ANE_MAG_00044\": \"TARA_ANE_MAG_00044\", \"TARA_ANE_MAG_00063\": \"TARA_ANE_MAG_00063\", \"TARA_ANE_MAG_00068\": \"TARA_ANE_MAG_00068\", \"TARA_ANE_MAG_00069\": \"TARA_ANE_MAG_00069\", \"TARA_ANW_MAG_00005\": \"TARA_ANW_MAG_00005\", \"TARA_ANW_MAG_00020\": \"TARA_ANW_MAG_00020\", \"TARA_ANW_MAG_00034\": \"TARA_ANW_MAG_00034\"}, \"ident_to_idx\": {\"TARA_ANE_MAG_00069\": 209, \"TARA_ANE_MAG_00068\": 369, \"TARA_ANW_MAG_00005\": 395, \"TARA_ANW_MAG_00034\": 457, \"TARA_ANE_MAG_00015\": 489, \"TARA_ANE_MAG_00041\": 498, \"TARA_ANW_MAG_00020\": 618, \"TARA_ANE_MAG_00044\": 655, \"TARA_ANE_MAG_00063\": 816, \"TARA_ANE_MAG_00011\": 857}, \"idx_to_lid\": {\"209\": 6, \"369\": 10, \"395\": 3, \"457\": 18, \"489\": 17, \"498\": 18, \"618\": 8, \"655\": 6, \"816\": 19, \"857\": 6}}\n"
  },
  {
    "path": "tests/test-data/lca/dir2.lca.json",
    "content": "{\"version\": \"2.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lid_to_lineage\": {\"3\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"]], \"9\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Gammaproteobacteria\"], [\"order\", \"Alteromonadales\"], [\"family\", \"Alteromonadaceae\"], [\"genus\", \"Alteromonas\"], [\"species\", \"Alteromonas_macleodii\"]], \"13\": [[\"superkingdom\", \"Eukaryota\"], [\"phylum\", \"Haptophyta\"], [\"class\", \"Prymnesiophyceae\"], [\"order\", \"Isochrysidales\"], [\"family\", \"Noelaerhabdaceae\"], [\"genus\", \"Emiliania\"]], \"18\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Bacteroidetes\"], [\"class\", \"Flavobacteriia\"], [\"order\", \"Flavobacteriales\"]], \"19\": [[\"superkingdom\", \"Archaea\"], [\"phylum\", \"Euryarchaeota\"]], \"25\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Proteobacteria\"], [\"class\", \"Alphaproteobacteria\"], [\"order\", \"Rickettsiales\"], [\"family\", \"Pelagibacteraceae\"]], \"33\": [[\"superkingdom\", \"Bacteria\"], [\"phylum\", \"Planctomycetes\"], [\"class\", \"Planctomycetia\"], [\"order\", \"Planctomycetales\"], [\"family\", \"Planctomycetaceae\"]], \"94\": [[\"superkingdom\", \"Eukaryota\"], [\"phylum\", \"Cryptophyta\"], [\"class\", \"Cryptophyceae\"], [\"order\", \"Pyrenomonadales\"], [\"family\", \"Geminigeraceae\"], [\"genus\", \"Guillardia\"]]}, \"hashval_to_idx\": {\"69390184559847\": [255], \"71465078358534\": [255], \"129805992591010\": [255], \"146907622731567\": [255], \"148360529061237\": [255], \"175028205147872\": [255], \"176646989586454\": [255], \"204338838188071\": [255], \"224600920538556\": [255], \"237965920669458\": [255], \"258578785600467\": [255], \"271622469275115\": [255], \"280913234396399\": [255], \"329791264683215\": [255], \"339472655783574\": [255], \"346765850389555\": [255], \"348804294035508\": [255], \"354529489782330\": [255], \"365522453696498\": [255], \"376796089927740\": [255], \"394928011129467\": [255], \"413625487319909\": [255], \"475726218760133\": [255], \"479295122707485\": [255], \"493873056924831\": [255], \"510963869014409\": [255], \"534324624993564\": [255], \"551546266431050\": [255], \"559792286612432\": [255], \"638868177603236\": [255], \"724998129164336\": [255], \"825567597043426\": [255], \"861926873219957\": [255], \"898007554964769\": [255], \"907055118654934\": [255], \"911309762934991\": [255], \"924940512669963\": [255], \"953352779526447\": [255], \"958977594215157\": [255], \"973779605043045\": [255], \"1012855977472855\": [255], \"1023973095633088\": [255], \"1044332471155994\": [255], \"1054388198231983\": [255], \"1110729128272561\": [255], \"1163080613382789\": [255], \"1240066853592539\": [255], \"1279484653240188\": [255], \"1282922937776796\": [255], \"1306424165950046\": [255], \"1379540846591446\": [255], \"1391355468255430\": [255], \"1426314459324540\": [255], \"1504923991806156\": [255], \"1595796491086788\": [255], \"1597416949989322\": [255], \"1635368678045609\": [255], \"1643130948716547\": [255], \"1657899354090152\": [255], \"1683241261076280\": [255], \"1716788870034681\": [255], \"1731139096127541\": [255], \"1739636668294768\": [255], \"1782468068830201\": [255], \"1802019441368612\": [255], \"1810396933939036\": [255], \"5280978073906\": [443], \"6595007275903\": [443], \"11148226371848\": [443], \"23984753945738\": [443], \"32051111684751\": [443], \"33073834626764\": [443], \"33673579994973\": [443], \"35218406026581\": [443], \"35528083895560\": [443], \"36634813080664\": [443], \"38752406828619\": [443], \"51576320771170\": [443], \"74836367550726\": [443], \"104279143949681\": [443], \"117698552840247\": [443], \"119127409505208\": [443], \"145809558837003\": [443], \"156082451029034\": [443], \"158150884031480\": [443], \"159182564272646\": [443], \"160235795210717\": [443], \"178156606661845\": [443], \"190394792844626\": [443], \"203071642731786\": [443], \"251050101711455\": [443], \"251306870306187\": [443], \"274255887894549\": [443], \"293207912758725\": [443], \"297978980196927\": [443], \"300795297114671\": [443], \"329372583775353\": [443], \"348758412098808\": [443], \"366696431918548\": [443], \"377733729703077\": [443], \"386118085102373\": [443], \"392345558278578\": [443], \"398838002325016\": [443], \"409644074025641\": [443], \"415317573977895\": [443], \"433616331982059\": [443], \"443629301976109\": [443], \"445829222393282\": [443], \"470303580708234\": [443], \"482132132976202\": [443], \"488829392514623\": [443], \"493657513540586\": [443], \"503598802132698\": [443], \"505377770977718\": [443], \"512738398205613\": [443], \"523139685781118\": [443], \"530122145001471\": [443], \"530367677685292\": [443], \"538140865272387\": [443], \"544390421064288\": [443], \"559588105005041\": [443], \"578131190685686\": [443], \"584548902052751\": [443], \"589504784293660\": [443], \"600494984304076\": [443], \"611484570135494\": [443], \"633859647911118\": [443], \"664085352982980\": [443], \"664222623618905\": [443], \"673066940110296\": [443], \"678943282260949\": [443], \"681295569699952\": [443], \"686267541457407\": [443], \"689471440969374\": [443], \"697071016250110\": [443], \"699465323641896\": [443], \"711451634804177\": [443], \"720169493082640\": [443], \"722929884860907\": [443], \"735963158994096\": [443], \"745731094545512\": [443], \"747968825723679\": [443], \"755031888981732\": [443], \"770489043473894\": [443], \"789434246102434\": [443], \"795365575251938\": [443], \"807283553081085\": [443], \"809854949855883\": [443], \"830200311662738\": [443], \"834293276943675\": [443], \"841414986934814\": [443], \"842846647784171\": [443], \"845941850014113\": [443], \"846679118209804\": [443], \"851129314622928\": [443], \"852002214751214\": [443], \"852359287611092\": [443], \"855002351167831\": [443], \"856786674989196\": [443], \"869389337497730\": [443], \"888215504021890\": [443], \"891304522510837\": [443], \"894911295139269\": [443], \"900108292382443\": [443], \"901586949087244\": [443], \"910842073038114\": [443], \"912727971414436\": [443], \"916164021187059\": [443], \"926434615090805\": [443], \"927979364015191\": [443], \"930329292428988\": [443], \"943584260658074\": [443], \"950167158507598\": [443], \"950512330225818\": [443], \"951521499175095\": [443], \"952999252593239\": [443], \"953282281781556\": [443], \"973816958075617\": [443], \"992397822434210\": [443], \"993920582755613\": [443], \"997479715804561\": [443], \"1010819761084098\": [443], \"1013513146530420\": [443], \"1015667209187451\": [443], \"1017578706384371\": [443], \"1019845111617572\": [443], \"1027282997328309\": [443], \"1032218217915816\": [443], \"1038730071396946\": [443], \"1048861729263009\": [443], \"1052332167111131\": [443], \"1055379867714492\": [443], \"1075484813838293\": [443], \"1088142919055914\": [443], \"1091639765595567\": [443], \"1093849865831089\": [443], \"1122386453198303\": [443], \"1140748299847797\": [443], \"1157038718893877\": [443], \"1160987074109337\": [443], \"1174463638805473\": [443], \"1206331659737913\": [443], \"1209369729791450\": [443], \"1211119848357372\": [443], \"1221812619290748\": [443], \"1241552601509230\": [443], \"1242236171697763\": [443], \"1268070508720772\": [443], \"1312738638874750\": [443], \"1320049251619808\": [443], \"1332963599208802\": [443], \"1341399776372143\": [443], \"1345971693669169\": [443], \"1369020466109766\": [443], \"1382034111995157\": [443], \"1403496857001455\": [443], \"1408172690920696\": [443], \"1426815969454971\": [443], \"1442221954802160\": [443], \"1442267932957999\": [443], \"1443289556122996\": [443], \"1447288609566109\": [443], \"1453397077002841\": [443], \"1460173477278567\": [443], \"1460596815984296\": [443], \"1462206018393914\": [443], \"1480769648885611\": [443], \"1482216446720887\": [443], \"1484961778725013\": [443], \"1505891456845581\": [443], \"1511560052378442\": [443], \"1523268995764035\": [443], \"1527652844243886\": [443], \"1540308411125502\": [443], \"1546484947647420\": [443], \"1548258906563602\": [443], \"1561220874331310\": [443], \"1576310675717522\": [443], \"1576552915988626\": [443], \"1583911083929628\": [443], \"1590745898390273\": [443], \"1609360348911792\": [443], \"1615288776873086\": [443], \"1638054118580476\": [443], \"1658229468042259\": [443], \"1660529146952359\": [443], \"1661081847646305\": [443], \"1665164212032088\": [443], \"1696630810885730\": [443], \"1704678249729101\": [443], \"1721340613329146\": [443], \"1733470885665112\": [443], \"1755196663341565\": [443], \"1762724963778602\": [443], \"1767001104484493\": [443], \"1774533783986216\": [443], \"1775119657166122\": [443], \"1792100344889574\": [443], \"1803450307984557\": [443], \"1817379944742951\": [443], \"1842343747170370\": [443], \"2330673835286\": [746], \"2959285854968\": [746], \"6537582986751\": [746], \"13316358964602\": [746], \"15341215347257\": [746], \"16470347547828\": [746], \"21314904128486\": [746], \"21568381026626\": [746], \"31892518108757\": [746], \"33981969982898\": [746], \"38507442989828\": [746], \"38679362367580\": [746], \"43745058695646\": [746], \"48987442750106\": [746], \"54353496907083\": [746], \"68415701190664\": [746], \"70755205388699\": [746], \"74551320069787\": [746], \"84019162130264\": [746], \"85114181530144\": [746], \"95470717868777\": [746], \"114941409399725\": [746], \"118041701374654\": [746], \"123600702747644\": [746], \"125639273456141\": [746], \"140518340111925\": [746], \"141937868117449\": [746], \"142408523431465\": [746], \"145246511475790\": [746], \"146704300980559\": [746], \"152403267293846\": [746], \"152429180468797\": [746], \"160097765580309\": [746], \"172227401498786\": [746], \"178878628944298\": [746], \"189106091447317\": [746], \"189628075649891\": [746], \"192420814887946\": [746], \"204865710658779\": [746], \"207942158173039\": [746], \"221746440373214\": [746], \"224577963032989\": [746], \"274751113197613\": [746], \"275092088588858\": [746], \"277051976612370\": [746], \"280325750506921\": [746], \"282282661210764\": [746], \"306461998943275\": [746], \"320143261958525\": [746], \"321911217038351\": [746], \"334763951599072\": [746], \"336624488859277\": [746], \"339056593882219\": [746], \"342910495862408\": [746], \"346163128403223\": [746], \"347943123972089\": [746], \"349107114476985\": [746], \"360772831850237\": [746], \"365376051027609\": [746], \"372026495942520\": [746], \"379877399183845\": [746], \"388970171535323\": [746], \"395681300085368\": [746], \"400014317735684\": [746], \"409528118807100\": [746], \"412587527335466\": [746], \"414885387570514\": [746], \"425125387057136\": [746], \"427238205871146\": [746], \"449087459912217\": [746], \"449765439797506\": [746], \"451259271196074\": [746], \"456615084610708\": [746], \"467684504463844\": [746], \"493268553531597\": [746], \"505000045967392\": [746], \"508255735463125\": [746], \"509215479374186\": [746], \"512928261349636\": [746], \"513755552587100\": [746], \"518491772924509\": [746], \"529015162666570\": [746], \"544184796938049\": [746], \"553703525306618\": [746], \"556531868375717\": [746], \"562483313766887\": [746], \"566294098062824\": [746], \"566600194453941\": [746], \"570707822470654\": [746], \"575386105896570\": [746], \"578029634747490\": [746], \"582130469225220\": [746], \"583738623475267\": [746], \"588797690091958\": [746], \"592465243057384\": [746], \"595848960406536\": [746], \"604222172384771\": [746], \"608593149757009\": [746], \"611468778830601\": [746], \"627165100766832\": [746], \"630372632338003\": [746], \"638836978572669\": [746], \"640223265806483\": [746], \"641417434509361\": [746], \"641770033416472\": [746], \"661546344096932\": [746], \"661646349019993\": [746], \"663597762794475\": [746], \"664217272530592\": [746], \"665070201077191\": [746], \"673601112842035\": [746], \"674501688742331\": [746], \"680356167226486\": [746], \"683710616379876\": [746], \"689480844055624\": [746], \"699133656377172\": [746], \"703097685392333\": [746], \"707493957125574\": [746], \"732437124951521\": [746], \"742736718858031\": [746], \"745552574910939\": [746], \"747021568339609\": [746], \"751281496811451\": [746], \"757876874233320\": [746], \"773263599416771\": [746], \"776490384439809\": [746], \"781894152078965\": [746], \"793838364890277\": [746], \"806222514534441\": [746], \"806712357678909\": [746], \"807179309213178\": [746], \"815065952271496\": [746], \"819774875756153\": [746], \"844123240632263\": [746], \"877827840409064\": [746], \"884923929841773\": [746], \"892147197880422\": [746], \"893352972081877\": [746], \"898105140352100\": [746], \"899457703109745\": [746], \"906817313898115\": [746], \"922964858563182\": [746], \"925036054321347\": [746], \"925999790625323\": [746], \"951215982365027\": [746], \"957786753614536\": [746], \"978174217010067\": [746], \"982837378778184\": [746], \"983500716375789\": [746], \"983594567326148\": [746], \"987050537474531\": [746], \"993724398922312\": [746], \"1001706994702316\": [746], \"1017309029775725\": [746], \"1048589473726894\": [746], \"1058767770615877\": [746], \"1079304786015578\": [746], \"1098438108789061\": [746], \"1100796367569153\": [746], \"1103124410485908\": [746], \"1104609300111433\": [746], \"1109965856372186\": [746], \"1119876917002341\": [746], \"1120586805785573\": [746], \"1127221996934178\": [746], \"1139751614159997\": [746], \"1141476324241855\": [746], \"1165377844999648\": [746], \"1170981620570460\": [746], \"1180383686274779\": [746], \"1187783927430410\": [746], \"1209852200993532\": [746], \"1224109565356777\": [746], \"1234797959709391\": [746], \"1243248834253692\": [746], \"1257553242342805\": [746], \"1258626557878588\": [746], \"1262113703022273\": [746], \"1267722108003897\": [746], \"1270792154187609\": [746], \"1272565986398442\": [746], \"1283131712953094\": [746], \"1291602129029427\": [746], \"1301484046665230\": [746], \"1302583271689052\": [746], \"1305588675675032\": [746], \"1305964429287463\": [746], \"1323456590377952\": [746], \"1326988465512925\": [746], \"1330187461808261\": [746], \"1339486161649541\": [746], \"1351638515516256\": [746], \"1355247065873243\": [746], \"1363472196973540\": [746], \"1366201253127293\": [746], \"1373140345455446\": [746], \"1373674636385025\": [746], \"1378800071096771\": [746], \"1383000084329931\": [746], \"1397116111991158\": [746], \"1402000564780127\": [746], \"1402851205017833\": [746], \"1430318364716421\": [746], \"1445739135451777\": [746], \"1457882537940219\": [746], \"1460799020135636\": [746], \"1463740710922560\": [746], \"1466093650921939\": [746], \"1473371444297819\": [746], \"1480690839774603\": [746], \"1495550566413016\": [746], \"1503223139134433\": [746], \"1505621714271433\": [746], \"1508671474919378\": [746], \"1509769969910346\": [746], \"1514868013404531\": [746], \"1522459554783744\": [746], \"1536353017190468\": [746], \"1551630146400917\": [746], \"1565730359797163\": [746], \"1573792655167330\": [746], \"1575539770927078\": [746], \"1580160700806009\": [746], \"1592926568811045\": [746], \"1593263316401150\": [746], \"1593740724233733\": [746], \"1596408888950028\": [746], \"1599117822671178\": [746], \"1617870790557365\": [746], \"1624237491221334\": [746], \"1626846368583980\": [746], \"1630450157638035\": [746], \"1641927403057414\": [746], \"1651358584143629\": [746], \"1660995934528775\": [746], \"1661867506626321\": [746], \"1689547145728802\": [746], \"1696166190970225\": [746], \"1704558828284157\": [746], \"1721542373465414\": [746], \"1727602918766637\": [746], \"1730863985437153\": [746], \"1739905483397349\": [746], \"1742705249361250\": [746], \"1743727777604354\": [746], \"1753391897155460\": [746], \"1756155151647037\": [746], \"1757521931684923\": [746], \"1762302247573183\": [746], \"1763530100539112\": [746], \"1765318894174735\": [746], \"1767992126763367\": [746], \"1779127275659796\": [746], \"1780916017804593\": [746], \"1794292334887698\": [746], \"1804253905388368\": [746], \"1812526702684220\": [746], \"1812845098141376\": [746], \"1819287634885376\": [746], \"1820776502673946\": [746], \"1830127522028182\": [746], \"1835362316686925\": [746], \"10982597372737\": [336], \"13923567703676\": [336], \"28202106536710\": [336], \"28341844880155\": [336], \"29168173373379\": [336], \"31847780341026\": [336], \"34897208834195\": [336], \"47977834266534\": [336], \"52084596312104\": [336], \"53421046628777\": [336], \"60019553626391\": [336], \"80165484312717\": [336], \"82926948845570\": [336], \"83197667442643\": [336], \"95365283640061\": [336], \"103334914855121\": [336], \"106411395141837\": [336], \"119079653260743\": [336], \"125134130094985\": [336], \"127707374028801\": [336], \"144228527443772\": [336], \"148355814310626\": [336], \"150197048185895\": [336], \"151028483634675\": [336], \"157006128784169\": [336], \"167241839728729\": [336], \"175556923057340\": [336], \"177872981478566\": [336], \"184903289988435\": [336], \"188460723769707\": [336], \"212051707057298\": [336], \"213536559298774\": [336], \"219851413966077\": [336], \"241836994057678\": [336], \"242677709446011\": [336], \"249528101617765\": [336], \"251169411919322\": [336], \"293159978007955\": [336], \"295295508551125\": [336], \"320762020206599\": [336], \"327556656730645\": [336], \"337628582763654\": [336], \"347039866874699\": [336], \"356882022232853\": [336], \"362417568708863\": [336], \"392690128275980\": [336], \"392707229817234\": [336], \"393548981792406\": [336], \"403082126216226\": [336], \"422915436848230\": [336], \"464237705878945\": [336], \"470400924876159\": [336], \"488837665206942\": [336], \"494822356974746\": [336], \"496223407020195\": [336], \"501615135337604\": [336], \"502150426444626\": [336], \"510089367758583\": [336], \"516820242178058\": [336], \"540617721003359\": [336], \"542220036034739\": [336], \"544997242593217\": [336], \"559899491069600\": [336], \"560978629421869\": [336], \"565495941350761\": [336], \"587508713705025\": [336], \"597380822465613\": [336], \"606309161713388\": [336], \"614457540105631\": [336], \"618362816794181\": [336], \"623310177907887\": [336], \"624321289818222\": [336], \"659201978131256\": [336], \"667534234610135\": [336], \"674539630191574\": [336], \"675751216289290\": [336], \"679925135106472\": [336], \"687490158267438\": [336], \"693544756949013\": [336], \"704872530230296\": [336], \"706712427536392\": [336], \"732174469748719\": [336], \"734682604252955\": [336], \"745514492970170\": [336], \"745745784853849\": [336], \"753995458333872\": [336], \"768508597096908\": [336], \"771177342646855\": [336], \"792286570150517\": [336], \"797549843533496\": [336], \"813310241455567\": [336], \"828535729051489\": [336], \"834403319549315\": [336], \"835847718355206\": [336], \"855612897812567\": [336], \"862709377218136\": [336], \"863220208032115\": [336], \"867936817357946\": [336], \"885271338236183\": [336], \"901278820878738\": [336], \"901633332686673\": [336], \"912226273640152\": [336], \"918018719537872\": [336], \"919371572031709\": [336], \"921729845364243\": [336], \"928612663367680\": [336], \"935117533567617\": [336], \"939990837013718\": [336], \"943979038006143\": [336], \"948643514299552\": [336], \"954157093982673\": [336], \"954262293627017\": [336], \"956362534189038\": [336], \"968059666283716\": [336], \"979488909917857\": [336], \"985684770078036\": [336], \"993939946500990\": [336], \"1017436935649351\": [336], \"1033516505276015\": [336], \"1035219030403169\": [336], \"1042914880931438\": [336], \"1043600451733223\": [336], \"1053537124443820\": [336], \"1054572726258941\": [336], \"1054826970353805\": [336], \"1060770044307198\": [336], \"1069253972163125\": [336], \"1069406613184378\": [336], \"1081654418792309\": [336], \"1109968642700686\": [336], \"1125308955709144\": [336], \"1147372046441288\": [336], \"1150069570883061\": [336], \"1159296427034728\": [336], \"1165145926050854\": [336], \"1185634791511819\": [336], \"1186775065067162\": [336], \"1203304739930592\": [336], \"1215185743116110\": [336], \"1224579666486702\": [336], \"1227507927686227\": [336], \"1233662991437817\": [336], \"1239044222627305\": [336], \"1243017210995229\": [336], \"1245534392820803\": [336], \"1248636534854829\": [336], \"1265156243287179\": [336], \"1287859595519405\": [336], \"1303651589019303\": [336], \"1306613161117410\": [336], \"1309398023295110\": [336], \"1321409994433162\": [336], \"1323152770146052\": [336], \"1335656267704655\": [336], \"1349143614821906\": [336], \"1356004432566869\": [336], \"1356732302753413\": [336], \"1357554770535670\": [336], \"1360369736501979\": [336], \"1363818893187128\": [336], \"1363869665923247\": [336], \"1379423734614085\": [336], \"1392192186508798\": [336], \"1395919438655506\": [336], \"1409934728672350\": [336], \"1411663003341330\": [336], \"1416886371251580\": [336], \"1424233764242696\": [336], \"1431465496512938\": [336], \"1441086215416502\": [336], \"1445505096898217\": [336], \"1446869642720409\": [336], \"1450727956814843\": [336], \"1457996432075902\": [336], \"1459542013192483\": [336], \"1460131093348694\": [336], \"1464695791734937\": [336], \"1466757175351940\": [336], \"1468635071103809\": [336], \"1480659287569591\": [336], \"1492037903959391\": [336], \"1495115632334499\": [336], \"1500244666961471\": [336], \"1507003746684355\": [336], \"1509326257529342\": [336], \"1521008358771452\": [336], \"1527043803236728\": [336], \"1535531829255331\": [336], \"1541426161301213\": [336], \"1549606560041243\": [336], \"1550789640738703\": [336], \"1557324633706944\": [336], \"1560680616896599\": [336], \"1579656848251525\": [336], \"1587018282244490\": [336], \"1594538587808446\": [336], \"1595737198596632\": [336], \"1612554678418179\": [336], \"1612940103711412\": [336], \"1626604372553915\": [336], \"1635817156717183\": [336], \"1641852276121324\": [336], \"1658455256410471\": [336], \"1664010569521982\": [336], \"1671098133955105\": [336], \"1689458917725823\": [336], \"1699085724046342\": [336], \"1704552139007504\": [336], \"1713630313820154\": [336], \"1714988630213672\": [336], \"1716361639827595\": [336], \"1731484778907548\": [336], \"1734317006998648\": [336], \"1736489852081749\": [336], \"1738064249084904\": [336], \"1768216483578299\": [336], \"1785086434144643\": [336], \"1794263691844935\": [336], \"1818773177472562\": [336], \"1835217656221289\": [336], \"1836400708796158\": [336], \"1839486140357670\": [336], \"1840808314262016\": [336], \"1843459799132095\": [336], \"4326955763283\": [201], \"7158799582087\": [201], \"23738015571950\": [201], \"24224314530175\": [201], \"42325549179236\": [201], \"64509359584961\": [201], \"65062716770777\": [201], \"83398355305453\": [201], \"92747420401797\": [201], \"124035655424003\": [201], \"127313944559960\": [201], \"132116747543577\": [201], \"133330625460294\": [201], \"144280372722709\": [201], \"144384767973149\": [201], \"145603209243740\": [201], \"150445332721306\": [201], \"156763944975614\": [201], \"161038167145035\": [201], \"163710911470311\": [201], \"188530049183223\": [201], \"194230965715185\": [201], \"205331160625393\": [201], \"205672253215890\": [201], \"211165710707279\": [201], \"224650264198442\": [201], \"230703845052601\": [201], \"235023183594108\": [201], \"241807515829080\": [201], \"255101064467816\": [201], \"279376953099972\": [201], \"298541111621688\": [201], \"299928161543665\": [201], \"307236951551041\": [201], \"327780792286603\": [201], \"353390289593063\": [201], \"361470005717781\": [201], \"372507579642397\": [201], \"392843236904911\": [201], \"396649849298484\": [201], \"406050957932272\": [201], \"408472664407451\": [201], \"430477161830012\": [201], \"434648552401784\": [201], \"439292176300010\": [201], \"445836063143558\": [201], \"446791063545911\": [201], \"476004025959057\": [201], \"490569823544854\": [201], \"491113374084738\": [201], \"507432650225682\": [201], \"513532811012889\": [201], \"514206374296874\": [201], \"522617232301446\": [201], \"531634333064453\": [201], \"601615954910708\": [201], \"602337027915933\": [201], \"602812963350963\": [201], \"623035558717821\": [201], \"625586030923293\": [201], \"627451805812462\": [201], \"641611252315184\": [201], \"643528692945958\": [201], \"645876596829776\": [201], \"658835579608551\": [201], \"677764652048342\": [201], \"682543142973118\": [201], \"684668052450211\": [201], \"685495428308727\": [201], \"686695886754969\": [201], \"692476769447259\": [201], \"704615752139438\": [201], \"740069424767386\": [201], \"745130020812751\": [201], \"756815101716293\": [201], \"763345401324164\": [201], \"772793860002582\": [201], \"779858178416795\": [201], \"780860648830821\": [201], \"783647995529193\": [201], \"785569928910679\": [201], \"800181195992144\": [201], \"820976270639292\": [201], \"830506996571544\": [201], \"835567606030461\": [201], \"836982323489185\": [201], \"860210700371585\": [201], \"870815004132635\": [201], \"876888038506266\": [201], \"884456650670029\": [201], \"893915017062331\": [201], \"902358906593190\": [201], \"937130179358141\": [201], \"947462708051771\": [201], \"958549480584791\": [201], \"991786633438918\": [201], \"1003706164087139\": [201], \"1017432414969433\": [201], \"1060964007653270\": [201], \"1075520057734223\": [201], \"1097036351240365\": [201], \"1100485334805616\": [201], \"1102709029284409\": [201], \"1108109366559790\": [201], \"1132533238161930\": [201], \"1138882566797847\": [201], \"1140334908428827\": [201], \"1140978689328860\": [201], \"1141358484754370\": [201], \"1147856635337766\": [201], \"1149859754057319\": [201], \"1156108623222019\": [201], \"1158332938137288\": [201], \"1163982198761717\": [201], \"1168856596409714\": [201], \"1188879900225256\": [201], \"1194994639145223\": [201], \"1198504034991418\": [201], \"1207705717654311\": [201], \"1217704507818923\": [201], \"1243967225052122\": [201], \"1245816885076600\": [201], \"1250394771314603\": [201], \"1275277584936870\": [201], \"1282805064459123\": [201], \"1297142062646069\": [201], \"1300734114223911\": [201], \"1304579544156546\": [201], \"1325105945243045\": [201], \"1325880536195852\": [201], \"1331620138243907\": [201], \"1340142053189959\": [201], \"1341056039384211\": [201], \"1346153539817428\": [201], \"1350573964498633\": [201], \"1352179949520117\": [201], \"1370236218149841\": [201], \"1396299747291170\": [201], \"1396737983856138\": [201], \"1402153580733857\": [201], \"1403507365256538\": [201], \"1407570060776159\": [201], \"1418672243187610\": [201], \"1442450169026342\": [201], \"1442667040617666\": [201], \"1464341697678878\": [201], \"1465570493913423\": [201], \"1487555602629223\": [201], \"1489138355617241\": [201], \"1490108744092588\": [201], \"1492210873197668\": [201], \"1500840557484266\": [201], \"1523291285422917\": [201], \"1556328723480323\": [201], \"1574673368458998\": [201], \"1582216342147004\": [201], \"1584562361477530\": [201], \"1584580201342206\": [201], \"1613756014752074\": [201], \"1620038983317120\": [201], \"1626079573118911\": [201], \"1644134626794663\": [201], \"1654097985563011\": [201], \"1665537417691967\": [201], \"1670459258658688\": [201], \"1670542546001691\": [201], \"1672801158400120\": [201], \"1674162523451589\": [201], \"1687505585245005\": [201], \"1688966133175948\": [201], \"1704469571428976\": [201], \"1715363742519159\": [201], \"1726660028167080\": [201], \"1728892087170449\": [201], \"1770175378346274\": [201], \"1778352428854204\": [201], \"1807686194229722\": [201], \"1807975427341585\": [201], \"1817145314970484\": [201], \"1824763509285723\": [201], \"10356606451944\": [248], \"50846087379525\": [248], \"69691204772858\": [248], \"159994062109567\": [248], \"176085048818303\": [248], \"218866079441959\": [248], \"254467563218666\": [248], \"254655368653824\": [248], \"266225841657888\": [248], \"274858173893190\": [248], \"304443526889147\": [248], \"323837514256167\": [248], \"351664112186742\": [248], \"357853580890613\": [248], \"361023421752499\": [248], \"373023117511905\": [248], \"448953996547397\": [248], \"530533332700132\": [248], \"550709445172167\": [248], \"562681057949892\": [248], \"567219970127035\": [248], \"594829803822288\": [248], \"623072293638711\": [248], \"629798119569985\": [248], \"634196622967593\": [248], \"639600633181945\": [248], \"670084939387183\": [248], \"702970955786576\": [248], \"710210632713497\": [248], \"723958097890662\": [248], \"725850339489298\": [248], \"727015227209359\": [248], \"735091025433632\": [248], \"742468209290382\": [248], \"761045632725273\": [248], \"780370287168793\": [248], \"795452768633432\": [248], \"796564971090913\": [248], \"805912028609014\": [248], \"806584593916395\": [248], \"819001473290091\": [248], \"828798527900890\": [248], \"857103136548806\": [248], \"869763586879858\": [248], \"870060022464566\": [248], \"879235562985110\": [248], \"889494204071226\": [248], \"908496438696244\": [248], \"913594683533172\": [248], \"918854653842376\": [248], \"919554558418488\": [248], \"920098949408748\": [248], \"921971831342467\": [248], \"942602663976216\": [248], \"944985834328038\": [248], \"978420361082895\": [248], \"981696270771844\": [248], \"1025851666534018\": [248], \"1034649941115386\": [248], \"1050496092885930\": [248], \"1058550120165667\": [248], \"1063118016013165\": [248], \"1066470319828144\": [248], \"1084693343966605\": [248], \"1104589558038365\": [248], \"1111746559361127\": [248], \"1134584691803549\": [248], \"1141135886669386\": [248], \"1179413759146304\": [248], \"1192906982945469\": [248], \"1193457251032360\": [248], \"1202256005102043\": [248], \"1203293429436001\": [248], \"1226357969679248\": [248], \"1227429511643849\": [248], \"1229582796279831\": [248], \"1287832574862226\": [248], \"1309552810571523\": [248], \"1334256502307258\": [248], \"1336932160026986\": [248], \"1339983241216891\": [248], \"1378211687471245\": [248], \"1392496801868961\": [248], \"1400956420506176\": [248], \"1424940444251853\": [248], \"1430248879040694\": [248], \"1434158231000438\": [248], \"1483328009005139\": [248], \"1484982169874087\": [248], \"1507490961306107\": [248], \"1528045813679110\": [248], \"1529934571466083\": [248], \"1549036413912923\": [248], \"1593699738436780\": [248], \"1606897465519932\": [248], \"1617822463960770\": [248], \"1628234476285176\": [248], \"1637838901614378\": [248], \"1655644753354562\": [248], \"1695856403173962\": [248], \"1704981514223087\": [248], \"1716764297525059\": [248], \"1729815585727377\": [248], \"1749225008610314\": [248], \"1768774139193729\": [248], \"1788564601859855\": [248], \"1797978536169278\": [248], \"1801618440133966\": [248], \"1819961845440450\": [248], \"6772685257758\": [504], \"7956844007741\": [504], \"8139633308111\": [504], \"14871332675397\": [504], \"16766666693099\": [504], \"17573386964148\": [504], \"22554911687551\": [504], \"30512201060548\": [504], \"51696738040867\": [504], \"76779974146560\": [504], \"80311714788214\": [504], \"93123087074314\": [504], \"99004232808377\": [504], \"111077615866021\": [504], \"119161387157333\": [504], \"135894353903281\": [504], \"141132016003093\": [504], \"193303464355586\": [504], \"204044426042543\": [504], \"207895820163498\": [504], \"217182548203423\": [504], \"242775234180487\": [504], \"253612795091201\": [504], \"255472866356061\": [504], \"262088038688129\": [504], \"270821415482711\": [504], \"271687624926332\": [504], \"308870260165414\": [504], \"319819294637758\": [504], \"319947798638042\": [504], \"342703966652494\": [504], \"390680680614162\": [504], \"396997119946091\": [504], \"403587463183771\": [504], \"406068062701933\": [504], \"406085092479009\": [504], \"409150895113845\": [504], \"412134151877840\": [504], \"443910440262831\": [504], \"451749044573877\": [504], \"451877835865939\": [504], \"495406157051123\": [504], \"497509079828828\": [504], \"504861019513426\": [504], \"506245306392901\": [504], \"514871800090554\": [504], \"518793267461215\": [504], \"520891747558015\": [504], \"527133919210056\": [504], \"534097730357390\": [504], \"555082547969915\": [504], \"556233412088012\": [504], \"558174183181404\": [504], \"566374875419586\": [504], \"570476430120600\": [504], \"576190037556108\": [504], \"576474146002029\": [504], \"586276483955244\": [504], \"590383660180725\": [504], \"597485660431290\": [504], \"600240735738331\": [504], \"608824150040077\": [504], \"610760180824427\": [504], \"625790750997538\": [504], \"632085514381261\": [504], \"663344606426047\": [504], \"687766084291147\": [504], \"695703215449668\": [504], \"696103631509522\": [504], \"722005323085321\": [504], \"724684027360969\": [504], \"740340235526952\": [504], \"759372755744411\": [504], \"795809410921646\": [504], \"795820783311775\": [504], \"800272132917362\": [504], \"804952519990862\": [504], \"811604782769610\": [504], \"813840626364744\": [504], \"818417893544296\": [504], \"832317320894474\": [504], \"846440855257240\": [504], \"846940824242457\": [504], \"861552698145929\": [504], \"890838597479118\": [504], \"891185916623408\": [504], \"898230684134206\": [504], \"911791438219422\": [504], \"918561601724450\": [504], \"933264709213474\": [504], \"938878656256270\": [504], \"944591050733560\": [504], \"972296873274865\": [504], \"994989559212220\": [504], \"1005537002530086\": [504], \"1014376379709221\": [504], \"1018137502288184\": [504], \"1021868498489438\": [504], \"1029927402972459\": [504], \"1059751655805403\": [504], \"1062620336100211\": [504], \"1090373669071926\": [504], \"1117918079837329\": [504], \"1119162842137924\": [504], \"1121203794763033\": [504], \"1139230833269483\": [504], \"1147266885130883\": [504], \"1167371635288863\": [504], \"1190024264967898\": [504], \"1207546463508409\": [504], \"1216258883860550\": [504], \"1221878525400413\": [504], \"1242682384540614\": [504], \"1253920740893069\": [504], \"1263502686377011\": [504], \"1272967324008112\": [504], \"1275322903540855\": [504], \"1276624339117663\": [504], \"1280475670307844\": [504], \"1281940989682502\": [504], \"1285058822392139\": [504], \"1305261982538101\": [504], \"1327470260761597\": [504], \"1339296051217322\": [504], \"1348498932467780\": [504], \"1348653121581243\": [504], \"1349535444775334\": [504], \"1350875039105119\": [504], \"1368165057645955\": [504], \"1368509788742396\": [504], \"1383899623996334\": [504], \"1396726704477157\": [504], \"1423695601687776\": [504], \"1425209091451988\": [504], \"1433785826383097\": [504], \"1437874942601307\": [504], \"1442999041092969\": [504], \"1480256949509498\": [504], \"1481119085455788\": [504], \"1489954540704758\": [504], \"1499003755149590\": [504], \"1507363959257160\": [504], \"1519180619455053\": [504], \"1545663483172692\": [504], \"1546711816704409\": [504], \"1547561747964156\": [504], \"1552461548792513\": [504], \"1555002951730117\": [504], \"1561353892895013\": [504], \"1565482535848855\": [504], \"1595018649879575\": [504], \"1609420913480897\": [504], \"1647242466538063\": [504], \"1655449646894147\": [504], \"1660653494622274\": [504], \"1664178639626031\": [504], \"1701361909291047\": [504], \"1704779363478047\": [504], \"1740128864215349\": [504], \"1746071430087967\": [504], \"1753810361573287\": [504], \"1762289034118993\": [504], \"1764673607713289\": [504], \"916348910336\": [296], \"10238419296757\": [296], \"60611948654397\": [296], \"70004335185916\": [296], \"83787624525377\": [296], \"95392626356876\": [296], \"106977747730570\": [296], \"107780385835749\": [296], \"168467011952704\": [296], \"173593419141263\": [296], \"176552255309355\": [296], \"184264391600645\": [296], \"190884821053794\": [296], \"208776392663494\": [296], \"209059611359375\": [296], \"219223944748989\": [296], \"226022659159735\": [296], \"229427902482165\": [296], \"275600531940460\": [296], \"320884122099366\": [296], \"321489005600381\": [296], \"332448430032988\": [296], \"336322367889481\": [296], \"344728844904652\": [296], \"350364628839227\": [296], \"363518078926071\": [296], \"384230937365443\": [296], \"408653367044338\": [296], \"427501807378559\": [296], \"465218068175540\": [296], \"516787282887698\": [296], \"563409822442510\": [296], \"571858960714115\": [296], \"584175777896186\": [296], \"585344029844817\": [296], \"587757578993060\": [296], \"590445327349238\": [296], \"603249255698076\": [296], \"617190833955199\": [296], \"644121069175240\": [296], \"688200624783606\": [296], \"693910894561117\": [296], \"704682977502677\": [296], \"705068823423813\": [296], \"721679403076069\": [296], \"731229007962505\": [296], \"733300283119185\": [296], \"736636912564865\": [296], \"740585127421834\": [296], \"752108752301147\": [296], \"755260694303539\": [296], \"766232877108188\": [296], \"790864812488112\": [296], \"805093761769034\": [296], \"814167052543007\": [296], \"815206626021245\": [296], \"817114136627187\": [296], \"820493826138959\": [296], \"822157743365995\": [296], \"823566332150057\": [296], \"842448904427503\": [296], \"851782275902367\": [296], \"900057569103936\": [296], \"905514587756490\": [296], \"910986747993763\": [296], \"932468051114026\": [296], \"933541801128356\": [296], \"935846410504786\": [296], \"938606808947391\": [296], \"942804047036243\": [296], \"970492289816902\": [296], \"997914743180773\": [296], \"1004728451047732\": [296], \"1028940863381140\": [296], \"1031524714223828\": [296], \"1041516965158553\": [296], \"1048126569503717\": [296], \"1048633098695548\": [296], \"1050133474720405\": [296], \"1074933078796559\": [296], \"1095676546353357\": [296], \"1124970058574315\": [296], \"1126828397086088\": [296], \"1135514021578142\": [296], \"1161609275326172\": [296], \"1197170436377410\": [296], \"1207433365021652\": [296], \"1207981353438158\": [296], \"1218906637093373\": [296], \"1223065840478692\": [296], \"1243288959493967\": [296], \"1256707258365001\": [296], \"1265120451720787\": [296], \"1273398107074314\": [296], \"1295121050595617\": [296], \"1307145295960262\": [296], \"1336156185513215\": [296], \"1367227167964903\": [296], \"1390390079491203\": [296], \"1401532233537586\": [296], \"1403768656552812\": [296], \"1414421961887989\": [296], \"1420525523218843\": [296], \"1428183620395538\": [296], \"1441048294111858\": [296], \"1450369887034507\": [296], \"1502245002190345\": [296], \"1502537613938621\": [296], \"1539266856944908\": [296], \"1547648269545523\": [296], \"1548620195553666\": [296], \"1556568648656397\": [296], \"1566600481636437\": [296], \"1570629455507817\": [296], \"1589685419984236\": [296], \"1595008771365341\": [296], \"1614551541628365\": [296], \"1618608500249109\": [296], \"1620987502440850\": [296], \"1632951407275338\": [296], \"1659400452967030\": [296], \"1667689398259383\": [296], \"1672817832780225\": [296], \"1688791780897468\": [296], \"1692879335637161\": [296], \"1709232882728779\": [296], \"1737300792110006\": [296], \"1741817744571278\": [296], \"1761153067772030\": [296], \"1773586482835610\": [296], \"1779329016399769\": [296], \"1809508643437262\": [296], \"1814096300112721\": [296], \"1816814515152494\": [296], \"1823386103112140\": [296], \"1824663927288222\": [296], \"26598881261966\": [723], \"26995963342780\": [723], \"34865822286684\": [723], \"61519279481085\": [723], \"69632947677053\": [723], \"74181098342824\": [723], \"76947330084037\": [723], \"78939362198331\": [723], \"83389649421811\": [723], \"95079969148548\": [723], \"100280089875713\": [723], \"106063333728477\": [723], \"121107752724444\": [723], \"126083888157960\": [723], \"133465235865445\": [723], \"135587014575394\": [723], \"136828184208673\": [723], \"137696691391627\": [723], \"138540272702418\": [723], \"164397154272867\": [723], \"174964164376104\": [723], \"177538753393358\": [723], \"184932757747729\": [723], \"194287708485930\": [723], \"198325966384583\": [723], \"208181485556544\": [723], \"224055033409067\": [723], \"241118611756880\": [723], \"268854391585074\": [723], \"275824268434181\": [723], \"280131378310460\": [723], \"296782510605821\": [723], \"299302748039088\": [723], \"303932400095607\": [723], \"326704922022891\": [723], \"328181420353325\": [723], \"337599450033192\": [723], \"342836285681129\": [723], \"347856115460301\": [723], \"349893803882163\": [723], \"361495496099029\": [723], \"363554534628570\": [723], \"371145327094989\": [723], \"372414163453248\": [723], \"447360316332098\": [723], \"453403460962120\": [723], \"470088473935728\": [723], \"486705134072346\": [723], \"490198609456906\": [723], \"505608939920105\": [723], \"513536367210561\": [723], \"522466751472767\": [723], \"527909610831435\": [723], \"535957261693406\": [723], \"543160021939651\": [723], \"557988057120954\": [723], \"558079239336324\": [723], \"562808958891209\": [723], \"596314870352942\": [723], \"605078074272563\": [723], \"607567774505092\": [723], \"613745487350935\": [723], \"619584996364355\": [723], \"621283121287326\": [723], \"624160861037863\": [723], \"625878087044058\": [723], \"632662038947939\": [723], \"635655382906121\": [723], \"635731073723674\": [723], \"640386358408388\": [723], \"641760363740515\": [723], \"653839092931183\": [723], \"654439202844920\": [723], \"660340113729327\": [723], \"671717874136857\": [723], \"684654516672751\": [723], \"685119958987927\": [723], \"686718099954881\": [723], \"692705545164798\": [723], \"700284708953564\": [723], \"702750267828607\": [723], \"713383476624725\": [723], \"717973976234650\": [723], \"731818906160344\": [723], \"735252776981246\": [723], \"738101974264578\": [723], \"743990172587019\": [723], \"745559007045531\": [723], \"751191510070593\": [723], \"753439313702476\": [723], \"791027032806060\": [723], \"795990551622149\": [723], \"796794667950268\": [723], \"805278835753094\": [723], \"812534939791946\": [723], \"816808055486158\": [723], \"826824065199109\": [723], \"828660432714352\": [723], \"831070765612389\": [723], \"839343062510078\": [723], \"841291709424595\": [723], \"847411599623815\": [723], \"867413305027173\": [723], \"876406259967109\": [723], \"876817004457970\": [723], \"886148791439184\": [723], \"892847913611501\": [723], \"911114698976031\": [723], \"929387583397395\": [723], \"940326230392474\": [723], \"941052560208645\": [723], \"942729775630277\": [723], \"943469762732277\": [723], \"945243072734084\": [723], \"946126968361956\": [723], \"950158179695402\": [723], \"960228859186013\": [723], \"979633138612076\": [723], \"992622256153927\": [723], \"996326740413727\": [723], \"1006609375190615\": [723], \"1011535519908357\": [723], \"1014906965748363\": [723], \"1017263018087669\": [723], \"1018534083610879\": [723], \"1022367112135220\": [723], \"1037084579606367\": [723], \"1041887177317111\": [723], \"1049531351568126\": [723], \"1057941375993771\": [723], \"1098908533258259\": [723], \"1099383184091004\": [723], \"1108980571505292\": [723], \"1112909274629896\": [723], \"1115429845709725\": [723], \"1118346574085705\": [723], \"1128530345052184\": [723], \"1138824295701933\": [723], \"1142374958486451\": [723], \"1154862674747843\": [723], \"1157244360230357\": [723], \"1158766669153572\": [723], \"1164459497465255\": [723], \"1184611685559478\": [723], \"1199942880359141\": [723], \"1201984333538271\": [723], \"1204226813053844\": [723], \"1229009259971400\": [723], \"1231915923827754\": [723], \"1242319410430751\": [723], \"1244802044893357\": [723], \"1257509586698746\": [723], \"1268884680049210\": [723], \"1289099521247469\": [723], \"1291799339126795\": [723], \"1311284282692722\": [723], \"1315367976909773\": [723], \"1317436915838730\": [723], \"1322101868115471\": [723], \"1322985404147926\": [723], \"1334448132274893\": [723], \"1335406028174203\": [723], \"1342099584282573\": [723], \"1357816258281115\": [723], \"1366028986983673\": [723], \"1383077160885421\": [723], \"1389913771135339\": [723], \"1390303966468339\": [723], \"1391712601113733\": [723], \"1404645013942926\": [723], \"1408248592018201\": [723], \"1409099591516664\": [723], \"1409924760511915\": [723], \"1412037829450629\": [723], \"1429791910087821\": [723], \"1431876995510347\": [723], \"1433482792947716\": [723], \"1435901694793899\": [723], \"1438280888169616\": [723], \"1440861341022033\": [723], \"1475811491088142\": [723], \"1483291683687321\": [723], \"1489860220532186\": [723], \"1502386982615998\": [723], \"1511795573007037\": [723], \"1512670204545963\": [723], \"1513807407020469\": [723], \"1521550495121377\": [723], \"1526224967867069\": [723], \"1532245049434978\": [723], \"1538179457398969\": [723], \"1538208992539879\": [723], \"1559904539229310\": [723], \"1562023798563030\": [723], \"1565882767724666\": [723], \"1566603512475682\": [723], \"1567623456564890\": [723], \"1569355103983045\": [723], \"1604729686242762\": [723], \"1606053772817649\": [723], \"1624020510392624\": [723], \"1625772058701984\": [723], \"1644929121012136\": [723], \"1647322828427900\": [723], \"1650423827356248\": [723], \"1659076995212818\": [723], \"1662733419053271\": [723], \"1679058248444574\": [723], \"1680138563850417\": [723], \"1692649602815501\": [723], \"1700312380848546\": [723], \"1700643901104873\": [723], \"1702111474939893\": [723], \"1704371624982106\": [723], \"1712974170436674\": [723], \"1715069603823713\": [723], \"1736753411072783\": [723], \"1737613180042485\": [723], \"1738472017888514\": [723], \"1740197949912181\": [723], \"1746711221570572\": [723], \"1757209303063415\": [723], \"1759744460345169\": [723], \"1774369760742908\": [723], \"1784227512215486\": [723], \"1793928342972028\": [723], \"1799690339917964\": [723], \"1801749126017526\": [723], \"1803215749086816\": [723], \"1814455795897346\": [723], \"1546382602244\": [38], \"9656868519272\": [38], \"23022543468726\": [38], \"28317189440418\": [38], \"41280726133805\": [38], \"66960113329393\": [38], \"72652244604468\": [38], \"72987082939193\": [38], \"93603632485639\": [38], \"94372221234209\": [38], \"95803555452107\": [38], \"96189277714686\": [38], \"98204962844834\": [38], \"99291828928919\": [38], \"105771165192346\": [38], \"107960764418249\": [38], \"111428825192941\": [38], \"127274207264390\": [38], \"140215841784768\": [38], \"140605527581622\": [38], \"142232850272699\": [38], \"145924186970433\": [38], \"150127562207023\": [38], \"155682932216255\": [38], \"159001134887689\": [38], \"164388214546473\": [38], \"173794201733501\": [38], \"186124795839659\": [38], \"190963456940444\": [38], \"194039429765196\": [38], \"226438983265190\": [38], \"235651723624481\": [38], \"238048993345481\": [38], \"249975135143449\": [38], \"267074725930899\": [38], \"270342483362557\": [38], \"280132684676074\": [38], \"300128441651611\": [38], \"316505175229988\": [38], \"325519145492999\": [38], \"331036651754826\": [38], \"333546831132357\": [38], \"339312791908298\": [38], \"367926290537692\": [38], \"381453341363664\": [38], \"406460060374332\": [38], \"428682354107007\": [38], \"431291775730353\": [38], \"441722950852645\": [38], \"448992122346447\": [38], \"477655250940470\": [38], \"477750102449067\": [38], \"477985950174589\": [38], \"480198316139604\": [38], \"491608171514200\": [38], \"495502740648975\": [38], \"519965149014263\": [38], \"524965228749517\": [38], \"531138835074212\": [38], \"533415256881126\": [38], \"541580701997867\": [38], \"552203173994680\": [38], \"559004439467633\": [38], \"562793249377929\": [38], \"562879802277703\": [38], \"587055287418925\": [38], \"589312120159525\": [38], \"597739816579553\": [38], \"608423992734323\": [38], \"614217354495893\": [38], \"615459930701230\": [38], \"615791016313951\": [38], \"625698543331114\": [38], \"646824347329197\": [38], \"667158191608223\": [38], \"669124584026739\": [38], \"720023354205321\": [38], \"723110102710602\": [38], \"729489459296287\": [38], \"730438631834823\": [38], \"749611574327872\": [38], \"756371653009437\": [38], \"759680015332124\": [38], \"762510262097309\": [38], \"763564254757376\": [38], \"766760371827669\": [38], \"768032693645756\": [38], \"771127212739497\": [38], \"782144581578897\": [38], \"784975368234061\": [38], \"799539922825962\": [38], \"819980663198132\": [38], \"823882385515799\": [38], \"826776608053620\": [38], \"840828370189348\": [38], \"852418152547474\": [38], \"852799198713520\": [38], \"855454436267264\": [38], \"866696616176181\": [38], \"867213129529998\": [38], \"876309521298385\": [38], \"885125028078863\": [38], \"909019726936576\": [38], \"909779712705126\": [38], \"916050873987175\": [38], \"927218551670748\": [38], \"928864246605368\": [38], \"930417395222212\": [38], \"941110207197902\": [38], \"955243957079948\": [38], \"966301070196790\": [38], \"989911402764299\": [38], \"995181259057379\": [38], \"1002350630585950\": [38], \"1012856342746104\": [38], \"1014127973930724\": [38], \"1022663693402515\": [38], \"1035776199846468\": [38], \"1038102561676599\": [38], \"1054756736331100\": [38], \"1057487646410902\": [38], \"1062472050386420\": [38], \"1078792937948355\": [38], \"1079268349078254\": [38], \"1081877113080133\": [38], \"1088174794493924\": [38], \"1119862443959162\": [38], \"1134261531316139\": [38], \"1157033641669577\": [38], \"1162236359054384\": [38], \"1167266432939449\": [38], \"1167742077190225\": [38], \"1176654542862639\": [38], \"1217545566354888\": [38], \"1226508956619832\": [38], \"1253324060639472\": [38], \"1270568848112648\": [38], \"1281774363818117\": [38], \"1299213939456440\": [38], \"1303115317709160\": [38], \"1305464820564814\": [38], \"1307819791004830\": [38], \"1309074404765591\": [38], \"1311250718219883\": [38], \"1327589370379644\": [38], \"1335123441609714\": [38], \"1348262711969291\": [38], \"1371091180108917\": [38], \"1374368677198015\": [38], \"1377678539029900\": [38], \"1391949712810566\": [38], \"1394148237651533\": [38], \"1397236581360400\": [38], \"1402428225174714\": [38], \"1428382328937422\": [38], \"1431557607118119\": [38], \"1441559140548570\": [38], \"1445089604147204\": [38], \"1448617435830484\": [38], \"1477041049132630\": [38], \"1511338704810222\": [38], \"1521422840867651\": [38], \"1537983521926132\": [38], \"1539320867575362\": [38], \"1569677530496022\": [38], \"1573488765296414\": [38], \"1577865237666845\": [38], \"1590413900683188\": [38], \"1591774836066005\": [38], \"1605993198328440\": [38], \"1611305741679768\": [38], \"1613114021117770\": [38], \"1623535737008266\": [38], \"1632442965615300\": [38], \"1636460128406331\": [38], \"1643515657796596\": [38], \"1650598737168923\": [38], \"1670067443802112\": [38], \"1671758592552230\": [38], \"1678998318119428\": [38], \"1693828967529278\": [38], \"1700524824651835\": [38], \"1702169840496522\": [38], \"1712577664695818\": [38], \"1721553791636839\": [38], \"1723798153586017\": [38], \"1729414678531026\": [38], \"1747039637991800\": [38], \"1751666526384185\": [38], \"1759510552400668\": [38], \"1761856912383455\": [38], \"1773603088467393\": [38], \"1787003318829899\": [38], \"1788164904348957\": [38], \"1799047439290001\": [38], \"1800521778298568\": [38], \"1807254257169762\": [38], \"1825859169439057\": [38], \"1826104878054981\": [38], \"1833465377439232\": [38]}, \"ident_to_name\": {\"TARA_ANW_MAG_00051\": \"TARA_ANW_MAG_00051\", \"TARA_ANW_MAG_00083\": \"TARA_ANW_MAG_00083\", \"TARA_ANW_MAG_00084\": \"TARA_ANW_MAG_00084\", \"TARA_ANW_MAG_00085\": \"TARA_ANW_MAG_00085\", \"TARA_ASE_MAG_00007\": \"TARA_ASE_MAG_00007\", \"TARA_ASE_MAG_00009\": \"TARA_ASE_MAG_00009\", \"TARA_ASE_MAG_00015\": \"TARA_ASE_MAG_00015\", \"TARA_ASE_MAG_00018\": \"TARA_ASE_MAG_00018\", \"TARA_ASE_MAG_00028\": \"TARA_ASE_MAG_00028\", \"TARA_ASE_MAG_00031\": \"TARA_ASE_MAG_00031\"}, \"ident_to_idx\": {\"TARA_ASE_MAG_00031\": 38, \"TARA_ASE_MAG_00007\": 201, \"TARA_ASE_MAG_00009\": 248, \"TARA_ANW_MAG_00051\": 255, \"TARA_ASE_MAG_00018\": 296, \"TARA_ANW_MAG_00085\": 336, \"TARA_ANW_MAG_00083\": 443, \"TARA_ASE_MAG_00015\": 504, \"TARA_ASE_MAG_00028\": 723, \"TARA_ANW_MAG_00084\": 746}, \"idx_to_lid\": {\"38\": 9, \"201\": 3, \"248\": 19, \"255\": 25, \"296\": 19, \"336\": 13, \"443\": 13, \"504\": 18, \"723\": 33, \"746\": 94}}\n"
  },
  {
    "path": "tests/test-data/lca/old-db-format-1.json",
    "content": "{\"version\": \"1.0\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"lineages\": {\"0\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Proteobacteria\", \"class\": \"Alphaproteobacteria\", \"order\": \"Rickettsiales\"}, \"17\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Chloroflexi\", \"class\": \"Dehalococcoidetes\"}, \"6\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Proteobacteria\", \"class\": \"Gammaproteobacteria\"}, \"25\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Candidatus_Marinimicrobia \"}, \"11\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Proteobacteria\", \"class\": \"Alphaproteobacteria\", \"order\": \"Rhodospirillales\", \"family\": \"Rhodospirillaceae\"}, \"12\": {\"superkingdom\": \"Archaea\", \"phylum\": \"Euryarchaeota\"}, \"14\": {\"superkingdom\": \"Bacteria\", \"phylum\": \"Bacteroidetes\", \"class\": \"Flavobacteriia\", \"order\": \"Flavobacteriales\"}}, \"hashval_assignments\": {\"651968974610436\": [6], \"154651791843334\": [17], \"1837272077295623\": [0], \"1382414274551816\": [0], \"662684936798217\": [17], \"108203963523507\": [0], \"600287836839255\": [14], \"1825012166950925\": [6], \"1373617058836495\": [0], \"1447443911041043\": [0], \"550644769509398\": [0], \"1592392857473058\": [0], \"1577978353434659\": [11], \"653540232421414\": [0], \"450355571187752\": [0], \"35046909730857\": [6], \"623920338952235\": [11], \"1192156169192797\": [11], \"249794725957680\": [0], \"1643665429870600\": [14], \"682621507563573\": [11], \"1453240476698633\": [14], \"1109210655998008\": [0], \"760032400710324\": [14], \"69222511390780\": [11], \"446917768548417\": [14], \"1780019298955332\": [0], \"302114445987910\": [11], \"91012099780685\": [12], \"1274575616589903\": [0], \"662834992037969\": [14], \"1480608662847573\": [14], \"1034583203792866\": [14], \"1381232621944922\": [17], \"168141435154447\": [6], \"1789129435832413\": [6], \"1235998531395678\": [12], \"839869267775584\": [0], \"610469443956833\": [11], \"1192961511333986\": [14], \"473800104882275\": [11], \"1018985563127910\": [6], \"494489285902441\": [11], \"738663550918765\": [11], \"1358251717144690\": [0], \"174318537322611\": [11], \"714354750443640\": [11], \"1644449340371067\": [17], \"1476954417971324\": [0], \"1093395863642239\": [14], \"685004638908548\": [0], \"1789070117978249\": [12], \"135993103089803\": [14], \"1206023274000524\": [12], \"1212426837627024\": [0], \"1720273421873298\": [14], \"69206433906837\": [0], \"377794951135383\": [0], \"339385806839963\": [0], \"683029401911453\": [11], \"1839374171578526\": [0], \"899848155791521\": [0], \"859261072067270\": [0], \"1408246134984875\": [25], \"1583002478354607\": [17], \"1071595606716594\": [0], \"873474524304755\": [0], \"247881006543029\": [11], \"758215116402871\": [11], \"1326048486469817\": [6], \"318322734402250\": [6], \"435726313541822\": [17], \"847249422774463\": [11], \"1413830391996613\": [12], \"554500850208966\": [0], \"462595004203208\": [6], \"1579724710322379\": [0], \"1516624293552334\": [0], \"256944922734799\": [0], \"912467163508945\": [17], \"1714892081311954\": [14], \"868131709579478\": [0], \"777181673746647\": [14], \"1708528274854104\": [0], \"722539919614169\": [11], \"1360492291793115\": [0], \"1699124986331356\": [0], \"8581313229021\": [6], \"1538828462063838\": [14], \"699031394079440\": [0], \"1112160031305766\": [14], \"1234304032112874\": [0], \"1708928874057963\": [6], \"649798580801772\": [0], \"1112281528512751\": [14], \"1820646094225648\": [0], \"6208355280936\": [17], \"533538808049909\": [14], \"1809303911710966\": [0], \"1457140797890808\": [0], \"995624953831674\": [0], \"886743167308030\": [0], \"1590055647252735\": [25], \"578030841329163\": [0], \"1622299095937281\": [17], \"1791580146020614\": [0], \"630652727169289\": [11], \"1159404884914444\": [0], \"224668157092109\": [11], \"45314565001486\": [14], \"397593722447917\": [25], \"1212657565188368\": [0], \"583020969347118\": [0], \"1806587563187986\": [6], \"91204535361819\": [12], \"1097255462428957\": [6], \"423992680198431\": [14], \"1386823566807088\": [0], \"1839083638444324\": [0], \"727363858023132\": [0], \"220827075698986\": [14], \"947154315781511\": [11], \"1590163477868845\": [25], \"1021990675672011\": [17], \"566132268978482\": [12], \"894722334609720\": [11], \"351896981111098\": [0], \"672426580955871\": [0], \"707306922556810\": [6], \"759305600289981\": [25], \"816677045707073\": [14], \"155467636752706\": [14], \"379094350614852\": [6], \"720971869446471\": [14], \"1663726558028104\": [0], \"158842808254794\": [0], \"1525738270622028\": [17], \"127354562455109\": [0], \"117216836788564\": [14], \"392358579933525\": [6], \"303810296308056\": [25], \"1762473214148953\": [0], \"899193167683932\": [0], \"1221845510881630\": [14], \"1690821057958241\": [25], \"85363502931963\": [11], \"997803575325414\": [0], \"89201982906726\": [11], \"36157092385127\": [14], \"1733342874210664\": [11], \"1109251111784810\": [0], \"999475118350701\": [25], \"899931227271534\": [11], \"1434953058963826\": [0], \"680583069966707\": [11], \"239541989805406\": [11], \"1709313640767862\": [14], \"429897910485367\": [14], \"3082991534458\": [0], \"740565381792126\": [0], \"1168340864401791\": [11], \"671314740322689\": [25], \"476934557413763\": [0], \"1056242160554372\": [14], \"978931950435734\": [6], \"966164366078342\": [17], \"1069875943116865\": [14], \"666983937917321\": [0], \"1195232383066510\": [0], \"1071206204977552\": [12], \"1624853577729432\": [17], \"851184409248712\": [0], \"1597887774957974\": [6], \"176247281074587\": [14], \"1343686747529632\": [14], \"1311399934673648\": [0], \"1512325758767524\": [11], \"1662761070778222\": [11], \"620130259956137\": [0], \"1102561612587436\": [25], \"1019683988509104\": [0], \"1648082018038194\": [14], \"437726442738099\": [17], \"424623099048372\": [0], \"1120450706842038\": [11], \"1513468978680247\": [25], \"944691748856249\": [17], \"1388629028462832\": [11], \"884548610146747\": [0], \"1635926261617086\": [6], \"805822729163199\": [14], \"1368643180327364\": [0], \"768088688667382\": [14], \"92446352601544\": [11], \"400440609219021\": [6], \"1227462289314255\": [0], \"708523872727504\": [11], \"1075237955167216\": [14], \"1089557102031316\": [0], \"1606106653479381\": [14], \"637278824563158\": [6], \"1351034322121175\": [6], \"1414729661325784\": [6], \"350967281668571\": [11], \"782992626561501\": [14], \"331551678570974\": [17], \"1524721409107365\": [11], \"266991875575632\": [11], \"374323998298593\": [0], \"1382793403064174\": [17], \"1487403213599213\": [17], \"455970982162927\": [11], \"745952201173799\": [6], \"737311651381749\": [12], \"426807067709942\": [0], \"1648428886098687\": [14], \"1315482081623467\": [17], \"888380375659008\": [0], \"1146866957201922\": [11], \"1306694273434115\": [14], \"317225954152968\": [0], \"1200829090238985\": [11], \"1745104686252554\": [11], \"1237873623872013\": [0], \"548618821296654\": [6], \"1631609804784143\": [0], \"1095678110806546\": [12], \"663047496966675\": [0], \"947456280478229\": [6], \"487951568171543\": [11], \"1394929313362456\": [11], \"354246879167003\": [6], \"169863005970977\": [0], \"859341146829347\": [0], \"1671662012111622\": [14], \"1656512554062377\": [0], \"1420322178649275\": [6], \"230799060476680\": [0], \"1229526712418866\": [11], \"328850724708193\": [6], \"1753254255850036\": [11], \"1842706577351221\": [25], \"1473805881868854\": [0], \"370285270123063\": [25], \"223631234982456\": [0], \"1100244123136570\": [11], \"1831496353989179\": [14], \"1103974733230652\": [0], \"1022073164968511\": [14], \"337858815869507\": [0], \"1806265091342920\": [17], \"1278382741541450\": [11], \"845836091437649\": [6], \"524681348378723\": [0], \"1800434112651860\": [14], \"865889840214614\": [25], \"124307475703783\": [12], \"1737818062840410\": [0], \"1831642379952732\": [0], \"1203709304328798\": [0], \"1822996777733546\": [14], \"1053170459001440\": [12], \"1777492724682854\": [14], \"1011241770168934\": [17], \"417269856660241\": [11], \"1242108056916585\": [0], \"1153319578759790\": [25], \"903834492224114\": [0], \"343263666920894\": [11], \"383538170176118\": [0], \"95646383063673\": [25], \"399713105175162\": [25], \"1404752792392316\": [17], \"238651698141290\": [0], \"1782809577016768\": [6], \"1499096632133739\": [0], \"1003133984682629\": [0], \"938127756636807\": [0], \"644971206181512\": [6], \"873420144034441\": [17], \"750436094231183\": [0], \"1521500422349458\": [14], \"808192987447956\": [0], \"687321683378840\": [0], \"415059665295686\": [0], \"598951123417882\": [0], \"1639230893245086\": [11], \"958502896677536\": [0], \"1122003109687969\": [0], \"423234050937512\": [6], \"1525727913174313\": [11], \"1651663982109362\": [0], \"1415101073343155\": [11], \"618070161363637\": [25], \"674788366447286\": [17], \"42214249218747\": [17], \"410163772670652\": [6], \"1654047218909886\": [11], \"1760373763171009\": [17], \"1120685056103109\": [12], \"1474477255766726\": [0], \"1124248679539408\": [11], \"566297202288227\": [6], \"756361936683733\": [0], \"545171311145688\": [11], \"503604636418777\": [0], \"309560226091739\": [11], \"544911218549468\": [14], \"507114615939805\": [11], \"53195498578655\": [0], \"556274126422139\": [0], \"521929018897124\": [17], \"647894786679526\": [11], \"73462597817063\": [11], \"327890195454076\": [0], \"1302764744749803\": [14], \"1058908728074991\": [0], \"466850675798768\": [17], \"1087755718865650\": [6], \"1702853471929077\": [11], \"613668129645303\": [11], \"1555272336335611\": [0], \"1474859751633660\": [0], \"1333738194596607\": [11], \"632062004417280\": [6], \"1755377357569\": [0], \"170920680432388\": [0], \"694492312965896\": [0], \"1473369856693004\": [6], \"1092307189826319\": [0], \"1777719274562321\": [11], \"17158709879574\": [14], \"430145404703512\": [0], \"752579121317844\": [17], \"605373826335520\": [0], \"1731221741040419\": [11], \"139489397261097\": [14], \"1123616285016874\": [25], \"1654211925340972\": [6], \"241500458160945\": [11], \"1118987199996723\": [11], \"1270046182759902\": [0], \"21409341449014\": [14], \"401831972184201\": [0], \"393210025104184\": [14], \"138749504942907\": [0], \"1756717989991904\": [6], \"1540647316200246\": [0], \"827829009478471\": [0], \"707529578271543\": [14], \"233580637733710\": [0], \"31509610042191\": [0], \"1126018438419531\": [11], \"1816546939913041\": [0], \"1000311664055126\": [0], \"192436309662022\": [0], \"83249603674977\": [0], \"1024732275999586\": [12], \"1489727048643387\": [11], \"1755860788110182\": [14], \"1663734887887719\": [6], \"1030483418347210\": [0], \"604212745462633\": [14], \"1514600513913709\": [14], \"177202782585710\": [14], \"1434545464533873\": [25], \"239533658407794\": [11], \"109556514734963\": [14], \"734057025340276\": [0], \"1000149678699381\": [14], \"198414189130615\": [11], \"1730350408446840\": [0], \"1191409430201210\": [11], \"60920416732028\": [11], \"258505663669118\": [14], \"1088308856754065\": [6], \"1518411038946177\": [11], \"1288714151957995\": [11], \"244702817715076\": [11], \"1503936837642869\": [0], \"371785010691833\": [6], \"1298772684063625\": [14], \"1318947832296332\": [0], \"657589154384957\": [0], \"352749716046734\": [14], \"1206951136273296\": [14], \"1307140606473105\": [25], \"131536884986771\": [6], \"894610565157783\": [0], \"1323067332510620\": [17], \"397266036962206\": [11], \"311442628723617\": [0], \"352469674128290\": [11], \"501192188637884\": [6], \"1549214456685477\": [25], \"1063954908685224\": [0], \"101850861679530\": [17], \"689433751790507\": [12], \"228292122152680\": [0], \"1707543787860125\": [11], \"1227993007605704\": [0], \"1368939968260254\": [25], \"1793801105896376\": [11], \"1097163944661945\": [11], \"1755556270732219\": [11], \"1321148353561534\": [14], \"764311326727772\": [17], \"728003480372162\": [17], \"572952041939907\": [0], \"376776194679750\": [0], \"517501170885576\": [0], \"225777394635724\": [14], \"1521617215738831\": [0], \"87818569597906\": [0], \"1730265273177045\": [6], \"638237947802582\": [11], \"92860832822232\": [6], \"1524993903457246\": [12], \"1022398637712353\": [14], \"359340910691298\": [0], \"15178687472614\": [11], \"1277339966297064\": [0], \"1369792434246639\": [0], \"325758510711792\": [25], \"1401629327152116\": [0], \"225488005985269\": [25], \"1180093137069047\": [14], \"608271077234669\": [6], \"869671685914354\": [6], \"1546677782119422\": [0], \"228265434919935\": [14], \"708680645325824\": [14], \"1036606260474886\": [6], \"1768839507616777\": [12], \"1062093792453642\": [12], \"1593232436005719\": [25], \"315058803606541\": [0], \"1766133708956687\": [14], \"118451811599376\": [12], \"1134108273731197\": [0], \"565755888038935\": [25], \"27283909081946\": [25], \"161753588012910\": [12], \"84335993144356\": [0], \"219053234836518\": [11], \"74480273687593\": [11], \"1133974402917419\": [0], \"914563280602157\": [12], \"803727313826863\": [6], \"1167006070055984\": [11], \"404286438302771\": [11], \"421097157440564\": [11], \"516618314134585\": [12], \"1784222555980859\": [0], \"1443833302799420\": [11], \"1722636935798965\": [6], \"389767493190720\": [11], \"580629010932803\": [11], \"1067771085497413\": [0], \"1211551163495496\": [6], \"246275550180425\": [14], \"1737427055940683\": [0], \"1022176283628620\": [0], \"1495386374055437\": [17], \"1397887457403984\": [14], \"292973459027025\": [6], \"149435896456274\": [14], \"1775082649400403\": [0], \"1634217073763413\": [14], \"1293171242050650\": [14], \"633556158776411\": [17], \"1027179518608476\": [6], \"1590177099924575\": [14], \"683726717768800\": [11], \"865075607295074\": [0], \"280491823564460\": [14], \"183757115294821\": [6], \"1527385792005225\": [12], \"716087420122218\": [17], \"1193067522532199\": [17], \"155895662812690\": [25], \"495840600581230\": [0], \"1336286025626736\": [0], \"1567818400392308\": [0], \"209867825108086\": [14], \"1172835462128761\": [0], \"36775194231930\": [14], \"985731993964305\": [0], \"327317391858538\": [0], \"1249718005761151\": [14], \"535608337216640\": [0], \"110508400641155\": [11], \"1800523524146309\": [0], \"747235481535622\": [0], \"1018545617646649\": [14], \"1145977905697937\": [0], \"1579208730637462\": [0], \"1400078479596712\": [0], \"137511374767260\": [11], \"477761661752479\": [14], \"1643401728406689\": [14], \"286605637178530\": [6], \"1534512451876003\": [0], \"1199631370040486\": [0], \"170734250513575\": [14], \"177548054693036\": [6], \"1078214355948717\": [11], \"1086530812302512\": [14], \"111871575504049\": [6], \"1041988026266802\": [25], \"1490899414983859\": [11], \"94759490856116\": [14], \"1286543961158837\": [0], \"575328756700342\": [0], \"1493391269946551\": [11], \"893165264454842\": [14], \"302636762051771\": [0], \"271732562945212\": [11], \"1343323356517565\": [14], \"1578275754513598\": [14], \"949367246267583\": [6], \"1194772743824583\": [11], \"1040821499512008\": [25], \"156442774086858\": [14], \"1786243409011575\": [14], \"773109908849868\": [25], \"125329050929634\": [6], \"1519588803781842\": [6], \"1111529656886488\": [14], \"49916739994841\": [11], \"1237353691632859\": [0], \"1568652950303964\": [0], \"1227740186477789\": [0], \"1750030548616414\": [17], \"400443342931169\": [11], \"570976775894242\": [0], \"298801648821475\": [0], \"283913839911121\": [0], \"654143563027689\": [17], \"1402728323258578\": [0], \"125672710456558\": [17], \"1088280727587709\": [14], \"1170417709405424\": [25], \"30595562710257\": [25], \"1566549753353769\": [0], \"649616107062526\": [0], \"1036608450454783\": [0], \"945866667300096\": [11], \"1596894250423553\": [14], \"1192670842680579\": [12], \"1773532575823108\": [6], \"1487946879314134\": [17], \"1418819848598401\": [12], \"480101632783627\": [14], \"957414915761420\": [0], \"1340053350923821\": [14], \"1588572323054867\": [14], \"1109193592292630\": [12], \"473399468090647\": [0], \"768829332464922\": [0], \"51757952165147\": [0], \"1549377149912348\": [25], \"162801649112349\": [0], \"446090115298591\": [6], \"67973641676064\": [6], \"909470527899184\": [14], \"1543387464648923\": [11], \"525649924468956\": [14], \"1347986557437226\": [11], \"1057822413034795\": [25], \"255811150095663\": [12], \"1094571337255974\": [14], \"417823040902451\": [25], \"1034527341794613\": [0], \"1212018492323128\": [17], \"81141531194682\": [11], \"741586588681531\": [17], \"1828660028151100\": [0], \"1684482590549309\": [14], \"262260922852672\": [14], \"621217629394241\": [14], \"730705098468235\": [6], \"766487817958725\": [0], \"1834179091682630\": [0], \"36002943219015\": [6], \"85194101933384\": [11], \"461816167228748\": [0], \"1272326577333583\": [11], \"1325999332607313\": [0], \"244616410789205\": [0], \"1171399731365207\": [0], \"523234657072472\": [25], \"605999612814682\": [11], \"1108481822041435\": [0], \"1281400730121564\": [0], \"1737858152932701\": [6], \"1244403832759646\": [11], \"1641627984450915\": [11], \"1153973893444966\": [0], \"1517883928765799\": [11], \"29802015360361\": [11], \"310730711278954\": [25], \"763727751321831\": [0], \"99127984678252\": [11], \"805761205359981\": [0], \"1310656662269501\": [6], \"520522148288620\": [25], \"1176648618702194\": [11], \"513847419343763\": [0], \"1808042893002100\": [0], \"695745560720758\": [0], \"626864164931135\": [17], \"634727833351551\": [6], \"754086344795525\": [25], \"1733781125039495\": [6], \"1353843757418732\": [0], \"189845459588490\": [12], \"1066970898888075\": [0], \"1699881946445198\": [11], \"1583639429170575\": [14], \"1320968607733315\": [14], \"368188825499029\": [14], \"362940229981590\": [0], \"384426610613145\": [14], \"1738025256080792\": [0], \"611912905489988\": [0], \"218773877233050\": [6], \"1464248617432475\": [25], \"98233183290949\": [11], \"1197848560404720\": [0], \"1123068850079138\": [14], \"1228132760511907\": [0], \"900308154594725\": [0], \"1418244149940465\": [11], \"494244104678300\": [6], \"75695590176170\": [25], \"281406412627527\": [0], \"1227048653886895\": [14], \"1463513307502000\": [6], \"815880572724659\": [14], \"1499165253592503\": [6], \"1289455063995832\": [14], \"1183308722460089\": [11], \"437832945436091\": [0], \"993246141593020\": [17], \"1359784302990782\": [25], \"39247586010559\": [12], \"1050814679524802\": [11], \"1585500726769092\": [17], \"396998226544071\": [0], \"1285623330715082\": [14], \"606681675605454\": [14], \"649051783497293\": [0], \"551424679142865\": [0], \"526623223666131\": [14], \"1216224755819991\": [6], \"893730689136088\": [11], \"1643056357828058\": [6], \"712164367140431\": [11], \"1251427518211548\": [12], \"767526468882682\": [14], \"72585696461733\": [25], \"119522520634848\": [14], \"1305669645735399\": [0], \"1505420843877866\": [6], \"132973903820267\": [6], \"1077834968245742\": [0], \"963653929874928\": [0], \"971397977417205\": [17], \"1136498413644713\": [14], \"1574674975536634\": [6], \"1344967568037371\": [0], \"1671119091983878\": [12], \"181315672994049\": [6], \"88223530165769\": [12], \"53690665682443\": [14], \"369112565245453\": [12], \"687704345982478\": [6], \"1395991370364431\": [11], \"1042962492507664\": [11], \"1235708232750610\": [17], \"1323704055912594\": [11], \"490825880012310\": [14], \"1820409950006595\": [0], \"199349200750108\": [0], \"505053393843743\": [17], \"1269516800267811\": [0], \"1166756453983782\": [11], \"395069978924584\": [17], \"705162594752041\": [6], \"775850804274730\": [12], \"856477322411613\": [0], \"1303073895065136\": [0], \"235442241365554\": [11], \"1494694379181620\": [17], \"1718319376401975\": [0], \"1063076775921208\": [0], \"1327897694537274\": [6], \"1754064673814079\": [0], \"1390254002816578\": [25], \"108443102922307\": [0], \"691494155159109\": [12], \"356816418526580\": [0], \"1711375730214477\": [0], \"776833962758413\": [14], \"1205371088217680\": [17], \"1726714711365201\": [17], \"698348460889683\": [6], \"1525868732872280\": [0], \"212932376589913\": [14], \"1724637120505434\": [0], \"155289997869327\": [6], \"1244519991567965\": [11], \"721875062478434\": [0], \"204317758636987\": [17], \"1381808770778725\": [12], \"1550266697655910\": [0], \"1803265087379048\": [11], \"130273410324073\": [0], \"1650111404529258\": [11], \"500434990622315\": [14], \"1741132171261548\": [0], \"1606110187603565\": [12], \"698369200133743\": [11], \"812750392739441\": [6], \"1289207631287924\": [17], \"1659112226384148\": [11], \"1048485145069179\": [11], \"1236049686644348\": [0], \"1624795558860394\": [0], \"104860744849022\": [6], \"1787049549813377\": [0], \"551051655243397\": [17], \"1007707215648390\": [6], \"1280765206128263\": [17], \"725002428163720\": [14], \"765842015450050\": [17], \"711072917501582\": [6], \"711359708436115\": [11], \"265790317618837\": [6], \"698085082076823\": [0], \"420472333559451\": [0], \"655856515200674\": [6], \"1808755229329691\": [6], \"1352100309415596\": [0], \"1471454790309549\": [11], \"756466667603633\": [0], \"1503510407494678\": [6], \"1356578215646902\": [11], \"1301407042754231\": [0], \"1363596268422841\": [0], \"1725064209082042\": [14], \"1668331618363067\": [0], \"1758197608285885\": [0], \"1348329113843391\": [14], \"731785995540160\": [14], \"1615982405146307\": [0], \"1620265231918790\": [0], \"413950803396897\": [11], \"346229099718346\": [11], \"997198917842635\": [17], \"779898646145378\": [0], \"239767079827151\": [17], \"782994228389590\": [6], \"429940761076004\": [0], \"169715989792474\": [0], \"347235557954511\": [25], \"1421990762280671\": [0], \"315814221289185\": [11], \"1049282425886331\": [14], \"853742331786980\": [6], \"432418874124012\": [11], \"1464022149600998\": [25], \"376175245601839\": [0], \"1099388625108079\": [17], \"1211219396032236\": [0], \"35848452926418\": [0], \"1820302498436846\": [14], \"571007990707951\": [6], \"1101094830302962\": [12], \"960451275667070\": [11], \"1589695304546038\": [0], \"1226548966332152\": [14], \"671439109707517\": [11], \"232543135703807\": [14], \"1611872123553541\": [0], \"330586197522192\": [14], \"536554797766420\": [11], \"391097110066965\": [14], \"123320862242455\": [25], \"1608979683649839\": [12], \"132756042028828\": [0], \"770426510223136\": [14], \"94568784164642\": [17], \"1402411386465346\": [12], \"807694693779237\": [11], \"1155360553990582\": [17], \"1346774342645546\": [11], \"1330510523930247\": [17], \"641880010635052\": [11], \"176548263614253\": [14], \"1762371962406702\": [0], \"199140768614194\": [0], \"26939532728115\": [25], \"1134563133191989\": [14], \"1045561434498870\": [0], \"656224858960164\": [11], \"443834728134524\": [11], \"785655867434817\": [11], \"277912619386690\": [6], \"1431791122966341\": [11], \"262780918637537\": [6], \"788289051862859\": [11], \"1086333609731042\": [17], \"766146707775082\": [6], \"364824838084435\": [11], \"1163108229994126\": [0], \"832280300922711\": [11], \"458643571611480\": [11], \"974167093740469\": [14], \"1550551532685148\": [11], \"348380083210079\": [6], \"924791284639586\": [14], \"1630972407871332\": [14], \"1339040494856037\": [6], \"1643225162057575\": [14], \"1473723955484520\": [17], \"370644754347883\": [14], \"1244212530083692\": [14], \"1681762430691182\": [11], \"36911040567152\": [11], \"1726140246783857\": [14], \"1400294853580658\": [0], \"853542869079925\": [0], \"407460764370806\": [0], \"1094154390656889\": [0], \"901903933326927\": [17], \"329989809825660\": [11], \"408330197378941\": [6], \"185137442703575\": [12], \"1652982371280533\": [6], \"723036557834112\": [11], \"1424680597014401\": [0], \"1812513619048322\": [0], \"1780829418121092\": [12], \"182099256907654\": [14], \"112140072765322\": [0], \"1187681356269207\": [25], \"614656614766476\": [11], \"1726515581163405\": [17], \"1714816995104655\": [0], \"318684366063505\": [11], \"160588124274427\": [0], \"199533357950869\": [11], \"1758245196527512\": [12], \"1085488940566427\": [14], \"330953274173341\": [0], \"924875973146526\": [25], \"250633618110367\": [0], \"1364087674189728\": [17], \"274046819588001\": [6], \"1705150598608802\": [0], \"1246866724202403\": [6], \"110918909962148\": [0], \"1813955955472710\": [17], \"205794314413990\": [14], \"157699812439976\": [0], \"213139491415980\": [6], \"513000747984813\": [11], \"909139361351599\": [11], \"573208164997041\": [14], \"142490108024754\": [0], \"237690943707059\": [0], \"1079801231402936\": [11], \"806116929132473\": [11], \"965782499637178\": [11], \"1294466340331850\": [12], \"1761741274408898\": [25], \"1795223687727048\": [6], \"778705456285644\": [14], \"186393473976269\": [0], \"900568472012752\": [25], \"513943001163427\": [11], \"76325417666516\": [6], \"780376662796622\": [0], \"1806483358546057\": [6], \"1412337247758300\": [0], \"1680574849583070\": [17], \"410322295051451\": [14], \"437563653949409\": [14], \"1637649705314274\": [6], \"547850350038011\": [6], \"918352434071525\": [0], \"1480562148440039\": [25], \"1724845974697960\": [14], \"1568212279715817\": [6], \"1043850921081072\": [6], \"747016626005998\": [6], \"1668463535552495\": [14], \"713709834495987\": [14], \"231649850685428\": [14], \"892040265410551\": [14], \"1408555596863480\": [14], \"1549136143814996\": [17], \"95695791679483\": [11], \"1590234041534461\": [14], \"392056967608320\": [0], \"1699689830867968\": [0], \"1575629237161059\": [0], \"923741612722184\": [12], \"1405006380107785\": [6], \"509559903656279\": [14], \"1248074792585235\": [11], \"1015378462263320\": [14], \"953561919948830\": [11], \"1081467914084016\": [0], \"88177528801627\": [0], \"1782105608943652\": [0], \"1141914072572050\": [14], \"1350081652762664\": [11], \"255536960841770\": [14], \"1018081123080235\": [14], \"877782967081004\": [17], \"424016564938797\": [11], \"1018024537905198\": [25], \"1756674301683759\": [14], \"1818883584260150\": [0], \"417026024482875\": [25], \"816535193626688\": [25], \"1439678281291841\": [0], \"1314149194422338\": [17], \"783475631069251\": [0], \"1006912674469956\": [0], \"1619557062584389\": [11], \"1682678871439437\": [0], \"1724777356134483\": [25], \"1417955827796052\": [0], \"1225428973291608\": [17], \"945257001203801\": [14], \"1618928173058139\": [11], \"124269073963100\": [11], \"341827029842014\": [25], \"1801608671517029\": [25], \"1031768261765216\": [0], \"11613599405072\": [14], \"148401819252834\": [12], \"1234119016081508\": [0], \"1748401923582053\": [0], \"1305627117017193\": [11], \"967048970295402\": [6], \"1116644960985447\": [11], \"175859160508524\": [0], \"784899437026658\": [14], \"1675102827911278\": [25], \"862944162690749\": [0], \"1455056862214256\": [0], \"711059105810546\": [14], \"733368791391251\": [0], \"719404542806132\": [11], \"972504953108844\": [14], \"1480074977212538\": [25], \"1712032115889855\": [11], \"957077797378172\": [14], \"339046657107648\": [14], \"1518056294074498\": [14], \"615272357869699\": [0], \"1390639259576453\": [11], \"1175035903093100\": [11], \"929963715766410\": [11], \"1761931876845708\": [11], \"1010716667018946\": [0], \"1097042701301902\": [12], \"379734091626639\": [14], \"1435950595557520\": [14], \"1139980954757265\": [14], \"1624846168037522\": [11], \"1579338155998981\": [6], \"648533249063278\": [6], \"1140134026049688\": [17], \"829974031014041\": [0], \"1738979937646746\": [0], \"1102494175504539\": [6], \"1125002666367134\": [14], \"762178470455457\": [17], \"1349355936430243\": [14], \"1002658299430598\": [0], \"712752465688750\": [11], \"160477635639471\": [0], \"1483432981465264\": [25], \"1801128718633139\": [11], \"786813800880309\": [14], \"1696936316661449\": [6], \"1135526515964276\": [0], \"1501829923225930\": [0], \"441344576415933\": [11], \"71544709011650\": [17], \"885162648996897\": [0], \"1553582070347977\": [14], \"1297332192960887\": [11], \"1552596157462732\": [12], \"731331906136269\": [11], \"519723726170318\": [0], \"1401196768213202\": [25], \"1742291197013027\": [0], \"535414352144597\": [0], \"825139122145494\": [0], \"570399774296279\": [0], \"240860931922136\": [6], \"425218685176027\": [6], \"1129271989197023\": [11], \"130977421461728\": [0], \"940584271784165\": [0], \"688678466671567\": [12], \"451145760172263\": [11], \"447895568165097\": [14], \"1225378176669932\": [14], \"1417750873237741\": [12], \"735054360717552\": [11], \"1161621401950299\": [14], \"201639770900724\": [0], \"136103422093559\": [0], \"1419600108775672\": [17], \"1218080879550847\": [17], \"730150568556797\": [0], \"335078188251392\": [14], \"1632526429374722\": [11], \"1614814220240598\": [0], \"1271821592733966\": [6], \"1608584956909839\": [17], \"387760124074256\": [17], \"1460751005182228\": [0], \"596284140456213\": [0], \"577781161449752\": [6], \"1120119584317828\": [0], \"1111403307795503\": [12], \"1557656084637981\": [11], \"376395032754465\": [11], \"381327044552994\": [14], \"320689916766499\": [11], \"459600371063076\": [0], \"1517335615843377\": [14], \"23451565558057\": [11], \"1723647735347503\": [11], \"1472618932357513\": [14], \"653258905688378\": [11], \"573906057677194\": [0], \"127983695923518\": [11], \"260691896158530\": [11], \"1572262201604422\": [0], \"1255653286672711\": [17], \"166217352771913\": [0], \"630373308979530\": [11], \"1256332125853854\": [0], \"4544564541777\": [6], \"1721768760146258\": [25], \"1465658016958806\": [11], \"1646723559565655\": [11], \"76380403636571\": [0], \"1733867723102557\": [0], \"695389515807071\": [25], \"54650486778209\": [11], \"176820632938850\": [11], \"332253504650299\": [0], \"972108907157861\": [0], \"1446126062725480\": [6], \"1662077561907561\": [0], \"713589743008108\": [14], \"513987867679122\": [11], \"1347511452297582\": [25], \"1277966237493615\": [0], \"102329372072305\": [12], \"80201418496370\": [0], \"1335913448446324\": [11], \"1266294095554016\": [14], \"360239247174006\": [6], \"66440217729400\": [14], \"1348552640944505\": [14], \"43662545607037\": [11], \"627706112817535\": [14], \"1520849332803968\": [25], \"681103172177451\": [6], \"885981040888197\": [0], \"296742971910535\": [0], \"1435841899080073\": [11], \"405190826019210\": [0], \"462486830307725\": [6], \"1272990421202669\": [11], \"466721964091793\": [14], \"1536694617651602\": [25], \"1689681978632597\": [6], \"1678908367326276\": [0], \"76896235628955\": [0], \"408659625949596\": [12], \"336914600016286\": [11], \"361966072584608\": [11], \"406038583921057\": [6], \"963720246178203\": [0], \"10562995595685\": [0], \"960038736902569\": [0], \"1180702620252586\": [17], \"467553143839147\": [0], \"712390387890604\": [14], \"1057384089045421\": [0], \"1147035753060783\": [0], \"1167189227589318\": [0], \"956491542870449\": [6], \"518114886551987\": [14], \"578110690392500\": [25], \"1197484077672885\": [12], \"1221984822520246\": [11], \"452369621564489\": [25], \"582556537706937\": [12], \"851874316040634\": [0], \"35805813352894\": [11], \"164748615711167\": [11], \"189416869050819\": [11], \"32826725580798\": [11], \"1472108174328225\": [25], \"1817394008553928\": [14], \"1576175878261193\": [14], \"1466749058711287\": [6], \"638206612732364\": [11], \"1530497169324493\": [0], \"481656335882710\": [11], \"108643162636025\": [25], \"919589600111065\": [0], \"1491598725669967\": [11], \"828013607147998\": [11], \"804566586251743\": [11], \"74969315887584\": [0], \"566005889210850\": [17], \"1759812132157100\": [11], \"552283533613540\": [0], \"523482841905638\": [11], \"1298848536168936\": [6], \"697624286190058\": [14], \"1786837630790123\": [14], \"483520495131121\": [0], \"145063658621427\": [0], \"1590684992147198\": [6], \"1592311088222633\": [0], \"185710972090876\": [0], \"1070897190476202\": [14], \"1158655739296264\": [0], \"139325971655177\": [0], \"1684734820141580\": [14], \"111739097897485\": [0], \"117705231804942\": [11], \"72143496731151\": [11], \"531219626796108\": [12], \"128596409088529\": [11], \"61443799591443\": [0], \"723696515795479\": [11], \"243384762378779\": [14], \"1739347265459290\": [25], \"1342486265522719\": [11], \"233406517053984\": [25], \"629330925982128\": [25], \"972719992957481\": [14], \"1160564511762986\": [11], \"1256646364121643\": [11], \"400975246805552\": [12], \"479940561795633\": [17], \"1385213264271922\": [0], \"1832067341818419\": [25], \"629299022904766\": [0], \"296442714921528\": [11], \"1374340891384378\": [0], \"2154070670431\": [14], \"128124360165948\": [14], \"65599300659773\": [25], \"1184403551943093\": [11], \"674656380230209\": [0], \"675922779648438\": [0], \"1502216836033097\": [14], \"161492444015182\": [11], \"1396284747512400\": [11], \"345283537889873\": [14], \"944254649084499\": [11], \"894067906665045\": [0], \"842780727558585\": [12], \"525382025149016\": [25], \"1527512699697753\": [11], \"136902241516123\": [11], \"240134865959519\": [14], \"1687014351542881\": [11], \"1466689593829989\": [14], \"1183796570581607\": [25], \"842833370602399\": [0], \"157994752219753\": [0], \"1383888566098538\": [6], \"689924898151019\": [11], \"483704898247277\": [6], \"1637453738379886\": [25], \"189422835112559\": [11], \"1101282925550194\": [11], \"632457349970547\": [25], \"1618630841567861\": [0], \"1552308262926966\": [0], \"1551690013399673\": [0], \"1129496142367355\": [14], \"531022849344618\": [14], \"1088290622982785\": [6], \"602107849542274\": [6], \"705074853849731\": [0], \"862377616321161\": [14], \"1403491741985422\": [0], \"65148730313359\": [6], \"598905067436688\": [0], \"381077258936088\": [6], \"921785542990484\": [0], \"430340931123862\": [0], \"211018913675927\": [14], \"557170799751620\": [11], \"799206853941914\": [0], \"94797936310939\": [0], \"1046459470527133\": [11], \"976888938580640\": [11], \"654189034093218\": [11], \"1048010328238758\": [11], \"815762472086184\": [11], \"563986405624490\": [14], \"561597235124907\": [17], \"1752072381029037\": [0], \"845725463358126\": [0], \"742106827831986\": [0], \"314262919322292\": [11], \"1799092034120373\": [12], \"1529077051927224\": [0], \"1749730533284538\": [11], \"300520209828541\": [11], \"866988879059649\": [0], \"660533609429700\": [0], \"1611240920804037\": [0], \"1626780119206598\": [11], \"1655518688795335\": [11], \"1200825838992074\": [11], \"823842897128139\": [12], \"33243310918093\": [6], \"402808128470137\": [12], \"958095083268828\": [11], \"1343187481578618\": [6], \"1003830617787109\": [12], \"739563390819048\": [14], \"614239241054953\": [17], \"1584244853000940\": [0], \"897897827060461\": [12], \"714754050038510\": [6], \"64823906011887\": [14], \"1646673405481117\": [11], \"916130229631731\": [0], \"409684599278326\": [11], \"995282130815736\": [14], \"108906823584505\": [11], \"960481250814720\": [12], \"1193501878717185\": [17], \"1807620202003202\": [14], \"491161732225795\": [11], \"1724274761186054\": [25], \"321838426241799\": [6], \"1160173792324055\": [14], \"510675622259470\": [6], \"1816344891620112\": [11], \"181610240092945\": [0], \"1644957724711698\": [14], \"960751476992787\": [14], \"1074659743574489\": [11], \"541375206099738\": [12], \"414757834672923\": [0], \"1104407270947612\": [12], \"1838619249589021\": [14], \"1718408791227166\": [0], \"1617303401995043\": [6], \"1770832135555876\": [25], \"75004065547398\": [14], \"1746967568522022\": [6], \"820871860652839\": [14], \"1039268429560617\": [11], \"132828672506666\": [12], \"574915610921772\": [12], \"937554148897245\": [0], \"119697732049712\": [0], \"1194754022849329\": [17], \"1559228200332082\": [0], \"808785031097140\": [0], \"1399068747946805\": [6], \"199176257796918\": [0], \"971202060766007\": [6], \"817517363145528\": [12], \"1810736283020090\": [25], \"885154830621151\": [11], \"1534709892533053\": [14], \"1397761310583618\": [11], \"1048106859150151\": [11], \"1313463143795528\": [11], \"1729879039789897\": [6], \"1069567961894711\": [0], \"1687704245009228\": [11], \"1768586422238029\": [11], \"962225674537810\": [14], \"1467230134565719\": [11], \"18636857977688\": [14], \"1243288666319706\": [0], \"1534975016520539\": [0], \"194222120718333\": [6], \"424349738744671\": [25], \"1710530657401696\": [0], \"1349479868328803\": [6], \"738950677580647\": [11], \"773178920995688\": [6], \"151766414818154\": [6], \"1337917899836268\": [0], \"996103503375214\": [0], \"1215528855788399\": [14], \"821574537203519\": [6], \"1571644738513780\": [11], \"897253992508278\": [0], \"1472751633382264\": [0], \"702217618459513\": [14], \"601572380093307\": [14], \"1328489348413930\": [11], \"25611402419070\": [0], \"996975645223807\": [6], \"209809296460674\": [14], \"1219174417038219\": [25], \"1253667784809357\": [0], \"459133973891985\": [11], \"860805461568406\": [14], \"1310203341171608\": [14], \"1421128964660121\": [17], \"632109760592796\": [6], \"1234306079312799\": [0], \"912385435089829\": [14], \"819170571955111\": [11], \"187327501196201\": [25], \"1483283307735980\": [17], \"1511246723267502\": [0], \"1435951254461360\": [14], \"1289883081856350\": [0], \"948524492951369\": [0], \"1021745703964614\": [0], \"411927432997822\": [11], \"404237983038399\": [25], \"725360638385089\": [0], \"1755461485177794\": [12], \"1019064079829955\": [0], \"320554964876228\": [0], \"1552845840261622\": [11], \"1502229061684166\": [6], \"289038355344327\": [11], \"215675142110152\": [0], \"1620129270582217\": [25], \"1482158842043339\": [6], \"1158175338239821\": [11], \"1138351418989522\": [11], \"533098841598931\": [0], \"1573568323455958\": [6], \"649550945782744\": [0], \"1037531266927577\": [11], \"1268489178536922\": [0], \"1245525733018588\": [0], \"1521781952277669\": [0], \"1262726525591376\": [6], \"552093329832932\": [0], \"1312782331923433\": [11], \"8368817863658\": [12], \"992298576927724\": [25], \"225220244439549\": [11], \"944874643680241\": [0], \"979740917389663\": [14], \"1692929299795113\": [25], \"1487425672248312\": [0], \"430810160086009\": [25], \"388577667001338\": [6], \"907065305562107\": [11], \"1469763754212350\": [0], \"1818981796527103\": [6], \"163117975673859\": [11], \"1045589116197894\": [0], \"326736309046279\": [0], \"1760366106944684\": [14], \"580750432869389\": [11], \"1765562515753998\": [0], \"36803243944975\": [6], \"1559862409288722\": [17], \"244069116756483\": [11], \"1531164860410900\": [11], \"118981586209966\": [17], \"1410844958448662\": [0], \"833589020847128\": [25], \"1384599181425691\": [12], \"1360641268612126\": [6], \"1780577439636513\": [0], \"1199340707253283\": [17], \"265437294852372\": [0], \"364504061856809\": [0], \"1163422042717229\": [6], \"1712566556150830\": [11], \"1113831058406447\": [11], \"1631797304609705\": [12], \"277769850289210\": [11], \"227959088053307\": [0], \"1783812241622447\": [17], \"1637190338761226\": [12], \"992451870338110\": [0], \"921898937375809\": [25], \"1801929764555842\": [0], \"335541615422531\": [11], \"169140175408196\": [17], \"656546567654470\": [25], \"4990130232391\": [12], \"597659963739209\": [17], \"1599330233273423\": [17], \"1216971004976208\": [6], \"272636420861010\": [6], \"107004878782990\": [11], \"70849988803673\": [14], \"462846148787292\": [11], \"82100430654558\": [14], \"1804456951012447\": [11], \"744079072205921\": [6], \"742949974619323\": [0], \"957646309653606\": [12], \"78393786973287\": [0], \"1244217914973288\": [0], \"922542623100009\": [12], \"946586996989034\": [14], \"1387765654948972\": [14], \"1833635418328175\": [14], \"1140612485446769\": [17], \"1465560043625592\": [0], \"24528731651193\": [0], \"963580423019642\": [0], \"667510764825725\": [11], \"649287581711486\": [6], \"1201273993161858\": [12], \"1196863382607984\": [11], \"738817714031749\": [0], \"816141080071303\": [14], \"1124788242665324\": [0], \"486432496176269\": [12], \"1520926209293455\": [0], \"679849320365200\": [6], \"1298343549533329\": [14], \"661301341183125\": [11], \"360738245491862\": [17], \"750214132481175\": [0], \"70971657432220\": [0], \"1391534056402079\": [14], \"948815092698274\": [14], \"646313679540583\": [11], \"1364900030037157\": [0], \"815579247578993\": [25], \"926062088273064\": [25], \"184284052028585\": [17], \"644716794317995\": [0], \"37674921307309\": [0], \"752515870686382\": [0], \"202476493388977\": [11], \"486893343493298\": [0], \"1451625789193395\": [14], \"908917398666427\": [14], \"1009314455278794\": [25], \"1136856536505534\": [0], \"88558069157055\": [0], \"469306577813442\": [11], \"1784501073296577\": [0], \"1222743055457474\": [11], \"284671357618038\": [14], \"366767801547974\": [11], \"934803755076129\": [14], \"1434481614169292\": [14], \"1645365193555148\": [11], \"1807263145675982\": [11], \"50300561984719\": [6], \"829255532195024\": [11], \"1117431791291604\": [14], \"1280747289734350\": [0], \"745629896527062\": [11], \"154327016983767\": [0], \"569809137269967\": [14], \"1124326526377180\": [0], \"976255762091898\": [11], \"1452335535856863\": [0], \"872671202442464\": [0], \"734913192234209\": [14], \"234071686733028\": [12], \"840663926518880\": [0], \"974928607181594\": [25], \"684743962823918\": [17], \"1208315481951471\": [12], \"804710310382837\": [11], \"1495163680513271\": [0], \"1253529243413716\": [12], \"467965861615487\": [0], \"1257157904391424\": [25], \"1199776215756672\": [6], \"1105046405948824\": [14], \"640091996359939\": [11], \"989566099879809\": [11], \"418425365675272\": [12], \"1135329572932874\": [0], \"232507402626946\": [0], \"708691532271774\": [17], \"418903340981454\": [11], \"536603170974993\": [0], \"1502210876116244\": [17], \"461085853236504\": [11], \"1804288360971551\": [12], \"453324490669345\": [0], \"949604818763042\": [25], \"54925088761051\": [6], \"278067824418084\": [25], \"1135161838913390\": [11], \"1085075934637959\": [0], \"1306865822485042\": [0], \"1830163692489121\": [0], \"333777327066418\": [0], \"1830239223669948\": [14], \"441450601930038\": [11], \"635910217844386\": [12], \"551842115140920\": [14], \"1479361489796687\": [6], \"205839096979867\": [14], \"637373000642442\": [11], \"1062694202187070\": [11], \"595822370536672\": [14], \"359178493513027\": [6], \"1487896054930759\": [12], \"1829615133297992\": [6], \"37255098028533\": [14], \"1037594618359116\": [0], \"1411848806120784\": [0], \"873863704874322\": [0], \"1209240599219540\": [0], \"933164924288341\": [17], \"1836615616867670\": [0], \"1488892479065431\": [11], \"1646605052251364\": [11], \"1259125228322138\": [14], \"915715103714651\": [11], \"1697299379846494\": [11], \"1705106992950623\": [11], \"1553890396372320\": [14], \"1328892130889058\": [11], \"1522142618347409\": [11], \"993082997230953\": [11], \"1308300271521936\": [14], \"313879197062375\": [14], \"469491649973613\": [0], \"1000011662912882\": [0], \"942074691264403\": [14], \"1084870721228148\": [0], \"201555822335801\": [14], \"1578938126273913\": [6], \"522168448102877\": [6], \"1236103830273404\": [0], \"151174426348926\": [0], \"455236569828737\": [6], \"1703819575405954\": [25], \"1049874321329540\": [6], \"1820725653532566\": [17], \"1722736552312198\": [0], \"626839960272263\": [14], \"473569722912136\": [11], \"419019366985097\": [0], \"280139167272330\": [0], \"396673090713581\": [11], \"1210672820792720\": [14], \"1478496234828355\": [0], \"1588746849987988\": [14], \"1484481198755222\": [0], \"580648884579735\": [25], \"778863359409562\": [0], \"993056624873370\": [6], \"888435024190881\": [6], \"754400534232483\": [0], \"1317058728803394\": [12], \"1783578637520294\": [0], \"1001104561528231\": [14], \"214149756231580\": [11], \"1634047401610666\": [0], \"5800623574443\": [0], \"1346526936092076\": [12], \"129188889144749\": [6], \"94186003905968\": [14], \"809589832990132\": [17], \"486698788494774\": [14], \"1106200855941023\": [6], \"349171817389501\": [17], \"701178459405758\": [11], \"1699735640903104\": [17], \"1510971336998315\": [0], \"1338219276266951\": [11], \"673803614318024\": [14], \"219670350073289\": [11], \"446453155073485\": [6], \"1353718668683422\": [0], \"738905590810927\": [0], \"1828689853863587\": [11], \"242145921678807\": [11], \"77856691695524\": [0], \"282804864962014\": [0], \"1675754634157535\": [14], \"914993440140769\": [11], \"381442111648337\": [6], \"1455554374843881\": [11], \"394732093517291\": [11], \"1541122250333960\": [14], \"1824475020928936\": [17], \"1329738865039353\": [0], \"1318707003522548\": [14], \"1644411908722189\": [17], \"751541951174871\": [12], \"1680283761417727\": [0], \"1084224644992512\": [0], \"625470904159488\": [11], \"598082272366083\": [0], \"525820118769158\": [14], \"280694169167105\": [0], \"1773448062164029\": [0], \"1229833711136272\": [14], \"924306363563538\": [0], \"1068588658892308\": [14], \"413193458241052\": [14], \"792677854076447\": [0], \"1579518870957602\": [11], \"1274464629819995\": [11], \"594912311991845\": [6], \"1083066439970342\": [0], \"352301021576746\": [0], \"183128489700907\": [0], \"1462974146350636\": [12], \"497722964887474\": [11], \"1538649045866534\": [11], \"32908974784047\": [0], \"1025850380217436\": [14], \"1726323240484104\": [11], \"22109472800306\": [6], \"36068524887606\": [17], \"518201549483575\": [6], \"1527858526846521\": [12], \"1245726973252093\": [14], \"1269629409586749\": [11], \"1298879736495681\": [25], \"646567808425539\": [0], \"148598134726212\": [14], \"362812602109510\": [11], \"1568191056575073\": [0], \"1168299943419464\": [0], \"101391057456199\": [25], \"1615302073601615\": [6], \"1557599673232977\": [17], \"1295576174349907\": [6], \"1190842104624568\": [11], \"1830413605092951\": [14], \"880114851978841\": [0], \"1720848946540124\": [0], \"1442314223967837\": [11], \"1023919580270175\": [25], \"1521685264162403\": [11], \"1334215654588005\": [0], \"39730495057510\": [11], \"1146984068615441\": [0], \"201146171439314\": [25], \"578115408105066\": [11], \"405188498075243\": [25], \"1740860866518638\": [6], \"826389688594034\": [11], \"695282473938552\": [6], \"1532355471306361\": [25], \"440719486373501\": [11], \"256082922978942\": [14], \"1022692054265472\": [6], \"1759759973007296\": [6], \"518016388642070\": [11], \"1137423182069384\": [0], \"724463811374729\": [17], \"1425195440803466\": [0], \"1485775606140555\": [6], \"1601164459728525\": [11], \"1406724636417678\": [11], \"1131529647066772\": [0], \"147843615825558\": [12], \"406984298761880\": [11], \"721929156533915\": [14], \"263714629172893\": [17], \"337595943587486\": [14], \"1231751790677369\": [0], \"887276967059104\": [14], \"1799922401902241\": [11], \"458856926805669\": [6], \"1839082148686262\": [0], \"601236609369372\": [6], \"1442345169223341\": [0], \"1648761532214959\": [6], \"1820569595383472\": [14], \"1254607981438920\": [14], \"1802818977831539\": [11], \"570999386390200\": [12], \"848036241628859\": [14], \"606584715546302\": [0], \"1153187844366965\": [11], \"1352975814565569\": [12], \"1470621573979842\": [17], \"282430511898310\": [11], \"1654488493321929\": [17], \"478059425394378\": [0], \"1123491213446859\": [14], \"10607336378061\": [25], \"554273731079886\": [11], \"504257645461199\": [0], \"1412108050480848\": [12], \"1414965904547538\": [14], \"1558028922023637\": [0], \"249961568718550\": [12], \"1584311045209816\": [14], \"578086367125209\": [11], \"562293314281180\": [11], \"1414734978678493\": [6], \"1704695626669794\": [17], \"605767878393571\": [11], \"501082765123300\": [11], \"1615576145731302\": [0], \"310533281599207\": [11], \"1842193178587375\": [14], \"1665001711886066\": [6], \"1437676718046964\": [0], \"72672714732841\": [11], \"264393625038585\": [14], \"1647054860269182\": [14], \"718681840111355\": [17], \"880621753429758\": [25], \"492822340800255\": [17], \"1258856032804609\": [0], \"1058731523030786\": [0], \"831055689098631\": [14], \"513439237652229\": [0], \"431140726542088\": [11], \"1466533891444695\": [12], \"1439813556506380\": [6], \"1074783446949646\": [11], \"1506803220535256\": [11], \"1731222305115922\": [0], \"371853004922648\": [17], \"429595156887461\": [11], \"1190124998962973\": [14], \"257601439160609\": [0], \"1237645566018181\": [0], \"583275969589027\": [6], \"105957940092709\": [0], \"1629801288077095\": [0], \"861815061180380\": [0], \"505279291453226\": [11], \"1075834968301467\": [6], \"1185264113450797\": [0], \"1691135052992852\": [0], \"1395380128283273\": [11], \"1291257856393018\": [0], \"1203944597053244\": [6], \"919714430893885\": [11], \"369018430529342\": [12], \"569377546014527\": [14], \"1570282376978240\": [0], \"13858004909890\": [6], \"656154754735941\": [25], \"483166107352903\": [6], \"199383649414984\": [11], \"905122199674697\": [17], \"1027748025184074\": [0], \"823105424805708\": [11], \"563606808058303\": [12], \"496021466837136\": [0], \"368526524378960\": [17], \"933533843191779\": [11], \"1352678281273174\": [11], \"1431167480168279\": [14], \"1785318296981339\": [17], \"1472274362269533\": [6], \"1356990632384485\": [14], \"1665856754810721\": [11], \"728189167703355\": [25], \"380446666194789\": [11], \"534974536925031\": [11], \"757542835394800\": [6], \"1610816436762599\": [14], \"381895361646444\": [11], \"464339071660690\": [25], \"588266575028078\": [14], \"248846621773679\": [6], \"134833351958384\": [14], \"388127967780721\": [11], \"734651391164275\": [11], \"787821625319285\": [14], \"1137321901154739\": [14], \"524880929668984\": [11], \"1691585161752441\": [0], \"1584609275305850\": [11], \"439820956643196\": [11], \"1150062022139773\": [14], \"1627555959119743\": [0], \"1792635871481728\": [14], \"1795379312074631\": [14], \"1792071970684808\": [11], \"1420740489306321\": [6], \"609450033065870\": [0], \"1764414403952527\": [11], \"1141302318727057\": [11], \"191753223292227\": [0], \"540304131043221\": [14], \"1139585483816814\": [14], \"851052487912910\": [14], \"468071097515930\": [11], \"98472195315695\": [12], \"729773145481116\": [11], \"822328842780575\": [14], \"699871725182884\": [11], \"1690684027172166\": [12], \"546830412201894\": [14], \"930339467722670\": [14], \"894186216808367\": [0], \"1383827641790386\": [6], \"1466536701554611\": [17], \"1810508103241652\": [0], \"1027239003660216\": [0], \"904688045580218\": [14], \"77138625265596\": [14], \"240075274555327\": [14], \"47125346942912\": [0], \"336369156248224\": [17], \"1251825001312194\": [14], \"1463964185955659\": [6], \"1676793853394886\": [17], \"626675316744135\": [0], \"40925794788684\": [6], \"489127517933523\": [11], \"1008149686779084\": [6], \"1554269472493525\": [0], \"574296395714518\": [11], \"98278786877433\": [0], \"1562462382895068\": [17], \"260236619960314\": [6], \"494639859417056\": [6], \"96760177719291\": [11], \"918280032022503\": [11], \"458695725322218\": [14], \"966465253494781\": [14], \"229338502881264\": [25], \"1516257860296689\": [11], \"1472753635123188\": [6], \"1379235651461118\": [14], \"1447604587212791\": [17], \"1489433394556920\": [0], \"1764279071407444\": [11], \"469479316873210\": [11], \"864887941091323\": [6], \"346478169352874\": [6], \"718195905912830\": [14]}, \"signatures_to_lineage\": {\"a6e4de028ee9b9869d6b3b94c0b24868\": 12, \"d3bf6e07ddfef16a20f0ecdeac640352\": 25, \"05f40e9e663cf53890a9a3be8bfa66ba\": 0, \"9822b59754b7405b8c06ee20fb5c22b4\": 0, \"59107e8e43ab7f1e34026bb7ca1243e2\": 11, \"b1a17a5354800b2c1467c6cb039b60de\": 0, \"acc61a08c7b3785cb50e98243850d0b0\": 14, \"3e27c2f7b2221341501d36fa88ae9661\": 17, \"3a125dcb7167a8dc12dd5eafb23f8b5a\": 14, \"32b685f9a5c92ff04d3e5a71e2b819a6\": 6}}"
  },
  {
    "path": "tests/test-data/lca/podar-lineage.csv",
    "content": "accession,taxid,superkingdom,phylum,class,order,family,genus,species,strain\r\nAE000782,224325,Archaea,Euryarchaeota,Archaeoglobi,Archaeoglobales,Archaeoglobaceae,Archaeoglobus,Archaeoglobus fulgidus,Archaeoglobus fulgidus DSM 4304\r\nNC_000909,243232,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanocaldococcaceae,Methanocaldococcus,Methanocaldococcus jannaschii,Methanocaldococcus jannaschii DSM 2661\r\nNC_003272,103690,Bacteria,Cyanobacteria,,Nostocales,Nostocaceae,Nostoc,Nostoc sp. PCC 7120,\r\nAE009441,178306,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum aerophilum,Pyrobaculum aerophilum str. IM2\r\nAE009950,186497,Archaea,Euryarchaeota,Thermococci,Thermococcales,Thermococcaceae,Pyrococcus,Pyrococcus furiosus,Pyrococcus furiosus DSM 3638\r\nAE009951,190304,Bacteria,Fusobacteria,Fusobacteriia,Fusobacteriales,Fusobacteriaceae,Fusobacterium,Fusobacterium nucleatum,\r\nAE010299,188937,Archaea,Euryarchaeota,Methanomicrobia,Methanosarcinales,Methanosarcinaceae,Methanosarcina,Methanosarcina acetivorans,Methanosarcina acetivorans C2A\r\nAE009439,190192,Archaea,Euryarchaeota,Methanopyri,Methanopyrales,Methanopyraceae,Methanopyrus,Methanopyrus kandleri,Methanopyrus kandleri AV19\r\nNC_003911,246200,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Ruegeria,Ruegeria pomeroyi,Ruegeria pomeroyi DSS-3\r\nAE006470,194439,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobaculum,Chlorobaculum tepidum,Chlorobaculum tepidum TLS\r\nAE015928,226186,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Bacteroidaceae,Bacteroides,Bacteroides thetaiotaomicron,Bacteroides thetaiotaomicron VPI-5482\r\nAL954747,228410,Bacteria,Proteobacteria,Betaproteobacteria,Nitrosomonadales,Nitrosomonadaceae,Nitrosomonas,Nitrosomonas europaea,Nitrosomonas europaea ATCC 19718\r\nBX119912,243090,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,Rhodopirellula baltica,Rhodopirellula baltica SH 1\r\nBX571656,273121,Bacteria,Proteobacteria,Epsilonproteobacteria,Campylobacterales,Helicobacteraceae,Wolinella,Wolinella succinogenes,Wolinella succinogenes DSM 1740\r\nAE017180,243231,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfuromonadales,Geobacteraceae,Geobacter,Geobacter sulfurreducens,Geobacter sulfurreducens PCA\r\nAE017226,243275,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,Treponema,Treponema denticola,Treponema denticola ATCC 35405\r\nBX950229,267377,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanococcaceae,Methanococcus,Methanococcus maripaludis,Methanococcus maripaludis S2\r\nAE017221,262724,Bacteria,Deinococcus-Thermus,Deinococci,Thermales,Thermaceae,Thermus,Thermus thermophilus,Thermus thermophilus HB27\r\nBA000001,70601,Archaea,Euryarchaeota,Thermococci,Thermococcales,Thermococcaceae,Pyrococcus,Pyrococcus horikoshii,Pyrococcus horikoshii OT3\r\nBA000023,273063,Archaea,Crenarchaeota,Thermoprotei,Sulfolobales,Sulfolobaceae,Sulfolobus,Sulfolobus tokodaii,Sulfolobus tokodaii str. 7\r\nNC_007951,266265,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Burkholderiaceae,Paraburkholderia,Paraburkholderia xenovorans,Paraburkholderia xenovorans LB400\r\nCP000492,290317,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium phaeobacteroides,Chlorobium phaeobacteroides DSM 266\r\nNC_008751,391774,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,Desulfovibrio vulgaris,Desulfovibrio vulgaris DP4\r\nCP000568,203119,Bacteria,Firmicutes,Clostridia,Clostridiales,Ruminococcaceae,Ruminiclostridium,Ruminiclostridium thermocellum,Ruminiclostridium thermocellum ATCC 27405\r\nCP000561,410359,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum calidifontis,Pyrobaculum calidifontis JCM 11548\r\nCP000609,402880,Archaea,Euryarchaeota,Methanococci,Methanococcales,Methanococcaceae,Methanococcus,Methanococcus maripaludis,Methanococcus maripaludis C5\r\nCP000607,290318,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium phaeovibrioides,Chlorobium phaeovibrioides DSM 265\r\nCP000660,340102,Archaea,Crenarchaeota,Thermoprotei,Thermoproteales,Thermoproteaceae,Pyrobaculum,Pyrobaculum arsenaticum,Pyrobaculum arsenaticum DSM 13514\r\nCP000667,369723,Bacteria,Actinobacteria,Actinobacteria,Micromonosporales,Micromonosporaceae,Salinispora,Salinispora tropica,Salinispora tropica CNB-440\r\nCP000679,351627,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacterales Family III. Incertae Sedis,Caldicellulosiruptor,Caldicellulosiruptor saccharolyticus,Caldicellulosiruptor saccharolyticus DSM 8903\r\nCP000702,390874,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga petrophila,Thermotoga petrophila RKU-1\r\nCP000139,435590,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Bacteroidaceae,Bacteroides,Bacteroides vulgatus,Bacteroides vulgatus ATCC 8482\r\nNC_009665,402882,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS185\r\nCP000816,453591,Archaea,Crenarchaeota,Thermoprotei,Desulfurococcales,Desulfurococcaceae,Ignicoccus,Ignicoccus hospitalis,Ignicoccus hospitalis KIN4/I\r\nCP000850,391037,Bacteria,Actinobacteria,Actinobacteria,Micromonosporales,Micromonosporaceae,Salinispora,Salinispora arenicola,Salinispora arenicola CNS-205\r\nCP000909,324602,Bacteria,Chloroflexi,Chloroflexia,Chloroflexales,Chloroflexaceae,Chloroflexus,Chloroflexus aurantiacus,Chloroflexus aurantiacus J-10-fl\r\nCP000924,340099,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacteraceae,Thermoanaerobacter,Thermoanaerobacter pseudethanolicus,Thermoanaerobacter pseudethanolicus ATCC 33223\r\nCP000969,126740,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga sp. RQ2,\r\nCP001013,395495,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,Leptothrix,Leptothrix cholodnii,Leptothrix cholodnii SP-6\r\nCP001071,349741,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Akkermansiaceae,Akkermansia,Akkermansia muciniphila,Akkermansia muciniphila ATCC BAA-835\r\nAP009380,431947,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Porphyromonadaceae,Porphyromonas,Porphyromonas gingivalis,Porphyromonas gingivalis ATCC 33277\r\nNC_010730,436114,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Sulfurihydrogenibium,Sulfurihydrogenibium sp. YO3AOP1,\r\nCP001097,290315,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Chlorobium,Chlorobium limicola,Chlorobium limicola DSM 245\r\nCP001110,324925,Bacteria,Chlorobi,Chlorobia,Chlorobiales,Chlorobiaceae,Pelodictyon,Pelodictyon phaeoclathratiforme,Pelodictyon phaeoclathratiforme BU-1\r\nCP001130,380749,Bacteria,Aquificae,Aquificae,Aquificales,Aquificaceae,Hydrogenobaculum,Hydrogenobaculum sp. Y04AAS1,\r\nNZ_CH959311,52598,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Sulfitobacter,Sulfitobacter sp. EE-36,\r\nNZ_CH959317,314267,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Sulfitobacter,Sulfitobacter sp. NAS-14.1,\r\nCP001251,515635,Bacteria,Dictyoglomi,Dictyoglomia,Dictyoglomales,Dictyoglomaceae,Dictyoglomus,Dictyoglomus turgidum,Dictyoglomus turgidum DSM 6724\r\nNC_011663,407976,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS223\r\nCP000916,309803,Bacteria,Thermotogae,Thermotogae,Thermotogales,Thermotogaceae,Thermotoga,Thermotoga neapolitana,Thermotoga neapolitana DSM 4359\r\nNZ_DS996397,411464,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,Desulfovibrio piger,Desulfovibrio piger ATCC 29098\r\nCP001230,123214,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Persephonella,Persephonella marina,Persephonella marina EX-H1\r\nCP001472,240015,Bacteria,Acidobacteria,Acidobacteriia,Acidobacteriales,Acidobacteriaceae,Acidobacterium,Acidobacterium capsulatum,Acidobacterium capsulatum ATCC 51196\r\nAP009153,379066,Bacteria,Gemmatimonadetes,Gemmatimonadetes,Gemmatimonadales,Gemmatimonadaceae,Gemmatimonas,Gemmatimonas aurantiaca,Gemmatimonas aurantiaca T-27\r\nCP001941,439481,Archaea,Euryarchaeota,,,,Aciduliprofundum,Aciduliprofundum boonei,Aciduliprofundum boonei T469\r\nNC_013968,309800,Archaea,Euryarchaeota,Halobacteria,Haloferacales,Haloferacaceae,Haloferax,Haloferax volcanii,Haloferax volcanii DS2\r\nNZ_KE136524,226185,Bacteria,Firmicutes,Bacilli,Lactobacillales,Enterococcaceae,Enterococcus,Enterococcus faecalis,Enterococcus faecalis V583\r\nNZ_KQ961402,542,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Zymomonas,Zymomonas mobilis,\r\nNZ_CP015081,243230,Bacteria,Deinococcus-Thermus,Deinococci,Deinococcales,Deinococcaceae,Deinococcus,Deinococcus radiodurans,Deinococcus radiodurans R1\r\nNZ_ABZS01000228,432331,Bacteria,Aquificae,Aquificae,Aquificales,Hydrogenothermaceae,Sulfurihydrogenibium,Sulfurihydrogenibium yellowstonense,Sulfurihydrogenibium yellowstonense SS-5\r\nNZ_JGWU01000001,1458259,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Bordetella,Bordetella bronchiseptica,Bordetella bronchiseptica D989\r\nNZ_FWDH01000003,31899,Bacteria,Firmicutes,Clostridia,Thermoanaerobacterales,Thermoanaerobacterales Family III. Incertae Sedis,Caldicellulosiruptor,Caldicellulosiruptor bescii,\r\nNC_009972,316274,Bacteria,Chloroflexi,Chloroflexia,Herpetosiphonales,Herpetosiphonaceae,Herpetosiphon,Herpetosiphon aurantiacus,Herpetosiphon aurantiacus DSM 785\r\nNC_005213,228908,Archaea,Nanoarchaeota,,Nanoarchaeales,Nanoarchaeaceae,Nanoarchaeum,Nanoarchaeum equitans,Nanoarchaeum equitans Kin4-M\r\n"
  },
  {
    "path": "tests/test-data/lca/separate.csv",
    "content": "ID,status,superkingdom,phylum,class,order,family,genus,species\r\nTARA_ANE_MAG_00011,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTARA_ANE_MAG_00015,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTARA_ANE_MAG_00041,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTARA_ANE_MAG_00044,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTARA_ANE_MAG_00063,found,Archaea,Euryarchaeota,,,,,\r\nTARA_ANE_MAG_00068,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTARA_ANE_MAG_00069,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTARA_ANW_MAG_00005,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTARA_ANW_MAG_00020,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTARA_ANW_MAG_00034,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTARA_ANW_MAG_00051,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,,\r\nTARA_ANW_MAG_00083,found,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,\r\nTARA_ANW_MAG_00084,found,Eukaryota,Cryptophyta,Cryptophyceae,Pyrenomonadales,Geminigeraceae,Guillardia,\r\nTARA_ANW_MAG_00085,found,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,\r\nTARA_ASE_MAG_00007,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTARA_ASE_MAG_00009,found,Archaea,Euryarchaeota,,,,,\r\nTARA_ASE_MAG_00015,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTARA_ASE_MAG_00018,found,Archaea,Euryarchaeota,,,,,\r\nTARA_ASE_MAG_00028,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\n"
  },
  {
    "path": "tests/test-data/lca/tara-delmont-SuppTable3.csv",
    "content": "MAGs,Domain,Phylum,Class,Order,Family,Genus,Species\rTARA_PON_MAG_00061,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,na\rTARA_PSW_MAG_00136,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_ION_MAG_00072,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_MED_MAG_00110,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00119,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_MED_MAG_00139,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,na\rTARA_PSW_MAG_00074,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_RED_MAG_00106,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_MED_MAG_00103,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00118,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_PSW_MAG_00129,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\rTARA_MED_MAG_00040,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ASE_MAG_00022,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_ANE_MAG_00077,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_ASW_MAG_00036,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_PON_MAG_00074,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_PSW_MAG_00048,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_SOC_MAG_00002,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,na,na\rTARA_ASE_MAG_00032,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_PSW_MAG_00131,Eukaryota,na,na,na,na,na,na\rTARA_RED_MAG_00114,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_PSE_MAG_00140,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_ASE_MAG_00036,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_MED_MAG_00026,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00081,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ION_MAG_00066,Eukaryota,na,na,na,na,na,na\rTARA_ANW_MAG_00073,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00088,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_ANE_MAG_00093,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_RED_MAG_00062,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00045,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_IOS_MAG_00022,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00001,Bacteria,Bacteroidetes,na,na,na,na,na\rTARA_ANE_MAG_00096,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\rTARA_ANW_MAG_00017,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,na,na\rTARA_ANE_MAG_00086,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_IOS_MAG_00011,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_MED_MAG_00142,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,na\rTARA_ASE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\rTARA_ASW_MAG_00035,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_ANW_MAG_00074,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_ANE_MAG_00026,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00076,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00136,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ANE_MAG_00032,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_MED_MAG_00133,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ANW_MAG_00052,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ANW_MAG_00006,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_MED_MAG_00105,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00112,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_IOS_MAG_00045,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ASW_MAG_00011,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ASW_MAG_00032,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ANE_MAG_00035,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSW_MAG_00057,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00141,Eukaryota,na,na,na,na,na,na\rTARA_ANE_MAG_00101,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_ION_MAG_00074,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ANW_MAG_00033,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00076,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ANW_MAG_00076,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASW_MAG_00038,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ANE_MAG_00002,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_MED_MAG_00070,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00004,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,na\rTARA_PON_MAG_00013,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_ION_MAG_00039,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASE_MAG_00024,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,na\rTARA_PSW_MAG_00075,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_IOS_MAG_00061,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_PSE_MAG_00007,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00012,Bacteria,Cyanobacteria,Prochlorales,Prochlorales,Prochlorococcaceae,Prochlorococcus,Prochlorococcus_marinus\rTARA_ANW_MAG_00082,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASW_MAG_00021,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00137,Eukaryota,na,na,na,na,na,na\rTARA_PSW_MAG_00003,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00027,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ANE_MAG_00087,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,na,na\rTARA_PSE_MAG_00073,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSE_MAG_00005,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,Olleya,na\rTARA_IOS_MAG_00038,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00088,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_MED_MAG_00092,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00027,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ANE_MAG_00018,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASW_MAG_00042,Eukaryota,Heterokonta,Pelagophyceae,Pelagomonadales,Pelagomonadaceae,Aureococcus,na\rTARA_MED_MAG_00101,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00084,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00091,Eukaryota,na,na,na,na,na,na\rTARA_MED_MAG_00041,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ANW_MAG_00056,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00062,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANW_MAG_00049,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00011,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_PSW_MAG_00066,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00026,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00051,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00035,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANW_MAG_00080,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_IOS_MAG_00006,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,na\rTARA_PSW_MAG_00019,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00093,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00096,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00024,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_RED_MAG_00009,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00027,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00023,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ASE_MAG_00026,Eukaryota,Heterokonta,Pelagophyceae,Pelagomonadales,Pelagomonadaceae,Aureococcus,na\rTARA_ASE_MAG_00014,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ION_MAG_00070,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,na,na\rTARA_ANE_MAG_00074,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,na,na,na\rTARA_IOS_MAG_00068,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00014,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,na,na\rTARA_IOS_MAG_00039,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ASW_MAG_00029,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_PON_MAG_00082,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_PSW_MAG_00017,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Mycobacteriaceae,Mycobacterium,na\rTARA_ANE_MAG_00090,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_ANE_MAG_00004,Bacteria,Bacteroidetes,na,na,na,na,na\rTARA_PSE_MAG_00027,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_IOS_MAG_00046,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_IOS_MAG_00024,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ANW_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_MED_MAG_00108,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,na,na\rTARA_RED_MAG_00116,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_ION_MAG_00017,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASE_MAG_00004,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_MED_MAG_00140,Eukaryota,na,na,na,na,na,na\rTARA_IOS_MAG_00005,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00041,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_RED_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Citromicrobium,na\rTARA_IOS_MAG_00067,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,na\rTARA_MED_MAG_00104,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_RED_MAG_00096,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ION_MAG_00071,Eukaryota,na,na,na,na,na,na\rTARA_RED_MAG_00123,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00135,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ASW_MAG_00047,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_MED_MAG_00068,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00040,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_IOS_MAG_00023,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANW_MAG_00015,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,na,na\rTARA_ANW_MAG_00035,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANE_MAG_00017,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSE_MAG_00129,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,na\rTARA_ANE_MAG_00007,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,na\rTARA_SOC_MAG_00010,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00005,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,na\rTARA_IOS_MAG_00041,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ANE_MAG_00080,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_ASE_MAG_00006,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_PSW_MAG_00086,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00079,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00007,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASW_MAG_00039,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_PSW_MAG_00056,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00087,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASW_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,na\rTARA_MED_MAG_00081,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSW_MAG_00098,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_RED_MAG_00104,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,na\rTARA_MED_MAG_00137,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\rTARA_IOS_MAG_00008,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,Oceanicaulis_alexandrii\rTARA_MED_MAG_00095,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00062,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_ANE_MAG_00071,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00115,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00049,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00035,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,na,na\rTARA_PSE_MAG_00037,Bacteria,na,na,na,na,na,na\rTARA_ASW_MAG_00015,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ASW_MAG_00034,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_ASE_MAG_00016,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00078,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ANE_MAG_00070,Bacteria,Bacteroidetes,Cytophagia,na,na,na,na\rTARA_MED_MAG_00048,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,na,na,na\rTARA_IOS_MAG_00026,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00133,Eukaryota,na,na,na,na,na,na\rTARA_ASW_MAG_00044,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,na\rTARA_ION_MAG_00073,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_RED_MAG_00103,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,na,na\rTARA_ION_MAG_00056,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00070,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_MED_MAG_00032,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_IOS_MAG_00029,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00150,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Moraxellaceae,na,na\rTARA_ANE_MAG_00051,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00014,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_PSW_MAG_00016,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00029,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_RED_MAG_00112,Eukaryota,na,na,na,na,na,na\rTARA_ANE_MAG_00078,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASE_MAG_00010,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00092,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_MED_MAG_00059,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_PSE_MAG_00078,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ANE_MAG_00038,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_MED_MAG_00091,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00059,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ANW_MAG_00043,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00009,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,na,na\rTARA_ASE_MAG_00007,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00042,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00022,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ASE_MAG_00019,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00023,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,na,na,na\rTARA_PSE_MAG_00084,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSE_MAG_00116,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_IOS_MAG_00033,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ANE_MAG_00069,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSW_MAG_00100,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00135,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00002,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,na\rTARA_RED_MAG_00072,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00142,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_ANE_MAG_00005,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00124,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASW_MAG_00014,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00040,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00050,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_PSE_MAG_00132,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,na\rTARA_MED_MAG_00053,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00028,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ASW_MAG_00046,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_PSW_MAG_00077,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PON_MAG_00087,Bacteria,na,na,na,na,na,na\rTARA_ASW_MAG_00041,Eukaryota,na,na,na,na,na,na\rTARA_IOS_MAG_00076,Eukaryota,na,na,na,na,na,na\rTARA_PSW_MAG_00018,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANE_MAG_00014,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_IOS_MAG_00049,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANE_MAG_00025,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00043,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00038,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_MED_MAG_00060,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00043,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ION_MAG_00055,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00047,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASW_MAG_00002,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSE_MAG_00048,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_IOS_MAG_00065,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00058,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_ANW_MAG_00012,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_IOS_MAG_00060,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00055,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00099,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ASW_MAG_00018,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_MED_MAG_00030,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASE_MAG_00009,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00054,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00138,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_PSW_MAG_00102,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00040,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00064,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00009,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANW_MAG_00051,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_ANE_MAG_00060,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ANE_MAG_00024,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00039,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ASE_MAG_00017,Bacteria,Cyanobacteria,na,na,na,na,na\rTARA_PON_MAG_00079,Eukaryota,Haptophyta,Prymnesiophyceae,Phaeocystales,Phaeocystaceae,Phaeocystis,na\rTARA_IOS_MAG_00073,Eukaryota,Heterokonta,Pelagophyceae,Pelagomonadales,Pelagomonadaceae,Aureococcus,na\rTARA_IOS_MAG_00013,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00053,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_RED_MAG_00087,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00128,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ASW_MAG_00025,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_IOS_MAG_00047,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00008,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00039,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00145,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ASW_MAG_00037,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_ANW_MAG_00023,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00075,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00098,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PON_MAG_00011,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PON_MAG_00051,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00016,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,na,na,na\rTARA_IOS_MAG_00004,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00023,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PSW_MAG_00083,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PON_MAG_00046,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_IOS_MAG_00003,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00090,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ASW_MAG_00008,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,na,na\rTARA_ANW_MAG_00029,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00012,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00075,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ION_MAG_00033,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00048,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00021,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANW_MAG_00075,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_PON_MAG_00012,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00039,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_ANW_MAG_00024,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00107,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_ASE_MAG_00018,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00116,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_PON_MAG_00007,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00053,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ASE_MAG_00020,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PSE_MAG_00010,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,na,na\rTARA_MED_MAG_00025,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ASW_MAG_00003,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanothece,Cyanothece,na\rTARA_ASE_MAG_00011,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ASW_MAG_00045,Eukaryota,na,na,na,na,na,na\rTARA_MED_MAG_00004,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00050,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,na\rTARA_PON_MAG_00006,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_MED_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00079,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ASW_MAG_00019,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00053,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,na,na\rTARA_PSE_MAG_00124,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ION_MAG_00044,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00042,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00109,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00047,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_PSW_MAG_00078,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00044,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00038,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00104,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,na,na\rTARA_PSE_MAG_00013,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PSW_MAG_00091,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_IOS_MAG_00036,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00020,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,na,na,na\rTARA_PSW_MAG_00094,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00042,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00021,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_MED_MAG_00121,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ASE_MAG_00027,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANW_MAG_00030,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSE_MAG_00110,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_ANW_MAG_00009,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,na\rTARA_ANE_MAG_00098,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_SOC_MAG_00011,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,Polaribacter,na\rTARA_ANW_MAG_00085,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ION_MAG_00004,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,na,na,na\rTARA_ASE_MAG_00025,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_SOC_MAG_00004,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00007,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00079,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ANE_MAG_00081,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00035,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ASE_MAG_00029,Bacteria,Bacteroidetes,Sphingobacteriia,Sphingobacteriales,Saprospiraceae,na,na\rTARA_PSE_MAG_00006,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANW_MAG_00053,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00122,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Anaplasmataceae,na,na\rTARA_IOS_MAG_00070,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00032,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,na,na\rTARA_ION_MAG_00011,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_RED_MAG_00059,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_SOC_MAG_00006,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00050,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00061,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_IOS_MAG_00051,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSE_MAG_00123,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,na\rTARA_RED_MAG_00051,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ANE_MAG_00034,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00083,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSW_MAG_00101,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00029,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_RED_MAG_00026,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00049,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00120,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00081,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_MED_MAG_00115,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00106,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00045,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00068,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ANE_MAG_00022,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PON_MAG_00016,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00099,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,na\rTARA_PSE_MAG_00101,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,na,na\rTARA_ASE_MAG_00008,Bacteria,Proteobacteria,Betaproteobacteria,Methylophilales,na,na,na\rTARA_ASW_MAG_00004,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_PSE_MAG_00018,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,na,na\rTARA_PSE_MAG_00023,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ION_MAG_00050,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_SOC_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00015,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PON_MAG_00026,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSE_MAG_00088,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_RED_MAG_00038,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSE_MAG_00147,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ASE_MAG_00035,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ANW_MAG_00007,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANE_MAG_00065,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00045,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00042,Bacteria,Proteobacteria,Betaproteobacteria,Methylophilales,na,na,na\rTARA_PON_MAG_00009,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ASE_MAG_00033,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_RED_MAG_00015,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00047,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00058,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,Pseudomonas_mendocina\rTARA_ANW_MAG_00005,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00131,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_ASE_MAG_00037,Eukaryota,Heterokonta,Pelagophyceae,Pelagomonadales,Pelagomonadaceae,Aureococcus,na\rTARA_MED_MAG_00010,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,na,na\rTARA_RED_MAG_00006,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSE_MAG_00066,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00084,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_RED_MAG_00093,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00024,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_ANE_MAG_00043,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00015,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,na,na,na\rTARA_ANW_MAG_00065,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_PSE_MAG_00083,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_MED_MAG_00119,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00025,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00025,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSE_MAG_00074,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00082,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00068,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,na,na\rTARA_ASW_MAG_00012,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,Maribacter,na\rTARA_IOS_MAG_00030,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00090,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_ANW_MAG_00048,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00092,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00018,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00068,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00092,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00031,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ION_MAG_00020,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASE_MAG_00012,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00109,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00028,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_RED_MAG_00063,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00046,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSW_MAG_00010,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00104,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00036,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,na\rTARA_PSE_MAG_00098,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_MED_MAG_00090,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_IOS_MAG_00016,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_IOS_MAG_00025,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00059,Bacteria,Verrucomicrobia,na,na,na,na,na\rTARA_MED_MAG_00020,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00029,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_IOS_MAG_00001,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00019,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00031,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_SOC_MAG_00014,Eukaryota,na,na,na,na,na,na\rTARA_ANW_MAG_00083,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_MED_MAG_00046,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PON_MAG_00039,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00029,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,na\rTARA_MED_MAG_00052,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00077,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_RED_MAG_00046,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00017,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_IOS_MAG_00018,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_MED_MAG_00077,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ION_MAG_00025,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,Labrenzia,na\rTARA_PSW_MAG_00093,Bacteria,Spirochaetes,Spirochaetia,na,na,na,na\rTARA_ANW_MAG_00013,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ANE_MAG_00097,Eukaryota,Haptophyta,Prymnesiophyceae,Isochrysidales,Noelaerhabdaceae,Emiliania,na\rTARA_ANW_MAG_00034,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00089,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_RED_MAG_00057,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_RED_MAG_00105,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,na,na\rTARA_ANE_MAG_00083,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00020,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_RED_MAG_00010,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00083,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_ASW_MAG_00013,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00036,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00077,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,na,na\rTARA_PSW_MAG_00028,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,na,na\rTARA_PSE_MAG_00089,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ASW_MAG_00024,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00045,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASE_MAG_00021,Bacteria,Bacteroidetes,Sphingobacteriia,Sphingobacteriales,Saprospiraceae,na,na\rTARA_PSW_MAG_00082,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00046,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00058,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_RED_MAG_00033,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSW_MAG_00030,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_RED_MAG_00042,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSW_MAG_00036,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_PSE_MAG_00148,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00060,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00085,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Nisaea,na\rTARA_RED_MAG_00074,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSE_MAG_00106,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,na,na\rTARA_ION_MAG_00040,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANE_MAG_00057,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PON_MAG_00023,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_PSW_MAG_00053,Bacteria,na,na,na,na,na,na\rTARA_ANE_MAG_00015,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ANE_MAG_00003,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_RED_MAG_00102,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00019,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00003,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_MED_MAG_00071,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00039,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSW_MAG_00068,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00099,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00041,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00036,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00100,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ASW_MAG_00010,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,na,na\rTARA_MED_MAG_00006,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00115,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ASE_MAG_00015,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00096,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00108,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSE_MAG_00127,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00046,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PON_MAG_00040,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00114,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_IOS_MAG_00059,Bacteria,na,na,na,na,na,na\rTARA_RED_MAG_00117,Bacteria,Firmicutes,Bacilli,na,na,na,na\rTARA_ANE_MAG_00010,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PON_MAG_00005,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00035,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_IOS_MAG_00019,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00048,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,na\rTARA_PON_MAG_00071,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_MED_MAG_00044,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00080,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00073,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00036,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ANW_MAG_00002,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,na,na,na\rTARA_ANE_MAG_00020,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ION_MAG_00034,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00042,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,na,na,na\rTARA_MED_MAG_00064,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_ASW_MAG_00016,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,na,na\rTARA_PON_MAG_00030,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,na,na\rTARA_ANW_MAG_00067,Bacteria,na,na,na,na,na,na\rTARA_ION_MAG_00032,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_ASE_MAG_00003,Bacteria,Bacteroidetes,Sphingobacteriia,Sphingobacteriales,Saprospiraceae,na,na\rTARA_PSE_MAG_00105,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSE_MAG_00144,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,na\rTARA_ANE_MAG_00094,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00058,Bacteria,na,na,na,na,na,na\rTARA_RED_MAG_00022,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_MED_MAG_00045,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_RED_MAG_00064,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ION_MAG_00060,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSW_MAG_00088,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSW_MAG_00085,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_RED_MAG_00052,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00028,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANW_MAG_00036,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,na,na,na\rTARA_PON_MAG_00077,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00033,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ANE_MAG_00066,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_IOS_MAG_00012,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00022,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,na,na,na\rTARA_PON_MAG_00049,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00130,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ANE_MAG_00092,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\rTARA_ANW_MAG_00016,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00060,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00087,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ION_MAG_00014,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_PSW_MAG_00006,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00073,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00059,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00028,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSW_MAG_00072,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ION_MAG_00031,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSE_MAG_00050,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00047,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_RED_MAG_00044,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00098,Bacteria,Bacteroidetes,na,na,na,na,na\rTARA_ANW_MAG_00026,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ASW_MAG_00040,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00064,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00120,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_PON_MAG_00010,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_RED_MAG_00020,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,na\rTARA_IOS_MAG_00031,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_IOS_MAG_00057,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_IOS_MAG_00056,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_IOS_MAG_00066,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00017,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_ANE_MAG_00037,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_ANE_MAG_00082,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ION_MAG_00029,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae_3,Sphingobium,na\rTARA_PSE_MAG_00061,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00084,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00072,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_ANW_MAG_00019,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,na,na,na\rTARA_PON_MAG_00055,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00075,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00080,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PSW_MAG_00012,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00016,Bacteria,Chloroflexi,na,na,na,na,na\rTARA_IOS_MAG_00063,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,na\rTARA_PON_MAG_00027,Bacteria,Ignavibacteriae,Ignavibacteria,Ignavibacteriales,na,na,na\rTARA_MED_MAG_00002,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00006,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00070,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_RED_MAG_00002,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_RED_MAG_00068,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00064,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00064,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00081,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PON_MAG_00001,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_PSW_MAG_00026,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfobacterales,Desulfobacteraceae,na,na\rTARA_IOS_MAG_00053,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ASW_MAG_00022,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,na,na\rTARA_PSW_MAG_00103,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00061,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSW_MAG_00096,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,na,na\rTARA_ION_MAG_00064,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00065,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00007,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_MED_MAG_00134,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_RED_MAG_00028,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PON_MAG_00056,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PSW_MAG_00122,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_RED_MAG_00004,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00055,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00020,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_IOS_MAG_00014,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00044,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_RED_MAG_00069,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00009,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00118,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSW_MAG_00038,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PSW_MAG_00054,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASE_MAG_00002,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PON_MAG_00058,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,na\rTARA_MED_MAG_00094,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSE_MAG_00131,Bacteria,Proteobacteria,Epsilonproteobacteria,Campylobacterales,Campylobacteraceae,Arcobacter,na\rTARA_SOC_MAG_00012,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00022,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSW_MAG_00065,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_IOS_MAG_00058,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00026,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANW_MAG_00018,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00002,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00048,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_MED_MAG_00122,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASW_MAG_00043,Eukaryota,na,na,na,na,na,na\rTARA_MED_MAG_00005,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_MED_MAG_00129,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_MED_MAG_00086,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00057,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_IOS_MAG_00015,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00011,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_ANW_MAG_00062,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00044,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_PSW_MAG_00071,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00022,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,na\rTARA_ANE_MAG_00030,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00030,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_MED_MAG_00057,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_PSW_MAG_00128,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,na,na\rTARA_ANE_MAG_00013,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00044,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00139,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_PSE_MAG_00071,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00004,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_IOS_MAG_00064,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00042,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PON_MAG_00052,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00015,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,na\rTARA_PSE_MAG_00019,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ION_MAG_00036,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00106,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00109,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00033,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00020,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ION_MAG_00038,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00055,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00053,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00130,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_ANE_MAG_00033,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ANE_MAG_00027,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00099,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ANE_MAG_00046,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00136,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_MED_MAG_00087,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,na,na,na\rTARA_MED_MAG_00003,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ASW_MAG_00017,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ION_MAG_00041,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_PSW_MAG_00130,Bacteria,Planctomycetes,na,na,na,na,na\rTARA_PSE_MAG_00090,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00094,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00058,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_RED_MAG_00109,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_MED_MAG_00027,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSW_MAG_00097,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00070,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00004,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00080,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00022,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_RED_MAG_00111,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00052,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_IOS_MAG_00077,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00121,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_RED_MAG_00021,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_MED_MAG_00126,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANW_MAG_00060,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_SOC_MAG_00003,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00118,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_RED_MAG_00110,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PON_MAG_00069,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSW_MAG_00013,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,na\rTARA_IOS_MAG_00037,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00046,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00033,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00035,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00025,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_ION_MAG_00018,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00052,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ANW_MAG_00014,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00062,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,na,na\rTARA_PSW_MAG_00107,Bacteria,Chloroflexi,na,na,na,na,na\rTARA_ASW_MAG_00026,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,na\rTARA_PON_MAG_00042,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,na\rTARA_PSE_MAG_00042,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,na\rTARA_IOS_MAG_00055,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ANE_MAG_00061,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSW_MAG_00069,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ION_MAG_00024,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00044,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_ASE_MAG_00028,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_IOS_MAG_00010,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00023,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_RED_MAG_00047,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ANW_MAG_00032,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_PSE_MAG_00100,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,na\rTARA_MED_MAG_00016,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00041,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ION_MAG_00057,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSE_MAG_00056,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSW_MAG_00123,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANE_MAG_00031,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Moraxellaceae,Psychrobacter,na\rTARA_PSW_MAG_00105,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_ANW_MAG_00040,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,na,na\rTARA_PSE_MAG_00111,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,na,na\rTARA_PSW_MAG_00127,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PON_MAG_00072,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_ION_MAG_00002,Bacteria,Proteobacteria,Alphaproteobacteria,Caulobacterales,Caulobacteraceae,Brevundimonas,na\rTARA_PON_MAG_00002,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_ASW_MAG_00023,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_RED_MAG_00086,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_RED_MAG_00075,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ANW_MAG_00084,Eukaryota,Cryptophyta,Cryptophyceae,Pyrenomonadales,Geminigeraceae,Guillardia,na\rTARA_PSE_MAG_00091,Bacteria,Actinobacteria,Actinobacteria,na,na,na,na\rTARA_PSE_MAG_00032,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSE_MAG_00055,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00006,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_IOS_MAG_00028,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PSE_MAG_00103,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,na\rTARA_MED_MAG_00039,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00015,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_PSE_MAG_00128,Bacteria,Proteobacteria,Gammaproteobacteria,Vibrionales,Vibrionaceae,Vibrio,na\rTARA_ASW_MAG_00001,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00043,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00057,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00089,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00067,Bacteria,Bacteroidetes,na,na,na,na,na\rTARA_MED_MAG_00047,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00028,Bacteria,Candidate_Phyla_Radiation,na,na,na,na,na\rTARA_MED_MAG_00132,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,na,na\rTARA_PON_MAG_00085,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ANW_MAG_00050,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00029,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ION_MAG_00067,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_MED_MAG_00034,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSE_MAG_00141,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00011,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_ION_MAG_00054,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00114,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ANE_MAG_00016,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PON_MAG_00075,Bacteria,na,na,na,na,na,na\rTARA_IOS_MAG_00078,Eukaryota,na,na,na,na,na,na\rTARA_RED_MAG_00076,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ANE_MAG_00052,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_ANW_MAG_00010,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PSE_MAG_00072,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_ANW_MAG_00027,Bacteria,Candidate_Phyla_Radiation,na,na,na,na,na\rTARA_PON_MAG_00068,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00127,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00088,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00082,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00097,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_IOS_MAG_00048,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_PSE_MAG_00125,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PON_MAG_00062,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,na,na\rTARA_RED_MAG_00043,Bacteria,Candidatus_Marinimicrobia ,na,na,na,na,na\rTARA_ANW_MAG_00039,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00093,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_PSW_MAG_00113,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSE_MAG_00038,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ION_MAG_00016,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00112,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PSW_MAG_00033,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PON_MAG_00065,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00061,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00019,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_ION_MAG_00009,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_PSE_MAG_00097,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,na\rTARA_RED_MAG_00085,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00126,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PSE_MAG_00058,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00054,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ANW_MAG_00059,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,na,na\rTARA_RED_MAG_00101,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_RED_MAG_00024,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_RED_MAG_00066,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00008,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_PSE_MAG_00065,Bacteria,Firmicutes,Clostridia,Clostridiales,na,na,na\rTARA_MED_MAG_00013,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00035,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00055,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_RED_MAG_00094,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_ANE_MAG_00063,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSE_MAG_00059,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00034,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00037,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00081,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_ASW_MAG_00033,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00023,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00043,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00038,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00064,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_RED_MAG_00071,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,na,na,na\rTARA_SOC_MAG_00007,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00018,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00134,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,na,na\rTARA_PSE_MAG_00011,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00014,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00050,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ASW_MAG_00020,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_RED_MAG_00019,Bacteria,Chloroflexi,na,na,na,na,na\rTARA_ION_MAG_00051,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,na,na\rTARA_ION_MAG_00052,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ION_MAG_00037,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Cyclobacteriaceae,Algoriphagus,na\rTARA_ANW_MAG_00070,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,na,na\rTARA_RED_MAG_00070,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_RED_MAG_00003,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00107,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_PON_MAG_00057,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00095,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_RED_MAG_00032,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00080,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSW_MAG_00126,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfobacterales,Desulfobulbaceae,na,na\rTARA_PSW_MAG_00037,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_IOS_MAG_00034,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ION_MAG_00049,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00114,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,na,na\rTARA_RED_MAG_00041,Bacteria,Chloroflexi,na,na,na,na,na\rTARA_RED_MAG_00081,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_IOS_MAG_00040,Bacteria,Proteobacteria,Betaproteobacteria,na,na,na,na\rTARA_SOC_MAG_00008,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_ANE_MAG_00056,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_ANE_MAG_00012,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_ANE_MAG_00011,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PON_MAG_00017,Bacteria,Candidate_Phyla_Radiation,na,na,na,na,na\rTARA_PON_MAG_00067,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00110,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_RED_MAG_00065,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00124,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PSE_MAG_00133,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,na,na\rTARA_PON_MAG_00004,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_PSW_MAG_00112,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00115,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00011,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,na,na,na\rTARA_PSW_MAG_00014,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,na,na,na\rTARA_PON_MAG_00084,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00063,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00054,Bacteria,na,na,na,na,na,na\rTARA_MED_MAG_00111,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_PSE_MAG_00051,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PON_MAG_00008,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,na,na,na\rTARA_PON_MAG_00024,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_ANW_MAG_00055,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_RED_MAG_00005,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_ANE_MAG_00008,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00117,Bacteria,na,na,na,na,na,na\rTARA_SOC_MAG_00013,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00017,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,na,na,na\rTARA_ION_MAG_00001,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00024,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_ANW_MAG_00069,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00060,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00053,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00056,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSW_MAG_00125,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00031,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_MED_MAG_00049,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Oxalobacteraceae,na,na\rTARA_RED_MAG_00100,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_ANW_MAG_00079,Eukaryota,na,na,na,na,na,na\rTARA_PON_MAG_00043,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSW_MAG_00132,Bacteria,na,na,na,na,na,na\rTARA_RED_MAG_00079,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_IOS_MAG_00069,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_MED_MAG_00143,Eukaryota,na,na,na,na,na,na\rTARA_MED_MAG_00069,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00108,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00138,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,na,na\rTARA_PSW_MAG_00118,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_PSE_MAG_00102,Bacteria,Proteobacteria,Deltaproteobacteria,na,na,na,na\rTARA_RED_MAG_00078,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_MED_MAG_00066,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00113,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00076,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_SOC_MAG_00005,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,na,na,na\rTARA_PON_MAG_00066,Bacteria,Acidobacteria,na,na,na,na,na\rTARA_PON_MAG_00076,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,na,na,na\rTARA_MED_MAG_00074,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00087,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_ANE_MAG_00073,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,na,na,na\rTARA_RED_MAG_00121,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00083,Eukaryota,na,na,na,na,na,na\rTARA_PSE_MAG_00119,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,na\rTARA_PON_MAG_00018,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_ANE_MAG_00054,Bacteria,na,na,na,na,na,na\rTARA_ANW_MAG_00072,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00076,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00067,Bacteria,Proteobacteria,Betaproteobacteria,na,na,na,na\rTARA_RED_MAG_00091,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_RED_MAG_00097,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_MED_MAG_00089,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,na,na,na\rTARA_RED_MAG_00031,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_PSE_MAG_00021,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,na,na,na\rTARA_ANW_MAG_00041,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_MED_MAG_00125,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,na,na\rTARA_PON_MAG_00086,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Azospirillum,na\rTARA_IOS_MAG_00062,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_PSE_MAG_00085,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_MED_MAG_00102,Bacteria,Proteobacteria,Alphaproteobacteria,na,na,na,na\rTARA_MED_MAG_00061,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_PSE_MAG_00122,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSW_MAG_00121,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_MED_MAG_00116,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00117,Bacteria,Verrucomicrobia,Opitutae,Opitutales,na,na,na\rTARA_RED_MAG_00049,Archaea,Euryarchaeota,na,na,na,na,na\rTARA_PSW_MAG_00120,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,na,na\rTARA_PON_MAG_00063,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,na,na,na\rTARA_RED_MAG_00077,Bacteria,Chloroflexi,Dehalococcoidetes,na,na,na,na\rTARA_MED_MAG_00120,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_RED_MAG_00054,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSE_MAG_00086,Bacteria,Proteobacteria,na,na,na,na,na\rTARA_PSE_MAG_00054,Bacteria,Proteobacteria,Gammaproteobacteria,na,na,na,na\rTARA_PSE_MAG_00045,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_PSE_MAG_00041,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,na,na\rTARA_ANE_MAG_00062,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,na,na\rTARA_PON_MAG_00088,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,Myxococcaceae,na,na\rTARA_RED_MAG_00067,Bacteria,na,na,na,na,na,na\rTARA_PSE_MAG_00063,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,na,na,na\rTARA_MED_MAG_00123,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_RED_MAG_00113,Bacteria,na,na,na,na,na,na\rTARA_PSW_MAG_00021,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,na,na,na\rTARA_RED_MAG_00082,Bacteria,na,na,na,na,na,na\rTARA_PON_MAG_00048,Bacteria,Verrucomicrobia,na,na,na,na,na\rTARA_PON_MAG_00044,Bacteria,Candidate_Phyla_Radiation,na,na,na,na,na"
  },
  {
    "path": "tests/test-data/lca/tully-genome-sigs.classify.csv",
    "content": "ID,status,superkingdom,phylum,class,order,family,genus,species\r\nTOBG_ARS-1,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_ARS-10,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-100,nomatch,,,,,,,\r\nTOBG_ARS-1004,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_ARS-1005,nomatch,,,,,,,\r\nTOBG_ARS-1007,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_ARS-1008,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,novelGenus_A,\r\nTOBG_ARS-1009,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_ARS-101,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_ARS-1011,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_ARS-1012,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_ARS-1013,found,Bacteria,Chloroflexi,Dehalococcoidia,Dehalococcoidales,novelFamily_A,,\r\nTOBG_ARS-1015,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_ARS-1016,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_ARS-1018,found,Archaea,,,,,,\r\nTOBG_ARS-1019,nomatch,,,,,,,\r\nTOBG_ARS-102,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-1020,found,Archaea,Thaumarchaeota,novelClass_A,,,,\r\nTOBG_ARS-1021,nomatch,,,,,,,\r\nTOBG_ARS-1023,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_ARS-1024,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Aestuariibacter,aggregatus\r\nTOBG_ARS-1025,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_ARS-1026,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_ARS-1028,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_ARS-1029,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_ARS-103,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1030,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_ARS-1032,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_ARS-1033,nomatch,,,,,,,\r\nTOBG_ARS-1034,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_ARS-1035,found,Bacteria,Poribacteria,,,,,\r\nTOBG_ARS-1036,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_ARS-1037,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_ARS-1039,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_ARS-104,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Zunongwangia,profunda\r\nTOBG_ARS-1040,disagree,,,,,,,\r\nTOBG_ARS-1041,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-1043,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Colwelliaceae,,\r\nTOBG_ARS-105,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_ARS-106,nomatch,,,,,,,\r\nTOBG_ARS-108,found,Archaea,,,,,,\r\nTOBG_ARS-109,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-11,nomatch,,,,,,,\r\nTOBG_ARS-112,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Sutterellaceae,,\r\nTOBG_ARS-1126,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-113,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_ARS-1134,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_ARS-115,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_ARS-116,nomatch,,,,,,,\r\nTOBG_ARS-1160,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1168,found,Bacteria,Chloroflexi,Dehalococcoidia,Dehalococcoidales,novelFamily_A,,\r\nTOBG_ARS-117,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-1172,found,Archaea,Nanoarchaoeta,,,,,\r\nTOBG_ARS-1176,found,Archaea,,,,,,\r\nTOBG_ARS-1178,found,Archaea,,,,,,\r\nTOBG_ARS-118,nomatch,,,,,,,\r\nTOBG_ARS-1180,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1182,nomatch,,,,,,,\r\nTOBG_ARS-1183,found,Bacteria,Woesebacteria,,,,,\r\nTOBG_ARS-1193,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-1199,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_ARS-120,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_ARS-1203,found,Archaea,,,,,,\r\nTOBG_ARS-121,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,,\r\nTOBG_ARS-1215,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_ARS-1224,found,Bacteria,Planctomycetes,Phycisphaerae,,,,\r\nTOBG_ARS-123,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_ARS-124,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_ARS-1246,nomatch,,,,,,,\r\nTOBG_ARS-125,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-1279,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,,,\r\nTOBG_ARS-1285,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1286,found,Archaea,Nanoarchaoeta,,,,,\r\nTOBG_ARS-1290,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-1297,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_ARS-1298,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-13,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_ARS-1301,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1304,nomatch,,,,,,,\r\nTOBG_ARS-1307,found,Archaea,Diapherotrites,,,,,\r\nTOBG_ARS-1309,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1310,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_ARS-1318,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-1330,found,Bacteria,Chloroflexi,Dehalococcoidia,Dehalococcoidales,novelFamily_A,,\r\nTOBG_ARS-1333,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_ARS-1334,found,Archaea,,,,,,\r\nTOBG_ARS-1358,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_ARS-1360,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-1386,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-1394,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-14,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_ARS-1403,found,Archaea,Nanoarchaoeta,,,,,\r\nTOBG_ARS-1414,found,Archaea,,,,,,\r\nTOBG_ARS-1419,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-1420,found,Archaea,Nanoarchaoeta,,,,,\r\nTOBG_ARS-1426,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_ARS-1427,found,Archaea,Diapherotrites,,,,,\r\nTOBG_ARS-1434,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-1441,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-15,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-16,nomatch,,,,,,,\r\nTOBG_ARS-17,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_ARS-18,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_ARS-19,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_ARS-2,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,stutzeri\r\nTOBG_ARS-20,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_ARS-21,found,Archaea,,,,,,\r\nTOBG_ARS-22,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_ARS-23,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-24,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_ARS-25,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_ARS-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_ARS-27,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_ARS-28,found,Bacteria,Poribacteria,,,,,\r\nTOBG_ARS-29,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_ARS-3,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Blastomonas,\r\nTOBG_ARS-30,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_ARS-31,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_ARS-32,nomatch,,,,,,,\r\nTOBG_ARS-33,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_ARS-34,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_ARS-35,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_ARS-36,found,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfobacterales,Desulfobacteraceae,Desulfobacter,\r\nTOBG_ARS-37,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,Halobacteriovorax,\r\nTOBG_ARS-38,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Oxalobacteraceae,Herbaspirillum,seropedicae\r\nTOBG_ARS-39,nomatch,,,,,,,\r\nTOBG_ARS-4,found,Bacteria,Proteobacteria,Alphaproteobacteria,Magnetococcales,,,\r\nTOBG_ARS-40,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_ARS-41,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_ARS-42,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_ARS-43,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_ARS-44,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_ARS-45,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_ARS-46,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_ARS-47,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_ARS-48,nomatch,,,,,,,\r\nTOBG_ARS-49,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-5,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Pelagibaca,\r\nTOBG_ARS-50,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_ARS-51,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_F,\r\nTOBG_ARS-52,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-53,found,Eukaryota,,,,,,\r\nTOBG_ARS-54,found,Archaea,,,,,,\r\nTOBG_ARS-55,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-56,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-57,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-58,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_ARS-59,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Geminicoccus,\r\nTOBG_ARS-6,nomatch,,,,,,,\r\nTOBG_ARS-60,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_ARS-61,found,Bacteria,Poribacteria,,,,,\r\nTOBG_ARS-62,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Croceicoccus,\r\nTOBG_ARS-63,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-64,nomatch,,,,,,,\r\nTOBG_ARS-65,found,Bacteria,Planctomycetes,Phycisphaerae,Phycisphaerales,Phycisphaeraceae,novelGenus_B,\r\nTOBG_ARS-66,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_ARS-67,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_ARS-68,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-69,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_ARS-7,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,Marinomonas,mediterranea\r\nTOBG_ARS-70,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_ARS-71,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_ARS-72,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_ARS-73,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-733,nomatch,,,,,,,\r\nTOBG_ARS-74,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_ARS-75,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,OPB35soil,\r\nTOBG_ARS-76,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_ARS-77,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_ARS-78,nomatch,,,,,,,\r\nTOBG_ARS-79,found,Bacteria,Chloroflexi,Dehalococcoidia,Dehalococcoidales,novelFamily_A,,\r\nTOBG_ARS-8,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_ARS-80,nomatch,,,,,,,\r\nTOBG_ARS-81,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_ARS-82,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Morazellaceae,Psychrobacter,\r\nTOBG_ARS-83,nomatch,,,,,,,\r\nTOBG_ARS-84,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_ARS-85,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_ARS-86,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_ARS-87,found,Bacteria,Poribacteria,,,,,\r\nTOBG_ARS-88,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_ARS-89,found,Bacteria,Proteobacteria,Nitrospinae,,,,\r\nTOBG_ARS-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_ARS-90,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_ARS-91,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_ARS-92,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_ARS-93,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_ARS-94,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_ARS-95,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_ARS-96,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_ARS-97,nomatch,,,,,,,\r\nTOBG_ARS-98,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_F,\r\nTOBG_ARS-99,nomatch,,,,,,,\r\nTOBG_CPC-1,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_CPC-10,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_CPC-100,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_CPC-11,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_CPC-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_CPC-1232,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,Porticoccus,\r\nTOBG_CPC-13,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Chromatiaceae,Rheinheimera,\r\nTOBG_CPC-1326,nomatch,,,,,,,\r\nTOBG_CPC-1328,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_CPC-1337,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_CPC-1357,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_CPC-1365,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_CPC-1369,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_CPC-1382,nomatch,,,,,,,\r\nTOBG_CPC-1397,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_CPC-1399,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_CPC-14,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_CPC-1446,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_CPC-1447,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_CPC-1462,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_CPC-1469,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_A,,\r\nTOBG_CPC-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_CPC-16,nomatch,,,,,,,\r\nTOBG_CPC-17,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_CPC-18,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-19,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-2,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_CPC-20,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_CPC-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Tistrella,\r\nTOBG_CPC-22,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_CPC-23,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_CPC-24,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,Oceanospirillum,\r\nTOBG_CPC-25,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_CPC-26,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_CPC-27,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_CPC-28,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-288,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_CPC-289,nomatch,,,,,,,\r\nTOBG_CPC-29,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_CPC-290,nomatch,,,,,,,\r\nTOBG_CPC-291,nomatch,,,,,,,\r\nTOBG_CPC-293,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_CPC-294,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Zunongwangia,profunda\r\nTOBG_CPC-295,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_CPC-296,found,Bacteria,,,,,,\r\nTOBG_CPC-297,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_CPC-299,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_CPC-3,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_CPC-30,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_CPC-300,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_CPC-301,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_CPC-302,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Novosphingobium,\r\nTOBG_CPC-305,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_CPC-306,nomatch,,,,,,,\r\nTOBG_CPC-307,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_CPC-309,nomatch,,,,,,,\r\nTOBG_CPC-31,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Gimesia,\r\nTOBG_CPC-310,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_CPC-311,nomatch,,,,,,,\r\nTOBG_CPC-313,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_CPC-314,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_CPC-315,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_CPC-316,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_CPC-317,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_CPC-319,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_CPC-32,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,Parvibaculum,\r\nTOBG_CPC-320,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_CPC-322,nomatch,,,,,,,\r\nTOBG_CPC-323,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_CPC-324,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_B,,\r\nTOBG_CPC-325,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,CandidatusPuniceispirillum,\r\nTOBG_CPC-326,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_CPC-327,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_CPC-33,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_CPC-34,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_CPC-35,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_CPC-36,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_CPC-38,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Stappia,\r\nTOBG_CPC-39,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_CPC-4,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_CPC-40,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-41,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_D,,\r\nTOBG_CPC-42,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,\r\nTOBG_CPC-43,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_CPC-44,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_CPC-45,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-46,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_CPC-47,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_CPC-48,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_CPC-49,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_CPC-5,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_CPC-50,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_CPC-51,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_CPC-52,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,DEV007,,\r\nTOBG_CPC-53,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_CPC-54,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingorhabdus,\r\nTOBG_CPC-55,nomatch,,,,,,,\r\nTOBG_CPC-56,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_CPC-57,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_CPC-58,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_CPC-59,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Chromatiaceae,Rheinheimera,\r\nTOBG_CPC-60,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_CPC-61,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_CPC-62,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,,\r\nTOBG_CPC-63,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_CPC-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,Bermanella,\r\nTOBG_CPC-65,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_CPC-66,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_CPC-67,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_CPC-68,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_CPC-69,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_CPC-7,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_CPC-70,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_CPC-71,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_E,\r\nTOBG_CPC-72,found,Bacteria,Proteobacteria,Gammaproteobacteria,Salinisphaerales,Salinisphaeraceae,,\r\nTOBG_CPC-73,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_CPC-74,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_CPC-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_CPC-76,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_CPC-77,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-78,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_CPC-79,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_CPC-8,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_CPC-80,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_CPC-81,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_CPC-82,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_CPC-83,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_CPC-84,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_CPC-85,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_CPC-86,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,FS140-16B-02marinegroup,,\r\nTOBG_CPC-87,nomatch,,,,,,,\r\nTOBG_CPC-88,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,Sandracinaceae,Sandaracinus,\r\nTOBG_CPC-89,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_CPC-9,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_CPC-90,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_CPC-91,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_CPC-92,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_CPC-93,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_CPC-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_CPC-95,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_CPC-96,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,novelFamily_A,,\r\nTOBG_CPC-97,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,,,\r\nTOBG_CPC-98,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Winogradskyella,\r\nTOBG_CPC-99,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_EAC-1,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,,\r\nTOBG_EAC-10,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_EAC-100,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_EAC-101,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_EAC-102,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_EAC-103,nomatch,,,,,,,\r\nTOBG_EAC-104,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_EAC-105,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_EAC-106,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_EAC-107,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_EAC-108,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_EAC-109,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Altibacter,\r\nTOBG_EAC-11,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-110,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_EAC-111,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_EAC-112,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_EAC-113,found,Bacteria,SBR1093,,,,,\r\nTOBG_EAC-114,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_EAC-115,nomatch,,,,,,,\r\nTOBG_EAC-116,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingobium,\r\nTOBG_EAC-117,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-118,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-119,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_EAC-12,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_EAC-120,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-121,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_EAC-122,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-123,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_EAC-13,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_EAC-14,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,\r\nTOBG_EAC-15,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Aurantimonadaceae,Aurantimonas,\r\nTOBG_EAC-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Oceanibulbus,\r\nTOBG_EAC-17,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Aestuariibacter,aggregatus\r\nTOBG_EAC-1768,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_EAC-1775,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_EAC-1785,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_EAC-1786,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-1795,found,Bacteria,Poribacteria,,,,,\r\nTOBG_EAC-18,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,,,\r\nTOBG_EAC-19,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_EAC-1924,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_EAC-1938,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_EAC-1972,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_EAC-1995,nomatch,,,,,,,\r\nTOBG_EAC-2,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_EAC-20,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_EAC-2003,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_EAC-2006,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_EAC-2011,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_EAC-2021,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_EAC-2025,nomatch,,,,,,,\r\nTOBG_EAC-2037,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_EAC-2038,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_EAC-2047,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_EAC-2074,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-2087,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_EAC-2090,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_EAC-2092,nomatch,,,,,,,\r\nTOBG_EAC-2094,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-21,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-2107,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_EAC-22,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_EAC-23,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_EAC-24,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_EAC-25,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE1,\r\nTOBG_EAC-27,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_EAC-28,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_EAC-29,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_EAC-3,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Zunongwangia,profunda\r\nTOBG_EAC-30,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_EAC-31,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_EAC-32,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_EAC-33,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_EAC-34,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_EAC-35,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_EAC-36,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_EAC-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_EAC-38,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_EAC-39,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_EAC-4,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,\r\nTOBG_EAC-40,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_EAC-41,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_EAC-42,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_EAC-43,found,Bacteria,Planctomycetes,Phycisphaerae,SM1A02,,,\r\nTOBG_EAC-44,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_EAC-45,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_EAC-46,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_B\r\nTOBG_EAC-47,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-48,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_EAC-49,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_EAC-5,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_EAC-50,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_EAC-51,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_EAC-52,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_EAC-53,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_EAC-54,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Nocardioidaceae,Nocardioides,\r\nTOBG_EAC-55,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_EAC-56,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_EAC-57,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-58,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Cellvibrionaceae,Marinimicrobium,agarilyticum\r\nTOBG_EAC-59,nomatch,,,,,,,\r\nTOBG_EAC-6,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Henriciella,\r\nTOBG_EAC-60,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,Parvibaculum,\r\nTOBG_EAC-61,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Hyphomicrobiaceae,Pelagibacterium,halotolerans\r\nTOBG_EAC-615,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_EAC-62,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_EAC-622,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_EAC-623,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-624,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-625,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_EAC-627,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_EAC-628,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_EAC-63,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_EAC-630,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_EAC-631,nomatch,,,,,,,\r\nTOBG_EAC-632,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_EAC-634,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_EAC-635,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_EAC-636,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_EAC-637,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_EAC-638,nomatch,,,,,,,\r\nTOBG_EAC-64,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_EAC-640,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_EAC-641,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_EAC-642,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_EAC-645,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Paracoccus,\r\nTOBG_EAC-646,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_EAC-647,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_EAC-649,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-65,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_EAC-650,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_EAC-651,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_EAC-652,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_EAC-653,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_EAC-654,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_EAC-656,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_EAC-657,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_EAC-659,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_EAC-66,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Mesonia,\r\nTOBG_EAC-660,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_EAC-662,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,OPB35soil,\r\nTOBG_EAC-663,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_EAC-669,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_EAC-67,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_EAC-670,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Dinoroseobacter,\r\nTOBG_EAC-671,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_EAC-673,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_EAC-674,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_EAC-675,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_EAC-676,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_EAC-678,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_EAC-68,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Gramella,\r\nTOBG_EAC-682,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-683,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Aurantimonadaceae,Martelella,\r\nTOBG_EAC-685,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_EAC-69,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_EAC-691,found,Archaea,Thaumarchaeota,novelClass_A,,,,\r\nTOBG_EAC-692,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_EAC-693,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_EAC-694,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_EAC-695,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_EAC-7,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-70,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Croceibacter,atlanticus\r\nTOBG_EAC-703,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_EAC-704,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_EAC-705,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-707,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_EAC-708,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_EAC-709,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_EAC-71,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_EAC-710,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_EAC-712,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_EAC-713,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_EAC-714,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_EAC-72,found,Bacteria,Planctomycetes,Pla3,,,,\r\nTOBG_EAC-720,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_EAC-721,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_EAC-723,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-73,nomatch,,,,,,,\r\nTOBG_EAC-74,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cryomorphaceae,Owenweeksia,\r\nTOBG_EAC-75,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_EAC-76,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Maritimibacter,\r\nTOBG_EAC-77,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,Parvibaculum,\r\nTOBG_EAC-78,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-79,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_A,\r\nTOBG_EAC-8,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_EAC-80,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_EAC-81,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-82,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_EAC-83,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_EAC-84,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_EAC-85,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_EAC-86,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-87,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Tistrella,\r\nTOBG_EAC-88,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_EAC-89,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_EAC-9,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_EAC-90,nomatch,,,,,,,\r\nTOBG_EAC-91,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Hahellaceae,,\r\nTOBG_EAC-92,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_A\r\nTOBG_EAC-93,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_EAC-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,\r\nTOBG_EAC-95,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Xanthomarina,\r\nTOBG_EAC-96,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_EAC-97,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_EAC-98,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Croceicoccus,\r\nTOBG_EAC-99,found,Bacteria,SBR1093,,,,,\r\nTOBG_IN-1,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,stutzeri\r\nTOBG_IN-10,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_IN-1000,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_IN-1003,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_IN-1073,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_IN-1077,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_IN-1093,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_IN-11,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_IN-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_IN-1207,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_IN-1213,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_IN-1214,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_IN-1219,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_IN-1222,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_IN-13,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_IN-1311,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_IN-14,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_IN-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_IN-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Caulobacterales,Caulobacteraceae,Brevundimonas,\r\nTOBG_IN-17,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_B,novelSpecies_B\r\nTOBG_IN-18,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_IN-19,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_IN-2,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,Xanthomarina\r\nTOBG_IN-20,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_IN-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sneathiellales,Sneathiellaceae,Sneathiella,\r\nTOBG_IN-22,found,Bacteria,Proteobacteria,Alphaproteobacteria,Caulobacterales,Caulobacteraceae,Brevundimonas,\r\nTOBG_IN-23,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_A\r\nTOBG_IN-24,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,Xanthomonadaceae,Arenimonas,\r\nTOBG_IN-25,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_IN-26,nomatch,,,,,,,\r\nTOBG_IN-27,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_IN-28,nomatch,,,,,,,\r\nTOBG_IN-29,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Spongiibacteraceae,spongiibacter,marinus\r\nTOBG_IN-3,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Morazellaceae,Acinetobacter,\r\nTOBG_IN-30,nomatch,,,,,,,\r\nTOBG_IN-31,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_IN-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_IN-33,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_IN-34,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_IN-35,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_IN-36,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_IN-37,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_IN-38,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_IN-39,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_IN-4,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_IN-40,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_IN-41,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_IN-42,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_IN-43,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_IN-44,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_IN-45,nomatch,,,,,,,\r\nTOBG_IN-46,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_IN-47,disagree,,,,,,,\r\nTOBG_IN-48,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_IN-49,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_IN-5,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_IN-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_IN-7,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_IN-8,found,Bacteria,Proteobacteria,Alphaproteobacteria,Caulobacterales,Caulobacteraceae,Phenylobacterium,\r\nTOBG_IN-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_IN-912,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_IN-913,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_IN-918,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_IN-919,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_IN-921,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_IN-922,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,stutzeri\r\nTOBG_IN-924,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_IN-926,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_IN-928,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_IN-929,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE1,\r\nTOBG_IN-930,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_IN-961,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_MED-1001,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_MED-1003,nomatch,,,,,,,\r\nTOBG_MED-1008,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-1017,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Agrococcus,\r\nTOBG_MED-1036,nomatch,,,,,,,\r\nTOBG_MED-104,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-1046,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-1047,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_MED-105,found,Bacteria,Cyanobacteria,unassigned,Prochlorales,Prochlorococcaceae,Prochlorococcus,\r\nTOBG_MED-1076,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_MED-1079,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_MED-1093,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_MED-1094,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_A,,\r\nTOBG_MED-1105,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-1116,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-1122,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_B,,\r\nTOBG_MED-1131,nomatch,,,,,,,\r\nTOBG_MED-1153,nomatch,,,,,,,\r\nTOBG_MED-1155,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_MED-1178,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_MED-1190,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_MED-1222,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_MED-1223,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_MED-1227,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_MED-1229,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_MED-1233,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_MED-124,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_MED-1247,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_MED-1250,nomatch,,,,,,,\r\nTOBG_MED-1257,nomatch,,,,,,,\r\nTOBG_MED-1261,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_MED-1269,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_MED-1270,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_MED-139,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-174,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_MED-191,nomatch,,,,,,,\r\nTOBG_MED-195,nomatch,,,,,,,\r\nTOBG_MED-203,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-211,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_MED-215,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_MED-569,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_MED-580,nomatch,,,,,,,\r\nTOBG_MED-581,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-582,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_MED-583,nomatch,,,,,,,\r\nTOBG_MED-584,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_MED-585,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-586,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-587,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,,,\r\nTOBG_MED-588,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,\r\nTOBG_MED-589,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-590,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_MED-591,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_F,,,\r\nTOBG_MED-592,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_MED-593,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,novelGenus_A,\r\nTOBG_MED-594,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_MED-595,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-596,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,,,\r\nTOBG_MED-597,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_MED-598,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-599,found,Bacteria,Poribacteria,,,,,\r\nTOBG_MED-600,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-601,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,\r\nTOBG_MED-602,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-603,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-604,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-605,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-606,nomatch,,,,,,,\r\nTOBG_MED-607,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_MED-608,nomatch,,,,,,,\r\nTOBG_MED-609,found,Bacteria,Planctomycetes,Pla3,,,,\r\nTOBG_MED-610,nomatch,,,,,,,\r\nTOBG_MED-611,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE1,\r\nTOBG_MED-612,found,Bacteria,Proteobacteria,Gammaproteobacteria,unassigned,unassigned,CaThioglobus,\r\nTOBG_MED-613,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_MED-614,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-615,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE1,\r\nTOBG_MED-616,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_MED-617,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-618,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-619,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-620,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Nisaea,\r\nTOBG_MED-621,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-622,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-623,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_MED-624,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_MED-625,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_MED-626,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-627,found,Bacteria,Bacteroidetes,Saprospiria,Saprospirales,,,\r\nTOBG_MED-628,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_MED-629,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_B,,\r\nTOBG_MED-630,found,Bacteria,Cyanobacteria,unassigned,Prochlorales,Prochlorococcaceae,Prochlorococcus,\r\nTOBG_MED-631,nomatch,,,,,,,\r\nTOBG_MED-632,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_MED-633,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_MED-634,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,,,\r\nTOBG_MED-635,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_MED-636,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_D,\r\nTOBG_MED-637,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_MED-638,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_MED-639,nomatch,,,,,,,\r\nTOBG_MED-640,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_MED-641,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_MED-642,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-643,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_B,\r\nTOBG_MED-644,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_MED-645,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-646,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_MED-647,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-648,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-649,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_MED-650,nomatch,,,,,,,\r\nTOBG_MED-651,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_MED-652,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-653,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_MED-654,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-655,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_MED-656,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_MED-657,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-658,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_MED-659,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_MED-660,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_MED-661,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,\r\nTOBG_MED-662,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-663,nomatch,,,,,,,\r\nTOBG_MED-664,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-665,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Hyphomicrobiaceae,Filomicrobium,\r\nTOBG_MED-666,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_MED-667,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-668,nomatch,,,,,,,\r\nTOBG_MED-669,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-670,found,Bacteria,Kiritimatiellaeota,Kiritimatiellae,Kiritimatiellales,Kiritimatiellaceae,,\r\nTOBG_MED-671,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_MED-672,nomatch,,,,,,,\r\nTOBG_MED-673,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-674,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_MED-675,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-676,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_MED-677,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-678,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_MED-679,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_MED-680,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-681,nomatch,,,,,,,\r\nTOBG_MED-682,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_MED-683,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_MED-684,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-685,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-686,nomatch,,,,,,,\r\nTOBG_MED-687,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-688,nomatch,,,,,,,\r\nTOBG_MED-689,nomatch,,,,,,,\r\nTOBG_MED-690,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-691,nomatch,,,,,,,\r\nTOBG_MED-692,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-693,found,Bacteria,Cyanobacteria,unassigned,Prochlorales,Prochlorococcaceae,Prochlorococcus,\r\nTOBG_MED-694,found,Bacteria,Proteobacteria,Alphaproteobacteria,Magnetococcales,,,\r\nTOBG_MED-695,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_D,\r\nTOBG_MED-696,found,Bacteria,Kiritimatiellaeota,Kiritimatiellae,Kiritimatiellales,Kiritimatiellaceae,,\r\nTOBG_MED-697,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,\r\nTOBG_MED-698,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-699,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_MED-700,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_MED-701,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_MED-702,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_MED-703,found,Bacteria,Planctomycetes,Phycisphaerae,JL-ENTP-F27,,,\r\nTOBG_MED-704,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_MED-705,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_MED-706,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_MED-707,nomatch,,,,,,,\r\nTOBG_MED-708,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_MED-709,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-710,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_MED-711,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_MED-712,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-713,found,Bacteria,SBR1093,,,,,\r\nTOBG_MED-714,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_MED-715,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-716,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_MED-717,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-718,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-719,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,OPB35soil,\r\nTOBG_MED-720,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-721,nomatch,,,,,,,\r\nTOBG_MED-722,nomatch,,,,,,,\r\nTOBG_MED-723,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-724,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_MED-725,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_MED-726,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-727,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-728,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Bradyrhizobiaceae,Afipia,\r\nTOBG_MED-729,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_MED-730,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_MED-731,found,Bacteria,SBR1093,,,,,\r\nTOBG_MED-732,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_MED-733,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-734,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-735,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-736,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_MED-737,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-738,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_MED-739,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,novelGenus_A,\r\nTOBG_MED-740,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_MED-741,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,Coraliomargarita,\r\nTOBG_MED-742,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-743,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_MED-744,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,,\r\nTOBG_MED-745,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_MED-746,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-747,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_MED-748,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_MED-749,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_A,\r\nTOBG_MED-750,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_MED-751,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-752,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_MED-753,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_MED-754,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_MED-755,nomatch,,,,,,,\r\nTOBG_MED-756,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Geminicoccus,\r\nTOBG_MED-757,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-758,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_MED-759,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-760,nomatch,,,,,,,\r\nTOBG_MED-761,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-762,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_MED-763,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-764,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-765,found,Bacteria,Proteobacteria,novelClass_B,,,,\r\nTOBG_MED-766,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_MED-767,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_MED-768,found,Bacteria,Proteobacteria,novelClass_B,,,,\r\nTOBG_MED-769,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-770,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_MED-771,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_MED-772,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_MED-773,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_MED-774,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-775,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_MED-776,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,,,\r\nTOBG_MED-777,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_MED-778,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_MED-779,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_MED-780,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_MED-781,nomatch,,,,,,,\r\nTOBG_MED-782,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_MED-783,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-784,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-785,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_MED-786,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-787,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-788,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-789,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-790,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_MED-791,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-792,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_MED-793,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_MED-794,nomatch,,,,,,,\r\nTOBG_MED-795,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-796,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_MED-797,nomatch,,,,,,,\r\nTOBG_MED-798,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-800,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_MED-801,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_MED-802,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_MED-803,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Geminicoccus,\r\nTOBG_MED-804,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-805,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_MED-806,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-807,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_MED-808,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-809,found,Bacteria,Kiritimatiellaeota,Kiritimatiellae,Kiritimatiellales,Kiritimatiellaceae,,\r\nTOBG_MED-810,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-811,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-812,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-813,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_MED-814,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-815,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-816,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_MED-817,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-818,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-819,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_MED-820,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,,,\r\nTOBG_MED-821,nomatch,,,,,,,\r\nTOBG_MED-822,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_MED-823,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_MED-824,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-825,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE1,\r\nTOBG_MED-826,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_MED-827,nomatch,,,,,,,\r\nTOBG_MED-828,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-829,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-830,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,,\r\nTOBG_MED-831,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_MED-832,nomatch,,,,,,,\r\nTOBG_MED-833,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-834,nomatch,,,,,,,\r\nTOBG_MED-835,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_MED-836,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-837,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_MED-838,nomatch,,,,,,,\r\nTOBG_MED-839,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_MED-840,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,novelGenus_A,\r\nTOBG_MED-841,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_MED-842,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_MED-843,nomatch,,,,,,,\r\nTOBG_MED-844,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_MED-845,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-846,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_MED-847,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-848,nomatch,,,,,,,\r\nTOBG_MED-849,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-850,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_MED-851,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_MED-852,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-853,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_MED-854,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_A,\r\nTOBG_MED-855,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-856,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_MED-857,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_MED-858,nomatch,,,,,,,\r\nTOBG_MED-859,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_MED-861,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_MED-862,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_C,,\r\nTOBG_MED-863,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_MED-864,nomatch,,,,,,,\r\nTOBG_MED-865,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-866,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-867,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_MED-868,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_MED-869,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-870,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_MED-871,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_MED-872,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_MED-873,nomatch,,,,,,,\r\nTOBG_MED-874,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_MED-875,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_MED-876,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-877,nomatch,,,,,,,\r\nTOBG_MED-878,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_MED-879,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_MED-880,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_MED-881,nomatch,,,,,,,\r\nTOBG_MED-882,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_MED-883,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_MED-884,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-899,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_MED-921,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_MED-928,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_MED-932,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-939,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_MED-943,nomatch,,,,,,,\r\nTOBG_MED-947,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_MED-950,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_MED-952,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_MED-955,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_MED-957,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_MED-961,nomatch,,,,,,,\r\nTOBG_MED-965,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_MED-972,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_MED-995,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_MED-999,nomatch,,,,,,,\r\nTOBG_NAT-1,found,Bacteria,Poribacteria,,,,,\r\nTOBG_NAT-10,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Aurantimonadaceae,Martelella,\r\nTOBG_NAT-100,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-101,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-102,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_NAT-103,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_NAT-104,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_B\r\nTOBG_NAT-105,found,Bacteria,Saccharibacteria,,,,,\r\nTOBG_NAT-106,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NAT-107,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_NAT-108,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_NAT-109,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_NAT-11,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_NAT-110,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,lutaonensis\r\nTOBG_NAT-111,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,lutaonensis\r\nTOBG_NAT-112,found,Bacteria,Planctomycetes,Phycisphaerae,JL-ENTP-F27,,,\r\nTOBG_NAT-113,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_NAT-114,nomatch,,,,,,,\r\nTOBG_NAT-115,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_NAT-116,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Leifsonia,\r\nTOBG_NAT-117,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NAT-118,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-119,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-12,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_NAT-120,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NAT-121,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Halioglobus,\r\nTOBG_NAT-122,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Ectothiorhodospiraceae,,\r\nTOBG_NAT-123,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NAT-124,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NAT-125,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-126,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-127,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,,\r\nTOBG_NAT-128,nomatch,,,,,,,\r\nTOBG_NAT-129,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Wenzhouxiangellaceae,,\r\nTOBG_NAT-13,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-130,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_C,\r\nTOBG_NAT-131,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,Sandracinaceae,Sandaracinus,\r\nTOBG_NAT-132,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_NAT-133,found,Bacteria,Bacteroidetes,Saprospiria,Saprospirales,,,\r\nTOBG_NAT-134,found,Bacteria,Ignavibacteriae,NovelClass_B,,,,\r\nTOBG_NAT-135,nomatch,,,,,,,\r\nTOBG_NAT-136,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-137,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-138,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_NAT-139,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NAT-14,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_NAT-140,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-141,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_NAT-142,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_NAT-143,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_NAT-144,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_NAT-145,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,Coraliomargarita,\r\nTOBG_NAT-146,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_NAT-147,nomatch,,,,,,,\r\nTOBG_NAT-148,nomatch,,,,,,,\r\nTOBG_NAT-149,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,novelFamily_A,,\r\nTOBG_NAT-15,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Zunongwangia,profunda\r\nTOBG_NAT-150,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_NAT-151,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_NAT-152,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Pseudozobellia,\r\nTOBG_NAT-153,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_NAT-154,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_NAT-155,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_NAT-156,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_NAT-157,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Cycloclasticus,\r\nTOBG_NAT-158,found,Bacteria,Proteobacteria,Alphaproteobacteria,Kordiimonadales,Kordiimonadaceae,Kordiimonas,\r\nTOBG_NAT-159,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_NAT-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_NAT-160,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_NAT-161,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NAT-162,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_NAT-163,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NAT-164,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-165,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_NAT-166,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-167,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Yangia,\r\nTOBG_NAT-168,found,Archaea,Thaumarchaeota,novelClass_A,,,,\r\nTOBG_NAT-169,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Gordoniaceae,Gordonia,\r\nTOBG_NAT-17,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_NAT-170,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,Parvibaculum,\r\nTOBG_NAT-171,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-172,nomatch,,,,,,,\r\nTOBG_NAT-173,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Aurantimonadaceae,Fulvimarina,\r\nTOBG_NAT-174,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_NAT-175,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_NAT-176,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,novelGenus_A,\r\nTOBG_NAT-177,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NAT-178,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_NAT-179,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-18,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_NAT-180,nomatch,,,,,,,\r\nTOBG_NAT-181,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_NAT-182,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_NAT-183,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_NAT-184,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-185,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_NAT-186,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_NAT-187,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_NAT-188,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_NAT-189,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_NAT-19,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_NAT-190,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_NAT-191,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_NAT-192,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_NAT-193,nomatch,,,,,,,\r\nTOBG_NAT-194,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NAT-195,nomatch,,,,,,,\r\nTOBG_NAT-196,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_NAT-197,nomatch,,,,,,,\r\nTOBG_NAT-198,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-199,nomatch,,,,,,,\r\nTOBG_NAT-2,found,Bacteria,Planctomycetes,Pla3,,,,\r\nTOBG_NAT-20,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,,\r\nTOBG_NAT-200,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NAT-201,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_NAT-202,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_NAT-203,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-204,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_NAT-205,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-206,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-207,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_NAT-208,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_NAT-209,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Altererythrobacter,\r\nTOBG_NAT-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Parvulalarculales,Parvularculaceae,Parvularcula,\r\nTOBG_NAT-210,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_NAT-211,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-212,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingomonas,\r\nTOBG_NAT-213,nomatch,,,,,,,\r\nTOBG_NAT-214,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NAT-215,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-216,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingobium,\r\nTOBG_NAT-217,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-218,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-219,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-22,found,Bacteria,Planctomycetes,Phycisphaerae,Phycisphaerales,Phycisphaeraceae,novelGenus_A,\r\nTOBG_NAT-220,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-221,found,Bacteria,Proteobacteria,Nitrospinae,Nitrospinales,Nitrospinaceae,Nitrospina,\r\nTOBG_NAT-222,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_NAT-223,disagree,,,,,,,\r\nTOBG_NAT-224,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-225,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-226,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,,,\r\nTOBG_NAT-227,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-228,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-229,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_NAT-23,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,DEV007,,\r\nTOBG_NAT-230,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_NAT-231,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_NAT-232,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_NAT-233,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_NAT-234,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_NAT-235,nomatch,,,,,,,\r\nTOBG_NAT-236,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_NAT-237,found,Bacteria,Kiritimatiellaeota,Kiritimatiellae,Kiritimatiellales,Kiritimatiellaceae,,\r\nTOBG_NAT-238,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NAT-239,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_NAT-24,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-240,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_NAT-241,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_NAT-242,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_NAT-243,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_NAT-244,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-245,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_NAT-246,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_NAT-247,nomatch,,,,,,,\r\nTOBG_NAT-248,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_NAT-249,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_NAT-25,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_E,,\r\nTOBG_NAT-250,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,,\r\nTOBG_NAT-251,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-252,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_NAT-253,found,Bacteria,Actinobacteria,Actinobacteria,Propionibacteriales,Nocardioidaceae,Pimelobacter,\r\nTOBG_NAT-254,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NAT-255,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-256,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NAT-257,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_J,\r\nTOBG_NAT-258,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_NAT-259,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_NAT-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NAT-260,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_NAT-261,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_NAT-262,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_NAT-263,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_NAT-264,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_NAT-265,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NAT-266,disagree,Archaea,Euryarcheoata,unassigned,unassigned,,,\r\nTOBG_NAT-267,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_NAT-268,nomatch,,,,,,,\r\nTOBG_NAT-269,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_NAT-27,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_NAT-270,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_NAT-271,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_NAT-272,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NAT-273,disagree,Bacteria,,,,,,\r\nTOBG_NAT-274,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-275,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NAT-276,found,Bacteria,Proteobacteria,Gammaproteobacteria,Salinisphaerales,Salinisphaeraceae,Salinisphaera,\r\nTOBG_NAT-277,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_NAT-278,found,Bacteria,Proteobacteria,Nitrospinae,Nitrospinales,Nitrospinaceae,Nitrospina,\r\nTOBG_NAT-279,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_NAT-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,,,\r\nTOBG_NAT-280,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_NAT-281,disagree,Archaea,Euryarcheoata,unassigned,unassigned,,,\r\nTOBG_NAT-282,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_NAT-283,nomatch,,,,,,,\r\nTOBG_NAT-284,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_NAT-288,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NAT-29,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-290,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NAT-291,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,Nitratireductor,\r\nTOBG_NAT-292,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_NAT-3,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Ahrensia,\r\nTOBG_NAT-30,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_NAT-302,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NAT-31,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NAT-32,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_NAT-33,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NAT-333,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-34,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_NAT-35,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NAT-353,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_NAT-36,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_NAT-37,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_NAT-375,nomatch,,,,,,,\r\nTOBG_NAT-38,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-39,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_NAT-392,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-4,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-40,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_NAT-41,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NAT-417,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-42,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_NAT-422,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-43,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_NAT-430,found,Bacteria,SBR1093,,,,,\r\nTOBG_NAT-44,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_NAT-441,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-45,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-453,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NAT-46,found,Bacteria,Proteobacteria,Gammaproteobacteria,Salinisphaerales,Salinisphaeraceae,Salinisphaera,\r\nTOBG_NAT-47,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NAT-472,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NAT-478,nomatch,,,,,,,\r\nTOBG_NAT-48,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_NAT-483,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NAT-484,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NAT-49,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_NAT-493,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-495,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-5,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_NAT-50,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NAT-501,disagree,Bacteria,,,,,,\r\nTOBG_NAT-503,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_D,,,\r\nTOBG_NAT-504,nomatch,,,,,,,\r\nTOBG_NAT-509,found,Bacteria,SBR1093,,,,,\r\nTOBG_NAT-51,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-510,found,Bacteria,SBR1093,,,,,\r\nTOBG_NAT-52,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-53,found,Bacteria,SBR1093,,,,,\r\nTOBG_NAT-535,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_NAT-54,nomatch,,,,,,,\r\nTOBG_NAT-545,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-549,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-55,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NAT-56,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-57,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_NAT-575,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NAT-579,nomatch,,,,,,,\r\nTOBG_NAT-58,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_NAT-59,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NAT-6,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Rhodothermaceae,,\r\nTOBG_NAT-60,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_NAT-608,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_NAT-61,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_NAT-62,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-63,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_NAT-630,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_NAT-634,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NAT-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-65,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-653,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-66,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_NAT-661,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-67,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NAT-68,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NAT-682,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Planktomarina,temperata\r\nTOBG_NAT-686,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_NAT-69,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_NAT-7,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Maritimibacter,\r\nTOBG_NAT-70,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_NAT-71,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_NAT-72,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_NAT-73,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-74,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NAT-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NAT-76,nomatch,,,,,,,\r\nTOBG_NAT-77,found,Bacteria,Saccharibacteria,,,,,\r\nTOBG_NAT-78,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_NAT-79,found,Bacteria,Poribacteria,,,,,\r\nTOBG_NAT-8,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,Sandracinaceae,Sandaracinus,\r\nTOBG_NAT-80,nomatch,,,,,,,\r\nTOBG_NAT-81,found,Bacteria,Poribacteria,,,,,\r\nTOBG_NAT-82,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Thioclava,\r\nTOBG_NAT-83,nomatch,,,,,,,\r\nTOBG_NAT-84,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NAT-85,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,,\r\nTOBG_NAT-86,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NAT-87,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_F,,,\r\nTOBG_NAT-88,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_NAT-89,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_NAT-9,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Confluentimicrobium,\r\nTOBG_NAT-90,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_NAT-91,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_NAT-92,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Mesonia,\r\nTOBG_NAT-93,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NAT-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-95,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NAT-96,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_NAT-97,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NAT-98,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NAT-99,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_NP-1,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_NP-10,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_NP-100,found,Bacteria,Proteobacteria,Gammaproteobacteria,Nevskiales,,,\r\nTOBG_NP-1000,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_NP-1001,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_NP-101,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_NP-102,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_NP-1026,found,Bacteria,Proteobacteria,Nitrospinae,,,,\r\nTOBG_NP-103,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_NP-1036,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_NP-1037,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_NP-104,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-1044,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-1046,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,Coxiellaceae,,\r\nTOBG_NP-1048,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-105,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_NP-1051,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NP-1052,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_NP-1057,nomatch,,,,,,,\r\nTOBG_NP-106,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_NP-1069,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NP-107,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_NP-1070,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_NP-1071,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-1073,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_NP-108,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NP-1080,nomatch,,,,,,,\r\nTOBG_NP-109,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rubinisphaera,\r\nTOBG_NP-1098,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_NP-11,nomatch,,,,,,,\r\nTOBG_NP-110,nomatch,,,,,,,\r\nTOBG_NP-1106,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NP-111,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-112,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_NP-1124,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_NP-113,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NP-114,nomatch,,,,,,,\r\nTOBG_NP-115,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NP-1152,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-1159,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_NP-116,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_NP-1160,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NP-117,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_NP-1171,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_NP-118,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_NP-1180,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE4,\r\nTOBG_NP-119,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_NP-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-120,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,novelGenus_A,\r\nTOBG_NP-1202,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_NP-1207,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_NP-121,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_NP-122,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-123,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_NP-124,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Burkholderiaceae,Cupriavidus,metallidurans\r\nTOBG_NP-125,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-1256,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_NP-126,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-127,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_NP-1271,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-1277,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-128,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NP-1282,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_NP-1285,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NP-129,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_NP-1295,found,Archaea,Woesearchaeota,,,,,\r\nTOBG_NP-1297,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_NP-13,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-130,found,Bacteria,Acidobacteria,novelClass_A,,,,\r\nTOBG_NP-1301,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NP-1304,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_NP-131,nomatch,,,,,,,\r\nTOBG_NP-132,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-1321,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_NP-1324,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NP-133,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NP-134,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-1344,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NP-135,nomatch,,,,,,,\r\nTOBG_NP-136,nomatch,,,,,,,\r\nTOBG_NP-137,nomatch,,,,,,,\r\nTOBG_NP-1374,nomatch,,,,,,,\r\nTOBG_NP-1378,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_NP-138,found,Bacteria,Chloroflexi,Dehalococcoidia,Dehalococcoidales,novelFamily_A,,\r\nTOBG_NP-139,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NP-1391,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-1395,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_NP-14,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-140,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_NP-1400,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_NP-141,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-142,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_NP-143,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_NP-144,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_NP-1444,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-145,nomatch,,,,,,,\r\nTOBG_NP-146,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_NP-1463,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_NP-1466,found,Archaea,Pacearchaeota,,,,,\r\nTOBG_NP-147,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NP-1472,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-148,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NP-149,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_NP-1496,nomatch,,,,,,,\r\nTOBG_NP-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_NP-150,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_NP-151,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NP-152,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-1521,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NP-153,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,,,\r\nTOBG_NP-155,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-156,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-16,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Sutterellaceae,,\r\nTOBG_NP-17,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_NP-18,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_NP-19,nomatch,,,,,,,\r\nTOBG_NP-2,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_NP-20,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-21,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-22,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_NP-23,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_NP-24,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-25,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Leifsonia,\r\nTOBG_NP-26,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_NP-27,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_NP-28,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Morazellaceae,Acinetobacter,\r\nTOBG_NP-29,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Mameliella,\r\nTOBG_NP-3,disagree,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,\r\nTOBG_NP-30,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Thalassobius,gelatinovorus\r\nTOBG_NP-31,nomatch,,,,,,,\r\nTOBG_NP-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NP-33,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Nocardioidaceae,Nocardioides,\r\nTOBG_NP-34,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingobium,\r\nTOBG_NP-35,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,,,\r\nTOBG_NP-36,nomatch,,,,,,,\r\nTOBG_NP-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,,,\r\nTOBG_NP-38,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_NP-39,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NP-4,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Comamonadaceae,Variovorax,\r\nTOBG_NP-40,found,Bacteria,Proteobacteria,Gammaproteobacteria,Salinisphaerales,Salinisphaeraceae,Salinisphaera,\r\nTOBG_NP-41,found,Bacteria,Poribacteria,,,,,\r\nTOBG_NP-42,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_NP-43,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingobium,\r\nTOBG_NP-44,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_NP-45,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_NP-46,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_NP-47,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,novelGenus_A,\r\nTOBG_NP-48,disagree,,,,,,,\r\nTOBG_NP-49,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NP-5,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_F,\r\nTOBG_NP-50,found,Bacteria,Proteobacteria,Nitrospinae,,,,\r\nTOBG_NP-51,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-52,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_NP-53,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_B,,\r\nTOBG_NP-54,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-55,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-56,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Leifsonia,\r\nTOBG_NP-57,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_NP-58,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_NP-59,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-6,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Methylobacteriaceae,Methylobacterum,phyllosphaerae\r\nTOBG_NP-60,found,Bacteria,Poribacteria,,,,,\r\nTOBG_NP-61,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Planktomarina,temperata\r\nTOBG_NP-62,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_NP-63,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_NP-65,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NP-66,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_NP-67,found,Bacteria,Saccharibacteria,,,,,\r\nTOBG_NP-68,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_NP-69,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_H,\r\nTOBG_NP-7,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_NP-70,found,Bacteria,Saccharibacteria,,,,,\r\nTOBG_NP-71,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NP-72,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-73,nomatch,,,,,,,\r\nTOBG_NP-74,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,,,\r\nTOBG_NP-75,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,DEV007,,\r\nTOBG_NP-76,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_NP-77,found,Archaea,Bathyarchaeota,,,,,\r\nTOBG_NP-78,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_NP-79,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-8,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_NP-80,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-81,nomatch,,,,,,,\r\nTOBG_NP-82,nomatch,,,,,,,\r\nTOBG_NP-83,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_NP-84,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NP-85,nomatch,,,,,,,\r\nTOBG_NP-86,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_F,\r\nTOBG_NP-87,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_I,\r\nTOBG_NP-88,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_NP-89,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_D,,\r\nTOBG_NP-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_NP-90,nomatch,,,,,,,\r\nTOBG_NP-91,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_NP-92,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_NP-93,nomatch,,,,,,,\r\nTOBG_NP-931,nomatch,,,,,,,\r\nTOBG_NP-932,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-933,nomatch,,,,,,,\r\nTOBG_NP-935,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_NP-936,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_NP-937,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-939,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NP-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-941,disagree,Archaea,Euryarcheoata,unassigned,unassigned,,,\r\nTOBG_NP-942,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-943,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-944,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_NP-945,nomatch,,,,,,,\r\nTOBG_NP-946,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_NP-948,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-949,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-95,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,,\r\nTOBG_NP-951,found,Bacteria,Proteobacteria,Zetaproteobacteria,,,,\r\nTOBG_NP-952,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_NP-954,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-955,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-956,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_NP-958,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_NP-959,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-96,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_NP-960,disagree,Bacteria,,,,,,\r\nTOBG_NP-961,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_NP-962,nomatch,,,,,,,\r\nTOBG_NP-964,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-965,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_NP-966,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_NP-969,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_NP-97,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_NP-970,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_NP-972,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_NP-973,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,,,\r\nTOBG_NP-975,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_NP-976,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_NP-977,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_NP-978,nomatch,,,,,,,\r\nTOBG_NP-98,nomatch,,,,,,,\r\nTOBG_NP-980,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_NP-981,nomatch,,,,,,,\r\nTOBG_NP-982,disagree,Bacteria,,,,,,\r\nTOBG_NP-983,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_NP-986,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_NP-987,nomatch,,,,,,,\r\nTOBG_NP-989,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_NP-99,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Gimesia,\r\nTOBG_NP-990,nomatch,,,,,,,\r\nTOBG_NP-992,nomatch,,,,,,,\r\nTOBG_NP-993,found,Bacteria,Acidobacteria,novelClass_A,,,,\r\nTOBG_NP-995,found,Bacteria,Chloroflexi,Anaerolineae,Anaerolineales,Anaerolineaceae,,\r\nTOBG_NP-996,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_NP-997,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_NP-998,nomatch,,,,,,,\r\nTOBG_RS-307,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_RS-341,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_RS-342,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_RS-343,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_RS-344,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_RS-345,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_RS-346,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_RS-347,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-348,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_RS-349,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_RS-350,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-351,found,Archaea,Thaumarchaeota,unassigned,unassigned,unassigned,Nitropelagicus,\r\nTOBG_RS-352,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_RS-353,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_RS-354,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_RS-355,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Oxalobacteraceae,Herbaspirillum,seropedicae\r\nTOBG_RS-356,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_RS-357,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_RS-358,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_RS-359,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_C,,,\r\nTOBG_RS-360,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_RS-361,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-362,found,Bacteria,Chloroflexi,novelClass_A,,,,\r\nTOBG_RS-363,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_RS-364,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,,,\r\nTOBG_RS-365,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-366,found,Archaea,,,,,,\r\nTOBG_RS-367,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_RS-368,nomatch,,,,,,,\r\nTOBG_RS-369,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_RS-370,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-371,nomatch,,,,,,,\r\nTOBG_RS-372,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_RS-373,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_RS-374,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_E,,\r\nTOBG_RS-375,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_RS-376,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,novelGenus_A,\r\nTOBG_RS-377,nomatch,,,,,,,\r\nTOBG_RS-378,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-379,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_RS-380,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_RS-381,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_RS-382,nomatch,,,,,,,\r\nTOBG_RS-383,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_I,\r\nTOBG_RS-384,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_RS-385,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_RS-386,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-387,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_RS-388,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_RS-389,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-390,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_RS-391,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_RS-392,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_RS-393,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_RS-394,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_RS-395,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_I,\r\nTOBG_RS-396,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_RS-397,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_RS-398,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_RS-399,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_I,\r\nTOBG_RS-400,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_RS-401,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_RS-402,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_RS-403,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-404,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_RS-405,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_RS-406,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_RS-407,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_RS-408,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_RS-409,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-410,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_RS-411,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_RS-412,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_RS-413,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-414,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_RS-415,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_RS-416,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_RS-417,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_RS-418,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-419,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-420,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_RS-421,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-422,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_RS-423,found,Bacteria,Poribacteria,,,,,\r\nTOBG_RS-424,nomatch,,,,,,,\r\nTOBG_RS-425,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-426,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-427,nomatch,,,,,,,\r\nTOBG_RS-428,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_RS-429,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_RS-430,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-431,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_RS-432,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-433,nomatch,,,,,,,\r\nTOBG_RS-434,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-435,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-436,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_RS-437,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_RS-438,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_RS-439,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_RS-440,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_RS-441,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_RS-442,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_RS-443,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_RS-444,nomatch,,,,,,,\r\nTOBG_RS-445,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-446,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_RS-447,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_RS-448,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_RS-449,found,Bacteria,Chloroflexi,novelClass_B,,,,\r\nTOBG_RS-450,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_RS-451,nomatch,,,,,,,\r\nTOBG_RS-452,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_RS-453,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-454,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_RS-455,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_RS-456,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-457,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-458,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_RS-459,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_RS-460,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_RS-461,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_RS-462,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_RS-463,nomatch,,,,,,,\r\nTOBG_RS-464,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-465,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-466,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-467,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_RS-468,nomatch,,,,,,,\r\nTOBG_RS-469,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-470,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-471,nomatch,,,,,,,\r\nTOBG_RS-472,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-473,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_RS-474,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_RS-475,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_RS-476,nomatch,,,,,,,\r\nTOBG_RS-481,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_RS-495,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_RS-508,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_RS-510,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-533,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_RS-535,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_RS-551,nomatch,,,,,,,\r\nTOBG_RS-562,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_RS-570,nomatch,,,,,,,\r\nTOBG_RS-582,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_RS-590,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_RS-604,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_RS-605,nomatch,,,,,,,\r\nTOBG_RS-615,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,,,\r\nTOBG_RS-626,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_RS-648,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_D,,,\r\nTOBG_RS-652,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_RS-654,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_RS-659,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_RS-665,disagree,Bacteria,,,,,,\r\nTOBG_RS-668,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_RS-678,found,Archaea,Heimdallarchaeota,,,,,\r\nTOBG_RS-697,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-711,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_RS-723,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_F,,,\r\nTOBG_RS-726,nomatch,,,,,,,\r\nTOBG_RS-789,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-797,nomatch,,,,,,,\r\nTOBG_RS-799,nomatch,,,,,,,\r\nTOBG_RS-813,nomatch,,,,,,,\r\nTOBG_RS-814,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_RS-815,found,Bacteria,,,,,,\r\nTOBG_RS-816,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_RS-817,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_RS-818,disagree,Bacteria,,,,,,\r\nTOBG_RS-819,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_RS-820,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_RS-821,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_RS-822,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_RS-823,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_RS-824,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_RS-825,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,OPB35soil,\r\nTOBG_RS-826,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SAT-1,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SAT-10,found,Bacteria,Poribacteria,,,,,\r\nTOBG_SAT-100,nomatch,,,,,,,\r\nTOBG_SAT-101,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_SAT-102,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_SAT-103,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-104,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Xanthomarina,\r\nTOBG_SAT-105,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SAT-106,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_SAT-107,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_H,\r\nTOBG_SAT-108,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Confluentimicrobium,\r\nTOBG_SAT-109,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_SAT-11,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SAT-110,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_SAT-111,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_SAT-112,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_SAT-113,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Cobetia,\r\nTOBG_SAT-114,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Maribacter,\r\nTOBG_SAT-115,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hirschia,\r\nTOBG_SAT-116,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_SAT-117,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_SAT-118,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SAT-119,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_SAT-12,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SAT-120,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_F,\r\nTOBG_SAT-121,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_SAT-122,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SAT-123,nomatch,,,,,,,\r\nTOBG_SAT-124,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_SAT-125,nomatch,,,,,,,\r\nTOBG_SAT-126,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-127,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SAT-128,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SAT-1289,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-129,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Flavobacterium,\r\nTOBG_SAT-1290,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-13,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-130,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Flavobacterium,\r\nTOBG_SAT-1300,nomatch,,,,,,,\r\nTOBG_SAT-1301,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_SAT-1302,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_SAT-1308,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_SAT-1309,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Henriciella,\r\nTOBG_SAT-131,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-132,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-1328,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-1329,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SAT-133,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SAT-1331,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SAT-1332,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_SAT-1333,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_E,\r\nTOBG_SAT-1339,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SAT-134,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_SAT-1340,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_SAT-1342,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SAT-1344,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-1345,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_SAT-1346,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SAT-1347,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SAT-135,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_SAT-1356,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SAT-1358,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-1359,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-136,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SAT-1366,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SAT-1367,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_SAT-1369,found,Bacteria,,,,,,\r\nTOBG_SAT-137,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_SAT-138,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-1383,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_SAT-1384,found,Bacteria,,,,,,\r\nTOBG_SAT-1386,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Oceanibulbus,\r\nTOBG_SAT-1387,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_SAT-1388,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_SAT-139,nomatch,,,,,,,\r\nTOBG_SAT-1390,nomatch,,,,,,,\r\nTOBG_SAT-1391,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SAT-14,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SAT-140,nomatch,,,,,,,\r\nTOBG_SAT-1401,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SAT-1403,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-1404,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_SAT-1405,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SAT-141,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-1415,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SAT-1416,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SAT-142,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SAT-1429,nomatch,,,,,,,\r\nTOBG_SAT-143,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SAT-1430,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-1431,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_SAT-1433,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-1434,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-144,found,Bacteria,Proteobacteria,Nitrospinae,,,,\r\nTOBG_SAT-1446,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_SAT-1448,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-1449,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-145,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SAT-1450,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-1451,found,Bacteria,Poribacteria,,,,,\r\nTOBG_SAT-146,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_SAT-1460,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SAT-1461,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-1462,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Pseudoalteromonadaceae,,\r\nTOBG_SAT-1464,found,Bacteria,Acidobacteria,novelClass_A,,,,\r\nTOBG_SAT-147,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Rhodopirellula,\r\nTOBG_SAT-1475,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SAT-1476,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SAT-148,nomatch,,,,,,,\r\nTOBG_SAT-1485,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-1487,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_SAT-1488,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_B,\r\nTOBG_SAT-1489,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SAT-149,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,,\r\nTOBG_SAT-15,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_SAT-150,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-1504,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_SAT-1505,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SAT-1507,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-1508,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SAT-1509,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-151,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-1510,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SAT-1517,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-152,nomatch,,,,,,,\r\nTOBG_SAT-153,found,Bacteria,Bacteroidetes,Saprospiria,Saprospirales,,,\r\nTOBG_SAT-1530,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_A,\r\nTOBG_SAT-154,nomatch,,,,,,,\r\nTOBG_SAT-155,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_SAT-1551,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SAT-1553,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_SAT-1554,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_SAT-156,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_SAT-1560,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_SAT-1561,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SAT-1567,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SAT-1568,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_SAT-157,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_SAT-1576,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_SAT-1578,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SAT-1579,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-158,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_SAT-1581,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SAT-1582,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SAT-1584,found,Bacteria,SBR1093,,,,,\r\nTOBG_SAT-1585,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_A,\r\nTOBG_SAT-159,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SAT-16,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_SAT-160,nomatch,,,,,,,\r\nTOBG_SAT-1607,found,Bacteria,SBR1093,,,,,\r\nTOBG_SAT-1608,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SAT-1609,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-161,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SAT-1610,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_C,\r\nTOBG_SAT-1611,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_SAT-1613,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SAT-1614,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SAT-162,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SAT-163,nomatch,,,,,,,\r\nTOBG_SAT-164,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SAT-165,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SAT-166,nomatch,,,,,,,\r\nTOBG_SAT-167,nomatch,,,,,,,\r\nTOBG_SAT-168,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SAT-169,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-17,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_F,,,\r\nTOBG_SAT-170,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-171,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_SAT-172,disagree,Bacteria,Verrucomicrobia,Verrucomicrobiae,,,,\r\nTOBG_SAT-173,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Winogradskyella,\r\nTOBG_SAT-174,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_SAT-175,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-176,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-177,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-178,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SAT-179,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SAT-18,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-180,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SAT-181,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-182,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-183,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Morazellaceae,Acinetobacter,\r\nTOBG_SAT-184,found,Bacteria,Cyanobacteria,Chroococcales,unassigned,unassigned,CaAtelocyanobacterium,\r\nTOBG_SAT-185,found,Bacteria,Proteobacteria,Zetaproteobacteria,,,,\r\nTOBG_SAT-186,nomatch,,,,,,,\r\nTOBG_SAT-187,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_SAT-188,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SAT-189,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-19,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,\r\nTOBG_SAT-190,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_SAT-191,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-192,nomatch,,,,,,,\r\nTOBG_SAT-193,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-194,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_SAT-195,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_SAT-196,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,Ilumatobacter,\r\nTOBG_SAT-197,found,Bacteria,Kiritimatiellaeota,Kiritimatiellae,Kiritimatiellales,Kiritimatiellaceae,,\r\nTOBG_SAT-198,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Confluentimicrobium,\r\nTOBG_SAT-199,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SAT-2,nomatch,,,,,,,\r\nTOBG_SAT-20,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Alcaligenaceae,Pusillimonas,\r\nTOBG_SAT-200,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-201,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-202,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_SAT-203,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-204,nomatch,,,,,,,\r\nTOBG_SAT-205,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-206,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-207,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SAT-208,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-209,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SAT-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_SAT-210,nomatch,,,,,,,\r\nTOBG_SAT-211,found,Bacteria,SBR1093,,,,,\r\nTOBG_SAT-212,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_SAT-213,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-214,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-215,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-216,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingobium,\r\nTOBG_SAT-217,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,Oleispira,antarctica\r\nTOBG_SAT-218,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SAT-219,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_SAT-22,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Sphingomonas,\r\nTOBG_SAT-220,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-221,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SAT-222,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-223,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_SAT-224,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Marinovum,\r\nTOBG_SAT-225,nomatch,,,,,,,\r\nTOBG_SAT-226,nomatch,,,,,,,\r\nTOBG_SAT-227,found,Bacteria,Proteobacteria,Alphaproteobacteria,Magnetococcales,,,\r\nTOBG_SAT-228,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_SAT-229,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SAT-23,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_SAT-230,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Cellvibrionaceae,,\r\nTOBG_SAT-24,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-25,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_A\r\nTOBG_SAT-2587,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Kangiellaceae,,\r\nTOBG_SAT-2594,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_SAT-2595,nomatch,,,,,,,\r\nTOBG_SAT-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,Porticoccus,hydrocarbonoclasticus\r\nTOBG_SAT-2604,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SAT-2610,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_SAT-2619,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-2654,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SAT-2681,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_J,,\r\nTOBG_SAT-2699,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SAT-27,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,Hoeflea,\r\nTOBG_SAT-2701,nomatch,,,,,,,\r\nTOBG_SAT-2727,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SAT-2731,nomatch,,,,,,,\r\nTOBG_SAT-2734,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SAT-2750,nomatch,,,,,,,\r\nTOBG_SAT-2751,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-2755,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_SAT-2756,nomatch,,,,,,,\r\nTOBG_SAT-2766,found,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Lentimicrobiaceae,,\r\nTOBG_SAT-2781,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_SAT-2787,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SAT-2788,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SAT-2797,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_SAT-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_SAT-2804,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_SAT-2814,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-2823,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_D,\r\nTOBG_SAT-2856,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SAT-2866,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_SAT-29,nomatch,,,,,,,\r\nTOBG_SAT-2910,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-2911,found,Bacteria,Deinococcus-Thermus,Deinococci,Deinococcales,Trueperaceae,,\r\nTOBG_SAT-2956,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-2963,nomatch,,,,,,,\r\nTOBG_SAT-2971,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-2981,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-2985,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-2989,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SAT-2990,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SAT-2998,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SAT-3,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SAT-30,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_SAT-3008,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SAT-3021,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-3034,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_A,,\r\nTOBG_SAT-3048,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SAT-3076,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SAT-3078,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_SAT-31,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_SAT-32,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SAT-33,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Micavibrio,\r\nTOBG_SAT-34,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE4,\r\nTOBG_SAT-35,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-36,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-37,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Rhodovulum,\r\nTOBG_SAT-38,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-39,nomatch,,,,,,,\r\nTOBG_SAT-4,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_SAT-40,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Spongiibacteraceae,spongiibacter,\r\nTOBG_SAT-41,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SAT-42,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SAT-43,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_D,,\r\nTOBG_SAT-44,nomatch,,,,,,,\r\nTOBG_SAT-45,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-46,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_SAT-47,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_SAT-48,nomatch,,,,,,,\r\nTOBG_SAT-49,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_B,novelSpecies_A\r\nTOBG_SAT-5,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Aurantimonadaceae,Aurantimonas,\r\nTOBG_SAT-50,nomatch,,,,,,,\r\nTOBG_SAT-51,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,,\r\nTOBG_SAT-52,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Nocardioidaceae,Nocardioides,\r\nTOBG_SAT-53,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,Hoeflea,\r\nTOBG_SAT-54,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Pseudooceanicola,\r\nTOBG_SAT-55,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Ahrensia,\r\nTOBG_SAT-56,found,Bacteria,Planctomycetes,Phycisphaerae,SM1A02,,,\r\nTOBG_SAT-57,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_SAT-58,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_SAT-59,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_B,novelSpecies_B\r\nTOBG_SAT-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_SAT-60,found,Bacteria,Proteobacteria,Gammaproteobacteria,Nevskiales,Sinobacteraceae,Polycyclovorans,\r\nTOBG_SAT-61,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Spongiibacteraceae,,\r\nTOBG_SAT-62,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Sutterellaceae,,\r\nTOBG_SAT-63,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SAT-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Halomonas,\r\nTOBG_SAT-65,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SAT-66,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sneathiellales,Sneathiellaceae,Sneathiella,\r\nTOBG_SAT-67,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_A,novelSpecies_A\r\nTOBG_SAT-68,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,novel_genusE5,\r\nTOBG_SAT-69,nomatch,,,,,,,\r\nTOBG_SAT-7,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Citromicrobium,\r\nTOBG_SAT-70,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SAT-71,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_SAT-72,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_SAT-73,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,,,\r\nTOBG_SAT-74,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_SAT-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-76,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SAT-77,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SAT-78,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SAT-79,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SAT-8,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_SAT-80,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_SAT-81,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_SAT-82,found,Bacteria,Cyanobacteria,unassigned,Synechococcales,Synechococcaceae,Synechococcus,\r\nTOBG_SAT-83,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SAT-84,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_SAT-85,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Sutterellaceae,,\r\nTOBG_SAT-86,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_SAT-87,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Gimesia,\r\nTOBG_SAT-88,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,Xanthomarina\r\nTOBG_SAT-89,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-9,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-90,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Dinoroseobacter,\r\nTOBG_SAT-91,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SAT-92,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_SAT-93,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,,\r\nTOBG_SAT-94,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SAT-95,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SAT-96,nomatch,,,,,,,\r\nTOBG_SAT-97,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-98,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Aestuariibacter,aggregatus\r\nTOBG_SAT-99,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-1,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,,\r\nTOBG_SP-10,found,Bacteria,Planctomycetes,Phycisphaerae,Phycisphaerales,Phycisphaeraceae,novelGenus_A,\r\nTOBG_SP-100,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SP-101,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-102,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-103,nomatch,,,,,,,\r\nTOBG_SP-104,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,,,\r\nTOBG_SP-105,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_B,\r\nTOBG_SP-106,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-107,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-108,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-109,found,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,\r\nTOBG_SP-11,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Muricauda,lutaonensis\r\nTOBG_SP-110,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_SP-111,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_SP-112,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Rhodothermaceae,,\r\nTOBG_SP-113,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_SP-114,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-115,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SP-116,found,Bacteria,Actinobacteria,novelClass_A,,,,\r\nTOBG_SP-117,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_SP-118,nomatch,,,,,,,\r\nTOBG_SP-119,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,Fabibacter,\r\nTOBG_SP-12,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Pedosphaera,novelGenus_A,\r\nTOBG_SP-120,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SP-121,found,Bacteria,Planctomycetes,Phycisphaerae,SM1A02,,,\r\nTOBG_SP-122,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-123,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-124,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SP-125,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SP-126,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_SP-127,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-128,found,Bacteria,Planctomycetes,Phycisphaerae,SM1A02,,,\r\nTOBG_SP-129,found,Bacteria,Proteobacteria,Gammaproteobacteria,Nevskiales,,,\r\nTOBG_SP-13,found,Bacteria,Chlamydiae,Chlamydiae,Chlamydiales,Waddliaceae,,\r\nTOBG_SP-130,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Leifsonia,\r\nTOBG_SP-131,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassopira,\r\nTOBG_SP-132,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_SP-133,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,balearica\r\nTOBG_SP-134,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_SP-135,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_SP-136,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-137,found,Bacteria,Planctomycetes,Phycisphaerae,Urania1B19,,,\r\nTOBG_SP-138,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SP-139,found,Archaea,Thaumarchaeota,,,,,\r\nTOBG_SP-14,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-140,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hirschia,\r\nTOBG_SP-141,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_E,\r\nTOBG_SP-142,found,Bacteria,Poribacteria,,,,,\r\nTOBG_SP-143,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-144,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_SP-145,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-146,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_SP-147,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_SP-148,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SP-149,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Winogradskyella,\r\nTOBG_SP-15,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,0319-6G20,,\r\nTOBG_SP-150,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_A,,,\r\nTOBG_SP-151,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-152,found,Bacteria,,,,,,\r\nTOBG_SP-153,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SP-154,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-155,nomatch,,,,,,,\r\nTOBG_SP-156,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,unassigned,Geminicoccus,\r\nTOBG_SP-157,found,Bacteria,Bacteroidetes,Saprospiria,Saprospirales,,,\r\nTOBG_SP-158,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Pseudooceanicola,\r\nTOBG_SP-159,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_SP-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Tistrella,\r\nTOBG_SP-160,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-161,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Thalassobius,gelatinovorus\r\nTOBG_SP-162,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_D,,\r\nTOBG_SP-163,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SP-164,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_SP-165,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_D,,,\r\nTOBG_SP-166,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SP-167,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_SP-168,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,Hoeflea,\r\nTOBG_SP-169,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Paracoccus,\r\nTOBG_SP-17,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,,\r\nTOBG_SP-170,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_SP-171,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-172,found,Archaea,Euryarcheoata,,,,,\r\nTOBG_SP-173,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-174,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_SP-175,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-176,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_D,\r\nTOBG_SP-177,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SP-178,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SP-179,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Hyphomicrobiaceae,Pelagibacterium,halotolerans\r\nTOBG_SP-18,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-180,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_SP-181,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Spongiibacteraceae,,\r\nTOBG_SP-182,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SP-183,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-184,found,Bacteria,Planctomycetes,Phycisphaerae,SM1A02,,,\r\nTOBG_SP-185,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SP-186,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Ponticaulis,\r\nTOBG_SP-187,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-188,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SP-189,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-19,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-190,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_SP-191,nomatch,,,,,,,\r\nTOBG_SP-192,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-193,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_SP-194,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-195,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-196,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-197,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-198,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_SP-199,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_SP-2,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Methylophaga,\r\nTOBG_SP-20,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_SP-200,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_I,\r\nTOBG_SP-201,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-202,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,FS140-16B-02marinegroup,,\r\nTOBG_SP-203,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-204,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-205,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_SP-206,nomatch,,,,,,,\r\nTOBG_SP-207,nomatch,,,,,,,\r\nTOBG_SP-208,nomatch,,,,,,,\r\nTOBG_SP-209,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SP-21,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,0319-6G20,,\r\nTOBG_SP-210,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SP-211,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_SP-212,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_SP-213,found,Bacteria,Acidobacteria,novelClass_A,,,,\r\nTOBG_SP-214,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-215,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_SP-216,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_SP-217,nomatch,,,,,,,\r\nTOBG_SP-218,nomatch,,,,,,,\r\nTOBG_SP-219,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-22,found,Bacteria,Epsilonbacteraeota,,,,,\r\nTOBG_SP-220,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_SP-221,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_SP-222,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SP-223,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-224,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_SP-225,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-226,found,Bacteria,Actinobacteria,Actinobacteria,Micrococcales,novelFamily_A,,\r\nTOBG_SP-227,nomatch,,,,,,,\r\nTOBG_SP-228,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-229,disagree,Bacteria,,,,,,\r\nTOBG_SP-23,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_SP-230,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-231,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-232,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SP-233,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_SP-234,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_SP-235,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_SP-236,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Oceanibulbus,\r\nTOBG_SP-237,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_SP-238,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,novel_genusE2,\r\nTOBG_SP-239,found,Bacteria,Proteobacteria,Alphaproteobacteria,unclassifiedAlphaproteobacteria,SAR116cluster,,\r\nTOBG_SP-24,nomatch,,,,,,,\r\nTOBG_SP-240,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE6,\r\nTOBG_SP-241,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_SP-242,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-243,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-244,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-245,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Stappia,\r\nTOBG_SP-246,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_SP-247,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Winogradskyella,\r\nTOBG_SP-248,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SP-249,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_C,,\r\nTOBG_SP-25,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_SP-250,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_E,,\r\nTOBG_SP-251,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Bdellovibrionaceae,,\r\nTOBG_SP-252,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Chromatiaceae,Rheinheimera,\r\nTOBG_SP-253,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_SP-254,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-255,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SP-256,nomatch,,,,,,,\r\nTOBG_SP-257,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SP-258,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,Spirochaeta,\r\nTOBG_SP-259,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_SP-26,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SP-260,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SP-261,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-262,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-263,found,Bacteria,Proteobacteria,Betaproteobacteria,Nitrosomonadales,Nitrosomonadaceae,,\r\nTOBG_SP-264,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-265,found,Bacteria,Proteobacteria,Nitrospinae,Nitrospinales,Nitrospinaceae,Nitrospina,\r\nTOBG_SP-266,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_SP-267,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-268,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Aestuariibacter,aggregatus\r\nTOBG_SP-269,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_SP-27,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_SP-270,nomatch,,,,,,,\r\nTOBG_SP-271,nomatch,,,,,,,\r\nTOBG_SP-272,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_SP-273,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_E,,,\r\nTOBG_SP-274,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_SP-275,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-276,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-277,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-278,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Mycobacteriaceae,Mycobacterium,\r\nTOBG_SP-279,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-280,nomatch,,,,,,,\r\nTOBG_SP-281,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-282,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SP-283,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_SP-284,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SP-285,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-286,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-287,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-288,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,Cobetia,\r\nTOBG_SP-289,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-29,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_SP-290,nomatch,,,,,,,\r\nTOBG_SP-291,found,Bacteria,proteobacteria,Gammaproteobacteria,Pseudomonadales,pseudomonadaceae,Pseudomonas,Xanthomarina\r\nTOBG_SP-292,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_SP-293,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_SP-294,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_SP-295,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SP-296,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SP-2968,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,novelOrder_A,novelFamily_A,,\r\nTOBG_SP-297,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_C,,\r\nTOBG_SP-2970,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SP-2971,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_SP-2972,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SP-2974,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-2975,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_SP-2976,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_E,,\r\nTOBG_SP-2977,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SP-2978,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,Woeseia,\r\nTOBG_SP-2979,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-298,nomatch,,,,,,,\r\nTOBG_SP-2981,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SP-2982,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-2983,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-2985,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_SP-2986,found,Bacteria,Proteobacteria,Nitrospinae,,,,\r\nTOBG_SP-2987,nomatch,,,,,,,\r\nTOBG_SP-2989,nomatch,,,,,,,\r\nTOBG_SP-299,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SP-2992,nomatch,,,,,,,\r\nTOBG_SP-2993,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,Sandracinaceae,Sandaracinus,\r\nTOBG_SP-2995,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_SP-2997,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_SP-2998,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SP-2999,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,Halobacteriovorax,\r\nTOBG_SP-3,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-30,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_B,,\r\nTOBG_SP-300,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_SP-3001,found,Bacteria,Planctomycetes,Pla3,,,,\r\nTOBG_SP-3003,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-3004,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_D,\r\nTOBG_SP-3005,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SP-3006,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-3007,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3009,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-301,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-3010,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3012,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3013,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_SP-3014,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_G,,\r\nTOBG_SP-3016,nomatch,,,,,,,\r\nTOBG_SP-3017,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-3018,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_SP-302,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Halieaceae,Haliea,salexigens\r\nTOBG_SP-3020,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_SP-3021,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Altererythrobacter,\r\nTOBG_SP-3022,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-3023,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-3024,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-3025,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-3027,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SP-3028,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Formosa,\r\nTOBG_SP-3029,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-303,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-3030,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Mesonia,\r\nTOBG_SP-3031,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Henriciella,\r\nTOBG_SP-3034,found,Bacteria,Cyanobacteria,unassigned,Prochlorales,Prochlorococcaceae,Prochlorococcus,\r\nTOBG_SP-3035,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SP-3036,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SP-3037,nomatch,,,,,,,\r\nTOBG_SP-3038,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SP-304,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-3040,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_SP-3041,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-3042,nomatch,,,,,,,\r\nTOBG_SP-3044,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-3045,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-3046,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,nove_genusE8,\r\nTOBG_SP-3048,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-3049,found,Bacteria,Saccharibacteria,,,,,\r\nTOBG_SP-305,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-3050,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-3051,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-3053,found,Bacteria,Proteobacteria,novelClass_B,,,,\r\nTOBG_SP-3054,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-3055,found,Bacteria,Proteobacteria,novelClass_A,,,,\r\nTOBG_SP-3056,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SP-3058,nomatch,,,,,,,\r\nTOBG_SP-3059,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-306,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SP-3060,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3061,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_D,\r\nTOBG_SP-3062,nomatch,,,,,,,\r\nTOBG_SP-3063,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3065,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_D,\r\nTOBG_SP-3066,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-3067,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-3068,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-3069,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-307,nomatch,,,,,,,\r\nTOBG_SP-3070,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-3072,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_SP-3073,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_B,,\r\nTOBG_SP-3074,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-3075,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-3078,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_E,\r\nTOBG_SP-308,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3081,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_F,\r\nTOBG_SP-3082,found,Bacteria,Planctomycetes,OM190,,,,\r\nTOBG_SP-3083,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_H,\r\nTOBG_SP-3084,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SP-3086,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_SP-3087,nomatch,,,,,,,\r\nTOBG_SP-3088,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_L,,\r\nTOBG_SP-3089,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SP-309,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SP-3091,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SP-3092,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-3093,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-3094,found,Bacteria,Proteobacteria,Gammaproteobacteria,Salinisphaerales,Salinisphaeraceae,Salinisphaera,\r\nTOBG_SP-3096,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_F,,,\r\nTOBG_SP-3097,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3098,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SP-31,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_D,,\r\nTOBG_SP-310,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-3100,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SP-3101,nomatch,,,,,,,\r\nTOBG_SP-3102,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_C,,,\r\nTOBG_SP-3103,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-3105,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3106,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SP-3107,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3109,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-311,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SP-3110,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Maricaulis,\r\nTOBG_SP-3111,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3112,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,Legionellaceae,,\r\nTOBG_SP-3114,nomatch,,,,,,,\r\nTOBG_SP-3115,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I,,\r\nTOBG_SP-3117,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3118,found,Bacteria,Planctomycetes,Phycisphaerae,JL-ENTP-F27,,,\r\nTOBG_SP-3119,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-312,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Spongiibacteraceae,spongiibacter,\r\nTOBG_SP-313,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-314,nomatch,,,,,,,\r\nTOBG_SP-315,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-316,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-317,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_SP-318,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-319,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_SP-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-320,found,Bacteria,Chloroflexi,SAR202-1,,,,\r\nTOBG_SP-321,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-322,disagree,,,,,,,\r\nTOBG_SP-323,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_C,\r\nTOBG_SP-324,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_E,,\r\nTOBG_SP-325,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_A,,,\r\nTOBG_SP-326,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_C,\r\nTOBG_SP-327,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_SP-328,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-329,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-33,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-330,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_E,,\r\nTOBG_SP-331,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-332,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,novelGenus_A,\r\nTOBG_SP-333,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_SP-334,nomatch,,,,,,,\r\nTOBG_SP-335,nomatch,,,,,,,\r\nTOBG_SP-336,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-337,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SP-338,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-339,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_E,,\r\nTOBG_SP-34,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-340,found,Bacteria,Proteobacteria,Gammaproteobacteria,Acidiferrobacterales,Acidiferrobacteraceae,,\r\nTOBG_SP-341,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-342,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-343,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-344,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-345,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SP-346,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SP-347,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Sutterellaceae,,\r\nTOBG_SP-348,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_A,\r\nTOBG_SP-349,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-35,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_SP-350,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_SP-351,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-352,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-353,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-354,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-355,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-356,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,,,,\r\nTOBG_SP-357,found,Bacteria,SBR1093,,,,,\r\nTOBG_SP-358,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Magnetovibrio,\r\nTOBG_SP-359,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-36,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Marinobacter,\r\nTOBG_SP-360,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-361,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SP-362,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SP-38,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SP-39,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_C,,\r\nTOBG_SP-3966,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-3971,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-3980,nomatch,,,,,,,\r\nTOBG_SP-3982,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-3983,disagree,Bacteria,,,,,,\r\nTOBG_SP-3984,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-3985,nomatch,,,,,,,\r\nTOBG_SP-3992,found,Archaea,Thaumarchaeota,novelClass_A,,,,\r\nTOBG_SP-4,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,novelGenus_G,\r\nTOBG_SP-40,nomatch,,,,,,,\r\nTOBG_SP-4016,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-4021,nomatch,,,,,,,\r\nTOBG_SP-4023,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,Opitutaceae,,\r\nTOBG_SP-4025,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-4027,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,novel_genusE10,\r\nTOBG_SP-4032,found,Bacteria,Verrucomicrobia,Opitutae,Puniceicoccales,Puniceicoccaceae,marinegroup,\r\nTOBG_SP-4038,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_D,,,\r\nTOBG_SP-4039,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4044,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_A,,,\r\nTOBG_SP-4045,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SP-4060,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_G,\r\nTOBG_SP-4073,nomatch,,,,,,,\r\nTOBG_SP-4095,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4097,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,Halobacteriovorax,\r\nTOBG_SP-41,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4114,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-4145,nomatch,,,,,,,\r\nTOBG_SP-4150,found,Bacteria,CandidatePhylaRadiation,,,,,\r\nTOBG_SP-4154,found,Bacteria,novelPhylum_C,,,,,\r\nTOBG_SP-4170,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4189,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_D,,,\r\nTOBG_SP-42,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_F,,\r\nTOBG_SP-4206,nomatch,,,,,,,\r\nTOBG_SP-4215,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-4220,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_D,,,\r\nTOBG_SP-4222,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_A,,,\r\nTOBG_SP-4225,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4236,found,Bacteria,Proteobacteria,Gammaproteobacteria,novelOrder_B,,,\r\nTOBG_SP-4246,nomatch,,,,,,,\r\nTOBG_SP-4248,found,Bacteria,Chloroflexi,novelClass_A,,,,\r\nTOBG_SP-4251,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-4258,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_SP-4260,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_SP-4269,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-4272,found,Bacteria,Gemmatimonadetes,ÂGemmatimonadetes,Gemmatimonadales,,,\r\nTOBG_SP-4275,nomatch,,,,,,,\r\nTOBG_SP-4288,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,novel_genusE7,\r\nTOBG_SP-4291,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-4294,nomatch,,,,,,,\r\nTOBG_SP-43,found,Bacteria,Proteobacteria,Gammaproteobacteria,Thiotrichales,Piscirickettsiaceae,Cycloclasticus,\r\nTOBG_SP-4300,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,Pelagibacter,\r\nTOBG_SP-4355,found,Bacteria,Chloroflexi,SAR202-2,novelOrder_B,,,\r\nTOBG_SP-4356,found,Bacteria,Chloroflexi,novelClass_F,,,,\r\nTOBG_SP-4360,found,Bacteria,Chloroflexi,SAR202-2,,,,\r\nTOBG_SP-4365,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,,,\r\nTOBG_SP-4366,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,novelFamily_A,,\r\nTOBG_SP-4369,nomatch,,,,,,,\r\nTOBG_SP-4372,nomatch,,,,,,,\r\nTOBG_SP-4374,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-4379,found,Bacteria,,,,,,\r\nTOBG_SP-4380,found,Bacteria,Acidobacteria,Solibacteres,Solibacterales,,,\r\nTOBG_SP-4387,found,Bacteria,Planctomycetes,Phycisphaerae,Phycisphaerales,Phycisphaeraceae,novelGenus_B,\r\nTOBG_SP-4388,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-44,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_SP-45,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cytophagaceae,Leeuwenhoekiella,\r\nTOBG_SP-46,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_D,,\r\nTOBG_SP-47,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-48,nomatch,,,,,,,\r\nTOBG_SP-486,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,Pelagibacteraceae,,\r\nTOBG_SP-49,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_B,\r\nTOBG_SP-5,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,novelFamily_D,,\r\nTOBG_SP-50,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,novel_genusE9,\r\nTOBG_SP-51,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-52,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,unassigned,Roseibacillus,\r\nTOBG_SP-53,nomatch,,,,,,,\r\nTOBG_SP-54,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-55,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SP-56,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,Woeseiaceae,,\r\nTOBG_SP-57,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseobacter,\r\nTOBG_SP-58,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Hyphomonas,\r\nTOBG_SP-59,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,Porticoccus,hydrocarbonoclasticus\r\nTOBG_SP-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,novel_order_E1,,,\r\nTOBG_SP-60,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-61,nomatch,,,,,,,\r\nTOBG_SP-62,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Croceibacter,atlanticus\r\nTOBG_SP-63,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Crenotrichaceae,Balneola,\r\nTOBG_SP-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-65,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_A,\r\nTOBG_SP-66,nomatch,,,,,,,\r\nTOBG_SP-67,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_B,,\r\nTOBG_SP-68,found,Bacteria,Proteobacteria,Deltaproteobacteria,SAR324cluster,,,\r\nTOBG_SP-69,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_B,,,\r\nTOBG_SP-7,nomatch,,,,,,,\r\nTOBG_SP-70,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Pseudozobellia,\r\nTOBG_SP-71,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-72,found,Bacteria,Chloroflexi,novelClass_E,novelOrder_C,,,\r\nTOBG_SP-73,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_SP-74,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Cryomorphaceae,Owenweeksia,\r\nTOBG_SP-75,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Aequorivita,\r\nTOBG_SP-76,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,novelGenus_B,novelSpecies_A\r\nTOBG_SP-77,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Phyllobacteriaceae,Hoeflea,\r\nTOBG_SP-78,found,Bacteria,SBR1093,,,,,\r\nTOBG_SP-79,nomatch,,,,,,,\r\nTOBG_SP-8,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-80,nomatch,,,,,,,\r\nTOBG_SP-81,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SP-82,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Crocinitomicaceae,,\r\nTOBG_SP-83,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_SP-84,found,Bacteria,Bacteria,,,,,\r\nTOBG_SP-85,found,Bacteria,Verrucomicrobia,Opitutae,novelOrder_B,,,\r\nTOBG_SP-86,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,,\r\nTOBG_SP-87,found,Bacteria,Proteobacteria,Deltaproteobacteria,Bdellovibrionales,Halobacteriovoraceae,,\r\nTOBG_SP-88,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_H,,\r\nTOBG_SP-89,found,Bacteria,Marinimicrobia,,,,,\r\nTOBG_SP-9,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,novel_familyE2,,\r\nTOBG_SP-90,found,Bacteria,Actinobacteria,Acidimicrobidae,Acidimicrobiales,Acidimicrobiaceae,novelGenus_C,\r\nTOBG_SP-91,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-92,found,Bacteria,Acidobacteria,unassigned,unassigned,novelFamily_A,,\r\nTOBG_SP-93,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,idiomarina,\r\nTOBG_SP-94,found,Bacteria,Proteobacteria,Alphaproteobacteria,Pelagibacterales,novel_familyE1,,\r\nTOBG_SP-95,found,Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,novelFamily_F,,\r\nTOBG_SP-96,found,Bacteria,Planctomycetes,Phycisphaerae,novelOrder_D,FS140-16B-02marinegroup,,\r\nTOBG_SP-97,found,Bacteria,Bacteroidetes,Sphingobacteria,Sphingobacteriales,Flammeovirgaceae,novelGenus_E,\r\nTOBG_SP-98,found,Bacteria,Proteobacteria,Gammaproteobacteria,Cellvibrionales,Porticoccaceae,novel_genusE3,\r\nTOBG_SP-99,found,Bacteria,Marinimicrobia,,,,,\r\n"
  },
  {
    "path": "tests/test-data/lca/tully-query.delmont-db.sigs.classify.csv",
    "content": "ID,status,superkingdom,phylum,class,order,family,genus,species\r\nTOBG_ARS-1,nomatch,,,,,,,\r\nTOBG_ARS-10,nomatch,,,,,,,\r\nTOBG_ARS-100,nomatch,,,,,,,\r\nTOBG_ARS-1004,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-1005,nomatch,,,,,,,\r\nTOBG_ARS-1007,nomatch,,,,,,,\r\nTOBG_ARS-1008,nomatch,,,,,,,\r\nTOBG_ARS-1009,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_ARS-101,nomatch,,,,,,,\r\nTOBG_ARS-1011,nomatch,,,,,,,\r\nTOBG_ARS-1012,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_ARS-1013,nomatch,,,,,,,\r\nTOBG_ARS-1015,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_ARS-1016,nomatch,,,,,,,\r\nTOBG_ARS-1018,nomatch,,,,,,,\r\nTOBG_ARS-1019,nomatch,,,,,,,\r\nTOBG_ARS-102,nomatch,,,,,,,\r\nTOBG_ARS-1020,nomatch,,,,,,,\r\nTOBG_ARS-1021,nomatch,,,,,,,\r\nTOBG_ARS-1023,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_ARS-1024,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_ARS-1025,nomatch,,,,,,,\r\nTOBG_ARS-1026,nomatch,,,,,,,\r\nTOBG_ARS-1028,nomatch,,,,,,,\r\nTOBG_ARS-1029,nomatch,,,,,,,\r\nTOBG_ARS-103,nomatch,,,,,,,\r\nTOBG_ARS-1030,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_ARS-1032,nomatch,,,,,,,\r\nTOBG_ARS-1033,nomatch,,,,,,,\r\nTOBG_ARS-1034,nomatch,,,,,,,\r\nTOBG_ARS-1035,nomatch,,,,,,,\r\nTOBG_ARS-1036,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_ARS-1037,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_ARS-1039,nomatch,,,,,,,\r\nTOBG_ARS-104,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_ARS-1040,nomatch,,,,,,,\r\nTOBG_ARS-1041,nomatch,,,,,,,\r\nTOBG_ARS-1043,nomatch,,,,,,,\r\nTOBG_ARS-105,nomatch,,,,,,,\r\nTOBG_ARS-106,nomatch,,,,,,,\r\nTOBG_ARS-108,nomatch,,,,,,,\r\nTOBG_ARS-109,nomatch,,,,,,,\r\nTOBG_ARS-11,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_ARS-112,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_ARS-1126,nomatch,,,,,,,\r\nTOBG_ARS-113,nomatch,,,,,,,\r\nTOBG_ARS-1134,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-115,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,\r\nTOBG_ARS-116,nomatch,,,,,,,\r\nTOBG_ARS-1160,nomatch,,,,,,,\r\nTOBG_ARS-1168,nomatch,,,,,,,\r\nTOBG_ARS-117,nomatch,,,,,,,\r\nTOBG_ARS-1172,nomatch,,,,,,,\r\nTOBG_ARS-1176,nomatch,,,,,,,\r\nTOBG_ARS-1178,nomatch,,,,,,,\r\nTOBG_ARS-118,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-1180,nomatch,,,,,,,\r\nTOBG_ARS-1182,nomatch,,,,,,,\r\nTOBG_ARS-1183,nomatch,,,,,,,\r\nTOBG_ARS-1193,nomatch,,,,,,,\r\nTOBG_ARS-1199,nomatch,,,,,,,\r\nTOBG_ARS-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_ARS-120,nomatch,,,,,,,\r\nTOBG_ARS-1203,nomatch,,,,,,,\r\nTOBG_ARS-121,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_ARS-1215,nomatch,,,,,,,\r\nTOBG_ARS-1224,nomatch,,,,,,,\r\nTOBG_ARS-123,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_ARS-124,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_ARS-1246,nomatch,,,,,,,\r\nTOBG_ARS-125,nomatch,,,,,,,\r\nTOBG_ARS-1279,nomatch,,,,,,,\r\nTOBG_ARS-1285,nomatch,,,,,,,\r\nTOBG_ARS-1286,nomatch,,,,,,,\r\nTOBG_ARS-1290,nomatch,,,,,,,\r\nTOBG_ARS-1297,nomatch,,,,,,,\r\nTOBG_ARS-1298,nomatch,,,,,,,\r\nTOBG_ARS-13,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_ARS-1301,nomatch,,,,,,,\r\nTOBG_ARS-1304,nomatch,,,,,,,\r\nTOBG_ARS-1307,nomatch,,,,,,,\r\nTOBG_ARS-1309,nomatch,,,,,,,\r\nTOBG_ARS-1310,nomatch,,,,,,,\r\nTOBG_ARS-1318,nomatch,,,,,,,\r\nTOBG_ARS-1330,nomatch,,,,,,,\r\nTOBG_ARS-1333,nomatch,,,,,,,\r\nTOBG_ARS-1334,nomatch,,,,,,,\r\nTOBG_ARS-1358,nomatch,,,,,,,\r\nTOBG_ARS-1360,nomatch,,,,,,,\r\nTOBG_ARS-1386,nomatch,,,,,,,\r\nTOBG_ARS-1394,nomatch,,,,,,,\r\nTOBG_ARS-14,nomatch,,,,,,,\r\nTOBG_ARS-1403,nomatch,,,,,,,\r\nTOBG_ARS-1414,nomatch,,,,,,,\r\nTOBG_ARS-1419,nomatch,,,,,,,\r\nTOBG_ARS-1420,nomatch,,,,,,,\r\nTOBG_ARS-1426,nomatch,,,,,,,\r\nTOBG_ARS-1427,nomatch,,,,,,,\r\nTOBG_ARS-1434,nomatch,,,,,,,\r\nTOBG_ARS-1441,nomatch,,,,,,,\r\nTOBG_ARS-15,nomatch,,,,,,,\r\nTOBG_ARS-16,nomatch,,,,,,,\r\nTOBG_ARS-17,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_ARS-18,nomatch,,,,,,,\r\nTOBG_ARS-19,nomatch,,,,,,,\r\nTOBG_ARS-2,nomatch,,,,,,,\r\nTOBG_ARS-20,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_ARS-21,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_ARS-22,nomatch,,,,,,,\r\nTOBG_ARS-23,nomatch,,,,,,,\r\nTOBG_ARS-24,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_ARS-25,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_ARS-26,nomatch,,,,,,,\r\nTOBG_ARS-27,nomatch,,,,,,,\r\nTOBG_ARS-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_ARS-29,nomatch,,,,,,,\r\nTOBG_ARS-3,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_ARS-30,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_ARS-31,nomatch,,,,,,,\r\nTOBG_ARS-32,nomatch,,,,,,,\r\nTOBG_ARS-33,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_ARS-34,nomatch,,,,,,,\r\nTOBG_ARS-35,nomatch,,,,,,,\r\nTOBG_ARS-36,nomatch,,,,,,,\r\nTOBG_ARS-37,nomatch,,,,,,,\r\nTOBG_ARS-38,nomatch,,,,,,,\r\nTOBG_ARS-39,nomatch,,,,,,,\r\nTOBG_ARS-4,nomatch,,,,,,,\r\nTOBG_ARS-40,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_ARS-41,nomatch,,,,,,,\r\nTOBG_ARS-42,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_ARS-43,nomatch,,,,,,,\r\nTOBG_ARS-44,found,Bacteria,,,,,,\r\nTOBG_ARS-45,nomatch,,,,,,,\r\nTOBG_ARS-46,nomatch,,,,,,,\r\nTOBG_ARS-47,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-48,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_ARS-49,nomatch,,,,,,,\r\nTOBG_ARS-5,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_ARS-50,nomatch,,,,,,,\r\nTOBG_ARS-51,nomatch,,,,,,,\r\nTOBG_ARS-52,nomatch,,,,,,,\r\nTOBG_ARS-53,nomatch,,,,,,,\r\nTOBG_ARS-54,nomatch,,,,,,,\r\nTOBG_ARS-55,nomatch,,,,,,,\r\nTOBG_ARS-56,nomatch,,,,,,,\r\nTOBG_ARS-57,nomatch,,,,,,,\r\nTOBG_ARS-58,nomatch,,,,,,,\r\nTOBG_ARS-59,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_ARS-6,nomatch,,,,,,,\r\nTOBG_ARS-60,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-61,nomatch,,,,,,,\r\nTOBG_ARS-62,nomatch,,,,,,,\r\nTOBG_ARS-63,nomatch,,,,,,,\r\nTOBG_ARS-64,nomatch,,,,,,,\r\nTOBG_ARS-65,nomatch,,,,,,,\r\nTOBG_ARS-66,nomatch,,,,,,,\r\nTOBG_ARS-67,nomatch,,,,,,,\r\nTOBG_ARS-68,nomatch,,,,,,,\r\nTOBG_ARS-69,nomatch,,,,,,,\r\nTOBG_ARS-7,nomatch,,,,,,,\r\nTOBG_ARS-70,nomatch,,,,,,,\r\nTOBG_ARS-71,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_ARS-72,nomatch,,,,,,,\r\nTOBG_ARS-73,nomatch,,,,,,,\r\nTOBG_ARS-733,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,Pseudomonas_mendocina\r\nTOBG_ARS-74,nomatch,,,,,,,\r\nTOBG_ARS-75,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_ARS-76,nomatch,,,,,,,\r\nTOBG_ARS-77,nomatch,,,,,,,\r\nTOBG_ARS-78,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-79,nomatch,,,,,,,\r\nTOBG_ARS-8,nomatch,,,,,,,\r\nTOBG_ARS-80,nomatch,,,,,,,\r\nTOBG_ARS-81,nomatch,,,,,,,\r\nTOBG_ARS-82,nomatch,,,,,,,\r\nTOBG_ARS-83,nomatch,,,,,,,\r\nTOBG_ARS-84,nomatch,,,,,,,\r\nTOBG_ARS-85,nomatch,,,,,,,\r\nTOBG_ARS-86,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_ARS-87,nomatch,,,,,,,\r\nTOBG_ARS-88,nomatch,,,,,,,\r\nTOBG_ARS-89,nomatch,,,,,,,\r\nTOBG_ARS-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_ARS-90,nomatch,,,,,,,\r\nTOBG_ARS-91,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_ARS-92,nomatch,,,,,,,\r\nTOBG_ARS-93,nomatch,,,,,,,\r\nTOBG_ARS-94,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_ARS-95,nomatch,,,,,,,\r\nTOBG_ARS-96,nomatch,,,,,,,\r\nTOBG_ARS-97,nomatch,,,,,,,\r\nTOBG_ARS-98,nomatch,,,,,,,\r\nTOBG_ARS-99,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_CPC-1,nomatch,,,,,,,\r\nTOBG_CPC-10,nomatch,,,,,,,\r\nTOBG_CPC-100,nomatch,,,,,,,\r\nTOBG_CPC-11,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_CPC-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,\r\nTOBG_CPC-1232,nomatch,,,,,,,\r\nTOBG_CPC-13,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-1326,nomatch,,,,,,,\r\nTOBG_CPC-1328,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-1337,nomatch,,,,,,,\r\nTOBG_CPC-1357,nomatch,,,,,,,\r\nTOBG_CPC-1365,nomatch,,,,,,,\r\nTOBG_CPC-1369,nomatch,,,,,,,\r\nTOBG_CPC-1382,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-1397,nomatch,,,,,,,\r\nTOBG_CPC-1399,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-14,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,\r\nTOBG_CPC-1446,nomatch,,,,,,,\r\nTOBG_CPC-1447,nomatch,,,,,,,\r\nTOBG_CPC-1462,nomatch,,,,,,,\r\nTOBG_CPC-1469,nomatch,,,,,,,\r\nTOBG_CPC-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_CPC-16,nomatch,,,,,,,\r\nTOBG_CPC-17,nomatch,,,,,,,\r\nTOBG_CPC-18,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-19,nomatch,,,,,,,\r\nTOBG_CPC-2,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_CPC-20,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,,,\r\nTOBG_CPC-22,nomatch,,,,,,,\r\nTOBG_CPC-23,nomatch,,,,,,,\r\nTOBG_CPC-24,nomatch,,,,,,,\r\nTOBG_CPC-25,nomatch,,,,,,,\r\nTOBG_CPC-26,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-27,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_CPC-28,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-288,nomatch,,,,,,,\r\nTOBG_CPC-289,nomatch,,,,,,,\r\nTOBG_CPC-29,nomatch,,,,,,,\r\nTOBG_CPC-290,nomatch,,,,,,,\r\nTOBG_CPC-291,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_CPC-293,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-294,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_CPC-295,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_CPC-296,found,Bacteria,,,,,,\r\nTOBG_CPC-297,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-299,nomatch,,,,,,,\r\nTOBG_CPC-3,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-30,nomatch,,,,,,,\r\nTOBG_CPC-300,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_CPC-301,nomatch,,,,,,,\r\nTOBG_CPC-302,nomatch,,,,,,,\r\nTOBG_CPC-305,nomatch,,,,,,,\r\nTOBG_CPC-306,nomatch,,,,,,,\r\nTOBG_CPC-307,nomatch,,,,,,,\r\nTOBG_CPC-309,found,Bacteria,Proteobacteria,Epsilonproteobacteria,Campylobacterales,Campylobacteraceae,Arcobacter,\r\nTOBG_CPC-31,nomatch,,,,,,,\r\nTOBG_CPC-310,nomatch,,,,,,,\r\nTOBG_CPC-311,nomatch,,,,,,,\r\nTOBG_CPC-313,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-314,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_CPC-315,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_CPC-316,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-317,nomatch,,,,,,,\r\nTOBG_CPC-319,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_CPC-32,nomatch,,,,,,,\r\nTOBG_CPC-320,nomatch,,,,,,,\r\nTOBG_CPC-322,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-323,nomatch,,,,,,,\r\nTOBG_CPC-324,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_CPC-325,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_CPC-326,nomatch,,,,,,,\r\nTOBG_CPC-327,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_CPC-33,nomatch,,,,,,,\r\nTOBG_CPC-34,nomatch,,,,,,,\r\nTOBG_CPC-35,nomatch,,,,,,,\r\nTOBG_CPC-36,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_CPC-38,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,,\r\nTOBG_CPC-39,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_CPC-4,nomatch,,,,,,,\r\nTOBG_CPC-40,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-41,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_CPC-42,nomatch,,,,,,,\r\nTOBG_CPC-43,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_CPC-44,nomatch,,,,,,,\r\nTOBG_CPC-45,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-46,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,Oceanicaulis_alexandrii\r\nTOBG_CPC-47,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_CPC-48,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_CPC-49,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_CPC-5,nomatch,,,,,,,\r\nTOBG_CPC-50,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_CPC-51,nomatch,,,,,,,\r\nTOBG_CPC-52,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_CPC-53,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_CPC-54,nomatch,,,,,,,\r\nTOBG_CPC-55,nomatch,,,,,,,\r\nTOBG_CPC-56,nomatch,,,,,,,\r\nTOBG_CPC-57,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_CPC-58,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_CPC-59,nomatch,,,,,,,\r\nTOBG_CPC-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_CPC-60,nomatch,,,,,,,\r\nTOBG_CPC-61,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_CPC-62,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,\r\nTOBG_CPC-63,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_CPC-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_CPC-65,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_CPC-66,nomatch,,,,,,,\r\nTOBG_CPC-67,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_CPC-68,nomatch,,,,,,,\r\nTOBG_CPC-69,nomatch,,,,,,,\r\nTOBG_CPC-7,nomatch,,,,,,,\r\nTOBG_CPC-70,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_CPC-71,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,,\r\nTOBG_CPC-72,nomatch,,,,,,,\r\nTOBG_CPC-73,nomatch,,,,,,,\r\nTOBG_CPC-74,nomatch,,,,,,,\r\nTOBG_CPC-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_CPC-76,nomatch,,,,,,,\r\nTOBG_CPC-77,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_CPC-78,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_CPC-79,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_CPC-8,nomatch,,,,,,,\r\nTOBG_CPC-80,nomatch,,,,,,,\r\nTOBG_CPC-81,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_CPC-82,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_CPC-83,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-84,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_CPC-85,nomatch,,,,,,,\r\nTOBG_CPC-86,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-87,nomatch,,,,,,,\r\nTOBG_CPC-88,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_CPC-89,nomatch,,,,,,,\r\nTOBG_CPC-9,nomatch,,,,,,,\r\nTOBG_CPC-90,nomatch,,,,,,,\r\nTOBG_CPC-91,nomatch,,,,,,,\r\nTOBG_CPC-92,nomatch,,,,,,,\r\nTOBG_CPC-93,nomatch,,,,,,,\r\nTOBG_CPC-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_CPC-95,nomatch,,,,,,,\r\nTOBG_CPC-96,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_CPC-97,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_CPC-98,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_CPC-99,nomatch,,,,,,,\r\nTOBG_EAC-1,nomatch,,,,,,,\r\nTOBG_EAC-10,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_EAC-100,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-101,nomatch,,,,,,,\r\nTOBG_EAC-102,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_EAC-103,nomatch,,,,,,,\r\nTOBG_EAC-104,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_EAC-105,nomatch,,,,,,,\r\nTOBG_EAC-106,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-107,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-108,nomatch,,,,,,,\r\nTOBG_EAC-109,nomatch,,,,,,,\r\nTOBG_EAC-11,nomatch,,,,,,,\r\nTOBG_EAC-110,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_EAC-111,nomatch,,,,,,,\r\nTOBG_EAC-112,nomatch,,,,,,,\r\nTOBG_EAC-113,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-114,nomatch,,,,,,,\r\nTOBG_EAC-115,nomatch,,,,,,,\r\nTOBG_EAC-116,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae_3,Sphingobium,\r\nTOBG_EAC-117,nomatch,,,,,,,\r\nTOBG_EAC-118,nomatch,,,,,,,\r\nTOBG_EAC-119,nomatch,,,,,,,\r\nTOBG_EAC-12,nomatch,,,,,,,\r\nTOBG_EAC-120,nomatch,,,,,,,\r\nTOBG_EAC-121,nomatch,,,,,,,\r\nTOBG_EAC-122,nomatch,,,,,,,\r\nTOBG_EAC-123,nomatch,,,,,,,\r\nTOBG_EAC-13,nomatch,,,,,,,\r\nTOBG_EAC-14,nomatch,,,,,,,\r\nTOBG_EAC-15,nomatch,,,,,,,\r\nTOBG_EAC-16,nomatch,,,,,,,\r\nTOBG_EAC-17,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_EAC-1768,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-1775,nomatch,,,,,,,\r\nTOBG_EAC-1785,nomatch,,,,,,,\r\nTOBG_EAC-1786,nomatch,,,,,,,\r\nTOBG_EAC-1795,nomatch,,,,,,,\r\nTOBG_EAC-18,nomatch,,,,,,,\r\nTOBG_EAC-19,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_EAC-1924,nomatch,,,,,,,\r\nTOBG_EAC-1938,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_EAC-1972,nomatch,,,,,,,\r\nTOBG_EAC-1995,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-2,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_EAC-20,nomatch,,,,,,,\r\nTOBG_EAC-2003,nomatch,,,,,,,\r\nTOBG_EAC-2006,nomatch,,,,,,,\r\nTOBG_EAC-2011,nomatch,,,,,,,\r\nTOBG_EAC-2021,nomatch,,,,,,,\r\nTOBG_EAC-2025,nomatch,,,,,,,\r\nTOBG_EAC-2037,nomatch,,,,,,,\r\nTOBG_EAC-2038,nomatch,,,,,,,\r\nTOBG_EAC-2047,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-2074,nomatch,,,,,,,\r\nTOBG_EAC-2087,nomatch,,,,,,,\r\nTOBG_EAC-2090,nomatch,,,,,,,\r\nTOBG_EAC-2092,nomatch,,,,,,,\r\nTOBG_EAC-2094,nomatch,,,,,,,\r\nTOBG_EAC-21,nomatch,,,,,,,\r\nTOBG_EAC-2107,nomatch,,,,,,,\r\nTOBG_EAC-22,nomatch,,,,,,,\r\nTOBG_EAC-23,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-24,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_EAC-25,nomatch,,,,,,,\r\nTOBG_EAC-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_EAC-27,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_EAC-28,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_EAC-29,disagree,Bacteria,,,,,,\r\nTOBG_EAC-3,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_EAC-30,nomatch,,,,,,,\r\nTOBG_EAC-31,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_EAC-32,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-33,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-34,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_EAC-35,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_EAC-36,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_EAC-37,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_EAC-38,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-39,nomatch,,,,,,,\r\nTOBG_EAC-4,nomatch,,,,,,,\r\nTOBG_EAC-40,nomatch,,,,,,,\r\nTOBG_EAC-41,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_EAC-42,nomatch,,,,,,,\r\nTOBG_EAC-43,disagree,Bacteria,Bacteroidetes,,,,,\r\nTOBG_EAC-44,nomatch,,,,,,,\r\nTOBG_EAC-45,nomatch,,,,,,,\r\nTOBG_EAC-46,nomatch,,,,,,,\r\nTOBG_EAC-47,nomatch,,,,,,,\r\nTOBG_EAC-48,nomatch,,,,,,,\r\nTOBG_EAC-49,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,Oceanicaulis_alexandrii\r\nTOBG_EAC-5,nomatch,,,,,,,\r\nTOBG_EAC-50,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_EAC-51,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_EAC-52,nomatch,,,,,,,\r\nTOBG_EAC-53,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_EAC-54,nomatch,,,,,,,\r\nTOBG_EAC-55,nomatch,,,,,,,\r\nTOBG_EAC-56,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_EAC-57,nomatch,,,,,,,\r\nTOBG_EAC-58,nomatch,,,,,,,\r\nTOBG_EAC-59,nomatch,,,,,,,\r\nTOBG_EAC-6,nomatch,,,,,,,\r\nTOBG_EAC-60,nomatch,,,,,,,\r\nTOBG_EAC-61,nomatch,,,,,,,\r\nTOBG_EAC-615,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_EAC-62,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_EAC-622,nomatch,,,,,,,\r\nTOBG_EAC-623,nomatch,,,,,,,\r\nTOBG_EAC-624,nomatch,,,,,,,\r\nTOBG_EAC-625,nomatch,,,,,,,\r\nTOBG_EAC-627,nomatch,,,,,,,\r\nTOBG_EAC-628,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_EAC-63,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_EAC-630,nomatch,,,,,,,\r\nTOBG_EAC-631,nomatch,,,,,,,\r\nTOBG_EAC-632,nomatch,,,,,,,\r\nTOBG_EAC-634,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Citromicrobium,\r\nTOBG_EAC-635,nomatch,,,,,,,\r\nTOBG_EAC-636,nomatch,,,,,,,\r\nTOBG_EAC-637,nomatch,,,,,,,\r\nTOBG_EAC-638,nomatch,,,,,,,\r\nTOBG_EAC-64,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_EAC-640,nomatch,,,,,,,\r\nTOBG_EAC-641,nomatch,,,,,,,\r\nTOBG_EAC-642,nomatch,,,,,,,\r\nTOBG_EAC-645,nomatch,,,,,,,\r\nTOBG_EAC-646,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_EAC-647,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_EAC-649,nomatch,,,,,,,\r\nTOBG_EAC-65,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_EAC-650,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-651,nomatch,,,,,,,\r\nTOBG_EAC-652,nomatch,,,,,,,\r\nTOBG_EAC-653,nomatch,,,,,,,\r\nTOBG_EAC-654,found,Bacteria,,,,,,\r\nTOBG_EAC-656,nomatch,,,,,,,\r\nTOBG_EAC-657,nomatch,,,,,,,\r\nTOBG_EAC-659,nomatch,,,,,,,\r\nTOBG_EAC-66,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_EAC-660,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-662,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_EAC-663,nomatch,,,,,,,\r\nTOBG_EAC-669,nomatch,,,,,,,\r\nTOBG_EAC-67,nomatch,,,,,,,\r\nTOBG_EAC-670,nomatch,,,,,,,\r\nTOBG_EAC-671,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-673,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_EAC-674,nomatch,,,,,,,\r\nTOBG_EAC-675,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-676,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_EAC-678,nomatch,,,,,,,\r\nTOBG_EAC-68,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_EAC-682,nomatch,,,,,,,\r\nTOBG_EAC-683,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,,\r\nTOBG_EAC-685,found,Bacteria,,,,,,\r\nTOBG_EAC-69,nomatch,,,,,,,\r\nTOBG_EAC-691,nomatch,,,,,,,\r\nTOBG_EAC-692,nomatch,,,,,,,\r\nTOBG_EAC-693,nomatch,,,,,,,\r\nTOBG_EAC-694,nomatch,,,,,,,\r\nTOBG_EAC-695,nomatch,,,,,,,\r\nTOBG_EAC-7,nomatch,,,,,,,\r\nTOBG_EAC-70,nomatch,,,,,,,\r\nTOBG_EAC-703,nomatch,,,,,,,\r\nTOBG_EAC-704,nomatch,,,,,,,\r\nTOBG_EAC-705,nomatch,,,,,,,\r\nTOBG_EAC-707,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_EAC-708,nomatch,,,,,,,\r\nTOBG_EAC-709,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_EAC-71,nomatch,,,,,,,\r\nTOBG_EAC-710,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-712,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_EAC-713,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_EAC-714,nomatch,,,,,,,\r\nTOBG_EAC-72,nomatch,,,,,,,\r\nTOBG_EAC-720,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-721,nomatch,,,,,,,\r\nTOBG_EAC-723,nomatch,,,,,,,\r\nTOBG_EAC-73,nomatch,,,,,,,\r\nTOBG_EAC-74,nomatch,,,,,,,\r\nTOBG_EAC-75,nomatch,,,,,,,\r\nTOBG_EAC-76,nomatch,,,,,,,\r\nTOBG_EAC-77,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,,\r\nTOBG_EAC-78,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_EAC-79,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_EAC-8,nomatch,,,,,,,\r\nTOBG_EAC-80,nomatch,,,,,,,\r\nTOBG_EAC-81,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_EAC-82,nomatch,,,,,,,\r\nTOBG_EAC-83,nomatch,,,,,,,\r\nTOBG_EAC-84,nomatch,,,,,,,\r\nTOBG_EAC-85,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_EAC-86,nomatch,,,,,,,\r\nTOBG_EAC-87,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,,,\r\nTOBG_EAC-88,nomatch,,,,,,,\r\nTOBG_EAC-89,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_EAC-9,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_EAC-90,nomatch,,,,,,,\r\nTOBG_EAC-91,nomatch,,,,,,,\r\nTOBG_EAC-92,nomatch,,,,,,,\r\nTOBG_EAC-93,nomatch,,,,,,,\r\nTOBG_EAC-94,nomatch,,,,,,,\r\nTOBG_EAC-95,nomatch,,,,,,,\r\nTOBG_EAC-96,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_EAC-97,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_EAC-98,nomatch,,,,,,,\r\nTOBG_EAC-99,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_IN-1,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,Pseudomonas_mendocina\r\nTOBG_IN-10,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_IN-1000,nomatch,,,,,,,\r\nTOBG_IN-1003,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_IN-1073,nomatch,,,,,,,\r\nTOBG_IN-1077,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_IN-1093,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_IN-11,nomatch,,,,,,,\r\nTOBG_IN-12,nomatch,,,,,,,\r\nTOBG_IN-1207,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_IN-1213,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_IN-1214,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_IN-1219,nomatch,,,,,,,\r\nTOBG_IN-1222,disagree,,,,,,,\r\nTOBG_IN-13,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_IN-1311,nomatch,,,,,,,\r\nTOBG_IN-14,nomatch,,,,,,,\r\nTOBG_IN-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_IN-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Caulobacterales,Caulobacteraceae,Brevundimonas,\r\nTOBG_IN-17,nomatch,,,,,,,\r\nTOBG_IN-18,nomatch,,,,,,,\r\nTOBG_IN-19,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_IN-2,nomatch,,,,,,,\r\nTOBG_IN-20,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_IN-21,nomatch,,,,,,,\r\nTOBG_IN-22,nomatch,,,,,,,\r\nTOBG_IN-23,nomatch,,,,,,,\r\nTOBG_IN-24,nomatch,,,,,,,\r\nTOBG_IN-25,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_IN-26,nomatch,,,,,,,\r\nTOBG_IN-27,nomatch,,,,,,,\r\nTOBG_IN-28,nomatch,,,,,,,\r\nTOBG_IN-29,nomatch,,,,,,,\r\nTOBG_IN-3,nomatch,,,,,,,\r\nTOBG_IN-30,nomatch,,,,,,,\r\nTOBG_IN-31,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_IN-33,disagree,,,,,,,\r\nTOBG_IN-34,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-35,nomatch,,,,,,,\r\nTOBG_IN-36,nomatch,,,,,,,\r\nTOBG_IN-37,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-38,nomatch,,,,,,,\r\nTOBG_IN-39,nomatch,,,,,,,\r\nTOBG_IN-4,nomatch,,,,,,,\r\nTOBG_IN-40,nomatch,,,,,,,\r\nTOBG_IN-41,nomatch,,,,,,,\r\nTOBG_IN-42,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_IN-43,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_IN-44,nomatch,,,,,,,\r\nTOBG_IN-45,nomatch,,,,,,,\r\nTOBG_IN-46,nomatch,,,,,,,\r\nTOBG_IN-47,disagree,,,,,,,\r\nTOBG_IN-48,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_IN-49,nomatch,,,,,,,\r\nTOBG_IN-5,nomatch,,,,,,,\r\nTOBG_IN-6,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_IN-7,nomatch,,,,,,,\r\nTOBG_IN-8,nomatch,,,,,,,\r\nTOBG_IN-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_IN-912,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_IN-913,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-918,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-919,disagree,,,,,,,\r\nTOBG_IN-921,nomatch,,,,,,,\r\nTOBG_IN-922,nomatch,,,,,,,\r\nTOBG_IN-924,nomatch,,,,,,,\r\nTOBG_IN-926,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_IN-928,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_IN-929,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_IN-930,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_IN-961,nomatch,,,,,,,\r\nTOBG_MED-1001,found,Bacteria,Bacteroidetes,Cytophagia,,,,\r\nTOBG_MED-1003,nomatch,,,,,,,\r\nTOBG_MED-1008,nomatch,,,,,,,\r\nTOBG_MED-1017,nomatch,,,,,,,\r\nTOBG_MED-1036,nomatch,,,,,,,\r\nTOBG_MED-104,nomatch,,,,,,,\r\nTOBG_MED-1046,nomatch,,,,,,,\r\nTOBG_MED-1047,nomatch,,,,,,,\r\nTOBG_MED-105,nomatch,,,,,,,\r\nTOBG_MED-1076,nomatch,,,,,,,\r\nTOBG_MED-1079,nomatch,,,,,,,\r\nTOBG_MED-1093,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-1094,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-1105,nomatch,,,,,,,\r\nTOBG_MED-1116,nomatch,,,,,,,\r\nTOBG_MED-1122,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_MED-1131,nomatch,,,,,,,\r\nTOBG_MED-1153,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,Pelagibacteraceae,,\r\nTOBG_MED-1155,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,Oxalobacteraceae,,\r\nTOBG_MED-1178,nomatch,,,,,,,\r\nTOBG_MED-1190,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_MED-1222,nomatch,,,,,,,\r\nTOBG_MED-1223,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-1227,nomatch,,,,,,,\r\nTOBG_MED-1229,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-1233,nomatch,,,,,,,\r\nTOBG_MED-124,nomatch,,,,,,,\r\nTOBG_MED-1247,nomatch,,,,,,,\r\nTOBG_MED-1250,nomatch,,,,,,,\r\nTOBG_MED-1257,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-1261,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-1269,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-1270,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-139,nomatch,,,,,,,\r\nTOBG_MED-174,nomatch,,,,,,,\r\nTOBG_MED-191,nomatch,,,,,,,\r\nTOBG_MED-195,found,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,,\r\nTOBG_MED-203,nomatch,,,,,,,\r\nTOBG_MED-211,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-215,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-569,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-580,nomatch,,,,,,,\r\nTOBG_MED-581,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-582,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_MED-583,found,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Micromonas,\r\nTOBG_MED-584,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-585,nomatch,,,,,,,\r\nTOBG_MED-586,nomatch,,,,,,,\r\nTOBG_MED-587,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_MED-588,nomatch,,,,,,,\r\nTOBG_MED-589,nomatch,,,,,,,\r\nTOBG_MED-590,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_MED-591,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-592,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_MED-593,nomatch,,,,,,,\r\nTOBG_MED-594,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-595,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-596,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-597,nomatch,,,,,,,\r\nTOBG_MED-598,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_MED-599,nomatch,,,,,,,\r\nTOBG_MED-600,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_MED-601,nomatch,,,,,,,\r\nTOBG_MED-602,nomatch,,,,,,,\r\nTOBG_MED-603,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-604,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-605,nomatch,,,,,,,\r\nTOBG_MED-606,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-607,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_MED-608,nomatch,,,,,,,\r\nTOBG_MED-609,nomatch,,,,,,,\r\nTOBG_MED-610,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_MED-611,nomatch,,,,,,,\r\nTOBG_MED-612,nomatch,,,,,,,\r\nTOBG_MED-613,nomatch,,,,,,,\r\nTOBG_MED-614,nomatch,,,,,,,\r\nTOBG_MED-615,nomatch,,,,,,,\r\nTOBG_MED-616,nomatch,,,,,,,\r\nTOBG_MED-617,nomatch,,,,,,,\r\nTOBG_MED-618,nomatch,,,,,,,\r\nTOBG_MED-619,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-620,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Nisaea,\r\nTOBG_MED-621,nomatch,,,,,,,\r\nTOBG_MED-622,nomatch,,,,,,,\r\nTOBG_MED-623,nomatch,,,,,,,\r\nTOBG_MED-624,nomatch,,,,,,,\r\nTOBG_MED-625,nomatch,,,,,,,\r\nTOBG_MED-626,nomatch,,,,,,,\r\nTOBG_MED-627,nomatch,,,,,,,\r\nTOBG_MED-628,nomatch,,,,,,,\r\nTOBG_MED-629,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_MED-630,nomatch,,,,,,,\r\nTOBG_MED-631,nomatch,,,,,,,\r\nTOBG_MED-632,nomatch,,,,,,,\r\nTOBG_MED-633,nomatch,,,,,,,\r\nTOBG_MED-634,nomatch,,,,,,,\r\nTOBG_MED-635,nomatch,,,,,,,\r\nTOBG_MED-636,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_MED-637,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_MED-638,nomatch,,,,,,,\r\nTOBG_MED-639,nomatch,,,,,,,\r\nTOBG_MED-640,nomatch,,,,,,,\r\nTOBG_MED-641,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-642,nomatch,,,,,,,\r\nTOBG_MED-643,disagree,Bacteria,,,,,,\r\nTOBG_MED-644,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,,,\r\nTOBG_MED-645,nomatch,,,,,,,\r\nTOBG_MED-646,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_MED-647,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_MED-648,nomatch,,,,,,,\r\nTOBG_MED-649,nomatch,,,,,,,\r\nTOBG_MED-650,nomatch,,,,,,,\r\nTOBG_MED-651,nomatch,,,,,,,\r\nTOBG_MED-652,nomatch,,,,,,,\r\nTOBG_MED-653,nomatch,,,,,,,\r\nTOBG_MED-654,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-655,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_MED-656,nomatch,,,,,,,\r\nTOBG_MED-657,disagree,Bacteria,,,,,,\r\nTOBG_MED-658,nomatch,,,,,,,\r\nTOBG_MED-659,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_MED-660,nomatch,,,,,,,\r\nTOBG_MED-661,nomatch,,,,,,,\r\nTOBG_MED-662,nomatch,,,,,,,\r\nTOBG_MED-663,nomatch,,,,,,,\r\nTOBG_MED-664,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-665,nomatch,,,,,,,\r\nTOBG_MED-666,nomatch,,,,,,,\r\nTOBG_MED-667,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-668,nomatch,,,,,,,\r\nTOBG_MED-669,nomatch,,,,,,,\r\nTOBG_MED-670,nomatch,,,,,,,\r\nTOBG_MED-671,nomatch,,,,,,,\r\nTOBG_MED-672,nomatch,,,,,,,\r\nTOBG_MED-673,nomatch,,,,,,,\r\nTOBG_MED-674,nomatch,,,,,,,\r\nTOBG_MED-675,nomatch,,,,,,,\r\nTOBG_MED-676,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-677,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-678,nomatch,,,,,,,\r\nTOBG_MED-679,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-680,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-681,nomatch,,,,,,,\r\nTOBG_MED-682,nomatch,,,,,,,\r\nTOBG_MED-683,nomatch,,,,,,,\r\nTOBG_MED-684,nomatch,,,,,,,\r\nTOBG_MED-685,nomatch,,,,,,,\r\nTOBG_MED-686,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-687,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-688,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_MED-689,nomatch,,,,,,,\r\nTOBG_MED-690,nomatch,,,,,,,\r\nTOBG_MED-691,nomatch,,,,,,,\r\nTOBG_MED-692,nomatch,,,,,,,\r\nTOBG_MED-693,nomatch,,,,,,,\r\nTOBG_MED-694,nomatch,,,,,,,\r\nTOBG_MED-695,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,,\r\nTOBG_MED-696,nomatch,,,,,,,\r\nTOBG_MED-697,nomatch,,,,,,,\r\nTOBG_MED-698,nomatch,,,,,,,\r\nTOBG_MED-699,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-700,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-701,nomatch,,,,,,,\r\nTOBG_MED-702,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_MED-703,nomatch,,,,,,,\r\nTOBG_MED-704,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-705,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-706,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-707,nomatch,,,,,,,\r\nTOBG_MED-708,nomatch,,,,,,,\r\nTOBG_MED-709,nomatch,,,,,,,\r\nTOBG_MED-710,nomatch,,,,,,,\r\nTOBG_MED-711,nomatch,,,,,,,\r\nTOBG_MED-712,nomatch,,,,,,,\r\nTOBG_MED-713,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_MED-714,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-715,nomatch,,,,,,,\r\nTOBG_MED-716,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-717,nomatch,,,,,,,\r\nTOBG_MED-718,nomatch,,,,,,,\r\nTOBG_MED-719,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_MED-720,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-721,nomatch,,,,,,,\r\nTOBG_MED-722,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_MED-723,nomatch,,,,,,,\r\nTOBG_MED-724,nomatch,,,,,,,\r\nTOBG_MED-725,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_MED-726,nomatch,,,,,,,\r\nTOBG_MED-727,nomatch,,,,,,,\r\nTOBG_MED-728,nomatch,,,,,,,\r\nTOBG_MED-729,nomatch,,,,,,,\r\nTOBG_MED-730,nomatch,,,,,,,\r\nTOBG_MED-731,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_MED-732,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_MED-733,nomatch,,,,,,,\r\nTOBG_MED-734,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_MED-735,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-736,nomatch,,,,,,,\r\nTOBG_MED-737,nomatch,,,,,,,\r\nTOBG_MED-738,nomatch,,,,,,,\r\nTOBG_MED-739,nomatch,,,,,,,\r\nTOBG_MED-740,nomatch,,,,,,,\r\nTOBG_MED-741,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_MED-742,nomatch,,,,,,,\r\nTOBG_MED-743,disagree,,,,,,,\r\nTOBG_MED-744,nomatch,,,,,,,\r\nTOBG_MED-745,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_MED-746,nomatch,,,,,,,\r\nTOBG_MED-747,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_MED-748,nomatch,,,,,,,\r\nTOBG_MED-749,nomatch,,,,,,,\r\nTOBG_MED-750,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_MED-751,nomatch,,,,,,,\r\nTOBG_MED-752,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_MED-753,nomatch,,,,,,,\r\nTOBG_MED-754,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-755,nomatch,,,,,,,\r\nTOBG_MED-756,nomatch,,,,,,,\r\nTOBG_MED-757,nomatch,,,,,,,\r\nTOBG_MED-758,nomatch,,,,,,,\r\nTOBG_MED-759,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-760,nomatch,,,,,,,\r\nTOBG_MED-761,nomatch,,,,,,,\r\nTOBG_MED-762,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-763,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-764,nomatch,,,,,,,\r\nTOBG_MED-765,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_MED-766,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_MED-767,nomatch,,,,,,,\r\nTOBG_MED-768,nomatch,,,,,,,\r\nTOBG_MED-769,nomatch,,,,,,,\r\nTOBG_MED-770,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-771,nomatch,,,,,,,\r\nTOBG_MED-772,nomatch,,,,,,,\r\nTOBG_MED-773,nomatch,,,,,,,\r\nTOBG_MED-774,nomatch,,,,,,,\r\nTOBG_MED-775,nomatch,,,,,,,\r\nTOBG_MED-776,nomatch,,,,,,,\r\nTOBG_MED-777,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-778,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-779,nomatch,,,,,,,\r\nTOBG_MED-780,nomatch,,,,,,,\r\nTOBG_MED-781,nomatch,,,,,,,\r\nTOBG_MED-782,nomatch,,,,,,,\r\nTOBG_MED-783,nomatch,,,,,,,\r\nTOBG_MED-784,nomatch,,,,,,,\r\nTOBG_MED-785,nomatch,,,,,,,\r\nTOBG_MED-786,nomatch,,,,,,,\r\nTOBG_MED-787,nomatch,,,,,,,\r\nTOBG_MED-788,nomatch,,,,,,,\r\nTOBG_MED-789,disagree,Bacteria,,,,,,\r\nTOBG_MED-790,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-791,nomatch,,,,,,,\r\nTOBG_MED-792,nomatch,,,,,,,\r\nTOBG_MED-793,nomatch,,,,,,,\r\nTOBG_MED-794,nomatch,,,,,,,\r\nTOBG_MED-795,nomatch,,,,,,,\r\nTOBG_MED-796,nomatch,,,,,,,\r\nTOBG_MED-797,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-798,nomatch,,,,,,,\r\nTOBG_MED-800,nomatch,,,,,,,\r\nTOBG_MED-801,nomatch,,,,,,,\r\nTOBG_MED-802,nomatch,,,,,,,\r\nTOBG_MED-803,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-804,nomatch,,,,,,,\r\nTOBG_MED-805,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-806,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_MED-807,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-808,nomatch,,,,,,,\r\nTOBG_MED-809,found,Bacteria,,,,,,\r\nTOBG_MED-810,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-811,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-812,nomatch,,,,,,,\r\nTOBG_MED-813,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_MED-814,nomatch,,,,,,,\r\nTOBG_MED-815,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-816,nomatch,,,,,,,\r\nTOBG_MED-817,nomatch,,,,,,,\r\nTOBG_MED-818,nomatch,,,,,,,\r\nTOBG_MED-819,nomatch,,,,,,,\r\nTOBG_MED-820,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-821,nomatch,,,,,,,\r\nTOBG_MED-822,nomatch,,,,,,,\r\nTOBG_MED-823,nomatch,,,,,,,\r\nTOBG_MED-824,nomatch,,,,,,,\r\nTOBG_MED-825,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_MED-826,found,Bacteria,Proteobacteria,Betaproteobacteria,,,,\r\nTOBG_MED-827,nomatch,,,,,,,\r\nTOBG_MED-828,nomatch,,,,,,,\r\nTOBG_MED-829,nomatch,,,,,,,\r\nTOBG_MED-830,nomatch,,,,,,,\r\nTOBG_MED-831,nomatch,,,,,,,\r\nTOBG_MED-832,nomatch,,,,,,,\r\nTOBG_MED-833,nomatch,,,,,,,\r\nTOBG_MED-834,nomatch,,,,,,,\r\nTOBG_MED-835,nomatch,,,,,,,\r\nTOBG_MED-836,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_MED-837,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-838,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-839,nomatch,,,,,,,\r\nTOBG_MED-840,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_MED-841,nomatch,,,,,,,\r\nTOBG_MED-842,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_MED-843,nomatch,,,,,,,\r\nTOBG_MED-844,nomatch,,,,,,,\r\nTOBG_MED-845,found,Bacteria,Cyanobacteria,,,,,\r\nTOBG_MED-846,nomatch,,,,,,,\r\nTOBG_MED-847,nomatch,,,,,,,\r\nTOBG_MED-848,nomatch,,,,,,,\r\nTOBG_MED-849,nomatch,,,,,,,\r\nTOBG_MED-850,nomatch,,,,,,,\r\nTOBG_MED-851,nomatch,,,,,,,\r\nTOBG_MED-852,nomatch,,,,,,,\r\nTOBG_MED-853,nomatch,,,,,,,\r\nTOBG_MED-854,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_MED-855,nomatch,,,,,,,\r\nTOBG_MED-856,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_MED-857,nomatch,,,,,,,\r\nTOBG_MED-858,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-859,nomatch,,,,,,,\r\nTOBG_MED-861,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_MED-862,nomatch,,,,,,,\r\nTOBG_MED-863,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-864,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_MED-865,nomatch,,,,,,,\r\nTOBG_MED-866,nomatch,,,,,,,\r\nTOBG_MED-867,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-868,nomatch,,,,,,,\r\nTOBG_MED-869,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-870,nomatch,,,,,,,\r\nTOBG_MED-871,nomatch,,,,,,,\r\nTOBG_MED-872,nomatch,,,,,,,\r\nTOBG_MED-873,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-874,nomatch,,,,,,,\r\nTOBG_MED-875,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_MED-876,nomatch,,,,,,,\r\nTOBG_MED-877,nomatch,,,,,,,\r\nTOBG_MED-878,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_MED-879,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_MED-880,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_MED-881,nomatch,,,,,,,\r\nTOBG_MED-882,nomatch,,,,,,,\r\nTOBG_MED-883,nomatch,,,,,,,\r\nTOBG_MED-884,nomatch,,,,,,,\r\nTOBG_MED-899,nomatch,,,,,,,\r\nTOBG_MED-921,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_MED-928,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-932,nomatch,,,,,,,\r\nTOBG_MED-939,nomatch,,,,,,,\r\nTOBG_MED-943,nomatch,,,,,,,\r\nTOBG_MED-947,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_MED-950,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_MED-952,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_MED-955,nomatch,,,,,,,\r\nTOBG_MED-957,nomatch,,,,,,,\r\nTOBG_MED-961,nomatch,,,,,,,\r\nTOBG_MED-965,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_MED-972,nomatch,,,,,,,\r\nTOBG_MED-995,nomatch,,,,,,,\r\nTOBG_MED-999,nomatch,,,,,,,\r\nTOBG_NAT-1,nomatch,,,,,,,\r\nTOBG_NAT-10,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhizobiaceae,,\r\nTOBG_NAT-100,nomatch,,,,,,,\r\nTOBG_NAT-101,nomatch,,,,,,,\r\nTOBG_NAT-102,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,,,\r\nTOBG_NAT-103,nomatch,,,,,,,\r\nTOBG_NAT-104,nomatch,,,,,,,\r\nTOBG_NAT-105,nomatch,,,,,,,\r\nTOBG_NAT-106,nomatch,,,,,,,\r\nTOBG_NAT-107,nomatch,,,,,,,\r\nTOBG_NAT-108,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-109,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-11,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-110,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-111,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-112,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_NAT-113,nomatch,,,,,,,\r\nTOBG_NAT-114,nomatch,,,,,,,\r\nTOBG_NAT-115,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-116,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,,\r\nTOBG_NAT-117,found,Bacteria,Chloroflexi,,,,,\r\nTOBG_NAT-118,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-119,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-12,nomatch,,,,,,,\r\nTOBG_NAT-120,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-121,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,\r\nTOBG_NAT-122,nomatch,,,,,,,\r\nTOBG_NAT-123,nomatch,,,,,,,\r\nTOBG_NAT-124,nomatch,,,,,,,\r\nTOBG_NAT-125,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-126,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-127,nomatch,,,,,,,\r\nTOBG_NAT-128,nomatch,,,,,,,\r\nTOBG_NAT-129,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,,,\r\nTOBG_NAT-13,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-130,nomatch,,,,,,,\r\nTOBG_NAT-131,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_NAT-132,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NAT-133,nomatch,,,,,,,\r\nTOBG_NAT-134,found,Bacteria,Ignavibacteriae,Ignavibacteria,Ignavibacteriales,,,\r\nTOBG_NAT-135,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-136,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-137,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-138,nomatch,,,,,,,\r\nTOBG_NAT-139,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-14,disagree,,,,,,,\r\nTOBG_NAT-140,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_NAT-141,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_NAT-142,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NAT-143,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-144,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-145,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NAT-146,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_NAT-147,nomatch,,,,,,,\r\nTOBG_NAT-148,nomatch,,,,,,,\r\nTOBG_NAT-149,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_NAT-15,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-150,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-151,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_NAT-152,nomatch,,,,,,,\r\nTOBG_NAT-153,nomatch,,,,,,,\r\nTOBG_NAT-154,nomatch,,,,,,,\r\nTOBG_NAT-155,nomatch,,,,,,,\r\nTOBG_NAT-156,nomatch,,,,,,,\r\nTOBG_NAT-157,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,\r\nTOBG_NAT-158,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_NAT-159,nomatch,,,,,,,\r\nTOBG_NAT-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_NAT-160,nomatch,,,,,,,\r\nTOBG_NAT-161,nomatch,,,,,,,\r\nTOBG_NAT-162,nomatch,,,,,,,\r\nTOBG_NAT-163,nomatch,,,,,,,\r\nTOBG_NAT-164,nomatch,,,,,,,\r\nTOBG_NAT-165,nomatch,,,,,,,\r\nTOBG_NAT-166,disagree,Bacteria,,,,,,\r\nTOBG_NAT-167,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NAT-168,nomatch,,,,,,,\r\nTOBG_NAT-169,nomatch,,,,,,,\r\nTOBG_NAT-17,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_NAT-170,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_NAT-171,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-172,nomatch,,,,,,,\r\nTOBG_NAT-173,nomatch,,,,,,,\r\nTOBG_NAT-174,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_NAT-175,nomatch,,,,,,,\r\nTOBG_NAT-176,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,,\r\nTOBG_NAT-177,found,Bacteria,Candidate_Phyla_Radiation,,,,,\r\nTOBG_NAT-178,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NAT-179,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-18,nomatch,,,,,,,\r\nTOBG_NAT-180,nomatch,,,,,,,\r\nTOBG_NAT-181,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NAT-182,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NAT-183,nomatch,,,,,,,\r\nTOBG_NAT-184,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_NAT-185,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,,,\r\nTOBG_NAT-186,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-187,nomatch,,,,,,,\r\nTOBG_NAT-188,nomatch,,,,,,,\r\nTOBG_NAT-189,nomatch,,,,,,,\r\nTOBG_NAT-19,found,Bacteria,,,,,,\r\nTOBG_NAT-190,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-191,found,Bacteria,,,,,,\r\nTOBG_NAT-192,nomatch,,,,,,,\r\nTOBG_NAT-193,nomatch,,,,,,,\r\nTOBG_NAT-194,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NAT-195,nomatch,,,,,,,\r\nTOBG_NAT-196,nomatch,,,,,,,\r\nTOBG_NAT-197,nomatch,,,,,,,\r\nTOBG_NAT-198,nomatch,,,,,,,\r\nTOBG_NAT-199,nomatch,,,,,,,\r\nTOBG_NAT-2,nomatch,,,,,,,\r\nTOBG_NAT-20,nomatch,,,,,,,\r\nTOBG_NAT-200,nomatch,,,,,,,\r\nTOBG_NAT-201,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_NAT-202,nomatch,,,,,,,\r\nTOBG_NAT-203,nomatch,,,,,,,\r\nTOBG_NAT-204,nomatch,,,,,,,\r\nTOBG_NAT-205,nomatch,,,,,,,\r\nTOBG_NAT-206,nomatch,,,,,,,\r\nTOBG_NAT-207,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-208,nomatch,,,,,,,\r\nTOBG_NAT-209,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_NAT-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_NAT-210,nomatch,,,,,,,\r\nTOBG_NAT-211,nomatch,,,,,,,\r\nTOBG_NAT-212,nomatch,,,,,,,\r\nTOBG_NAT-213,nomatch,,,,,,,\r\nTOBG_NAT-214,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_NAT-215,nomatch,,,,,,,\r\nTOBG_NAT-216,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae_3,Sphingobium,\r\nTOBG_NAT-217,nomatch,,,,,,,\r\nTOBG_NAT-218,nomatch,,,,,,,\r\nTOBG_NAT-219,nomatch,,,,,,,\r\nTOBG_NAT-22,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_NAT-220,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-221,nomatch,,,,,,,\r\nTOBG_NAT-222,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-223,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_NAT-224,nomatch,,,,,,,\r\nTOBG_NAT-225,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-226,nomatch,,,,,,,\r\nTOBG_NAT-227,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-228,nomatch,,,,,,,\r\nTOBG_NAT-229,nomatch,,,,,,,\r\nTOBG_NAT-23,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_NAT-230,nomatch,,,,,,,\r\nTOBG_NAT-231,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-232,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-233,nomatch,,,,,,,\r\nTOBG_NAT-234,nomatch,,,,,,,\r\nTOBG_NAT-235,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_NAT-236,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-237,found,Bacteria,,,,,,\r\nTOBG_NAT-238,nomatch,,,,,,,\r\nTOBG_NAT-239,nomatch,,,,,,,\r\nTOBG_NAT-24,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-240,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NAT-241,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-242,nomatch,,,,,,,\r\nTOBG_NAT-243,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NAT-244,nomatch,,,,,,,\r\nTOBG_NAT-245,nomatch,,,,,,,\r\nTOBG_NAT-246,nomatch,,,,,,,\r\nTOBG_NAT-247,nomatch,,,,,,,\r\nTOBG_NAT-248,disagree,Bacteria,,,,,,\r\nTOBG_NAT-249,found,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,,\r\nTOBG_NAT-25,nomatch,,,,,,,\r\nTOBG_NAT-250,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-251,nomatch,,,,,,,\r\nTOBG_NAT-252,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-253,nomatch,,,,,,,\r\nTOBG_NAT-254,nomatch,,,,,,,\r\nTOBG_NAT-255,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-256,nomatch,,,,,,,\r\nTOBG_NAT-257,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,\r\nTOBG_NAT-258,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-259,nomatch,,,,,,,\r\nTOBG_NAT-26,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NAT-260,nomatch,,,,,,,\r\nTOBG_NAT-261,nomatch,,,,,,,\r\nTOBG_NAT-262,nomatch,,,,,,,\r\nTOBG_NAT-263,nomatch,,,,,,,\r\nTOBG_NAT-264,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-265,nomatch,,,,,,,\r\nTOBG_NAT-266,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-267,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-268,nomatch,,,,,,,\r\nTOBG_NAT-269,found,Bacteria,Bacteroidetes,Cytophagia,,,,\r\nTOBG_NAT-27,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-270,found,Bacteria,Bacteroidetes,Cytophagia,,,,\r\nTOBG_NAT-271,nomatch,,,,,,,\r\nTOBG_NAT-272,nomatch,,,,,,,\r\nTOBG_NAT-273,nomatch,,,,,,,\r\nTOBG_NAT-274,nomatch,,,,,,,\r\nTOBG_NAT-275,nomatch,,,,,,,\r\nTOBG_NAT-276,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,,,\r\nTOBG_NAT-277,nomatch,,,,,,,\r\nTOBG_NAT-278,nomatch,,,,,,,\r\nTOBG_NAT-279,nomatch,,,,,,,\r\nTOBG_NAT-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_NAT-280,found,Bacteria,,,,,,\r\nTOBG_NAT-281,nomatch,,,,,,,\r\nTOBG_NAT-282,nomatch,,,,,,,\r\nTOBG_NAT-283,found,Bacteria,Proteobacteria,Betaproteobacteria,Methylophilales,,,\r\nTOBG_NAT-284,nomatch,,,,,,,\r\nTOBG_NAT-288,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-29,nomatch,,,,,,,\r\nTOBG_NAT-290,nomatch,,,,,,,\r\nTOBG_NAT-291,nomatch,,,,,,,\r\nTOBG_NAT-292,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-3,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,,,\r\nTOBG_NAT-30,nomatch,,,,,,,\r\nTOBG_NAT-302,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-31,nomatch,,,,,,,\r\nTOBG_NAT-32,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NAT-33,nomatch,,,,,,,\r\nTOBG_NAT-333,nomatch,,,,,,,\r\nTOBG_NAT-34,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-35,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-353,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_NAT-36,nomatch,,,,,,,\r\nTOBG_NAT-37,nomatch,,,,,,,\r\nTOBG_NAT-375,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_NAT-38,nomatch,,,,,,,\r\nTOBG_NAT-39,nomatch,,,,,,,\r\nTOBG_NAT-392,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NAT-4,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-40,nomatch,,,,,,,\r\nTOBG_NAT-41,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-417,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-42,nomatch,,,,,,,\r\nTOBG_NAT-422,nomatch,,,,,,,\r\nTOBG_NAT-43,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-430,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NAT-44,nomatch,,,,,,,\r\nTOBG_NAT-441,nomatch,,,,,,,\r\nTOBG_NAT-45,nomatch,,,,,,,\r\nTOBG_NAT-453,nomatch,,,,,,,\r\nTOBG_NAT-46,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,,,\r\nTOBG_NAT-47,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NAT-472,nomatch,,,,,,,\r\nTOBG_NAT-478,nomatch,,,,,,,\r\nTOBG_NAT-48,nomatch,,,,,,,\r\nTOBG_NAT-483,nomatch,,,,,,,\r\nTOBG_NAT-484,nomatch,,,,,,,\r\nTOBG_NAT-49,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_NAT-493,nomatch,,,,,,,\r\nTOBG_NAT-495,nomatch,,,,,,,\r\nTOBG_NAT-5,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-50,nomatch,,,,,,,\r\nTOBG_NAT-501,nomatch,,,,,,,\r\nTOBG_NAT-503,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NAT-504,nomatch,,,,,,,\r\nTOBG_NAT-509,nomatch,,,,,,,\r\nTOBG_NAT-51,nomatch,,,,,,,\r\nTOBG_NAT-510,nomatch,,,,,,,\r\nTOBG_NAT-52,nomatch,,,,,,,\r\nTOBG_NAT-53,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NAT-535,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NAT-54,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-545,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_NAT-549,nomatch,,,,,,,\r\nTOBG_NAT-55,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-56,nomatch,,,,,,,\r\nTOBG_NAT-57,nomatch,,,,,,,\r\nTOBG_NAT-575,nomatch,,,,,,,\r\nTOBG_NAT-579,nomatch,,,,,,,\r\nTOBG_NAT-58,nomatch,,,,,,,\r\nTOBG_NAT-59,nomatch,,,,,,,\r\nTOBG_NAT-6,nomatch,,,,,,,\r\nTOBG_NAT-60,nomatch,,,,,,,\r\nTOBG_NAT-608,nomatch,,,,,,,\r\nTOBG_NAT-61,disagree,Bacteria,,,,,,\r\nTOBG_NAT-62,nomatch,,,,,,,\r\nTOBG_NAT-63,nomatch,,,,,,,\r\nTOBG_NAT-630,nomatch,,,,,,,\r\nTOBG_NAT-634,nomatch,,,,,,,\r\nTOBG_NAT-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-65,disagree,Bacteria,,,,,,\r\nTOBG_NAT-653,nomatch,,,,,,,\r\nTOBG_NAT-66,nomatch,,,,,,,\r\nTOBG_NAT-661,nomatch,,,,,,,\r\nTOBG_NAT-67,nomatch,,,,,,,\r\nTOBG_NAT-68,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NAT-682,nomatch,,,,,,,\r\nTOBG_NAT-686,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NAT-69,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_NAT-7,nomatch,,,,,,,\r\nTOBG_NAT-70,found,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,,\r\nTOBG_NAT-71,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-72,nomatch,,,,,,,\r\nTOBG_NAT-73,nomatch,,,,,,,\r\nTOBG_NAT-74,nomatch,,,,,,,\r\nTOBG_NAT-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NAT-76,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_NAT-77,found,Bacteria,Candidate_Phyla_Radiation,,,,,\r\nTOBG_NAT-78,nomatch,,,,,,,\r\nTOBG_NAT-79,nomatch,,,,,,,\r\nTOBG_NAT-8,nomatch,,,,,,,\r\nTOBG_NAT-80,nomatch,,,,,,,\r\nTOBG_NAT-81,nomatch,,,,,,,\r\nTOBG_NAT-82,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NAT-83,nomatch,,,,,,,\r\nTOBG_NAT-84,nomatch,,,,,,,\r\nTOBG_NAT-85,nomatch,,,,,,,\r\nTOBG_NAT-86,nomatch,,,,,,,\r\nTOBG_NAT-87,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NAT-88,nomatch,,,,,,,\r\nTOBG_NAT-89,nomatch,,,,,,,\r\nTOBG_NAT-9,nomatch,,,,,,,\r\nTOBG_NAT-90,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NAT-91,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_NAT-92,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NAT-93,nomatch,,,,,,,\r\nTOBG_NAT-94,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NAT-95,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NAT-96,nomatch,,,,,,,\r\nTOBG_NAT-97,found,Bacteria,Candidate_Phyla_Radiation,,,,,\r\nTOBG_NAT-98,nomatch,,,,,,,\r\nTOBG_NAT-99,nomatch,,,,,,,\r\nTOBG_NP-1,nomatch,,,,,,,\r\nTOBG_NP-10,nomatch,,,,,,,\r\nTOBG_NP-100,nomatch,,,,,,,\r\nTOBG_NP-1000,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_NP-1001,nomatch,,,,,,,\r\nTOBG_NP-101,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NP-102,nomatch,,,,,,,\r\nTOBG_NP-1026,found,Bacteria,,,,,,\r\nTOBG_NP-103,found,Bacteria,,,,,,\r\nTOBG_NP-1036,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_NP-1037,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-104,nomatch,,,,,,,\r\nTOBG_NP-1044,nomatch,,,,,,,\r\nTOBG_NP-1046,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_NP-1048,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_NP-105,nomatch,,,,,,,\r\nTOBG_NP-1051,nomatch,,,,,,,\r\nTOBG_NP-1052,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-1057,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-106,nomatch,,,,,,,\r\nTOBG_NP-1069,nomatch,,,,,,,\r\nTOBG_NP-107,nomatch,,,,,,,\r\nTOBG_NP-1070,nomatch,,,,,,,\r\nTOBG_NP-1071,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-1073,nomatch,,,,,,,\r\nTOBG_NP-108,nomatch,,,,,,,\r\nTOBG_NP-1080,nomatch,,,,,,,\r\nTOBG_NP-109,nomatch,,,,,,,\r\nTOBG_NP-1098,nomatch,,,,,,,\r\nTOBG_NP-11,nomatch,,,,,,,\r\nTOBG_NP-110,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-1106,nomatch,,,,,,,\r\nTOBG_NP-111,nomatch,,,,,,,\r\nTOBG_NP-112,nomatch,,,,,,,\r\nTOBG_NP-1124,nomatch,,,,,,,\r\nTOBG_NP-113,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_NP-114,nomatch,,,,,,,\r\nTOBG_NP-115,nomatch,,,,,,,\r\nTOBG_NP-1152,nomatch,,,,,,,\r\nTOBG_NP-1159,nomatch,,,,,,,\r\nTOBG_NP-116,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-1160,nomatch,,,,,,,\r\nTOBG_NP-117,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NP-1171,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-118,nomatch,,,,,,,\r\nTOBG_NP-1180,nomatch,,,,,,,\r\nTOBG_NP-119,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_NP-12,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-120,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,,\r\nTOBG_NP-1202,nomatch,,,,,,,\r\nTOBG_NP-1207,nomatch,,,,,,,\r\nTOBG_NP-121,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_NP-122,nomatch,,,,,,,\r\nTOBG_NP-123,nomatch,,,,,,,\r\nTOBG_NP-124,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-125,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-1256,nomatch,,,,,,,\r\nTOBG_NP-126,nomatch,,,,,,,\r\nTOBG_NP-127,nomatch,,,,,,,\r\nTOBG_NP-1271,nomatch,,,,,,,\r\nTOBG_NP-1277,nomatch,,,,,,,\r\nTOBG_NP-128,nomatch,,,,,,,\r\nTOBG_NP-1282,nomatch,,,,,,,\r\nTOBG_NP-1285,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_NP-129,nomatch,,,,,,,\r\nTOBG_NP-1295,nomatch,,,,,,,\r\nTOBG_NP-1297,nomatch,,,,,,,\r\nTOBG_NP-13,nomatch,,,,,,,\r\nTOBG_NP-130,nomatch,,,,,,,\r\nTOBG_NP-1301,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NP-1304,nomatch,,,,,,,\r\nTOBG_NP-131,nomatch,,,,,,,\r\nTOBG_NP-132,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NP-1321,nomatch,,,,,,,\r\nTOBG_NP-1324,nomatch,,,,,,,\r\nTOBG_NP-133,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_NP-134,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-1344,nomatch,,,,,,,\r\nTOBG_NP-135,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-136,nomatch,,,,,,,\r\nTOBG_NP-137,found,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Bathycoccaceae,Ostreococcus,\r\nTOBG_NP-1374,nomatch,,,,,,,\r\nTOBG_NP-1378,nomatch,,,,,,,\r\nTOBG_NP-138,nomatch,,,,,,,\r\nTOBG_NP-139,nomatch,,,,,,,\r\nTOBG_NP-1391,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_NP-1395,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-14,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-140,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_NP-1400,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NP-141,nomatch,,,,,,,\r\nTOBG_NP-142,nomatch,,,,,,,\r\nTOBG_NP-143,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_NP-144,nomatch,,,,,,,\r\nTOBG_NP-1444,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-145,nomatch,,,,,,,\r\nTOBG_NP-146,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_NP-1463,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NP-1466,nomatch,,,,,,,\r\nTOBG_NP-147,nomatch,,,,,,,\r\nTOBG_NP-1472,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-148,nomatch,,,,,,,\r\nTOBG_NP-149,nomatch,,,,,,,\r\nTOBG_NP-1496,nomatch,,,,,,,\r\nTOBG_NP-15,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,\r\nTOBG_NP-150,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-151,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NP-152,nomatch,,,,,,,\r\nTOBG_NP-1521,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-153,nomatch,,,,,,,\r\nTOBG_NP-155,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-156,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_NP-16,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_NP-17,found,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanobium,,\r\nTOBG_NP-18,nomatch,,,,,,,\r\nTOBG_NP-19,nomatch,,,,,,,\r\nTOBG_NP-2,nomatch,,,,,,,\r\nTOBG_NP-20,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-21,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-22,nomatch,,,,,,,\r\nTOBG_NP-23,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NP-24,nomatch,,,,,,,\r\nTOBG_NP-25,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,,\r\nTOBG_NP-26,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_NP-27,nomatch,,,,,,,\r\nTOBG_NP-28,nomatch,,,,,,,\r\nTOBG_NP-29,nomatch,,,,,,,\r\nTOBG_NP-3,nomatch,,,,,,,\r\nTOBG_NP-30,nomatch,,,,,,,\r\nTOBG_NP-31,nomatch,,,,,,,\r\nTOBG_NP-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_NP-33,nomatch,,,,,,,\r\nTOBG_NP-34,disagree,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,,,\r\nTOBG_NP-35,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NP-36,nomatch,,,,,,,\r\nTOBG_NP-37,nomatch,,,,,,,\r\nTOBG_NP-38,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-39,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_NP-4,nomatch,,,,,,,\r\nTOBG_NP-40,nomatch,,,,,,,\r\nTOBG_NP-41,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-42,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_NP-43,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae_3,Sphingobium,\r\nTOBG_NP-44,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,\r\nTOBG_NP-45,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_NP-46,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_NP-47,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,,\r\nTOBG_NP-48,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-49,nomatch,,,,,,,\r\nTOBG_NP-5,nomatch,,,,,,,\r\nTOBG_NP-50,nomatch,,,,,,,\r\nTOBG_NP-51,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_NP-52,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_NP-53,disagree,Bacteria,,,,,,\r\nTOBG_NP-54,nomatch,,,,,,,\r\nTOBG_NP-55,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_NP-56,nomatch,,,,,,,\r\nTOBG_NP-57,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_NP-58,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-59,nomatch,,,,,,,\r\nTOBG_NP-6,nomatch,,,,,,,\r\nTOBG_NP-60,nomatch,,,,,,,\r\nTOBG_NP-61,nomatch,,,,,,,\r\nTOBG_NP-62,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_NP-63,nomatch,,,,,,,\r\nTOBG_NP-64,nomatch,,,,,,,\r\nTOBG_NP-65,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-66,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_NP-67,found,Bacteria,Candidate_Phyla_Radiation,,,,,\r\nTOBG_NP-68,nomatch,,,,,,,\r\nTOBG_NP-69,nomatch,,,,,,,\r\nTOBG_NP-7,nomatch,,,,,,,\r\nTOBG_NP-70,nomatch,,,,,,,\r\nTOBG_NP-71,nomatch,,,,,,,\r\nTOBG_NP-72,nomatch,,,,,,,\r\nTOBG_NP-73,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-74,nomatch,,,,,,,\r\nTOBG_NP-75,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-76,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NP-77,nomatch,,,,,,,\r\nTOBG_NP-78,nomatch,,,,,,,\r\nTOBG_NP-79,nomatch,,,,,,,\r\nTOBG_NP-8,nomatch,,,,,,,\r\nTOBG_NP-80,nomatch,,,,,,,\r\nTOBG_NP-81,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NP-82,nomatch,,,,,,,\r\nTOBG_NP-83,nomatch,,,,,,,\r\nTOBG_NP-84,nomatch,,,,,,,\r\nTOBG_NP-85,nomatch,,,,,,,\r\nTOBG_NP-86,nomatch,,,,,,,\r\nTOBG_NP-87,nomatch,,,,,,,\r\nTOBG_NP-88,nomatch,,,,,,,\r\nTOBG_NP-89,nomatch,,,,,,,\r\nTOBG_NP-9,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,\r\nTOBG_NP-90,nomatch,,,,,,,\r\nTOBG_NP-91,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_NP-92,nomatch,,,,,,,\r\nTOBG_NP-93,nomatch,,,,,,,\r\nTOBG_NP-931,nomatch,,,,,,,\r\nTOBG_NP-932,nomatch,,,,,,,\r\nTOBG_NP-933,nomatch,,,,,,,\r\nTOBG_NP-935,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-936,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_NP-937,nomatch,,,,,,,\r\nTOBG_NP-939,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NP-94,nomatch,,,,,,,\r\nTOBG_NP-941,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-942,found,Bacteria,,,,,,\r\nTOBG_NP-943,nomatch,,,,,,,\r\nTOBG_NP-944,nomatch,,,,,,,\r\nTOBG_NP-945,nomatch,,,,,,,\r\nTOBG_NP-946,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_NP-948,nomatch,,,,,,,\r\nTOBG_NP-949,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_NP-95,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,\r\nTOBG_NP-951,found,Bacteria,,,,,,\r\nTOBG_NP-952,nomatch,,,,,,,\r\nTOBG_NP-954,nomatch,,,,,,,\r\nTOBG_NP-955,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-956,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_NP-958,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-959,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-96,nomatch,,,,,,,\r\nTOBG_NP-960,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_NP-961,nomatch,,,,,,,\r\nTOBG_NP-962,nomatch,,,,,,,\r\nTOBG_NP-964,nomatch,,,,,,,\r\nTOBG_NP-965,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-966,nomatch,,,,,,,\r\nTOBG_NP-969,nomatch,,,,,,,\r\nTOBG_NP-97,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-970,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_NP-972,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_NP-973,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,,,\r\nTOBG_NP-975,found,Bacteria,,,,,,\r\nTOBG_NP-976,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_NP-977,nomatch,,,,,,,\r\nTOBG_NP-978,nomatch,,,,,,,\r\nTOBG_NP-98,nomatch,,,,,,,\r\nTOBG_NP-980,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_NP-981,nomatch,,,,,,,\r\nTOBG_NP-982,nomatch,,,,,,,\r\nTOBG_NP-983,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_NP-986,nomatch,,,,,,,\r\nTOBG_NP-987,nomatch,,,,,,,\r\nTOBG_NP-989,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_NP-99,nomatch,,,,,,,\r\nTOBG_NP-990,disagree,Bacteria,,,,,,\r\nTOBG_NP-992,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_NP-993,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_NP-995,found,Bacteria,,,,,,\r\nTOBG_NP-996,nomatch,,,,,,,\r\nTOBG_NP-997,disagree,Bacteria,,,,,,\r\nTOBG_NP-998,nomatch,,,,,,,\r\nTOBG_RS-307,nomatch,,,,,,,\r\nTOBG_RS-341,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-342,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_RS-343,nomatch,,,,,,,\r\nTOBG_RS-344,nomatch,,,,,,,\r\nTOBG_RS-345,nomatch,,,,,,,\r\nTOBG_RS-346,nomatch,,,,,,,\r\nTOBG_RS-347,nomatch,,,,,,,\r\nTOBG_RS-348,nomatch,,,,,,,\r\nTOBG_RS-349,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-350,nomatch,,,,,,,\r\nTOBG_RS-351,nomatch,,,,,,,\r\nTOBG_RS-352,nomatch,,,,,,,\r\nTOBG_RS-353,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-354,nomatch,,,,,,,\r\nTOBG_RS-355,nomatch,,,,,,,\r\nTOBG_RS-356,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-357,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-358,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-359,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_RS-360,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-361,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-362,found,Bacteria,Chloroflexi,,,,,\r\nTOBG_RS-363,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_RS-364,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_RS-365,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_RS-366,nomatch,,,,,,,\r\nTOBG_RS-367,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Citromicrobium,\r\nTOBG_RS-368,nomatch,,,,,,,\r\nTOBG_RS-369,found,Bacteria,,,,,,\r\nTOBG_RS-370,nomatch,,,,,,,\r\nTOBG_RS-371,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-372,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_RS-373,found,Bacteria,,,,,,\r\nTOBG_RS-374,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-375,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-376,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_RS-377,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-378,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-379,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_RS-380,nomatch,,,,,,,\r\nTOBG_RS-381,nomatch,,,,,,,\r\nTOBG_RS-382,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_RS-383,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,\r\nTOBG_RS-384,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-385,nomatch,,,,,,,\r\nTOBG_RS-386,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-387,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-388,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_RS-389,nomatch,,,,,,,\r\nTOBG_RS-390,nomatch,,,,,,,\r\nTOBG_RS-391,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-392,nomatch,,,,,,,\r\nTOBG_RS-393,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_RS-394,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-395,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,\r\nTOBG_RS-396,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_RS-397,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_RS-398,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_RS-399,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,\r\nTOBG_RS-400,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_RS-401,nomatch,,,,,,,\r\nTOBG_RS-402,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-403,nomatch,,,,,,,\r\nTOBG_RS-404,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_RS-405,nomatch,,,,,,,\r\nTOBG_RS-406,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-407,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-408,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_RS-409,nomatch,,,,,,,\r\nTOBG_RS-410,nomatch,,,,,,,\r\nTOBG_RS-411,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\r\nTOBG_RS-412,nomatch,,,,,,,\r\nTOBG_RS-413,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-414,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_RS-415,disagree,Bacteria,,,,,,\r\nTOBG_RS-416,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-417,nomatch,,,,,,,\r\nTOBG_RS-418,nomatch,,,,,,,\r\nTOBG_RS-419,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_RS-420,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-421,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_RS-422,nomatch,,,,,,,\r\nTOBG_RS-423,nomatch,,,,,,,\r\nTOBG_RS-424,nomatch,,,,,,,\r\nTOBG_RS-425,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_RS-426,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_RS-427,nomatch,,,,,,,\r\nTOBG_RS-428,nomatch,,,,,,,\r\nTOBG_RS-429,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-430,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_RS-431,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_RS-432,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-433,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-434,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_RS-435,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-436,nomatch,,,,,,,\r\nTOBG_RS-437,nomatch,,,,,,,\r\nTOBG_RS-438,nomatch,,,,,,,\r\nTOBG_RS-439,nomatch,,,,,,,\r\nTOBG_RS-440,nomatch,,,,,,,\r\nTOBG_RS-441,nomatch,,,,,,,\r\nTOBG_RS-442,found,Bacteria,,,,,,\r\nTOBG_RS-443,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-444,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_RS-445,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_RS-446,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_RS-447,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_RS-448,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_RS-449,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-450,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-451,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-452,nomatch,,,,,,,\r\nTOBG_RS-453,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-454,nomatch,,,,,,,\r\nTOBG_RS-455,nomatch,,,,,,,\r\nTOBG_RS-456,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_RS-457,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-458,found,Bacteria,,,,,,\r\nTOBG_RS-459,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-460,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-461,nomatch,,,,,,,\r\nTOBG_RS-462,nomatch,,,,,,,\r\nTOBG_RS-463,nomatch,,,,,,,\r\nTOBG_RS-464,disagree,Bacteria,,,,,,\r\nTOBG_RS-465,nomatch,,,,,,,\r\nTOBG_RS-466,nomatch,,,,,,,\r\nTOBG_RS-467,nomatch,,,,,,,\r\nTOBG_RS-468,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_RS-469,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-470,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-471,nomatch,,,,,,,\r\nTOBG_RS-472,nomatch,,,,,,,\r\nTOBG_RS-473,nomatch,,,,,,,\r\nTOBG_RS-474,nomatch,,,,,,,\r\nTOBG_RS-475,nomatch,,,,,,,\r\nTOBG_RS-476,nomatch,,,,,,,\r\nTOBG_RS-481,nomatch,,,,,,,\r\nTOBG_RS-495,nomatch,,,,,,,\r\nTOBG_RS-508,nomatch,,,,,,,\r\nTOBG_RS-510,nomatch,,,,,,,\r\nTOBG_RS-533,nomatch,,,,,,,\r\nTOBG_RS-535,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-551,nomatch,,,,,,,\r\nTOBG_RS-562,nomatch,,,,,,,\r\nTOBG_RS-570,nomatch,,,,,,,\r\nTOBG_RS-582,nomatch,,,,,,,\r\nTOBG_RS-590,nomatch,,,,,,,\r\nTOBG_RS-604,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-605,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_RS-615,disagree,Bacteria,,,,,,\r\nTOBG_RS-626,nomatch,,,,,,,\r\nTOBG_RS-648,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-652,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-654,nomatch,,,,,,,\r\nTOBG_RS-659,nomatch,,,,,,,\r\nTOBG_RS-665,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-668,nomatch,,,,,,,\r\nTOBG_RS-678,nomatch,,,,,,,\r\nTOBG_RS-697,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_RS-711,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_RS-723,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-726,nomatch,,,,,,,\r\nTOBG_RS-789,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_RS-797,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_RS-799,nomatch,,,,,,,\r\nTOBG_RS-813,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-814,nomatch,,,,,,,\r\nTOBG_RS-815,nomatch,,,,,,,\r\nTOBG_RS-816,nomatch,,,,,,,\r\nTOBG_RS-817,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_RS-818,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-819,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-820,nomatch,,,,,,,\r\nTOBG_RS-821,found,Bacteria,Firmicutes,Bacilli,,,,\r\nTOBG_RS-822,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_RS-823,nomatch,,,,,,,\r\nTOBG_RS-824,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_RS-825,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_RS-826,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-1,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SAT-10,nomatch,,,,,,,\r\nTOBG_SAT-100,nomatch,,,,,,,\r\nTOBG_SAT-101,nomatch,,,,,,,\r\nTOBG_SAT-102,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-103,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-104,nomatch,,,,,,,\r\nTOBG_SAT-105,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-106,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-107,nomatch,,,,,,,\r\nTOBG_SAT-108,nomatch,,,,,,,\r\nTOBG_SAT-109,nomatch,,,,,,,\r\nTOBG_SAT-11,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-110,nomatch,,,,,,,\r\nTOBG_SAT-111,nomatch,,,,,,,\r\nTOBG_SAT-112,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,\r\nTOBG_SAT-113,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,,\r\nTOBG_SAT-114,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,Maribacter,\r\nTOBG_SAT-115,nomatch,,,,,,,\r\nTOBG_SAT-116,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-117,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_SAT-118,nomatch,,,,,,,\r\nTOBG_SAT-119,nomatch,,,,,,,\r\nTOBG_SAT-12,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SAT-120,nomatch,,,,,,,\r\nTOBG_SAT-121,nomatch,,,,,,,\r\nTOBG_SAT-122,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-123,nomatch,,,,,,,\r\nTOBG_SAT-124,nomatch,,,,,,,\r\nTOBG_SAT-125,nomatch,,,,,,,\r\nTOBG_SAT-126,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-127,nomatch,,,,,,,\r\nTOBG_SAT-128,nomatch,,,,,,,\r\nTOBG_SAT-1289,nomatch,,,,,,,\r\nTOBG_SAT-129,nomatch,,,,,,,\r\nTOBG_SAT-1290,nomatch,,,,,,,\r\nTOBG_SAT-13,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-130,nomatch,,,,,,,\r\nTOBG_SAT-1300,nomatch,,,,,,,\r\nTOBG_SAT-1301,nomatch,,,,,,,\r\nTOBG_SAT-1302,nomatch,,,,,,,\r\nTOBG_SAT-1308,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_SAT-1309,nomatch,,,,,,,\r\nTOBG_SAT-131,nomatch,,,,,,,\r\nTOBG_SAT-132,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-1328,nomatch,,,,,,,\r\nTOBG_SAT-1329,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-133,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SAT-1331,nomatch,,,,,,,\r\nTOBG_SAT-1332,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_SAT-1333,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1339,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_SAT-134,nomatch,,,,,,,\r\nTOBG_SAT-1340,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SAT-1342,nomatch,,,,,,,\r\nTOBG_SAT-1344,nomatch,,,,,,,\r\nTOBG_SAT-1345,nomatch,,,,,,,\r\nTOBG_SAT-1346,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1347,nomatch,,,,,,,\r\nTOBG_SAT-135,nomatch,,,,,,,\r\nTOBG_SAT-1356,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SAT-1358,nomatch,,,,,,,\r\nTOBG_SAT-1359,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-136,nomatch,,,,,,,\r\nTOBG_SAT-1366,found,Bacteria,,,,,,\r\nTOBG_SAT-1367,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SAT-1369,nomatch,,,,,,,\r\nTOBG_SAT-137,nomatch,,,,,,,\r\nTOBG_SAT-138,nomatch,,,,,,,\r\nTOBG_SAT-1383,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_SAT-1384,nomatch,,,,,,,\r\nTOBG_SAT-1386,nomatch,,,,,,,\r\nTOBG_SAT-1387,nomatch,,,,,,,\r\nTOBG_SAT-1388,nomatch,,,,,,,\r\nTOBG_SAT-139,nomatch,,,,,,,\r\nTOBG_SAT-1390,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1391,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_SAT-14,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SAT-140,nomatch,,,,,,,\r\nTOBG_SAT-1401,nomatch,,,,,,,\r\nTOBG_SAT-1403,nomatch,,,,,,,\r\nTOBG_SAT-1404,nomatch,,,,,,,\r\nTOBG_SAT-1405,nomatch,,,,,,,\r\nTOBG_SAT-141,nomatch,,,,,,,\r\nTOBG_SAT-1415,nomatch,,,,,,,\r\nTOBG_SAT-1416,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-142,nomatch,,,,,,,\r\nTOBG_SAT-1429,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SAT-143,nomatch,,,,,,,\r\nTOBG_SAT-1430,nomatch,,,,,,,\r\nTOBG_SAT-1431,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SAT-1433,nomatch,,,,,,,\r\nTOBG_SAT-1434,nomatch,,,,,,,\r\nTOBG_SAT-144,nomatch,,,,,,,\r\nTOBG_SAT-1446,nomatch,,,,,,,\r\nTOBG_SAT-1448,nomatch,,,,,,,\r\nTOBG_SAT-1449,nomatch,,,,,,,\r\nTOBG_SAT-145,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1450,nomatch,,,,,,,\r\nTOBG_SAT-1451,nomatch,,,,,,,\r\nTOBG_SAT-146,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_SAT-1460,nomatch,,,,,,,\r\nTOBG_SAT-1461,nomatch,,,,,,,\r\nTOBG_SAT-1462,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_SAT-1464,nomatch,,,,,,,\r\nTOBG_SAT-147,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SAT-1475,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-1476,nomatch,,,,,,,\r\nTOBG_SAT-148,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,,,\r\nTOBG_SAT-1485,nomatch,,,,,,,\r\nTOBG_SAT-1487,nomatch,,,,,,,\r\nTOBG_SAT-1488,found,Bacteria,Bacteroidetes,Cytophagia,,,,\r\nTOBG_SAT-1489,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-149,nomatch,,,,,,,\r\nTOBG_SAT-15,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-150,nomatch,,,,,,,\r\nTOBG_SAT-1504,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1505,nomatch,,,,,,,\r\nTOBG_SAT-1507,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-1508,nomatch,,,,,,,\r\nTOBG_SAT-1509,nomatch,,,,,,,\r\nTOBG_SAT-151,nomatch,,,,,,,\r\nTOBG_SAT-1510,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1517,nomatch,,,,,,,\r\nTOBG_SAT-152,nomatch,,,,,,,\r\nTOBG_SAT-153,found,Bacteria,Bacteroidetes,Sphingobacteriia,Sphingobacteriales,Saprospiraceae,,\r\nTOBG_SAT-1530,nomatch,,,,,,,\r\nTOBG_SAT-154,nomatch,,,,,,,\r\nTOBG_SAT-155,nomatch,,,,,,,\r\nTOBG_SAT-1551,nomatch,,,,,,,\r\nTOBG_SAT-1553,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1554,nomatch,,,,,,,\r\nTOBG_SAT-156,nomatch,,,,,,,\r\nTOBG_SAT-1560,nomatch,,,,,,,\r\nTOBG_SAT-1561,nomatch,,,,,,,\r\nTOBG_SAT-1567,nomatch,,,,,,,\r\nTOBG_SAT-1568,nomatch,,,,,,,\r\nTOBG_SAT-157,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1576,nomatch,,,,,,,\r\nTOBG_SAT-1578,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1579,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-158,nomatch,,,,,,,\r\nTOBG_SAT-1581,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1582,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1584,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-1585,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SAT-159,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-16,nomatch,,,,,,,\r\nTOBG_SAT-160,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-1607,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-1608,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1609,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-161,nomatch,,,,,,,\r\nTOBG_SAT-1610,nomatch,,,,,,,\r\nTOBG_SAT-1611,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_SAT-1613,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-1614,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SAT-162,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SAT-163,nomatch,,,,,,,\r\nTOBG_SAT-164,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-165,nomatch,,,,,,,\r\nTOBG_SAT-166,nomatch,,,,,,,\r\nTOBG_SAT-167,nomatch,,,,,,,\r\nTOBG_SAT-168,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-169,nomatch,,,,,,,\r\nTOBG_SAT-17,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SAT-170,nomatch,,,,,,,\r\nTOBG_SAT-171,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-172,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SAT-173,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-174,nomatch,,,,,,,\r\nTOBG_SAT-175,nomatch,,,,,,,\r\nTOBG_SAT-176,nomatch,,,,,,,\r\nTOBG_SAT-177,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-178,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-179,nomatch,,,,,,,\r\nTOBG_SAT-18,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SAT-180,nomatch,,,,,,,\r\nTOBG_SAT-181,nomatch,,,,,,,\r\nTOBG_SAT-182,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-183,nomatch,,,,,,,\r\nTOBG_SAT-184,found,Bacteria,Cyanobacteria,Chroococcales,Chroococcales,Cyanothece,Cyanothece,\r\nTOBG_SAT-185,nomatch,,,,,,,\r\nTOBG_SAT-186,nomatch,,,,,,,\r\nTOBG_SAT-187,nomatch,,,,,,,\r\nTOBG_SAT-188,nomatch,,,,,,,\r\nTOBG_SAT-189,nomatch,,,,,,,\r\nTOBG_SAT-19,nomatch,,,,,,,\r\nTOBG_SAT-190,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-191,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-192,nomatch,,,,,,,\r\nTOBG_SAT-193,nomatch,,,,,,,\r\nTOBG_SAT-194,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,Oceanicaulis_alexandrii\r\nTOBG_SAT-195,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SAT-196,nomatch,,,,,,,\r\nTOBG_SAT-197,found,Bacteria,,,,,,\r\nTOBG_SAT-198,nomatch,,,,,,,\r\nTOBG_SAT-199,nomatch,,,,,,,\r\nTOBG_SAT-2,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,,\r\nTOBG_SAT-20,nomatch,,,,,,,\r\nTOBG_SAT-200,nomatch,,,,,,,\r\nTOBG_SAT-201,nomatch,,,,,,,\r\nTOBG_SAT-202,nomatch,,,,,,,\r\nTOBG_SAT-203,nomatch,,,,,,,\r\nTOBG_SAT-204,nomatch,,,,,,,\r\nTOBG_SAT-205,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-206,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-207,nomatch,,,,,,,\r\nTOBG_SAT-208,nomatch,,,,,,,\r\nTOBG_SAT-209,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SAT-21,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_SAT-210,nomatch,,,,,,,\r\nTOBG_SAT-211,found,Bacteria,,,,,,\r\nTOBG_SAT-212,nomatch,,,,,,,\r\nTOBG_SAT-213,nomatch,,,,,,,\r\nTOBG_SAT-214,nomatch,,,,,,,\r\nTOBG_SAT-215,nomatch,,,,,,,\r\nTOBG_SAT-216,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae_3,Sphingobium,\r\nTOBG_SAT-217,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-218,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-219,nomatch,,,,,,,\r\nTOBG_SAT-22,nomatch,,,,,,,\r\nTOBG_SAT-220,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-221,nomatch,,,,,,,\r\nTOBG_SAT-222,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_SAT-223,nomatch,,,,,,,\r\nTOBG_SAT-224,nomatch,,,,,,,\r\nTOBG_SAT-225,nomatch,,,,,,,\r\nTOBG_SAT-226,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-227,nomatch,,,,,,,\r\nTOBG_SAT-228,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SAT-229,nomatch,,,,,,,\r\nTOBG_SAT-23,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_SAT-230,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-24,nomatch,,,,,,,\r\nTOBG_SAT-25,nomatch,,,,,,,\r\nTOBG_SAT-2587,nomatch,,,,,,,\r\nTOBG_SAT-2594,nomatch,,,,,,,\r\nTOBG_SAT-2595,nomatch,,,,,,,\r\nTOBG_SAT-26,nomatch,,,,,,,\r\nTOBG_SAT-2604,nomatch,,,,,,,\r\nTOBG_SAT-2610,nomatch,,,,,,,\r\nTOBG_SAT-2619,nomatch,,,,,,,\r\nTOBG_SAT-2654,nomatch,,,,,,,\r\nTOBG_SAT-2681,nomatch,,,,,,,\r\nTOBG_SAT-2699,nomatch,,,,,,,\r\nTOBG_SAT-27,nomatch,,,,,,,\r\nTOBG_SAT-2701,nomatch,,,,,,,\r\nTOBG_SAT-2727,nomatch,,,,,,,\r\nTOBG_SAT-2731,nomatch,,,,,,,\r\nTOBG_SAT-2734,nomatch,,,,,,,\r\nTOBG_SAT-2750,nomatch,,,,,,,\r\nTOBG_SAT-2751,nomatch,,,,,,,\r\nTOBG_SAT-2755,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-2756,nomatch,,,,,,,\r\nTOBG_SAT-2766,nomatch,,,,,,,\r\nTOBG_SAT-2781,nomatch,,,,,,,\r\nTOBG_SAT-2787,nomatch,,,,,,,\r\nTOBG_SAT-2788,nomatch,,,,,,,\r\nTOBG_SAT-2797,nomatch,,,,,,,\r\nTOBG_SAT-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_SAT-2804,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-2814,nomatch,,,,,,,\r\nTOBG_SAT-2823,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,,\r\nTOBG_SAT-2856,nomatch,,,,,,,\r\nTOBG_SAT-2866,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_SAT-29,nomatch,,,,,,,\r\nTOBG_SAT-2910,nomatch,,,,,,,\r\nTOBG_SAT-2911,nomatch,,,,,,,\r\nTOBG_SAT-2956,nomatch,,,,,,,\r\nTOBG_SAT-2963,nomatch,,,,,,,\r\nTOBG_SAT-2971,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-2981,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-2985,nomatch,,,,,,,\r\nTOBG_SAT-2989,nomatch,,,,,,,\r\nTOBG_SAT-2990,nomatch,,,,,,,\r\nTOBG_SAT-2998,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-3,nomatch,,,,,,,\r\nTOBG_SAT-30,nomatch,,,,,,,\r\nTOBG_SAT-3008,nomatch,,,,,,,\r\nTOBG_SAT-3021,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-3034,found,Bacteria,Bacteroidetes,Sphingobacteriia,Sphingobacteriales,Saprospiraceae,,\r\nTOBG_SAT-3048,nomatch,,,,,,,\r\nTOBG_SAT-3076,nomatch,,,,,,,\r\nTOBG_SAT-3078,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SAT-31,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,Haliea,\r\nTOBG_SAT-32,found,Eukaryota,Chlorophyta,Prasinophyceae,Mamiellales,Mamiellaceae,Bathycoccus,\r\nTOBG_SAT-33,nomatch,,,,,,,\r\nTOBG_SAT-34,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_SAT-35,nomatch,,,,,,,\r\nTOBG_SAT-36,nomatch,,,,,,,\r\nTOBG_SAT-37,nomatch,,,,,,,\r\nTOBG_SAT-38,nomatch,,,,,,,\r\nTOBG_SAT-39,nomatch,,,,,,,\r\nTOBG_SAT-4,nomatch,,,,,,,\r\nTOBG_SAT-40,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_SAT-41,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SAT-42,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SAT-43,nomatch,,,,,,,\r\nTOBG_SAT-44,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SAT-45,nomatch,,,,,,,\r\nTOBG_SAT-46,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,Microbacterium,\r\nTOBG_SAT-47,found,Bacteria,,,,,,\r\nTOBG_SAT-48,nomatch,,,,,,,\r\nTOBG_SAT-49,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-5,nomatch,,,,,,,\r\nTOBG_SAT-50,nomatch,,,,,,,\r\nTOBG_SAT-51,nomatch,,,,,,,\r\nTOBG_SAT-52,nomatch,,,,,,,\r\nTOBG_SAT-53,nomatch,,,,,,,\r\nTOBG_SAT-54,nomatch,,,,,,,\r\nTOBG_SAT-55,nomatch,,,,,,,\r\nTOBG_SAT-56,nomatch,,,,,,,\r\nTOBG_SAT-57,nomatch,,,,,,,\r\nTOBG_SAT-58,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_SAT-59,nomatch,,,,,,,\r\nTOBG_SAT-6,nomatch,,,,,,,\r\nTOBG_SAT-60,nomatch,,,,,,,\r\nTOBG_SAT-61,nomatch,,,,,,,\r\nTOBG_SAT-62,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_SAT-63,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SAT-64,nomatch,,,,,,,\r\nTOBG_SAT-65,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_SAT-66,nomatch,,,,,,,\r\nTOBG_SAT-67,nomatch,,,,,,,\r\nTOBG_SAT-68,nomatch,,,,,,,\r\nTOBG_SAT-69,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_2,Pseudoalteromonadaceae,Pseudoalteromonas,\r\nTOBG_SAT-7,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,Citromicrobium,\r\nTOBG_SAT-70,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SAT-71,nomatch,,,,,,,\r\nTOBG_SAT-72,nomatch,,,,,,,\r\nTOBG_SAT-73,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SAT-74,nomatch,,,,,,,\r\nTOBG_SAT-75,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-76,nomatch,,,,,,,\r\nTOBG_SAT-77,nomatch,,,,,,,\r\nTOBG_SAT-78,nomatch,,,,,,,\r\nTOBG_SAT-79,nomatch,,,,,,,\r\nTOBG_SAT-8,nomatch,,,,,,,\r\nTOBG_SAT-80,nomatch,,,,,,,\r\nTOBG_SAT-81,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_SAT-82,nomatch,,,,,,,\r\nTOBG_SAT-83,nomatch,,,,,,,\r\nTOBG_SAT-84,nomatch,,,,,,,\r\nTOBG_SAT-85,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_SAT-86,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SAT-87,nomatch,,,,,,,\r\nTOBG_SAT-88,nomatch,,,,,,,\r\nTOBG_SAT-89,nomatch,,,,,,,\r\nTOBG_SAT-9,nomatch,,,,,,,\r\nTOBG_SAT-90,nomatch,,,,,,,\r\nTOBG_SAT-91,nomatch,,,,,,,\r\nTOBG_SAT-92,nomatch,,,,,,,\r\nTOBG_SAT-93,nomatch,,,,,,,\r\nTOBG_SAT-94,nomatch,,,,,,,\r\nTOBG_SAT-95,nomatch,,,,,,,\r\nTOBG_SAT-96,nomatch,,,,,,,\r\nTOBG_SAT-97,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SAT-98,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SAT-99,nomatch,,,,,,,\r\nTOBG_SP-1,nomatch,,,,,,,\r\nTOBG_SP-10,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-100,nomatch,,,,,,,\r\nTOBG_SP-101,nomatch,,,,,,,\r\nTOBG_SP-102,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-103,nomatch,,,,,,,\r\nTOBG_SP-104,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-105,nomatch,,,,,,,\r\nTOBG_SP-106,nomatch,,,,,,,\r\nTOBG_SP-107,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-108,nomatch,,,,,,,\r\nTOBG_SP-109,found,Bacteria,Proteobacteria,Deltaproteobacteria,Desulfovibrionales,Desulfovibrionaceae,Desulfovibrio,\r\nTOBG_SP-11,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-110,nomatch,,,,,,,\r\nTOBG_SP-111,nomatch,,,,,,,\r\nTOBG_SP-112,nomatch,,,,,,,\r\nTOBG_SP-113,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-114,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-115,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-116,nomatch,,,,,,,\r\nTOBG_SP-117,nomatch,,,,,,,\r\nTOBG_SP-118,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,,\r\nTOBG_SP-119,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,,\r\nTOBG_SP-12,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_SP-120,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SP-121,disagree,Bacteria,,,,,,\r\nTOBG_SP-122,nomatch,,,,,,,\r\nTOBG_SP-123,nomatch,,,,,,,\r\nTOBG_SP-124,nomatch,,,,,,,\r\nTOBG_SP-125,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-126,nomatch,,,,,,,\r\nTOBG_SP-127,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-128,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-129,nomatch,,,,,,,\r\nTOBG_SP-13,nomatch,,,,,,,\r\nTOBG_SP-130,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Microbacteriaceae,,\r\nTOBG_SP-131,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,Thalassospira,\r\nTOBG_SP-132,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_SP-133,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,Pseudomonas_mendocina\r\nTOBG_SP-134,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-135,nomatch,,,,,,,\r\nTOBG_SP-136,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_SP-137,nomatch,,,,,,,\r\nTOBG_SP-138,nomatch,,,,,,,\r\nTOBG_SP-139,nomatch,,,,,,,\r\nTOBG_SP-14,nomatch,,,,,,,\r\nTOBG_SP-140,nomatch,,,,,,,\r\nTOBG_SP-141,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-142,nomatch,,,,,,,\r\nTOBG_SP-143,nomatch,,,,,,,\r\nTOBG_SP-144,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_SP-145,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-146,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-147,nomatch,,,,,,,\r\nTOBG_SP-148,nomatch,,,,,,,\r\nTOBG_SP-149,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-15,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-150,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SP-151,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-152,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Oceanospirillaceae,,\r\nTOBG_SP-153,nomatch,,,,,,,\r\nTOBG_SP-154,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-155,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,Planctomyces,\r\nTOBG_SP-156,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-157,nomatch,,,,,,,\r\nTOBG_SP-158,nomatch,,,,,,,\r\nTOBG_SP-159,nomatch,,,,,,,\r\nTOBG_SP-16,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,,,\r\nTOBG_SP-160,nomatch,,,,,,,\r\nTOBG_SP-161,nomatch,,,,,,,\r\nTOBG_SP-162,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-163,nomatch,,,,,,,\r\nTOBG_SP-164,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-165,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-166,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-167,nomatch,,,,,,,\r\nTOBG_SP-168,nomatch,,,,,,,\r\nTOBG_SP-169,nomatch,,,,,,,\r\nTOBG_SP-17,nomatch,,,,,,,\r\nTOBG_SP-170,nomatch,,,,,,,\r\nTOBG_SP-171,nomatch,,,,,,,\r\nTOBG_SP-172,nomatch,,,,,,,\r\nTOBG_SP-173,nomatch,,,,,,,\r\nTOBG_SP-174,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-175,nomatch,,,,,,,\r\nTOBG_SP-176,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-177,nomatch,,,,,,,\r\nTOBG_SP-178,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-179,nomatch,,,,,,,\r\nTOBG_SP-18,nomatch,,,,,,,\r\nTOBG_SP-180,nomatch,,,,,,,\r\nTOBG_SP-181,nomatch,,,,,,,\r\nTOBG_SP-182,nomatch,,,,,,,\r\nTOBG_SP-183,nomatch,,,,,,,\r\nTOBG_SP-184,nomatch,,,,,,,\r\nTOBG_SP-185,nomatch,,,,,,,\r\nTOBG_SP-186,nomatch,,,,,,,\r\nTOBG_SP-187,nomatch,,,,,,,\r\nTOBG_SP-188,nomatch,,,,,,,\r\nTOBG_SP-189,nomatch,,,,,,,\r\nTOBG_SP-19,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_SP-190,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-191,nomatch,,,,,,,\r\nTOBG_SP-192,nomatch,,,,,,,\r\nTOBG_SP-193,nomatch,,,,,,,\r\nTOBG_SP-194,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-195,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-196,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-197,nomatch,,,,,,,\r\nTOBG_SP-198,nomatch,,,,,,,\r\nTOBG_SP-199,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-2,nomatch,,,,,,,\r\nTOBG_SP-20,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales_2,Hyphomonadaceae,,\r\nTOBG_SP-200,nomatch,,,,,,,\r\nTOBG_SP-201,nomatch,,,,,,,\r\nTOBG_SP-202,nomatch,,,,,,,\r\nTOBG_SP-203,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_SP-204,nomatch,,,,,,,\r\nTOBG_SP-205,nomatch,,,,,,,\r\nTOBG_SP-206,nomatch,,,,,,,\r\nTOBG_SP-207,nomatch,,,,,,,\r\nTOBG_SP-208,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-209,nomatch,,,,,,,\r\nTOBG_SP-21,nomatch,,,,,,,\r\nTOBG_SP-210,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-211,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SP-212,nomatch,,,,,,,\r\nTOBG_SP-213,nomatch,,,,,,,\r\nTOBG_SP-214,nomatch,,,,,,,\r\nTOBG_SP-215,nomatch,,,,,,,\r\nTOBG_SP-216,disagree,Bacteria,,,,,,\r\nTOBG_SP-217,nomatch,,,,,,,\r\nTOBG_SP-218,nomatch,,,,,,,\r\nTOBG_SP-219,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-22,nomatch,,,,,,,\r\nTOBG_SP-220,nomatch,,,,,,,\r\nTOBG_SP-221,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_SP-222,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-223,nomatch,,,,,,,\r\nTOBG_SP-224,nomatch,,,,,,,\r\nTOBG_SP-225,nomatch,,,,,,,\r\nTOBG_SP-226,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,,,\r\nTOBG_SP-227,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-228,found,Bacteria,Proteobacteria,Gammaproteobacteria,Legionellales,,,\r\nTOBG_SP-229,nomatch,,,,,,,\r\nTOBG_SP-23,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_SP-230,nomatch,,,,,,,\r\nTOBG_SP-231,nomatch,,,,,,,\r\nTOBG_SP-232,nomatch,,,,,,,\r\nTOBG_SP-233,nomatch,,,,,,,\r\nTOBG_SP-234,disagree,Bacteria,,,,,,\r\nTOBG_SP-235,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SP-236,nomatch,,,,,,,\r\nTOBG_SP-237,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SP-238,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_SP-239,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-24,nomatch,,,,,,,\r\nTOBG_SP-240,nomatch,,,,,,,\r\nTOBG_SP-241,found,Bacteria,Verrucomicrobia,Opitutae,Opitutales,,,\r\nTOBG_SP-242,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-243,nomatch,,,,,,,\r\nTOBG_SP-244,found,Bacteria,Proteobacteria,Gammaproteobacteria,Xanthomonadales,,,\r\nTOBG_SP-245,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,Rhodobacteraceae,,\r\nTOBG_SP-246,found,Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Erythrobacteraceae,,\r\nTOBG_SP-247,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-248,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-249,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-25,nomatch,,,,,,,\r\nTOBG_SP-250,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-251,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-252,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-253,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-254,nomatch,,,,,,,\r\nTOBG_SP-255,nomatch,,,,,,,\r\nTOBG_SP-256,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-257,nomatch,,,,,,,\r\nTOBG_SP-258,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Spirochaetaceae,,\r\nTOBG_SP-259,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Idiomarinaceae,Idiomarina,\r\nTOBG_SP-26,nomatch,,,,,,,\r\nTOBG_SP-260,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-261,nomatch,,,,,,,\r\nTOBG_SP-262,nomatch,,,,,,,\r\nTOBG_SP-263,nomatch,,,,,,,\r\nTOBG_SP-264,disagree,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-265,nomatch,,,,,,,\r\nTOBG_SP-266,nomatch,,,,,,,\r\nTOBG_SP-267,nomatch,,,,,,,\r\nTOBG_SP-268,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,\r\nTOBG_SP-269,nomatch,,,,,,,\r\nTOBG_SP-27,nomatch,,,,,,,\r\nTOBG_SP-270,nomatch,,,,,,,\r\nTOBG_SP-271,nomatch,,,,,,,\r\nTOBG_SP-272,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-273,nomatch,,,,,,,\r\nTOBG_SP-274,nomatch,,,,,,,\r\nTOBG_SP-275,nomatch,,,,,,,\r\nTOBG_SP-276,found,Bacteria,Candidatus_Marinimicrobia ,,,,,\r\nTOBG_SP-277,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-278,found,Bacteria,Actinobacteria,Actinobacteria,Actinomycetales,Mycobacteriaceae,Mycobacterium,\r\nTOBG_SP-279,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-28,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-280,nomatch,,,,,,,\r\nTOBG_SP-281,nomatch,,,,,,,\r\nTOBG_SP-282,nomatch,,,,,,,\r\nTOBG_SP-283,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-284,nomatch,,,,,,,\r\nTOBG_SP-285,nomatch,,,,,,,\r\nTOBG_SP-286,nomatch,,,,,,,\r\nTOBG_SP-287,nomatch,,,,,,,\r\nTOBG_SP-288,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Halomonadaceae,,\r\nTOBG_SP-289,nomatch,,,,,,,\r\nTOBG_SP-29,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-290,nomatch,,,,,,,\r\nTOBG_SP-291,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,Pseudomonadaceae,Pseudomonas,Pseudomonas_mendocina\r\nTOBG_SP-292,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_SP-293,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-294,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-295,nomatch,,,,,,,\r\nTOBG_SP-296,nomatch,,,,,,,\r\nTOBG_SP-2968,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-297,nomatch,,,,,,,\r\nTOBG_SP-2970,found,Bacteria,,,,,,\r\nTOBG_SP-2971,disagree,Bacteria,,,,,,\r\nTOBG_SP-2972,nomatch,,,,,,,\r\nTOBG_SP-2974,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-2975,nomatch,,,,,,,\r\nTOBG_SP-2976,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-2977,nomatch,,,,,,,\r\nTOBG_SP-2978,nomatch,,,,,,,\r\nTOBG_SP-2979,nomatch,,,,,,,\r\nTOBG_SP-298,nomatch,,,,,,,\r\nTOBG_SP-2981,nomatch,,,,,,,\r\nTOBG_SP-2982,nomatch,,,,,,,\r\nTOBG_SP-2983,nomatch,,,,,,,\r\nTOBG_SP-2985,nomatch,,,,,,,\r\nTOBG_SP-2986,found,Bacteria,,,,,,\r\nTOBG_SP-2987,nomatch,,,,,,,\r\nTOBG_SP-2989,nomatch,,,,,,,\r\nTOBG_SP-299,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-2992,nomatch,,,,,,,\r\nTOBG_SP-2993,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_SP-2995,nomatch,,,,,,,\r\nTOBG_SP-2997,nomatch,,,,,,,\r\nTOBG_SP-2998,nomatch,,,,,,,\r\nTOBG_SP-2999,nomatch,,,,,,,\r\nTOBG_SP-3,nomatch,,,,,,,\r\nTOBG_SP-30,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-300,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Rhodobacteraceae,Roseovarius,\r\nTOBG_SP-3001,nomatch,,,,,,,\r\nTOBG_SP-3003,nomatch,,,,,,,\r\nTOBG_SP-3004,nomatch,,,,,,,\r\nTOBG_SP-3005,found,Bacteria,Proteobacteria,Deltaproteobacteria,,,,\r\nTOBG_SP-3006,nomatch,,,,,,,\r\nTOBG_SP-3007,nomatch,,,,,,,\r\nTOBG_SP-3009,nomatch,,,,,,,\r\nTOBG_SP-301,nomatch,,,,,,,\r\nTOBG_SP-3010,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3012,nomatch,,,,,,,\r\nTOBG_SP-3013,nomatch,,,,,,,\r\nTOBG_SP-3014,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3016,nomatch,,,,,,,\r\nTOBG_SP-3017,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-3018,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Cyclobacteriaceae,Algoriphagus,\r\nTOBG_SP-302,nomatch,,,,,,,\r\nTOBG_SP-3020,nomatch,,,,,,,\r\nTOBG_SP-3021,nomatch,,,,,,,\r\nTOBG_SP-3022,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_SP-3023,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-3024,nomatch,,,,,,,\r\nTOBG_SP-3025,nomatch,,,,,,,\r\nTOBG_SP-3027,nomatch,,,,,,,\r\nTOBG_SP-3028,disagree,Bacteria,,,,,,\r\nTOBG_SP-3029,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-303,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3030,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-3031,nomatch,,,,,,,\r\nTOBG_SP-3034,nomatch,,,,,,,\r\nTOBG_SP-3035,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-3036,nomatch,,,,,,,\r\nTOBG_SP-3037,nomatch,,,,,,,\r\nTOBG_SP-3038,nomatch,,,,,,,\r\nTOBG_SP-304,nomatch,,,,,,,\r\nTOBG_SP-3040,nomatch,,,,,,,\r\nTOBG_SP-3041,nomatch,,,,,,,\r\nTOBG_SP-3042,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3044,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-3045,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-3046,nomatch,,,,,,,\r\nTOBG_SP-3048,nomatch,,,,,,,\r\nTOBG_SP-3049,nomatch,,,,,,,\r\nTOBG_SP-305,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-3050,nomatch,,,,,,,\r\nTOBG_SP-3051,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3053,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-3054,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3055,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_SP-3056,found,Bacteria,,,,,,\r\nTOBG_SP-3058,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rickettsiales,,,\r\nTOBG_SP-3059,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-306,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-3060,nomatch,,,,,,,\r\nTOBG_SP-3061,nomatch,,,,,,,\r\nTOBG_SP-3062,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3063,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3065,nomatch,,,,,,,\r\nTOBG_SP-3066,nomatch,,,,,,,\r\nTOBG_SP-3067,nomatch,,,,,,,\r\nTOBG_SP-3068,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3069,disagree,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-307,nomatch,,,,,,,\r\nTOBG_SP-3070,nomatch,,,,,,,\r\nTOBG_SP-3072,nomatch,,,,,,,\r\nTOBG_SP-3073,nomatch,,,,,,,\r\nTOBG_SP-3074,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3075,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-3078,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-308,nomatch,,,,,,,\r\nTOBG_SP-3081,nomatch,,,,,,,\r\nTOBG_SP-3082,nomatch,,,,,,,\r\nTOBG_SP-3083,nomatch,,,,,,,\r\nTOBG_SP-3084,nomatch,,,,,,,\r\nTOBG_SP-3086,nomatch,,,,,,,\r\nTOBG_SP-3087,nomatch,,,,,,,\r\nTOBG_SP-3088,nomatch,,,,,,,\r\nTOBG_SP-3089,nomatch,,,,,,,\r\nTOBG_SP-309,nomatch,,,,,,,\r\nTOBG_SP-3091,found,Bacteria,,,,,,\r\nTOBG_SP-3092,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3093,nomatch,,,,,,,\r\nTOBG_SP-3094,nomatch,,,,,,,\r\nTOBG_SP-3096,found,Bacteria,Chloroflexi,,,,,\r\nTOBG_SP-3097,nomatch,,,,,,,\r\nTOBG_SP-3098,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-31,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-310,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-3100,nomatch,,,,,,,\r\nTOBG_SP-3101,nomatch,,,,,,,\r\nTOBG_SP-3102,nomatch,,,,,,,\r\nTOBG_SP-3103,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-3105,nomatch,,,,,,,\r\nTOBG_SP-3106,nomatch,,,,,,,\r\nTOBG_SP-3107,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3109,nomatch,,,,,,,\r\nTOBG_SP-311,found,Bacteria,,,,,,\r\nTOBG_SP-3110,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,\r\nTOBG_SP-3111,nomatch,,,,,,,\r\nTOBG_SP-3112,nomatch,,,,,,,\r\nTOBG_SP-3114,nomatch,,,,,,,\r\nTOBG_SP-3115,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-3117,nomatch,,,,,,,\r\nTOBG_SP-3118,nomatch,,,,,,,\r\nTOBG_SP-3119,nomatch,,,,,,,\r\nTOBG_SP-312,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales_3,Alteromonadaceae,,\r\nTOBG_SP-313,nomatch,,,,,,,\r\nTOBG_SP-314,nomatch,,,,,,,\r\nTOBG_SP-315,nomatch,,,,,,,\r\nTOBG_SP-316,nomatch,,,,,,,\r\nTOBG_SP-317,nomatch,,,,,,,\r\nTOBG_SP-318,nomatch,,,,,,,\r\nTOBG_SP-319,nomatch,,,,,,,\r\nTOBG_SP-32,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-320,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-321,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-322,nomatch,,,,,,,\r\nTOBG_SP-323,nomatch,,,,,,,\r\nTOBG_SP-324,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,,,\r\nTOBG_SP-325,nomatch,,,,,,,\r\nTOBG_SP-326,nomatch,,,,,,,\r\nTOBG_SP-327,nomatch,,,,,,,\r\nTOBG_SP-328,nomatch,,,,,,,\r\nTOBG_SP-329,nomatch,,,,,,,\r\nTOBG_SP-33,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_SP-330,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-331,found,Bacteria,Proteobacteria,Gammaproteobacteria,Chromatiales,,,\r\nTOBG_SP-332,found,Bacteria,Spirochaetes,Spirochaetia,Spirochaetales,Leptospiraceae,,\r\nTOBG_SP-333,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_SP-334,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-335,nomatch,,,,,,,\r\nTOBG_SP-336,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-337,nomatch,,,,,,,\r\nTOBG_SP-338,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-339,nomatch,,,,,,,\r\nTOBG_SP-34,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-340,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-341,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Cryomorphaceae,,\r\nTOBG_SP-342,nomatch,,,,,,,\r\nTOBG_SP-343,nomatch,,,,,,,\r\nTOBG_SP-344,nomatch,,,,,,,\r\nTOBG_SP-345,found,Bacteria,Proteobacteria,Gammaproteobacteria,Pseudomonadales,,,\r\nTOBG_SP-346,nomatch,,,,,,,\r\nTOBG_SP-347,found,Bacteria,Proteobacteria,Betaproteobacteria,Burkholderiales,,,\r\nTOBG_SP-348,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-349,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-35,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-350,nomatch,,,,,,,\r\nTOBG_SP-351,nomatch,,,,,,,\r\nTOBG_SP-352,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-353,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-354,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-355,nomatch,,,,,,,\r\nTOBG_SP-356,found,Bacteria,,,,,,\r\nTOBG_SP-357,found,Bacteria,,,,,,\r\nTOBG_SP-358,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-359,nomatch,,,,,,,\r\nTOBG_SP-36,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alteromonadaceae_2,Marinobacter,\r\nTOBG_SP-360,nomatch,,,,,,,\r\nTOBG_SP-361,nomatch,,,,,,,\r\nTOBG_SP-362,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-37,nomatch,,,,,,,\r\nTOBG_SP-38,nomatch,,,,,,,\r\nTOBG_SP-39,nomatch,,,,,,,\r\nTOBG_SP-3966,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodospirillales,Rhodospirillaceae,,\r\nTOBG_SP-3971,nomatch,,,,,,,\r\nTOBG_SP-3980,nomatch,,,,,,,\r\nTOBG_SP-3982,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-3983,found,Bacteria,Proteobacteria,Alphaproteobacteria,,,,\r\nTOBG_SP-3984,nomatch,,,,,,,\r\nTOBG_SP-3985,nomatch,,,,,,,\r\nTOBG_SP-3992,nomatch,,,,,,,\r\nTOBG_SP-4,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-40,nomatch,,,,,,,\r\nTOBG_SP-4016,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-4021,nomatch,,,,,,,\r\nTOBG_SP-4023,nomatch,,,,,,,\r\nTOBG_SP-4025,nomatch,,,,,,,\r\nTOBG_SP-4027,nomatch,,,,,,,\r\nTOBG_SP-4032,nomatch,,,,,,,\r\nTOBG_SP-4038,nomatch,,,,,,,\r\nTOBG_SP-4039,nomatch,,,,,,,\r\nTOBG_SP-4044,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-4045,nomatch,,,,,,,\r\nTOBG_SP-4060,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-4073,nomatch,,,,,,,\r\nTOBG_SP-4095,nomatch,,,,,,,\r\nTOBG_SP-4097,nomatch,,,,,,,\r\nTOBG_SP-41,nomatch,,,,,,,\r\nTOBG_SP-4114,nomatch,,,,,,,\r\nTOBG_SP-4145,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-4150,nomatch,,,,,,,\r\nTOBG_SP-4154,nomatch,,,,,,,\r\nTOBG_SP-4170,nomatch,,,,,,,\r\nTOBG_SP-4189,nomatch,,,,,,,\r\nTOBG_SP-42,nomatch,,,,,,,\r\nTOBG_SP-4206,nomatch,,,,,,,\r\nTOBG_SP-4215,nomatch,,,,,,,\r\nTOBG_SP-4220,nomatch,,,,,,,\r\nTOBG_SP-4222,nomatch,,,,,,,\r\nTOBG_SP-4225,nomatch,,,,,,,\r\nTOBG_SP-4236,nomatch,,,,,,,\r\nTOBG_SP-4246,found,Bacteria,Chloroflexi,,,,,\r\nTOBG_SP-4248,found,Bacteria,Chloroflexi,,,,,\r\nTOBG_SP-4251,nomatch,,,,,,,\r\nTOBG_SP-4258,nomatch,,,,,,,\r\nTOBG_SP-4260,nomatch,,,,,,,\r\nTOBG_SP-4269,nomatch,,,,,,,\r\nTOBG_SP-4272,nomatch,,,,,,,\r\nTOBG_SP-4275,nomatch,,,,,,,\r\nTOBG_SP-4288,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhizobiales,,,\r\nTOBG_SP-4291,found,Bacteria,Acidobacteria,,,,,\r\nTOBG_SP-4294,nomatch,,,,,,,\r\nTOBG_SP-43,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-4300,nomatch,,,,,,,\r\nTOBG_SP-4355,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-4356,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-4360,nomatch,,,,,,,\r\nTOBG_SP-4365,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-4366,found,Bacteria,Planctomycetes,Planctomycetia,Planctomycetales,Planctomycetaceae,,\r\nTOBG_SP-4369,nomatch,,,,,,,\r\nTOBG_SP-4372,nomatch,,,,,,,\r\nTOBG_SP-4374,nomatch,,,,,,,\r\nTOBG_SP-4379,nomatch,,,,,,,\r\nTOBG_SP-4380,nomatch,,,,,,,\r\nTOBG_SP-4387,nomatch,,,,,,,\r\nTOBG_SP-4388,nomatch,,,,,,,\r\nTOBG_SP-44,found,Bacteria,Bacteroidetes,,,,,\r\nTOBG_SP-45,nomatch,,,,,,,\r\nTOBG_SP-46,nomatch,,,,,,,\r\nTOBG_SP-47,nomatch,,,,,,,\r\nTOBG_SP-48,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-486,nomatch,,,,,,,\r\nTOBG_SP-49,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-5,nomatch,,,,,,,\r\nTOBG_SP-50,nomatch,,,,,,,\r\nTOBG_SP-51,nomatch,,,,,,,\r\nTOBG_SP-52,found,Bacteria,Verrucomicrobia,Verrucomicrobiae,Verrucomicrobiales,Verrucomicrobiaceae,,\r\nTOBG_SP-53,nomatch,,,,,,,\r\nTOBG_SP-54,nomatch,,,,,,,\r\nTOBG_SP-55,nomatch,,,,,,,\r\nTOBG_SP-56,nomatch,,,,,,,\r\nTOBG_SP-57,nomatch,,,,,,,\r\nTOBG_SP-58,nomatch,,,,,,,\r\nTOBG_SP-59,nomatch,,,,,,,\r\nTOBG_SP-6,nomatch,,,,,,,\r\nTOBG_SP-60,nomatch,,,,,,,\r\nTOBG_SP-61,nomatch,,,,,,,\r\nTOBG_SP-62,nomatch,,,,,,,\r\nTOBG_SP-63,nomatch,,,,,,,\r\nTOBG_SP-64,found,Bacteria,Proteobacteria,Gammaproteobacteria,Oceanospirillales,Alcanivoracaceae,Alcanivorax,\r\nTOBG_SP-65,nomatch,,,,,,,\r\nTOBG_SP-66,nomatch,,,,,,,\r\nTOBG_SP-67,nomatch,,,,,,,\r\nTOBG_SP-68,nomatch,,,,,,,\r\nTOBG_SP-69,found,Bacteria,Chloroflexi,Dehalococcoidetes,,,,\r\nTOBG_SP-7,nomatch,,,,,,,\r\nTOBG_SP-70,nomatch,,,,,,,\r\nTOBG_SP-71,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-72,nomatch,,,,,,,\r\nTOBG_SP-73,found,Bacteria,Proteobacteria,Alphaproteobacteria,Rhodobacterales,Hyphomonadaceae,Oceanicaulis,Oceanicaulis_alexandrii\r\nTOBG_SP-74,nomatch,,,,,,,\r\nTOBG_SP-75,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-76,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,Flavobacteriaceae,,\r\nTOBG_SP-77,nomatch,,,,,,,\r\nTOBG_SP-78,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-79,nomatch,,,,,,,\r\nTOBG_SP-8,nomatch,,,,,,,\r\nTOBG_SP-80,nomatch,,,,,,,\r\nTOBG_SP-81,nomatch,,,,,,,\r\nTOBG_SP-82,found,Bacteria,Bacteroidetes,Flavobacteriia,Flavobacteriales,,,\r\nTOBG_SP-83,nomatch,,,,,,,\r\nTOBG_SP-84,found,Bacteria,Spirochaetes,Spirochaetia,,,,\r\nTOBG_SP-85,nomatch,,,,,,,\r\nTOBG_SP-86,nomatch,,,,,,,\r\nTOBG_SP-87,found,Bacteria,Proteobacteria,,,,,\r\nTOBG_SP-88,found,Archaea,Euryarchaeota,,,,,\r\nTOBG_SP-89,nomatch,,,,,,,\r\nTOBG_SP-9,found,Bacteria,Proteobacteria,Deltaproteobacteria,Myxococcales,,,\r\nTOBG_SP-90,found,Bacteria,Actinobacteria,Actinobacteria,,,,\r\nTOBG_SP-91,nomatch,,,,,,,\r\nTOBG_SP-92,nomatch,,,,,,,\r\nTOBG_SP-93,nomatch,,,,,,,\r\nTOBG_SP-94,nomatch,,,,,,,\r\nTOBG_SP-95,nomatch,,,,,,,\r\nTOBG_SP-96,disagree,Bacteria,,,,,,\r\nTOBG_SP-97,found,Bacteria,Bacteroidetes,Cytophagia,Cytophagales,Flammeovirgaceae,,\r\nTOBG_SP-98,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,\r\nTOBG_SP-99,nomatch,,,,,,,\r\n"
  },
  {
    "path": "tests/test-data/lca-root/tax.csv",
    "content": "identifiers,superkingdom,Phylum,Class,Order,Family,Genus,Species\nTOBG_MED-875,Archaea,Euryarcheoata,null,null,novelFamily_I,null,null\nTARA_MED_MAG_00029,Bacteria,Actinobacteria,Actinobacteria,,,,\n"
  },
  {
    "path": "tests/test-data/leaves.sbt.json",
    "content": "{\"factory\": {\"args\": [1,100000,4], \"class\": \"GraphFactory\"},\"storage\": {\"args\": {\"path\": \".sbt.v3\"}, \"backend\": \"FSStorage\"}, \"d\": 2, \"nodes\": {\"6\": {\"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"filename\": \"6d6e87e1154e95b279e5e7db414bc37b\"}, \"7\": {\"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"filename\": \"60f7e23c24a8d94791cc7a8680c493f9\"}, \"8\": {\"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"filename\": \"0107d767a345eff67ecdaed2ee5cd7ba\"}, \"9\": {\"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"filename\": \"f71e78178af9e45e6f1d87a0c53c465c\"}, \"10\": {\"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"filename\": \"f0c834bc306651d2b9321fb21d3e8d8f\"}, \"11\": {\"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\", \"filename\": \"4e94e60265e04f0763142e20b52c0da1\"}, \"12\": {\"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\", \"filename\": \"b59473c94ff2889eca5d7165936e64b3\"}}, \"version\": 3}\n"
  },
  {
    "path": "tests/test-data/picklist/empty.csv",
    "content": "\n"
  },
  {
    "path": "tests/test-data/prot/build.sh",
    "content": "sourmash compute -k 57 *_protein.faa.gz --scaled=100 -f --input-is-protein  --no-dna --outdir protein --protein\nsourmash compute -k 57 *_protein.faa.gz --scaled=100 -f --input-is-protein  --no-dna --outdir hp --hp\nsourmash compute -k 57 *_protein.faa.gz --scaled=100 -f --input-is-protein  --no-dna --outdir dayhoff --dayhoff\n"
  },
  {
    "path": "tests/test-data/prot/dayhoff.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/prot/dayhoff.rocksdb/IDENTITY",
    "content": "f1e62c71-a3ba-421d-827c-1ecbf20f9cf7"
  },
  {
    "path": "tests/test-data/prot/dayhoff.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/prot/dayhoff.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=9.9.3\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  follower_catchup_retry_wait_ms=100\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  wal_write_temperature=kUnknown\n  write_identity_file=true\n  write_dbid_to_manifest=true\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  metadata_write_temperature=kUnknown\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  follower_refresh_catchup_period_ms=10000\n  log_readahead_size=0\n  enable_pipelined_write=false\n  background_close_inactive_wals=false\n  wal_recovery_mode=kPointInTimeRecovery\n  follower_catchup_retry_count=10\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  prefix_seek_opt_in_only=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=10\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/prot/dna-sig.noext",
    "content": "[{\"class\":\"sourmash_signature\",\"email\":\"\",\"filename\":\"47.fa\",\"hash_function\":\"0.murmur64\",\"license\":\"CC0\",\"name\":\"NC_009665.1 Shewanella baltica OS185, complete genome\",\"signatures\":[{\"ksize\":31,\"max_hash\":18446744073709552,\"md5sum\":\"09a08691ce52952152f0e866a59f6261\",\"mins\":[2925290528259,7397951382043,9478766578752,26390034908046,31811219567311,36191627174349,39112643786682,46822418898135,47180432856748,60017138985701,60046869099761,65325381835497,73805228897455,74037001801154,75800414195236,81855770871884,83631867214312,86442965329695,89858161015356,90806331781332,95108107091043,97258972896665,109728134835863,111162670259148,113585458770972,116166720583475,121382935674939,125296899385152,141176320451685,141284968207060,141805235471354,147190179068733,149024066888166,153783847123278,157255282423883,160902593196961,162823771630571,166163367169365,174979625787948,175032069345452,182141449646872,187503667710897,191814288543916,192890223167288,195186364664284,196037984804395,197033160819668,203335269479450,204822233856042,209233297808434,210990374921109,214600505227173,216861451361880,217827490079709,224612774123844,227683744949779,228540468204721,228644441858825,228848037454334,235478348737722,240579984608212,245029062906088,248581735034297,251186192464160,258255664267571,258924003299576,265587486568360,269368370464968,274235329360733,287831833139065,293035680952788,294558365931778,295357672887769,303548064148961,303884611876696,306041902505698,307504482597750,309969810458414,316701230964482,316897730501733,318378982650332,318568418472400,318769251839299,319335385321196,324290895668437,335605928681508,339214912158009,341001360876621,349347535027435,351258437206186,360700437330047,367327558614874,373471575728001,374188784960382,380562917179168,384016070832594,386412107814027,389279696836396,393985777467936,395356088720884,396054053894786,399215565767837,399215750881719,411030707384650,414934253467214,423759820188444,430191392037330,431262729545883,437506450440821,438105428895659,438530381378884,439044119332850,444273467310604,449680755457024,450506164772110,457138551847407,457671098462976,461477875054528,473505790593386,481815788294090,487479264340595,489519873805078,494381455384554,495601542123242,500121418104925,502603922576313,506180131137999,506336140549160,516283812540815,518803929727716,536385923460112,536713413896697,537757852470225,538244971589768,540208451183188,540588787405694,542763181011925,549192277958979,550069279000761,553900351455263,554447489693319,559226934389812,561316274253850,569061433009767,578397933313938,578899728742280,582924953100697,583572058199369,589631402773527,595681341596523,615537076898013,626475972546369,632243908286808,639824119626438,645743921515803,648018730756195,654100189449365,668365295793413,670523964406925,671677182717796,671759739945458,676515376899555,677670347980377,684837528099741,687895771489510,693758846688308,694523064126211,697547171219962,698360853391060,698383699159430,699304671955329,703696716274708,706932232475763,708449170262947,726292867622433,726450649964317,727800693698567,728799639190186,734019394597526,735119835330596,737721455578775,738543439712395,741951415758063,748275069435017,750168693442959,763201112060730,763669867104092,763903450865190,767121298622699,767417571203746,770436202573059,771683466150501,772051111454828,772152509572841,787291725467630,798319271383660,802162977380527,806341566938246,813805466325024,815570804752811,816564335333987,817024725405204,817504754626588,821706687072387,826077010431743,828356750400476,831736232379626,843025850509368,843740928711723,845050451776051,852042280696332,857912135260852,871829709114624,873254290207218,875246525542985,889897273652095,894040289596463,897620767964532,904962988643425,905308801557271,906900833647951,909442865612931,912697620927191,913789208155712,916185332282483,917277762192278,917334002968300,919561883055202,920956096920505,929046426661708,930950142910172,933691189676382,934117578798841,936230738064974,938188383682602,941861412444067,942726201014166,945032973428091,947084478373286,948779805509636,951217347666850,955636489177710,961017555998937,961314440978493,964218423186297,968212926455014,968926587713112,969379511837489,972618046502811,974637708612999,980196796037373,980565419407507,983225283458250,987541215674501,992940514834332,996549857630112,998926194132937,1014496787753945,1017704359447639,1020480845863237,1024292399670426,1024634573363382,1028460419483054,1033874047074353,1035843403340873,1037163054983442,1039558325527817,1045088944681707,1045785088974313,1048574231977270,1051002783372661,1056506578664023,1057491059487351,1059437143082343,1059853068042602,1060760398971021,1061967838052170,1066520357980609,1069224019506529,1071759691375436,1072369963153950,1080440645655398,1083957482733017,1085596610204486,1086288713384900,1088705827145973,1089204340626863,1090298523330765,1090505634288396,1093123453947031,1093780160574614,1094807962005299,1096801323900100,1103535113750718,1105423537109674,1110277142974534,1113000955148039,1118646614510530,1119281509125641,1119614160374606,1120783033143617,1129279349995602,1130113935525204,1130881986044393,1132820492214112,1144614443668767,1147223276986948,1147680055727668,1158195764117399,1163159397520386,1163303408022562,1164535774717695,1174386415542665,1182168703505980,1186019430315229,1190006012882786,1191391064481088,1200797929442729,1203248128742846,1208460365112124,1225631809302250,1234453656762891,1234698668275227,1237451114108962,1241245219164313,1241546710850109,1241668290204495,1242418821754022,1243711623939695,1244290020173228,1244346278691061,1245003263018464,1250484435790357,1256754510605581,1264563878337445,1269060350975578,1270154727600023,1271923497273997,1273115659423672,1280559509676354,1282472909138162,1285880210646676,1287498565406779,1291218968991828,1292246474868788,1292487278268025,1296553378083571,1300214247397513,1311078551896352,1311449533649890,1313826623773576,1314579091305857,1322276316890973,1325524051301607,1332430917176015,1332675238905364,1334939013056183,1337600826833551,1339674524726757,1341661245836409,1341942310569850,1344850241954264,1348761416973437,1356904466129199,1369078449955986,1370039456672284,1370854092951821,1372351037556570,1376501003787476,1378471035008080,1383348406006914,1387085462947589,1387385057191781,1388584147493453,1390384276015810,1396964107951550,1401298565016323,1407230822931784,1410486644494794,1410786461048450,1414537954260326,1418743862991832,1420081602859846,1424366051167663,1431140791675340,1438960590550765,1443983103542619,1449677011803774,1457429906997387,1458641089226597,1458716224614631,1459144447544839,1461511802747479,1465076638017898,1465867789405739,1467827467674025,1468663744355213,1476939334625119,1480237325649862,1481088686107013,1483592564337201,1492314148312178,1498457281550692,1499617447616390,1503853002568292,1504262319315651,1505172916296130,1513668920373911,1519648405600154,1520931632741619,1521780633605083,1522237249746592,1522582599941917,1523518586763814,1528071377900249,1529728378502178,1531967467499308,1535306641925593,1535658178776979,1539307118095840,1546368847550532,1548019688923957,1552083355029650,1555637141656241,1555928090783844,1556284449775147,1558324681023092,1560969323307091,1569318833056381,1573222947937990,1584949879718000,1588978430427079,1591204462547614,1598261363578814,1600688746972553,1603093475242546,1605199952752847,1617237167349710,1618568234848372,1619286790649678,1621192910003941,1622309948672121,1628201100274523,1632271494883561,1633815225207084,1634399357702189,1637441524349088,1642637371934077,1643195637784435,1643598557356785,1645422696089427,1645673596073883,1645866259200502,1648716913052297,1652765950688817,1654033476941478,1658743399661231,1659819081077302,1662433005161059,1666913529898081,1679605700468270,1679921198649960,1680089532480362,1683724693448022,1689682641477370,1691706033392643,1696089597402537,1705950022227142,1714068118984789,1717459770518422,1718014979380734,1719690455811654,1734728075132632,1739172733710985,1745324659468599,1747303538361662,1749145577098552,1750021468273833,1750530525839386,1757623281396842,1758538630442116,1761579455667380,1762621869823670,1766019454242846,1766154871452422,1768074570558590,1769506068128510,1770988073934927,1778201561133905,1778315567513725,1780288814569870,1781805678833298,1786019351090790,1787025898307575,1793358709247570,1801404378718274,1802232213372715,1804215890133513,1808123394894591,1808805306365691,1810435102767883,1813163351446427,1818925318022107,1819091566970620,1821246620845572,1825289420275521,1829618500803507,1831822327838518,1832408978761242,1835694527640110,1837046808494825,1840320929072049,1842060817177608,1844561134226776,1845664541012305,1846495837486874,1846814283210937,1848195902901531,1849342199305473,1852955637970413,1853064829868822,1854709332537365,1856791461736081,1860030910962345,1862153320764207,1862209616890144,1867578456400407,1870278489144074,1871450013370760,1880743049410508,1880811582956504,1885064900552256,1888527800896759,1899912419788159,1909513665427200,1909893462067689,1910324702460153,1920155014152585,1923031184773399,1923724551213831,1928488418125995,1935392806238480,1936981590066389,1937494292258243,1941935226774825,1942786308149620,1943419695090025,1947698435893922,1947827395290642,1948000063884420,1951286173673455,1957196594968485,1961156417600790,1968345824207972,1973565525696890,1976759223622041,1977637922131648,1977923456470816,1979621033784766,1979691191211071,1981752378561978,1987210877457747,1993564537623510,1996672784729607,1999133750243675,2011354377485272,2017517839581062,2021272596821928,2024291985865500,2030916441428059,2030943399237635,2035149501864507,2047630125224977,2052394950437991,2059880114534091,2060560658024761,2064432037950349,2083858695302000,2088434760658037,2092860563281190,2095578868362462,2097280377232511,2099121913442760,2104210209064238,2107076373938295,2108459225069649,2111395821264557,2122246048824157,2123504523298871,2125171930737142,2127588293738580,2135890156111278,2147601242872786,2147628766136779,2148277682163663,2148629935713334,2148648462894137,2154050039033300,2154825108832254,2157543511093753,2159292319817060,2159391483345580,2163811550162994,2163911364872485,2164107595577716,2166610246026701,2169130162448361,2169401527323023,2182965638264818,2189902950844361,2191089458213993,2194321556975056,2197255584699767,2197550753498976,2197844428920029,2204899458948058,2207484772689862,2214585329667475,2216291576857764,2218560589085471,2222579004644118,2225440067596925,2231678593259696,2239881880935087,2246651203996116,2249382176770011,2251553784168898,2262343143065292,2269891656332884,2277357511613050,2282851679505524,2284008883123690,2294311150128150,2295851772366195,2296330477067902,2297300047218453,2299522719885844,2300003729256754,2305986746818130,2307128673346491,2309328595812376,2314348683023278,2325178911253636,2337363146012963,2338273922165178,2340650536569632,2341149645621931,2349169861378449,2350865952696907,2355373744763135,2359599974602456,2360988166250281,2364165589013103,2365100930739182,2365101583995089,2368070257601382,2379436665071024,2387981834215976,2391376217204289,2391657757985839,2398709852888712,2400026944838468,2402208725828096,2409550806440554,2410681029165949,2412591449989948,2413992919514685,2416809210551017,2420810333651625,2426508439798144,2431689886658063,2434636409776451,2434817960891416,2439360431069834,2442924938559564,2444743697540746,2447704465950372,2451185988965285,2459766139292236,2466530448132713,2466909570912171,2468169126671752,2469990435969385,2472082629869597,2484069800626695,2484707593134371,2486433068244510,2486783619425529,2489988128759413,2497895029394563,2498928723235105,2502877897637973,2507836460937176,2516300104537043,2529686136078992,2531603179656151,2535379300081535,2540748246632844,2542081767873586,2543849372306944,2545009932051689,2547409441873208,2556506799873846,2556532058925046,2570487229611126,2573496573602154,2573521798941261,2575271828359827,2583040424187016,2583468225494252,2583541506767529,2590282004204866,2594709561160407,2598736648640020,2600008000392449,2601526047213631,2604919231758350,2606628075888049,2607585442845824,2608738783833234,2611080508323464,2611611650962181,2618806127233677,2620375519634887,2623788431218018,2625753537877756,2626910805885551,2633023374568506,2641610347651893,2642503504311045,2651833968467605,2658287974480506,2661391357250546,2662023298318235,2665833107218149,2668521248016496,2671313026437821,2675525837460390,2678336928677512,2680497019271975,2693519224664396,2696615422431379,2697093257227995,2703119946699707,2707831053578465,2708218678481553,2715915477263655,2729224055534831,2731006551655845,2732055421730493,2734700729661142,2738859769218570,2742018183825055,2743081343023861,2743888467937942,2751785297738513,2757079557005164,2758720834995819,2758979243701204,2764250636697336,2766608515295278,2771029262532041,2771167327169082,2774929020087483,2787100655005297,2789215679189400,2794721456334777,2796704110243902,2822847943723684,2823690427545053,2824112773494385,2828383286324950,2832223063283424,2839310794637108,2839525055055156,2840131111024087,2845086895593857,2848124500620503,2850392763711528,2851615637093918,2852640851512226,2858440556030254,2859863407402383,2860695977896818,2868567544019176,2868722569049791,2875394822256464,2875768840498356,2876952463837377,2877071122530509,2881697295591721,2885101058817579,2888998206990875,2889740392149462,2892701240258741,2893195916828713,2893601424052339,2896177891093468,2903470979230250,2904033648694661,2905361464861211,2908444575023598,2911124480176230,2911599257101941,2921971427799899,2927511611173972,2932335002147816,2942563058582163,2946143480195981,2946208695315985,2947035710205399,2948810955001129,2950953756094034,2952664814352903,2956213777269798,2956539890231005,2958358510714643,2959335482526692,2959566715003402,2965352172439193,2965439340704221,2965855909473064,2966360689949309,2973978384800223,2975093256580654,2975414282596751,2977316941548719,2977663445217111,2983750706789338,2984126693118897,2985749744661602,2993577870679042,2995240248615334,2997216190337734,2997475303842149,2998782348202460,3002144816290295,3004601117971759,3005445693257298,3005543539398257,3006825969228148,3007008399287583,3007436553703536,3016063581505292,3024440815482041,3029401793589254,3035917551240430,3037029199949908,3037243067032125,3049610843618123,3052077662817141,3055458832740035,3061176921317878,3072032250423585,3074112617890076,3076040588704705,3079164924470365,3083176156972821,3086123334924126,3089319907683113,3098540992604022,3101693309309556,3103506635288743,3110882600220192,3112903104807973,3120960716235347,3125993645599853,3126462642335525,3127239755462313,3127515727740291,3132674664095953,3136116654223153,3138943638252170,3140104823595207,3153220014750330,3158074449437715,3160234728942373,3164386809673569,3173783571944417,3175607440806275,3180308189083804,3184825950572980,3190439500089370,3191603569657769,3192369183577062,3193298901760522,3193346797759720,3194861056078031,3196931220104868,3201112500492023,3202793460581380,3219171897424954,3219575037594274,3224535741992415,3225652520990690,3226382984631204,3230186294385431,3243947082373306,3244627180010006,3248922800662151,3253156487699363,3255370232763973,3257337304537355,3265267353090335,3272928147712512,3273345746404244,3275046616104436,3275876017733599,3276867668269439,3278668472321042,3278714300330291,3280780868469494,3280794856819360,3285404600033524,3289047034753180,3294550813104021,3298089165637310,3299027911208090,3306709449273253,3309878495036042,3312036573217165,3320827905894255,3323347352904912,3332103278994362,3333652145199727,3335087116356546,3336332604419491,3346073604734971,3346508186700073,3362515004859132,3365198599599379,3365586794581106,3366181769304978,3367829027870594,3369243531861603,3377357612999215,3378502887959344,3379556656256325,3380377839647911,3380683064402177,3381845747007120,3382728295376857,3383075891087465,3383302464154854,3383677243861212,3384640865212142,3390849838258698,3402608390039987,3404656276789459,3405149696809115,3405393044390619,3408568306290700,3409525642139599,3409848562939689,3415139398115166,3415475306791216,3417433407494643,3418693183078260,3419312829124670,3421667659970361,3425688845571110,3430483417325813,3431010040648861,3433786393292948,3433893111687059,3434270543355054,3439118720682675,3443405929340821,3443814552613298,3444188614792340,3444648483822568,3452335392026500,3454079754241547,3458841677994973,3459090134521778,3463857637926984,3466754010283942,3468005713457978,3468306935523998,3469621823753300,3484417521606056,3484887355924665,3485163641925480,3485345404315595,3485684351025169,3486271024140478,3486481363201290,3490218326835149,3493226173405941,3495557286227599,3501438911492802,3502652434217727,3509064061394091,3509072379429744,3523958917267613,3531208508664527,3532553615695946,3535903464263126,3539565874451621,3539901139312850,3540376200850317,3541349497756661,3544819360646120,3549947024705822,3556230614643794,3561873326260814,3567631654480233,3569439133907194,3569585416963919,3580260758329980,3584444323393668,3586259833614913,3598107344839577,3599693059706844,3600497750427469,3609452627397093,3611915615904413,3613882437854401,3624379228154857,3628580997551890,3632115466215379,3633516585258144,3636013168823101,3644503150656777,3645611623206895,3648590415100172,3650411848640853,3651208352182968,3659962641982274,3663160485730853,3665217012698891,3670531861702815,3678142299238288,3679412885698189,3679723249740163,3688280883691690,3688327457349314,3690688866820810,3705003329123112,3718621708258333,3722526932992524,3723634868396071,3726938239845979,3728715138302811,3734192362762123,3737946633507459,3740458701179796,3742193997053523,3746284516790765,3750533866251628,3752117756365521,3756936323992755,3757543406733882,3762486477132181,3762751701280063,3767814128506980,3773610790058654,3776595480654768,3776811730885528,3779767620249001,3786173858770873,3794100680281451,3794855359477272,3797500278748845,3797572839534654,3801836630743327,3806047581097738,3809879441266392,3810799390411918,3821170295134013,3821630362687996,3822296640796331,3823175201590864,3825757657900286,3827560739565438,3831533818899493,3835198273307888,3835558444026950,3837899280987896,3841522241190425,3842446209291097,3856495945466312,3856632581492180,3860116438298861,3862694398476978,3863189469668600,3869850399187705,3871935007496414,3872628172162502,3873324719285632,3878833882038024,3880243619746497,3880529063199350,3882311402640088,3887523678289264,3893564413662650,3899793396857493,3908511683767038,3911082399615065,3917275362273600,3921777467979712,3925362829074370,3928994435189027,3929160579967105,3929583967036139,3934142879673460,3941494939757571,3941525993199884,3942048398609850,3949319172964121,3949404714704001,3951447621965404,3968940236457600,3972341462705556,3973437909773411,3977362201597748,3980515012130917,3982398317594569,3983919240708090,3991304962417620,3996232480056804,4001338100305267,4003000776821491,4010634521845832,4011194441900352,4012917626427041,4018474899910568,4020678940249116,4020893102640326,4023604165179706,4026092267698298,4026688740814878,4034351439123543,4036574510586483,4037588403031850,4039922936524250,4039932863104502,4040392164753436,4041139896587433,4044662871102224,4049703973786608,4051543922389363,4052681338148215,4055364557376134,4062261174287869,4065415697051189,4071633959541762,4079083296648701,4086687744224011,4094432968332287,4097518435638924,4102324633120593,4103314051061542,4114248458913135,4122077681924969,4123781140489537,4132460402529320,4134892291048521,4135928574382122,4138840172908252,4139231196428117,4143693188392502,4150745968454974,4151459023776703,4154752706236746,4156105039099431,4157256439982237,4157669782790617,4166107478621219,4167383773226728,4167492383925201,4168181927338698,4175996866082730,4176623816804364,4183402718643845,4188349160298046,4195677986920473,4198198981311457,4199209071018538,4199346559716278,4199937026193161,4200142600556427,4201374728073667,4210305409366342,4211040452351221,4214771019264212,4225632034684502,4234174233250830,4245383804030219,4245913779845337,4253320341425011,4255227426589464,4257521149254292,4264631484544901,4266389306044662,4267533238822472,4275580175408244,4289359014707288,4295704004397925,4300982165488644,4301841948469269,4302934567016197,4305626904573311,4312242836327385,4316505852417381,4320671705521862,4320948899808113,4329077654347637,4330412836235513,4332389830901236,4332584479772575,4335310014667247,4337120565239620,4340454370272718,4345864924315697,4346218796838410,4352222894063447,4354953199641044,4356160430961353,4357880027267574,4367125746948875,4369068622168572,4371927952461526,4374872954793723,4377274169565988,4382694020890333,4383134213334340,4387047294147332,4388622108830575,4393722386432944,4394935128907327,4405185846773600,4409442890926800,4418995118878418,4419676464130546,4421125787216995,4425233123315500,4430853131113411,4433648774646017,4434408204046953,4435949176623047,4437545167361411,4438317402421127,4438817177523704,4443045313246981,4444824473102486,4445273578631201,4454575698901762,4458728897870062,4461351844352989,4462449521144694,4464228910638153,4467196354294999,4474000580782956,4474046785524256,4474574743148389,4481408122328948,4486507708773899,4495575342843287,4496415696378542,4501876131664304,4508459014863643,4517133177825796,4525521793503217,4528035909846301,4532427908015373,4535830530899372,4538230925800141,4539716842839588,4551316076842289,4552805172103424,4561703129830313,4562273139429756,4562889929649950,4572477816005275,4573883165195550,4577060828696911,4577457918883209,4577958025008691,4580199770736665,4582265498314074,4585370103466467,4595548152987374,4602434211109390,4607450449118254,4620004533537053,4621113398888425,4622580510893583,4630992980149087,4634141648884370,4640301477916105,4641399081470667,4641458089041250,4641794721319090,4641810465552112,4645238665720809,4645621983164383,4646458337623997,4647556566493222,4651299169613798,4663702386772812,4665559789434328,4669236331860436,4671025914890237,4671062938394354,4676205735481526,4681240613933899,4683821965014649,4689342516749982,4690119446223188,4694128337468791,4696124657031960,4696193088102148,4696638008353613,4698423835133356,4699216184918082,4704195358103927,4708213524509388,4721521787903217,4723274946162868,4729163773640834,4730341942998122,4750145321126258,4751422453008817,4755912323473330,4756833761182793,4758803188341003,4762437486337017,4762834014218571,4778822146835476,4784620939372924,4784854530655115,4785601845773156,4786683724318639,4788364915970531,4791650559342688,4792800308786051,4793495469956659,4794337453617434,4797047238512497,4800291638880957,4804645672015140,4806827593856676,4811729290308862,4813583810073804,4817878202402319,4819210711953623,4819297775674748,4819311564829320,4822240770685261,4823251614359045,4825955485244615,4828732317464211,4833444690765931,4836894122787451,4838221388703602,4848960069162027,4856643780511233,4859353321888294,4859467776000605,4861078197128753,4868100857196342,4869271395674487,4875972042816124,4879638248944748,4881531428270387,4894597037736842,4900275904853327,4902345078498684,4907673099841830,4912787048821119,4914549573455980,4930034114903088,4938885956719683,4938984906671371,4952413633841153,4957117546097581,4962024566226233,4964966617138828,4966376651170584,4973778510774167,4975540053830624,4978106676024424,4986110732910751,4995563329299788,4996212995257738,4999915977157470,5011891458604349,5012633125949878,5017724733800167,5018157783395788,5018781410893851,5019357482030347,5021445876086138,5030617336717801,5033368364296409,5038003571725954,5045163363224076,5047944681561823,5054098670441464,5057486321357458,5057790328506277,5059239413878415,5059653728314562,5075357793289723,5078143579563766,5082075970958360,5086177235816634,5090517135844571,5095238786157913,5095997925642684,5096759450835327,5097502836207144,5101214857653244,5102026127818781,5102867437873560,5108455108876502,5109339895416818,5112547786374962,5113517669186741,5113987619419017,5125513112408495,5127124574162351,5127331696245969,5128951178677788,5132612621833970,5143420500944709,5145276514713692,5146830226631178,5148881101936222,5149206177910233,5149437337079666,5149863467137139,5150315306295015,5150426384165948,5152031727525643,5154406455748760,5156461422732999,5157379504662047,5161207050871469,5161248283909416,5164496015188591,5169183503623442,5170033828188437,5172451986737288,5173899903805393,5174341244024506,5174660761082943,5178681082547978,5185496711050665,5199397406461572,5199519828192191,5216652140931560,5222047064350262,5222282340592980,5225960701910860,5230003976759540,5231985318055496,5236341345649495,5238635836185856,5239269458643567,5242274139089145,5247586236105385,5251993594243967,5256157883002967,5260023793294245,5262424254200249,5262515077905251,5265232429826960,5273272937856228,5277050637122870,5284015351506042,5291703312055669,5298034705538719,5302053963299700,5304711911200062,5313230992694743,5314446308863251,5316323217920338,5318153535798629,5319128074583642,5326372158895078,5327554389775897,5328891577748554,5333028765846132,5333952601578012,5334935043856488,5335020091722251,5340420023836909,5345704507186657,5349788779068053,5351104001242138,5358493250319346,5361787265106398,5364846600059577,5367133911213099,5367718245082904,5370226527358712,5372175647130534,5375274967884629,5379968233240165,5380736206240325,5381546956953785,5383368125410553,5385746119086850,5386810090653851,5388894770243354,5390748522455977,5394080989067132,5396868798166091,5397913443318485,5398598214938688,5400291293650351,5403110884625308,5406614253824595,5408167860716448,5408684428107176,5410632742040879,5412454472585029,5415609710834006,5419089032931253,5425776155703968,5426343929555151,5430164168254949,5433304691996431,5435448562589939,5440154526785082,5442550985028476,5443519792343783,5444690183081885,5450650932615338,5455725933689601,5458279931832152,5465378018390073,5465468293521107,5470523383371739,5470969344336539,5475821882378207,5477177690474931,5482250465546522,5484161477936466,5489284312856062,5489369658364069,5490569127868792,5491063328575234,5493319803023083,5493870604473986,5494363692102912,5495499148937672,5503103710464614,5503513389639664,5507615794296947,5508503680735494,5517653225284855,5521521718617004,5525271231853414,5525784499514800,5536775761553566,5543069752424250,5544364757593219,5545802799820933,5551558523406896,5554380825386759,5557919753549640,5559553479542169,5560825696398560,5570645491117548,5571611222021582,5575596617449768,5579977210132164,5592415623299140,5593426453232836,5595805533420086,5602700450924399,5603538322319793,5611751716804501,5613862108602356,5614909593083489,5620948070768841,5621064494334548,5624980176214575,5626090376879123,5630820724993122,5631339882742194,5637312677638017,5642756368786070,5646619733332345,5653701086020480,5656741558549497,5658909534123937,5663092617828839,5663224746690969,5663385121189069,5667246937392321,5680063203437155,5685769039380624,5697986357589265,5699319238678867,5710195316669727,5710364792755140,5712513634730123,5714049549411876,5717070125530008,5717707514404603,5718933939076632,5719318350374149,5722219703153811,5737673156168293,5740477961003848,5743439881123553,5746087812806105,5757334188672719,5759061891073762,5759605430401092,5760917932621246,5762846753375421,5768847482599071,5775786807466214,5778465954807704,5779727192598359,5782454578043069,5784207630429531,5787478509200132,5795310516601245,5799653338299710,5812168700056249,5813405909746709,5814659226632216,5815769481430106,5816254259189301,5817139504392687,5818962864882161,5820855454510934,5828565941868585,5832544070159164,5838532420889856,5842761102579491,5846508833190611,5848249740129972,5854937355756548,5856022939536906,5858993021903933,5870645665739004,5876393418760803,5876736261749158,5877001606837482,5879985416123329,5885444131631387,5891024028896298,5894685367317522,5898490390630341,5899953571983439,5903023130181011,5903484378223350,5903666264650934,5903694388453077,5905923307105350,5908696090042283,5913584686996270,5915859656997442,5915879684950182,5916931928833529,5919430186483428,5924117520799744,5924879546681533,5932662790863585,5935312555770245,5935661430493388,5937817448042430,5947101870703205,5950972051903959,5951041949791953,5951726048170658,5972218700939363,5973250287141740,5973677832178283,5977031849078959,5990178361033769,5990570628261118,6001206595929325,6002276243709531,6006751473613523,6006897308518556,6011214467146689,6016555602340361,6023708485790729,6027671084996298,6028501758004444,6029374529344504,6030811056861793,6032097611334280,6035955206980948,6036393255326821,6043316342842623,6045838883225433,6052608603431831,6053804686685524,6053958863313339,6055268730727559,6056807484550007,6058584581621317,6059626128614092,6070104051324693,6083108464119662,6085590822787717,6090956327042002,6094860440146813,6095038202403332,6096229123772452,6097073203191647,6103891026698555,6104688884599994,6107758160260988,6122246130680759,6124004526649147,6125907283269891,6128284886205816,6132924004245246,6137419131615699,6137499190958511,6139205116246240,6142105213155394,6142688368084569,6142913125046520,6144042650109511,6144095475272536,6148853279972165,6157729055897116,6158322788243107,6160835787414693,6164759784469239,6167018513092476,6167607991565253,6171707826744820,6174144459043731,6177490881631784,6177692002705307,6180599532722384,6180617553423208,6181251707047392,6182491554240294,6190932940940803,6192358086666249,6194877677308546,6198857031919734,6200081358996517,6202082397019416,6205024632916134,6207302580763824,6211423761058583,6215284878845774,6215440151333948,6216154454451807,6218233647565127,6218512470330013,6220604711061324,6227071256308643,6233498546819624,6236798857143890,6243407719027967,6244874563473516,6245142031174040,6246838555534920,6249074081912395,6249758679502616,6250557402527662,6251868356478317,6256321719332215,6261686455216337,6264775741996340,6270623030455246,6274969421000503,6280006843403268,6281149158892909,6296961749764111,6300447716613718,6304297838290460,6306042178881559,6307115079760207,6312245698368186,6322233760419356,6323173079753451,6324812402453371,6335023550154225,6353191312166053,6354692547077099,6357396963255601,6358389478584958,6359135369542064,6368768790664617,6371090203570186,6372329995436972,6373927709843793,6374693910197545,6379348598089064,6381541745622015,6385800661078082,6388937996347478,6390863793314128,6393248753656632,6407210526643342,6408730838629478,6417566655445436,6423382525818443,6425609470770570,6436083078959781,6436814879261326,6442916426075876,6445879733828998,6454320146259766,6454656458940756,6458237633544796,6459246249643680,6462957099049843,6466065562806689,6471689417982028,6482532068799143,6489722108699832,6490299073029283,6494216993344366,6499734594021057,6503186772282900,6504859169508928,6507830449842499,6510975929277435,6512429809706119,6516226128433302,6523391982496272,6534435207304569,6546595430555691,6546752598032205,6558599467268843,6559912537272461,6565025138801153,6568196183285198,6571097539012216,6578237361036784,6578503095620162,6585680325396501,6587654701564589,6595708386553174,6608001737567202,6616149821789620,6618251453481948,6618435915029628,6618676721046335,6621057137514784,6622760768363465,6623916460399609,6627687708278604,6627783782930560,6630093742634040,6633679848040650,6641201043777485,6643521507427133,6645310761621776,6648932781635955,6662203303202718,6668468822319197,6674364905825227,6678173806211118,6678617623247346,6682614209582006,6684865188797781,6688488067507556,6692574202860978,6699342662745446,6699601051457480,6699624106317412,6704989683409671,6712177752369021,6720191931854899,6721985110519865,6728831533279314,6729387689420763,6740158910360226,6740782983077394,6741215022206694,6742696713154438,6745753170262651,6747208404406959,6747763101536606,6749753901939374,6752595765235073,6754613815657166,6755291783706242,6759785636657525,6760588036724092,6771281046319400,6778747192742624,6785714707329795,6788002061659117,6788203480253865,6793843162054529,6794299705676629,6801783177540135,6803312883106461,6805314972544938,6818759912474922,6820988811787355,6823062398472026,6826362904176932,6827299283549200,6828195113056916,6828673134192974,6830256824394694,6832757900847449,6839800914177389,6844288668932623,6844336660738179,6845320561422543,6867967645790541,6871074917650344,6871762569059759,6876239502460282,6878773843563416,6885815333874594,6888484602467342,6898143968669196,6900004638975216,6905914351227176,6910834673790415,6911812457892129,6914055104334094,6919747802868531,6923486337221090,6925667026147338,6933453950416148,6938107292471175,6938223955509899,6941024220883212,6942033581849643,6943458456583346,6945905024717815,6958904824641253,6965104736708795,6966317419189633,6967131174911621,6967523404032078,6968626913917078,6969723087551023,6969879544962764,6973244897917836,6976680325243925,6979025352783650,6979370520679168,6980494356161697,6984882368689931,6991429378659097,6993040182965693,6995106444038232,7013532370262403,7016766698233684,7021458253363648,7024829388289761,7037699445900528,7038117440889701,7047751781972594,7068328396622979,7078519684380004,7079136072514786,7079683617185872,7080593167563472,7081754833089042,7090263369022454,7090827224293435,7098844983687608,7103287349340715,7106775558992670,7107670335907433,7112480093601650,7115518871031565,7117602179959460,7117702213846209,7121896123546063,7132927597129919,7134741662059672,7138333125007121,7140267571474431,7142051916052761,7151557370156782,7151630939274842,7152477932457527,7159009930103737,7163383528300707,7163778957994361,7164516813412020,7165245447295611,7179002153816766,7179903040144596,7182233643190269,7182765199375506,7184665213216156,7186047534415508,7191096990307504,7192853768347715,7193706102549630,7194390208322086,7203674420028153,7205356147061987,7205440304046385,7212278254469221,7213120783173544,7222827358840359,7224545604825492,7225295067327053,7228437063271890,7229216536358274,7229486634256081,7232125512735235,7235403866067319,7239097855225524,7242588962722849,7244564678730935,7244768482327881,7245566857344055,7246915842148466,7248035515958267,7248740619006619,7261781244132035,7262289934411894,7266821489213820,7276326602211605,7277092712154010,7277675196574359,7279500143289769,7285678364340995,7286552397490444,7289711990915466,7291166276647549,7291878183300562,7293014405240845,7293120299138230,7296021783720685,7302877510804560,7305136552146877,7308326077425136,7309526818453637,7312457538294268,7316330078533123,7326575126577204,7328477651553143,7334460645181314,7338010137201066,7344453486207090,7348071649723458,7351715416841733,7354010904401429,7358759012302734,7360258178944323,7363914809349690,7368773239687673,7368990891984284,7369067702745463,7370610419112862,7372069375963896,7372949260070506,7378192097899948,7384234111099756,7386045769570324,7390506088312346,7390710096067356,7398773968230003,7399651877743543,7407156702916619,7407505476310295,7412075044877324,7413103855739244,7416878995770443,7417889495517890,7417992892826458,7418488700207131,7425782918083640,7426542400535424,7427800180129173,7428977237077501,7430512069482015,7435984239692232,7436873913790602,7437474890639138,7443107233720726,7444471858317499,7445843328639391,7447921740402688,7457626872755122,7461417070760230,7462663569101078,7463631301411392,7464791273301861,7465698531247575,7465989092511044,7468955978108988,7470414970130956,7470691742535496,7472016146671178,7475500532623013,7476427212005998,7476626636382557,7490128336689868,7496125413626459,7496331600674721,7496586171914845,7497334675461455,7498030447626019,7498854721985035,7499741802632764,7501028258951772,7507971309059323,7513140878034397,7520995594935128,7522857939238615,7523568386509127,7524079580225271,7531837667095752,7535413758699104,7541987648743096,7547834066144263,7549509942679840,7558348891266390,7562422547591358,7567376160342247,7570266295972391,7570701292061586,7574807836993530,7575973317107614,7577088488345910,7577833848718658,7578638579275105,7580092247778121,7583079410262922,7583396165831142,7583764379769101,7590281297167973,7594145655959215,7596032551054600,7597146399455249,7598973979549112,7607301189042080,7609709905585175,7610703887034738,7612217782008852,7612590563938043,7614314828758987,7626611098574312,7632486697445093,7635361684630569,7635781595842092,7637503540227229,7652643882172024,7654546417001702,7658477424630193,7658594690166121,7658756342775449,7659221163244052,7662988662313759,7670573068797315,7670620641239355,7672952384552853,7688048940346303,7689154854909634,7692157387739297,7692684970839720,7692715035163949,7692872154514462,7699490741028377,7700977357734436,7702985130021974,7704411344416172,7708512355032444,7710242527125752,7713386097094125,7716490464557575,7719367164738556,7721077927518745,7721609917312402,7724275439905728,7724711616367069,7727393378005013,7727688737658572,7728376014820122,7729310710317073,7734200858227759,7737983217239889,7738701740734266,7739863878221100,7748491852382750,7761354279867729,7764178055458929,7766279931264675,7771590301023685,7774873548808587,7775101063842022,7779960077213875,7786006720140585,7786623092023665,7788620682842041,7789614831618262,7790698030398764,7794053661517357,7797582785345941,7799750768370576,7800931705061909,7806696954752845,7807627836703959,7809275090934984,7810562577473506,7810998696754018,7812875292301653,7813351823453750,7815570269509758,7818433714447086,7818985241100641,7820811550237674,7826881780965015,7841588711354365,7852366441407035,7855477820333867,7858337898821330,7860940256961100,7862242994456228,7868991532284921,7875449163603356,7877526742599223,7884811158802680,7885098411306234,7885848475582109,7888074400901569,7888437547783278,7888500835141269,7899000176906699,7900170751256211,7900621082983922,7905781741383824,7915002755515393,7916680314419175,7929090546906102,7930649670973791,7931707661135896,7932664861586881,7936886244974173,7944913299381989,7945929831888496,7947631560228941,7950990573236144,7954932398971022,7955707767338343,7957474102755475,7959145831679961,7961836057698682,7965048882911994,7965254194340254,7969662040440070,7980381451760704,7980587376998310,7980735420462798,7985722197062386,7987424295175338,7995443309794354,7997135431578468,8006897017337402,8006976419849250,8011722895901690,8020262137556052,8021771731265660,8022639767891247,8027888930993228,8028030091531706,8031622641498868,8032268170160689,8036544756403250,8042606792528101,8059389868173903,8059450627794768,8065220473196449,8065582408992410,8066856250710691,8071865664728388,8077418220136860,8082463447862295,8082820682426435,8089588938475723,8095523873680122,8097390569526238,8101747032613392,8105559582340911,8106928489710751,8111834837966998,8112104031271206,8114237531654532,8127670090034835,8129591252255075,8130207971385588,8136369282029634,8142129094140152,8142634926688230,8146423080936368,8147298843986804,8152440707511793,8154879940866529,8161574196354384,8170876711488279,8173481093695052,8174511269651377,8178398099602601,8180578302229082,8181586463868245,8192542128082353,8194052295501546,8194969512324171,8201561228078010,8205287009351885,8213078648151372,8214059341854817,8216440810041214,8217581100021235,8234783421929082,8243069565420263,8246362229814725,8246571670186657,8246716772071880,8249298655984594,8250387434460343,8251262500438279,8253292038013840,8255193598573136,8256150707384279,8262954804685181,8264880757955296,8269769863632137,8271331264772547,8279296087284122,8279996819873290,8282488428172923,8284234491989688,8289349890472704,8289498162240419,8302834672979549,8303400292309646,8309633984147819,8318696076968435,8322561813637125,8324890577048813,8325237800434916,8325244982386600,8325938551251775,8326972902154084,8332190045511090,8333273920187213,8333295411468735,8336642144860625,8336794237476945,8340676844945415,8342359556228636,8343138042400877,8343422431629489,8348222101988490,8348990845348274,8349203373840720,8349929839053237,8353187069342082,8355184882068744,8355216613777188,8357480319128064,8358858858741708,8359032487697274,8359937481115835,8365483157606045,8369163766277845,8369986014094300,8370512453717737,8372233568621885,8372801112194483,8378780774433401,8384716609191558,8390262752827048,8391964943990114,8391968117889949,8392149294258272,8397902100674760,8401772412872195,8408375889672914,8411174366535457,8415585315618209,8416272151484023,8422456048756653,8425746898298470,8430090272302554,8437064789335853,8438071844029923,8440380356686069,8442951603563362,8444597753784738,8451164588916518,8452143133964194,8452834615819362,8457432590283505,8457870432601145,8460876401008247,8462195561662212,8462356309409364,8462779787380437,8463894151036866,8468076223787436,8469301843796323,8471378426717330,8471415745047933,8471563440277386,8472404382970836,8478129640091772,8478656700478130,8492172722223897,8498566054392581,8499229793648454,8506577707409417,8509132075144310,8512769287132428,8513163154527267,8513504634548185,8515344063519634,8520471745574237,8522204087666054,8524148859687867,8526397555774454,8529230741888138,8532559561743484,8532654039076026,8533878116076637,8533995416155386,8534972628296620,8535864863010513,8535971593214147,8536095899242944,8541155088407770,8542730575053594,8543114315775141,8544314610710198,8550168506511268,8552407797606671,8554633315621859,8555174066389539,8557956937889635,8558151645997922,8564419827076679,8573037870741832,8576579691621984,8581367096989732,8582261197731227,8584103263448365,8586129879796676,8588390118640027,8598659143101208,8599129846364328,8601522207106423,8602281558256184,8606118628054373,8609962853072397,8614121798757181,8617181526340432,8624540329478798,8626391389132139,8637210920266035,8642764308475012,8643781560678532,8649648448925106,8654788098657391,8656720607859172,8663480084138334,8668647436071212,8676906171988104,8681093783245916,8681657579012301,8681913385441783,8684040140251633,8684751768894594,8687233995374161,8689451052146568,8694259890202010,8707543506731647,8712178326749055,8713167337349649,8720400968274939,8721624366660549,8723528441052177,8728082879135077,8729412146383037,8730722008863330,8734134339123262,8744943197261790,8752084776243496,8752229489182462,8756024741015291,8764086372954576,8765499574275666,8771763736993583,8774891003290900,8776098695299089,8781771689282057,8786064399236492,8788645315265601,8789521527155337,8800564096781294,8802869383602903,8804388443116965,8822012246032459,8824420613904824,8833617601200992,8839028706384124,8845997843748149,8848441586602708,8851257701148635,8853468904397509,8861373802714789,8863519477739503,8864760219124956,8867353885504610,8868704959256862,8869726068715730,8873178736038157,8877414428990774,8877639105413482,8888927845730161,8893272613048649,8895434307439131,8895481679956001,8896675958607703,8906632086442921,8909764344727962,8910696373745749,8914511413857104,8917771334029599,8922546229199542,8935766685372472,8941687890115326,8946727890515135,8953024300985451,8953097697609406,8973117667284369,8976689351398218,8979052050754475,8979138566806786,8981576765955511,8984458105294828,8989003157868761,8998231894652099,9003633319081270,9007488636990326,9014303703878842,9017342455231486,9017775639960192,9017891402481729,9021516015590569,9021894799811309,9026119584500749,9032187371857715,9032210357540524,9037381687162545,9038550674961458,9043118071475817,9045075196494312,9048587505711843,9051912387029910,9056929643995395,9060898928960346,9062131144374189,9064531090448266,9067993556866039,9069591997036415,9073037543243418,9073542014929237,9074741782974562,9074896498908993,9074954160428210,9079318768294079,9079888527353695,9086751601932227,9090741520266450,9091979750057327,9094268438464734,9095103196939357,9107447274695798,9108055709626815,9118451715638510,9125362263593744,9126355422536516,9129589011938145,9141233415372106,9145865355932391,9146655579064944,9150924106375181,9154695178495413,9154906598387783,9156606782616571,9157375841856013,9158676476944194,9162668962659557,9164560080137859,9164808695055580,9165398869818013,9167897025495661,9169656716086699,9170930061820260,9173729001963953,9180092141515547,9180835981759675,9181392291811972,9182988335016139,9191103445945706,9191895644403376,9192998929861767,9211473363037424,9213354462894451,9216455003394783,9218987363983060,9220215058481045,9224473925896720,9230580606053228,9230781676144500,9233097697027556,9240969247386165,9241853489961590,9244558133126668,9247060266595808,9249469378126723,9262046728311117,9263681010079025,9271020411926998,9281037194537819,9285141224306324,9286405859692622,9287536154919442,9292441630319582,9305483767431545,9307808415233512,9310504704434237,9312863640688829,9321928567260274,9335430691435020,9349870750958121,9351366438163042,9352141537262568,9355129827150685,9355940792017453,9356671043680573,9358554525655764,9365839127076720,9369093634111987,9375641216209833,9380627712808545,9391486822118482,9394976106188444,9397328261168293,9403765537033865,9404565557844940,9408921495622508,9418107590281736,9419050885946372,9422324913293330,9423486081818391,9424880153466631,9431002060282822,9431492779408494,9435750849137196,9435999454995538,9436467803114520,9438440967152456,9449047384009255,9449340008831532,9449825490510575,9450124549058915,9450266223912705,9451923415826938,9453754181386129,9455474915077424,9461773699588349,9474415802799799,9475829378737099,9475995871994700,9481386469401705,9484371784536628,9484984344438553,9488440660460028,9494545505111169,9499991472364593,9500280517945270,9506279993556395,9512690141526979,9517376601859417,9535833980442651,9538837225746487,9543648898717657,9547557360432895,9566613425099599,9570293654144253,9571330378157840,9573924489710217,9575165150956720,9575447421008044,9575885834850839,9580743881484339,9583968797309156,9584561427927733,9592438802141140,9595887445842995,9602902468421116,9606089004061910,9612716915528679,9615883008659902,9618201274077735,9624534057788017,9624758856235873,9627779818273370,9630291603264391,9635050901818979,9638553113056923,9640256664119083,9641362208707358,9645470246174746,9654460153869349,9655820024254396,9657079142409314,9659932051785010,9662025225596157,9667241625101916,9667276386502943,9670575633086786,9672577363633156,9677328620414229,9678605646922309,9680945785313483,9681067738687093,9681267064784409,9684623279089548,9692893983377486,9703534916274044,9704279295656371,9710300281092436,9713887926847430,9722172985687510,9725792147964753,9730102559873491,9731503574801034,9732040155273334,9734113097684625,9745464335501377,9759300027118446,9765786817226776,9774084603677009,9775954892341561,9781535106471005,9782799358625264,9787218473221709,9788457577027091,9790881050593378,9791716416162907,9793594547272040,9797573432707706,9799889278686304,9800030295823990,9800643300496312,9801531586161304,9806868721015896,9810257422545913,9810585298035378,9818968963003545,9827735758375406,9830504103227308,9839088699938530,9840344155855293,9842146939578796,9847076554159479,9849134001046702,9852441706161363,9855206514878035,9858589834827721,9861618221073016,9868175191633702,9870764755744667,9884359216488201,9885568741169094,9888383442614567,9889475178157085,9897712283656982,9905482398851907,9905509887050233,9906275973443018,9914537510086498,9916047888280925,9925919096295581,9927737657495008,9929573922212347,9929764483111561,9936648632787612,9936930189944836,9942546535848415,9943414292728350,9943562503792795,9943864011523125,9944926015830475,9949019217971450,9954313852436822,9956729180121161,9957485611486827,9959245907790498,9959649353025290,9963611887803061,9965461136179694,9971538903925806,9972659184707003,9977300414299533,9978079501560780,9984981814399679,9987074046553413,9988183784680681,9989307766906661,9992489863586669,9994394125866496,9999648366321789,10000031604968879,10002844747369936,10004925495910091,10008184940193864,10008461597296659,10010370056943249,10012185312140615,10013671898596744,10015492885655362,10023685800384052,10024272312740748,10024518507785908,10032518948661767,10035990167276835,10037675774604732,10038212235930891,10039680011817758,10040986745269183,10043143509796825,10059920635183403,10060828780412828,10063209359600748,10063600315370974,10065868826751899,10069449569085214,10079621948289706,10079780537607131,10083178186730993,10083835921342635,10087308692864238,10097389948237264,10099505447983235,10114762120457964,10122602940701424,10127093259012746,10137337268168058,10147088443674066,10154032807160608,10154307535853042,10155542068394802,10160572363193486,10168672086600643,10171123087736692,10175620188550308,10176491974309391,10180241838937158,10185718177412770,10194722954029343,10196461247193047,10198150880968885,10199671620517651,10199695570402626,10213139479075307,10213463533232206,10216483252367678,10217695934166737,10224107621925080,10224341861439251,10225134693123796,10228698111458386,10232055143615071,10240074124610978,10243488805517527,10246709309375903,10250309444905037,10255002992865388,10263727029912731,10264525977886481,10266632870176478,10266820110531598,10268623122698602,10270163349933746,10271469102327032,10272466256560721,10275743124733814,10276224552844118,10279570843072650,10280390537061924,10281974844357620,10296558578829119,10297624439979852,10300473582041388,10303678734793518,10306671241348195,10308330126619188,10309932015401873,10313330243851850,10322521592618940,10324994061564475,10327639436128444,10327836487278240,10328062775184436,10333141638123601,10334247661646447,10336137590649056,10338920736989409,10338954267321910,10343961504376443,10344652626799903,10345084432193915,10349133099508569,10353863721850444,10359698556732429,10362411781950181,10363323817948865,10363856866900979,10364382029087166,10372218357405989,10378769233943499,10383366177443313,10389930038194229,10391227460972667,10392794184418963,10398456973956573,10400718449268838,10401822723036473,10402496249924470,10405138061495149,10414467140029313,10416168489938655,10418627906817111,10419717389280422,10420088526584073,10427907045176189,10429449856647102,10429527060520295,10435742830395507,10437768643316041,10438557857523653,10438647586807590,10440006848965726,10440487445875223,10440675814381911,10440838933113584,10442812714871140,10444872472907940,10444918775580154,10446053077534203,10447329823526441,10447915458986158,10449478084214979,10452337317481683,10455776599349428,10466519528405133,10467269725152768,10469454767792558,10470445288089220,10475593353115645,10479056751944619,10481951551463793,10482250308230673,10483827694271696,10488747371854077,10500385026427457,10500488552967312,10501260356111404,10512322942799654,10523297170953308,10524197477213077,10526510768148749,10536793015345856,10543343012752730,10545121874221728,10548308070444431,10548369311321575,10552704438057457,10563044468102777,10564172672934646,10569936885011978,10570501131760442,10572007743658085,10573848693130061,10576973213646289,10578269597246868,10583112117834044,10584639348411680,10594696458041961,10595951863277111,10608578244765171,10614584966626439,10620592192554759,10620798042888920,10620903315872377,10621082248937070,10628643234912171,10628921785417252,10629062237330307,10633505584587868,10635387052790493,10636120887409717,10646006703435010,10647477117223054,10650028403614625,10651121348848499,10651345084987832,10654625803270603,10658173942822862,10662504984834470,10666212884489150,10674748481093869,10682941113641784,10687323304253849,10688559968805974,10691866174146243,10694995464922729,10695927691488062,10696210215422820,10699195330093884,10706304398299584,10706909043141392,10711714669403874,10718007421668166,10729128988836847,10731904283058389,10739494197398891,10739801112151611,10754362437493971,10756057668895469,10760825923948907,10766441205077631,10772046172473065,10774595446367799,10784226394558794,10788763405851951,10789995657189753,10791861050542069,10802291531494117,10808364573742279,10818898059592134,10824560278958441,10827594971106799,10829139547484424,10839803231136688,10840559858292177,10842762916923867,10845347885148728,10846960440347385,10847253104607377,10848123266416937,10852276831524456,10854428106437565,10861241406654155,10862767928581833,10885189706501902,10885610118151807,10887994298217623,10889705602128169,10889922295232389,10891169429104356,10894930198422418,10898755272190895,10899505158719250,10908847810397854,10913442039163653,10914509218958331,10917306751752594,10921844952698928,10923207650640427,10926914968716545,10928023009400926,10929092524133184,10932202328627689,10936661551264740,10948651072438721,10951948612195804,10957392874098981,10962850107056207,10965247315180552,10967958009290469,10972909371352109,10973378500551496,10974341394948959,10975117317621830,10984973432275198,10987375778918246,10989202769093484,10990409005986868,10991558669034873,10992487444525627,10993385229040135,10995462961190157,10997692366332970,10998901653014457,11001665093098228,11008808435120331,11014427382218185,11019805073365185,11022642525947194,11023763375301913,11024320739845292,11024882796236184,11026937591363346,11027888013301225,11029825398794377,11038025471456068,11042536781194006,11054833551017746,11056592382175061,11060604597813501,11062402375665545,11065372708374227,11067445870108559,11069851171800453,11078922436292795,11080633936367688,11084732592274012,11086682643753664,11090552698103596,11090658585225857,11093188409391605,11095383304270179,11097675961341227,11099369753166044,11099551546210604,11106506387649741,11107790185802013,11123159825527527,11127177251318180,11129601052279134,11129859357638708,11135583018648230,11140988948695005,11145709417931599,11150199869893669,11151387183049239,11151502397313142,11154110766156613,11155371761778170,11157295858466191,11158629464450723,11159414148224323,11164777782395177,11169430954279703,11175202072568888,11175852637265303,11182614329697619,11184082345585609,11189705813167959,11200002087496543,11206266985990044,11212811284757912,11221071832453748,11221944462355990,11226519618035312,11228541607320093,11242771850103375,11246366304663746,11247749010895948,11248516680815322,11253108954825869,11254820718151050,11259273102107656,11261264491503353,11265599260848364,11266044641422248,11273050277652437,11280555107389759,11282775695475018,11287600375177114,11287893566206082,11289098740261755,11294033441021320,11294773174907559,11296245208210814,11296470298526751,11305713023756983,11314863622778589,11315258511556799,11318554733251064,11318702654300182,11319884533641300,11327586528497295,11327962158491035,11328275638112363,11330273278512837,11332552015667182,11332697629166595,11339380783297842,11340864658831256,11341499658993269,11345417090314925,11345675657880008,11345676553858105,11347392098829511,11350409656754127,11351342558936179,11356129989349558,11357460555425130,11358086643159577,11364648346737734,11364824056279735,11375384258325108,11383750361347134,11385168267308423,11389085993650118,11390806798887033,11397120253984795,11401700519195899,11407990305495344,11409131295056209,11409539605925674,11412775300232418,11415931058237717,11417029279499404,11418837401792416,11419050457279467,11425460679750797,11425662918976551,11425674126078597,11426226096713572,11428009680185526,11428645865887160,11438749233694215,11438964462131562,11439459859045383,11441352104880750,11449215149184077,11451628260579985,11452907797520228,11454513203644820,11456881578527630,11457346667741182,11459692638425608,11461197052190285,11462322406268747,11463847343590781,11467023328231824,11475621626604237,11478518643790981,11479308399516360,11480479501736039,11481618683495992,11482045627548411,11484846169745779,11495135828909763,11495940916242717,11496597527405109,11501735487559917,11504102260549809,11519358680969077,11520326123589592,11524872224376445,11528838411980010,11529868184218561,11530775986224529,11532404505521434,11540894335577353,11542654016596156,11544013273650036,11549882026188551,11555345985992577,11557042562885581,11560241639867312,11564144512113061,11568498682605843,11568678400586201,11571509198989020,11578506049932280,11579799804334255,11580137502987103,11581727638901896,11582679596601249,11583117656203215,11583507699894777,11585101265495681,11591047076552913,11597838643220140,11599758357243289,11602974466808884,11606641527777687,11611075089640896,11611748354430947,11612441214023420,11614076397936832,11617014574952198,11619486235348603,11620240919983985,11630644392646970,11635654976144153,11647860207129349,11653989895623444,11654096880041734,11657305088193972,11658683525550614,11664834793123518,11668903396015121,11672731802674267,11675090294053441,11675693720283985,11677165015385087,11678549904666632,11682179864909511,11684720239124533,11686779979541908,11687293075071490,11688194680736119,11688237614883154,11692359880827672,11693102982874445,11698756388262452,11706304165327067,11708423865084678,11713690607980814,11715198530711638,11715865254416537,11719221642455460,11720785116417048,11720873374212079,11724825796758899,11730215861616220,11730467845423531,11731164734577661,11732952721643258,11734286258484747,11738267971902102,11741745751488248,11741795538258227,11742706162990999,11752793473682764,11753431031818860,11760357200965436,11763018637241008,11764356908364626,11764874035248246,11765704631176088,11770706878359270,11776764748856507,11776942132964186,11777247958775743,11779851101536854,11780837550785665,11784146238668811,11785019194973166,11785179977172715,11786257969749074,11788283962253789,11790027713938832,11794754868481503,11801008269183730,11805477304749933,11805878919584950,11806503727533719,11807259505447243,11807669581624359,11808975572599296,11811220919611763,11811523671191877,11812158072536409,11823032149508223,11832905268834899,11837866263209531,11840295016246440,11840740382069149,11851393982879753,11852586198115184,11853010088136902,11863824190392357,11865542872711201,11867361302652812,11867622238392053,11867650483762221,11868412894656304,11870483176868986,11898179901887368,11902610012478374,11905938593275593,11909747036535415,11913133672980273,11913579970744326,11915166616058954,11917437865006221,11921035710134156,11923308867485120,11926548936220126,11926805367659349,11927305572643559,11933874408252082,11937995919116415,11939403507435534,11941423373859996,11943720753021897,11944383058348300,11944816331130113,11947591791853532,11949017351281018,11950260926652836,11950767340516423,11952970464557834,11957777053959725,11958250094792465,11958326503192345,11958460182520420,11971876905384523,11975100060815344,11982172621189391,11983457002283111,12003675199241448,12005848174188578,12006522182584979,12008453650739367,12010943352799406,12015639579945326,12017040715051459,12017280196275791,12020813104002531,12021776657102177,12028404727423728,12031148585055714,12035410219539172,12038634615780325,12038984699485340,12044509607056046,12044968098240593,12048218812219413,12048806622801494,12058410162198406,12063913410743326,12064775457651800,12066617975736949,12068867551957576,12071821708133242,12078782315854672,12082781112646069,12085458622840725,12093768254366446,12100943786761249,12103342077182428,12107118790447412,12110485781570692,12116763440852785,12120377787831548,12125020327675301,12128081806219839,12130816680520314,12135336896340352,12142933439996132,12151932314546584,12155534792479002,12157910100394424,12160896977780321,12177544020169884,12179235809448305,12180040689184058,12180082671639635,12186122156905100,12191783234987303,12192518732233721,12194188433406465,12200556590308310,12206961056205598,12213487168281093,12216273376124566,12217037909052392,12226080030988795,12245236639338607,12247196809844638,12248146350462714,12262311222789758,12270437462627588,12270468054721839,12272177606302533,12272459725983251,12278383271194356,12278465206346582,12283300256073245,12288007619457690,12291976925956833,12293363361122131,12309693411990179,12312452990243375,12313776804764473,12315740660505432,12317737462653854,12318972117511665,12321231790044265,12331039831738345,12331300696945968,12332506101262263,12334476628613713,12334531906613812,12339633893332240,12340540257772691,12345475198663391,12347889475047477,12347909851317459,12360123775491680,12365750013844755,12370916479710467,12371561019916631,12371619531441513,12373603008943996,12376979801050250,12383499878769639,12385506900879288,12386587160860313,12388152182711242,12390527382979238,12399457458248220,12399946676042065,12400047520221171,12403402985696867,12414844391454468,12418785272430115,12419850567303984,12423854238100384,12427118539066615,12438014718231534,12442226783163244,12453429222313446,12454152316786214,12456127570195279,12456974565702299,12462037008975433,12466553139749819,12468960135907940,12474505023309244,12474737975133205,12475509972236592,12482618753698829,12484792688815182,12493121285865448,12493531949000940,12495098079276198,12496980807002515,12502404720988619,12505394079431787,12516465480475702,12520510172302125,12524882028709030,12534442305927340,12537207717978996,12537660041547670,12544032455101983,12547299118310242,12548400145943534,12549910268086697,12559911253268655,12561212829273378,12562621625488566,12567396522160703,12568269490941488,12574953991866005,12576978802157283,12579381981407506,12581297128593136,12582417504397196,12593140979984180,12595025894277088,12595568697579144,12598104253633453,12603845745843686,12606498330358134,12606901469342342,12612529707466049,12615183521565762,12626861709059593,12627315009999764,12632687195472462,12639293891627838,12639418814809649,12640167527828266,12640428361474198,12640818042674893,12640871580590329,12640969010574572,12643494240426710,12652136957477942,12652319841467466,12653336178984584,12669546391130781,12673433235167362,12675636205599614,12678598650222967,12686784777563923,12692097685841819,12694087866558340,12695944838331405,12696892670705054,12701707285742221,12702962657957826,12704004077140774,12708456140034254,12714535709904775,12715273171560431,12717959780809396,12726377376546299,12726436436675201,12727033270826653,12727451946669105,12728089463396868,12732375258004085,12733418262925777,12738924440303227,12743533106187231,12753329851400984,12755303856704861,12771267826669947,12771598737920523,12781473711050942,12783187525335089,12784227033504239,12784609326080007,12786352863464886,12801400431375545,12801458013719616,12805335924853732,12807665721211120,12809522469790774,12809632657832569,12811342685032672,12812182344672176,12818427882691906,12819996417836695,12823282271321919,12829072084255416,12830088505582363,12833367241791767,12834860563514747,12841765441041049,12846385534139025,12848207419401226,12855844760930756,12859899907121954,12865701070922173,12868140593650867,12868775358248804,12875124642594600,12876334808558683,12880367229968159,12881424980533677,12882980822794716,12885114452454742,12887418415101226,12897909619055754,12900385538356311,12906788489234465,12908599797018073,12916112665929539,12918769262556623,12926924362852450,12932353138648641,12933527428631618,12934033598192671,12934350686066194,12935326619280462,12940588789639096,12946489524267653,12947522776480207,12955628525207272,12962843219163460,12963051823146860,12965554585695816,12965962908737325,12969038927449240,12974390471676060,12979430248880345,12979490664124573,12981848516554289,12985447175738467,12985493722134421,12986155313057080,12988371356512075,12993874964553291,13006729868315951,13013340987113008,13035980728818146,13036179358537986,13036645177838759,13036712601500114,13039280823665945,13045554401715049,13045600513120125,13052620397276151,13054236155028234,13056240047123862,13072501768493061,13072617923580734,13078916872324125,13080772514935469,13084504306404264,13086192967607976,13098251820355349,13099158956896694,13104310576837531,13104339456644663,13105958370560896,13106875818164772,13111138396854003,13111577005851999,13112638257280506,13114710504214063,13121300725611891,13121909629776355,13122025064383559,13127052312166869,13131340694012302,13136566433737611,13154101095403837,13154198718450725,13154555158306370,13161267336530233,13164318985726929,13165906763126222,13167979789890447,13168110604938660,13169610591191174,13170738127259843,13174101013456127,13175983907317617,13181966685315968,13184920558769854,13185428376339990,13189380579282347,13192157399149307,13198474033954862,13199022280418750,13199996563430952,13200108351974202,13201807925580353,13204068426067383,13204462037481647,13208555149000976,13211066578415956,13211782471313872,13212061616770885,13212165395243922,13224389449907250,13233545463558187,13238503442128074,13241104178731895,13241168864292142,13241450032861794,13248655970715829,13254044124605936,13254407272590223,13257737390535834,13262295991057322,13265037473491891,13267936932487740,13268996306113479,13270587658638306,13275333794285672,13276579099396774,13277158900551235,13277894633414167,13278754087006669,13280579253065923,13298750975340353,13302754854003883,13314547425279234,13315440480385562,13334201253531043,13341251444506381,13344119991216847,13347417735653001,13350157202852563,13353560065022737,13357601360650186,13359331313196874,13371096247956838,13372563355342461,13381234858826658,13385015528950604,13386085962502095,13392333467703344,13392648285436965,13394339089063032,13394551832655184,13402693157045406,13411243783632080,13411581109556372,13412383321315676,13413384478433494,13414514599248518,13423145336408826,13423985507124709,13428472113899924,13441217894362634,13441764089885110,13442145389950277,13442492834263372,13446542370234933,13448612638765991,13452686859689485,13466915673127210,13472766006472691,13479031376600774,13485627420255013,13489343668600089,13494212405375710,13495705064166062,13498151694534672,13501680776202759,13502956667923325,13505729133720187,13508489645714817,13509178757772730,13511175763453019,13516547793277979,13517706451256090,13519875476747795,13521772043996142,13526044181112873,13532220158545162,13544313444890724,13545457425167339,13546292946364632,13552576650306647,13560284735647415,13568144225858544,13570582888476349,13572007215372631,13579292169199361,13581522598681686,13584670639804403,13588669826245287,13594750552645450,13604060080584622,13606027345535991,13617631557607803,13618539821196872,13621326447410048,13621397819727220,13630191002096322,13634793775983156,13639851440986869,13641546138989675,13641606518127186,13649712080213198,13650051593032688,13651091819607497,13654427643263871,13655297823287389,13656122678588204,13669670567123455,13679106791368898,13682988765515845,13683384323434122,13685822158536416,13689486854312196,13692915679570837,13693027758544966,13697542413338103,13698474516655449,13698940649521784,13699244375297918,13700132194249732,13700395889419752,13701739894308740,13702229819892376,13704275954624893,13704352361096222,13706325468204188,13706670591280801,13707739578231116,13711378433916464,13713126833679041,13714567785435526,13725507831112260,13732875764071009,13741640976152344,13751009984842370,13751355444615875,13752515134941761,13752528537770243,13754252433328047,13758183684987635,13761510571679661,13763495093063765,13763737248840023,13769064518094184,13769616521296557,13772233025470893,13779343273469876,13782374358651901,13784328184108875,13796714897651986,13797271737130311,13806888829912490,13810189191668783,13819216056468458,13830139162136642,13834956579150593,13836967928987258,13841506126069216,13844723334748155,13851419674057285,13851804964013356,13852009236228299,13855148698755421,13860370948717274,13860591920719937,13863190387760047,13866281554758808,13869499215642030,13872276184090322,13883742410074464,13885432559815038,13892745650858214,13893729230139344,13894176996423815,13899662982568281,13903640450103285,13915571727313717,13915751473207815,13924477533272165,13927268834765068,13927696780643085,13930075501042467,13931574119523082,13932773453065067,13944345475258344,13944744739592850,13946019636961185,13947359127055804,13948733294751772,13948849305450763,13950003362814608,13951639188915106,13952318012300341,13957499193946800,13957891625399498,13963970693218754,13965952880287033,13965992746518202,13968491336408470,13969065894497400,13982564979542470,13988336481457298,13988537842078882,13996482893584239,14008782205566643,14010800531316406,14012374992832944,14015507053297472,14020512831650303,14021767660954154,14022387662308266,14028827379125338,14033262874705267,14036809823113558,14039082912681460,14041235400538814,14050877619339410,14053671836796726,14059703515141024,14066003779541480,14068336590289394,14068514727840577,14070452446274375,14073196557139903,14077628043807881,14079413477735954,14082060161725832,14086400253454584,14089660453835508,14093701509746096,14093782787475587,14104609562657279,14105474512409513,14110176260429603,14110846566699118,14111754638843301,14113954118968165,14115700381311298,14116084203345559,14116757201838538,14126627189476844,14129104187791374,14134252052809090,14136333045989523,14141721173215486,14142180399257488,14144286736225168,14147641612048676,14155975414531428,14159319817299730,14166972826657757,14167756848708160,14168406404233927,14175692216668231,14177050809138713,14182196956346963,14182395945348617,14182522370557503,14183668773352145,14187963108760817,14188374719646123,14194895524216878,14199253731869253,14200690083582668,14206687970696716,14209853920811090,14210270522420558,14215487446995196,14221732530161551,14226640214180071,14228466984618789,14228747898918402,14232996386333408,14233668407191507,14240099294539079,14240931409922495,14241368478491777,14245988562300971,14249502033018713,14249687565938747,14250698500890187,14253371408889777,14257631509009617,14258964967231840,14262886155232322,14267007162424724,14270247164026926,14271254001084489,14274483320198377,14274835544974226,14282336913974875,14284383355599952,14286491830383354,14291469615410543,14292177888930623,14292472000295936,14295837452356585,14298173613618098,14301257753026067,14306645039357579,14310015895186965,14312644574968166,14314489483212131,14318196470777373,14324162382494344,14327796466197481,14328346609794800,14330165162804822,14331141876120768,14334872702153449,14335504292083940,14341688237268043,14355465370177113,14356635961829550,14358501668762854,14358712927579207,14371667519001998,14373358653447165,14382653933328395,14389328610898075,14396743849723041,14403258144398461,14412375459733818,14419304139943345,14419408012320654,14419921321665188,14420517295463922,14421526836577881,14422482515005653,14428672766558377,14428963789076396,14433829777128924,14434491585844546,14441663522114382,14447076836883551,14453826393896267,14458414754313519,14460517698166413,14462888447275103,14463327792076139,14466639418787131,14473045986857112,14473621415900765,14474428436715615,14499310299171024,14502523747605405,14503354640357478,14503374543528179,14503421058685682,14506805831023499,14532022272038796,14533166699323342,14533912823231087,14540918644501586,14545143474688100,14546173469934987,14549609943559194,14552911878947037,14559345024889908,14572798606348625,14577681860555800,14584989944454173,14588926759145188,14591042865966381,14604151534357376,14606919734830311,14607574529846282,14609506155169308,14611213899966353,14622201375555281,14630990679638089,14631058148494236,14642640937827937,14643031895991669,14651923318081732,14656739959494770,14657604036440419,14660498729179366,14669778228653280,14674786028678808,14679329027774886,14680624844186736,14686694622392691,14689336054562019,14690256368300896,14693014696087872,14696133465591728,14697396774309339,14699312209892116,14710079784099482,14714972951681498,14718737202293924,14723600578234977,14727357539437919,14745825891890849,14753483946970413,14755563140273075,14755965578235618,14763159151224600,14764626632313599,14767178168674763,14773705053327044,14774424971091441,14775120243637151,14776126161075338,14777180456645831,14782806494910422,14784179132609967,14789280323954198,14792259226342467,14796095030944430,14802524498404394,14805119697076881,14808357837092866,14812335544631245,14814818422854695,14814866777217318,14816837023868332,14818468476875375,14819019180401048,14819207660612212,14821775114466739,14822972850892928,14831940328373824,14832874204975299,14833648039540838,14838200055945191,14841572903295226,14844521188313039,14847956454072103,14848728342207420,14862317369956557,14875244788896295,14877010452958052,14878500342798560,14880698080993082,14883492855733875,14884715585223534,14885001023521200,14885277650679824,14885514754372569,14890608256545870,14891249907937290,14894841507741510,14896432925297083,14899776943325306,14912124553248599,14912527776416275,14914637529083995,14927475356531675,14935912020884502,14936652050795629,14939491797730666,14939629686310269,14940182819303564,14944948556154171,14945635561516349,14948084549356910,14948446551537791,14949218635729694,14950087955881572,14952347763435515,14959164006691718,14961785319983417,14969572759318726,14971749865458474,14972120173118520,14977645952278382,14981979822436646,14988165815323633,14988877042506897,14993137347899829,14993931438103578,14995330188668762,14995498956830547,14996000077091154,14999867324523228,15002117713677743,15005212809692919,15006561064342947,15014220467166698,15015143178733208,15015832834168182,15016747917580341,15017581694255009,15023369839042379,15025234321810668,15027872686689687,15027965624651774,15028626060466021,15029223449524697,15029421099140855,15030279194177507,15035193036474483,15036546311204155,15040592624783964,15045563863877798,15047851634879837,15049206174008406,15058256367816154,15061551128577232,15064441595557983,15066002393956736,15067340188537424,15068416282122043,15068737776024543,15075955407954330,15081726781697934,15083561199479055,15093027538264168,15094447720794002,15100586527842091,15100895887756881,15100923564154126,15113939304708511,15124747624370744,15125038963644248,15125825668976374,15129837287101752,15132962157165167,15142340753501357,15142771204200772,15143222831944000,15144509730846110,15144908199448686,15144983031311469,15146266898753650,15149385225563368,15151128984083655,15152827565413011,15155535079044825,15163502675118430,15163608007084548,15164714333985887,15166301729740851,15168611383865707,15169763864701641,15186748056330061,15188528526614937,15193432864725218,15194881156695303,15198814250439862,15201662707583210,15205461449086049,15212200426217138,15213176306218798,15216511057457596,15223439233922134,15223468402959842,15227318255741609,15231273354612283,15232762341410261,15235610343655303,15244577355919854,15245960594532078,15247433843914559,15249106376606939,15250808075404806,15250896481067742,15258347128439790,15259612081001691,15264731568598059,15269511085038233,15270167427090968,15275297064012400,15281435895520542,15285891219756998,15286093688825701,15289862125703132,15290148594297788,15293123874907838,15298758428575449,15302533346414874,15303593678697230,15304616612479818,15304832061714010,15304847733090522,15305964656672387,15320795701669972,15326286490335430,15329295210127478,15332234480025938,15334331246873691,15345070383303245,15353149026108168,15353232670298897,15355335603796124,15356453151175679,15373930811061691,15377210030466896,15378726728075414,15379533653675249,15379705621247200,15383101065751713,15389713624455313,15390882193918153,15397171895399395,15402636785814262,15407310719467201,15407689229789196,15408822912493961,15409962731524859,15413173941024438,15413515751683038,15416018244148923,15419969270171951,15423153342341016,15428180744186198,15430571383432346,15431617843729266,15433887937403854,15437233971050551,15450715294654043,15452893020203867,15453212547751568,15461080320924835,15462712554318219,15467422080353387,15469490756626048,15484285765017800,15484872489499858,15485469980475937,15485540626374727,15486304467213949,15489723346328738,15490588941327161,15493669981706537,15494125152072718,15500366938118891,15503520406029992,15505519386765147,15507002730562560,15507596083915355,15510353559011411,15514535598456693,15515999929535991,15522061334524465,15529140775061671,15530230344187268,15544311106200778,15544548900805204,15545602100255398,15550480026583451,15557041324109368,15559289591149294,15561564170785191,15561952874606530,15564933328360346,15569147522045783,15572863590946325,15576367136356714,15577133638656672,15578855835529187,15584544164633761,15585305674396933,15586021008360415,15586572984402845,15591835587885800,15595116715517183,15600022327961011,15605001570186520,15607870388183703,15607922224614041,15614292833802726,15618067512755640,15624018957338891,15627340304611938,15638216907788849,15638858384127971,15642870227425833,15646298279506026,15651638904781067,15652623828656547,15659367639512437,15663152139200473,15663518386052835,15668753861818902,15669831866387505,15678947651292970,15682293644901354,15682550662690976,15682651083715691,15684129061048451,15684714219805662,15687701212595998,15689677439468810,15695115813510797,15695286443123085,15700741802774887,15701006667851545,15702846415375903,15703609923212388,15703962508930357,15721982912314664,15743385922200831,15748859641437205,15754569858261273,15755103109741170,15755440794212771,15757615898310353,15760850159052851,15762209549139285,15763329664260405,15763347842500031,15764824185348051,15765990586747192,15766276644999494,15768790414358471,15778030936010985,15778073642134042,15783285537872233,15783457873235222,15783601313856694,15786952156025848,15789976943224909,15810883487535993,15812065825937453,15815973513115164,15816359902190124,15818396444990604,15822569260611075,15827802457455271,15828816982020122,15830964443377814,15840334179132579,15843352451900485,15843600775555820,15846238303690403,15863820783079073,15866236940451977,15867439138551076,15872362195905201,15875675232290550,15878101641545005,15878818841668229,15879020355620882,15879801226947188,15882817785917695,15884400676036182,15887607544869391,15890892365015163,15892366657661960,15892644929711368,15895961844448293,15896204034306061,15897401962344850,15904895288630879,15911275554215588,15911665623700279,15915302121110625,15920977380773424,15922176557778000,15927341566519732,15931653898476584,15934933731048989,15939128572044103,15944489120018696,15954518713119826,15962749062304179,15964603511322079,15966264651417527,15979755963656160,15989521035310443,15992440720931469,16003094114347164,16004817238396021,16011025198707647,16012437984901399,16018234336000847,16033495765775843,16038301793476863,16041339465547053,16049606674888102,16049891952869470,16053420407977591,16060832251885914,16062107659438725,16069046551508727,16069174976182272,16074486970716033,16080740588460730,16083877262816687,16090383828959085,16093240548996996,16098091349807463,16098172275019426,16099819217713851,16108376586576329,16125621753305299,16126978195698598,16127193854760523,16134101469312376,16140981467932346,16144336314735217,16145343445599154,16149410584199209,16150040833847011,16152783913026412,16158129834797633,16160771084575630,16176635623269431,16178760128679429,16181654573567669,16184318280736106,16188822750519283,16190571409547135,16191892773280294,16195655847208731,16198734954314842,16211596379781820,16219147118653087,16220746069769206,16225653430698144,16233112123839300,16233654384438564,16235839769165041,16240762741306135,16250616875540489,16263334721549532,16263780136827362,16266712848564625,16270015344285096,16271083150992386,16280927247624124,16281915533551056,16289174359879745,16289936972512243,16293042607710037,16299677703726115,16307595056946704,16309137054392802,16310681306790082,16315681986373983,16317875420686187,16322691175661967,16327416205924614,16330104654201385,16333887903434801,16336789007686054,16339994308760050,16341765762990956,16347036755860703,16349055180152841,16349624325715789,16356347789934648,16359131609074861,16362066780194864,16369009637282998,16369281391114209,16369945946899217,16372297199748151,16373987141658826,16375988586939943,16377409889399924,16379852130875662,16383306457978105,16386085273604579,16389519573583307,16394940965979110,16396880383990556,16398154649330003,16398733126926655,16400068126248119,16411790303732795,16417759312392243,16419509766610091,16419901644544820,16422440467412931,16426184098291933,16428705781520359,16432971637241688,16433327633528711,16435742390682375,16437965595938221,16445322365770696,16447014000822092,16448682699618749,16448829682806061,16452048761762229,16457674212534286,16458193998413945,16460001490402451,16461454427883020,16462708921584182,16465114761860846,16465741257369090,16467984634116524,16473606709399091,16482765139128458,16483944183054084,16492537636527687,16492753413249082,16495982586896225,16499668866369559,16512946688413824,16514937777288269,16515317531532600,16515515620455784,16515763893503398,16517530335877295,16517537506431523,16520680878383534,16522040144005904,16536209470153361,16549193848756349,16551638786295881,16553191501416196,16555675508895642,16556142033974396,16557075823478085,16560847038118314,16561729019896847,16568638052909005,16569637258340730,16573238078421961,16574236353677299,16578960500697920,16582822217918014,16589279792859879,16591958210106118,16594902459898391,16605131007727492,16606580432110149,16614318900004042,16615202652663010,16618755587989745,16626806031696348,16629787832374700,16631291003094984,16649312379995411,16650212270002998,16650283216078512,16651090716262974,16652944391354801,16653981254978641,16654463028053744,16654924393162193,16660067927175777,16662173317527607,16664243102641776,16666335390036133,16681703184890456,16682373593295548,16682578612688855,16685180422791776,16686094229531741,16690146533382363,16698836185067210,16705001871343701,16708636667018243,16710176517292164,16711961207359232,16724720235210872,16725294155137383,16727032133352391,16727688366022871,16729903330833289,16730086424088046,16736716353986757,16737373768108148,16738231483083309,16739182735043548,16741586841667302,16747302145863252,16753484567013429,16755872335309848,16759630605474370,16761517688376276,16762470025066864,16783509929261859,16784815745535597,16787458448627887,16788378238902865,16788943958964328,16792514152922390,16804992154815880,16810005023919202,16820470058192790,16827645998999199,16830315094868687,16834728273804865,16834972450595855,16837630758069802,16838337071218776,16843019140494565,16845510952053197,16850886838136612,16854336811041325,16858777046733835,16862894270178946,16867020968629490,16867864576520806,16868617407655959,16868967869968917,16870410864242800,16873469111493195,16879575300669180,16880613203851258,16886381613931407,16887131664281014,16888158543374642,16890451337099671,16893613954731672,16895785673304080,16897929991993805,16899560454680533,16913880033664423,16915167008196857,16919853192670914,16923906246184599,16936593144852542,16942918462021910,16945631443389494,16947503499298974,16954247022723534,16956760996707076,16966208347117891,16967956019390437,16972536001685219,16974976960555336,16974996106586527,16976062143580028,16977273505567584,16981100707531732,16983782183294117,16986912710655502,16987865244712954,16989134716990479,16989387007759710,16999582099196194,17000582419359490,17001105496098528,17001625874486973,17004131992558114,17008056242821339,17011749486628658,17014229777897844,17018029384954439,17019281824197645,17022002414706187,17023649823777761,17027024912981538,17027708820603609,17027724390296374,17028905071969344,17033234045807732,17039633394164779,17041956186643831,17043911086147728,17044227183900592,17045020641718652,17047039786296372,17048296154567372,17053515690985016,17057095725127500,17065736283826551,17066204322105669,17066614080750842,17066890141401799,17069702342298005,17070031206981939,17072355840387059,17086180968300670,17092924242292896,17104993056562977,17105192154942325,17109970886679733,17115701285838058,17117697441697646,17125687975796961,17127731933707424,17128001588707458,17138834595066375,17143215310364176,17148449573094945,17150277478457455,17156795393603011,17157898465093855,17158828067013858,17159011651238619,17164804932271093,17171938449805958,17172705597475016,17173738199873813,17179028413037838,17184647258662518,17189985997758617,17192344156604394,17196706052792205,17207135836467323,17215506044805401,17219161189129714,17220596644754506,17233175158773315,17246076311509922,17255087609386479,17255995767294112,17259853567766215,17264169344327606,17264493723089078,17270538843510702,17271660415976271,17276987541026097,17282090993143952,17283049372339150,17291560172494026,17291979671712321,17292310452468705,17293149261210524,17296137849004163,17296192463290079,17304784741854216,17308433563518540,17313632977406292,17318960805851472,17320236078883475,17321015553228474,17321174101274260,17321666593584496,17323038726279631,17329308502917698,17329472456864413,17334589990132684,17334864272182912,17341517372421961,17351099007094397,17353053843653375,17366561361017324,17374440012919698,17378407166143928,17383067517360975,17391219400155350,17391436242706241,17393048485135831,17395137850335402,17396392214119358,17398282123693718,17400913153559823,17407246841014078,17413919734842125,17420499051739414,17421399034054265,17422062281526649,17423105453982540,17424289896774390,17425090194197669,17425614571955386,17432341969660318,17435530177003750,17439323243822026,17440523469292889,17441789247813820,17466786275120017,17470441567829100,17476597996427511,17476827515285484,17479085198776952,17484120239214373,17485776963997171,17486966299030886,17486988765689599,17488816545423819,17496728290093656,17497098710311670,17499228377170813,17500477193853245,17517159540441318,17523212990532497,17523973238515804,17527155984508354,17527974390318800,17541513425567569,17544483234277015,17554939460224349,17558580292594243,17559431629269263,17561448044068445,17562043899076409,17564200744376749,17568398735638434,17572077476907682,17575183081748977,17575560135721806,17578541772101901,17582290334182417,17587104794159329,17593208073575946,17596039699851909,17599396608009249,17600395630340514,17600607133597719,17602282637407016,17608993167118462,17612331367634278,17612661692978454,17613143173683718,17620186225453340,17622683372375560,17624682438741740,17637276506512333,17638727474061409,17641686744036386,17644039113805944,17645312266322218,17650070599794961,17653795308183431,17653847556747406,17657497846454029,17659159129272154,17659621059389953,17660743105223332,17661459152369712,17675621085369441,17676740506186425,17688285802217756,17696080779036912,17697163249179507,17697682504000309,17707842984156022,17709737359906993,17710801222146557,17712409569723362,17712893886367554,17714216772557464,17716382248321539,17720864955352360,17725080861093763,17729422012525851,17732456419233492,17741767011633464,17742935181641766,17746510075374564,17747383804315050,17756105008438482,17759977925515375,17760075502845602,17762550181642638,17767687613087632,17767859597836083,17769865028645273,17770964005963097,17770981472959907,17778432694523101,17780417672471981,17780633004635622,17781695742071988,17794405366215460,17798330281681371,17800329108711822,17805181966455568,17806610508162479,17807775056747143,17810904352266449,17811294904961592,17812394543477172,17816589074280916,17820414995546733,17822270975275609,17824058019135158,17824692487924143,17829073738411995,17829961694570784,17837924490120715,17838730974038612,17840541840864217,17843709229402181,17844481483540230,17848382043638116,17851847109708456,17853025423149005,17859332251377907,17861897896064008,17862392392198693,17863284124973089,17864179561603861,17864592832666958,17868918610462163,17871331243165860,17873251325535856,17875253398653485,17877847214982476,17881080524524475,17889149793462925,17892154693253238,17893885025675099,17896653342000979,17903487860911815,17903975998539248,17905797190497744,17905846546240170,17906626648911419,17919141917693070,17922025141068374,17927103791988031,17933163310113598,17937781070124082,17948193446220343,17961387047243191,17965956572473636,17970314287831337,17970920336945917,17981163734458850,17983136277324499,17988399353053093,17988976441880620,17994870382615510,18001307487480335,18001311042217802,18006237324341425,18006674318531347,18009042115164135,18014189215438894,18014657110806736,18020974854298469,18021886555673319,18026004208911747,18026232516319011,18028316562390501,18028401974332903,18032295415917214,18033529755426165,18041417715473006,18042108482583522,18051621313730146,18055041696562277,18055087872299409,18055587125968368,18061732028717577,18063228282000881,18065517227719762,18068141364358640,18069471533986377,18075555160804033,18076181993827292,18082663742446595,18089241107640661,18096458958758462,18097497168766291,18099088172925428,18100450631735810,18103384897215847,18129411267420255,18131898498754493,18133412567042816,18136432192167355,18138184127031654,18138810838881859,18139979326512529,18143945517551573,18148249253291380,18162150874995819,18163443951512529,18176398171978336,18179155755591764,18179306742222141,18195325370888256,18196224826654508,18198481066177520,18200162616918760,18200433284258315,18201109647268708,18210889187587826,18214396067041321,18215366819351334,18215593970961402,18215688955701607,18218596306288915,18219379302426418,18219480778356908,18219492177590913,18223532024009924,18229457516235802,18230262104505569,18235829425519784,18241422988672837,18244762343715926,18257416541434878,18258026885319486,18258589056361348,18258704607599735,18265102179546859,18275143099845195,18277496942328603,18277532214379777,18306497644679138,18307189866355692,18308565966347727,18309896670692432,18310224044923199,18310260983673763,18311678202467591,18312928450191138,18316793768442045,18320199194413158,18320706645413560,18321247174629916,18325796935244911,18330874810048231,18332434291015304,18336172353658611,18337191336507655,18340192768781464,18354768007590930,18354809741903140,18361245509159168,18362561943328805,18366897023001689,18367494137613346,18377045322936582,18379087767248948,18389507703197237,18390199754916829,18395298635755745,18396190684827929,18400962357421119,18402740084326073,18403600751028920,18410807087565130,18411318682491459,18412761413118797,18417094802826718,18417594946606594,18423285819437783,18429692224833089,18434322404441043,18434966080784818,18435861506577465,18436307626060546,18438159643459969,18440518503779835,18441289041766013,18444487060015322,18444666364288446],\"molecule\":\"DNA\",\"num\":0,\"seed\":42}],\"version\":0.4}]"
  },
  {
    "path": "tests/test-data/prot/gtdb-subset-lineages.csv",
    "content": "accession,superkingdom,phylum,class,order,family,genus,species\r\nGCA_001593935,d__Archaea,p__Crenarchaeota,c__Bathyarchaeia,o__B26-1,f__B26-1,g__B26-1,s__B26-1 sp001593935\r\nGCA_001593925,d__Archaea,p__Crenarchaeota,c__Bathyarchaeia,o__B26-1,f__B26-1,g__B26-1,s__B26-1 sp001593925\r\n"
  },
  {
    "path": "tests/test-data/prot/hp.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/prot/hp.rocksdb/IDENTITY",
    "content": "ad67b089-819f-4d03-8114-5b64bb9b9a32"
  },
  {
    "path": "tests/test-data/prot/hp.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/prot/hp.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=9.9.3\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  follower_catchup_retry_wait_ms=100\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  wal_write_temperature=kUnknown\n  write_identity_file=true\n  write_dbid_to_manifest=true\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  metadata_write_temperature=kUnknown\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  follower_refresh_catchup_period_ms=10000\n  log_readahead_size=0\n  enable_pipelined_write=false\n  background_close_inactive_wals=false\n  wal_recovery_mode=kPointInTimeRecovery\n  follower_catchup_retry_count=10\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  prefix_seek_opt_in_only=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=10\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/prot/protein.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/prot/protein.rocksdb/IDENTITY",
    "content": "519a60ff-acb3-47c8-bf5f-c0f1df6353bb"
  },
  {
    "path": "tests/test-data/prot/protein.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/prot/protein.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=9.9.3\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  follower_catchup_retry_wait_ms=100\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  wal_write_temperature=kUnknown\n  write_identity_file=true\n  write_dbid_to_manifest=true\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  metadata_write_temperature=kUnknown\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  follower_refresh_catchup_period_ms=10000\n  log_readahead_size=0\n  enable_pipelined_write=false\n  background_close_inactive_wals=false\n  wal_recovery_mode=kPointInTimeRecovery\n  follower_catchup_retry_count=10\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  prefix_seek_opt_in_only=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=10\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=datasets operator\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_compression_type=kNoCompression\n  paranoid_memory_checks=false\n  blob_garbage_collection_age_cutoff=0.250000\n  preclude_last_level_data_seconds=0\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;max_read_amp=-1;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  memtable_huge_page_size=0\n  max_sequential_skip_in_iterations=8\n  strict_max_successive_merges=false\n  max_successive_merges=0\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  min_blob_size=0\n  level0_stop_writes_trigger=36\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  default_write_temperature=kUnknown\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  uncache_aggressiveness=0\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  inplace_update_num_locks=10000\n  periodic_compaction_seconds=0\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  paranoid_file_checks=false\n  blob_file_size=268435456\n  preserve_internal_time_seconds=0\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  last_level_temperature=kUnknown\n  table_factory=BlockBasedTable\n  report_bg_io_stats=false\n  persist_user_defined_timestamps=true\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  compaction_filter_factory=nullptr\n  min_write_buffer_number_to_merge=1\n  max_write_buffer_number_to_maintain=0\n  compaction_filter=nullptr\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  force_consistency_checks=true\n  num_levels=7\n  merge_operator=nullptr\n  max_write_buffer_size_to_maintain=0\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=6\n  detect_filter_construct_corruption=false\n  optimize_filters_for_memory=true\n  decouple_partitioned_filters=false\n  partition_filters=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  whole_key_filtering=true\n  index_shortening=kShortenSeparators\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  use_delta_encoding=true\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/scaled/all.lca.json",
    "content": "{\"version\": \"2.1\", \"type\": \"sourmash_lca\", \"license\": \"CC0\", \"ksize\": 31, \"scaled\": 10000, \"moltype\": \"DNA\", \"lid_to_lineage\": {}, \"hashval_to_idx\": {\"30807374014407\": [0, 2], \"57757612406942\": [0, 1, 2], \"62742121440776\": [0, 3], \"66802006065227\": [0, 2], \"93749377441657\": [0, 2], \"116682508153136\": [0, 3], \"123470632334374\": [0, 3], \"171395183363180\": [0, 3], \"180725499715323\": [0, 2], \"204071187423962\": [0, 2], \"222251804657295\": [0, 1, 2], \"259806423646378\": [0, 3], \"296222212281285\": [0, 3], \"316101341485088\": [0, 3], \"335517318379724\": [0, 3], \"342235403058706\": [0, 3], \"372220710502218\": [0, 3], \"383550092736406\": [0, 2], \"395679040987570\": [0, 3], \"404680749850337\": [0, 2], \"428826126693272\": [0, 2], \"486474781856218\": [0, 3], \"501737310713979\": [0, 3], \"513963359772125\": [0, 3], \"517206764912218\": [0, 3], \"527010193814289\": [0, 2], \"536080090837999\": [0, 3], \"557296703518784\": [0, 3], \"586944462641177\": [0, 2], \"621469634901311\": [0, 2], \"650400501644310\": [0, 1, 2], \"694452048593312\": [0, 2], \"711796760984226\": [0, 2], \"763990431249073\": [0, 2], \"789361198254004\": [0, 3], \"796340894958088\": [0, 2], \"807182880479890\": [0, 2], \"832723642635445\": [0, 2], \"833951912068389\": [0, 2], \"835611144117353\": [0, 2], \"876191041280893\": [0, 3], \"917664535291844\": [0, 2], \"923091879889105\": [0, 3], \"944861144892856\": [0, 1, 2], \"947350932899290\": [0, 2], \"960253372716129\": [0, 2], \"996771440047709\": [0, 1, 2], \"1006580187050746\": [0, 2], \"1007211062656682\": [0, 2], \"1041434451417868\": [0, 3], \"1060973346735565\": [0, 3], \"1076193919932584\": [0, 3], \"1078584030564363\": [0, 1, 2], \"1078830330869677\": [0, 3], \"1109012404096060\": [0, 3], \"1113634793641498\": [0, 2], \"1122758845345273\": [0, 3], \"1125125376375867\": [0, 3], \"1131757223799833\": [0, 1, 2], \"1148792696258827\": [0, 3], \"1199336925926527\": [0, 3], \"1203102333807228\": [0, 3], \"1227539422471232\": [0, 2], \"1255977929207456\": [0, 3], \"1279029402629146\": [0, 2], \"1286655421055676\": [0, 1, 2], \"1293147505464497\": [0, 3], \"1311604457296941\": [0, 2], \"1319342497253366\": [0, 3], \"1344155412543000\": [0, 2], \"1413828164652611\": [0, 2], \"1459122636955914\": [0, 3], \"1475306543173579\": [0, 2], \"1484092490448841\": [0, 2], \"1518235962441549\": [0, 3], \"1527957201371692\": [0, 2], \"1533340098245745\": [0, 3], \"1555059455114724\": [0, 2], \"1578008991811199\": [0, 3], \"1585173787447114\": [0, 3], \"1588006882382533\": [0, 2], \"1596586810934220\": [0, 2], \"1601839650445404\": [0, 2], \"1674554665566329\": [0, 3], \"1699936347324818\": [0, 3], \"1708708457648792\": [0, 3], \"1709325775873641\": [0, 3], \"1739758684393454\": [0, 2], \"1757916833279658\": [0, 2], \"1806336745307859\": [0, 3], \"1819323021224724\": [0, 2], \"1821683475928935\": [0, 3], \"1838882153014188\": [0, 3], \"61684531578209\": [4], \"85771769135580\": [4], \"135481858169414\": [4], \"145613169630587\": [4], \"158900194242036\": [4], \"187488401810094\": [4], \"401931523863428\": [4], \"488631545243238\": [4], \"542476954328872\": [4], \"549354994541497\": [4], \"578791919875463\": [4], \"590222143508976\": [4], \"663776913330781\": [4], \"743813632104820\": [4], \"752433086944547\": [4], \"760669641467696\": [4], \"781611029710848\": [4], \"793960459078570\": [4], \"844592394790229\": [4], \"963945439567632\": [4], \"979829169620899\": [4], \"980044439443436\": [4], \"1075352266403401\": [4], \"1079812539046566\": [4], \"1127077186922492\": [4], \"1167157075967875\": [4], \"1168326749098990\": [4], \"1228287306753073\": [4], \"1274514664173567\": [4], \"1416156285237060\": [4], \"1513658309796591\": [4], \"1532864882210721\": [4], \"1553704479759933\": [4], \"1554538698486601\": [4], \"1597174043244504\": [4], \"1604125218201751\": [4], \"1629287068676804\": [4], \"1629927722362012\": [4], \"1691580759029342\": [4], \"1692923411999067\": [4], \"1704974988766534\": [4], \"1772958528747502\": [4], \"1818178797566903\": [4], \"1832394902331060\": [4], \"1836478256458666\": [4]}, \"ident_to_name\": {\"../genome-s10+s11.fa.gz\": \"\", \"../genome-s10-small.fa.gz\": \"\", \"../genome-s10.fa.gz\": \"\", \"../genome-s11.fa.gz\": \"\", \"../genome-s12.fa.gz\": \"\"}, \"ident_to_idx\": {\"../genome-s10+s11.fa.gz\": 0, \"../genome-s10-small.fa.gz\": 1, \"../genome-s10.fa.gz\": 2, \"../genome-s11.fa.gz\": 3, \"../genome-s12.fa.gz\": 4}, \"idx_to_lid\": {}}"
  },
  {
    "path": "tests/test-data/scaled/empty-lineage.csv",
    "content": "accession,taxid,superkingdom,phylum,class,order,family,genus,species,strain\r\n"
  },
  {
    "path": "tests/test-data/scaled/mf.csv",
    "content": "# SOURMASH-MANIFEST-VERSION: 1.0\ninternal_location,md5,md5short,ksize,moltype,num,scaled,n_hashes,with_abundance,name,filename\r\nall.lca.json,455c2f95f2d0a95e176870659119f170,455c2f95,31,DNA,0,10000,93,0,,\r\nall.lca.json,684aa226f843eaa7e1e40fc5603d5f2a,684aa226,31,DNA,0,10000,48,0,,\r\nall.lca.json,7f7835d2dd27ba703e843eee4757f3c2,7f7835d2,31,DNA,0,10000,8,0,,\r\nall.lca.json,7ffcfaa4027d4153a991b6bd78cf39fe,7ffcfaa4,31,DNA,0,10000,45,0,,\r\nall.lca.json,d84ef28f610b1783f801734699cf7e40,d84ef28f,31,DNA,0,10000,45,0,,\r\ngenome-s10+s11.fa.gz.sig,455c2f95f2d0a95e176870659119f170,455c2f95,31,DNA,0,10000,93,0,,../genome-s10+s11.fa.gz\r\ngenome-s11.fa.gz.sig,7ffcfaa4027d4153a991b6bd78cf39fe,7ffcfaa4,31,DNA,0,10000,45,0,,../genome-s11.fa.gz\r\nall.sbt.zip,684aa226f843eaa7e1e40fc5603d5f2a,684aa226,31,DNA,0,10000,48,0,,../genome-s10.fa.gz\r\nall.sbt.zip,7f7835d2dd27ba703e843eee4757f3c2,7f7835d2,31,DNA,0,10000,8,0,,../genome-s10-small.fa.gz\r\nall.sbt.zip,7ffcfaa4027d4153a991b6bd78cf39fe,7ffcfaa4,31,DNA,0,10000,45,0,,../genome-s11.fa.gz\r\nall.sbt.zip,455c2f95f2d0a95e176870659119f170,455c2f95,31,DNA,0,10000,93,0,,../genome-s10+s11.fa.gz\r\nall.sbt.zip,d84ef28f610b1783f801734699cf7e40,d84ef28f,31,DNA,0,10000,45,0,,../genome-s12.fa.gz\r\ngenome-s10-small.fa.gz.sig,7f7835d2dd27ba703e843eee4757f3c2,7f7835d2,31,DNA,0,10000,8,0,,../genome-s10-small.fa.gz\r\ngenome-s12.fa.gz.sig,d84ef28f610b1783f801734699cf7e40,d84ef28f,31,DNA,0,10000,45,0,,../genome-s12.fa.gz\r\ngenome-s10.fa.gz.sig,684aa226f843eaa7e1e40fc5603d5f2a,684aa226,31,DNA,0,10000,48,0,,../genome-s10.fa.gz\r\n"
  },
  {
    "path": "tests/test-data/scaled/pathlist.txt",
    "content": "all.lca.json\nall.sbt.zip\ngenome-s10+s11.fa.gz.sig\ngenome-s10-small.fa.gz.sig\ngenome-s10.fa.gz.sig\ngenome-s11.fa.gz.sig\ngenome-s12.fa.gz.sig\n"
  },
  {
    "path": "tests/test-data/shewanella.faa",
    "content": ">WP_006079348.1 MULTISPECIES: glutamine--fructose-6-phosphate transaminase (isomerizing) [Shewanella]\nMCGIVGAVAQRDVAEILVEGLRRLEYRGYDSAGVAVIHNGELNRTRRVGKVQELSAALETDPLAGGTGIAHTRWATHGEP\nSERNAHPHLSEGDIAVVHNGIIENHNKLREMLKGLGYKFSSDTDTEVICHLVHHELKTNSTLLSAVQATVKQLEGAYGTV\nVIDRRDSERLVVARSGSPLVIGFGLGENFVASDQLALLPVTRSFAFLEEGDVAEVTRRSVSIFDLNGNAVEREVKESEIT\nHDAGDKGEYRHYMLKEIYEQPLALTRTIEGRIANKQVLDTAFGDNAAEFLKDIKHVQIIACGTSYHAGMAARYWLEDWAG\nVSCNVEIASEFRYRKSHLFPNSLLVTISQSGETADTLAAMRLAKEMGYKATLTICNAPGSSLVRESDMAYMMKAGAEIGV\nASTKAFTVQLAGLLMLTAVIGRHNGMSEQMQADITQSLQSMPAKVEQALGLDAAIAELAEDFADKHHALFLGRGDQYPIA\nMEGALKLKEISYIHAEAYASGELKHGPLALIDADMPVIVVAPNNELLEKLKSNVEEVRARGGLMYVFADVDAEFESDDTM\nKVIPVPHCDIFMAPLIYTIPLQLLSYHVALIKGTDVDQPRNLAKSVTVE\n>WP_006079351.1 MULTISPECIES: hypothetical protein [Shewanella]\nMKGWLILALLAGALYYLYTETDKLDAPIAKTEAMVKKIENKVDSMTGTKIIKIDHKLAKVRTDIVERLSTLELEAFNQIP\nMTPESIADFKANYCGTMAPEHPVFSKDNQLYLCDHL\n"
  },
  {
    "path": "tests/test-data/short.fa.msh.dump",
    "content": "murmur64,42,31,short.fa,81188339440733424 91978956896026414 124650281852403290 128099623049835827 144122315219657026 201431308980010980 201712370616985488 205961730522259272 207247978848945480 211764368736119854 224818703640383824 279337963725221385 282031133607518380 308207593024427860 358157291173294434 382219487474240028 389509551693136316 394316682587112380 419091375111332644 425141571918060438 454721074838127424 477743804132329479 560820627468784485 606806605787776148 625217889903139371 649406983667682479 741052918615392521 750645005943143633 763155904808228137 830995918023649904 832698490625475241 863046388343728910 887270775809673993 889777820216232782 901580013236127792 920825504648011332 924605379572117297 947258985708348478 974047736328120627 980650803537148304 988832714191281888 990642519624860243 999516436546736964 1017191080315182612 1042206769837116239 1043217256398203229 1070961951490202715 1075612053436254845 1090667482763400231 1148079326317139690 1168955351736910742 1183393898078450010 1197194230105819574 1208331920273951298 1225671635365178118 1229653673158409128 1231140213277122810 1253615426519659102 1288522398718153278 1297844332415309363 1298437526592013656 1317937411620451739 1339524273336646166 1339606644256591884 1352381996899537289 1390838733614055047 1396123369218427634 1403952898789822462 1426877898252857024 1434050750407569153 1453942736897180954 1455002757383329633 1461093865891259512 1461235169070162437 1540036281313810091 1542595377087094280 1611074268384845007 1619516077519079424 1624908296025056451 1641185133043053735 1645187857857369927 1660214652179382581 1676021080620047309 1689541329644519794 1722002787063272401 1747060016080123792 1785984054737981712 1788360687246566510 1819247019499883217 1833227888246755276 1847114870089103531 1849761541730289997 1854258084278315334 1917537054869752582 2004219648999387141 2016485441046214603 2045429528005313155 2075318346013122115 2105471008961718103 2128199520736070332 2128237982279148860 2204765004061580969 2206160701137655197 2209841757220719618 2225910459871166860 2232204298779509955 2249726369322198531 2260438649069875935 2272656686567290600 2289206188617510359 2303387192998871015 2347285306723509049 2367028204058964683 2375304609119253199 2375584784372236997 2378447661117086457 2380953560215436253 2466291282412515722 2479127510821731117 2491761762995566829 2515519443801482296 2532467217140506463 2564636669578556694 2574913597649891270 2596339840045342866 2620978738390476967 2623832611782253319 2627533450499753635 2643154922388361814 2655780030868654120 2678720461157085988 2693802448809176365 2710841617498562227 2712422698123831093 2722394930074873224 2723474286887085622 2725898594001549297 2746622149130117843 2778547531823522401 2784508872099767456 2805440593638997044 2815331101657958827 2831501562198840321 2887928129311719039 2942658932583121332 2955726199966644569 2985739017037458599 2989433262509293686 2995313309499840290 3011171277307481298 3016783145829808707 3055058993319760418 3083213751433390327 3134775810372941500 3159480991285707394 3164147494645579674 3166995336079310123 3169940083950764149 3181211058919579894 3182532684333968555 3214562419770713991 3221796614076197442 3242079656560423370 3265028852522087653 3276774887201720232 3292983616801979419 3332198505601333810 3350100153722646277 3368505925116027972 3380078124546663906 3394849214108730252 3401235219892388903 3420790333905865778 3421062082249487397 3428862103457087611 3433298331847683021 3434522342389395787 3478705363558472591 3480974516973879916 3483047455309297257 3550742826493555786 3561195376377596665 3571843441831918865 3575693166683716912 3577498059022633093 3613080268754054371 3623697518886818303 3646505624390171262 3671017277004493485 3675155196162211639 3680752270239228101 3705545317282652119 3709963233104339588 3725036877005553336 3726663382615149250 3752167233726834133 3773182192160504382 3810370213961709748 3825736975144211492 3831420598684120259 3832908219920903278 3849641394174456760 3870096998691023951 3886861970062672499 3927211878020277626 3996505127795803683 4000445197096934988 4014080686764322993 4088328999712853960 4097727883053550093 4139306726008844481 4173168118733451341 4198846797629466178 4201463350562375798 4211753345226264840 4214465639391653464 4219138119474521946 4219630673695408922 4225110281151288741 4270483759121761831 4281282743170171711 4285638326408779876 4339081222993433831 4342663824984000452 4349643777529359635 4350628217960769051 4353932984586378267 4356060641199517897 4400298716961299038 4464660495672137636 4470808533443905187 4496657545837192724 4500217683270746976 4507244834199227463 4535349498653172917 4576224269245562672 4584986880378631508 4616916081252489498 4720446987817436833 4737266981084242930 4752257203008213452 4753867229930166523 4792857825639532393 4795176256400270777 4826351186978157339 4834781803289058015 4840342396063966188 4863795768644830416 4933593179756730830 4965295908757653390 4967037789879584153 4973758693470940403 4998058518489374510 5019933544702297389 5036098512200241793 5049104887325345948 5053049401783975342 5068590959994188686 5079581609390562177 5089162942489907342 5133381930763234697 5135342195689210885 5138264265333584473 5139412829033267839 5147689449019351887 5155528140012778096 5162175693618984465 5208843326903322173 5251373744864440485 5256288656108793601 5259308509015444399 5273584917534118992 5277452540569628104 5298506651141934831 5358938934000539185 5396787094150876663 5400238737917888459 5406340146421674679 5436418919656518250 5462528748540897567 5479801350554859514 5482627001033724604 5504260816789979571 5509566148438774942 5529040910942746365 5562547426517709345 5610318573036861963 5638601336956923640 5670894876022718330 5685502862949078311 5685660474879265195 5707706046145968624 5760783915156651985 5783229124475757724 5792705677094615907 5812810093537972669 5815637858987907710 5843339154273886481 5853492563969541259 5861120299202720712 5889427623220607598 5894139981954485468 5930921903066597013 5982054456713145175 5982301957308272367 5993641186202759887 6039019299706755220 6058223388240459866 6069084920429552690 6081184427435613425 6122595802395159156 6129680112793956007 6157767976305517645 6204527254872193863 6226935605137460706 6228438360727278425 6234959330473529147 6239806190668238196 6264210999071094134 6286590285374637969 6291718204693366085 6292387828601586677 6302061025246887366 6309472638826974121 6326313998733131322 6354433172222635346 6397304346855829754 6401112344915915313 6401148462939148563 6405680405193945976 6448519796798226837 6484031453704906277 6512497719986700812 6513826621812670112 6530533890861282753 6544974345734087958 6566399398642672561 6579834473090676839 6621790487949612234 6625214681335942150 6663314188895480209 6693789855902467531 6712709467312894320 6717718914232452507 6717758153204456604 6718634283909593554 6723817178915253417 6724018324154009139 6733214521468224556 6791451169274314586 6849830035219710771 6868887530214560675 6875307739395862766 6877009674129308764 6877688511649655393 6917981783876875672 6922453273544444326 6930472100173536864 7015658686947401408 7027329093064373746 7033556098146254401 7057112861939150648 7102668988238845800 7103075415909653568 7205232741199925704 7208156111046447697 7239371569937559235 7264824801484847468 7291860735603772922 7332756504619603456 7351255497712706323 7440585984352182049 7444644815337446288 7472443879873311115 7488903295691459182 7499012724798141513 7515530248534084152 7526924536713926262 7546137128808650790 7571836532480966033 7580373845705565866 7635473576115493505 7645127410936062918 7655123770121344237 7657735425358065140 7663652603258519805 7670658793881702857 7690786938397137076 7698418777281450299 7705950932217390817 7737780248795362977 7793044488027178379 7825267453962769089 7846345358538833070 7873338635961329133 7883755764408400519 7885830164134367917 7897305746937804283 7907538328846580632 7939368677450074148 7991420670746773907 8011978583697526799 8021194844065312699 8055116110493422705 8056489902249842498 8072270608045689991 8102580154154001018 8103083336211256625 8115900751064738556 8145101251056737623 8190399021580899432 8198077324811699005 8224788351379482438 8238226188385523064 8239594726367143742 8252157865059740490 8262336945916860277 8299859668610167686 8356438398657293364 8378811249286025132 8403529396364135691 8437524974508342368 8462208004125780227 8528568230743672924 8550670941007332249 8556313135993774146 8561639293809069618 8603985373642212598 8614373030099302047 8614686597289267972 8631260840073488535 8640953044488024945 8711415978410913465 8712257785382463488 8718128534276024390 8735785354383326087 8778075582309448699 8785390639896972685 8801197233165025071 8811044225692366800 8818200596679671348 8820952187430856082 8863550572474196285 8886837285835047744 8891290782823304311 8895467063680005043 8912565396820307921 8940972889423240305 8942478700892259892 8949643121433375645 8956886022252997528 8957431255572013907 8994268126259578541 9023551771619878496 9051191693801588281 9054236049072137142 9067270598940056940 9071961940126503506 9074725184869160477 9076892907552496863 9122252728732035104 9127038368413264643 9137363053121685325 9171805634896494443 9180689767157768798 9198356853084568483 9206199131299458786 9217772395916010559 9227159859419181011 9247908324408032519 9331411764568925326 9358616259505052506 9406182822008219455 9415840842071216112 9429767562226685209 9442149190036956793 9455028885034662668 9464566580593150645 9466042747199706624 9478988528770584256 9515287724045903576 9517052073279532196 9551405118648508302 9561916979637334969 9562459701796836650 9581733551386760990 9581771767038968747 9586342630786331158 9603055857765200356 9612996919256315217 9618529536799375874 9628515953140410201 9630365080534654947 9633121960800875402 9633782721662654117 9687057333997453485 9733022772062921006 9741376736286082222 9761063462910872116 9789790389102514078 9857785281965863855 9885214388282553400 9908016754310796998 9931371020138013038 9938744576838139162 9953660644480265249 9958984230865286328 9995762773499522972 9998044246550180154 10014926687000178041 10025146219323015407 10034758975512264643 10204449084703163386 10222333544378215799 10227590731961186091 10242990299005180661 10245674649440417728 10273034124215256823 10290984349514156253 10313881028709911832 10340439627154380501 10348894803158157590 10363561610963848710 10374036046157608100 10399826535382686376 10449845709411383710 10481405685358856503 10481568250340334411 10512886238293592428 10598975207455255928 10602861561701095964 10640051151530043076 10708801050770210477 10725919125469771063 10740637716756380007 10767325725610743460 10778385691251381167 10785134153478186524 10827690779706545171 10841528983574366315 10913427744145165718 10913456466979109836 10930474604962333448 10974540203056903914 10980706042777413958 10995063605989727695 11005040544923309853 11040621949945784370 11047803515956873113 11053054944632029318 11069998719366197059 11084807502713315177 11090327025593774465 11107229429729294537 11111817937342561040 11119999515620121484 11130738916920362787 11134554269324002964 11141638562205028198 11171727780741198860 11176817251756638706 11177443191013254140 11178796879783967484 11181330776209984893 11216847206682721566 11239315994665607796 11267147778194192145 11269179194355865947 11276339696328821380 11279174896234369426 11296350436602435415 11316651845082467351 11335455196587074549 11341845164723540276 11359475494093940608 11365378882293515080 11392978230871719912 11393915622261503541 11398429917011920897 11410914970252462323 11451489617058168998 11452972047457620273 11453215220424870568 11455000248391715260 11472556891910984672 11514015857822823966 11519038506612586515 11524904487114362025 11565943745493234826 11573174242108546362 11592704020841378234 11595152316615456093 11671668474925824414 11677792457001087282 11681783944786372864 11685436924411262570 11708489582143407373 11719184001128333827 11740028111241873661 11744507489735970607 11787251136555080956 11796850600635315796 11797634210379425905 11805558592958707347 11827385238880908969 11829814965219873075 11867476617495319915 11916773047792485254 11933504412714422623 11965287719906177167 11977588405849443065 11998250988224458694 11999141369838940591 12004931711055775568 12006510659389259676 12021087538012863937 12027348049601441065 12057414858608862355 12086013273700191401 12090590221952540338 12101350853824551692 12116480797210334736 12122499557437703628 12124197364701944452 12136201068361192889 12141426145713895329 12149613209530861843 12161670135219849388 12162910128148268765 12176666726848957559 12184657721758983366 12190231701223136207 12199576090894140302 12201698664849740825 12204182706904464815 12243392541477405906 12246093600299542227 12252917926998539589 12259170552406406077 12277877677296127606 12284483028804326469 12287886143134097707 12298966923899137510 12312543237413614799 12358345911417866083 12360865232568434178 12381167187026954694 12419439485015093143 12428531934375042218 12485750587157855469 12495766625807295290 12504586180712121732 12505131460885320885 12513787788526195309 12546303270922523576 12549008072334617529 12551482461304518810 12559845347707208868 12561992145556808188 12564719173886604641 12573020530952521426 12576160332136771126 12613154400919610666 12615717518913869012 12617442686977957503 12640136037097116422 12657731831383514641 12679914084384328008 12693845253125738115 12711842799779823566 12731759954452067587 12751403379435544593 12753358604895260442 12789445642687545138 12798819804817613436 12799831692720431606 12809275228138445308 12822006145317172354 12863252726788082341 12871694654880706491 12876790430912925537 12884713009079650536 12907212109698899158 12926111757559829052 12938233214607863675 12947082965923011058 13019855320474633601 13139835967373580197 13157569845392192980 13172151036707188008 13174156130489589259 13176873074684933173 13228465052302776848 13235235503675202315 13297524904943969671 13301616853601487612 13306174429239092860 13316586615448391595 13335825363913223303 13375378024710809687 13384728951769814402 13395801473770283783 13408296917155329136 13423771346381941839 13444571389653558072 13502321945852064995 13510482267005026044 13510726872773599747 13511130454309991783 13540575643496649002 13549134663156464134 13556549587535364048 13561260810484601893 13578579259085331915 13581350027334467935 13622538240795064569 13624714716354873478 13626659823241274347 13638161499232628281 13666265536985001617 13681561526327923281 13705173911591625951 13714085512108380123 13727022089928120496 13732000544042933786 13754184304197391627 13767424573350481127 13809453208600244796 13845807701971171375 13846701961868186252 13859526673791804815 13860674230964212100 13861149901633406010 13908202435518217221 13929123889909527928 13961978781606020534 13964826419295147698 14007876836824749378 14016336780783961827 14046989880034577653 14067326053236308490 14092128261446153532 14100183073125431475 14116522935598980742 14132911165661432309 14196060958452726105 14202393961074904610 14280318331874935641 14303349428687866908 14335663593010625935 14360791428385775966 14371187070381473895 14381669874982257138 14398011543158476258 14424013405356857136 14438780824742159879 14461157090073029467 14461933956672606899 14527355579135310087 14534033690354589384 14541682839762729567 14560317034722161307 14582669966283575896 14653921225378654722 14687491150241706442 14693608113124898879 14694195810713237086 14720601726035247222 14754229739988711069 14756110371813382289 14770309192276666377 14774545980110615861 14787809585067508661 14790801346110165198 14796781634528156609 14803713213460222720 14834282099719161043 14855551396016698023 14866584337057815841 14868313889325575441 14870582660467514889 14874009313963108972 14907509012870222631 14934291233559625771 14961911716481457233 14964521027656085946 14981715498802485833 15000584582866082954 15031137278783465793 15069721761431400144 15089707190184892813 15116232469061996279 15119612342589228281 15128028030834375244 15128984368771724569 15133574236455325772 15141323324012209811 15167969547945386854 15169310009706213583 15174646892172839988 15185873851244043545 15202633330033675692 15219487486460400450 15221338514252329734 15270485187613537635 15281494068442657272 15287554106349858201 15303942343209717085 15336912830860837473 15412525051915059845 15455601724701119743 15481469027547937662 15487377645432403817 15515734929656086581 15532306004969835864 15560222119735462886 15632210230412959228 15636852522510150939 15643629331089780768 15652479237222080001 15653896627055432270 15667285108168781378 15708170260773137186 15713413728449174044 15720027086197707262 15729349021190271542 15735583321579202388 15735759092873488595 15745358426260328121 15764954010118078995 15779496742624232467 15806165553772348700 15809390165028149956 15825268464146169731 15844714064773142625 15866503434368717758 15871679735227625372 15898976300027716344 15902834374448589266 15922385490858634054 15947759607344212027 15978854866575838787 15982981901015633720 15994824189580480432 16112008413827320953 16130414978236778514 16132355002787777827 16135127314474667602 16151828398499280137 16158084674112102140 16171989955233546233 16236441608251977144 16244354059025532774 16251066955030013483 16284974729401670488 16289303842375757246 16320819238549566640 16329675714826505352 16333326358506605409 16347011788921492890 16427525400591667568 16427749970558117869 16443501689015366503 16460548180955576221 16477528203163888087 16521482026588482686 16526105075062674086 16545392546763320052 16546810823750687837 16554004929398225335 16593436716477966386 16598161369374376407 16608118181674909446 16617183059639890337 16619215500723858111 16662705291278487286 16677804264275147927 16687468113332860289 16698969302577476022 16739054061832887621 16757872331193847040 16763961953474814391 16777393635175491247 16780055678693671154 16821565197793784339 16858730414458357715 16872094515456737521 16873552189140854937 16902555060652314555 16906801939421466533 16929173415425141435 16931181054570946630 16979101413179288859 17053730132131166885 17058059870140217427 17073377748732217181 17096264719998747615 17106019779378066878 17120578524607323587 17129418754368322074 17131466881223887486 17142702691677814967 17154831021258433677 17189769183852370956 17199171132469148917 17203335279937830747 17283702439493380040 17296115009308373156 17302468671702612402 17330519632558949716 17334269716688271775 17338170422341774650 17369733249145137396 17421909005908162094 17426027380875724448 17430259661958761802 17445977813668859049 17470712793591877915 17528948932058139007 17557280106825493939 17567353725339836512 17568002401357588177 17586345259046142688 17597993617749355540 17621087819661226286 17631237219748688940 17635276844582032647 17635361768673860152 17640852949090881270 17662906302719678763 17664978114471119642 17751391837262815133 17759325656219261591 17763239635998161474 17764472495613008254 17792984543856422958 17825455509158154974 17846634796721846460 17881880604287390073 17885345638400282040 17907436764908666234 17932109953992422539 17944157459325657746 17957682902249674734 17989185283151050948 18013077008371032545 18018835669173664920 18052598582573068244 18064201749047980902 18066579598376730186 18133752378826515099 18164269840019466747 18167524467320077454 18169868107067917494 18176755427527384576 18186480836159579682 18187020067099159622 18192788056068080606 18263510931021761488 18295114601835593702 18306881357261512034 18322062251460296974 18330123213578917587 18338439087981135629 18338773157184001262 18358410897743492586 18358741702308238862 18371903419991863158 18393072999466568861 18435174670601094182 \n"
  },
  {
    "path": "tests/test-data/sketch_fromfile/salmonella-badseq.csv",
    "content": "ident,full_ident,name,genome_filename,protein_filename\r\nGCA_903797575,GCA_903797575.1,GCA_903797575 Salmonella enterica,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_protein.faa.gz,\r\n"
  },
  {
    "path": "tests/test-data/sketch_fromfile/salmonella-missing.csv",
    "content": "ident,full_ident,name,genome_filename,protein_filename\r\nGCA_903797575,GCA_903797575.1,GCA_903797575 Salmonella enterica,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz,\r\n"
  },
  {
    "path": "tests/test-data/sketch_fromfile/salmonella-mult.csv",
    "content": "ident,full_ident,name,genome_filename,protein_filename\r\nGCA_903797575,GCA_903797575.1,GCA_903797575 Salmonella enterica,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_protein.faa.gz\r\nxxGCA_903797575,xxGCA_903797575.1,xxGCA_903797575 Salmonella enterica,sketch_fromfile/xxGCA_903797575.1_PARATYPHIC668_genomic.fna.gz,sketch_fromfile/xxGCA_903797575.1_PARATYPHIC668_protein.faa.gz\r\n"
  },
  {
    "path": "tests/test-data/sketch_fromfile/salmonella-noname.csv",
    "content": "ident,full_ident,name,genome_filename,protein_filename\r\nGCA_903797575,GCA_903797575.1,,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_protein.faa.gz\r\n"
  },
  {
    "path": "tests/test-data/sketch_fromfile/salmonella.csv",
    "content": "ident,full_ident,name,genome_filename,protein_filename\r\nGCA_903797575,GCA_903797575.1,GCA_903797575 Salmonella enterica,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz,sketch_fromfile/GCA_903797575.1_PARATYPHIC668_protein.faa.gz\r\n"
  },
  {
    "path": "tests/test-data/sqlite/README.md",
    "content": "# test files for SqliteIndex etc. functionality\n\n`prot.sqlmf` is a SQL version of the manifest in `tests/test-data/prot/all.zip`.\n\n`delmont-6.csv` is a fixed-up version of `tests/test-data/lca/delmont-6.csv` that works with `sourmash tax`.\n\n`lca.sqldb` is an `LCA_SqliteDatabase` created with `TARA_ASE_MAG_00031` and `TARA_PSW_MAG_00136`, using the lineage in `delmont-6.csv`.\n\n`test.taxonomy.db` is a SqliteLineage v1.0 lineage db created with `sourmash tax prepare` from `tests/test-data/tax/test.taxonomy.db`.\n\n`index.sqldb` is a k=31 sqldb created from `tests/test-data/{47,63}.fa.sig`.\n\n`shewanella-lineage.csv` is a hand-hacked file containing lineages for 47 and 63.\n\n`lca2.sqldb` is an `LCA_SqliteDatabase` created from `tests/test-data/{47,63}.fa.sig` and `shewanella-lineage.csv`.\n"
  },
  {
    "path": "tests/test-data/sqlite/delmont-6.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nTARA_ASE_MAG_00031,Bacteria,Proteobacteria,,,Alteromonadaceae,,\nTARA_PSW_MAG_00136,Eukaryota,Chlorophyta,Prasinophyceae,,,Ostreococcus,na\n"
  },
  {
    "path": "tests/test-data/sqlite/shewanella-lineage.csv",
    "content": "identifiers,superkingdom,phylum,class,order,family,genus,species,strain\r\nNC_009665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica,\r\nNC_011663.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica,\r\n"
  },
  {
    "path": "tests/test-data/subset.sbt.json",
    "content": "{\"storage\": {\"args\": {\"path\": \".sbt.subset\"}, \"backend\": \"FSStorage\"}, \"version\": 5, \"d\": 2, \"nodes\": {\"0\": {\"name\": \"internal.0\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.0\"}, \"1\": {\"name\": \"internal.1\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.1\"}, \"2\": {\"name\": \"internal.2\", \"metadata\": {\"min_n_below\": 870}, \"filename\": \"internal.2\"}, \"3\": {\"name\": \"internal.3\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.3\"}, \"4\": {\"name\": \"internal.4\", \"metadata\": {\"min_n_below\": 652}, \"filename\": \"internal.4\"}, \"5\": {\"name\": \"internal.5\", \"metadata\": {\"min_n_below\": 870}, \"filename\": \"internal.5\"}, \"6\": {\"name\": \"internal.6\", \"metadata\": {\"min_n_below\": 970}, \"filename\": \"internal.6\"}, \"7\": {\"name\": \"internal.7\", \"metadata\": {\"min_n_below\": 522}, \"filename\": \"internal.7\"}, \"8\": {\"name\": \"internal.8\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.8\"}, \"9\": {\"name\": \"internal.9\", \"metadata\": {\"min_n_below\": 1378}, \"filename\": \"internal.9\"}, \"10\": {\"name\": \"internal.10\", \"metadata\": {\"min_n_below\": 652}, \"filename\": \"internal.10\"}, \"11\": {\"name\": \"internal.11\", \"metadata\": {\"min_n_below\": 1385}, \"filename\": \"internal.11\"}, \"12\": {\"name\": \"internal.12\", \"metadata\": {\"min_n_below\": 870}, \"filename\": \"internal.12\"}, \"13\": {\"name\": \"internal.13\", \"metadata\": {\"min_n_below\": 1064}, \"filename\": \"internal.13\"}, \"14\": {\"name\": \"internal.14\", \"metadata\": {\"min_n_below\": 970}, \"filename\": \"internal.14\"}, \"15\": {\"name\": \"internal.15\", \"metadata\": {\"min_n_below\": 522}, \"filename\": \"internal.15\"}, \"16\": {\"name\": \"internal.16\", \"metadata\": {\"min_n_below\": 1032}, \"filename\": \"internal.16\"}, \"17\": {\"name\": \"internal.17\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.17\"}, \"18\": {\"name\": \"internal.18\", \"metadata\": {\"min_n_below\": 424}, \"filename\": \"internal.18\"}, \"19\": {\"name\": \"internal.19\", \"metadata\": {\"min_n_below\": 1378}, \"filename\": \"internal.19\"}, \"20\": {\"name\": \"internal.20\", \"metadata\": {\"min_n_below\": 1509}, \"filename\": \"internal.20\"}, \"21\": {\"name\": \"internal.21\", \"metadata\": {\"min_n_below\": 993}, \"filename\": \"internal.21\"}, \"22\": {\"name\": \"internal.22\", \"metadata\": {\"min_n_below\": 652}, \"filename\": \"internal.22\"}, \"23\": {\"name\": \"internal.23\", \"metadata\": {\"min_n_below\": 1385}, \"filename\": \"internal.23\"}, \"24\": {\"name\": \"internal.24\", \"metadata\": {\"min_n_below\": 2159}, \"filename\": \"internal.24\"}, \"25\": {\"name\": \"internal.25\", \"metadata\": {\"min_n_below\": 870}, \"filename\": \"internal.25\"}, \"26\": {\"name\": \"internal.26\", \"metadata\": {\"min_n_below\": 1109}, \"filename\": \"internal.26\"}, \"27\": {\"name\": \"internal.27\", \"metadata\": {\"min_n_below\": 1166}, \"filename\": \"internal.27\"}, \"28\": {\"name\": \"internal.28\", \"metadata\": {\"min_n_below\": 1064}, \"filename\": \"internal.28\"}, \"29\": {\"name\": \"internal.29\", \"metadata\": {\"min_n_below\": 970}, \"filename\": \"internal.29\"}, \"30\": {\"name\": \"internal.30\", \"metadata\": {\"min_n_below\": 2215}, \"filename\": \"internal.30\"}, \"31\": {\"name\": \"internal.31\", \"metadata\": {\"min_n_below\": 522}, \"filename\": \"internal.31\"}, \"32\": {\"name\": \"internal.32\", \"metadata\": {\"min_n_below\": 1946}, \"filename\": \"internal.32\"}, \"33\": {\"name\": \"internal.33\", \"metadata\": {\"min_n_below\": 1158}, \"filename\": \"internal.33\"}, \"34\": {\"name\": \"internal.34\", \"metadata\": {\"min_n_below\": 1032}, \"filename\": \"internal.34\"}, \"35\": {\"name\": \"internal.35\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.35\"}, \"36\": {\"name\": \"internal.36\", \"metadata\": {\"min_n_below\": 1396}, \"filename\": \"internal.36\"}, \"37\": {\"name\": \"internal.37\", \"metadata\": {\"min_n_below\": 424}, \"filename\": \"internal.37\"}, \"38\": {\"name\": \"internal.38\", \"metadata\": {\"min_n_below\": 1406}, \"filename\": \"internal.38\"}, \"39\": {\"name\": \"internal.39\", \"metadata\": {\"min_n_below\": 1378}, \"filename\": \"internal.39\"}, \"40\": {\"name\": \"internal.40\", \"metadata\": {\"min_n_below\": 1390}, \"filename\": \"internal.40\"}, \"41\": {\"name\": \"internal.41\", \"metadata\": {\"min_n_below\": 1509}, \"filename\": \"internal.41\"}, \"42\": {\"name\": \"internal.42\", \"metadata\": {\"min_n_below\": 1588}, \"filename\": \"internal.42\"}, \"43\": {\"name\": \"internal.43\", \"metadata\": {\"min_n_below\": 993}, \"filename\": \"internal.43\"}, \"44\": {\"name\": \"internal.44\", \"metadata\": {\"min_n_below\": 1027}, \"filename\": \"internal.44\"}, \"45\": {\"name\": \"internal.45\", \"metadata\": {\"min_n_below\": 652}, \"filename\": \"internal.45\"}, \"46\": {\"name\": \"internal.46\", \"metadata\": {\"min_n_below\": 1403}, \"filename\": \"internal.46\"}, \"47\": {\"name\": \"internal.47\", \"metadata\": {\"min_n_below\": 1422}, \"filename\": \"internal.47\"}, \"48\": {\"name\": \"internal.48\", \"metadata\": {\"min_n_below\": 1385}, \"filename\": \"internal.48\"}, \"49\": {\"name\": \"internal.49\", \"metadata\": {\"min_n_below\": 3270}, \"filename\": \"internal.49\"}, \"50\": {\"name\": \"internal.50\", \"metadata\": {\"min_n_below\": 2159}, \"filename\": \"internal.50\"}, \"51\": {\"name\": \"internal.51\", \"metadata\": {\"min_n_below\": 870}, \"filename\": \"internal.51\"}, \"52\": {\"name\": \"internal.52\", \"metadata\": {\"min_n_below\": 1766}, \"filename\": \"internal.52\"}, \"53\": {\"name\": \"internal.53\", \"metadata\": {\"min_n_below\": 1109}, \"filename\": \"internal.53\"}, \"54\": {\"name\": \"internal.54\", \"metadata\": {\"min_n_below\": 1482}, \"filename\": \"internal.54\"}, \"55\": {\"name\": \"internal.55\", \"metadata\": {\"min_n_below\": 1166}, \"filename\": \"internal.55\"}, \"56\": {\"name\": \"internal.56\", \"metadata\": {\"min_n_below\": 1422}, \"filename\": \"internal.56\"}, \"57\": {\"name\": \"internal.57\", \"metadata\": {\"min_n_below\": 1064}, \"filename\": \"internal.57\"}, \"58\": {\"name\": \"internal.58\", \"metadata\": {\"min_n_below\": 1081}, \"filename\": \"internal.58\"}, \"59\": {\"name\": \"internal.59\", \"metadata\": {\"min_n_below\": 970}, \"filename\": \"internal.59\"}, \"60\": {\"name\": \"internal.60\", \"metadata\": {\"min_n_below\": 1679}, \"filename\": \"internal.60\"}, \"61\": {\"name\": \"internal.61\", \"metadata\": {\"min_n_below\": 2215}, \"filename\": \"internal.61\"}, \"62\": {\"name\": \"internal.62\", \"metadata\": {\"min_n_below\": 2330}, \"filename\": \"internal.62\"}, \"63\": {\"name\": \"internal.63\", \"metadata\": {\"min_n_below\": 927}, \"filename\": \"internal.63\"}, \"64\": {\"name\": \"internal.64\", \"metadata\": {\"min_n_below\": 522}, \"filename\": \"internal.64\"}, \"65\": {\"name\": \"internal.65\", \"metadata\": {\"min_n_below\": 2159}, \"filename\": \"internal.65\"}, \"66\": {\"name\": \"internal.66\", \"metadata\": {\"min_n_below\": 1946}, \"filename\": \"internal.66\"}, \"67\": {\"name\": \"internal.67\", \"metadata\": {\"min_n_below\": 2427}, \"filename\": \"internal.67\"}, \"68\": {\"name\": \"internal.68\", \"metadata\": {\"min_n_below\": 1158}, \"filename\": \"internal.68\"}, \"69\": {\"name\": \"internal.69\", \"metadata\": {\"min_n_below\": 1032}, \"filename\": \"internal.69\"}, \"70\": {\"name\": \"internal.70\", \"metadata\": {\"min_n_below\": 1104}, \"filename\": \"internal.70\"}, \"71\": {\"name\": \"internal.71\", \"metadata\": {\"min_n_below\": 314}, \"filename\": \"internal.71\"}, \"72\": {\"name\": \"internal.72\", \"metadata\": {\"min_n_below\": 1410}, \"filename\": \"internal.72\"}, \"73\": {\"name\": \"internal.73\", \"metadata\": {\"min_n_below\": 1396}, \"filename\": \"internal.73\"}, \"74\": {\"name\": \"internal.74\", \"metadata\": {\"min_n_below\": 1618}, \"filename\": \"internal.74\"}, \"75\": {\"name\": \"internal.75\", \"metadata\": {\"min_n_below\": 1921}, \"filename\": \"internal.75\"}, \"76\": {\"name\": \"internal.76\", \"metadata\": {\"min_n_below\": 424}, \"filename\": \"internal.76\"}, \"77\": {\"name\": \"internal.77\", \"metadata\": {\"min_n_below\": 1406}, \"filename\": \"internal.77\"}, \"78\": {\"name\": \"internal.78\", \"metadata\": {\"min_n_below\": 2161}, \"filename\": \"internal.78\"}, \"79\": {\"name\": \"internal.79\", \"metadata\": {\"min_n_below\": 1378}, \"filename\": \"internal.79\"}, \"80\": {\"name\": \"internal.80\", \"metadata\": {\"min_n_below\": 3023}, \"filename\": \"internal.80\"}, \"81\": {\"name\": \"internal.81\", \"metadata\": {\"min_n_below\": 1428}, \"filename\": \"internal.81\"}, \"82\": {\"name\": \"internal.82\", \"metadata\": {\"min_n_below\": 1390}, \"filename\": \"internal.82\"}, \"83\": {\"name\": \"internal.83\", \"metadata\": {\"min_n_below\": 1509}, \"filename\": \"internal.83\"}, \"84\": {\"name\": \"internal.84\", \"metadata\": {\"min_n_below\": 2165}, \"filename\": \"internal.84\"}, \"85\": {\"name\": \"internal.85\", \"metadata\": {\"min_n_below\": 1588}, \"filename\": \"internal.85\"}, \"86\": {\"name\": \"internal.86\", \"metadata\": {\"min_n_below\": 1888}, \"filename\": \"internal.86\"}, \"87\": {\"name\": \"internal.87\", \"metadata\": {\"min_n_below\": 993}, \"filename\": \"internal.87\"}, \"88\": {\"name\": \"internal.88\", \"metadata\": {\"min_n_below\": 1002}, \"filename\": \"internal.88\"}, \"89\": {\"name\": \"internal.89\", \"metadata\": {\"min_n_below\": 1027}, \"filename\": \"internal.89\"}, \"90\": {\"name\": \"internal.90\", \"metadata\": {\"min_n_below\": 1037}, \"filename\": \"internal.90\"}, \"91\": {\"name\": \"internal.91\", \"metadata\": {\"min_n_below\": 1973}, \"filename\": \"internal.91\"}, \"92\": {\"name\": \"internal.92\", \"metadata\": {\"min_n_below\": 652}, \"filename\": \"internal.92\"}, \"93\": {\"name\": \"internal.93\", \"metadata\": {\"min_n_below\": 1403}, \"filename\": \"internal.93\"}, \"94\": {\"name\": \"internal.94\", \"metadata\": {\"min_n_below\": 2910}, \"filename\": \"internal.94\"}, \"95\": {\"name\": \"internal.95\", \"metadata\": {\"min_n_below\": 1433}, \"filename\": \"internal.95\"}, \"96\": {\"name\": \"internal.96\", \"metadata\": {\"min_n_below\": 1422}, \"filename\": \"internal.96\"}, \"97\": {\"name\": \"internal.97\", \"metadata\": {\"min_n_below\": 1395}, \"filename\": \"internal.97\"}, \"98\": {\"name\": \"internal.98\", \"metadata\": {\"min_n_below\": 1385}, \"filename\": \"internal.98\"}}, \"factory\": {\"class\": \"GraphFactory\", \"args\": [1, 100000, 4]}, \"leaves\": {\"99\": {\"name\": \"a573351886e921b7204064508010fde0\", \"metadata\": \"a573351886e921b7204064508010fde0\", \"filename\": \"a573351886e921b7204064508010fde0\"}, \"100\": {\"name\": \"da939f28327bdd52576eec2c516a9ad3\", \"metadata\": \"da939f28327bdd52576eec2c516a9ad3\", \"filename\": \"da939f28327bdd52576eec2c516a9ad3\"}, \"101\": {\"name\": \"0418b8351b86bb41c8224d9d15474614\", \"metadata\": \"0418b8351b86bb41c8224d9d15474614\", \"filename\": \"0418b8351b86bb41c8224d9d15474614\"}, \"102\": {\"name\": \"978c4674f45437d4e84d0a0fc11c424b\", \"metadata\": \"978c4674f45437d4e84d0a0fc11c424b\", \"filename\": \"978c4674f45437d4e84d0a0fc11c424b\"}, \"103\": {\"name\": \"edbfe6ac404682ef420377507d52ca4d\", \"metadata\": \"edbfe6ac404682ef420377507d52ca4d\", \"filename\": \"edbfe6ac404682ef420377507d52ca4d\"}, \"104\": {\"name\": \"56b9e7bddb830ebe3faaf9923322b51e\", \"metadata\": \"56b9e7bddb830ebe3faaf9923322b51e\", \"filename\": \"56b9e7bddb830ebe3faaf9923322b51e\"}, \"105\": {\"name\": \"802dc6bf5787992180db6ca259313edf\", \"metadata\": \"802dc6bf5787992180db6ca259313edf\", \"filename\": \"802dc6bf5787992180db6ca259313edf\"}, \"106\": {\"name\": \"95fd78a08b85bfc006555fe7cbd7e3de\", \"metadata\": \"95fd78a08b85bfc006555fe7cbd7e3de\", \"filename\": \"95fd78a08b85bfc006555fe7cbd7e3de\"}, \"107\": {\"name\": \"81d3020367359d305b0e21933faece1b\", \"metadata\": \"81d3020367359d305b0e21933faece1b\", \"filename\": \"81d3020367359d305b0e21933faece1b\"}, \"108\": {\"name\": \"0f6508728e178731f3884f59dc7ff3c3\", \"metadata\": \"0f6508728e178731f3884f59dc7ff3c3\", \"filename\": \"0f6508728e178731f3884f59dc7ff3c3\"}, \"109\": {\"name\": \"857129e817ea9f95c22893d652c98a23\", \"metadata\": \"857129e817ea9f95c22893d652c98a23\", \"filename\": \"857129e817ea9f95c22893d652c98a23\"}, \"110\": {\"name\": \"43637330e78d1518b4d8f7603fdb6899\", \"metadata\": \"43637330e78d1518b4d8f7603fdb6899\", \"filename\": \"43637330e78d1518b4d8f7603fdb6899\"}, \"111\": {\"name\": \"849cf867719c1edecd4ec5cf2fb01a32\", \"metadata\": \"849cf867719c1edecd4ec5cf2fb01a32\", \"filename\": \"849cf867719c1edecd4ec5cf2fb01a32\"}, \"112\": {\"name\": \"f13c7b1cf4a5280dcc066d583c09bf78\", \"metadata\": \"f13c7b1cf4a5280dcc066d583c09bf78\", \"filename\": \"f13c7b1cf4a5280dcc066d583c09bf78\"}, \"113\": {\"name\": \"e2057ff9c72f6820163717d7ca69bf55\", \"metadata\": \"e2057ff9c72f6820163717d7ca69bf55\", \"filename\": \"e2057ff9c72f6820163717d7ca69bf55\"}, \"114\": {\"name\": \"d719ca7fca663697fd096fb757b89920\", \"metadata\": \"d719ca7fca663697fd096fb757b89920\", \"filename\": \"d719ca7fca663697fd096fb757b89920\"}, \"115\": {\"name\": \"5d19af7826508594c035efe76443138c\", \"metadata\": \"5d19af7826508594c035efe76443138c\", \"filename\": \"5d19af7826508594c035efe76443138c\"}, \"116\": {\"name\": \"e1595bc3bec4961c61a5304c1df226f0\", \"metadata\": \"e1595bc3bec4961c61a5304c1df226f0\", \"filename\": \"e1595bc3bec4961c61a5304c1df226f0\"}, \"117\": {\"name\": \"43fcce1eeeebc8d40162d5247202aef8\", \"metadata\": \"43fcce1eeeebc8d40162d5247202aef8\", \"filename\": \"43fcce1eeeebc8d40162d5247202aef8\"}, \"118\": {\"name\": \"09cc8e435e5570a5ba3b086bed8c831f\", \"metadata\": \"09cc8e435e5570a5ba3b086bed8c831f\", \"filename\": \"09cc8e435e5570a5ba3b086bed8c831f\"}, \"119\": {\"name\": \"1131a68ec746703c8c4a2bd13557bf6a\", \"metadata\": \"1131a68ec746703c8c4a2bd13557bf6a\", \"filename\": \"1131a68ec746703c8c4a2bd13557bf6a\"}, \"120\": {\"name\": \"9d3cbd4300d2ca17479b351d152ea677\", \"metadata\": \"9d3cbd4300d2ca17479b351d152ea677\", \"filename\": \"9d3cbd4300d2ca17479b351d152ea677\"}, \"121\": {\"name\": \"85ac23fb1585cbe148318b4947a702b7\", \"metadata\": \"85ac23fb1585cbe148318b4947a702b7\", \"filename\": \"85ac23fb1585cbe148318b4947a702b7\"}, \"122\": {\"name\": \"e0de0a27b7e73c2def0370febf06b399\", \"metadata\": \"e0de0a27b7e73c2def0370febf06b399\", \"filename\": \"e0de0a27b7e73c2def0370febf06b399\"}, \"123\": {\"name\": \"c787b5e7ee5160e73735755b872c0a41\", \"metadata\": \"c787b5e7ee5160e73735755b872c0a41\", \"filename\": \"c787b5e7ee5160e73735755b872c0a41\"}, \"124\": {\"name\": \"ecc266c69b70073c8b0f6682498d0675\", \"metadata\": \"ecc266c69b70073c8b0f6682498d0675\", \"filename\": \"ecc266c69b70073c8b0f6682498d0675\"}, \"125\": {\"name\": \"6381609c5cdcd210887f5add4bab44d9\", \"metadata\": \"6381609c5cdcd210887f5add4bab44d9\", \"filename\": \"6381609c5cdcd210887f5add4bab44d9\"}, \"126\": {\"name\": \"175e67b69e1833bdee0859a3a99495b1\", \"metadata\": \"175e67b69e1833bdee0859a3a99495b1\", \"filename\": \"175e67b69e1833bdee0859a3a99495b1\"}, \"127\": {\"name\": \"8f9573dec32c97fe824c06edaa16c979\", \"metadata\": \"8f9573dec32c97fe824c06edaa16c979\", \"filename\": \"8f9573dec32c97fe824c06edaa16c979\"}, \"128\": {\"name\": \"c4bcae8b1308ed48980134bb4d83f804\", \"metadata\": \"c4bcae8b1308ed48980134bb4d83f804\", \"filename\": \"c4bcae8b1308ed48980134bb4d83f804\"}, \"129\": {\"name\": \"9893ff8c4def73d5566baa3541b0a806\", \"metadata\": \"9893ff8c4def73d5566baa3541b0a806\", \"filename\": \"9893ff8c4def73d5566baa3541b0a806\"}, \"130\": {\"name\": \"de7c51531b29594960229029a8eb6bd3\", \"metadata\": \"de7c51531b29594960229029a8eb6bd3\", \"filename\": \"de7c51531b29594960229029a8eb6bd3\"}, \"131\": {\"name\": \"01bb2bac3849b82dee57a6ecf8725432\", \"metadata\": \"01bb2bac3849b82dee57a6ecf8725432\", \"filename\": \"01bb2bac3849b82dee57a6ecf8725432\"}, \"132\": {\"name\": \"736138545b801b99385439231a69ab77\", \"metadata\": \"736138545b801b99385439231a69ab77\", \"filename\": \"736138545b801b99385439231a69ab77\"}, \"133\": {\"name\": \"c2e8e26fb3377705376b1d6d434e1233\", \"metadata\": \"c2e8e26fb3377705376b1d6d434e1233\", \"filename\": \"c2e8e26fb3377705376b1d6d434e1233\"}, \"134\": {\"name\": \"a893a18ca62dd4e2bcb3c9aaf9c1957b\", \"metadata\": \"a893a18ca62dd4e2bcb3c9aaf9c1957b\", \"filename\": \"a893a18ca62dd4e2bcb3c9aaf9c1957b\"}, \"135\": {\"name\": \"b3068619013f7ce1bddaa4a67305a571\", \"metadata\": \"b3068619013f7ce1bddaa4a67305a571\", \"filename\": \"b3068619013f7ce1bddaa4a67305a571\"}, \"136\": {\"name\": \"7d859a1c0be4c97c9e1c6c8272950772\", \"metadata\": \"7d859a1c0be4c97c9e1c6c8272950772\", \"filename\": \"7d859a1c0be4c97c9e1c6c8272950772\"}, \"137\": {\"name\": \"3e18cd65bcc35fa150185fea0f162549\", \"metadata\": \"3e18cd65bcc35fa150185fea0f162549\", \"filename\": \"3e18cd65bcc35fa150185fea0f162549\"}, \"138\": {\"name\": \"7e22d796abc7a6c49dadb94c4dae16b3\", \"metadata\": \"7e22d796abc7a6c49dadb94c4dae16b3\", \"filename\": \"7e22d796abc7a6c49dadb94c4dae16b3\"}, \"139\": {\"name\": \"a20adff6c30627dc22e74d57d7f9b7db\", \"metadata\": \"a20adff6c30627dc22e74d57d7f9b7db\", \"filename\": \"a20adff6c30627dc22e74d57d7f9b7db\"}, \"140\": {\"name\": \"7574dd67e829221b9ae553692c2d5258\", \"metadata\": \"7574dd67e829221b9ae553692c2d5258\", \"filename\": \"7574dd67e829221b9ae553692c2d5258\"}, \"141\": {\"name\": \"b476935e55355147395b4d4ac5c7fc8d\", \"metadata\": \"b476935e55355147395b4d4ac5c7fc8d\", \"filename\": \"b476935e55355147395b4d4ac5c7fc8d\"}, \"142\": {\"name\": \"3988811e454e96213af488031d84eed9\", \"metadata\": \"3988811e454e96213af488031d84eed9\", \"filename\": \"3988811e454e96213af488031d84eed9\"}, \"143\": {\"name\": \"8963a3ad29f88d2b9869c51ac102ddf6\", \"metadata\": \"8963a3ad29f88d2b9869c51ac102ddf6\", \"filename\": \"8963a3ad29f88d2b9869c51ac102ddf6\"}, \"144\": {\"name\": \"8bdbd61dd2e99b7716968338bcfe9660\", \"metadata\": \"8bdbd61dd2e99b7716968338bcfe9660\", \"filename\": \"8bdbd61dd2e99b7716968338bcfe9660\"}, \"145\": {\"name\": \"4f1bf83d739fa4d420ceb0aae9403400\", \"metadata\": \"4f1bf83d739fa4d420ceb0aae9403400\", \"filename\": \"4f1bf83d739fa4d420ceb0aae9403400\"}, \"146\": {\"name\": \"8276440e3138e74a1c91b4d91f21072b\", \"metadata\": \"8276440e3138e74a1c91b4d91f21072b\", \"filename\": \"8276440e3138e74a1c91b4d91f21072b\"}, \"147\": {\"name\": \"205c4b9623e7331a907f293865925dfa\", \"metadata\": \"205c4b9623e7331a907f293865925dfa\", \"filename\": \"205c4b9623e7331a907f293865925dfa\"}, \"148\": {\"name\": \"b23715f6943b9a84bd64315d27cc8bd5\", \"metadata\": \"b23715f6943b9a84bd64315d27cc8bd5\", \"filename\": \"b23715f6943b9a84bd64315d27cc8bd5\"}, \"149\": {\"name\": \"a04ede5f60924719bfaabef59c1de821\", \"metadata\": \"a04ede5f60924719bfaabef59c1de821\", \"filename\": \"a04ede5f60924719bfaabef59c1de821\"}, \"150\": {\"name\": \"c6487fc895704808bfbd28461eb5406d\", \"metadata\": \"c6487fc895704808bfbd28461eb5406d\", \"filename\": \"c6487fc895704808bfbd28461eb5406d\"}, \"151\": {\"name\": \"2b28f083395d8f5e7b88c1899ff4a212\", \"metadata\": \"2b28f083395d8f5e7b88c1899ff4a212\", \"filename\": \"2b28f083395d8f5e7b88c1899ff4a212\"}, \"152\": {\"name\": \"2ac8b6220c4d44ae3dbbbfc7e939df61\", \"metadata\": \"2ac8b6220c4d44ae3dbbbfc7e939df61\", \"filename\": \"2ac8b6220c4d44ae3dbbbfc7e939df61\"}, \"153\": {\"name\": \"2d8b4d96cf9d790c1b225e681f8d57dd\", \"metadata\": \"2d8b4d96cf9d790c1b225e681f8d57dd\", \"filename\": \"2d8b4d96cf9d790c1b225e681f8d57dd\"}, \"154\": {\"name\": \"1bc3dc1d05e30383d4d098b7de944951\", \"metadata\": \"1bc3dc1d05e30383d4d098b7de944951\", \"filename\": \"1bc3dc1d05e30383d4d098b7de944951\"}, \"155\": {\"name\": \"f20e83bfa143ade475b9403b9e21641f\", \"metadata\": \"f20e83bfa143ade475b9403b9e21641f\", \"filename\": \"f20e83bfa143ade475b9403b9e21641f\"}, \"156\": {\"name\": \"46656e34e01f58e22f22a622f44fa658\", \"metadata\": \"46656e34e01f58e22f22a622f44fa658\", \"filename\": \"46656e34e01f58e22f22a622f44fa658\"}, \"157\": {\"name\": \"9f1f319740e92e9632ce9255f0c57114\", \"metadata\": \"9f1f319740e92e9632ce9255f0c57114\", \"filename\": \"9f1f319740e92e9632ce9255f0c57114\"}, \"158\": {\"name\": \"bd0ce2248788b643ddfb8276aea4b659\", \"metadata\": \"bd0ce2248788b643ddfb8276aea4b659\", \"filename\": \"bd0ce2248788b643ddfb8276aea4b659\"}, \"159\": {\"name\": \"c3569a0e65500c3fd92ae9b8c3ac617b\", \"metadata\": \"c3569a0e65500c3fd92ae9b8c3ac617b\", \"filename\": \"c3569a0e65500c3fd92ae9b8c3ac617b\"}, \"160\": {\"name\": \"5c07a864e3f86a705a73b89bd517979f\", \"metadata\": \"5c07a864e3f86a705a73b89bd517979f\", \"filename\": \"5c07a864e3f86a705a73b89bd517979f\"}, \"161\": {\"name\": \"57c3b9f54148e7ea9ebfdabbe530f131\", \"metadata\": \"57c3b9f54148e7ea9ebfdabbe530f131\", \"filename\": \"57c3b9f54148e7ea9ebfdabbe530f131\"}, \"162\": {\"name\": \"bf69634e838466bf0b83aa42a5fd1cd1\", \"metadata\": \"bf69634e838466bf0b83aa42a5fd1cd1\", \"filename\": \"bf69634e838466bf0b83aa42a5fd1cd1\"}, \"163\": {\"name\": \"f8f0617cdbe162dec828ac596feae35d\", \"metadata\": \"f8f0617cdbe162dec828ac596feae35d\", \"filename\": \"f8f0617cdbe162dec828ac596feae35d\"}, \"164\": {\"name\": \"5d813a4d317f9ad17154a99d296d081b\", \"metadata\": \"5d813a4d317f9ad17154a99d296d081b\", \"filename\": \"5d813a4d317f9ad17154a99d296d081b\"}, \"165\": {\"name\": \"66d40738bd608b83ef35b205a561eaa5\", \"metadata\": \"66d40738bd608b83ef35b205a561eaa5\", \"filename\": \"66d40738bd608b83ef35b205a561eaa5\"}, \"166\": {\"name\": \"004459575e3657bca8a3d0424545f082\", \"metadata\": \"004459575e3657bca8a3d0424545f082\", \"filename\": \"004459575e3657bca8a3d0424545f082\"}, \"167\": {\"name\": \"b1ffa01e0fa86ef9025003261eb181e3\", \"metadata\": \"b1ffa01e0fa86ef9025003261eb181e3\", \"filename\": \"b1ffa01e0fa86ef9025003261eb181e3\"}, \"168\": {\"name\": \"82e0290a438650db9a93ce29276f931b\", \"metadata\": \"82e0290a438650db9a93ce29276f931b\", \"filename\": \"82e0290a438650db9a93ce29276f931b\"}, \"169\": {\"name\": \"826776746a37223786ffec552e769c88\", \"metadata\": \"826776746a37223786ffec552e769c88\", \"filename\": \"826776746a37223786ffec552e769c88\"}, \"170\": {\"name\": \"1fb580f790c207278b55c408a68ff391\", \"metadata\": \"1fb580f790c207278b55c408a68ff391\", \"filename\": \"1fb580f790c207278b55c408a68ff391\"}, \"171\": {\"name\": \"ea077bf729e6510381278c68ee7c2b07\", \"metadata\": \"ea077bf729e6510381278c68ee7c2b07\", \"filename\": \"ea077bf729e6510381278c68ee7c2b07\"}, \"172\": {\"name\": \"e4521446df02458bd88840687af212c5\", \"metadata\": \"e4521446df02458bd88840687af212c5\", \"filename\": \"e4521446df02458bd88840687af212c5\"}, \"173\": {\"name\": \"20c1ca3c7ff0bb437afd69042bb5f852\", \"metadata\": \"20c1ca3c7ff0bb437afd69042bb5f852\", \"filename\": \"20c1ca3c7ff0bb437afd69042bb5f852\"}, \"174\": {\"name\": \"0d5e85e6ec8d82f2ae38ecb7f1394a04\", \"metadata\": \"0d5e85e6ec8d82f2ae38ecb7f1394a04\", \"filename\": \"0d5e85e6ec8d82f2ae38ecb7f1394a04\"}, \"175\": {\"name\": \"57256c01ec9b9980ecda5b97acb236c3\", \"metadata\": \"57256c01ec9b9980ecda5b97acb236c3\", \"filename\": \"57256c01ec9b9980ecda5b97acb236c3\"}, \"176\": {\"name\": \"fcc0a2c84b265a77211ff0d4bd4a413a\", \"metadata\": \"fcc0a2c84b265a77211ff0d4bd4a413a\", \"filename\": \"fcc0a2c84b265a77211ff0d4bd4a413a\"}, \"177\": {\"name\": \"a897a797fc00c21ec3ef5062b38cfb90\", \"metadata\": \"a897a797fc00c21ec3ef5062b38cfb90\", \"filename\": \"a897a797fc00c21ec3ef5062b38cfb90\"}, \"178\": {\"name\": \"4b57274be5a768732716b9dc600a1f14\", \"metadata\": \"4b57274be5a768732716b9dc600a1f14\", \"filename\": \"4b57274be5a768732716b9dc600a1f14\"}, \"179\": {\"name\": \"1f86e7c6c52baed6ce168b05f23013fc\", \"metadata\": \"1f86e7c6c52baed6ce168b05f23013fc\", \"filename\": \"1f86e7c6c52baed6ce168b05f23013fc\"}, \"180\": {\"name\": \"a448b639491a6f75649c2b1c960780d9\", \"metadata\": \"a448b639491a6f75649c2b1c960780d9\", \"filename\": \"a448b639491a6f75649c2b1c960780d9\"}, \"181\": {\"name\": \"3685ee5f820ab6e840ec6b0fe090e754\", \"metadata\": \"3685ee5f820ab6e840ec6b0fe090e754\", \"filename\": \"3685ee5f820ab6e840ec6b0fe090e754\"}, \"182\": {\"name\": \"972d83aa010954aaf5ad0a56f30f43b6\", \"metadata\": \"972d83aa010954aaf5ad0a56f30f43b6\", \"filename\": \"972d83aa010954aaf5ad0a56f30f43b6\"}, \"183\": {\"name\": \"38cf0b7d644963ee846734251e9c0175\", \"metadata\": \"38cf0b7d644963ee846734251e9c0175\", \"filename\": \"38cf0b7d644963ee846734251e9c0175\"}, \"184\": {\"name\": \"589cddfc349d8950af5bbd90f5db7060\", \"metadata\": \"589cddfc349d8950af5bbd90f5db7060\", \"filename\": \"589cddfc349d8950af5bbd90f5db7060\"}, \"185\": {\"name\": \"133743f147335b4d31b0e91480606339\", \"metadata\": \"133743f147335b4d31b0e91480606339\", \"filename\": \"133743f147335b4d31b0e91480606339\"}, \"186\": {\"name\": \"a532ca6bf98299efeb2915715b9a21c3\", \"metadata\": \"a532ca6bf98299efeb2915715b9a21c3\", \"filename\": \"a532ca6bf98299efeb2915715b9a21c3\"}, \"187\": {\"name\": \"633f4c15ae21310dac488c09d66c2d38\", \"metadata\": \"633f4c15ae21310dac488c09d66c2d38\", \"filename\": \"633f4c15ae21310dac488c09d66c2d38\"}, \"188\": {\"name\": \"0382590e3740e4c94455b4d52fff9143\", \"metadata\": \"0382590e3740e4c94455b4d52fff9143\", \"filename\": \"0382590e3740e4c94455b4d52fff9143\"}, \"189\": {\"name\": \"e5e9f136633ee06623a457e6c5bd9eac\", \"metadata\": \"e5e9f136633ee06623a457e6c5bd9eac\", \"filename\": \"e5e9f136633ee06623a457e6c5bd9eac\"}, \"190\": {\"name\": \"e6c06dd6393e96514f79db5d3bca100a\", \"metadata\": \"e6c06dd6393e96514f79db5d3bca100a\", \"filename\": \"e6c06dd6393e96514f79db5d3bca100a\"}, \"191\": {\"name\": \"97c19c413385bc830c6b2ddc855ac23a\", \"metadata\": \"97c19c413385bc830c6b2ddc855ac23a\", \"filename\": \"97c19c413385bc830c6b2ddc855ac23a\"}, \"192\": {\"name\": \"58459874f43a5d202d46018eb8f06e4c\", \"metadata\": \"58459874f43a5d202d46018eb8f06e4c\", \"filename\": \"58459874f43a5d202d46018eb8f06e4c\"}, \"193\": {\"name\": \"896f1c578904fad60f17061146946732\", \"metadata\": \"896f1c578904fad60f17061146946732\", \"filename\": \"896f1c578904fad60f17061146946732\"}, \"194\": {\"name\": \"8b5bef6feeb06603e70fde66df521edf\", \"metadata\": \"8b5bef6feeb06603e70fde66df521edf\", \"filename\": \"8b5bef6feeb06603e70fde66df521edf\"}, \"195\": {\"name\": \"c0c13a28a687b655688f8e10551e8df1\", \"metadata\": \"c0c13a28a687b655688f8e10551e8df1\", \"filename\": \"c0c13a28a687b655688f8e10551e8df1\"}, \"196\": {\"name\": \"91fea76b0361f4f812c07e7d43f434f3\", \"metadata\": \"91fea76b0361f4f812c07e7d43f434f3\", \"filename\": \"91fea76b0361f4f812c07e7d43f434f3\"}, \"197\": {\"name\": \"e32a1cc092043108ec5025c1098a1dc8\", \"metadata\": \"e32a1cc092043108ec5025c1098a1dc8\", \"filename\": \"e32a1cc092043108ec5025c1098a1dc8\"}, \"198\": {\"name\": \"7ddb71d74edc6d1e0c724a8f1bd3c8cc\", \"metadata\": \"7ddb71d74edc6d1e0c724a8f1bd3c8cc\", \"filename\": \"7ddb71d74edc6d1e0c724a8f1bd3c8cc\"}}}\n"
  },
  {
    "path": "tests/test-data/tax/47+63_x_gtdb-rs202.gather.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,name,filename,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_filename,query_name,query_md5,query_bp,ksize,scaled\n5238000,0.6642150646715699,1.0,0.6642150646715699,0.6642150646715699,,,,\"GCF_000021665.1 Shewanella baltica OS223 strain=OS223, ASM2166v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,38729c6374925585db28916b82a6f513,1.0,5238000,0,2648000,,47+63,491c0a81,7886000,31,1000\n5177000,0.6564798376870403,0.5114931427467645,0.3357849353284301,0.3357849353284301,,,,\"GCF_000017325.1 Shewanella baltica OS185 strain=OS185, ASM1732v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,09a08691ce52952152f0e866a59f6261,1.0,2648000,1,0,,47+63,491c0a81,7886000,31,1000\n"
  },
  {
    "path": "tests/test-data/tax/bacteria_refseq_lineage.csv",
    "content": "accession,taxid,superkingdom,phylum,class,order,family,genus,species\nGCF_001881345,562,Bacteria,Proteobacteria,Gammaproteobacteria,Enterobacterales,Enterobacteriaceae,Escherichia,Escherichia coli,\nGCF_009494285,165179,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Prevotellaceae,Prevotella,Prevotella copri,\nGCF_013368705,821,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Bacteroidaceae,Bacteroides,Bacteroides vulgatus,\nGCF_003471795,165179,Bacteria,Bacteroidetes,Bacteroidia,Bacteroidales,Prevotellaceae,Prevotella,Prevotella copri,\n"
  },
  {
    "path": "tests/test-data/tax/lemonade-MAG3.x.gtdb.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,filename,name,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_filename,query_name,query_md5,query_bp,ksize,moltype,scaled,query_n_hashes,query_abundance,query_containment_ani,match_containment_ani,average_containment_ani,max_containment_ani,potential_false_negative,n_unique_weighted_found,sum_weighted_found,total_weighted_hashes\r\n116000,0.053456221198156684,0.050347222222222224,0.053456221198156684,0.053456221198156684,,,,/Users/t/dev/sourmash/tests/test-data/tax/lemonade-MAG3.x.gtdb.matches.zip,\"GCF_006265245.1 Prosthecochloris vibrioformis strain=DSM 260, ASM626524v1\",e5698329948ebe9b7abe87f8ad81be74,0.050347222222222224,116000,0,0,MAG3.fasta,MAG3_1,8ecd0805,2170000,31,DNA,1000,2170,False,0.9098455716675529,0.9080886392176899,0.9089671054426214,0.9098455716675529,False,,116,2170\r\n"
  },
  {
    "path": "tests/test-data/tax/lemonade-MAG3.x.gtdb.matches.tax.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nGCF_003344365.2,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,g__Prosthecochloris,s__Prosthecochloris ethylica\nGCF_006265245.1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,g__Prosthecochloris,s__Prosthecochloris vibrioformis\nGCF_002113825.1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,g__Prosthecochloris,s__Prosthecochloris sp002113825\n"
  },
  {
    "path": "tests/test-data/tax/protozoa_genbank_lineage.csv",
    "content": "ident,taxid,superkingdom,phylum,class,order,family,genus,species\nGCA_002754635,5855,Eukaryota,Apicomplexa,Aconoidasida,Haemosporida,Plasmodiidae,Plasmodium,Plasmodium vivax,\nGCA_000256725,1130821,Eukaryota,Apicomplexa,Conoidasida,Eucoccidiorida,Sarcocystidae,Toxoplasma,Toxoplasma gondii,Toxoplasma gondii TgCatPRC2\n"
  },
  {
    "path": "tests/test-data/tax/test-empty-line.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\n\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Phocaeicola,s__Phocaeicola vulgatus\nGCF_003471795.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test-empty-ranks-2.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,,\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,,,,\nGCF_003471795.1,,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test-empty-ranks-3.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,,\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,\nGCF_003471795.1,,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test-empty-ranks.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,,\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,,,,\nGCF_003471795.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test-missing-ranks.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,a,b,c\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Phocaeicola,s__Phocaeicola vulgatus\nGCF_003471795.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test-strain.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species,strain\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli,1\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri,2\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Phocaeicola,s__Phocaeicola vulgatus,3\nGCF_003471795.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri,4\nGCF_000017325.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica,5\nGCF_000021665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica,6\n"
  },
  {
    "path": "tests/test-data/tax/test.LIN-taxonomy.csv",
    "content": "ident,lin\nGCF_001881345.1,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\nGCF_009494285.1,1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\nGCF_013368705.1,2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\nGCF_003471795.1,1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\nGCF_000017325.1,1;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0\nGCF_000021665.1,1;0;1;0;0;0;0;0;0;0;0;0;0;1;1;0;0;0;0;0\n"
  },
  {
    "path": "tests/test-data/tax/test.ictv-taxonomy.csv",
    "content": "ident,superkingdom,realm,subrealm,kingdom,subkingdom,phylum,subphylum,class,subclass,order,suborder,family,subfamily,genus,subgenus,species,name\nGCF_000017325,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus zairense,Ebola virus\nGCF_000021665,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus sudanense,Sudan virus\nGCF_009494285,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus taiense,Taï Forest virus\nGCF_003471795,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus restonense,Reston virus\nGCF_001881345,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus bundibugyoense,Bundibugyo virus\nGCF_013368705,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,Orthoebolavirus,,Orthoebolavirus bombaliense,Bombali virus\nGCF_013311112,Viruses,Riboviria,,Orthornavirae,,Negarnaviricota,Haploviricotina,Monjiviricetes,,Mononegavirales,,Filoviridae,,other-genus,,other-sp,other test\n"
  },
  {
    "path": "tests/test-data/tax/test.ncbi-taxonomy.csv",
    "content": "ident,taxid,superkingdom,phylum,class,order,family,genus,species,strain,taxpath\nGCF_001881345.1,562,Bacteria,Pseudomonadota,Gammaproteobacteria,Enterobacterales,Enterobacteriaceae,Escherichia,Escherichia coli,,2|1224|1236|91347|543|561|562|\nGCF_009494285.1,165179,Bacteria,Bacteroidota,Bacteroidia,Bacteroidales,Prevotellaceae,Prevotella,Prevotella copri,,2|976|200643|171549|171552|838|165179|\nGCF_013368705.1,821,Bacteria,Bacteroidota,Bacteroidia,Bacteroidales,Bacteroidaceae,Phocaeicola,Phocaeicola vulgatus,,2|976|200643|171549|815|909656|821|\nGCF_003471795.1,165179,Bacteria,Bacteroidota,Bacteroidia,Bacteroidales,Prevotellaceae,Prevotella,Prevotella copri,,2|976|200643|171549|171552|838|165179|\nGCF_000017325.1,402882,Bacteria,Pseudomonadota,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS185,2|1224|1236|135622|267890|22|62322|402882\nGCF_000021665.1,407976,Bacteria,Pseudomonadota,Gammaproteobacteria,Alteromonadales,Shewanellaceae,Shewanella,Shewanella baltica,Shewanella baltica OS223,2|1224|1236|135622|267890|22|62322|407976\n"
  },
  {
    "path": "tests/test-data/tax/test.taxonomy.csv",
    "content": "ident,superkingdom,phylum,class,order,family,genus,species\nGCF_001881345.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Enterobacteriaceae,g__Escherichia,s__Escherichia coli\nGCF_009494285.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_013368705.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Phocaeicola,s__Phocaeicola vulgatus\nGCF_003471795.1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\nGCF_000017325.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\nGCF_000021665.1,d__Bacteria,p__Proteobacteria,c__Gammaproteobacteria,o__Enterobacterales,f__Shewanellaceae,g__Shewanella,s__Shewanella baltica\n"
  },
  {
    "path": "tests/test-data/tax/test1.gather.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,name,filename,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_name,query_md5,query_filename,query_bp,ksize,scaled,query_n_hashes\n442000,0.08815317112086159,0.08438335242458954,0.08815317112086159,0.05815279361459521,1.6153846153846154,1.0,1.1059438185997785,\"GCF_001881345.1 Escherichia coli strain=SF-596, ASM188134v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,683df1ec13872b4b98d59e98b355b52c,0.042779713511420826,442000,0,4572000,test1,md5,test1.sig,5014000,31,1000,2507\n390000,0.07778220981252493,0.10416666666666667,0.07778220981252493,0.050496823586903404,1.5897435897435896,1.0,0.8804995294906566,\"GCF_009494285.1 Prevotella copri strain=iAK1218, ASM949428v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,1266c86141e3a5603da61f57dd863ed0,0.052236806857755155,390000,1,4182000,test1,md5,test1.sig,5014000,31,1000,2507\n138000,0.027522935779816515,0.024722321748477247,0.027522935779816515,0.015637726014008795,1.391304347826087,1.0,0.5702120455914782,\"GCF_013368705.1 Bacteroides vulgatus strain=B33, ASM1336870v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,7d5f4ba1d01c8c3f7a520d19faded7cb,0.012648945921173235,138000,2,4044000,test1,md5,test1.sig,5014000,31,1000,2507\n338000,0.06741124850418827,0.013789581205311542,0.010769844435580374,0.006515719172503665,1.4814814814814814,1.0,0.738886568268889,\"GCF_003471795.1 Prevotella copri strain=AM16-54, ASM347179v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,0ebd36ff45fc2810808789667f4aad84,0.04337782340862423,54000,3,3990000,test1,md5,test1.sig,5014000,31,1000,2507\n"
  },
  {
    "path": "tests/test-data/tax/test1.gather.v450.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,filename,name,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_filename,query_name,query_md5,query_bp,ksize,moltype,scaled,query_n_hashes,query_abundance,query_containment_ani,match_containment_ani,average_containment_ani,max_containment_ani,potential_false_negative,n_unique_weighted_found,sum_weighted_found,total_weighted_hashes\r\n442000,0.08815317112086159,0.08438335242458954,0.08815317112086159,0.05815279361459521,1.6153846153846154,1.0,1.1059438185997785,/Users/t/dev/sourmash/gtdb-rs207.genomic.k31.zip,\"GCF_001881345.1 Escherichia coli strain=SF-596, ASM188134v1\",683df1ec13872b4b98d59e98b355b52c,0.08438335242458954,442000,0,582000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,test1,9687eeed,5014000,31,DNA,2000,2507,True,0.9246458342627294,0.9233431290448543,0.9239944816537918,0.9246458342627294,False,357,357,6139\r\n390000,0.07778220981252493,0.10416666666666667,0.07778220981252493,0.050496823586903404,1.5897435897435896,1.0,0.8804995294906566,/Users/t/dev/sourmash/gtdb-rs207.genomic.k31.zip,\"GCF_009494285.1 Prevotella copri strain=iAK1218, ASM949428v1\",1266c86141e3a5603da61f57dd863ed0,0.10416666666666667,390000,1,192000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,test1,9687eeed,5014000,31,DNA,2000,2507,True,0.920920083987624,0.929637921884656,0.92527900293614,0.929637921884656,False,310,667,6139\r\n138000,0.027522935779816515,0.024722321748477247,0.027522935779816515,0.015637726014008795,1.391304347826087,1.0,0.5702120455914782,/Users/t/dev/sourmash/gtdb-rs207.genomic.k31.zip,\"GCF_013368705.1 Bacteroides vulgatus strain=B33, ASM1336870v1\",7d5f4ba1d01c8c3f7a520d19faded7cb,0.024722321748477247,138000,2,54000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,test1,9687eeed,5014000,31,DNA,2000,2507,True,0.8905689983332759,0.8874914330230439,0.8890302156781599,0.8905689983332759,False,96,763,6139\r\n338000,0.06741124850418827,0.013789581205311542,0.010769844435580374,0.006515719172503665,1.4814814814814814,1.0,0.738886568268889,/Users/t/dev/sourmash/gtdb-rs207.genomic.k31.zip,\"GCF_003471795.1 Prevotella copri strain=AM16-54, ASM347179v1\",0ebd36ff45fc2810808789667f4aad84,0.08631256384065372,54000,3,0,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,test1,9687eeed,5014000,31,DNA,2000,2507,True,0.9166787698053748,0.9240166714766321,0.9203477206410035,0.9240166714766321,False,40,803,6139\r\n"
  },
  {
    "path": "tests/test-data/tax/test1.gather.with-lineages.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,name,filename,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_name,query_md5,query_filename,query_bp,ksize,scaled,query_n_hashes,lineage\r\n442000,0.08815317112086159,0.08438335242458954,0.08815317112086159,0.05815279361459521,1.6153846153846154,1.0,1.1059438185997785,\"GCF_001881345.1 Escherichia coli strain=SF-596, ASM188134v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,683df1ec13872b4b98d59e98b355b52c,0.042779713511420826,442000,0,4572000,test1,md5,test1.sig,5014000,31,1000,2507,Bacteria;Pseudomonadota;Gammaproteobacteria;Enterobacterales;Enterobacteriaceae;Escherichia;Escherichia coli\r\n390000,0.07778220981252493,0.10416666666666667,0.07778220981252493,0.050496823586903404,1.5897435897435896,1.0,0.8804995294906566,\"GCF_009494285.1 Prevotella copri strain=iAK1218, ASM949428v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,1266c86141e3a5603da61f57dd863ed0,0.052236806857755155,390000,1,4182000,test1,md5,test1.sig,5014000,31,1000,2507,Bacteria;Bacteroidota;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella copri\r\n138000,0.027522935779816515,0.024722321748477247,0.027522935779816515,0.015637726014008795,1.391304347826087,1.0,0.5702120455914782,\"GCF_013368705.1 Bacteroides vulgatus strain=B33, ASM1336870v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,7d5f4ba1d01c8c3f7a520d19faded7cb,0.012648945921173235,138000,2,4044000,test1,md5,test1.sig,5014000,31,1000,2507,Bacteria;Bacteroidota;Bacteroidia;Bacteroidales;Bacteroidaceae;Phocaeicola;Phocaeicola vulgatus\r\n338000,0.06741124850418827,0.013789581205311542,0.010769844435580374,0.006515719172503665,1.4814814814814814,1.0,0.738886568268889,\"GCF_003471795.1 Prevotella copri strain=AM16-54, ASM347179v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,0ebd36ff45fc2810808789667f4aad84,0.04337782340862423,54000,3,3990000,test1,md5,test1.sig,5014000,31,1000,2507,Bacteria;Bacteroidota;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella copri\r\n"
  },
  {
    "path": "tests/test-data/tax/test1.gather_old.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,name,filename,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_name,query_md5,query_filename\n442000,0.08815317112086159,0.08438335242458954,0.08815317112086159,0.05815279361459521,1.6153846153846154,1.0,1.1059438185997785,\"GCF_001881345.1 Escherichia coli strain=SF-596, ASM188134v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,683df1ec13872b4b98d59e98b355b52c,0.042779713511420826,442000,0,4572000,test1,md5,test1.sig\n390000,0.07778220981252493,0.10416666666666667,0.07778220981252493,0.050496823586903404,1.5897435897435896,1.0,0.8804995294906566,\"GCF_009494285.1 Prevotella copri strain=iAK1218, ASM949428v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,1266c86141e3a5603da61f57dd863ed0,0.052236806857755155,390000,1,4182000,test1,md5,test1.sig\n138000,0.027522935779816515,0.024722321748477247,0.027522935779816515,0.015637726014008795,1.391304347826087,1.0,0.5702120455914782,\"GCF_013368705.1 Bacteroides vulgatus strain=B33, ASM1336870v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,7d5f4ba1d01c8c3f7a520d19faded7cb,0.012648945921173235,138000,2,4044000,test1,md5,test1.sig\n338000,0.06741124850418827,0.013789581205311542,0.010769844435580374,0.006515719172503665,1.4814814814814814,1.0,0.738886568268889,\"GCF_003471795.1 Prevotella copri strain=AM16-54, ASM347179v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,0ebd36ff45fc2810808789667f4aad84,0.04337782340862423,54000,3,3990000,test1,md5,test1.sig\n"
  },
  {
    "path": "tests/test-data/tax/test1_x_gtdbrs202_genbank_euks.gather.csv",
    "content": "intersect_bp,f_orig_query,f_match,f_unique_to_query,f_unique_weighted,average_abund,median_abund,std_abund,name,filename,md5,f_match_orig,unique_intersect_bp,gather_result_rank,remaining_bp,query_filename,query_name,query_md5,query_bp,ksize,scaled\n442000,0.08815317112086159,0.08438335242458954,0.08815317112086159,0.05815279361459521,1.6153846153846154,1.0,1.1059438185997785,\"GCF_001881345.1 Escherichia coli strain=SF-596, ASM188134v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,683df1ec13872b4b98d59e98b355b52c,0.042779713511420826,442000,0,4572000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n390000,0.07778220981252493,0.10416666666666667,0.07778220981252493,0.050496823586903404,1.5897435897435896,1.0,0.8804995294906566,\"GCF_009494285.1 Prevotella copri strain=iAK1218, ASM949428v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,1266c86141e3a5603da61f57dd863ed0,0.052236806857755155,390000,1,4182000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n206000,0.041084962106102914,0.007403148134837921,0.041084962106102914,0.2215344518651246,13.20388349514563,3.0,69.69466823965065,\"GCA_002754635.1 Plasmodium vivax strain=CMB-1, CMB-1_v2\",/home/irber/sourmash_databases/outputs/sbt/genbank-protozoa-x1e6-k31.sbt.zip,8125e7913e0d0b88deb63c9ad28f827c,0.0037419167332703625,206000,2,3976000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n138000,0.027522935779816515,0.024722321748477247,0.027522935779816515,0.015637726014008795,1.391304347826087,1.0,0.5702120455914782,\"GCF_013368705.1 Bacteroides vulgatus strain=B33, ASM1336870v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,7d5f4ba1d01c8c3f7a520d19faded7cb,0.012648945921173235,138000,3,3838000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n338000,0.06741124850418827,0.013789581205311542,0.010769844435580374,0.006515719172503665,1.4814814814814814,1.0,0.738886568268889,\"GCF_003471795.1 Prevotella copri strain=AM16-54, ASM347179v1\",/group/ctbrowngrp/gtdb/databases/ctb/gtdb-rs202.genomic.k31.sbt.zip,0ebd36ff45fc2810808789667f4aad84,0.04337782340862423,54000,4,3784000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n110000,0.021938571998404467,0.000842978957948319,0.010370961308336658,0.023293696041700604,5.5,2.5,7.417494911978758,\"GCA_000256725.2 Toxoplasma gondii TgCatPRC2 strain=TgCatPRC2, TGCATPRC2 v2\",/home/irber/sourmash_databases/outputs/sbt/genbank-protozoa-x1e6-k31.sbt.zip,2a3b1804cf5ea5fe75dde3e153294548,0.0008909768346023004,52000,5,3732000,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,multtest,9687eeed,5014000,31,1000\n"
  },
  {
    "path": "tests/test-data/track_abund/47+63.abund.rocksdb/CURRENT",
    "content": "MANIFEST-000005\n"
  },
  {
    "path": "tests/test-data/track_abund/47+63.abund.rocksdb/IDENTITY",
    "content": "b0a87c24-55c2-4044-87b2-2dc3186a9581"
  },
  {
    "path": "tests/test-data/track_abund/47+63.abund.rocksdb/LOCK",
    "content": ""
  },
  {
    "path": "tests/test-data/track_abund/47+63.abund.rocksdb/OPTIONS-000007",
    "content": "# This is a RocksDB option file.\n#\n# For detailed file format spec, please refer to the example file\n# in examples/rocksdb_option_file_example.ini\n#\n\n[Version]\n  rocksdb_version=8.10.0\n  options_file_version=1.1\n\n[DBOptions]\n  max_background_flushes=-1\n  compaction_readahead_size=2097152\n  strict_bytes_per_sync=false\n  wal_bytes_per_sync=0\n  max_open_files=500\n  stats_history_buffer_size=1048576\n  max_total_wal_size=0\n  stats_persist_period_sec=600\n  stats_dump_period_sec=600\n  avoid_flush_during_shutdown=false\n  max_subcompactions=1\n  bytes_per_sync=1048576\n  delayed_write_rate=16777216\n  max_background_compactions=-1\n  max_background_jobs=8\n  delete_obsolete_files_period_micros=21600000000\n  writable_file_max_buffer_size=1048576\n  file_checksum_gen_factory=nullptr\n  allow_data_in_errors=false\n  max_bgerror_resume_count=2147483647\n  best_efforts_recovery=false\n  write_dbid_to_manifest=false\n  atomic_flush=false\n  manual_wal_flush=false\n  two_write_queues=false\n  avoid_flush_during_recovery=false\n  dump_malloc_stats=false\n  info_log_level=INFO_LEVEL\n  write_thread_slow_yield_usec=3\n  unordered_write=false\n  allow_ingest_behind=false\n  fail_if_options_file_error=true\n  persist_stats_to_disk=false\n  WAL_ttl_seconds=0\n  bgerror_resume_retry_interval=1000000\n  allow_concurrent_memtable_write=true\n  paranoid_checks=true\n  WAL_size_limit_MB=0\n  lowest_used_cache_tier=kNonVolatileBlockTier\n  keep_log_file_num=1000\n  table_cache_numshardbits=6\n  max_file_opening_threads=16\n  random_access_max_buffer_size=1048576\n  log_readahead_size=0\n  enable_pipelined_write=false\n  wal_recovery_mode=kPointInTimeRecovery\n  db_write_buffer_size=0\n  allow_2pc=false\n  skip_checking_sst_file_sizes_on_db_open=false\n  skip_stats_update_on_db_open=false\n  recycle_log_file_num=0\n  db_host_id=__hostname__\n  track_and_verify_wals_in_manifest=false\n  use_fsync=false\n  wal_compression=kNoCompression\n  compaction_verify_record_count=true\n  error_if_exists=false\n  manifest_preallocation_size=4194304\n  is_fd_close_on_exec=true\n  enable_write_thread_adaptive_yield=true\n  enable_thread_tracking=false\n  avoid_unnecessary_blocking_io=false\n  allow_fallocate=true\n  max_log_file_size=0\n  advise_random_on_open=true\n  create_missing_column_families=true\n  max_write_batch_group_size_bytes=1048576\n  use_adaptive_mutex=false\n  wal_filter=nullptr\n  create_if_missing=true\n  enforce_single_del_contracts=true\n  allow_mmap_writes=false\n  access_hint_on_compaction_start=NORMAL\n  verify_sst_unique_id_in_manifest=true\n  log_file_time_to_roll=0\n  use_direct_io_for_flush_and_compaction=false\n  flush_verify_memtable_count=true\n  max_manifest_file_size=1073741824\n  write_thread_max_yield_usec=100\n  use_direct_reads=false\n  allow_mmap_reads=false\n  \n\n[CFOptions \"default\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=2\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"default\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"hashes\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=10\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"hashes\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"metadata\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=datasets operator\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"metadata\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n\n[CFOptions \"storage\"]\n  bottommost_file_compaction_delay=0\n  memtable_protection_bytes_per_key=0\n  bottommost_compression=kDisableCompressionOption\n  sample_for_compression=0\n  blob_garbage_collection_age_cutoff=0.250000\n  blob_compression_type=kNoCompression\n  prepopulate_blob_cache=kDisable\n  blob_compaction_readahead_size=0\n  level0_stop_writes_trigger=36\n  min_blob_size=0\n  last_level_temperature=kUnknown\n  compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;}\n  target_file_size_base=67108864\n  ignore_max_compaction_bytes_for_input=true\n  memtable_whole_key_filtering=false\n  blob_file_starting_level=0\n  soft_pending_compaction_bytes_limit=68719476736\n  max_write_buffer_number=16\n  ttl=2592000\n  compaction_options_fifo={file_temperature_age_thresholds=;allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;}\n  check_flush_compaction_key_order=true\n  memtable_huge_page_size=0\n  max_successive_merges=0\n  inplace_update_num_locks=10000\n  enable_blob_garbage_collection=false\n  arena_block_size=1048576\n  bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  target_file_size_multiplier=1\n  max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1\n  blob_garbage_collection_force_threshold=1.000000\n  enable_blob_files=false\n  level0_slowdown_writes_trigger=20\n  compression=kSnappyCompression\n  level0_file_num_compaction_trigger=4\n  block_protection_bytes_per_key=0\n  prefix_extractor=nullptr\n  max_bytes_for_level_multiplier=10.000000\n  write_buffer_size=67108864\n  disable_auto_compactions=false\n  max_compaction_bytes=1677721600\n  memtable_max_range_deletions=0\n  compression_opts={use_zstd_dict_trainer=true;enabled=false;zstd_max_train_bytes=0;parallel_threads=1;max_compressed_bytes_per_kb=896;checksum=false;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;}\n  hard_pending_compaction_bytes_limit=274877906944\n  blob_file_size=268435456\n  periodic_compaction_seconds=0\n  paranoid_file_checks=false\n  experimental_mempurge_threshold=0.000000\n  memtable_prefix_bloom_size_ratio=0.000000\n  max_bytes_for_level_base=268435456\n  max_sequential_skip_in_iterations=8\n  report_bg_io_stats=false\n  sst_partitioner_factory=nullptr\n  compaction_pri=kMinOverlappingRatio\n  compaction_style=kCompactionStyleLevel\n  compaction_filter_factory=nullptr\n  compaction_filter=nullptr\n  memtable_factory=SkipListFactory\n  comparator=leveldb.BytewiseComparator\n  bloom_locality=0\n  min_write_buffer_number_to_merge=1\n  table_factory=BlockBasedTable\n  max_write_buffer_size_to_maintain=0\n  max_write_buffer_number_to_maintain=0\n  optimize_filters_for_hits=false\n  default_temperature=kUnknown\n  preserve_internal_time_seconds=0\n  force_consistency_checks=true\n  merge_operator=nullptr\n  num_levels=7\n  level_compaction_dynamic_file_size=true\n  memtable_insert_with_hint_prefix_extractor=nullptr\n  level_compaction_dynamic_level_bytes=true\n  persist_user_defined_timestamps=true\n  preclude_last_level_data_seconds=0\n  inplace_update_support=false\n  \n[TableOptions/BlockBasedTable \"storage\"]\n  num_file_reads_for_auto_readahead=2\n  metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;}\n  read_amp_bytes_per_bit=0\n  verify_compression=false\n  format_version=5\n  optimize_filters_for_memory=false\n  partition_filters=false\n  detect_filter_construct_corruption=false\n  initial_auto_readahead_size=8192\n  max_auto_readahead_size=262144\n  enable_index_compression=true\n  checksum=kXXH3\n  index_block_restart_interval=1\n  pin_top_level_index_and_filter=true\n  block_align=false\n  block_size=4096\n  index_type=kBinarySearch\n  filter_policy=nullptr\n  metadata_block_size=4096\n  no_block_cache=false\n  index_shortening=kShortenSeparators\n  whole_key_filtering=true\n  block_size_deviation=10\n  data_block_index_type=kDataBlockBinarySearch\n  data_block_hash_table_util_ratio=0.750000\n  cache_index_and_filter_blocks=false\n  prepopulate_block_cache=kDisable\n  block_restart_interval=16\n  pin_l0_filter_and_index_blocks_in_cache=false\n  cache_index_and_filter_blocks_with_high_priority=true\n  flush_block_policy_factory=FlushBlockBySizePolicyFactory\n  \n"
  },
  {
    "path": "tests/test-data/v1.sbt.json",
    "content": "[{\"name\": \"internal.0\", \"filename\": \".sbt.v2/v2.internal.0.sbt\"}, {\"name\": \"internal.1\", \"filename\": \".sbt.v2/v2.internal.1.sbt\"}, {\"name\": \"internal.2\", \"filename\": \".sbt.v2/v2.internal.2.sbt\"}, {\"name\": \"internal.3\", \"filename\": \".sbt.v2/v2.internal.3.sbt\"}, {\"name\": \"internal.4\", \"filename\": \".sbt.v2/v2.internal.4.sbt\"}, {\"name\": \"internal.5\", \"filename\": \".sbt.v2/v2.internal.5.sbt\"}, {\"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"filename\": \".sbt.v2/v2.6d6e87e1154e95b279e5e7db414bc37b.sbt\"}, {\"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"filename\": \".sbt.v2/v2.60f7e23c24a8d94791cc7a8680c493f9.sbt\"}, {\"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"filename\": \".sbt.v2/v2.0107d767a345eff67ecdaed2ee5cd7ba.sbt\"}, {\"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"filename\": \".sbt.v2/v2.f71e78178af9e45e6f1d87a0c53c465c.sbt\"}, {\"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"filename\": \".sbt.v2/v2.f0c834bc306651d2b9321fb21d3e8d8f.sbt\"}, {\"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\", \"filename\": \".sbt.v2/v2.4e94e60265e04f0763142e20b52c0da1.sbt\"}, {\"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\", \"filename\": \".sbt.v2/v2.b59473c94ff2889eca5d7165936e64b3.sbt\"}]\n"
  },
  {
    "path": "tests/test-data/v2.sbt.json",
    "content": "{\"d\": 2, \"version\": 2, \"nodes\": {\"0\": {\"name\": \"internal.0\", \"filename\": \".sbt.v2/v2.internal.0.sbt\"}, \"1\": {\"name\": \"internal.1\", \"filename\": \".sbt.v2/v2.internal.1.sbt\"}, \"2\": {\"name\": \"internal.2\", \"filename\": \".sbt.v2/v2.internal.2.sbt\"}, \"3\": {\"name\": \"internal.3\", \"filename\": \".sbt.v2/v2.internal.3.sbt\"}, \"4\": {\"name\": \"internal.4\", \"filename\": \".sbt.v2/v2.internal.4.sbt\"}, \"5\": {\"name\": \"internal.5\", \"filename\": \".sbt.v2/v2.internal.5.sbt\"}, \"6\": {\"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"filename\": \".sbt.v2/v2.6d6e87e1154e95b279e5e7db414bc37b.sbt\"}, \"7\": {\"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"filename\": \".sbt.v2/v2.60f7e23c24a8d94791cc7a8680c493f9.sbt\"}, \"8\": {\"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"filename\": \".sbt.v2/v2.0107d767a345eff67ecdaed2ee5cd7ba.sbt\"}, \"9\": {\"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"filename\": \".sbt.v2/v2.f71e78178af9e45e6f1d87a0c53c465c.sbt\"}, \"10\": {\"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"filename\": \".sbt.v2/v2.f0c834bc306651d2b9321fb21d3e8d8f.sbt\"}, \"11\": {\"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\", \"filename\": \".sbt.v2/v2.4e94e60265e04f0763142e20b52c0da1.sbt\"}, \"12\": {\"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\", \"filename\": \".sbt.v2/v2.b59473c94ff2889eca5d7165936e64b3.sbt\"}, \"13\": null, \"14\": null}}\n"
  },
  {
    "path": "tests/test-data/v3.sbt.json",
    "content": "{\"factory\": {\"args\": [1,100000,4], \"class\": \"GraphFactory\"},\"storage\": {\"args\": {\"path\": \".sbt.v3\"}, \"backend\": \"FSStorage\"}, \"d\": 2, \"nodes\": {\"0\": {\"name\": \"internal.0\", \"filename\": \"internal.0\"}, \"1\": {\"name\": \"internal.1\", \"filename\": \"internal.1\"}, \"2\": {\"name\": \"internal.2\", \"filename\": \"internal.2\"}, \"3\": {\"name\": \"internal.3\", \"filename\": \"internal.3\"}, \"4\": {\"name\": \"internal.4\", \"filename\": \"internal.4\"}, \"5\": {\"name\": \"internal.5\", \"filename\": \"internal.5\"}, \"6\": {\"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"filename\": \"6d6e87e1154e95b279e5e7db414bc37b\"}, \"7\": {\"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"filename\": \"60f7e23c24a8d94791cc7a8680c493f9\"}, \"8\": {\"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"filename\": \"0107d767a345eff67ecdaed2ee5cd7ba\"}, \"9\": {\"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"filename\": \"f71e78178af9e45e6f1d87a0c53c465c\"}, \"10\": {\"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"filename\": \"f0c834bc306651d2b9321fb21d3e8d8f\"}, \"11\": {\"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\", \"filename\": \"4e94e60265e04f0763142e20b52c0da1\"}, \"12\": {\"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\", \"filename\": \"b59473c94ff2889eca5d7165936e64b3\"}}, \"version\": 3}\n"
  },
  {
    "path": "tests/test-data/v4.sbt.json",
    "content": "{\"d\":2,\"version\":4,\"storage\":{\"backend\":\"FSStorage\",\"args\":{\"path\":\".sbt.v3\"}},\"factory\":{\"class\":\"GraphFactory\",\"args\":[1,100000.0,4]},\"nodes\":{\"0\":{\"filename\":\"internal.0\",\"name\":\"internal.0\",\"metadata\":{\"min_n_below\":500}},\"1\":{\"filename\":\"internal.1\",\"name\":\"internal.1\",\"metadata\":{\"min_n_below\":500}},\"2\":{\"filename\":\"internal.2\",\"name\":\"internal.2\",\"metadata\":{\"min_n_below\":500}},\"3\":{\"filename\":\"internal.3\",\"name\":\"internal.3\",\"metadata\":{\"min_n_below\":500}},\"4\":{\"filename\":\"internal.4\",\"name\":\"internal.4\",\"metadata\":{\"min_n_below\":500}},\"5\":{\"filename\":\"internal.5\",\"name\":\"internal.5\",\"metadata\":{\"min_n_below\":500}},\"6\":{\"filename\":\"6d6e87e1154e95b279e5e7db414bc37b\",\"name\":\"6d6e87e1154e95b279e5e7db414bc37b\",\"metadata\":\"6d6e87e1154e95b279e5e7db414bc37b\"},\"7\":{\"filename\":\"60f7e23c24a8d94791cc7a8680c493f9\",\"name\":\"60f7e23c24a8d94791cc7a8680c493f9\",\"metadata\":\"60f7e23c24a8d94791cc7a8680c493f9\"},\"8\":{\"filename\":\"0107d767a345eff67ecdaed2ee5cd7ba\",\"name\":\"0107d767a345eff67ecdaed2ee5cd7ba\",\"metadata\":\"0107d767a345eff67ecdaed2ee5cd7ba\"},\"9\":{\"filename\":\"f71e78178af9e45e6f1d87a0c53c465c\",\"name\":\"f71e78178af9e45e6f1d87a0c53c465c\",\"metadata\":\"f71e78178af9e45e6f1d87a0c53c465c\"},\"10\":{\"filename\":\"f0c834bc306651d2b9321fb21d3e8d8f\",\"name\":\"f0c834bc306651d2b9321fb21d3e8d8f\",\"metadata\":\"f0c834bc306651d2b9321fb21d3e8d8f\"},\"11\":{\"filename\":\"4e94e60265e04f0763142e20b52c0da1\",\"name\":\"4e94e60265e04f0763142e20b52c0da1\",\"metadata\":\"4e94e60265e04f0763142e20b52c0da1\"},\"12\":{\"filename\":\"b59473c94ff2889eca5d7165936e64b3\",\"name\":\"b59473c94ff2889eca5d7165936e64b3\",\"metadata\":\"b59473c94ff2889eca5d7165936e64b3\"}}}\n"
  },
  {
    "path": "tests/test-data/v5.sbt.json",
    "content": "{\"d\": 2, \"version\": 5, \"storage\": {\"backend\": \"FSStorage\", \"args\": {\"path\": \".sbt.v3\"}}, \"factory\": {\"class\": \"GraphFactory\", \"args\": [1, 100000, 4]}, \"nodes\": {\"0\": {\"filename\": \"internal.0\", \"name\": \"internal.0\", \"metadata\": {\"min_n_below\": 500}}, \"1\": {\"filename\": \"internal.1\", \"name\": \"internal.1\", \"metadata\": {\"min_n_below\": 500}}, \"2\": {\"filename\": \"internal.2\", \"name\": \"internal.2\", \"metadata\": {\"min_n_below\": 500}}, \"3\": {\"filename\": \"internal.3\", \"name\": \"internal.3\", \"metadata\": {\"min_n_below\": 500}}, \"4\": {\"filename\": \"internal.4\", \"name\": \"internal.4\", \"metadata\": {\"min_n_below\": 500}}, \"5\": {\"filename\": \"internal.5\", \"name\": \"internal.5\", \"metadata\": {\"min_n_below\": 500}}}, \"leaves\": {\"6\": {\"filename\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\"}, \"7\": {\"filename\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\"}, \"8\": {\"filename\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\"}, \"9\": {\"filename\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\"}, \"10\": {\"filename\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\"}, \"11\": {\"filename\": \"4e94e60265e04f0763142e20b52c0da1\", \"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\"}, \"12\": {\"filename\": \"b59473c94ff2889eca5d7165936e64b3\", \"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\"}}}\n"
  },
  {
    "path": "tests/test-data/v5_mhmt.sbt.json",
    "content": "{\"d\": 2, \"version\": 5, \"storage\": {\"backend\": \"FSStorage\", \"args\": {\"path\": \".sbt.v5_mhmt\"}}, \"factory\": {\"class\": \"GraphFactory\", \"args\": [1, 100000, 4]}, \"nodes\": {\"0\": {\"filename\": \"internal.0\", \"name\": \"internal.0\", \"metadata\": {\"min_n_below\": 500}}, \"1\": {\"filename\": \"internal.1\", \"name\": \"internal.1\", \"metadata\": {\"min_n_below\": 500}}, \"2\": {\"filename\": \"internal.2\", \"name\": \"internal.2\", \"metadata\": {\"min_n_below\": 500}}, \"3\": {\"filename\": \"internal.3\", \"name\": \"internal.3\", \"metadata\": {\"min_n_below\": 500}}, \"4\": {\"filename\": \"internal.4\", \"name\": \"internal.4\", \"metadata\": {\"min_n_below\": 500}}, \"5\": {\"filename\": \"internal.5\", \"name\": \"internal.5\", \"metadata\": {\"min_n_below\": 500}}}, \"leaves\": {\"6\": {\"filename\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\"}, \"7\": {\"filename\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\"}, \"8\": {\"filename\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\"}, \"9\": {\"filename\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\"}, \"10\": {\"filename\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\"}, \"11\": {\"filename\": \"4e94e60265e04f0763142e20b52c0da1\", \"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\"}, \"12\": {\"filename\": \"b59473c94ff2889eca5d7165936e64b3\", \"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\"}}}\n"
  },
  {
    "path": "tests/test-data/v6.sbt.json",
    "content": "{\"d\": 2, \"version\": 6, \"index_type\": \"SBT\", \"storage\": {\"backend\": \"FSStorage\", \"args\": {\"path\": \".sbt.v3\"}}, \"factory\": {\"class\": \"GraphFactory\", \"args\": [1, 100000, 4]}, \"nodes\": {\"0\": {\"filename\": \"internal.0\", \"name\": \"internal.0\", \"metadata\": {\"min_n_below\": 500}}, \"1\": {\"filename\": \"internal.1\", \"name\": \"internal.1\", \"metadata\": {\"min_n_below\": 500}}, \"2\": {\"filename\": \"internal.2\", \"name\": \"internal.2\", \"metadata\": {\"min_n_below\": 500}}, \"3\": {\"filename\": \"internal.3\", \"name\": \"internal.3\", \"metadata\": {\"min_n_below\": 500}}, \"4\": {\"filename\": \"internal.4\", \"name\": \"internal.4\", \"metadata\": {\"min_n_below\": 500}}, \"5\": {\"filename\": \"internal.5\", \"name\": \"internal.5\", \"metadata\": {\"min_n_below\": 500}}}, \"signatures\": {\"6\": {\"filename\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"name\": \"6d6e87e1154e95b279e5e7db414bc37b\", \"metadata\": \"6d6e87e1154e95b279e5e7db414bc37b\"}, \"7\": {\"filename\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"name\": \"60f7e23c24a8d94791cc7a8680c493f9\", \"metadata\": \"60f7e23c24a8d94791cc7a8680c493f9\"}, \"8\": {\"filename\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"name\": \"0107d767a345eff67ecdaed2ee5cd7ba\", \"metadata\": \"0107d767a345eff67ecdaed2ee5cd7ba\"}, \"9\": {\"filename\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"name\": \"f71e78178af9e45e6f1d87a0c53c465c\", \"metadata\": \"f71e78178af9e45e6f1d87a0c53c465c\"}, \"10\": {\"filename\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"name\": \"f0c834bc306651d2b9321fb21d3e8d8f\", \"metadata\": \"f0c834bc306651d2b9321fb21d3e8d8f\"}, \"11\": {\"filename\": \"4e94e60265e04f0763142e20b52c0da1\", \"name\": \"4e94e60265e04f0763142e20b52c0da1\", \"metadata\": \"4e94e60265e04f0763142e20b52c0da1\"}, \"12\": {\"filename\": \"b59473c94ff2889eca5d7165936e64b3\", \"name\": \"b59473c94ff2889eca5d7165936e64b3\", \"metadata\": \"b59473c94ff2889eca5d7165936e64b3\"}}}\n"
  },
  {
    "path": "tests/test-data/v6.sbt.zip.mf.csv",
    "content": "# SOURMASH-MANIFEST-VERSION: 1.0\ninternal_location,md5,md5short,ksize,moltype,num,scaled,n_hashes,with_abundance,name,filename\r\n6d6e87e1154e95b279e5e7db414bc37b,6d6e87e1154e95b279e5e7db414bc37b,6d6e87e1,31,DNA,500,0,500,0,,SRR2255622_1.fastq.gz\r\n60f7e23c24a8d94791cc7a8680c493f9,60f7e23c24a8d94791cc7a8680c493f9,60f7e23c,31,DNA,500,0,500,0,,SRR2060939_1.fastq.gz\r\n0107d767a345eff67ecdaed2ee5cd7ba,0107d767a345eff67ecdaed2ee5cd7ba,0107d767,31,DNA,500,0,500,0,,SRR453566_1.fastq.gz\r\nf71e78178af9e45e6f1d87a0c53c465c,f71e78178af9e45e6f1d87a0c53c465c,f71e7817,31,DNA,500,0,500,0,,SRR2241509_1.fastq.gz\r\nf0c834bc306651d2b9321fb21d3e8d8f,f0c834bc306651d2b9321fb21d3e8d8f,f0c834bc,31,DNA,500,0,500,0,,SRR453569_1.fastq.gz\r\n4e94e60265e04f0763142e20b52c0da1,4e94e60265e04f0763142e20b52c0da1,4e94e602,31,DNA,500,0,500,0,,SRR2060939_2.fastq.gz\r\nb59473c94ff2889eca5d7165936e64b3,b59473c94ff2889eca5d7165936e64b3,b59473c9,31,DNA,500,0,500,0,,SRR453570_1.fastq.gz\r\n"
  },
  {
    "path": "tests/test__minhash_hypothesis.py",
    "content": "import pytest\n\nfrom hypothesis import given, example\nimport hypothesis.strategies as st\n\nfrom sourmash import MinHash\nfrom sourmash.minhash import _get_max_hash_for_scaled\n\n\n@given(\n    st.lists(st.integers(min_value=0, max_value=2**64 - 1), min_size=10, max_size=1000),\n    st.lists(st.integers(min_value=0, max_value=2**64 - 1), min_size=10, max_size=1000),\n    st.integers(min_value=10, max_value=1000),\n)\n@example([1, 2], [3, 4], 2)\ndef test_set_abundance_num_hypothesis(hashes, abundances, sketch_size):\n    a = MinHash(sketch_size, 10, track_abundance=True)\n    oracle = dict(zip(hashes, abundances))\n\n    a.set_abundances(oracle)\n\n    mins = a.hashes\n    size = min(sum(1 for v in oracle.values() if v > 0), sketch_size)\n    assert len(mins) == size\n\n    for k, v in mins.items():\n        assert oracle[k] == v\n\n\n@given(\n    st.lists(st.integers(min_value=0, max_value=2**64 - 1), min_size=10, max_size=1000),\n    st.lists(st.integers(min_value=0, max_value=2**64 - 1), min_size=10, max_size=1000),\n    st.integers(min_value=1000, max_value=10000),\n)\n@example([0], [0], 1000)\ndef test_set_abundance_scaled_hypothesis(hashes, abundances, scaled):\n    a = MinHash(0, 10, track_abundance=True, scaled=scaled)\n    oracle = dict(zip(hashes, abundances))\n\n    a.set_abundances(oracle)\n\n    max_hash = _get_max_hash_for_scaled(scaled)\n    below_max_hash = sum(1 for (k, v) in oracle.items() if k <= max_hash and v > 0)\n\n    mins = a.hashes\n    assert len(mins) == below_max_hash\n\n    for k, v in mins.items():\n        assert oracle[k] == v\n        assert k <= max_hash\n        assert v > 0\n"
  },
  {
    "path": "tests/test_api.py",
    "content": "import pytest\nimport sourmash\n\nimport sourmash_tst_utils as utils\nfrom sourmash.sourmash_args import load_one_signature, SaveSignaturesToLocation\n\n\n@utils.in_tempdir\ndef test_sourmash_signature_api(c):\n    e = sourmash.MinHash(n=1, ksize=20)\n    sig = sourmash.SourmashSignature(e)\n\n    with SaveSignaturesToLocation(c.output(\"xxx.sig\")) as save_sigs:\n        save_sigs.add(sig)\n\n    sig_x1 = load_one_signature(c.output(\"xxx.sig\"))\n    sig_x2 = list(sourmash.load_file_as_signatures(c.output(\"xxx.sig\")))[0]\n\n    assert sig_x1 == sig\n    assert sig_x2 == sig\n\n\n@utils.in_tempdir\ndef test_load_index_0_no_file(c):\n    with pytest.raises(ValueError) as exc:\n        sourmash.load_file_as_index(c.output(\"does-not-exist\"))\n    assert \"Error while reading signatures from \" in str(exc.value)\n\n\ndef test_load_index_1():\n    testfile = utils.get_test_data(\"prot/protein.sbt.zip\")\n    idx = sourmash.load_file_as_index(testfile)\n\n    sigs = list(idx.signatures())\n    assert len(sigs) == 2\n\n\ndef test_load_index_2():\n    testfile = utils.get_test_data(\"prot/protein.lca.json.gz\")\n    idx = sourmash.load_file_as_index(testfile)\n\n    sigs = list(idx.signatures())\n    assert len(sigs) == 2\n\n\ndef test_load_index_3():\n    testfile = utils.get_test_data(\"prot/protein/\")\n    idx = sourmash.load_file_as_index(testfile)\n\n    sigs = list(idx.signatures())\n    assert len(sigs) == 2\n\n\ndef test_load_index_4():\n    testfile = utils.get_test_data(\"prot/all.zip\")\n    idx = sourmash.load_file_as_index(testfile)\n\n    sigs = list(idx.signatures())\n    assert len(sigs) == 8\n\n\ndef test_load_index_4_b():\n    testfile = utils.get_test_data(\"prot/protein.zip\")\n    idx = sourmash.load_file_as_index(testfile)\n\n    sigs = list(idx.signatures())\n    assert len(sigs) == 2\n\n\ndef test_load_fasta_as_signature():\n    # try loading a fasta file - should fail with informative exception\n    testfile = utils.get_test_data(\"short.fa\")\n\n    with pytest.raises(Exception) as exc:\n        sourmash.load_file_as_index(testfile)\n\n    print(exc.value)\n\n    assert (\n        f\"Error while reading signatures from '{testfile}' - got sequences instead! Is this a FASTA/FASTQ file?\"\n        in str(exc.value)\n    )\n\n\ndef test_load_and_search_sbt_api():\n    treefile = utils.get_test_data(\"prot/protein.sbt.zip\")\n    queryfile = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n\n    tree = sourmash.load_file_as_index(treefile)\n    query = load_one_signature(queryfile)\n\n    results = list(tree.search(query, threshold=0))\n    assert len(results) == 2\n"
  },
  {
    "path": "tests/test_bugs.py",
    "content": "import sourmash_tst_utils as utils\n\n\n@utils.in_tempdir\ndef test_bug_803(c):\n    # can we do a 'sourmash search' on an LCA database and a query with abundance?\n    query = utils.get_test_data(\"track_abund/47.fa.sig\")\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    c.run_sourmash(\"search\", query, lca_db, \"--ignore-abundance\")\n    print(c)\n    assert \"NC_009665.1 Shewanella baltica OS185, complete genome\" in str(c)\n"
  },
  {
    "path": "tests/test_cmd_index.py",
    "content": "\"\"\"\nTests for 'sourmash index'.\n\"\"\"\n\nimport glob\nimport os\n\nimport pytest\nimport sourmash_tst_utils as utils\n\nimport sourmash\nfrom sourmash import sourmash_args, SourmashSignature\nfrom sourmash.sourmash_args import load_one_signature\n\n\ndef _index_filename(prefix, index_type):\n    if index_type == \"SBT\":\n        return prefix + \".sbt.zip\"\n    elif index_type == \"rocksdb\":\n        return prefix + \".rocksdb\"\n    elif index_type == \"zip\":\n        return prefix + \".sig.zip\"\n\n    raise Exception(f\"unknown index type: {index_type}\")\n\n\ndef test_index_signatures(runtmp, disk_index_type):\n    # test 'signatures' method from Index base class\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    index_name = _index_filename(\"zzz\", disk_index_type)\n    runtmp.run_sourmash(\n        \"index\", \"-k\", \"31\", index_name, sig47, sig63, \"-F\", disk_index_type\n    )\n\n    print(runtmp.last_result)\n    print(\"loading from:\", runtmp.output(index_name))\n\n    db = sourmash.load_file_as_index(runtmp.output(index_name))\n\n    xx = list(db.signatures())\n    assert len(xx) == 2\n\n    print(xx)\n\n    ss47 = sourmash_args.load_query_signature(sig47, 31, \"DNA\")\n    assert ss47 in xx\n    ss63 = sourmash_args.load_query_signature(sig47, 31, \"DNA\")\n    assert ss63 in xx\n\n\ndef test_search_metagenome(runtmp, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    index_name = _index_filename(\"zzz\", disk_index_type)\n    cmd = [\"index\", index_name, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(runtmp.output(index_name))\n\n    runtmp.sourmash(\"search\", query_sig, index_name, \"-k\", \"21\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \" 33.2%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"12 matches above threshold 0.080; showing first 3:\" in runtmp.last_result.out\n    )\n\n\n# explanation: you cannot downsample a scaled index to match a scaled\n# signature, so make sure that when you try such a search, it fails!\n# (you *can* downsample a signature to match an index.)\ndef test_search_metagenome_index_downsample_fail(runtmp, disk_index_type):\n    if disk_index_type in (\"zip\", \"rocksdb\"):\n        raise pytest.skip(\"this actually works fine on these files\")\n    # test downsample on index => failure, with --fail-on-empty-databases\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    db_out = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", \"-F\", disk_index_type, db_out]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n\n    print(\" \".join(cmd))\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(runtmp.output(db_out))\n\n    with pytest.raises(utils.SourmashCommandFailed):\n        runtmp.sourmash(\"search\", query_sig, db_out, \"-k\", \"21\", \"--scaled\", \"100000\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == -1\n    assert f\"ERROR: cannot use '{db_out}' for this query.\" in runtmp.last_result.err\n    assert (\n        \"search scaled value 100000 is less than database scaled value of 10000\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_search_metagenome_downsample_containment(runtmp, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    db_out = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", db_out, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(db_out)\n\n    runtmp.sourmash(\n        \"search\",\n        query_sig,\n        db_out,\n        \"-k\",\n        \"21\",\n        \"--scaled\",\n        \"100000\",\n        \"--containment\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \" 32.9%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"12 matches above threshold 0.080; showing first 3:\" in runtmp.last_result.out\n    )\n\n\ndef test_search_metagenome_downsample_index(runtmp, disk_index_type):\n    # does same search as search_metagenome_downsample_containment but\n    # rescales during indexing\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    db = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n\n    # downscale during indexing, rather than during search.\n    runtmp.run_sourmash(\n        \"index\",\n        db,\n        *testdata_sigs,\n        \"-k\",\n        \"21\",\n        \"--scaled\",\n        \"100000\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    assert os.path.exists(db)\n\n    runtmp.run_sourmash(\n        \"search\",\n        query_sig,\n        db,\n        \"-k\",\n        \"21\",\n        \"--containment\",\n        \"--scaled\",\n        \"100000\",\n    )\n    print(runtmp)\n\n    assert (\n        \" 32.9%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\"\n        in str(runtmp)\n    )\n    assert (\n        \" 29.7%       NC_003197.2 Salmonella enterica subsp. enterica serovar T\"\n        in str(runtmp)\n    )\n    assert \"12 matches above threshold 0.080; showing first 3:\" in str(runtmp)\n\n\ndef test_gather(runtmp, linear_gather, prefetch_gather, disk_index_type):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    dbname = runtmp.output(_index_filename(\"zzz\", disk_index_type))\n    runtmp.sourmash(\n        \"index\",\n        \"-k\",\n        \"31\",\n        dbname,\n        \"short.fa.sig\",\n        \"short2.fa.sig\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        dbname,\n        \"-o\",\n        \"foo.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n\n\ndef test_gather_metagenome(runtmp, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\"gather\", query_sig, dbname, \"-k\", \"21\", \"--threshold-bp=0\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in runtmp.last_result.out,\n            \"NC_011294.1 Salmonella enterica subs\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_metagenome_num_results(runtmp, disk_index_type):\n    # set a threshold on the number of results to be reported by gather\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n\n    runtmp.run_sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    cmd = f\"gather {query_sig} {dbname} -k 21 --num-results 10\"\n    cmd = cmd.split(\" \")\n    runtmp.run_sourmash(*cmd)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    out = runtmp.last_result.out\n\n    assert \"found 10 matches total\" in out\n    assert \"(truncated gather because --num-results=10)\" in out\n    assert \"the recovered matches hit 99.4% of the query\" in out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in out,\n            \"NC_003198.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert \"4.3 Mbp        2.1%    7.3%    NC_006511.1 Salmonella enterica subsp\" in out\n\n\ndef test_gather_metagenome_threshold_bp(\n    runtmp, linear_gather, prefetch_gather, disk_index_type\n):\n    # set a threshold on the gather output\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp\",\n        \"2e6\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"found less than 2.0 Mbp in common. => exiting\" in runtmp.last_result.err\n    assert \"the recovered matches hit 33.2% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_metagenome_threshold_bp_low(\n    runtmp, linear_gather, prefetch_gather, disk_index_type\n):\n    # set a threshold on the gather output => too low\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp\",\n        \"1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"found less than 1 bp in common. => exiting\" in runtmp.last_result.err\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n\n\ndef test_gather_metagenome_threshold_bp_too_high(\n    runtmp, linear_gather, prefetch_gather, disk_index_type\n):\n    # set a threshold on the gather output => no results\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp\",\n        \"5e6\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n    print(out)\n    print(err)\n\n    assert \"No matches found for --threshold-bp at 5.0 Mbp.\" in err\n\n\ndef test_gather_metagenome_abund(runtmp, disk_index_type):\n    testdata_glob = utils.get_test_data(\"track_abund/*.fa.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"SRR606249.sig.gz\")\n\n    dbname = runtmp.output(_index_filename(\"against\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"31\", \"-F\", disk_index_type]\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\"gather\", query_sig, dbname, \"-k\", \"31\", \"--threshold-bp=0\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"4.4 Mbp        0.6%  100.0%      10.4    NC_011663.1 \"\n        in runtmp.last_result.out\n    )\n\n\ndef test_gather_metagenome_downsample(\n    runtmp, prefetch_gather, linear_gather, disk_index_type\n):\n    # downsample w/scaled of 100,000\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--scaled\",\n        \"100000\",\n        prefetch_gather,\n        linear_gather,\n        \"--threshold-bp\",\n        \"50000\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 11 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"5.2 Mbp       32.9%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.1 Mbp        0.6%    2.4%\" in runtmp.last_result.out,\n            \"4.1 Mbp        4.4%   17.1%\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_save_matches(runtmp, linear_gather, prefetch_gather, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--save-matches\",\n        \"save.sigs\",\n        linear_gather,\n        prefetch_gather,\n        \"--threshold-bp\",\n        \"0\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert os.path.exists(runtmp.output(\"save.sigs\"))\n\n\ndef test_gather_save_matches_and_save_prefetch(runtmp, linear_gather, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        dbname,\n        \"-k\",\n        \"21\",\n        \"--save-matches\",\n        \"save.sigs\",\n        \"--save-prefetch\",\n        \"save2.sigs\",\n        linear_gather,\n        \"--threshold-bp\",\n        \"0\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n\n    matches_save = runtmp.output(\"save.sigs\")\n    prefetch_save = runtmp.output(\"save2.sigs\")\n    assert os.path.exists(matches_save)\n    assert os.path.exists(prefetch_save)\n\n    matches = list(sourmash.load_file_as_signatures(matches_save))\n    prefetch = list(sourmash.load_file_as_signatures(prefetch_save))\n\n    assert set(matches) == set(prefetch)\n\n\ndef test_gather_metagenome_picklist(runtmp, disk_index_type):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    dbname = runtmp.output(_index_filename(\"gcf_all\", disk_index_type))\n    cmd = [\"index\", dbname, *testdata_sigs, \"-k\", \"21\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(dbname)\n\n    pl = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n    runtmp.sourmash(\n        \"gather\", query_sig, dbname, \"-k\", \"21\", \"--picklist\", f\"{pl}:name:ident\"\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 7 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 58.3% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in runtmp.last_result.out,\n            \"NC_011294.1 Salmonella enterica subs\" in runtmp.last_result.out,\n        )\n    )\n    assert (\n        \"for given picklist, found 8 matches to 8 distinct values\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_index_best_containment_threshold_1(runtmp, disk_index_type):\n    # test best_containment() method, in some detail\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = sourmash_args.load_query_signature(sig2, 31, \"DNA\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    dbname = runtmp.output(_index_filename(\"test\", disk_index_type))\n    cmd = [\"index\", dbname, sig2, sig47, sig63, \"-k\", \"31\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    db = sourmash.load_file_as_index(dbname)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(ss2.minhash.hashes.keys()))\n    new_mh = ss2.minhash.copy_and_clear()\n\n    # query with empty hashes\n    assert not new_mh\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh))\n\n    # add one hash\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 1\n\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == ss2\n\n    # check with a threshold -> should be no results.\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n    # add three more hashes => length of 4\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 4\n\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == ss2\n\n    # check with a too-high threshold -> should be no results.\n    print(\"len mh\", len(new_mh))\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n\ndef test_index_best_containment_threshold_5(runtmp, disk_index_type):\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = sourmash_args.load_query_signature(sig2, 31, \"DNA\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    dbname = runtmp.output(_index_filename(\"test\", disk_index_type))\n    cmd = [\"index\", dbname, sig2, sig47, sig63, \"-k\", \"31\", \"-F\", disk_index_type]\n    runtmp.sourmash(*cmd)\n\n    db = sourmash.load_file_as_index(dbname)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(ss2.minhash.hashes.keys()))\n    new_mh = ss2.minhash.copy_and_clear()\n\n    # add five hashes\n    for i in range(5):\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n\n    # should get a result with no threshold (any match at all is returned)\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == ss2\n\n    # now, check with a threshold_bp that should be meet-able.\n    db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == ss2\n\n\ndef test_gather_single_return(runtmp, disk_index_type):\n    # test gather() number of returns\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    dbname = runtmp.output(_index_filename(\"db\", disk_index_type))\n\n    runtmp.sourmash(\n        \"index\",\n        dbname,\n        sig2file,\n        sig47file,\n        sig63file,\n        \"-k\",\n        \"31\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    db = sourmash.load_file_as_index(dbname)\n\n    # now, run best_containment. Right match?\n    sig63 = sourmash_args.load_query_signature(sig63file, 31, \"DNA\")\n    result = db.best_containment(sig63)\n    print(result)\n    assert result\n    assert result.score == 1.0\n\n\ndef test_sbt_jaccard_ordering(runtmp, disk_index_type):\n    # this tests a tricky situation where for three sketches A, B, C,\n    # |A intersect B| is greater than |A intersect C|\n    # _but_\n    # |A jaccard B| is less than |A intersect B|\n    a = sourmash.MinHash(ksize=31, n=0, scaled=2)\n    b = a.copy_and_clear()\n    c = a.copy_and_clear()\n\n    a.add_many([1, 2, 3, 4])\n    b.add_many([1, 2, 3] + list(range(10, 30)))\n    c.add_many([1, 5])\n\n    def _intersect(x, y):\n        return x.intersection_and_union_size(y)[0]\n\n    print(\"a intersect b:\", _intersect(a, b))\n    print(\"a intersect c:\", _intersect(a, c))\n    print(\"a jaccard b:\", a.jaccard(b))\n    print(\"a jaccard c:\", a.jaccard(c))\n    assert _intersect(a, b) > _intersect(a, c)\n    assert a.jaccard(b) < a.jaccard(c)\n\n    # thresholds to use:\n    assert a.jaccard(b) < 0.15\n    assert a.jaccard(c) > 0.15\n\n    # now - make signatures, build index, try out.\n    ss_a = sourmash.SourmashSignature(a, name=\"A\")\n    ss_b = sourmash.SourmashSignature(b, name=\"B\")\n    ss_c = sourmash.SourmashSignature(c, name=\"C\")\n\n    sigsfile = runtmp.output(\"insigs.sig.zip\")\n    with sourmash_args.SaveSignaturesToLocation(sigsfile) as save_sigs:\n        save_sigs.add(ss_a)\n        save_sigs.add(ss_b)\n        save_sigs.add(ss_c)\n\n    index_name = _index_filename(\"db\", disk_index_type)\n    runtmp.sourmash(\n        \"index\", \"-F\", disk_index_type, index_name, sigsfile, \"--scaled\", \"2\"\n    )\n\n    db = sourmash.load_file_as_index(runtmp.output(index_name))\n\n    sr = db.search(ss_a, threshold=0.15)\n    print(sr)\n    assert len(sr) == 2\n    assert sr[0].signature == ss_a\n    assert sr[0].score == 1.0\n    assert sr[1].signature == ss_c\n    assert sr[1].score == 0.2\n\n\ndef test_index_protein(runtmp, disk_index_type):\n    # test command-line creation of databases with protein sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = runtmp.output(_index_filename(\"protein\", disk_index_type))\n\n    runtmp.run_sourmash(\n        \"index\",\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--protein\",\n        \"-F\",\n        disk_index_type,\n    )\n    assert os.path.exists(db_out), db_out\n\n    db2 = sourmash.load_file_as_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2.location\n    assert result.location == db_out\n\n\ndef test_index_protein_search_no_threshold(runtmp, disk_index_type):\n    # test the '.search' method on indexes w/no threshold\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = runtmp.output(_index_filename(\"protein\", disk_index_type))\n\n    runtmp.run_sourmash(\n        \"index\",\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--protein\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    db2 = sourmash.load_file_as_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n\n    # and search, gather\n    with pytest.raises(TypeError) as exc:\n        db2.search(sig1)\n    assert \"'search' requires 'threshold'\" in str(exc)\n\n\ndef test_index_protein_command_search(runtmp, disk_index_type):\n    # test command-line search/gather of on-disk databases with protein sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n\n    if disk_index_type == \"zip\":\n        db_out = utils.get_test_data(\"prot/protein.zip\")\n    else:\n        db_out = utils.get_test_data(_index_filename(\"prot/protein\", disk_index_type))\n\n    runtmp.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in runtmp.last_result.out\n\n    runtmp.run_sourmash(\"gather\", sigfile1, db_out)\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n\n\ndef test_index_hp_command_index(runtmp, disk_index_type):\n    # test command-line creation of on-disk databases with hp sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = runtmp.output(_index_filename(\"hp\", disk_index_type))\n\n    runtmp.run_sourmash(\n        \"index\",\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--hp\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    db2 = sourmash.load_file_as_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert results\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2.location\n    assert result.location == db_out\n\n\ndef test_index_hp_command_search(runtmp, disk_index_type):\n    # test command-line search/gather of on-disk databases with hp sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    if disk_index_type == \"zip\":\n        db_out = utils.get_test_data(\"prot/hp.zip\")\n    else:\n        db_out = utils.get_test_data(_index_filename(\"prot/hp\", disk_index_type))\n\n    runtmp.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in runtmp.last_result.out\n\n    runtmp.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n\n\ndef test_index_dayhoff_command_index(runtmp, disk_index_type):\n    # test command-line creation of on-disk databases with dayhoff sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = runtmp.output(_index_filename(\"dayhoff\", disk_index_type))\n\n    runtmp.run_sourmash(\n        \"index\",\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--dayhoff\",\n        \"-F\",\n        disk_index_type,\n    )\n\n    db2 = sourmash.load_file_as_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2.location\n    assert result.location == db_out\n\n\ndef test_index_dayhoff_command_search(runtmp, disk_index_type):\n    # test command-line search/gather of on-disk databases with dayhoff sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    if disk_index_type == \"zip\":\n        db_out = utils.get_test_data(\"prot/dayhoff.zip\")\n    else:\n        db_out = utils.get_test_data(_index_filename(\"prot/dayhoff\", disk_index_type))\n\n    runtmp.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in runtmp.last_result.out\n\n    runtmp.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n\n\ndef test_index_skipm1n3_command_search(runtmp, disk_index_type):\n    # test command-line search/gather of on-disk databases with skipm1n3 sigs\n    sig2file = utils.get_test_data(\"skipmers/2.skip.sig.zip\")\n    sig47file = utils.get_test_data(\"skipmers/47.skip.sig.zip\")\n    sig63file = utils.get_test_data(\"skipmers/63.skip.sig.zip\")\n\n    db_out = runtmp.output(_index_filename(\"skipm1n3\", disk_index_type))\n\n    runtmp.sourmash(\n        \"index\",\n        \"-F\",\n        disk_index_type,\n        db_out,\n        sig2file,\n        sig47file,\n        sig63file,\n        \"--skipm1n3\",\n        \"-k\",\n        \"31\",\n    )\n    assert os.path.exists(runtmp.output(db_out))\n\n    db = sourmash.load_file_as_index(db_out)\n    sig47 = sourmash_args.load_query_signature(sig47file, 31, \"skipm1n3\")\n    sig63 = sourmash_args.load_query_signature(sig63file, 31, \"skipm1n3\")\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db.signatures()]\n    assert len(mh_list) == 3\n    assert sig47.minhash in mh_list\n    assert sig63.minhash in mh_list\n\n    # and search, gather\n    results = db.search(\n        sig47,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 3\n\n    result = db.best_containment(sig63)\n    assert result.score == 1.0\n    assert result.location == db.location\n    assert result.location == db_out\n\n\ndef test_index_skipm2n3_command_search(runtmp, disk_index_type):\n    # test command-line search/gather of on-disk databases with skipm2n3 sigs\n    sig2file = utils.get_test_data(\"skipmers/2.skip.sig.zip\")\n    sig47file = utils.get_test_data(\"skipmers/47.skip.sig.zip\")\n    sig63file = utils.get_test_data(\"skipmers/63.skip.sig.zip\")\n\n    db_out = runtmp.output(_index_filename(\"skipm2n3\", disk_index_type))\n\n    runtmp.sourmash(\n        \"index\",\n        \"-F\",\n        disk_index_type,\n        db_out,\n        sig2file,\n        sig47file,\n        sig63file,\n        \"--skipm2n3\",\n        \"-k\",\n        \"31\",\n    )\n    assert os.path.exists(runtmp.output(db_out))\n\n    db = sourmash.load_file_as_index(db_out)\n    sig47 = sourmash_args.load_query_signature(sig47file, 31, \"skipm2n3\")\n    sig63 = sourmash_args.load_query_signature(sig63file, 31, \"skipm2n3\")\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db.signatures()]\n    assert len(mh_list) == 3\n    assert sig47.minhash in mh_list\n    assert sig63.minhash in mh_list\n\n    # and search, gather\n    results = db.search(\n        sig47,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 3\n\n    result = db.best_containment(sig63)\n    assert result.score == 1.0\n    assert result.location == db.location\n    assert result.location == db_out\n"
  },
  {
    "path": "tests/test_cmd_signature.py",
    "content": "\"\"\"\nTests for the 'sourmash signature' command line.\n\"\"\"\n\nimport csv\nimport shutil\nimport os\nimport glob\nimport gzip\n\nimport pytest\nimport screed\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash.signature import (\n    load_signatures_from_json,\n    save_signatures_to_json,\n    load_one_signature_from_json,\n)\nfrom sourmash.manifest import CollectionManifest\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash.sourmash_args import load_one_signature\n\n\n## command line tests\n\n\ndef _write_file(runtmp, basename, lines, *, gz=False):\n    loc = runtmp.output(basename)\n    if gz:\n        xopen = gzip.open\n    else:\n        xopen = open\n\n    with xopen(loc, \"wt\") as fp:\n        fp.write(\"\\n\".join(lines))\n    return loc\n\n\ndef test_run_sourmash_signature_cmd():\n    status, out, err = utils.runscript(\"sourmash\", [\"signature\"], fail_ok=True)\n    assert \"sourmash: error: argument cmd: invalid choice:\" not in err\n    assert \"Manipulate signature files:\" in out\n    assert status != 0  # no args provided, ok ;)\n\n\ndef test_run_sourmash_sig_cmd():\n    status, out, err = utils.runscript(\"sourmash\", [\"sig\"], fail_ok=True)\n    assert \"sourmash: error: argument cmd: invalid choice:\" not in err\n    assert \"Manipulate signature files:\" in out\n    assert status != 0  # no args provided, ok ;)\n\n\ndef test_run_cat_via_parse_args():\n    # run a command ('sourmash.sig.cat') with args constructed via parse_args\n    import sourmash.sig\n    import sourmash.cli\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    args = sourmash.cli.parse_args([\"sig\", \"cat\", sig47])\n    sourmash.sig.cat(args)\n\n\ndef test_sig_merge_1_use_full_signature_in_cmd(runtmp):\n    c = runtmp\n\n    # merge of 47 & 63 should be union of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n    c.run_sourmash(\"signature\", \"merge\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\ndef test_sig_merge_1_fromfile_picklist(runtmp):\n    c = runtmp\n\n    # merge of 47 & 63 should be union of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47, sig63])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\", \"38729c63\"])\n\n    c.run_sourmash(\n        \"signature\",\n        \"merge\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\ndef test_sig_merge_1_fromfile_picklist_gz(runtmp):\n    # test with --from-file and gzipped picklist\n    c = runtmp\n\n    # merge of 47 & 63 should be union of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47, sig63])\n    picklist = _write_file(\n        runtmp, \"pl.csv\", [\"md5short\", \"09a08691\", \"38729c63\"], gz=True\n    )\n\n    c.run_sourmash(\n        \"signature\",\n        \"merge\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_1(c):\n    # merge of 47 & 63 should be union of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n    c.run_sourmash(\"sig\", \"merge\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_1_multisig(c):\n    # merge of 47 & 63 should be union of mins; here, sigs are in same file.\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n    c.run_sourmash(\"sig\", \"merge\", multisig, \"--flatten\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_1_name(c):\n    # check name arg\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    assignedSigName = \"SIG_NAME\"\n    outsig = c.output(\"merged2and63.sig\")\n\n    c.run_sourmash(\n        \"sig\",\n        \"merge\",\n        sig2,\n        sig63,\n        \"--dna\",\n        \"-k\",\n        \"31\",\n        \"-o\",\n        \"merged2and63.sig\",\n        \"--name\",\n        assignedSigName,\n    )\n\n    test_merge_sig = load_one_signature_from_json(outsig)\n\n    print(\"outsig\", outsig)\n    print(\"xx_test_merge_sig.name\", test_merge_sig.name)\n\n    assert assignedSigName == test_merge_sig.name\n\n\n@utils.in_tempdir\ndef test_sig_merge_1_ksize_moltype(c):\n    # check ksize, moltype args\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig2and63 = utils.get_test_data(\"2+63.fa.sig\")\n    c.run_sourmash(\"sig\", \"merge\", sig2, sig63, \"--dna\", \"-k\", \"31\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig2and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_1_ksize_moltype_fail(c):\n    # check ksize, moltype args\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    utils.get_test_data(\"2+63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"sig\", \"merge\", sig2, sig63)\n\n    assert \"ERROR when merging signature\" in str(exc.value)\n\n\n@utils.in_tempdir\ndef test_sig_merge_2(c):\n    # merge of 47 with nothing should be 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"merge\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_3_abund_ab_ok(c):\n    # merge of 47 and 63 with abund should work\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63abund = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"merge\", sig47abund, sig63abund)\n    load_one_signature_from_json(c.last_result.out)\n    # CTB: should check that this merge did what we think it should do!\n\n\n@utils.in_tempdir\ndef test_sig_merge_3_abund_ab(c):\n    # merge of 47 with abund, with 63 without, should fail; and vice versa\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63abund = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"merge\", sig47, sig63abund)\n\n    print(c.last_result)\n    assert (\n        \"incompatible signatures: track_abundance is False in first sig, True in second\"\n        in c.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_sig_merge_3_abund_ba(c):\n    # merge of 47 without abund, with 63 with, should fail\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63abund = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"merge\", sig63abund, sig47)\n\n    print(c.last_result)\n    assert (\n        \"incompatible signatures: track_abundance is True in first sig, False in second\"\n        in c.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_sig_filter_1(c):\n    # test basic filtering\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"filter\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    filtered_sigs = list(load_signatures_from_json(out))\n    filtered_sigs.sort(key=lambda x: str(x))\n\n    assert len(filtered_sigs) == 2\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    assert filtered_sigs[0].minhash == ss47.minhash\n    assert filtered_sigs[0].name == ss47.name\n    assert filtered_sigs[1].minhash == ss63.minhash\n    assert filtered_sigs[1].name == ss63.name\n\n\n@utils.in_tempdir\ndef test_sig_filter_2(c):\n    # test basic filtering\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    c.run_sourmash(\"sig\", \"filter\", \"-m\", \"2\", \"-M\", \"5\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    filtered_sig = load_one_signature_from_json(out)\n    test_sig = load_one_signature_from_json(sig47)\n\n    abunds = test_sig.minhash.hashes\n    abunds = {k: v for (k, v) in abunds.items() if v >= 2 and v <= 5}\n    assert abunds\n\n    assert filtered_sig.minhash.hashes == abunds\n\n\n@utils.in_tempdir\ndef test_sig_filter_3(c):\n    # test basic filtering\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    c.run_sourmash(\"sig\", \"filter\", \"-m\", \"2\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    filtered_sig = load_one_signature_from_json(out)\n    test_sig = load_one_signature_from_json(sig47)\n\n    abunds = test_sig.minhash.hashes\n    abunds = {k: v for (k, v) in abunds.items() if v >= 2}\n    assert abunds\n\n    assert filtered_sig.minhash.hashes == abunds\n\n\n@utils.in_tempdir\ndef test_sig_filter_3_ksize_select(c):\n    # test filtering with ksize selectiong\n    psw_mag = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    c.run_sourmash(\"sig\", \"filter\", \"-m\", \"2\", psw_mag, \"-k\", \"31\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    filtered_sig = load_one_signature_from_json(out)\n    test_sig = load_one_signature_from_json(psw_mag, ksize=31)\n\n    abunds = test_sig.minhash.hashes\n    abunds = {k: v for (k, v) in abunds.items() if v >= 2}\n    assert abunds\n\n    assert filtered_sig.minhash.hashes == abunds\n\n\n@utils.in_tempdir\ndef test_sig_merge_flatten(c):\n    # merge of 47 without abund, with 63 with, will succeed with --flatten\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63abund = utils.get_test_data(\"track_abund/63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"merge\", sig63abund, sig47, \"--flatten\")\n\n    print(c.last_result)\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_merge_flatten_2(c):\n    # merge of 47 with abund, with 63 with, will succeed with --flatten\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"merge\", sig63, sig47abund, \"--flatten\")\n\n    print(c.last_result)\n    out = c.last_result.out\n\n    test_merge_sig = load_one_signature_from_json(sig47and63)\n    actual_merge_sig = load_one_signature_from_json(out)\n\n    print(test_merge_sig.minhash)\n    print(actual_merge_sig.minhash)\n    print(out)\n\n    assert actual_merge_sig.minhash == test_merge_sig.minhash\n\n\ndef test_sig_intersect_0(runtmp):\n    # should print usage when no arguments\n    c = runtmp\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"intersect\")\n\n    err = c.last_result.err\n    assert \"no signatures provided to intersect!?\" in err\n\n\ndef test_sig_intersect_1(runtmp):\n    c = runtmp\n\n    # intersect of 47 and 63 should be intersection of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63-intersect.fa.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_intersect_sig = load_one_signature_from_json(sig47and63)\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    print(test_intersect_sig.minhash)\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_intersect_sig.minhash\n\n\ndef test_sig_intersect_1_rename(runtmp):\n    # intersect of 47 and 63 should be intersection of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63-intersect.fa.sig\")\n    runtmp.run_sourmash(\"sig\", \"intersect\", sig47, sig63, \"--set-name\", \"footest\")\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_intersect_sig = load_one_signature_from_json(sig47and63)\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    print(test_intersect_sig.minhash)\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_intersect_sig.minhash\n    assert actual_intersect_sig.name == \"footest\"\n\n\ndef test_sig_intersect_1_fromfile_picklist(runtmp):\n    c = runtmp\n\n    # intersect of 47 and 63 should be intersection of mins\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63-intersect.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47, sig63])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\", \"38729c63\"])\n\n    c.run_sourmash(\n        \"signature\",\n        \"intersect\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_intersect_sig = load_one_signature_from_json(sig47and63)\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    print(test_intersect_sig.minhash)\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_intersect_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_intersect_2(c):\n    # intersect of 47 with abund and 63 with abund should be same\n    # as without abund, i.e. intersect 'flattens'\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    sig47and63 = utils.get_test_data(\"47+63-intersect.fa.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_intersect_sig = load_one_signature_from_json(sig47and63)\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    print(test_intersect_sig.minhash)\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_intersect_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_intersect_3(c):\n    # use --abundances-from to preserve abundances from sig #47\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", \"--abundances-from\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    # actually do an intersection ourselves for the test\n    mh47 = load_one_signature_from_json(sig47).minhash\n    mh63 = load_one_signature_from_json(sig63).minhash\n    mh47_abunds = mh47.hashes\n    mh63_mins = set(mh63.hashes.keys())\n\n    # get the set of mins that are in common\n    mh63_mins.intersection_update(mh47_abunds)\n\n    # take abundances from mh47 & create new sig\n    mh47_abunds = {k: mh47_abunds[k] for k in mh63_mins}\n    test_mh = mh47.copy_and_clear()\n    test_mh.set_abundances(mh47_abunds)\n\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_mh\n\n\n@utils.in_tempdir\ndef test_sig_intersect_4(c):\n    # use --abundances-from to preserve abundances from sig #47\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", \"--abundances-from\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    # actually do an intersection ourselves for the test\n    mh47 = load_one_signature_from_json(sig47).minhash\n    mh63 = load_one_signature_from_json(sig63).minhash\n    mh47_abunds = mh47.hashes\n    mh63_mins = set(mh63.hashes.keys())\n\n    # get the set of mins that are in common\n    mh63_mins.intersection_update(mh47_abunds)\n\n    # take abundances from mh47 & create new sig\n    mh47_abunds = {k: mh47_abunds[k] for k in mh63_mins}\n    test_mh = mh47.copy_and_clear()\n    test_mh.set_abundances(mh47_abunds)\n\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_mh\n\n\n@utils.in_tempdir\ndef test_sig_intersect_5(c):\n    # use --abundances-from to preserve abundances from sig #47\n    # make sure that you can't specify a flat sig for --abundances-from\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"intersect\", \"--abundances-from\", sig47, sig63)\n\n\n@utils.in_tempdir\ndef test_sig_intersect_6_ksize_fail(c):\n    # specify ksize to intersect 2.fa.sig with 47.fa.sig - 2.fa.sig contains\n    # multiple ksizes.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"intersect\", sig2, sig47)\n\n\n@utils.in_tempdir\ndef test_sig_intersect_6_ksize_succeed(c):\n    # specify ksize to intersect 2.fa.sig with 47.fa.sig - 2.fa.sig contains\n    # multiple ksizes.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"intersect\", \"-k\", \"31\", sig2, sig47)\n\n    assert \"loaded and intersected 2 signatures\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_sig_intersect_7(c):\n    # intersect of 47 and nothing should be self\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_intersect_sig = load_one_signature_from_json(sig47)\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    print(test_intersect_sig.minhash)\n    print(actual_intersect_sig.minhash)\n    print(out)\n\n    assert actual_intersect_sig.minhash == test_intersect_sig.minhash\n\n\n@utils.in_tempdir\ndef test_sig_intersect_8_multisig(c):\n    # intersect of all the multisig stuff should be nothing\n    sig47 = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"intersect\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    actual_intersect_sig = load_one_signature_from_json(out)\n\n    assert not len(actual_intersect_sig.minhash)\n\n\ndef test_sig_inflate_1(runtmp):\n    # basic inflate test - inflate 47 flat with 47 abund\n    sig47_flat = utils.get_test_data(\"47.fa.sig\")\n    sig47_abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    runtmp.run_sourmash(\"sig\", \"inflate\", sig47_abund, sig47_flat)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    actual_inflate_sig = load_one_signature_from_json(out)\n    actual_inflate_mh = actual_inflate_sig.minhash\n\n    # should be identical to track_abund sig\n    sig47 = load_one_signature_from_json(sig47_abund)\n    mh47 = sig47.minhash\n\n    assert actual_inflate_sig.name == sig47.name\n    assert actual_inflate_mh == mh47\n\n\ndef test_sig_inflate_2(runtmp):\n    # use abundances from sig #47\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    runtmp.run_sourmash(\"sig\", \"inflate\", sig47, sig63)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    actual_inflate_sig = load_one_signature_from_json(out)\n\n    # actually do an inflation ourselves for the test\n    mh47 = load_one_signature_from_json(sig47).minhash\n    mh63 = load_one_signature_from_json(sig63).minhash\n    mh47_abunds = mh47.hashes\n    mh63_mins = set(mh63.hashes.keys())\n\n    # get the set of mins that are in common\n    mh63_mins.intersection_update(mh47_abunds)\n\n    # take abundances from mh47 & create new sig\n    mh47_abunds = {k: mh47_abunds[k] for k in mh63_mins}\n    test_mh = mh47.copy_and_clear()\n    test_mh.set_abundances(mh47_abunds)\n\n    print(actual_inflate_sig.minhash)\n    print(out)\n\n    assert actual_inflate_sig.minhash == test_mh\n\n\ndef test_sig_inflate_3(runtmp):\n    # should fail on flat first sig\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"inflate\", sig63, sig47)\n\n    assert \"has no abundances\" in runtmp.last_result.err\n\n\ndef test_sig_inflate_4_picklist(runtmp):\n    # try out picklists\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig47_flat = utils.get_test_data(\"47.fa.sig\")\n\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    _write_file(runtmp, \"pl.csv\", [\"md5\", ss63.md5sum()])\n\n    print(ss63.md5sum())\n\n    runtmp.run_sourmash(\n        \"sig\", \"inflate\", sig47, sig63, sig47_flat, \"--picklist\", \"pl.csv:md5:md5\"\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    actual_inflate_sig = load_one_signature_from_json(out)\n\n    # actually do an inflation ourselves for the test\n    mh47 = load_one_signature_from_json(sig47).minhash\n    mh63 = load_one_signature_from_json(sig63).minhash\n    mh47_abunds = mh47.hashes\n    mh63_mins = set(mh63.hashes.keys())\n\n    # get the set of mins that are in common\n    mh63_mins.intersection_update(mh47_abunds)\n\n    # take abundances from mh47 & create new sig\n    mh47_abunds = {k: mh47_abunds[k] for k in mh63_mins}\n    test_mh = mh47.copy_and_clear()\n    test_mh.set_abundances(mh47_abunds)\n\n    print(actual_inflate_sig.minhash)\n    print(out)\n\n    assert actual_inflate_sig.minhash == test_mh\n\n\ndef test_sig_inflate_5_bad_moltype(runtmp):\n    # should fail when no signatures match moltype\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    prot = utils.get_test_data(\"prot/protein.zip\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"inflate\", sig47, prot)\n\n    assert \"no signatures to inflate\" in runtmp.last_result.err\n\n\ndef test_sig_subtract_1(runtmp):\n    c = runtmp\n    # subtract of 63 from 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test1_sig = load_one_signature_from_json(sig47)\n    test2_sig = load_one_signature_from_json(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n\n\ndef test_sig_subtract_1_name(runtmp):\n    # subtract of 63 from 47; rename\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    runtmp.run_sourmash(\"sig\", \"subtract\", sig47, sig63, \"--set-name\", \"footest\")\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test1_sig = load_one_signature_from_json(sig47)\n    test2_sig = load_one_signature_from_json(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n    assert actual_subtract_sig.name == \"footest\"\n\n\ndef test_sig_subtract_1_sigzip(runtmp):\n    c = runtmp\n    # subtract of 63 from 47\n    sig47 = utils.get_test_data(\"47.fa.sig.zip\")\n    sig63 = utils.get_test_data(\"63.fa.sig.zip\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    from sourmash import sourmash_args\n\n    test1_sig = sourmash_args.load_one_signature(sig47)\n    test2_sig = sourmash_args.load_one_signature(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n\n\ndef test_sig_subtract_1_sigzip(runtmp):\n    c = runtmp\n    # subtract of 63 from 47\n    sig47 = utils.get_test_data(\"47.fa.sig.zip\")\n    sig63 = utils.get_test_data(\"63.fa.sig.zip\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig63)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    from sourmash import sourmash_args\n\n    test1_sig = sourmash_args.load_one_signature(sig47)\n    test2_sig = sourmash_args.load_one_signature(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n\n\ndef test_sig_subtract_1_abund(runtmp):\n    # subtract 63 from 47, with abundances borrowed from 47\n\n    c = runtmp\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig63, \"-A\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test1_sig = load_one_signature_from_json(sig47)\n    test2_sig = load_one_signature_from_json(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n    assert actual_subtract_sig.minhash.track_abundance\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n\n    distinct_abunds = set()\n    actual_sub_hashes = actual_subtract_sig.minhash.hashes\n    sig47_hashes = test1_sig.minhash.hashes\n    for h in mins:\n        assert actual_sub_hashes[h] == sig47_hashes[h]\n        distinct_abunds.add(sig47_hashes[h])\n\n    # this is really just to make sure that we have a sketch with some\n    # abundances in it...\n    assert max(distinct_abunds) > 1\n\n\ndef test_sig_subtract_1_abund_is_flat(runtmp):\n    # subtract 63 from 47, with abundances borrowed from 47\n\n    c = runtmp\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    sig47_flat = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"subtract\", sig47, sig63, \"-A\", sig47_flat)\n\n\ndef test_sig_subtract_1_flatten(runtmp):\n    # subtract 63 from 47, with abund signatures originally and --flatten\n\n    c = runtmp\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig63, \"--flatten\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test1_sig = load_one_signature_from_json(sig47)\n    test2_sig = load_one_signature_from_json(sig63)\n    actual_subtract_sig = load_one_signature_from_json(out)\n    assert not actual_subtract_sig.minhash.track_abundance\n\n    mins = set(test1_sig.minhash.hashes.keys())\n    mins -= set(test2_sig.minhash.hashes.keys())\n\n    assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins)\n\n\ndef test_sig_subtract_1_multisig(runtmp):\n    c = runtmp\n    # subtract of everything from 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"subtract\", sig47, multisig, \"--flatten\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    actual_subtract_sig = load_one_signature_from_json(out)\n\n    assert not set(actual_subtract_sig.minhash.hashes.keys())\n\n\ndef test_sig_subtract_2(runtmp):\n    c = runtmp\n    # subtract of 63 from 47 should fail if 47 has abund\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"subtract\", sig47, sig63)\n\n\ndef test_sig_subtract_3(runtmp):\n    c = runtmp\n    # subtract of 63 from 47 should fail if 63 has abund\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"subtract\", sig47, sig63)\n\n\ndef test_sig_subtract_4_ksize_fail(runtmp):\n    c = runtmp\n    # subtract of 2 from 47 should fail without -k specified\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"subtract\", sig47, sig2)\n\n\ndef test_sig_subtract_4_ksize_succeed(runtmp):\n    c = runtmp\n    # subtract of 2 from 47 should fail without -k specified\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"subtract\", sig47, sig2, \"-k\", \"31\")\n    assert \"loaded and subtracted 1 signatures\" in c.last_result.err\n\n\ndef test_sig_subtract_5_bad_moltype(runtmp):\n    # should fail when no matching sigs\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    prot = utils.get_test_data(\"prot/protein.zip\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"subtract\", \"-k\", \"31\", sig47, prot)\n\n    assert \"no signatures to subtract\" in runtmp.last_result.err\n\n\ndef test_sig_rename_1(runtmp):\n    c = runtmp\n\n    # set new name for 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"rename\", sig47, \"fiz bar\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_rename_sig = load_one_signature_from_json(sig47)\n    actual_rename_sig = load_one_signature_from_json(out)\n\n    print(test_rename_sig.minhash)\n    print(actual_rename_sig.minhash)\n\n    assert actual_rename_sig.minhash == test_rename_sig.minhash\n    assert test_rename_sig.name != actual_rename_sig.name\n    assert actual_rename_sig.name == \"fiz bar\"\n\n\ndef test_sig_rename_1_fromfile_picklist(runtmp):\n    c = runtmp\n\n    # set new name for 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\"])\n\n    c.run_sourmash(\n        \"sig\",\n        \"rename\",\n        \"--from-file\",\n        from_file,\n        \"fiz bar\",\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_rename_sig = load_one_signature_from_json(sig47)\n    actual_rename_sig = load_one_signature_from_json(out)\n\n    print(test_rename_sig.minhash)\n    print(actual_rename_sig.minhash)\n\n    assert actual_rename_sig.minhash == test_rename_sig.minhash\n    assert test_rename_sig.name != actual_rename_sig.name\n    assert actual_rename_sig.name == \"fiz bar\"\n\n\n@utils.in_tempdir\ndef test_sig_rename_1_multisig(c):\n    # set new name for multiple signatures/files\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    other_sig = utils.get_test_data(\"2.fa.sig\")\n    c.run_sourmash(\"sig\", \"rename\", multisig, other_sig, \"fiz bar\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    n = 0\n    for sig in load_signatures_from_json(out):\n        assert sig.name == \"fiz bar\"\n        n += 1\n\n    assert n == 9, n\n\n\n@utils.in_tempdir\ndef test_sig_rename_1_multisig_ksize(c):\n    # set new name for multiple signatures/files; select k=31\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    other_sig = utils.get_test_data(\"2.fa.sig\")\n    c.run_sourmash(\"sig\", \"rename\", multisig, other_sig, \"fiz bar\", \"-k\", \"31\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    n = 0\n    for sig in load_signatures_from_json(out):\n        assert sig.name == \"fiz bar\"\n        n += 1\n\n    assert n == 7, n\n\n\n@utils.in_tempdir\ndef test_sig_rename_2_output_to_same(c):\n    # change name of signature \"in place\", same output file\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    inplace = c.output(\"inplace.sig\")\n    shutil.copyfile(sig47, inplace)\n\n    print(inplace)\n\n    c.run_sourmash(\"sig\", \"rename\", \"-d\", inplace, \"fiz bar\", \"-o\", inplace)\n\n    actual_rename_sig = load_one_signature_from_json(inplace)\n    assert actual_rename_sig.name == \"fiz bar\"\n\n\n@utils.in_tempdir\ndef test_sig_rename_3_file_dne(c):\n    # rename on a file that does not exist should fail!\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"rename\", \"no-such-sig\", \"fiz bar\")\n\n    assert \"Error while reading signatures from 'no-such-sig'\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_sig_rename_3_file_dne_force(c):\n    # rename on a file that does not exist should fail!\n    c.run_sourmash(\"sig\", \"rename\", \"no-such-sig\", \"fiz bar\", \"-f\")\n    print(c.last_result.err)\n\n    assert \"Error while reading signatures from 'no-such-sig'\" in c.last_result.err\n\n\ndef test_sig_rename_4_pattern_include(runtmp):\n    # test sig rename --include-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n    runtmp.sourmash(\n        \"sig\", \"rename\", \"--include\", \"shewanella\", *sigfiles, \"SHEWME\", \"-o\", \"out.zip\"\n    )\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert n == \"SHEWME\"\n    assert len(names) == 2\n\n\ndef test_sig_rename_4_pattern_exclude(runtmp):\n    # test sig rename --exclude-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n    runtmp.sourmash(\n        \"sig\", \"rename\", \"--exclude\", \"shewanella\", *sigfiles, \"NOSHEW\", \"-o\", \"out.zip\"\n    )\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert n == \"NOSHEW\"\n    assert len(names) == 6\n\n\n@utils.in_thisdir\ndef test_sig_cat_1(c):\n    # cat 47 to 47...\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"cat\", sig47)\n\n    # stdout should be same signature\n    out = c.last_result.out\n\n    test_cat_sig = load_one_signature_from_json(sig47)\n    actual_cat_sig = load_one_signature_from_json(out)\n\n    assert actual_cat_sig == test_cat_sig\n\n\n@utils.in_thisdir\ndef test_sig_cat_1_no_unique(c):\n    # cat 47 to 47... twice\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"cat\", sig47, sig47)\n\n    # stdout should be same signature\n    out = c.last_result.out\n\n    test_cat_sig = load_one_signature_from_json(sig47)\n    actual_cat_sigs = load_signatures_from_json(out)\n\n    for n, sig in enumerate(actual_cat_sigs):\n        assert sig == test_cat_sig\n\n    assert n == 1  # two signatures, but enumerate stops at 1.\n    assert \"encountered 1 MinHashes multiple times\" in c.last_result.err\n\n\n@utils.in_thisdir\ndef test_sig_cat_1_unique(c):\n    # cat 47 to 47... twice... and get unique\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"cat\", sig47, sig47, \"--unique\")\n\n    # stdout should be same signature\n    out = c.last_result.out\n    err = c.last_result.err\n\n    test_cat_sig = load_one_signature_from_json(sig47)\n    actual_cat_sigs = load_signatures_from_json(out)\n\n    for n, sig in enumerate(actual_cat_sigs):\n        assert sig == test_cat_sig\n\n    assert n == 0  # enumerate stops at 0, first sig.\n    assert \"encountered 1 MinHashes multiple times\" in err\n    assert \"...and removed the duplicates, because --unique was specified.\" in err\n\n\n@utils.in_thisdir\ndef test_sig_cat_2(c):\n    # cat several\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"cat\", sig47, sig47abund, multisig)\n\n    # stdout should be same signatures\n    out = c.last_result.out\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 57e2b22f), SourmashSignature('NC_009661.1 Shewanella baltica OS185 plasmid pS18501, complete sequence', bde81a41), SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', f033bbd8), SourmashSignature('NC_011664.1 Shewanella baltica OS223 plasmid pS22301, complete sequence', 87a9aec4), SourmashSignature('NC_011668.1 Shewanella baltica OS223 plasmid pS22302, complete sequence', 837bf2a7), SourmashSignature('NC_011665.1 Shewanella baltica OS223 plasmid pS22303, complete sequence', 485c3377)]\"\"\"\n    )\n\n\n@utils.in_tempdir\ndef test_sig_cat_2_out(c):\n    # cat several\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"cat\", sig47, sig47abund, multisig, \"-o\", \"out.sig\")\n\n    # stdout should be same signatures\n    out = c.output(\"out.sig\")\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 57e2b22f), SourmashSignature('NC_009661.1 Shewanella baltica OS185 plasmid pS18501, complete sequence', bde81a41), SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', f033bbd8), SourmashSignature('NC_011664.1 Shewanella baltica OS223 plasmid pS22301, complete sequence', 87a9aec4), SourmashSignature('NC_011668.1 Shewanella baltica OS223 plasmid pS22302, complete sequence', 837bf2a7), SourmashSignature('NC_011665.1 Shewanella baltica OS223 plasmid pS22303, complete sequence', 485c3377)]\"\"\"\n    )\n\n\n@utils.in_tempdir\ndef test_sig_cat_2_out_inplace(c):\n    # cat several; check that we can overwrite one of the input files.\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    input_sig = c.output(\"inp.sig\")\n    shutil.copyfile(sig47, input_sig)\n\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n\n    # write out to input.\n    c.run_sourmash(\"sig\", \"cat\", input_sig, sig47abund, multisig, \"-o\", input_sig)\n\n    # stdout should be same signatures\n    out = input_sig\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 57e2b22f), SourmashSignature('NC_009661.1 Shewanella baltica OS185 plasmid pS18501, complete sequence', bde81a41), SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', f033bbd8), SourmashSignature('NC_011664.1 Shewanella baltica OS223 plasmid pS22301, complete sequence', 87a9aec4), SourmashSignature('NC_011668.1 Shewanella baltica OS223 plasmid pS22302, complete sequence', 837bf2a7), SourmashSignature('NC_011665.1 Shewanella baltica OS223 plasmid pS22303, complete sequence', 485c3377)]\"\"\"\n    )\n\n\n@utils.in_tempdir\ndef test_sig_cat_3_filelist(c):\n    # cat using a file list as input\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n\n    filelist = c.output(\"filelist\")\n    with open(filelist, \"w\") as f:\n        f.write(\"\\n\".join((sig47, sig47abund, multisig)))\n\n    c.run_sourmash(\"sig\", \"cat\", filelist, \"-o\", \"out.sig\")\n\n    # stdout should be same signatures\n    out = c.output(\"out.sig\")\n\n    # make this a list, not a set, because a set will collapse identical\n    # signatures. `sig cat` does not collapse identical signatures, although\n    # the pathlist function will ignore duplicate files.\n    siglist = list(load_signatures_from_json(out))\n\n    # verify the number of signatures matches what we expect to see based\n    # on the input files\n    all_sigs = []\n    all_sigs += list(load_signatures_from_json(sig47))\n    all_sigs += list(load_signatures_from_json(sig47abund))\n    all_sigs += list(load_signatures_from_json(multisig))\n\n    assert len(all_sigs) == len(siglist)\n\n    # sort the signatures by something deterministic and unique\n    siglist.sort(key=lambda x: x.md5sum())\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_011665.1 Shewanella baltica OS223 plasmid pS22303, complete sequence', 485c3377), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 57e2b22f), SourmashSignature('NC_011668.1 Shewanella baltica OS223 plasmid pS22302, complete sequence', 837bf2a7), SourmashSignature('NC_011664.1 Shewanella baltica OS223 plasmid pS22301, complete sequence', 87a9aec4), SourmashSignature('NC_009661.1 Shewanella baltica OS185 plasmid pS18501, complete sequence', bde81a41), SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', f033bbd8)]\"\"\"\n    )\n\n\n@utils.in_tempdir\ndef test_sig_cat_4_filelist_with_dbs(c):\n    # cat using a file list as input\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n\n    filelist = c.output(\"filelist\")\n    with open(filelist, \"w\") as f:\n        f.write(\"\\n\".join((sig47, sig47abund, sbt)))\n\n    c.run_sourmash(\"sig\", \"cat\", filelist, \"-o\", \"out.sig\")\n\n    # stdout should be same signatures\n    out = c.output(\"out.sig\")\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n    # print(\"siglist: \",siglist)\n    # print(\"\\n\")\n\n    # verify the number of signatures matches what we expect to see based\n    # on the input files\n    all_sigs = []\n    all_sigs += list(load_signatures_from_json(sig47))\n    all_sigs += list(load_signatures_from_json(sig47abund))\n    all_sigs += list(sourmash.load_file_as_signatures(sbt))\n\n    assert len(all_sigs) == len(siglist)\n\n    # sort the signatures by something deterministic and unique\n    siglist.sort(key=lambda x: x.md5sum())\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('', 0107d767), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('', 4e94e602), SourmashSignature('', 60f7e23c), SourmashSignature('', 6d6e87e1), SourmashSignature('', b59473c9), SourmashSignature('', f0c834bc), SourmashSignature('', f71e7817)]\"\"\"\n    )\n\n\n@utils.in_tempdir\ndef test_sig_cat_5_from_file(c):\n    # cat using a file list as input\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n\n    filelist = c.output(\"filelist\")\n    with open(filelist, \"w\") as f:\n        f.write(\"\\n\".join((sig47, sig47abund, sbt)))\n\n    c.run_sourmash(\"sig\", \"cat\", \"--from-file\", filelist, \"-o\", \"out.sig\")\n\n    # stdout should be same signatures\n    out = c.output(\"out.sig\")\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n    # print(\"siglist: \",siglist)\n    # print(\"\\n\")\n\n    # verify the number of signatures matches what we expect to see based\n    # on the input files\n    all_sigs = []\n    all_sigs += list(load_signatures_from_json(sig47))\n    all_sigs += list(load_signatures_from_json(sig47abund))\n    all_sigs += list(sourmash.load_file_as_signatures(sbt))\n\n    assert len(all_sigs) == len(siglist)\n\n    # sort the signatures by something deterministic and unique\n    siglist.sort(key=lambda x: x.md5sum())\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('', 0107d767), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691), SourmashSignature('', 4e94e602), SourmashSignature('', 60f7e23c), SourmashSignature('', 6d6e87e1), SourmashSignature('', b59473c9), SourmashSignature('', f0c834bc), SourmashSignature('', f71e7817)]\"\"\"\n    )\n\n\ndef test_sig_cat_5_from_file_picklist(runtmp):\n    c = runtmp\n\n    # cat using a file list as input\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n\n    filelist = c.output(\"filelist\")\n    with open(filelist, \"w\") as f:\n        f.write(\"\\n\".join((sig47, sbt)))\n\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\"])\n\n    c.run_sourmash(\n        \"sig\",\n        \"cat\",\n        \"--from-file\",\n        filelist,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n        \"-o\",\n        \"out.sig\",\n    )\n\n    # stdout should be same signatures\n    out = c.output(\"out.sig\")\n\n    siglist = list(load_signatures_from_json(out))\n    print(len(siglist))\n    # print(\"siglist: \",siglist)\n    # print(\"\\n\")\n\n    # verify the number of signatures matches what we expect to see based\n    # on the input files\n    all_sigs = []\n    all_sigs += list(load_signatures_from_json(sig47, ksize=31))\n\n    assert len(all_sigs) == len(siglist)\n\n    # sort the signatures by something deterministic and unique\n    siglist.sort(key=lambda x: x.md5sum())\n\n    assert (\n        repr(siglist)\n        == \"\"\"[SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', 09a08691)]\"\"\"\n    )\n\n\ndef test_sig_cat_6_pattern_include(runtmp):\n    # test --include-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n\n    runtmp.sourmash(\"sig\", \"cat\", \"--include\", \"shewanella\", *sigfiles, \"-o\", \"out.zip\")\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    assert len(idx) == 2\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert \"shewanella\" in n.lower(), n\n\n\ndef test_sig_cat_6_pattern_exclude(runtmp):\n    # test --exclude-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n\n    runtmp.sourmash(\"sig\", \"cat\", \"--exclude\", \"shewanella\", *sigfiles, \"-o\", \"out.zip\")\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    assert len(idx) == 18\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert \"shewanella\" not in n.lower(), n\n\n\ndef test_sig_cat_6_pattern_exclude_no_manifest(runtmp):\n    # test --exclude-db-pattern\n    db = utils.get_test_data(\"v6.sbt.zip\")\n\n    with pytest.raises(SourmashCommandFailed) as e:\n        runtmp.sourmash(\"sig\", \"cat\", \"--exclude\", \"shewanella\", db, \"-o\", \"out.zip\")\n\n    assert \"require a manifest\" in str(e)\n\n\ndef test_sig_split_1(runtmp):\n    c = runtmp\n    # split 47 into 1 sig :)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47)\n\n    outname = \"09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n\n    assert os.path.exists(c.output(outname))\n\n    test_split_sig = load_one_signature_from_json(sig47)\n    actual_split_sig = load_one_signature_from_json(c.output(outname))\n\n    assert actual_split_sig == test_split_sig\n\n\ndef test_sig_split_1_fromfile_picklist(runtmp):\n    c = runtmp\n    # split 47 into 1 sig :)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\"])\n\n    c.run_sourmash(\n        \"sig\",\n        \"split\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    outname = \"09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n\n    assert os.path.exists(c.output(outname))\n\n    test_split_sig = load_one_signature_from_json(sig47)\n    actual_split_sig = load_one_signature_from_json(c.output(outname))\n\n    assert actual_split_sig == test_split_sig\n\n\n@utils.in_tempdir\ndef test_sig_split_1_overwrite(c):\n    # check message about overwriting\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47)\n\n    outname = \"09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n    assert os.path.exists(c.output(outname))\n\n    c.run_sourmash(\"sig\", \"split\", sig47)\n\n    err = c.last_result.err\n    print(err)\n    assert \"** overwriting existing file \" + outname in err\n\n\n@utils.in_tempdir\ndef test_sig_split_2(c):\n    # split 47 twice\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47, sig47)\n\n    outname1 = \"09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n    outname2 = \"09a08691.k=31.scaled=1000.DNA.dup=1.47.fa.sig\"\n\n    assert os.path.exists(c.output(outname1))\n    assert os.path.exists(c.output(outname2))\n\n    test_split_sig = load_one_signature_from_json(sig47)\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname1))\n    assert actual_split_sig == test_split_sig\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname2))\n    assert actual_split_sig == test_split_sig\n\n\n@utils.in_tempdir\ndef test_sig_split_2_outdir(c):\n    # split 47 twice, put in outdir\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    outdir = c.output(\"sigout/\")\n    c.run_sourmash(\"sig\", \"split\", sig47, sig47, \"--outdir\", outdir)\n\n    outname1 = \"sigout/09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n    outname2 = \"sigout/09a08691.k=31.scaled=1000.DNA.dup=1.47.fa.sig\"\n\n    assert os.path.exists(c.output(outname1))\n    assert os.path.exists(c.output(outname2))\n\n    test_split_sig = load_one_signature_from_json(sig47)\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname1))\n    assert actual_split_sig == test_split_sig\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname2))\n    assert actual_split_sig == test_split_sig\n\n\n@utils.in_tempdir\ndef test_sig_split_2_output_dir(c):\n    # split 47 twice, put in outdir via --output-dir instead of --outdir\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    outdir = c.output(\"sigout/\")\n    c.run_sourmash(\"sig\", \"split\", sig47, sig47, \"--output-dir\", outdir)\n\n    outname1 = \"sigout/09a08691.k=31.scaled=1000.DNA.dup=0.47.fa.sig\"\n    outname2 = \"sigout/09a08691.k=31.scaled=1000.DNA.dup=1.47.fa.sig\"\n\n    assert os.path.exists(c.output(outname1))\n    assert os.path.exists(c.output(outname2))\n\n    test_split_sig = load_one_signature_from_json(sig47)\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname1))\n    assert actual_split_sig == test_split_sig\n\n    actual_split_sig = load_one_signature_from_json(c.output(outname2))\n    assert actual_split_sig == test_split_sig\n\n\n@utils.in_tempdir\ndef test_sig_split_3_multisig(c):\n    # split 47 and 47+63-multisig.sig\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47, multisig)\n\n    outlist = [\n        \"57e2b22f.k=31.scaled=1000.DNA.dup=0.none.sig\",\n        \"bde81a41.k=31.scaled=1000.DNA.dup=0.none.sig\",\n        \"f033bbd8.k=31.scaled=1000.DNA.dup=0.none.sig\",\n        \"87a9aec4.k=31.scaled=1000.DNA.dup=0.none.sig\",\n        \"837bf2a7.k=31.scaled=1000.DNA.dup=0.none.sig\",\n        \"485c3377.k=31.scaled=1000.DNA.dup=0.none.sig\",\n    ]\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\ndef test_sig_split_3_multisig_sig_gz(runtmp):\n    # split 47 and 47+63-multisig.sig with a .sig.gz extension\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47, multisig, \"-E\", \".sig.gz\")\n\n    outlist = [\n        \"57e2b22f.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n        \"bde81a41.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n        \"f033bbd8.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n        \"87a9aec4.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n        \"837bf2a7.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n        \"485c3377.k=31.scaled=1000.DNA.dup=0.none.sig.gz\",\n    ]\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\ndef test_sig_split_3_multisig_zip(runtmp):\n    # split 47 and 47+63-multisig.sig with a .zip extension\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"split\", sig47, multisig, \"-E\", \".zip\")\n\n    outlist = [\n        \"57e2b22f.k=31.scaled=1000.DNA.dup=0.none.zip\",\n        \"bde81a41.k=31.scaled=1000.DNA.dup=0.none.zip\",\n        \"f033bbd8.k=31.scaled=1000.DNA.dup=0.none.zip\",\n        \"87a9aec4.k=31.scaled=1000.DNA.dup=0.none.zip\",\n        \"837bf2a7.k=31.scaled=1000.DNA.dup=0.none.zip\",\n        \"485c3377.k=31.scaled=1000.DNA.dup=0.none.zip\",\n    ]\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\n@utils.in_tempdir\ndef test_sig_split_4_sbt_prot(c):\n    # split sbt\n    sbt1 = utils.get_test_data(\"prot/protein.sbt.zip\")\n    sbt2 = utils.get_test_data(\"prot/dayhoff.sbt.zip\")\n    sbt3 = utils.get_test_data(\"prot/hp.sbt.zip\")\n    c.run_sourmash(\"sig\", \"split\", sbt1, sbt2, sbt3)\n\n    outlist = [\n        \"16869d2c.k=19.scaled=100.protein.dup=0.GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        \"120d311c.k=19.scaled=100.protein.dup=0.GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n        \"fbca5e52.k=19.scaled=100.dayhoff.dup=0.GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        \"1cbd888b.k=19.scaled=100.dayhoff.dup=0.GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n        \"ea2a1ad2.k=19.scaled=100.hp.dup=0.GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        \"bb0e6d90.k=19.scaled=100.hp.dup=0.GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n    ]\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\n@utils.in_tempdir\ndef test_sig_split_4_lca_prot(c):\n    # split lca\n    lca1 = utils.get_test_data(\"prot/protein.lca.json.gz\")\n    lca2 = utils.get_test_data(\"prot/dayhoff.lca.json.gz\")\n    lca3 = utils.get_test_data(\"prot/hp.lca.json.gz\")\n    c.run_sourmash(\"sig\", \"split\", lca1, lca2, lca3)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    outlist = [\n        \"16869d2c.k=19.scaled=100.protein.dup=0.none.sig\",\n        \"120d311c.k=19.scaled=100.protein.dup=0.none.sig\",\n        \"fbca5e52.k=19.scaled=100.dayhoff.dup=0.none.sig\",\n        \"1cbd888b.k=19.scaled=100.dayhoff.dup=0.none.sig\",\n        \"ea2a1ad2.k=19.scaled=100.hp.dup=0.none.sig\",\n        \"bb0e6d90.k=19.scaled=100.hp.dup=0.none.sig\",\n    ]\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\n@utils.in_tempdir\ndef test_sig_split_5_no_exist(c):\n    # no such file\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"split\", \"foo\")\n\n\ndef test_sig_split_6_numsigs(runtmp):\n    c = runtmp\n\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    c.run_sourmash(\"sig\", \"split\", sigs11)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    outlist = [\n        \"1437d8ea.k=21.num=500.DNA.dup=0.genome-s11.fa.gz.sig\",\n        \"37aea787.k=7.num=500.protein.dup=0.genome-s11.fa.gz.sig\",\n        \"68c565be.k=30.num=500.DNA.dup=0.genome-s11.fa.gz.sig\",\n        \"73b6df1c.k=10.num=500.protein.dup=0.genome-s11.fa.gz.sig\",\n    ]\n\n    for filename in outlist:\n        assert os.path.exists(c.output(filename))\n\n\ndef test_sig_extract_1(runtmp):\n    c = runtmp\n\n    # extract 47 from 47... :)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_1_from_file(runtmp):\n    # run sig extract with --from-file\n    c = runtmp\n\n    # extract 47 from 47... :)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    from_file = _write_file(runtmp, \"list.txt\", [sig47])\n    c.run_sourmash(\"sig\", \"extract\", \"--from-file\", from_file)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_2(runtmp):\n    c = runtmp\n\n    # extract matches to 47's md5sum from among several\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig47, sig63, \"--md5\", \"09a0869\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    print(test_extract_sig.minhash)\n    print(actual_extract_sig.minhash)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_2_zipfile(runtmp):\n    c = runtmp\n\n    # extract matches to 47's md5sum from among several in a zipfile\n    all_zip = utils.get_test_data(\"prot/all.zip\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"extract\", all_zip, \"--md5\", \"09a0869\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    print(test_extract_sig.minhash)\n    print(actual_extract_sig.minhash)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_3(runtmp):\n    c = runtmp\n\n    # extract nothing (no md5 match)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"extract\", sig47, \"--md5\", \"FOO\")\n\n\ndef test_sig_extract_4(runtmp):\n    c = runtmp\n\n    # extract matches to 47's name from among several signatures\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig47, sig63, \"--name\", \"NC_009665.1\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    print(test_extract_sig.minhash)\n    print(actual_extract_sig.minhash)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_5(runtmp):\n    c = runtmp\n\n    # extract nothing (no name match)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"extract\", sig47, \"--name\", \"FOO\")\n\n\ndef test_sig_extract_5_to_zip(runtmp):\n    c = runtmp\n\n    # extract nothing (no name match)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"extract\", sig47, \"--name\", \"FOO\", \"-o\", \"xyz.sig.zip\")\n\n    outfile = runtmp.output(\"xyz.sig.zip\")\n\n    assert os.path.exists(outfile)\n    assert list(sourmash.load_file_as_signatures(outfile)) == []\n\n\ndef test_sig_extract_6(runtmp):\n    c = runtmp\n\n    # extract matches to several names from among several signatures\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig47, sig63, \"--name\", \"Shewanella\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 2\n\n\ndef test_sig_extract_7(runtmp):\n    c = runtmp\n\n    # extract matches based on ksize\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig2, \"-k\", \"31\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n\ndef test_sig_extract_7_no_ksize(runtmp):\n    c = runtmp\n\n    # extract all three matches when -k not specified\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    c.run_sourmash(\"sig\", \"extract\", sig2)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 3\n\n\ndef test_sig_extract_8_empty_picklist_fail(runtmp):\n    # what happens with an empty picklist?\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # make empty picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\"):\n        pass\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"empty or improperly formatted pickfile\" in err\n\n\ndef test_sig_extract_8_nofile_picklist_fail(runtmp):\n    # what happens when picklist file does not exist?\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # picklist file does not exist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"must exist and be a regular file\" in err\n\n\ndef test_sig_extract_8_picklist_md5(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"loaded 1 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"extracted 1 signatures from 2 file(s)\" in err\n    assert \"for given picklist, found 1 matches to 1 distinct values\" in err\n\n\ndef test_sig_extract_8_picklist_md5_zipfile(runtmp):\n    # extract 47 from a zipfile,  using a picklist w/full md5\n    allzip = utils.get_test_data(\"prot/all.zip\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n    runtmp.sourmash(\"sig\", \"extract\", allzip, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"loaded 1 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"extracted 1 signatures from 1 file(s)\" in err\n    assert \"for given picklist, found 1 matches to 1 distinct values\" in err\n\n\ndef test_sig_extract_8_picklist_md5_lca_fail(runtmp):\n    # try to extract 47 from an LCA database, using a picklist w/full md5; will\n    # fail.\n    allzip = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"50a9274021e43eda8b2e77f8fa60ae8e\",\n        md5short=\"50a9274021e43eda8b2e77f8fa60ae8e\"[:8],\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\",\n            \"extract\",\n            allzip,\n            \"--picklist\",\n            picklist_arg,\n            \"--md5\",\n            \"50a9274021e4\",\n        )\n\n    # this happens b/c the implementation of 'extract' uses picklists, and\n    # LCA databases don't support multiple picklists.\n    print(runtmp.last_result.err)\n    assert (\n        \"This input collection doesn't support 'extract' with picklists or patterns.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_sig_extract_8_picklist_md5_include(runtmp):\n    # extract 47 from 47, using a picklist w/full md5:: explicit include\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5:include\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"loaded 1 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"extracted 1 signatures from 2 file(s)\" in err\n    assert \"for given picklist, found 1 matches to 1 distinct values\" in err\n\n\ndef test_sig_extract_8_picklist_md5_exclude(runtmp):\n    # extract 63 from 47,63 by excluding 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"loaded 1 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"extracted 1 signatures from 2 file(s)\" in err\n    assert \"for given picklist, found 1 matches by excluding 1 distinct values\" in err\n\n\ndef test_sig_extract_8_picklist_md5_require_all(runtmp):\n    # extract 47 from 47, using a picklist w/full md5;\n    # confirm that check missing picklist val errors out on --picklist-require\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n        w.writerow(\n            dict(\n                exactName=\"\",\n                md5full=\"BAD MD5\",\n                md5short=\"\",\n                fullIdent=\"\",\n                nodotIdent=\"\",\n            )\n        )\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\",\n            \"extract\",\n            sig47,\n            sig63,\n            \"--picklist\",\n            picklist_arg,\n            \"--picklist-require-all\",\n        )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"loaded 2 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"extracted 1 signatures from 2 file(s)\" in err\n    assert \"for given picklist, found 1 matches to 2 distinct values\" in err\n    assert \"WARNING: 1 missing picklist values.\" in err\n    assert \"ERROR: failing because --picklist-require-all was set\" in err\n\n\ndef test_sig_extract_8_picklist_name(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:exactName:name\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_name_exclude(runtmp):\n    # exclude 47 based on name\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:exactName:name:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_ident(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:fullIdent:ident\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_ident_exclude(runtmp):\n    # exclude 47 based on ident\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:fullIdent:ident:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_ident_dot(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:nodotIdent:identprefix\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_ident_dot_exclude(runtmp):\n    # exlude 47 based on identprefix\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:nodotIdent:identprefix:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5prefix8\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short_exclude(runtmp):\n    # exclude 47 based on md5prefix8\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5prefix8:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short_alias(runtmp):\n    # extract 47 from 47, using a picklist w/full md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short_alias_exclude(runtmp):\n    # exlude 47 based on md5prefix8 alias, md5short\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short:exclude\"\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig63)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short_alias_with_md5_selector_nomatch(runtmp):\n    # extract 47 from 47, using a picklist w/full md5 and also md5 selector\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg, \"--md5\", \"XXX\"\n        )  # no match to md5 selector here\n\n    err = runtmp.last_result.err\n    assert \"no matching signatures to save!\" in err\n\n\ndef test_sig_extract_8_picklist_md5_short_alias_with_md5_selector_nomatch_exclude(\n    runtmp,\n):\n    # exclude 47 using a picklist w/full md5 and also md5 selector\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short:exclude\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg, \"--md5\", \"XXX\"\n        )  # no match to md5 selector here\n\n    err = runtmp.last_result.err\n    assert \"no matching signatures to save!\" in err\n\n\ndef test_sig_extract_8_picklist_md5_short_alias_with_md5_selector(runtmp):\n    # extract 47 from 47, using a picklist w/full md5 and also md5 selector\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short\"\n    runtmp.sourmash(\n        \"sig\",\n        \"extract\",\n        sig47,\n        sig63,\n        \"--picklist\",\n        picklist_arg,\n        \"--md5\",\n        \"09a08691ce5295215\",\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n\n    test_extract_sig = load_one_signature_from_json(sig47)\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig == test_extract_sig\n\n\ndef test_sig_extract_8_picklist_md5_short_alias_with_md5_selector_exclude(runtmp):\n    # exclude 47, using a picklist w/full md5; but try to select with md5 selector\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"09a08691ce52952152f0e866a59f6261\",\n        md5short=\"09a08691ce5295215\",\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5short:exclude\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\",\n            \"extract\",\n            sig47,\n            sig63,\n            \"--picklist\",\n            picklist_arg,\n            \"--md5\",\n            \"09a08691ce5295215\",\n        )\n\n    # NTP: do we want to emit a more informative \"conflicting selectors\" type of msg?\n    err = runtmp.last_result.err\n    print(err)\n    assert \"loaded 1 distinct values into picklist.\" in err\n    assert \"loaded 1 total that matched ksize & molecule type\" in err\n    assert \"no matching signatures to save!\" in err\n\n\ndef test_sig_extract_8_picklist_md5_nomatch(runtmp):\n    # use an empty picklist => no match\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5short\"])\n        w.writeheader()\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5prefix8\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n    assert \"no matching signatures to save!\" in err\n    assert runtmp.last_result.status != 0\n\n\ndef test_sig_extract_8_picklist_md5_nomatch_exclude(runtmp):\n    # use an empty picklist to exclude => no match => include everything\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5short\"])\n        w.writeheader()\n\n    picklist_arg = f\"{picklist_csv}:md5short:md5prefix8:exclude\"\n\n    runtmp.sourmash(\"sig\", \"extract\", sig47, sig63, \"--picklist\", picklist_arg)\n\n    # stdout should be both signatures\n    out = runtmp.last_result.out\n    extract_siglist = list(load_signatures_from_json(out))\n    print(len(extract_siglist))\n    s47 = sourmash.load_file_as_signatures(sig47)\n    s63 = sourmash.load_file_as_signatures(sig63)\n    actual_extract_siglist = list(s47) + list(s63)\n\n    assert set(extract_siglist) == set(actual_extract_siglist)\n\n    err = runtmp.last_result.err\n    print(err)\n    assert runtmp.last_result.status == 0\n    assert \"loaded 0 distinct values into picklist.\" in err\n    assert \"loaded 2 total that matched ksize & molecule type\" in err\n    assert \"extracted 2 signatures from 2 file(s)\" in err\n    assert \"for given picklist, found 2 matches by excluding 0 distinct values\" in err\n\n\ndef test_sig_extract_9_picklist_md5_ksize_hp_select(runtmp):\n    # test with -k and moltype selector\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:md5\"\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    print(actual_extract_sig.md5sum)\n    assert str(actual_extract_sig) == \"GCA_001593925\"\n    assert actual_extract_sig.md5sum() == \"ea2a1ad233c2908529d124a330bcb672\"\n    assert actual_extract_sig.minhash.ksize == 19\n    assert actual_extract_sig.minhash.moltype == \"hp\"\n\n\ndef test_sig_extract_9_picklist_md5_ksize_hp_select_exclude(runtmp):\n    # test picklist exclude with -k and moltype selector\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:md5:exclude\"\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n    actual_extract_sig = load_one_signature_from_json(out)\n    print(actual_extract_sig.md5sum)\n\n    assert str(actual_extract_sig) == \"GCA_001593935\"\n    assert actual_extract_sig.md5sum() == \"bb0e6d90df01b7bd5d0956a5f9e3ed12\"\n    assert actual_extract_sig.minhash.ksize == 19\n    assert actual_extract_sig.minhash.moltype == \"hp\"\n\n\ndef test_sig_extract_10_picklist_md5_dups_and_empty(runtmp):\n    # test empty picklist values, and duplicate picklist values\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n        w.writerow(dict(md5=\"\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:md5\"\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig.minhash.ksize == 19\n    assert actual_extract_sig.minhash.moltype == \"hp\"\n    assert actual_extract_sig.md5sum() == \"ea2a1ad233c2908529d124a330bcb672\"\n\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"WARNING: 1 empty values in column 'md5' in picklist file\" in err\n    assert \"WARNING: 1 values in picklist column 'md5' were not distinct\" in err\n\n\ndef test_sig_extract_10_picklist_md5_dups_and_empty_exclude(runtmp):\n    # test empty picklist values, and duplicate picklist values for exclude\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n        w.writerow(dict(md5=\"\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:md5:exclude\"\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n    )\n\n    # stdout should be new signature\n    out = runtmp.last_result.out\n    actual_extract_sig = load_one_signature_from_json(out)\n\n    assert actual_extract_sig.minhash.ksize == 19\n    assert actual_extract_sig.minhash.moltype == \"hp\"\n    assert actual_extract_sig.md5sum() == \"bb0e6d90df01b7bd5d0956a5f9e3ed12\"\n\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"WARNING: 1 empty values in column 'md5' in picklist file\" in err\n    assert \"WARNING: 1 values in picklist column 'md5' were not distinct\" in err\n\n\ndef test_sig_extract_11_picklist_bad_coltype(runtmp):\n    # test with invalid picklist coltype\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:BADCOLTYPE\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"invalid picklist column type 'BADCOLTYPE'\" in err\n\n\ndef test_sig_extract_11_picklist_bad_coltype_exclude(runtmp):\n    # test with invalid picklist coltype\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:BADCOLTYPE:exclude\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"invalid picklist column type 'BADCOLTYPE'\" in err\n\n\ndef test_sig_extract_12_picklist_bad_argstr(runtmp):\n    # test with invalid argument format to --picklist\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"invalid picklist argument\" in err\n\n\ndef test_sig_extract_12_picklist_bad_pickstyle(runtmp):\n    # test with invalid argument format to --picklist\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:md5:md5:XXX\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert (\n        \"invalid picklist 'pickstyle' argument 4: 'XXX' must be 'include' or 'exclude'\"\n        in err\n    )\n\n\ndef test_sig_extract_12_picklist_bad_colname(runtmp):\n    # test with invalid picklist colname\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:BADCOLNAME:md5\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"column 'BADCOLNAME' not in pickfile\" in err\n\n\ndef test_sig_extract_12_picklist_bad_colname_exclude(runtmp):\n    # test with invalid picklist colname\n    sigdir = utils.get_test_data(\"prot/\")\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"ea2a1ad233c2908529d124a330bcb672\"))\n\n    picklist_arg = f\"{picklist_csv}:BADCOLNAME:md5:exclude\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"extract\", sigdir, \"--picklist\", picklist_arg, \"-k\", \"19\", \"--hp\"\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"column 'BADCOLNAME' not in pickfile\" in err\n\n\ndef test_sig_extract_11_pattern_include(runtmp):\n    # test --include-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", \"--include\", \"shewanella\", *sigfiles, \"-o\", \"out.zip\"\n    )\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    assert len(idx) == 2\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert \"shewanella\" in n.lower(), n\n\n\ndef test_sig_extract_11_pattern_exclude(runtmp):\n    # test --exclude-db-pattern\n    sigfiles = glob.glob(utils.get_test_data(\"prot/*.zip\"))\n\n    runtmp.sourmash(\n        \"sig\", \"extract\", \"--exclude\", \"shewanella\", *sigfiles, \"-o\", \"out.zip\"\n    )\n\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    assert len(idx) == 18\n    names = [ss.name for ss in idx.signatures()]\n    for n in names:\n        assert \"shewanella\" not in n.lower(), n\n\n\ndef test_sig_extract_identical_md5s(runtmp):\n    # test that we properly handle different signatures with identical md5s\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_signatures_from_json(sig47)\n    sig = list(ss)[0]\n    new_sig = sig.to_mutable()\n    new_sig.name = \"foo\"\n    sig47foo = runtmp.output(\"foo.sig\")\n    # this was only a problem when the signatures are stored in the same file\n    with open(sig47foo, \"w\") as fp:\n        save_signatures_to_json([new_sig, sig], fp)\n\n    runtmp.run_sourmash(\"sig\", \"extract\", \"--name\", \"foo\", sig47foo)\n\n    out = runtmp.last_result.out\n    print(out)\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella\" not in ss.name\n    assert \"foo\" in ss.name\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_sig_flatten_1(runtmp):\n    c = runtmp\n\n    # extract matches to several names from among several signatures & flatten\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"flatten\", sig47abund, \"--name\", \"Shewanella\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n    test_flattened = load_one_signature_from_json(sig47)\n    assert test_flattened.minhash == siglist[0].minhash\n    assert test_flattened.name == siglist[0].name\n\n\ndef test_sig_flatten_1_from_file(runtmp):\n    c = runtmp\n\n    # extract matches to several names from among several signatures & flatten\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    from_file = _write_file(runtmp, \"list.txt\", [sig47abund])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\"])\n\n    c.run_sourmash(\n        \"sig\",\n        \"flatten\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n    test_flattened = load_one_signature_from_json(sig47)\n    assert test_flattened.minhash == siglist[0].minhash\n\n\n@utils.in_tempdir\ndef test_sig_flatten_1_select_name(c):\n    # extract matches to several names from among several signatures & flatten\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"flatten\", sig2, sig47abund, \"--name\", \"Shewanella\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n    test_flattened = load_one_signature_from_json(sig47)\n    assert test_flattened.minhash == siglist[0].minhash\n\n\ndef test_sig_flatten_1_select_md5(runtmp):\n    c = runtmp\n\n    # extract matches to several names from among several signatures & flatten\n    sig47abund = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"flatten\", sig2, sig47abund, \"--md5\", \"09a08691c\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n    test_flattened = load_one_signature_from_json(sig47)\n    assert test_flattened.minhash == siglist[0].minhash\n\n\ndef test_sig_flatten_2_ksize(runtmp):\n    c = runtmp\n    # flatten only one signature selected using ksize\n    psw_mag = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    c.run_sourmash(\"sig\", \"flatten\", psw_mag, \"-k\", \"31\")\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    siglist = load_signatures_from_json(out)\n    siglist = list(siglist)\n\n    assert len(siglist) == 1\n\n\n@utils.in_tempdir\ndef test_sig_downsample_1_scaled(c):\n    # downsample a scaled signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"downsample\", \"--scaled\", \"10000\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_downsample_sig = load_one_signature_from_json(sig47)\n    actual_downsample_sig = load_one_signature_from_json(out)\n\n    test_mh = test_downsample_sig.minhash.downsample(scaled=10000)\n\n    assert actual_downsample_sig.minhash == test_mh\n    assert actual_downsample_sig.name == test_downsample_sig.name\n\n\n@utils.in_tempdir\ndef test_sig_downsample_1_scaled_downsample_multisig(c):\n    # downsample many scaled signatures in one file\n    multisig = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"downsample\", \"--scaled\", \"10000\", multisig)\n\n    # stdout should be new signatures\n    out = c.last_result.out\n\n    for sig in load_signatures_from_json(out):\n        assert sig.minhash.scaled == 10000\n\n\n@utils.in_tempdir\ndef test_sig_downsample_1_scaled_to_num(c):\n    # downsample a scaled signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"500\", sig47)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    actual_downsample_sig = load_one_signature_from_json(out)\n    actual_mins = actual_downsample_sig.minhash.hashes.keys()\n    actual_mins = list(actual_mins)\n    actual_mins.sort()\n\n    test_downsample_sig = load_one_signature_from_json(sig47)\n    test_mins = test_downsample_sig.minhash.hashes.keys()\n    test_mins = list(test_mins)\n    test_mins.sort()\n    test_mins = test_mins[:500]  # take 500 smallest\n\n    assert actual_mins == test_mins\n\n\ndef test_sig_downsample_check_num_bounds_negative(runtmp):\n    c = runtmp\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"-5\", sig47)\n\n    assert \"ERROR: num value must be positive\" in c.last_result.err\n\n\ndef test_sig_downsample_check_num_bounds_less_than_minimum(runtmp):\n    c = runtmp\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"25\", sig47)\n\n    assert \"WARNING: num value should be >= 50. Continuing anyway.\" in c.last_result.err\n\n\ndef test_sig_downsample_check_num_bounds_more_than_maximum(runtmp):\n    c = runtmp\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"100000\", sig47)\n\n    assert (\n        \"WARNING: num value should be <= 50000. Continuing anyway.\" in c.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_sig_downsample_1_scaled_to_num_fail(c):\n    # downsample a scaled signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"50000\", sig47)\n\n\n@utils.in_tempdir\ndef test_sig_downsample_1_scaled_empty(c):\n    # downsample a scaled signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"downsample\", sig47)\n\n\n@utils.in_tempdir\ndef test_sig_downsample_2_num(c):\n    # downsample a num signature\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    c.run_sourmash(\"sig\", \"downsample\", \"--num\", \"500\", \"-k\", \"21\", \"--dna\", sigs11)\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_downsample_sig = load_one_signature_from_json(\n        sigs11, ksize=21, select_moltype=\"DNA\"\n    )\n    actual_downsample_sig = load_one_signature_from_json(out)\n    test_mh = test_downsample_sig.minhash.downsample(num=500)\n\n    assert actual_downsample_sig.minhash == test_mh\n\n\n@utils.in_tempdir\ndef test_sig_downsample_2_num_to_scaled(c):\n    # downsample a num signature and convert it into a scaled sig\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    c.run_sourmash(\n        \"sig\", \"downsample\", \"--scaled\", \"10000\", \"-k\", \"21\", \"--dna\", sigs11\n    )\n\n    # stdout should be new signature\n    out = c.last_result.out\n\n    test_downsample_sig = load_one_signature_from_json(\n        sigs11, ksize=21, select_moltype=\"DNA\"\n    )\n    actual_downsample_sig = load_one_signature_from_json(out)\n\n    test_mins = test_downsample_sig.minhash.hashes.keys()\n    actual_mins = actual_downsample_sig.minhash.hashes.keys()\n\n    # select those mins that are beneath the new max hash...\n    max_hash = actual_downsample_sig.minhash._max_hash\n    test_mins_down = {k for k in test_mins if k < max_hash}\n    assert test_mins_down == set(actual_mins)\n\n\n@utils.in_tempdir\ndef test_sig_downsample_2_num_to_scaled_fail(c):\n    # downsample a num signature and FAIL to convert it into a scaled sig\n    # because new scaled is too low\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"sig\", \"downsample\", \"--scaled\", \"100\", \"-k\", \"21\", \"--dna\", sigs11\n        )\n\n\n@utils.in_tempdir\ndef test_sig_downsample_2_num_and_scaled_both_fail(c):\n    # cannot specify both --num and --scaled\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"sig\",\n            \"downsample\",\n            \"--scaled\",\n            \"100\",\n            \"--num\",\n            \"50\",\n            \"-k\",\n            \"21\",\n            \"--dna\",\n            sigs11,\n        )\n\n\n@utils.in_tempdir\ndef test_sig_downsample_2_num_empty(c):\n    # downsample a num signature\n    sigs11 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sig\", \"downsample\", \"-k\", \"21\", \"--dna\", sigs11)\n\n\ndef test_sig_describe_1(runtmp):\n    c = runtmp\n\n    # get basic info on a signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sig47)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_sig_describe_1_fromfile_picklist(runtmp):\n    c = runtmp\n\n    # get basic info on a signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    from_file = _write_file(runtmp, \"list.txt\", [sig47])\n    picklist = _write_file(runtmp, \"pl.csv\", [\"md5short\", \"09a08691\"])\n\n    c.run_sourmash(\n        \"sig\",\n        \"describe\",\n        \"--from-file\",\n        from_file,\n        \"--picklist\",\n        f\"{picklist}:md5short:md5short\",\n    )\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_thisdir\ndef test_sig_describe_protein(c):\n    # test describe on a singleton protein signature\n    testdata = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    c.run_sourmash(\"sig\", \"describe\", testdata)\n\n    assert (\n        \"k=19 molecule=protein num=0 scaled=100 seed=42 track_abundance=0\"\n        in c.last_result.out\n    )\n\n\n@utils.in_thisdir\ndef test_sig_describe_hp(c):\n    # test describe on a singleton hp signature\n    testdata = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    c.run_sourmash(\"sig\", \"describe\", testdata)\n\n    assert (\n        \"k=19 molecule=hp num=0 scaled=100 seed=42 track_abundance=0\"\n        in c.last_result.out\n    )\n\n\n@utils.in_thisdir\ndef test_sig_describe_dayhoff(c):\n    # test describe on a singleton dayhoff signature\n    testdata = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    c.run_sourmash(\"sig\", \"describe\", testdata)\n\n    assert (\n        \"k=19 molecule=dayhoff num=0 scaled=100 seed=42 track_abundance=0\"\n        in c.last_result.out\n    )\n\n\ndef test_sig_describe_1_hp(runtmp):\n    c = runtmp\n\n    # get basic info on a signature\n    testdata = utils.get_test_data(\"short.fa\")\n\n    # run four separate commands to make 4 different sets of sigs...\n    c.sourmash(\"sketch\", \"dna\", \"-p\", \"k=21,k=30,num=500\", \"-o\", \"out.zip\", testdata)\n    c.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", \"-o\", \"out.zip\", testdata\n    )\n    c.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500,hp\", \"-o\", \"out.zip\", testdata\n    )\n    c.sourmash(\n        \"sketch\",\n        \"translate\",\n        \"-p\",\n        \"k=7,k=10,num=500,dayhoff\",\n        \"-o\",\n        \"out.zip\",\n        testdata,\n    )\n\n    # then combine into one .sig file\n    c.sourmash(\"sig\", \"cat\", \"out.zip\", \"-o\", \"short.fa.sig\")\n\n    # & run sig describe\n    c.run_sourmash(\"sig\", \"describe\", \"short.fa.sig\")\n\n    out = c.last_result.out\n    print(c.last_result.out)\n\n    # Add final trailing slash for this OS\n    testdata_dirname = os.path.dirname(testdata) + os.sep\n    location = c.location + os.sep\n\n    expected_output = \"\"\"\\\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: e45a080101751e044d6df861d3d0f3fd\nk=7 molecule=protein num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: c027e96c3379d38942639219daa24fdc\nk=7 molecule=dayhoff num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: 4b50ae79657d9dd07a1d543ba8b986a0\nk=7 molecule=hp num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: 1136a8a68420bd93683e45cdaf109b80\nk=21 molecule=DNA num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: 4244d1612598af044e799587132f007e\nk=10 molecule=protein num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: 396dcb7c1875f48ca31e0759bec72ee1\nk=10 molecule=dayhoff num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature filename: short.fa.sig\nsignature: ** no name **\nsource file: short.fa\nmd5: 4c43878296459783dbd6a4a071ab7e9d\nk=10 molecule=hp num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n---\nsignature: ** no name **\nsource file: short.fa\nmd5: 71f7c111c01785e5f38efad45b00a0e1\nk=30 molecule=DNA num=500 scaled=0 seed=42 track_abundance=0\nsize: 500\nsum hashes: 500\nsignature license: CC0\n\n\"\"\".splitlines()\n    for line in out.splitlines():\n        cleaned_line = line.strip().replace(testdata_dirname, \"\").replace(location, \"\")\n        assert cleaned_line in expected_output, cleaned_line\n\n\n@utils.in_tempdir\ndef test_sig_describe_1_multisig(c):\n    # get basic info on multiple signatures in a single file\n    sigs = utils.get_test_data(\"47+63-multisig.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sigs)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsignature: NC_009661.1 Shewanella baltica OS185 plasmid pS18501, complete sequence\nsignature: NC_011663.1 Shewanella baltica OS223, complete genome\nsignature: NC_011664.1 Shewanella baltica OS223 plasmid pS22301, complete sequence\nsignature: NC_011668.1 Shewanella baltica OS223 plasmid pS22302, complete sequence\nsignature: NC_011665.1 Shewanella baltica OS223 plasmid pS22303, complete sequence\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_tempdir\ndef test_sig_describe_1_sbt(c):\n    # get basic info on multiple signatures in an SBT\n    sigs = utils.get_test_data(\"prot/protein.sbt.zip\")\n    c.run_sourmash(\"sig\", \"describe\", sigs)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: GCA_001593925\nsignature: GCA_001593935\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_tempdir\ndef test_sig_describe_1_lca(c):\n    # get basic info on multiple signatures in an LCA database\n    sigs = utils.get_test_data(\"prot/protein.lca.json.gz\")\n    c.run_sourmash(\"sig\", \"describe\", sigs)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: GCA_001593925\nsignature: GCA_001593935\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_tempdir\ndef test_sig_describe_1_dir(c):\n    # get basic info on multiple signatures in a directory\n    sigs = utils.get_test_data(\"prot/protein/\")\n    c.run_sourmash(\"sig\", \"describe\", sigs)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    # make sure signature names, as well as full path to .sig file under\n    # directory, show up in output.\n    expected_output = \"\"\"\\\nsignature: GCA_001593925\nsignature: GCA_001593935\nprot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\nprot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_tempdir\ndef test_sig_describe_1_zipfile(c):\n    # get basic info on multiple signatures in a zipfile\n    sigs = utils.get_test_data(\"prot/all.zip\")\n    c.run_sourmash(\"sig\", \"describe\", sigs)\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nk=19 molecule=dayhoff num=0 scaled=100 seed=42 track_abundance=0\nk=19 molecule=dayhoff num=0 scaled=100 seed=42 track_abundance=0\nk=19 molecule=hp num=0 scaled=100 seed=42 track_abundance=0\nk=19 molecule=hp num=0 scaled=100 seed=42 track_abundance=0\nk=19 molecule=protein num=0 scaled=100 seed=42 track_abundance=0\nk=19 molecule=protein num=0 scaled=100 seed=42 track_abundance=0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_sig_describe_1_sig_abund(runtmp):\n    # check output of sig describe on a sketch with abundances\n    c = runtmp\n\n    sigfile = utils.get_test_data(\"track_abund/47.fa.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sigfile)\n\n    out = c.last_result.out\n    print(c.last_result.out)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: podar-ref/47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=1\nsize: 5177\nsum hashes: 5292\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@utils.in_thisdir\ndef test_sig_describe_stdin(c):\n    sig = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    with open(sig) as fp:\n        data = fp.read()\n\n    c.run_sourmash(\"sig\", \"describe\", \"-\", stdin_data=data)\n\n    assert \"signature: GCA_001593925\" in c.last_result.out\n\n\n@utils.in_tempdir\ndef test_sig_describe_empty(c):\n    sig = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n\n    ss = sourmash.load_file_as_signatures(sig)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n\n    ss = ss.to_mutable()\n    ss.name = \"\"\n    ss.filename = \"\"\n\n    outsig = c.output(\"xxx.sig\")\n    with open(outsig, \"w\") as fp:\n        save_signatures_to_json([ss], fp)\n\n    ss = sourmash.load_file_as_signatures(outsig)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert ss.name == \"\"\n    assert ss.filename == \"\"\n\n    c.run_sourmash(\"sig\", \"describe\", outsig)\n    print(c.last_result.out)\n    assert \"signature: ** no name **\" in c.last_result.out\n    assert \"source file: ** no name **\" in c.last_result.out\n\n\ndef test_sig_describe_sqldb(runtmp):\n    # make a sqldb and run fileinfo on it\n    gcf_all = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    sqldb = runtmp.output(\"some.sqldb\")\n\n    runtmp.sourmash(\"sig\", \"cat\", \"-k\", \"31\", *gcf_all, \"-o\", sqldb)\n\n    runtmp.sourmash(\"sig\", \"describe\", sqldb)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"md5: 4289d4241be8573145282352215ca3c4\" in out\n    assert \"md5: 85c3aeec6457c0b1d210472ddeb67714\" in out\n\n\ndef test_sig_describe_2_csv(runtmp):\n    # output info in CSV spreadsheet\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sig47, sig63, \"--csv\", \"out.csv\")\n\n    expected_md5 = [\n        \"09a08691ce52952152f0e866a59f6261\",\n        \"38729c6374925585db28916b82a6f513\",\n    ]\n\n    with open(c.output(\"out.csv\")) as fp:\n        r = csv.DictReader(fp)\n\n        n = 0\n\n        for row, md5 in zip(r, expected_md5):\n            assert row[\"md5\"] == md5\n            n += 1\n\n        assert n == 2\n\n\ndef test_sig_describe_2_csv_gz(runtmp):\n    # output info in CSV spreadsheet, gzipped\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sig47, sig63, \"--csv\", \"out.csv.gz\")\n\n    expected_md5 = [\n        \"09a08691ce52952152f0e866a59f6261\",\n        \"38729c6374925585db28916b82a6f513\",\n    ]\n\n    with gzip.open(c.output(\"out.csv.gz\"), \"rt\", newline=\"\") as fp:\n        r = csv.DictReader(fp)\n\n        n = 0\n\n        for row, md5 in zip(r, expected_md5):\n            assert row[\"md5\"] == md5\n            n += 1\n\n        assert n == 2\n\n\ndef test_sig_describe_2_csv_abund(runtmp):\n    # output info in CSV spreadsheet, for abund sig\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    c.run_sourmash(\"sig\", \"describe\", sig47, \"--csv\", \"out.csv\")\n\n    with open(c.output(\"out.csv\")) as fp:\n        r = csv.DictReader(fp)\n\n        rows = list(r)\n        assert len(rows) == 1\n        row = rows[0]\n\n        assert row[\"signature_file\"] == sig47\n        assert row[\"md5\"] == \"09a08691ce52952152f0e866a59f6261\"\n        assert row[\"ksize\"] == \"31\"\n        assert row[\"moltype\"] == \"DNA\"\n        assert row[\"num\"] == \"0\"\n        assert row[\"scaled\"] == \"1000\"\n        assert row[\"n_hashes\"] == \"5177\"\n        assert row[\"seed\"] == \"42\"\n        assert row[\"with_abundance\"] == \"1\"\n        assert row[\"name\"] == \"NC_009665.1 Shewanella baltica OS185, complete genome\"\n        assert row[\"filename\"] == \"podar-ref/47.fa\"\n        assert row[\"license\"] == \"CC0\"\n        assert row[\"sum_hashes\"] == \"5292\"\n\n\ndef test_sig_describe_2_csv_as_picklist(runtmp):\n    # generate an output CSV from describe and then use it as a manifest\n    # pickfile\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    outcsv = runtmp.output(\"out.csv\")\n\n    c.run_sourmash(\"sig\", \"describe\", sig47, \"--csv\", outcsv)\n\n    c.run_sourmash(\"sig\", \"describe\", sig47, \"--picklist\", f\"{outcsv}::manifest\")\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_sig_describe_2_include_db_pattern(runtmp):\n    # test sig describe --include-db-pattern\n    c = runtmp\n\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    c.run_sourmash(\"sig\", \"describe\", allzip, \"--include-db-pattern\", \"os185\")\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_sig_describe_2_exclude_db_pattern(runtmp):\n    # test sig describe --exclude-db-pattern\n    c = runtmp\n\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    c.run_sourmash(\n        \"sig\", \"describe\", allzip, \"--dna\", \"-k\", \"31\", \"--exclude-db-pattern\", \"os223\"\n    )\n\n    out = c.last_result.out\n    print(c.last_result)\n\n    expected_output = \"\"\"\\\nsignature: NC_009665.1 Shewanella baltica OS185, complete genome\nsource file: 47.fa\nmd5: 09a08691ce52952152f0e866a59f6261\nk=31 molecule=DNA num=0 scaled=1000 seed=42 track_abundance=0\nsize: 5177\nsignature license: CC0\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_sig_describe_3_manifest_works(runtmp):\n    # test on a manifest with relative paths, in proper location\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n    runtmp.sourmash(\"sig\", \"describe\", mf, \"--csv\", \"out.csv\")\n\n    out = runtmp.last_result.out\n    print(out)\n\n    with open(runtmp.output(\"out.csv\"), newline=\"\") as fp:\n        r = csv.reader(fp)\n        rows = list(r)\n        assert len(rows) == 16  # 15 signatures, plus head\n\n\ndef test_sig_describe_3_manifest_fails_when_moved(runtmp):\n    # test on a manifest with relative paths, when in wrong place;\n    # should fail, because actual signatures cannot be loaded now.\n    # note: this tests lazy loading.\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n    shutil.copyfile(mf, runtmp.output(\"mf.csv\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"describe\", \"mf.csv\")\n\n\ndef test_sig_overlap(runtmp):\n    c = runtmp\n    # get overlap details\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    c.run_sourmash(\"sig\", \"overlap\", sig47, sig63)\n    out = c.last_result.out\n\n    print(out)\n\n    # md5s\n    assert \"09a08691ce52952152f0e866a59f6261\" in out\n    assert \"38729c6374925585db28916b82a6f513\" in out\n\n    assert \"jaccard similarity:          0.32069\" in out\n    assert \"number of hashes in common:  2529\" in out\n\n\ndef test_sig_overlap_2(runtmp):\n    c = runtmp\n    # get overlap details\n    sig47 = utils.get_test_data(\"47.fa.sig.zip\")\n    sig63 = utils.get_test_data(\"63.fa.sig.zip\")\n    c.run_sourmash(\"sig\", \"overlap\", sig47, sig63)\n    out = c.last_result.out\n\n    print(out)\n\n    # md5s\n    assert \"09a08691ce52952152f0e866a59f6261\" in out\n    assert \"38729c6374925585db28916b82a6f513\" in out\n\n    assert \"jaccard similarity:          0.32069\" in out\n    assert \"first contained in second:   0.48851 (cANI: 0.97716)\" in out\n    assert \"second contained in first:   0.48282 (cANI: 0.97679)\" in out\n    assert \"average containment ANI:     0.97697\" in out\n    assert \"number of hashes in common:  2529\" in out\n\n\ndef test_sig_overlap_inaccurate_size_estimate(runtmp):\n    c = runtmp\n    # make tiny sigs to test containment ANI with inaccurate size estimate\n    # (i.e. not enough hashes to estimate size)\n    mh1 = sourmash.MinHash(0, 31, scaled=100, track_abundance=False)\n    mh2 = sourmash.MinHash(0, 31, scaled=100, track_abundance=False)\n\n    mh1.add_many((1, 3, 4))\n    mh2.add_many((1, 2, 3, 4))\n    sig1 = sourmash.SourmashSignature(mh1, name=\"sig1\")\n    sig2 = sourmash.SourmashSignature(mh2, name=\"sig2\")\n    # save signatures\n    sig1_file = runtmp.output(\"sig1.sig\")\n    sig2_file = runtmp.output(\"sig2.sig\")\n    with open(sig1_file, \"w\") as fp:\n        save_signatures_to_json([sig1], fp)\n    with open(sig2_file, \"w\") as fp:\n        save_signatures_to_json([sig2], fp)\n\n    c.run_sourmash(\"sig\", \"overlap\", sig1_file, sig2_file, \"-k\", \"31\")\n    out = c.last_result.out\n    print(out)\n    assert (\n        \"cANI values not reported. One or more sketches contains too few hashes for accurate size estimation.\"\n        in out\n    )\n\n\ndef test_sig_overlap_abund(runtmp):\n    c = runtmp\n    # get overlap details\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"overlap\", sig47, sig63)\n    out = c.last_result.out\n    print(out)\n    # md5s\n    assert \"09a08691ce52952152f0e866a59f6261\" in out\n    assert \"38729c6374925585db28916b82a6f513\" in out\n\n    assert \"jaccard similarity:          0.32069\" in out\n    assert \"first contained in second:   0.48851 (cANI: 0.97716)\" in out\n    assert \"second contained in first:   0.48282 (cANI: 0.97679)\" in out\n    assert \"average containment ANI:     0.97697\" in out\n\n    assert \"number of hashes in common:  2529\" in out\n    assert \"angular similarity:          0.32983\" in out\n    assert \"first contained in second (weighted): 0.49169\" in out\n    assert \"second contained in first (weighted): 0.49126\" in out\n\n    assert \"number of hashes in first (weighted): 5292\" in out\n    assert \"number of hashes in second (weighted): 5433\" in out\n\n\ndef test_sig_overlap_num(runtmp):\n    # test sig overlap with num signatures\n    c = runtmp\n    # get overlap details\n    sig47 = utils.get_test_data(\"num/47.fa.sig\")\n    sig63 = utils.get_test_data(\"num/63.fa.sig\")\n    c.run_sourmash(\"sig\", \"overlap\", sig47, sig63, \"-k\", \"31\")\n    out = c.last_result.out\n    print(out)\n    # md5s\n    assert \"091475b51432957736461bed0a02937f\" in out\n    assert \"89dc40f63698afbf06e3db9d3c9c3dd8\" in out\n\n    assert \"jaccard similarity:          0.35000\" in out\n    assert \"containment and ANI not available (signatures are not scaled)\"\n    assert \"number of hashes in common:  247\"\n\n\n@utils.in_tempdir\ndef test_import_export_1(c):\n    # check to make sure we can import what we've exported!\n    inp = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    outp = c.output(\"export.json\")\n\n    c.run_sourmash(\"sig\", \"export\", inp, \"-o\", outp, \"-k\", \"21\", \"--dna\")\n    c.run_sourmash(\"sig\", \"import\", outp)\n\n    original = load_one_signature_from_json(inp, ksize=21, select_moltype=\"DNA\")\n    roundtrip = load_one_signature_from_json(c.last_result.out)\n\n    assert original.minhash == roundtrip.minhash\n\n\n@utils.in_tempdir\ndef test_import_export_1_by_md5(c):\n    # check to make sure we can import what we've exported!\n    inp = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    outp = c.output(\"export.json\")\n\n    c.run_sourmash(\"sig\", \"export\", inp, \"-o\", outp, \"--md5\", \"1437d8eae6\")\n    c.run_sourmash(\"sig\", \"import\", outp)\n\n    original = load_one_signature_from_json(inp, ksize=21, select_moltype=\"DNA\")\n    roundtrip = load_one_signature_from_json(c.last_result.out)\n\n    assert original.minhash == roundtrip.minhash\n\n\n@utils.in_tempdir\ndef test_import_export_2(c):\n    # check to make sure we can import a mash JSON dump file.\n    # NOTE: msh.json_dump file calculated like so:\n    #   mash sketch -s 500 -k 21 ./tests/test-data/genome-s11.fa.gz\n    #   mash info -d ./tests/test-data/genome-s11.fa.gz.msh > tests/test-data/genome-s11.fa.gz.msh.json_dump\n    #\n    sig1 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    msh_sig = utils.get_test_data(\"genome-s11.fa.gz.msh.json_dump\")\n\n    c.run_sourmash(\"sig\", \"import\", msh_sig)\n    imported = load_one_signature_from_json(c.last_result.out)\n    compare = load_one_signature_from_json(sig1, ksize=21, select_moltype=\"DNA\")\n\n    assert imported.minhash == compare.minhash\n\n\ndef test_import_mash_csv_to_sig(runtmp):\n    # test copied over from 'sourmash import_csv'.\n    testdata1 = utils.get_test_data(\"short.fa.msh.dump\")\n    testdata2 = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sig\", \"import\", \"--csv\", testdata1, \"-o\", \"xxx.sig\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=970\", testdata2)\n\n    runtmp.sourmash(\"search\", \"-k\", \"31\", \"short.fa.sig\", \"xxx.sig\")\n\n    print(\"RUNTEMP\", runtmp)\n\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"100.0%       short.fa\" in runtmp.last_result.out\n\n\ndef test_sig_manifest_1_zipfile(runtmp):\n    # make a manifest from a .zip file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_1_zipfile_csv_gz(runtmp):\n    # make a gzipped manifest from a .zip file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"SOURMASH-MANIFEST.csv.gz\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv.gz\")\n    with gzip.open(manifest_fn, \"rt\", newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_1_zipfile_already_exists(runtmp):\n    # make a manifest from a .zip file;\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    mf_csv = runtmp.output(\"mf.csv\")\n    with open(mf_csv, \"w\") as fp:\n        fp.write(\"hello, world\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"mf.csv\")\n\n\ndef test_sig_manifest_1_zipfile_already_exists_force(runtmp):\n    # make a manifest from a .zip file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    mf_csv = runtmp.output(\"mf.csv\")\n    with open(mf_csv, \"w\") as fp:\n        fp.write(\"hello, world\")\n\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"mf.csv\", \"-f\")\n\n    with open(mf_csv, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_1_zipfile_already_exists_sql(runtmp):\n    # make a manifest from a .zip file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    mf_csv = runtmp.output(\"mf.mfsql\")\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"mf.mfsql\", \"-F\", \"sql\")\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"mf.mfsql\", \"-F\", \"sql\", \"-f\")\n\n    manifest = CollectionManifest.load_from_filename(mf_csv)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_2_sigfile(runtmp):\n    # make a manifest from a .sig file\n    sigfile = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n\n    runtmp.sourmash(\"sig\", \"manifest\", sigfile, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 1\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n\n\ndef test_sig_manifest_3_sbt(runtmp):\n    # make a manifest from an SBT\n    protzip = utils.get_test_data(\"prot/protein.sbt.zip\")\n    runtmp.sourmash(\"sig\", \"manifest\", protzip, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_4_lca(runtmp):\n    # make a manifest from a .lca.json file\n    sigfile = utils.get_test_data(\"prot/protein.lca.json.gz\")\n    runtmp.sourmash(\"sig\", \"manifest\", sigfile, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_5_dir(runtmp):\n    # make a manifest from a directory\n    sigfile = utils.get_test_data(\"prot/protein/\")\n    runtmp.sourmash(\"sig\", \"manifest\", sigfile, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_manifest_6_pathlist(runtmp):\n    # make a manifest from a pathlist file\n    sigfiles = utils.get_test_data(\"prot/protein/*.sig\")\n    sigfiles = glob.glob(sigfiles)\n\n    pathlist = runtmp.output(\"pathlist.txt\")\n    with open(pathlist, \"w\") as fp:\n        fp.write(\"\\n\".join(sigfiles))\n\n    runtmp.sourmash(\"sig\", \"manifest\", pathlist, \"-o\", \"SOURMASH-MANIFEST.csv\")\n\n    manifest_fn = runtmp.output(\"SOURMASH-MANIFEST.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    # note: the manifest output for pathlists will contain the locations\n    # used in the pathlist. This is required by StandaloneManifestIndex.\n    for row in manifest.rows:\n        iloc = row[\"internal_location\"]\n        print(iloc)\n        assert iloc.startswith(\"/\"), iloc\n\n\ndef test_sig_manifest_does_not_exist(runtmp):\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"manifest\", \"does-not-exist\", \"-o\", \"out.csv\")\n\n    assert (\n        \"Cannot open 'does-not-exist' as a sourmash signature collection.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_sig_manifest_7_allzip_1(runtmp, cli_v4_only):\n    # the rebuilt manifest w/o '-f' will miss dna-sig.noext\n    # note: default in v4 is to rebuild manifest\n    allzip = utils.get_test_data(\"prot/all.zip\")\n    runtmp.sourmash(\n        \"sig\", \"manifest\", allzip, \"-o\", \"xyz.csv\", \"-d\", version=cli_v4_only\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    manifest_fn = runtmp.output(\"xyz.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 7\n    filenames = set(row[\"internal_location\"] for row in manifest.rows)\n    assert \"dna-sig.noext\" not in filenames\n\n\ndef test_sig_manifest_7_allzip_2(runtmp):\n    # the rebuilt manifest w/ '-f' will contain dna-sig.noext\n    allzip = utils.get_test_data(\"prot/all.zip\")\n    runtmp.sourmash(\"sig\", \"manifest\", allzip, \"-o\", \"xyz.csv\", \"-f\")\n\n    manifest_fn = runtmp.output(\"xyz.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 8\n    filenames = set(row[\"internal_location\"] for row in manifest.rows)\n    assert \"dna-sig.noext\" in filenames\n\n\ndef test_sig_manifest_7_allzip_3_no_rebuild(runtmp, cli_v4_only):\n    # the manifest contains 8 entries.\n    # note: --rebuild-manifest is default behavior on v4; in v5, no rebuild.\n    allzip = utils.get_test_data(\"prot/all.zip\")\n    runtmp.sourmash(\n        \"sig\", \"manifest\", allzip, \"-o\", \"xyz.csv\", \"--no-rebuild\", version=cli_v4_only\n    )\n\n    manifest_fn = runtmp.output(\"xyz.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 8\n    filenames = set(row[\"internal_location\"] for row in manifest.rows)\n    assert \"dna-sig.noext\" in filenames\n\n\ndef test_sig_manifest_7_allzip_3_no_rebuild_is_default_v5(runtmp, cli_v5_only):\n    # by default, do not rebuild the manifest.\n    # note: --no-rebuild-manifest is on by default in v5\n    allzip = utils.get_test_data(\"prot/all.zip\")\n    runtmp.sourmash(\"sig\", \"manifest\", allzip, \"-o\", \"xyz.csv\", version=cli_v5_only)\n\n    manifest_fn = runtmp.output(\"xyz.csv\")\n    with open(manifest_fn, newline=\"\") as csvfp:\n        manifest = CollectionManifest.load_from_csv(csvfp)\n\n    assert len(manifest) == 8\n    filenames = set(row[\"internal_location\"] for row in manifest.rows)\n    assert \"dna-sig.noext\" in filenames\n\n\ndef test_sig_manifest_8_sqldb(runtmp):\n    # make a sqldb and then run sig manifest on it.\n    gcf_all = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    sqldb = runtmp.output(\"some.sqldb\")\n\n    runtmp.sourmash(\"sig\", \"cat\", \"-k\", \"31\", *gcf_all, \"-o\", sqldb)\n\n    # need to use '--no-rebuild-manifest' with 'sig manifest' on sqldb,\n    # because it has a manifest but not the _signatures_with_internal\n    # method to rebuild one ;)\n\n    # so, this should fail...\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"manifest\", sqldb, \"-o\", \"mf.csv\")\n\n    # ...and this should succeed:\n    runtmp.sourmash(\"sig\", \"manifest\", sqldb, \"-o\", \"mf.csv\", \"--no-rebuild\")\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"manifest contains 12 signatures total.\" in err\n    assert \"wrote manifest to 'mf.csv'\" in err\n\n    mf = CollectionManifest.load_from_filename(runtmp.output(\"mf.csv\"))\n    assert len(mf) == 12\n\n\ndef test_sig_manifest_8_sqldb_out(runtmp):\n    # make a zip and run manifest out on it to make a sql format manifest.\n    gcf_all = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    zipfile = runtmp.output(\"some.zip\")\n\n    runtmp.sourmash(\"sig\", \"cat\", \"-k\", \"31\", *gcf_all, \"-o\", zipfile)\n\n    # ...and this should succeed:\n    runtmp.sourmash(\"sig\", \"manifest\", zipfile, \"-o\", \"mf.sqldb\", \"-F\", \"sql\")\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"manifest contains 12 signatures total.\" in err\n    assert \"wrote manifest to 'mf.sqldb'\" in err\n\n    mf = CollectionManifest.load_from_filename(runtmp.output(\"mf.sqldb\"))\n    assert len(mf) == 12\n\n\ndef test_sig_kmers_1_dna(runtmp):\n    # test sig kmers on dna\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", seqfile, \"-p\", \"scaled=1\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"DNA\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 970\" in err\n    assert \"found 970 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 970\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_1_dna_more_in_query(runtmp):\n    # test sig kmers on dna, where query has more than matches\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", seqfile, \"-p\", \"scaled=1\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"DNA\"\n\n    # make a new sequence for query, with more k-mers\n    query_seqfile = runtmp.output(\"query.fa\")\n    with open(query_seqfile, \"w\") as fp:\n        with screed.open(seqfile) as screed_iter:\n            for record in screed_iter:\n                fp.write(f\">{record.name}\\n{record.sequence}AGTTACGATC\\n\")\n\n    runtmp.sourmash(\"sig\", \"kmers\", \"--sig\", \"short.fa.sig\", \"--seq\", query_seqfile)\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 970\" in err\n    # should only find 970 overlapping hashes here --\n    assert \"found 970 distinct matching hashes (100.0%)\" in err\n\n\ndef test_sig_kmers_1_dna_empty_seq(runtmp):\n    # test sig kmers with empty query seq\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", seqfile, \"-p\", \"scaled=1\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"DNA\"\n\n    # make a new sequence for query, with more k-mers\n    query_seqfile = runtmp.output(\"query.fa\")\n    with open(query_seqfile, \"w\"):\n        pass\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"kmers\", \"--sig\", \"short.fa.sig\", \"--seq\", query_seqfile)\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"ERROR: no sequences searched!?\" in err\n\n\ndef test_sig_kmers_1_dna_empty_sig(runtmp):\n    # test sig kmers with empty query sig\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    mh = sourmash.MinHash(ksize=31, n=0, scaled=1)\n    ss = sourmash.SourmashSignature(mh, name=\"empty\")\n    with open(runtmp.output(\"empty.sig\"), \"w\") as fp:\n        save_signatures_to_json([ss], fp)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"kmers\", \"--sig\", \"empty.sig\", \"--seq\", seqfile)\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"ERROR: no hashes in query signature!?\" in err\n\n\ndef test_sig_kmers_1_dna_single_sig(runtmp):\n    # test sig kmers with a fabricated query sig with a single hash\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    mh = sourmash.MinHash(ksize=31, n=0, scaled=1)\n    mh.add_hash(1070961951490202715)\n    ss = sourmash.SourmashSignature(mh, name=\"small\")\n    with open(runtmp.output(\"small.sig\"), \"w\") as fp:\n        save_signatures_to_json([ss], fp)\n\n    runtmp.sourmash(\"sig\", \"kmers\", \"--sig\", \"small.sig\", \"--seq\", seqfile)\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1\" in err\n    assert \"found 1 distinct matching hashes (100.0%)\" in err\n\n\ndef test_sig_kmers_1_dna_lowscaled(runtmp):\n    # test sig kmers on dna with a scaled of 100, so not all k-mers\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", seqfile, \"-p\", \"scaled=100\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"DNA\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 5\" in err\n    assert \"found 5 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 5\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_1_dna_num(runtmp):\n    # test sig kmers on dna with a scaled of 100, so not all k-mers\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", seqfile, \"-p\", \"num=50\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"DNA\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 50\" in err\n    assert \"found 50 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 50\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_1_dna_translate_protein(runtmp):\n    # test sig kmers on dna\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", seqfile, \"-p\", \"scaled=1\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"protein\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n        \"--translate\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1942\" in err\n    assert \"found 1942 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1942\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_1_dna_translate_dayhoff(runtmp):\n    # test sig kmers on dna\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", seqfile, \"-p\", \"scaled=1,dayhoff\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"dayhoff\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n        \"--translate\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1906\" in err\n    assert \"found 1906 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1906\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_1_dna_translate_hp(runtmp):\n    # test sig kmers on dna\n    seqfile = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", seqfile, \"-p\", \"scaled=1,hp\")\n    ss = load_one_signature_from_json(runtmp.output(\"short.fa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"hp\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"short.fa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"short.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n        \"--translate\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1750\" in err\n    assert \"found 1750 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 1\n    assert len(records[0].sequence) == 1000, len(records[0].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_sequence(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"short.csv\"))\n    with open(runtmp.output(\"short.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1750\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_sequence(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_2_protein(runtmp):\n    # test out sig kmers on an faa file\n    seqfile = utils.get_test_data(\"ecoli.faa\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", seqfile, \"-p\", \"scaled=1\")\n    ss = load_one_signature_from_json(runtmp.output(\"ecoli.faa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"protein\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"ecoli.faa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"ecoli.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1112\" in err\n    assert \"found 1112 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 2\n    assert len(records[0].sequence) == 820, len(records[0].sequence)\n    assert len(records[1].sequence) == 310, len(records[1].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_protein(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"ecoli.csv\"))\n    with open(runtmp.output(\"ecoli.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1112\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_protein(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_2_dayhoff(runtmp):\n    # test out sig kmers on an faa file\n    seqfile = utils.get_test_data(\"ecoli.faa\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", seqfile, \"-p\", \"scaled=1,dayhoff\")\n    ss = load_one_signature_from_json(runtmp.output(\"ecoli.faa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"dayhoff\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"ecoli.faa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"ecoli.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1100\" in err\n    assert \"found 1100 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 2\n    assert len(records[0].sequence) == 820, len(records[0].sequence)\n    assert len(records[1].sequence) == 310, len(records[1].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_protein(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"ecoli.csv\"))\n    with open(runtmp.output(\"ecoli.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1100\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_protein(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_kmers_2_hp(runtmp):\n    # test out sig kmers on an faa file\n    seqfile = utils.get_test_data(\"ecoli.faa\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", seqfile, \"-p\", \"scaled=1,hp\")\n    ss = load_one_signature_from_json(runtmp.output(\"ecoli.faa.sig\"))\n    mh = ss.minhash\n    assert mh.moltype == \"hp\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"kmers\",\n        \"--sig\",\n        \"ecoli.faa.sig\",\n        \"--seq\",\n        seqfile,\n        \"--save-kmers\",\n        \"ecoli.csv\",\n        \"--save-sequences\",\n        \"matched.fa\",\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"total hashes in merged signature: 1048\" in err\n    assert \"found 1048 distinct matching hashes (100.0%)\" in err\n\n    # check FASTA output\n    assert os.path.exists(runtmp.output(\"matched.fa\"))\n    with screed.open(runtmp.output(\"matched.fa\")) as f:\n        records = list(f)\n    assert len(records) == 2\n    assert len(records[0].sequence) == 820, len(records[0].sequence)\n    assert len(records[1].sequence) == 310, len(records[1].sequence)\n\n    seq_mh = mh.copy_and_clear()\n    for record in records:\n        seq_mh.add_protein(record.sequence)\n    assert seq_mh.similarity(mh) == 1.0\n\n    # check CSV output w/k-mers and hashes etc\n    assert os.path.exists(runtmp.output(\"ecoli.csv\"))\n    with open(runtmp.output(\"ecoli.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1048\n\n    check_mh = mh.copy_and_clear()\n    check_mh2 = mh.copy_and_clear()\n    for row in rows:\n        check_mh.add_protein(row[\"kmer\"])\n        check_mh2.add_hash(int(row[\"hashval\"]))\n    assert check_mh.similarity(mh) == 1.0\n    assert check_mh2.similarity(mh) == 1.0\n\n\ndef test_sig_check_1(runtmp, abspath_relpath_v4):\n    # basic check functionality\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_fail_abspath_relpath(runtmp):\n    # basic check functionality\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    with pytest.raises(\n        SourmashCommandFailed,\n        match=\"Cannot specify both --abspath and --relpath; pick one!\",\n    ):\n        runtmp.sourmash(\n            \"sig\",\n            \"check\",\n            *sigfiles,\n            \"--picklist\",\n            f\"{picklist}::manifest\",\n            \"-m\",\n            \"mf.csv\",\n            \"--abspath\",\n            \"--relpath\",\n        )\n\n\ndef test_sig_check_1_warn_abspath_relpath(runtmp, abspath_or_relpath):\n    # warn that without -m, --abspath/--relpath are not helpful\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        abspath_or_relpath,\n    )\n\n    err = runtmp.last_result.err\n    assert (\n        \" WARNING: --abspath and --relpath only have effects when saving a manifest\"\n        in err\n    )\n\n\ndef test_sig_check_1_mf_csv_gz(runtmp, abspath_relpath_v4):\n    # basic check functionality, with gzipped manifest output\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv.gz\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv.gz\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with gzip.open(out_mf, \"rt\", newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_gz(runtmp, abspath_relpath_v4):\n    # basic check functionality with gzipped picklist\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n    picklist_gz = runtmp.output(\"salmonella.csv.gz\")\n\n    with gzip.open(picklist_gz, \"w\") as outfp:\n        with open(picklist, \"rb\") as infp:\n            outfp.write(infp.read())\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        \"salmonella.csv.gz::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_nofail(runtmp, abspath_relpath_v4):\n    # basic check functionality with --fail-if-missing\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        \"--fail-if-missing\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_no_picklist(runtmp):\n    # basic check functionality\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\"sig\", \"check\", *sigfiles)\n\n    assert \"No picklist provided?! Exiting.\" in str(exc)\n\n\n@pytest.mark.parametrize(\n    \"column, coltype\",\n    (\n        (\"md5\", \"md5\"),\n        (\"md5\", \"md5prefix8\"),\n        (\"name\", \"name\"),\n        (\"name\", \"ident\"),\n        (\"name\", \"identprefix\"),\n    ),\n)\ndef test_sig_check_1_column(runtmp, column, coltype, abspath_relpath_v4):\n    # basic check functionality for various columns/coltypes\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}:{column}:{coltype}\",\n        \"-m\",\n        \"mf.csv\",\n        \"-o\",\n        \"missing.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_diff_col_name(runtmp, abspath_relpath_v4):\n    # 'sig check' with 'name2' column instead of default name\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist-diffcolumn.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}:name2:name\",\n        \"-o\",\n        \"missing.csv\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    missing_csv = runtmp.output(\"missing.csv\")\n    assert os.path.exists(missing_csv)\n\n    # should be 24 matching manifest rows\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    # internal locations should match\n    sigfile_set = set(sigfiles)\n    for row in mf.rows:\n        assert row[\"internal_location\"] in sigfile_set\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n    # should be one non-matching picklist row\n    with open(missing_csv, newline=\"\") as fp:\n        rows = list(csv.reader(fp))\n    assert len(rows) == 2  # header row + data row\n    assert rows[1][0] == \"NOT THERE\"\n\n\ndef test_sig_check_1_diff_col_name_zip(runtmp, abspath_relpath_v4):\n    # 'sig check' with 'name2' column instead of default name, on a zip file\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist-diffcolumn.csv\")\n\n    # first create a zip db\n    runtmp.sourmash(\"sig\", \"cat\", *sigfiles, \"-o\", \"gcf.zip\")\n\n    # now run against this zip\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        \"gcf.zip\",\n        \"--picklist\",\n        f\"{picklist}:name2:name\",\n        \"-o\",\n        \"missing.csv\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    missing_csv = runtmp.output(\"missing.csv\")\n    assert os.path.exists(missing_csv)\n\n    # should be 24 matching manifest rows\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    # internal locations should all point to zip\n    ilocs = set(row[\"internal_location\"] for row in mf.rows)\n    assert len(ilocs) == 1\n\n    # can we get 'em?\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 24\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n    # should be one non-matching picklist row\n    with open(missing_csv, newline=\"\") as fp:\n        rows = list(csv.reader(fp))\n    assert len(rows) == 2  # header row + data row\n    assert rows[1][0] == \"NOT THERE\"\n\n\ndef test_sig_check_1_diff_col_name_exclude(runtmp, abspath_relpath_v4):\n    # 'sig check' with 'name2' column, :exclude picklist\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist-diffcolumn.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}:name2:name:exclude\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # should be 12 matching manifest rows\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 12\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 12\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 3\n    assert 11 in ksizes\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_ksize(runtmp, abspath_relpath_v4):\n    # basic check functionality with selection for ksize\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"-k\",\n        \"31\",\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # 8 of the 24 should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 8\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 8\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 1\n    assert 31 in ksizes\n\n\ndef test_sig_check_1_ksize_output_sql(runtmp, abspath_relpath_v4):\n    # basic check functionality with selection for ksize\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"-k\",\n        \"31\",\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.mfsql\",\n        \"-F\",\n        \"sql\",\n        abspath_relpath_v4,\n    )\n\n    out_mf = runtmp.output(\"mf.mfsql\")\n    assert os.path.exists(out_mf)\n\n    # 8 of the 24 should match.\n    mf = CollectionManifest.load_from_filename(out_mf)\n    assert len(mf) == 8\n    assert mf.conn  # check that it's a sqlite manifest! hacky...\n\n    idx = sourmash.load_file_as_index(out_mf)\n    siglist = list(idx.signatures())\n    assert len(siglist) == 8\n    ksizes = set([ss.minhash.ksize for ss in siglist])\n    assert len(ksizes) == 1\n    assert 31 in ksizes\n\n\ndef test_sig_check_2_output_missing(runtmp, abspath_relpath_v4):\n    # output missing all as identical to input picklist\n    sigfiles = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-o\",\n        \"missing.csv\",\n        \"-m\",\n        \"mf.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_csv = runtmp.output(\"missing.csv\")\n    assert os.path.exists(out_csv)\n\n    mf_csv = runtmp.output(\"mf.csv\")\n    assert not os.path.exists(mf_csv)\n    assert \"not saving matching manifest\" in runtmp.last_result.err\n\n    # everything is missing with 'combined.sig'\n    with open(out_csv, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n\n    assert len(rows) == 24\n\n\ndef test_sig_check_2_output_missing_error_exit(runtmp):\n    # output missing all as identical to input picklist\n    sigfiles = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    # should error exit...\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\",\n            \"check\",\n            sigfiles,\n            \"--picklist\",\n            f\"{picklist}::manifest\",\n            \"-o\",\n            \"missing.csv\",\n            \"--fail\",\n        )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # ...and also output stuff!\n    out_csv = runtmp.output(\"missing.csv\")\n    assert os.path.exists(out_csv)\n\n    # everything is missing with 'combined.sig'\n    with open(out_csv, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n\n    assert len(rows) == 24\n\n\n@pytest.mark.parametrize(\n    \"column, coltype\",\n    (\n        (\"md5\", \"md5\"),\n        (\"md5\", \"md5prefix8\"),\n        (\"name\", \"name\"),\n        (\"name\", \"ident\"),\n        (\"name\", \"identprefix\"),\n    ),\n)\ndef test_sig_check_2_output_missing_column(runtmp, column, coltype, abspath_relpath_v4):\n    # output missing all as identical to input picklist\n    sigfiles = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-o\",\n        \"missing.csv\",\n        abspath_relpath_v4,\n    )\n\n    out_csv = runtmp.output(\"missing.csv\")\n    assert os.path.exists(out_csv)\n\n    # everything is missing with 'combined.sig'\n    with open(out_csv, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n\n    assert len(rows) == 24\n\n\ndef test_sig_check_2_output_missing_exclude(runtmp):\n    # 'exclude' with '-o' shouldn't work\n    sigfiles = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\n            \"sig\",\n            \"check\",\n            sigfiles,\n            \"--picklist\",\n            f\"{picklist}:name:name:exclude\",\n            \"-o\",\n            \"missing.csv\",\n        )\n\n    assert (\n        \"** ERROR: Cannot use an 'exclude' picklist with '-o/--output-missing'\"\n        in str(exc)\n    )\n\n\ndef test_sig_check_3_no_manifest(runtmp):\n    # fail check when no manifest, by default\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n    picklist = utils.get_test_data(\"v6.sbt.zip.mf.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"check\", sbt, \"--picklist\", f\"{picklist}::manifest\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    err = runtmp.last_result.err\n    assert \"sig check requires a manifest by default, but no manifest present.\" in err\n\n\ndef test_sig_check_3_no_manifest_ok(runtmp, abspath_relpath_v4):\n    # generate manifest if --no-require-manifest\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n    picklist = utils.get_test_data(\"v6.sbt.zip.mf.csv\")\n\n    runtmp.run_sourmash(\n        \"sig\",\n        \"check\",\n        sbt,\n        \"--no-require-manifest\",\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        abspath_relpath_v4,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert (\n        \"for given picklist, found 7 matches to 7 distinct values\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_sig_check_4_manifest_cwd_cwd(runtmp, abspath_relpath_v4):\n    # check: manifest and sigs in cwd\n    prot_zip = utils.get_test_data(\"prot/all.zip\")\n\n    shutil.copyfile(prot_zip, runtmp.output(\"prot.zip\"))\n\n    # generate a picklist, whatever\n    runtmp.sourmash(\"sig\", \"manifest\", \"prot.zip\", \"-o\", \"picklist.csv\")\n    assert os.path.exists(runtmp.output(\"picklist.csv\"))\n\n    # use picklist with sig check to generate a manifest\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        \"-m\",\n        \"mf.csv\",\n        \"--picklist\",\n        \"picklist.csv::manifest\",\n        \"prot.zip\",\n        abspath_relpath_v4,\n    )\n\n    # check that it all works\n    runtmp.sourmash(\"sig\", \"cat\", \"mf.csv\")\n\n\ndef test_sig_check_4_manifest_subdir_cwd(runtmp, abspath_or_relpath):\n    # check: manifest in subdir and sigs in cwd. note,\n    # fails with default v4 behavior. see #3008.\n    prot_zip = utils.get_test_data(\"prot/all.zip\")\n\n    shutil.copyfile(prot_zip, runtmp.output(\"prot.zip\"))\n    os.mkdir(runtmp.output(\"mf_dir\"))\n\n    # generate a picklist, whatever\n    runtmp.sourmash(\"sig\", \"manifest\", \"prot.zip\", \"-o\", \"picklist.csv\")\n    assert os.path.exists(runtmp.output(\"picklist.csv\"))\n\n    # use picklist with sig check to generate a manifest\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        \"-m\",\n        \"mf_dir/mf.csv\",\n        \"--picklist\",\n        \"picklist.csv::manifest\",\n        \"prot.zip\",\n        abspath_or_relpath,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # check that it all works\n    runtmp.sourmash(\"sig\", \"cat\", \"mf_dir/mf.csv\")\n\n\ndef test_sig_check_4_manifest_cwd_subdir(runtmp, abspath_relpath_v4):\n    # check: manifest in cwd and sigs in subdir\n    prot_zip = utils.get_test_data(\"prot/all.zip\")\n\n    os.mkdir(runtmp.output(\"zip_dir\"))\n    shutil.copyfile(prot_zip, runtmp.output(\"zip_dir/prot.zip\"))\n\n    # generate a picklist, whatever\n    runtmp.sourmash(\"sig\", \"manifest\", \"zip_dir/prot.zip\", \"-o\", \"picklist.csv\")\n    assert os.path.exists(runtmp.output(\"picklist.csv\"))\n\n    # use picklist with sig check to generate a manifest\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        \"-m\",\n        \"mf.csv\",\n        \"--picklist\",\n        \"picklist.csv::manifest\",\n        \"zip_dir/prot.zip\",\n        abspath_relpath_v4,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # check that it all works\n    runtmp.sourmash(\"sig\", \"cat\", \"mf.csv\")\n\n\ndef test_sig_check_4_manifest_subdir_subdir(runtmp, abspath_or_relpath):\n    # check: manifest and sigs in subdir. note, fails with default v4 behavior.\n    # see #3008.\n    prot_zip = utils.get_test_data(\"prot/all.zip\")\n\n    os.mkdir(runtmp.output(\"zip_dir\"))\n    shutil.copyfile(prot_zip, runtmp.output(\"zip_dir/prot.zip\"))\n    os.mkdir(runtmp.output(\"mf_dir\"))\n\n    # generate a picklist, whatever\n    runtmp.sourmash(\"sig\", \"manifest\", \"zip_dir/prot.zip\", \"-o\", \"picklist.csv\")\n    assert os.path.exists(runtmp.output(\"picklist.csv\"))\n\n    # use picklist with sig check to generate a manifest\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        \"-m\",\n        \"mf_dir/mf.csv\",\n        \"--picklist\",\n        \"picklist.csv::manifest\",\n        \"zip_dir/prot.zip\",\n        abspath_or_relpath,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # check that it all works\n    runtmp.sourmash(\"sig\", \"cat\", \"mf_dir/mf.csv\")\n\n\ndef test_sig_check_5_relpath(runtmp):\n    # check path rewriting when sketches are in a subdir.\n    # this will be the default behavior in v5.\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    os.mkdir(runtmp.output(\"mf_dir\"))\n\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    new_names = []\n    for f in sigfiles:\n        basename = os.path.basename(f)\n        filename = os.path.join(\"sigs_dir\", basename)\n\n        shutil.copyfile(f, runtmp.output(filename))\n        new_names.append(filename)\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *new_names,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf_dir/mf.csv\",\n        \"--relpath\",\n    )\n\n    out_mf = runtmp.output(\"mf_dir/mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    locations = [row[\"internal_location\"] for row in mf.rows]\n    expected_names = [\"../\" + f for f in new_names]\n    assert set(locations).issubset(expected_names), (locations, expected_names)\n\n\ndef test_sig_check_5_relpath_subdir(runtmp, cli_v4_and_v5):\n    # check path rewriting when both sigs and mf are in different subdirs.\n    # use explicit --relpath (which will become default in v5)\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    new_names = []\n    for f in sigfiles:\n        basename = os.path.basename(f)\n        filename = os.path.join(\"sigs_dir\", basename)\n\n        shutil.copyfile(f, runtmp.output(filename))\n        new_names.append(filename)\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *new_names,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        \"--relpath\",\n        version=cli_v4_and_v5,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    locations = [row[\"internal_location\"] for row in mf.rows]\n    print(\"XXX\", locations)\n    print(\"YYY\", new_names)\n    expected_names = [\"./\" + f for f in new_names]\n    assert set(locations).issubset(expected_names), (locations, expected_names)\n\n\ndef test_sig_check_5_relpath_subdir_default_v5(runtmp, cli_v5_only):\n    # check path rewriting when both sigs and mf are in different subdirs.\n    # default in v5 is --relpath.\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    new_names = []\n    for f in sigfiles:\n        basename = os.path.basename(f)\n        filename = os.path.join(\"sigs_dir\", basename)\n\n        shutil.copyfile(f, runtmp.output(filename))\n        new_names.append(filename)\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *new_names,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        version=cli_v5_only,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    locations = [row[\"internal_location\"] for row in mf.rows]\n    print(\"XXX\", locations)\n    print(\"YYY\", new_names)\n    expected_names = [\"./\" + f for f in new_names]\n    assert set(locations).issubset(expected_names), (locations, expected_names)\n\n\ndef test_sig_check_5_abspath(runtmp, cli_v4_and_v5):\n    # check path rewriting with `--abspath` => absolute paths.\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    for f in sigfiles:\n        shutil.copyfile(f, runtmp.output(os.path.basename(f)))\n\n    # strip off abspath\n    sigfiles = [os.path.basename(f) for f in sigfiles]\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        \"--abspath\",\n        version=cli_v4_and_v5,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    locations = [row[\"internal_location\"] for row in mf.rows]\n    for k in locations:\n        assert k.startswith(\"/\")  # absolute\n        assert os.path.basename(k) in sigfiles  # converts back to basic\n\n\ndef test_sig_check_5_no_abspath(runtmp, cli_v4_only):\n    # check path rewriting for default (--no-relpath --no-abspath)\n    # this behavior will change in v5; specify `--no-abspath` then?\n    sigfiles = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/salmonella-picklist.csv\")\n\n    for f in sigfiles:\n        shutil.copyfile(f, runtmp.output(os.path.basename(f)))\n\n    # strip off abspath\n    sigfiles = [os.path.basename(f) for f in sigfiles]\n\n    runtmp.sourmash(\n        \"sig\",\n        \"check\",\n        *sigfiles,\n        \"--picklist\",\n        f\"{picklist}::manifest\",\n        \"-m\",\n        \"mf.csv\",\n        # \"--no-abspath\" # => default behavior\n        version=cli_v4_only,\n    )\n\n    out_mf = runtmp.output(\"mf.csv\")\n    assert os.path.exists(out_mf)\n\n    # all should match.\n    with open(out_mf, newline=\"\") as fp:\n        mf = CollectionManifest.load_from_csv(fp)\n    assert len(mf) == 24\n\n    locations = [row[\"internal_location\"] for row in mf.rows]\n    # no rewriting\n    assert set(locations).issubset(sigfiles)\n"
  },
  {
    "path": "tests/test_cmd_signature_collect.py",
    "content": "\"\"\"\nTests for 'sourmash sig collect'\n\"\"\"\n\nimport pytest\nimport shutil\nimport os.path\nimport gzip\n\nimport sourmash\nfrom sourmash.manifest import BaseCollectionManifest\n\nimport sourmash_tst_utils as utils\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n\ndef test_sig_collect_0_nothing(runtmp, manifest_db_format, abspath_relpath_v4):\n    # run with just output\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n    if manifest_db_format != \"sql\":\n        return\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 0\n\n\ndef test_sig_collect_0_fail_abspath_relpath(runtmp, manifest_db_format):\n    # check that it complains if both --abspath and --relpath are specified\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n    if manifest_db_format != \"sql\":\n        return\n\n    with pytest.raises(\n        SourmashCommandFailed,\n        match=\"Cannot specify both --abspath and --relpath; pick one!\",\n    ):\n        runtmp.sourmash(\n            \"sig\",\n            \"collect\",\n            \"-o\",\n            f\"mf.{ext}\",\n            \"-F\",\n            manifest_db_format,\n            \"--abspath\",\n            \"--relpath\",\n        )\n\n\ndef test_sig_collect_1_zipfile(runtmp, manifest_db_format, abspath_relpath_v4):\n    # collect a manifest from a .zip file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip,\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_collect_1_zipfile_csv_gz(runtmp, abspath_relpath_v4):\n    # collect a manifest from a .zip file, save to csv.gz\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    runtmp.sourmash(\n        \"sig\", \"collect\", protzip, \"-o\", \"mf.csv.gz\", \"-F\", \"csv\", abspath_relpath_v4\n    )\n\n    manifest_fn = runtmp.output(\"mf.csv.gz\")\n\n    # gzip, yes?\n    print(\"XXX\", manifest_fn)\n    with gzip.open(manifest_fn, \"rt\", newline=\"\") as fp:\n        fp.read()\n\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_collect_1_zipfile_csv_gz_roundtrip(runtmp, abspath_relpath_v4):\n    # collect a manifest from a .zip file, save to csv.gz; then load again\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    runtmp.sourmash(\n        \"sig\", \"collect\", protzip, \"-o\", \"mf.csv.gz\", \"-F\", \"csv\", abspath_relpath_v4\n    )\n\n    manifest_fn = runtmp.output(\"mf.csv.gz\")\n\n    # gzip, yes?\n    print(\"XXX\", manifest_fn)\n    with gzip.open(manifest_fn, \"rt\", newline=\"\") as fp:\n        fp.read()\n\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    # can we read a csv.gz?\n    runtmp.sourmash(\"sig\", \"collect\", \"mf.csv.gz\", \"-o\", \"mf2.csv\", \"-F\", \"csv\")\n\n    manifest_fn2 = runtmp.output(\"mf2.csv\")\n    manifest2 = BaseCollectionManifest.load_from_filename(manifest_fn2)\n\n    assert len(manifest2) == 2\n    md5_list = [row[\"md5\"] for row in manifest2.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_sig_collect_2_exists_fail(runtmp, manifest_db_format):\n    # collect a manifest from two .zip files\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    allzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\", \"collect\", protzip, \"-o\", f\"mf.{ext}\", \"-F\", manifest_db_format\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    # now run with same filename - should fail\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"collect\", allzip, \"-o\", manifest_fn, \"-F\", manifest_db_format\n        )\n\n\ndef test_sig_collect_2_exists_merge(runtmp, manifest_db_format, abspath_relpath_v4):\n    # collect a manifest from two .zip files\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip,\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    # now run with same filename - should merge\n    runtmp.sourmash(\n        \"sig\", \"collect\", allzip, \"-o\", manifest_fn, \"-F\", manifest_db_format, \"--merge\"\n    )\n\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n    assert len(manifest) == 10\n\n\ndef test_sig_collect_2_exists_sql_merge_csv(runtmp, manifest_db_format):\n    # try to merge csv into sql\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    ext = \"sqlmf\"\n\n    # save as sql...\n    runtmp.sourmash(\"sig\", \"collect\", protzip, \"-o\", f\"mf.{ext}\", \"-F\", \"sql\")\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"collect\", allzip, \"-o\", manifest_fn, \"-F\", \"csv\", \"--merge\"\n        )\n\n    assert \"ERROR loading\" in runtmp.last_result.err\n\n\ndef test_sig_collect_2_exists_csv_merge_sql(runtmp):\n    # try to merge sql into csv\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    ext = \"csv\"\n\n    # save as csv...\n    runtmp.sourmash(\"sig\", \"collect\", protzip, \"-o\", f\"mf.{ext}\", \"-F\", \"csv\")\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"collect\", allzip, \"-o\", manifest_fn, \"-F\", \"sql\", \"--merge\"\n        )\n\n    assert \"ERROR loading\" in runtmp.last_result.err\n\n\ndef test_sig_collect_2_no_exists_merge(runtmp, manifest_db_format, abspath_relpath_v4):\n    # test 'merge' when args.output doesn't already exist => warning\n    utils.get_test_data(\"prot/protein.zip\")\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n\n    # run with --merge but no previous:\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        allzip,\n        \"-o\",\n        manifest_fn,\n        \"-F\",\n        manifest_db_format,\n        \"--merge\",\n        abspath_relpath_v4,\n    )\n\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n    assert len(manifest) == 8\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"WARNING: --merge-previous specified, but output file\" in err\n\n\ndef test_sig_collect_3_multiple(runtmp, manifest_db_format):\n    # collect a manifest from two .zip files\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    hpzip = utils.get_test_data(\"prot/hp.zip\")\n    dayzip = utils.get_test_data(\"prot/dayhoff.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip,\n        hpzip,\n        dayzip,\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 6\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n    assert \"ea2a1ad233c2908529d124a330bcb672\" in md5_list\n    assert \"bb0e6d90df01b7bd5d0956a5f9e3ed12\" in md5_list\n    assert \"fbca5e5211e4d58427997fd5c8343e9a\" in md5_list\n    assert \"1cbd888bf910f83ad8f1715509183223\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    assert protzip in locations\n    assert hpzip in locations\n    assert dayzip in locations\n    assert len(locations) == 3, locations\n\n\ndef test_sig_collect_3_multiple_use_fromfile(runtmp, manifest_db_format):\n    # collect a manifest from two .zip files using --from-file\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n    hpzip = utils.get_test_data(\"prot/hp.zip\")\n    dayzip = utils.get_test_data(\"prot/dayhoff.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    fromfile = runtmp.output(\"fromfile.txt\")\n    with open(fromfile, \"w\") as fp:\n        print(protzip, file=fp)\n        print(hpzip, file=fp)\n        print(dayzip, file=fp)\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"--from-file\",\n        \"fromfile.txt\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 6\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n    assert \"ea2a1ad233c2908529d124a330bcb672\" in md5_list\n    assert \"bb0e6d90df01b7bd5d0956a5f9e3ed12\" in md5_list\n    assert \"fbca5e5211e4d58427997fd5c8343e9a\" in md5_list\n    assert \"1cbd888bf910f83ad8f1715509183223\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    assert protzip in locations\n    assert hpzip in locations\n    assert dayzip in locations\n    assert len(locations) == 3, locations\n\n\ndef test_sig_collect_4_multiple_from_sig(runtmp, manifest_db_format):\n    # collect a manifest from sig files\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\", \"collect\", sig43, sig63, \"-o\", f\"mf.{ext}\", \"-F\", manifest_db_format\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    assert sig43 in locations\n    assert sig63 in locations\n    assert len(locations) == 2, locations\n\n\ndef test_sig_collect_4_multiple_from_sig_abspath(runtmp, manifest_db_format):\n    # collect a manifest from sig files, forcing abspath\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    shutil.copyfile(sig43, runtmp.output(\"47.fa.sig\"))\n    shutil.copyfile(sig63, runtmp.output(\"63.fa.sig\"))\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"47.fa.sig\",\n        \"63.fa.sig\",\n        \"--abspath\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    print(locations)\n    assert len(locations) == 2, locations\n\n    for xx in locations:\n        assert xx.startswith(\"/\")\n\n\ndef test_sig_collect_4_multiple_no_abspath(runtmp, manifest_db_format):\n    # collect a manifest from sig files, no abspath\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # copy files to tmp, where they will not have full paths\n    shutil.copyfile(sig43, runtmp.output(\"47.fa.sig\"))\n    shutil.copyfile(sig63, runtmp.output(\"63.fa.sig\"))\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"47.fa.sig\",\n        \"63.fa.sig\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    print(locations)\n    assert len(locations) == 2, locations\n    assert \"47.fa.sig\" in locations\n    assert \"63.fa.sig\" in locations\n\n    runtmp.sourmash(\"sig\", \"cat\", f\"mf.{ext}\")\n\n\ndef test_sig_collect_4_multiple_subdir_subdir_relpath(runtmp, manifest_db_format):\n    # collect a manifest from sig files, no abspath; use a subdir for sketches\n    # fails with default v4 behavior; see #3008.\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # copy files to tmp, where they will not have full paths\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    shutil.copyfile(sig43, runtmp.output(\"sigs_dir/47.fa.sig\"))\n    shutil.copyfile(sig63, runtmp.output(\"sigs_dir/63.fa.sig\"))\n\n    # put manifest in subdir too.\n    os.mkdir(runtmp.output(\"mf_dir\"))\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"sigs_dir/47.fa.sig\",\n        \"sigs_dir/63.fa.sig\",\n        \"-o\",\n        f\"mf_dir/mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        \"--relpath\",\n    )\n\n    manifest_fn = runtmp.output(f\"mf_dir/mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    print(locations)\n    assert len(locations) == 2, locations\n    assert \"../sigs_dir/47.fa.sig\" in locations\n    assert \"../sigs_dir/63.fa.sig\" in locations\n\n    runtmp.sourmash(\"sig\", \"cat\", f\"mf_dir/mf.{ext}\")\n\n\ndef test_sig_collect_4_multiple_subdir_subdir_default_is_relpath(\n    runtmp, manifest_db_format, cli_v5_only\n):\n    # collect a manifest from sig files, no abspath; use a subdir for sketches\n    # --relpath is used by default on v5.\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # copy files to tmp, where they will not have full paths\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    shutil.copyfile(sig43, runtmp.output(\"sigs_dir/47.fa.sig\"))\n    shutil.copyfile(sig63, runtmp.output(\"sigs_dir/63.fa.sig\"))\n\n    # put manifest in subdir too.\n    os.mkdir(runtmp.output(\"mf_dir\"))\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"sigs_dir/47.fa.sig\",\n        \"sigs_dir/63.fa.sig\",\n        \"-o\",\n        f\"mf_dir/mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        version=cli_v5_only,\n    )\n\n    manifest_fn = runtmp.output(f\"mf_dir/mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    print(locations)\n    assert len(locations) == 2, locations\n    assert \"../sigs_dir/47.fa.sig\" in locations\n    assert \"../sigs_dir/63.fa.sig\" in locations\n\n    runtmp.sourmash(\"sig\", \"cat\", f\"mf_dir/mf.{ext}\")\n\n\ndef test_sig_collect_4_multiple_cwd_subdir_no_abspath(runtmp, manifest_db_format):\n    # collect a manifest from sig files, no abspath; use a subdir for sketches\n    # this should work with default behavior.\n    sig43 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    # copy files to tmp, where they will not have full paths\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    shutil.copyfile(sig43, runtmp.output(\"sigs_dir/47.fa.sig\"))\n    shutil.copyfile(sig63, runtmp.output(\"sigs_dir/63.fa.sig\"))\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        \"sigs_dir/47.fa.sig\",\n        \"sigs_dir/63.fa.sig\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 2\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"09a08691ce52952152f0e866a59f6261\" in md5_list\n    assert \"38729c6374925585db28916b82a6f513\" in md5_list\n\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    print(locations)\n    assert len(locations) == 2, locations\n    assert \"sigs_dir/47.fa.sig\" in locations\n    assert \"sigs_dir/63.fa.sig\" in locations\n\n    runtmp.sourmash(\"sig\", \"cat\", f\"mf.{ext}\")\n\n\ndef test_sig_collect_5_no_manifest_sbt_fail(runtmp, manifest_db_format):\n    # collect a manifest from files that don't have one\n    sbt_zip = utils.get_test_data(\"v6.sbt.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\", \"collect\", sbt_zip, \"-o\", f\"mf.{ext}\", \"-F\", manifest_db_format\n        )\n\n\ndef test_sig_collect_5_no_manifest_sbt_succeed(\n    runtmp, manifest_db_format, abspath_relpath_v4\n):\n    # generate a manifest from files that don't have one when --no-require\n    sbt_zip = utils.get_test_data(\"v6.sbt.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        sbt_zip,\n        \"--no-require-manifest\",\n        \"-o\",\n        f\"mf.{ext}\",\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    manifest_fn = runtmp.output(f\"mf.{ext}\")\n    manifest = BaseCollectionManifest.load_from_filename(manifest_fn)\n\n    assert len(manifest) == 7\n    locations = set([row[\"internal_location\"] for row in manifest.rows])\n    assert len(locations) == 1, locations\n    assert sbt_zip in locations\n\n\ndef test_sig_collect_6_path_cwd_cwd(runtmp, manifest_db_format, abspath_relpath_v4):\n    # check: manifest and sigs in cwd\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    protzip_path = \"protein.zip\"\n    shutil.copyfile(protzip, runtmp.output(protzip_path))\n\n    mf_path = f\"mf.{ext}\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip_path,\n        \"-o\",\n        mf_path,\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    runtmp.sourmash(\"sig\", \"cat\", mf_path)\n\n\ndef test_sig_collect_6_path_cwd_subdir(runtmp, manifest_db_format, abspath_relpath_v4):\n    # check: manifest in cwd, sigs in subdir\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    protzip_path = \"sigs_dir/protein.zip\"\n    shutil.copyfile(protzip, runtmp.output(protzip_path))\n\n    mf_path = f\"mf.{ext}\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip_path,\n        \"-o\",\n        mf_path,\n        \"-F\",\n        manifest_db_format,\n        abspath_relpath_v4,\n    )\n\n    runtmp.sourmash(\"sig\", \"cat\", mf_path)\n\n\ndef test_sig_collect_6_path_subdir_cwd(runtmp, manifest_db_format, abspath_or_relpath):\n    # check: manifest in cwd, sigs in subdir.  note, fails with default v4\n    # behavior. see #3008.\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    protzip_path = \"protein.zip\"\n    shutil.copyfile(protzip, runtmp.output(protzip_path))\n\n    os.mkdir(runtmp.output(\"mf_dir\"))\n    mf_path = f\"mf_dir/mf.{ext}\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip_path,\n        \"-o\",\n        mf_path,\n        \"-F\",\n        manifest_db_format,\n        abspath_or_relpath,\n    )\n\n    runtmp.sourmash(\"sig\", \"cat\", mf_path)\n\n\ndef test_sig_collect_6_path_subdir_subdir(\n    runtmp, manifest_db_format, abspath_or_relpath\n):\n    # check: manifest and sigs in subdir.  note, fails with default v4\n    # behavior. see #3008.\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    ext = \"sqlmf\" if manifest_db_format == \"sql\" else \"csv\"\n\n    os.mkdir(runtmp.output(\"sigs_dir\"))\n    protzip_path = \"sigs_dir/protein.zip\"\n    shutil.copyfile(protzip, runtmp.output(protzip_path))\n\n    os.mkdir(runtmp.output(\"mf_dir\"))\n    mf_path = f\"mf_dir/mf.{ext}\"\n\n    runtmp.sourmash(\n        \"sig\",\n        \"collect\",\n        protzip_path,\n        \"-o\",\n        mf_path,\n        \"-F\",\n        manifest_db_format,\n        abspath_or_relpath,\n    )\n\n    runtmp.sourmash(\"sig\", \"cat\", mf_path)\n"
  },
  {
    "path": "tests/test_cmd_signature_fileinfo.py",
    "content": "\"\"\"\nTests for the 'sourmash signature fileinfo' command line.\n\"\"\"\n\nimport shutil\nimport os\nimport glob\nimport json\n\nimport pytest\n\nimport sourmash_tst_utils as utils\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n## command line tests\n\n\ndef test_fileinfo_1_sig(runtmp):\n    # get basic info on a signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    shutil.copyfile(sig47, runtmp.output(\"sig47.sig\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"sig47.sig\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: sig47.sig\nis database? no\nhas manifest? yes\nnum signatures: 1\ntotal hashes: 5177\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000             5177\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_1_sig_summarize(runtmp):\n    # get basic info on a signature with 'summarize' as alias for fileinfo\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    shutil.copyfile(sig47, runtmp.output(\"sig47.sig\"))\n    runtmp.run_sourmash(\"sig\", \"summarize\", \"sig47.sig\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: sig47.sig\nis database? no\nhas manifest? yes\nnum signatures: 1\ntotal hashes: 5177\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000             5177\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_1_sig_abund(runtmp):\n    # get basic info on a signature with abundance\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n\n    shutil.copyfile(sig47, runtmp.output(\"sig47.sig\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"sig47.sig\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: sig47.sig\nis database? no\nhas manifest? yes\nnum signatures: 1\n5177 total hashes\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000, abund      5177 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_2_lca(runtmp):\n    # get basic info on an LCA database\n    prot = utils.get_test_data(\"prot/protein.lca.json.gz\")\n\n    shutil.copyfile(prot, runtmp.output(\"protein.lca.json.gz\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"protein.lca.json.gz\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: LCA_Database\nlocation: protein.lca.json.gz\nis database? yes\nhas manifest? no\nnum signatures: 2\ntotal hashes: 8214\nsummary of sketches:\n   2 sketches with protein, k=19, scaled=100          8214\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_3_sbt_zip(runtmp):\n    # test on an SBT.zip\n    prot = utils.get_test_data(\"prot/protein.sbt.zip\")\n\n    shutil.copyfile(prot, runtmp.output(\"protein.sbt.zip\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"protein.sbt.zip\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: SBT\nlocation: protein.sbt.zip\nis database? yes\nhas manifest? yes\nnum signatures: 2\ntotal hashes: 8214\nsummary of sketches:\n   2 sketches with protein, k=19, scaled=100          8214 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out, line.strip()\n\n\ndef test_fileinfo_4_zip(runtmp):\n    # test on a ZipFileLinearIndex\n    prot = utils.get_test_data(\"prot/all.zip\")\n\n    shutil.copyfile(prot, runtmp.output(\"all.zip\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"all.zip\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    # 'location' will be fully resolved, ignore it for now\n    expected_output = \"\"\"\\\npath filetype: ZipFileLinearIndex\nis database? yes\nhas manifest? yes\nnum signatures: 8\ntotal hashes: 31758\nsummary of sketches:\n   2 sketches with dayhoff, k=19, scaled=100          7945 total hashes\n   2 sketches with hp, k=19, scaled=100               5184 total hashes\n   2 sketches with protein, k=19, scaled=100          8214 total hashes\n   2 sketches with DNA, k=31, scaled=1000             10415 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_4_zip_json_out(runtmp):\n    # check --json-out\n    prot = utils.get_test_data(\"prot/all.zip\")\n\n    shutil.copyfile(prot, runtmp.output(\"all.zip\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"all.zip\", \"--json-out\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    # should succeed as loading as JSON, with correct info\n    vals = json.loads(out)\n\n    assert vals[\"has_manifest\"]\n    assert vals[\"is_database\"]\n    assert vals[\"num_sketches\"] == 8\n    assert vals[\"path_filetype\"] == \"ZipFileLinearIndex\"\n    assert vals[\"total_hashes\"] == 31758\n\n    d1 = {\n        \"ksize\": 19,\n        \"moltype\": \"dayhoff\",\n        \"scaled\": 100,\n        \"num\": 0,\n        \"abund\": False,\n        \"count\": 2,\n        \"n_hashes\": 7945,\n    }\n    d2 = {\n        \"ksize\": 19,\n        \"moltype\": \"hp\",\n        \"scaled\": 100,\n        \"num\": 0,\n        \"abund\": False,\n        \"count\": 2,\n        \"n_hashes\": 5184,\n    }\n    d3 = {\n        \"ksize\": 19,\n        \"moltype\": \"protein\",\n        \"scaled\": 100,\n        \"num\": 0,\n        \"abund\": False,\n        \"count\": 2,\n        \"n_hashes\": 8214,\n    }\n    d4 = {\n        \"ksize\": 31,\n        \"moltype\": \"DNA\",\n        \"scaled\": 1000,\n        \"num\": 0,\n        \"abund\": False,\n        \"count\": 2,\n        \"n_hashes\": 10415,\n    }\n\n    assert d1 in vals[\"sketch_info\"]\n    assert d2 in vals[\"sketch_info\"]\n    assert d3 in vals[\"sketch_info\"]\n    assert d4 in vals[\"sketch_info\"]\n    assert len(vals[\"sketch_info\"]) == 4\n\n\ndef test_fileinfo_4_zip_rebuild(runtmp):\n    # test --rebuild\n    prot = utils.get_test_data(\"prot/all.zip\")\n\n    shutil.copyfile(prot, runtmp.output(\"all.zip\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"all.zip\", \"--rebuild\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    # 'location' will be fully resolved, ignore it for now\n    # CTB: note we're missing one of the 8 in the rebuilt, dna-sig.noext,\n    # because it is not automatically included unless you load the zipfile\n    # with traverse. This is intentional.\n    expected_output = \"\"\"\\\npath filetype: ZipFileLinearIndex\nis database? yes\nhas manifest? yes\nnum signatures: 8\ntotal hashes: 26581\nsummary of sketches:\n   2 sketches with dayhoff, k=19, scaled=100          7945 total hashes\n   2 sketches with hp, k=19, scaled=100               5184 total hashes\n   2 sketches with protein, k=19, scaled=100          8214 total hashes\n   1 sketches with DNA, k=31, scaled=1000             5238 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_5_dir(runtmp):\n    # test on a directory\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    os.mkdir(runtmp.output(\"subdir\"))\n\n    shutil.copyfile(sig47, runtmp.output(\"subdir/sig47.sig\"))\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"subdir/\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: subdir/\nis database? no\nhas manifest? yes\nnum signatures: 1\ntotal hashes: 5177\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000             5177 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\ndef test_fileinfo_6_pathlist(runtmp):\n    # test on a pathlist\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    shutil.copyfile(sig47, runtmp.output(\"47.fa.sig\"))\n\n    with open(runtmp.output(\"pathlist.txt\"), \"w\") as fp:\n        fp.write(\"47.fa.sig\\n\")\n\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"pathlist.txt\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: pathlist.txt\nis database? no\nhas manifest? yes\nnum signatures: 1\ntotal hashes: 5177\nsummary of sketches:\n   1 sketches with DNA, k=31, scaled=1000             5177 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out\n\n\n@pytest.mark.parametrize(\n    \"db\",\n    [\n        \"v6.sbt.json\",\n        \"v5.sbt.json\",\n        \"v4.sbt.json\",\n        \"v3.sbt.json\",\n        \"v2.sbt.json\",\n        \"v1.sbt.json\",\n    ],\n)\ndef test_fileinfo_7_sbt_json(runtmp, db):\n    # test on multiple versions of SBT JSON files\n    dbfile = utils.get_test_data(db)\n\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", dbfile)\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n\n    expected_output = f\"\"\"\\\npath filetype: SBT\nlocation: {dbfile}\nis database? yes\nhas manifest? no\nnum signatures: 7\ntotal hashes: 3500\nsummary of sketches:\n   7 sketches with DNA, k=31, num=500                 3500 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out, line.strip()\n\n\ndef test_sig_fileinfo_stdin(runtmp):\n    # test on stdin\n    sig = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    with open(sig) as fp:\n        data = fp.read()\n\n    runtmp.run_sourmash(\"sig\", \"fileinfo\", \"-\", stdin_data=data)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    expected_output = \"\"\"\\\npath filetype: MultiIndex\nlocation: -\nis database? no\nhas manifest? yes\nnum signatures: 1\ntotal hashes: 3409\nsummary of sketches:\n   1 sketches with protein, k=19, scaled=100          3409 total hashes\n\"\"\".splitlines()\n    for line in expected_output:\n        assert line.strip() in out, line.strip()\n\n\ndef test_sig_fileinfo_does_not_exist(runtmp):\n    # test on file that does not exist\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"fileinfo\", \"does-not-exist\")\n\n    assert (\n        \"Cannot open 'does-not-exist' as a sourmash signature collection\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_sig_fileinfo_8_manifest_works(runtmp):\n    # test on a manifest with relative paths, in proper location\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n    runtmp.sourmash(\"sig\", \"fileinfo\", mf)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"15 sketches with DNA, k=31, scaled=10000           717 total hashes\" in out\n    assert \"num signatures: 15\" in out\n    assert \"has manifest? yes\" in out\n    assert \"is database? yes\" in out\n    assert \"path filetype: StandaloneManifestIndex\" in out\n\n\ndef test_sig_fileinfo_8_manifest_works_when_moved(runtmp):\n    # test on a manifest with relative paths, when in wrong place\n    # note: this works, unlike 'describe', because all the necessary info\n    # for 'fileinfo' is in the manifest.\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n    shutil.copyfile(mf, runtmp.output(\"mf.csv\"))\n\n    runtmp.sourmash(\"sig\", \"fileinfo\", \"mf.csv\")\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"15 sketches with DNA, k=31, scaled=10000           717 total hashes\" in out\n    assert \"num signatures: 15\" in out\n    assert \"has manifest? yes\" in out\n    assert \"is database? yes\" in out\n    assert \"path filetype: StandaloneManifestIndex\" in out\n\n\ndef test_sig_fileinfo_9_sqldb_make(runtmp):\n    # make a sqldb and run fileinfo on it\n    gcf_all = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    sqldb = runtmp.output(\"some.sqldb\")\n\n    runtmp.sourmash(\"sig\", \"cat\", \"-k\", \"31\", *gcf_all, \"-o\", sqldb)\n\n    runtmp.sourmash(\"sig\", \"fileinfo\", sqldb)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"12 sketches with DNA, k=31, scaled=10000           4540 total hashes\" in out\n\n\ndef test_sig_fileinfo_9_sqldb_exists(runtmp):\n    # run fileinfo on existing sqldb\n    sqldb = utils.get_test_data(\"sqlite/index.sqldb\")\n    runtmp.sourmash(\"sig\", \"fileinfo\", sqldb)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"path filetype: SqliteIndex\" in out\n    assert (\n        \"2 sketches with DNA, k=31, scaled=1000             10415 total hashes\" in out\n    )\n\n\ndef test_sig_fileinfo_9_sql_manifest(runtmp):\n    # run fileinfo on existing sqldb\n    sqldb = utils.get_test_data(\"sqlite/prot.sqlmf\")\n    runtmp.sourmash(\"sig\", \"fileinfo\", sqldb)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"path filetype: StandaloneManifestIndex\" in out\n    assert \"num signatures: 7\" in out\n    assert \"1 sketches with DNA, k=31, scaled=1000             5238 total hashes\" in out\n    assert \"2 sketches with hp, k=19, scaled=100               5184 total hashes\" in out\n    assert \"2 sketches with dayhoff, k=19, scaled=100          7945 total hashes\" in out\n    assert \"2 sketches with protein, k=19, scaled=100          8214 total hashes\" in out\n\n\ndef test_sig_fileinfo_9_sql_lca_db(runtmp):\n    # run fileinfo on existing sqldb\n    sqldb = utils.get_test_data(\"sqlite/lca.sqldb\")\n    runtmp.sourmash(\"sig\", \"fileinfo\", sqldb)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"path filetype: LCA_SqliteDatabase\" in out\n    assert \"2 sketches with DNA, k=31, scaled=10000            1431 total hashes\" in out\n"
  },
  {
    "path": "tests/test_cmd_signature_grep.py",
    "content": "\"\"\"\nTests for the 'sourmash signature grep' command line.\n\"\"\"\n\nimport shutil\nimport os\nimport csv\nimport gzip\n\nimport pytest\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash.signature import load_signatures_from_json, save_signatures_to_json\n\n## command line tests\n\n\ndef test_grep_1_sig_name(runtmp):\n    # search on substring in name\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"Shewanella\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella\" in ss.name\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_1_sig_name_case_sensitive(runtmp):\n    # search on substring in name\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"grep\", \"shewanella\", sig47)\n\n\ndef test_grep_1_sig_name_case_insensitive(runtmp):\n    # search on substring in name, case insensitive\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"-i\", \"shewanella\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella\" in ss.name\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_1_sig_name_exclude(runtmp):\n    # search on substring in name, case insensitive\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    # no matches!\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"grep\", \"-v\", \"Shewanella\", sig47)\n\n\ndef test_grep_2_sig_md5(runtmp):\n    # search on substring in md5\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"ce52952152f0\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_2_sig_md5_case_sensitive(runtmp):\n    # case sensitive no match\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"grep\", \"CE52952152f0\", sig47)\n\n\ndef test_grep_2_sig_md5_case_insensitive(runtmp):\n    # search on substring in md5, case insensitive\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"-i\", \"CE52952152f0\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_3_filename(runtmp):\n    # filename match\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"47.fa\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"47.fa\" in ss.filename\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_3_filename_regexp(runtmp):\n    # search for a regexp on filename\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"^47.fa\", sig47)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"7.fa\" in ss.filename\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n\n\ndef test_grep_4_no_manifest(runtmp):\n    # fail search when no manifest, by default\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"sig\", \"grep\", \"e60265\", sbt)\n\n    print(runtmp.last_result.err)\n    assert \"ERROR on filename\" in runtmp.last_result.err\n    assert (\n        \"sig grep requires a manifest by default, but no manifest present.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_grep_4_no_manifest_ok(runtmp):\n    # generate manifest if --no-require-manifest\n    sbt = utils.get_test_data(\"v6.sbt.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"e60265\", sbt, \"--no-require-manifest\")\n\n    ss = load_signatures_from_json(runtmp.last_result.out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"e60265\" in ss.md5sum()\n\n\ndef test_grep_5_zip_include(runtmp):\n    # search zip, include on case sensitive match to name\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"--dna\", \"OS223\", allzip)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_5_zip_include_picklist(runtmp):\n    # search zip, include on case sensitive match to name\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    pickfile = runtmp.output(\"pick.csv\")\n    with open(pickfile, \"w\", newline=\"\") as fp:\n        w = csv.DictWriter(fp, fieldnames=[\"md5\"])\n        w.writeheader()\n        w.writerow(dict(md5=\"09a08691ce52952152f0e866a59f6261\"))\n        w.writerow(dict(md5=\"38729c6374925585db28916b82a6f513\"))\n\n    runtmp.run_sourmash(\n        \"sig\", \"grep\", \"--dna\", \"OS223\", allzip, \"--picklist\", f\"{pickfile}:md5:md5\"\n    )\n\n    out = runtmp.last_result.out\n    print(out)\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 2 matches to 2 distinct values\" in err\n\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_5_zip_include_case_insensitive(runtmp):\n    # search zip, include on case insensitive match to name\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"--dna\", \"-i\", \"os223\", allzip)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_5_zip_exclude(runtmp):\n    # search zip, exclude on case-sensitive match\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"--dna\", \"-v\", \"OS185\", allzip)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_5_zip_exclude_case_insensitive(runtmp):\n    # search zip, exclude on case-insensitive match\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"--dna\", \"-vi\", \"os185\", allzip)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_6_zip_manifest_csv(runtmp):\n    # do --csv and use result as picklist\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"--dna\", \"OS223\", allzip, \"--csv\", \"match.csv\")\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n    # now run cat with picklist\n    runtmp.run_sourmash(\"sig\", \"cat\", allzip, \"--picklist\", \"match.csv::manifest\")\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_grep_6_zip_manifest_csv_gz(runtmp):\n    # do --csv and use result as picklist\n    allzip = utils.get_test_data(\"prot/all.zip\")\n\n    runtmp.run_sourmash(\n        \"sig\", \"grep\", \"--dna\", \"OS223\", allzip, \"--csv\", \"match.csv.gz\"\n    )\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n    # check that match.csv.gz is a gzip file\n    with gzip.open(runtmp.output(\"match.csv.gz\"), \"rt\", newline=\"\") as fp:\n        fp.read()\n\n    # now run cat with picklist\n    runtmp.run_sourmash(\"sig\", \"cat\", allzip, \"--picklist\", \"match.csv.gz::manifest\")\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella baltica OS223\" in ss.name\n    assert ss.md5sum() == \"38729c6374925585db28916b82a6f513\"\n\n\ndef test_sig_grep_7_lca(runtmp):\n    # extract 47 from an LCA database, with --no-require-manifest\n    allzip = utils.get_test_data(\"lca/47+63.lca.json\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    runtmp.sourmash(\n        \"sig\",\n        \"grep\",\n        \"50a9274021e4\",\n        allzip,\n        \"--no-require-manifest\",\n        \"-o\",\n        \"matches.sig\",\n    )\n\n    match = sourmash.load_file_as_signatures(runtmp.output(\"matches.sig\"))\n    match = list(match)[0]\n\n    ss47 = sourmash.load_file_as_signatures(sig47)\n    ss47 = list(ss47)[0]\n\n    ss47 = ss47.to_mutable()\n    ss47.minhash = ss47.minhash.downsample(scaled=10000)\n\n    assert ss47.minhash == match.minhash\n\n\ndef test_sig_grep_7_picklist_md5_lca_fail(runtmp):\n    # extract 47 from an LCA database, using a picklist w/full md5 => fail\n    allzip = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    # select on any of these attributes\n    row = dict(\n        exactName=\"NC_009665.1 Shewanella baltica OS185, complete genome\",\n        md5full=\"50a9274021e43eda8b2e77f8fa60ae8e\",\n        md5short=\"50a9274021e43eda8b2e77f8fa60ae8e\"[:8],\n        fullIdent=\"NC_009665.1\",\n        nodotIdent=\"NC_009665\",\n    )\n\n    # make picklist\n    picklist_csv = runtmp.output(\"pick.csv\")\n    with open(picklist_csv, \"w\", newline=\"\") as csvfp:\n        w = csv.DictWriter(csvfp, fieldnames=row.keys())\n        w.writeheader()\n        w.writerow(row)\n\n    picklist_arg = f\"{picklist_csv}:md5full:md5\"\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sig\",\n            \"grep\",\n            \"50a92740\",\n            allzip,\n            \"--picklist\",\n            picklist_arg,\n            \"--no-require-manifest\",\n        )\n\n    # this happens b/c the implementation of 'grep' uses picklists, and\n    # LCA databases don't support multiple picklists.\n    print(runtmp.last_result.err)\n    assert (\n        \"This input collection doesn't support 'grep' with picklists.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_sig_grep_8_count(runtmp):\n    zips = [\n        \"prot/all.zip\",\n        \"prot/dayhoff.sbt.zip\",\n        \"prot/dayhoff.zip\",\n        \"prot/hp.sbt.zip\",\n        \"prot/hp.zip\",\n        \"prot/protein.sbt.zip\",\n        \"prot/protein.zip\",\n    ]\n\n    zip_src = [utils.get_test_data(x) for x in zips]\n\n    os.mkdir(runtmp.output(\"prot\"))\n    for src, dest in zip(zip_src, zips):\n        shutil.copyfile(src, runtmp.output(dest))\n\n    runtmp.sourmash(\"sig\", \"grep\", \"-c\", \"0015939\", *zips)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert \"(no signatures will be saved because of \" in err\n\n    for line in \"\"\"\\\n6 matches: prot/all.zip\n2 matches: prot/dayhoff.sbt.zip\n2 matches: prot/dayhoff.zip\n2 matches: prot/hp.sbt.zip\n2 matches: prot/hp.zip\n2 matches: prot/protein.sbt.zip\n2 matches: prot/protein.zip\n\"\"\".splitlines():\n        assert line.strip() in out\n\n\ndef test_sig_grep_9_name(runtmp):\n    zips = [\n        \"prot/all.zip\",\n        \"prot/dayhoff.sbt.zip\",\n        \"prot/dayhoff.zip\",\n        \"prot/hp.sbt.zip\",\n        \"prot/hp.zip\",\n        \"prot/protein.sbt.zip\",\n        \"prot/protein.zip\",\n    ]\n\n    zip_src = [utils.get_test_data(x) for x in zips]\n\n    os.mkdir(runtmp.output(\"prot\"))\n    for src, dest in zip(zip_src, zips):\n        shutil.copyfile(src, runtmp.output(dest))\n\n    runtmp.sourmash(\"sig\", \"grep\", \"-l\", \"0015939\", *zips)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert \"(no signatures will be saved because of \" in err\n\n    for line in \"\"\"\\\nGCA_001593925\nGCA_001593935\n\"\"\".splitlines():\n        assert line.strip() in out\n\n    assert len(out.splitlines()) == 2, (out,)\n\n\ndef test_sig_grep_identical_md5s(runtmp):\n    # test that we properly handle different signatures with identical md5s\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_signatures_from_json(sig47)\n    sig = list(ss)[0]\n    new_sig = sig.to_mutable()\n    new_sig.name = \"foo\"\n    sig47foo = runtmp.output(\"foo.sig\")\n    # this was only a problem when the signatures are stored in the same file\n    with open(sig47foo, \"w\") as fp:\n        save_signatures_to_json([new_sig, sig], fp)\n\n    runtmp.run_sourmash(\"sig\", \"grep\", \"-i\", \"foo\", sig47foo)\n\n    out = runtmp.last_result.out\n    ss = load_signatures_from_json(out)\n    ss = list(ss)\n    assert len(ss) == 1\n    ss = ss[0]\n    assert \"Shewanella\" not in ss.name\n    assert \"foo\" in ss.name\n    assert ss.md5sum() == \"09a08691ce52952152f0e866a59f6261\"\n"
  },
  {
    "path": "tests/test_compare.py",
    "content": "import glob\nimport os\n\nimport numpy as np\nimport pytest\n\nimport sourmash\nfrom sourmash.compare import (\n    compare_all_pairs,\n    compare_parallel,\n    compare_serial,\n    compare_serial_containment,\n    compare_serial_max_containment,\n    compare_serial_avg_containment,\n)\nimport sourmash_tst_utils as utils\n\n\n@pytest.fixture()\ndef siglist():\n    demo_path = utils.get_test_data(\"demo\")\n    filenames = sorted(glob.glob(os.path.join(demo_path, \"*.sig\")))\n    sigs = []\n    for filename in filenames:\n        sigs.extend(sourmash.load_file_as_signatures(filename))\n    return sigs\n\n\n@pytest.fixture()\ndef scaled_siglist():\n    demo_path = utils.get_test_data(\"scaled\")\n    filenames = sorted(glob.glob(os.path.join(demo_path, \"*.sig\")))\n    sigfiles = [\"2.fa.sig\", \"2+63.fa.sig\", \"47.fa.sig\", \"63.fa.sig\"]\n    filenames = [utils.get_test_data(c) for c in sigfiles]\n    sigs = []\n    for filename in filenames:\n        these_sigs = sourmash.load_file_as_signatures(filename, ksize=31)\n        scaled_sigs = [s for s in these_sigs if s.minhash.scaled != 0]\n        sigs.extend(scaled_sigs)\n    return sigs\n\n\n@pytest.fixture()\ndef ignore_abundance(track_abundance):\n    return not track_abundance\n\n\ndef test_compare_serial(siglist, ignore_abundance):\n    similarities = compare_serial(siglist, ignore_abundance, downsample=False)\n\n    true_similarities = np.array(\n        [\n            [1.0, 0.356, 0.078, 0.086, 0.0, 0.0, 0.0],\n            [0.356, 1.0, 0.072, 0.078, 0.0, 0.0, 0.0],\n            [0.078, 0.072, 1.0, 0.074, 0.0, 0.0, 0.0],\n            [0.086, 0.078, 0.074, 1.0, 0.0, 0.0, 0.0],\n            [0.0, 0.0, 0.0, 0.0, 1.0, 0.382, 0.364],\n            [0.0, 0.0, 0.0, 0.0, 0.382, 1.0, 0.386],\n            [0.0, 0.0, 0.0, 0.0, 0.364, 0.386, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_equal(similarities, true_similarities)\n\n\ndef test_compare_parallel(siglist, ignore_abundance):\n    similarities = compare_parallel(\n        siglist, ignore_abundance, downsample=False, n_jobs=2\n    )\n\n    true_similarities = np.array(\n        [\n            [1.0, 0.356, 0.078, 0.086, 0.0, 0.0, 0.0],\n            [0.356, 1.0, 0.072, 0.078, 0.0, 0.0, 0.0],\n            [0.078, 0.072, 1.0, 0.074, 0.0, 0.0, 0.0],\n            [0.086, 0.078, 0.074, 1.0, 0.0, 0.0, 0.0],\n            [0.0, 0.0, 0.0, 0.0, 1.0, 0.382, 0.364],\n            [0.0, 0.0, 0.0, 0.0, 0.382, 1.0, 0.386],\n            [0.0, 0.0, 0.0, 0.0, 0.364, 0.386, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_equal(similarities, true_similarities)\n\n\ndef test_compare_all_pairs(siglist, ignore_abundance):\n    similarities_parallel = compare_all_pairs(\n        siglist, ignore_abundance, downsample=False, n_jobs=2\n    )\n    similarities_serial = compare_serial(siglist, ignore_abundance, downsample=False)\n    np.testing.assert_array_equal(similarities_parallel, similarities_serial)\n\n\ndef test_compare_serial_jaccardANI(scaled_siglist, ignore_abundance):\n    jANI = compare_serial(\n        scaled_siglist, ignore_abundance, downsample=False, return_ani=True\n    )\n    print(jANI)\n\n    true_jaccard_ANI = np.array(\n        [\n            [1.0, 0.978, 0.0, 0.0],\n            [0.978, 1.0, 0.96973012, 0.99262776],\n            [0.0, 0.96973012, 1.0, 0.97697011],\n            [0.0, 0.99262776, 0.97697011, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_almost_equal(jANI, true_jaccard_ANI, decimal=3)\n\n\ndef test_compare_parallel_jaccardANI(scaled_siglist, ignore_abundance):\n    jANI = compare_parallel(\n        scaled_siglist, ignore_abundance, downsample=False, n_jobs=2, return_ani=True\n    )\n\n    true_jaccard_ANI = np.array(\n        [\n            [1.0, 0.978, 0.0, 0.0],\n            [0.978, 1.0, 0.96973012, 0.99262776],\n            [0.0, 0.96973012, 1.0, 0.97697011],\n            [0.0, 0.99262776, 0.97697011, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_almost_equal(jANI, true_jaccard_ANI, decimal=3)\n\n\ndef test_compare_all_pairs_jaccardANI(scaled_siglist, ignore_abundance):\n    similarities_parallel = compare_all_pairs(\n        scaled_siglist, ignore_abundance, downsample=False, n_jobs=2, return_ani=True\n    )\n    similarities_serial = compare_serial(\n        scaled_siglist, ignore_abundance, downsample=False, return_ani=True\n    )\n    np.testing.assert_array_equal(similarities_parallel, similarities_serial)\n\n\ndef test_compare_serial_containmentANI(scaled_siglist):\n    containment_ANI = compare_serial_containment(scaled_siglist, return_ani=True)\n    print(containment_ANI)\n\n    true_containment_ANI = np.array(\n        [\n            [1, 0.966, 0.0, 0.0],\n            [1, 1.0, 0.97715525, 1.0],\n            [0.0, 0.96377054, 1.0, 0.97678608],\n            [0.0, 0.98667513, 0.97715525, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_almost_equal(\n        containment_ANI, true_containment_ANI, decimal=3\n    )\n\n\ndef test_compare_serial_maxcontainmentANI(scaled_siglist):\n    # check max_containment ANI\n    max_containment_ANI = compare_serial_max_containment(\n        scaled_siglist, return_ani=True\n    )\n    print(max_containment_ANI)\n\n    true_max_containment_ANI = np.array(\n        [\n            [1.0, 1.0, 0.0, 0.0],\n            [1.0, 1.0, 0.97715525, 1.0],\n            [0.0, 0.97715525, 1.0, 0.97715525],\n            [0.0, 1.0, 0.97715525, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_almost_equal(\n        max_containment_ANI, true_max_containment_ANI, decimal=3\n    )\n\n\ndef test_compare_serial_avg_containmentANI(scaled_siglist):\n    # check avg_containment ANI\n    avg_containment_ANI = compare_serial_avg_containment(\n        scaled_siglist, return_ani=True\n    )\n    print(avg_containment_ANI)\n\n    true_avg_containment_ANI = np.array(\n        [\n            [1.0, 0.983, 0.0, 0.0],\n            [0.983, 1.0, 0.97046289, 0.99333757],\n            [0.0, 0.97046289, 1.0, 0.97697067],\n            [0.0, 0.99333757, 0.97697067, 1.0],\n        ]\n    )\n\n    np.testing.assert_array_almost_equal(\n        avg_containment_ANI, true_avg_containment_ANI, decimal=3\n    )\n"
  },
  {
    "path": "tests/test_deprecated.py",
    "content": "from sourmash import signature\nimport sourmash_tst_utils as utils\n\n\ndef test_load_textmode(track_abundance):\n    # ijson required a file in binary mode or bytes,\n    # but we had an API example in the docs using 'rt'.\n    # I fixed the docs, but I'm keeping this test here\n    # to make sure we still support it =/\n    sigfile = utils.get_test_data(\"genome-s10+s11.sig\")\n    with open(sigfile) as sigfp:\n        siglist = list(signature.load_signatures_from_json(sigfp))\n    loaded_sig = siglist[0]\n    assert loaded_sig.name == \"genome-s10+s11\"\n"
  },
  {
    "path": "tests/test_distance_utils.py",
    "content": "\"\"\"\nTests for distance utils.\n\"\"\"\n\nimport pytest\nimport numpy as np\nfrom sourmash.distance_utils import (\n    containment_to_distance,\n    get_exp_probability_nothing_common,\n    handle_seqlen_nkmers,\n    jaccard_to_distance,\n    ANIResult,\n    ciANIResult,\n    jaccardANIResult,\n    var_n_mutated,\n    set_size_chernoff,\n    set_size_exact_prob,\n)\n\n\ndef test_aniresult():\n    res = ANIResult(0.4, 0.1)\n    assert res.dist == 0.4\n    assert res.ani == 0.6\n    assert res.p_nothing_in_common == 0.1\n    assert res.p_exceeds_threshold == True\n    # check that they're equivalent\n    res2 = ANIResult(0.4, 0.1)\n    assert res == res2\n    res3 = ANIResult(0.5, 0)\n    assert res != res3\n    assert res3.p_exceeds_threshold == False\n\n\ndef test_aniresult_bad_distance():\n    \"\"\"\n    Fail if distance is not between 0 and 1.\n    \"\"\"\n    with pytest.raises(Exception) as exc:\n        ANIResult(1.1, 0.1)\n    print(\"\\n\", str(exc.value))\n    assert \"distance value 1.1000 is not between 0 and 1!\" in str(exc.value)\n    with pytest.raises(Exception) as exc:\n        ANIResult(-0.1, 0.1)\n    print(\"\\n\", str(exc.value))\n    assert \"distance value -0.1000 is not between 0 and 1!\" in str(exc.value)\n\n\ndef test_jaccard_aniresult():\n    res = jaccardANIResult(0.4, 0.1, jaccard_error=0.03)\n    assert res.dist == 0.4\n    assert res.ani is None\n    assert res.p_nothing_in_common == 0.1\n    assert res.jaccard_error == 0.03\n    assert res.p_exceeds_threshold == True\n    assert res.je_exceeds_threshold == True\n    res3 = jaccardANIResult(0.4, 0.1, jaccard_error=0.03, je_threshold=0.1)\n    assert res3.je_exceeds_threshold == False\n    assert res3.ani == 0.6\n\n\ndef test_jaccard_aniresult_nojaccarderror():\n    # jaccard error is None\n    with pytest.raises(Exception) as exc:\n        jaccardANIResult(0.4, 0.1, None)\n    print(\"\\n\", str(exc.value))\n    assert \"Error: jaccard_error cannot be None.\" in str(exc.value)\n\n\ndef test_ci_aniresult():\n    res = ciANIResult(0.4, 0.1, dist_low=0.3, dist_high=0.5)\n    print(res)\n    assert res.dist == 0.4\n    assert res.ani == 0.6\n    assert res.p_nothing_in_common == 0.1\n    assert res.ani_low == 0.5\n    assert res.ani_high == 0.7\n    res2 = ciANIResult(0.4, 0.1, dist_low=0.3, dist_high=0.5)\n    assert res == res2\n    res3 = ciANIResult(0.4, 0.2, dist_low=0.3, dist_high=0.5)\n    assert res != res3\n\n\ndef test_containment_to_distance_zero():\n    contain = 0\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    exp_dist, exp_low, exp_high, pnc = 1.0, 1.0, 1.0, 1.0\n    exp_id, exp_idlow, exp_idhigh, pnc = 0.0, 0.0, 0.0, 1.0\n    assert res.dist == exp_dist\n    assert res.dist_low == exp_low\n    assert res.dist_high == exp_high\n    assert res.p_nothing_in_common == pnc\n    assert res.ani == exp_id\n    assert res.ani_low == exp_idlow\n    assert res.ani_high == exp_idhigh\n    # check without returning ci\n    res2 = containment_to_distance(contain, ksize, scaled, n_unique_kmers=nkmers)\n    print(res2)\n    exp_res = ciANIResult(\n        dist=1.0,\n        dist_low=1.0,\n        dist_high=1.0,\n        p_nothing_in_common=1.0,\n        p_threshold=0.001,\n    )\n    assert res2 == exp_res\n\n\ndef test_containment_to_distance_one():\n    contain = 1\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    exp_dist, exp_low, exp_high, pnc = 0.0, 0.0, 0.0, 0.0\n    exp_id, exp_idlow, exp_idhigh, pnc = 1.0, 1.0, 1.0, 0.0\n    assert res.dist == exp_dist\n    assert res.dist_low == exp_low\n    assert res.dist_high == exp_high\n    assert res.p_nothing_in_common == pnc\n    assert res.ani == exp_id\n    assert res.ani_low == exp_idlow\n    assert res.ani_high == exp_idhigh\n\n    # check without returning ci\n    res = containment_to_distance(contain, ksize, scaled, n_unique_kmers=nkmers)\n    assert res.dist == exp_dist\n    assert res.ani == exp_id\n    assert res.p_nothing_in_common == pnc\n    assert res.ani_low == 1.0\n    assert res.ani_high == 1.0\n\n\ndef test_containment_to_distance_scaled1():\n    contain = 0.5\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.032468221476108394\n    assert res.ani == 0.9675317785238916\n    assert res.dist_low == 0.028709912966405623\n    assert res.ani_high == 0.9712900870335944\n    assert res.dist_high == 0.03647860197289783\n    assert res.ani_low == 0.9635213980271021\n    assert res.p_nothing_in_common == 0.0\n    # without returning ci\n    res2 = containment_to_distance(contain, ksize, scaled, n_unique_kmers=nkmers)\n    assert (res2.dist, res2.ani, res2.p_nothing_in_common) == (\n        0.032468221476108394,\n        0.9675317785238916,\n        0.0,\n    )\n    assert (res2.dist, res2.ani, res2.p_nothing_in_common) == (\n        res.dist,\n        res.ani,\n        res.p_nothing_in_common,\n    )\n\n\ndef test_containment_to_distance_scaled100():\n    contain = 0.1\n    scaled = 100\n    nkmers = 10000\n    ksize = 31\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.07158545548052564\n    assert res.dist_low == 0.05320779238601372\n    assert res.dist_high == 0.09055547672455365\n    assert res.p_nothing_in_common == 4.3171247410658655e-05\n    assert res.p_exceeds_threshold == False\n\n\ndef test_containment_to_distance_scaled100_2():\n    contain = 0.5\n    scaled = 100\n    nkmers = 10000\n    ksize = 21\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.032468221476108394\n    assert res.dist_low == 0.023712063916639017\n    assert res.dist_high == 0.04309960543965866\n    assert res.p_exceeds_threshold == False\n\n\ndef test_containment_to_distance_k10():\n    contain = 0.5\n    scaled = 100\n    nkmers = 10000\n    ksize = 10\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.06696700846319259\n    assert res.dist_low == 0.04982777541057476\n    assert res.dist_high == 0.08745108232411622\n    assert res.p_exceeds_threshold == False\n\n\ndef test_containment_to_distance_confidence():\n    contain = 0.1\n    scaled = 100\n    nkmers = 10000\n    ksize = 31\n    confidence = 0.99\n    res = containment_to_distance(\n        contain,\n        ksize,\n        scaled,\n        confidence=confidence,\n        n_unique_kmers=nkmers,\n        estimate_ci=True,\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.07158545548052564\n    assert res.dist_low == 0.04802880300938562\n    assert res.dist_high == 0.09619930040790341\n    assert res.p_exceeds_threshold == False\n    confidence = 0.90\n    res2 = containment_to_distance(\n        contain,\n        ksize,\n        scaled,\n        n_unique_kmers=nkmers,\n        confidence=confidence,\n        estimate_ci=True,\n    )\n    print(res2)\n    # check results\n    assert res2.dist == res.dist\n    assert round(res2.dist_low, 10) == round(0.05599435479247415, 10)\n    assert res2.dist_high == 0.08758718871990222\n    assert res.p_exceeds_threshold == False\n\n\ndef test_nkmers_to_bp_containment():\n    containment = 0.1\n    scaled = 100\n    bp_len = 10030\n    ksize = 31\n    nkmers = handle_seqlen_nkmers(ksize, sequence_len_bp=bp_len)\n    print(\"nkmers_from_bp:\", nkmers)\n    confidence = 0.99\n    kmer_res = containment_to_distance(\n        containment,\n        ksize,\n        scaled,\n        confidence=confidence,\n        n_unique_kmers=nkmers,\n        estimate_ci=True,\n    )\n    bp_res = containment_to_distance(\n        containment,\n        ksize,\n        scaled,\n        confidence=confidence,\n        sequence_len_bp=bp_len,\n        estimate_ci=True,\n    )\n    print(f\"\\nkDIST: {kmer_res}\")\n    print(f\"\\nbpDIST:,{bp_res}\")\n    # check results\n    assert kmer_res == bp_res\n    assert kmer_res.dist == 0.07158545548052564\n    assert kmer_res.dist_low == 0.04802880300938562\n    assert kmer_res.dist_high == 0.09619930040790341\n\n\ndef test_jaccard_to_distance_zero():\n    jaccard = 0\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res)\n    # check results\n    assert res.dist == 1.0\n    assert res.ani == 0.0\n    assert res.p_nothing_in_common == 1.0\n    assert res.jaccard_error == 0.0\n\n\ndef test_jaccard_to_distance_one():\n    jaccard = 1\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res)\n    # check results\n    assert res.dist == 0.0\n    assert res.ani == 1.0\n    assert res.p_nothing_in_common == 0.0\n    assert res.jaccard_error == 0.0\n\n\ndef test_jaccard_to_distance_scaled():\n    # scaled value doesn't impact point estimate or jaccard error, just p_nothing_in_common\n    jaccard = 0.5\n    scaled = 1\n    nkmers = 10000\n    ksize = 21\n    res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res)\n    # check results\n    assert round(res.dist, 3) == round(0.019122659390482077, 3)\n    assert res.ani is None\n    assert res.p_exceeds_threshold == False\n    assert res.jaccard_error == 0.00018351337045518042\n    assert res.je_exceeds_threshold == True\n    scaled = 100\n    res2 = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res2)\n    assert res2.dist == res.dist\n    assert res2.jaccard_error == res.jaccard_error\n    assert res2.p_nothing_in_common != res.p_nothing_in_common\n    assert res2.p_exceeds_threshold == False\n\n\ndef test_jaccard_to_distance_k31():\n    jaccard = 0.5\n    scaled = 100\n    nkmers = 10000\n    ksize = 31\n    res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res)\n    # check results\n    assert res.je_exceeds_threshold == True\n    assert res.ani is None\n    assert res.p_exceeds_threshold == False\n    res2 = jaccard_to_distance(\n        jaccard, ksize, scaled, n_unique_kmers=nkmers, err_threshold=0.1\n    )\n    assert res2.je_exceeds_threshold == False\n    assert res2.ani == 0.9870056455892898\n\n\ndef test_jaccard_to_distance_k31_2():\n    jaccard = 0.1\n    scaled = 100\n    nkmers = 10000\n    ksize = 31\n    res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    print(res)\n    # check results\n    assert res.ani == 0.9464928391768298\n    assert res.p_exceeds_threshold == False\n    assert res.je_exceeds_threshold == False\n\n\ndef test_nkmers_to_bp_jaccard():\n    jaccard = 0.1\n    scaled = 100\n    bp_len = 10030\n    ksize = 31\n    nkmers = handle_seqlen_nkmers(ksize, sequence_len_bp=bp_len)\n    print(\"nkmers_from_bp:\", nkmers)\n    kmer_res = jaccard_to_distance(jaccard, ksize, scaled, n_unique_kmers=nkmers)\n    bp_res = jaccard_to_distance(jaccard, ksize, scaled, sequence_len_bp=bp_len)\n    print(f\"\\nkmer_res: {kmer_res}\")\n    print(f\"\\nbp_res: {bp_res}\")\n    # check results\n    assert kmer_res == bp_res\n    assert kmer_res.dist == 0.0535071608231702\n    assert kmer_res.p_exceeds_threshold == False\n    assert kmer_res.je_exceeds_threshold == False\n\n\ndef test_exp_prob_nothing_common():\n    dist = 0.25\n    ksize = 31\n    scaled = 10\n    bp_len = 1000030\n    nkmers = handle_seqlen_nkmers(ksize, sequence_len_bp=bp_len)\n    print(\"nkmers_from_bp:\", nkmers)\n\n    nkmers_pnc = get_exp_probability_nothing_common(\n        dist, ksize, scaled, n_unique_kmers=nkmers\n    )\n    print(f\"prob nothing in common: {nkmers_pnc}\")\n    bp_pnc = get_exp_probability_nothing_common(\n        dist, ksize, scaled, sequence_len_bp=bp_len\n    )\n    assert nkmers_pnc == bp_pnc == 7.437016945722123e-07\n\n\ndef test_containment_to_distance_tinytestdata_var0():\n    \"\"\"\n    tiny test data to trigger the following:\n    WARNING: Cannot estimate ANI confidence intervals from containment. Do your sketches contain enough hashes?\n    Error: varN <0.0!\n    \"\"\"\n    contain = 0.9\n    scaled = 1\n    nkmers = 4\n    ksize = 31\n    res = containment_to_distance(\n        contain, ksize, scaled, n_unique_kmers=nkmers, estimate_ci=True\n    )\n    print(res)\n    # check results\n    assert res.dist == 0.003392957179023992\n    assert res.dist_low is None\n    assert res.dist_high is None\n    assert res.ani_low is None\n    assert res.ani_high is None\n    assert res.p_exceeds_threshold == False\n\n\ndef test_var_n_mutated():\n    # check 0\n    r = 0\n    ksize = 31\n    nkmers = 200\n    var_n_mut = var_n_mutated(nkmers, ksize, r)\n    print(f\"var_n_mutated: {var_n_mut}\")\n    assert var_n_mut == 0\n    # check var 0.0 valuerror\n    r = 10\n    ksize = 31\n    nkmers = 200\n    with pytest.raises(ValueError) as exc:\n        var_n_mut = var_n_mutated(nkmers, ksize, r)\n    assert \"Error: varN <0.0!\" in str(exc)\n    # check successful\n    r = 0.4\n    ksize = 31\n    nkmers = 200000\n    var_n_mut = var_n_mutated(nkmers, ksize, r)\n    print(f\"var_n_mutated: {var_n_mut}\")\n    assert var_n_mut == 0.10611425440741508\n\n\ndef test_handle_seqlen_nkmers():\n    bp_len = 10030\n    ksize = 31\n    # convert seqlen to nkmers\n    nkmers = handle_seqlen_nkmers(ksize, sequence_len_bp=bp_len)\n    assert nkmers == 10000\n    # if nkmers is provided, just use that\n    nkmers = handle_seqlen_nkmers(ksize, sequence_len_bp=bp_len, n_unique_kmers=bp_len)\n    assert nkmers == 10030\n    # if neither seqlen or nkmers provided, complain\n    with pytest.raises(ValueError) as exc:\n        nkmers = handle_seqlen_nkmers(ksize)\n    assert (\n        \"Error: distance estimation requires input of either 'sequence_len_bp' or 'n_unique_kmers'\"\n    ) in str(exc)\n\n\ndef test_set_size_chernoff():\n    eps = 10 ** (-6)\n    rel_error = 0.01\n    set_size = 1000000\n    s = 1 / 0.1  # I'm used to using a scale value between 0 and 1\n    value_from_mathematica = 0.928652\n    assert (\n        np.abs(\n            set_size_chernoff(set_size, s, relative_error=rel_error)\n            - value_from_mathematica\n        )\n        < eps\n    )\n\n    rel_error = 0.05\n    set_size = 10000\n    s = 1\n    value_from_mathematica = 0.999519\n    assert (\n        np.abs(\n            set_size_chernoff(set_size, s, relative_error=rel_error)\n            - value_from_mathematica\n        )\n        < eps\n    )\n\n    rel_error = 0.001\n    set_size = 10\n    s = 1 / 0.01\n    value_from_mathematica = -1\n    assert (\n        np.abs(\n            set_size_chernoff(set_size, s, relative_error=rel_error)\n            - value_from_mathematica\n        )\n        < eps\n    )\n\n\ndef test_set_size_exact_prob():\n    # values obtained from Mathematica\n    # specifically: Probability[Abs[X*s - n]/n <= delta,\n    #   X \\[Distributed] BinomialDistribution[n, 1/s]] // N\n    set_size = 100\n    scaled = 2\n    relative_error = 0.05\n    prob = set_size_exact_prob(set_size, scaled, relative_error=relative_error)\n    true_prob = 0.382701\n    np.testing.assert_array_almost_equal(true_prob, prob, decimal=3)\n\n    set_size = 200\n    scaled = 5\n    relative_error = 0.15\n    prob = set_size_exact_prob(set_size, scaled, relative_error=relative_error)\n    true_prob = 0.749858\n    np.testing.assert_array_almost_equal(true_prob, prob, decimal=3)\n\n    set_size = 10\n    scaled = 10\n    relative_error = 0.10\n    prob = set_size_exact_prob(set_size, scaled, relative_error=relative_error)\n    true_prob = 0.38742\n    np.testing.assert_array_almost_equal(true_prob, prob, decimal=3)\n\n    set_size = 1000\n    scaled = 10\n    relative_error = 0.10\n    prob = set_size_exact_prob(set_size, scaled, relative_error=relative_error)\n    true_prob = 0.73182\n    np.testing.assert_array_almost_equal(true_prob, prob, decimal=3)\n"
  },
  {
    "path": "tests/test_hll.py",
    "content": "import gzip\nfrom tempfile import NamedTemporaryFile\n\nfrom screed.fasta import fasta_iter\nimport pytest\n\nfrom sourmash.hll import HLL\n\nimport sourmash_tst_utils as utils\n\nK = 21  # size of kmer\nERR_RATE = 0.01\nN_UNIQUE = 3356\nTRANSLATE = {\"A\": \"T\", \"C\": \"G\", \"T\": \"A\", \"G\": \"C\"}\n\n\ndef test_hll_add_python():\n    # test python code to count unique kmers using HyperLogLog.\n    # use the lower level add() method, which accepts anything,\n    # and compare to an exact count using collections.Counter\n\n    filename = utils.get_test_data(\"ecoli.genes.fna\")\n    hll = HLL(ERR_RATE, K)\n    counter = set()\n\n    with open(filename) as f:\n        for n, record in enumerate(fasta_iter(f)):\n            sequence = record[\"sequence\"]\n            seq_len = len(sequence)\n            for n in range(0, seq_len + 1 - K):\n                kmer = sequence[n : n + K]\n                rc = \"\".join(TRANSLATE[c] for c in kmer[::-1])\n\n                hll.add(kmer)\n\n                if rc in counter:\n                    kmer = rc\n                counter.update([kmer])\n\n    n_unique = len(counter)\n\n    assert n_unique == N_UNIQUE\n    assert abs(1 - float(hll.cardinality()) / N_UNIQUE) < ERR_RATE\n\n\ndef test_hll_consume_string():\n    # test rust code to count unique kmers using HyperLogLog,\n    # using screed to feed each read to the counter.\n\n    filename = utils.get_test_data(\"ecoli.genes.fna\")\n    hll = HLL(ERR_RATE, K)\n    n = 0\n    with open(filename) as f:\n        for n, record in enumerate(fasta_iter(f), 1):\n            hll.add_sequence(record[\"sequence\"])\n\n    assert abs(1 - float(len(hll)) / N_UNIQUE) < ERR_RATE\n\n\ndef test_hll_similarity_containment():\n    N_UNIQUE_H1 = 500741\n    N_UNIQUE_H2 = 995845\n\n    SIMILARITY = 0.502783\n    CONTAINMENT_H1 = 1.0\n    CONTAINMENT_H2 = 0.502783\n\n    INTERSECTION = 500838\n\n    hll1 = HLL(ERR_RATE, K)\n    hll2 = HLL(ERR_RATE, K)\n    hllu = HLL(ERR_RATE, K)\n\n    filename = utils.get_test_data(\"genome-s10.fa.gz\")\n    with gzip.GzipFile(filename) as f:\n        for n, record in enumerate(fasta_iter(f)):\n            sequence = record[\"sequence\"]\n            seq_len = len(sequence)\n            for n in range(0, seq_len + 1 - K):\n                kmer = sequence[n : n + K]\n                hll1.add(kmer)\n                hllu.add(kmer)\n\n    filename = utils.get_test_data(\"genome-s10+s11.fa.gz\")\n    with gzip.GzipFile(filename) as f:\n        for n, record in enumerate(fasta_iter(f)):\n            sequence = record[\"sequence\"]\n            seq_len = len(sequence)\n            for n in range(0, seq_len + 1 - K):\n                kmer = sequence[n : n + K]\n                hll2.add(kmer)\n                hllu.add(kmer)\n\n    assert abs(1 - float(hll1.cardinality()) / N_UNIQUE_H1) < ERR_RATE\n    assert abs(1 - float(hll2.cardinality()) / N_UNIQUE_H2) < ERR_RATE\n\n    assert abs(1 - float(hll1.similarity(hll2)) / SIMILARITY) < ERR_RATE\n\n    assert abs(1 - float(hll1.containment(hll2)) / CONTAINMENT_H1) < ERR_RATE\n    assert abs(1 - float(hll2.containment(hll1)) / CONTAINMENT_H2) < ERR_RATE\n\n    assert abs(1 - float(hll1.intersection(hll2)) / INTERSECTION) < ERR_RATE\n\n    \"\"\"\n    hll1.merge(hll2)\n\n    assert abs(1 - float(hllu.similarity(hll1))) < ERR_RATE\n\n    assert abs(1 - float(hllu.containment(hll1))) < ERR_RATE\n    assert abs(1 - float(hllu.containment(hll2))) < ERR_RATE\n\n    assert abs(1 - float(hll1.intersection(hllu)) / N_UNIQUE_U) < ERR_RATE\n    \"\"\"\n\n\ndef test_hll_save_load():\n    filename = utils.get_test_data(\"ecoli.genes.fna\")\n    hll = HLL(ERR_RATE, K)\n    n = 0\n    with open(filename) as f:\n        for n, record in enumerate(fasta_iter(f), 1):\n            hll.add_sequence(record[\"sequence\"])\n\n    assert abs(1 - float(len(hll)) / N_UNIQUE) < ERR_RATE\n\n    with NamedTemporaryFile() as f:\n        hll.save(f.name)\n\n        new_hll = HLL.load(f.name)\n\n    assert len(hll) == len(new_hll)\n"
  },
  {
    "path": "tests/test_index.py",
    "content": "\"\"\"\nTests for Index classes and subclasses.\n\"\"\"\n\nimport pytest\nimport glob\nimport os\nimport zipfile\nimport shutil\n\nimport sourmash\nfrom sourmash import SourmashSignature\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.index import (\n    LinearIndex,\n    ZipFileLinearIndex,\n    make_jaccard_search_query,\n    CounterGather,\n    LazyLinearIndex,\n    MultiIndex,\n    StandaloneManifestIndex,\n)\nfrom sourmash.signature import load_one_signature_from_json, save_signatures_to_json\nfrom sourmash.sbt import SBT, GraphFactory\nfrom sourmash import sourmash_args\nfrom sourmash.search import JaccardSearch, SearchType\nfrom sourmash.picklist import SignaturePicklist, PickStyle\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash.manifest import CollectionManifest\n\nimport sourmash_tst_utils as utils\n\n\ndef test_simple_index(n_children):\n    # test basic SBT functionality\n    factory = GraphFactory(5, 100, 3)\n    root = SBT(factory, d=n_children)\n\n    leaf1_mh = sourmash.MinHash(0, 5, scaled=1)\n    leaf1_mh.add_sequence(\"AAAAA\")\n    leaf1_mh.add_sequence(\"AAAAT\")\n    leaf1_mh.add_sequence(\"AAAAC\")\n    leaf1_sig = SourmashSignature(leaf1_mh)\n    root.insert(leaf1_sig)\n\n    leaf2_mh = sourmash.MinHash(0, 5, scaled=1)\n    leaf2_mh.add_sequence(\"AAAAA\")\n    leaf2_mh.add_sequence(\"AAAAT\")\n    leaf2_mh.add_sequence(\"AAAAG\")\n    leaf2_sig = SourmashSignature(leaf2_mh)\n    root.insert(leaf2_sig)\n\n    leaf3_mh = sourmash.MinHash(0, 5, scaled=1)\n    leaf3_mh.add_sequence(\"AAAAA\")\n    leaf3_mh.add_sequence(\"AAAAT\")\n    leaf3_mh.add_sequence(\"CAAAA\")\n    leaf3_sig = SourmashSignature(leaf3_mh)\n    root.insert(leaf3_sig)\n\n    leaf4_mh = sourmash.MinHash(0, 5, scaled=1)\n    leaf4_mh.add_sequence(\"AAAAA\")\n    leaf4_mh.add_sequence(\"CAAAA\")\n    leaf4_mh.add_sequence(\"GAAAA\")\n    leaf4_sig = SourmashSignature(leaf4_mh)\n    root.insert(leaf4_sig)\n\n    leaf5_mh = sourmash.MinHash(0, 5, scaled=1)\n    leaf5_mh.add_sequence(\"AAAAA\")\n    leaf5_mh.add_sequence(\"AAAAT\")\n    leaf5_mh.add_sequence(\"GAAAA\")\n    leaf5_sig = SourmashSignature(leaf5_mh)\n    root.insert(leaf5_sig)\n\n    linear = LinearIndex()\n    linear.insert(leaf1_sig)\n    linear.insert(leaf2_sig)\n    linear.insert(leaf3_sig)\n    linear.insert(leaf4_sig)\n    linear.insert(leaf5_sig)\n\n    search_fn = make_jaccard_search_query(do_containment=True)\n\n    kmers = [\"AAAAA\", \"AAAAT\", \"AAAAG\", \"CAAAA\", \"GAAAA\"]\n    for kmer in kmers:\n        search_mh = sourmash.MinHash(0, 5, scaled=1)\n        search_mh.add_sequence(kmer)\n        search_sig = sourmash.SourmashSignature(search_mh)\n\n        linear_found = linear.find(search_fn, search_sig)\n        linear_found = set(linear_found)\n\n        tree_found = set(root.find(search_fn, search_sig))\n\n        assert tree_found\n        assert tree_found == set(linear_found)\n\n\ndef test_linear_index_prefetch_empty():\n    # check that an exception is raised upon for an empty LinearIndex\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    lidx = LinearIndex()\n\n    # since this is a generator, we need to actually ask for a value to\n    # get exception raised.\n    g = lidx.prefetch(ss2, threshold_bp=0)\n    with pytest.raises(ValueError) as e:\n        next(g)\n\n    assert \"no signatures to search\" in str(e.value)\n\n\ndef test_linear_index_prefetch_lazy():\n    # make sure that prefetch doesn't touch values 'til requested.\n    class FakeSignature:\n        @property\n        def minhash(self):\n            raise Exception(\"don't touch me!\")\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n    fake = FakeSignature()\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n    lidx.insert(fake)\n\n    g = lidx.prefetch(ss47, threshold_bp=0)\n\n    # first value:\n    sr = next(g)\n    assert sr.signature == ss47\n\n    # second value:\n    sr = next(g)\n    assert sr.signature == ss63\n\n    # third value: raises exception!\n    with pytest.raises(Exception) as e:\n        next(g)\n\n    assert \"don't touch me!\" in str(e.value)\n\n\ndef test_linear_index_search_subj_has_abundance():\n    # check that search signatures in the index are flattened appropriately.\n    queryfile = utils.get_test_data(\"47.fa.sig\")\n    subjfile = utils.get_test_data(\"track_abund/47.fa.sig\")\n\n    qs = load_one_signature_from_json(queryfile)\n    ss = load_one_signature_from_json(subjfile)\n\n    linear = LinearIndex()\n    linear.insert(ss)\n\n    results = list(linear.search(qs, threshold=0))\n    assert len(results) == 1\n    # note: search returns _original_ signature, not flattened\n    assert results[0].signature == ss\n\n\ndef test_linear_index_gather_subj_has_abundance():\n    # check that target signatures in the index are flattened appropriately.\n    queryfile = utils.get_test_data(\"47.fa.sig\")\n    subjfile = utils.get_test_data(\"track_abund/47.fa.sig\")\n\n    qs = load_one_signature_from_json(queryfile)\n    ss = load_one_signature_from_json(subjfile)\n\n    linear = LinearIndex()\n    linear.insert(ss)\n\n    result = linear.best_containment(qs, threshold=0)\n    assert result\n\n    # note: gather returns _original_ signature, not flattened\n    assert result.signature == ss\n\n\ndef test_index_search_subj_scaled_is_lower():\n    # check that subject sketches are appropriately downsampled for scaled\n    # sketches.\n    sigfile = utils.get_test_data(\n        \"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    )\n    ss = load_one_signature_from_json(sigfile)\n\n    # double check :)\n    assert ss.minhash.scaled == 100\n\n    # build a new query that has a scaled of 1000\n    qs = SourmashSignature(ss.minhash.downsample(scaled=1000))\n\n    # create Index to search\n    linear = LinearIndex()\n    linear.insert(ss)\n\n    # search!\n    results = list(linear.search(qs, threshold=0))\n    assert len(results) == 1\n    # original signature (not downsampled) is returned\n    assert results[0].signature == ss\n\n\ndef test_index_search_subj_num_is_lower():\n    # check that subject sketches are appropriately downsampled for num\n    # sketches\n    sigfile = utils.get_test_data(\"num/47.fa.sig\")\n    ss = load_one_signature_from_json(sigfile, ksize=31)\n\n    # double check :)\n    assert ss.minhash.num == 500\n\n    # build a new query that has a num of 250\n    qs = SourmashSignature(ss.minhash.downsample(num=250))\n\n    # create Index to search\n    linear = LinearIndex()\n    linear.insert(ss)\n\n    # search!\n    results = list(linear.search(qs, threshold=0))\n    assert len(results) == 1\n    # original signature (not downsampled) is returned\n    assert results[0].signature == ss\n\n\ndef test_index_search_query_num_is_lower():\n    # check that query sketches are appropriately downsampled for num.\n    sigfile = utils.get_test_data(\"num/47.fa.sig\")\n    qs = load_one_signature_from_json(sigfile, ksize=31)\n\n    # double check :)\n    assert qs.minhash.num == 500\n\n    # build a new subject that has a num of 250\n    ss = SourmashSignature(qs.minhash.downsample(num=250))\n\n    # create Index to search\n    linear = LinearIndex()\n    linear.insert(ss)\n\n    # search!\n    results = list(linear.search(qs, threshold=0))\n    assert len(results) == 1\n    assert results[0].signature == ss\n\n\ndef test_linear_index_search_abund():\n    # test Index.search_abund\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    results = list(lidx.search_abund(ss47, threshold=0))\n    assert len(results) == 2\n    assert results[0].signature == ss47\n    assert results[1].signature == ss63\n\n\ndef test_linear_index_search_abund_downsample_query():\n    # test Index.search_abund with query with higher scaled\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    # forcibly downsample ss47 for the purpose of this test :)\n    ss47 = ss47.to_mutable()\n    ss47.minhash = ss63.minhash.downsample(scaled=2000)\n    assert ss63.minhash.scaled != ss47.minhash.scaled\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    results = list(lidx.search_abund(ss47, threshold=0))\n    assert len(results) == 2\n    assert results[0].signature == ss47\n    assert results[1].signature == ss63\n\n\ndef test_linear_index_search_abund_downsample_subj():\n    # test Index.search_abund with subj with higher scaled\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    # forcibly downsample ss63 for the purpose of this test :)\n    ss63 = ss63.to_mutable()\n    ss63.minhash = ss63.minhash.downsample(scaled=2000)\n    assert ss63.minhash.scaled != ss47.minhash.scaled\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    results = list(lidx.search_abund(ss47, threshold=0))\n    assert len(results) == 2\n    assert results[0].signature == ss47\n    assert results[1].signature == ss63\n\n\ndef test_linear_index_search_abund_requires_threshold():\n    # test that Index.search_abund requires a 'threshold'\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    with pytest.raises(TypeError) as exc:\n        list(lidx.search_abund(ss47, threshold=None))\n\n    assert \"'search_abund' requires 'threshold'\" in str(exc.value)\n\n\ndef test_linear_index_search_abund_query_flat():\n    # test that Index.search_abund requires an abund query sig\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    with pytest.raises(TypeError) as exc:\n        list(lidx.search_abund(ss47, threshold=0))\n\n    assert \"'search_abund' requires query signature with abundance information\" in str(\n        exc.value\n    )\n\n\ndef test_linear_index_search_abund_subj_flat():\n    # test Index.search_abund requires an abund subj\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = LinearIndex()\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    with pytest.raises(TypeError) as exc:\n        list(lidx.search_abund(ss47, threshold=0))\n\n    assert (\n        \"'search_abund' requires subject signatures with abundance information\"\n        in str(exc.value)\n    )\n\n\ndef test_linear_index_save(runtmp):\n    # test save output from LinearIndex => JSON\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    linear = LinearIndex()\n    linear.insert(ss2)\n    linear.insert(ss47)\n    linear.insert(ss63)\n\n    filename = runtmp.output(\"foo\")\n    linear.save(filename)\n\n    si = set(sourmash.load_file_as_signatures(filename))\n\n    x = {ss2, ss47, ss63}\n\n    print(len(si))\n    print(len(x))\n\n    print(\"si: \", si)\n    print(\"x: \", x)\n\n    assert si == x, si\n\n\ndef test_linear_index_load(runtmp):\n    # test .load class method of LinearIndex\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    filename = runtmp.output(\"foo\")\n    with open(filename, \"w\") as fp:\n        save_signatures_to_json([ss2, ss47, ss63], fp)\n\n    linear = LinearIndex.load(filename)\n\n    x = {ss2, ss47, ss63}\n    assert set(linear.signatures()) == x, linear.signatures\n    assert linear.location == filename\n\n\ndef test_linear_index_save_load(runtmp):\n    # LinearIndex save/load round trip\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    linear = LinearIndex()\n    linear.insert(ss2)\n    linear.insert(ss47)\n    linear.insert(ss63)\n\n    filename = runtmp.output(\"foo\")\n    linear.save(filename)\n    linear2 = LinearIndex.load(filename)\n\n    # now, search for sig2\n    sr = linear2.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n\n\ndef test_linear_gather_threshold_1():\n    # test gather() method, in some detail\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    linear = LinearIndex()\n\n    linear.insert(sig47)\n    linear.insert(sig63)\n    linear.insert(sig2)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # query with empty hashes\n    assert not new_mh\n    with pytest.raises(ValueError):\n        linear.best_containment(SourmashSignature(new_mh))\n\n    # add one hash\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 1\n\n    result = linear.best_containment(SourmashSignature(new_mh))\n    assert result\n\n    # it's a namedtuple, so we can unpack like a tuple.\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n    # check with a threshold -> should be no results.\n    with pytest.raises(ValueError):\n        linear.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n    # add three more hashes => length of 4\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 4\n\n    result = linear.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n    # check with a too-high threshold -> should be no results.\n    with pytest.raises(ValueError):\n        linear.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n\ndef test_linear_gather_threshold_5():\n    # test gather() method above threshold\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    linear = LinearIndex(filename=\"foo\")\n\n    linear.insert(sig47)\n    linear.insert(sig63)\n    linear.insert(sig2)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # add five hashes\n    for i in range(5):\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n\n    # should get a result with no threshold (any match at all is returned)\n    result = linear.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name == \"foo\"\n\n    # now, check with a threshold_bp that should be meet-able.\n    result = linear.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name == \"foo\"\n\n\ndef test_linear_index_multik_select():\n    # test that LinearIndx can load multiple (three) ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    linear = LinearIndex()\n    for ss in siglist:\n        linear.insert(ss)\n\n    # select most specifically\n    linear2 = linear.select(ksize=31, moltype=\"DNA\")\n    assert len(linear2) == 1\n\n    # all are DNA:\n    linear2 = linear.select(moltype=\"DNA\")\n    assert len(linear2) == 3\n\n\ndef test_linear_index_moltype_select():\n    # this loads two ksizes(21, 10), and two moltypes (DNA and protein)\n    filename = utils.get_test_data(\"genome-s10+s11.sig\")\n    siglist = sourmash.load_file_as_signatures(filename)\n\n    linear = LinearIndex()\n    for ss in siglist:\n        linear.insert(ss)\n\n    # select most specific DNA\n    linear2 = linear.select(ksize=30, moltype=\"DNA\")\n    assert len(linear2) == 1\n\n    # select most specific protein\n    linear2 = linear.select(ksize=10, moltype=\"protein\")\n    assert len(linear2) == 1\n\n    # can leave off ksize, selects all ksizes\n    linear2 = linear.select(moltype=\"DNA\")\n    assert len(linear2) == 2\n\n    # can leave off ksize, selects all ksizes\n    linear2 = linear.select(moltype=\"protein\")\n    assert len(linear2) == 2\n\n    # select something impossible\n    linear2 = linear.select(ksize=4)\n    assert len(linear2) == 0\n\n\ndef test_linear_index_picklist_select():\n    # test LinearIndex.select with a picklist\n\n    # this loads three ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    linear = LinearIndex()\n    for ss in siglist:\n        linear.insert(ss)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"f3a90d4e\"])\n\n    # select on picklist\n    linear2 = linear.select(picklist=picklist)\n    assert len(linear2) == 1\n    ss = list(linear2.signatures())[0]\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"f3a90d4e55\")\n\n\ndef test_linear_index_picklist_select_exclude():\n    # test select with a picklist, but exclude\n\n    # this loads three ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    linear = LinearIndex()\n    for ss in siglist:\n        linear.insert(ss)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"f3a90d4e\"])\n\n    # select on picklist\n    linear2 = linear.select(picklist=picklist)\n    assert len(linear2) == 2\n    md5s = set()\n    ksizes = set()\n    for ss in list(linear2.signatures()):\n        md5s.add(ss.md5sum())\n        ksizes.add(ss.minhash.ksize)\n    assert md5s == set(\n        [\"f372e47893edd349e5956f8b0d8dcbf7\", \"43f3b48e59443092850964d355a20ac0\"]\n    )\n    assert ksizes == set([21, 51])\n\n\ndef test_index_same_md5sum_fsstorage(runtmp):\n    # check SBT directory 'save' with two signatures that have identical md5\n    c = runtmp\n    testdata1 = utils.get_test_data(\"img/2706795855.sig\")\n    testdata2 = utils.get_test_data(\"img/638277004.sig\")\n\n    c.run_sourmash(\"index\", \"-k\", \"21\", \"zzz.sbt.json\", testdata1, testdata2)\n    assert c.last_result.status == 0\n\n    outfile = c.output(\"zzz.sbt.json\")\n    assert os.path.exists(outfile)\n    storage = c.output(\".sbt.zzz\")\n    assert len(glob.glob(storage + \"/*\")) == 4\n\n\ndef test_index_same_md5sum_sbt_zipstorage(runtmp):\n    # check SBT zipfile 'save' with two signatures w/identical md5\n    c = runtmp\n    testdata1 = utils.get_test_data(\"img/2706795855.sig\")\n    testdata2 = utils.get_test_data(\"img/638277004.sig\")\n\n    c.run_sourmash(\"index\", \"-k\", \"21\", \"zzz.sbt.zip\", testdata1, testdata2)\n    assert c.last_result.status == 0\n\n    outfile = c.output(\"zzz.sbt.zip\")\n    assert os.path.exists(outfile)\n    zout = zipfile.ZipFile(outfile, mode=\"r\")\n    # should have 3 files, 1 internal and two sigs. We check for 4 because the\n    # directory also shows in namelist()\n    assert len([f for f in zout.namelist() if f.startswith(\".sbt.zzz/\")]) == 5\n\n\ndef test_zipfile_does_not_exist(runtmp):\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\"sig\", \"describe\", \"no-exist.zip\")\n\n    # old behavior, pre PR #1777\n    assert \"FileNotFoundError: SOURMASH-MANIFEST.csv\" not in str(exc)\n    assert not os.path.exists(runtmp.output(\"no-exist.zip\"))\n\n    # correct behavior\n    assert \"ERROR: Error while reading signatures from 'no-exist.zip'.\" in str(exc)\n\n\ndef test_zipfile_protein_command_search(runtmp):\n    # test command-line search/gather of zipfile with protein sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/protein.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out)\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_hp_command_search(runtmp):\n    # test command-line search/gather of zipfile with hp sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/hp.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_dayhoff_command_search(runtmp):\n    # test command-line search/gather of zipfile with dayhoff sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/dayhoff.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_protein_command_search_combined(runtmp):\n    # test command-line search/gather of combined zipfile with protein sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/all.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out)\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_hp_command_search_combined(runtmp):\n    # test command-line search/gather of combined zipfile with hp sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/all.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_dayhoff_command_search_combined(runtmp):\n    # test command-line search/gather of combined zipfile with dayhoff sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/all.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_zipfile_dayhoff_command_search_protein(runtmp):\n    # test command-line search/gather of protein sigs in zipfile\n    c = runtmp\n\n    # with dayhoff query\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/protein.zip\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert \"no compatible signatures found in \" in c.last_result.err\n\n\ndef test_zipfile_API_signatures(use_manifest):\n    # return all of the .sig and .sig.gz files in all.zip\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    siglist = list(zipidx.signatures())\n\n    if use_manifest:\n        assert len(siglist) == 8\n        assert len(zipidx) == 8\n    else:\n        assert len(siglist) == 7\n        assert len(zipidx) == 7\n\n\ndef test_zipfile_bool():\n    # make sure that zipfile __bool__ doesn't traverse all the signatures\n    # by relying on __len__!\n\n    # create fake class that overrides everything useful except for bool -\n    class FakeZipFileLinearIndex(ZipFileLinearIndex):\n        def __init__(self):\n            pass\n\n        def signatures(self):\n            yield \"a\"\n            raise Exception(\"don't touch me!\")\n\n        def __len__(self):\n            raise Exception(\"don't call len!\")\n\n    # 'bool' should not touch __len__ or a second signature\n    zf = FakeZipFileLinearIndex()\n    assert bool(zf)\n\n    # __len__ should raise an exception\n    with pytest.raises(Exception) as exc:\n        len(zf)\n    assert \"don't call len!\" in str(exc.value)\n\n\ndef test_zipfile_API_signatures_traverse_yield_all(use_manifest):\n    # include dna-sig.noext, but not build.sh (cannot be loaded as signature)\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(\n        zipfile_db, traverse_yield_all=True, use_manifest=use_manifest\n    )\n    siglist = list(zipidx.signatures())\n    assert len(siglist) == 8\n    assert len(zipidx) == 8\n\n    # confirm that there are 12 files in there total, incl build.sh and dirs\n    allfiles = zipidx.storage._filenames()\n    print(allfiles)\n    assert len(allfiles) == 13\n\n\ndef test_zipfile_API_signatures_traverse_yield_all_select(use_manifest):\n    # include dna-sig.noext\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(\n        zipfile_db, traverse_yield_all=True, use_manifest=use_manifest\n    )\n    zipidx = zipidx.select(moltype=\"DNA\")\n    siglist = list(zipidx.signatures())\n    assert len(siglist) == 2\n    assert len(zipidx) == 2\n\n\ndef test_zipfile_API_signatures_traverse_yield_all_manifest():\n    # check that manifest len is correct\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(\n        zipfile_db, traverse_yield_all=True, use_manifest=True\n    )\n    assert len(zipidx) == 8, len(zipidx)\n    assert len(zipidx.manifest) == 8, len(zipidx.manifest)\n\n    zipidx = zipidx.select(moltype=\"DNA\")\n    siglist = list(zipidx.signatures())\n    assert len(siglist) == 2\n    assert len(zipidx) == 2\n    assert len(zipidx.manifest) == 2\n\n\ndef test_zipfile_API_signatures_select(use_manifest):\n    # include dna-sig.noext\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    ziplist_pre = LinearIndex(zipidx.signatures())\n    ziplist_pre = ziplist_pre.select(moltype=\"DNA\")\n\n    zipidx = zipidx.select(moltype=\"DNA\")\n    siglist = list(zipidx.signatures())\n\n    if use_manifest:\n        assert len(siglist) == 2\n        assert len(zipidx) == 2\n        assert len(ziplist_pre) == 2\n    else:\n        assert len(siglist) == 1\n        assert len(zipidx) == 1\n        assert len(ziplist_pre) == 1\n\n\ndef test_zipfile_API_signatures_select_abund_false(use_manifest):\n    # check for abund=False (all signatures match b/c can convert)\n    zipfile_db = utils.get_test_data(\"track_abund/track_abund.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    ziplist_pre = LinearIndex(zipidx.signatures())\n    ziplist_pre = ziplist_pre.select(abund=False)\n\n    zipidx = zipidx.select(abund=False)\n    siglist = list(zipidx.signatures())\n\n    assert len(siglist) == 2\n    assert len(zipidx) == 2\n    assert len(ziplist_pre) == 2\n\n\ndef test_zipfile_API_signatures_select_abund_true(use_manifest):\n    # find all abund=True (all signatures match, b/c abund)\n    zipfile_db = utils.get_test_data(\"track_abund/track_abund.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    ziplist_pre = LinearIndex(zipidx.signatures())\n    ziplist_pre = ziplist_pre.select(abund=True)\n\n    zipidx = zipidx.select(abund=True)\n    siglist = list(zipidx.signatures())\n\n    assert len(siglist) == 2\n    assert len(zipidx) == 2\n    assert len(ziplist_pre) == 2\n\n\ndef test_zipfile_API_signatures_select_abund_none(use_manifest):\n    # find all abund=None (all signatures match, b/c no selection criteria)\n    zipfile_db = utils.get_test_data(\"track_abund/track_abund.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    ziplist_pre = LinearIndex(zipidx.signatures())\n    ziplist_pre = ziplist_pre.select(abund=None)\n\n    zipidx = zipidx.select(abund=None)\n    siglist = list(zipidx.signatures())\n\n    assert len(siglist) == 2\n    assert len(zipidx) == 2\n    assert len(ziplist_pre) == 2\n\n\ndef test_zipfile_API_signatures_select_twice(use_manifest):\n    # include dna-sig.noext\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n    ziplist_pre = LinearIndex(zipidx.signatures())\n    ziplist_pre = ziplist_pre.select(moltype=\"DNA\")\n    ziplist_pre = ziplist_pre.select(ksize=31)\n\n    zipidx = zipidx.select(moltype=\"DNA\")\n    zipidx = zipidx.select(ksize=31)\n    siglist = list(zipidx.signatures())\n\n    if use_manifest:\n        assert len(siglist) == 2\n        assert len(zipidx) == 2\n        assert len(ziplist_pre) == 2\n    else:\n        assert len(siglist) == 1\n        assert len(zipidx) == 1\n        assert len(ziplist_pre) == 1\n\n\ndef test_zipfile_API_save():\n    # ZipFileLinearIndex.save is not implemented.\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db)\n\n    with pytest.raises(NotImplementedError):\n        zipidx.save(\"xxx\")\n\n\ndef test_zipfile_API_insert():\n    # ZipFileLinearIndex.insert is not implemented.\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db)\n\n    with pytest.raises(NotImplementedError):\n        # at some point probably want to change this to a real signature :)\n        zipidx.insert(None)\n\n\ndef test_zipfile_API_location(use_manifest):\n    # test ZipFileLinearIndex.location property\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n\n    zipidx = ZipFileLinearIndex.load(zipfile_db, use_manifest=use_manifest)\n\n    assert zipidx.location == zipfile_db\n\n\ndef test_zipfile_load_file_as_signatures(use_manifest):\n    # make sure that ZipFileLinearIndex.signatures works, and is generator\n    from types import GeneratorType\n\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n    sigs = sourmash_args.load_file_as_signatures(zipfile_db, _use_manifest=use_manifest)\n\n    # it's fine if this needs to change, but for now I want to make\n    # sure that this is a generator.\n    assert isinstance(sigs, GeneratorType)\n\n    sigs = list(sigs)\n    if use_manifest:\n        assert len(sigs) == 8\n    else:\n        assert len(sigs) == 7\n\n\ndef test_zipfile_load_file_as_signatures_traverse_yield_all(use_manifest):\n    # test with --force, which loads all files\n    from types import GeneratorType\n\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n    sigs = sourmash_args.load_file_as_signatures(\n        zipfile_db, yield_all_files=True, _use_manifest=use_manifest\n    )\n\n    # it's fine if this needs to change, but for now I want to make\n    # sure that this is a generator.\n    assert isinstance(sigs, GeneratorType)\n\n    sigs = list(sigs)\n    assert len(sigs) == 8\n\n\ndef test_zipfile_load_database_fail_if_not_zip(runtmp):\n    # fail _load_database if not .zip\n    c = runtmp\n\n    zipfile_db = utils.get_test_data(\"prot/all.zip\")\n    badname = c.output(\"xyz.nada\")\n    shutil.copyfile(zipfile_db, badname)\n\n    with pytest.raises(ValueError) as exc:\n        sourmash_args.load_file_as_signatures(badname)\n\n    assert \"Error while reading signatures from\" in str(exc.value)\n\n\ndef test_multi_index_search():\n    # test MultiIndex.search\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig2)\n    lidx2 = LinearIndex.load(sig47)\n    lidx3 = LinearIndex.load(sig63)\n\n    # create MultiIndex with source location override\n    lidx = MultiIndex.load([lidx1, lidx2, lidx3], [\"A\", None, \"C\"], None)\n    lidx = lidx.select(ksize=31)\n\n    # now, search for sig2\n    sr = lidx.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n    assert sr[0][2] == \"A\"  # source override\n\n    # search for sig47 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss47, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss47\n    assert sr[0][2] == sig47  # source was set to None, so no override\n    assert sr[1][1] == ss63\n    assert sr[1][2] == \"C\"  # source override\n\n    # search for sig63 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss63, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n    assert sr[0][2] == \"C\"  # source override\n    assert sr[1][1] == ss47\n    assert sr[1][2] == sig47  # source was set to None, so no override\n\n    # search for sig63 with high threshold => 1 match\n    sr = lidx.search(ss63, threshold=0.8)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n    assert sr[0][2] == \"C\"  # source override\n\n\ndef test_multi_index_gather():\n    # test MultiIndex.best_containment\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig2)\n    lidx2 = LinearIndex.load(sig47)\n    lidx3 = LinearIndex.load(sig63)\n\n    # create MultiIndex with source location override\n    lidx = MultiIndex.load([lidx1, lidx2, lidx3], [\"A\", None, \"C\"], None)\n    lidx = lidx.select(ksize=31)\n\n    match = lidx.best_containment(ss2)\n    assert match\n    assert match.score == 1.0\n    assert match.location == \"A\"\n\n    match = lidx.best_containment(ss47)\n    assert match\n    assert match.score == 1.0\n    assert match.signature == ss47\n    assert match.location == sig47  # no source override\n\n\ndef test_multi_index_signatures():\n    # test MultiIndex.signatures\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig2)\n    lidx2 = LinearIndex.load(sig47)\n    lidx3 = LinearIndex.load(sig63)\n\n    # create MultiIndex with source location override\n    lidx = MultiIndex.load([lidx1, lidx2, lidx3], [\"A\", None, \"C\"], None)\n    lidx = lidx.select(ksize=31)\n\n    siglist = list(lidx.signatures())\n    assert len(siglist) == 3\n    assert ss2 in siglist\n    assert ss47 in siglist\n    assert ss63 in siglist\n\n\ndef test_multi_index_create():\n    # test MultiIndex constructor\n    mi = MultiIndex(None, None, prepend_location=False)\n    assert len(mi) == 0\n\n\ndef test_multi_index_create_prepend():\n    # test MultiIndex constructor - location must be specified if\n    # 'prepend_location is True\n    with pytest.raises(ValueError):\n        MultiIndex(None, None, prepend_location=True)\n\n\ndef test_multi_index_load_from_directory():\n    # test MultiIndex loading from a directory. The full paths to the\n    # signature files should be available via 'signatures_with_location()'\n    dirname = utils.get_test_data(\"prot/protein\")\n    mi = MultiIndex.load_from_directory(dirname, force=False)\n\n    assert mi.location == dirname\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 2\n\n    # check to make sure that full paths to expected sig files are returned\n    locs = [x[1] for x in mi.signatures_with_location()]\n\n    endings = (\n        \"GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n        \"GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n    )\n    for loc in locs:\n        found = False\n        for end in endings:\n            if loc.endswith(end):\n                found = True\n        assert found, f\"could not find full filename in locations for {end}\"\n\n    # also check internal locations and parent value --\n    assert mi.parent.endswith(\"prot/protein\")\n\n    ilocs = [x[1] for x in mi._signatures_with_internal()]\n    assert endings[0] in ilocs, ilocs\n    assert endings[1] in ilocs, ilocs\n\n\ndef test_multi_index_load_from_directory_2():\n    # only load .sig files, currently; not the databases under that directory.\n    dirname = utils.get_test_data(\"prot\")\n    mi = MultiIndex.load_from_directory(dirname, force=False)\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 7\n\n\ndef test_multi_index_load_from_directory_3_simple_bad_file(runtmp):\n    # check that force=False fails properly when confronted with non-JSON\n    # files.\n\n    with open(runtmp.output(\"badsig.sig\"), \"w\") as fp:\n        fp.write(\"bad content.\")\n\n    with pytest.raises(ValueError):\n        MultiIndex.load_from_directory(runtmp.location, force=False)\n\n\ndef test_multi_index_load_from_directory_3(runtmp):\n    # check that force=False fails properly when confronted with non-JSON\n    # files that are legit sourmash files...\n    c = runtmp\n\n    dirname = utils.get_test_data(\"prot\")\n\n    count = 0\n    for root, dirs, files in os.walk(dirname):\n        for name in files:\n            print(f\"at {name}\")\n            fullname = os.path.join(root, name)\n            copyto = c.output(f\"file{count}.sig\")\n            shutil.copyfile(fullname, copyto)\n            count += 1\n\n    with pytest.raises(ValueError):\n        MultiIndex.load_from_directory(c.location, force=False)\n\n\ndef test_multi_index_load_from_directory_3_yield_all_true(runtmp):\n    # check that force works ok on a directory w/force=True\n    # Note here that only .sig/.sig.gz files are loaded.\n    c = runtmp\n\n    dirname = utils.get_test_data(\"prot\")\n\n    count = 0\n    for root, dirs, files in os.walk(dirname):\n        for name in files:\n            print(f\"at {name}\")\n            fullname = os.path.join(root, name)\n            copyto = c.output(f\"file{count}.something\")\n            shutil.copyfile(fullname, copyto)\n            count += 1\n\n    mi = MultiIndex.load_from_directory(c.location, force=True)\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 8\n\n\ndef test_multi_index_load_from_directory_3_yield_all_true_subdir(runtmp):\n    # check that force works ok on subdirectories.\n    # Note here that only .sig/.sig.gz files are loaded.\n    c = runtmp\n    dirname = utils.get_test_data(\"prot\")\n\n    target_dir = c.output(\"some_subdir\")\n    os.mkdir(target_dir)\n\n    count = 0\n    for root, dirs, files in os.walk(dirname):\n        for name in files:\n            print(f\"at {name}\")\n            fullname = os.path.join(root, name)\n            copyto = os.path.join(target_dir, f\"file{count}.something\")\n            shutil.copyfile(fullname, copyto)\n            count += 1\n\n    mi = MultiIndex.load_from_directory(c.location, force=True)\n\n    locations = set([row[\"internal_location\"] for row in mi.manifest.rows])\n    print(locations)\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 8\n\n\ndef test_multi_index_load_from_directory_3_sig_gz(runtmp):\n    # check that we find .sig.gz files, too\n    c = runtmp\n\n    dirname = utils.get_test_data(\"prot\")\n\n    count = 0\n    for root, dirs, files in os.walk(dirname):\n        for name in files:\n            if not name.endswith(\".sig\"):  # skip non .sig things\n                continue\n            print(f\"at {name}\")\n            fullname = os.path.join(root, name)\n            copyto = c.output(f\"file{count}.sig.gz\")\n            shutil.copyfile(fullname, copyto)\n            count += 1\n\n    mi = MultiIndex.load_from_directory(c.location, force=False)\n\n    assert mi.location == c.location\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 6\n\n\ndef test_multi_index_load_from_directory_3_check_traverse_fn(runtmp):\n    # test the actual traverse function... eventually this test can be\n    # removed, probably, as we consolidate functionality and test MultiIndex\n    # better.\n\n    dirname = utils.get_test_data(\"prot\")\n    files = list(sourmash_args.traverse_find_sigs([dirname]))\n    assert len(files) == 7, files\n\n    files = list(sourmash_args.traverse_find_sigs([dirname], True))\n    assert len(files) == 44, files  # if this fails, check for extra files!\n\n\ndef test_multi_index_load_from_directory_no_exist():\n    # raise ValueError on files that don't exist in load_from_directory\n    dirname = utils.get_test_data(\"does-not-exist\")\n    with pytest.raises(ValueError):\n        MultiIndex.load_from_directory(dirname, force=True)\n\n\ndef test_multi_index_load_from_file_path():\n    # test that MultiIndex.load_from_path works fine\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n\n    mi = MultiIndex.load_from_path(sig2)\n    assert len(mi) == 3\n    assert mi.location == sig2\n\n\ndef test_multi_index_load_from_file_path_no_exist():\n    # test that load_from_path fails on non-existent files\n    filename = utils.get_test_data(\"does-not-exist\")\n    with pytest.raises(ValueError):\n        MultiIndex.load_from_directory(filename, force=True)\n\n\ndef test_multi_index_load_from_pathlist_no_exist():\n    # test that load_from_pathlist fails on non-existent files\n    dirname = utils.get_test_data(\"does-not-exist\")\n    with pytest.raises(ValueError):\n        MultiIndex.load_from_pathlist(dirname)\n\n\ndef test_multi_index_load_from_pathlist_1(runtmp):\n    # test functionality of MultiIndex.load_from_pathlist with .sig files\n    c = runtmp\n\n    dirname = utils.get_test_data(\"prot\")\n    files = list(sourmash_args.traverse_find_sigs([dirname]))\n    assert len(files) == 7, files\n\n    file_list = c.output(\"filelist.txt\")\n\n    with open(file_list, \"w\") as fp:\n        print(\"\\n\".join(files), file=fp)\n    mi = MultiIndex.load_from_pathlist(file_list)\n\n    sigs = list(mi.signatures())\n    assert len(sigs) == 7\n\n    assert mi.location == file_list\n\n\ndef test_multi_index_load_from_pathlist_2(runtmp):\n    # create a pathlist file with _all_ files under dir, and try to load it.\n    # this will fail on one of several CSV or .sh files in there.\n\n    # CTB note: if you create extra files under this directory,\n    # it will fail :)\n    c = runtmp\n    dirname = utils.get_test_data(\"prot\")\n    files = list(sourmash_args.traverse_find_sigs([dirname], True))\n    assert len(files) == 44, files  # check there aren't extra files in here!\n\n    file_list = c.output(\"filelist.txt\")\n\n    with open(file_list, \"w\") as fp:\n        print(\"\\n\".join(files), file=fp)\n\n    with pytest.raises(ValueError) as exc:\n        MultiIndex.load_from_pathlist(file_list)\n\n    print(str(exc))\n    assert \"Error while reading signatures from\" in str(exc)\n\n\ndef test_multi_index_load_from_pathlist_3_zipfile(runtmp):\n    # can we load zipfiles in a pathlist? yes please.\n    c = runtmp\n\n    zipfile = utils.get_test_data(\"prot/all.zip\")\n\n    file_list = c.output(\"filelist.txt\")\n\n    with open(file_list, \"w\") as fp:\n        print(zipfile, file=fp)\n\n    mi = MultiIndex.load_from_pathlist(file_list)\n    assert len(mi) == 8\n\n\n##\n## test a slightly outre version of JaccardSearch - this is a test of the\n## JaccardSearch 'collect' protocol, in particular...\n##\n\n\nclass JaccardSearchBestOnly_ButIgnore(JaccardSearch):\n    \"A class that ignores certain results, but still does all the pruning.\"\n\n    def __init__(self, ignore_list):\n        super().__init__(SearchType.JACCARD, threshold=0.1)\n        self.ignore_list = ignore_list\n\n    # a collect function that _ignores_ things in the ignore_list\n    def collect(self, score, match):\n        print(\"in collect; current threshold:\", self.threshold)\n        for q in self.ignore_list:\n            print(\"ZZZ\", match, match.similarity(q))\n            if match.similarity(q) == 1.0:\n                print(\"yes, found.\")\n                return False\n\n        # update threshold if not perfect match, which could help prune.\n        self.threshold = score\n        return True\n\n\ndef test_linear_index_gather_ignore():\n    # do we properly ignore exact matches in 'search' for LinearIndex?\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # construct an index...\n    lidx = LinearIndex([ss2, ss47, ss63])\n\n    # ...now search with something that should ignore sig47, the exact match.\n    search_fn = JaccardSearchBestOnly_ButIgnore([ss47])\n\n    results = list(lidx.find(search_fn, ss47))\n    results = [sr.signature for sr in results]\n\n    def is_found(ss, xx):\n        for q in xx:\n            print(ss, ss.similarity(q))\n            if ss.similarity(q) == 1.0:\n                return True\n        return False\n\n    assert not is_found(ss47, results)\n    assert not is_found(ss2, results)\n    assert is_found(ss63, results)\n\n\ndef test_lca_index_gather_ignore():\n    # do we properly ignore exact matches in gather on an LCA DB?\n    from sourmash.lca import LCA_Database\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # construct an index...\n    db = LCA_Database(ksize=31, scaled=1000)\n    db.insert(ss2)\n    db.insert(ss47)\n    db.insert(ss63)\n\n    # ...now search with something that should ignore sig47, the exact match.\n    search_fn = JaccardSearchBestOnly_ButIgnore([ss47])\n\n    results = list(db.find(search_fn, ss47))\n    results = [sr.signature for sr in results]\n\n    def is_found(ss, xx):\n        for q in xx:\n            print(ss, ss.similarity(q))\n            if ss.similarity(q) == 1.0:\n                return True\n        return False\n\n    assert not is_found(ss47, results)\n    assert not is_found(ss2, results)\n    assert is_found(ss63, results)\n\n\ndef test_sbt_index_gather_ignore():\n    # do we properly ignore exact matches in gather on an SBT?\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # construct an index...\n    factory = GraphFactory(5, 100, 3)\n    db = SBT(factory, d=2)\n\n    db.insert(ss2)\n    db.insert(ss47)\n    db.insert(ss63)\n\n    # ...now search with something that should ignore sig47, the exact match.\n    print(f\"\\n** trying to ignore {ss47}\")\n    search_fn = JaccardSearchBestOnly_ButIgnore([ss47])\n\n    results = list(db.find(search_fn, ss47))\n    results = [sr.signature for sr in results]\n\n    def is_found(ss, xx):\n        for q in xx:\n            print(\"is found?\", ss, ss.similarity(q))\n            if ss.similarity(q) == 1.0:\n                return True\n        return False\n\n    assert not is_found(ss47, results)\n    assert not is_found(ss2, results)\n    assert is_found(ss63, results)\n\n\ndef test_counter_gather_test_consume():\n    # open-box testing of CounterGather.consume(...)\n    # (see test_index_protocol.py for generic CounterGather tests.)\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = CounterGather(query_ss)\n    counter.add(match_ss_1, location=\"loc a\")\n    counter.add(match_ss_2, location=\"loc b\")\n    counter.add(match_ss_3, location=\"loc c\")\n\n    ### ok, dig into actual counts...\n    import pprint\n\n    pprint.pprint(counter.counter)\n    pprint.pprint(list(counter.signatures()))\n    pprint.pprint(counter.locations)\n\n    assert set(counter.signatures()) == set([match_ss_1, match_ss_2, match_ss_3])\n    assert list(sorted(counter.locations.values())) == [\"loc a\", \"loc b\", \"loc c\"]\n    pprint.pprint(counter.counter.most_common())\n    assert list(counter.counter.most_common()) == [\n        (\"26d4943627b33c446f37be1f5baf8d46\", 10),\n        (\"f51cedec90ea666e0ebc11aa274eca61\", 8),\n        (\"f331f8279113d77e42ab8efca8f9cc17\", 4),\n    ]\n\n    ## round 1\n\n    cur_query = query_ss.minhash.to_mutable()\n    (sr, intersect_mh) = counter.peek(cur_query)\n    assert sr.signature == match_ss_1\n    assert len(intersect_mh) == 10\n    assert cur_query == query_ss.minhash\n\n    counter.consume(intersect_mh)\n    assert set(counter.signatures()) == set([match_ss_1, match_ss_2, match_ss_3])\n    assert list(sorted(counter.locations.values())) == [\"loc a\", \"loc b\", \"loc c\"]\n    pprint.pprint(counter.counter.most_common())\n    assert list(counter.counter.most_common()) == [\n        (\"f51cedec90ea666e0ebc11aa274eca61\", 5),\n        (\"f331f8279113d77e42ab8efca8f9cc17\", 4),\n    ]\n\n    ### round 2\n\n    cur_query.remove_many(intersect_mh.hashes)\n    (sr, intersect_mh) = counter.peek(cur_query)\n    assert sr.signature == match_ss_2\n    assert len(intersect_mh) == 5\n    assert cur_query != query_ss.minhash\n\n    counter.consume(intersect_mh)\n    assert set(counter.signatures()) == set([match_ss_1, match_ss_2, match_ss_3])\n    assert list(sorted(counter.locations.values())) == [\"loc a\", \"loc b\", \"loc c\"]\n\n    pprint.pprint(counter.counter.most_common())\n    assert list(counter.counter.most_common()) == [\n        (\"f331f8279113d77e42ab8efca8f9cc17\", 2)\n    ]\n\n    ## round 3\n\n    cur_query.remove_many(intersect_mh.hashes)\n    (sr, intersect_mh) = counter.peek(cur_query)\n    assert sr.signature == match_ss_3\n    assert len(intersect_mh) == 2\n    assert cur_query != query_ss.minhash\n\n    counter.consume(intersect_mh)\n    assert set(counter.signatures()) == set([match_ss_1, match_ss_2, match_ss_3])\n    assert list(sorted(counter.locations.values())) == [\"loc a\", \"loc b\", \"loc c\"]\n    pprint.pprint(counter.counter.most_common())\n    assert list(counter.counter.most_common()) == []\n\n    ## round 4 - nothing left!\n\n    cur_query.remove_many(intersect_mh.hashes)\n    results = counter.peek(cur_query)\n    assert not results\n\n    counter.consume(intersect_mh)\n    assert set(counter.signatures()) == set([match_ss_1, match_ss_2, match_ss_3])\n    assert list(sorted(counter.locations.values())) == [\"loc a\", \"loc b\", \"loc c\"]\n    assert list(counter.counter.most_common()) == []\n\n\ndef test_counter_gather_identical_md5sum():\n    # open-box testing of CounterGather.consume(...)\n    # check what happens with identical matches w/different names\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    # same as match_mh_1\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(0, 10))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    # identical md5sum\n    assert match_ss_1.md5sum() == match_ss_2.md5sum()\n\n    # load up the counter\n    counter = CounterGather(query_ss)\n    counter.add(match_ss_1, location=\"loc a\")\n    counter.add(match_ss_2, location=\"loc b\")\n\n    assert len(counter.siglist) == 1\n    stored_match = list(counter.siglist.values()).pop()\n    assert stored_match.name == \"match2\"\n    # CTB note: this behavior may be changed freely, as the protocol\n    # tests simply specify that _one_ of the identical matches is\n    # returned. See test_counter_gather_multiple_identical_matches.\n\n\ndef test_lazy_index_1():\n    # test some basic features of LazyLinearIndex\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = LinearIndex()\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    lazy = LazyLinearIndex(lidx)\n    lazy2 = lazy.select(ksize=31)\n    assert len(list(lazy2.signatures())) == 3\n\n    results = lazy2.search(ss2, threshold=1.0)\n    assert len(results) == 1\n    assert results[0].signature == ss2\n\n\ndef test_lazy_index_2():\n    # test laziness by adding a signature that raises an exception when\n    # touched.\n\n    class FakeSignature:\n        @property\n        def minhash(self):\n            raise Exception(\"don't touch me!\")\n\n    lidx = LinearIndex()\n    lidx.insert(FakeSignature())\n\n    lazy = LazyLinearIndex(lidx)\n    lazy2 = lazy.select(ksize=31)\n\n    sig_iter = lazy2.signatures()\n    with pytest.raises(Exception) as e:\n        list(sig_iter)\n\n    assert str(e.value) == \"don't touch me!\"\n\n\ndef test_lazy_index_3():\n    # make sure that you can't do multiple _incompatible_ selects.\n    class FakeSignature:\n        @property\n        def minhash(self):\n            raise Exception(\"don't touch me!\")\n\n    lidx = LinearIndex()\n    lidx.insert(FakeSignature())\n\n    lazy = LazyLinearIndex(lidx)\n    lazy2 = lazy.select(ksize=31)\n    with pytest.raises(ValueError) as e:\n        lazy2.select(ksize=21)\n\n    assert str(e.value) == \"cannot select on two different values for ksize\"\n\n\ndef test_lazy_index_4_bool():\n    # test some basic features of LazyLinearIndex\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    # test bool false/true\n    lidx = LinearIndex()\n    lazy = LazyLinearIndex(lidx)\n    assert not lazy\n\n    lidx.insert(ss2)\n    assert lazy\n\n\ndef test_lazy_index_wraps_multi_index_location():\n    # check that 'location' works fine when MultiIndex is wrapped by\n    # LazyLinearIndex.\n    sigdir = utils.get_test_data(\"prot/protein/\")\n    sigzip = utils.get_test_data(\"prot/protein.zip\")\n    siglca = utils.get_test_data(\"prot/protein.lca.json.gz\")\n    sigsbt = utils.get_test_data(\"prot/protein.sbt.zip\")\n\n    db_paths = (sigdir, sigzip, siglca, sigsbt)\n    dbs = [sourmash.load_file_as_index(db_path) for db_path in db_paths]\n\n    mi = MultiIndex.load(dbs, db_paths, None)\n    lazy = LazyLinearIndex(mi)\n\n    mi2 = mi.select(moltype=\"protein\")\n    lazy2 = lazy.select(moltype=\"protein\")\n\n    for ss_tup, ss_lazy_tup in zip(\n        mi2.signatures_with_location(), lazy2.signatures_with_location()\n    ):\n        assert ss_tup == ss_lazy_tup\n\n\ndef test_standalone_manifest_signatures(runtmp):\n    # build a StandaloneManifestIndex and test 'signatures' method.\n\n    ## first, build a manifest in memory using MultiIndex\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig47)\n    lidx2 = LinearIndex.load(sig63)\n\n    mi = MultiIndex.load([lidx1, lidx2], [sig47, sig63], \"\")\n\n    ## got a manifest! ok, now test out StandaloneManifestIndex\n    mm = StandaloneManifestIndex(mi.manifest, None)\n\n    siglist = [ss for ss in mm.signatures()]\n    assert len(siglist) == 2\n    assert ss47 in siglist\n    assert ss63 in siglist\n\n\ndef test_standalone_manifest_signatures_prefix(runtmp):\n    # try out 'prefix' for StandaloneManifestIndex\n\n    ## first, build a manifest in memory using MultiIndex\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    load_one_signature_from_json(sig47)\n    load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig47)\n    lidx2 = LinearIndex.load(sig63)\n    mi = MultiIndex.load([lidx1, lidx2], [sig47, sig63], \"\")\n\n    # ok, now remove the abspath prefix from iloc\n    for row in mi.manifest.rows:\n        row[\"internal_location\"] = os.path.basename(row[\"internal_location\"])\n\n    ## this should succeed!\n    mm = StandaloneManifestIndex(mi.manifest, None, prefix=utils.get_test_data(\"\"))\n\n    assert len(list(mm.signatures())) == 2\n\n\ndef test_standalone_manifest_signatures_prefix_fail(runtmp):\n    # give StandaloneManifest the wrong prefix\n\n    ## first, build a manifest in memory using MultiIndex\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    load_one_signature_from_json(sig47)\n    load_one_signature_from_json(sig63)\n\n    lidx1 = LinearIndex.load(sig47)\n    lidx2 = LinearIndex.load(sig63)\n    print(\"XXX\", lidx1.location)\n\n    mi = MultiIndex.load([lidx1, lidx2], [sig47, sig63], \"\")\n\n    # remove prefix from manifest\n    for row in mi.manifest.rows:\n        row[\"internal_location\"] = os.path.basename(row[\"internal_location\"])\n\n    ## got a manifest! ok, now test out StandaloneManifestIndex\n    mm = StandaloneManifestIndex(mi.manifest, None, prefix=runtmp.output(\"foo\"))\n\n    # should fail\n    with pytest.raises(ValueError) as exc:\n        list(mm.signatures())\n\n    assert \"Error while reading signatures from \" in str(exc)\n    assert \"foo/47.fa.sig'\" in str(exc)\n\n\ndef test_standalone_manifest_load_from_dir(runtmp):\n    # test loading a mf with relative directory paths from test-data\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n    idx = sourmash.load_file_as_index(mf)\n\n    siglist = list(idx.signatures())\n    assert len(siglist) == 15\n\n    assert idx  # should be 'True'\n    assert len(idx) == 15\n\n    with pytest.raises(NotImplementedError):\n        idx.insert()\n\n    with pytest.raises(NotImplementedError):\n        idx.save(\"foo\")\n\n    assert idx.location == mf\n\n\ndef test_standalone_manifest_lazy_load(runtmp):\n    # check that it's actually doing lazy loading\n    orig_sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47 = runtmp.output(\"47.fa.sig\")\n\n    # build an external manifest\n    shutil.copyfile(orig_sig47, sig47)\n\n    # this is an abspath to sig47\n    runtmp.sourmash(\"sig\", \"manifest\", sig47, \"-o\", \"mf.csv\")\n\n    # should work to get signatures:\n    idx = StandaloneManifestIndex.load(runtmp.output(\"mf.csv\"))\n\n    siglist = list(idx.signatures())\n    assert len(siglist) == 1\n\n    # now remove!\n    os.unlink(sig47)\n\n    # can still access manifest...\n    assert len(idx) == 1\n\n    # ...but we should get an error when we call signatures.\n    with pytest.raises(ValueError):\n        list(idx.signatures())\n\n    # but put it back, and all is forgiven. yay!\n    shutil.copyfile(orig_sig47, sig47)\n    x = list(idx.signatures())\n    assert len(x) == 1\n\n\ndef test_standalone_manifest_lazy_load_2_prefix(runtmp):\n    # check that it's actually doing lazy loading; supply explicit prefix\n    orig_sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47 = runtmp.output(\"47.fa.sig\")\n\n    # build an external manifest\n    # note, here use a relative path to 47.fa.sig; the manifest will contain\n    # just '47.fa.sig' as the location\n    shutil.copyfile(orig_sig47, sig47)\n    runtmp.sourmash(\"sig\", \"manifest\", \"47.fa.sig\", \"-o\", \"mf.csv\")\n\n    # should work to get signatures:\n    idx = StandaloneManifestIndex.load(\n        runtmp.output(\"mf.csv\"), prefix=runtmp.output(\"\")\n    )\n\n    siglist = list(idx.signatures())\n    assert len(siglist) == 1\n\n    # now remove!\n    os.unlink(sig47)\n\n    # can still access manifest...\n    assert len(idx) == 1\n\n    # ...but we should get an error when we call signatures.\n    with pytest.raises(ValueError):\n        list(idx.signatures())\n\n    # but put it back, and all is forgiven. yay!\n    shutil.copyfile(orig_sig47, sig47)\n    x = list(idx.signatures())\n    assert len(x) == 1\n\n\ndef test_standalone_manifest_search(runtmp):\n    # test a straight up 'search'\n    query_sig = utils.get_test_data(\"scaled/genome-s12.fa.gz.sig\")\n    mf = utils.get_test_data(\"scaled/mf.csv\")\n\n    runtmp.sourmash(\"search\", query_sig, mf)\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"100.0%       d84ef28f\" in out\n\n\ndef test_standalone_manifest_prefetch_lazy(runtmp):\n    # check that prefetch is actually doing lazy loading on manifest index.\n    orig_sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig47 = runtmp.output(\"47.fa.sig\")\n    orig_sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig2 = runtmp.output(\"2.fa.sig\")\n    orig_sig63 = utils.get_test_data(\"63.fa.sig\")\n    sig63 = runtmp.output(\"63.fa.sig\")\n\n    shutil.copyfile(orig_sig47, sig47)\n    runtmp.sourmash(\"sig\", \"manifest\", sig47, \"-o\", \"mf1.csv\")\n    shutil.copyfile(orig_sig2, sig2)\n    runtmp.sourmash(\"sig\", \"manifest\", sig2, \"-o\", \"mf2.csv\")\n    shutil.copyfile(orig_sig63, sig63)\n    runtmp.sourmash(\"sig\", \"manifest\", sig63, \"-o\", \"mf3.csv\")\n\n    # combine the manifests, manually for now...\n    mf1 = CollectionManifest.load_from_filename(runtmp.output(\"mf1.csv\"))\n    assert len(mf1) == 1\n\n    mf2 = CollectionManifest.load_from_filename(runtmp.output(\"mf2.csv\"))\n    assert len(mf2) == 3\n\n    mf3 = CollectionManifest.load_from_filename(runtmp.output(\"mf3.csv\"))\n    assert len(mf3) == 1\n\n    mf = mf1 + mf2 + mf3\n    assert len(mf) == 5\n\n    mf.write_to_filename(runtmp.output(\"mf.csv\"))\n\n    # ok! now, remove the last signature, 'sig63'.\n    os.unlink(sig63)\n\n    # ...but loading the manifest should still work.\n    idx = StandaloneManifestIndex.load(runtmp.output(\"mf.csv\"))\n\n    # double check - third load will fail. this relies on load order :shrug:.\n    sig_iter = iter(idx.signatures())\n    ss = next(sig_iter)\n    print(ss)\n    assert \"47.fa\" in ss.filename\n\n    for i in range(3):\n        ss = next(sig_iter)\n        print(i, ss)\n        assert \"2.fa\" in ss.filename\n\n    with pytest.raises(ValueError) as exc:\n        ss = next(sig_iter)\n    assert \"Error while reading signatures from\" in str(exc)\n    assert \"63.fa.sig\" in str(exc)\n\n    # ok! now test prefetch... should get one match legit, to 47,\n    # and then no matches to 2, and then error.\n\n    ss47 = load_one_signature_from_json(sig47)\n    idx = idx.select(ksize=31)\n    g = idx.prefetch(ss47, threshold_bp=0)\n\n    # first value:\n    sr = next(g)\n    assert sr.signature == ss47\n\n    # second value should raise error.\n    with pytest.raises(ValueError) as exc:\n        sr = next(g)\n\n    assert \"Error while reading signatures from\" in str(exc)\n    assert \"63.fa.sig\" in str(exc)\n"
  },
  {
    "path": "tests/test_index_protocol.py",
    "content": "\"\"\"\nTests for the 'Index' class and protocol. All Index classes should support\nthis functionality.\n\"\"\"\n\nimport pytest\nimport glob\n\nimport sourmash\nfrom sourmash import SourmashSignature\nfrom sourmash.index import (\n    LinearIndex,\n    ZipFileLinearIndex,\n    LazyLinearIndex,\n    MultiIndex,\n    StandaloneManifestIndex,\n    IndexSearchResult,\n)\nfrom sourmash.index import CounterGather\nfrom sourmash.index.sqlite_index import SqliteIndex\nfrom sourmash.index.revindex import MemRevIndex, DiskRevIndex\nfrom sourmash.sbt import SBT, GraphFactory\nfrom sourmash.manifest import CollectionManifest, BaseCollectionManifest\nfrom sourmash.lca.lca_db import LCA_Database, load_single_database\nfrom sourmash.minhash import flatten_and_intersect_scaled, flatten_and_downsample_scaled\nfrom sourmash.sourmash_args import load_one_signature\n\nimport sourmash_tst_utils as utils\n\n\ndef _load_three_sigs():\n    # utility function - load & return these three sigs.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature(sig2, ksize=31)\n    ss47 = load_one_signature(sig47)\n    ss63 = load_one_signature(sig63)\n\n    return [ss2, ss47, ss63]\n\n\ndef build_linear_index(runtmp):\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    lidx = LinearIndex()\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    return lidx\n\n\ndef build_lazy_linear_index(runtmp):\n    lidx = build_linear_index(runtmp)\n    return LazyLinearIndex(lidx)\n\n\ndef build_sbt_index(runtmp):\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    factory = GraphFactory(5, 100, 3)\n    root = SBT(factory, d=2)\n\n    root.insert(ss2)\n    root.insert(ss47)\n    root.insert(ss63)\n\n    return root\n\n\ndef build_sbt_index_save_load(runtmp):\n    root = build_sbt_index(runtmp)\n    out = runtmp.output(\"xyz.sbt.zip\")\n    root.save(out)\n\n    return sourmash.load_file_as_index(out)\n\n\ndef build_zipfile_index(runtmp):\n    from sourmash.save_load import SaveSignatures_ZipFile\n\n    location = runtmp.output(\"index.zip\")\n    with SaveSignatures_ZipFile(location) as save_sigs:\n        for ss in _load_three_sigs():\n            save_sigs.add(ss)\n\n    idx = ZipFileLinearIndex.load(location)\n    return idx\n\n\ndef build_multi_index(runtmp):\n    siglist = _load_three_sigs()\n    lidx = LinearIndex(siglist)\n\n    mi = MultiIndex.load([lidx], [None], None)\n    return mi\n\n\ndef build_standalone_manifest_index(runtmp):\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature(sig2, ksize=31)\n    ss47 = load_one_signature(sig47)\n    ss63 = load_one_signature(sig63)\n\n    siglist = [(ss2, sig2), (ss47, sig47), (ss63, sig63)]\n\n    rows = []\n    rows.extend((CollectionManifest.make_manifest_row(ss, loc) for ss, loc in siglist))\n    mf = CollectionManifest(rows)\n    mf_filename = runtmp.output(\"mf.csv\")\n\n    mf.write_to_filename(mf_filename)\n\n    idx = StandaloneManifestIndex.load(mf_filename)\n    return idx\n\n\ndef build_lca_index(runtmp):\n    siglist = _load_three_sigs()\n    db = LCA_Database(31, 1000, \"DNA\")\n    for ss in siglist:\n        db.insert(ss)\n\n    return db\n\n\ndef build_lca_index_save_load(runtmp):\n    db = build_lca_index(runtmp)\n    outfile = runtmp.output(\"db.lca.json\")\n    db.save(outfile)\n\n    return sourmash.load_file_as_index(outfile)\n\n\ndef build_sqlite_index(runtmp):\n    filename = runtmp.output(\"idx.sqldb\")\n    db = SqliteIndex.create(filename)\n\n    siglist = _load_three_sigs()\n    for ss in siglist:\n        db.insert(ss)\n\n    return db\n\n\ndef build_revindex(runtmp):\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    return lidx\n\n\ndef build_disk_revindex(runtmp):\n    dbpath = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    idx = DiskRevIndex(dbpath)\n    return idx\n\n\ndef build_lca_index_save_load_sql(runtmp):\n    db = build_lca_index(runtmp)\n    outfile = runtmp.output(\"db.lca.json\")\n    db.save(outfile, format=\"sql\")\n\n    x = load_single_database(outfile)\n    db_load = x[0]\n\n    return db_load\n\n\n#\n# create a fixture 'index_obj' that is parameterized by all of these\n# building functions.\n#\n\n\n@pytest.fixture(\n    params=[\n        build_linear_index,\n        build_lazy_linear_index,\n        build_sbt_index,\n        build_zipfile_index,\n        build_multi_index,\n        build_standalone_manifest_index,\n        build_lca_index,\n        build_sbt_index_save_load,\n        build_lca_index_save_load,\n        build_sqlite_index,\n        build_lca_index_save_load_sql,\n        build_revindex,\n        build_disk_revindex,\n    ]\n)\ndef index_obj(request, runtmp):\n    build_fn = request.param\n\n    # build on demand\n    return build_fn(runtmp)\n\n\n###\n### generic Index tests go here\n###\n\n\ndef test_index_search_exact_match(index_obj):\n    # search for an exact match\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    sr = index_obj.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0].signature.minhash == ss2.minhash\n    assert sr[0].score == 1.0\n\n\ndef test_index_search_lower_threshold(index_obj):\n    # search at a lower threshold/multiple results with ss47\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    sr = index_obj.search(ss47, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0].signature.minhash == ss47.minhash\n    assert sr[0].score == 1.0\n    assert sr[1].signature.minhash == ss63.minhash\n    assert round(sr[1].score, 2) == 0.32\n\n\ndef test_index_search_lower_threshold_2(index_obj):\n    # search at a lower threshold/multiple results with ss63\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    sr = index_obj.search(ss63, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0].signature.minhash == ss63.minhash\n    assert sr[0].score == 1.0\n    assert sr[1].signature.minhash == ss47.minhash\n    assert round(sr[1].score, 2) == 0.32\n\n\ndef test_index_search_higher_threshold_2(index_obj):\n    # search at a higher threshold/one match\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    # search for sig63 with high threshold => 1 match\n    sr = index_obj.search(ss63, threshold=0.8)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0].signature.minhash == ss63.minhash\n    assert sr[0].score == 1.0\n\n\ndef test_index_search_containment(index_obj):\n    # search for containment at a low threshold/multiple results with ss63\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    sr = index_obj.search(ss63, do_containment=True, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0].signature.minhash == ss63.minhash\n    assert sr[0].score == 1.0\n    assert sr[1].signature.minhash == ss47.minhash\n    assert round(sr[1].score, 2) == 0.48\n\n\ndef test_index_signatures(index_obj):\n    # signatures works?\n    siglist = list(index_obj.signatures())\n\n    ss2, ss47, ss63 = _load_three_sigs()\n    assert len(siglist) == 3\n\n    # check md5sums, since 'in' doesn't always work\n    md5s = set(ss.md5sum() for ss in siglist)\n    assert ss2.md5sum() in md5s\n    assert ss47.md5sum() in md5s\n    assert ss63.md5sum() in md5s\n\n\ndef test_index_signatures_with_location(index_obj):\n    # signatures_with_location works?\n    siglist = list(index_obj.signatures_with_location())\n\n    ss2, ss47, ss63 = _load_three_sigs()\n    assert len(siglist) == 3\n\n    # check md5sums, since 'in' doesn't always work\n    md5s = set((ss.md5sum() for ss, loc in siglist))\n    assert ss2.md5sum() in md5s\n    assert ss47.md5sum() in md5s\n    assert ss63.md5sum() in md5s\n\n\ndef test_index_len(index_obj):\n    # len works?\n    assert len(index_obj) == 3\n\n\ndef test_index_bool(index_obj):\n    # bool works?\n    assert bool(index_obj)\n\n\ndef test_index_location(index_obj):\n    # location works?\n    assert str(index_obj.location)\n\n\ndef test_index_manifest(index_obj):\n    # manifest is either None or a BaseCollectionManifest\n    manifest = index_obj.manifest\n    if manifest is not None:\n        assert isinstance(manifest, BaseCollectionManifest)\n\n\ndef test_index_select_basic(index_obj):\n    # select does the basic thing ok\n    idx = index_obj.select(\n        ksize=31,\n        moltype=\"DNA\",\n        abund=False,\n        containment=True,\n        scaled=1000,\n        num=0,\n        picklist=None,\n    )\n\n    assert len(idx) == 3\n    siglist = list(idx.signatures())\n    assert len(siglist) == 3\n\n    # check md5sums, since 'in' doesn't always work\n    md5s = set(ss.md5sum() for ss in siglist)\n    ss2, ss47, ss63 = _load_three_sigs()\n    assert ss2.md5sum() in md5s\n    assert ss47.md5sum() in md5s\n    assert ss63.md5sum() in md5s\n\n\ndef test_index_select_fail(index_obj):\n    # non-int ksize - str\n    with pytest.raises(ValueError):\n        index_obj.select(ksize=\"31\")\n\n    # non-int ksize - float\n    with pytest.raises(ValueError):\n        index_obj.select(ksize=31.1)\n\n    # case sensitive moltype\n    with pytest.raises(ValueError):\n        index_obj.select(moltype=\"dna\")\n\n    # unknown moltype\n    with pytest.raises(ValueError):\n        index_obj.select(moltype=\"foo\")\n\n    # non-int scaled\n    with pytest.raises(ValueError):\n        index_obj.select(scaled=1000.1)\n\n    # non-int num\n    with pytest.raises(ValueError):\n        index_obj.select(num=1000.1)\n\n    # non-bool abund\n    with pytest.raises(ValueError):\n        index_obj.select(abund=1)\n\n    # extra parameters\n    with pytest.raises(ValueError):\n        index_obj.select(plausible_extra_parameter=5)\n\n\ndef test_index_select_nada(index_obj):\n    # select works ok when nothing matches!\n\n    # CTB: currently this EITHER raises a ValueError OR returns an empty\n    # Index object, depending on implementation. :think:\n    # See: https://github.com/sourmash-bio/sourmash/issues/1940\n    try:\n        idx = index_obj.select(ksize=21)\n    except ValueError:\n        idx = LinearIndex([])\n\n    assert len(idx) == 0\n    siglist = list(idx.signatures())\n    assert len(siglist) == 0\n\n\ndef test_index_prefetch(index_obj):\n    # test basic prefetch\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    # search for ss2\n    results = []\n    for result in index_obj.prefetch(ss2, threshold_bp=0):\n        results.append(result)\n\n    assert len(results) == 1\n    assert results[0].signature.minhash == ss2.minhash\n\n    # search for ss47 - expect two results\n    results = []\n    for result in index_obj.prefetch(ss47, threshold_bp=0):\n        results.append(result)\n\n    assert len(results) == 2\n    assert results[0].signature.minhash == ss47.minhash\n    assert results[1].signature.minhash == ss63.minhash\n\n\ndef test_index_best_containment(index_obj):\n    # test basic containment search\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    match = index_obj.best_containment(ss2)\n    assert match\n    assert match.score == 1.0\n    assert match.signature.minhash == ss2.minhash\n\n    match = index_obj.best_containment(ss47)\n    assert match\n    assert match.score == 1.0\n    assert match.signature.minhash == ss47.minhash\n\n\ndef test_index_best_containment_threshold_1(index_obj):\n    # test best_containment() method, in some detail\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(ss2.minhash.hashes))\n    new_mh = ss2.minhash.copy_and_clear()\n\n    # query with empty hashes\n    assert not new_mh\n    with pytest.raises(ValueError):\n        index_obj.best_containment(SourmashSignature(new_mh))\n\n    # add one hash\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 1\n\n    result = index_obj.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == ss2.minhash\n\n    # check with a threshold -> should be no results.\n    with pytest.raises(ValueError):\n        index_obj.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n    # add three more hashes => length of 4\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 4\n\n    result = index_obj.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == ss2.minhash\n\n    # check with a too-high threshold -> should be no results.\n    with pytest.raises(ValueError):\n        index_obj.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n\ndef test_best_containment_threshold_5(index_obj):\n    # test gather() method, in some detail\n    ss2, ss47, ss63 = _load_three_sigs()\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(ss2.minhash.hashes.keys()))\n    new_mh = ss2.minhash.copy_and_clear()\n\n    # add five hashes\n    for i in range(5):\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n\n    # should get a result with no threshold (any match at all is returned)\n    result = index_obj.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == ss2.minhash\n\n    # now, check with a threshold_bp that should be meet-able.\n    result = index_obj.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == ss2.minhash\n\n\n###\n### CounterGather tests\n###\n\n\ndef create_basic_counter_gather(runtmp):\n    \"Construct a CounterGather class.\"\n    return CounterGather\n\n\nclass CounterGather_LinearIndex:\n    \"\"\"\n    Provides an (inefficient) CounterGather-style class, for\n    protocol testing purposes.\n    \"\"\"\n\n    def __init__(self, orig_query):\n        \"Constructor - take a SourmashSignature that is the original query.\"\n        orig_query_mh = orig_query.minhash\n        if orig_query_mh.scaled == 0:\n            raise ValueError\n\n        # Index object used to actually track matches.\n        self.idx = LinearIndex()\n        self.orig_query_mh = orig_query_mh.copy().flatten()\n        self.query_started = 0\n        self.scaled = orig_query_mh.scaled\n        self.locations = {}\n\n    def add(self, ss, *, location=None, require_overlap=True):\n        \"Insert potential match.\"\n        if self.query_started:\n            raise ValueError(\"cannot add more signatures to counter after peek/consume\")\n\n        # skip duplicates\n        md5 = ss.md5sum()\n        if md5 in self.locations:\n            return\n\n        # confirm that this match has an overlap...\n        add_mh = ss.minhash.flatten()\n        overlap = self.orig_query_mh.count_common(add_mh, downsample=True)\n\n        # ...figure out what scaled we are operating at now...\n        if overlap:\n            self.downsample(add_mh.scaled)\n        elif require_overlap:\n            raise ValueError(\"no overlap between query and signature!?\")\n\n        # ...and add to the Index, while also tracking location!\n        self.idx.insert(ss)\n        self.locations[md5] = location\n\n    def signatures(self):\n        \"Yield all signatures\"\n        return self.idx.signatures()\n\n    def downsample(self, scaled):\n        \"Track highest scaled across all possible matches.\"\n        if scaled > self.scaled:\n            self.scaled = scaled\n        return self.scaled\n\n    def peek(self, cur_query_mh, *, threshold_bp=0):\n        \"\"\"\n        Find best match to current query within this CounterGather object.\n        \"\"\"\n        self.query_started = 1\n\n        scaled = self.downsample(cur_query_mh.scaled)\n        cur_query_mh = flatten_and_downsample_scaled(cur_query_mh, scaled)\n\n        # no hashes remaining? exit.\n        if not self.orig_query_mh or not cur_query_mh:\n            return []\n\n        # verify current query is a subset of the original.\n        if cur_query_mh.contained_by(self.orig_query_mh, downsample=True) < 1:\n            raise ValueError(\"current query not a subset of original query\")\n\n        # did we get a match?\n        res = self.idx.peek(cur_query_mh, threshold_bp=threshold_bp)\n        if not res:\n            return []\n        sr, intersect_mh = res\n\n        # got match - replace location & return.\n        match = sr.signature\n        md5 = match.md5sum()\n        location = self.locations[md5]\n        return IndexSearchResult(sr.score, match, location), intersect_mh\n\n    def consume(self, *args, **kwargs):\n        self.query_started = 1\n        return self.idx.consume(*args, **kwargs)\n\n\nclass CounterGather_LCA:\n    \"\"\"\n    Provides an alternative implementation of a CounterGather-style class,\n    based on LCA_Database. This is currently just for protocol\n    and API testing purposes.\n    \"\"\"\n\n    def __init__(self, query):\n        from sourmash.lca.lca_db import LCA_Database\n\n        query_mh = query.minhash\n        if query_mh.scaled == 0:\n            raise ValueError(\"must use scaled MinHash\")\n\n        self.orig_query_mh = query_mh\n        lca_db = LCA_Database(query_mh.ksize, query_mh.scaled, query_mh.moltype)\n        self.db = lca_db\n        self.siglist = {}\n        self.locations = {}\n        self.query_started = 0\n\n    def add(self, ss, *, location=None, require_overlap=True):\n        \"Add this signature into the counter.\"\n        if self.query_started:\n            raise ValueError(\"cannot add more signatures to counter after peek/consume\")\n\n        overlap = self.orig_query_mh.count_common(ss.minhash, True)\n        if overlap:\n            self.downsample(ss.minhash.scaled)\n        elif require_overlap:\n            raise ValueError(\"no overlap between query and signature!?\")\n\n        self.db.insert(ss)\n\n        md5 = ss.md5sum()\n        self.siglist[md5] = ss\n        self.locations[md5] = location\n\n    def signatures(self):\n        \"Yield all signatures.\"\n        yield from self.siglist.values()\n\n    def downsample(self, scaled):\n        \"Track highest scaled across all possible matches.\"\n        if scaled > self.db.scaled:\n            self.db.downsample_scaled(scaled)\n        return self.db.scaled\n\n    def peek(self, query_mh, *, threshold_bp=0):\n        \"Return next possible match.\"\n        from sourmash import SourmashSignature\n\n        self.query_started = 1\n        scaled = self.downsample(query_mh.scaled)\n        query_mh = query_mh.downsample(scaled=scaled)\n\n        if not self.orig_query_mh or not query_mh:\n            return []\n\n        if query_mh.contained_by(self.orig_query_mh, downsample=True) < 1:\n            raise ValueError(\"current query not a subset of original query\")\n\n        query_ss = SourmashSignature(query_mh)\n\n        # returns search_result, intersect_mh\n        try:\n            result = self.db.best_containment(query_ss, threshold_bp=threshold_bp)\n        except ValueError:\n            result = None\n\n        if not result:\n            return []\n\n        cont = result.score\n        match = result.signature\n\n        intersect_mh = flatten_and_intersect_scaled(result.signature.minhash, query_mh)\n\n        md5 = result.signature.md5sum()\n        location = self.locations[md5]\n\n        new_sr = IndexSearchResult(cont, match, location)\n        return new_sr, intersect_mh\n\n    def consume(self, intersect_mh):\n        self.query_started = 1\n\n\ndef build_RevIndex_CounterGather(query):\n    from sourmash.index.revindex import RevIndex_CounterGather\n\n    ri = MemRevIndex(template=query.minhash)\n    cg = RevIndex_CounterGather(query, ri, 0, allow_insert=True)\n    return cg\n\n\n@pytest.fixture(\n    params=[\n        CounterGather,\n        CounterGather_LinearIndex,\n        CounterGather_LCA,\n        build_RevIndex_CounterGather,\n    ]\n)\ndef counter_gather_constructor(request):\n    build_fn = request.param\n\n    # build on demand\n    return build_fn\n\n\ndef test_counter_get_signatures(counter_gather_constructor):\n    # test .signatures() method\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(10, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(15, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    siglist = list(counter.signatures())\n    assert len(siglist) == 3\n    assert match_ss_1 in siglist\n    assert match_ss_2 in siglist\n    assert match_ss_3 in siglist\n\n\n# utility function to exhaust a CounterGather set of matches\ndef _consume_all(query_mh, counter, threshold_bp=0):\n    results = []\n    query_mh = query_mh.to_mutable()\n\n    last_intersect_size = None\n    while 1:\n        result = counter.peek(query_mh, threshold_bp=threshold_bp)\n        if not result:\n            break\n\n        sr, intersect_mh = result\n        print(sr.signature.name, len(intersect_mh))\n        if last_intersect_size:\n            assert len(intersect_mh) <= last_intersect_size\n\n        last_intersect_size = len(intersect_mh)\n\n        counter.consume(intersect_mh)\n        query_mh.remove_many(intersect_mh.hashes)\n\n        results.append((sr, len(intersect_mh)))\n\n    return results\n\n\ndef test_counter_gather_1(counter_gather_constructor):\n    # check a contrived set of non-overlapping gather results,\n    # generated via CounterGather\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(10, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(15, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    results = _consume_all(query_ss.minhash, counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_b(counter_gather_constructor):\n    # check a contrived set of somewhat-overlapping gather results,\n    # generated via CounterGather. Here the overlaps are structured\n    # so that the gather results are the same as those in\n    # test_counter_gather_1(), even though the overlaps themselves are\n    # larger.\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    results = _consume_all(query_ss.minhash, counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_c_with_threshold(counter_gather_constructor):\n    # check a contrived set of somewhat-overlapping gather results,\n    # generated via CounterGather. Here the overlaps are structured\n    # so that the gather results are the same as those in\n    # test_counter_gather_1(), even though the overlaps themselves are\n    # larger.\n    # use a threshold, here.\n\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    results = _consume_all(query_ss.minhash, counter, threshold_bp=3)\n\n    expected = ([\"match1\", 10], [\"match2\", 5])\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_d_diff_scaled(counter_gather_constructor):\n    # test as above, but with different scaled.\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear().downsample(scaled=10)\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear().downsample(scaled=20)\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear().downsample(scaled=30)\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    results = _consume_all(query_ss.minhash, counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_d_diff_scaled_query(counter_gather_constructor):\n    # test as above, but with different scaled for QUERY.\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n\n    match_mh_1 = query_mh.copy_and_clear().downsample(scaled=10)\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear().downsample(scaled=20)\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear().downsample(scaled=30)\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # downsample query now -\n    query_ss = SourmashSignature(query_mh.downsample(scaled=100), name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    results = _consume_all(query_ss.minhash, counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_e_abund_query(counter_gather_constructor):\n    # test as above, but abund query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1, track_abundance=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear().flatten()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear().flatten()\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear().flatten()\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    # must flatten before peek!\n    results = _consume_all(query_ss.minhash.flatten(), counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_1_f_abund_match(counter_gather_constructor):\n    # test as above, but abund query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1, track_abundance=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh.flatten(), name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    match_mh_2 = query_mh.copy_and_clear()\n    match_mh_2.add_many(range(7, 15))\n    match_ss_2 = SourmashSignature(match_mh_2, name=\"match2\")\n\n    match_mh_3 = query_mh.copy_and_clear()\n    match_mh_3.add_many(range(13, 17))\n    match_ss_3 = SourmashSignature(match_mh_3, name=\"match3\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n    counter.add(match_ss_2)\n    counter.add(match_ss_3)\n\n    # must flatten before peek!\n    results = _consume_all(query_ss.minhash.flatten(), counter)\n\n    expected = (\n        [\"match1\", 10],\n        [\"match2\", 5],\n        [\"match3\", 2],\n    )\n    assert len(results) == len(expected), results\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_2(counter_gather_constructor):\n    # check basic set of gather results on semi-real data,\n    # generated via CounterGather\n    testdata_combined = utils.get_test_data(\"gather/combined.sig\")\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_ss = load_one_signature(testdata_combined, ksize=21)\n    subject_sigs = [(load_one_signature(t, ksize=21), t) for t in testdata_sigs]\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    for ss, loc in subject_sigs:\n        counter.add(ss, location=loc)\n\n    results = _consume_all(query_ss.minhash, counter)\n\n    expected = (\n        [\"NC_003198.1\", 487],\n        [\"NC_000853.1\", 192],\n        [\"NC_011978.1\", 169],\n        [\"NC_002163.1\", 157],\n        [\"NC_003197.2\", 152],\n        [\"NC_009486.1\", 92],\n        [\"NC_006905.1\", 76],\n        [\"NC_011080.1\", 59],\n        [\"NC_011274.1\", 42],\n        [\"NC_006511.1\", 31],\n        [\"NC_011294.1\", 7],\n        [\"NC_004631.1\", 2],\n    )\n    assert len(results) == len(expected)\n\n    for (sr, size), (exp_name, exp_size) in zip(results, expected):\n        sr_name = sr.signature.name.split()[0]\n        print(sr_name, size)\n\n        assert sr_name == exp_name\n        assert size == exp_size\n\n\ndef test_counter_gather_exact_match(counter_gather_constructor):\n    # query == match\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter; provide a location override, too.\n    counter = counter_gather_constructor(query_ss)\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    results = _consume_all(query_ss.minhash, counter)\n    assert len(results) == 1\n    (sr, intersect_mh) = results[0]\n\n    assert sr.score == 1.0\n    assert sr.signature == query_ss\n    assert sr.location == \"somewhere over the rainbow\"\n\n\ndef test_counter_gather_multiple_identical_matches(counter_gather_constructor):\n    # test multiple identical matches being inserted, with only one return\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # create counter...\n    counter = counter_gather_constructor(query_ss)\n\n    # now add multiple identical matches.\n    match_mh = query_mh.copy_and_clear()\n    match_mh.add_many(range(5, 15))\n\n    for name in \"match1\", \"match2\", \"match3\":\n        match_ss = SourmashSignature(match_mh, name=name)\n        counter.add(match_ss, location=name)\n\n    results = _consume_all(query_ss.minhash, counter)\n    assert len(results) == 1\n\n    sr, overlap_count = results[0]\n    print(sr, overlap_count)\n    assert sr.score == 0.5, sr\n    assert overlap_count == 10\n\n    # any one of the three is valid\n    assert sr.location in (\"match1\", \"match2\", \"match3\")\n\n\ndef test_counter_gather_add_after_peek(counter_gather_constructor):\n    # cannot add after peek or consume\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    counter.peek(query_ss.minhash)\n\n    with pytest.raises(ValueError):\n        counter.add(query_ss, location=\"try again\")\n\n\ndef test_counter_gather_add_after_consume(counter_gather_constructor):\n    # cannot add after peek or consume\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter\n    print(\"create\")\n    counter = counter_gather_constructor(query_ss)\n    print(\"insert\")\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    counter.consume(query_ss.minhash)\n\n    with pytest.raises(ValueError):\n        counter.add(query_ss, location=\"try again\")\n\n\ndef test_counter_gather_consume_empty_intersect(counter_gather_constructor):\n    # check that consume works fine when there is an empty signature.\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    # nothing really happens here :laugh:, just making sure there's no error\n    counter.consume(query_ss.minhash.copy_and_clear())\n\n\ndef test_counter_gather_empty_initial_query(counter_gather_constructor):\n    # check empty initial query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1, require_overlap=False)\n\n    assert counter.peek(query_ss.minhash) == []\n\n\ndef test_counter_gather_num_query(counter_gather_constructor):\n    # check num query\n    query_mh = sourmash.MinHash(n=500, ksize=31)\n    query_mh.add_many(range(0, 10))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    with pytest.raises(ValueError):\n        counter_gather_constructor(query_ss)\n\n\ndef test_counter_gather_empty_cur_query(counter_gather_constructor):\n    # test empty cur query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    cur_query_mh = query_ss.minhash.copy_and_clear()\n    results = _consume_all(cur_query_mh, counter)\n    assert results == []\n\n\ndef test_counter_gather_add_num_matchy(counter_gather_constructor):\n    # test add num query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh = sourmash.MinHash(n=500, ksize=31)\n    match_mh.add_many(range(0, 20))\n    match_ss = SourmashSignature(match_mh, name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    with pytest.raises(ValueError):\n        counter.add(match_ss, location=\"somewhere over the rainbow\")\n\n\ndef test_counter_gather_bad_cur_query(counter_gather_constructor):\n    # test cur query that is not subset of original query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(query_ss, location=\"somewhere over the rainbow\")\n\n    cur_query_mh = query_ss.minhash.copy_and_clear()\n    cur_query_mh.add_many(range(20, 30))\n    with pytest.raises(ValueError):\n        counter.peek(cur_query_mh)\n\n\ndef test_counter_gather_add_no_overlap(counter_gather_constructor):\n    # check adding match with no overlap w/query\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 10))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(10, 20))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    with pytest.raises(ValueError):\n        counter.add(match_ss_1)\n\n    assert counter.peek(query_ss.minhash) == []\n\n\ndef test_counter_gather_big_threshold(counter_gather_constructor):\n    # check 'peek' with a huge threshold\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_mh.add_many(range(0, 20))\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    match_mh_1 = query_mh.copy_and_clear()\n    match_mh_1.add_many(range(0, 10))\n    match_ss_1 = SourmashSignature(match_mh_1, name=\"match1\")\n\n    # load up the counter\n    counter = counter_gather_constructor(query_ss)\n    counter.add(match_ss_1)\n\n    # impossible threshold:\n    threshold_bp = 30 * query_ss.minhash.scaled\n    results = counter.peek(query_ss.minhash, threshold_bp=threshold_bp)\n    assert results == []\n\n\ndef test_counter_gather_empty_counter(counter_gather_constructor):\n    # check empty counter\n    query_mh = sourmash.MinHash(n=0, ksize=31, scaled=1)\n    query_ss = SourmashSignature(query_mh, name=\"query\")\n\n    # empty counter!\n    counter = counter_gather_constructor(query_ss)\n\n    assert counter.peek(query_ss.minhash) == []\n"
  },
  {
    "path": "tests/test_jaccard.py",
    "content": "\"\"\"\nLegacy tests from when there were Estimator objects and not just MinHash\nobjects.\n\"\"\"\n\nimport pytest\nfrom sourmash import MinHash\nfrom sourmash.signature import load_signatures_from_json\n\nimport sourmash_tst_utils as utils\n\n# below, 'track_abundance' is toggled to both True and False by py.test --\n# see conftest.py.\n\n\ndef test_jaccard_1(track_abundance):\n    E1 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n    E2 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n\n    for i in [1, 2, 3, 4, 5]:\n        E1.add_hash(i)\n    for i in [1, 2, 3, 4, 6]:\n        E2.add_hash(i)\n\n    # here the union is [1, 2, 3, 4, 5]\n    # and the intersection is [1, 2, 3, 4] => 4/5.\n\n    assert round(E1.jaccard(E2), 2) == round(4 / 5.0, 2)\n    assert round(E2.jaccard(E1), 2) == round(4 / 5.0, 2)\n\n\ndef test_jaccard_2_difflen(track_abundance):\n    E1 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n    E2 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n\n    for i in [1, 2, 3, 4, 5]:\n        E1.add_hash(i)\n    for i in [1, 2, 3, 4]:\n        E2.add_hash(i)\n\n    print(E1.jaccard(E2))\n    assert round(E1.jaccard(E2), 2) == 4 / 5.0\n    assert round(E2.jaccard(E1), 2) == 4 / 5.0\n\n\ndef test_common_1(track_abundance):\n    E1 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n    E2 = MinHash(n=5, ksize=20, track_abundance=track_abundance)\n\n    for i in [1, 2, 3, 4, 5]:\n        E1.add_hash(i)\n    for i in [1, 2, 3, 4, 6]:\n        E2.add_hash(i)\n\n    assert E1.count_common(E2) == 4\n    assert E2.count_common(E1) == 4\n\n\ndef test_diff_seed(track_abundance):\n    E1 = MinHash(n=5, ksize=20, track_abundance=track_abundance, seed=1)\n    E2 = MinHash(n=5, ksize=20, track_abundance=track_abundance, seed=2)\n\n    for i in [1, 2, 3, 4, 5]:\n        E1.add_hash(i)\n    for i in [1, 2, 3, 4, 6]:\n        E2.add_hash(i)\n\n    with pytest.raises(ValueError):\n        E1.count_common(E2)\n\n\ndef test_dna_mh(track_abundance):\n    e1 = MinHash(n=5, ksize=4, track_abundance=track_abundance)\n    e2 = MinHash(n=5, ksize=4, track_abundance=track_abundance)\n\n    seq = \"ATGGCAGTGACGATGCCAG\"\n    e1.add_sequence(seq)\n    for i in range(len(seq) - 3):\n        e2.add_kmer(seq[i : i + 4])\n\n    assert e1.hashes.keys() == e2.hashes.keys()\n    print(e1.hashes.keys())\n    assert 726311917625663847 in e1.hashes.keys()\n    assert 3697418565283905118 in e1.hashes.keys()\n\n\ndef test_protein_mh(track_abundance):\n    e1 = MinHash(n=5, ksize=2, is_protein=True, track_abundance=track_abundance)\n    e2 = MinHash(n=5, ksize=2, is_protein=True, track_abundance=track_abundance)\n\n    # ok, so this is confusing, but: we are adding _DNA_ kmers here,\n    # and translating. so, add_sequence and add_kmer actually both add\n    # 6-mers.\n    seq = \"ATGGCAGTGACGATGCCG\"\n    e1.add_sequence(seq)\n\n    for i in range(len(seq) - 5):\n        kmer = seq[i : i + 6]\n        e2.add_kmer(kmer)\n\n    assert e1.hashes.keys() == e2.hashes.keys()\n    assert 901193879228338100 in e1.hashes.keys()\n\n\ndef test_pickle(track_abundance):\n    import pickle\n    from io import BytesIO\n\n    e1 = MinHash(n=5, ksize=6, is_protein=False, track_abundance=track_abundance)\n\n    seq = \"ATGGCAGTGACGATGCCG\"\n    e1.add_sequence(seq)\n    e1.add_sequence(seq)\n\n    fp = BytesIO()\n    pickle.dump(e1, fp)\n\n    fp2 = BytesIO(fp.getvalue())\n    e2 = pickle.load(fp2)\n\n    assert e1.hashes == e2.hashes\n    assert e1.num == e2.num\n    assert e1.ksize == e2.ksize\n    assert e1.is_protein == e2.is_protein\n    assert e1.scaled == e2.scaled\n    assert e1.scaled == 0\n    assert e1.seed == e2.seed\n\n\ndef test_bad_construct_1(track_abundance):\n    try:\n        MinHash(ksize=6, is_protein=False, track_abundance=track_abundance)\n        assert 0, \"require n in constructor\"\n    except TypeError:\n        pass\n\n\ndef test_bad_construct_2(track_abundance):\n    try:\n        MinHash(n=100, is_protein=False, track_abundance=track_abundance)\n        assert 0, \"require ksize in constructor\"\n    except TypeError:\n        pass\n\n\ndef test_abund_similarity():\n    E1 = MinHash(n=5, ksize=20, track_abundance=True)\n    E2 = MinHash(n=5, ksize=20, track_abundance=True)\n\n    for i in [1]:\n        E1.add_hash(i)\n    for i in [1, 2]:\n        E2.add_hash(i)\n\n    assert round(E1.similarity(E1)) == 1.0\n    assert round(E1.similarity(E2), 2) == 0.5\n\n    assert round(E1.similarity(E1, ignore_abundance=True)) == 1.0\n    assert round(E1.similarity(E2, ignore_abundance=True), 2) == 0.5\n\n\ndef test_abund_similarity_zero():\n    E1 = MinHash(n=5, ksize=20, track_abundance=True)\n    E2 = MinHash(n=5, ksize=20, track_abundance=True)\n\n    for i in [1]:\n        E1.add_hash(i)\n\n    assert E1.similarity(E2) == 0.0\n\n\n####\n\n\ndef test_jaccard_on_real_data():\n    afile = \"n10000/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    a = utils.get_test_data(afile)\n    sig1 = list(load_signatures_from_json(a))[0]\n    mh1 = sig1.minhash\n\n    bfile = \"n10000/GCF_000006945.1_ASM694v1_genomic.fna.gz.sig.gz\"\n    b = utils.get_test_data(bfile)\n    sig2 = list(load_signatures_from_json(b))[0]\n    mh2 = sig2.minhash\n\n    assert mh1.similarity(mh2) == 0.0183\n    assert mh2.similarity(mh1) == 0.0183\n\n    mh1 = mh1.downsample(num=1000)\n    mh2 = mh2.downsample(num=1000)\n    assert mh1.similarity(mh2) == 0.011\n    assert mh2.similarity(mh1) == 0.011\n\n    mh1 = mh1.downsample(num=100)\n    mh2 = mh2.downsample(num=100)\n    assert mh1.similarity(mh2) == 0.01\n    assert mh2.similarity(mh1) == 0.01\n\n    mh1 = mh1.downsample(num=10)\n    mh2 = mh2.downsample(num=10)\n    assert mh1.similarity(mh2) == 0.0\n    assert mh2.similarity(mh1) == 0.0\n\n\ndef test_scaled_on_real_data():\n    afile = \"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    a = utils.get_test_data(afile)\n    sig1 = list(load_signatures_from_json(a))[0]\n    mh1 = sig1.minhash\n\n    bfile = \"scaled100/GCF_000006945.1_ASM694v1_genomic.fna.gz.sig.gz\"\n    b = utils.get_test_data(bfile)\n    sig2 = list(load_signatures_from_json(b))[0]\n    mh2 = sig2.minhash\n\n    assert round(mh1.similarity(mh2), 5) == 0.01644\n    assert round(mh2.similarity(mh1), 5) == 0.01644\n\n    mh1 = mh1.downsample(scaled=100)\n    mh2 = mh2.downsample(scaled=100)\n    assert round(mh1.similarity(mh2), 5) == 0.01644\n    assert round(mh2.similarity(mh1), 5) == 0.01644\n\n    mh1 = mh1.downsample(scaled=1000)\n    mh2 = mh2.downsample(scaled=1000)\n    assert round(mh1.similarity(mh2), 5) == 0.01874\n    assert round(mh2.similarity(mh1), 5) == 0.01874\n\n    mh1 = mh1.downsample(scaled=10000)\n    mh2 = mh2.downsample(scaled=10000)\n\n    assert mh1.similarity(mh2) == 0.01\n    assert mh2.similarity(mh1) == 0.01\n\n\ndef test_scaled_on_real_data_2():\n    afile = \"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    a = utils.get_test_data(afile)\n    sig1 = list(load_signatures_from_json(a))[0]\n    mh1 = sig1.minhash\n\n    bfile = \"scaled100/GCF_000006945.1_ASM694v1_genomic.fna.gz.sig.gz\"\n    b = utils.get_test_data(bfile)\n    sig2 = list(load_signatures_from_json(b))[0]\n    mh2 = sig2.minhash\n\n    assert round(mh1.similarity(mh2), 5) == 0.01644\n    assert round(mh2.similarity(mh1), 5) == 0.01644\n\n    mh1 = mh1.downsample(scaled=1000)\n    mh2 = mh2.downsample(scaled=1000)\n\n    assert round(mh1.similarity(mh2), 4) == 0.0187\n    assert round(mh2.similarity(mh1), 4) == 0.0187\n\n    mh1 = mh1.downsample(scaled=10000)\n    mh2 = mh2.downsample(scaled=10000)\n    assert round(mh1.similarity(mh2), 3) == 0.01\n    assert round(mh2.similarity(mh1), 3) == 0.01\n\n    mh1 = mh1.downsample(scaled=100000)\n    mh2 = mh2.downsample(scaled=100000)\n    assert round(mh1.similarity(mh2), 2) == 0.01\n    assert round(mh2.similarity(mh1), 2) == 0.01\n\n\ndef test_downsample_scaled_with_num():\n    afile = \"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    a = utils.get_test_data(afile)\n    sig1 = list(load_signatures_from_json(a))[0]\n    mh1 = sig1.minhash\n\n    with pytest.raises(ValueError) as exc:\n        mh1.downsample(num=500)\n\n    assert \"cannot downsample a scaled MinHash using num\" in str(exc.value)\n"
  },
  {
    "path": "tests/test_lca.py",
    "content": "\"\"\"\nTests for the 'sourmash lca' command line and high level API.\n\"\"\"\n\nimport os\nimport shutil\nimport csv\nimport pytest\nimport glob\nfrom pathlib import Path\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash import SourmashSignature, sourmash_args\nfrom sourmash.signature import save_signatures_to_json, load_one_signature_from_json\n\nfrom sourmash.search import make_jaccard_search_query\nfrom sourmash.lca import lca_utils\nfrom sourmash.lca.lca_utils import LineagePair\nfrom sourmash.picklist import SignaturePicklist, PickStyle\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n\ndef test_api_create_search():\n    # create a database and then search for result.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    assert len(lca_db) == 0\n    assert not lca_db\n\n    count = lca_db.insert(ss)\n    assert count == len(ss.minhash)\n\n    assert len(lca_db) == 1\n    assert lca_db\n\n    results = lca_db.search(ss, threshold=0.0)\n    print(results)\n    assert len(results) == 1\n    (similarity, match, filename) = results[0]\n    assert match.minhash == ss.minhash\n\n\ndef test_api_find_picklist_select():\n    # does 'find' respect picklists?\n\n    sig47 = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(sig47)\n    lca_db.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"09a08691\"])\n\n    # run a 'find' with sig63, should find 47 and 63 both.\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.0)\n    results = list(lca_db.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 2\n\n    # now, select on picklist and do another find...\n    lca_db = lca_db.select(picklist=picklist)\n    results = list(lca_db.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 1\n\n    # and check that it is the expected one!\n    ss = results[0].signature\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"09a08691c\")\n\n\ndef test_api_find_picklist_select_exclude():\n    # does 'find' respect picklists?\n\n    sig47 = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(sig47)\n    lca_db.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"09a08691\"])\n\n    # run a 'find' with sig63, should find 47 and 63 both.\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.0)\n    results = list(lca_db.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 2\n\n    # now, select on picklist and do another find...\n    lca_db = lca_db.select(picklist=picklist)\n    results = list(lca_db.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 1\n\n    # and check that it is the expected one!\n    ss = results[0].signature\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"38729c637\")\n\n\ndef test_api_create_insert():\n    # test some internal implementation stuff: create & then insert a sig.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n\n    ident = ss.name\n    assert len(lca_db._ident_to_name) == 1\n    assert ident in lca_db._ident_to_name\n    assert lca_db._ident_to_name[ident] == ident\n    assert len(lca_db._ident_to_idx) == 1\n    assert lca_db._ident_to_idx[ident] == 0\n    assert len(lca_db._hashval_to_idx) == len(ss.minhash)\n    assert len(lca_db._idx_to_ident) == 1\n    assert lca_db._idx_to_ident[0] == ident\n\n    set_of_values = set()\n    for vv in lca_db._hashval_to_idx.values():\n        set_of_values.update(vv)\n    assert len(set_of_values) == 1\n    assert set_of_values == {0}\n\n    assert not lca_db._idx_to_lid  # no lineage added\n    assert not lca_db._lid_to_lineage  # no lineage added\n\n\ndef test_api_create_insert_bad_ksize():\n    # can we insert a ksize=21 signature into a ksize=31 DB? hopefully not.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=21, scaled=1000)\n    with pytest.raises(ValueError):\n        lca_db.insert(ss)\n\n\ndef test_api_create_insert_bad_ident():\n    # can we insert a signature with no/empty ident?\n    ss1 = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n    ss1 = ss1.to_mutable()\n    ss2 = ss2.to_mutable()\n\n    ss1.name = \"\"\n    ss1.filename = \"\"\n    ss2.name = \"\"\n    ss2.filename = \"\"\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss1)\n    lca_db.insert(ss2)\n    # SUCCESS!\n    # would fail, previously :)\n\n\ndef test_api_create_insert_bad_scaled():\n    # can we insert a scaled=1000 signature into a scaled=500 DB?\n    # hopefully not.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    assert ss.minhash.scaled == 1000\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=500)\n    with pytest.raises(ValueError):\n        lca_db.insert(ss)\n\n\ndef test_api_create_insert_bad_moltype():\n    # can we insert a DNAsignature into a protein DB?\n    # hopefully not.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    assert ss.minhash.moltype == \"DNA\"\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=500, moltype=\"protein\")\n    with pytest.raises(ValueError):\n        lca_db.insert(ss)\n\n\ndef test_api_create_insert_ident():\n    # test some internal implementation stuff: signature inserted with\n    # different ident than name.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss, ident=\"foo\")\n\n    ident = \"foo\"\n    assert len(lca_db._ident_to_name) == 1\n    assert ident in lca_db._ident_to_name\n    assert lca_db._ident_to_name[ident] == ss.name\n    assert len(lca_db._ident_to_idx) == 1\n    assert lca_db._ident_to_idx[ident] == 0\n    assert len(lca_db._hashval_to_idx) == len(ss.minhash)\n    assert len(lca_db._idx_to_ident) == 1\n    assert lca_db._idx_to_ident[0] == ident\n\n    set_of_values = set()\n    for vv in lca_db._hashval_to_idx.values():\n        set_of_values.update(vv)\n    assert len(set_of_values) == 1\n    assert set_of_values == {0}\n\n    assert not lca_db._idx_to_lid  # no lineage added\n    assert not lca_db._lid_to_lineage  # no lineage added\n    assert not lca_db._lineage_to_lid\n    assert not lca_db._lid_to_idx\n\n\ndef test_api_create_insert_two():\n    # check internal details if multiple signatures are inserted.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss, ident=\"foo\")\n    lca_db.insert(ss2, ident=\"bar\")\n\n    ident = \"foo\"\n    ident2 = \"bar\"\n    assert len(lca_db._ident_to_name) == 2\n    assert ident in lca_db._ident_to_name\n    assert ident2 in lca_db._ident_to_name\n    assert lca_db._ident_to_name[ident] == ss.name\n    assert lca_db._ident_to_name[ident2] == ss2.name\n\n    assert len(lca_db._ident_to_idx) == 2\n    assert lca_db._ident_to_idx[ident] == 0\n    assert lca_db._ident_to_idx[ident2] == 1\n\n    combined_mins = set(ss.minhash.hashes.keys())\n    combined_mins.update(set(ss2.minhash.hashes.keys()))\n    assert len(lca_db._hashval_to_idx) == len(combined_mins)\n\n    assert len(lca_db._idx_to_ident) == 2\n    assert lca_db._idx_to_ident[0] == ident\n    assert lca_db._idx_to_ident[1] == ident2\n\n    set_of_values = set()\n    for vv in lca_db._hashval_to_idx.values():\n        set_of_values.update(vv)\n    assert len(set_of_values) == 2\n    assert set_of_values == {0, 1}\n\n    assert not lca_db._idx_to_lid  # no lineage added\n    assert not lca_db._lid_to_lineage  # no lineage added\n    assert not lca_db._lineage_to_lid\n    assert not lca_db._lid_to_idx\n\n\ndef test_api_create_insert_w_lineage():\n    # test some internal implementation stuff - insert signature w/lineage\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lineage = (LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2\"))\n\n    lca_db.insert(ss, lineage=lineage)\n\n    # basic ident stuff\n    ident = ss.name\n    assert len(lca_db._ident_to_name) == 1\n    assert ident in lca_db._ident_to_name\n    assert lca_db._ident_to_name[ident] == ident\n    assert len(lca_db._ident_to_idx) == 1\n    assert lca_db._ident_to_idx[ident] == 0\n    assert len(lca_db._hashval_to_idx) == len(ss.minhash)\n    assert len(lca_db._idx_to_ident) == 1\n    assert lca_db._idx_to_ident[0] == ident\n\n    # all hash values added\n    set_of_values = set()\n    for vv in lca_db._hashval_to_idx.values():\n        set_of_values.update(vv)\n    assert len(set_of_values) == 1\n    assert set_of_values == {0}\n\n    # check lineage stuff\n    assert len(lca_db._idx_to_lid) == 1\n    assert lca_db._idx_to_lid[0] == 0\n    assert len(lca_db._lid_to_lineage) == 1\n    assert lca_db._lid_to_lineage[0] == lineage\n    assert lca_db._lid_to_idx[0] == {0}\n\n    assert len(lca_db._lineage_to_lid) == 1\n    assert lca_db._lineage_to_lid[lineage] == 0\n\n\ndef test_api_create_insert_w_bad_lineage():\n    # test some internal implementation stuff - insert signature w/bad lineage\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lineage = ([LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2\")],)\n\n    with pytest.raises(ValueError):\n        lca_db.insert(ss, lineage=lineage)\n\n\ndef test_api_create_insert_w_bad_lineage_2():\n    # test some internal implementation stuff - insert signature w/bad lineage\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lineage = 1  # something non-iterable...\n\n    with pytest.raises(ValueError):\n        lca_db.insert(ss, lineage=lineage)\n\n\ndef test_api_create_gather():\n    # create a database, and then run gather on it.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n\n    result = lca_db.best_containment(ss, threshold_bp=0)\n    print(result)\n    assert result\n    (similarity, match, filename) = result\n    assert match.minhash == ss.minhash\n\n\ndef test_api_add_genome_lineage():\n    # LCA_Databases can store/retrieve arbitrary lineages/taxonomies.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    lineage = (LineagePair(\"rank1\", \"name1\"), (LineagePair(\"rank2\", \"name2\")))\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss, lineage=lineage)\n\n    somehash = next(iter(ss.minhash.hashes.keys()))\n\n    lineages = lca_db.get_lineage_assignments(somehash)\n    assert len(lineages) == 1\n    assert lineage in lineages\n\n\ndef test_api_insert_update():\n    # check that cached parts of LCA_Database are updated when a new\n    # signature is inserted.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n\n    all_mh = [x.minhash for x in lca_db.signatures()]\n    assert ss.minhash in all_mh\n\n    # see decorator @cached_property\n    assert hasattr(lca_db, \"_cache\")\n    assert lca_db._cache\n    # inserting a signature should delete the cache\n    lca_db.insert(ss2)\n    assert not hasattr(lca_db, \"_cache\")\n\n    # check that it's rebuilt etc. etc.\n    all_mh = [x.minhash for x in lca_db.signatures()]\n    assert ss.minhash in all_mh\n    assert ss2.minhash in all_mh\n\n\ndef test_api_insert_retrieve_check_name():\n    # check that signatures retrieved from LCA_Database objects have the\n    # right name.\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n\n    sigs = list(lca_db.signatures())\n    assert len(sigs) == 1\n    retrieved_sig = sigs[0]\n    assert retrieved_sig.name == ss.name\n    assert retrieved_sig.minhash == ss.minhash\n\n\ndef test_api_create_insert_two_then_scale():\n    # construct database, THEN downsample\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n    lca_db.insert(ss2)\n\n    # downsample everything to 5000\n    lca_db.downsample_scaled(5000)\n\n    minhash = ss.minhash.downsample(scaled=5000)\n    minhash2 = ss2.minhash.downsample(scaled=5000)\n\n    # & check...\n    combined_mins = set(minhash.hashes.keys())\n    combined_mins.update(set(minhash2.hashes.keys()))\n    assert len(lca_db._hashval_to_idx) == len(combined_mins)\n\n\ndef test_api_create_insert_two_then_scale_then_add():\n    # construct database, THEN downsample, then add another\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    lca_db.insert(ss)\n\n    # downsample everything to 5000\n    lca_db.downsample_scaled(5000)\n\n    # insert another after downsample\n    lca_db.insert(ss2)\n\n    # now test -\n    ss = ss.to_mutable()\n    ss.minhash = ss.minhash.downsample(scaled=5000)\n\n    ss2 = ss2.to_mutable()\n    ss2.minhash = ss2.minhash.downsample(scaled=5000)\n\n    # & check...\n    combined_mins = set(ss.minhash.hashes.keys())\n    combined_mins.update(set(ss2.minhash.hashes.keys()))\n    assert len(lca_db._hashval_to_idx) == len(combined_mins)\n\n\ndef test_api_create_insert_scale_two():\n    # downsample while constructing database\n    ss = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    ss2 = load_one_signature_from_json(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    # downsample to 5000 while inserting:\n    lca_db = sourmash.lca.LCA_Database(ksize=31, scaled=5000)\n    count = lca_db.insert(ss)\n    assert count == 1037\n    assert count == len(ss.minhash.downsample(scaled=5000))\n    lca_db.insert(ss2)\n\n    # downsample sigs to 5000\n    minhash = ss.minhash.downsample(scaled=5000)\n    minhash2 = ss2.minhash.downsample(scaled=5000)\n\n    # & check...\n    combined_mins = set(minhash.hashes.keys())\n    combined_mins.update(set(minhash2.hashes.keys()))\n    assert len(lca_db._hashval_to_idx) == len(combined_mins)\n\n\ndef test_load_single_db():\n    filename = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    print(db)\n\n    assert ksize == 31\n    assert scaled == 10000\n\n\ndef test_load_single_db_empty(runtmp):\n    # test load_single_database on an empty file; should raise ValueError\n    empty = runtmp.output(\"empty.lca.json\")\n\n    with open(empty, \"w\"):\n        pass\n\n    with pytest.raises(ValueError) as exc:\n        db, ksize, scaled = lca_utils.load_single_database(empty)\n\n    assert f\"'{empty}' is not an LCA database file.\" in str(exc.value)\n\n\ndef test_databases():\n    filename1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    filename2 = utils.get_test_data(\"lca/delmont-2.lca.json\")\n    dblist, ksize, scaled = lca_utils.load_databases([filename1, filename2])\n\n    print(dblist)\n\n    assert len(dblist) == 2\n    assert ksize == 31\n    assert scaled == 10000\n\n\ndef test_databases_load_fail_on_no_JSON():\n    filename1 = utils.get_test_data(\"prot/protein.zip\")\n    with pytest.raises(ValueError) as exc:\n        dblist, ksize, scaled = lca_utils.load_databases([filename1])\n\n    err = str(exc.value)\n    print(err)\n    assert f\"'{filename1}' is not an LCA database file.\" in err\n\n\ndef test_databases_load_fail_on_dir():\n    filename1 = utils.get_test_data(\"lca\")\n    with pytest.raises(ValueError) as exc:\n        dblist, ksize, scaled = lca_utils.load_databases([filename1])\n\n    err = str(exc.value)\n    print(err)\n    assert f\"'{filename1}' is not a file and cannot be loaded as an LCA database\" in err\n    assert \"found 0 matches total;\" not in err\n\n\ndef test_databases_load_fail_on_not_exist():\n    filename1 = utils.get_test_data(\"does-not-exist\")\n    with pytest.raises(ValueError) as exc:\n        dblist, ksize, scaled = lca_utils.load_databases([filename1])\n\n    err = str(exc.value)\n    print(err)\n    assert f\"'{filename1}' is not a file and cannot be loaded as an LCA database\" in err\n    assert \"found 0 matches total;\" not in err\n\n\ndef test_db_repr():\n    filename = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    assert repr(db) == f\"LCA_Database('{filename}')\"\n\n\ndef test_db_repr_no_filename():\n    # An LCA_Database constructed in memory has no filename; the repr should\n    # not display \"None\" (see #3923).\n    db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    assert repr(db) == \"LCA_Database()\"\n\n\ndef test_lca_index_signatures_method():\n    # test 'signatures' method from base class Index\n    filename = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    siglist = list(db.signatures())\n    assert len(siglist) == 2\n\n\ndef test_lca_index_select():\n    # test 'select' method from Index base class.\n\n    filename = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    xx = db.select(ksize=31)\n    assert xx == db\n\n    xx = db.select(moltype=\"DNA\")\n    assert xx == db\n\n    xx = db.select(abund=False)\n    assert xx == db\n\n    with pytest.raises(ValueError):\n        db.select(ksize=21)\n\n    with pytest.raises(ValueError):\n        db.select(moltype=\"protein\")\n\n    with pytest.raises(ValueError):\n        db.select(abund=True)\n\n\ndef test_lca_index_select_picklist():\n    # test 'select' method from Index base class with a picklist.\n\n    filename = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"50a92740\"])\n\n    xx = db.select(picklist=picklist)\n    assert xx == db\n\n    siglist = list(db.signatures())\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.md5sum().startswith(\"50a92740\")\n    assert ss.minhash.ksize == 31\n\n\ndef test_lca_index_find_picklist_check_overlap():\n    # make sure 'find' works for picklists that exclude relevant signatures\n    # (bug #1638)\n\n    query_fn = utils.get_test_data(\"47.fa.sig\")\n    query_sig = load_one_signature_from_json(query_fn, ksize=31)\n    db_fn = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(db_fn)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"ident\")\n    picklist.init([\"NC_009665.1\"])\n\n    xx = db.select(picklist=picklist)\n    assert xx == db\n\n    results = list(db.search(query_sig, threshold=0.1))\n    assert len(results) == 1\n\n\ndef test_lca_index_select_picklist_exclude():\n    # test 'select' method from Index base class with a picklist.\n\n    filename = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"50a92740\"])\n\n    xx = db.select(picklist=picklist)\n    assert xx == db\n\n    siglist = list(db.signatures())\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.md5sum().startswith(\"e88dc390\")\n    assert ss.minhash.ksize == 31\n\n\ndef test_lca_index_select_picklist_twice():\n    # test 'select' method from Index base class with a picklist.\n\n    filename = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(filename)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"50a92740\"])\n\n    xx = db.select(picklist=picklist)\n    assert xx == db\n\n    with pytest.raises(ValueError) as exc:\n        xx = db.select(picklist=picklist)\n\n    assert \"we do not (yet) support multiple picklists for LCA databases\" in str(exc)\n\n\ndef test_search_db_scaled_gt_sig_scaled():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n    sig = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"))\n\n    results = db.search(sig, threshold=0.01, ignore_abundance=True)\n    match_sig = results[0][1]\n\n    minhash = sig.minhash.downsample(scaled=10000)\n    assert minhash == match_sig.minhash\n\n\ndef test_search_db_scaled_lt_sig_scaled():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n    sig = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"))\n\n    sig = sig.to_mutable()\n    sig.minhash = sig.minhash.downsample(scaled=100000)\n\n    results = db.search(sig, threshold=0.01, ignore_abundance=True)\n    print(results)\n    assert results[0].score == 1.0\n    match = results[0].signature\n\n    orig_sig = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"))\n    assert orig_sig.minhash.jaccard(match.minhash, downsample=True) == 1.0\n\n\ndef test_gather_db_scaled_gt_sig_scaled():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n    sig = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"))\n\n    result = db.best_containment(sig, threshold=0.01, ignore_abundance=True)\n    match_sig = result[1]\n\n    minhash = sig.minhash.downsample(scaled=10000)\n    assert minhash == match_sig.minhash\n\n\ndef test_gather_db_scaled_lt_sig_scaled():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n    sig = load_one_signature_from_json(utils.get_test_data(\"47.fa.sig\"))\n    sig_minhash = sig.minhash.downsample(scaled=100000)\n\n    result = db.best_containment(sig, threshold=0.01, ignore_abundance=True)\n    match_sig = result[1]\n\n    minhash = match_sig.minhash.downsample(scaled=100000)\n    assert sig_minhash == minhash\n\n\ndef test_db_lineage_to_lid():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n\n    d = db._lineage_to_lid\n    items = list(d.items())\n    items.sort()\n    assert len(items) == 2\n\n    print(items)\n\n    lin1 = items[0][0][-1]\n    assert lin1.rank == \"strain\"\n    assert lin1.name == \"Shewanella baltica OS185\"\n    lin1 = items[1][0][-1]\n    assert lin1.rank == \"strain\"\n    assert lin1.name == \"Shewanella baltica OS223\"\n\n\ndef test_db_lid_to_idx():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n\n    d = db._lid_to_idx\n    items = list(d.items())\n    items.sort()\n    assert len(items) == 2\n\n    print(items)\n    assert items == [(32, {32}), (48, {48})]\n\n\ndef test_db_idx_to_ident():\n    dbfile = utils.get_test_data(\"lca/47+63.lca.json\")\n    db, ksize, scaled = lca_utils.load_single_database(dbfile)\n\n    d = db._idx_to_ident\n    items = list(d.items())\n    items.sort()\n    assert len(items) == 2\n\n    print(items)\n    assert items == [(32, \"NC_009665\"), (48, \"NC_011663\")]\n\n\n## command line tests\n\n\ndef test_run_sourmash_lca():\n    status, out, err = utils.runscript(\"sourmash\", [\"lca\"], fail_ok=True)\n    assert status != 0  # no args provided, ok ;)\n\n\ndef test_basic_index(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, \"delmont-1\", input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db), lca_db\n\n    assert (\n        \"Building LCA database with ksize=31 scaled=10000 moltype=DNA\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_basic_index_twice(runtmp, lca_db_format):\n    # run 'lca index' twice.\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, \"delmont-1\", input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    with pytest.raises(SourmashCommandFailed):\n        cmd = [\"lca\", \"index\", taxcsv, \"delmont-1\", input_sig, \"-F\", lca_db_format]\n        runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"already exists. Not overwriting.\" in runtmp.last_result.err\n\n\ndef test_basic_index_bad_spreadsheet(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/bad-spreadsheet.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db), lca_db\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_basic_index_broken_spreadsheet(runtmp, lca_db_format):\n    # duplicate identifiers in this spreadsheet\n    taxcsv = utils.get_test_data(\"lca/bad-spreadsheet-2.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*cmd)\n\n    assert runtmp.last_result.status != 0\n    assert (\n        \"multiple lineages for identifier TARA_ASE_MAG_00031\" in runtmp.last_result.err\n    )\n\n\ndef test_basic_index_too_many_strains_too_few_species(runtmp, lca_db_format):\n    # explicit test for #841, where 'n_species' wasn't getting counted\n    # if lineage was at strain level resolution.\n    taxcsv = utils.get_test_data(\"lca/podar-lineage.csv\")\n    input_sig = utils.get_test_data(\"47.fa.sig\")\n    lca_db = runtmp.output(f\"out.lca.{lca_db_format}\")\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        taxcsv,\n        lca_db,\n        input_sig,\n        \"-C\",\n        \"3\",\n        \"--split-identifiers\",\n        \"-F\",\n        lca_db_format,\n    ]\n    runtmp.sourmash(*cmd)\n\n    assert \"error: fewer than 20% of lineages\" not in runtmp.last_result.err\n    assert runtmp.last_result.status == 0\n\n\ndef test_basic_index_too_few_species(runtmp, lca_db_format):\n    # spreadsheets with too few species should be flagged, unless -f specified\n    taxcsv = utils.get_test_data(\"lca/tully-genome-sigs.classify.csv\")\n\n    # (these don't really matter, should break on load spreadsheet)\n    input_sig = utils.get_test_data(\"47.fa.sig\")\n    lca_db = runtmp.output(f\"out.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-C\", \"3\", \"-F\", lca_db_format]\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*cmd)\n\n    assert (\n        '\"ERROR: fewer than 20% of lineages have species-level resolution'\n        not in runtmp.last_result.err\n    )\n    assert runtmp.last_result.status != 0\n\n\ndef test_basic_index_require_taxonomy(runtmp, lca_db_format):\n    # no taxonomy in here\n    taxcsv = utils.get_test_data(\"lca/bad-spreadsheet-3.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        \"--require-taxonomy\",\n        taxcsv,\n        lca_db,\n        input_sig,\n        \"-F\",\n        lca_db_format,\n    ]\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*cmd)\n\n    assert runtmp.last_result.status != 0\n    assert (\n        \"ERROR: no hash values found - are there any signatures?\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_basic_index_column_start(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-3.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", \"-C\", \"3\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_index_empty_sketch_name(runtmp, lca_db_format):\n    c = runtmp\n\n    # create two signatures with empty 'name' attributes\n    cmd = [\n        \"sketch\",\n        \"dna\",\n        utils.get_test_data(\"genome-s12.fa.gz\"),\n        utils.get_test_data(\"genome-s11.fa.gz\"),\n    ]\n    c.run_sourmash(*cmd)\n\n    sig1 = c.output(\"genome-s11.fa.gz.sig\")\n    assert os.path.exists(sig1)\n    sig2 = c.output(\"genome-s12.fa.gz.sig\")\n    assert os.path.exists(sig2)\n\n    outfile = f\"zzz.lca.{lca_db_format}\"\n\n    # can we insert them both?\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    cmd = [\"lca\", \"index\", taxcsv, outfile, sig1, sig2, \"-F\", lca_db_format]\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(outfile))\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"WARNING: no lineage provided for 2 sig\" in c.last_result.err\n\n\ndef test_basic_index_and_classify_with_tsv_and_gz(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-1.tsv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    if lca_db_format == \"json\":\n        lca_db = runtmp.output(\"delmont-1.lca.json.gz\")\n    else:\n        lca_db = runtmp.output(\"delmont-1.lca.sql\")\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        \"--tabs\",\n        \"--no-header\",\n        taxcsv,\n        lca_db,\n        input_sig,\n        \"-F\",\n        lca_db_format,\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_basic_index_and_classify(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_basic_index_and_classify_dup_lineage(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/tara-delmont-SuppTable3.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00007.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_ANW_MAG_00005.sig\")\n    lca_db = runtmp.output(f\"delmont-dup.lca.{lca_db_format}\")\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        taxcsv,\n        lca_db,\n        input_sig1,\n        input_sig2,\n        \"-F\",\n        lca_db_format,\n        \"-f\",\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"TARA_ASE_MAG_00007,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,,\"\n        in runtmp.last_result.out\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"TARA_ANW_MAG_00005,found,Bacteria,Proteobacteria,Gammaproteobacteria,,,,,\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_index_traverse(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    in_dir = runtmp.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, in_dir, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n    assert \"WARNING: 1 duplicate signatures.\" not in runtmp.last_result.err\n\n\ndef test_index_traverse_force(runtmp, lca_db_format):\n    c = runtmp\n    # test the use of --force to load all files, not just .sig\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    in_dir = c.output(\"sigs\")\n    os.mkdir(in_dir)\n    # name signature .txt instead of .sig:\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.txt\"))\n\n    # use --force\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, in_dir, \"-f\", \"-F\", lca_db_format]\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    err = c.last_result.err\n    print(out)\n    print(err)\n\n    assert os.path.exists(lca_db)\n\n    assert \"** assuming column 'MAGs' is identifiers in spreadsheet\" in err\n    assert \"** assuming column 'Domain' is superkingdom in spreadsheet\" in err\n    assert \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\" in err\n    assert \"WARNING: 1 duplicate signatures.\" not in err\n\n\ndef test_index_from_file_cmdline_sig(runtmp, lca_db_format):\n    c = runtmp\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    file_list = c.output(\"sigs.list\")\n    with open(file_list, \"w\") as fp:\n        print(input_sig, file=fp)\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        taxcsv,\n        lca_db,\n        input_sig,\n        \"--from-file\",\n        file_list,\n        \"-F\",\n        lca_db_format,\n    ]\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert os.path.exists(lca_db)\n\n    assert \"** assuming column 'MAGs' is identifiers in spreadsheet\" in err\n    assert \"** assuming column 'Domain' is superkingdom in spreadsheet\" in err\n    assert \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\" in err\n    assert \"WARNING: 1 duplicate signatures.\" in err\n\n\ndef test_index_from_file(runtmp, lca_db_format):\n    c = runtmp\n\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    file_list = c.output(\"sigs.list\")\n    with open(file_list, \"w\") as fp:\n        print(input_sig, file=fp)\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        taxcsv,\n        lca_db,\n        \"--from-file\",\n        file_list,\n        \"-F\",\n        lca_db_format,\n    ]\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert os.path.exists(lca_db)\n\n    assert \"** assuming column 'MAGs' is identifiers in spreadsheet\" in err\n    assert \"** assuming column 'Domain' is superkingdom in spreadsheet\" in err\n    assert \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\" in err\n\n\ndef test_index_fail_on_num(runtmp, lca_db_format):\n    c = runtmp\n    # lca index should yield a decent error message when attempted on 'num'\n    sigfile = utils.get_test_data(\"num/63.fa.sig\")\n    taxcsv = utils.get_test_data(\"lca/podar-lineage.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"lca\",\n            \"index\",\n            taxcsv,\n            f\"xxx.lca.{lca_db_format}\",\n            sigfile,\n            \"-C\",\n            \"3\",\n            \"-F\",\n            lca_db_format,\n        )\n\n    err = c.last_result.err\n    print(err)\n\n    assert \"ERROR: cannot insert signature \" in err\n    assert \"ERROR: cannot downsample signature; is it a scaled signature?\" in err\n\n\ndef test_index_traverse_real_spreadsheet_no_report(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/tara-delmont-SuppTable3.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-f\", \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 957 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n    assert \"WARNING: no signatures for 956 spreadsheet rows.\" in runtmp.last_result.err\n    assert \"WARNING: 105 unused lineages.\" in runtmp.last_result.err\n    assert (\n        \"(You can use --report to generate a detailed report.)\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_index_traverse_real_spreadsheet_report(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/tara-delmont-SuppTable3.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n    report_loc = runtmp.output(\"report.txt\")\n\n    cmd = [\n        \"lca\",\n        \"index\",\n        taxcsv,\n        lca_db,\n        input_sig,\n        \"--report\",\n        report_loc,\n        \"-f\",\n        \"-F\",\n        lca_db_format,\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 957 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n    assert \"WARNING: no signatures for 956 spreadsheet rows.\" in runtmp.last_result.err\n    assert \"WARNING: 105 unused lineages.\" in runtmp.last_result.err\n    assert (\n        \"(You can use --report to generate a detailed report.)\"\n        not in runtmp.last_result.err\n    )\n    assert os.path.exists(report_loc)\n\n\ndef test_single_classify(runtmp):\n    # run a basic 'classify', check output.\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_single_classify_zip_query(runtmp):\n    # run 'classify' with a query in a zipfile\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    query_ss = load_one_signature_from_json(input_sig, ksize=31)\n    query_zipfile = runtmp.output(\"query.zip\")\n    with sourmash_args.SaveSignaturesToLocation(query_zipfile) as save_sig:\n        save_sig.add(query_ss)\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query\", query_zipfile]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_single_classify_to_output(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    cmd = [\n        \"lca\",\n        \"classify\",\n        \"--db\",\n        db1,\n        \"--query\",\n        input_sig,\n        \"-o\",\n        runtmp.output(\"outfile.txt\"),\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(runtmp.output(\"outfile.txt\")) as fp:\n        outdata = fp.read()\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in outdata\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_single_classify_to_output_no_name(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    ss = load_one_signature_from_json(input_sig, ksize=31)\n\n    outsig_filename = runtmp.output(\"q.sig\")\n    with open(outsig_filename, \"w\") as fp:\n        # remove name from signature here --\n        new_sig = sourmash.SourmashSignature(ss.minhash, filename=\"xyz\")\n        save_signatures_to_json([new_sig], fp)\n\n    cmd = [\n        \"lca\",\n        \"classify\",\n        \"--db\",\n        db1,\n        \"--query\",\n        outsig_filename,\n        \"-o\",\n        runtmp.output(\"outfile.txt\"),\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    with open(runtmp.output(\"outfile.txt\")) as fp:\n        outdata = fp.read()\n    print((outdata,))\n    assert (\n        \"xyz,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in outdata\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_single_classify_empty(runtmp):\n    db1 = utils.get_test_data(\"lca/both.lca.json\")\n    input_sig = utils.get_test_data(\"GCF_000005845.2_ASM584v2_genomic.fna.gz.sig\")\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"GCF_000005845,nomatch,,,,,,,,\" in runtmp.last_result.out\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_single_classify_traverse(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = runtmp.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_multi_query_classify_traverse(runtmp):\n    # both.lca.json is built from both dir and dir2\n    db1 = utils.get_test_data(\"lca/both.lca.json\")\n    dir1 = utils.get_test_data(\"lca/dir1\")\n    dir2 = utils.get_test_data(\"lca/dir2\")\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query\", dir1, dir2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(utils.get_test_data(\"lca/classify-by-both.csv\")) as fp:\n        fp_lines = fp.readlines()\n        out_lines = runtmp.last_result.out.splitlines()\n\n        fp_lines.sort()\n        out_lines.sort()\n\n        assert len(fp_lines) == len(out_lines)\n        for line1, line2 in zip(fp_lines, out_lines):\n            assert line1.strip() == line2.strip(), (line1, line2)\n\n\n@utils.in_tempdir\ndef test_multi_query_classify_query_from_file(c):\n    # both.lca.json is built from both dir and dir2\n    db1 = utils.get_test_data(\"lca/both.lca.json\")\n    dir1_glob = utils.get_test_data(\"lca/dir1/*.sig\")\n    dir1_files = glob.glob(dir1_glob)\n    dir2_glob = utils.get_test_data(\"lca/dir2/*.sig\")\n    dir2_files = glob.glob(dir2_glob)\n\n    file_list = c.output(\"file.list\")\n    with open(file_list, \"w\") as fp:\n        print(\"\\n\".join(dir1_files), file=fp)\n        print(\"\\n\".join(dir2_files), file=fp)\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, \"--query-from-file\", file_list]\n    c.run_sourmash(*cmd)\n    out = c.last_result.out\n\n    with open(utils.get_test_data(\"lca/classify-by-both.csv\")) as fp:\n        fp_lines = fp.readlines()\n        out_lines = out.splitlines()\n\n        fp_lines.sort()\n        out_lines.sort()\n\n        assert len(fp_lines) == len(out_lines)\n        for line1, line2 in zip(fp_lines, out_lines):\n            assert line1.strip() == line2.strip(), (line1, line2)\n\n\n@utils.in_tempdir\ndef test_multi_query_classify_query_from_file_and_query(c):\n    # both.lca.json is built from both dir and dir2\n    db1 = utils.get_test_data(\"lca/both.lca.json\")\n    dir1_glob = utils.get_test_data(\"lca/dir1/*.sig\")\n    dir1_files = glob.glob(dir1_glob)\n    dir2_glob = utils.get_test_data(\"lca/dir2/*.sig\")\n    dir2_files = glob.glob(dir2_glob)\n\n    file_list = c.output(\"file.list\")\n    with open(file_list, \"w\") as fp:\n        print(\"\\n\".join(dir1_files[1:]), file=fp)  # leave off first one\n        print(\"\\n\".join(dir2_files), file=fp)\n\n    cmd = [\n        \"lca\",\n        \"classify\",\n        \"--db\",\n        db1,\n        \"--query\",\n        dir1_files[0],\n        \"--query-from-file\",\n        file_list,\n    ]\n    c.run_sourmash(*cmd)\n    out = c.last_result.out\n\n    with open(utils.get_test_data(\"lca/classify-by-both.csv\")) as fp:\n        fp_lines = fp.readlines()\n        out_lines = out.splitlines()\n\n        fp_lines.sort()\n        out_lines.sort()\n\n        assert len(fp_lines) == len(out_lines)\n        for line1, line2 in zip(fp_lines, out_lines):\n            assert line1.strip() == line2.strip(), (line1, line2)\n\n\ndef test_multi_db_multi_query_classify_traverse(runtmp):\n    # two halves of both.lca.json, see above test.\n    db1 = utils.get_test_data(\"lca/dir1.lca.json\")\n    db2 = utils.get_test_data(\"lca/dir2.lca.json\")\n    dir1 = utils.get_test_data(\"lca/dir1\")\n    dir2 = utils.get_test_data(\"lca/dir2\")\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, db2, \"--query\", dir1, dir2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(utils.get_test_data(\"lca/classify-by-both.csv\")) as fp:\n        fp_lines = fp.readlines()\n        out_lines = runtmp.last_result.out.splitlines()\n\n        fp_lines.sort()\n        out_lines.sort()\n\n        assert len(fp_lines) == len(out_lines)\n        for line1, line2 in zip(fp_lines, out_lines):\n            assert line1.strip() == line2.strip(), (line1, line2)\n\n\ndef test_unassigned_internal_index_and_classify(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-4.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,unassigned,Alteromonadaceae,unassigned,Alteromonas_macleodii\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_unassigned_last_index_and_classify(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-5.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"1 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,,,\\r\\n\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_index_and_classify_internal_unassigned_multi(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    # classify input_sig1\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,unassigned,unassigned,Alteromonadaceae,,,\\r\\n\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n    # classify input_sig2\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_PSW_MAG_00136,found,Eukaryota,Chlorophyta,Prasinophyceae,unassigned,unassigned,Ostreococcus,,\\r\\n\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 1 LCA databases\" in runtmp.last_result.err\n\n\ndef test_classify_majority_vote_1(runtmp, lca_db_format):\n    # classify merged signature using lca should yield no results\n    c = runtmp\n\n    # build database\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format\n    )\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\" in c.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in c.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in c.last_result.err\n    )\n\n    # merge input_sig1 and input_sig2\n    c.run_sourmash(\n        \"signature\",\n        \"merge\",\n        input_sig1,\n        input_sig2,\n        \"-k\",\n        \"31\",\n        \"--flatten\",\n        \"-o\",\n        \"sig1and2.sig\",\n    )\n    sig1and2 = c.output(\"sig1and2.sig\")\n\n    # lca classify should yield no results\n    c.run_sourmash(\"lca\", \"classify\", \"--db\", lca_db, \"--query\", sig1and2)\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in c.last_result.out\n    )\n    assert \"disagree,,,,,,,,\" in c.last_result.out\n    assert \"classified 1 signatures total\" in c.last_result.err\n    assert \"loaded 1 LCA databases\" in c.last_result.err\n\n\ndef test_classify_majority_vote_2(runtmp, lca_db_format):\n    # classify same signature with same database using --majority\n    # should yield results\n\n    c = runtmp\n\n    # build database\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format\n    )\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\" in c.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in c.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in c.last_result.err\n    )\n\n    # merge input_sig1 and input_sig2\n    c.run_sourmash(\n        \"signature\",\n        \"merge\",\n        input_sig1,\n        input_sig2,\n        \"-k\",\n        \"31\",\n        \"--flatten\",\n        \"-o\",\n        \"sig1and2.sig\",\n    )\n    sig1and2 = c.output(\"sig1and2.sig\")\n\n    # majority vote classify\n    c.run_sourmash(\"lca\", \"classify\", \"--db\", lca_db, \"--query\", sig1and2, \"--majority\")\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in c.last_result.out\n    )\n    assert (\n        \"found,Eukaryota,Chlorophyta,Prasinophyceae,unassigned,unassigned,Ostreococcus\"\n        in c.last_result.out\n    )\n    assert \"classified 1 signatures total\" in c.last_result.err\n    assert \"loaded 1 LCA databases\" in c.last_result.err\n\n\ndef test_classify_majority_vote_3(runtmp, lca_db_format):\n    # classify signature with nothing in counts\n    c = runtmp\n\n    # build database\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = c.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format\n    )\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\" in c.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in c.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in c.last_result.err\n    )\n\n    # obtain testdata '47.fa.sig'\n    testdata1 = utils.get_test_data(\"47.fa.sig\")\n\n    # majority vote classify\n    c.run_sourmash(\n        \"lca\", \"classify\", \"--db\", lca_db, \"--query\", testdata1, \"--majority\"\n    )\n\n    print(c.last_command)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in c.last_result.out\n    )\n    assert \"nomatch,,,,,,,,\" in c.last_result.out\n    assert \"classified 1 signatures total\" in c.last_result.err\n    assert \"loaded 1 LCA databases\" in c.last_result.err\n\n\ndef test_multi_db_classify(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    db2 = utils.get_test_data(\"lca/delmont-2.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    cmd = [\"lca\", \"classify\", \"--db\", db1, db2, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ID,status,superkingdom,phylum,class,order,family,genus,species\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"TARA_ASE_MAG_00031,found,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,,,,\"\n        in runtmp.last_result.out\n    )\n    assert \"classified 1 signatures total\" in runtmp.last_result.err\n    assert \"loaded 2 LCA databases\" in runtmp.last_result.err\n\n\ndef test_classify_unknown_hashes(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"1 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"classify\", \"--db\", lca_db, \"--query\", input_sig1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"(root)\" not in runtmp.last_result.out\n    assert (\n        \"TARA_MED_MAG_00029,found,Archaea,Euryarcheoata,unassigned,unassigned,novelFamily_I\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_single_summarize(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    cmd = [\"lca\", \"summarize\", \"--db\", db1, \"--query\", input_sig]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert (\n        \"100.0%   200   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_single_summarize_singleton(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        db1,\n        \"--query\",\n        input_sig,\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert (\n        \"100.0%   200   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"test-data/lca/TARA_ASE_MAG_00031.sig:5b438c6c TARA_ASE_MAG_00031\"\n        in runtmp.last_result.out\n    )\n\n\n@utils.in_tempdir\ndef test_single_summarize_traverse(c):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = c.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\"lca\", \"summarize\", \"--db\", db1, \"--query\", in_dir]\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in err\n    assert (\n        \"100.0%   200   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n        in out\n    )\n\n\n@utils.in_tempdir\ndef test_single_summarize_singleton_traverse(c):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = c.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\"lca\", \"summarize\", \"--db\", db1, \"--query\", in_dir]\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in err\n    assert (\n        \"100.0%   200   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n        in out\n    )\n    assert \"q.sig:5b438c6c TARA_ASE_MAG_00031\" in out\n\n\ndef test_single_summarize_to_output(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = runtmp.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        db1,\n        \"--query\",\n        input_sig,\n        \"-o\",\n        runtmp.output(\"output.txt\"),\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(runtmp.output(\"output.txt\")) as fp:\n        outdata = fp.read()\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert \"200,Bacteria,Proteobacteria,Gammaproteobacteria\" in outdata\n\n\ndef test_single_summarize_to_output_check_filename(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = runtmp.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        db1,\n        \"--query\",\n        os.path.join(in_dir, \"q.sig\"),\n        \"-o\",\n        runtmp.output(\"output.txt\"),\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    outdata = Path(runtmp.output(\"output.txt\")).read_text()\n\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert (\n        \"count,superkingdom,phylum,class,order,family,genus,species,strain,filename,sig_name,sig_md5,total_counts\\n\"\n        in outdata\n    )\n    assert (\n        \"200,Bacteria,Proteobacteria,Gammaproteobacteria,Alteromonadales,Alteromonadaceae,Alteromonas,Alteromonas_macleodii,,\"\n        + os.path.join(in_dir, \"q.sig\")\n        + \",TARA_ASE_MAG_00031,5b438c6c858cdaf9e9b05a207fa3f9f0,200.0\\n\"\n        in outdata\n    )\n    print(outdata)\n\n\ndef test_summarize_unknown_hashes_to_output_check_total_counts(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"1 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"summarize\", \"--db\", lca_db, \"--query\", input_sig1, \"-o\", \"out.csv\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"(root)\" not in runtmp.last_result.out\n    assert (\n        \"11.5%    27   Archaea;Euryarcheoata;unassigned;unassigned;novelFamily_I\"\n        in runtmp.last_result.out\n    )\n\n    with open(runtmp.output(\"out.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        pairs = [(row[\"count\"], row[\"total_counts\"]) for row in rows]\n        pairs = [(float(x), float(y)) for x, y in pairs]\n        pairs = set(pairs)\n\n        assert pairs == {(27.0, 234.0)}\n\n\ndef test_single_summarize_scaled(runtmp):\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    in_dir = runtmp.output(\"sigs\")\n    os.mkdir(in_dir)\n    shutil.copyfile(input_sig, os.path.join(in_dir, \"q.sig\"))\n\n    cmd = [\"lca\", \"summarize\", \"--db\", db1, \"--query\", input_sig, \"--scaled\", \"100000\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert \"100.0%    27   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n\n\ndef test_single_summarize_scaled_zip_query(runtmp):\n    # check zipfile as query\n    db1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    input_sig = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    query_ss = load_one_signature_from_json(input_sig, ksize=31)\n    query_zipfile = runtmp.output(\"query.zip\")\n    with sourmash_args.SaveSignaturesToLocation(query_zipfile) as save_sig:\n        save_sig.add(query_ss)\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        db1,\n        \"--query\",\n        query_zipfile,\n        \"--scaled\",\n        \"100000\",\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 1 signatures from 1 files total.\" in runtmp.last_result.err\n    assert \"100.0%    27   Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\"\n\n\ndef test_multi_summarize_with_unassigned_singleton(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        lca_db,\n        \"--query\",\n        input_sig1,\n        input_sig2,\n        \"--ignore-abundance\",\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 2 signatures from 2 files total.\" in runtmp.last_result.err\n\n    out_lines = runtmp.last_result.out.splitlines()\n\n    def remove_line_startswith(x, check=None):\n        for line in out_lines:\n            if line.startswith(x):\n                out_lines.remove(line)\n                if check:\n                    # make sure the check value is in there\n                    assert check in line\n                return line\n        assert 0, f\"couldn't find {x}\"\n\n    # note, proportions/percentages are now per-file\n    remove_line_startswith(\n        \"100.0%   200   Bacteria \", \"TARA_ASE_MAG_00031.sig:5b438c6c\"\n    )\n    remove_line_startswith(\n        \"100.0%   200   Bacteria;Proteobacteria;unassigned;unassigned \"\n    )\n    remove_line_startswith(\"100.0%  1231   Eukaryota;Chlorophyta \")\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota \", \"TARA_PSW_MAG_00136.sig:db50b713\"\n    )\n    remove_line_startswith(\"100.0%   200   Bacteria;Proteobacteria \")\n    remove_line_startswith(\"100.0%   200   Bacteria;Proteobacteria;unassigned \")\n    remove_line_startswith(\"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae \")\n    remove_line_startswith(\n        \"100.0%   200   Bacteria;Proteobacteria;unassigned;unassigned;Alteromonadaceae \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned;unassigned \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned;unassigned;Ostreococcus \"\n    )\n    assert not out_lines\n\n\ndef test_multi_summarize_with_zip_unassigned_singleton(runtmp, lca_db_format):\n    # test summarize on multiple queries, in a zipfile.\n    taxcsv = utils.get_test_data(\"lca/delmont-6.csv\")\n    input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    query_zipfile = runtmp.output(\"query.zip\")\n    with sourmash_args.SaveSignaturesToLocation(query_zipfile) as save_sig:\n        input_sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n        sig1 = load_one_signature_from_json(input_sig1, ksize=31)\n        input_sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n        sig2 = load_one_signature_from_json(input_sig2, ksize=31)\n\n        save_sig.add(sig1)\n        save_sig.add(sig2)\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        lca_db,\n        \"--query\",\n        \"query.zip\",\n        \"--ignore-abundance\",\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 2 signatures from 1 files total.\" in runtmp.last_result.err\n\n    out_lines = runtmp.last_result.out.splitlines()\n\n    def remove_line_startswith(x, check=None):\n        for line in out_lines:\n            if line.startswith(x):\n                out_lines.remove(line)\n                if check:\n                    # make sure the check value is in there\n                    assert check in line\n                return line\n        assert 0, f\"couldn't find {x}\"\n\n    # note, proportions/percentages are now per-file\n    remove_line_startswith(\"100.0%   200   Bacteria \", \":5b438c6c\")\n    remove_line_startswith(\n        \"100.0%   200   Bacteria;Proteobacteria;unassigned;unassigned \"\n    )\n    remove_line_startswith(\"100.0%  1231   Eukaryota;Chlorophyta \")\n    remove_line_startswith(\"100.0%  1231   Eukaryota \", \":db50b713\")\n    remove_line_startswith(\"100.0%   200   Bacteria;Proteobacteria \")\n    remove_line_startswith(\"100.0%   200   Bacteria;Proteobacteria;unassigned \")\n    remove_line_startswith(\"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae \")\n    remove_line_startswith(\n        \"100.0%   200   Bacteria;Proteobacteria;unassigned;unassigned;Alteromonadaceae \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned;unassigned \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned \"\n    )\n    remove_line_startswith(\n        \"100.0%  1231   Eukaryota;Chlorophyta;Prasinophyceae;unassigned;unassigned;Ostreococcus \"\n    )\n    assert not out_lines\n\n\ndef test_summarize_to_root(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\n        \"lca\",\n        \"summarize\",\n        \"--db\",\n        lca_db,\n        \"--query\",\n        input_sig2,\n        \"--ignore-abundance\",\n    ]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"78.6%    99   Archaea\" in runtmp.last_result.out\n    assert \"21.4%    27   (root)\" in runtmp.last_result.out\n\n\ndef test_summarize_unknown_hashes(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"1 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"summarize\", \"--db\", lca_db, \"--query\", input_sig1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"(root)\" not in runtmp.last_result.out\n    assert (\n        \"11.5%    27   Archaea;Euryarcheoata;unassigned;unassigned;novelFamily_I\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_summarize_to_root_abund(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig1, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"2 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"summarize\", \"--db\", lca_db, \"--query\", input_sig2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"78.9%   101   Archaea\" in runtmp.last_result.out\n    assert \"21.1%    27   (root)\" in runtmp.last_result.out\n\n\ndef test_summarize_unknown_hashes_abund(runtmp, lca_db_format):\n    taxcsv = utils.get_test_data(\"lca-root/tax.csv\")\n    input_sig1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    input_sig2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n    lca_db = runtmp.output(f\"lca-root.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig2, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"1 identifiers used out of 2 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"summarize\", \"--db\", lca_db, \"--query\", input_sig1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"(root)\" not in runtmp.last_result.out\n    assert (\n        \"11.5%    27   Archaea;Euryarcheoata;unassigned;unassigned;novelFamily_I\"\n        in runtmp.last_result.out\n    )\n\n\n@utils.in_thisdir\ndef test_summarize_abund_hmp(c):\n    # test lca summarize --with-abundance on some real data\n    queryfile = utils.get_test_data(\"hmp-sigs/G36354.sig.gz\")\n    dbname = utils.get_test_data(\"hmp-sigs/G36354-matches.lca.json.gz\")\n\n    c.run_sourmash(\"lca\", \"summarize\", \"--db\", dbname, \"--query\", queryfile)\n\n    assert (\n        \"32.1%  1080   p__Firmicutes;c__Bacilli;o__Lactobacillales\" in c.last_result.out\n    )\n\n\n@utils.in_thisdir\ndef test_summarize_abund_fake_no_abund(c):\n    # test lca summarize on some known/fake data; see docs for explanation.\n    queryfile = utils.get_test_data(\"fake-abund/query.sig.gz\")\n    dbname = utils.get_test_data(\"fake-abund/matches.lca.json.gz\")\n\n    c.run_sourmash(\n        \"lca\", \"summarize\", \"--db\", dbname, \"--query\", queryfile, \"--ignore-abundance\"\n    )\n\n    assert (\n        \"NOTE: discarding abundances in query, since --ignore-abundance\"\n        in c.last_result.err\n    )\n    assert \"79.6%   550   Bacteria\" in c.last_result.out\n    assert \"20.4%   141   Archaea\" in c.last_result.out\n\n\n@utils.in_thisdir\ndef test_summarize_abund_fake_yes_abund(c):\n    # test lca summarize abundance weighting on some known/fake data\n    queryfile = utils.get_test_data(\"fake-abund/query.sig.gz\")\n    dbname = utils.get_test_data(\"fake-abund/matches.lca.json.gz\")\n\n    c.run_sourmash(\"lca\", \"summarize\", \"--db\", dbname, \"--query\", queryfile)\n\n    assert \"43.2%   563   Bacteria\" in c.last_result.out\n    assert \"56.8%   740   Archaea\" in c.last_result.out\n\n\ndef test_rankinfo_on_multi(runtmp):\n    db1 = utils.get_test_data(\"lca/dir1.lca.json\")\n    db2 = utils.get_test_data(\"lca/dir2.lca.json\")\n\n    cmd = [\"lca\", \"rankinfo\", db1, db2]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    lines = runtmp.last_result.out.splitlines()\n    lines.remove(\"superkingdom: 0 (0.0%)\")\n    lines.remove(\"phylum: 464 (12.8%)\")\n    lines.remove(\"class: 533 (14.7%)\")\n    lines.remove(\"order: 1050 (29.0%)\")\n    lines.remove(\"family: 695 (19.2%)\")\n    lines.remove(\"genus: 681 (18.8%)\")\n    lines.remove(\"species: 200 (5.5%)\")\n    lines.remove(\"strain: 0 (0.0%)\")\n\n    assert not lines\n\n\ndef test_rankinfo_on_single(runtmp):\n    db1 = utils.get_test_data(\"lca/both.lca.json\")\n\n    cmd = [\"lca\", \"rankinfo\", db1]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    lines = runtmp.last_result.out.splitlines()\n    lines.remove(\"superkingdom: 0 (0.0%)\")\n    lines.remove(\"phylum: 464 (12.8%)\")\n    lines.remove(\"class: 533 (14.7%)\")\n    lines.remove(\"order: 1050 (29.0%)\")\n    lines.remove(\"family: 695 (19.2%)\")\n    lines.remove(\"genus: 681 (18.8%)\")\n    lines.remove(\"species: 200 (5.5%)\")\n    lines.remove(\"strain: 0 (0.0%)\")\n\n    assert not lines\n\n\ndef test_rankinfo_no_tax(runtmp, lca_db_format):\n    # note: TARA_PSW_MAG_00136 is _not_ in delmont-1.csv.\n    taxcsv = utils.get_test_data(\"lca/delmont-1.csv\")\n    input_sig = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n    lca_db = runtmp.output(f\"delmont-1.lca.{lca_db_format}\")\n\n    cmd = [\"lca\", \"index\", taxcsv, lca_db, input_sig, \"-F\", lca_db_format]\n    runtmp.sourmash(*cmd)\n\n    print(\"cmd:\", cmd)\n    print(\"out:\", runtmp.last_result.out)\n    print(\"err:\", runtmp.last_result.err)\n\n    assert os.path.exists(lca_db)\n\n    assert (\n        \"** assuming column 'MAGs' is identifiers in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"** assuming column 'Domain' is superkingdom in spreadsheet\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"0 identifiers used out of 1 distinct identifiers in spreadsheet.\"\n        in runtmp.last_result.err\n    )\n\n    cmd = [\"lca\", \"rankinfo\", lca_db]\n    runtmp.sourmash(*cmd)\n\n\ndef test_rankinfo_with_min(runtmp):\n    db1 = utils.get_test_data(\"lca/dir1.lca.json\")\n    db2 = utils.get_test_data(\"lca/dir2.lca.json\")\n\n    cmd = [\"lca\", \"rankinfo\", db1, db2, \"--minimum-num\", \"1\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    lines = runtmp.last_result.out.splitlines()\n    lines.remove(\"superkingdom: 0 (0.0%)\")\n    lines.remove(\"phylum: 464 (12.8%)\")\n    lines.remove(\"class: 533 (14.7%)\")\n    lines.remove(\"order: 1050 (29.0%)\")\n    lines.remove(\"family: 695 (19.2%)\")\n    lines.remove(\"genus: 681 (18.8%)\")\n    lines.remove(\"species: 200 (5.5%)\")\n    lines.remove(\"strain: 0 (0.0%)\")\n\n    assert not lines\n\n\ndef test_rankinfo_with_min_2(runtmp):\n    db1 = utils.get_test_data(\"lca/dir1.lca.json\")\n    db2 = utils.get_test_data(\"lca/dir2.lca.json\")\n\n    cmd = [\"lca\", \"rankinfo\", db1, db2, \"--minimum-num\", \"2\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"(no hashvals with lineages found)\" in runtmp.last_result.err\n\n\ndef test_compare_csv(runtmp):\n    a = utils.get_test_data(\"lca/classify-by-both.csv\")\n    b = utils.get_test_data(\"lca/tara-delmont-SuppTable3.csv\")\n\n    cmd = [\"lca\", \"compare_csv\", a, b, \"-f\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 106 distinct lineages, 957 rows\" in runtmp.last_result.err\n    assert \"missing 937 assignments in classify spreadsheet.\" in runtmp.last_result.err\n    assert (\n        \"20 total assignments, 0 differ between spreadsheets.\" in runtmp.last_result.err\n    )\n\n\ndef test_compare_csv_real(runtmp):\n    a = utils.get_test_data(\"lca/tully-genome-sigs.classify.csv\")\n    b = utils.get_test_data(\"lca/tully-query.delmont-db.sigs.classify.csv\")\n\n    cmd = [\"lca\", \"compare_csv\", a, b, \"--start-column=3\", \"-f\"]\n    runtmp.sourmash(*cmd)\n\n    print(cmd)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"loaded 87 distinct lineages, 2631 rows\" in runtmp.last_result.err\n    assert \"missing 71 assignments in classify spreadsheet.\" in runtmp.last_result.err\n    assert \"missing 1380 assignments in custom spreadsheet.\" in runtmp.last_result.err\n    assert \"(these will not be evaluated any further)\" in runtmp.last_result.err\n    assert (\n        \"987 total assignments, 889 differ between spreadsheets.\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"296 are compatible (one lineage is ancestor of another.\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"593 are incompatible (there is a disagreement in the trees).\"\n        in runtmp.last_result.err\n    )\n    assert \"164 incompatible at rank superkingdom\" in runtmp.last_result.err\n    assert \"255 incompatible at rank phylum\" in runtmp.last_result.err\n    assert \"107 incompatible at rank class\" in runtmp.last_result.err\n    assert \"54 incompatible at rank order\" in runtmp.last_result.err\n    assert \"13 incompatible at rank family\" in runtmp.last_result.err\n    assert \"0 incompatible at rank genus\" in runtmp.last_result.err\n    assert \"0 incompatible at rank species\" in runtmp.last_result.err\n\n\ndef test_incompat_lca_db_ksize_2_fail(runtmp, lca_db_format):\n    # test on gather - create a database with ksize of 25 => fail\n    # because of incompatibility.\n    c = runtmp\n    testdata1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.fa.gz\")\n    c.run_sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=25,scaled=1000\", testdata1, \"-o\", \"test_db.sig\"\n    )\n    print(c)\n\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        utils.get_test_data(\n            \"lca/delmont-1.csv\",\n        ),\n        f\"test.lca.{lca_db_format}\",\n        \"test_db.sig\",\n        \"-k\",\n        \"25\",\n        \"--scaled\",\n        \"10000\",\n        \"-F\",\n        lca_db_format,\n    )\n    print(c)\n\n    # this should fail: the LCA database has ksize 25, and the query sig has\n    # no compatible ksizes.\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"gather\",\n            utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\"),\n            f\"test.lca.{lca_db_format}\",\n        )\n\n    err = c.last_result.err\n    print(err)\n\n    if lca_db_format == \"sql\":\n        assert \"no compatible signatures found in 'test.lca.sql'\" in err\n    else:\n        assert \"ERROR: cannot use 'test.lca.json' for this query.\" in err\n        assert (\n            \"ksize on this database is 25; this is different from requested ksize of 31\"\n        )\n\n\ndef test_incompat_lca_db_ksize_2_nofail(runtmp, lca_db_format):\n    # test on gather - create a database with ksize of 25, no fail\n    # because of --no-fail-on-empty-databases\n    c = runtmp\n    testdata1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.fa.gz\")\n    c.run_sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=25,scaled=1000\", testdata1, \"-o\", \"test_db.sig\"\n    )\n    print(c)\n\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        utils.get_test_data(\n            \"lca/delmont-1.csv\",\n        ),\n        f\"test.lca.{lca_db_format}\",\n        \"test_db.sig\",\n        \"-k\",\n        \"25\",\n        \"--scaled\",\n        \"10000\",\n        \"-F\",\n        lca_db_format,\n    )\n    print(c)\n\n    # this should not fail despite mismatched ksize, b/c of --no-fail flag.\n    c.run_sourmash(\n        \"gather\",\n        utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\"),\n        f\"test.lca.{lca_db_format}\",\n        \"--no-fail-on-empty-database\",\n    )\n\n    err = c.last_result.err\n    print(err)\n\n    if lca_db_format == \"sql\":\n        assert \"no compatible signatures found in 'test.lca.sql'\" in err\n    else:\n        assert \"ERROR: cannot use 'test.lca.json' for this query.\" in err\n        assert (\n            \"ksize on this database is 25; this is different from requested ksize of 31\"\n        )\n\n\ndef test_lca_index_empty(runtmp, lca_db_format):\n    c = runtmp\n    # test lca index with an empty taxonomy CSV, followed by a load & gather.\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    sig63 = load_one_signature_from_json(sig63file, ksize=31)\n\n    # create an empty spreadsheet\n    with open(c.output(\"empty.csv\"), \"w\") as fp:\n        fp.write(\n            \"accession,superkingdom,phylum,class,order,family,genus,species,strain\"\n        )\n\n    # index!\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        \"empty.csv\",\n        \"xxx\",\n        sig2file,\n        sig47file,\n        sig63file,\n        \"--scaled\",\n        \"1000\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    # can we load and search?\n    lca_db_filename = c.output(f\"xxx.lca.{lca_db_format}\")\n    db, ksize, scaled = lca_utils.load_single_database(lca_db_filename)\n\n    result = db.best_containment(sig63)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == sig63.minhash\n    assert name == lca_db_filename\n\n\ndef test_lca_gather_threshold_1():\n    # test gather() method, in some detail; see same tests for sbt.\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    sig2 = load_one_signature_from_json(sig2file, ksize=31)\n    sig47 = load_one_signature_from_json(sig47file, ksize=31)\n    sig63 = load_one_signature_from_json(sig63file, ksize=31)\n\n    # construct LCA Database\n    db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    db.insert(sig2)\n    db.insert(sig47)\n    db.insert(sig63)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # query with empty hashes\n    assert not new_mh\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh))\n\n    # add one hash\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 1\n\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == sig2.minhash\n    assert name is None\n\n    # check with a threshold -> should be no results.\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n    # add three more hashes => length of 4\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 4\n\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == sig2.minhash\n    assert name is None\n\n    # check with a too-high threshold -> should be no results.\n    with pytest.raises(ValueError):\n        db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n\ndef test_lca_gather_threshold_5():\n    # test gather() method, in some detail; see same tests for sbt.\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    sig2 = load_one_signature_from_json(sig2file, ksize=31)\n    sig47 = load_one_signature_from_json(sig47file, ksize=31)\n    sig63 = load_one_signature_from_json(sig63file, ksize=31)\n\n    # construct LCA Database\n    db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    db.insert(sig2)\n    db.insert(sig47)\n    db.insert(sig63)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures both have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # add five hashes\n    for i in range(5):\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n\n    # should get a result with no threshold (any match at all is returned)\n    result = db.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == sig2.minhash\n    assert name is None\n\n    # now, check with a threshold_bp that should be meet-able.\n    result = db.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig.minhash == sig2.minhash\n    assert name is None\n\n\ndef test_gather_multiple_return():\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    sig2 = load_one_signature_from_json(sig2file, ksize=31)\n    sig47 = load_one_signature_from_json(sig47file, ksize=31)\n    sig63 = load_one_signature_from_json(sig63file, ksize=31)\n\n    # construct LCA Database\n    db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n    db.insert(sig2)\n    db.insert(sig47)\n    db.insert(sig63)\n\n    # now, run gather. how many results do we get, and are they in the\n    # right order?\n    result = db.best_containment(sig63)\n    print(result)\n    assert result\n    assert result.score == 1.0\n\n\ndef test_lca_db_protein_build():\n    # test programmatic creation of LCA database with protein sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"protein\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_tempdir\ndef test_lca_db_protein_save_load(c):\n    # test save/load of programmatically created db with protein sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"protein\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    db.save(c.output(\"xxx.lca.json\"))\n    del db\n\n    x = sourmash.lca.lca_db.load_single_database(c.output(\"xxx.lca.json\"))\n    db2 = x[0]\n    assert db2.moltype == \"protein\"\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    print(\"XXX\", mh_list[0].ksize)\n    print(\"YYY\", sig1.minhash.ksize)\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\ndef test_lca_db_protein_command_index(runtmp, lca_db_format):\n    # test command-line creation of LCA database with protein sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n    lineages = utils.get_test_data(\"prot/gtdb-subset-lineages.csv\")\n\n    db_out = c.output(f\"protein.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        lineages,\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"-C\",\n        \"2\",\n        \"--split-identifiers\",\n        \"--require-taxonomy\",\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--protein\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    x = sourmash.lca.lca_db.load_single_database(db_out)\n    db2 = x[0]\n    assert db2.moltype == \"protein\"\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_thisdir\ndef test_lca_db_protein_command_search(c):\n    # test command-line search/gather of LCA database with protein sigs\n    # (LCA database created as above)\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/protein.lca.json.gz\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out)\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_lca_db_hp_build():\n    # test programmatic creation of LCA database with hp sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"hp\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_tempdir\ndef test_lca_db_hp_save_load(c):\n    # test save/load of programmatically created db with hp sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"hp\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    db.save(c.output(\"xxx.lca.json\"))\n    del db\n\n    x = sourmash.lca.lca_db.load_single_database(c.output(\"xxx.lca.json\"))\n    db2 = x[0]\n    assert db2.moltype == \"hp\"\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\ndef test_lca_db_hp_command_index(runtmp, lca_db_format):\n    # test command-line creation of LCA database with hp sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n    lineages = utils.get_test_data(\"prot/gtdb-subset-lineages.csv\")\n\n    db_out = c.output(f\"hp.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        lineages,\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"-C\",\n        \"2\",\n        \"--split-identifiers\",\n        \"--require-taxonomy\",\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--hp\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    x = sourmash.lca.lca_db.load_single_database(db_out)\n    db2 = x[0]\n    assert db2.moltype == \"hp\"\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_thisdir\ndef test_lca_db_hp_command_search(c):\n    # test command-line search/gather of LCA database with hp sigs\n    # (LCA database created as above)\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/hp.lca.json.gz\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_lca_db_dayhoff_build():\n    # test programmatic creation of LCA database with dayhoff sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"dayhoff\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_tempdir\ndef test_lca_db_dayhoff_save_load(c):\n    # test save/load of programmatically created db with dayhoff sigs in it\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"dayhoff\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    db.save(c.output(\"xxx.lca.json\"))\n    del db\n\n    x = sourmash.lca.lca_db.load_single_database(c.output(\"xxx.lca.json\"))\n    db2 = x[0]\n    assert db2.moltype == \"dayhoff\"\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\ndef test_lca_db_dayhoff_command_index(runtmp, lca_db_format):\n    # test command-line creation of LCA database with dayhoff sigs\n    c = runtmp\n\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n    lineages = utils.get_test_data(\"prot/gtdb-subset-lineages.csv\")\n\n    db_out = c.output(f\"dayhoff.lca.{lca_db_format}\")\n\n    c.run_sourmash(\n        \"lca\",\n        \"index\",\n        lineages,\n        db_out,\n        sigfile1,\n        sigfile2,\n        \"-C\",\n        \"2\",\n        \"--split-identifiers\",\n        \"--require-taxonomy\",\n        \"--scaled\",\n        \"100\",\n        \"-k\",\n        \"19\",\n        \"--dayhoff\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    x = sourmash.lca.lca_db.load_single_database(db_out)\n    db2 = x[0]\n    assert db2.moltype == \"dayhoff\"\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(sig1, threshold=0.0)\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n\n\n@utils.in_thisdir\ndef test_lca_db_dayhoff_command_search(c):\n    # test command-line search/gather of LCA database with dayhoff sigs\n    # (LCA database created as above)\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/dayhoff.lca.json.gz\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_lca_index_with_picklist(runtmp, lca_db_format):\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    outdb = runtmp.output(f\"gcf.lca.{lca_db_format}\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    # create an empty spreadsheet\n    with open(runtmp.output(\"empty.csv\"), \"w\") as fp:\n        fp.write(\n            \"accession,superkingdom,phylum,class,order,family,genus,species,strain\"\n        )\n\n    runtmp.sourmash(\n        \"lca\",\n        \"index\",\n        \"empty.csv\",\n        outdb,\n        *gcf_sigs,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    assert \"WARNING: 6 missing picklist values.\"\n    assert \"WARNING: no lineage provided for 3 signatures\" in err\n\n    siglist = list(sourmash.load_file_as_signatures(outdb))\n    assert len(siglist) == 3\n    for ss in siglist:\n        assert \"Thermotoga\" in ss.name\n\n\ndef test_lca_index_with_picklist_exclude(runtmp, lca_db_format):\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    outdb = runtmp.output(f\"gcf.lca.{lca_db_format}\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    # create an empty spreadsheet\n    with open(runtmp.output(\"empty.csv\"), \"w\") as fp:\n        fp.write(\n            \"accession,superkingdom,phylum,class,order,family,genus,species,strain\"\n        )\n\n    runtmp.sourmash(\n        \"lca\",\n        \"index\",\n        \"empty.csv\",\n        outdb,\n        *gcf_sigs,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5:exclude\",\n        \"-F\",\n        lca_db_format,\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    siglist = list(sourmash.load_file_as_signatures(outdb))\n    assert len(siglist) == 9\n    for ss in siglist:\n        assert \"Thermotoga\" not in ss.name\n\n\ndef test_lca_index_select_with_picklist(runtmp, lca_db_format):\n    # check what happens with picklists after index\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    outdb = runtmp.output(f\"gcf.lca.{lca_db_format}\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    # create an empty spreadsheet\n    with open(runtmp.output(\"empty.csv\"), \"w\") as fp:\n        fp.write(\n            \"accession,superkingdom,phylum,class,order,family,genus,species,strain\"\n        )\n\n    runtmp.sourmash(\n        \"lca\", \"index\", \"empty.csv\", outdb, *gcf_sigs, \"-k\", \"21\", \"-F\", lca_db_format\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    idx = sourmash.load_file_as_index(outdb)\n    picklist_obj = SignaturePicklist.from_picklist_args(f\"{picklist}:md5:md5\")\n    picklist_obj.load()\n\n    idx = idx.select(picklist=picklist_obj)\n\n    siglist = list(idx.signatures())\n    assert len(siglist) == 3\n    for ss in siglist:\n        assert \"Thermotoga\" in ss.name\n\n\ndef test_lca_index_select_with_picklist_exclude(runtmp, lca_db_format):\n    # check what happens with picklists after index\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    outdb = runtmp.output(f\"gcf.lca.{lca_db_format}\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    # create an empty spreadsheet\n    with open(runtmp.output(\"empty.csv\"), \"w\") as fp:\n        fp.write(\n            \"accession,superkingdom,phylum,class,order,family,genus,species,strain\"\n        )\n\n    runtmp.sourmash(\n        \"lca\", \"index\", \"empty.csv\", outdb, *gcf_sigs, \"-k\", \"21\", \"-F\", lca_db_format\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    idx = sourmash.load_file_as_index(outdb)\n    picklist_obj = SignaturePicklist.from_picklist_args(f\"{picklist}:md5:md5:exclude\")\n    picklist_obj.load()\n    idx = idx.select(picklist=picklist_obj)\n\n    siglist = list(idx.signatures())\n    assert len(siglist) == 9\n    for ss in siglist:\n        assert \"Thermotoga\" not in ss.name\n\n\ndef test_lca_jaccard_ordering():\n    # this tests a tricky situation where for three sketches A, B, C,\n    # |A intersect B| is greater than |A intersect C|\n    # _but_\n    # |A jaccard B| is less than |A intersect B|\n    a = sourmash.MinHash(ksize=31, n=0, scaled=2)\n    b = a.copy_and_clear()\n    c = a.copy_and_clear()\n\n    a.add_many([1, 2, 3, 4])\n    b.add_many([1, 2, 3] + list(range(10, 30)))\n    c.add_many([1, 5])\n\n    def _intersect(x, y):\n        return x.intersection_and_union_size(y)[0]\n\n    print(\"a intersect b:\", _intersect(a, b))\n    print(\"a intersect c:\", _intersect(a, c))\n    print(\"a jaccard b:\", a.jaccard(b))\n    print(\"a jaccard c:\", a.jaccard(c))\n    assert _intersect(a, b) > _intersect(a, c)\n    assert a.jaccard(b) < a.jaccard(c)\n\n    # thresholds to use:\n    assert a.jaccard(b) < 0.15\n    assert a.jaccard(c) > 0.15\n\n    # now - make signatures, try out :)\n    ss_a = sourmash.SourmashSignature(a, name=\"A\")\n    ss_b = sourmash.SourmashSignature(b, name=\"B\")\n    ss_c = sourmash.SourmashSignature(c, name=\"C\")\n\n    db = sourmash.lca.LCA_Database(ksize=31, scaled=2)\n    db.insert(ss_a)\n    db.insert(ss_b)\n    db.insert(ss_c)\n\n    sr = db.search(ss_a, threshold=0.15)\n    print(sr)\n    assert len(sr) == 2\n    assert sr[0].signature == ss_a\n    assert sr[0].score == 1.0\n    assert sr[1].signature == ss_c\n    assert sr[1].score == 0.2\n\n\ndef test_lca_db_protein_save_twice(runtmp, lca_db_format):\n    # test save twice\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    sig1 = load_one_signature_from_json(sigfile1)\n    sig2 = load_one_signature_from_json(sigfile2)\n\n    db = sourmash.lca.LCA_Database(ksize=19, scaled=100, moltype=\"protein\")\n    assert db.insert(sig1)\n    assert db.insert(sig2)\n\n    db.save(runtmp.output(\"xxx\"), format=lca_db_format)\n\n    with pytest.raises(ValueError):\n        db.save(runtmp.output(\"xxx\"), format=lca_db_format)\n"
  },
  {
    "path": "tests/test_lca_db_protocol.py",
    "content": "\"\"\"\nTest the behavior of LCA databases. New LCA database classes should support\nall of this functionality.\n\"\"\"\n\nimport pytest\nimport sourmash_tst_utils as utils\n\nimport sourmash\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.tax.tax_utils import MultiLineageDB\nfrom sourmash.lca.lca_db import LCA_Database, load_single_database\n\n\ndef build_inmem_lca_db(runtmp):\n    # test in-memory LCA_Database\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    ss1 = load_one_signature(sigfile1)\n    ss2 = load_one_signature(sigfile2)\n\n    lineages_file = utils.get_test_data(\"prot/gtdb-subset-lineages.csv\")\n    lineages = MultiLineageDB.load([lineages_file])\n\n    db = LCA_Database(ksize=19, scaled=100, moltype=\"protein\")\n\n    ident1 = ss1.name.split(\" \")[0].split(\".\")[0]\n    assert lineages[ident1]\n    db.insert(ss1, ident=ident1, lineage=lineages[ident1])\n    ident2 = ss2.name.split(\" \")[0].split(\".\")[0]\n    assert lineages[ident2]\n    db.insert(ss2, ident=ident2, lineage=lineages[ident2])\n\n    return db\n\n\ndef build_json_lca_db(runtmp):\n    # test saved/loaded JSON database\n    db = build_inmem_lca_db(runtmp)\n    db_out = runtmp.output(\"protein.lca.json\")\n\n    db.save(db_out, format=\"json\")\n\n    x = load_single_database(db_out)\n    db_load = x[0]\n\n    return db_load\n\n\ndef build_sql_lca_db(runtmp):\n    # test saved/loaded SQL database\n    db = build_inmem_lca_db(runtmp)\n    db_out = runtmp.output(\"protein.lca.json\")\n\n    db.save(db_out, format=\"sql\")\n\n    x = load_single_database(db_out)\n    db_load = x[0]\n\n    return db_load\n\n\n@pytest.fixture(params=[build_inmem_lca_db, build_json_lca_db, build_sql_lca_db])\ndef lca_db_obj(request, runtmp):\n    build_fn = request.param\n\n    return build_fn(runtmp)\n\n\ndef test_get_lineage_assignments(lca_db_obj):\n    # test get_lineage_assignments for a specific hash\n    lineages = lca_db_obj.get_lineage_assignments(178936042868009693)\n\n    assert len(lineages) == 1\n    lineage = lineages[0]\n\n    x = []\n    for tup in lineage:\n        if tup[0] != \"strain\" or tup[1]:  # ignore empty strain\n            x.append((tup[0], tup[1]))\n\n    assert x == [\n        (\"superkingdom\", \"d__Archaea\"),\n        (\"phylum\", \"p__Crenarchaeota\"),\n        (\"class\", \"c__Bathyarchaeia\"),\n        (\"order\", \"o__B26-1\"),\n        (\"family\", \"f__B26-1\"),\n        (\"genus\", \"g__B26-1\"),\n        (\"species\", \"s__B26-1 sp001593925\"),\n    ]\n\n\ndef test_hashvals(lca_db_obj):\n    # test getting individual hashvals\n    hashvals = set(lca_db_obj.hashvals)\n    assert 178936042868009693 in hashvals\n\n\ndef test_get_identifiers_for_hashval(lca_db_obj):\n    # test getting identifiers belonging to individual hashvals\n    idents = lca_db_obj.get_identifiers_for_hashval(178936042868009693)\n    idents = list(idents)\n    assert len(idents) == 1\n\n    ident = idents[0]\n    assert ident == \"GCA_001593925\"\n\n\ndef test_get_identifiers_for_hashval_2(lca_db_obj):\n    # test systematic hashval => identifiers\n    all_idents = set()\n\n    for hashval in lca_db_obj.hashvals:\n        idents = lca_db_obj.get_identifiers_for_hashval(hashval)\n        # idents = list(idents)\n        all_idents.update(idents)\n\n    all_idents = list(all_idents)\n    print(all_idents)\n    assert len(all_idents) == 2\n\n    assert \"GCA_001593925\" in all_idents\n    assert \"GCA_001593935\" in all_idents\n\n\ndef test_downsample_scaled(lca_db_obj):\n    # check the downsample_scaled method\n    assert lca_db_obj.scaled == 100\n    lca_db_obj.downsample_scaled(500)\n    assert lca_db_obj.scaled == 500\n\n\ndef test_downsample_scaled_fail(lca_db_obj):\n    # check the downsample_scaled method - should fail if lower scaled.\n    assert lca_db_obj.scaled == 100\n\n    with pytest.raises(ValueError):\n        lca_db_obj.downsample_scaled(50)\n"
  },
  {
    "path": "tests/test_lca_functions.py",
    "content": "\"\"\"\nTests for functions in lca submodule.\n\"\"\"\n\nimport pytest\n\nfrom sourmash.lca import lca_utils\nfrom sourmash.lca.lca_utils import (\n    LineagePair,\n    build_tree,\n    find_lca,\n    taxlist,\n    count_lca_for_assignments,\n    zip_lineage,\n    display_lineage,\n    make_lineage,\n    is_lineage_match,\n    pop_to_rank,\n)\n\n\nclass FakeLCA_Database:\n    def __init__(self):\n        self._assignments = {}\n\n    def _set_lineage_assignment(self, hashval, assignment):\n        self._assignments[hashval] = assignment\n\n    def get_lineage_assignments(self, hashval):\n        if hashval in self._assignments:\n            return self._assignments[hashval]\n        else:\n            return None\n\n\ndef test_taxlist_1():\n    assert list(taxlist()) == [\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n        \"strain\",\n    ]\n\n\ndef test_taxlist_2():\n    assert list(taxlist(include_strain=False)) == [\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n    ]\n\n\ndef test_zip_lineage_1():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    assert zip_lineage(x) == [\"a\", \"b\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_zip_lineage_2():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    assert zip_lineage(x, truncate_empty=True) == [\"a\", \"b\"]\n\n\ndef test_zip_lineage_3():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    assert zip_lineage(x) == [\"a\", \"\", \"c\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_zip_lineage_3_truncate():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    assert zip_lineage(x, truncate_empty=True) == [\"a\", \"\", \"c\"]\n\n\ndef test_zip_lineage_4():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"class\", \"c\")]\n    with pytest.raises(ValueError) as e:\n        zip_lineage(x)\n\n    assert \"incomplete lineage at phylum - is class instead\" in str(e.value)\n\n\ndef test_display_lineage_1():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    assert display_lineage(x) == \"a;b\", display_lineage(x)\n\n\ndef test_display_lineage_2():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    assert display_lineage(x) == \"a;;c\", display_lineage(x)\n\n\ndef test_build_tree():\n    tree = build_tree([[LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2\")]])\n    assert tree == {LineagePair(\"rank1\", \"name1\"): {LineagePair(\"rank2\", \"name2\"): {}}}\n\n\ndef test_build_tree_2():\n    tree = build_tree(\n        [\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2a\")],\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2b\")],\n        ]\n    )\n\n    assert tree == {\n        LineagePair(\"rank1\", \"name1\"): {\n            LineagePair(\"rank2\", \"name2a\"): {},\n            LineagePair(\"rank2\", \"name2b\"): {},\n        }\n    }\n\n\ndef test_build_tree_3():  # empty 'rank2' name\n    tree = build_tree([[LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"\")]])\n    assert tree == {LineagePair(\"rank1\", \"name1\"): {}}\n\n\ndef test_build_tree_4():\n    tree = build_tree(\n        [\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2a\")],\n        ]\n    )\n\n    tree = build_tree(\n        [\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2b\")],\n        ],\n        tree,\n    )\n\n    assert tree == {\n        LineagePair(\"rank1\", \"name1\"): {\n            LineagePair(\"rank2\", \"name2a\"): {},\n            LineagePair(\"rank2\", \"name2b\"): {},\n        }\n    }\n\n\ndef test_build_tree_5():\n    with pytest.raises(ValueError):\n        build_tree([])\n\n\ndef test_find_lca():\n    tree = build_tree([[LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2\")]])\n    lca = find_lca(tree)\n\n    assert lca == (\n        (\n            LineagePair(\"rank1\", \"name1\"),\n            LineagePair(\"rank2\", \"name2\"),\n        ),\n        0,\n    )\n\n\ndef test_find_lca_2():\n    tree = build_tree(\n        [\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2a\")],\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2b\")],\n        ]\n    )\n    lca = find_lca(tree)\n\n    assert lca == ((LineagePair(\"rank1\", \"name1\"),), 2)\n\n\ndef test_find_lca_3():\n    lin1 = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b\")\n\n    tree = build_tree([lin1, lin2])\n    lca, reason = find_lca(tree)\n    assert lca == lin1  # find most specific leaf node\n\n\ndef test_gather_assignments_1():\n    # test basic mechanics of gather_assignments function\n    hashval = 12345678\n    lin = lca_utils.make_lineage(\"a;b;c\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin]))\n\n    assignments = lca_utils.gather_assignments([hashval], [db])\n    print(assignments)\n\n    assert assignments[hashval] == set([lin])\n\n\ndef test_gather_assignments_2():\n    # test basic mechanics of gather_assignments function with two lineages\n    hashval = 12345678\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n\n    assignments = lca_utils.gather_assignments([hashval], [db])\n    print(assignments)\n\n    assert assignments[hashval] == set([lin, lin2])\n\n\ndef test_gather_assignments_3():\n    # test basic mechanics of gather_assignments function with two lineages\n    # and two hashvals\n    hashval = 12345678\n    hashval2 = 87654321\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n    db._set_lineage_assignment(hashval2, set([lin]))\n\n    assignments = lca_utils.gather_assignments([hashval, hashval2], [db])\n    print(assignments)\n\n    assert assignments[hashval] == set([lin, lin2])\n    assert assignments[hashval2] == set([lin])\n\n\ndef test_count_lca_for_assignments_1():\n    # test basic mechanics of gather_assignments function\n    hashval = 12345678\n    lin = lca_utils.make_lineage(\"a;b;c\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin]))\n\n    assignments = lca_utils.gather_assignments([hashval], [db])\n    counts = count_lca_for_assignments(assignments)\n    print(counts)\n\n    assert len(counts) == 1\n    assert counts[lin] == 1\n\n\ndef test_count_lca_for_assignments_2():\n    # test basic mechanics of gather_assignments function with two lineages\n    hashval = 12345678\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n\n    assignments = lca_utils.gather_assignments([hashval], [db])\n    counts = count_lca_for_assignments(assignments)\n    print(counts)\n\n    assert counts[lin] == 0\n    assert counts[lin2] == 0\n\n    assert len(counts) == 1\n    lca_lin = lca_utils.make_lineage(\"a;b\")\n    assert counts[lca_lin] == 1\n\n\ndef test_count_lca_for_assignments_3():\n    # test basic mechanics of gather_assignments function with two lineages\n    # and two hashvals\n    hashval = 12345678\n    hashval2 = 87654321\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n    db._set_lineage_assignment(hashval2, set([lin]))\n\n    assignments = lca_utils.gather_assignments([hashval, hashval2], [db])\n    counts = count_lca_for_assignments(assignments)\n    print(counts)\n\n    assert len(counts) == 2\n    assert counts[lin] == 1\n    assert counts[lin2] == 0\n\n    lca_lin = lca_utils.make_lineage(\"a;b\")\n    assert counts[lca_lin] == 1\n\n\ndef test_count_lca_for_assignments_abund_1():\n    # test basic mechanics of gather_assignments function\n    hashval = 12345678\n    hashval_counts = {}\n    hashval_counts[hashval] = 3\n\n    lin = lca_utils.make_lineage(\"a;b;c\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin]))\n\n    assignments = lca_utils.gather_assignments(hashval_counts.keys(), [db])\n    counts = count_lca_for_assignments(assignments, hashval_counts)\n    print(counts)\n\n    assert len(counts) == 1\n    assert counts[lin] == 3\n\n\ndef test_count_lca_for_assignments_abund_2():\n    # test basic mechanics of gather_assignments function with two lineages\n    hashval = 12345678\n    hashval_counts = {}\n    hashval_counts[hashval] = 3\n\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n\n    assignments = lca_utils.gather_assignments(hashval_counts, [db])\n    counts = count_lca_for_assignments(assignments, hashval_counts)\n    print(counts)\n\n    assert counts[lin] == 0\n    assert counts[lin2] == 0\n\n    assert len(counts) == 1\n    lca_lin = lca_utils.make_lineage(\"a;b\")\n    assert counts[lca_lin] == 3  # yes!\n\n\ndef test_count_lca_for_assignments_abund_3():\n    # test basic mechanics of gather_assignments function with two lineages\n    # and two hashvals\n    hashval = 12345678\n    hashval2 = 87654321\n    hashval_counts = {}\n    hashval_counts[hashval] = 2\n    hashval_counts[hashval2] = 5\n\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n    db._set_lineage_assignment(hashval2, set([lin]))\n\n    assignments = lca_utils.gather_assignments(hashval_counts, [db])\n    counts = count_lca_for_assignments(assignments, hashval_counts)\n    print(counts)\n\n    assert len(counts) == 2\n    assert counts[lin] == 5  # makes sense\n    assert counts[lin2] == 0  # makes sense\n\n    lca_lin = lca_utils.make_lineage(\"a;b\")\n    assert counts[lca_lin] == 2  # yes!\n\n\ndef test_count_lca_for_assignments_abund_4():\n    # test basic mechanics of gather_assignments function with three lineages\n    # and three hashvals\n    hashval = 12345678\n    hashval2 = 87654321\n    hashval3 = 34567891\n    hashval_counts = {}\n    hashval_counts[hashval] = 2\n    hashval_counts[hashval2] = 5\n    hashval_counts[hashval3] = 3\n\n    lin = lca_utils.make_lineage(\"a;b;c\")\n    lin2 = lca_utils.make_lineage(\"a;b;d\")\n    lin3 = lca_utils.make_lineage(\"a;b;d;e\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))  # lca: a;b\n    db._set_lineage_assignment(hashval2, set([lin]))  # lca: a;b;c\n    db._set_lineage_assignment(hashval3, set([lin2, lin3]))  # a;b;d;e\n\n    assignments = lca_utils.gather_assignments(hashval_counts, [db])\n    counts = count_lca_for_assignments(assignments, hashval_counts)\n    print(counts)\n\n    assert len(counts) == 3\n    assert counts[lin] == 5  # makes sense b/c hashval2\n    assert counts[lin2] == 0  # a;b;d (lin2) + a;b;d;e (lin3) -->a;b;d;e (lin3) only\n    assert counts[lin3] == 3  # hashval3\n\n    lca_lin = lca_utils.make_lineage(\"a;b\")\n    assert counts[lca_lin] == 2  # yes, b/c hashval\n\n\ndef test_count_lca_for_assignments_abund_5():\n    # test basic mechanics of gather_assignments function with two lineages\n    # and two hashvals when linages match but one has lower taxo detail\n    hashval = 12345678\n    hashval2 = 87654321\n    hashval_counts = {}\n    hashval_counts[hashval] = 2\n    hashval_counts[hashval2] = 5\n\n    lin = lca_utils.make_lineage(\"a;b;d\")\n    lin2 = lca_utils.make_lineage(\"a;b;d;e\")\n\n    db = FakeLCA_Database()\n    db._set_lineage_assignment(hashval, set([lin, lin2]))\n    db._set_lineage_assignment(hashval2, set([lin]))\n\n    assignments = lca_utils.gather_assignments(hashval_counts, [db])\n    counts = count_lca_for_assignments(assignments, hashval_counts)\n    print(counts)\n\n    assert len(counts) == 2\n    assert counts[lin] == 5  # makes sense\n    assert counts[lin2] == 2  # lin+lin2 yield just lin2\n\n\ndef test_is_lineage_match_1():\n    # basic behavior: match at order and above, but not at family or below.\n    lin1 = make_lineage(\"d__a;p__b;c__c;o__d;f__e\")\n    lin2 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n\n    assert is_lineage_match(lin1, lin2, \"superkingdom\")\n    assert is_lineage_match(lin1, lin2, \"phylum\")\n    assert is_lineage_match(lin1, lin2, \"class\")\n    assert is_lineage_match(lin1, lin2, \"order\")\n    assert not is_lineage_match(lin1, lin2, \"family\")\n    assert not is_lineage_match(lin1, lin2, \"genus\")\n    assert not is_lineage_match(lin1, lin2, \"species\")\n\n\ndef test_is_lineage_match_2():\n    # match at family, and above, levels; no genus or species to match\n    lin1 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n    lin2 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n\n    assert is_lineage_match(lin1, lin2, \"superkingdom\")\n    assert is_lineage_match(lin1, lin2, \"phylum\")\n    assert is_lineage_match(lin1, lin2, \"class\")\n    assert is_lineage_match(lin1, lin2, \"order\")\n    assert is_lineage_match(lin1, lin2, \"family\")\n    assert not is_lineage_match(lin1, lin2, \"genus\")\n    assert not is_lineage_match(lin1, lin2, \"species\")\n\n\ndef test_is_lineage_match_3():\n    # one lineage is empty\n    lin1 = make_lineage(\"\")\n    lin2 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n\n    assert not is_lineage_match(lin1, lin2, \"superkingdom\")\n    assert not is_lineage_match(lin1, lin2, \"family\")\n    assert not is_lineage_match(lin1, lin2, \"order\")\n    assert not is_lineage_match(lin1, lin2, \"class\")\n    assert not is_lineage_match(lin1, lin2, \"phylum\")\n    assert not is_lineage_match(lin1, lin2, \"genus\")\n    assert not is_lineage_match(lin1, lin2, \"species\")\n\n\ndef test_pop_to_rank_1():\n    # basic behavior - pop to order?\n    lin1 = make_lineage(\"d__a;p__b;c__c;o__d\")\n    lin2 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n\n    print(lin1)\n    print(pop_to_rank(lin2, \"order\"))\n    assert pop_to_rank(lin2, \"order\") == lin1\n\n\ndef test_pop_to_rank_2():\n    # what if we're already above rank?\n    lin2 = make_lineage(\"d__a;p__b;c__c;o__d;f__f\")\n\n    print(pop_to_rank(lin2, \"species\"))\n    assert pop_to_rank(lin2, \"species\") == lin2\n"
  },
  {
    "path": "tests/test_manifest.py",
    "content": "\"\"\"\nTests for manifest code in databases, etc.\n\"\"\"\n\nimport pytest\nfrom io import StringIO\n\nimport sourmash\nfrom sourmash import index, sourmash_args\n\nimport sourmash_tst_utils as utils\n\n\ndef test_generate_manifest():\n    # test basic manifest-generating functionality.\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    rows = []\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        row = index.CollectionManifest.make_manifest_row(sig, loc)\n        rows.append(row)\n        siglist.append(sig)\n\n    manifest = index.CollectionManifest(rows)\n\n    assert len(manifest) == len(rows)\n    assert len(manifest) == 2\n\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    for sig in siglist:\n        assert sig in manifest\n\n\ndef test_manifest_operations():\n    # test basic manifest operations - +=\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    rows = []\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        row = index.CollectionManifest.make_manifest_row(sig, loc)\n        rows.append(row)\n        siglist.append(sig)\n\n    manifest = index.CollectionManifest(rows)\n    manifest2 = index.CollectionManifest(rows)\n    manifest += manifest2\n\n    assert len(manifest) == 2 * len(rows)\n    assert len(manifest) == 4\n\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n\ndef test_manifest_operations_fail():\n    # should not be able to add a manifest to itself - not only makes\n    # no sense, but it means you're modifying a generator in place, sometimes.\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    rows = []\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        row = index.CollectionManifest.make_manifest_row(sig, loc)\n        rows.append(row)\n        siglist.append(sig)\n\n    manifest = index.CollectionManifest(rows)\n    with pytest.raises(Exception):\n        manifest += manifest\n\n\ndef test_manifest_to_picklist():\n    # test manifest/picklist interaction basics\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    rows = []\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        row = index.CollectionManifest.make_manifest_row(sig, loc)\n        rows.append(row)\n        siglist.append(sig)\n\n    manifest = index.CollectionManifest(rows)\n    picklist = manifest.to_picklist()\n    assert len(picklist.pickset) == len(manifest)\n\n    new_manifest = manifest.select_to_manifest(picklist=picklist)\n    assert len(new_manifest) == len(manifest)\n\n\ndef test_manifest_compare():\n    # test saving and loading manifests\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n    manifest = loader.manifest\n\n    # equal\n    rows = list(manifest.rows)\n\n    equal_mf = index.CollectionManifest(rows)\n    assert equal_mf == manifest\n\n    # not equal / shorter\n    rows = list(manifest.rows)\n    rows = rows[:-1]\n\n    short_mf = index.CollectionManifest(rows)\n    assert short_mf != manifest\n\n    # not equal / diff values\n    rows = list(manifest.rows)\n    rows[0] = dict(rows[0])\n    rows[0][\"internal_location\"] += \".foo\"\n\n    short_mf = index.CollectionManifest(rows)\n    assert short_mf != manifest\n\n\ndef test_save_load_manifest():\n    # test saving and loading manifests\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    rows = []\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        row = index.CollectionManifest.make_manifest_row(sig, loc)\n        rows.append(row)\n        siglist.append(sig)\n\n    manifest = index.CollectionManifest(rows)\n\n    # now, on to CSV\n    fp = StringIO()\n    manifest.write_csv_header(fp)\n    manifest.write_to_csv(fp)\n\n    rfp = StringIO(fp.getvalue())\n    manifest2 = index.CollectionManifest.load_from_csv(rfp)\n\n    assert len(manifest) == len(manifest2)\n\n    pick1 = manifest.to_picklist()\n    pick2 = manifest2.to_picklist()\n\n    # manifest 1 in manifest2?\n    for row in manifest.rows:\n        assert pick2.matches_manifest_row(row)\n\n    # manifest 2 in manifest?\n    for row in manifest2.rows:\n        assert pick1.matches_manifest_row(row)\n\n    # equal?\n    assert manifest == manifest2\n\n    # not equal / shorter\n    rows = list(manifest.rows)\n    rows = rows[1:]\n\n    short_mf = index.CollectionManifest(rows)\n    assert short_mf != manifest\n\n    # not equal / diff values\n    rows = list(manifest.rows)\n    rows[0] = dict(rows[0])\n    rows[0][\"internal_location\"] += \".foo\"\n\n    short_mf = index.CollectionManifest(rows)\n    assert short_mf != manifest\n\n\ndef test_manifest_to_picklist_bug(runtmp):\n    # this tests a fun combination of things that led to a bug.\n    # tl;dr we only want to iterate once across a generator...\n    # ref #2762\n    all_zip = utils.get_test_data(\"prot/all.zip\")\n\n    idx = sourmash_args.load_file_as_index(all_zip)\n    assert len(idx) == 8\n\n    manifest = sourmash_args.get_manifest(idx)\n    assert len(manifest) == 8\n\n    def filter_fn(row):\n        # match?\n        keep = False\n        if \"09a0869\" in row[\"md5\"]:\n            keep = True\n\n        return keep\n\n    sub_manifest = manifest.filter_rows(filter_fn)\n    sub_picklist = sub_manifest.to_picklist()\n    idx = idx.select(picklist=sub_picklist)\n\n    assert len(idx) == 1\n    print(idx)\n\n    x = list(idx.signatures())\n    assert len(x)\n\n\ndef test_generate_manifest_iterate_once():\n    # we should only iterate across manifest rows once\n    protzip = utils.get_test_data(\"prot/protein.zip\")\n\n    loader = sourmash.load_file_as_index(protzip)\n\n    siglist = []\n    for sig, loc in loader._signatures_with_internal():\n        siglist.append(sig)\n\n    # build generator function => will not allow iteration twice\n    def genfn():\n        for sig, loc in loader._signatures_with_internal():\n            row = index.CollectionManifest.make_manifest_row(sig, loc)\n            yield row\n\n    manifest = index.CollectionManifest(genfn())\n\n    assert len(manifest) == 2\n    assert len(manifest._md5_set) == 2\n\n    md5_list = [row[\"md5\"] for row in manifest.rows]\n    assert \"16869d2c8a1d29d1c8e56f5c561e585e\" in md5_list\n    assert \"120d311cc785cc9d0df9dc0646b2b857\" in md5_list\n\n    for sig in siglist:\n        assert sig in manifest\n"
  },
  {
    "path": "tests/test_manifest_protocol.py",
    "content": "\"\"\"\nTests for the 'CollectionManifest' class and protocol. All subclasses\nof BaseCollectionManifest should support this functionality.\n\"\"\"\n\nimport pytest\nimport sourmash_tst_utils as utils\n\nimport sourmash\nfrom sourmash.manifest import BaseCollectionManifest, CollectionManifest\nfrom sourmash.index.sqlite_index import SqliteCollectionManifest\nfrom sourmash.sourmash_args import load_one_signature\n\n\ndef build_simple_manifest(runtmp):\n    # load and return the manifest from prot/all.zip\n    filename = utils.get_test_data(\"prot/all.zip\")\n    idx = sourmash.load_file_as_index(filename)\n    mf = idx.manifest\n    assert len(mf) == 8\n    return mf\n\n\ndef build_sqlite_manifest(runtmp):\n    # return the manifest from prot/all.zip\n    filename = utils.get_test_data(\"prot/all.zip\")\n    idx = sourmash.load_file_as_index(filename)\n    mf = idx.manifest\n\n    # build sqlite manifest from this 'un\n    mfdb = runtmp.output(\"test.sqlmf\")\n    return SqliteCollectionManifest.load_from_manifest(mf, dbfile=mfdb)\n\n\ndef save_load_manifest(runtmp):\n    # save/load the manifest from a CSV.\n    mf = build_simple_manifest(runtmp)\n\n    mf_csv = runtmp.output(\"mf.csv\")\n    mf.write_to_filename(mf_csv)\n\n    load_mf = CollectionManifest.load_from_filename(mf_csv)\n    return load_mf\n\n\n@pytest.fixture(\n    params=[build_simple_manifest, save_load_manifest, build_sqlite_manifest]\n)\ndef manifest_obj(request, runtmp):\n    build_fn = request.param\n\n    return build_fn(runtmp)\n\n\n###\n### generic CollectionManifeset tests go here\n###\n\n\ndef test_manifest_len(manifest_obj):\n    # check that 'len' works\n    assert len(manifest_obj) == 8\n\n\ndef test_manifest_rows(manifest_obj):\n    # check that '.rows' property works\n    rows = list(manifest_obj.rows)\n    assert len(rows) == 8\n\n    required_keys = set(BaseCollectionManifest.required_keys)\n    for row in rows:\n        kk = set(row.keys())\n        assert required_keys.issubset(kk)\n\n\ndef test_manifest_bool(manifest_obj):\n    # check that 'bool' works\n    assert bool(manifest_obj)\n\n\ndef test_make_manifest_row(manifest_obj):\n    # build a manifest row from a signature\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sig47)\n\n    row = manifest_obj.make_manifest_row(ss, \"foo\", include_signature=False)\n    assert \"signature\" not in row\n    assert row[\"internal_location\"] == \"foo\"\n\n    assert row[\"md5\"] == ss.md5sum()\n    assert row[\"md5short\"] == ss.md5sum()[:8]\n    assert row[\"ksize\"] == 31\n    assert row[\"moltype\"] == \"DNA\"\n    assert row[\"num\"] == 0\n    assert row[\"scaled\"] == 1000\n    assert row[\"n_hashes\"] == len(ss.minhash)\n    assert not row[\"with_abundance\"]\n    assert row[\"name\"] == ss.name\n    assert row[\"filename\"] == ss.filename\n\n\ndef test_manifest_create_manifest(manifest_obj):\n    # test the 'create_manifest' method\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sig47)\n\n    def yield_sigs():\n        yield ss, \"fiz\"\n\n    new_mf = manifest_obj.create_manifest(yield_sigs(), include_signature=False)\n    assert len(new_mf) == 1\n    new_row = list(new_mf.rows)[0]\n\n    row = manifest_obj.make_manifest_row(ss, \"fiz\", include_signature=False)\n\n    required_keys = BaseCollectionManifest.required_keys\n    for k in required_keys:\n        assert new_row[k] == row[k], k\n\n\ndef test_manifest_select_to_manifest(manifest_obj):\n    # do some light testing of 'select_to_manifest'\n    new_mf = manifest_obj.select_to_manifest(moltype=\"DNA\")\n    assert len(new_mf) == 2\n\n\ndef test_manifest_locations(manifest_obj):\n    # check the 'locations' method\n    locs = set(\n        [\n            \"dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n            \"dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n            \"hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n            \"hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n            \"protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\",\n            \"protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\",\n            \"dna-sig.noext\",\n            \"dna-sig.sig.gz\",\n        ]\n    )\n    assert set(manifest_obj.locations()) == locs\n\n\ndef test_manifest___contains__(manifest_obj):\n    # check the 'in' operator\n    sigfile = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    ss = load_one_signature(sigfile)\n\n    assert ss in manifest_obj\n\n    sigfile2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sigfile2, ksize=31)\n    assert ss2 not in manifest_obj\n\n\ndef test_manifest_to_picklist(manifest_obj):\n    # test 'to_picklist'\n    picklist = manifest_obj.to_picklist()\n    mf = manifest_obj.select_to_manifest(picklist=picklist)\n\n    assert mf == manifest_obj\n\n\ndef test_manifest_filter_rows(manifest_obj):\n    # test filter_rows\n    def filter_fn(x):\n        return \"OS223\" in x[\"name\"]\n\n    mf = manifest_obj.filter_rows(filter_fn)\n\n    assert len(mf) == 1\n    row = list(mf.rows)[0]\n    assert row[\"name\"] == \"NC_011663.1 Shewanella baltica OS223, complete genome\"\n\n\ndef test_manifest_filter_cols(manifest_obj):\n    # test filter_rows\n    def col_filter_fn(x):\n        return \"OS223\" in x[0]\n\n    mf = manifest_obj.filter_on_columns(col_filter_fn, [\"name\"])\n\n    assert len(mf) == 1\n    row = list(mf.rows)[0]\n    assert row[\"name\"] == \"NC_011663.1 Shewanella baltica OS223, complete genome\"\n\n\ndef test_manifest_iadd(manifest_obj):\n    # test the 'create_manifest' method\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sig47)\n\n    def yield_sigs():\n        yield ss, \"fiz\"\n\n    new_mf = manifest_obj.create_manifest(yield_sigs(), include_signature=False)\n    assert len(new_mf) == 1\n\n    new_mf += manifest_obj\n    assert len(new_mf) == len(manifest_obj) + 1\n\n\ndef test_manifest_add(manifest_obj):\n    # test the 'create_manifest' method\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sig47)\n\n    def yield_sigs():\n        yield ss, \"fiz\"\n\n    new_mf = manifest_obj.create_manifest(yield_sigs(), include_signature=False)\n    assert len(new_mf) == 1\n\n    new_mf2 = new_mf + manifest_obj\n    assert len(new_mf2) == len(manifest_obj) + len(new_mf)\n"
  },
  {
    "path": "tests/test_minhash.py",
    "content": "# This file is part of sourmash, https://github.com/sourmash-bio/sourmash/, and is\n# Copyright (C) 2016, The Regents of the University of California.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n#       notice, this list of conditions and the following disclaimer.\n#\n#     * Redistributions in binary form must reproduce the above\n#       copyright notice, this list of conditions and the following\n#       disclaimer in the documentation and/or other materials provided\n#       with the distribution.\n#\n#     * Neither the name of the Michigan State University nor the names\n#       of its contributors may be used to endorse or promote products\n#       derived from this software without specific prior written\n#       permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Contact: titus@idyll.org\n# pylint: disable=missing-docstring,protected-access\n\nimport itertools\nimport pickle\nimport math\nimport numpy as np\n\nimport pytest\n\nimport screed\n\nimport sourmash\nfrom sourmash.minhash import (\n    MinHash,\n    FrozenMinHash,\n    hash_murmur,\n    _get_scaled_for_max_hash,\n    _get_max_hash_for_scaled,\n    translate_codon,\n)\nfrom sourmash import signature\nfrom sourmash.sourmash_args import load_one_signature\n\nimport sourmash_tst_utils as utils\n\n# add:\n# * get default params from Python\n# * keyword args for minhash constructor\n# * trap error from handing protein/non-DNA to a DNA MH\n# * fail on untagged/unloaded countgraph\n# * nan on empty minhash\n# * define equals\n\nscaled2 = _get_scaled_for_max_hash(2**63)\nassert scaled2 == 2\nscaled4 = _get_scaled_for_max_hash(2**62)\nassert scaled4 == 4\nscaled8 = _get_scaled_for_max_hash(2**61)\nassert scaled8 == 8\n\n\ndef _kmers_from_all_coding_frames(sequence, ksize):\n    \"\"\"Mimic the internal rust code for translation of DNA into aa.\n\n    For each frame, yield all fwd k-mers, then all reverse k-mers\n    from that frame. Then do next frame.\n    \"\"\"\n    seqrc = screed.rc(sequence)\n\n    for frame in (0, 1, 2):\n        # get forward k-mers\n        for start in range(0, len(sequence) - ksize + 1 - frame, 3):\n            kmer = sequence[start + frame : start + frame + ksize]\n            yield kmer\n\n        # get rc k-mers\n        for start in range(0, len(seqrc) - ksize + 1 - frame, 3):\n            kmer = seqrc[start + frame : start + frame + ksize]\n            yield kmer\n\n\ndef _hash_fwd_only(mh_translate, seq):\n    \"Return the first hashval only, for coding frame +1.\"\n    assert len(seq) == mh_translate.ksize * 3\n    xx = mh_translate.seq_to_hashes(seq)[0]\n    return xx\n\n\ndef test_basic_dna(track_abundance):\n    # verify that MHs of size 1 stay size 1, & act properly as bottom sketches.\n    mh = MinHash(1, 4, track_abundance=track_abundance)\n    assert mh.moltype == \"DNA\"\n\n    mh.add_sequence(\"ATGC\")\n    a = mh.hashes\n\n    mh.add_sequence(\"GCAT\")  # this will not get added; hash > ATGC\n    b = mh.hashes\n\n    print(a, b)\n    assert list(a) == list(b)\n    assert len(b) == 1\n    assert list(a)[0] == list(b)[0] == 12415348535738636339\n\n\ndef test_div_zero(track_abundance):\n    # verify that empty MHs do not yield divide by zero errors for similarity\n    mh = MinHash(1, 4, track_abundance=track_abundance)\n    mh2 = mh.copy_and_clear()\n\n    mh.add_sequence(\"ATGC\")\n    assert mh.similarity(mh2) == 0\n    assert mh2.similarity(mh) == 0\n\n\ndef test_div_zero_contained(track_abundance):\n    # verify that empty MHs do not yield divide by zero errors for contained_by\n    mh = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n    mh2 = mh.copy_and_clear()\n\n    mh.add_sequence(\"ATGC\")\n    assert mh.contained_by(mh2) == 0\n    assert mh2.contained_by(mh) == 0\n\n\ndef test_contained_requires_scaled(track_abundance):\n    # test that contained_by requires scaled signatures\n    mh1 = MinHash(1, 4, track_abundance=track_abundance)\n    mh2 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_sequence(\"ATGC\")\n    mh2.add_sequence(\"ATGC\")\n\n    with pytest.raises(TypeError):\n        mh2.contained_by(mh1)\n\n    with pytest.raises(TypeError):\n        mh1.contained_by(mh2)\n\n\ndef test_contained_requires_scaled_2(track_abundance):\n    # test that max_containment requires scaled signatures\n    mh1 = MinHash(1, 4, track_abundance=track_abundance)\n    mh2 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_sequence(\"ATGC\")\n    mh2.add_sequence(\"ATGC\")\n\n    with pytest.raises(TypeError):\n        mh2.max_containment(mh1)\n\n    with pytest.raises(TypeError):\n        mh1.max_containment(mh2)\n\n\ndef test_contained_requires_scaled_3(track_abundance):\n    # test that avg_containment requires scaled signatures\n    mh1 = MinHash(1, 4, track_abundance=track_abundance)\n    mh2 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_sequence(\"ATGC\")\n    mh2.add_sequence(\"ATGC\")\n\n    with pytest.raises(TypeError):\n        mh2.avg_containment(mh1)\n\n    with pytest.raises(TypeError):\n        mh1.avg_containment(mh2)\n\n\ndef test_bytes_dna(track_abundance):\n    mh = MinHash(1, 4, track_abundance=track_abundance)\n    mh.add_sequence(\"ATGC\")\n    mh.add_sequence(b\"ATGC\")\n    mh.add_sequence(\"ATGC\")\n    a = mh.hashes\n\n    mh.add_sequence(\"GCAT\")  # this will not get added; hash > ATGC\n    mh.add_sequence(b\"GCAT\")  # this will not get added; hash > ATGC\n    mh.add_sequence(\"GCAT\")  # this will not get added; hash > ATGC\n    b = mh.hashes\n\n    print(a, b)\n    assert list(a) == list(b)\n    assert len(b) == 1\n\n\ndef test_add_long_seqs_force():\n    # Test for (All kmers are invalid)\n\n    mh = sourmash.minhash.MinHash(n=0, ksize=21, scaled=10, seed=42)\n    seq = \"ACGTN\" * 100000\n    mh.seq_to_hashes(seq, force=True)\n    assert len(mh.hashes) == 0\n\n\ndef test_seq_to_hashes(track_abundance):\n    mh = sourmash.minhash.MinHash(\n        n=0, ksize=21, scaled=1, track_abundance=track_abundance\n    )\n    seq = \"ATGAGAGACGATAGACAGATGACC\"\n    mh.add_sequence(seq)\n\n    golden_hashes = mh.hashes\n\n    # New seq to hashes without adding to the sketch\n    new_hashes = mh.seq_to_hashes(seq)\n\n    assert set(golden_hashes) == set(new_hashes)\n\n\ndef test_seq_to_hashes_protein_1(track_abundance, dayhoff):\n    mh = MinHash(\n        10,\n        2,\n        is_protein=True,\n        dayhoff=dayhoff,\n        hp=False,\n        track_abundance=track_abundance,\n    )\n    prot_seq = \"AGYYG\"\n\n    mh.add_protein(prot_seq)\n\n    golden_hashes = mh.hashes\n\n    # New seq to hashes without adding to the sketch\n    new_hashes = mh.seq_to_hashes(prot_seq, is_protein=True)\n\n    assert set(golden_hashes) == set(new_hashes)\n\n\ndef test_seq_to_hashes_protein_2(track_abundance):\n    mh = sourmash.minhash.MinHash(\n        n=0, ksize=21, scaled=1, track_abundance=track_abundance\n    )\n    seq = \"ATGAGAGACGATAGACAGATGACC\"\n\n    with pytest.raises(ValueError):\n        mh.seq_to_hashes(seq, is_protein=True)\n\n\ndef test_seq_to_hashes_translated(track_abundance):\n    mh_protein = MinHash(10, 2, is_protein=True, track_abundance=track_abundance)\n    seq = \"ACTGAC\"\n    mh_protein.add_sequence(seq)\n\n    golden_hashes = mh_protein.hashes\n\n    # New seq to hashes without adding to the sketch\n    new_hashes = mh_protein.seq_to_hashes(seq)\n\n    assert set(golden_hashes) == set(new_hashes)\n\n\ndef test_seq_to_hashes_bad_kmers_as_zeroes_1():\n    mh = sourmash.minhash.MinHash(n=0, ksize=21, scaled=1)\n    seq = \"ATGAGAGACGATAGACAGATGACN\"\n\n    # New seq to hashes without adding to the sketch\n    hashes = mh.seq_to_hashes(seq, force=True, bad_kmers_as_zeroes=True)\n\n    assert len(hashes) == len(seq) - 21 + 1\n\n\ndef test_seq_to_hashes_bad_kmers_as_zeroes_2():\n    mh = sourmash.minhash.MinHash(n=0, ksize=21, scaled=1)\n    seq = \"ATGAGAGACGATAGACAGATGACN\"\n\n    with pytest.raises(ValueError):\n        mh.seq_to_hashes(seq, bad_kmers_as_zeroes=True)\n\n\ndef test_seq_to_hashes_translated_short():\n    mh = MinHash(0, 2, is_protein=True, dayhoff=True, hp=False, scaled=1)\n    hashes = mh.seq_to_hashes(\"ACTGA\")\n\n    assert len(hashes) == 0\n\n\ndef test_bytes_protein_dayhoff(track_abundance, dayhoff):\n    # verify that we can hash protein/aa sequences\n    mh = MinHash(\n        10,\n        2,\n        is_protein=True,\n        dayhoff=dayhoff,\n        hp=False,\n        track_abundance=track_abundance,\n    )\n\n    expected_moltype = \"protein\"\n    if dayhoff:\n        expected_moltype = \"dayhoff\"\n    assert mh.moltype == expected_moltype\n\n    mh.add_protein(\"AGYYG\")\n    mh.add_protein(\"AGYYG\")\n    mh.add_protein(b\"AGYYG\")\n\n    assert len(mh.hashes) == 4\n\n\ndef test_protein_dayhoff(track_abundance, dayhoff):\n    # verify that we can hash protein/aa sequences\n    mh = MinHash(\n        10,\n        2,\n        is_protein=True,\n        dayhoff=dayhoff,\n        hp=False,\n        track_abundance=track_abundance,\n    )\n    mh.add_protein(\"AGYYG\")\n\n    assert len(mh.hashes) == 4\n\n\ndef test_bytes_protein_hp(track_abundance, hp):\n    # verify that we can hash protein/aa sequences\n    mh = MinHash(\n        10, 2, is_protein=True, dayhoff=False, hp=hp, track_abundance=track_abundance\n    )\n    expected_moltype = \"protein\"\n    if hp:\n        expected_moltype = \"hp\"\n    assert mh.moltype == expected_moltype\n\n    mh.add_protein(\"AGYYG\")\n    mh.add_protein(\"AGYYG\")\n    mh.add_protein(b\"AGYYG\")\n\n    if hp:\n        assert len(mh.hashes) == 1\n    else:\n        assert len(mh.hashes) == 4\n\n\ndef test_protein_hp(track_abundance, hp):\n    # verify that we can hash protein/aa sequences\n    mh = MinHash(\n        10, 2, is_protein=True, dayhoff=False, hp=hp, track_abundance=track_abundance\n    )\n    mh.add_protein(\"AGYYG\")\n\n    if hp:\n        assert len(mh.hashes) == 1\n    else:\n        assert len(mh.hashes) == 4\n\n\ndef test_module_translate_codon(track_abundance):\n    # Ensure that translation occurs properly - module level function tests\n    assert \"S\" == translate_codon(\"TCT\")\n    assert \"S\" == translate_codon(\"TC\")\n    assert \"X\" == translate_codon(\"T\")\n\n    with pytest.raises(ValueError):\n        translate_codon(\"\")\n        translate_codon(\"TCTA\")\n\n\ndef test_dayhoff(track_abundance):\n    # verify that we can hash to dayhoff-encoded protein/aa sequences\n    mh_dayhoff = MinHash(\n        10, 2, is_protein=True, dayhoff=True, hp=False, track_abundance=track_abundance\n    )\n    mh_dayhoff.add_sequence(\"ACTGAC\")\n\n    assert len(mh_dayhoff.hashes) == 2\n    # verify that dayhoff-encoded hashes are different from protein/aa hashes\n    mh_protein = MinHash(10, 2, is_protein=True, track_abundance=track_abundance)\n    mh_protein.add_sequence(\"ACTGAC\")\n\n    assert len(mh_protein.hashes) == 2\n    print(mh_protein.hashes)\n    print(mh_dayhoff.hashes)\n    assert mh_protein.hashes != mh_dayhoff.hashes\n\n\ndef test_dayhoff_2(track_abundance):\n    mh = MinHash(0, 7, scaled=1, dayhoff=True, track_abundance=1)\n\n    # first, check protein -> dayhoff hashes via minhash\n    mh.add_protein(\"CADHIFC\")\n    assert len(mh) == 1\n    hashval = list(mh.hashes)[0]\n    assert hashval == hash_murmur(\"abcdefa\")\n\n    # also check seq_to_hashes\n    hashes = list(mh.seq_to_hashes(\"CADHIFC\", is_protein=True))\n    assert hashval == hashes[0]\n\n    # do we handle stop codons properly?\n    mh = mh.copy_and_clear()\n    mh.add_protein(\"CADHIF*\")\n    assert len(mh) == 1\n    hashval = list(mh.hashes)[0]\n    assert hashval == hash_murmur(\"abcdef*\")\n\n    # again, check seq_to_hashes\n    hashes = list(mh.seq_to_hashes(\"CADHIF*\", is_protein=True))\n    assert hashval == hashes[0]\n\n\ndef test_hp(track_abundance):\n    # verify that we can hash to hp-encoded protein/aa sequences\n    mh_hp = MinHash(\n        10, 2, is_protein=True, dayhoff=False, hp=True, track_abundance=track_abundance\n    )\n    assert mh_hp.moltype == \"hp\"\n\n    mh_hp.add_sequence(\"ACTGAC\")\n\n    assert len(mh_hp.hashes) == 2\n    # verify that hp-encoded hashes are different from protein/aa hashes\n    mh_protein = MinHash(10, 2, is_protein=True, track_abundance=track_abundance)\n    mh_protein.add_sequence(\"ACTGAC\")\n\n    assert len(mh_protein.hashes) == 2\n    assert mh_protein.hashes != mh_hp.hashes\n\n\ndef test_hp_2(track_abundance):\n    mh = MinHash(0, 3, scaled=1, hp=True, track_abundance=track_abundance)\n\n    mh.add_protein(\"ANA\")\n    assert len(mh) == 1\n    hashval = list(mh.hashes)[0]\n    assert hashval == hash_murmur(\"hph\")\n\n    # also check seq_to_hashes\n    hashes = list(mh.seq_to_hashes(\"ANA\", is_protein=True))\n    assert hashval == hashes[0]\n\n    mh = mh.copy_and_clear()\n    mh.add_protein(\"AN*\")\n    assert len(mh) == 1\n    hashval = list(mh.hashes)[0]\n    assert hashval == hash_murmur(\"hp*\")\n\n    # also check seq_to_hashes\n    hashes = list(mh.seq_to_hashes(\"AN*\", is_protein=True))\n    assert hashval == hashes[0]\n\n\ndef test_protein_short(track_abundance):\n    # verify that we can hash protein/aa sequences\n    mh = MinHash(10, 9, is_protein=True, track_abundance=track_abundance)\n    mh.add_protein(\"AG\")\n\n    assert len(mh.hashes) == 0, mh.hashes\n\n\ndef test_size_limit(track_abundance):\n    # test behavior with size limit of 3\n    mh = MinHash(3, 4, track_abundance=track_abundance)\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(30)\n    assert list(sorted(mh.hashes)) == [10, 20, 30]\n    mh.add_hash(5)  # -> should push 30 off end\n    assert list(sorted(mh.hashes)) == [5, 10, 20]\n\n\ndef test_scaled(track_abundance):\n    # test behavior with scaled: cannot add hashes above max hash.\n    scaled = 2**3\n    print(\"XX\", scaled, _get_max_hash_for_scaled(scaled))\n    mh = MinHash(0, 4, track_abundance=track_abundance, scaled=scaled)\n    assert mh._max_hash == 2**61  # 2**64 / 2**3\n\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(30)\n\n    assert list(sorted(mh.hashes)) == [10, 20, 30]\n    mh.add_hash(2**62)\n    assert list(sorted(mh.hashes)) == [10, 20, 30]\n    mh.add_hash(2**63)\n    assert list(sorted(mh.hashes)) == [10, 20, 30]\n\n\ndef test_no_scaled(track_abundance):\n    # no 'scaled', num=0 - should fail\n    with pytest.raises(ValueError):\n        MinHash(0, 4, track_abundance=track_abundance)\n\n\ndef test_max_hash_conversion():\n    SCALED = 100000\n    max_hash = _get_max_hash_for_scaled(SCALED)\n    new_scaled = _get_scaled_for_max_hash(max_hash)\n    assert new_scaled == SCALED\n\n\ndef test_max_hash_and_scaled_zero():\n    max_hash = _get_max_hash_for_scaled(0)\n    new_scaled = _get_scaled_for_max_hash(0)\n    assert max_hash == new_scaled\n    assert max_hash == 0\n\n\ndef test_max_hash_and_scaled_error(track_abundance):\n    # test behavior when supplying both max_hash and scaled\n    with pytest.raises(ValueError):\n        MinHash(0, 4, track_abundance=track_abundance, max_hash=35, scaled=5)\n\n\ndef test_max_hash_cannot_limit(track_abundance):\n    # make sure you can't set both n and scaled.\n    with pytest.raises(ValueError):\n        MinHash(\n            2, 4, track_abundance=track_abundance, scaled=_get_scaled_for_max_hash(1)\n        )\n\n\ndef test_no_downsample_scaled_if_n(track_abundance):\n    # make sure you can't set max_n and then downsample scaled\n    mh = MinHash(2, 4, track_abundance=track_abundance)\n    with pytest.raises(ValueError) as excinfo:\n        mh.downsample(scaled=100000000)\n\n    assert \"cannot downsample a num MinHash using scaled\" in str(excinfo.value)\n\n\ndef test_scaled_num_both(track_abundance):\n    # make sure you can't set both max_n and scaled.\n    with pytest.raises(ValueError):\n        MinHash(2, 4, track_abundance=track_abundance, scaled=2)\n\n\ndef test_mh_jaccard_similarity():\n    # check actual Jaccard value for a non-trivial case\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=False)\n    b = MinHash(0, 20, scaled=scaled2, track_abundance=False)\n    a.add_many([1, 3, 5, 8])\n    b.add_many([1, 3, 5, 6, 8, 10])\n\n    assert a.similarity(b) == 4.0 / 6.0\n\n\ndef test_mh_similarity_downsample_jaccard_value():\n    # check jaccard value after downsampling\n\n    # max_hash = 50\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=False)\n    # max_hash = 100\n    b = MinHash(0, 20, scaled=scaled8, track_abundance=False)\n\n    a.add_many([1, 3, 5, 8, 2**62])\n    b.add_many([1, 3, 5, 6, 8, 10, 2**62])\n\n    # the hash=70 will be truncated by downsampling\n    assert a.similarity(b, downsample=True) == 4.0 / 6.0\n\n\ndef test_mh_angular_similarity():\n    # check actual angular similarity for a non-trivial case, taken from:\n    # https://www.sciencedirect.com/topics/computer-science/cosine-similarity\n    # note: angular similarity is 1 - 2*(acos(sim) / pi), when elements\n    # are always positive (https://en.wikipedia.org/wiki/Cosine_similarity)\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    b = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    a.set_abundances({1: 5, 3: 3, 5: 2, 8: 2})\n    b.set_abundances({1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1})\n\n    cos_sim = 0.9356\n    angular_sim = 1 - 2 * math.acos(cos_sim) / math.pi\n    assert round(angular_sim, 4) == 0.7703\n\n    assert round(a.similarity(b), 4) == round(angular_sim, 4)\n\n\ndef test_mh_angular_similarity_2():\n    # check actual angular similarity for a second non-trivial case\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    b = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    a.set_abundances({1: 5, 3: 3, 5: 2, 8: 2, 70: 70})\n    b.set_abundances({1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1, 70: 70})\n\n    assert round(a.similarity(b), 4) == 0.9728\n\n    # ignore_abundance => jaccard\n    assert a.similarity(b, ignore_abundance=True) == 5.0 / 7.0\n\n\ndef test_mh_similarity_downsample_angular_value():\n    # test downsample=True argument to MinHash.similarity\n\n    # max_hash = 50\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    # max_hash = 100\n    b = MinHash(0, 20, scaled=scaled8, track_abundance=True)\n\n    a.set_abundances({1: 5, 3: 3, 5: 2, 8: 2, 2**62: 70})\n    b.set_abundances({1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1, 2**62: 70})\n\n    # the hash=70 will be truncated by downsampling\n    sim = a.similarity(b, downsample=True)\n    assert round(sim, 4) == 0.7703\n\n    # with ignore_abundance, will be equal to jaccard\n    jaccard = a.similarity(b, downsample=True, ignore_abundance=True)\n    assert jaccard == 4.0 / 6.0\n\n\ndef test_mh_angular_similarity_fail():\n    # raise TypeError if calling angular_similarity directly and\n    # one or both sketches do not have abundance info\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=True)\n    b = MinHash(0, 20, scaled=scaled2, track_abundance=False)\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    a.set_abundances(a_values)\n    b.add_many(b_values.keys())\n\n    # one sketch lacks track_abundance\n    with pytest.raises(TypeError) as exc:\n        a.angular_similarity(b)\n    print(str(exc))\n    assert (\n        \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n        in str(exc)\n    )\n    # both sketches lack track abundance\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=False)\n    a.add_many(a_values.keys())\n    with pytest.raises(TypeError) as exc:\n        a.angular_similarity(b)\n    print(str(exc))\n    assert (\n        \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n        in str(exc)\n    )\n\n\ndef test_mh_similarity_downsample_true(track_abundance):\n    # verify sim(a, b) == sim(b, a), with and without ignore_abundance\n\n    # max_hash = 50\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=track_abundance)\n    # max_hash = 100\n    b = MinHash(0, 20, scaled=scaled8, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    # downsample=True => no error; values should match either way\n    x = a.similarity(b, ignore_abundance=True, downsample=True)\n    y = b.similarity(a, ignore_abundance=True, downsample=True)\n    assert x == y\n\n    # downsample=True => no error; values should match either way\n    x = a.similarity(b, ignore_abundance=False, downsample=True)\n    y = b.similarity(a, ignore_abundance=False, downsample=True)\n    assert x == y\n\n\ndef test_mh_similarity_downsample_errors(track_abundance):\n    # test downsample=False (default) argument to MinHash.similarity\n\n    # max_hash = 50\n    a = MinHash(0, 20, scaled=scaled2, track_abundance=track_abundance)\n    # max_hash = 100\n    b = MinHash(0, 20, scaled=scaled8, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    # error, incompatible max hash\n    with pytest.raises(ValueError) as e:\n        a.similarity(b, ignore_abundance=True)  # downsample=False\n    assert \"mismatch in scaled; comparison fail\" in str(e.value)\n\n    with pytest.raises(ValueError) as e:\n        a.similarity(b, ignore_abundance=False)  # downsample=False\n    assert \"mismatch in scaled; comparison fail\" in str(e.value)\n\n    with pytest.raises(ValueError) as e:\n        b.similarity(a, ignore_abundance=True)  # downsample=False\n    assert \"mismatch in scaled; comparison fail\" in str(e.value)\n\n    with pytest.raises(ValueError) as e:\n        b.similarity(a, ignore_abundance=False)  # downsample=false\n    assert \"mismatch in scaled; comparison fail\" in str(e.value)\n\n\ndef test_basic_dna_bad(track_abundance):\n    # test behavior on bad DNA\n    mh = MinHash(1, 4, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError) as e:\n        mh.add_sequence(\"ATGR\")\n    print(e)\n\n    assert \"invalid DNA character in input k-mer: ATGR\" in str(e.value)\n\n\ndef test_basic_dna_bad_2(track_abundance):\n    # test behavior on bad DNA\n    mh = MinHash(1, 6, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        mh.add_protein(\"YYYY\")\n\n\ndef test_basic_dna_bad_force(track_abundance):\n    # test behavior on bad DNA; use 100 so multiple hashes get added.\n    mh = MinHash(100, 4, track_abundance=track_abundance)\n    assert len(mh.hashes) == 0\n    mh.add_sequence(\"ATGN\", True)  # ambiguous kmer skipped.\n    assert len(mh.hashes) == 0\n    mh.add_sequence(\"AATGN\", True)  # but good k-mers still used.\n    assert len(mh.hashes) == 1\n    mh.add_sequence(\"AATG\", True)  # checking that right kmer was added\n    assert len(mh.hashes) == 1  # (only 1 hash <- this is a dup)\n\n\ndef test_basic_dna_bad_force_2(track_abundance):\n    # test behavior on bad DNA\n    mh = MinHash(100, 4, track_abundance=track_abundance)\n    assert len(mh.hashes) == 0\n    mh.add_sequence(\"AAGNCGG\", True)  # ambiguous kmers skipped.\n    assert len(mh.hashes) == 0\n    mh.add_sequence(\"AATGNGCGG\", True)  # ambiguous kmers skipped.\n    assert len(mh.hashes) == 2\n    mh.add_sequence(\"AATG\", True)  # checking that right kmers were added\n    mh.add_sequence(\"GCGG\", True)\n    assert len(mh.hashes) == 2  # (only 2 hashes should be there)\n\n\ndef test_consume_lowercase(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    b = MinHash(20, 10, track_abundance=track_abundance)\n\n    a.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\".lower())\n    b.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n\n    assert round(a.similarity(b), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n    assert round(b.similarity(a), 3) == 1.0\n    assert round(a.similarity(a), 3) == 1.0\n\n\ndef test_similarity_1(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    b = MinHash(20, 10, track_abundance=track_abundance)\n\n    a.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    b.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n\n    assert round(a.similarity(b), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n    assert round(b.similarity(a), 3) == 1.0\n    assert round(a.similarity(a), 3) == 1.0\n\n    # add same sequence again\n    b.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    assert round(a.similarity(b), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n    assert round(b.similarity(a), 3) == 1.0\n    assert round(a.similarity(a), 3) == 1.0\n\n    b.add_sequence(\"GATTGGTGCACACTTAACTGGGTGCCGCGCTGGTGCTGATCCATGAAGTT\")\n    x = a.similarity(b)\n    assert x >= 0.3, x\n\n    x = b.similarity(a)\n    assert x >= 0.3, x\n    assert round(a.similarity(a), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n\n\ndef test_copy(track_abundance):\n    a = MinHash(20, 21, track_abundance=track_abundance)\n    a.add_hash(5)\n    b = a.copy()\n    assert a == b\n    a.add_hash(6)\n    assert a != b\n\n\ndef test_frozen_copy(track_abundance):\n    a = MinHash(20, 21, track_abundance=track_abundance)\n    a.add_hash(5)\n    b = a.copy()\n    assert 5 in b.hashes\n    a.add_hash(6)\n    assert 6 not in b.hashes\n\n\ndef test_mh_copy(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n\n    a.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    b = a.__copy__()\n    assert round(b.similarity(a), 3) == 1.0\n\n\ndef test_mh_len(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n\n    assert len(a) == 0\n    a.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    assert len(a) == 20\n\n\ndef test_mh_len_2(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    assert list(sorted(a.hashes)) == list(range(0, 40, 2))\n\n\ndef test_mh_unsigned_long_long(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    a.add_hash(9227159859419181011)  # too big for a C long int.\n    assert 9227159859419181011 in a.hashes\n\n\ndef test_mh_count_common(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    b = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    assert a.count_common(b) == 10\n    assert b.count_common(a) == 10\n\n\ndef test_mh_count_common_diff_protein(track_abundance):\n    a = MinHash(20, 5, is_protein=False, track_abundance=track_abundance)\n    b = MinHash(20, 5, is_protein=True, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.count_common(b)\n\n\ndef test_mh_count_common_diff_maxhash(track_abundance):\n    a = MinHash(\n        0,\n        5,\n        is_protein=False,\n        track_abundance=track_abundance,\n        scaled=scaled8,\n    )\n    b = MinHash(\n        0,\n        5,\n        is_protein=True,\n        track_abundance=track_abundance,\n        scaled=scaled4,\n    )\n\n    with pytest.raises(ValueError):\n        a.count_common(b)\n\n\ndef test_mh_count_common_diff_seed(track_abundance):\n    a = MinHash(20, 5, is_protein=False, track_abundance=track_abundance, seed=1)\n    b = MinHash(20, 5, is_protein=True, track_abundance=track_abundance, seed=2)\n\n    with pytest.raises(ValueError):\n        a.count_common(b)\n\n\ndef test_mh_count_common_diff_ksize(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    b = MinHash(20, 6, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.count_common(b)\n\n\ndef test_mh_count_common_notmh(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    b = set()\n\n    with pytest.raises(TypeError):\n        a.count_common(b)\n\n\ndef test_mh_downsample_num_error(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    with pytest.raises(ValueError):\n        a.downsample(num=30)\n\n\ndef test_mh_jaccard_asymmetric_num(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    # different size: 10\n    b = MinHash(10, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    assert a.count_common(b) == 10\n    assert b.count_common(a) == 10\n\n    # with 'jaccard', this will raise an error b/c different num\n    with pytest.raises(TypeError):\n        a.jaccard(b)\n\n    a = a.downsample(num=10)\n    # CTB note: this used to be 'compare', is now 'jaccard'\n    assert a.jaccard(b) == 0.5\n    assert b.jaccard(a) == 0.5\n\n\ndef test_mh_merge_typeerror(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    with pytest.raises(TypeError):\n        a.merge(set())\n\n\ndef test_mh_merge(track_abundance):\n    # test merging two identically configured minhashes\n    a = MinHash(100, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    b = MinHash(100, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c.merge(b)\n\n    d = b.__copy__()\n    d.merge(a)\n\n    assert len(c) == len(d)\n    assert list(sorted(c.hashes.items())) == list(sorted(d.hashes.items()))\n\n    assert round(c.similarity(d), 3) == 1.0\n    assert round(d.similarity(c), 3) == 1.0\n\n\ndef test_mh_merge_empty_num(track_abundance):\n    # test merging two identically configured minhashes, one empty\n    a = MinHash(100, 10, track_abundance=track_abundance)\n\n    b = MinHash(100, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c.merge(b)\n\n    d = b.__copy__()\n    d.merge(a)\n\n    assert len(c)\n    assert len(c) == len(d)\n\n    assert list(sorted(c.hashes.items())) == list(sorted(d.hashes.items()))\n    assert round(c.similarity(d), 3) == 1.0\n    assert round(d.similarity(c), 3) == 1.0\n\n\ndef test_mh_merge_empty_scaled(track_abundance):\n    # test merging two identically configured minhashes, one empty\n    a = MinHash(0, 10, scaled=1, track_abundance=track_abundance)\n\n    b = MinHash(0, 10, scaled=1, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c.merge(b)\n\n    d = b.__copy__()\n    d.merge(a)\n\n    assert len(c)\n    assert len(c) == len(d)\n\n    assert list(sorted(c.hashes.items())) == list(sorted(d.hashes.items()))\n    assert round(c.similarity(d), 3) == 1.0\n    assert round(d.similarity(c), 3) == 1.0\n\n\ndef test_mh_merge_check_length(track_abundance):\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    b = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c.merge(b)\n    assert len(c.hashes) == 20\n\n\ndef test_mh_merge_check_length2(track_abundance):\n    # merged MH doesn't have full number of elements\n    a = MinHash(4, 10, track_abundance=track_abundance)\n    a.add_hash(3)\n    a.add_hash(1)\n    a.add_hash(4)\n\n    b = MinHash(4, 10, track_abundance=track_abundance)\n    b.add_hash(3)\n    b.add_hash(1)\n    b.add_hash(4)\n\n    c = a.__copy__()\n    c.merge(b)\n    assert len(c.hashes) == 3\n\n\ndef test_mh_asymmetric_merge(track_abundance):\n    # test merging two asymmetric (different size) MHs\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    # different size: 10\n    b = MinHash(10, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c.merge(b)\n    d = b.__copy__()\n    d.merge(a)\n\n    assert len(a) == 20\n    assert len(b) == 10\n    assert len(c) == len(a)\n    assert len(d) == len(b)\n\n    # can't use jaccard on different nums without downsampling\n    with pytest.raises(TypeError):\n        d.jaccard(a)\n\n    a = a.downsample(num=d.num)\n\n    if track_abundance:\n        assert round(d.similarity(a), 3) == 0.795\n    else:\n        assert round(d.similarity(a), 3) == 1.0\n\n    c = c.downsample(num=b.num)\n    if track_abundance:\n        assert round(c.similarity(b), 3) == 0.436\n    else:\n        assert c.similarity(b) == 0.5\n\n\ndef test_mh_inplace_concat_asymmetric(track_abundance):\n    # test merging two asymmetric (different size) MHs\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    # different size: 10\n    b = MinHash(10, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c += b\n\n    d = b.__copy__()\n    d += a\n\n    assert len(a) == 20\n    assert len(b) == 10\n    assert len(c) == len(a)\n    assert len(d) == len(b)\n\n    try:\n        d.similarity(a)\n    except TypeError as exc:\n        assert \"must have same num\" in str(exc)\n\n    a = a.downsample(num=d.num)\n    if track_abundance:\n        assert round(d.similarity(a), 3) == 0.795  # see: d += a, above.\n    else:\n        assert d.similarity(a) == 1.0  # see: d += a, above.\n\n    c = c.downsample(num=b.num)\n    if track_abundance:\n        assert round(c.similarity(b), 3) == 0.436\n    else:\n        assert c.similarity(b) == 0.5\n\n\ndef test_mh_inplace_concat(track_abundance):\n    # test merging two identically configured minhashes\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    b = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 80, 4):\n        b.add_hash(i)\n\n    c = a.__copy__()\n    c += b\n    d = b.__copy__()\n    d += a\n\n    assert len(c) == len(d)\n    assert c.hashes == d.hashes\n    assert round(c.similarity(d), 3) == 1.0\n    assert round(d.similarity(c), 3) == 1.0\n\n\ndef test_mh_merge_diff_protein(track_abundance):\n    a = MinHash(20, 5, is_protein=False, track_abundance=track_abundance)\n    b = MinHash(20, 5, is_protein=True, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.merge(b)\n\n\ndef test_mh_merge_diff_ksize(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    b = MinHash(20, 6, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.merge(b)\n\n\ndef test_mh_similarity_diff_protein(track_abundance):\n    a = MinHash(20, 5, is_protein=False, track_abundance=track_abundance)\n    b = MinHash(20, 5, is_protein=True, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.similarity(b)\n\n\ndef test_mh_similarity_diff_ksize(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    b = MinHash(20, 6, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a.similarity(b)\n\n\ndef test_mh_similarity_diff_seed(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance, seed=1)\n    b = MinHash(20, 5, track_abundance=track_abundance, seed=2)\n\n    with pytest.raises(ValueError):\n        a.similarity(b)\n\n\ndef test_mh_compare_diff_max_hash(track_abundance):\n    a = MinHash(0, 5, track_abundance=track_abundance, scaled=scaled2)\n\n    b = MinHash(0, 5, track_abundance=track_abundance, scaled=scaled4)\n\n    with pytest.raises(ValueError):\n        a.similarity(b)\n\n\ndef test_mh_concat_diff_protein(track_abundance):\n    a = MinHash(20, 5, is_protein=False, track_abundance=track_abundance)\n    b = MinHash(20, 5, is_protein=True, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a += b\n\n\ndef test_mh_concat_diff_ksize(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    b = MinHash(20, 6, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        a += b\n\n\ndef test_mh_concat_diff_max_hash(track_abundance):\n    a = MinHash(0, 5, track_abundance=track_abundance, scaled=scaled8)\n    b = MinHash(0, 5, track_abundance=track_abundance, scaled=scaled4)\n\n    with pytest.raises(ValueError):\n        a += b\n\n\ndef test_mh_concat_diff_seed(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance, seed=1)\n    b = MinHash(20, 5, track_abundance=track_abundance, seed=2)\n\n    with pytest.raises(ValueError):\n        a += b\n\n\ndef test_short_sequence(track_abundance):\n    a = MinHash(20, 5, track_abundance=track_abundance)\n    a.add_sequence(\"GGGG\")\n    # adding a short sequence should fail silently\n    assert len(a.hashes) == 0\n\n\ndef test_bytes_murmur():\n    x = hash_murmur(\"ACG\")\n    assert x == 1731421407650554201\n\n    x = hash_murmur(b\"ACG\")\n    assert x == 1731421407650554201\n\n    x = hash_murmur(\"ACG\")\n    assert x == 1731421407650554201\n\n\ndef test_murmur():\n    x = hash_murmur(\"ACG\")\n    assert x == 1731421407650554201\n\n    try:\n        x = hash_murmur()\n        assert 0, \"hash_murmur requires an argument\"\n    except TypeError:\n        pass\n\n    x = hash_murmur(\"ACG\", 42)\n    assert x == 1731421407650554201\n\n    y = hash_murmur(\"ACG\", 43)\n    assert y != x\n\n\ndef test_abundance_simple():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_sequence(\"AAAAA\")\n    assert list(a.hashes) == [2110480117637990133]\n    assert a.hashes == {2110480117637990133: 1}\n\n    a.add_sequence(\"AAAAA\")\n    assert list(a.hashes) == [2110480117637990133]\n    assert a.hashes == {2110480117637990133: 2}\n\n\ndef test_add_hash_with_abundance():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_hash_with_abundance(10, 1)\n    assert a.hashes == {10: 1}\n\n    a.add_hash_with_abundance(20, 2)\n    assert a.hashes == {10: 1, 20: 2}\n\n    a.add_hash_with_abundance(10, 2)\n    assert a.hashes == {10: 3, 20: 2}\n\n\ndef test_add_hash_with_abundance_2():\n    a = MinHash(20, 5, is_protein=False, track_abundance=False)\n\n    with pytest.raises(RuntimeError) as e:\n        a.add_hash_with_abundance(10, 1)\n\n    assert \"track_abundance=True when constructing\" in e.value.args[0]\n\n\ndef test_clear():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_hash(10)\n    assert a.hashes == {10: 1}\n\n    a.clear()\n    assert a.hashes == {}\n\n\ndef test_clear_2():\n    a = MinHash(20, 5, is_protein=False, track_abundance=False)\n\n    a.add_hash(10)\n    assert list(a.hashes) == [10]\n\n    a.clear()\n    assert list(a.hashes) == []\n\n\ndef test_abundance_simple_2():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n    b = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_sequence(\"AAAAA\")\n    assert list(a.hashes) == [2110480117637990133]\n    assert a.hashes == {2110480117637990133: 1}\n\n    a.add_sequence(\"AAAAA\")\n    assert list(a.hashes) == [2110480117637990133]\n    assert a.hashes == {2110480117637990133: 2}\n\n    b.add_sequence(\"AAAAA\")\n    assert a.count_common(b) == 1\n\n\ndef test_abundance_count_common():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n    b = MinHash(20, 5, is_protein=False, track_abundance=False)\n\n    a.add_sequence(\"AAAAA\")\n    a.add_sequence(\"AAAAA\")\n    assert list(a.hashes) == [2110480117637990133]\n    assert a.hashes == {2110480117637990133: 2}\n\n    b.add_sequence(\"AAAAA\")\n    b.add_sequence(\"GGGGG\")\n    assert a.count_common(b) == 1\n    assert a.count_common(b) == b.count_common(a)\n\n    assert list(sorted(b.hashes)) == [2110480117637990133, 10798773792509008305]\n\n\ndef test_abundance_similarity():\n    a = MinHash(20, 10, track_abundance=True)\n    b = MinHash(20, 10, track_abundance=False)\n\n    a.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    b.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n\n    assert round(a.similarity(b), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n    assert round(b.similarity(a), 3) == 1.0\n    assert round(a.similarity(a), 3) == 1.0\n\n    # add same sequence again\n    b.add_sequence(\"TGCCGCCCAGCACCGGGTGACTAGGTTGAGCCATGATTAACCTGCAATGA\")\n    assert round(a.similarity(b), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n    assert round(b.similarity(a), 3) == 1.0\n    assert round(a.similarity(a), 3) == 1.0\n\n    b.add_sequence(\"GATTGGTGCACACTTAACTGGGTGCCGCGCTGGTGCTGATCCATGAAGTT\")\n    x = a.similarity(b)\n    assert x >= 0.3, x\n\n    x = b.similarity(a)\n    assert x >= 0.3, x\n    assert round(a.similarity(a), 3) == 1.0\n    assert round(b.similarity(b), 3) == 1.0\n\n\ndef test_set_abundance():\n    a = MinHash(20, 10, track_abundance=False)\n\n    with pytest.raises(RuntimeError) as e:\n        a.set_abundances({1: 3, 2: 4})\n\n    assert \"track_abundance=True when constructing\" in e.value.args[0]\n\n\ndef test_set_abundance_2():\n    datapath = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    sig = load_one_signature(datapath, ksize=30, select_moltype=\"DNA\")\n    new_mh = sig.minhash.copy_and_clear()\n    mins = sig.minhash.hashes\n    mins = {k: 1 for k in mins}\n    new_mh.track_abundance = True\n    new_mh.set_abundances(mins)\n\n    assert set(new_mh.hashes) == set(mins)\n\n\ndef test_set_abundance_clear():\n    # on empty minhash, clear should have no effect\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n    b = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.set_abundances({1: 3, 2: 4}, clear=True)\n    b.set_abundances({1: 3, 2: 4}, clear=False)\n\n    assert list(sorted(a.hashes)) == list(sorted(b.hashes))\n\n\ndef test_set_abundance_clear_2():\n    # default should be clear=True\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_hash(10)\n    assert a.hashes == {10: 1}\n\n    a.set_abundances({20: 2})\n    assert a.hashes == {20: 2}\n\n\ndef test_set_abundance_clear_3():\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.add_hash(10)\n    assert a.hashes == {10: 1}\n\n    a.set_abundances({20: 1, 30: 4}, clear=False)\n    assert a.hashes == {10: 1, 20: 1, 30: 4}\n\n\ndef test_set_abundance_clear_4():\n    # setting the abundance of an already set hash should add\n    # the abundances together\n    a = MinHash(20, 5, is_protein=False, track_abundance=True)\n\n    a.set_abundances({20: 2, 10: 1}, clear=False)  # should also sort the hashes\n    assert a.hashes == {10: 1, 20: 2}\n\n    a.set_abundances({20: 1, 10: 2}, clear=False)\n    assert a.hashes == {10: 3, 20: 3}\n\n\ndef test_clear_abundance_on_zero():\n    mh = sourmash.minhash.MinHash(n=0, ksize=31, scaled=1, track_abundance=True)\n    mh.set_abundances({1: 5, 2: 3, 3: 5})\n    mh.set_abundances({1: 0}, clear=False)\n    assert 1 not in dict(mh.hashes)\n    assert dict(mh.hashes)[2] == 3\n    assert dict(mh.hashes)[3] == 5\n    assert len(mh) == 2\n\n    with pytest.raises(ValueError):\n        mh.set_abundances({2: -1})  # Test on clear = True\n\n    with pytest.raises(ValueError):\n        mh.set_abundances({2: -1}, clear=False)\n\n    assert len(mh) == 2  # Assert that nothing was affected\n\n\ndef test_reset_abundance_initialized():\n    a = MinHash(1, 4, track_abundance=True)\n    a.add_sequence(\"ATGC\")\n\n    # If we had a minhash with abundances and drop it, this shouldn't fail.\n    # Convert from Abundance to Regular MinHash\n    a.track_abundance = False\n\n    assert list(a.hashes) == [12415348535738636339]\n\n\ndef test_set_abundance_initialized():\n    a = MinHash(1, 4, track_abundance=False)\n    a.add_sequence(\"ATGC\")\n\n    with pytest.raises(RuntimeError) as e:\n        a.track_abundance = True\n\n    assert (\n        \"Can only set track_abundance=True if the MinHash is empty\" in e.value.args[0]\n    )\n\n\ndef test_set_abundance_num():\n    a = MinHash(2, 10, track_abundance=True)\n\n    a.set_abundances({1: 3, 2: 4})\n\n    assert a.hashes == {1: 3, 2: 4}\n\n\ndef test_mh_copy_and_clear(track_abundance):\n    # test basic creation of new, empty MinHash\n    a = MinHash(20, 10, track_abundance=track_abundance)\n    for i in range(0, 40, 2):\n        a.add_hash(i)\n\n    b = a.copy_and_clear()\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == 0\n    assert not b.is_protein\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == 0\n    assert a.scaled == b.scaled\n    assert b.scaled == 0\n\n\ndef test_mh_copy_and_clear_with_max_hash(track_abundance):\n    # test basic creation of new, empty MinHash w/max_hash param set\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = a.copy_and_clear()\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == 2**61\n    assert not b.is_protein\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == 0\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_scaled_property(track_abundance):\n    scaled = 10000\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled)\n    assert a.scaled == scaled\n\n\ndef test_pickle_protein(track_abundance):\n    # check that protein/etc ksize is handled properly during serialization.\n    a = MinHash(\n        0,\n        10,\n        track_abundance=track_abundance,\n        is_protein=True,\n        scaled=scaled8,\n    )\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = pickle.loads(pickle.dumps(a))\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == a._max_hash\n    assert b._max_hash == 2**61\n    assert b.is_protein\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == len(a.hashes)\n    assert len(b.hashes) == 18\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_pickle_dayhoff(track_abundance):\n    # check that dayhoff ksize is handled properly during serialization.\n    a = MinHash(\n        0,\n        10,\n        track_abundance=track_abundance,\n        dayhoff=True,\n        scaled=scaled8,\n    )\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = pickle.loads(pickle.dumps(a))\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == a._max_hash\n    assert b._max_hash == 2**61\n    assert b.dayhoff\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == len(a.hashes)\n    assert len(b.hashes) == 18\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_pickle_hp(track_abundance):\n    # check that hp ksize is handled properly during serialization.\n    a = MinHash(\n        0,\n        10,\n        track_abundance=track_abundance,\n        hp=True,\n        scaled=scaled8,\n    )\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = pickle.loads(pickle.dumps(a))\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == a._max_hash\n    assert b._max_hash == 2**61\n    assert b.hp\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == len(a.hashes)\n    assert len(b.hashes) == 18\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_pickle_max_hash(track_abundance):\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = pickle.loads(pickle.dumps(a))\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == a._max_hash\n    assert b._max_hash == 2**61\n    assert not b.is_protein\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == len(a.hashes)\n    assert len(b.hashes) == 18\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_pickle_scaled(track_abundance):\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    for i in range(44, 64):\n        a.add_hash(2**i)\n\n    b = pickle.loads(pickle.dumps(a))\n    assert a.ksize == b.ksize\n    assert b.num == a.num\n    assert b._max_hash == a._max_hash\n    assert b._max_hash == 2**61\n    assert not b.is_protein\n    assert b.track_abundance == track_abundance\n    assert b.seed == a.seed\n    assert len(b.hashes) == len(a.hashes)\n    assert len(b.hashes) == 18\n    assert a.scaled == b.scaled\n    assert b.scaled != 0\n\n\ndef test_minhash_abund_add():\n    # this targets part of bug #319, a segfault caused by invalidation of\n    # std::vector iterators upon vector resizing - in this case, there\n    # was also a bug in inserting into the middle of mins when scaled was set.\n\n    a = MinHash(0, 10, track_abundance=True, scaled=scaled8)\n\n    n = 0\n    for i in range(10, 0, -1):\n        a.add_hash(i)\n        n += 1\n        assert len(a.hashes) == n\n        print(len(a.hashes))\n\n\ndef test_minhash_abund_capacity_increase():\n    # this targets bug #319, a segfault caused by invalidation of\n    # std::vector iterators upon vector resizing.\n\n    # this should set capacity to 1000 - see KmerMinHash constructor call\n    # to 'reserve' when n > 0 for specific parameter.\n    a = MinHash(0, 10, track_abundance=True, scaled=scaled8)\n\n    # 1001 is dependent on the value passed to reserve (currently 1000).\n    for i in range(1001, 0, -1):\n        a.add_hash(i)\n\n\ndef test_minhash_abund_merge_flat():\n    # this targets a segfault caused by trying to compute similarity\n    # of a signature with abundance and a signature without abundance.\n    # the correct behavior for now is to calculate simple Jaccard,\n    # i.e. 'flatten' both of them.\n    a = MinHash(0, 10, track_abundance=True, scaled=scaled8)\n    b = MinHash(0, 10, scaled=scaled8)\n\n    for i in range(0, 10, 2):\n        a.add_hash(i)\n\n    for j in range(0, 10, 3):\n        b.add_hash(i)\n\n    # these crashed, previously.\n    assert a.similarity(b) == 0.2\n    assert b.similarity(a) == 0.2\n\n\ndef test_minhash_abund_merge_flat_2():\n    # this targets a segfault caused by trying to merge\n    # a signature with abundance and a signature without abundance.\n\n    a = MinHash(0, 10, track_abundance=True, scaled=scaled2)\n    b = MinHash(0, 10, scaled=scaled2)\n\n    for i in range(0, 10, 2):\n        a.add_hash(i)\n\n    for j in range(0, 10, 3):\n        b.add_hash(i)\n\n    a.merge(b)\n\n\ndef test_distance_matrix(track_abundance):\n    import numpy\n\n    siglist = [\n        next(signature.load_signatures_from_json(utils.get_test_data(f)))\n        for f in utils.SIG_FILES\n    ]\n\n    D1 = numpy.zeros([len(siglist), len(siglist)])\n    D2 = numpy.zeros([len(siglist), len(siglist)])\n\n    for i, E in enumerate(siglist):\n        for j, E2 in enumerate(siglist):\n            if i < j:\n                continue\n            similarity = E.similarity(E2, track_abundance)\n            D2[i][j] = similarity\n            D2[j][i] = similarity\n\n    for i, E in enumerate(siglist):\n        for j, E2 in enumerate(siglist):\n            D1[i][j] = E.similarity(E2, track_abundance)\n\n    assert numpy.array_equal(D1, D2)\n\n\ndef test_remove_many(track_abundance):\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled2)\n\n    a.add_many(list(range(0, 100, 2)))\n\n    orig_sig = signature.SourmashSignature(a)\n    orig_md5 = orig_sig.md5sum()\n\n    a.remove_many(list(range(0, 100, 3)))\n    new_sig = signature.SourmashSignature(a)\n    new_md5 = new_sig.md5sum()\n\n    assert orig_md5 == \"f1cc295157374f5c07cfca5f867188a1\"\n    assert new_md5 == \"dd93fa319ef57f4a019c59ee1a8c73e2\"\n    assert orig_md5 != new_md5\n\n    assert len(a) == 33\n    assert all(c % 6 != 0 for c in a.hashes)\n\n\ndef test_remove_minhash(track_abundance):\n    original_mh = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    added_mh = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    tested_mh = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n\n    original_mh.add_many([2**i for i in range(62)])\n    added_mh.add_many([2**63])  # contains original in it\n    tested_mh.add_many([2**i for i in range(63)])  # original + added\n\n    # Now we should expect tested_minhash == original_minhash\n    # Note we are passing a MinHash object instead of an iterable object\n    tested_mh.remove_many(added_mh)\n\n    # Assertion\n    original_sig = signature.SourmashSignature(original_mh)\n    tested_sig = signature.SourmashSignature(tested_mh)\n\n    # Should pass if the hashes list in the same order\n    assert original_mh.hashes == tested_mh.hashes\n    assert len(original_mh) == len(tested_mh)\n    assert original_sig.md5sum() == tested_sig.md5sum()\n\n\ndef test_add_many(track_abundance):\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    b = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n\n    a.add_many(list(range(0, 100, 2)))\n    a.add_many(list(range(0, 100, 2)))  # => abundance = 2\n\n    assert len(a) == 50\n    assert all(c % 2 == 0 for c in a.hashes)\n\n    for h in range(0, 100, 2):\n        b.add_hash(h)\n        b.add_hash(h)\n\n    assert len(b) == 50\n    assert a == b\n\n\ndef test_set_abundances_huge():\n    max_hash = _get_max_hash_for_scaled(2**31)\n    a = MinHash(0, 10, track_abundance=True, scaled=_get_scaled_for_max_hash(max_hash))\n\n    hashes = [2**i for i in range(64)]\n    abundances = itertools.repeat(2)\n\n    a.set_abundances(dict(zip(hashes, abundances)))\n\n\ndef test_try_change_hashes(track_abundance):\n    a = MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n    MinHash(0, 10, track_abundance=track_abundance, scaled=scaled8)\n\n    a.add_many(list(range(0, 100, 2)))\n\n    h = a.hashes\n    with pytest.raises(RuntimeError):\n        h[5] = 10\n\n\ndef test_flatten():\n    # test behavior with scaled\n    scaled = scaled8\n    mh = MinHash(0, 4, track_abundance=True, scaled=scaled)\n    assert mh._max_hash == 2**61\n\n    mh.add_hash(10)\n    mh.add_hash(10)\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(20)\n    mh.add_hash(30)\n    mh.add_hash(30)\n    mh.add_hash(30)\n\n    assert mh.hashes[10] == 3\n    assert mh.hashes[20] == 2\n    assert mh.hashes[30] == 3\n\n    mh2 = mh.flatten()\n\n    assert mh2.hashes[10] == 1\n    assert mh2.hashes[20] == 1\n    assert mh2.hashes[30] == 1\n    assert len(mh2) == 3\n\n\ndef test_inflate():\n    # test behavior of inflate function\n    scaled = scaled2\n    mh = MinHash(0, 4, track_abundance=False, scaled=scaled)\n    mh2 = MinHash(0, 4, track_abundance=True, scaled=scaled)\n    assert mh._max_hash == 2**63\n\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(30)\n\n    assert mh.hashes[10] == 1\n    assert mh.hashes[20] == 1\n    assert mh.hashes[30] == 1\n\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(20)\n    mh2.add_hash(20)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n\n    assert mh2.hashes[10] == 3\n    assert mh2.hashes[20] == 2\n    assert mh2.hashes[30] == 3\n\n    mh3 = mh.inflate(mh2)\n\n    assert mh3.hashes[10] == 3\n    assert mh3.hashes[20] == 2\n    assert mh3.hashes[30] == 3\n\n\ndef test_inflate_error():\n    # test behavior of inflate function with 'self' as an abund sketch\n    scaled = scaled2\n    mh = MinHash(0, 4, track_abundance=True, scaled=scaled)\n    mh2 = MinHash(0, 4, track_abundance=True, scaled=scaled)\n    assert mh._max_hash == 2**63\n\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(30)\n\n    assert mh.hashes[10] == 1\n    assert mh.hashes[20] == 1\n    assert mh.hashes[30] == 1\n\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(20)\n    mh2.add_hash(20)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n\n    assert mh2.hashes[10] == 3\n    assert mh2.hashes[20] == 2\n    assert mh2.hashes[30] == 3\n\n    with pytest.raises(ValueError) as exc:\n        mh = mh.inflate(mh2)\n\n    assert (\n        \"inflate operates on a flat MinHash and takes a MinHash object with track_abundance=True\"\n        in str(exc.value)\n    )\n\n\ndef test_inflate_not_a_subset():\n    # test behavior of inflate function when 'from_mh' is not a subset.\n    scaled = scaled2\n    mh = MinHash(0, 4, track_abundance=False, scaled=scaled)\n    mh2 = MinHash(0, 4, track_abundance=True, scaled=scaled)\n    assert mh._max_hash == 2**63\n\n    mh.add_hash(10)\n    mh.add_hash(20)\n    mh.add_hash(30)\n\n    assert mh.hashes[10] == 1\n    assert mh.hashes[20] == 1\n    assert mh.hashes[30] == 1\n\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(10)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n    mh2.add_hash(30)\n\n    assert mh2.hashes[10] == 3\n    assert 20 not in mh2.hashes\n    assert mh2.hashes[30] == 3\n\n    mh3 = mh.inflate(mh2)\n\n    assert mh3.hashes[10] == 3\n    assert 20 not in mh3.hashes  # should intersect, in this case.\n    assert mh3.hashes[30] == 3\n\n\ndef test_add_kmer(track_abundance):\n    # test add_kmer method\n    mh1 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_sequence(\"ATGCGTGC\")\n    a = mh1.hashes\n\n    mh2.add_kmer(\"ATGC\")\n    mh2.add_kmer(\"TGCG\")\n    mh2.add_kmer(\"GCGT\")\n    mh2.add_kmer(\"CGTG\")\n    mh2.add_kmer(\"GTGC\")\n    b = mh2.hashes\n\n    assert set(a.items()) == set(b.items())\n\n\ndef test_add_kmer_too_long(track_abundance):\n    # test add_kmer method - should only take length k\n    mh1 = MinHash(0, 4, scaled=1, track_abundance=track_abundance)\n\n    with pytest.raises(ValueError):\n        mh1.add_kmer(\"ATGCGTGC\")\n\n\ndef test_get_mins_deprecated(track_abundance):\n    mh = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mins = (28945103950853965, 74690756200987412, 82962372765557409)\n\n    mh.add_many(mins)\n    mh.add_many(mins)\n    mh.add_many(mins)\n    mh.add_many(mins)\n\n    with pytest.warns(DeprecationWarning):\n        assert set(mh.get_mins()) == set(mins)\n        if track_abundance:\n            d = mh.get_mins(with_abundance=True)\n            for k in mins:\n                assert d[k] == 4\n            assert len(d) == len(mins)\n\n\ndef test_get_hashes_deprecated(track_abundance):\n    mh = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mins = (28945103950853965, 74690756200987412, 82962372765557409)\n\n    mh.add_many(mins)\n    mh.add_many(mins)\n    mh.add_many(mins)\n    mh.add_many(mins)\n\n    with pytest.warns(DeprecationWarning):\n        assert set(mh.get_hashes()) == set(mins)\n\n\ndef test_downsample_num(track_abundance):\n    # test downsample(num=...) function\n    mh = MinHash(10, 21, track_abundance=track_abundance)\n    for i in range(20):\n        mh.add_hash(i)\n\n    assert mh.num == 10\n    assert len(mh) == 10\n\n    assert list(sorted(mh.hashes)) == list(range(10))\n\n    mh2 = mh.downsample(num=5)\n    assert mh2.num == 5\n    assert len(mh2) == 5\n\n    assert list(sorted(mh2.hashes)) == list(range(5))\n\n\ndef test_downsample_scaled(track_abundance):\n    # test downsample(scaled...) method\n    mh = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mins = (\n        1,\n        2,\n        3,\n        9223372036854775808 + 1,\n        9223372036854775808 + 2,\n        9223372036854775808 + 3,\n    )\n    mh.add_many(mins)\n\n    assert len(mh) == 6\n    assert list(sorted(mh.hashes)) == list(mins)\n\n    mh2 = mh.downsample(scaled=2)\n    print(mh._max_hash, mh2._max_hash)\n\n    assert len(mh2) == 3\n    assert list(sorted(mh2.hashes)) == list(mins[:3])\n\n\ndef test_is_molecule_type_1(track_abundance):\n    mh = MinHash(1, 21, track_abundance=track_abundance)\n    assert mh.moltype == \"DNA\"\n    assert mh.is_dna\n    assert not mh.is_protein\n    assert not mh.hp\n    assert not mh.dayhoff\n\n\ndef test_is_molecule_type_2(track_abundance):\n    mh = MinHash(1, 21, track_abundance=track_abundance, is_protein=True)\n    assert mh.moltype == \"protein\"\n    assert not mh.is_dna\n    assert mh.is_protein\n    assert not mh.hp\n    assert not mh.dayhoff\n\n\ndef test_is_molecule_type_3(track_abundance):\n    mh = MinHash(1, 21, track_abundance=track_abundance, hp=True)\n    assert mh.moltype == \"hp\"\n    assert not mh.is_dna\n    assert not mh.is_protein\n    assert mh.hp\n    assert not mh.dayhoff\n\n\ndef test_is_molecule_type_4(track_abundance):\n    mh = MinHash(1, 21, track_abundance=track_abundance, dayhoff=True)\n    assert mh.moltype == \"dayhoff\"\n    assert not mh.is_dna\n    assert not mh.is_protein\n    assert not mh.hp\n    assert mh.dayhoff\n\n\ndef test_addition_num_incompatible():\n    mh1 = MinHash(10, 21)\n    mh2 = MinHash(20, 21)\n\n    mh1.add_hash(0)\n    mh2.add_hash(1)\n\n    with pytest.raises(TypeError) as exc:\n        mh1 + mh2\n\n    assert \"incompatible num values: self=10 other=20\" in str(exc.value)\n\n\ndef test_addition_abund():\n    mh1 = MinHash(10, 21, track_abundance=True)\n    mh2 = MinHash(10, 21, track_abundance=True)\n\n    mh1.set_abundances({0: 1})\n    mh2.set_abundances({0: 3})\n\n    mh3 = mh1 + mh2\n    hashcounts = mh3.hashes\n    assert len(hashcounts) == 1\n\n    assert hashcounts[0] == 4\n\n\ndef test_addition_noabund():\n    mh1 = MinHash(10, 21, track_abundance=False)\n    mh2 = MinHash(10, 21, track_abundance=False)\n\n    mh1.add_hash(0)\n    mh2.add_hash(0)\n\n    mh3 = mh1 + mh2\n    hashcounts = mh3.hashes\n    assert len(hashcounts) == 1\n    assert hashcounts[0] == 1\n\n\ndef test_iaddition_abund():\n    mh1 = MinHash(10, 21, track_abundance=True)\n    mh2 = MinHash(10, 21, track_abundance=True)\n\n    mh1.set_abundances({0: 1})\n    mh2.set_abundances({0: 3})\n\n    mh1 += mh2\n    hashcounts = mh1.hashes\n    assert len(hashcounts) == 1\n    assert hashcounts[0] == 4\n\n    hashcounts2 = mh2.hashes\n    assert len(hashcounts2) == 1\n    assert hashcounts2[0] == 3\n\n\ndef test_iaddition_noabund():\n    mh1 = MinHash(10, 21, track_abundance=False)\n    mh2 = MinHash(10, 21, track_abundance=False)\n\n    mh1.add_hash(0)\n    mh2.add_hash(0)\n\n    mh1 += mh2\n    hashcounts = mh1.hashes\n    assert len(hashcounts) == 1\n    assert hashcounts[0] == 1\n\n\ndef test_intersection_1_num():\n    mh1 = MinHash(10, 21)\n    mh2 = MinHash(10, 21)\n\n    mh1.add_hash(0)\n    mh1.add_hash(1)\n    mh2.add_hash(0)\n    mh2.add_hash(2)\n\n    mh3 = mh1.intersection(mh2)\n    print(\"mh.intersection INTERSECTION HASHES:\", set(mh3.hashes))\n    assert len(mh3) == 1\n    assert 0 in mh3.hashes\n\n\ndef test_and_operator():\n    mh1 = MinHash(20, 21)\n    mh1.add_hash(5)\n    mh1.add_hash(6)\n    mh2 = MinHash(20, 21)\n    mh2.add_hash(6)\n    mh2.add_hash(7)\n\n    print(\"\\n \\n mh1 EQUALS \", mh1.hashes, \"\\n mh2 EQUALS\", mh2.hashes)\n\n    mh3 = mh1.intersection(mh2)\n    mh4 = mh1 & mh2\n\n    print(\n        \"\\n Intersection hashes (mh3): \", mh3.hashes, \"\\n '&' hashes: (mh4)\", mh4.hashes\n    )\n\n    assert mh3\n    assert mh3 == mh4\n\n\ndef test_intersection_2_scaled():\n    mh1 = MinHash(0, 21, scaled=1)\n    mh2 = MinHash(0, 21, scaled=1)\n\n    mh1.add_hash(0)\n    mh1.add_hash(1)\n    mh2.add_hash(0)\n    mh2.add_hash(2)\n\n    mh3 = mh1.intersection(mh2)\n    print(set(mh3.hashes))\n    assert len(mh3) == 1\n    assert 0 in mh3.hashes\n\n\ndef test_intersection_3_abundance_error():\n    # cannot intersect abundance MinHash\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=True)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=True)\n\n    with pytest.raises(TypeError) as exc:\n        mh1.intersection(mh2)\n\n    assert str(exc.value) == \"can only intersect flat MinHash objects\"\n\n\ndef test_intersection_4_incompatible_ksize():\n    # cannot intersect incompatible ksize etc\n    mh1 = MinHash(500, 21)\n    mh2 = MinHash(500, 31)\n\n    with pytest.raises(ValueError) as exc:\n        mh1.intersection(mh2)\n\n    assert str(exc.value) == \"different ksizes cannot be compared\"\n\n\ndef test_intersection_5_incompatible():\n    # cannot intersect with non-MinHash objects\n    mh1 = MinHash(0, 21, scaled=1)\n\n    with pytest.raises(TypeError) as exc:\n        mh1.intersection(set())\n\n    assert str(exc.value) == \"can only intersect MinHash objects\"\n\n\ndef test_intersection_6_full_num():\n    # intersection of two \"full\" num objects is correct\n    mh1 = MinHash(20, 21)\n    mh2 = MinHash(20, 21)\n\n    for i in range(100):\n        mh1.add_hash(i)\n\n    for i in range(0, 100, 2):\n        mh2.add_hash(i)\n\n    # they are both full:\n    assert len(mh1) == 20\n    assert len(mh2) == 20\n\n    # intersection is symmetric:\n    mh3 = mh1.intersection(mh2)\n    mh4 = mh2.intersection(mh1)\n    assert mh3 == mh4\n\n    # everything in intersection is in both:\n    for k in mh3.hashes:\n        assert k in mh1.hashes\n        assert k in mh2.hashes\n\n    assert mh1.intersection_and_union_size(mh2) == (10, 20)\n\n\ndef test_intersection_7_full_scaled():\n    # intersection of two scaled objects is correct\n    mh1 = MinHash(0, 21, scaled=100)\n    mh2 = MinHash(0, 21, scaled=100)\n\n    for i in range(100):\n        mh1.add_hash(i)\n\n    for i in range(0, 200, 2):\n        mh2.add_hash(i)\n\n    # they both have everything:\n    assert len(mh1) == 100\n    assert len(mh2) == 100\n\n    # intersection is symmetric:\n    mh3 = mh1.intersection(mh2)\n    mh4 = mh2.intersection(mh1)\n    assert mh3 == mh4\n\n    # everything in intersection is in both:\n    for k in mh3.hashes:\n        assert k in mh1.hashes\n        assert k in mh2.hashes\n\n    assert mh1.intersection_and_union_size(mh2) == (50, 150)\n\n\ndef test_intersection_and_union_8_incompatible_ksize():\n    # cannot intersect different ksizes\n    mh1 = MinHash(0, 21, scaled=1)\n    mh2 = MinHash(0, 31, scaled=1)\n\n    with pytest.raises(TypeError) as exc:\n        mh1.intersection_and_union_size(mh2)\n    assert \"incompatible MinHash objects\" in str(exc)\n\n\ndef test_merge_abund():\n    mh1 = MinHash(10, 21, track_abundance=True)\n    mh2 = MinHash(10, 21, track_abundance=True)\n\n    mh1.set_abundances({0: 1})\n    mh2.set_abundances({0: 3})\n\n    ret = mh1.merge(mh2)\n    assert ret is None\n\n    print(\"MH1 EQUALS \", mh1.hashes)\n\n    hashcounts = mh1.hashes\n    assert len(hashcounts) == 1\n    assert hashcounts[0] == 4\n\n    hashcounts2 = mh2.hashes\n    assert len(hashcounts2) == 1\n    assert hashcounts2[0] == 3\n\n\ndef test_merge_noabund():\n    mh1 = MinHash(10, 21, track_abundance=False)\n    mh2 = MinHash(10, 21, track_abundance=False)\n\n    mh1.add_hash(0)\n    mh2.add_hash(0)\n\n    ret = mh1.merge(mh2)\n    assert ret is None\n\n    hashcounts = mh1.hashes\n    assert len(hashcounts) == 1\n    assert hashcounts[0] == 1\n\n\ndef test_merge_full_num():\n    # merge/union of two \"full\" num objects is correct\n    mh1 = MinHash(20, 21)\n    mh2 = MinHash(20, 21)\n\n    for i in range(100):\n        mh1.add_hash(i)\n\n    for i in range(0, 100, 2):\n        mh2.add_hash(i)\n\n    # they are both full:\n    assert len(mh1) == 20\n    assert len(mh2) == 20\n\n    # add is symmetric:\n    mh3 = mh1 + mh2\n    mh4 = mh2 + mh1\n    assert mh3 == mh4\n\n    # merge is full\n    assert len(mh3) == 20\n\n    # everything in union is in at least one\n    for k in mh3.hashes:\n        assert k in mh1.hashes or k in mh2.hashes\n\n\ndef test_merge_scaled():\n    # merge/union of two reasonably full scaled objects is correct\n    mh1 = MinHash(0, 21, scaled=100)\n    mh2 = MinHash(0, 21, scaled=100)\n\n    for i in range(100):\n        mh1.add_hash(i)\n\n    for i in range(0, 200, 2):\n        mh2.add_hash(i)\n\n    assert len(mh1) == 100\n    assert len(mh2) == 100\n\n    # merge contains all the things\n    mh3 = mh1 + mh2\n    assert len(mh3) == 150\n\n    # everything in either one is in union\n    for k in mh1.hashes:\n        assert k in mh3.hashes\n    for k in mh2.hashes:\n        assert k in mh3.hashes\n\n\ndef test_add_is_symmetric():\n    mh1 = MinHash(20, 21)\n    mh1.add_hash(5)\n    mh2 = MinHash(20, 21)\n    mh2.add_hash(6)\n    print(\"\\n mh1 EQUALS \", mh1.hashes, \"\\n mh2 EQUALS\", mh2.hashes)\n    mh3 = mh1 + mh2\n    mh4 = mh2 + mh1\n    print(\"\\n mh3 EQUALS \", mh3.hashes, \"\\n mh4 EQUALS\", mh4.hashes)\n    # if mh3 != 0, then it is \"true\", so it passes\n    assert mh3\n    assert mh3 == mh4\n\n\ndef test_or_equals_add():\n    mh1 = MinHash(20, 21)\n    mh1.add_hash(5)\n    mh2 = MinHash(20, 21)\n    mh2.add_hash(6)\n    print(\"\\n mh1 EQUALS \", mh1.hashes, \"\\n mh2 EQUALS\", mh2.hashes)\n    mh3 = mh1 + mh2\n    mh4 = mh1 | mh2\n    print(\"\\n mh3 EQUALS \", mh3.hashes, \"\\n mh4 EQUALS\", mh4.hashes)\n    assert mh3\n    assert mh3 == mh4\n\n\ndef test_max_containment():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 5))\n\n    assert mh1.contained_by(mh2) == 1 / 4\n    assert mh2.contained_by(mh1) == 1 / 2\n    assert mh1.max_containment(mh2) == 1 / 2\n    assert mh2.max_containment(mh1) == 1 / 2\n\n\ndef test_max_containment_empty():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n\n    assert mh1.contained_by(mh2) == 0\n    assert mh2.contained_by(mh1) == 0\n    assert mh1.max_containment(mh2) == 0\n    assert mh2.max_containment(mh1) == 0\n\n\ndef test_max_containment_equal():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 2, 3, 4))\n\n    assert mh1.contained_by(mh2) == 1\n    assert mh2.contained_by(mh1) == 1\n    assert mh1.max_containment(mh2) == 1\n    assert mh2.max_containment(mh1) == 1\n\n\ndef test_avg_containment():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 5))\n\n    assert mh1.contained_by(mh2) == 1 / 4\n    assert mh2.contained_by(mh1) == 1 / 2\n    assert mh1.avg_containment(mh2) == 0.375\n    assert mh2.avg_containment(mh1) == 0.375\n\n\ndef test_avg_containment_empty():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n\n    assert mh1.contained_by(mh2) == 0\n    assert mh2.contained_by(mh1) == 0\n    assert mh1.avg_containment(mh2) == 0\n    assert mh2.avg_containment(mh1) == 0\n\n\ndef test_avg_containment_equal():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 2, 3, 4))\n\n    assert mh1.contained_by(mh2) == 1\n    assert mh2.contained_by(mh1) == 1\n    assert mh1.avg_containment(mh2) == 1\n    assert mh2.avg_containment(mh1) == 1\n\n\ndef test_frozen_and_mutable_1(track_abundance):\n    # mutable minhashes -> mutable minhashes creates new copy\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = mh1.to_mutable()\n\n    mh1.add_hash(10)\n    assert 10 not in mh2.hashes\n\n\ndef test_frozen_and_mutable_2(track_abundance):\n    # check that mutable -> frozen are separate\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh1.add_hash(10)\n\n    mh2 = mh1.to_frozen()\n    assert 10 in mh2.hashes\n    mh1.add_hash(11)\n    assert 11 not in mh2.hashes\n\n\ndef test_frozen_and_mutable_3(track_abundance):\n    # check that mutable -> frozen -> mutable are all separate from each other\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh1.add_hash(10)\n\n    mh2 = mh1.to_frozen()\n    assert 10 in mh2.hashes\n    mh1.add_hash(11)\n    assert 11 not in mh2.hashes\n\n    mh3 = mh2.to_mutable()\n    mh3.add_hash(12)\n    assert 12 not in mh2.hashes\n    assert 12 not in mh1.hashes\n\n\ndef test_dna_kmers():\n    # test seq_to_hashes for dna -> dna\n    mh = MinHash(0, ksize=31, scaled=1)  # DNA\n    seq = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCGATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTGGCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTTGACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAAAACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAAATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCGCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCTGGCAGTGGGGCATTACCTCGAATCTACCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTGATCACATGGTGCTGAT\"\n\n    # first calculate seq to hashes\n    hashes = mh.seq_to_hashes(seq)\n\n    # then calculate all hashes for the sequence\n    mh.add_sequence(seq)\n\n    # identical?\n    assert set(hashes) == set(mh.hashes)\n\n    # k-mer by k-mer?\n    for i in range(0, len(seq) - 31 + 1):\n        # calculate each k-mer\n        kmer = seq[i : i + 31]\n\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_sequence(kmer)\n        assert len(single_mh) == 1\n\n        # also calculate via seq_to_hashes\n        hashvals = mh.seq_to_hashes(kmer)\n        assert len(hashvals) == 1\n        hashval = hashvals[0]\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n        assert hashval == hashes[i]\n\n\ndef test_dna_kmers_2():\n    # test kmers_and_hashes for dna -> dna\n    mh = MinHash(0, ksize=31, scaled=1)  # DNA\n    seq = \"ATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCGATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTGGCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTTGACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAAAACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAAATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCGCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCTGGCAGTGGGGCATTACCTCGAATCTACCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTGATCACATGGTGCTGAT\"\n\n    # k-mer by k-mer?\n    for kmer, hashval in mh.kmers_and_hashes(seq):\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_sequence(kmer)\n        assert len(single_mh) == 1\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n\n\ndef test_dna_kmers_3_bad_dna():\n    # test kmers_and_hashes for dna -> dna, with some bad k-mers in there\n    mh = MinHash(0, ksize=31, scaled=1)  # DNA\n    seq = \"NTGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCGATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTGGCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTTGACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAAAACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAAATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCGCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCTGGCAGTGGGGCATTACCTCGAATCTACCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTGATCACATGGTGCTGAT\"\n\n    with pytest.raises(ValueError) as exc:\n        list(mh.kmers_and_hashes(seq))\n\n    assert \"invalid DNA character in input k-mer: NTGCGAGTGT\" in str(exc)\n\n\ndef test_dna_kmers_4_bad_dna():\n    # test kmers_and_hashes for bad dna -> dna, using force\n    mh = MinHash(0, ksize=31, scaled=1)  # DNA\n    seq = \"NTGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCGATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTGGCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTTGACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAAAACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAAATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCGCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCTGGCAGTGGGGCATTACCTCGAATCTACCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTGATCACATGGTGCTGAT\"\n\n    # k-mer by k-mer?\n    found_bad_kmer = False\n    for kmer, hashval in mh.kmers_and_hashes(seq, force=True):\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n\n        if hashval is None:\n            assert kmer == seq[:31]  # first k-mer is baaaaad.\n            found_bad_kmer = True\n            continue\n\n        # if the below code raises an exception, it's because the above\n        # 'if' statement was not triggered (but should have been :)\n        single_mh.add_sequence(kmer)\n        assert len(single_mh) == 1\n        assert hashval == list(single_mh.hashes)[0]\n\n    assert found_bad_kmer, \"there is one bad k-mer in here\"\n\n\ndef test_protein_kmers():\n    # test seq_to_hashes for protein -> protein\n    mh = MinHash(0, ksize=7, is_protein=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # first calculate seq to hashes\n    hashes = mh.seq_to_hashes(seq, is_protein=True)\n\n    # then calculate all hashes for the sequence\n    mh.add_protein(seq)\n\n    # identical?\n    assert set(hashes) == set(mh.hashes)\n\n    # k-mer by k-mer?\n    for i in range(0, len(seq) - 7 + 1):\n        # calculate each k-mer\n        kmer = seq[i : i + 7]\n\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # also calculate via seq_to_hashes\n        hashvals = mh.seq_to_hashes(kmer, is_protein=True)\n        assert len(hashvals) == 1\n        hashval = hashvals[0]\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n        assert hashval == hashes[i]\n\n\ndef test_protein_kmers_2():\n    # test kmers_and_hashes for protein -> protein\n    mh = MinHash(0, ksize=7, is_protein=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # k-mer by k-mer?\n    for kmer, hashval in mh.kmers_and_hashes(seq, is_protein=True):\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n\n\ndef test_dayhoff_kmers():\n    # test seq_to_hashes for protein -> dayhoff\n    mh = MinHash(0, ksize=7, dayhoff=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # first calculate seq to hashes\n    hashes = mh.seq_to_hashes(seq, is_protein=True)\n\n    # then calculate all hashes for the sequence\n    mh.add_protein(seq)\n\n    # identical?\n    assert set(hashes) == set(mh.hashes)\n\n    # k-mer by k-mer?\n    for i in range(0, len(seq) - 7 + 1):\n        # calculate each k-mer\n        kmer = seq[i : i + 7]\n\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # also calculate via seq_to_hashes\n        hashvals = mh.seq_to_hashes(kmer, is_protein=True)\n        assert len(hashvals) == 1\n        hashval = hashvals[0]\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n        assert hashval == hashes[i]\n\n\ndef test_dayhoff_kmers_2():\n    # test kmers_and_hashes for protein -> dayhoff\n    mh = MinHash(0, ksize=7, dayhoff=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # k-mer by k-mer?\n    for kmer, hashval in mh.kmers_and_hashes(seq, is_protein=True):\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n\n\ndef test_hp_kmers():\n    # test hashes_to_seq for protein -> hp\n    mh = MinHash(0, ksize=7, hp=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # first calculate seq to hashes\n    hashes = mh.seq_to_hashes(seq, is_protein=True)\n\n    # then calculate all hashes for the sequence\n    mh.add_protein(seq)\n\n    # identical?\n    assert set(hashes) == set(mh.hashes)\n\n    # k-mer by k-mer?\n    for i in range(0, len(seq) - 7 + 1):\n        # calculate each k-mer\n        kmer = seq[i : i + 7]\n\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # also calculate via seq_to_hashes\n        hashvals = mh.seq_to_hashes(kmer, is_protein=True)\n        assert len(hashvals) == 1\n        hashval = hashvals[0]\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n        assert hashval == hashes[i]\n\n\ndef test_hp_kmers_2():\n    # test kmers_and_hashes for protein -> hp\n    mh = MinHash(0, ksize=7, hp=True, scaled=1)\n    seq = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    # k-mer by k-mer?\n    for kmer, hashval in mh.kmers_and_hashes(seq, is_protein=True):\n        # add to minhash obj\n        single_mh = mh.copy_and_clear()\n        single_mh.add_protein(kmer)\n        assert len(single_mh) == 1\n\n        # confirm it all matches\n        assert hashval == list(single_mh.hashes)[0]\n\n\ndef test_translate_protein_hashes():\n    # test seq_to_hashes for dna -> protein\n    mh = MinHash(0, ksize=7, is_protein=True, scaled=1)\n    mh_translate = mh.copy()\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\"\n    prot = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    hashes_translate = mh_translate.seq_to_hashes(dna)\n    hashes_prot = mh_translate.seq_to_hashes(prot, is_protein=True)\n\n    # one is a subset of other, b/c of six frame translation\n    assert set(hashes_prot).issubset(set(hashes_translate))\n    assert not set(hashes_translate).issubset(set(hashes_prot))\n\n\ndef test_translate_protein_hashes_2():\n    # test kmers_and_hashes for dna -> protein\n    mh_translate = MinHash(0, ksize=7, is_protein=True, scaled=1)\n\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\".upper()\n\n    # does everything match? check!\n    k_and_h = list(mh_translate.kmers_and_hashes(dna))\n    for idx, kmer in enumerate(_kmers_from_all_coding_frames(dna, 21)):\n        k, h = k_and_h[idx]\n\n        assert kmer == k\n        assert _hash_fwd_only(mh_translate, kmer) == h\n\n\ndef test_translate_hp_hashes():\n    # test seq_to_hashes for dna -> protein -> hp\n    mh = MinHash(0, ksize=7, hp=True, scaled=1)\n    mh_translate = mh.copy()\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\"\n    prot = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    hashes_translate = mh_translate.seq_to_hashes(dna)\n    hashes_prot = mh_translate.seq_to_hashes(prot, is_protein=True)\n\n    # one is a subset of other, b/c of six frame translation\n    assert set(hashes_prot).issubset(set(hashes_translate))\n    assert not set(hashes_translate).issubset(set(hashes_prot))\n\n\ndef test_translate_hp_hashes_2():\n    # test kmers_and_hashes for dna -> protein -> hp\n    mh_translate = MinHash(0, ksize=7, hp=True, scaled=1)\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\"\n    dna = dna.upper()\n\n    # does everything match? check!\n    k_and_h = list(mh_translate.kmers_and_hashes(dna))\n    for idx, kmer in enumerate(_kmers_from_all_coding_frames(dna, 21)):\n        k, h = k_and_h[idx]\n\n        assert kmer == k\n        assert _hash_fwd_only(mh_translate, kmer) == h\n\n\ndef test_translate_dayhoff_hashes():\n    # test seq_to_hashes for dna -> protein -> dayhoff\n    mh = MinHash(0, ksize=7, dayhoff=True, scaled=1)\n    mh_translate = mh.copy()\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\"\n    prot = \"MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEPRENIVYQCWERFCQELGKQIPVAMTLEKNMPIGSGLGSSACSVVAALMAMNEHCGKPLNDTRLLALMGELEGRISGSIHYDNVAPCFLGGMQLMIEENDIISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLPGFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN*\"\n\n    hashes_translate = mh_translate.seq_to_hashes(dna)\n    hashes_prot = mh_translate.seq_to_hashes(prot, is_protein=True)\n\n    # one is a subset of other, b/c of six frame translation\n    assert set(hashes_prot).issubset(set(hashes_translate))\n    assert not set(hashes_translate).issubset(set(hashes_prot))\n\n\ndef test_translate_dayhoff_hashes_2():\n    # test kmers_and_hashes for dna -> protein -> dayhoff\n    mh_translate = MinHash(0, ksize=7, dayhoff=True, scaled=1)\n    dna = \"atggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaa\"\n    dna = dna.upper()\n\n    # does everything match? check!\n    k_and_h = list(mh_translate.kmers_and_hashes(dna))\n    for idx, kmer in enumerate(_kmers_from_all_coding_frames(dna, 21)):\n        k, h = k_and_h[idx]\n\n        assert kmer == k\n        assert _hash_fwd_only(mh_translate, kmer) == h\n\n\ndef test_containment(track_abundance):\n    \"basic containment test. note: containment w/abundance ignores abundance.\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    assert mh1.contained_by(mh2) == 1 / 4\n    assert mh2.contained_by(mh1) == 1 / 2\n\n\ndef test_sum_abundances(track_abundance):\n    \"test sum_abundances\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    if track_abundance:\n        assert mh1.sum_abundances == 6\n        assert mh2.sum_abundances == 6\n    else:\n        assert mh1.sum_abundances is None\n        assert mh2.sum_abundances is None\n\n\ndef test_mean_abundance(track_abundance):\n    \"test mean_abundance\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    if track_abundance:\n        assert mh1.mean_abundance == 1.5\n        assert mh2.mean_abundance == 3\n    else:\n        assert not mh1.mean_abundance\n        assert not mh2.mean_abundance\n\n\ndef test_median_abundance(track_abundance):\n    \"test median_abundance\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    if track_abundance:\n        assert mh1.median_abundance == 1.5\n        assert mh2.median_abundance == 3\n    else:\n        assert not mh1.median_abundance\n        assert not mh2.median_abundance\n\n\ndef test_std_abundance(track_abundance):\n    \"test std_abundance\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    if track_abundance:\n        assert mh1.std_abundance == 0.5\n        assert mh2.std_abundance == 0.0\n    else:\n        assert not mh1.std_abundance\n        assert not mh2.std_abundance\n\n\ndef test_unique_dataset_hashes(track_abundance):\n    \"test total_hashes approximation\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    mh2 = MinHash(4, 21, track_abundance=track_abundance)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n\n    assert mh1.unique_dataset_hashes == 4\n    with pytest.raises(TypeError) as exc:\n        mh2.unique_dataset_hashes\n    assert \"can only approximate unique_dataset_hashes for scaled MinHashes\" in str(exc)\n\n\ndef test_containment_ANI():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2, ksize=31).minhash\n\n    m1_cont_m2 = mh1.containment_ani(mh2, estimate_ci=True)\n    m2_cont_m1 = mh2.containment_ani(mh1, estimate_ci=True)\n    print(\"\\nmh1 contained by mh2\", m1_cont_m2)\n    print(\"mh2 contained by mh1\", m2_cont_m1)\n\n    assert (round(m1_cont_m2.ani, 3), m1_cont_m2.ani_low, m1_cont_m2.ani_high) == (\n        1.0,\n        1.0,\n        1.0,\n    )\n    assert (\n        round(m2_cont_m1.ani, 3),\n        round(m2_cont_m1.ani_low, 3),\n        round(m2_cont_m1.ani_high, 3),\n    ) == (0.966, 0.965, 0.967)\n\n    m1_mc_m2 = mh1.max_containment_ani(mh2, estimate_ci=True)\n    m2_mc_m1 = mh2.max_containment_ani(mh1, estimate_ci=True)\n    print(\"mh1 max containment\", m1_mc_m2)\n    print(\"mh2 max containment\", m2_mc_m1)\n    m1_mc_m2.size_is_inaccurate = False\n    m2_mc_m1.size_is_inaccurate = False\n    assert m1_mc_m2 == m2_mc_m1\n    assert (\n        round(m1_mc_m2.ani, 3),\n        round(m1_mc_m2.ani_low, 3),\n        round(m1_mc_m2.ani_high, 3),\n    ) == (1.0, 1.0, 1.0)\n\n\ndef test_containment_ANI_precalc_containment():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2, ksize=31).minhash\n    # precalc containments and assert same results\n    s1c = mh1.contained_by(mh2)\n    s2c = mh2.contained_by(mh1)\n    mc = max(s1c, s2c)\n\n    assert mh1.containment_ani(mh2, estimate_ci=True) == mh1.containment_ani(\n        mh2, containment=s1c, estimate_ci=True\n    )\n    assert mh2.containment_ani(mh1) == mh2.containment_ani(mh1, containment=s2c)\n    assert mh1.max_containment_ani(mh2) == mh2.max_containment_ani(mh1)\n    assert mh1.max_containment_ani(mh2) == mh1.max_containment_ani(\n        mh2, max_containment=mc\n    )\n    assert mh1.max_containment_ani(mh2) == mh2.max_containment_ani(\n        mh1, max_containment=mc\n    )\n\n\ndef test_avg_containment_ani():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2, ksize=31).minhash\n    # check average_containment_ani\n    ac_m1 = mh1.avg_containment_ani(mh2)\n    ac_m2 = mh2.avg_containment_ani(mh1)\n    assert (\n        ac_m1\n        == ac_m2\n        == (mh1.containment_ani(mh2).ani + mh2.containment_ani(mh1).ani) / 2\n    )\n\n\ndef test_containment_ANI_downsample():\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    f3 = utils.get_test_data(\"47+63.fa.sig\")\n    mh2 = load_one_signature(f2, ksize=31).minhash\n    mh3 = load_one_signature(f3, ksize=31).minhash\n    # check that downsampling works properly\n    print(mh2.scaled)\n    mh2 = mh2.downsample(scaled=1100)\n    assert mh2.scaled != mh3.scaled\n    ds_s3c = mh2.containment_ani(mh3, downsample=True)\n    ds_s4c = mh3.containment_ani(mh2, downsample=True)\n    mc_w_ds_1 = mh2.max_containment_ani(mh3, downsample=True)\n    mc_w_ds_2 = mh3.max_containment_ani(mh2, downsample=True)\n    print(ds_s3c)\n    with pytest.raises(ValueError) as e:\n        mh2.containment_ani(mh3)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    with pytest.raises(ValueError) as e:\n        mh2.max_containment_ani(mh3)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    mh3 = mh3.downsample(scaled=1100)\n    assert mh2.scaled == mh3.scaled\n    ds_s3c_manual = mh2.containment_ani(mh3)\n    ds_s4c_manual = mh3.containment_ani(mh2)\n    ds_mc_manual = mh2.max_containment_ani(mh3)\n    assert ds_s3c == ds_s3c_manual\n    assert ds_s4c == ds_s4c_manual\n    assert mc_w_ds_1 == mc_w_ds_2 == ds_mc_manual\n\n    ac_m2 = mh2.avg_containment_ani(mh3)\n    ac_m3 = mh3.avg_containment_ani(mh2)\n    assert ac_m2 == ac_m3 == (ds_s3c.ani + ds_s4c.ani) / 2\n\n\ndef test_jaccard_ANI():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n\n    print(\"\\nJACCARD_ANI\", mh1.jaccard_ani(mh2))\n\n    m1_jani_m2 = mh1.jaccard_ani(mh2)\n    m2_jani_m1 = mh2.jaccard_ani(mh1)\n\n    assert m1_jani_m2 == m2_jani_m1\n    assert (\n        m1_jani_m2.ani,\n        m1_jani_m2.p_nothing_in_common,\n        m1_jani_m2.jaccard_error,\n    ) == (0.9783711630110239, 0.0, 3.891666770716877e-07)\n\n\ndef test_jaccard_ANI_untrustworthy():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n\n    print(\"\\nJACCARD_ANI\", mh1.jaccard_ani(mh2))\n\n    m1_jani_m2 = mh1.jaccard_ani(mh2, err_threshold=1e-7)\n\n    # since size is inaccurate on 2.fa.sig, need to override to be able to get ani\n    m1_jani_m2.size_is_inaccurate = False\n\n    assert m1_jani_m2.ani is None\n    assert m1_jani_m2.je_exceeds_threshold == True\n    assert m1_jani_m2.je_threshold == 1e-7\n\n\ndef test_jaccard_ANI_precalc_jaccard():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n    # precalc jaccard and assert same result\n    jaccard = mh1.jaccard(mh2)\n    print(\"\\nJACCARD_ANI\", mh1.jaccard_ani(mh2, jaccard=jaccard))\n\n    assert (\n        mh1.jaccard_ani(mh2)\n        == mh1.jaccard_ani(mh2, jaccard=jaccard)\n        == mh2.jaccard_ani(mh1, jaccard=jaccard)\n    )\n    wrong_jaccard = jaccard - 0.1\n    assert mh1.jaccard_ani(mh2) != mh1.jaccard_ani(mh2, jaccard=wrong_jaccard)\n\n\ndef test_jaccard_ANI_downsample():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n\n    print(mh1.scaled)\n    mh1 = mh1.downsample(scaled=2000)\n    assert mh1.scaled != mh2.scaled\n    with pytest.raises(ValueError) as e:\n        mh1.jaccard_ani(mh2)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    ds_s1c = mh1.jaccard_ani(mh2, downsample=True)\n    ds_s2c = mh2.jaccard_ani(mh1, downsample=True)\n\n    mh2 = mh2.downsample(scaled=2000)\n    assert mh1.scaled == mh2.scaled\n    ds_j_manual = mh1.jaccard_ani(mh2)\n    assert ds_s1c == ds_s2c == ds_j_manual\n\n\ndef test_containment_ani_ci_tiny_testdata():\n    \"\"\"\n    tiny test data to trigger the following:\n    WARNING: Cannot estimate ANI confidence intervals from containment. Do your sketches contain enough hashes?\n    Error: varN <0.0!\n    \"\"\"\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 3, 4))\n    mh2.add_many((1, 2, 3, 4))\n\n    m2_cani_m1 = mh2.containment_ani(mh1, estimate_ci=True)\n    print(m2_cani_m1)\n    # from the formula ANI = c^(1/k) for c=3/4 and k=21\n    np.testing.assert_almost_equal(m2_cani_m1.ani, 0.986394259982259, decimal=3)\n    m2_cani_m1.size_is_inaccurate = False\n    assert m2_cani_m1.ani_low is None\n    assert m2_cani_m1.ani_high is None\n\n\ndef test_containment_num_fail():\n    f1 = utils.get_test_data(\"num/47.fa.sig\")\n    f2 = utils.get_test_data(\"num/63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2, ksize=31).minhash\n\n    with pytest.raises(TypeError) as exc:\n        mh1.contained_by(mh2)\n    print(str(exc))\n    assert \"Error: can only calculate containment for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh1.max_containment(mh2)\n    assert \"Error: can only calculate containment for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh1.avg_containment(mh2)\n    assert \"Error: can only calculate containment for scaled MinHashes\" in str(exc)\n\n\ndef test_ANI_num_fail():\n    f1 = utils.get_test_data(\"num/47.fa.sig\")\n    f2 = utils.get_test_data(\"num/63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2, ksize=31).minhash\n\n    with pytest.raises(TypeError) as exc:\n        mh1.containment_ani(mh2)\n    print(str(exc))\n    assert \"Error: can only calculate ANI for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh2.containment_ani(mh1, estimate_ci=True)\n    assert \"Error: can only calculate ANI for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh1.max_containment_ani(mh2)\n    assert \"Error: can only calculate ANI for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh1.avg_containment_ani(mh2)\n    assert \"Error: can only calculate ANI for scaled MinHashes\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        mh1.jaccard_ani(mh2)\n    assert \"Error: can only calculate ANI for scaled MinHashes\" in str(exc)\n\n\ndef test_minhash_set_size_estimate_is_accurate():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n    mh1_ds = mh1.downsample(scaled=100000)\n    # check accuracy using default thresholds (rel_err= 0.2, confidence=0.95)\n    assert mh1.size_is_accurate() == True\n    assert mh1_ds.size_is_accurate() == False\n    assert mh2.size_is_accurate() == True\n\n    # change rel err\n    assert mh1.size_is_accurate(relative_error=0.5) == True\n    assert mh2.size_is_accurate(relative_error=0.0001) == False\n\n    # change prob\n    assert mh1.size_is_accurate(confidence=0.5) == True\n    assert mh1.size_is_accurate(relative_error=0.001, confidence=1) == False\n\n    # check that relative error and confidence must be between 0 and 1\n    with pytest.raises(ValueError) as exc:\n        mh2.size_is_accurate(relative_error=-1)\n    assert (\n        \"Error: relative error and confidence values must be between 0 and 1.\"\n        in str(exc)\n    )\n\n    with pytest.raises(ValueError) as exc:\n        mh2.size_is_accurate(confidence=-1)\n    assert (\n        \"Error: relative error and confidence values must be between 0 and 1.\"\n        in str(exc)\n    )\n\n    with pytest.raises(ValueError) as exc:\n        mh2.size_is_accurate(relative_error=-1, confidence=-1)\n    assert (\n        \"Error: relative error and confidence values must be between 0 and 1.\"\n        in str(exc)\n    )\n\n\ndef test_minhash_ani_inaccurate_size_est():\n    # TODO: It's actually really tricky to get the set size to be inaccurate. Eg. For a scale factor of 10000,\n    # you would need\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n    mh2 = load_one_signature(f2).minhash\n    # downsample\n    mh1_ds = mh1.downsample(scaled=100000)\n    mh2_ds = mh2.downsample(scaled=100000)\n    assert mh1.size_is_accurate(relative_error=0.05, confidence=0.95) == True\n    assert mh1.size_is_accurate() == True\n    assert mh1_ds.size_is_accurate() == False\n    assert mh2.size_is_accurate() == True\n\n    assert round(mh1.jaccard_ani(mh2).ani, 3) == 0.978\n\n    m2_ca_m1 = mh2.containment_ani(mh1)\n    assert round(m2_ca_m1.ani, 3) == 0.966\n    assert m2_ca_m1.size_is_inaccurate == False\n\n    m1_ca_m2_ds = mh1_ds.containment_ani(mh2_ds)\n    print(m1_ca_m2_ds)\n    assert m1_ca_m2_ds.ani is None  # 0.987\n    assert m1_ca_m2_ds.size_is_inaccurate == True\n\n\ndef test_size_num_fail():\n    f1 = utils.get_test_data(\"num/47.fa.sig\")\n    mh1 = load_one_signature(f1, ksize=31).minhash\n\n    with pytest.raises(TypeError) as exc:\n        mh1.size_is_accurate()\n    print(str(exc))\n    assert \"Error: can only estimate dataset size for scaled MinHashes\" in str(exc)\n"
  },
  {
    "path": "tests/test_moltypes.py",
    "content": "import os\nimport pytest\nfrom collections import namedtuple\nimport numpy\n\nimport sourmash\nimport sourmash_tst_utils as utils\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.command_sketch import _signatures_for_sketch_factory, ComputeParameters\n\n\nMoltypeHolder = namedtuple(\n    \"MoltypeHolder\",\n    [\"moltype\", \"genome_sketch\", \"metag_sketch\", \"cli_moltype_arg\", \"molecule\"],\n)\n\n\n@pytest.fixture(\n    scope=\"session\", params=[\"dna\", \"protein\", \"hp\", \"dayhoff\", \"skipm1n3\", \"skipm2n3\"]\n)\ndef moltype(request):\n    yield request.param\n\n\n@pytest.fixture(\n    scope=\"session\", params=[\"dna\", \"protein\", \"hp\", \"dayhoff\", \"skipm1n3\", \"skipm2n3\"]\n)\ndef moltype2(request):\n    yield request.param\n\n\n# build and return genome & metagenome sketches of the given moltype, using\n# MoltypeHolder.\n@pytest.fixture(scope=\"session\")\ndef moltype_sketches(runtmp_session, moltype):\n    genome = utils.get_test_data(\"genome-s10.fa.gz\")\n    metagenome = utils.get_test_data(\"genome-s10+s11.fa.gz\")\n\n    outfile = runtmp_session.output(f\"genome.{moltype}.sig.zip\")\n    outfile2 = runtmp_session.output(f\"metagenome.{moltype}.sig.zip\")\n    assert not os.path.exists(outfile)\n    assert not os.path.exists(outfile2)\n\n    # @CTB use match!\n    if moltype == \"dna\":\n        runtmp_session.sourmash(\"sketch\", \"dna\", genome, \"-o\", outfile)\n        runtmp_session.sourmash(\"sketch\", \"dna\", metagenome, \"-o\", outfile2)\n        mt = MoltypeHolder(\"dna\", outfile, outfile2, \"--dna\", \"DNA\")\n    elif moltype == \"protein\":\n        runtmp_session.sourmash(\"sketch\", \"translate\", genome, \"-o\", outfile)\n        runtmp_session.sourmash(\"sketch\", \"translate\", metagenome, \"-o\", outfile2)\n        mt = MoltypeHolder(\"protein\", outfile, outfile2, \"--protein\", \"protein\")\n    elif moltype == \"hp\":\n        runtmp_session.sourmash(\n            \"sketch\", \"translate\", genome, \"-o\", outfile, \"-p\", \"hp\"\n        )\n        runtmp_session.sourmash(\n            \"sketch\", \"translate\", metagenome, \"-o\", outfile2, \"-p\", \"hp\"\n        )\n        mt = MoltypeHolder(\"hp\", outfile, outfile2, \"--hp\", \"hp\")\n    elif moltype == \"dayhoff\":\n        runtmp_session.sourmash(\n            \"sketch\", \"translate\", genome, \"-o\", outfile, \"-p\", \"dayhoff\"\n        )\n        runtmp_session.sourmash(\n            \"sketch\", \"translate\", metagenome, \"-o\", outfile2, \"-p\", \"dayhoff\"\n        )\n        mt = MoltypeHolder(\"dayhoff\", outfile, outfile2, \"--dayhoff\", \"dayhoff\")\n    elif moltype == \"skipm1n3\":\n        runtmp_session.sourmash(\n            \"sketch\", \"dna\", genome, \"-o\", outfile, \"-p\", \"skipm1n3\"\n        )\n        runtmp_session.sourmash(\n            \"sketch\", \"dna\", metagenome, \"-o\", outfile2, \"-p\", \"skipm1n3\"\n        )\n        mt = MoltypeHolder(\"skipm1n3\", outfile, outfile2, \"--skipm1n3\", \"skipm1n3\")\n    elif moltype == \"skipm2n3\":\n        runtmp_session.sourmash(\n            \"sketch\", \"dna\", genome, \"-o\", outfile, \"-p\", \"skipm2n3\"\n        )\n        runtmp_session.sourmash(\n            \"sketch\", \"dna\", metagenome, \"-o\", outfile2, \"-p\", \"skipm2n3\"\n        )\n        mt = MoltypeHolder(\"skipm2n3\", outfile, outfile2, \"--skipm2n3\", \"skipm2n3\")\n    else:\n        assert 0, \"unknown moltype!?\"\n\n    assert mt.genome_sketch\n    assert mt.metag_sketch\n    assert mt.genome_sketch != mt.metag_sketch\n\n    yield (mt, runtmp_session)\n\n\n#\n# all the actual tests\n#\n\n\ndef test_factory_moltype(moltype):\n    factory = _signatures_for_sketch_factory([moltype], None)\n    params_list = list(factory.get_compute_params())\n    assert len(params_list) == 1\n\n    params = params_list[0]\n    assert getattr(params, moltype)\n\n\ndef test_factory_moltype_equal(moltype):\n    factory1 = _signatures_for_sketch_factory([moltype], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([], moltype)\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 == params2\n    assert repr(params1) == repr(params2)\n\n    descr = repr(params1)\n    assert f\"{moltype}=True\" in descr\n\n\ndef test_factory_moltype_ne(moltype, moltype2):\n    # make sure that params are different for different moltypes\n    # (tests that __eq__ fails properly ;)\n    if moltype == moltype2:\n        return\n\n    factory1 = _signatures_for_sketch_factory([moltype], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([moltype2], None)\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 != params2\n    assert repr(params1) != repr(params2)\n\n\ndef test_manifest_row_to_compute_parameters(moltype, moltype2):\n    if moltype == moltype2:\n        return\n\n    # test ComputeParameters.from_manifest_row with moltype\n    if moltype == \"dna\":\n        moltype_str = \"DNA\"\n    else:\n        moltype_str = moltype\n\n    row = dict(moltype=moltype_str, ksize=21, num=0, scaled=1000, with_abundance=1)\n    p = ComputeParameters.from_manifest_row(row)\n    assert getattr(p, moltype)\n    assert not getattr(p, moltype2)\n    assert p.moltype.lower() == moltype\n    assert p.num_hashes == 0\n    assert p.scaled == 1000\n    assert p.track_abundance\n    assert p.seed == 42\n\n\ndef test_api_load(moltype_sketches):\n    # can we load exactly one sketch? yay.\n    mt, rts = moltype_sketches\n\n    gsig = load_one_signature(mt.genome_sketch, select_moltype=mt.molecule)\n    msig = load_one_signature(mt.metag_sketch, select_moltype=mt.molecule)\n\n    assert gsig.minhash.moltype == mt.molecule\n    assert msig.minhash.moltype == mt.molecule\n\n\ndef test_api_overlap(moltype_sketches):\n    # test basic overlap calculations\n    mt, rts = moltype_sketches\n\n    gsig = load_one_signature(mt.genome_sketch, select_moltype=mt.molecule)\n    msig = load_one_signature(mt.metag_sketch, select_moltype=mt.molecule)\n\n    mh1 = gsig.minhash\n    mh2 = msig.minhash\n\n    assert mh1.contained_by(mh2) == 1.0\n    assert mh2.contained_by(mh1) > 0\n    assert mh1.jaccard(mh2) > 0\n    assert mh1.jaccard(mh2) < 1\n\n\ndef test_sig_cat(moltype_sketches):\n    # test: cat works\n    mt, rts = moltype_sketches\n    rts.sourmash(\n        \"sig\",\n        \"cat\",\n        mt.cli_moltype_arg,\n        mt.genome_sketch,\n        \"-o\",\n        rts.output(f\"sig_cat.out.{mt.moltype}.zip\"),\n    )\n\n\ndef test_sig_describe(moltype_sketches):\n    # test: describe works\n    mt, rts = moltype_sketches\n    rts.sourmash(\"sig\", \"describe\", mt.cli_moltype_arg, mt.genome_sketch)\n    print(rts.last_result.out)\n    assert f\"molecule={mt.molecule}\" in rts.last_result.out\n\n\ndef test_search(moltype_sketches):\n    # test: search finds matches.\n    mt, rts = moltype_sketches\n\n    output = rts.output(f\"search.{mt.moltype}.csv\")\n    assert not os.path.exists(output)\n\n    rts.sourmash(\n        \"search\", mt.cli_moltype_arg, mt.genome_sketch, mt.metag_sketch, \"-o\", output\n    )\n\n    with open(output, newline=\"\") as fp:\n        x = fp.readlines()\n    print(x)\n    assert len(x) == 2\n\n\ndef test_compare(moltype_sketches):\n    # test: compare finds matches.\n    mt, rts = moltype_sketches\n\n    output = rts.output(f\"compare.{mt.moltype}.cmp\")\n    assert not os.path.exists(output)\n\n    rts.sourmash(\n        \"compare\", mt.cli_moltype_arg, mt.genome_sketch, mt.metag_sketch, \"-o\", output\n    )\n\n    with open(output, \"rb\") as fp:\n        arr = numpy.load(fp)\n    print(arr)\n    assert arr[0, 1] > 0\n\n\ndef test_index(moltype_sketches, disk_index_type):\n    # test: 'index' works\n    mt, rts = moltype_sketches\n\n    outfile = rts.output(f\"index.{mt.moltype}.{disk_index_type}\")\n    assert not os.path.exists(outfile)\n\n    rts.sourmash(\n        \"index\", mt.cli_moltype_arg, \"-F\", disk_index_type, outfile, mt.genome_sketch\n    )\n    print(rts.last_result.err)\n    assert \"loaded 1 sigs; saving\" in rts.last_result.err\n\n\ndef test_gather(moltype_sketches):\n    # test: 'gather' works\n    mt, rts = moltype_sketches\n\n    output = rts.output(f\"gather.{mt.moltype}.csv\")\n    assert not os.path.exists(output)\n\n    rts.sourmash(\n        \"gather\", mt.cli_moltype_arg, mt.metag_sketch, mt.genome_sketch, \"-o\", output\n    )\n\n    with open(output, newline=\"\") as fp:\n        x = fp.readlines()\n    print(x)\n    assert len(x) == 2\n\n\ndef test_prefetch(moltype_sketches):\n    # test: 'prefetch' works\n    mt, rts = moltype_sketches\n\n    output = rts.output(f\"prefetch.{mt.moltype}.csv\")\n    assert not os.path.exists(output)\n\n    rts.sourmash(\n        \"prefetch\", mt.cli_moltype_arg, mt.metag_sketch, mt.genome_sketch, \"-o\", output\n    )\n\n    with open(output, newline=\"\") as fp:\n        x = fp.readlines()\n    print(x)\n    assert len(x) == 2\n\n\ndef test_sig_manifest(moltype_sketches):\n    # test: 'sig manifest' works\n    mt, rts = moltype_sketches\n\n    output = rts.output(f\"manifest.{mt.moltype}.csv\")\n    assert not os.path.exists(output)\n\n    rts.sourmash(\"sig\", \"manifest\", mt.genome_sketch, \"-o\", output)\n\n    with open(output, newline=\"\") as fp:\n        x = fp.readlines()\n    print(x)\n    assert len(x) == 3\n    assert f\",{mt.molecule},\" in x[-1]\n"
  },
  {
    "path": "tests/test_nodegraph.py",
    "content": "from tempfile import NamedTemporaryFile\n\nimport pytest\n\nfrom sourmash.nodegraph import (\n    Nodegraph,\n    extract_nodegraph_info,\n    calc_expected_collisions,\n)\n\nimport sourmash_tst_utils as utils\n\n\ndef test_nodegraph_to_khmer_basic():\n    pytest.importorskip(\"khmer\")\n\n    ng_file = utils.get_test_data(\".sbt.v3/internal.0\")\n\n    sourmash_ng = Nodegraph.load(ng_file)\n    khmer_sm_ng = sourmash_ng.to_khmer_nodegraph()\n\n    assert sourmash_ng.ksize() == khmer_sm_ng.ksize()\n\n\ndef test_nodegraph_khmer_compare():\n    khmer = pytest.importorskip(\"khmer\")\n\n    khmer_ng = khmer.Nodegraph(3, 23, 6)\n    khmer_ng.count(\"ACG\")\n    khmer_ng.count(\"TTA\")\n    khmer_ng.count(\"CGA\")\n\n    sm_ng = Nodegraph(3, 23, 6)\n    sm_ng.count(\"ACG\")\n    sm_ng.count(\"TTA\")\n    sm_ng.count(\"CGA\")\n\n    assert sm_ng.ksize() == khmer_ng.ksize()\n    assert sm_ng.hashsizes() == khmer_ng.hashsizes()\n    assert sm_ng.get(\"ACG\")\n    assert sm_ng.get(\"TTA\")\n    assert sm_ng.get(\"CGA\")\n\n    assert khmer_ng.get(\"ACG\")\n    assert khmer_ng.get(\"TTA\")\n    assert khmer_ng.get(\"CGA\")\n\n\ndef test_nodegraph_same_file():\n    khmer = pytest.importorskip(\"khmer\")\n    try:\n        load_nodegraph = khmer.load_nodegraph\n    except AttributeError:\n        load_nodegraph = khmer.Nodegraph.load\n\n    ng_file = utils.get_test_data(\".sbt.v3/internal.0\")\n    with open(ng_file, \"rb\") as f:\n        ng_data = f.read()\n\n    sourmash_ng = Nodegraph.load(ng_file)\n    khmer_sm_ng = sourmash_ng.to_khmer_nodegraph()\n\n    khmer_ng = load_nodegraph(ng_file)\n\n    with (\n        NamedTemporaryFile() as f1,\n        NamedTemporaryFile() as f2,\n        NamedTemporaryFile() as f3,\n    ):\n        sourmash_ng.save(f1.name)\n        khmer_sm_ng.save(f2.name)\n        khmer_ng.save(f3.name)\n\n        f1.seek(0)\n        sm_data = f1.read()\n\n        f2.seek(0)\n        kh_sm_data = f2.read()\n\n        f3.seek(0)\n        kh_data = f3.read()\n\n        assert extract_nodegraph_info(f1.name) == extract_nodegraph_info(f2.name)\n        assert extract_nodegraph_info(f3.name) == extract_nodegraph_info(f2.name)\n        assert extract_nodegraph_info(f1.name) == extract_nodegraph_info(f3.name)\n\n        assert sm_data == kh_data\n        assert sm_data == kh_sm_data\n\n        assert ng_data == sm_data\n        assert ng_data == kh_data\n        assert ng_data == kh_sm_data\n\n\ndef test_nodegraph_expected_collisions():\n    ng_file = utils.get_test_data(\".sbt.v3/internal.0\")\n\n    sourmash_ng = Nodegraph.load(ng_file)\n\n    assert calc_expected_collisions(sourmash_ng) == 3.412442571740036e-07\n\n\ndef test_nodegraph_expected_collisions_error():\n    ng_file = utils.get_test_data(\".sbt.v3/internal.0\")\n\n    sourmash_ng = Nodegraph.load(ng_file)\n\n    with pytest.raises(SystemExit):\n        calc_expected_collisions(sourmash_ng, max_false_pos=1e-8)\n"
  },
  {
    "path": "tests/test_np_utils.py",
    "content": "import numpy as np\nfrom sourmash import SourmashSignature\nimport sourmash\nfrom sourmash.np_utils import to_memmap\n\n\ndef test_memmap():\n    e1 = sourmash.MinHash(n=1, ksize=20)\n    sig1 = SourmashSignature(e1)\n\n    e2 = sourmash.MinHash(n=1, ksize=25)\n    sig2 = SourmashSignature(e2)\n    siglist = [sig1, sig2]\n    memmapped, filename = to_memmap(np.array(siglist))\n    # Assert that the data didn't change as a result of memory-mapping\n    np.testing.assert_array_equal(memmapped, siglist)\n    assert filename.endswith(\".mmap\")\n"
  },
  {
    "path": "tests/test_picklist.py",
    "content": "\"\"\"\nTests for the picklist API.\n\"\"\"\n\nimport pytest\nimport sourmash\n\nimport copy\n\nimport sourmash_tst_utils as utils\nfrom sourmash import picklist\nfrom sourmash.picklist import SignaturePicklist\nfrom sourmash.index import LinearIndex, MultiIndex\nfrom sourmash.index.sqlite_index import SqliteIndex\n\n\ndef test_load_empty_picklist_fail():\n    empty = utils.get_test_data(\"picklist/empty.csv\")\n\n    pl = SignaturePicklist(\"manifest\", pickfile=empty)\n    with pytest.raises(ValueError):\n        pl.load(allow_empty=False)\n\n\ndef test_load_empty_picklist_allow():\n    empty = utils.get_test_data(\"picklist/empty.csv\")\n\n    pl = SignaturePicklist(\"manifest\", pickfile=empty)\n    pl.load(allow_empty=True)\n\n\ndef test_dup_md5_picked(runtmp):\n    # load a sig, duplicate, and see if a picklist gets the right one\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = sourmash.load_file_as_signatures(sig47)\n    sig = list(ss)[0]\n\n    # save a manifest with one entry\n    xl = LinearIndex([sig])\n    ml = MultiIndex.load([xl], [None], None)\n\n    print(ml.manifest.rows)\n    assert len(ml.manifest) == 1\n\n    mf_csv = runtmp.output(\"select.csv\")\n    ml.manifest.write_to_filename(mf_csv)\n\n    # now make an index to select against, with an identical signature\n    # (but diff name)\n    new_sig = sig.to_mutable()\n    new_sig.name = \"foo\"\n    xl = LinearIndex([sig, new_sig])\n    ml2 = MultiIndex.load([xl], [None], None)\n\n    assert len(ml2) == 2\n\n    # create a picklist...\n    pl = SignaturePicklist(\"manifest\", pickfile=mf_csv)\n    print(pl.load())\n    print(\"loaded:\", len(pl.pickset))\n\n    # use in select\n    ml3 = ml2.select(picklist=pl)\n    print(\"picked:\", len(ml3))\n\n    assert len(pl.pickset) == len(ml3)\n\n\ndef test_dup_md5_picked_mf_to_picklist(runtmp):\n    # load a sig, duplicate, and see if a picklist gets the right one\n    # uses an in memory picklist\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = sourmash.load_file_as_signatures(sig47)\n    sig = list(ss)[0]\n\n    # save a manifest with one entry\n    xl = LinearIndex([sig])\n    ml = MultiIndex.load([xl], [None], None)\n\n    print(ml.manifest.rows)\n    assert len(ml.manifest) == 1\n\n    pl = ml.manifest.to_picklist()\n\n    # now make an index to select against, with an identical signature\n    # (but diff name)\n    new_sig = sig.to_mutable()\n    new_sig.name = \"foo\"\n    xl = LinearIndex([sig, new_sig])\n    ml2 = MultiIndex.load([xl], [None], None)\n\n    assert len(ml2) == 2\n\n    # use picklist in select\n    ml3 = ml2.select(picklist=pl)\n    print(\"picked:\", len(ml3))\n\n    assert len(pl.pickset) == len(ml3)\n\n\ndef test_dup_md5_picked_mf_to_picklist_sqlite(runtmp):\n    # load a sig, duplicate, and see if a picklist gets the right one\n    # use a sqlite db with its own to_picklist behavior.\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss = sourmash.load_file_as_signatures(sig47)\n    sig = list(ss)[0]\n\n    # save a manifest with one entry\n    xl = SqliteIndex.create(\":memory:\")\n    xl.insert(sig)\n\n    print(xl.manifest.rows)\n    assert len(xl.manifest) == 1\n\n    pl = xl.manifest.to_picklist()\n\n    # now make an index to select against, with an identical signature\n    # (but diff name)\n    new_sig = sig.to_mutable()\n    new_sig.name = \"foo\"\n    xl = LinearIndex([sig, new_sig])\n    ml2 = MultiIndex.load([xl], [None], None)\n\n    assert len(ml2) == 2\n\n    # use picklist in select\n    ml3 = ml2.select(picklist=pl)\n    print(\"picked:\", len(ml3))\n\n    assert len(pl.pickset) == len(ml3)\n"
  },
  {
    "path": "tests/test_plugin_framework.py",
    "content": "\"\"\"\nTest the plugin framework in sourmash.plugins, which uses importlib.metadata\nentrypoints.\n\"\"\"\n\nimport sys\nimport pytest\nimport collections\n\nimport sourmash\nfrom sourmash.logging import set_quiet\n\nimport sourmash_tst_utils as utils\nfrom sourmash import plugins\nfrom sourmash.signature import load_one_signature_from_json\nfrom sourmash.index import LinearIndex\nfrom sourmash.save_load import Base_SaveSignaturesToLocation, SaveSignaturesToLocation\n\n\n_Dist = collections.namedtuple(\"_Dist\", [\"version\"])\n\n\nclass FakeEntryPoint:\n    \"\"\"\n    A class that stores a name and an object to be returned on 'load()'.\n    Mocks the EntryPoint class used by importlib.metadata.\n    \"\"\"\n\n    module = \"test_plugin_framework\"\n    dist = _Dist(\"0.1\")\n    group = \"groupfoo\"\n\n    def __init__(self, name, load_obj, *, error_on_import=None):\n        self.name = name\n        self.load_obj = load_obj\n        self.error_on_import = error_on_import\n\n    def load(self):\n        if self.error_on_import is not None:\n            raise self.error_on_import(\"as requested\")\n        return self.load_obj\n\n\n#\n# Test basic features of the load_from plugin hook.\n#\n\n\nclass Test_EntryPointBasics_LoadFrom:\n    def get_some_sigs(self, location, *args, **kwargs):\n        ss2 = utils.get_test_data(\"2.fa.sig\")\n        ss47 = utils.get_test_data(\"47.fa.sig\")\n        ss63 = utils.get_test_data(\"63.fa.sig\")\n\n        sig2 = load_one_signature_from_json(ss2, ksize=31)\n        sig47 = load_one_signature_from_json(ss47, ksize=31)\n        sig63 = load_one_signature_from_json(ss63, ksize=31)\n\n        lidx = LinearIndex([sig2, sig47, sig63], location)\n\n        return lidx\n\n    get_some_sigs.priority = 1\n\n    def setup_method(self):\n        self.saved_plugins = plugins._plugin_load_from\n        plugins._plugin_load_from = [\n            FakeEntryPoint(\"test_load\", self.get_some_sigs),\n            FakeEntryPoint(\n                \"test_load\", self.get_some_sigs, error_on_import=ModuleNotFoundError\n            ),\n        ]\n\n    def teardown_method(self):\n        plugins._plugin_load_from = self.saved_plugins\n\n    def test_load_1(self):\n        ps = list(plugins.get_load_from_functions())\n        assert len(ps) == 1\n\n    def test_load_2(self, runtmp):\n        fake_location = runtmp.output(\"passed-through location\")\n        idx = sourmash.load_file_as_index(fake_location)\n        print(idx, idx.location)\n\n        assert len(idx) == 3\n        assert idx.location == fake_location\n\n\nclass Test_EntryPoint_LoadFrom_Priority:\n    def get_some_sigs(self, location, *args, **kwargs):\n        ss2 = utils.get_test_data(\"2.fa.sig\")\n        ss47 = utils.get_test_data(\"47.fa.sig\")\n        ss63 = utils.get_test_data(\"63.fa.sig\")\n\n        sig2 = load_one_signature_from_json(ss2, ksize=31)\n        sig47 = load_one_signature_from_json(ss47, ksize=31)\n        sig63 = load_one_signature_from_json(ss63, ksize=31)\n\n        lidx = LinearIndex([sig2, sig47, sig63], location)\n\n        return lidx\n\n    get_some_sigs.priority = 5\n\n    def set_called_flag_1(self, location, *args, **kwargs):\n        # high priority 1, raise ValueError\n        print(\"setting flag 1\")\n        self.was_called_flag_1 = True\n        raise ValueError\n\n    set_called_flag_1.priority = 1\n\n    def set_called_flag_2(self, location, *args, **kwargs):\n        # high priority 2, return None\n        print(\"setting flag 2\")\n        self.was_called_flag_2 = True\n\n        return None\n\n    set_called_flag_2.priority = 2\n\n    def set_called_flag_3(self, location, *args, **kwargs):\n        # lower priority 10, should not be called\n        print(\"setting flag 3\")\n        self.was_called_flag_3 = True\n\n        return None\n\n    set_called_flag_3.priority = 10\n\n    def setup_method(self):\n        self.saved_plugins = plugins._plugin_load_from\n        plugins._plugin_load_from = [\n            FakeEntryPoint(\"test_load\", self.get_some_sigs),\n            FakeEntryPoint(\"test_load_2\", self.set_called_flag_1),\n            FakeEntryPoint(\"test_load_3\", self.set_called_flag_2),\n            FakeEntryPoint(\"test_load_4\", self.set_called_flag_3),\n        ]\n        self.was_called_flag_1 = False\n        self.was_called_flag_2 = False\n        self.was_called_flag_3 = False\n\n    def teardown_method(self):\n        plugins._plugin_load_from = self.saved_plugins\n\n    def test_load_1(self):\n        ps = list(plugins.get_load_from_functions())\n        assert len(ps) == 4\n\n        assert not self.was_called_flag_1\n        assert not self.was_called_flag_2\n        assert not self.was_called_flag_3\n\n    def test_load_2(self, runtmp):\n        fake_location = runtmp.output(\"passed-through location\")\n        idx = sourmash.load_file_as_index(fake_location)\n        print(idx, idx.location)\n\n        assert len(idx) == 3\n        assert idx.location == fake_location\n\n        assert self.was_called_flag_1\n        assert self.was_called_flag_2\n        assert not self.was_called_flag_3\n\n\n#\n# Test basic features of the save_to plugin hook.\n#\n\n\nclass FakeSaveClass(Base_SaveSignaturesToLocation):\n    \"\"\"\n    A fake save class that just records what was sent to it.\n    \"\"\"\n\n    priority = 50\n\n    def __init__(self, location):\n        super().__init__(location)\n        self.keep = []\n\n    @classmethod\n    def matches(cls, location):\n        if location:\n            return location.endswith(\".this-is-a-test\")\n\n    def add(self, ss):\n        super().add(ss)\n        self.keep.append(ss)\n\n\nclass FakeSaveClass_HighPriority(FakeSaveClass):\n    priority = 1\n\n\nclass Test_EntryPointBasics_SaveTo:\n    # test the basics\n    def setup_method(self):\n        self.saved_plugins = plugins._plugin_save_to\n        plugins._plugin_save_to = [\n            FakeEntryPoint(\"test_save\", FakeSaveClass),\n            FakeEntryPoint(\n                \"test_save\", FakeSaveClass, error_on_import=ModuleNotFoundError\n            ),\n        ]\n\n    def teardown_method(self):\n        plugins._plugin_save_to = self.saved_plugins\n\n    def test_save_1(self):\n        ps = list(plugins.get_save_to_functions())\n        print(ps)\n        assert len(ps) == 1\n\n    def test_save_2(self, runtmp):\n        # load some signatures to save\n        ss2 = utils.get_test_data(\"2.fa.sig\")\n        ss47 = utils.get_test_data(\"47.fa.sig\")\n        ss63 = utils.get_test_data(\"63.fa.sig\")\n\n        sig2 = load_one_signature_from_json(ss2, ksize=31)\n        sig47 = load_one_signature_from_json(ss47, ksize=31)\n        sig63 = load_one_signature_from_json(ss63, ksize=31)\n\n        # build a fake location that matches the FakeSaveClass\n        # extension\n        fake_location = runtmp.output(\"out.this-is-a-test\")\n\n        # this should use the plugin architecture to return an object\n        # of type FakeSaveClass, with the three signatures in it.\n        x = SaveSignaturesToLocation(fake_location)\n        with x as save_sig:\n            save_sig.add(sig2)\n            save_sig.add(sig47)\n            save_sig.add(sig63)\n\n        print(len(x))\n        print(x.keep)\n\n        assert isinstance(x, FakeSaveClass)\n        assert x.keep == [sig2, sig47, sig63]\n\n\nclass Test_EntryPointPriority_SaveTo:\n    # test that priority is observed\n\n    def setup_method(self):\n        self.saved_plugins = plugins._plugin_save_to\n        plugins._plugin_save_to = [\n            FakeEntryPoint(\"test_save\", FakeSaveClass),\n            FakeEntryPoint(\"test_save2\", FakeSaveClass_HighPriority),\n        ]\n\n    def teardown_method(self):\n        plugins._plugin_save_to = self.saved_plugins\n\n    def test_save_1(self):\n        ps = list(plugins.get_save_to_functions())\n        print(ps)\n        assert len(ps) == 2\n\n    def test_save_2(self, runtmp):\n        # load some signatures to save\n        ss2 = utils.get_test_data(\"2.fa.sig\")\n        ss47 = utils.get_test_data(\"47.fa.sig\")\n        ss63 = utils.get_test_data(\"63.fa.sig\")\n\n        sig2 = load_one_signature_from_json(ss2, ksize=31)\n        sig47 = load_one_signature_from_json(ss47, ksize=31)\n        sig63 = load_one_signature_from_json(ss63, ksize=31)\n\n        # build a fake location that matches the FakeSaveClass\n        # extension\n        fake_location = runtmp.output(\"out.this-is-a-test\")\n\n        # this should use the plugin architecture to return an object\n        # of type FakeSaveClass, with the three signatures in it.\n        x = SaveSignaturesToLocation(fake_location)\n        with x as save_sig:\n            save_sig.add(sig2)\n            save_sig.add(sig47)\n            save_sig.add(sig63)\n\n        print(len(x))\n        print(x.keep)\n\n        assert isinstance(x, FakeSaveClass_HighPriority)\n        assert x.keep == [sig2, sig47, sig63]\n        assert x.priority == 1\n\n\n#\n# Test basic features of the save_to plugin hook.\n#\n\n\nclass FakeCommandClass(plugins.CommandLinePlugin):\n    \"\"\"\n    A fake CLI class.\n    \"\"\"\n\n    command = \"nifty\"\n    description = \"do somethin' nifty\"\n\n    def __init__(self, parser):\n        super().__init__(parser)\n        parser.add_argument(\"arg1\")\n        parser.add_argument(\"--other\", action=\"store_true\")\n        parser.add_argument(\"--do-fail\", action=\"store_true\")\n\n    def main(self, args):\n        super().main(args)\n        print(f\"hello, world! argument is: {args.arg1}\")\n        print(f\"other is {args.other}\")\n\n        if args.do_fail:\n            return 1\n        return 0\n\n\nclass Test_EntryPointBasics_Command:\n    # test the basics\n    def setup_method(self):\n        _ = plugins.get_cli_script_plugins()\n        self.saved_plugins = plugins._plugin_cli\n        plugins._plugin_cli_once = False\n        plugins._plugin_cli = [FakeEntryPoint(\"test_command\", FakeCommandClass)]\n\n    def teardown_method(self):\n        plugins._plugin_cli = self.saved_plugins\n\n    def test_empty(self, runtmp):\n        # empty out script plugins...\n        plugins._plugin_cli = []\n\n        with pytest.raises(utils.SourmashCommandFailed):\n            runtmp.sourmash(\"scripts\")\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        assert \"(No script plugins detected!)\" in out\n\n    def test_cmd_0(self, runtmp):\n        # test default output with some plugins\n        with pytest.raises(utils.SourmashCommandFailed):\n            runtmp.sourmash(\"scripts\")\n\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        assert \"do somethin' nifty\" in out\n        assert \"sourmash scripts nifty\" in out\n\n    def test_cmd_1(self):\n        # test descriptions\n        ps = list(plugins.get_cli_scripts_descriptions())\n        print(ps)\n        assert len(ps) == 1\n\n        descr0 = ps[0]\n        assert \"do somethin' nifty\" in descr0\n        assert \"sourmash scripts nifty\" in descr0\n\n    def test_cmd_2(self):\n        # test get_cli_script_plugins function\n        ps = list(plugins.get_cli_script_plugins())\n        print(ps)\n        assert len(ps) == 1\n\n    def test_cmd_3(self, runtmp):\n        # test ability to run 'nifty' ;)\n        with pytest.raises(utils.SourmashCommandFailed):\n            runtmp.sourmash(\"scripts\", \"nifty\")\n\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n\n        assert \"nifty: error: the following arguments are required: arg1\" in err\n        assert \"usage:  nifty [-h] [-q] [-d] [--other] [--do-fail] arg1\" in err\n\n    def test_cmd_4(self, runtmp):\n        # test basic argument parsing etc\n        runtmp.sourmash(\"scripts\", \"nifty\", \"--other\", \"some arg\")\n\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n\n        assert \"other is True\" in out\n        assert \"hello, world! argument is: some arg\" in out\n\n    def test_cmd_5(self, runtmp):\n        # test exit code passthru\n        with pytest.raises(utils.SourmashCommandFailed):\n            runtmp.sourmash(\"scripts\", \"nifty\", \"--do-fail\", \"some arg\")\n\n        status = runtmp.last_result.status\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        print(status)\n\n        assert \"other is False\" in out\n        assert \"hello, world! argument is: some arg\" in out\n\n\nclass FakeCommandClass_Second(plugins.CommandLinePlugin):\n    \"\"\"\n    A fake CLI class.\n    \"\"\"\n\n    command = \"more_nifty\"\n    description = \"do somethin' else nifty\"\n\n    def __init__(self, parser):\n        super().__init__(parser)\n        parser.add_argument(\"arg1\")\n        parser.add_argument(\"--other\", action=\"store_true\")\n        parser.add_argument(\"--do-fail\", action=\"store_true\")\n\n    def main(self, args):\n        super().main(args)\n        print(f\"hello, world! argument is: {args.arg1}\")\n        print(f\"other is {args.other}\")\n\n        if args.do_fail:\n            return 1\n        return 0\n\n\nclass FakeCommandClass_Broken_1:\n    \"\"\"\n    A fake CLI class.\n    \"\"\"\n\n    # command = 'more_nifty' # no command\n\n    def __init__(self, parser):\n        assert 0\n\n    def main(self, args):\n        assert 0\n\n\nclass FakeCommandClass_Broken_2:\n    \"\"\"\n    A fake CLI class.\n    \"\"\"\n\n    command = \"broken\"\n    # no description\n\n    def __init__(self, parser):\n        pass\n\n    def main(self, args):\n        return 0\n\n\nclass Test_EntryPointBasics_TwoCommands:\n    # test a second command\n    def setup_method(self):\n        _ = plugins.get_cli_script_plugins()\n        self.saved_plugins = plugins._plugin_cli\n        plugins._plugin_cli_once = False\n        plugins._plugin_cli = [\n            FakeEntryPoint(\"test_command\", FakeCommandClass),\n            FakeEntryPoint(\"test_command2\", FakeCommandClass_Second),\n            FakeEntryPoint(\"test_command3\", FakeCommandClass_Broken_1),\n            FakeEntryPoint(\"test_command4\", FakeCommandClass_Broken_2),\n            FakeEntryPoint(\n                \"error-on-import\", FakeCommandClass, error_on_import=ModuleNotFoundError\n            ),\n        ]\n\n    def teardown_method(self):\n        plugins._plugin_cli = self.saved_plugins\n\n    def test_cmd_0(self, runtmp):\n        # test default output for a few plugins\n        with pytest.raises(utils.SourmashCommandFailed):\n            runtmp.sourmash(\"scripts\")\n\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        assert \"do somethin' nifty\" in out\n        assert \"sourmash scripts nifty\" in out\n\n        assert \"do somethin' else nifty\" in out\n        assert \"sourmash scripts more_nifty\" in out\n\n    def test_cmd_1(self, runtmp):\n        # test 'nifty'\n        runtmp.sourmash(\"scripts\", \"nifty\", \"some arg\")\n\n        status = runtmp.last_result.status\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        print(status)\n\n        assert \"other is False\" in out\n        assert \"hello, world! argument is: some arg\" in out\n\n    def test_cmd_2(self, runtmp):\n        # test 'more_nifty'\n        runtmp.sourmash(\"scripts\", \"more_nifty\", \"some arg\")\n\n        status = runtmp.last_result.status\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n        print(status)\n\n        assert \"other is False\" in out\n        assert \"hello, world! argument is: some arg\" in out\n\n    def test_sourmash_info(self, runtmp):\n        # test 'sourmash info -v' => shows the plugins\n        runtmp.sourmash(\"info\", \"-v\")\n\n        out = runtmp.last_result.out\n        err = runtmp.last_result.err\n        print(out)\n        print(err)\n\n        expected = \"\"\"\ngroupfoo             test_plugin_framework          0.1   test_command\ngroupfoo             test_plugin_framework          0.1   test_command2\ngroupfoo             test_plugin_framework          0.1   test_command3\ngroupfoo             test_plugin_framework          0.1   test_command4\n\"\"\".splitlines()\n        for line in expected:\n            assert line in err\n\n\ndef test_cli_scripts_getattr_fail():\n    # test scripts.__getattr__ w/fail\n    from sourmash.cli import scripts\n\n    with pytest.raises(AttributeError):\n        scripts.ThisAttrDoesNotExist\n\n\ndef test_cli_scripts_getattr_succ():\n    # test scripts.__getattr__ w/success\n    from sourmash.cli import scripts\n\n    scripts.subparser\n"
  },
  {
    "path": "tests/test_prefetch.py",
    "content": "\"\"\"\nTests for `sourmash prefetch` command-line and API functionality.\n\"\"\"\n\nimport os\nimport csv\nimport gzip\nimport pytest\nimport glob\nimport random\nfrom sourmash.search import PrefetchResult\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash import SourmashSignature, sourmash_args\nfrom sourmash.signature import (\n    save_signatures_to_json,\n    load_signatures_from_json,\n    load_one_signature_from_json,\n)\n\n\ndef approx_eq(val1, val2):\n    if val1 == \"\":\n        return val1 == val2\n    return round(float(val1), 3) == round(float(val2), 3)\n\n\ndef test_prefetch_basic(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    assert (\n        \"WARNING: no output(s) specified! Nothing will be saved from this prefetch!\"\n        in c.last_result.err\n    )\n    assert \"selecting specified query k=31\" in c.last_result.err\n    assert (\n        \"loaded query: NC_009665.1 Shewanella baltica... (k=31, DNA)\"\n        in c.last_result.err\n    )\n    assert (\n        \"query sketch has scaled=1000; will be dynamically downsampled as needed\"\n        in c.last_result.err\n    )\n\n    err = c.last_result.err\n    assert \"loaded 5 total signatures from 3 locations.\" in err\n    assert \"after selecting signatures compatible with search, 3 remain.\" in err\n\n    assert \"total of 2 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 5177 distinct query hashes, 5177 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert \"a total of 0 query hashes remain unmatched.\" in c.last_result.err\n\n\ndef test_prefetch_select_query_ksize(runtmp, linear_gather):\n    # test prefetch where query and subject db both have multiple ksizes\n    c = runtmp\n\n    ss = utils.get_test_data(\"GCF_000005845.2_ASM584v2_genomic.fna.gz.sig\")\n\n    c.run_sourmash(\"prefetch\", ss, ss, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"of 4476 distinct query hashes, 4476 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n\n\ndef test_prefetch_subject_scaled_is_larger(runtmp, linear_gather):\n    # test prefetch where subject scaled is larger\n    c = runtmp\n\n    # make a query sketch with scaled=1000\n    fa = utils.get_test_data(\"genome-s10.fa.gz\")\n    c.run_sourmash(\"sketch\", \"dna\", fa, \"-o\", \"query.sig\")\n    assert os.path.exists(runtmp.output(\"query.sig\"))\n\n    # this has a scaled of 10000, from same genome:\n    against1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    against2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n    against3 = utils.get_test_data(\"scaled/all.lca.json\")\n\n    # run against large scaled, then small (self)\n    c.run_sourmash(\n        \"prefetch\",\n        \"query.sig\",\n        against1,\n        against2,\n        against3,\n        \"query.sig\",\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"total of 8 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 48 distinct query hashes, 48 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert (\n        \"final scaled value (max across query and all matches) is 10000\"\n        in c.last_result.err\n    )\n\n\ndef test_prefetch_subject_scaled_is_larger_outsigs(runtmp, linear_gather):\n    # test prefetch where subject scaled is larger -- output sigs\n    c = runtmp\n\n    # make a query sketch with scaled=1000\n    fa = utils.get_test_data(\"genome-s10.fa.gz\")\n    c.run_sourmash(\"sketch\", \"dna\", fa, \"-o\", \"query.sig\")\n    assert os.path.exists(runtmp.output(\"query.sig\"))\n\n    # this has a scaled of 10000, from same genome:\n    against1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    against2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n    against3 = utils.get_test_data(\"scaled/all.lca.json\")\n\n    # run against large scaled, then small (self)\n    c.run_sourmash(\n        \"prefetch\",\n        \"query.sig\",\n        against1,\n        against2,\n        against3,\n        \"query.sig\",\n        linear_gather,\n        \"--save-matches\",\n        \"matches.sig\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"total of 8 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 48 distinct query hashes, 48 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert (\n        \"final scaled value (max across query and all matches) is 10000\"\n        in c.last_result.err\n    )\n\n    # make sure non-downsampled sketches were saved.\n    matches = sourmash.load_file_as_signatures(runtmp.output(\"matches.sig\"))\n    scaled_vals = set([match.minhash.scaled for match in matches])\n    assert 1000 in scaled_vals\n    assert 10000 in scaled_vals\n    assert len(scaled_vals) == 2\n\n\ndef test_prefetch_query_abund(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch w/abund query\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    assert (\n        \"WARNING: no output(s) specified! Nothing will be saved from this prefetch!\"\n        in c.last_result.err\n    )\n    assert \"selecting specified query k=31\" in c.last_result.err\n    assert (\n        \"loaded query: NC_009665.1 Shewanella baltica... (k=31, DNA)\"\n        in c.last_result.err\n    )\n    assert (\n        \"query sketch has scaled=1000; will be dynamically downsampled as needed\"\n        in c.last_result.err\n    )\n\n    assert \"total of 2 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 5177 distinct query hashes, 5177 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert \"a total of 0 query hashes remain unmatched.\" in c.last_result.err\n\n\ndef test_prefetch_subj_abund(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch w/abund signature.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    assert (\n        \"WARNING: no output(s) specified! Nothing will be saved from this prefetch!\"\n        in c.last_result.err\n    )\n    assert \"selecting specified query k=31\" in c.last_result.err\n    assert (\n        \"loaded query: NC_009665.1 Shewanella baltica... (k=31, DNA)\"\n        in c.last_result.err\n    )\n    assert (\n        \"query sketch has scaled=1000; will be dynamically downsampled as needed\"\n        in c.last_result.err\n    )\n\n    assert \"total of 2 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 5177 distinct query hashes, 5177 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert \"a total of 0 query hashes remain unmatched.\" in c.last_result.err\n\n\ndef test_prefetch_csv_out(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with CSV output\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    csvout = c.output(\"out.csv\")\n\n    c.run_sourmash(\n        \"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, \"-o\", csvout, linear_gather\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    expected_intersect_bp = [2529000, 5177000]\n    with open(csvout, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        for row, expected in zip(r, expected_intersect_bp):\n            print(row)\n            assert int(row[\"intersect_bp\"]) == expected\n\n\ndef test_prefetch_csv_gz_out(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with CSV output to a .gz file\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    csvout = c.output(\"out.csv.gz\")\n\n    c.run_sourmash(\n        \"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, \"-o\", csvout, linear_gather\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    expected_intersect_bp = [2529000, 5177000]\n    with gzip.open(csvout, \"rt\", newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        for row, expected in zip(r, expected_intersect_bp):\n            print(row)\n            assert int(row[\"intersect_bp\"]) == expected\n\n\ndef test_prefetch_matches(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with --save-matches\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    matches_out = c.output(\"matches.sig\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"--save-matches\",\n        matches_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(matches_out)\n\n    sigs = sourmash.load_file_as_index(matches_out)\n\n    expected_matches = [sig63, sig47]\n    for match, expected in zip(sigs.signatures(), expected_matches):\n        ss = load_one_signature_from_json(expected, ksize=31)\n        assert match == ss\n\n\ndef test_prefetch_matches_to_dir(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with --save-matches to a directory\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63)\n    ss47 = load_one_signature_from_json(sig47)\n\n    matches_out = c.output(\"matches_dir/\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"--save-matches\",\n        matches_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(matches_out)\n    assert os.path.isdir(matches_out)\n\n    sigs = sourmash.load_file_as_signatures(matches_out)\n\n    match_sigs = list(sigs)\n    assert ss63 in match_sigs\n    assert ss47 in match_sigs\n    assert len(match_sigs) == 2\n\n\ndef test_prefetch_matches_to_sig_gz(runtmp, linear_gather):\n    c = runtmp\n\n    import gzip\n\n    # test a basic prefetch, with --save-matches to a sig.gz file\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63)\n    ss47 = load_one_signature_from_json(sig47)\n\n    matches_out = c.output(\"matches.sig.gz\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"--save-matches\",\n        matches_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(matches_out)\n    assert os.path.isfile(matches_out)\n\n    with gzip.open(matches_out, \"rt\") as fp:\n        # can we read this as a gz file?\n        fp.read()\n\n    sigs = sourmash.load_file_as_signatures(matches_out)\n\n    match_sigs = list(sigs)\n    assert ss63 in match_sigs\n    assert ss47 in match_sigs\n    assert len(match_sigs) == 2\n\n\ndef test_prefetch_matches_to_zip(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with --save-matches to a zipfile\n    import zipfile\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63)\n    ss47 = load_one_signature_from_json(sig47)\n\n    matches_out = c.output(\"matches.zip\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"--save-matches\",\n        matches_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(matches_out)\n    assert os.path.isfile(matches_out)\n\n    with zipfile.ZipFile(matches_out, \"r\") as fp:\n        # can we read this as a .zip file?\n        for zi in fp.infolist():\n            pass\n\n    sigs = sourmash.load_file_as_signatures(matches_out)\n\n    match_sigs = list(sigs)\n    assert ss63 in match_sigs\n    assert ss47 in match_sigs\n    assert len(match_sigs) == 2\n\n\ndef test_prefetch_matching_hashes(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with --save-matches\n    utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    matches_out = c.output(\"matches.sig\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        \"--save-matching-hashes\",\n        matches_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(matches_out)\n\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n    matches = set(ss47.minhash.hashes) & set(ss63.minhash.hashes)\n\n    intersect = ss47.minhash.copy_and_clear()\n    intersect.add_many(matches)\n\n    ss = load_one_signature_from_json(matches_out)\n    assert ss.name.endswith(\"-known\")\n    assert ss.minhash == intersect\n\n\ndef test_prefetch_nomatch_hashes(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with --save-matches\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    nomatch_out = c.output(\"unmatched_hashes.sig\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        \"--save-unmatched-hashes\",\n        nomatch_out,\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(nomatch_out)\n\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    remain = ss47.minhash.to_mutable()\n    remain.remove_many(ss63.minhash.hashes)\n\n    ss = load_one_signature_from_json(nomatch_out)\n    assert ss.name.endswith(\"-unknown\")\n    assert ss.minhash == remain\n\n\ndef test_prefetch_no_num_query(runtmp, linear_gather):\n    c = runtmp\n\n    # can't do prefetch with num signatures for query\n    sig47 = utils.get_test_data(\"num/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, sig63, sig47, linear_gather)\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n\n\ndef test_prefetch_no_num_subj(runtmp, linear_gather):\n    c = runtmp\n\n    # can't do prefetch with num signatures for query; no matches!\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"num/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, sig63, linear_gather)\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert (\n        \"ERROR in prefetch: after picklists and patterns, no signatures to search!?\"\n        in c.last_result.err\n    )\n\n\ndef test_prefetch_db_fromfile(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    from_file = c.output(\"from-list.txt\")\n\n    with open(from_file, \"w\") as fp:\n        print(sig63, file=fp)\n        print(sig2, file=fp)\n        print(sig47, file=fp)\n\n    c.run_sourmash(\n        \"prefetch\", \"-k\", \"31\", sig47, linear_gather, \"--db-from-file\", from_file\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    assert (\n        \"WARNING: no output(s) specified! Nothing will be saved from this prefetch!\"\n        in c.last_result.err\n    )\n    assert \"selecting specified query k=31\" in c.last_result.err\n    assert (\n        \"loaded query: NC_009665.1 Shewanella baltica... (k=31, DNA)\"\n        in c.last_result.err\n    )\n    assert (\n        \"query sketch has scaled=1000; will be dynamically downsampled as needed\"\n        in c.last_result.err\n    )\n\n    assert \"total of 2 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 5177 distinct query hashes, 5177 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert \"a total of 0 query hashes remain unmatched.\" in c.last_result.err\n\n\ndef test_prefetch_no_db(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch with no databases/signatures\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert \"ERROR: no databases or signatures to search!?\" in c.last_result.err\n\n\ndef test_prefetch_check_scaled_bounds_negative(runtmp, linear_gather):\n    c = runtmp\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"prefetch\",\n            \"-k\",\n            \"31\",\n            sig47,\n            sig63,\n            sig2,\n            sig47,\n            \"--scaled\",\n            \"-5\",\n            linear_gather,\n        )\n\n    assert \"ERROR: scaled value must be positive\" in str(exc.value)\n\n\ndef test_prefetch_check_scaled_bounds_less_than_minimum(runtmp, linear_gather):\n    c = runtmp\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"prefetch\",\n            \"-k\",\n            \"31\",\n            sig47,\n            sig63,\n            sig2,\n            sig47,\n            \"--scaled\",\n            \"50\",\n            linear_gather,\n        )\n\n    assert \"WARNING: scaled value should be >= 100. Continuing anyway.\" in str(\n        exc.value\n    )\n\n\ndef test_prefetch_check_scaled_bounds_more_than_maximum(runtmp, linear_gather):\n    c = runtmp\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"prefetch\",\n            \"-k\",\n            \"31\",\n            sig47,\n            sig63,\n            sig2,\n            sig47,\n            \"--scaled\",\n            \"1e9\",\n            linear_gather,\n        )\n\n    assert \"WARNING: scaled value should be <= 1e6. Continuing anyway.\" in str(\n        exc.value\n    )\n\n\ndef test_prefetch_downsample_scaled(runtmp, linear_gather):\n    c = runtmp\n\n    # test --scaled\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"--scaled\",\n        \"1e5\",\n        linear_gather,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"downsampling query from scaled=1000 to 10000\" in c.last_result.err\n\n\ndef test_prefetch_downsample_multiple(runtmp, linear_gather):\n    # test multiple different downsamplings in prefetch code\n    query_sig = utils.get_test_data(\"GCF_000006945.2-s500.sig\")\n\n    # load in the hashes and do split them into four bins, randomly.\n    ss = load_one_signature_from_json(query_sig)\n    hashes = list(ss.minhash.hashes)\n\n    random.seed(a=1)  # fix seed so test is reproducible\n    random.shuffle(hashes)\n\n    # split into 4 bins:\n    mh_bins = [ss.minhash.copy_and_clear() for i in range(4)]\n    for i, hashval in enumerate(hashes):\n        mh_bins[i % 4].add_hash(hashval)\n\n    # downsample with different scaleds; initial scaled is 500, note.\n    mh_bins[0] = mh_bins[0].downsample(scaled=750)\n    mh_bins[1] = mh_bins[1].downsample(scaled=600)\n    mh_bins[2] = mh_bins[2].downsample(scaled=1000)\n    mh_bins[3] = mh_bins[3].downsample(scaled=650)\n\n    gathersigs = []\n    for i in range(4):\n        binsig = SourmashSignature(mh_bins[i], name=f\"bin{i}\")\n\n        with open(runtmp.output(f\"bin{i}.sig\"), \"wb\") as fp:\n            save_signatures_to_json([binsig], fp)\n\n        gathersigs.append(f\"bin{i}.sig\")\n\n    runtmp.sourmash(\"prefetch\", linear_gather, query_sig, *gathersigs)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"final scaled value (max across query and all matches) is 1000\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_prefetch_empty(runtmp, linear_gather):\n    c = runtmp\n\n    # test --scaled\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"prefetch\",\n            \"-k\",\n            \"31\",\n            sig47,\n            sig63,\n            sig2,\n            sig47,\n            \"--scaled\",\n            \"1e9\",\n            linear_gather,\n        )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert \"no query hashes!? exiting.\" in c.last_result.err\n\n\ndef test_prefetch_basic_many_sigs(runtmp, linear_gather):\n    c = runtmp\n\n    # test what happens with many (and duplicate) signatures\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    manysigs = [sig63, sig2, sig47] * 5\n\n    c.run_sourmash(\"prefetch\", \"-k\", \"31\", sig47, *manysigs, linear_gather)\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"total of 10 matching signatures so far.\" in c.last_result.err\n    assert \"total of 10 matching signatures.\" in c.last_result.err\n    assert (\n        \"of 5177 distinct query hashes, 5177 were found in matches above threshold.\"\n        in c.last_result.err\n    )\n    assert \"a total of 0 query hashes remain unmatched.\" in c.last_result.err\n\n\ndef test_prefetch_with_picklist(runtmp):\n    # test 'sourmash prefetch' with picklists\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"prefetch\", metag_sig, *gcf_sigs, \"--picklist\", f\"{picklist}:md5:md5\"\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    # these are the different ksizes\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 3 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 453 were found in matches above threshold.\"\n        in err\n    )\n    assert \"a total of 1013 query hashes remain unmatched.\" in err\n\n\ndef test_prefetch_with_picklist_exclude(runtmp):\n    # test 'sourmash prefetch' with picklists, exclude\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"prefetch\", metag_sig, *gcf_sigs, \"--picklist\", f\"{picklist}:md5:md5:exclude\"\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 9 matches by excluding 9 distinct values\" in err\n    # these are the different ksizes\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 9 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 1013 were found in matches above threshold.\"\n        in err\n    )\n    assert \"a total of 453 query hashes remain unmatched.\" in err\n\n\ndef test_prefetch_with_pattern_include(runtmp):\n    # test 'sourmash prefetch' with --include-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\"prefetch\", metag_sig, *gcf_sigs, \"--include\", \"thermotoga\")\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 3 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 453 were found in matches above threshold.\"\n        in err\n    )\n    assert \"a total of 1013 query hashes remain unmatched.\" in err\n\n\ndef test_prefetch_with_pattern_exclude(runtmp):\n    # test 'sourmash prefetch' with --exclude-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\"prefetch\", metag_sig, *gcf_sigs, \"--exclude\", \"thermotoga\")\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 9 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 1013 were found in matches above threshold.\"\n        in err\n    )\n    assert \"a total of 453 query hashes remain unmatched.\" in err\n\n\ndef test_prefetch_output_with_abundance(runtmp, prefetch_gather, linear_gather):\n    c = runtmp\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against = utils.get_test_data(\"gather-abund/genome-s10.fa.gz.sig\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        linear_gather,\n        query,\n        against,\n        \"--save-matching-hashes\",\n        c.output(\"match-hash.sig\"),\n        \"--save-unmatched-hashes\",\n        c.output(\"nomatch-hash.sig\"),\n    )\n\n    print(c.last_result.out)\n\n    assert os.path.exists(c.output(\"match-hash.sig\"))\n    ss = list(sourmash.load_file_as_signatures(c.output(\"match-hash.sig\")))[0]\n    assert ss.minhash.track_abundance\n\n    assert os.path.exists(c.output(\"nomatch-hash.sig\"))\n    ss = list(sourmash.load_file_as_signatures(c.output(\"nomatch-hash.sig\")))[0]\n    assert ss.minhash.track_abundance\n\n\ndef test_prefetch_ani_csv_out(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with CSV output\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    csvout = c.output(\"out.csv\")\n\n    c.run_sourmash(\n        \"prefetch\", \"-k\", \"31\", sig47, sig63, sig2, sig47, \"-o\", csvout, linear_gather\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    prefetch_result_names = PrefetchResult.prefetch_write_cols\n    exp1 = {\n        \"q_ani\": \"0.9771552502238963\",\n        \"m_ani\": \"0.9767860811200507\",\n        \"ac_ani\": \"0.9769706656719734\",\n        \"mc_ani\": \"0.9771552502238963\",\n        \"pfn\": \"False\",\n    }\n    exp2 = {\n        \"q_ani\": \"1.0\",\n        \"m_ani\": \"1.0\",\n        \"ac_ani\": \"1.0\",\n        \"mc_ani\": \"1.0\",\n        \"pfn\": \"False\",\n    }\n    expected_ani_vals = [exp1, exp2]\n    with open(csvout, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        for row, expected in zip(r, expected_ani_vals):\n            print(row)\n            assert prefetch_result_names == list(row.keys())\n            assert approx_eq(row[\"query_containment_ani\"], expected[\"q_ani\"])\n            assert approx_eq(row[\"match_containment_ani\"], expected[\"m_ani\"])\n            assert approx_eq(row[\"max_containment_ani\"], expected[\"mc_ani\"])\n            assert approx_eq(row[\"average_containment_ani\"], expected[\"ac_ani\"])\n            assert row[\"potential_false_negative\"] == expected[\"pfn\"]\n\n\ndef test_prefetch_ani_csv_out_estimate_ci(runtmp, linear_gather):\n    c = runtmp\n\n    # test a basic prefetch, with CSV output\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    csvout = c.output(\"out.csv\")\n\n    c.run_sourmash(\n        \"prefetch\",\n        \"-k\",\n        \"31\",\n        sig47,\n        sig63,\n        sig2,\n        sig47,\n        \"-o\",\n        csvout,\n        linear_gather,\n        \"--estimate-ani-ci\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n    prefetch_result_names_ci = PrefetchResult.prefetch_write_cols_ci\n\n    exp1 = {\n        \"q_ani\": \"0.9771552502238963\",\n        \"m_ani\": \"0.9767860811200507\",\n        \"q_ani_low\": \"0.9762537506990911\",\n        \"q_ani_high\": \"0.9780336875157754\",\n        \"m_ani_low\": \"0.9758801604653301\",\n        \"m_ani_high\": \"0.9776692390768575\",\n        \"ac_ani\": \"0.9769706656719734\",\n        \"mc_ani\": \"0.9771552502238963\",\n        \"pfn\": \"False\",\n    }\n    exp2 = {\n        \"q_ani\": \"1.0\",\n        \"m_ani\": \"1.0\",\n        \"q_ani_low\": \"1.0\",\n        \"q_ani_high\": \"1.0\",\n        \"m_ani_low\": \"1.0\",\n        \"m_ani_high\": \"1.0\",\n        \"ac_ani\": \"1.0\",\n        \"mc_ani\": \"1.0\",\n        \"pfn\": \"False\",\n    }\n\n    expected_ani_vals = [exp1, exp2]\n    with open(csvout, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        for row, expected in zip(r, expected_ani_vals):\n            print(row)\n            assert prefetch_result_names_ci == list(row.keys())\n            assert approx_eq(row[\"query_containment_ani\"], expected[\"q_ani\"])\n            assert approx_eq(row[\"query_containment_ani_low\"], expected[\"q_ani_low\"])\n            assert approx_eq(row[\"query_containment_ani_high\"], expected[\"q_ani_high\"])\n            assert approx_eq(row[\"match_containment_ani\"], expected[\"m_ani\"])\n            assert approx_eq(row[\"match_containment_ani_low\"], expected[\"m_ani_low\"])\n            assert approx_eq(row[\"match_containment_ani_high\"], expected[\"m_ani_high\"])\n            assert approx_eq(row[\"max_containment_ani\"], expected[\"mc_ani\"])\n            assert approx_eq(row[\"average_containment_ani\"], expected[\"ac_ani\"])\n            assert row[\"potential_false_negative\"] == expected[\"pfn\"]\n\n\ndef test_prefetch_ani_containment_asymmetry(runtmp):\n    # test contained_by asymmetries, viz #2215\n    query_sig = utils.get_test_data(\"47.fa.sig\")\n    merged_sig = utils.get_test_data(\"47-63-merge.sig\")\n\n    runtmp.sourmash(\"prefetch\", query_sig, merged_sig, \"-o\", \"query-in-merged.csv\")\n    runtmp.sourmash(\"prefetch\", merged_sig, query_sig, \"-o\", \"merged-in-query.csv\")\n\n    with sourmash_args.FileInputCSV(runtmp.output(\"query-in-merged.csv\")) as r:\n        query_in_merged = list(r)[0]\n\n    with sourmash_args.FileInputCSV(runtmp.output(\"merged-in-query.csv\")) as r:\n        merged_in_query = list(r)[0]\n\n    assert query_in_merged[\"query_containment_ani\"] == \"1.0\"\n    assert query_in_merged[\"match_containment_ani\"] == \"0.9865155060423993\"\n    assert query_in_merged[\"average_containment_ani\"] == \"0.9932577530211997\"\n\n    assert merged_in_query[\"match_containment_ani\"] == \"1.0\"\n    assert merged_in_query[\"query_containment_ani\"] == \"0.9865155060423993\"\n    assert merged_in_query[\"average_containment_ani\"] == \"0.9932577530211997\"\n"
  },
  {
    "path": "tests/test_revindex.py",
    "content": "\"\"\"\nTests of the MemRevIndex and DiskRevIndex classes.\n\"\"\"\n\nimport pytest\nimport sourmash_tst_utils as utils\nimport shutil\n\nfrom sourmash.index import revindex\nfrom sourmash.index.revindex import MemRevIndex, DiskRevIndex\nfrom sourmash.signature import load_one_signature_from_json\nfrom sourmash.search import JaccardSearch, SearchType\nfrom sourmash import SourmashSignature, minhash\nfrom sourmash.picklist import SignaturePicklist\n\n##\n## test a slightly outre version of JaccardSearch - this is a test of the\n## JaccardSearch 'collect' protocol, in particular...\n##\n\n\nclass JaccardSearchBestOnly_ButIgnore(JaccardSearch):\n    \"A class that ignores certain results, but still does all the pruning.\"\n\n    def __init__(self, ignore_list):\n        super().__init__(SearchType.JACCARD, threshold=0.1)\n        self.ignore_list = ignore_list\n\n    # a collect function that _ignores_ things in the ignore_list\n    def collect(self, score, match):\n        print(\"in collect; current threshold:\", self.threshold)\n        for q in self.ignore_list:\n            print(\"ZZZ\", match, match.similarity(q))\n            if match.similarity(q) == 1.0:\n                print(\"yes, found.\")\n                return False\n\n        # update threshold if not perfect match, which could help prune.\n        self.threshold = score\n        return True\n\n\ndef test_mem_revindex_empty():\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    lidx = MemRevIndex(template=ss2.minhash)\n\n    with pytest.raises(ValueError):\n        list(lidx.signatures())\n\n\ndef test_mem_revindex_num():\n    mh = minhash.MinHash(500, 4)\n\n    with pytest.raises(ValueError):\n        MemRevIndex(template=mh)\n\n\ndef test_mem_revindex_basic():\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    db = MemRevIndex(template=ss2.minhash)\n    db.insert(ss2)\n\n    db = db.select(ksize=31, scaled=1000, moltype=\"DNA\")\n    assert len(db) == 1\n    assert db.location is None\n\n\ndef test_mem_revindex_manifest():\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    db = MemRevIndex(template=ss2.minhash)\n    db.insert(ss2)\n    db = db.select(ksize=31, scaled=1000, moltype=\"DNA\")\n\n    manifest = db.manifest\n\n    assert len(db) == len(manifest)\n\n\ndef test_mem_revindex_index_search():\n    # confirm that RevIndex works\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    # now, search for sig2\n    sr = lidx.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n    assert sr[0][2] is None\n\n    # search for sig47 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss47, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss47\n    assert sr[1][1] == ss63\n    assert sr[1][2] is None  # location\n\n    # search for sig63 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss63, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n    assert sr[1][1] == ss47\n    assert sr[1][2] is None  # location\n\n    # search for sig63 with high threshold => 1 match\n    sr = lidx.search(ss63, threshold=0.8)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n\n\ndef test_mem_revindex_index_search_picklist(runtmp):\n    # confirm that MemRevIndex works w/picklists\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    pl = SignaturePicklist(\"ident\")\n    pl.init(values=[\"CP001071.1\"])\n    lidx = lidx.select(picklist=pl)\n\n    assert len(lidx) == 1\n    assert len(list(lidx.signatures())) == 1\n\n    # now, search for sig2\n    sr = lidx.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n    assert sr[0][2] is None\n\n    # search for sig47 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss47, threshold=0.1)\n    assert len(sr) == 0\n\n    # search for sig63 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss63, threshold=0.1)\n    assert len(sr) == 0\n\n\ndef test_mem_revindex_index_search_retrieve_orig():\n    # confirm that RevIndex returns the original, not the downsampled sketches\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    # store downsampled:\n    ds_mh = ss2.minhash.downsample(scaled=10_000)\n    lidx = MemRevIndex(template=ds_mh)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    # now, search for sig2\n    sr = lidx.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n\n    # search for sig47 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss47, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss47\n    assert sr[1][1] == ss63\n\n    # search for sig63 with lower threshold; search order not guaranteed.\n    sr = lidx.search(ss63, threshold=0.1)\n    print([s[1].name for s in sr])\n    assert len(sr) == 2\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n    assert sr[1][1] == ss47\n\n    # search for sig63 with high threshold => 1 match\n    sr = lidx.search(ss63, threshold=0.8)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    sr.sort(key=lambda x: -x[0])\n    assert sr[0][1] == ss63\n\n\ndef test_mem_revindex_best_containment():\n    # check that RevIndex.best_containment works.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    match = lidx.best_containment(ss2)\n    assert match\n    assert match.score == 1.0\n    assert match.signature == ss2\n\n    match = lidx.best_containment(ss47)\n    assert match\n    assert match.score == 1.0\n    assert match.signature == ss47\n\n\ndef test_mem_revindex_gather_ignore():\n    # check that RevIndex gather ignores things properly.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # construct an index...\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    # ...now search with something that should ignore sig47, the exact match.\n    search_fn = JaccardSearchBestOnly_ButIgnore([ss47])\n\n    results = list(lidx.find(search_fn, ss47))\n    results = [ss.signature for ss in results]\n\n    def is_found(ss, xx):\n        for q in xx:\n            print(ss, ss.similarity(q))\n            if ss.similarity(q) == 1.0:\n                return True\n        return False\n\n    assert not is_found(ss47, results)\n    assert not is_found(ss2, results)\n    assert is_found(ss63, results)\n\n\ndef test_mem_revindex_insert_after_init():\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx._init_inner()\n\n    # should not work!\n    with pytest.raises(Exception):\n        lidx.insert(ss47)\n\n\ndef test_mem_revindex_union_found():\n    # confirm that RevIndex works\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    # construct with 2 & 63\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss63)\n\n    # gather with 47\n    counter = lidx.counter_gather(ss47, 0)\n\n    # check found hashes\n    ident_mh = counter.union_found\n    print(\"XXX\", ident_mh, ident_mh.scaled)\n    print(\"YYY\", ss47.minhash, ss47.minhash.scaled)\n    print(ident_mh.contained_by(ss47.minhash))\n    print(ss47.minhash.contained_by(ident_mh))\n    assert ident_mh.contained_by(ss47.minhash) == 1.0\n    assert round(ss47.minhash.contained_by(ident_mh), 5) == 0.48851\n\n\ndef test_mem_revindex_index_check_errors():\n    # check various errors\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    empty_mh = ss2.minhash.copy_and_clear()\n    empty_ss = SourmashSignature(empty_mh)\n\n    with pytest.raises(ValueError):\n        lidx.search(empty_ss)\n\n    with pytest.raises(TypeError):\n        lidx.search(ss2, threshold=None)\n\n    with pytest.raises(TypeError):\n        lidx.search(ss2, threshold=None)\n\n    with pytest.raises(ValueError):\n        lidx.counter_gather(empty_ss)\n\n    with pytest.raises(ValueError):\n        lidx.prefetch(empty_ss)\n\n\ndef test_mem_revindex_index_check_nomatches():\n    # check what happens if no matches\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    lidx = MemRevIndex(template=ss2.minhash)\n    lidx.insert(ss2)\n    lidx.insert(ss47)\n    lidx.insert(ss63)\n\n    pl = SignaturePicklist(\"ident\")\n    pl.init(values=[\"CP001071.1\"])\n    lidx = lidx.select(picklist=pl)\n\n    assert len(lidx) == 1\n    assert len(list(lidx.signatures())) == 1\n\n    assert lidx.peek(ss47.minhash) == []\n\n    with pytest.raises(ValueError):\n        lidx.counter_gather(ss47)\n\n\ndef test_disk_revindex_basic():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    db = db.select(ksize=31, scaled=1000, moltype=\"DNA\")\n    assert len(db) == 3\n    assert db.location == rocksdb_path\n\n\ndef test_disk_revindex_manifest():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    db = db.select(ksize=31, scaled=1000, moltype=\"DNA\")\n    assert len(db) == 3\n    assert db.location == rocksdb_path\n\n    mf = db.manifest\n\n    assert len(db) == len(mf)\n    print(list(mf.rows))\n\n\ndef test_disk_revindex_prefetch_to_revindex():\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    ri = db.counter_gather(ss47, threshold_bp=0)\n    assert len(list(ri.signatures())) == 2\n\n\ndef test_disk_revindex_ksize_wrong():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    with pytest.raises(ValueError):\n        db.select(ksize=21)\n\n\ndef test_disk_revindex_load(runtmp):\n    # check loading from non .rocksdb directories\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n\n    newpath = runtmp.output(\"foo.dir\")\n    shutil.copytree(rocksdb_path, newpath)\n\n    db = DiskRevIndex(newpath)\n    print(db)\n    assert len(db) == 3, len(db)\n\n\ndef test_disk_revindex_len():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n\ndef test_disk_revindex_signatures():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    xx = list(db.signatures())\n    assert len(xx) == 3\n    for ss in xx:\n        print(ss.name)\n    # victory!\n\n\ndef test_disk_revindex_signatures_with_internal():\n    # check that 'internal' matches enumeration order.\n    # CTB note: this is, for now, an important implementation detail,\n    # implemented by the Python layer but corresponding to the Rust\n    # behavior. Be careful about changing it :). The better thing\n    # to do would be to export the manifest directly from Rust...\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    xx = list(db._signatures_with_internal())\n    assert len(xx) == 3\n    for n, (ss, internal) in enumerate(xx):\n        assert n == int(internal)\n        print(ss.name)\n    # victory!\n\n\ndef test_disk_revindex_signatures_with_picklist():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0, 1])\n    db._idx_picklist = dataset_picks\n    assert len(db) == 2, len(db)\n\n    xx = list(db.signatures())\n    assert len(xx) == 2\n    for ss in xx:\n        print(ss.name)\n    # victory!\n\n\ndef test_disk_revindex_signatures_with_internal_with_picklist():\n    # check that 'internal' matches enumeration order, and ignores\n    # picklists.\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0, 1])\n    db._idx_picklist = dataset_picks\n    assert len(db) == 2, len(db)  # len pays attention to picklist...\n\n    # BUT: picklist is ignored by signatures_with_internal.\n    xx = list(db._signatures_with_internal())\n    assert len(xx) == 3\n    for n, (ss, internal) in enumerate(xx):\n        assert n == int(internal)\n        print(ss.name)\n    # victory!\n\n\ndef test_disk_revindex_best_containment():\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    result = db.best_containment(ss47)\n    print(result)\n    assert round(result.score, 5) == 0.48851, result\n    assert (\n        result.signature.name == \"NC_011663.1 Shewanella baltica OS223, complete genome\"\n    ), result.signature.name\n    assert result.location == rocksdb_path\n\n\ndef test_disk_revindex_prefetch():\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    matches = list(db.prefetch(ss47, threshold_bp=0))\n    print(matches)\n    match = matches[0]\n    assert match.signature.name.startswith(\"NC_009665.1 Shewanella baltica OS185\")\n    assert round(match.score, 5) == 1.0\n    assert match.location == rocksdb_path\n\n    match = matches[1]\n    assert match.signature.name.startswith(\"NC_011663.1 Shewanella baltica OS223\")\n    assert round(match.score, 5) == 0.48851\n    assert match.location == rocksdb_path\n\n    assert len(matches) == 2\n\n\ndef test_disk_revindex_ksize_wrong():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    with pytest.raises(ValueError):\n        db.select(ksize=21)\n\n\ndef test_disk_revindex_ksize():\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(\"xxx\", db, db.select(ksize=31))\n    assert db == db.select(ksize=31)\n\n\ndef test_create_dataset_picklist_1():\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0, 1])\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    # no picklist\n    xx = list(db.search(ss2, threshold=0))\n    assert len(xx) == 1\n\n    # forcibly set picklist for now\n    db._idx_picklist = dataset_picks\n\n    # picklist including match:\n    xx = list(db.search(ss2, threshold=0))\n    assert len(xx) == 1\n    assert xx[0].score == 1.0\n\n\ndef test_create_dataset_picklist_2():\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0, 1])\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    # no picklist, 2 matches\n    xx = list(db.search(ss47, threshold=0))\n    assert len(xx) == 2\n\n    # forcibly set picklist for now\n    db._idx_picklist = dataset_picks\n\n    # picklist, 1 exact match\n    xx = list(db.search(ss47, threshold=0))\n    assert len(xx) == 1\n    assert xx[0].score == 1.0\n\n\ndef test_create_dataset_picklist_3():\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0, 1])\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # no picklist\n    xx = list(db.search(ss63, threshold=0))\n    assert len(xx) == 2\n\n    # forcibly set picklist for now\n    db._idx_picklist = dataset_picks\n\n    # picklist, 1 inexact match\n    xx = list(db.search(ss63, threshold=0))\n    assert len(xx) == 1\n    assert round(xx[0].score, 3) == 0.321\n\n\ndef test_create_dataset_picklist_4():\n    # what if picklist -> empty? + prefetch?\n    dataset_picks = revindex.RevIndex_DatasetPicklist([])\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    # no picklist\n    xx = list(db.search(ss63, threshold=0))\n    assert len(xx) == 2\n\n    # forcibly set picklist for now\n    db._idx_picklist = dataset_picks\n\n    # picklist, 0 matches\n    xx = list(db.prefetch(ss63, threshold=0))\n    assert len(xx) == 0\n\n\ndef test_create_dataset_picklist_5():\n    # make sure _signatures_with_internal reports everything.\n    dataset_picks = revindex.RevIndex_DatasetPicklist([0])\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n    print(db)\n    assert len(db) == 3, len(db)\n\n    db._idx_picklist = dataset_picks\n\n    siglist = list(db._signatures_with_internal())\n    assert len(siglist) == 3\n\n\ndef test_disk_revindex_against_bad_abund_rocksdb(runtmp):\n    # check against a RocksDB that contains sketches w/abund,\n    # created by branchwater. An alternative would be to write\n    # a test that uses the internal Python API for gather.\n    db = utils.get_test_data(\"track_abund/47+63.abund.rocksdb\")\n    metag = utils.get_test_data(\"SRR606249.sig.gz\")\n\n    runtmp.sourmash(\"gather\", metag, db)\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_1():\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(ss63, threshold_bp=0)\n    sr, isect_mh = cg.peek(ss63.minhash)\n    assert sr.score == 1.0\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_2():\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(ss47, threshold_bp=0)\n    sr, isect_mh = cg.peek(ss47.minhash)\n    assert round(sr.score, 5) == 0.48851\n\n    cg.consume(isect_mh)\n    assert cg.peek(ss47.minhash) == []\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_3():\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(ss2, threshold_bp=0)\n    sr, isect_mh = cg.peek(ss2.minhash)\n    print(sr)\n    assert sr.score == 1.0\n\n    cg.consume(isect_mh)\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_4():\n    # test peek/consume on db that contains 63 and 2, but not 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    ss63 = load_one_signature_from_json(sig63, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    combined_mh = ss47.minhash.to_mutable().copy()\n    combined_mh += ss63.minhash\n    combined_ss = SourmashSignature(combined_mh)\n\n    cg = db.counter_gather(combined_ss, threshold_bp=0)\n    sr, isect_mh = cg.peek(ss47.minhash)\n    assert round(sr.score, 5) == 0.48851\n\n    cg.consume(isect_mh)\n\n    sr, intersect_mh = cg.peek(ss63.minhash)\n    print(sr)\n    assert sr\n    assert len(intersect_mh) == 5238\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_5():\n    # test peek/consume on db that contains 47, 63 and 2\n    metag_path = utils.get_test_data(\"SRR606249.sig.gz\")\n    metag = load_one_signature_from_json(metag_path, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(metag, threshold_bp=0)\n\n    # round 1\n    sr, isect_mh = cg.peek(metag.minhash)\n    assert sr.signature.name.startswith(\"NC_011663.1\")\n    print(sr.signature.name)\n    assert round(sr.score, 5) == 0.01048\n\n    assert len(list(cg.signatures())) == 3\n    cg.consume(isect_mh)\n    assert len(list(cg.signatures())) == 2\n\n    # round 2\n    mh = metag.minhash.to_mutable()\n    mh.remove_many(isect_mh)\n\n    sr, isect_mh = cg.peek(mh)\n    assert sr.signature.name.startswith(\"CP001071.1\")\n    print(sr.signature.name)\n    assert round(sr.score, 5) == 0.00529\n\n    assert len(list(cg.signatures())) == 2\n    cg.consume(isect_mh)\n    assert len(list(cg.signatures())) == 1\n\n    # round 3\n    mh.remove_many(isect_mh)\n\n    sr, isect_mh = cg.peek(mh)\n    assert sr.signature.name.startswith(\"NC_009665.1\")\n    print(sr.signature.name)\n    assert round(sr.score, 5) == 0.00435\n\n    assert len(list(cg.signatures())) == 1\n    cg.consume(isect_mh)\n    assert len(list(cg.signatures())) == 0\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_6():\n    # test signatures on db that contains 47, 63 and 2\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(ss47, threshold_bp=0)\n\n    siglist = list(cg.signatures())\n    assert len(siglist) == 2\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_7():\n    # test signatures on db that contains 47, 63 and 2\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(ss2, threshold_bp=0)\n\n    siglist = list(cg.signatures())\n    assert len(siglist) == 1\n\n\ndef test_disk_revindex_prefetch_to_cg_colors_8():\n    # test peek/consume on db that contains 47, 63 and 2\n    metag_path = utils.get_test_data(\"SRR606249.sig.gz\")\n    metag = load_one_signature_from_json(metag_path, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    cg = db.counter_gather(metag, threshold_bp=0)\n\n    siglist = list(cg.signatures())\n    assert len(siglist) == 3\n\n\ndef test_disk_revindex_union_found():\n    # test union_found on db that contains 63 and 2, but not 47\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature_from_json(sig47, ksize=31)\n\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n    load_one_signature_from_json(sig63, ksize=31)\n\n    rocksdb_path = utils.get_test_data(\"2sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    # gather with 47\n    counter = db.counter_gather(ss47, 0)\n\n    # check found hashes\n    ident_mh = counter.union_found\n    assert ident_mh.contained_by(ss47.minhash) == 1.0\n    assert round(ss47.minhash.contained_by(ident_mh), 5) == 0.48851\n\n\ndef test_disk_revindex_index_search_picklist(runtmp):\n    # confirm that disk-based RevIndex search works w/picklists\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature_from_json(sig2, ksize=31)\n    ss47 = load_one_signature_from_json(sig47)\n    ss63 = load_one_signature_from_json(sig63)\n\n    rocksdb_path = utils.get_test_data(\"3sigs.branch_0913.rocksdb\")\n    db = DiskRevIndex(rocksdb_path)\n\n    pl = SignaturePicklist(\"ident\")\n    pl.init(values=[\"CP001071.1\"])\n    db = db.select(picklist=pl)\n\n    assert len(db) == 1\n    assert len(list(db.signatures())) == 1\n\n    # now, search for sig2\n    sr = db.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n\n    # search for sig47 with lower threshold; should be no result.\n    sr = db.search(ss47, threshold=0.1)\n    assert len(sr) == 0\n\n    # search for sig63 with lower threshold; should be no result.\n    sr = db.search(ss63, threshold=0.1)\n    assert len(sr) == 0\n"
  },
  {
    "path": "tests/test_rustobj.py",
    "content": "import pytest\n\nfrom sourmash.utils import RustObject\nfrom sourmash.minhash import to_bytes\n\n\ndef test_rustobj_init():\n    with pytest.raises(TypeError):\n        RustObject()\n\n\ndef test_to_bytes():\n    with pytest.raises(TypeError):\n        to_bytes([9882])\n\n    assert to_bytes(98) == bytes([98])\n    assert to_bytes(\"abc\") == b\"abc\"\n    assert to_bytes(b\"abc\") == b\"abc\"\n"
  },
  {
    "path": "tests/test_sbt.py",
    "content": "\"Test SBT code.\"\n\nimport json\nimport shutil\nimport os\n\nimport pytest\n\nimport sourmash\nfrom sourmash import SourmashSignature, load_file_as_signatures\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.exceptions import IndexNotSupported\nfrom sourmash.sbt import SBT, GraphFactory, Leaf, Node\nfrom sourmash.sbtmh import SigLeaf, load_sbt_index\nfrom sourmash.sbt_storage import FSStorage, RedisStorage, IPFSStorage, ZipStorage\nfrom sourmash.search import make_jaccard_search_query\nfrom sourmash.picklist import SignaturePicklist, PickStyle\n\nimport sourmash_tst_utils as utils\n\n\ndef test_simple(runtmp, n_children):\n    factory = GraphFactory(5, 100, 3)\n    root = SBT(factory, d=n_children)\n\n    leaf1 = Leaf(\"a\", factory())\n    leaf1.data.count(\"AAAAA\")\n    leaf1.data.count(\"AAAAT\")\n    leaf1.data.count(\"AAAAC\")\n\n    leaf2 = Leaf(\"b\", factory())\n    leaf2.data.count(\"AAAAA\")\n    leaf2.data.count(\"AAAAT\")\n    leaf2.data.count(\"AAAAG\")\n\n    leaf3 = Leaf(\"c\", factory())\n    leaf3.data.count(\"AAAAA\")\n    leaf3.data.count(\"AAAAT\")\n    leaf3.data.count(\"CAAAA\")\n\n    leaf4 = Leaf(\"d\", factory())\n    leaf4.data.count(\"AAAAA\")\n    leaf4.data.count(\"CAAAA\")\n    leaf4.data.count(\"GAAAA\")\n\n    leaf5 = Leaf(\"e\", factory())\n    leaf5.data.count(\"AAAAA\")\n    leaf5.data.count(\"AAAAT\")\n    leaf5.data.count(\"GAAAA\")\n\n    root.add_node(leaf1)\n    root.add_node(leaf2)\n    root.add_node(leaf3)\n    root.add_node(leaf4)\n    root.add_node(leaf5)\n\n    # return True if leaf node contains nodegraph w/kmer\n    def search_kmer(leaf, kmer):\n        return leaf.data.get(kmer)\n\n    leaves = [leaf1, leaf2, leaf3, leaf4, leaf5]\n    kmers = [\"AAAAA\", \"AAAAT\", \"AAAAG\", \"CAAAA\", \"GAAAA\"]\n\n    # define an exhaustive search function that looks in all the leaf nodes.\n    def search_kmer_in_list(kmer):\n        x = []\n        for l in leaves:\n            if l.data.get(kmer):\n                x.append(l)\n\n        return set(x)\n\n    # for all k-mers, ensure that tree._find_nodes matches the exhaustive\n    # search.\n    for kmer in kmers:\n        assert set(root._find_nodes(search_kmer, kmer)) == search_kmer_in_list(kmer)\n\n    print(\"-----\")\n    print([x.metadata for x in root._find_nodes(search_kmer, \"AAAAA\")])\n    print([x.metadata for x in root._find_nodes(search_kmer, \"AAAAT\")])\n    print([x.metadata for x in root._find_nodes(search_kmer, \"AAAAG\")])\n    print([x.metadata for x in root._find_nodes(search_kmer, \"CAAAA\")])\n    print([x.metadata for x in root._find_nodes(search_kmer, \"GAAAA\")])\n\n    # save SBT to a directory and then reload\n    root.save(runtmp.output(\"demo\"))\n    root = SBT.load(runtmp.output(\"demo\"))\n\n    for kmer in kmers:\n        new_result = {str(r) for r in root._find_nodes(search_kmer, kmer)}\n        print(*new_result, sep=\"\\n\")\n\n        assert new_result == {str(r) for r in search_kmer_in_list(kmer)}\n\n\ndef test_longer_search(n_children):\n    ksize = 5\n    factory = GraphFactory(ksize, 100, 3)\n    root = SBT(factory, d=n_children)\n\n    leaf1 = Leaf(\"a\", factory())\n    leaf1.data.count(\"AAAAA\")\n    leaf1.data.count(\"AAAAT\")\n    leaf1.data.count(\"AAAAC\")\n\n    leaf2 = Leaf(\"b\", factory())\n    leaf2.data.count(\"AAAAA\")\n    leaf2.data.count(\"AAAAT\")\n    leaf2.data.count(\"AAAAG\")\n\n    leaf3 = Leaf(\"c\", factory())\n    leaf3.data.count(\"AAAAA\")\n    leaf3.data.count(\"AAAAT\")\n    leaf3.data.count(\"CAAAA\")\n\n    leaf4 = Leaf(\"d\", factory())\n    leaf4.data.count(\"AAAAA\")\n    leaf4.data.count(\"CAAAA\")\n    leaf4.data.count(\"GAAAA\")\n\n    leaf5 = Leaf(\"e\", factory())\n    leaf5.data.count(\"AAAAA\")\n    leaf5.data.count(\"AAAAT\")\n    leaf5.data.count(\"GAAAA\")\n\n    root.add_node(leaf1)\n    root.add_node(leaf2)\n    root.add_node(leaf3)\n    root.add_node(leaf4)\n    root.add_node(leaf5)\n\n    def kmers(k, seq):\n        for start in range(len(seq) - k + 1):\n            yield seq[start : start + k]\n\n    def search_transcript(node, seq, threshold):\n        presence = [node.data.get(kmer) for kmer in kmers(ksize, seq)]\n        if sum(presence) >= int(threshold * (len(seq) - ksize + 1)):\n            return 1\n        return 0\n\n    try1 = [x.metadata for x in root._find_nodes(search_transcript, \"AAAAT\", 1.0)]\n    assert set(try1) == set([\"a\", \"b\", \"c\", \"e\"]), try1  # no 'd'\n\n    try2 = [x.metadata for x in root._find_nodes(search_transcript, \"GAAAAAT\", 0.6)]\n    assert set(try2) == set([\"a\", \"b\", \"c\", \"d\", \"e\"])\n\n    try3 = [x.metadata for x in root._find_nodes(search_transcript, \"GAAAA\", 1.0)]\n    assert set(try3) == set([\"d\", \"e\"]), try3\n\n\n# @pytest.mark.parametrize(\"old_version\", [\"v1\", \"v2\", \"v3\", \"v4\", \"v5\"])\n@pytest.mark.parametrize(\"old_version\", [\"v3\", \"v4\", \"v5\"])\ndef test_tree_old_load(old_version):\n    tree_old = SBT.load(\n        utils.get_test_data(f\"{old_version}.sbt.json\"), leaf_loader=SigLeaf.load\n    )\n\n    tree_cur = SBT.load(utils.get_test_data(\"v6.sbt.json\"), leaf_loader=SigLeaf.load)\n\n    testdata1 = utils.get_test_data(utils.SIG_FILES[0])\n    to_search = load_one_signature(testdata1)\n\n    print(list(tree_old.leaves()))\n\n    # note: earlier versions of this test did containment on\n    # the num MinHash in `to_search`, which doesn't work properly.\n    # (See test_sbt_no_containment_on_num for test). So, to\n    # fix the test for the new search API, we had to adjust\n    # the threshold.\n    search_obj = make_jaccard_search_query(threshold=0.05)\n    results_old = {str(s.signature) for s in tree_old.find(search_obj, to_search)}\n    results_cur = {str(s.signature) for s in tree_cur.find(search_obj, to_search)}\n\n    assert results_old == results_cur\n    assert len(results_old) == 4\n\n\ndef test_load_future(tmpdir):\n    with open(str(tmpdir.join(\"v9999.sbt.json\")), \"w\") as f:\n        json.dump({\"version\": 9999}, f)\n\n    with pytest.raises(IndexNotSupported) as excinfo:\n        SBT.load(str(tmpdir.join(\"v9999.sbt.json\")))\n\n    assert \"index format is not supported\" in str(excinfo.value)\n\n\ndef test_tree_save_load(runtmp, n_children):\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=n_children)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    tree.save(runtmp.output(\"demo\"))\n    tree = SBT.load(runtmp.output(\"demo\"), leaf_loader=SigLeaf.load)\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    new_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*new_result, sep=\"\\n\")\n\n    assert old_result == new_result\n\n\ndef test_search_minhashes():\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n\n    to_search = next(iter(tree.leaves()))\n\n    # this fails if 'search_obj' is calc containment and not similarity.\n    search_obj = make_jaccard_search_query(threshold=0.08)\n    results = tree.find(search_obj, to_search.data)\n\n    n = 0\n    for n, sr in enumerate(results):\n        assert to_search.data.jaccard(sr.signature) >= 0.08\n\n    assert n == 1\n\n\ndef test_binary_nary_tree():\n    factory = GraphFactory(31, 1e5, 4)\n    trees = {}\n    trees[2] = SBT(factory)\n    trees[5] = SBT(factory, d=5)\n    trees[10] = SBT(factory, d=10)\n\n    n_leaves = 0\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        for tree in trees.values():\n            tree.add_node(leaf)\n        to_search = leaf\n        n_leaves += 1\n\n    assert all([len(list(t.leaves())) == n_leaves for t in trees.values()])\n\n    results = {}\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    for d, tree in trees.items():\n        search_obj = make_jaccard_search_query(threshold=0.1)\n        results[d] = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*results[2], sep=\"\\n\")\n\n    assert results[2] == results[5]\n    assert results[5] == results[10]\n\n\ndef test_sbt_combine(n_children):\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=n_children)\n    tree_1 = SBT(factory, d=n_children)\n    tree_2 = SBT(factory, d=n_children)\n\n    n_leaves = 0\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        if n_leaves < 4:\n            tree_1.add_node(leaf)\n        else:\n            tree_2.add_node(leaf)\n        n_leaves += 1\n\n    tree_1.combine(tree_2)\n\n    t1_leaves = {str(l) for l in tree_1.leaves()}\n    t_leaves = {str(l) for l in tree.leaves()}\n\n    assert len(t1_leaves) == n_leaves\n    assert len(t_leaves) == len(t1_leaves)\n    assert t1_leaves == t_leaves\n\n    to_search = load_one_signature(utils.get_test_data(utils.SIG_FILES[0]))\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    t1_result = {str(s.signature) for s in tree_1.find(search_obj, to_search)}\n    tree_result = {str(s.signature) for s in tree.find(search_obj, to_search)}\n    assert t1_result == tree_result\n\n    # TODO: save and load both trees\n\n    # check if adding a new node will use the next empty position\n    next_empty = 0\n    for n, (d, _) in enumerate(tree_1):\n        if n != d:\n            next_empty = n\n            break\n    if not next_empty:\n        next_empty = n + 1\n\n    tree_1.add_node(SigLeaf(to_search.name, to_search))\n    assert tree_1.next_node == next_empty\n\n\ndef test_sbt_fsstorage(runtmp):\n    factory = GraphFactory(31, 1e5, 4)\n    # with utils.TempDirectory() as location:\n    tree = SBT(factory)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    with FSStorage(runtmp.location, \".fstree\") as storage:\n        tree.save(runtmp.output(\"tree.sbt.json\"), storage=storage)\n\n    tree = SBT.load(runtmp.output(\"tree.sbt.json\"), leaf_loader=SigLeaf.load)\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    new_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*new_result, sep=\"\\n\")\n\n    assert old_result == new_result\n\n    assert os.path.exists(runtmp.output(tree.storage.subdir))\n    assert os.path.exists(runtmp.output(\".fstree\"))\n\n\ndef test_sbt_zipstorage(tmpdir):\n    # create tree, save to a zip, then load and search.\n    factory = GraphFactory(31, 1e5, 4)\n\n    tree = SBT(factory)\n\n    for f in utils.SIG_FILES:\n        sig = next(load_file_as_signatures(utils.get_test_data(f)))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    with ZipStorage(str(tmpdir.join(\"tree.sbt.zip\")), mode=\"w\") as storage:\n        tree.save(str(tmpdir.join(\"tree.sbt.json\")), storage=storage)\n\n    with ZipStorage(str(tmpdir.join(\"tree.sbt.zip\"))) as storage:\n        tree = SBT.load(\n            str(tmpdir.join(\"tree.sbt.json\")), leaf_loader=SigLeaf.load, storage=storage\n        )\n\n        print(\"*\" * 60)\n        print(f\"{to_search.metadata}:\")\n        search_obj = make_jaccard_search_query(threshold=0.1)\n        new_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n        print(*new_result, sep=\"\\n\")\n\n        assert old_result == new_result\n\n\ndef test_sbt_ipfsstorage(runtmp):\n    ipfshttpclient = pytest.importorskip(\"ipfshttpclient\")\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    try:\n        with IPFSStorage() as storage:\n            tree.save(runtmp.output(\"tree.sbt.json\"), storage=storage)\n    except ipfshttpclient.exceptions.ConnectionError:\n        pytest.xfail(\"ipfs not installed/functioning probably\")\n\n    with IPFSStorage() as storage:\n        tree = SBT.load(\n            runtmp.output(\"tree.sbt.json\"), leaf_loader=SigLeaf.load, storage=storage\n        )\n\n        print(\"*\" * 60)\n        print(f\"{to_search.metadata}:\")\n        search_obj = make_jaccard_search_query(threshold=0.1)\n        new_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n        print(*new_result, sep=\"\\n\")\n\n        assert old_result == new_result\n\n\ndef test_sbt_redisstorage(runtmp):\n    redis = pytest.importorskip(\"redis\")\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    try:\n        with RedisStorage() as storage:\n            tree.save(runtmp.output(\"tree.sbt.json\"), storage=storage)\n    except redis.exceptions.ConnectionError:\n        pytest.xfail(\"Couldn't connect to redis server\")\n\n    with RedisStorage() as storage:\n        tree = SBT.load(\n            runtmp.output(\"tree.sbt.json\"), leaf_loader=SigLeaf.load, storage=storage\n        )\n\n        print(\"*\" * 60)\n        print(f\"{to_search.metadata}:\")\n        search_obj = make_jaccard_search_query(threshold=0.1)\n        new_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n        print(*new_result, sep=\"\\n\")\n\n        assert old_result == new_result\n\n\ndef test_save_zip(tmpdir):\n    # load from zipped SBT, save to zipped SBT, and then search.\n    testdata = utils.get_test_data(\"v6.sbt.zip\")\n    testsbt = tmpdir.join(\"v6.sbt.zip\")\n    newsbt = tmpdir.join(\"new.sbt.zip\")\n\n    shutil.copyfile(testdata, str(testsbt))\n\n    tree = SBT.load(str(testsbt), leaf_loader=SigLeaf.load)\n    tree.save(str(newsbt))\n    assert newsbt.exists()\n\n    new_tree = SBT.load(str(newsbt), leaf_loader=SigLeaf.load)\n    assert isinstance(new_tree.storage, ZipStorage)\n    assert new_tree.storage.list_sbts() == [\"new.sbt.json\"]\n\n    to_search = load_one_signature(utils.get_test_data(utils.SIG_FILES[0]))\n\n    print(\"*\" * 60)\n    print(f\"{to_search}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search)}\n    new_result = {str(s.signature) for s in new_tree.find(search_obj, to_search)}\n    print(*new_result, sep=\"\\n\")\n\n    assert old_result == new_result\n    assert len(new_result) == 2\n\n\ndef test_load_zip(tmpdir):\n    # search zipped SBT\n    testdata = utils.get_test_data(\"v6.sbt.zip\")\n    testsbt = tmpdir.join(\"v6.sbt.zip\")\n\n    shutil.copyfile(testdata, str(testsbt))\n\n    tree = SBT.load(str(testsbt), leaf_loader=SigLeaf.load)\n\n    to_search = load_one_signature(utils.get_test_data(utils.SIG_FILES[0]))\n\n    print(\"*\" * 60)\n    print(f\"{to_search}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    new_result = {str(s.signature) for s in tree.find(search_obj, to_search)}\n    print(*new_result, sep=\"\\n\")\n    assert len(new_result) == 2\n\n\ndef test_load_zip_uncompressed(tmpdir):\n    # uncompress zipped SBT into a tmpdir and search unpacked SBT\n    import zipfile\n\n    testdata = utils.get_test_data(\"v6.sbt.zip\")\n    testsbt = tmpdir.join(\"v6.sbt.json\")\n\n    with zipfile.ZipFile(testdata, \"r\") as z:\n        z.extractall(str(tmpdir))\n\n    tree = SBT.load(str(testsbt), leaf_loader=SigLeaf.load)\n\n    to_search = load_one_signature(utils.get_test_data(utils.SIG_FILES[0]))\n\n    print(\"*\" * 60)\n    print(f\"{to_search}:\")\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    new_result = {str(s.signature) for s in tree.find(search_obj, to_search)}\n    print(*new_result, sep=\"\\n\")\n    assert len(new_result) == 2\n\n\ndef test_tree_repair():\n    tree_repair = SBT.load(\n        utils.get_test_data(\"leaves.sbt.json\"), leaf_loader=SigLeaf.load\n    )\n\n    tree_cur = SBT.load(utils.get_test_data(\"v3.sbt.json\"), leaf_loader=SigLeaf.load)\n\n    testdata1 = utils.get_test_data(utils.SIG_FILES[0])\n    to_search = load_one_signature(testdata1)\n\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    results_repair = {str(s.signature) for s in tree_repair.find(search_obj, to_search)}\n    results_cur = {str(s.signature) for s in tree_cur.find(search_obj, to_search)}\n\n    assert results_repair == results_cur\n    assert len(results_repair) == 2\n\n\ndef test_tree_repair_insert():\n    tree_repair = SBT.load(\n        utils.get_test_data(\"leaves.sbt.json\"), leaf_loader=SigLeaf.load\n    )\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree_repair.add_node(leaf)\n\n    for pos, node in tree_repair:\n        # Every parent of a node must be an internal node (and not a leaf),\n        # except for node 0 (the root), whose parent is None.\n        if pos != 0:\n            assert isinstance(tree_repair.parent(pos).node, Node)\n\n        # Leaf nodes can't have children\n        if isinstance(node, Leaf):\n            assert all(c.node is None for c in tree_repair.children(pos))\n\n\ndef test_save_sparseness(runtmp, n_children):\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=n_children)\n\n    for f in utils.SIG_FILES:\n        sig = load_one_signature(utils.get_test_data(f))\n        leaf = SigLeaf(os.path.basename(f), sig)\n        tree.add_node(leaf)\n        to_search = leaf\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n\n    search_obj = make_jaccard_search_query(threshold=0.1)\n    old_result = {str(s.signature) for s in tree.find(search_obj, to_search.data)}\n    print(*old_result, sep=\"\\n\")\n\n    tree.save(runtmp.output(\"demo\"), sparseness=1.0)\n    tree_loaded = SBT.load(runtmp.output(\"demo\"), leaf_loader=SigLeaf.load)\n    assert all(not isinstance(n, Node) for _, n in tree_loaded)\n\n    print(\"*\" * 60)\n    print(f\"{to_search.metadata}:\")\n    new_result = {\n        str(s.signature) for s in tree_loaded.find(search_obj, to_search.data)\n    }\n    print(*new_result, sep=\"\\n\")\n\n    assert old_result == new_result\n\n    for pos, node in tree_loaded:\n        # Every parent of a node must be an internal node (and not a leaf),\n        # except for node 0 (the root), whose parent is None.\n        if pos != 0:\n            assert isinstance(tree_loaded.parent(pos).node, Node)\n\n        # Leaf nodes can't have children\n        if isinstance(node, Leaf):\n            assert all(c.node is None for c in tree_loaded.children(pos))\n\n\ndef test_sbt_as_index_select():\n    # test 'select' method from Index base class.\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    xx = tree.select(ksize=31)\n    assert xx == tree\n\n    xx = tree.select(moltype=\"DNA\")\n    assert xx == tree\n\n    xx = tree.select(abund=False)\n    assert xx == tree\n\n    with pytest.raises(ValueError):\n        tree.select(ksize=21)\n\n    with pytest.raises(ValueError):\n        tree.select(moltype=\"protein\")\n\n    with pytest.raises(ValueError):\n        tree.select(abund=True)\n\n\ndef test_sbt_as_index_select_picklist():\n    # test 'select' method from Index base class with a picklist\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"09a08691\"])\n\n    # select on picklist\n    tree = tree.select(picklist=picklist)\n    siglist = list(tree.signatures())\n    assert len(siglist) == 1\n\n    ss = siglist[0]\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"09a08691c\")\n\n\ndef test_sbt_as_index_select_picklist_exclude():\n    # test 'select' method from Index base class with a picklist, exclude\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"09a08691\"])\n\n    # select on picklist\n    tree = tree.select(picklist=picklist)\n    siglist = list(tree.signatures())\n    assert len(siglist) == 1\n\n    ss = siglist[0]\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"38729c637\")\n\n\ndef test_sbt_as_index_find_picklist():\n    # test 'select' method from Index base class with a picklist\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"09a08691\"])\n\n    # run a 'find' with sig63, should find 47 and 63 both.\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.0)\n    results = list(tree.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 2\n\n    # now, select on picklist and do another find...\n    tree = tree.select(picklist=picklist)\n    results = list(tree.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 1\n\n    # and check that it is the expected one!\n    ss = results[0].signature\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"09a08691c\")\n\n\ndef test_sbt_as_index_find_picklist_exclude():\n    # test 'select' method from Index base class with a picklist\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"09a08691\"])\n\n    # run a 'find' with sig63, should find 47 and 63 both.\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.0)\n    results = list(tree.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 2\n\n    # now, select on picklist and do another find...\n    tree = tree.select(picklist=picklist)\n    results = list(tree.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 1\n\n    # and check that it is the expected one!\n    ss = results[0].signature\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"38729c637\")\n\n\ndef test_sbt_as_index_find_picklist_twice():\n    # test 'select' method from Index base class with a picklist\n\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"09a08691\"])\n\n    # run a 'find' with sig63, should find 47 and 63 both.\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.0)\n    results = list(tree.find(search_obj, sig63))\n    print(results)\n    assert len(results) == 2\n\n    # now, select twice on picklists...\n    tree = tree.select(picklist=picklist)\n\n    with pytest.raises(ValueError):\n        tree = tree.select(picklist=picklist)\n        assert \"we do not (yet) support multiple picklists for SBT databases\" in str(\n            exc\n        )\n\n\ndef test_sbt_as_index_signatures():\n    # test 'signatures' method from Index base class.\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"))\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"))\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    xx = list(tree.signatures())\n    assert len(xx) == 2\n\n    assert sig47 in xx\n    assert sig63 in xx\n\n\ndef test_sbt_gather_threshold_1():\n    # test gather() method, in some detail\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n    tree.insert(sig2)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # query with empty hashes\n    assert not new_mh\n    with pytest.raises(ValueError):\n        tree.best_containment(SourmashSignature(new_mh))\n\n    # add one hash\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 1\n\n    result = tree.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n    # check with a threshold -> should be no results.\n    with pytest.raises(ValueError):\n        tree.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n    # add three more hashes => length of 4\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    new_mh.add_hash(mins.pop())\n    assert len(new_mh) == 4\n\n    result = tree.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n    # check with a too-high threshold -> should be no results.\n    print(\"len mh\", len(new_mh))\n    with pytest.raises(ValueError):\n        tree.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n\n\ndef test_sbt_gather_threshold_5():\n    # test gather() method above threshold\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    tree.insert(sig47)\n    tree.insert(sig63)\n    tree.insert(sig2)\n\n    # now construct query signatures with specific numbers of hashes --\n    # note, these signatures all have scaled=1000.\n\n    mins = list(sorted(sig2.minhash.hashes.keys()))\n    new_mh = sig2.minhash.copy_and_clear()\n\n    # add five hashes\n    for i in range(5):\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n        new_mh.add_hash(mins.pop())\n\n    # should get a result with no threshold (any match at all is returned)\n    result = tree.best_containment(SourmashSignature(new_mh))\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n    # now, check with a threshold_bp that should be meet-able.\n    tree.best_containment(SourmashSignature(new_mh), threshold_bp=5000)\n    assert result\n    containment, match_sig, name = result\n    assert containment == 1.0\n    assert match_sig == sig2\n    assert name is None\n\n\n@utils.in_tempdir\ndef test_gather_single_return(c):\n    # test gather() number of returns\n    sig2file = utils.get_test_data(\"2.fa.sig\")\n    sig47file = utils.get_test_data(\"47.fa.sig\")\n    sig63file = utils.get_test_data(\"63.fa.sig\")\n\n    sig2 = load_one_signature(sig2file, ksize=31)\n    sig47 = load_one_signature(sig47file, ksize=31)\n    sig63 = load_one_signature(sig63file, ksize=31)\n\n    # construct SBT Database\n    factory = GraphFactory(31, 1e5, 4)\n    tree = SBT(factory, d=2)\n\n    tree.insert(sig2)\n    tree.insert(sig47)\n    tree.insert(sig63)\n\n    # now, run gather. how many results do we get, and are they in the\n    # right order?\n    result = tree.best_containment(sig63)\n    print(result)\n    assert result\n    assert result.score == 1.0\n\n\ndef test_sbt_jaccard_ordering(runtmp):\n    # this tests a tricky situation where for three sketches A, B, C,\n    # |A intersect B| is greater than |A intersect C|\n    # _but_\n    # |A jaccard B| is less than |A intersect B|\n    a = sourmash.MinHash(ksize=31, n=0, scaled=2)\n    b = a.copy_and_clear()\n    c = a.copy_and_clear()\n\n    a.add_many([1, 2, 3, 4])\n    b.add_many([1, 2, 3] + list(range(10, 30)))\n    c.add_many([1, 5])\n\n    def _intersect(x, y):\n        return x.intersection_and_union_size(y)[0]\n\n    print(\"a intersect b:\", _intersect(a, b))\n    print(\"a intersect c:\", _intersect(a, c))\n    print(\"a jaccard b:\", a.jaccard(b))\n    print(\"a jaccard c:\", a.jaccard(c))\n    assert _intersect(a, b) > _intersect(a, c)\n    assert a.jaccard(b) < a.jaccard(c)\n\n    # thresholds to use:\n    assert a.jaccard(b) < 0.15\n    assert a.jaccard(c) > 0.15\n\n    # now - make signatures, try out :)\n    ss_a = sourmash.SourmashSignature(a, name=\"A\")\n    ss_b = sourmash.SourmashSignature(b, name=\"B\")\n    ss_c = sourmash.SourmashSignature(c, name=\"C\")\n\n    factory = GraphFactory(31, 1e5, 4)\n    db = SBT(factory, d=2)\n    db.insert(ss_a)\n    db.insert(ss_b)\n    db.insert(ss_c)\n\n    sr = db.search(ss_a, threshold=0.15)\n    print(sr)\n    assert len(sr) == 2\n    assert sr[0].signature == ss_a\n    assert sr[0].score == 1.0\n    assert sr[1].signature == ss_c\n    assert sr[1].score == 0.2\n\n\ndef test_sbt_protein_command_index(runtmp):\n    c = runtmp\n\n    # test command-line creation of SBT database with protein sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = c.output(\"protein.sbt.zip\")\n\n    c.run_sourmash(\n        \"index\", db_out, sigfile1, sigfile2, \"--scaled\", \"100\", \"-k\", \"19\", \"--protein\"\n    )\n\n    # check to make sure .sbt.protein directory doesn't get created\n    assert not os.path.exists(c.output(\".sbt.protein\"))\n\n    db2 = load_sbt_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2._location\n    assert result.location == db_out\n\n\n@utils.in_tempdir\ndef test_sbt_protein_search_no_threshold(c):\n    # test the '.search' method on SBTs w/no threshold\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = c.output(\"protein.sbt.zip\")\n\n    c.run_sourmash(\n        \"index\", db_out, sigfile1, sigfile2, \"--scaled\", \"100\", \"-k\", \"19\", \"--protein\"\n    )\n\n    db2 = load_sbt_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n\n    # and search, gather\n    with pytest.raises(TypeError) as exc:\n        db2.search(sig1)\n    assert \"'search' requires 'threshold'\" in str(exc)\n\n\n@utils.in_thisdir\ndef test_sbt_protein_command_search(c):\n    # test command-line search/gather of SBT database with protein sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/protein.sbt.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out)\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\n@utils.in_tempdir\ndef test_sbt_hp_command_index(c):\n    # test command-line creation of SBT database with hp sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/hp/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = c.output(\"hp.sbt.zip\")\n\n    c.run_sourmash(\n        \"index\", db_out, sigfile1, sigfile2, \"--scaled\", \"100\", \"-k\", \"19\", \"--hp\"\n    )\n\n    db2 = load_sbt_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert results\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2._location\n    assert result.location == db_out\n\n\n@utils.in_thisdir\ndef test_sbt_hp_command_search(c):\n    # test command-line search/gather of SBT database with hp sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/hp/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/hp.sbt.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\n@utils.in_tempdir\ndef test_sbt_dayhoff_command_index(c):\n    # test command-line creation of SBT database with dayhoff sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    sigfile2 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    db_out = c.output(\"dayhoff.sbt.zip\")\n\n    c.run_sourmash(\n        \"index\", db_out, sigfile1, sigfile2, \"--scaled\", \"100\", \"-k\", \"19\", \"--dayhoff\"\n    )\n\n    db2 = load_sbt_index(db_out)\n\n    sig1 = load_one_signature(sigfile1)\n    sig2 = load_one_signature(sigfile2)\n\n    # check reconstruction --\n    mh_list = [x.minhash for x in db2.signatures()]\n    assert len(mh_list) == 2\n    assert sig1.minhash in mh_list\n    assert sig2.minhash in mh_list\n\n    # and search, gather\n    results = db2.search(\n        sig1,\n        threshold=0.0,\n        ignore_abundance=True,\n        do_containment=False,\n        best_only=False,\n    )\n    assert len(results) == 2\n\n    result = db2.best_containment(sig2)\n    assert result.score == 1.0\n    assert result.location == db2._location\n    assert result.location == db_out\n\n\n@utils.in_thisdir\ndef test_sbt_dayhoff_command_search(c):\n    # test command-line search/gather of SBT database with dayhoff sigs\n    sigfile1 = utils.get_test_data(\n        \"prot/dayhoff/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    db_out = utils.get_test_data(\"prot/dayhoff.sbt.zip\")\n\n    c.run_sourmash(\"search\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"2 matches\" in c.last_result.out\n\n    c.run_sourmash(\"gather\", sigfile1, db_out, \"--threshold\", \"0.0\")\n    assert \"found 1 matches total\" in c.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in c.last_result.out\n\n\ndef test_sbt_node_cache():\n    tree = SBT.load(\n        utils.get_test_data(\"v6.sbt.json\"), leaf_loader=SigLeaf.load, cache_size=1\n    )\n\n    testdata1 = utils.get_test_data(utils.SIG_FILES[0])\n    to_search = load_one_signature(testdata1)\n\n    # note: earlier versions of this test did containment on\n    # the num MinHash in `to_search`, which doesn't work properly.\n    # (See test_sbt_no_containment_on_num for test). So, to\n    # fix the test for the new search API, we had to adjust\n    # the threshold.\n    search_obj = make_jaccard_search_query(threshold=0.05)\n    results = list(tree.find(search_obj, to_search))\n    assert len(results) == 4\n\n    assert tree._nodescache.currsize == 1\n    assert tree._nodescache.currsize == 1\n\n\ndef test_sbt_no_containment_on_num():\n    tree = SBT.load(\n        utils.get_test_data(\"v6.sbt.json\"), leaf_loader=SigLeaf.load, cache_size=1\n    )\n\n    testdata1 = utils.get_test_data(utils.SIG_FILES[0])\n    to_search = load_one_signature(testdata1)\n\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0.05)\n    with pytest.raises(TypeError) as exc:\n        list(tree.find(search_obj, to_search))\n\n    assert \"this search requires a scaled signature\" in str(exc)\n\n\ndef test_build_sbt_zip_with_dups(runtmp):\n    dups_data = utils.get_test_data(\"duplicate-sigs\")\n\n    all_sigs = set(sourmash.load_file_as_signatures(dups_data))\n    assert len(all_sigs) == 4\n\n    runtmp.run_sourmash(\"index\", \"dups.sbt.zip\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.zip\")\n\n    sbt_sigs = set(sourmash.load_file_as_signatures(outfile))\n    assert len(sbt_sigs) == 4\n\n    assert all_sigs == sbt_sigs\n\n\ndef test_build_sbt_zip_with_dups_exists(runtmp):\n    dups_data = utils.get_test_data(\"duplicate-sigs\")\n\n    all_sigs = set(sourmash.load_file_as_signatures(dups_data))\n    assert len(all_sigs) == 4\n\n    runtmp.run_sourmash(\"index\", \"dups.sbt.zip\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.zip\")\n\n    # run again, to see what happens :)\n    runtmp.run_sourmash(\"index\", \"dups.sbt.zip\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.zip\")\n\n    sbt_sigs = set(sourmash.load_file_as_signatures(outfile))\n    assert len(sbt_sigs) == 4\n\n    assert all_sigs == sbt_sigs\n\n\ndef test_build_sbt_json_with_dups(runtmp):\n    dups_data = utils.get_test_data(\"duplicate-sigs\")\n\n    all_sigs = set(sourmash.load_file_as_signatures(dups_data))\n    assert len(all_sigs) == 4\n\n    runtmp.run_sourmash(\"index\", \"dups.sbt.json\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.json\")\n\n    sbt_sigs = set(sourmash.load_file_as_signatures(outfile))\n    assert len(sbt_sigs) == 4\n\n    assert all_sigs == sbt_sigs\n\n\ndef test_build_sbt_json_with_dups_exists(runtmp):\n    dups_data = utils.get_test_data(\"duplicate-sigs\")\n\n    all_sigs = set(sourmash.load_file_as_signatures(dups_data))\n    assert len(all_sigs) == 4\n\n    runtmp.run_sourmash(\"index\", \"dups.sbt.json\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.json\")\n\n    # run again, see what happens!\n    runtmp.run_sourmash(\"index\", \"dups.sbt.json\", dups_data)\n    outfile = runtmp.output(\"dups.sbt.json\")\n\n    sbt_sigs = set(sourmash.load_file_as_signatures(outfile))\n    assert len(sbt_sigs) == 4\n\n    assert all_sigs == sbt_sigs\n\n\ndef test_load_fail_on_file_not_dir(runtmp):\n    # make sure the load function raises a ValueError for {filename}/sbt,\n    # rather than a NotADirectoryError\n\n    filename = runtmp.output(\"foo\")\n    with open(filename, \"w\") as fp:\n        fp.write(\"something\")\n\n    with pytest.raises(ValueError):\n        SBT.load(runtmp.output(\"foo/bar.sbt.json\"))\n"
  },
  {
    "path": "tests/test_search.py",
    "content": "\"Tests for search.py code.\"\n\nimport pytest\nimport numpy as np\nimport sourmash_tst_utils as utils\n\nfrom sourmash import search, SourmashSignature, MinHash\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.search import (\n    make_jaccard_search_query,\n    make_containment_query,\n    SearchResult,\n    PrefetchResult,\n    GatherResult,\n)\nfrom sourmash.index import LinearIndex\n\n\ndef test_make_jaccard_search_query():\n    search_obj = make_jaccard_search_query(threshold=0)\n\n    assert search_obj.score_fn == search_obj.score_jaccard\n    assert not search_obj.require_scaled\n    assert search_obj.threshold == 0\n\n\ndef test_make_jaccard_search_query_cont():\n    search_obj = make_jaccard_search_query(do_containment=True, threshold=0)\n\n    assert search_obj.score_fn == search_obj.score_containment\n    assert search_obj.require_scaled\n    assert search_obj.threshold == 0\n\n\ndef test_make_jaccard_search_query_max_cont():\n    search_obj = make_jaccard_search_query(do_max_containment=True, threshold=0)\n\n    assert search_obj.score_fn == search_obj.score_max_containment\n    assert search_obj.require_scaled\n    assert search_obj.threshold == 0\n\n\ndef test_make_jaccard_search_query_best_only():\n    search_obj = make_jaccard_search_query(best_only=True)\n\n    assert search_obj.score_fn == search_obj.score_jaccard\n    assert not search_obj.require_scaled\n    assert type(search_obj) is search.JaccardSearchBestOnly\n\n\ndef test_make_jaccard_search_query_no_threshold_none():\n    search_obj = make_jaccard_search_query(threshold=None)\n\n    assert search_obj.score_fn == search_obj.score_jaccard\n    assert not search_obj.require_scaled\n    assert search_obj.threshold == 0\n\n\ndef test_make_jaccard_search_query_cont_and_max_cont():\n    with pytest.raises(TypeError) as exc:\n        make_jaccard_search_query(do_containment=True, do_max_containment=True)\n\n    assert (\n        str(exc.value)\n        == \"'do_containment' and 'do_max_containment' cannot both be True\"\n    )\n\n\ndef test_cont_requires_scaled():\n    search_obj = make_jaccard_search_query(do_containment=True)\n    assert search_obj.require_scaled\n\n    mh = MinHash(n=500, ksize=31)\n    with pytest.raises(TypeError) as exc:\n        search_obj.check_is_compatible(SourmashSignature(mh))\n    assert str(exc.value) == \"this search requires a scaled signature\"\n\n\ndef test_search_requires_flat():\n    search_obj = make_jaccard_search_query()\n\n    mh = MinHash(n=500, ksize=31, track_abundance=True)\n    with pytest.raises(TypeError) as exc:\n        search_obj.check_is_compatible(SourmashSignature(mh))\n    assert str(exc.value) == \"this search cannot be done with an abund signature\"\n\n\ndef test_score_jaccard_similarity():\n    search_obj = make_jaccard_search_query()\n\n    assert search_obj.score_fn(None, 100, None, 200) == 0.5\n\n\ndef test_score_jaccard_containment():\n    search_obj = make_jaccard_search_query(do_containment=True)\n\n    assert search_obj.score_fn(100, 50, None, 0) == 0.5\n\n\ndef test_score_jaccard_containment_zero_query_size():\n    search_obj = make_jaccard_search_query(do_containment=True)\n\n    assert search_obj.score_fn(0, 100, None, None) == 0\n\n\ndef test_score_jaccard_max_containment_1():\n    search_obj = make_jaccard_search_query(do_max_containment=True)\n\n    assert search_obj.score_fn(150, 75, 100, None) == 0.75\n\n\ndef test_score_jaccard_max_containment_2():\n    search_obj = make_jaccard_search_query(do_max_containment=True)\n\n    assert search_obj.score_fn(100, 75, 150, None) == 0.75\n\n\ndef test_score_jaccard_max_containment_zero_query_size():\n    search_obj = make_jaccard_search_query(do_containment=True)\n\n    assert search_obj.score_fn(0, 100, None, None) == 0\n\n\ndef test_collect():\n    search_obj = make_jaccard_search_query(threshold=0)\n    search_obj.collect(1.0, None)\n    assert search_obj.threshold == 0\n\n\ndef test_collect_best_only():\n    search_obj = make_jaccard_search_query(threshold=0, best_only=True)\n    search_obj.collect(1.0, None)\n    assert search_obj.threshold == 1.0\n\n\ndef test_make_containment_query():\n    # test basic make_containment_query call\n    mh = MinHash(n=0, ksize=31, scaled=1000)\n\n    for i in range(100):\n        mh.add_hash(i)\n\n    search_obj = make_containment_query(mh, 5e4)\n\n    assert search_obj.score_fn == search_obj.score_containment\n    assert search_obj.require_scaled\n    assert search_obj.threshold == 0.5\n\n\ndef test_make_containment_query_no_threshold():\n    # test basic make_containment_query call\n    mh = MinHash(n=0, ksize=31, scaled=1000)\n\n    for i in range(100):\n        mh.add_hash(i)\n\n    search_obj = make_containment_query(mh, None)\n\n    assert search_obj.score_fn == search_obj.score_containment\n    assert search_obj.require_scaled\n    assert search_obj.threshold == 0\n\n\ndef test_make_containment_query_num_minhash():\n    # will fail on non-scaled minhash\n    mh = MinHash(n=500, ksize=31)\n\n    for i in range(100):\n        mh.add_hash(i)\n\n    with pytest.raises(TypeError) as exc:\n        make_containment_query(mh, 5e4)\n\n    assert str(exc.value) == \"query signature must be calculated with scaled\"\n\n\ndef test_make_containment_query_empty_minhash():\n    # will fail on non-scaled minhash\n    mh = MinHash(n=0, ksize=31, scaled=1000)\n\n    for i in range(100):\n        mh.add_hash(i)\n\n    with pytest.raises(TypeError) as exc:\n        make_containment_query(mh, -1)\n\n    assert str(exc.value) == \"threshold_bp must be non-negative\"\n\n\ndef test_make_containment_query_high_threshold():\n    # will fail on non-scaled minhash\n    mh = MinHash(n=0, ksize=31, scaled=1000)\n\n    for i in range(100):\n        mh.add_hash(i)\n\n    # effective threshold > 1; raise ValueError\n    with pytest.raises(ValueError):\n        make_containment_query(mh, 200000)\n\n\nclass FakeIndex(LinearIndex):\n    _signatures = []\n    filename = \"something_or_other\"\n\n    def __init__(self, validator_fn):\n        self.validator = validator_fn\n\n    def find(self, search_fn, query, *args, **kwargs):\n        if self.validator:\n            self.validator(search_fn, query, args, kwargs)\n        else:\n            assert 0, \"what are we even doing here?\"\n        return []\n\n\ndef test_index_search_passthru():\n    # check that kwargs are passed through from 'search' to 'find'\n    query = None\n\n    def validate_kwarg_passthru(search_fn, query, args, kwargs):\n        assert \"this_kw_arg\" in kwargs\n        assert kwargs[\"this_kw_arg\"] == 5\n\n    idx = FakeIndex(validate_kwarg_passthru)\n\n    idx.search(query, threshold=0.0, this_kw_arg=5)\n\n\ndef test_index_containment_passthru():\n    # check that kwargs are passed through from 'search' to 'find'\n    query = None\n\n    def validate_kwarg_passthru(search_fn, query, args, kwargs):\n        assert \"this_kw_arg\" in kwargs\n        assert kwargs[\"this_kw_arg\"] == 5\n\n    idx = FakeIndex(validate_kwarg_passthru)\n\n    idx.search(query, threshold=0.0, this_kw_arg=5)\n\n\ndef test_search_with_abund_query():\n    mh = MinHash(n=0, ksize=31, scaled=1, track_abundance=True)\n    query = SourmashSignature(mh)\n\n    with pytest.raises(TypeError):\n        search.search_databases_with_abund_query(\n            query, [], threshold=0, do_containment=True\n        )\n\n    with pytest.raises(TypeError):\n        search.search_databases_with_abund_query(\n            query, [], threshold=0, do_max_containment=True\n        )\n\n\ndef test_scaledSearchResult():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    ss4763 = ss4763.to_mutable()\n    ss4763.filename = ss4763_file\n\n    scaled = ss47.minhash.scaled\n\n    res = SearchResult(\n        ss47, ss4763, cmp_scaled=scaled, similarity=ss47.contained_by(ss4763)\n    )\n\n    assert res.query_name == ss47.name\n    assert res.match_name == ss4763.name\n    assert res.query_scaled == ss47.minhash.scaled == 1000\n    assert res.match_scaled == ss4763.minhash.scaled == 1000\n    assert res.cmp_scaled == 1000\n    assert res.query_abundance == ss47.minhash.track_abundance\n    assert res.match_abundance == ss4763.minhash.track_abundance\n    #    assert res.query_bp == len(ss47.minhash) * scaled\n    #    assert res.match_bp == len(ss4763.minhash) * scaled\n    assert res.ksize == 31\n    assert res.moltype == \"DNA\"\n    assert res.query_filename == \"47.fa\"\n    assert res.match_filename == ss4763_file\n    assert res.query_md5 == ss47.md5sum()\n    assert res.match_md5 == ss4763.md5sum()\n    #   assert res.query_n_hashes == len(ss47.minhash)\n    #   assert res.match_n_hashes == len(ss4763.minhash)\n    assert res.md5 == ss4763.md5sum()\n    assert res.name == ss4763.name\n    assert res.filename == ss4763.filename\n    queryc_ani = ss47.containment_ani(ss4763)\n    matchc_ani = ss4763.containment_ani(ss47)\n    # check that we _can_ get avg_containment_ani\n    assert res.cmp.avg_containment_ani == np.mean([queryc_ani.ani, matchc_ani.ani])\n\n\ndef test_numSearchResult():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"num/47.fa.sig\")\n    ss63_file = utils.get_test_data(\"num/63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss63 = load_one_signature(ss63_file, ksize=31, select_moltype=\"DNA\")\n    ss63 = ss63.to_mutable()\n    ss63.filename = ss63_file\n\n    assert ss47.minhash.num and ss63.minhash.num\n\n    res = SearchResult(ss47, ss63, similarity=ss47.jaccard(ss63))\n    print(res.cmp_num)\n    assert res.mh1.num\n    assert res.cmp.cmp_num == 500\n    assert res.query_name == ss47.name\n    assert res.match_name == ss63.name\n    assert res.query_num == ss47.minhash.num == 500\n    assert res.match_num == ss63.minhash.num == 500\n    assert res.query_abundance == ss47.minhash.track_abundance\n    assert res.match_abundance == ss63.minhash.track_abundance\n    assert res.ksize == 31\n    assert res.moltype == \"DNA\"\n    assert res.query_filename == \"47.fa\"\n    assert res.match_filename == ss63_file\n    assert res.query_md5 == ss47.md5sum()\n    assert res.match_md5 == ss63.md5sum()\n    assert res.md5 == ss63.md5sum()\n    assert res.name == ss63.name\n    assert res.filename == ss63.filename\n\n    # check that we can't get ani\n    with pytest.raises(TypeError) as exc:\n        res.estimate_search_ani()\n    assert (\"ANI can only be estimated from scaled signatures.\") in str(exc)\n\n    # get result as dictionary (of just items to write)\n    resD = res.resultdict\n    assert resD[\"filename\"] == res.filename\n    assert resD[\"name\"] == res.name\n    assert resD[\"similarity\"] == res.similarity\n\n\ndef test_SearchResult_incompatible_sigs():\n    ss47_file = utils.get_test_data(\"num/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    with pytest.raises(TypeError) as exc:\n        SearchResult(ss47, ss4763, similarity=10)\n    print(str(exc))\n    assert \"Error: Both sketches must be 'num' or 'scaled'.\" in str(exc)\n\n\ndef test_SearchResult_notsigs():\n    ss47_file = utils.get_test_data(\"num/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n\n    with pytest.raises(AttributeError) as exc:\n        SearchResult(ss47_file, ss4763_file, similarity=10)\n    print(str(exc))\n    assert \"'str' object has no attribute 'minhash'\" in str(exc)\n\n\ndef test_SearchResult_no_similarity():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    with pytest.raises(ValueError) as exc:\n        SearchResult(ss47, ss4763)\n    print(str(exc))\n    assert \"Error: Must provide 'similarity' for SearchResult.\" in str(exc)\n\n\ndef test_PrefetchResult():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    ss4763 = ss4763.to_mutable()\n    ss4763.filename = ss4763_file\n\n    scaled = ss47.minhash.scaled\n\n    intersect_mh = ss47.minhash.intersection(ss4763.minhash)\n    intersect_bp = len(intersect_mh) * scaled\n    jaccard = ss4763.jaccard(ss47)\n    max_containment = ss4763.max_containment(ss47)\n    f_match_query = ss47.contained_by(ss4763)\n    f_query_match = ss4763.contained_by(ss47)\n    queryc_ani = ss47.containment_ani(ss4763)\n    matchc_ani = ss4763.containment_ani(ss47)\n\n    res = PrefetchResult(ss47, ss4763, cmp_scaled=scaled)\n\n    assert res.query_name == ss47.name\n    assert res.match_name == ss4763.name\n    assert res.query_scaled == ss47.minhash.scaled == 1000\n    assert res.match_scaled == ss4763.minhash.scaled == 1000\n    assert res.cmp_scaled == 1000\n    assert res.query_abundance == ss47.minhash.track_abundance\n    assert res.match_abundance == ss4763.minhash.track_abundance\n    assert res.query_bp == len(ss47.minhash) * scaled\n    assert res.match_bp == len(ss4763.minhash) * scaled\n    assert res.ksize == 31\n    assert res.moltype == \"DNA\"\n    assert res.query_filename == \"47.fa\"\n    assert res.match_filename == ss4763_file\n    assert res.query_md5 == ss47.md5sum()\n    assert res.match_md5 == ss4763.md5sum()\n    assert res.query_n_hashes == len(ss47.minhash)\n    assert res.match_n_hashes == len(ss4763.minhash)\n    assert res.md5 == ss4763.md5sum()\n    assert res.name == ss4763.name\n    assert res.intersect_bp == intersect_bp\n    assert res.jaccard == jaccard\n    assert res.max_containment == max_containment\n    assert res.f_query_match == f_query_match\n    assert res.f_match_query == f_match_query\n\n    # check ani\n    assert res.query_containment_ani == queryc_ani.ani\n    print(queryc_ani.ani)\n    print(matchc_ani.ani)\n    assert res.match_containment_ani == matchc_ani.ani\n    assert res.max_containment_ani == max(queryc_ani.ani, matchc_ani.ani)\n    assert res.average_containment_ani == np.mean([queryc_ani.ani, matchc_ani.ani])\n    assert res.potential_false_negative == False\n\n\ndef test_PrefetchResult_incompatible_sigs():\n    ss47_file = utils.get_test_data(\"num/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    with pytest.raises(TypeError) as exc:\n        PrefetchResult(ss47, ss4763)\n    print(str(exc))\n    assert (\n        \"Error: prefetch and gather results must be between scaled signatures.\"\n        in str(exc)\n    )\n\n\ndef test_GatherResult():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"track_abund/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    ss4763 = ss4763.to_mutable()\n    ss4763.filename = ss4763_file\n\n    scaled = ss47.minhash.scaled\n\n    intersect_mh = ss47.minhash.flatten().intersection(ss4763.minhash)\n    remaining_mh = ss4763.minhash.to_mutable()\n    remaining_mh.remove_many(intersect_mh)\n\n    intersect_bp = len(intersect_mh) * scaled\n    max_containment = ss4763.max_containment(ss47)\n    ss47.contained_by(ss4763)\n    orig_query_abunds = ss47.minhash.hashes\n    queryc_ani = ss47.containment_ani(ss4763)\n    matchc_ani = ss4763.containment_ani(ss47)\n\n    # make some fake vals to check\n    gather_result_rank = 1\n    sum_abunds = 1000\n\n    res = GatherResult(\n        ss47,\n        ss4763,\n        cmp_scaled=scaled,\n        gather_querymh=remaining_mh,\n        gather_result_rank=gather_result_rank,\n        total_weighted_hashes=sum_abunds,\n        orig_query_len=len(ss47.minhash),\n        orig_query_abunds=orig_query_abunds,\n    )\n\n    assert res.query_name == ss47.name\n    assert res.match_name == ss4763.name\n    assert res.query_scaled == ss47.minhash.scaled == 1000\n    assert res.match_scaled == ss4763.minhash.scaled == 1000\n    assert res.cmp_scaled == 1000\n    assert res.query_abundance == ss47.minhash.track_abundance\n    assert res.match_abundance == ss4763.minhash.track_abundance\n    assert res.query_bp == len(ss47.minhash) * scaled\n    assert res.match_bp == len(ss4763.minhash) * scaled\n    assert res.ksize == 31\n    assert res.moltype == \"DNA\"\n    assert res.query_filename == \"podar-ref/47.fa\"\n    assert res.match_filename == ss4763_file\n    assert res.query_md5 == ss47.md5sum()\n    assert res.match_md5 == ss4763.md5sum()\n    assert res.query_n_hashes == len(ss47.minhash)\n    assert res.match_n_hashes == len(ss4763.minhash)\n    assert res.query_bp == ss47.minhash.unique_dataset_hashes\n    assert res.match_bp == ss4763.minhash.unique_dataset_hashes\n    assert res.md5 == ss4763.md5sum()\n    assert res.name == ss4763.name\n    assert res.match_filename == ss4763.filename\n    assert res.intersect_bp == intersect_bp\n    assert res.max_containment == max_containment\n\n    # check that we can write prefetch result directly from gather\n    pf = PrefetchResult(ss47, ss4763, cmp_scaled=scaled)\n    assert pf.prefetchresultdict == res.prefetchresultdict\n\n    # check ani\n    assert res.query_containment_ani == queryc_ani.ani\n    print(queryc_ani.ani)\n    print(matchc_ani.ani)\n    assert res.match_containment_ani == matchc_ani.ani\n    assert res.max_containment_ani == max(queryc_ani.ani, matchc_ani.ani)\n    assert res.average_containment_ani == np.mean([queryc_ani.ani, matchc_ani.ani])\n    assert res.potential_false_negative == False\n\n    # get write dict version of GatherResult\n    resD = res.gatherresultdict\n    assert resD[\"intersect_bp\"] == res.intersect_bp\n\n\ndef test_GatherResult_ci():\n    # check that values get stored/calculated correctly\n    ss47_file = utils.get_test_data(\"track_abund/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n\n    ss4763 = ss4763.to_mutable()\n    ss4763.filename = ss4763_file\n\n    scaled = ss47.minhash.scaled\n\n    intersect_mh = ss47.minhash.flatten().intersection(ss4763.minhash)\n    remaining_mh = ss4763.minhash.to_mutable()\n    remaining_mh.remove_many(intersect_mh)\n\n    orig_query_abunds = ss47.minhash.hashes\n    queryc_ani = ss47.containment_ani(ss4763, estimate_ci=True)\n    matchc_ani = ss4763.containment_ani(ss47, estimate_ci=True)\n\n    # make some fake vals to check\n    gather_result_rank = 1\n    sum_abunds = 1000\n\n    res = GatherResult(\n        ss47,\n        ss4763,\n        cmp_scaled=scaled,\n        gather_querymh=remaining_mh,\n        gather_result_rank=gather_result_rank,\n        total_weighted_hashes=sum_abunds,\n        orig_query_len=len(ss47.minhash),\n        orig_query_abunds=orig_query_abunds,\n        estimate_ani_ci=True,\n    )\n\n    # check that we can write prefetch result directly from gather\n    pf = PrefetchResult(ss47, ss4763, cmp_scaled=scaled, estimate_ani_ci=True)\n    assert pf.prefetchresultdict == res.prefetchresultdict\n\n    # check ani\n    assert res.query_containment_ani == queryc_ani.ani\n    print(queryc_ani.ani)\n    print(matchc_ani.ani)\n    assert res.match_containment_ani == matchc_ani.ani\n    assert res.match_containment_ani_low == matchc_ani.ani_low\n    assert res.match_containment_ani_high == matchc_ani.ani_high\n    assert res.max_containment_ani == max(queryc_ani.ani, matchc_ani.ani)\n    assert res.average_containment_ani == np.mean([queryc_ani.ani, matchc_ani.ani])\n    assert res.potential_false_negative == False\n\n    # get write dict version of GatherResult\n    resD = res.gatherresultdict\n    assert resD[\"intersect_bp\"] == res.intersect_bp\n    assert resD[\"match_containment_ani_low\"] == res.match_containment_ani_low\n\n\ndef test_GatherResult_incompatible_sigs():\n    ss47_file = utils.get_test_data(\"num/47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = ss47.minhash.hashes\n\n    with pytest.raises(TypeError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: prefetch and gather results must be between scaled signatures.\"\n        in str(exc)\n    )\n\n\ndef test_GatherResult_incomplete_input_cmpscaled():\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = ss47.minhash.hashes\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=None,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide comparison scaled value ('cmp_scaled') for GatherResult\"\n        in str(exc)\n    )\n\n\ndef test_GatherResult_incomplete_input_gathermh():\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = ss47.minhash.hashes\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=None,\n            gather_result_rank=1,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide current gather sketch (remaining hashes) for GatherResult\"\n        in str(exc)\n    )\n\n\ndef test_GatherResult_incomplete_input_gather_result_rank():\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = ss47.minhash.hashes\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=None,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert \"Error: must provide 'gather_result_rank' to GatherResult\" in str(exc)\n\n\ndef test_GatherResult_incomplete_input_total_weighted_hashes():\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = ss47.minhash.hashes\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=None,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide sum of all abundances ('total_weighted_hashes') to GatherResult\"\n        in str(exc)\n    )\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=0,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide sum of all abundances ('total_weighted_hashes') to GatherResult\"\n        in str(exc)\n    )\n\n\ndef test_GatherResult_incomplete_input_orig_query_abunds():\n    ss47_file = utils.get_test_data(\"47.fa.sig\")\n    ss4763_file = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(ss47_file, ksize=31, select_moltype=\"DNA\")\n    ss4763 = load_one_signature(ss4763_file, ksize=31, select_moltype=\"DNA\")\n    orig_query_abunds = None\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide original query abundances ('orig_query_abunds') to GatherResult\"\n        in str(exc)\n    )\n\n    orig_query_abunds = {}\n\n    with pytest.raises(ValueError) as exc:\n        GatherResult(\n            ss47,\n            ss4763,\n            cmp_scaled=1000,\n            gather_querymh=ss47.minhash,\n            gather_result_rank=1,\n            total_weighted_hashes=1,\n            orig_query_len=len(ss47.minhash),\n            orig_query_abunds=orig_query_abunds,\n        )\n    print(str(exc))\n    assert (\n        \"Error: must provide original query abundances ('orig_query_abunds') to GatherResult\"\n        in str(exc)\n    )\n"
  },
  {
    "path": "tests/test_signature.py",
    "content": "import os\n\nimport pytest\n\nimport sourmash\nfrom sourmash.signature import (\n    SourmashSignature,\n    FrozenSourmashSignature,\n)\nfrom sourmash.signature import (\n    save_signatures_to_json,\n    load_signatures_from_json,\n    load_one_signature_from_json,\n)\nimport sourmash_tst_utils as utils\nfrom sourmash.minhash import MinHash, FrozenMinHash\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n\ndef test_minhash_copy(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    SourmashSignature(e, name=\"foo\")\n    f = e.copy()\n    assert e == f\n\n\ndef test_sig_copy(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\")\n    sig2 = sig1.copy()\n    assert sig1 == sig2\n\n\ndef test_sig_copy_frozen(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\")\n    sig2 = sig1.copy()\n    assert sig1 == sig2\n    with pytest.raises(TypeError) as e:\n        sig2.minhash.add_hash(5)\n    assert \"FrozenMinHash does not support modification\" in str(e.value)\n\n\ndef test_sig_copy_frozen_mutable(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\")\n    sig1.minhash = sig1.minhash.to_mutable()\n    sig2 = sig1.copy()\n    assert sig1 == sig2\n    with pytest.raises(TypeError) as e:\n        sig2.minhash.add_hash(5)\n    assert \"FrozenMinHash does not support modification\" in str(e.value)\n\n\ndef test_compare(track_abundance):\n    # same content, same name -> equal\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    SourmashSignature(e, name=\"foo\")\n\n    f = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    f.add_kmer(\"AT\" * 10)\n    SourmashSignature(f, name=\"foo\")\n\n    assert e == f\n\n\ndef test_compare_ne(track_abundance):\n    # same content, different names -> different\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\")\n\n    f = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    f.add_kmer(\"AT\" * 10)\n    sig2 = SourmashSignature(f, name=\"bar\")\n\n    assert sig1 != sig2\n\n\ndef test_compare_ne2(track_abundance):\n    # same content, different filename -> different\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\", filename=\"a\")\n\n    f = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    f.add_kmer(\"AT\" * 10)\n    sig2 = SourmashSignature(f, name=\"foo\", filename=\"b\")\n\n    assert sig1 != sig2\n    assert sig2 != sig1\n\n\ndef test_compare_ne2_reverse(track_abundance):\n    # same content, one has filename, other does not -> different\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig1 = SourmashSignature(e, name=\"foo\")\n\n    f = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    f.add_kmer(\"AT\" * 10)\n    sig2 = SourmashSignature(f, filename=\"b\")\n\n    assert sig2 != sig1\n    assert sig1 != sig2\n\n\ndef test_hashable(track_abundance):\n    # check: can we use signatures as keys in dictionaries and sets?\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n\n    sig = SourmashSignature(e)\n\n    x = set()\n    x.add(sig)\n\n\ndef test_str(track_abundance):\n    # signatures should be printable\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n\n    sig = SourmashSignature(e)\n\n    print(sig)\n    assert repr(sig) == \"SourmashSignature('', 59502a74)\"\n\n    sig._name = \"fizbar\"\n    assert repr(sig) == \"SourmashSignature('fizbar', 59502a74)\"\n\n\ndef test_roundtrip(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig = SourmashSignature(e)\n    s = save_signatures_to_json([sig])\n    siglist = list(load_signatures_from_json(s))\n    sig2 = siglist[0]\n\n    assert sig.similarity(sig2) == 1.0\n    assert sig2.similarity(sig) == 1.0\n    assert isinstance(sig, SourmashSignature)\n    assert not isinstance(sig, FrozenSourmashSignature)\n    assert isinstance(sig2, FrozenSourmashSignature)\n\n    assert isinstance(e, MinHash)\n    assert isinstance(sig.minhash, FrozenMinHash)\n    assert isinstance(sig2.minhash, FrozenMinHash)\n\n\ndef test_roundtrip_mutable_frozen(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig = SourmashSignature(e)\n    assert isinstance(sig.minhash, FrozenMinHash)\n    sig.minhash = sig.minhash.to_mutable()\n\n    sig2 = sig.to_frozen()\n    assert isinstance(sig2.minhash, FrozenMinHash)\n\n\ndef test_load_signature_ksize_nonint(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    sig = SourmashSignature(e)\n    s = save_signatures_to_json([sig])\n    siglist = list(load_signatures_from_json(s, ksize=\"20\"))\n    sig2 = siglist[0]\n\n    assert sig.similarity(sig2) == 1.0\n    assert sig2.similarity(sig) == 1.0\n\n\ndef test_roundtrip_empty(track_abundance):\n    # edge case, but: empty minhash? :)\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n\n    sig = SourmashSignature(e)\n    s = save_signatures_to_json([sig])\n    siglist = list(load_signatures_from_json(s))\n    sig2 = siglist[0]\n\n    assert sig.similarity(sig2) == 0\n    assert sig2.similarity(sig) == 0\n\n\ndef test_roundtrip_scaled(track_abundance):\n    e = MinHash(n=0, ksize=20, track_abundance=track_abundance, max_hash=2**61)\n    e.add_hash(5)\n    sig = SourmashSignature(e)\n    s = save_signatures_to_json([sig])\n    siglist = list(load_signatures_from_json(s))\n    sig2 = siglist[0]\n    e2 = sig2.minhash\n\n    assert e.scaled == e2.scaled\n\n    assert sig.similarity(sig2) == 1.0\n    assert sig2.similarity(sig) == 1.0\n\n\ndef test_roundtrip_seed(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance, seed=10)\n    e.add_hash(5)\n    sig = SourmashSignature(e)\n    s = save_signatures_to_json([sig])\n    siglist = list(load_signatures_from_json(s))\n    sig2 = siglist[0]\n    e2 = sig2.minhash\n\n    assert e.seed == e2.seed\n\n    assert sig.similarity(sig2) == 1.0\n    assert sig2.similarity(sig) == 1.0\n\n\ndef test_similarity_downsample(track_abundance):\n    e = MinHash(n=0, ksize=20, track_abundance=track_abundance, max_hash=2**63)\n    f = MinHash(n=0, ksize=20, track_abundance=track_abundance, max_hash=2**61)\n\n    e.add_hash(1)\n    e.add_hash(2**62)\n    assert len(e.hashes) == 2\n\n    f.add_hash(1)\n    f.add_hash(2**62)  # should be discarded due to max_hash\n    assert len(f.hashes) == 1\n\n    ee = SourmashSignature(e)\n    ff = SourmashSignature(f)\n\n    with pytest.raises(ValueError) as e:  # mismatch in max_hash\n        ee.similarity(ff)\n\n    assert \"mismatch in scaled; comparison fail\" in str(e.value)\n\n    x = ee.similarity(ff, downsample=True)\n    assert round(x, 1) == 1.0\n\n\ndef test_add_sequence_bad_dna(track_abundance):\n    # test add_sequence behavior on bad DNA\n    mh = MinHash(n=1, ksize=21)\n    sig = SourmashSignature(mh)\n\n    with pytest.raises(ValueError) as e:\n        sig.add_sequence(\"N\" * 21, force=False)\n\n    assert \"invalid DNA character in input k-mer: NNNNNNNNNNNNNNNNNNNNN\" in str(e.value)\n\n\ndef test_md5(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_hash(5)\n    sig = SourmashSignature(e)\n    assert sig.md5sum() == \"eae27d77ca20db309e056e3d2dcd7d69\", sig.md5sum()\n\n\ndef test_str_1(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig = SourmashSignature(e, name=\"foo\")\n    assert str(sig) == \"foo\"\n\n\ndef test_str_2(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig = SourmashSignature(e, filename=\"foo.txt\")\n    assert str(sig) == \"foo.txt\"\n\n\ndef test_str_3(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig = SourmashSignature(e, name=\"foo\", filename=\"foo.txt\")\n    assert str(sig) == \"foo\"\n\n\ndef test_name_4(track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig = SourmashSignature(e)\n    assert str(sig) == sig.md5sum()[:8]\n\n\ndef test_save_load_multisig(track_abundance):\n    e1 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig1 = SourmashSignature(e1)\n\n    e2 = MinHash(n=1, ksize=25, track_abundance=track_abundance)\n    sig2 = SourmashSignature(e2)\n\n    x = save_signatures_to_json([sig1, sig2])\n    y = list(load_signatures_from_json(x))\n\n    print(x)\n\n    assert len(y) == 2\n    assert sig1 in y  # order not guaranteed, note.\n    assert sig2 in y\n    assert sig1 != sig2\n\n\ndef test_load_one_fail_nosig(track_abundance):\n    x = save_signatures_to_json([])\n    print((x,))\n    with pytest.raises(ValueError):\n        load_one_signature_from_json(x)\n\n\ndef test_load_one_succeed(track_abundance):\n    e1 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig1 = SourmashSignature(e1)\n\n    x = save_signatures_to_json([sig1])\n\n    y = load_one_signature_from_json(x)\n    assert sig1 == y\n\n\ndef test_load_one_fail_multisig(track_abundance):\n    e1 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig1 = SourmashSignature(e1)\n\n    e2 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig2 = SourmashSignature(e2)\n\n    x = save_signatures_to_json([sig1, sig2])\n\n    with pytest.raises(ValueError):\n        load_one_signature_from_json(x)\n\n\ndef test_save_minified(track_abundance):\n    e1 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig1 = SourmashSignature(e1, name=\"foo\")\n\n    e2 = MinHash(n=1, ksize=25, track_abundance=track_abundance)\n    sig2 = SourmashSignature(e2, name=\"bar baz\")\n\n    x = save_signatures_to_json([sig1, sig2])\n    assert b\"\\n\" not in x\n    assert len(x.split(b\"\\n\")) == 1\n\n    y = list(load_signatures_from_json(x))\n    assert len(y) == 2\n    assert any(sig.name == \"foo\" for sig in y)\n    assert any(sig.name == \"bar baz\" for sig in y)\n\n\ndef test_load_minified(track_abundance):\n    sigfile = utils.get_test_data(\"genome-s10+s11.sig\")\n    sigs = load_signatures_from_json(sigfile)\n\n    minified = save_signatures_to_json(sigs)\n    with open(sigfile) as f:\n        orig_file = f.read()\n    assert len(minified) < len(orig_file)\n    assert b\"\\n\" not in minified\n\n\ndef test_load_compressed(track_abundance):\n    e1 = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    sig1 = SourmashSignature(e1)\n\n    x = save_signatures_to_json([sig1], compression=5)\n\n    y = load_one_signature_from_json(x)\n    assert sig1 == y\n\n    sigfile = utils.get_test_data(\"genome-s10+s11.sig.gz\")\n    load_signatures_from_json(sigfile)\n\n\ndef test_binary_fp(tmpdir, track_abundance):\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n\n    path = tmpdir.join(\"1.sig\")\n    with open(str(path), \"wb\") as fp:\n        sig = SourmashSignature(e)\n        save_signatures_to_json([sig], fp)\n\n\ndef test_load_signatures_from_json_no_file_do_raise(tmpdir):\n    path = tmpdir.join(\"dne.sig\")\n    siglist = load_signatures_from_json(path, do_raise=True)\n    with pytest.raises(Exception):\n        list(siglist)\n\n\ndef test_load_signatures_from_json_no_file_do_not_raise(tmpdir):\n    path = tmpdir.join(\"dne.sig\")\n    siglist = load_signatures_from_json(path)\n    siglist = list(siglist)\n    assert not siglist\n\n\ndef test_max_containment():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 5))\n\n    ss1 = SourmashSignature(mh1)\n    ss2 = SourmashSignature(mh2)\n\n    assert ss1.contained_by(ss2) == 1 / 4\n    assert ss2.contained_by(ss1) == 1 / 2\n    assert ss1.max_containment(ss2) == 1 / 2\n    assert ss2.max_containment(ss1) == 1 / 2\n\n\ndef test_max_containment_empty():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n\n    ss1 = SourmashSignature(mh1)\n    ss2 = SourmashSignature(mh2)\n\n    assert ss1.contained_by(ss2) == 0\n    assert ss2.contained_by(ss1) == 0\n    assert ss1.max_containment(ss2) == 0\n    assert ss2.max_containment(ss1) == 0\n\n\ndef test_max_containment_equal():\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=False)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=False)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh2.add_many((1, 2, 3, 4))\n\n    ss1 = SourmashSignature(mh1)\n    ss2 = SourmashSignature(mh2)\n\n    assert ss1.contained_by(ss2) == 1\n    assert ss2.contained_by(ss1) == 1\n    assert ss1.max_containment(ss2) == 1\n    assert ss2.max_containment(ss1) == 1\n\n\ndef test_containment_ANI():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2, ksize=31)\n\n    s1_cont_s2 = ss1.containment_ani(ss2, estimate_ci=True)\n    s2_cont_s1 = ss2.containment_ani(ss1, estimate_ci=True)\n    print(\"\\nss1 contained by ss2\", s1_cont_s2)\n    print(\"ss2 contained by ss1\", s2_cont_s1)\n\n    assert (round(s1_cont_s2.ani, 3), s1_cont_s2.ani_low, s1_cont_s2.ani_high) == (\n        1.0,\n        1.0,\n        1.0,\n    )\n    assert (\n        round(s2_cont_s1.ani, 3),\n        round(s2_cont_s1.ani_low, 3),\n        round(s2_cont_s1.ani_high, 3),\n    ) == (0.966, 0.965, 0.967)\n\n    s1_mc_s2 = ss1.max_containment_ani(ss2, estimate_ci=True)\n    s2_mc_s1 = ss2.max_containment_ani(ss1, estimate_ci=True)\n    print(\"mh1 max containment\", s1_mc_s2)\n    print(\"mh2 max containment\", s2_mc_s1)\n    s1_mc_s2.size_is_inaccurate = False\n    s2_mc_s1.size_is_inaccurate = False\n    assert s1_mc_s2 == s2_mc_s1\n    assert (\n        round(s1_mc_s2.ani, 3),\n        round(s1_mc_s2.ani_low, 3),\n        round(s1_mc_s2.ani_high, 3),\n    ) == (1.0, 1.0, 1.0)\n\n\ndef test_containment_ANI_precalc_containment():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2, ksize=31)\n    # precalc containments and assert same results\n    s1c = ss1.contained_by(ss2)\n    s2c = ss2.contained_by(ss1)\n    mc = max(s1c, s2c)\n\n    assert ss1.containment_ani(ss2, estimate_ci=True) == ss1.containment_ani(\n        ss2, containment=s1c, estimate_ci=True\n    )\n    assert ss2.containment_ani(ss1) == ss2.containment_ani(ss1, containment=s2c)\n    assert ss1.max_containment_ani(ss2) == ss2.max_containment_ani(ss1)\n    assert ss1.max_containment_ani(ss2) == ss1.max_containment_ani(\n        ss2, max_containment=mc\n    )\n    assert ss1.max_containment_ani(ss2) == ss2.max_containment_ani(\n        ss1, max_containment=mc\n    )\n\n\ndef test_avg_containment():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2, ksize=31)\n    # check average_containment_ani\n    ac_s1 = ss1.avg_containment(ss2)\n    ac_s2 = ss2.avg_containment(ss1)\n    assert (\n        ac_s1\n        == ac_s2\n        == (ss1.contained_by(ss2) + ss2.contained_by(ss1)) / 2\n        == 0.6619979467456603\n    )\n\n\ndef test_avg_containment_ani():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2, ksize=31)\n    # check average_containment_ani\n    ac_s1 = ss1.avg_containment_ani(ss2)\n    ac_s2 = ss2.avg_containment_ani(ss1)\n    assert (\n        ac_s1\n        == ac_s2\n        == (ss1.containment_ani(ss2).ani + ss2.containment_ani(ss1).ani) / 2\n    )\n\n\ndef test_containment_ANI_downsample():\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    f3 = utils.get_test_data(\"47+63.fa.sig\")\n    ss2 = sourmash.load_one_signature_from_json(f2, ksize=31)\n    ss3 = sourmash.load_one_signature_from_json(f3, ksize=31)\n    # check that downsampling works properly\n    print(ss2.minhash.scaled)\n\n    ss2 = ss2.to_mutable()\n    ss2.minhash = ss2.minhash.downsample(scaled=2000)\n    assert ss2.minhash.scaled != ss3.minhash.scaled\n    ds_s3c = ss2.containment_ani(ss3, downsample=True)\n    ds_s4c = ss3.containment_ani(ss2, downsample=True)\n    mc_w_ds_1 = ss2.max_containment_ani(ss3, downsample=True)\n    mc_w_ds_2 = ss3.max_containment_ani(ss2, downsample=True)\n\n    with pytest.raises(ValueError) as e:\n        ss2.containment_ani(ss3)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    with pytest.raises(ValueError) as e:\n        ss2.max_containment_ani(ss3)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    ss3 = ss3.to_mutable()\n    ss3.minhash = ss3.minhash.downsample(scaled=2000)\n    assert ss2.minhash.scaled == ss3.minhash.scaled\n    ds_s3c_manual = ss2.containment_ani(ss3)\n    ds_s4c_manual = ss3.containment_ani(ss2)\n    ds_mc_manual = ss2.max_containment_ani(ss3)\n    assert ds_s3c == ds_s3c_manual\n    assert ds_s4c == ds_s4c_manual\n    assert mc_w_ds_1 == mc_w_ds_2 == ds_mc_manual\n\n\ndef test_jaccard_ANI():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2)\n\n    print(\"\\nJACCARD_ANI\", ss1.jaccard_ani(ss2))\n\n    s1_jani_s2 = ss1.jaccard_ani(ss2)\n    s2_jani_s1 = ss2.jaccard_ani(ss1)\n\n    assert s1_jani_s2 == s2_jani_s1\n    assert (\n        s1_jani_s2.ani,\n        s1_jani_s2.p_nothing_in_common,\n        s1_jani_s2.jaccard_error,\n    ) == (0.9783711630110239, 0.0, 3.891666770716877e-07)\n\n\ndef test_jaccard_ANI_untrustworthy():\n    f1 = utils.get_test_data(\"2.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2)\n\n    print(\"\\nJACCARD_ANI\", ss1.jaccard_ani(ss2))\n\n    s1_jani_s2 = ss1.jaccard_ani(ss2, err_threshold=1e-7)\n\n    # since size is inaccurate on 2.fa.sig, need to override to be able to get ani\n    s1_jani_s2.size_is_inaccurate = False\n\n    assert s1_jani_s2.ani is None\n    assert s1_jani_s2.je_exceeds_threshold == True\n    assert s1_jani_s2.je_threshold == 1e-7\n\n\ndef test_jaccard_ANI_precalc_jaccard():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2)\n    # precalc jaccard and assert same result\n    jaccard = ss1.jaccard(ss2)\n    print(\"\\nJACCARD_ANI\", ss1.jaccard_ani(ss2, jaccard=jaccard))\n\n    assert (\n        ss1.jaccard_ani(ss2)\n        == ss1.jaccard_ani(ss2, jaccard=jaccard)\n        == ss2.jaccard_ani(ss1, jaccard=jaccard)\n    )\n    wrong_jaccard = jaccard - 0.1\n    assert ss1.jaccard_ani(ss2) != ss1.jaccard_ani(ss2, jaccard=wrong_jaccard)\n\n\ndef test_jaccard_ANI_downsample():\n    f1 = utils.get_test_data(\"47+63.fa.sig\")\n    f2 = utils.get_test_data(\"2+63.fa.sig\")\n    ss1 = sourmash.load_one_signature_from_json(f1, ksize=31)\n    ss2 = sourmash.load_one_signature_from_json(f2)\n\n    print(ss1.minhash.scaled)\n    ss1 = ss1.to_mutable()\n    ss1.minhash = ss1.minhash.downsample(scaled=2000)\n    assert ss1.minhash.scaled != ss2.minhash.scaled\n    with pytest.raises(ValueError) as e:\n        ss1.jaccard_ani(ss2)\n        assert \"ValueError: mismatch in scaled; comparison fail\" in e\n\n    ds_s1c = ss1.jaccard_ani(ss2, downsample=True)\n    ds_s2c = ss2.jaccard_ani(ss1, downsample=True)\n\n    ss2 = ss2.to_mutable()\n    ss2.minhash = ss2.minhash.downsample(scaled=2000)\n    assert ss1.minhash.scaled == ss2.minhash.scaled\n    ds_j_manual = ss1.jaccard_ani(ss2)\n    assert ds_s1c == ds_s2c == ds_j_manual\n\n\ndef test_frozen_signature_update_1(track_abundance):\n    # setting .name should fail on a FrozenSourmashSignature\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    ss = SourmashSignature(e, name=\"foo\").to_frozen()\n\n    with pytest.raises(ValueError):\n        ss.name = \"foo2\"\n\n\ndef test_frozen_signature_update_2(track_abundance):\n    # setting .minhash should fail on a FrozenSourmashSignature\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    e2 = e.copy_and_clear()\n    ss = SourmashSignature(e, name=\"foo\").to_frozen()\n\n    with pytest.raises(ValueError):\n        ss.minhash = e2\n\n\ndef test_frozen_signature_update_3(track_abundance):\n    # setting .minhash should succeed with update() context manager\n    e = MinHash(n=1, ksize=20, track_abundance=track_abundance)\n    e.add_kmer(\"AT\" * 10)\n    ss = SourmashSignature(e, name=\"foo\").to_frozen()\n\n    with ss.update() as ss2:\n        ss2.name = \"foo2\"\n\n    assert ss2.name == \"foo2\"\n"
  },
  {
    "path": "tests/test_sketchcomparison.py",
    "content": "\"\"\"\nTests for the 'SketchComparison' classes.\n\"\"\"\n\nimport numpy as np\nimport pytest\n\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.minhash import MinHash\nfrom sourmash.sketchcomparison import FracMinHashComparison, NumMinHashComparison\n\nimport sourmash_tst_utils as utils\n\n\n# can we parameterize scaled too (so don't need separate downsample tests?)\ndef test_FracMinHashComparison(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_scaled == 1\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.mh1_containment_in_mh2 == a.contained_by(b)\n    assert cmp.mh2_containment_in_mh1 == b.contained_by(a)\n    assert cmp.avg_containment == a.avg_containment(b)\n    assert cmp.max_containment == a.max_containment(b)\n    assert cmp.jaccard == a.jaccard(b) == b.jaccard(a)\n    intersect_mh = a.flatten().intersection(b.flatten())\n    assert cmp.intersect_mh == intersect_mh == b.flatten().intersection(a.flatten())\n    assert cmp.total_unique_intersect_hashes == 4\n    assert cmp.pass_threshold  # default threshold is 0; this should pass\n    if track_abundance:\n        assert (\n            cmp.angular_similarity == a.angular_similarity(b) == b.angular_similarity(a)\n        )\n        assert (\n            cmp.cosine_similarity == a.angular_similarity(b) == b.angular_similarity(a)\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh1).hashes\n            == intersect_mh.inflate(a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh2).hashes\n            == intersect_mh.inflate(b).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=a_values).hashes\n            == intersect_mh.inflate(a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=b_values).hashes\n            == intersect_mh.inflate(b).hashes\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        assert cmp.weighted_intersection(from_mh=cmp.mh1).hashes == intersect_mh.hashes\n        assert cmp.weighted_intersection(from_mh=cmp.mh2).hashes == intersect_mh.hashes\n\n\ndef test_FracMinHashComparison_downsample(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp_scaled = 2\n    ds_a = a.downsample(scaled=cmp_scaled)\n    ds_b = b.downsample(scaled=cmp_scaled)\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b, cmp_scaled=cmp_scaled)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.mh1_cmp == ds_a\n    assert cmp.mh2_cmp == ds_b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_scaled == cmp_scaled\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.mh1_containment_in_mh2 == ds_a.contained_by(ds_b)\n    assert cmp.mh2_containment_in_mh1 == ds_b.contained_by(ds_a)\n    assert cmp.avg_containment == ds_a.avg_containment(ds_b)\n    assert cmp.max_containment == ds_a.max_containment(ds_b)\n    assert cmp.jaccard == ds_a.jaccard(ds_b) == ds_b.jaccard(ds_a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    assert cmp.total_unique_intersect_hashes == 8\n    assert cmp.pass_threshold  # default threshold is 0; this should pass\n    if track_abundance:\n        assert (\n            cmp.angular_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.cosine_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh1_cmp).hashes\n            == intersect_mh.inflate(ds_a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh2_cmp).hashes\n            == intersect_mh.inflate(ds_b).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=cmp.mh1_cmp.hashes).hashes\n            == intersect_mh.inflate(ds_a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=cmp.mh2_cmp.hashes).hashes\n            == intersect_mh.inflate(ds_b).hashes\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh1_cmp).hashes == intersect_mh.hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh2_cmp).hashes == intersect_mh.hashes\n        )\n\n\ndef test_FracMinHashComparison_autodownsample(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=2, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp_scaled = 2\n    ds_a = a.downsample(scaled=cmp_scaled)\n    ds_b = b.downsample(scaled=cmp_scaled)\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.mh1_cmp == ds_a\n    assert cmp.mh2_cmp == ds_b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_scaled == cmp_scaled\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.mh1_containment_in_mh2 == ds_a.contained_by(ds_b)\n    assert cmp.mh2_containment_in_mh1 == ds_b.contained_by(ds_a)\n    assert cmp.avg_containment == ds_a.avg_containment(ds_b)\n    assert cmp.max_containment == ds_a.max_containment(ds_b)\n    assert cmp.jaccard == ds_a.jaccard(ds_b) == ds_b.jaccard(ds_a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    assert cmp.total_unique_intersect_hashes == 8\n    assert cmp.pass_threshold  # default threshold is 0; this should pass\n    if track_abundance:\n        assert (\n            cmp.angular_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.cosine_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh1_cmp).hashes\n            == intersect_mh.inflate(ds_a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh2_cmp).hashes\n            == intersect_mh.inflate(ds_b).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=a_values).hashes\n            == intersect_mh.inflate(a).hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_abundD=b_values).hashes\n            == intersect_mh.inflate(b).hashes\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh1_cmp).hashes == intersect_mh.hashes\n        )\n        assert (\n            cmp.weighted_intersection(from_mh=cmp.mh2_cmp).hashes == intersect_mh.hashes\n        )\n\n\ndef test_FracMinHashComparison_ignore_abundance(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp_scaled = 2\n    ds_a = a.flatten().downsample(scaled=cmp_scaled)\n    ds_b = b.flatten().downsample(scaled=cmp_scaled)\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b, cmp_scaled=cmp_scaled, ignore_abundance=True)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.mh1_cmp == ds_a\n    assert cmp.mh2_cmp == ds_b\n    assert cmp.ignore_abundance == True\n    assert cmp.cmp_scaled == cmp_scaled\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.mh1_containment_in_mh2 == ds_a.contained_by(ds_b)\n    assert cmp.mh2_containment_in_mh1 == ds_b.contained_by(ds_a)\n    assert cmp.avg_containment == ds_b.avg_containment(ds_a)\n    assert cmp.max_containment == ds_a.max_containment(ds_b)\n    assert cmp.jaccard == ds_a.jaccard(ds_b) == ds_b.jaccard(ds_a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    assert cmp.total_unique_intersect_hashes == 8\n    assert cmp.pass_threshold  # default threshold is 0; this should pass\n    # with ignore_abundance = True, all of these should not be usable. Do we want errors, or \"\"/None?\n    with pytest.raises(TypeError) as exc:\n        cmp.angular_similarity\n    print(str(exc))\n    assert (\n        \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n        in str(exc)\n    )\n    with pytest.raises(TypeError) as exc:\n        cmp.cosine_similarity\n    print(str(exc))\n    assert (\n        \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n        in str(exc)\n    )\n    assert not cmp.mh1_cmp.track_abundance\n    assert not cmp.mh2_cmp.track_abundance\n    assert cmp.weighted_intersection(from_mh=cmp.mh1_cmp).hashes == intersect_mh.hashes\n    assert cmp.weighted_intersection(from_mh=cmp.mh2_cmp).hashes == intersect_mh.hashes\n\n\ndef test_FracMinHashComparison_fail_threshold(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=1, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp_scaled = 2\n    ds_a = a.flatten().downsample(scaled=cmp_scaled)\n    ds_b = b.flatten().downsample(scaled=cmp_scaled)\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b, cmp_scaled=cmp_scaled, threshold_bp=40)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_scaled == cmp_scaled\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.mh1_containment_in_mh2 == ds_a.contained_by(ds_b)\n    assert cmp.mh2_containment_in_mh1 == ds_b.contained_by(ds_a)\n    assert cmp.avg_containment == ds_a.avg_containment(ds_b)\n    assert cmp.max_containment == ds_a.max_containment(ds_b)\n    assert cmp.jaccard == a.jaccard(b) == b.jaccard(a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    assert cmp.total_unique_intersect_hashes == 8\n    assert not cmp.pass_threshold  # threshold is 40; this should fail\n\n\ndef test_FracMinHashComparison_potential_false_negative():\n    f1 = utils.get_test_data(\"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\")\n    f2 = utils.get_test_data(\"scaled100/GCF_000006945.1_ASM694v1_genomic.fna.gz.sig.gz\")\n    f3 = utils.get_test_data(\n        \"scaled100/GCF_000783305.1_ASM78330v1_genomic.fna.gz.sig.gz\"\n    )\n    a = load_one_signature(f1, ksize=21).minhash\n    b = load_one_signature(f2).minhash\n    c = load_one_signature(f3).minhash\n    assert a.size_is_accurate() == True\n    assert b.size_is_accurate() == True\n    assert c.size_is_accurate() == True\n\n    # build FracMinHashComparison\n    cmp = FracMinHashComparison(a, b)\n    # check ani, potential false negative\n    cmp.estimate_jaccard_ani()\n    assert cmp.jaccard_ani == a.jaccard_ani(b).ani == b.jaccard_ani(a).ani\n    print(cmp.jaccard_ani)\n    assert (\n        cmp.potential_false_negative\n        == a.jaccard_ani(b).p_exceeds_threshold\n        == b.jaccard_ani(a).p_exceeds_threshold\n    )\n    assert cmp.potential_false_negative == False\n    assert (\n        cmp.jaccard_ani_untrustworthy\n        == a.jaccard_ani(b).je_exceeds_threshold\n        == b.jaccard_ani(a).je_exceeds_threshold\n    )\n\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    a_cont_ani_manual = a.containment_ani(b)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    print(a_cont_ani_manual.p_exceeds_threshold)\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n    assert cmp.potential_false_negative == False\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1()\n    b_cont_ani_manual = b.containment_ani(a)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n    assert cmp.potential_false_negative == False\n\n    cmp.estimate_max_containment_ani()\n    mc_ani_manual = a.max_containment_ani(b)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    assert cmp.avg_containment_ani == np.mean(\n        [a.containment_ani(b).ani, b.containment_ani(a).ani]\n    )\n    assert cmp.potential_false_negative == False\n\n    # downsample to where it becomes a potential false negative\n    cmp = FracMinHashComparison(a, b, cmp_scaled=16000)\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    assert cmp.potential_false_negative == True\n\n\ndef test_FracMinHashComparison_incompatible_ksize(track_abundance):\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 21, scaled=2, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(TypeError) as exc:\n        FracMinHashComparison(a, b)\n    print(str(exc))\n    assert \"Error: Cannot compare incompatible sketches.\" in str(exc)\n\n\ndef test_FracMinHashComparison_incompatible_moltype(track_abundance):\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 31, scaled=2, is_protein=True, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(TypeError) as exc:\n        FracMinHashComparison(a, b)\n    print(str(exc))\n    assert \"Error: Cannot compare incompatible sketches.\" in str(exc)\n\n\ndef test_FracMinHashComparison_incompatible_sketchtype(track_abundance):\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(10, 31, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(TypeError) as exc:\n        FracMinHashComparison(a, b)\n    print(str(exc))\n    assert \"Error: Both sketches must be 'num' or 'scaled'.\" in str(exc)\n\n\ndef test_FracMinHashComparison_incompatible_cmp_scaled(track_abundance):\n    # pass in too low of a cmp_scaled value\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 31, scaled=10, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(ValueError) as exc:\n        FracMinHashComparison(a, b, cmp_scaled=1)\n    print(str(exc))\n    assert \"new scaled 1 is lower than current sample scaled 10\" in str(exc)\n\n\ndef test_FracMinHashComparison_redownsample_without_scaled(track_abundance):\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(0, 31, scaled=10, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp = FracMinHashComparison(a, b)\n    assert cmp.cmp_scaled == 10\n\n    with pytest.raises(ValueError) as exc:\n        # try to redownsample without passing in cmp_scaled\n        cmp.downsample_and_handle_ignore_abundance()\n    print(str(exc))\n    assert \"Error: must pass in a comparison scaled or num value.\" in str(exc)\n\n\ndef test_NumMinHashComparison(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(10, 21, scaled=0, track_abundance=track_abundance)\n    b = MinHash(10, 21, scaled=0, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    assert a.num and b.num and not a.scaled and not b.scaled\n\n    # build NumMinHashComparison\n    cmp = NumMinHashComparison(a, b)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_num == 10\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.jaccard == a.jaccard(b) == b.jaccard(a)\n    intersect_mh = a.flatten().intersection(b.flatten())\n    assert cmp.intersect_mh == intersect_mh == b.flatten().intersection(a.flatten())\n    if track_abundance:\n        assert (\n            cmp.angular_similarity == a.angular_similarity(b) == b.angular_similarity(a)\n        )\n        assert (\n            cmp.cosine_similarity == a.angular_similarity(b) == b.angular_similarity(a)\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n\n\ndef test_NumMinHashComparison_downsample(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(10, 21, scaled=0, track_abundance=track_abundance)\n    b = MinHash(10, 21, scaled=0, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    assert a.num and b.num and not a.scaled and not b.scaled\n\n    cmp_num = 5\n    ds_a = a.downsample(num=cmp_num)\n    ds_b = b.downsample(num=cmp_num)\n    # build NumMinHashComparison\n    cmp = NumMinHashComparison(a, b, cmp_num=cmp_num)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_num == cmp_num\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.jaccard == ds_a.jaccard(ds_b) == ds_b.jaccard(ds_a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    if track_abundance:\n        assert (\n            cmp.angular_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.cosine_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n\n\ndef test_NumMinHashComparison_autodownsample(track_abundance):\n    # build FracMinHash Comparison and check values\n    a = MinHash(10, 21, scaled=0, track_abundance=track_abundance)\n    b = MinHash(5, 21, scaled=0, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    assert a.num and b.num and not a.scaled and not b.scaled\n\n    cmp_num = 5\n    ds_a = a.downsample(num=cmp_num)\n    ds_b = b.downsample(num=cmp_num)\n    # build NumMinHashComparison\n    cmp = NumMinHashComparison(a, b)\n    assert cmp.mh1 == a\n    assert cmp.mh2 == b\n    assert cmp.ignore_abundance == False\n    assert cmp.cmp_num == cmp_num\n    assert cmp.ksize == 21\n    assert cmp.moltype == \"DNA\"\n    assert cmp.jaccard == ds_a.jaccard(ds_b) == ds_b.jaccard(ds_a)\n    intersect_mh = ds_a.flatten().intersection(ds_b.flatten())\n    assert (\n        cmp.intersect_mh == intersect_mh == ds_b.flatten().intersection(ds_a.flatten())\n    )\n    if track_abundance:\n        assert (\n            cmp.angular_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n        assert (\n            cmp.cosine_similarity\n            == ds_a.angular_similarity(ds_b)\n            == ds_b.angular_similarity(ds_a)\n        )\n    else:\n        with pytest.raises(TypeError) as exc:\n            cmp.angular_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n        with pytest.raises(TypeError) as exc:\n            cmp.cosine_similarity\n        print(str(exc))\n        assert (\n            \"Error: Angular (cosine) similarity requires both sketches to track hash abundance.\"\n            in str(exc)\n        )\n\n\ndef test_NumMinHashComparison_incompatible_ksize(track_abundance):\n    a_num = MinHash(20, 31, track_abundance=track_abundance)\n    b_num = MinHash(10, 21, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a_num.set_abundances(a_values)\n        b_num.set_abundances(b_values)\n    else:\n        a_num.add_many(a_values.keys())\n        b_num.add_many(b_values.keys())\n\n    # build NumMinHashComparison\n    with pytest.raises(TypeError) as exc:\n        NumMinHashComparison(a_num, b_num)\n    print(str(exc))\n    assert \"Error: Cannot compare incompatible sketches.\" in str(exc)\n\n\ndef test_NumMinHashComparison_incompatible_moltype(track_abundance):\n    a_num = MinHash(20, 31, track_abundance=track_abundance)\n    b_num = MinHash(10, 31, is_protein=True, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a_num.set_abundances(a_values)\n        b_num.set_abundances(b_values)\n    else:\n        a_num.add_many(a_values.keys())\n        b_num.add_many(b_values.keys())\n\n    with pytest.raises(TypeError) as exc:\n        NumMinHashComparison(a_num, b_num)\n    print(str(exc))\n    assert \"Error: Cannot compare incompatible sketches.\" in str(exc)\n\n\ndef test_NumMinHashComparison_incompatible_sketchtype(track_abundance):\n    a = MinHash(0, 31, scaled=1, track_abundance=track_abundance)\n    b = MinHash(10, 31, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(TypeError) as exc:\n        NumMinHashComparison(a, b)\n    print(str(exc))\n    assert \"Error: Both sketches must be 'num' or 'scaled'.\" in str(exc)\n\n\ndef test_NumMinHashComparison_redownsample_without_num(track_abundance):\n    a = MinHash(10, 31, track_abundance=track_abundance)\n    b = MinHash(5, 31, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    cmp = NumMinHashComparison(a, b)\n\n    with pytest.raises(ValueError) as exc:\n        # try to redownsample without passing in cmp_num\n        cmp.downsample_and_handle_ignore_abundance()\n    print(str(exc))\n    assert \"Error: must pass in a comparison scaled or num value.\" in str(exc)\n\n\ndef test_NumMinHashComparison_incompatible_cmp_num(track_abundance):\n    # pass in too high of a cmp_num value\n    a = MinHash(200, 31, track_abundance=track_abundance)\n    b = MinHash(100, 31, track_abundance=track_abundance)\n\n    a_values = {1: 5, 3: 3, 5: 2, 8: 2}\n    b_values = {1: 3, 3: 2, 5: 1, 6: 1, 8: 1, 10: 1}\n\n    if track_abundance:\n        a.set_abundances(a_values)\n        b.set_abundances(b_values)\n    else:\n        a.add_many(a_values.keys())\n        b.add_many(b_values.keys())\n\n    with pytest.raises(ValueError) as exc:\n        NumMinHashComparison(a, b, cmp_num=150)\n    print(str(exc))\n    assert \"new sample num is higher than current sample num\" in str(exc)\n\n\ndef test_FracMinHashComparison_ANI(track_abundance):\n    # need real mh here, small test data fails\n    if track_abundance:\n        f1 = utils.get_test_data(\"track_abund/47.fa.sig\")\n        f2 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    else:\n        f1 = utils.get_test_data(\"47.fa.sig\")\n        f2 = utils.get_test_data(\"63.fa.sig\")\n\n    a = load_one_signature(f1, ksize=31).minhash\n    b = load_one_signature(f2, ksize=31).minhash\n\n    cmp = FracMinHashComparison(a, b)\n    # check jaccard ani\n    cmp.estimate_jaccard_ani()\n    assert cmp.jaccard_ani == a.jaccard_ani(b).ani == b.jaccard_ani(a).ani\n    assert (\n        cmp.potential_false_negative\n        == a.jaccard_ani(b).p_exceeds_threshold\n        == b.jaccard_ani(a).p_exceeds_threshold\n    )\n    assert (\n        cmp.jaccard_ani_untrustworthy\n        == a.jaccard_ani(b).je_exceeds_threshold\n        == b.jaccard_ani(a).je_exceeds_threshold\n    )\n\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    a_cont_ani_manual = a.containment_ani(b)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n    #    assert cmp.mh1_containment_ani_low is None\n    #    assert cmp.mh1_containment_ani_high is None\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1()\n    b_cont_ani_manual = b.containment_ani(a)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n    #    assert cmp.mh2_containment_ani_low is None\n    #    assert cmp.mh2_containment_ani_high is None\n\n    cmp.estimate_max_containment_ani()\n    mc_ani_manual = a.max_containment_ani(b)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    #    assert cmp.max_containment_ani_low is None\n    #    assert cmp.max_containment_ani_high is None\n    assert cmp.avg_containment_ani == np.mean(\n        [a.containment_ani(b).ani, b.containment_ani(a).ani]\n    )\n\n\ndef test_FracMinHashComparison_ANI_provide_similarity(track_abundance):\n    # need real mh here, small test data fails\n    if track_abundance:\n        f1 = utils.get_test_data(\"track_abund/47.fa.sig\")\n        f2 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    else:\n        f1 = utils.get_test_data(\"47.fa.sig\")\n        f2 = utils.get_test_data(\"63.fa.sig\")\n\n    a = load_one_signature(f1, ksize=31).minhash\n    b = load_one_signature(f2, ksize=31).minhash\n\n    cmp = FracMinHashComparison(a, b)\n    # check jaccard ani\n    jaccard = a.jaccard(b)\n    cmp.estimate_jaccard_ani(jaccard=jaccard)\n    assert cmp.jaccard_ani == a.jaccard_ani(b).ani == b.jaccard_ani(a).ani\n    assert (\n        cmp.potential_false_negative\n        == a.jaccard_ani(b).p_exceeds_threshold\n        == b.jaccard_ani(a).p_exceeds_threshold\n    )\n    assert (\n        cmp.jaccard_ani_untrustworthy\n        == a.jaccard_ani(b).je_exceeds_threshold\n        == b.jaccard_ani(a).je_exceeds_threshold\n    )\n\n    a_cont = a.contained_by(b)\n    b_cont = b.contained_by(a)\n    mc = a.max_containment(b)\n\n    cmp.estimate_ani_from_mh1_containment_in_mh2(containment=a_cont)\n    a_cont_ani_manual = a.containment_ani(b)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1(containment=b_cont)\n    b_cont_ani_manual = b.containment_ani(a)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n\n    cmp.estimate_max_containment_ani(max_containment=mc)\n    mc_ani_manual = a.max_containment_ani(b)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    assert cmp.avg_containment_ani == np.mean(\n        [a.containment_ani(b).ani, b.containment_ani(a).ani]\n    )\n\n\ndef test_FracMinHashComparison_ANI_estimate_CI(track_abundance):\n    # need real mh here, small test data fails\n    if track_abundance:\n        f1 = utils.get_test_data(\"track_abund/47.fa.sig\")\n        f2 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    else:\n        f1 = utils.get_test_data(\"47.fa.sig\")\n        f2 = utils.get_test_data(\"63.fa.sig\")\n\n    a = load_one_signature(f1, ksize=31).minhash\n    b = load_one_signature(f2, ksize=31).minhash\n\n    cmp = FracMinHashComparison(a, b, estimate_ani_ci=True)\n    cmp.estimate_jaccard_ani()\n    assert cmp.jaccard_ani == a.jaccard_ani(b).ani == b.jaccard_ani(a).ani\n    assert (\n        cmp.potential_false_negative\n        == a.jaccard_ani(b).p_exceeds_threshold\n        == b.jaccard_ani(a).p_exceeds_threshold\n    )\n    assert (\n        cmp.jaccard_ani_untrustworthy\n        == a.jaccard_ani(b).je_exceeds_threshold\n        == b.jaccard_ani(a).je_exceeds_threshold\n    )\n\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    a_cont_ani_manual = a.containment_ani(b, estimate_ci=True)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh1_containment_in_mh2_low == a_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh1_containment_in_mh2_high == a_cont_ani_manual.ani_high\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1()\n    b_cont_ani_manual = b.containment_ani(a, estimate_ci=True)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh2_containment_in_mh1_low == b_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh2_containment_in_mh1_high == b_cont_ani_manual.ani_high\n\n    cmp.estimate_max_containment_ani()\n    mc_ani_manual = a.max_containment_ani(b, estimate_ci=True)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    assert cmp.max_containment_ani_low == mc_ani_manual.ani_low\n    assert cmp.max_containment_ani_high == mc_ani_manual.ani_high\n\n\ndef test_FracMinHashComparison_ANI_estimate_CI_ci99(track_abundance):\n    # need real mh here, small test data fails\n    if track_abundance:\n        f1 = utils.get_test_data(\"track_abund/47.fa.sig\")\n        f2 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    else:\n        f1 = utils.get_test_data(\"47.fa.sig\")\n        f2 = utils.get_test_data(\"63.fa.sig\")\n\n    a = load_one_signature(f1, ksize=31).minhash\n    b = load_one_signature(f2, ksize=31).minhash\n\n    cmp = FracMinHashComparison(a, b, estimate_ani_ci=True, ani_confidence=0.99)\n    # check containment ani\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    a_cont_ani_manual = a.containment_ani(b, estimate_ci=True, confidence=0.99)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh1_containment_in_mh2_low == a_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh1_containment_in_mh2_high == a_cont_ani_manual.ani_high\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1()\n    b_cont_ani_manual = b.containment_ani(a, estimate_ci=True, confidence=0.99)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh2_containment_in_mh1_low == b_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh2_containment_in_mh1_high == b_cont_ani_manual.ani_high\n\n    cmp.estimate_max_containment_ani()\n    mc_ani_manual = a.max_containment_ani(b, estimate_ci=True, confidence=0.99)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    assert cmp.max_containment_ani_low == mc_ani_manual.ani_low\n    assert cmp.max_containment_ani_high == mc_ani_manual.ani_high\n\n\ndef test_FracMinHashComparison_ANI_downsample(track_abundance):\n    # need real mh here, small test data fails\n    if track_abundance:\n        f1 = utils.get_test_data(\"track_abund/47.fa.sig\")\n        f2 = utils.get_test_data(\"track_abund/63.fa.sig\")\n    else:\n        f1 = utils.get_test_data(\"47.fa.sig\")\n        f2 = utils.get_test_data(\"63.fa.sig\")\n\n    a = load_one_signature(f1, ksize=31).minhash\n    b = load_one_signature(f2, ksize=31).minhash\n\n    cmp = FracMinHashComparison(a, b, cmp_scaled=1100, estimate_ani_ci=True)\n\n    # now manually downsample\n    a = a.downsample(scaled=1100)\n    b = b.downsample(scaled=1100)\n\n    # check jaccard ani\n    cmp.estimate_jaccard_ani()\n    assert cmp.jaccard_ani == a.jaccard_ani(b).ani == b.jaccard_ani(a).ani\n    assert (\n        cmp.potential_false_negative\n        == a.jaccard_ani(b).p_exceeds_threshold\n        == b.jaccard_ani(a).p_exceeds_threshold\n    )\n    assert (\n        cmp.jaccard_ani_untrustworthy\n        == a.jaccard_ani(b).je_exceeds_threshold\n        == b.jaccard_ani(a).je_exceeds_threshold\n    )\n\n    cmp.estimate_ani_from_mh1_containment_in_mh2()\n    a_cont_ani_manual = a.containment_ani(b, estimate_ci=True)\n    assert cmp.ani_from_mh1_containment_in_mh2 == a_cont_ani_manual.ani\n    assert cmp.potential_false_negative == a_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh1_containment_in_mh2_low == a_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh1_containment_in_mh2_high == a_cont_ani_manual.ani_high\n\n    cmp.estimate_ani_from_mh2_containment_in_mh1()\n    b_cont_ani_manual = b.containment_ani(a, estimate_ci=True)\n    assert cmp.ani_from_mh2_containment_in_mh1 == b_cont_ani_manual.ani\n    assert cmp.potential_false_negative == b_cont_ani_manual.p_exceeds_threshold\n    assert cmp.ani_from_mh2_containment_in_mh1_low == b_cont_ani_manual.ani_low\n    assert cmp.ani_from_mh2_containment_in_mh1_high == b_cont_ani_manual.ani_high\n\n    cmp.estimate_max_containment_ani()\n    mc_ani_manual = a.max_containment_ani(b, estimate_ci=True)\n    assert (\n        cmp.max_containment_ani\n        == max(a.containment_ani(b).ani, b.containment_ani(a).ani)\n        == mc_ani_manual.ani\n    )\n    assert cmp.potential_false_negative == mc_ani_manual.p_exceeds_threshold\n    assert cmp.max_containment_ani_low == mc_ani_manual.ani_low\n    assert cmp.max_containment_ani_high == mc_ani_manual.ani_high\n"
  },
  {
    "path": "tests/test_sourmash.py",
    "content": "\"\"\"\nTests for the 'sourmash' command line.\n\"\"\"\n\nimport os\nimport gzip\nimport shutil\nimport screed\nimport glob\nimport json\nimport csv\nimport pytest\nimport zipfile\nimport random\nimport warnings\nfrom pathlib import Path\n\nimport numpy\n\nimport sourmash_tst_utils as utils\n\nimport sourmash\nfrom sourmash import MinHash, sourmash_args\nfrom sourmash.sbt import SBT, Node\nfrom sourmash.sbtmh import SigLeaf, load_sbt_index\nfrom sourmash.search import SearchResult, GatherResult\nfrom sourmash.signature import load_one_signature_from_json as load_one_signature\nfrom sourmash.signature import load_signatures_from_json\nfrom sourmash.sourmash_args import load_one_signature\n\ntry:\n    import matplotlib\n\n    matplotlib.use(\"Agg\")\nexcept ImportError:\n    pass\n\nfrom sourmash import signature\nfrom sourmash import VERSION\nfrom sourmash.sourmash_args import load_pathlist_from_file\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n\ndef test_citation_file():\n    import yaml\n\n    thisdir = os.path.dirname(__file__)\n    citation_file = os.path.join(thisdir, \"../CITATION.cff\")\n\n    with open(citation_file) as fp:\n        x = yaml.safe_load(fp)\n\n    assert (\n        x[\"title\"]\n        == \"sourmash v4: A multitool to quickly search, compare, and analyze genomic and metagenomic data sets\"\n    ), x\n\n\ndef test_run_sourmash():\n    status, out, err = utils.runscript(\"sourmash\", [], fail_ok=True)\n    assert status != 0  # no args provided, ok ;)\n\n\ndef test_run_sourmash_badcmd():\n    status, out, err = utils.runscript(\"sourmash\", [\"foobarbaz\"], fail_ok=True)\n    assert status != 0  # bad arg!\n    assert \"cmd: invalid choice\" in err\n\n\ndef test_run_sourmash_subcmd_help():\n    status, out, err = utils.runscript(\"sourmash\", [\"sbt\"], fail_ok=True)\n    print(out)\n    print(err)\n    assert status != 0  # should fail\n\n    assert \"invalid choice:\" in err\n    assert \"'sbt' (choose from\" in err\n\n    # should not have printed a Traceback\n    assert any(\"Traceback\" not in o for o in (err, out))\n\n\ndef test_sourmash_info():\n    status, out, err = utils.runscript(\"sourmash\", [\"info\"], fail_ok=False)\n\n    # no output to stdout\n    assert not out\n    assert \"sourmash version\" in err\n    assert \"loaded from path\" in err\n    assert VERSION in err\n\n\ndef test_sourmash_info_verbose():\n    status, out, err = utils.runscript(\"sourmash\", [\"info\", \"-v\"])\n\n    # no output to stdout\n    assert not out\n    assert \"khmer version\" in err\n    assert \"screed version\" in err\n    assert \"loaded from path\" in err\n\n\ndef test_load_pathlist_from_file_does_not_exist():\n    from sourmash.sourmash_args import load_pathlist_from_file\n\n    with pytest.raises(ValueError) as e:\n        load_pathlist_from_file(\"\")\n    assert \"file '' does not exist\" in str(e.value)\n\n\n@utils.in_tempdir\ndef test_load_pathlist_from_file_empty(c):\n    file_list = c.output(\"file_list\")\n    with open(file_list, \"w\") as fp:\n        fp.write(\"\")\n    with pytest.raises(ValueError) as e:\n        load_pathlist_from_file(file_list)\n    assert \"pathlist is empty\" in str(e.value)\n\n\n@utils.in_tempdir\ndef test_load_pathlist_from_file_badly_formatted(c):\n    file_list = c.output(\"file_list\")\n    with open(file_list, \"w\") as fp:\n        fp.write(\"{'a':1}\")\n    with pytest.raises(ValueError) as e:\n        load_pathlist_from_file(file_list)\n    assert \"file '{'a':1}' inside the pathlist does not exist\" in str(e.value)\n\n\n@utils.in_tempdir\ndef test_load_pathlist_from_file_badly_formatted_2(c):\n    file_list = c.output(\"file_list\")\n    sig1 = utils.get_test_data(\"compare/genome-s10.fa.gz.sig\")\n    with open(file_list, \"w\") as fp:\n        fp.write(sig1 + \"\\n\")\n        fp.write(\"{'a':1}\")\n    with pytest.raises(ValueError) as e:\n        load_pathlist_from_file(file_list)\n    assert \"file '{'a':1}' inside the pathlist does not exist\" in str(e.value)\n\n\n@utils.in_tempdir\ndef test_load_pathlist_from_file_duplicate(c):\n    file_list = c.output(\"file_list\")\n    sig1 = utils.get_test_data(\"compare/genome-s10.fa.gz.sig\")\n    with open(file_list, \"w\") as fp:\n        fp.write(sig1 + \"\\n\")\n        fp.write(sig1 + \"\\n\")\n    check = load_pathlist_from_file(file_list)\n    print(check)\n    assert len(check) == 1\n\n\ndef test_compare_serial(runtmp):\n    # try doing a compare serially\n    c = runtmp\n\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n    assert len(testsigs) == 4\n\n    c.run_sourmash(\"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--dna\", *testsigs)\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = si.similarity(sj)\n\n        sigs = []\n        for fn in testsigs:\n            sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n    assert (cmp_out == cmp_calc).all()\n\n\ndef test_compare_serial_distance(runtmp):\n    # try doing a compare serially, with --distance output\n    c = runtmp\n\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n\n    c.run_sourmash(\"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--dna\", *testsigs, \"--distance\")\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = 1 - si.similarity(sj)\n\n        sigs = []\n        for fn in testsigs:\n            sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n    assert (cmp_out == cmp_calc).all()\n\n\ndef test_compare_parallel(runtmp):\n    # try doing a compare parallel\n    c = runtmp\n\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n\n    c.run_sourmash(\n        \"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--dna\", \"--processes\", \"2\", *testsigs\n    )\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = si.similarity(sj)\n\n        sigs = []\n        for fn in testsigs:\n            sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n    assert (cmp_out == cmp_calc).all()\n\n\ndef test_compare_do_serial_compare_with_from_file(runtmp):\n    # try doing a compare serial\n    c = runtmp\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n\n    file_list = c.output(\"file.list\")\n    with open(file_list, \"w\") as fp:\n        print(\"\\n\".join(testsigs), file=fp)\n\n    c.run_sourmash(\n        \"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--dna\", \"--from-file\", file_list\n    )\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = si.similarity(sj)\n\n        sigs = []\n        for fn in testsigs:\n            sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    assert numpy.array_equal(numpy.sort(cmp_out.flat), numpy.sort(cmp_calc.flat))\n\n\ndef test_compare_do_basic_compare_using_rna_arg(runtmp):\n    # try doing a basic compare using --rna instead of --dna\n    c = runtmp\n\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n\n    c.run_sourmash(\"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--rna\", *testsigs)\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = si.similarity(sj)\n\n    assert (cmp_out == cmp_calc).all()\n\n\ndef test_compare_do_basic_using_nucleotide_arg(runtmp):\n    # try doing a basic compare using --nucleotide instead of --dna/--rna\n    c = runtmp\n    testsigs = utils.get_test_data(\"genome-s1*.sig\")\n    testsigs = glob.glob(testsigs)\n\n    c.run_sourmash(\"compare\", \"-o\", \"cmp\", \"-k\", \"21\", \"--nucleotide\", *testsigs)\n\n    cmp_outfile = c.output(\"cmp\")\n    assert os.path.exists(cmp_outfile)\n    cmp_out = numpy.load(cmp_outfile)\n\n    sigs = []\n    for fn in testsigs:\n        sigs.append(load_one_signature(fn, ksize=21, select_moltype=\"DNA\"))\n\n    cmp_calc = numpy.zeros([len(sigs), len(sigs)])\n    for i, si in enumerate(sigs):\n        for j, sj in enumerate(sigs):\n            cmp_calc[i][j] = si.similarity(sj)\n\n    assert (cmp_out == cmp_calc).all()\n\n\ndef test_compare_quiet(runtmp):\n    # test 'compare -q' has no output\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\", \"-q\")\n    assert not c.last_result.out\n    assert not c.last_result.err\n\n\ndef test_compare_do_traverse_directory_parse_args(runtmp):\n    # test 'compare' on a directory, using sourmash.cli.parse_args.\n    import sourmash.commands\n    import sourmash.cli\n\n    args = sourmash.cli.parse_args(\n        [\"compare\", \"-k\", \"21\", \"--dna\", utils.get_test_data(\"compare\")]\n    )\n\n    sourmash.commands.compare(args)\n\n\ndef test_compare_do_traverse_directory(runtmp):\n    # test 'compare' on a directory\n    c = runtmp\n    c.run_sourmash(\"compare\", \"-k 21\", \"--dna\", utils.get_test_data(\"compare\"))\n    print(c.last_result.out)\n    assert \"genome-s10.fa.gz\" in c.last_result.out\n    assert \"genome-s11.fa.gz\" in c.last_result.out\n\n\ndef test_compare_do_traverse_directory_compare_force(runtmp):\n    # test 'compare' on a directory, with -f\n    c = runtmp\n    sig1 = utils.get_test_data(\"compare/genome-s10.fa.gz.sig\")\n    sig2 = utils.get_test_data(\"compare/genome-s11.fa.gz.sig\")\n    newdir = c.output(\"newdir\")\n    os.mkdir(newdir)\n\n    shutil.copyfile(sig1, os.path.join(newdir, \"sig1\"))\n    shutil.copyfile(sig2, os.path.join(newdir, \"sig2\"))\n\n    c.run_sourmash(\"compare\", \"-k 21\", \"--dna\", newdir, \"-f\")\n    print(c.last_result.out)\n    assert \"genome-s10.fa.gz\" in c.last_result.out\n    assert \"genome-s11.fa.gz\" in c.last_result.out\n\n\ndef test_compare_output_csv(runtmp):\n    # test 'sourmash compare --csv'\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\")\n\n    with open(c.output(\"xxx\")) as fp:\n        r = iter(csv.reader(fp))\n        row = next(r)\n        print(row)\n        row = next(r)\n        print(row)\n        assert float(row[0]) == 1.0\n        assert float(row[1]) == 0.93\n        row = next(r)\n        assert float(row[0]) == 0.93\n        assert float(row[1]) == 1.0\n\n        # exactly three lines\n        with pytest.raises(StopIteration):\n            next(r)\n\n\ndef test_compare_output_csv_gz(runtmp):\n    # test 'sourmash compare --csv' with a .gz file\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx.gz\")\n\n    with gzip.open(c.output(\"xxx.gz\"), \"rt\", newline=\"\") as fp:\n        r = iter(csv.reader(fp))\n        row = next(r)\n        print(row)\n        row = next(r)\n        print(row)\n        assert float(row[0]) == 1.0\n        assert float(row[1]) == 0.93\n        row = next(r)\n        assert float(row[0]) == 0.93\n        assert float(row[1]) == 1.0\n\n        # exactly three lines\n        with pytest.raises(StopIteration):\n            next(r)\n\n\ndef test_compare_downsample(runtmp):\n    # test 'compare' with implicit downsampling\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=200\", testdata1)\n\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=100\", testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\")\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert \"downsampling to scaled value of 200\" in c.last_result.err\n    with open(c.output(\"xxx\")) as fp:\n        lines = fp.readlines()\n        assert len(lines) == 3\n        assert lines[1].startswith(\"1.0,0.6666\")\n        assert lines[2].startswith(\"0.6666\")\n\n\ndef test_compare_downsample_scaled(runtmp):\n    # test 'compare' with explicit --scaled downsampling\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=200\", testdata1)\n\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=100\", testdata2)\n\n    c.run_sourmash(\n        \"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\", \"--scaled\", \"300\"\n    )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert \"downsampling to scaled value of 300\" in c.last_result.err\n    with open(c.output(\"xxx\")) as fp:\n        lines = fp.readlines()\n        assert len(lines) == 3\n        assert lines[1].startswith(\"1.0,0.0\")\n        assert lines[2].startswith(\"0.0\")\n\n\ndef test_compare_downsample_scaled_too_low(runtmp):\n    # test 'compare' with explicit --scaled downsampling, but lower than min\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=200\", testdata1)\n\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=100\", testdata2)\n\n    c.run_sourmash(\n        \"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\", \"--scaled\", \"100\"\n    )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert \"downsampling to scaled value of 200\" in c.last_result.err\n    assert (\n        \"WARNING: --scaled specified 100, but max scaled of sketches is 200\"\n        in c.last_result.err\n    )\n    with open(c.output(\"xxx\")) as fp:\n        lines = fp.readlines()\n        assert len(lines) == 3\n        assert lines[1].startswith(\"1.0,0.6666\")\n        assert lines[2].startswith(\"0.6666\")\n\n\ndef test_compare_downsample_scaled_fail_num(runtmp):\n    # test 'compare' with explicit --scaled downsampling; fail on num sketch\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=20\", testdata1)\n\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=100\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"--csv\",\n            \"xxx\",\n            \"--scaled\",\n            \"300\",\n        )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert \"cannot mix scaled signatures with num signatures\" in c.last_result.err\n\n\ndef test_compare_downsample_scaled_fail_all_num(runtmp):\n    # test 'compare' with explicit --scaled downsampling; fail on all num sketches\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=20\", testdata1)\n\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=30\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"--csv\",\n            \"xxx\",\n            \"--scaled\",\n            \"300\",\n        )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert (\n        \"ERROR: cannot specify --scaled with non-scaled signatures.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_output_multiple_k(runtmp):\n    # test 'compare' when given multiple k-mer sizes -> should fail\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", testdata1)\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\", fail_ok=True\n        )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert \"multiple k-mer sizes loaded; please specify one\" in c.last_result.err\n    assert \"(saw k-mer sizes 21, 31)\" in c.last_result.err\n\n\ndef test_compare_output_multiple_moltype(runtmp):\n    # 'compare' should fail when given multiple moltypes\n    c = runtmp\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=21,num=500\", testdata1)\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--csv\", \"xxx\", fail_ok=True\n        )\n\n    assert c.last_result.status == -1\n    print(c.last_result.err)\n    assert \"multiple molecule types loaded;\" in c.last_result.err\n\n\ndef test_compare_dayhoff(runtmp):\n    # test 'compare' works with dayhoff moltype\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", \"--dayhoff\", testdata1)\n    assert c.last_result.status == 0\n\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", \"--dayhoff\", testdata2)\n    assert c.last_result.status == 0\n\n    c.run_sourmash(\n        \"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--dayhoff\", \"--csv\", \"xxx\"\n    )\n    true_out = \"\"\"[1.   0.94]\n[0.94 1.  ]\nmin similarity in matrix: 0.940\"\"\".splitlines()\n    for line in c.last_result.out:\n        cleaned_line = line.split(\"...\")[-1].strip()\n        cleaned_line in true_out\n    assert c.last_result.status == 0\n\n\ndef test_compare_hp(runtmp):\n    # test that 'compare' works with --hp moltype\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", \"--hp\", testdata1)\n    assert c.last_result.status == 0\n\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=21,num=500\", \"--hp\", testdata2)\n    assert c.last_result.status == 0\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"--hp\", \"--csv\", \"xxx\")\n    true_out = \"\"\"[1.   0.94]\n[0.94 1.  ]\nmin similarity in matrix: 0.940\"\"\".splitlines()\n    for line in c.last_result.out:\n        cleaned_line = line.split(\"...\")[-1].strip()\n        cleaned_line in true_out\n    assert c.last_result.status == 0\n\n\ndef _load_compare_matrix_and_sigs(compare_csv, sigfiles, *, ksize=31):\n    # load in the output of 'compare' together with sigs\n\n    # load compare CSV\n    with open(compare_csv, newline=\"\") as fp:\n        r = iter(csv.reader(fp))\n        headers = next(r)\n\n        mat = numpy.zeros((len(headers), len(headers)))\n        for i, row in enumerate(r):\n            for j, val in enumerate(row):\n                mat[i][j] = float(val)\n\n        print(mat)\n\n    # load in all the input signatures\n    idx_to_sig = {}\n    for idx, filename in enumerate(sigfiles):\n        ss = load_one_signature(filename, ksize=ksize)\n        idx_to_sig[idx] = ss\n\n    return mat, idx_to_sig\n\n\ndef test_compare_containment(runtmp):\n    # test compare --containment\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    c.run_sourmash(\n        \"compare\", \"--containment\", \"-k\", \"31\", \"--csv\", \"output.csv\", *testdata_sigs\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            ss_j = idx_to_sig[j]\n            containment = ss_j.contained_by(ss_i)\n            containment = round(containment, 3)\n            mat_val = round(mat[i][j], 3)\n\n            assert containment == mat_val, (i, j)\n\n\ndef test_compare_containment_distance(runtmp):\n    # test compare --containment --distance-matrix\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    c.run_sourmash(\n        \"compare\",\n        \"--containment\",\n        \"--distance-matrix\",\n        \"-k\",\n        \"31\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            ss_j = idx_to_sig[j]\n            containment = 1 - ss_j.contained_by(ss_i)\n            containment = round(containment, 3)\n            mat_val = round(mat[i][j], 3)\n\n            assert containment == mat_val, (i, j)\n\n\ndef test_compare_max_containment(runtmp):\n    # test compare --max-containment\n\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"scaled/*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    c.run_sourmash(\n        \"compare\",\n        \"--max-containment\",\n        \"-k\",\n        \"31\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            ss_j = idx_to_sig[j]\n            containment = ss_j.max_containment(ss_i)\n            containment = round(containment, 3)\n            mat_val = round(mat[i][j], 3)\n\n            assert containment == mat_val, (i, j)\n\n\ndef test_compare_avg_containment(runtmp):\n    # test compare --avg-containment\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"scaled/*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    c.run_sourmash(\n        \"compare\",\n        \"--avg-containment\",\n        \"-k\",\n        \"31\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            ss_j = idx_to_sig[j]\n            containment = ss_j.avg_containment(ss_i)\n            containment = round(containment, 3)\n            mat_val = round(mat[i][j], 3)\n\n            assert containment == mat_val, (i, j)\n\n\ndef test_compare_max_containment_and_containment(runtmp):\n    # make sure that can't specify both --max-containment and --containment\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"scaled/*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"--max-containment\",\n            \"-k\",\n            \"31\",\n            \"--containment\",\n            \"--csv\",\n            \"output.csv\",\n            *testdata_sigs,\n        )\n\n    print(c.last_result.err)\n    assert (\n        \"ERROR: cannot specify more than one containment argument!\" in c.last_result.err\n    )\n\n\ndef test_compare_avg_containment_and_containment(runtmp):\n    # make sure that can't specify both --avg-containment and --containment\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"scaled/*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"--avg-containment\",\n            \"-k\",\n            \"31\",\n            \"--containment\",\n            \"--csv\",\n            \"output.csv\",\n            *testdata_sigs,\n        )\n\n    print(c.last_result.err)\n    assert (\n        \"ERROR: cannot specify more than one containment argument!\" in c.last_result.err\n    )\n\n\ndef test_compare_avg_containment_and_max_containment(runtmp):\n    # make sure that can't specify both --avg-containment and --max-containment\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"scaled/*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"--avg-containment\",\n            \"-k\",\n            \"31\",\n            \"--max-containment\",\n            \"--csv\",\n            \"output.csv\",\n            *testdata_sigs,\n        )\n\n    print(c.last_result.err)\n    assert (\n        \"ERROR: cannot specify more than one containment argument!\" in c.last_result.err\n    )\n\n\ndef test_compare_containment_abund_flatten_warning(runtmp):\n    # check warning message about ignoring abund signatures\n\n    c = runtmp\n    s47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    s63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    c.run_sourmash(\"compare\", \"--containment\", \"-k\", \"31\", s47, s63)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"NOTE: --containment, --max-containment, --avg-containment, and --estimate-ani ignore signature abundances.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_ani_abund_flatten(runtmp):\n    # check warning message about ignoring abund signatures\n\n    c = runtmp\n    s47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    s63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    c.run_sourmash(\"compare\", \"--estimate-ani\", \"-k\", \"31\", s47, s63)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"NOTE: --containment, --max-containment, --avg-containment, and --estimate-ani ignore signature abundances.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_containment_require_scaled(runtmp):\n    # check warning message about scaled signatures & containment\n    c = runtmp\n\n    s47 = utils.get_test_data(\"num/47.fa.sig\")\n    s63 = utils.get_test_data(\"num/63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"compare\", \"--containment\", \"-k\", \"31\", s47, s63, fail_ok=True)\n\n    assert (\n        \"must use scaled signatures with --containment, --max-containment, and --avg-containment\"\n        in c.last_result.err\n    )\n    assert c.last_result.status != 0\n\n\ndef test_do_plot_comparison(runtmp):\n    # make sure 'plot' outputs files ;)\n    c = runtmp\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"cmp\")\n\n    c.run_sourmash(\"plot\", \"cmp\")\n\n    assert os.path.exists(c.output(\"cmp.dendro.png\"))\n    assert os.path.exists(c.output(\"cmp.matrix.png\"))\n\n\ndef test_do_plot_comparison_2_pdf(runtmp):\n    # test plot --pdf\n    c = runtmp\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"cmp\")\n\n    c.run_sourmash(\"plot\", \"cmp\", \"--pdf\")\n    assert os.path.exists(c.output(\"cmp.dendro.pdf\"))\n    assert os.path.exists(c.output(\"cmp.matrix.pdf\"))\n\n\ndef test_do_plot_comparison_3(runtmp):\n    # test plot --labels\n    c = runtmp\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"cmp\")\n\n    c.run_sourmash(\"plot\", \"cmp\", \"--labels\")\n\n    assert os.path.exists(c.output(\"cmp.dendro.png\"))\n    assert os.path.exists(c.output(\"cmp.matrix.png\"))\n\n\ndef test_do_plot_comparison_4_output_dir(runtmp):\n    # test plot --output-dir\n    c = runtmp\n\n    output_dir = c.output(\"xyz_test\")\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"cmp\")\n\n    c.run_sourmash(\"plot\", \"cmp\", \"--labels\", \"--output-dir\", output_dir)\n\n    assert os.path.exists(os.path.join(output_dir, \"cmp.dendro.png\"))\n    assert os.path.exists(os.path.join(output_dir, \"cmp.matrix.png\"))\n\n\ndef test_do_plot_comparison_5_force(runtmp):\n    # test -f to force display of something that's not a distance matrix\n    c = runtmp\n\n    D = numpy.zeros([2, 2])\n    D[0, 0] = 5\n    with open(c.output(\"cmp\"), \"wb\") as fp:\n        numpy.save(fp, D)\n\n    with open(c.output(\"cmp.labels.txt\"), \"w\") as fp:\n        fp.write(\"a\\nb\\n\")\n\n    c.run_sourmash(\"plot\", \"cmp\", \"--labels\", \"-f\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert c.last_result.status == 0\n\n\ndef test_do_plot_comparison_4_fail_not_distance(runtmp):\n    # plot should fail when not a distance matrix\n    c = runtmp\n\n    D = numpy.zeros([2, 2])\n    D[0, 0] = 5\n    with open(c.output(\"cmp\"), \"wb\") as fp:\n        numpy.save(fp, D)\n\n    with open(c.output(\"cmp.labels.txt\"), \"w\") as fp:\n        fp.write(\"a\\nb\\n\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"plot\", \"cmp\", \"--labels\", fail_ok=True)\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert c.last_result.status != 0\n\n\ndef test_plot_6_labels_default(runtmp):\n    # plot --labels is default\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labels\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\tgenome-s10\n1\\tgenome-s11\n2\\tgenome-s12\n3\\tgenome-s10+s11\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_labels(runtmp):\n    # specifing --labels gives the right result\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labels\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\tgenome-s10\n1\\tgenome-s11\n2\\tgenome-s12\n3\\tgenome-s10+s11\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_indices(runtmp):\n    # test plot --indices\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--indices\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\t1\n1\\t2\n2\\t3\n3\\t4\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_no_labels(runtmp):\n    # test plot --no-labels\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--no-labels\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\t1\n1\\t2\n2\\t3\n3\\t4\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_no_indices(runtmp):\n    # test plot --no-labels\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--no-labels\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\t1\n1\\t2\n2\\t3\n3\\t4\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_no_labels_no_indices(runtmp):\n    # test plot --no-labels --no-indices\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--no-labels\", \"--no-indices\")\n\n    print((runtmp.last_result.out,))\n\n    expected = \"\"\"\\\n0\\t\n1\\t\n2\\t\n3\\t\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_6_indices_labels(runtmp):\n    # check that --labels --indices => --labels\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labels\", \"--indices\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\tgenome-s10\n1\\tgenome-s11\n2\\tgenome-s12\n3\\tgenome-s10+s11\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_override_labeltext(runtmp):\n    # test overriding labeltext\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    with open(runtmp.output(\"new.labels.txt\"), \"w\") as fp:\n        fp.write(\"a\\nb\\nc\\nd\\n\")\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labeltext\", \"new.labels.txt\")\n\n    print(runtmp.last_result.out)\n\n    assert \"loading labels from text file 'new.labels.txt'\" in runtmp.last_result.err\n\n    expected = \"\"\"\\\n0\\ta\n1\\tb\n2\\tc\n3\\td\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_override_labeltext_fail(runtmp):\n    # test failed override of labeltext\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    with open(runtmp.output(\"new.labels.txt\"), \"w\") as fp:\n        fp.write(\"a\\nb\\nc\\n\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"plot\", \"cmp\", \"--labeltext\", \"new.labels.txt\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert runtmp.last_result.status != 0\n    assert \"loading labels from text file 'new.labels.txt'\" in runtmp.last_result.err\n    assert \"3 labels != matrix size, exiting\" in runtmp.last_result.err\n\n\ndef test_plot_reordered_labels_csv(runtmp):\n    # test 'plot --csv' & correct ordering of labels\n    c = runtmp\n\n    ss2 = utils.get_test_data(\"2.fa.sig\")\n    ss47 = utils.get_test_data(\"47.fa.sig\")\n    ss63 = utils.get_test_data(\"63.fa.sig\")\n\n    c.run_sourmash(\"compare\", \"-k\", \"31\", \"-o\", \"cmp\", ss2, ss47, ss63)\n    c.run_sourmash(\"plot\", \"cmp\", \"--csv\", \"neworder.csv\")\n\n    with open(c.output(\"neworder.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n\n        akker_vals = set()\n        for row in r:\n            akker_vals.add(\n                row[\"CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\"]\n            )\n\n        assert \"1.0\" in akker_vals\n        assert \"0.0\" in akker_vals\n        assert len(akker_vals) == 2\n\n\ndef test_plot_reordered_labels_csv_gz(runtmp):\n    # test 'plot --csv' with a .gz output\n    c = runtmp\n\n    ss2 = utils.get_test_data(\"2.fa.sig\")\n    ss47 = utils.get_test_data(\"47.fa.sig\")\n    ss63 = utils.get_test_data(\"63.fa.sig\")\n\n    c.run_sourmash(\"compare\", \"-k\", \"31\", \"-o\", \"cmp\", ss2, ss47, ss63)\n    c.run_sourmash(\"plot\", \"cmp\", \"--csv\", \"neworder.csv.gz\")\n\n    with gzip.open(c.output(\"neworder.csv.gz\"), \"rt\", newline=\"\") as fp:\n        r = csv.DictReader(fp)\n\n        akker_vals = set()\n        for row in r:\n            akker_vals.add(\n                row[\"CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\"]\n            )\n\n        assert \"1.0\" in akker_vals\n        assert \"0.0\" in akker_vals\n        assert len(akker_vals) == 2\n\n\ndef test_plot_subsample_1(runtmp):\n    # test plotting with --subsample\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--subsample\", \"3\")\n\n    print(runtmp.last_result.out)\n\n    expected = \"\"\"\\\n0\\tgenome-s10+s11\n1\\tgenome-s12\n2\\tgenome-s10\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_plot_subsample_2(runtmp):\n    # test plotting --subsample with --subsample-seed\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    runtmp.sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--subsample\", \"3\", \"--subsample-seed=2\")\n\n    print(runtmp.last_result.out)\n    expected = \"\"\"\\\n0\\tgenome-s12\n1\\tgenome-s10+s11\n2\\tgenome-s11\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_compare_and_plot_labels_from_to(runtmp):\n    # test doing compare --labels-to and plot --labels-from.\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    labels_csv = runtmp.output(\"label.csv\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n        \"--labels-to\",\n        labels_csv,\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labels-from\", labels_csv)\n\n    print(runtmp.last_result.out)\n\n    assert \"loading labels from CSV file\" in runtmp.last_result.err\n\n    expected = \"\"\"\\\n0\\tgenome-s10\n1\\tgenome-s11\n2\\tgenome-s12\n3\\tgenome-s10+s11\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_compare_and_plot_labels_from_changed(runtmp):\n    # test 'plot --labels-from' with changed labels\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    labels_csv = utils.get_test_data(\"compare/labels_from-test.csv\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    runtmp.sourmash(\"plot\", \"cmp\", \"--labels-from\", labels_csv)\n\n    print(runtmp.last_result.out)\n\n    assert \"loading labels from CSV file\" in runtmp.last_result.err\n\n    expected = \"\"\"\\\n0\\tgenome-s10-CHANGED\n1\\tgenome-s11-CHANGED\n2\\tgenome-s12-CHANGED\n3\\tgenome-s10+s11-CHANGED\"\"\"\n    assert expected in runtmp.last_result.out\n\n\ndef test_compare_and_plot_labels_from_error(runtmp):\n    # 'plot --labels-from ... --labeltext ...' should fail\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    labels_csv = utils.get_test_data(\"compare/labels_from-test.csv\")\n\n    runtmp.run_sourmash(\n        \"compare\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n        \"-o\",\n        \"cmp\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"plot\",\n            \"cmp\",\n            \"--labels-from\",\n            labels_csv,\n            \"--labeltext\",\n            labels_csv,\n            fail_ok=True,\n        )\n\n    err = runtmp.last_result.err\n    assert \"ERROR: cannot supply both --labeltext and --labels-from\" in err\n\n\n@utils.in_tempdir\ndef test_search_query_sig_does_not_exist(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"search\", \"short2.fa.sig\", \"short.fa.sig\", fail_ok=True)\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert c.last_result.status == -1\n    assert \"Cannot open query file 'short2.fa.sig'\" in c.last_result.err\n    assert len(c.last_result.err.split(\"\\n\\r\")) < 5\n\n\n@utils.in_tempdir\ndef test_search_subject_sig_does_not_exist(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", fail_ok=True)\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert c.last_result.status == -1\n    assert \"Error while reading signatures from 'short2.fa.sig'\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_search_second_subject_sig_does_not_exist(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"search\", \"short.fa.sig\", \"short.fa.sig\", \"short2.fa.sig\", fail_ok=True\n        )\n\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert c.last_result.status == -1\n    assert \"Error while reading signatures from 'short2.fa.sig'.\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_search(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n    assert \"1 matches\" in c.last_result.out\n    assert \"93.0%\" in c.last_result.out\n\n\ndef test_search_ignore_abundance(runtmp):\n    # note: uses num signatures.\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500,abund\", testdata1, testdata2)\n\n    # Make sure there's different percent matches when using or\n    # not using abundance\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n    out1 = runtmp.last_result.out\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"81.5%\" in runtmp.last_result.out\n\n    runtmp.sourmash(\"search\", \"--ignore-abundance\", \"short.fa.sig\", \"short2.fa.sig\")\n    out2 = runtmp.last_result.out\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"93.0%\" in runtmp.last_result.out\n\n    # Make sure results are different!\n    assert out1 != out2\n\n\ndef test_search_abund_subj_flat(runtmp):\n    # test Index.search_abund requires an abund subj\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\"search\", sig47, sig63)\n\n    assert (\n        \"'search_abund' requires subject signatures with abundance information\"\n        in str(exc.value)\n    )\n\n\ndef test_search_abund_csv(runtmp):\n    # test search with abundance signatures, look at CSV output\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=1,abund\", testdata1, testdata2)\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"xxx.csv\")\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"82.7%\" in runtmp.last_result.out\n\n    with open(runtmp.output(\"xxx.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        row = next(r)\n\n        print(row)\n\n        assert float(row[\"similarity\"]) == 0.8266277454288367\n        assert row[\"md5\"] == \"bf752903d635b1eb83c53fe4aae951db\"\n        assert row[\"filename\"].endswith(\"short2.fa.sig\")\n        assert row[\"md5\"] == \"bf752903d635b1eb83c53fe4aae951db\"\n        assert row[\"query_filename\"].endswith(\"short.fa\")\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"9191284a\"\n        assert row[\"filename\"] == \"short2.fa.sig\", row[\"filename\"]\n\n\n@utils.in_tempdir\ndef test_search_csv(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert float(row[\"similarity\"]) == 0.93\n        assert row[\"filename\"].endswith(\"short2.fa.sig\")\n        assert row[\"md5\"] == \"914591cd1130aa915fe0c0c63db8f19d\"\n        assert row[\"query_filename\"].endswith(\"short.fa\")\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"e26a306d\"\n\n\n@utils.in_tempdir\ndef test_search_lca_db(c):\n    # can we do a 'sourmash search' on an LCA database?\n    query = utils.get_test_data(\"47.fa.sig\")\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    c.run_sourmash(\"search\", query, lca_db)\n    print(c)\n    assert \"NC_009665.1 Shewanella baltica OS185, complete genome\" in str(c)\n\n\ndef test_search_query_db_md5(runtmp):\n    # pull a search query out of a database with an md5sum\n    db = utils.get_test_data(\"prot/protein.sbt.zip\")\n    runtmp.run_sourmash(\"search\", db, db, \"--md5\", \"16869d2c8a1\")\n\n    assert \"100.0%       GCA_001593925\" in str(runtmp)\n\n\ndef test_gather_query_db_md5(runtmp, linear_gather, prefetch_gather):\n    # pull a search query out of a database with an md5sum\n    db = utils.get_test_data(\"prot/protein.sbt.zip\")\n    runtmp.run_sourmash(\n        \"gather\", db, db, \"--md5\", \"16869d2c8a1\", linear_gather, prefetch_gather\n    )\n\n    assert \"340.9 kbp    100.0%  100.0%    GCA_001593925\" in str(runtmp)\n\n\ndef test_gather_query_db_md5_ambiguous(runtmp, linear_gather, prefetch_gather):\n    c = runtmp\n    # what if we give an ambiguous md5 prefix?\n    db = utils.get_test_data(\"prot/protein.sbt.zip\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"gather\", db, db, \"--md5\", \"1\", linear_gather, prefetch_gather)\n\n    err = c.last_result.err\n    assert \"Error! Multiple signatures start with md5 '1'\" in err\n\n\ndef test_gather_lca_db(runtmp, linear_gather, prefetch_gather):\n    # can we do a 'sourmash gather' on an LCA database?\n    query = utils.get_test_data(\"47+63.fa.sig\")\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    runtmp.sourmash(\"gather\", query, lca_db, linear_gather, prefetch_gather)\n    print(runtmp)\n    out = runtmp.last_result.out\n\n    assert \"NC_009665.1 Shewanella baltica OS185\" in out\n    assert \"WARNING: final scaled was 10000, vs query scaled of 1000\" in out\n\n\ndef test_gather_csv_output_filename_bug(runtmp, linear_gather, prefetch_gather):\n    c = runtmp\n\n    # check a bug where the database filename in the output CSV was incorrect\n    query = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    lca_db_1 = utils.get_test_data(\"lca/delmont-1.lca.json\")\n    lca_db_2 = utils.get_test_data(\"lca/delmont-2.lca.json\")\n\n    c.run_sourmash(\n        \"gather\",\n        query,\n        lca_db_1,\n        lca_db_2,\n        \"-o\",\n        \"out.csv\",\n        linear_gather,\n        prefetch_gather,\n    )\n    with open(c.output(\"out.csv\")) as fp:\n        r = csv.DictReader(fp)\n        row = next(r)\n        assert row[\"filename\"] == lca_db_1\n\n\ndef test_compare_no_such_file(runtmp):\n    # 'compare' fails on nonexistent files\n    c = runtmp\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"compare\", \"nosuchfile.sig\")\n\n    assert \"Error while reading signatures from 'nosuchfile.sig'.\" in c.last_result.err\n\n\ndef test_compare_no_such_file_force(runtmp):\n    # can still run compare on nonexistent with -f\n    c = runtmp\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"compare\", \"nosuchfile.sig\", \"-f\")\n\n    print(c.last_result.err)\n    assert \"Error while reading signatures from 'nosuchfile.sig'.\"\n\n\ndef test_compare_no_matching_sigs(runtmp):\n    # compare fails when no sketches found with desired ksize\n    c = runtmp\n    query = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.last_result.status, c.last_result.out, c.last_result.err = c.run_sourmash(\n            \"compare\", \"-k\", \"100\", query, fail_ok=True\n        )\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert c.last_result.status\n    assert (\n        \"warning: no signatures loaded at given ksize/molecule type\"\n        in c.last_result.err\n    )\n    assert \"no signatures found! exiting.\" in c.last_result.err\n\n\ndef test_compare_deduce_molecule(runtmp):\n    # deduce DNA vs protein from query, if it is unique\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=10,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"min similarity in matrix: 0.91\" in runtmp.last_result.out\n\n\ndef test_compare_choose_molecule_dna(runtmp):\n    # choose molecule type with --dna, ignoring protein\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=30,num=500\", testdata1, testdata2, \"-o\", \"sigs.zip\"\n    )\n    runtmp.sourmash(\n        \"sketch\",\n        \"translate\",\n        \"-p\",\n        \"k=10,num=500\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"sigs.zip\",\n    )\n    runtmp.sourmash(\"compare\", \"--dna\", \"sigs.zip\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"min similarity in matrix: 0.938\" in runtmp.last_result.out\n\n\ndef test_compare_choose_molecule_protein(runtmp):\n    # choose molecule type with --protein, ignoring DNA\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=30,num=500\", testdata1, testdata2, \"-o\", \"sigs.zip\"\n    )\n    runtmp.sourmash(\n        \"sketch\",\n        \"translate\",\n        \"-p\",\n        \"k=10,num=500\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"sigs.zip\",\n    )\n    runtmp.sourmash(\"compare\", \"--protein\", \"sigs.zip\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"min similarity in matrix: 0.91\" in runtmp.last_result.out\n\n\ndef test_compare_no_choose_molecule_fail(runtmp):\n    # choose molecule type\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=30,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=30,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert \"multiple molecule types loaded; please specify\" in runtmp.last_result.err\n    assert runtmp.last_result.status != 0\n\n\ndef test_compare_deduce_ksize(runtmp):\n    # deduce ksize, if it is unique\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=29,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"compare\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"min similarity in matrix: 0.938\" in runtmp.last_result.out\n\n\ndef test_search_deduce_molecule(runtmp):\n    # deduce DNA vs protein from query, if it is unique\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=10,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"(k=10, protein)\" in runtmp.last_result.err\n\n\ndef test_search_deduce_ksize(runtmp):\n    # deduce ksize from query, if it is unique\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=23,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"k=23\" in runtmp.last_result.err\n\n\ndef test_do_sourmash_index_multik_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=32,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n\n\ndef test_do_sourmash_index_multimol_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=30,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n\n\ndef test_do_sourmash_index_multinum_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=1000\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n    assert (\n        \"trying to build an index with incompatible signatures.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_index_multiscaled_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n    assert (\n        \"trying to build an index with incompatible signatures.\"\n        in runtmp.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_multiscaled_rescale(c):\n    # test sourmash index --scaled\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1)\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata2)\n\n    c.run_sourmash(\n        \"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\", \"--scaled\", \"10\"\n    )\n\n    print(c)\n    assert c.last_result.status == 0\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_multiscaled_rescale_fail(c):\n    # test sourmash index --scaled with invalid rescaling (10 -> 5)\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1)\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata2)\n    # this should fail: cannot go from a scaled value of 10 to 5\n\n    with pytest.raises(SourmashCommandFailed) as e:\n        c.run_sourmash(\n            \"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\", \"--scaled\", \"5\"\n        )\n\n    print(e.value)\n    assert c.last_result.status == -1\n    assert \"new scaled 5 is lower than current sample scaled 10\" in c.last_result.err\n\n\ndef test_do_sourmash_sbt_search_output(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\", \"-o\", \"foo\")\n\n    output = Path(runtmp.output(\"foo\")).read_text()\n    print(output)\n    assert \"e26a306d26512\" in output\n    assert \"914591cd1130aa915\" in output\n\n\n# check against a bug in sbt search triggered by incorrect max Jaccard\n# calculation.\ndef test_do_sourmash_sbt_search_check_bug(runtmp):\n    # mins: 431\n    testdata1 = utils.get_test_data(\"sbt-search-bug/nano.sig\")\n\n    # mins: 6264\n    testdata2 = utils.get_test_data(\"sbt-search-bug/bacteroides.sig\")\n\n    runtmp.sourmash(\"index\", \"zzz\", testdata1, testdata2, \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", testdata1, \"zzz\")\n\n    assert \"1 matches\" in runtmp.last_result.out\n\n    tree = load_sbt_index(runtmp.output(\"zzz.sbt.zip\"))\n    assert tree._nodes[0].metadata[\"min_n_below\"] == 431\n\n\ndef test_do_sourmash_sbt_search_empty_sig(runtmp):\n    # mins: 431\n    testdata1 = utils.get_test_data(\"sbt-search-bug/nano.sig\")\n\n    # mins: 0\n    testdata2 = utils.get_test_data(\"sbt-search-bug/empty.sig\")\n\n    runtmp.sourmash(\"index\", \"zzz\", testdata1, testdata2, \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", testdata1, \"zzz\")\n\n    assert \"1 matches\" in runtmp.last_result.out\n\n    tree = load_sbt_index(runtmp.output(\"zzz.sbt.zip\"))\n    assert tree._nodes[0].metadata[\"min_n_below\"] == 1\n\n\ndef test_do_sourmash_sbt_move_and_search_output(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\n        \"index\", \"zzz.sbt.json\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\"\n    )\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.json\"))\n\n    print(runtmp.last_result.out)\n\n    with open(runtmp.output(\"zzz.sbt.json\")) as fp:\n        d = json.load(fp)\n        assert d[\"storage\"][\"args\"][\"path\"] == \".sbt.zzz\"\n\n    newpath = runtmp.output(\"subdir\")\n    os.mkdir(newpath)\n\n    # move both JSON file and subdirectory.\n    shutil.move(runtmp.output(\"zzz.sbt.json\"), newpath)\n    shutil.move(runtmp.output(\".sbt.zzz\"), newpath)\n\n    status, out, err = utils.runscript(\n        \"sourmash\",\n        [\"search\", \"../short.fa.sig\", \"zzz.sbt.json\", \"-o\", \"foo\"],\n        in_directory=newpath,\n    )\n\n    output = Path(os.path.join(newpath, \"foo\")).read_text()\n    print(output)\n    assert \"914591cd1130aa91\" in output\n    assert \"e26a306d2651\" in output\n\n\ndef test_search_deduce_ksize_and_select_appropriate(runtmp):\n    # deduce ksize from query and select correct signature from DB\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=24,num=500\", testdata1)\n\n    # The DB contains signatres for multiple ksizes\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=23,num=500\", \"-p\", \"k=24,num=500\", testdata2\n    )\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"k=24\" in runtmp.last_result.err\n\n\ndef test_search_deduce_ksize_not_unique(runtmp):\n    # deduce ksize from query, fail because it is not unique\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"translate\",\n        \"-p\",\n        \"k=23,num=500\",\n        \"-p\",\n        \"k=25,num=500\",\n        testdata1,\n        testdata2,\n    )\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n    assert \"2 signatures matching ksize\" in runtmp.last_result.err\n\n\n@utils.in_tempdir\ndef test_search_deduce_ksize_no_match(c):\n    # no matching sigs in search sig list\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=23,num=500\", testdata1)\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=25,num=500\", testdata2)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\")\n    assert \"no compatible signatures found in 'short2.fa.sig'\" in str(exc.value)\n\n\ndef test_search_deduce_ksize_vs_user_specified(runtmp):\n    # user specified ksize is not available\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=23,num=500\", testdata1, testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", \"-k\", \"24\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert runtmp.last_result.status == -1\n    assert \"0 signatures matching ksize\" in runtmp.last_result.err\n\n\ndef test_search_containment(runtmp):\n    # search with --containment in signatures\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata1, testdata2)\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"95.6%\" in runtmp.last_result.out\n\n\ndef test_search_containment_abund(runtmp):\n    \"Construct some signatures with abund, make sure that containment complains\"\n\n    # build minhashes\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=True)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=True)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    # build signatures\n    x = sourmash.SourmashSignature(mh1, name=\"a\")\n    y = sourmash.SourmashSignature(mh2, name=\"b\")\n\n    # save!\n    with open(runtmp.output(\"a.sig\"), \"w\") as fp:\n        signature.save_signatures_to_json([x], fp)\n    with open(runtmp.output(\"b.sig\"), \"w\") as fp:\n        signature.save_signatures_to_json([y], fp)\n\n    # run sourmash search --containment\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\"search\", \"a.sig\", \"b.sig\", \"-o\", \"xxx.csv\", \"--containment\")\n\n    assert (\n        \"ERROR: cannot do containment searches on an abund signature; maybe specify --ignore-abundance?\"\n        in str(exc)\n    )\n\n    # run sourmash search --max-containment\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\n            \"search\", \"a.sig\", \"b.sig\", \"-o\", \"xxx.csv\", \"--max-containment\"\n        )\n\n    assert (\n        \"ERROR: cannot do containment searches on an abund signature; maybe specify --ignore-abundance?\"\n        in str(exc)\n    )\n\n\ndef test_search_containment_abund_ignore(runtmp):\n    \"Construct some signatures with abund, check containment + ignore abund\"\n\n    # build minhashes\n    mh1 = MinHash(0, 21, scaled=1, track_abundance=True)\n    mh2 = MinHash(0, 21, scaled=1, track_abundance=True)\n\n    mh1.add_many((1, 2, 3, 4))\n    mh1.add_many((1, 2))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n    mh2.add_many((1, 5))\n\n    # build signatures\n    x = sourmash.SourmashSignature(mh1, name=\"a\")\n    y = sourmash.SourmashSignature(mh2, name=\"b\")\n\n    # save!\n    with open(runtmp.output(\"a.sig\"), \"w\") as fp:\n        signature.save_signatures_to_json([x], fp)\n    with open(runtmp.output(\"b.sig\"), \"w\") as fp:\n        signature.save_signatures_to_json([y], fp)\n\n    # run sourmash search\n    runtmp.sourmash(\n        \"search\",\n        \"a.sig\",\n        \"b.sig\",\n        \"-o\",\n        \"xxx.csv\",\n        \"--containment\",\n        \"--ignore-abundance\",\n    )\n\n    # check results\n    with open(runtmp.output(\"xxx.csv\")) as fp:\n        r = csv.DictReader(fp)\n        row = next(r)\n        similarity = row[\"similarity\"]\n        print(f\"search output: similarity is {similarity}\")\n    print(mh1.contained_by(mh2))\n\n    assert float(similarity) == mh1.contained_by(mh2)\n    assert float(similarity) == 0.25\n\n\ndef test_search_containment_sbt(runtmp):\n    # search with --containment in an SBT\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\", \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"95.6%\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10(runtmp):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/genome-s10-small.fa.gz.sig\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"16.7%\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10_no_max(run):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/genome-s10-small.fa.gz.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        run.run_sourmash(\"search\", q1, q2, \"--containment\", \"--max-containment\")\n\n    print(run.last_result.out)\n    print(run.last_result.err)\n    assert (\n        \"ERROR: cannot specify both --containment and --max-containment!\"\n        in run.last_result.err\n    )\n\n\ndef test_search_max_containment_s10_pairwise(runtmp):\n    # check --max-containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/genome-s10-small.fa.gz.sig\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--max-containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"100.0%\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10_siglist(runtmp):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/*.sig\")\n    q2 = glob.glob(q2)\n\n    runtmp.sourmash(\"search\", q1, *q2, \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \" 16.7%       ../genome-s10-small.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10+s11.fa.gz\" in runtmp.last_result.out\n\n\ndef test_search_max_containment_s10_siglist(runtmp):\n    # check --max-containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/*.sig\")\n    q2 = glob.glob(q2)\n\n    runtmp.sourmash(\"search\", q1, *q2, \"--max-containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10-small.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10+s11.fa.gz\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10_sbt(runtmp):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10+s11.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10.fa.gz\" in runtmp.last_result.out\n    assert \" 16.7%       ../genome-s10-small.fa.gz\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10_sbt_best_only(runtmp):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--containment\", \"--best-only\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"100.0%       \" in runtmp.last_result.out\n    )  # there are at least two perfect matches!\n\n    assert runtmp.last_result.status == 0\n\n\ndef test_search_containment_s10_sbt_empty(runtmp):\n    # check --containment for s10/s10-small at absurd scaled/empty mh\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--scaled\", \"1e7\", \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"0 matches\" in runtmp.last_result.out\n\n\ndef test_search_max_containment_s10_sbt(runtmp):\n    # check --max-containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--max-containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10-small.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10.fa.gz\" in runtmp.last_result.out\n    assert \"100.0%       ../genome-s10+s11.fa.gz\" in runtmp.last_result.out\n\n\ndef test_search_max_containment_s10_sbt_best_only(runtmp):\n    # check --max-containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--max-containment\", \"--best-only\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n\ndef test_search_max_containment_s10_sbt_empty(runtmp):\n    # check --max-containment for s10/s10-small at absurd scaled/empty mh.\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.sbt.zip\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--scaled\", \"1e7\", \"--max-containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"0 matches\" in runtmp.last_result.out\n\n\ndef test_search_containment_s10_lca(runtmp):\n    # check --containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.lca.json\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \"100.0%       455c2f95\" in runtmp.last_result.out\n    assert \"100.0%       684aa226\" in runtmp.last_result.out\n    assert \" 16.7%       7f7835d2\" in runtmp.last_result.out\n\n\ndef test_search_max_containment_s10_lca(runtmp):\n    # check --max-containment for s10/s10-small\n    q1 = utils.get_test_data(\"scaled/genome-s10.fa.gz.sig\")\n    q2 = utils.get_test_data(\"scaled/all.lca.json\")\n\n    runtmp.sourmash(\"search\", q1, q2, \"--max-containment\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"3 matches\" in runtmp.last_result.out\n    assert \"100.0%       455c2f95\" in runtmp.last_result.out\n    assert \"100.0%       684aa226\" in runtmp.last_result.out\n    assert \"100.0%       7f7835d2\" in runtmp.last_result.out\n\n\ndef test_search_gzip(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    data = Path(runtmp.output(\"short.fa.sig\")).read_bytes()\n    with gzip.open(runtmp.output(\"zzz.gz\"), \"wb\") as fp:\n        fp.write(data)\n\n    data = Path(runtmp.output(\"short2.fa.sig\")).read_bytes()\n    with gzip.open(runtmp.output(\"yyy.gz\"), \"wb\") as fp:\n        fp.write(data)\n\n    runtmp.sourmash(\"search\", \"zzz.gz\", \"yyy.gz\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"93.0%\" in runtmp.last_result.out\n\n\ndef test_search_2(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2, testdata3\n    )\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"short3.fa.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"2 matches\" in runtmp.last_result.out\n    assert \"93.0%\" in runtmp.last_result.out\n    assert \"89.6%\" in runtmp.last_result.out\n\n\ndef test_search_3(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2, testdata3\n    )\n\n    runtmp.sourmash(\n        \"search\", \"-n\", \"1\", \"short.fa.sig\", \"short2.fa.sig\", \"short3.fa.sig\"\n    )\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"2 matches above threshold 0.080; showing first 1:\" in runtmp.last_result.out\n\n\ndef test_search_4(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2, testdata3\n    )\n\n    runtmp.sourmash(\n        \"search\", \"-n\", \"0\", \"short.fa.sig\", \"short2.fa.sig\", \"short3.fa.sig\"\n    )\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"2 matches above threshold 0.080:\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n    assert \"short3.fa\" in runtmp.last_result.out\n\n\ndef test_search_5_num_results(runtmp):\n    query = utils.get_test_data(\"gather/combined.sig\")\n    against = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n\n    runtmp.sourmash(\"search\", \"-n\", \"5\", query, *against)\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert (\n        \"12 matches above threshold 0.080; showing first 5:\" in runtmp.last_result.out\n    )\n\n\ndef test_index_check_scaled_bounds_negative(runtmp):\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"index\",\n            \"zzz\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"-k\",\n            \"31\",\n            \"--scaled\",\n            \"-5\",\n            \"--dna\",\n        )\n\n    print(runtmp.last_result.err)\n\n    assert \"ERROR: scaled value must be positive\" in runtmp.last_result.err\n\n\ndef test_index_check_scaled_bounds_less_than_minimum(runtmp):\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"index\",\n            \"zzz\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"-k\",\n            \"31\",\n            \"--scaled\",\n            \"50\",\n            \"--dna\",\n        )\n\n    assert (\n        \"WARNING: scaled value should be >= 100. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_index_check_scaled_bounds_more_than_maximum(runtmp):\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"index\",\n            \"zzz\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"-k\",\n            \"31\",\n            \"--scaled\",\n            \"1e9\",\n            \"--dna\",\n        )\n\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_index_metagenome_fromfile(c):\n    # test index --from-file\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    # construct a file list\n    with open(c.output(\"sig.list\"), \"w\") as fp:\n        fp.write(\"\\n\".join(testdata_sigs))\n\n    cmd = [\n        \"index\",\n        \"gcf_all\",\n        testdata_sigs[0],\n        \"-k\",\n        \"21\",\n        \"--from-file\",\n        c.output(\"sig.list\"),\n    ]\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"search {query_sig} gcf_all -k 21\"\n    cmd = cmd.split()\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    print(c.last_result.err)\n\n    assert (\n        \" 33.2%       NC_003198.1 Salmonella enterica subsp. enterica serovar T...\"\n        in out\n    )\n    assert \"12 matches above threshold 0.080; showing first 3:\" in out\n\n\n@utils.in_tempdir\ndef test_index_metagenome_fromfile_no_cmdline_sig(c):\n    # test index --from-file\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    # construct a file list\n    with open(c.output(\"sig.list\"), \"w\") as fp:\n        fp.write(\"\\n\".join(testdata_sigs))\n\n    cmd = [\"index\", \"gcf_all\", \"-k\", \"21\", \"--from-file\", c.output(\"sig.list\")]\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"search {query_sig} gcf_all -k 21\"\n    cmd = cmd.split()\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    print(c.last_result.err)\n\n    assert (\n        \" 33.2%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\" in out\n    )\n    assert \"12 matches above threshold 0.080; showing first 3:\" in out\n\n\ndef test_search_metagenome_traverse(runtmp):\n    testdata_dir = utils.get_test_data(\"gather\")\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\"search\", query_sig, testdata_dir, \"-k\", \"21\")\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \" 33.2%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"13 matches above threshold 0.080; showing first 3:\" in runtmp.last_result.out\n    )\n\n\ndef test_search_metagenome_traverse_check_csv(runtmp):\n    # this test confirms that the CSV 'filename' output for signatures loaded\n    # via directory traversal properly contains the actual path to the\n    # signature file from which the signature was loaded.\n    testdata_dir = utils.get_test_data(\"gather\")\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n    out_csv = runtmp.output(\"out.csv\")\n\n    runtmp.sourmash(\"search\", query_sig, testdata_dir, \"-k\", \"21\", \"-o\", out_csv)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(out_csv) as fp:\n        prefix_len = len(testdata_dir)\n        r = csv.DictReader(fp)\n        for row in r:\n            print(row)\n            filename = row[\"filename\"]\n            assert filename.startswith(testdata_dir), filename\n            # should have full path to file sig was loaded from\n            assert len(filename) > prefix_len\n\n    assert (\n        \" 33.2%       NC_003198.1 Salmonella enterica subsp. enterica serovar T\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"13 matches above threshold 0.080; showing first 3:\" in runtmp.last_result.out\n    )\n\n\n@utils.in_thisdir\ndef test_search_incompatible(c):\n    num_sig = utils.get_test_data(\"num/47.fa.sig\")\n    scaled_sig = utils.get_test_data(\"47.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"search\", scaled_sig, num_sig, fail_ok=True)\n    assert c.last_result.status != 0\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert \"no compatible signatures found in \" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_search_traverse_incompatible(c):\n    # build a directory with some signatures in it, search for compatible\n    # signatures.\n    searchdir = c.output(\"searchme\")\n    os.mkdir(searchdir)\n\n    num_sig = utils.get_test_data(\"num/47.fa.sig\")\n    scaled_sig = utils.get_test_data(\"47.fa.sig\")\n    shutil.copyfile(num_sig, c.output(\"searchme/num.sig\"))\n    shutil.copyfile(scaled_sig, c.output(\"searchme/scaled.sig\"))\n\n    c.run_sourmash(\"search\", scaled_sig, c.output(\"searchme\"))\n    assert (\n        \"100.0%       NC_009665.1 Shewanella baltica OS185, complete genome\"\n        in c.last_result.out\n    )\n\n\ndef test_search_check_scaled_bounds_negative(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", query_sig, \"gcf_all\", \"-k\", \"21\", \"--scaled\", \"-5\")\n\n    assert \"ERROR: scaled value must be positive\" in runtmp.last_result.err\n\n\ndef test_search_check_scaled_bounds_less_than_minimum(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", query_sig, \"gcf_all\", \"-k\", \"21\", \"--scaled\", \"50\")\n\n    assert (\n        \"WARNING: scaled value should be >= 100. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_search_check_scaled_bounds_more_than_maximum(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", query_sig, \"gcf_all\", \"-k\", \"21\", \"--scaled\", \"1e9\")\n\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\n# explanation: you cannot downsample a scaled SBT to match a scaled\n# signature, so make sure that when you try such a search, it fails!\n# (you *can* downsample a signature to match an SBT.)\ndef test_search_metagenome_sbt_downsample_fail(runtmp):\n    # test downsample on SBT => failure, with --fail-on-empty-databases\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(runtmp.output(\"gcf_all.sbt.zip\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"search\", query_sig, \"gcf_all\", \"-k\", \"21\", \"--scaled\", \"100000\"\n        )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == -1\n    assert \"ERROR: cannot use 'gcf_all' for this query.\" in runtmp.last_result.err\n    assert (\n        \"search scaled value 100000 is less than database scaled value of 10000\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_search_with_picklist(runtmp):\n    # test 'sourmash search' with picklists\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        *gcf_sigs,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    # these are the different ksizes\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"3 matches\" in out\n    assert \"13.1%       NC_000853.1 Thermotoga\" in out\n    assert \"13.0%       NC_009486.1 Thermotoga\" in out\n    assert \"12.8%       NC_011978.1 Thermotoga\" in out\n\n\ndef test_search_with_picklist_exclude(runtmp):\n    # test 'sourmash search' with picklists\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        *gcf_sigs,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5:exclude\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 9 matches by excluding 9 distinct values\" in err\n    # these are the different ksizes\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"9 matches above threshold 0.080; showing first 3:\" in out\n    assert \"33.2%       NC_003198.1 Salmonella\" in out\n    assert \"33.1%       NC_003197.2 Salmonella\" in out\n    assert \"32.2%       NC_006905.1 Salmonella\" in out\n\n\ndef test_search_with_pattern_include(runtmp):\n    # test 'sourmash search' with --include-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        *gcf_sigs,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--include\",\n        \"thermotoga\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"3 matches\" in out\n    assert \"13.1%       NC_000853.1 Thermotoga\" in out\n    assert \"13.0%       NC_009486.1 Thermotoga\" in out\n    assert \"12.8%       NC_011978.1 Thermotoga\" in out\n\n\ndef test_search_with_pattern_exclude(runtmp):\n    # test 'sourmash search' with --exclude-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        *gcf_sigs,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--exclude\",\n        \"thermotoga\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"9 matches above threshold 0.080; showing first 3:\" in out\n    assert \"33.2%       NC_003198.1 Salmonella\" in out\n    assert \"33.1%       NC_003197.2 Salmonella\" in out\n    assert \"32.2%       NC_006905.1 Salmonella\" in out\n\n\ndef test_search_empty_db_fail(runtmp):\n    # search should fail on empty db with --fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", query, against, against2, \"-k\", \"51\")\n\n    err = runtmp.last_result.err\n    assert \"no compatible signatures found in \" in err\n\n\ndef test_search_empty_db_nofail(runtmp):\n    # search should not fail on empty db with --no-fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    runtmp.sourmash(\n        \"search\", query, against, against2, \"-k\", \"51\", \"--no-fail-on-empty-data\"\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n    print(out)\n    print(err)\n\n    assert \"no compatible signatures found in \" in err\n    assert (\n        \"ksize on this database is 31; this is different from requested ksize of 51\"\n        in err\n    )\n    assert \"loaded 50 total signatures from 2 locations\" in err\n    assert \"after selecting signatures compatible with search, 0 remain.\" in err\n\n\ndef test_mash_csv_to_sig(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa.msh.dump\")\n    testdata2 = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\"import_csv\", testdata1, \"-o\", \"xxx.sig\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=970\", testdata2)\n\n    runtmp.sourmash(\"search\", \"-k\", \"31\", \"short.fa.sig\", \"xxx.sig\")\n\n    print(runtmp.last_result.status, runtmp.last_result.out, runtmp.last_result.err)\n    assert \"1 matches\" in runtmp.last_result.out\n    assert \"100.0%       short.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_index_bad_args(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"index\",\n            \"zzz\",\n            \"short.fa.sig\",\n            \"short2.fa.sig\",\n            \"-k\",\n            \"31\",\n            \"--dna\",\n            \"--protein\",\n        )\n\n    print(runtmp.last_result.out, runtmp.last_result.err)\n    assert (\n        \"cannot specify more than one of --dna/--rna/--nucleotide/--protein/--hp/--dayhoff\"\n        in runtmp.last_result.err\n    )\n    assert runtmp.last_result.status != 0\n\n\ndef test_do_sourmash_sbt_search(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_wrong_ksize(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"translate\",\n        \"-p\",\n        \"k=31,num=500\",\n        \"-p\",\n        \"k=51,num=500\",\n        testdata1,\n        testdata2,\n    )\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", \"-k\", \"51\", \"short.fa.sig\", \"zzz\")\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"ERROR: cannot use 'zzz' for this query.\" in runtmp.last_result.err\n    assert (\n        \"search ksize 51 is different from database ksize 31\" in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sbt_search_multiple(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz2.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\", \"zzz2\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_and_sigs(runtmp):\n    # search an SBT and a signature at same time.\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\", \"short2.fa.sig\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_downsample(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=10\", testdata1, testdata2)\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=31,scaled=5\", \"-o\", \"query.sig\", testdata1\n    )\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"query.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_downsample_2(runtmp):\n    testdata1 = utils.get_test_data(\"lca-root/TARA_MED_MAG_00029.fa.sig\")\n    testdata2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n\n    sbtname = \"foo\"\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", sbtname, testdata2)\n\n    assert runtmp.last_result.status == 0\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"search\", testdata1, sbtname, \"--scaled=100000\", \"--threshold=0.01\"\n        )\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"ERROR: cannot use 'foo' for this query.\" in runtmp.last_result.err\n    assert (\n        \"search scaled value 100000 is less than database scaled value of 2000\"\n        in runtmp.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_abund(c):\n    # 'sourmash index' should flatten signatures w/track_abund.\n    testdata2 = utils.get_test_data(\"lca-root/TOBG_MED-875.fna.gz.sig\")\n\n    with open(testdata2):\n        ss = load_one_signature(testdata2, ksize=31)\n        assert ss.minhash.track_abundance == True\n\n    sbtname = \"foo\"\n\n    c.run_sourmash(\"index\", \"-k\", \"31\", sbtname, testdata2)\n\n    for kk in sourmash.load_file_as_signatures(c.output(sbtname)):\n        assert kk.minhash.track_abundance == False\n\n\ndef test_do_sourmash_index_single(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_selectprot(runtmp):\n    # index should fail when run on signatures with multiple types\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    args = [\"sketch\", \"dna\", \"-p\", \"k=30,num=500\", testdata1, testdata2]\n\n    runtmp.sourmash(*args)\n\n    args = [\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\"]\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert runtmp.last_result.status != 0\n\n\ndef test_do_sourmash_search_multimoltype_query(runtmp):\n    # 'search' should fail if multiple sigs are given as query, due to\n    # multiple molecule types.\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    # first, calculate signatures with multiple molecule types\n    args = [\n        \"sketch\",\n        \"translate\",\n        testdata1,\n        testdata2,\n        \"-p\",\n        \"protein\",\n        \"-p\",\n        \"dayhoff\",\n    ]\n    runtmp.sourmash(*args)\n\n    # now, index one of 'em\n    args = [\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"--protein\"]\n    runtmp.sourmash(*args)\n\n    # output exists, yes?\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    # now, try searching. Should raise error.\n    args = [\"search\", \"short.fa.sig\", \"zzz\"]\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"need exactly one\" in runtmp.last_result.err\n\n\ndef test_do_sourmash_index_traverse(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \".\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n    assert \"loaded 2 sigs; saving SBT under\" in runtmp.last_result.err\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_traverse_force(c):\n    # test loading of files that don't end with .sig with -f\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    outdir = c.output(\"sigs\")\n    os.mkdir(outdir)\n    out1 = os.path.join(outdir, \"short1\")\n    out2 = os.path.join(outdir, \"short2\")\n\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=5\", \"-o\", out1, testdata1)\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=5\", \"-o\", out2, testdata2)\n\n    c.run_sourmash(\"index\", \"-k\", \"31\", \"zzz\", \".\", \"-f\")\n\n    err = c.last_result.err\n    assert os.path.exists(c.output(\"zzz.sbt.zip\"))\n    assert \"loaded 2 sigs; saving SBT under\" in err\n\n    c.run_sourmash(\"search\", out1, \"zzz\")\n\n    out = c.last_result.out\n    print(out)\n\n    assert \"short.fa\" in out\n    assert \"short2.fa\" in out\n\n\ndef test_do_sourmash_index_sparseness(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz.sbt.json\", \".\", \"--sparseness\", \"1.0\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.json\"))\n    assert \"loaded 2 sigs; saving SBT under\" in runtmp.last_result.err\n\n    runtmp.sourmash(\"search\", \"short.fa.sig\", \"zzz.sbt.json\")\n\n    print(runtmp.last_result.out)\n\n    assert len(glob.glob(runtmp.output(\".sbt.zzz/*\"))) == 3\n    assert not glob.glob(runtmp.output(\".sbt.zzz/*internal*\"))\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_combine(runtmp):\n    files = [utils.get_test_data(f) for f in utils.SIG_FILES]\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", *files)\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"sbt_combine\", \"joined\", \"zzz.sbt.zip\", \"zzz.sbt.zip\")\n\n    assert os.path.exists(runtmp.output(\"joined.sbt.zip\"))\n\n    filename = os.path.splitext(os.path.basename(utils.SIG_FILES[0]))[0]\n\n    runtmp.sourmash(\"search\", files[0], \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    # we get notification of signature loading, too - so notify + result.\n    assert runtmp.last_result.out.count(filename) == 1\n\n    runtmp.sourmash(\"search\", files[0], \"joined\")\n\n    print(runtmp.last_result.out)\n\n    assert runtmp.last_result.out.count(filename) == 1\n\n\ndef test_do_sourmash_index_append(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2, testdata3\n    )\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    sbt_name = runtmp.output(\n        \"zzz\",\n    )\n    sig_loc = runtmp.output(\"short3.fa.sig\")\n\n    runtmp.sourmash(\"search\", sig_loc, sbt_name)\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n    assert \"short3.fa\" not in runtmp.last_result.out\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"--append\", \"zzz\", \"short3.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    sbt_name = runtmp.output(\n        \"zzz\",\n    )\n    sig_loc = runtmp.output(\"short3.fa.sig\")\n\n    runtmp.sourmash(\"search\", \"--threshold\", \"0.95\", sig_loc, sbt_name)\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" not in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n    assert \"short3.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_otherdir(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"xxx/zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"xxx/zzz.sbt.zip\"))\n\n    sbt_name = runtmp.output(\n        \"xxx/zzz\",\n    )\n    sig_loc = runtmp.output(\"short.fa.sig\")\n\n    runtmp.sourmash(\"search\", sig_loc, sbt_name)\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n    assert \"short2.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_scaled_vs_num_1(runtmp):\n    # should not work: scaled query against num tree\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1000\", testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    sbt_name = runtmp.output(\n        \"zzz\",\n    )\n    sig_loc = runtmp.output(\"short2.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", sig_loc, sbt_name)\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"ERROR: cannot use '\" in runtmp.last_result.err\n    assert (\n        \"this database was created with 'num' MinHash sketches, not 'scaled'\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sbt_search_scaled_vs_num_2(runtmp):\n    # should not work: num query against scaled tree\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1000\", testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    sbt_name = runtmp.output(\n        \"zzz\",\n    )\n    sig_loc = runtmp.output(\"short.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", sig_loc, sbt_name)\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"ERROR: cannot use '\" in runtmp.last_result.err\n    assert (\n        \"this database was created with 'scaled' MinHash sketches, not 'num'\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sbt_search_scaled_vs_num_3(runtmp):\n    # should not work: scaled query against num signature\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1000\", testdata2)\n\n    sig_loc = runtmp.output(\"short.fa.sig\")\n    sig_loc2 = runtmp.output(\"short2.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", sig_loc, sig_loc2)\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"no compatible signatures found in \" in runtmp.last_result.err\n\n\ndef test_do_sourmash_sbt_search_scaled_vs_num_4(runtmp):\n    # should not work: num query against scaled signature\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1000\", testdata2)\n\n    sig_loc = runtmp.output(\"short.fa.sig\")\n    sig_loc2 = runtmp.output(\"short2.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", sig_loc2, sig_loc)\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"no compatible signatures found in \" in runtmp.last_result.err\n\n\ndef test_do_sourmash_check_search_vs_actual_similarity(runtmp):\n    files = [utils.get_test_data(f) for f in utils.SIG_FILES]\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", *files)\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    os.path.splitext(os.path.basename(utils.SIG_FILES[0]))[0]\n\n    runtmp.sourmash(\"search\", files[0], \"zzz\")\n\n    assert runtmp.last_result.status == 0\n\n\ndef test_do_sourmash_check_sbt_filenames(runtmp):\n    files = [utils.get_test_data(f) for f in utils.SIG_FILES]\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz.sbt.json\", *files)\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.json\"))\n\n    sig_names = set()\n    sig_md5s = set()\n    for f in files:\n        sig = load_one_signature(f)\n        sig_names.add(sig.name)\n        sig_md5s.add(sig.md5sum())\n\n    sbt_files = glob.glob(runtmp.output(\".sbt.zzz/*\"))\n    assert len(sbt_files) == 14\n\n    for f in sbt_files:\n        if \"internal\" in f or f.endswith(\"zzz.manifest.csv\"):\n            continue\n        f = os.path.basename(f)\n        assert f not in sig_names\n        assert f in sig_md5s\n\n\ndef test_do_sourmash_sbt_search_bestonly(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"--best-only\", \"short.fa.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n\n\ndef test_do_sourmash_sbt_search_bestonly_scaled(runtmp):\n    # as currently implemented, the query signature will be automatically\n    # downsampled to match the tree.\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1\", testdata1, testdata2)\n\n    runtmp.sourmash(\n        \"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\", \"--scaled\", \"10\"\n    )\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"search\", \"--best-only\", \"short.fa.sig\", \"zzz\")\n\n    print(runtmp.last_result.out)\n\n    assert \"short.fa\" in runtmp.last_result.out\n\n\ndef test_sbt_search_order_dependence(runtmp):\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.fa.gz\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"k=21,scaled=10000\",\n        \"-p\",\n        \"k=31,scaled=10000\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n    )\n\n    runtmp.sourmash(\n        \"index\",\n        \"-k\",\n        \"21\",\n        \"134\",\n        \"genome-s10+s11.fa.gz.sig\",\n        \"genome-s11.fa.gz.sig\",\n        \"genome-s12.fa.gz.sig\",\n    )\n\n    runtmp.sourmash(\n        \"search\",\n        \"-k\",\n        \"21\",\n        \"genome-s11.fa.gz.sig\",\n        \"134\",\n        \"--best-only\",\n        \"-k\",\n        \"21\",\n        \"--dna\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"100.0%\" in runtmp.last_result.out\n\n\ndef test_sbt_search_order_dependence_2(runtmp):\n    # *should* return the same result as test_sbt_search_order_dependence,\n    # but does not due to a bug.\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.fa.gz\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"k=21,scaled=10000\",\n        \"-p\",\n        \"k=31,scaled=10000\",\n        testdata1,\n        testdata2,\n        testdata3,\n        testdata4,\n    )\n\n    runtmp.sourmash(\n        \"index\",\n        \"-k\",\n        \"21\",\n        \"314\",\n        \"genome-s11.fa.gz.sig\",\n        \"genome-s10+s11.fa.gz.sig\",\n        \"genome-s12.fa.gz.sig\",\n    )\n\n    runtmp.sourmash(\n        \"search\", \"-k\", \"21\", \"genome-s11.fa.gz.sig\", \"314\", \"--best-only\", \"--dna\"\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"100.0%\" in runtmp.last_result.out\n\n\ndef test_compare_with_abundance_1(runtmp):\n    # create two signatures\n    E1 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n    E2 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n\n    E1.add_sequence(\"ATGGA\")\n    E2.add_sequence(\"ATGGA\")\n\n    s1 = signature.SourmashSignature(E1, filename=\"e1\", name=\"e1\")\n    s2 = signature.SourmashSignature(E2, filename=\"e2\", name=\"e2\")\n\n    with open(runtmp.output(\"e1.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s1], f)\n\n    with open(runtmp.output(\"e2.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s2], f)\n\n    runtmp.sourmash(\"search\", \"e1.sig\", \"e2.sig\", \"-k\", \"5\")\n\n    assert \"100.0%\" in runtmp.last_result.out\n\n\ndef test_compare_with_abundance_2(runtmp):\n    # create two signatures\n    E1 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n    E2 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n\n    E1.add_sequence(\"ATGGA\")\n\n    E1.add_sequence(\"ATGGA\")\n    E2.add_sequence(\"ATGGA\")\n\n    s1 = signature.SourmashSignature(E1, filename=\"e1\", name=\"e1\")\n    s2 = signature.SourmashSignature(E2, filename=\"e2\", name=\"e2\")\n\n    with open(runtmp.output(\"e1.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s1], f)\n\n    with open(runtmp.output(\"e2.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s2], f)\n\n    runtmp.sourmash(\"search\", \"e1.sig\", \"e2.sig\", \"-k\", \"5\")\n\n    assert \"100.0%\" in runtmp.last_result.out\n\n\ndef test_compare_with_abundance_3(runtmp):\n    # create two signatures\n    E1 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n    E2 = MinHash(ksize=5, n=5, is_protein=False, track_abundance=True)\n\n    E1.add_sequence(\"ATGGA\")\n    E1.add_sequence(\"GGACA\")\n\n    E1.add_sequence(\"ATGGA\")\n    E2.add_sequence(\"ATGGA\")\n\n    s1 = signature.SourmashSignature(E1, filename=\"e1\", name=\"e1\")\n    s2 = signature.SourmashSignature(E2, filename=\"e2\", name=\"e2\")\n\n    with open(runtmp.output(\"e1.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s1], f)\n\n    with open(runtmp.output(\"e2.sig\"), \"w\") as f:\n        signature.save_signatures_to_json([s2], f)\n\n    runtmp.sourmash(\"search\", \"e1.sig\", \"e2.sig\", \"-k\", \"5\")\n\n    assert \"70.5%\" in runtmp.last_result.out\n\n\ndef test_compare_with_picklist(runtmp):\n    # test 'sourmash compare' with picklists\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"compare\", *gcf_sigs, \"-k\", \"21\", \"--picklist\", f\"{picklist}:md5:md5\"\n    )\n\n    err = runtmp.last_result.err\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    assert \"NC_009486.1 The...\" in out\n    assert \"NC_000853.1 The...\" in out\n    assert \"NC_011978.1 The...\" in out\n\n\ndef test_compare_with_picklist_exclude(runtmp):\n    # test 'sourmash compare' with picklists - exclude\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"compare\", *gcf_sigs, \"-k\", \"21\", \"--picklist\", f\"{picklist}:md5:md5:exclude\"\n    )\n\n    err = runtmp.last_result.err\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"for given picklist, found 9 matches by excluding 9 distinct values\" in err\n\n    assert \"NC_004631.1 Sal...\" in out\n    assert \"NC_006905.1 Sal...\" in out\n    assert \"NC_003198.1 Sal...\" in out\n    assert \"NC_002163.1 Cam...\" in out\n    assert \"NC_011294.1 Sal...\" in out\n\n\ndef test_compare_with_pattern_include(runtmp):\n    # test 'sourmash compare' with --include-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n\n    runtmp.sourmash(\"compare\", *gcf_sigs, \"-k\", \"21\", \"--include\", \"thermotoga\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"NC_009486.1 The...\" in out\n    assert \"NC_000853.1 The...\" in out\n    assert \"NC_011978.1 The...\" in out\n\n\ndef test_compare_with_pattern_exclude(runtmp):\n    # test 'sourmash compare' with picklists - exclude\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n\n    runtmp.sourmash(\"compare\", *gcf_sigs, \"-k\", \"21\", \"--exclude\", \"thermotoga\")\n\n    out = runtmp.last_result.out\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"NC_004631.1 Sal...\" in out\n    assert \"NC_006905.1 Sal...\" in out\n    assert \"NC_003198.1 Sal...\" in out\n    assert \"NC_002163.1 Cam...\" in out\n    assert \"NC_011294.1 Sal...\" in out\n\n\ndef test_gather_csv(runtmp, linear_gather, prefetch_gather):\n    # test 'gather -o csvfile'\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"scaled=10\", \"--name-from-first\", testdata1, testdata2\n    )\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"scaled=10\",\n        \"-o\",\n        \"query.fa.sig\",\n        \"--name-from-first\",\n        testdata2,\n    )\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"-o\",\n        \"foo.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    csv_file = runtmp.output(\"foo.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert float(row[\"intersect_bp\"]) == 910\n        assert float(row[\"unique_intersect_bp\"]) == 910\n        assert float(row[\"remaining_bp\"]) == 0\n        assert float(row[\"f_orig_query\"]) == 1.0\n        assert float(row[\"f_unique_to_query\"]) == 1.0\n        assert float(row[\"f_match\"]) == 1.0\n        assert row[\"filename\"] == \"zzz\"\n        assert row[\"name\"] == \"tr1 4\"\n        assert row[\"md5\"] == \"c9d5a795eeaaf58e286fb299133e1938\"\n        assert row[\"gather_result_rank\"] == \"0\"\n        assert row[\"query_filename\"].endswith(\"short2.fa\")\n        assert row[\"query_name\"] == \"tr1 4\"\n        assert row[\"query_md5\"] == \"c9d5a795\"\n        assert row[\"query_bp\"] == \"910\"\n\n        assert row[\"query_abundance\"] == \"False\"\n        assert row[\"n_unique_weighted_found\"] == \"\"\n\n\ndef test_gather_csv_gz(runtmp, linear_gather, prefetch_gather):\n    # test 'gather -o csvfile.gz'\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"scaled=10\", \"--name-from-first\", testdata1, testdata2\n    )\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"scaled=10\",\n        \"-o\",\n        \"query.fa.sig\",\n        \"--name-from-first\",\n        testdata2,\n    )\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"-o\",\n        \"foo.csv.gz\",\n        \"--threshold-bp=1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    csv_file = runtmp.output(\"foo.csv.gz\")\n\n    with gzip.open(csv_file, \"rt\", newline=\"\") as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert float(row[\"intersect_bp\"]) == 910\n        assert float(row[\"unique_intersect_bp\"]) == 910\n        assert float(row[\"remaining_bp\"]) == 0\n        assert float(row[\"f_orig_query\"]) == 1.0\n        assert float(row[\"f_unique_to_query\"]) == 1.0\n        assert float(row[\"f_match\"]) == 1.0\n        assert row[\"filename\"] == \"zzz\"\n        assert row[\"name\"] == \"tr1 4\"\n        assert row[\"md5\"] == \"c9d5a795eeaaf58e286fb299133e1938\"\n        assert row[\"gather_result_rank\"] == \"0\"\n        assert row[\"query_filename\"].endswith(\"short2.fa\")\n        assert row[\"query_name\"] == \"tr1 4\"\n        assert row[\"query_md5\"] == \"c9d5a795\"\n        assert row[\"query_bp\"] == \"910\"\n\n\ndef test_gather_abund_x_abund(runtmp, prefetch_gather, linear_gather):\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    sig63 = utils.get_test_data(\"track_abund/63.fa.sig\")\n\n    runtmp.sourmash(\"gather\", sig47, sig63, linear_gather, prefetch_gather)\n\n    assert (\n        \"2.5 Mbp       49.2%   48.3%       1.0    NC_011663.1\" in runtmp.last_result.out\n    )\n\n\ndef test_gather_multiple_sbts(runtmp, prefetch_gather, linear_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"zzz2\",\n        \"-o\",\n        \"foo.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n\n\ndef test_gather_multiple_sbts_save_prefetch(runtmp, linear_gather):\n    # test --save-prefetch with multiple databases\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"zzz2\",\n        \"-o\",\n        \"foo.csv\",\n        \"--save-prefetch\",\n        \"out.zip\",\n        \"--threshold-bp=1\",\n        linear_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n\n\ndef test_gather_multiple_sbts_save_prefetch_csv(runtmp, linear_gather):\n    # test --save-prefetch-csv with multiple databases\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"zzz2\",\n        \"-o\",\n        \"foo.csv\",\n        \"--save-prefetch-csv\",\n        \"prefetch.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    assert os.path.exists(runtmp.output(\"prefetch.csv\"))\n    with open(runtmp.output(\"prefetch.csv\")) as f:\n        output = f.read()\n        print((output,))\n        assert \"870,0.925531914893617,0.9666666666666667\" in output\n\n\ndef test_gather_multiple_sbts_save_prefetch_csv_gz(runtmp, linear_gather):\n    # test --save-prefetch-csv to a .gz file, with multiple databases\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"zzz2\",\n        \"-o\",\n        \"foo.csv\",\n        \"--save-prefetch-csv\",\n        \"prefetch.csv.gz\",\n        \"--threshold-bp=1\",\n        linear_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    assert os.path.exists(runtmp.output(\"prefetch.csv.gz\"))\n    with gzip.open(runtmp.output(\"prefetch.csv.gz\"), \"rt\", newline=\"\") as f:\n        output = f.read()\n        print((output,))\n        assert \"870,0.925531914893617,0.9666666666666667\" in output\n\n\ndef test_gather_multiple_sbts_save_prefetch_and_prefetch_csv(runtmp, linear_gather):\n    # test --save-prefetch-csv with multiple databases\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\"index\", \"zzz2\", \"short2.fa.sig\", \"-k\", \"31\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"zzz2\",\n        \"-o\",\n        \"foo.csv\",\n        \"--save-prefetch\",\n        \"out.zip\",\n        \"--save-prefetch-csv\",\n        \"prefetch.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    assert os.path.exists(runtmp.output(\"prefetch.csv\"))\n    with open(runtmp.output(\"prefetch.csv\")) as f:\n        output = f.read()\n        print((output,))\n        assert \"870,0.925531914893617,0.9666666666666667\" in output\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n\n\ndef test_gather_sbt_and_sigs(runtmp, linear_gather, prefetch_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"short2.fa.sig\",\n        \"-o\",\n        \"foo.csv\",\n        linear_gather,\n        prefetch_gather,\n        \"--threshold-bp=1\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n\n\ndef test_gather_file_output(runtmp, linear_gather, prefetch_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=10\", \"-o\", \"query.fa.sig\", testdata2)\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"--threshold-bp=500\",\n        linear_gather,\n        prefetch_gather,\n        \"-o\",\n        \"foo.out\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    with open(runtmp.output(\"foo.out\")) as f:\n        output = f.read()\n        print((output,))\n        assert \"910,1.0,1.0\" in output\n\n\ndef test_gather_f_match_orig(runtmp, linear_gather, prefetch_gather):\n    import copy\n\n    testdata_combined = utils.get_test_data(\"gather/combined.sig\")\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    runtmp.sourmash(\n        \"gather\",\n        testdata_combined,\n        \"-o\",\n        \"out.csv\",\n        *testdata_sigs,\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    combined_sig = load_one_signature(testdata_combined, ksize=21)\n    remaining_mh = combined_sig.minhash.to_mutable()\n\n    def approx_equal(a, b, n=5):\n        return round(a, n) == round(b, n)\n\n    with open(runtmp.output(\"out.csv\")) as fp:\n        r = csv.DictReader(fp)\n        for n, row in enumerate(r):\n            print(n, row[\"f_match\"], row[\"f_match_orig\"])\n\n            # each match is completely in the original query\n            assert row[\"f_match_orig\"] == \"1.0\"\n\n            # double check -- should match 'search --containment'.\n            # (this is kind of useless for a 1.0 contained_by, I guess)\n            filename = row[\"filename\"]\n            print(\"trying load from:\", row[\"filename\"])\n            match = load_one_signature(filename, ksize=21)\n            assert match.contained_by(combined_sig) == 1.0\n\n            # check other fields, too.\n            f_orig_query = float(row[\"f_orig_query\"])\n            f_match_orig = float(row[\"f_match_orig\"])\n            f_match = float(row[\"f_match\"])\n            f_unique_to_query = float(row[\"f_unique_to_query\"])\n\n            # f_orig_query is the containment of the query by the match.\n            # (note, this only works because containment is 100% in combined).\n            assert approx_equal(combined_sig.contained_by(match), f_orig_query)\n\n            # just redoing above, for completeness; this is always 1.0 for\n            # this data set.\n            assert approx_equal(match.contained_by(combined_sig), f_match_orig)\n\n            # f_match is how much of the match is in the unallocated hashes\n            assert approx_equal(match.minhash.contained_by(remaining_mh), f_match)\n\n            # f_unique_to_query is how much of the match is unique wrt\n            # the original query.\n            a = set(remaining_mh.hashes.keys())\n            b = set(match.minhash.hashes.keys())\n            n_intersect = len(a.intersection(b))\n            f_intersect = n_intersect / float(len(combined_sig.minhash))\n            assert approx_equal(f_unique_to_query, f_intersect)\n\n            # now, subtract current match from remaining... and iterate!\n            remaining_mh.remove_many(match.minhash.hashes.keys())\n\n\ndef test_gather_nomatch(runtmp, linear_gather, prefetch_gather):\n    testdata_query = utils.get_test_data(\n        \"gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\"\n    )\n    testdata_match = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    out_csv = runtmp.output(\"results.csv\")\n\n    runtmp.sourmash(\n        \"gather\",\n        testdata_query,\n        testdata_match,\n        \"-o\",\n        out_csv,\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in runtmp.last_result.err\n    assert not os.path.exists(out_csv)\n\n\ndef test_gather_nomatch_create_empty(runtmp, linear_gather, prefetch_gather):\n    testdata_query = utils.get_test_data(\n        \"gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\"\n    )\n    testdata_match = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    out_csv = runtmp.output(\"results.csv\")\n\n    runtmp.sourmash(\n        \"gather\",\n        testdata_query,\n        testdata_match,\n        \"-o\",\n        out_csv,\n        \"--create-empty-results\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in runtmp.last_result.err\n    assert os.path.exists(out_csv)\n\n    with open(out_csv) as fp:\n        data = fp.read()\n        assert not data\n\n\ndef test_gather_abund_nomatch(runtmp, linear_gather, prefetch_gather):\n    testdata_query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    testdata_match = utils.get_test_data(\n        \"gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\"\n    )\n\n    runtmp.sourmash(\n        \"gather\", testdata_query, testdata_match, linear_gather, prefetch_gather\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in runtmp.last_result.err\n\n\ndef test_gather_metagenome_3_thermo(runtmp):\n    # test gather matches in more detail.\n    match1 = \"gather/GCF_000016785.1_ASM1678v1_genomic.fna.gz.sig\"\n    match2 = \"gather/GCF_000018945.1_ASM1894v1_genomic.fna.gz.sig\"\n    match3 = \"gather/GCF_000008545.1_ASM854v1_genomic.fna.gz.sig\"\n\n    match1 = utils.get_test_data(match1)\n    match2 = utils.get_test_data(match2)\n    match3 = utils.get_test_data(match3)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        match1,\n        match2,\n        match3,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp=0\",\n        \"-o\",\n        \"match3.csv\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    outfile = runtmp.output(\"match3.csv\")\n    with sourmash_args.FileInputCSV(outfile) as r:\n        rows = list(r)\n\n    assert len(rows) == 3\n\n    # first row\n    row = rows[0]\n    assert row[\"name\"].startswith(\"NC_000853.1 \")\n    f_match = float(row[\"f_match\"])\n    f_unique_to_query = round(float(row[\"f_unique_to_query\"]), 5)\n    unique_intersect_bp = int(row[\"unique_intersect_bp\"])\n    remaining_bp = int(row[\"remaining_bp\"])\n    assert f_match == 1.0\n    assert f_unique_to_query == round(0.13096862, 5)\n    assert unique_intersect_bp == 1920000\n    assert remaining_bp == 12740000\n\n    # second row\n    row = rows[1]\n    assert row[\"name\"].startswith(\"NC_011978.1 \")\n    f_match = float(row[\"f_match\"])\n    f_unique_to_query = round(float(row[\"f_unique_to_query\"]), 5)\n    unique_intersect_bp = int(row[\"unique_intersect_bp\"])\n    remaining_bp = int(row[\"remaining_bp\"])\n    assert round(f_match, 5) == round(0.898936170212766, 5)\n    assert f_unique_to_query == round(0.115279, 5)\n    assert unique_intersect_bp == 1690000\n    assert remaining_bp == 11050000\n\n    # third row\n    row = rows[2]\n    assert row[\"name\"].startswith(\"NC_009486.1 \")\n    f_match = float(row[\"f_match\"])\n    f_unique_to_query = round(float(row[\"f_unique_to_query\"]), 5)\n    unique_intersect_bp = int(row[\"unique_intersect_bp\"])\n    remaining_bp = int(row[\"remaining_bp\"])\n    assert round(f_match, 5) == round(0.4842105, 5)\n    assert f_unique_to_query == round(0.0627557, 5)\n    assert unique_intersect_bp == 920000\n    assert remaining_bp == 10130000\n\n\ndef test_multigather_metagenome(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(runtmp.output(\"gcf_all.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"multigather\",\n        \"--query\",\n        query_sig,\n        \"--db\",\n        \"gcf_all\",\n        \"-k\",\n        \"21\",\n        \"--threshold-bp=0\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in runtmp.last_result.out,\n            \"NC_011294.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_multigather_metagenome_scaled(runtmp):\n    # does multigather properly downsample query sketches with --scaled?\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all.rocksdb\"]\n    cmd.extend(testdata_sigs)\n    # rocksdb will complain if scaled does not match\n    cmd.extend([\"-k\", \"21\", \"-F\", \"rocksdb\", \"--scaled\", \"100_000\"])\n\n    runtmp.sourmash(*cmd)\n\n    assert os.path.exists(runtmp.output(\"gcf_all.rocksdb\"))\n\n    runtmp.sourmash(\n        \"multigather\",\n        \"--query\",\n        query_sig,\n        \"--db\",\n        \"gcf_all.rocksdb\",\n        \"-k\",\n        \"21\",\n        \"--scaled\",\n        \"100_000\",\n        \"--threshold-bp=0\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_multigather_check_scaled_bounds_negative(runtmp):\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    cmd = f\"multigather --query {query_sig} --db gcf_all -k 21 --scaled -5 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(*cmd)\n\n    assert \"ERROR: scaled value must be positive\" in str(exc.value)\n\n\ndef test_multigather_check_scaled_bounds_less_than_minimum(runtmp):\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    cmd = f\"multigather --query {query_sig} --db gcf_all -k 21 --scaled 50 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    # Note: this is the value error that is emitted, but we want the Warning from below to be generated instead. (ValueError: new scaled 50.0 is lower than current sample scaled 10000)\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(*cmd)\n\n    assert \"WARNING: scaled value should be >= 100. Continuing anyway.\" in str(\n        exc.value\n    )\n\n\ndef test_multigather_check_scaled_bounds_more_than_maximum(runtmp):\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    cmd = f\"multigather --query {query_sig} --db gcf_all -k 21 --scaled 1e9 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n\n    c.run_sourmash(*cmd)\n\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in c.last_result.err\n    )\n\n\ndef test_multigather_metagenome_query_from_file(runtmp):\n    # test multigather --query-from-file\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    # make list w/query sig\n    query_list = c.output(\"query.list\")\n    with open(query_list, \"w\") as fp:\n        print(query_sig, file=fp)\n\n    cmd = f\"multigather --query-from-file {query_list} --db gcf_all -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"found 12 matches total\" in out\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in out,\n            \"NC_003198.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in out,\n            \"NC_011294.1 Salmonella enterica subsp\" in out,\n        )\n    )\n\n\ndef test_multigather_metagenome_output(runtmp):\n    # test multigather CSV output has more than one output line\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"multigather --query {query_sig} --db gcf_all -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    output_csv = runtmp.output(\"b92dbf45dd57867cbec2321ccfa55af8.csv\")\n    assert os.path.exists(output_csv)\n    with open(output_csv, newline=\"\") as fp:\n        x = fp.readlines()\n        assert len(x) == 13\n\n\ndef test_multigather_metagenome_output_outdir(runtmp):\n    # test multigather CSV output to different location\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    # create output directory\n    outdir = runtmp.output(\"savehere\")\n    os.mkdir(outdir)\n\n    cmd = f\"multigather --query {query_sig} --db gcf_all -k 21 --threshold-bp=0 --output-dir {outdir}\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    output_csv = runtmp.output(\"savehere/b92dbf45dd57867cbec2321ccfa55af8.csv\")\n    assert os.path.exists(output_csv)\n    with open(output_csv, newline=\"\") as fp:\n        x = fp.readlines()\n        assert len(x) == 13\n\n\ndef test_multigather_metagenome_query_with_sbt(runtmp):\n    # multigather should work with an SBT as a query\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = \"multigather --query gcf_all.sbt.zip --db gcf_all.sbt.zip -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 12 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    assert all(\n        (\n            \"4.7 Mbp      100.0%  100.0%\" in out,\n            \"NC_011080.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"4.5 Mbp      100.0%  100.0%\" in out,\n            \"NC_004631.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.6 Mbp      100.0%  100.0%\" in out,\n            \"NC_002163.1 Campylobacter jejuni subs\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.9 Mbp      100.0%  100.0%\" in out,\n            \"NC_000853.1 Thermotoga maritima MSB8 \" in out,\n        )\n    )\n\n\ndef test_multigather_metagenome_query_with_lca(runtmp):\n    # make sure that LCA databases can be used as queries\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"47*.fa.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    cmd = [\"index\", \"47+63.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"31\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"47+63.sbt.zip\"))\n\n    cmd = f\"multigather --query {lca_db} --db 47+63.sbt.zip -k 31 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 2 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    #    assert '5.1 Mbp      100.0%   64.9%    491c0a81'  in out\n    assert \"5.5 Mbp      100.0%   69.4%    491c0a81\" in out\n\n\ndef test_multigather_metagenome_query_on_lca_db(runtmp):\n    # test multigather against LCA databases\n    c = runtmp\n\n    testdata_sig1 = utils.get_test_data(\"47.fa.sig\")\n    testdata_sig2 = utils.get_test_data(\"63.fa.sig\")\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    cmd = f\"multigather --query {testdata_sig1} {testdata_sig2} --db {lca_db} -k 31 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 2 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    assert all(\n        (\n            \"5.1 Mbp      100.0%  100.0%\" in out,\n            \"NC_009665.1 Shewanella baltica OS185,\" in out,\n        )\n    )\n    assert all(\n        (\n            \"5.5 Mbp      100.0%  100.0%\" in out,\n            \"NC_011663.1 Shewanella baltica OS223,\" in out,\n        )\n    )\n\n\ndef test_multigather_metagenome_query_with_sbt_addl_query(runtmp):\n    # throw in an additional (duplicate) query\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    another_query = utils.get_test_data(\n        \"gather/GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\"\n    )\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"multigather --query {another_query} gcf_all.sbt.zip --db gcf_all.sbt.zip -k 21 --threshold-bp=0 --force-allow-overwrite-output\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 13 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    # check for matches to some of the sbt signatures\n    assert all(\n        (\n            \"4.7 Mbp      100.0%  100.0%\" in out,\n            \"NC_011080.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"4.5 Mbp      100.0%  100.0%\" in out,\n            \"NC_004631.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.6 Mbp      100.0%  100.0%\" in out,\n            \"NC_002163.1 Campylobacter jejuni subs\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.9 Mbp      100.0%  100.0%\" in out,\n            \"NC_000853.1 Thermotoga maritima MSB8 \" in out,\n        )\n    )\n\n    # check additional query sig\n    assert all(\n        (\n            \"4.9 Mbp      100.0%  100.0%\" in out,\n            \"NC_003198.1 Salmonella enterica subsp\" in out,\n        )\n    )\n\n\ndef test_multigather_metagenome_query_with_sbt_addl_query_fail_overwrite(runtmp):\n    # provide multiple identical queries - fails\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    another_query = utils.get_test_data(\n        \"gather/GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\"\n    )\n\n    utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"multigather --query {another_query} {another_query} --db gcf_all.sbt.zip -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert (\n        \"ERROR: detected overwritten outputs! 'GCF_000195995.1_ASM19599v1_genomic.fna.gz' has already been used. Failing.\"\n        in err\n    )\n\n\ndef test_multigather_metagenome_query_with_sbt_addl_query_fail_overwrite_force(runtmp):\n    # provide multiple identical queries - fails -> overwrite with --force\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    another_query = utils.get_test_data(\n        \"gather/GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\"\n    )\n\n    utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    cmd = f\"multigather --query {another_query} {another_query} --db gcf_all.sbt.zip -k 21 --threshold-bp=0 --force-allow-overwrite-output\"\n    cmd = cmd.split(\" \")\n\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert (\n        \"ERROR: detected overwritten outputs! 'GCF_000195995.1_ASM19599v1_genomic.fna.gz' has already been used. Failing.\"\n        in err\n    )\n    assert \"continuing because --force-allow-overwrite was specified\" in err\n\n\ndef test_multigather_metagenome_sbt_query_from_file_with_addl_query(runtmp):\n    # test what happens when we use SBT in a from-file.\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    another_query = utils.get_test_data(\n        \"gather/GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\"\n    )\n\n    testdata_sigs.remove(another_query)\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    # make list w/query sbt\n    query_list = c.output(\"query.list\")\n    with open(query_list, \"w\") as fp:\n        print(\"gcf_all.sbt.zip\", file=fp)\n\n    cmd = f\"multigather --query {another_query} --query-from-file {query_list} --db gcf_all.sbt.zip {another_query} -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 12 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    # check for matches to some of the sbt signatures\n    assert all(\n        (\n            \"4.7 Mbp      100.0%  100.0%\" in out,\n            \"NC_011080.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"4.5 Mbp      100.0%  100.0%\" in out,\n            \"NC_004631.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.6 Mbp      100.0%  100.0%\" in out,\n            \"NC_002163.1 Campylobacter jejuni subs\" in out,\n        )\n    )\n    assert all(\n        (\n            \"1.9 Mbp      100.0%  100.0%\" in out,\n            \"NC_000853.1 Thermotoga maritima MSB8 \" in out,\n        )\n    )\n\n    # check additional query sig\n    assert all(\n        (\n            \"4.9 Mbp      100.0%  100.0%\" in out,\n            \"NC_003198.1 Salmonella enterica subsp\" in out,\n        )\n    )\n\n\ndef test_multigather_metagenome_sbt_query_from_file_incorrect(runtmp):\n    # use the wrong type of file with --query-from-file\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    # incorrectly query with sbt using `--query-from-file`\n    cmd = \"multigather --query-from-file gcf_all.sbt.zip --db gcf_all.sbt.zip -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(*cmd)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n\ndef test_multigather_metagenome_lca_query_from_file(runtmp):\n    # putting an LCA database in a file for a query should work\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"47*.fa.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    lca_db = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    cmd = [\"index\", \"47+63.sbt.zip\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"31\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"47+63.sbt.zip\"))\n\n    # make list w/query sig\n    query_list = c.output(\"query.list\")\n    with open(query_list, \"w\") as fp:\n        print(lca_db, file=fp)\n\n    cmd = f\"multigather --query-from-file {query_list} --db 47+63.sbt.zip -k 31 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    assert \"conducted gather searches on 2 signatures\" in err\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    #    assert '5.1 Mbp      100.0%   64.9%    491c0a81'  in out\n    assert \"5.5 Mbp      100.0%   69.4%    491c0a81\" in out\n\n\ndef test_multigather_metagenome_query_from_file_with_addl_query(runtmp):\n    # test multigather --query-from-file and --query too\n    c = runtmp\n\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = [\"index\", \"gcf_all\"]\n    cmd.extend(testdata_sigs)\n    cmd.extend([\"-k\", \"21\"])\n    c.run_sourmash(*cmd)\n\n    assert os.path.exists(c.output(\"gcf_all.sbt.zip\"))\n\n    # make list w/query sig\n    query_list = c.output(\"query.list\")\n    with open(query_list, \"w\") as fp:\n        print(query_sig, file=fp)\n\n    another_query = utils.get_test_data(\n        \"gather/GCF_000195995.1_ASM19599v1_genomic.fna.gz.sig\"\n    )\n\n    cmd = f\"multigather --query-from-file {query_list} --query {another_query} --db gcf_all -k 21 --threshold-bp=0\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    out = c.last_result.out\n    print(out)\n    err = c.last_result.err\n    print(err)\n\n    # first gather query\n    assert \"found 12 matches total\" in out\n    assert \"the recovered matches hit 100.0% of the query\" in out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in out,\n            \"NC_003198.1 Salmonella enterica subsp\" in out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in out,\n            \"NC_011294.1 Salmonella enterica subsp\" in out,\n        )\n    )\n\n    # second gather query\n    assert \"4.9 Mbp      100.0%  100.0%    NC_003198.1 Salmonella enterica subsp\" in out\n    assert \"found 1 matches total;\" in out\n    assert \"the recovered matches hit 100.0% of the query\" in out\n\n\ndef test_multigather_metagenome_output_unique_empty_filename(runtmp):\n    # test multigather CSV output with -U/--output-add-query-md5sum\n    # NOTE: source file of 'combined.sig' is '-'\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    testdata_sigs_arg = \" \".join(testdata_sigs)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    cmd = f\"multigather --query {query_sig} --db {testdata_sigs_arg} -k 21 --threshold-bp=0 -U\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    output_csv = runtmp.output(\"b92dbf45dd57867cbec2321ccfa55af8.csv\")\n    assert os.path.exists(output_csv)\n    with open(output_csv, newline=\"\") as fp:\n        x = fp.readlines()\n        assert len(x) == 13\n\n\ndef test_multigather_metagenome_output_unique(runtmp):\n    # test multigather CSV output with -U/--output-add-query-md5sum\n    # with a file that has a filename ;)\n    c = runtmp\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    testdata_sigs_arg = \" \".join(testdata_sigs)\n\n    # change 'filename' on 'combined.sig' to something else\n    orig_query_sig = utils.get_test_data(\"gather/combined.sig\")\n    sketch = load_one_signature(orig_query_sig)\n    ss = signature.SourmashSignature(sketch.minhash, filename=\"named_query\")\n\n    query_sig = runtmp.output(\"the_query.sig\")\n    with open(query_sig, \"w\") as f:\n        signature.save_signatures_to_json([ss], f)\n\n    cmd = f\"multigather --query {query_sig} --db {testdata_sigs_arg} -k 21 --threshold-bp=0 -U\"\n    cmd = cmd.split(\" \")\n    c.run_sourmash(*cmd)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # check that output filename has 'named_query' and md5sum in it:\n    output_csv = runtmp.output(\"named_query.b92dbf45dd57867cbec2321ccfa55af8.csv\")\n    assert os.path.exists(output_csv)\n    with open(output_csv, newline=\"\") as fp:\n        x = fp.readlines()\n        assert len(x) == 13\n\n\ndef test_gather_metagenome_traverse(runtmp, linear_gather, prefetch_gather):\n    # set up a directory $location/gather that contains\n    # everything in the 'tests/test-data/gather' directory\n    # *except* the query sequence, which is 'combined.sig'.\n    testdata_dir = utils.get_test_data(\"gather\")\n    copy_testdata = runtmp.output(\"somesigs\")\n    shutil.copytree(testdata_dir, copy_testdata)\n    os.unlink(os.path.join(copy_testdata, \"combined.sig\"))\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    # now, feed in the new directory --\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        copy_testdata,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp=0\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in runtmp.last_result.out,\n            \"NC_011294.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_metagenome_traverse_check_csv(runtmp, linear_gather, prefetch_gather):\n    # this test confirms that the CSV 'filename' output for signatures loaded\n    # via directory traversal properly contains the actual path to the\n    # signature file from which the signature was loaded.\n    # set up a directory $location/gather that contains\n    # everything in the 'tests/test-data/gather' directory\n    # *except* the query sequence, which is 'combined.sig'.\n    testdata_dir = utils.get_test_data(\"gather\")\n    copy_testdata = runtmp.output(\"somesigs\")\n    shutil.copytree(testdata_dir, copy_testdata)\n    os.unlink(os.path.join(copy_testdata, \"combined.sig\"))\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n    out_csv = runtmp.output(\"out.csv\")\n\n    # now, feed in the new directory --\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        copy_testdata,\n        \"-k\",\n        \"21\",\n        \"--threshold-bp=0\",\n        \"-o\",\n        out_csv,\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    with open(out_csv) as fp:\n        prefix_len = len(copy_testdata)\n        r = csv.DictReader(fp)\n        for row in r:\n            filename = row[\"filename\"]\n            assert filename.startswith(copy_testdata), filename\n            # should have full path to file sig was loaded from\n            assert len(filename) > prefix_len\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.7 Mbp        0.5%    1.5%\" in runtmp.last_result.out,\n            \"NC_011294.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n\n@utils.in_tempdir\ndef test_gather_traverse_incompatible(c):\n    searchdir = c.output(\"searchme\")\n    os.mkdir(searchdir)\n\n    num_sig = utils.get_test_data(\"num/47.fa.sig\")\n    scaled_sig = utils.get_test_data(\"47.fa.sig\")\n    shutil.copyfile(num_sig, c.output(\"searchme/num.sig\"))\n    shutil.copyfile(scaled_sig, c.output(\"searchme/scaled.sig\"))\n\n    c.run_sourmash(\"gather\", scaled_sig, c.output(\"searchme\"))\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert (\n        \"5.2 Mbp      100.0%  100.0%    NC_009665.1 Shewanella baltica OS185,\"\n        in c.last_result.out\n    )\n\n\ndef test_gather_metagenome_output_unassigned(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF_000195995*g\")\n    testdata_sigs = glob.glob(testdata_glob)[0]\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        testdata_sigs,\n        \"-k\",\n        \"21\",\n        \"--output-unassigned=unassigned.sig\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 33.2% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n    # now examine unassigned\n    testdata2_glob = utils.get_test_data(\"gather/GCF_000009505.1*.sig\")\n    testdata2_sigs = glob.glob(testdata2_glob)[0]\n\n    runtmp.sourmash(\n        \"gather\", \"unassigned.sig\", testdata_sigs, testdata2_sigs, \"-k\", \"21\"\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert all(\n        (\n            \"1.3 Mbp       13.6%   28.2%\" in runtmp.last_result.out,\n            \"NC_011294.1\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_metagenome_output_unassigned_as_zip(runtmp):\n    testdata_glob = utils.get_test_data(\"gather/GCF_000195995*g\")\n    testdata_sigs = glob.glob(testdata_glob)[0]\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        testdata_sigs,\n        \"-k\",\n        \"21\",\n        \"--output-unassigned=unassigned.sig.zip\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 1 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 33.2% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n    assert zipfile.is_zipfile(runtmp.output(\"unassigned.sig.zip\"))\n\n    # now examine unassigned\n    testdata2_glob = utils.get_test_data(\"gather/GCF_000009505.1*.sig\")\n    testdata2_sigs = glob.glob(testdata2_glob)[0]\n\n    runtmp.sourmash(\n        \"gather\", \"unassigned.sig.zip\", testdata_sigs, testdata2_sigs, \"-k\", \"21\"\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert all(\n        (\n            \"1.3 Mbp       13.6%   28.2%\" in runtmp.last_result.out,\n            \"NC_011294.1\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_metagenome_output_unassigned_none(runtmp):\n    # test what happens when there's nothing unassigned to output\n    testdata_glob = utils.get_test_data(\"gather/GCF_*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        query_sig,\n        *testdata_sigs,\n        \"-k\",\n        \"21\",\n        \"--output-unassigned=unassigned.sig\",\n        \"--threshold=0\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 12 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 100.0% of the query\" in runtmp.last_result.out\n    assert all(\n        (\n            \"4.9 Mbp       33.2%  100.0%\" in runtmp.last_result.out,\n            \"NC_003198.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n    assert all(\n        (\n            \"4.5 Mbp        0.1%    0.4%\" in runtmp.last_result.out,\n            \"NC_004631.1 Salmonella enterica subsp\" in runtmp.last_result.out,\n        )\n    )\n\n    # now examine unassigned\n    assert not os.path.exists(runtmp.output(\"unassigned.sig\"))\n    assert (\n        \"no unassigned hashes to save with --output-unassigned!\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_gather_metagenome_output_unassigned_nomatches(\n    runtmp, prefetch_gather, linear_gather\n):\n    c = runtmp\n\n    # test --output-unassigned when there are no matches\n    query_sig = utils.get_test_data(\"2.fa.sig\")\n    against_sig = utils.get_test_data(\"47.fa.sig\")\n\n    c.run_sourmash(\n        \"gather\",\n        query_sig,\n        against_sig,\n        \"--output-unassigned\",\n        \"foo.sig\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(c.last_result.out)\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in c.last_result.err\n\n    x = load_one_signature(query_sig, ksize=31)\n    y = load_one_signature(c.output(\"foo.sig\"))\n\n    assert x.minhash == y.minhash\n\n\ndef test_gather_metagenome_output_unassigned_nomatches_protein(\n    runtmp, linear_gather, prefetch_gather\n):\n    c = runtmp\n\n    # test --output-unassigned with protein signatures\n    query_sig = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n    against_sig = utils.get_test_data(\n        \"prot/protein/GCA_001593935.1_ASM159393v1_protein.faa.gz.sig\"\n    )\n\n    c.run_sourmash(\n        \"gather\",\n        query_sig,\n        against_sig,\n        \"--output-unassigned\",\n        \"foo.sig\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(c.last_result.out)\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in c.last_result.err\n\n    c.run_sourmash(\"sig\", \"describe\", c.output(\"foo.sig\"))\n    print(c.last_result.out)\n\n    x = load_one_signature(query_sig, ksize=19)\n    y = load_one_signature(c.output(\"foo.sig\"))\n\n    assert x.minhash == y.minhash\n    assert y.minhash.moltype == \"protein\"\n\n\ndef test_gather_check_scaled_bounds_negative(runtmp, prefetch_gather, linear_gather):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\",\n            query_sig,\n            prefetch_gather,\n            linear_gather,\n            \"gcf_all\",\n            \"-k\",\n            \"21\",\n            \"--scaled\",\n            \"-5\",\n            \"--threshold-bp\",\n            \"50000\",\n        )\n\n    assert \"ERROR: scaled value must be positive\" in runtmp.last_result.err\n\n\ndef test_gather_check_scaled_bounds_less_than_minimum(\n    runtmp, prefetch_gather, linear_gather\n):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\",\n            query_sig,\n            prefetch_gather,\n            linear_gather,\n            \"gcf_all\",\n            \"-k\",\n            \"21\",\n            \"--scaled\",\n            \"50\",\n            \"--threshold-bp\",\n            \"50000\",\n        )\n\n    assert (\n        \"WARNING: scaled value should be >= 100. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_gather_check_scaled_bounds_more_than_maximum(\n    runtmp, prefetch_gather, linear_gather\n):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\",\n            query_sig,\n            prefetch_gather,\n            linear_gather,\n            \"-k\",\n            \"21\",\n            \"--scaled\",\n            \"1e9\",\n            \"--threshold-bp\",\n            \"50000\",\n        )\n\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_gather_query_downsample(runtmp, linear_gather, prefetch_gather):\n    # check that query sig gets properly downsampled\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    print(testdata_sigs)\n\n    query_sig = utils.get_test_data(\"GCF_000006945.2-s500.sig\")\n\n    runtmp.sourmash(\n        \"gather\", \"-k\", \"31\", linear_gather, prefetch_gather, query_sig, *testdata_sigs\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    err = runtmp.last_result.err\n\n    assert \"loaded 36 total signatures from 12 locations.\" in err\n    assert \"after selecting signatures compatible with search, 12 remain.\" in err\n\n    assert all(\n        (\n            \"4.9 Mbp      100.0%  100.0%\" in runtmp.last_result.out,\n            \"NC_003197.2\" in runtmp.last_result.out,\n        )\n    )\n\n    assert (\n        \"WARNING: final scaled was 10000, vs query scaled of 500\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_gather_query_downsample_explicit(runtmp, linear_gather, prefetch_gather):\n    # do an explicit downsampling to fix `test_gather_query_downsample`\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    query_sig = utils.get_test_data(\"GCF_000006945.2-s500.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        \"-k\",\n        \"31\",\n        \"--scaled\",\n        \"10000\",\n        linear_gather,\n        prefetch_gather,\n        query_sig,\n        *testdata_sigs,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    err = runtmp.last_result.err\n\n    assert \"loaded 36 total signatures from 12 locations.\" in err\n    assert \"after selecting signatures compatible with search, 12 remain.\" in err\n\n    assert all(\n        (\n            \"4.9 Mbp      100.0%  100.0%\" in runtmp.last_result.out,\n            \"NC_003197.2\" in runtmp.last_result.out,\n        )\n    )\n\n\ndef test_gather_downsample_multiple(runtmp, linear_gather, prefetch_gather):\n    # test multiple different downsamplings in gather code\n    query_sig = utils.get_test_data(\"GCF_000006945.2-s500.sig\")\n\n    # load in the hashes and do split them into four bins, randomly.\n    ss = load_one_signature(query_sig)\n    hashes = list(ss.minhash.hashes)\n\n    random.seed(a=1)  # fix seed so test is reproducible\n    random.shuffle(hashes)\n\n    # split into 4 bins:\n    mh_bins = [ss.minhash.copy_and_clear() for i in range(4)]\n    for i, hashval in enumerate(hashes):\n        mh_bins[i % 4].add_hash(hashval)\n\n    # downsample with different scaleds; initial scaled is 500, note.\n    mh_bins[0] = mh_bins[0].downsample(scaled=750)\n    mh_bins[1] = mh_bins[1].downsample(scaled=600)\n    mh_bins[2] = mh_bins[2].downsample(scaled=1000)\n    mh_bins[3] = mh_bins[3].downsample(scaled=650)\n\n    gathersigs = []\n    for i in range(4):\n        binsig = signature.SourmashSignature(mh_bins[i], name=f\"bin{i}\")\n\n        with open(runtmp.output(f\"bin{i}.sig\"), \"wb\") as fp:\n            sourmash.save_signatures_to_json([binsig], fp)\n\n        gathersigs.append(f\"bin{i}.sig\")\n\n    runtmp.sourmash(\n        \"gather\", \"-k\", \"31\", linear_gather, prefetch_gather, query_sig, *gathersigs\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"WARNING: final scaled was 1000, vs query scaled of 500\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_gather_with_picklist(runtmp, linear_gather, prefetch_gather):\n    # test 'sourmash gather' with picklists\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        \"--threshold-bp=0\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    # these are the different ksizes\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"found 3 matches total;\" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 Thermotoga\" in out\n    assert \"1.9 Mbp       11.5%   89.9%    NC_011978.1 Thermotoga\" in out\n    assert \"1.9 Mbp        6.3%   48.4%    NC_009486.1 Thermotoga\" in out\n\n\ndef test_gather_with_picklist_exclude(runtmp, linear_gather, prefetch_gather):\n    # test 'sourmash gather' with picklists - exclude\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        \"--threshold-bp=0\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5:exclude\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 9 matches by excluding 9 distinct values\" in err\n    # these are the different ksizes\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"found 9 matches total;\" in out\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 Salmonella enterica subsp\" in out\n    assert \"1.6 Mbp       10.7%  100.0%    NC_002163.1 Campylobacter jejuni subs\" in out\n    assert \"4.8 Mbp       10.4%   31.3%    NC_003197.2 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        5.2%   16.1%    NC_006905.1 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        4.0%   12.6%    NC_011080.1 Salmonella enterica subsp\" in out\n    assert \"4.6 Mbp        2.9%    9.2%    NC_011274.1 Salmonella enterica subsp\" in out\n    assert \"4.3 Mbp        2.1%    7.3%    NC_006511.1 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        0.5%    1.5%    NC_011294.1 Salmonella enterica subsp\" in out\n    assert \"4.5 Mbp        0.1%    0.4%    NC_004631.1 Salmonella enterica subsp\" in out\n\n\ndef test_gather_with_pattern_include(runtmp, linear_gather, prefetch_gather):\n    # test 'sourmash gather' with --include-db-pattern\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        \"--threshold-bp=0\",\n        \"-k\",\n        \"21\",\n        \"--include\",\n        \"thermotoga\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"found 3 matches total;\" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 Thermotoga\" in out\n    assert \"1.9 Mbp       11.5%   89.9%    NC_011978.1 Thermotoga\" in out\n    assert \"1.9 Mbp        6.3%   48.4%    NC_009486.1 Thermotoga\" in out\n\n\ndef test_gather_with_pattern_exclude(runtmp, linear_gather, prefetch_gather):\n    # test 'sourmash gather' with --exclude\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        \"--threshold-bp=0\",\n        \"-k\",\n        \"21\",\n        \"--exclude\",\n        \"thermotoga\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"found 9 matches total;\" in out\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 Salmonella enterica subsp\" in out\n    assert \"1.6 Mbp       10.7%  100.0%    NC_002163.1 Campylobacter jejuni subs\" in out\n    assert \"4.8 Mbp       10.4%   31.3%    NC_003197.2 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        5.2%   16.1%    NC_006905.1 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        4.0%   12.6%    NC_011080.1 Salmonella enterica subsp\" in out\n    assert \"4.6 Mbp        2.9%    9.2%    NC_011274.1 Salmonella enterica subsp\" in out\n    assert \"4.3 Mbp        2.1%    7.3%    NC_006511.1 Salmonella enterica subsp\" in out\n    assert \"4.7 Mbp        0.5%    1.5%    NC_011294.1 Salmonella enterica subsp\" in out\n    assert \"4.5 Mbp        0.1%    0.4%    NC_004631.1 Salmonella enterica subsp\" in out\n\n\n@utils.in_tempdir\ndef test_gather_error_no_sigs_traverse(c):\n    # test gather applied to a directory\n    query = utils.get_test_data(\n        \"prot/protein/GCA_001593925.1_ASM159392v1_protein.faa.gz.sig\"\n    )\n\n    emptydir = c.output(\"\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"gather\", query, emptydir)\n\n    err = c.last_result.err\n    print(err)\n    assert f\"Error while reading signatures from '{emptydir}'\" in err\n\n\ndef test_gather_error_no_cardinality_query(runtmp, linear_gather, prefetch_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,num=500\", testdata1, testdata2)\n\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=31,num=500\", testdata3)\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\", \"short3.fa.sig\", \"zzz\", linear_gather, prefetch_gather\n        )\n\n    assert runtmp.last_result.status == -1\n    assert \"query signature needs to be created with --scaled\" in runtmp.last_result.err\n\n\ndef test_gather_deduce_ksize(runtmp, prefetch_gather, linear_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=23,scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=23,scaled=10\", \"-o\", \"query.fa.sig\", testdata2\n    )\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        prefetch_gather,\n        linear_gather,\n        \"--threshold-bp=1\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"0.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n\n\ndef test_gather_deduce_moltype(runtmp, linear_gather, prefetch_gather):\n    # gather should automatically figure out ksize\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=10,scaled=10\", testdata1, testdata2)\n\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=10,scaled=10\", \"-o\", \"query.fa.sig\", testdata2\n    )\n\n    runtmp.sourmash(\"index\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        linear_gather,\n        prefetch_gather,\n        \"--threshold-bp=1\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"1.9 kbp      100.0%  100.0%\" in runtmp.last_result.out\n\n\ndef test_gather_abund_1_1(runtmp, linear_gather, prefetch_gather):\n    # check gather with a hand-constructed abundance-weighted query, mark 1\n    c = runtmp\n    #\n    # make r1.fa with 2x coverage of genome s10\n    # make r2.fa with 20x coverage of genome s10.\n    # make r3.fa with 2x coverage of genome s11.\n    #\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s10.fa.gz > r1.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 20 tests/test-data/genome-s10.fa.gz > r2.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s11.fa.gz > r3.fa\n\n    #\n    # make signature s10-s11 with r1 and r3, i.e. 1:1 abundance\n    # make signature s10x10-s11 with r2 and r3, i.e. 10:1 abundance\n    #\n    # ./sourmash compute -k 21 --scaled 1000 --merge=1-1 -o reads-s10-s11.sig r[13].fa --track-abundance\n    # ./sourmash compute -k 21 --scaled 1000 --merge=10-1 -o reads-s10x10-s11.sig r[23].fa --track-abundance\n\n    query = utils.get_test_data(\"gather-abund/reads-s10-s11.sig\")\n    against_list = [\"genome-s10\", \"genome-s11\", \"genome-s12\"]\n    against_list = [\"gather-abund/\" + i + \".fa.gz.sig\" for i in against_list]\n    against_list = [utils.get_test_data(i) for i in against_list]\n\n    status, out, err = c.run_sourmash(\n        \"gather\", query, *against_list, linear_gather, prefetch_gather\n    )\n\n    print(out)\n    print(err)\n\n    # when we project s10-s11 (r1+r3), 1:1 abundance,\n    # onto s10 and s11 genomes with gather, we get:\n    # * approximately 50% of each query matching (first column, p_query)\n    # * approximately 80% of subject genomes contents being matched\n    #   (this is due to the low coverage of 2 used to build queries)\n    # * approximately 2.0 abundance (third column, avg_abund)\n\n    assert \"49.6%   78.5%       1.8    tests/test-data/genome-s10.fa.gz\" in out\n    assert \"50.4%   80.0%       1.9    tests/test-data/genome-s11.fa.gz\" in out\n    assert \"genome-s12.fa.gz\" not in out\n\n    assert \"the recovered matches hit 100.0% of the abundance-weighted query\" in out\n    assert \"the recovered matches hit 100.0% of the query k-mers (unweighted)\" in out\n\n\ndef test_gather_abund_10_1(runtmp, prefetch_gather, linear_gather):\n    # check gather with a hand-constructed abundance-weighted query\n    c = runtmp\n    # see comments in test_gather_abund_1_1, above.\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s10.fa.gz > r1.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 20 tests/test-data/genome-s10.fa.gz > r2.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s11.fa.gz > r3.fa\n    # ./sourmash compute -k 21 --scaled 1000 --merge=1-1 -o reads-s10-s11.sig r[13].fa --track-abundance\n    # ./sourmash compute -k 21 --scaled 1000 --merge=10-1 -o reads-s10x10-s11.sig r[23].fa --track-abundance\n\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against_list = [\"genome-s10\", \"genome-s11\", \"genome-s12\"]\n    against_list = [\"gather-abund/\" + i + \".fa.gz.sig\" for i in against_list]\n    against_list = [utils.get_test_data(i) for i in against_list]\n\n    status, out, err = c.run_sourmash(\n        \"gather\", query, \"-o\", \"xxx.csv\", *against_list, linear_gather, prefetch_gather\n    )\n\n    print(out)\n    print(err)\n\n    # when we project s10x10-s11 (r2+r3), 10:1 abundance,\n    # onto s10 and s11 genomes with gather, we get:\n    # * approximately 91% of s10 matching\n    # * approximately 9% of s11 matching\n    # * approximately 100% of the high coverage genome being matched,\n    #       with only 80% of the low coverage genome\n    # * approximately 2.0 abundance (third column, avg_abund) for s11,\n    #   and (very) approximately 20x abundance for genome s10.\n\n    assert \"91.0%  100.0%      14.5    tests/test-data/genome-s10.fa.gz\" in out\n    assert \"9.0%   80.0%       1.9    tests/test-data/genome-s11.fa.gz\" in out\n    assert \"genome-s12.fa.gz\" not in out\n    assert \"the recovered matches hit 100.0% of the abundance-weighted query\" in out\n\n    # check the calculations behind the above output by looking into\n    # the CSV.\n    with open(c.output(\"xxx.csv\")) as fp:\n        r = csv.DictReader(fp)\n\n        overlaps = []\n        unique_overlaps = []\n        f_weighted_list = []\n        average_abunds = []\n        remaining_bps = []\n\n        n_weighted_list = []\n        sum_weighted_list = []\n        total_weighted_list = []\n\n        for n, row in enumerate(r):\n            assert int(row[\"gather_result_rank\"]) == n\n\n            # other than f_weighted, these are all 'flat' numbers - no abunds.\n            overlap = float(row[\"intersect_bp\"])\n            remaining_bp = float(row[\"remaining_bp\"])\n            unique_overlap = float(row[\"unique_intersect_bp\"])\n            f_weighted = float(row[\"f_unique_weighted\"])\n            average_abund = float(row[\"average_abund\"])\n\n            overlaps.append(overlap)\n            unique_overlaps.append(unique_overlap)\n            f_weighted_list.append(f_weighted)\n            average_abunds.append(average_abund)\n            remaining_bps.append(remaining_bp)\n\n            # also track weighted calculations\n            n_weighted_list.append(float(row[\"n_unique_weighted_found\"]))\n            sum_weighted_list.append(float(row[\"sum_weighted_found\"]))\n            total_weighted_list.append(float(row[\"total_weighted_hashes\"]))\n\n    weighted_calc = []\n    for overlap, average_abund in zip(overlaps, average_abunds):\n        prod = overlap * average_abund\n        weighted_calc.append(prod)  # @CTB redundant terms with below?\n\n    total_weighted = sum(weighted_calc)\n    for prod, f_weighted in zip(weighted_calc, f_weighted_list):\n        assert prod / total_weighted == f_weighted, (prod, f_weighted)\n\n    query_sig = load_one_signature(query)\n    query_mh = query_sig.minhash\n\n    total_bp_analyzed = sum(unique_overlaps) + remaining_bps[-1]\n    total_query_bp = len(query_mh) * query_mh.scaled\n    assert total_bp_analyzed == total_query_bp\n\n    # running sum of n_weighted_list should match sum_weighted_list\n    sofar_sum = 0\n    for i in range(len(n_weighted_list)):\n        n_weighted = n_weighted_list[i]\n        sum_weighted = sum_weighted_list[i]\n\n        sofar_sum += n_weighted\n        assert sum_weighted == sofar_sum\n\n    # weighted list should all be the same, and should match sum_weighted_list\n    # for this query, since 100% found.\n    assert min(total_weighted_list) == max(total_weighted_list)\n    assert min(total_weighted_list) == 7986\n    assert sum_weighted_list[-1] == 7986\n\n    # check/verify calculations for f_weighted -\n    for i in range(len(n_weighted_list)):\n        n_weighted = n_weighted_list[i]\n        f_weighted = f_weighted_list[i]\n        assert f_weighted == n_weighted / 7986\n\n\ndef test_gather_abund_10_1_ignore_abundance(runtmp, linear_gather, prefetch_gather):\n    # check gather with an abundance-weighted query, then flattened with\n    # --ignore-abund\n\n    c = runtmp\n    # see comments in test_gather_abund_1_1, above.\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s10.fa.gz > r1.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 20 tests/test-data/genome-s10.fa.gz > r2.fa\n    # nullgraph/make-reads.py -S 1 -r 200 -C 2 tests/test-data/genome-s11.fa.gz > r3.fa\n    # ./sourmash compute -k 21 --scaled 1000 --merge=1-1 -o reads-s10-s11.sig r[13].fa --track-abundance\n    # ./sourmash compute -k 21 --scaled 1000 --merge=10-1 -o reads-s10x10-s11.sig r[23].fa --track-abundance\n\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against_list = [\"genome-s10\", \"genome-s11\", \"genome-s12\"]\n    against_list = [\"gather-abund/\" + i + \".fa.gz.sig\" for i in against_list]\n    against_list = [utils.get_test_data(i) for i in against_list]\n\n    status, out, err = c.run_sourmash(\n        \"gather\",\n        query,\n        \"--ignore-abundance\",\n        *against_list,\n        linear_gather,\n        prefetch_gather,\n        \"-o\",\n        c.output(\"results.csv\"),\n    )\n\n    print(out)\n    print(err)\n    assert \"the recovered matches hit 100.0% of the abundance-weighted query\" not in out\n    assert \"the recovered matches hit 100.0% of the query k-mers (unweighted)\" in out\n\n    # when we project s10x10-s11 (r2+r3), 10:1 abundance,\n    # onto s10 and s11 genomes with gather --ignore-abundance, we get:\n    # * approximately 50% of s10 and s11 matching (first column)\n    # * approximately 100% of the high coverage genome being matched,\n    #       with only 80% of the low coverage genome\n\n    assert all((\"57.2%  100.0%\", \"tests/test-data/genome-s10.fa.gz\" in out))\n    assert all((\"42.8%   80.0%\", \"tests/test-data/genome-s11.fa.gz\" in out))\n    assert \"genome-s12.fa.gz\" not in out\n\n    with open(c.output(\"results.csv\")) as fp:\n        r = csv.DictReader(fp)\n        some_results = False\n        for row in r:\n            some_results = True\n            assert row[\"average_abund\"] == \"\"\n            assert row[\"median_abund\"] == \"\"\n            assert row[\"std_abund\"] == \"\"\n\n            assert row[\"query_abundance\"] == \"False\", row[\"query_abundance\"]\n            assert row[\"n_unique_weighted_found\"] == \"\"\n\n        assert some_results\n\n\ndef test_gather_output_unassigned_with_abundance(\n    runtmp, prefetch_gather, linear_gather\n):\n    # check --output-unassigned with an abund query\n    # @CTB: could add check on sum weighted etc.\n    c = runtmp\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against = utils.get_test_data(\"gather-abund/genome-s10.fa.gz.sig\")\n\n    c.run_sourmash(\n        \"gather\",\n        query,\n        against,\n        \"--output-unassigned\",\n        c.output(\"unassigned.sig\"),\n        linear_gather,\n        prefetch_gather,\n    )\n\n    assert os.path.exists(c.output(\"unassigned.sig\"))\n\n    nomatch = load_one_signature(c.output(\"unassigned.sig\"))\n    assert nomatch.minhash.track_abundance\n\n    query_ss = load_one_signature(query)\n    against_ss = load_one_signature(against)\n\n    # unassigned should have nothing that is in the database\n    nomatch_mh = nomatch.minhash\n    for hashval in against_ss.minhash.hashes:\n        assert hashval not in nomatch_mh.hashes\n\n    # unassigned should have abundances from original query, if not in database\n    for hashval, abund in query_ss.minhash.hashes.items():\n        if hashval not in against_ss.minhash.hashes:\n            assert nomatch_mh.hashes[hashval] == abund\n\n\ndef test_gather_empty_db_fail(runtmp, linear_gather, prefetch_gather):\n    # gather should fail on empty db with --fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\",\n            query,\n            against,\n            against2,\n            \"-k\",\n            \"51\",\n            linear_gather,\n            prefetch_gather,\n        )\n\n    err = runtmp.last_result.err\n    assert \"no compatible signatures found in \" in err\n\n\ndef test_gather_empty_db_nofail(runtmp, prefetch_gather, linear_gather):\n    # gather should not fail on empty db with --no-fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    runtmp.sourmash(\n        \"gather\",\n        query,\n        against,\n        against2,\n        \"-k\",\n        \"51\",\n        \"--no-fail-on-empty-data\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n    print(out)\n    print(err)\n\n    assert \"no compatible signatures found in \" in err\n    assert (\n        \"ksize on this database is 31; this is different from requested ksize of 51\"\n        in err\n    )\n    assert \"loaded 50 total signatures from 2 locations\" in err\n    assert \"after selecting signatures compatible with search, 0 remain.\" in err\n\n\ndef test_multigather_output_unassigned_with_abundance(runtmp, sig_save_extension_abund):\n    c = runtmp\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against = utils.get_test_data(\"gather-abund/genome-s10.fa.gz.sig\")\n\n    cmd = f\"multigather --query {query} --db {against} -E {sig_save_extension_abund}\".split()\n    c.run_sourmash(*cmd)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    out = c.last_result.out\n    assert \"the recovered matches hit 91.0% of the abundance-weighted query.\" in out\n    assert \"the recovered matches hit 57.2% of the query k-mers (unweighted).\" in out\n\n    assert os.path.exists(c.output(f\"r3.fa.unassigned{sig_save_extension_abund}\"))\n\n    nomatch = sourmash.load_file_as_signatures(\n        c.output(f\"r3.fa.unassigned{sig_save_extension_abund}\")\n    )\n    nomatch = list(nomatch)[0]\n    assert nomatch.minhash.track_abundance\n\n    query_ss = load_one_signature(query)\n    against_ss = load_one_signature(against)\n\n    # unassigned should have nothing that is in the database\n    nomatch_mh = nomatch.minhash\n    for hashval in against_ss.minhash.hashes:\n        assert hashval not in nomatch_mh.hashes\n\n    # unassigned should have abundances from original query, if not in database\n    for hashval, abund in query_ss.minhash.hashes.items():\n        if hashval not in against_ss.minhash.hashes:\n            assert nomatch_mh.hashes[hashval] == abund\n\n\ndef test_multigather_empty_db_fail(runtmp):\n    # multigather should fail on empty db with --fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"multigather\", \"--query\", query, \"--db\", against, against2, \"-k\", \"51\"\n        )\n\n    err = runtmp.last_result.err\n    assert \"no compatible signatures found in \" in err\n\n\ndef test_multigather_empty_db_nofail(runtmp):\n    # multigather should not fail on empty db with --no-fail-on-empty-database\n    query = utils.get_test_data(\"2.fa.sig\")\n    against = utils.get_test_data(\"47.fa.sig\")\n    against2 = utils.get_test_data(\"lca/47+63.lca.json\")\n\n    runtmp.sourmash(\n        \"multigather\",\n        \"--query\",\n        query,\n        \"--db\",\n        against,\n        against2,\n        \"-k\",\n        \"51\",\n        \"--no-fail-on-empty-data\",\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n    print(out)\n    print(err)\n\n    assert \"no compatible signatures found in \" in err\n    assert (\n        \"ksize on this database is 31; this is different from requested ksize of 51\"\n        in err\n    )\n    assert \"conducted gather searches on 0 signatures\" in err\n    assert \"loaded 50 total signatures from 2 locations\" in err\n    assert \"after selecting signatures compatible with search, 0 remain.\" in err\n\n\ndef test_multigather_nomatch(runtmp):\n    testdata_query = utils.get_test_data(\n        \"gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\"\n    )\n    testdata_match = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n\n    runtmp.sourmash(\n        \"multigather\", \"--query\", testdata_query, \"--db\", testdata_match, \"-k\", \"31\"\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 0 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 0.0% of the query\" in runtmp.last_result.out\n\n\ndef test_multigather_abund_nomatch(runtmp):\n    testdata_query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    testdata_match = utils.get_test_data(\n        \"gather/GCF_000006945.2_ASM694v2_genomic.fna.gz.sig\"\n    )\n\n    runtmp.sourmash(\"multigather\", \"--query\", testdata_query, \"--db\", testdata_match)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"found 0 matches total\" in runtmp.last_result.out\n    assert \"the recovered matches hit 0.0% of the query\" in runtmp.last_result.out\n\n\ndef test_sbt_categorize(runtmp):\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    # all four in the current directory for categorize .\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n    shutil.copyfile(testdata2, runtmp.output(\"2.sig\"))\n    shutil.copyfile(testdata3, runtmp.output(\"3.sig\"))\n    shutil.copyfile(testdata4, runtmp.output(\"4.sig\"))\n\n    # omit 3\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\", \"2.sig\"]\n    runtmp.sourmash(*args)\n\n    # categorize all of the ones that were copied to 'location'\n    args = [\"categorize\", \"zzz\", \".\", \"--ksize\", \"21\", \"--dna\", \"--csv\", \"out.csv\"]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # mash dist genome-s10.fa.gz genome-s10+s11.fa.gz\n    # yields 521/1000 ==> ~0.5\n    assert \"for genome-s10+s11, found: 0.50 genome-s10\" in runtmp.last_result.err\n\n    out_csv = Path(runtmp.output(\"out.csv\")).read_text()\n    print(out_csv)\n    assert \"4.sig,genome-s10+s11,genome-s10,0.504\" in out_csv\n\n\ndef test_sbt_categorize_ignore_abundance_1(runtmp):\n    # --- Categorize without ignoring abundance ---\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against_list = [\"reads-s10-s11\"]\n    against_list = [\"gather-abund/\" + i + \".sig\" for i in against_list]\n    against_list = [utils.get_test_data(i) for i in against_list]\n\n    # omit 3\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"thebestdatabase\"] + against_list\n    runtmp.sourmash(*args)\n\n    args = [\n        \"categorize\",\n        \"thebestdatabase\",\n        \"--ksize\",\n        \"21\",\n        \"--dna\",\n        \"--csv\",\n        \"out3.csv\",\n        query,\n    ]\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(*args)\n\n    assert runtmp.last_result.status != 0\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ERROR: this search cannot be done on signatures calculated with abundance.\"\n        in runtmp.last_result.err\n    )\n    assert \"ERROR: please specify --ignore-abundance.\" in runtmp.last_result.err\n\n\ndef test_sbt_categorize_ignore_abundance_3(runtmp):\n    # --- Now categorize with ignored abundance ---\n    query = utils.get_test_data(\"gather-abund/reads-s10x10-s11.sig\")\n    against_list = [\"reads-s10-s11\"]\n    against_list = [\"gather-abund/\" + i + \".sig\" for i in against_list]\n    against_list = [utils.get_test_data(i) for i in against_list]\n\n    # omit 3\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"thebestdatabase\"] + against_list\n    runtmp.sourmash(*args)\n\n    args = [\n        \"categorize\",\n        \"--ignore-abundance\",\n        \"--ksize\",\n        \"21\",\n        \"--dna\",\n        \"--csv\",\n        \"out4.csv\",\n        \"thebestdatabase\",\n        query,\n    ]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"for 1-1, found: 0.88 1-1\" in runtmp.last_result.err\n\n    out_csv4 = Path(runtmp.output(\"out4.csv\")).read_text()\n    assert \"reads-s10x10-s11.sig,1-1,1-1,0.87699\" in out_csv4\n\n\ndef test_sbt_categorize_already_done(runtmp):\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n    shutil.copyfile(testdata2, runtmp.output(\"2.sig\"))\n    shutil.copyfile(testdata3, runtmp.output(\"3.sig\"))\n    shutil.copyfile(testdata4, runtmp.output(\"4.sig\"))\n\n    # omit 3\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\", \"2.sig\"]\n    runtmp.sourmash(*args)\n\n    with open(runtmp.output(\"in.csv\"), \"w\") as fp:\n        fp.write(\"./4.sig,genome-s10.fa.gz,0.50\")\n\n    args = [\n        \"categorize\",\n        \"zzz\",\n        \"./2.sig\",\n        \"./4.sig\",\n        \"--ksize\",\n        \"21\",\n        \"--dna\",\n        \"--load-csv\",\n        \"in.csv\",\n    ]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"for genome-s11.fa.gz, no match found\"\n    assert \"for s10+s11, found: 0.50 genome-s10.fa.gz\" not in runtmp.last_result.err\n\n\ndef test_sbt_categorize_already_done_traverse(runtmp):\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n    testdata4 = utils.get_test_data(\"genome-s10+s11.sig\")\n\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n    shutil.copyfile(testdata2, runtmp.output(\"2.sig\"))\n    shutil.copyfile(testdata3, runtmp.output(\"3.sig\"))\n    shutil.copyfile(testdata4, runtmp.output(\"4.sig\"))\n\n    # omit 3\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\", \"2.sig\"]\n    runtmp.sourmash(*args)\n\n    with open(runtmp.output(\"in.csv\"), \"w\") as fp:\n        fp.write(\"./4.sig,genome-s10.fa.gz,0.50\")\n\n    args = [\"categorize\", \"zzz\", \".\", \"--ksize\", \"21\", \"--dna\", \"--load-csv\", \"in.csv\"]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"for genome-s11.fa.gz, no match found\"\n    assert \"for s10+s11, found: 0.50 genome-s10.fa.gz\" not in runtmp.last_result.err\n\n\ndef test_sbt_categorize_multiple_ksizes_moltypes(runtmp):\n    # 'categorize' works fine with multiple moltypes/ksizes\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    testdata2 = utils.get_test_data(\"genome-s11.fa.gz.sig\")\n    testdata3 = utils.get_test_data(\"genome-s12.fa.gz.sig\")\n\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n    shutil.copyfile(testdata2, runtmp.output(\"2.sig\"))\n    shutil.copyfile(testdata3, runtmp.output(\"3.sig\"))\n\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\", \"2.sig\"]\n    runtmp.sourmash(*args)\n\n    args = [\"categorize\", \"zzz\", \".\"]\n    runtmp.sourmash(*args)\n\n\ndef test_watch_check_num_bounds_negative(runtmp):\n    # check that watch properly outputs error on negative num\n    c = runtmp\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, c.output(\"1.sig\"))\n\n    c.run_sourmash(\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"watch\", \"--ksize\", \"21\", \"-n\", \"-5\", \"--dna\", \"zzz\", testdata0)\n\n    assert \"ERROR: num value must be positive\" in c.last_result.err\n\n\ndef test_watch_check_num_bounds_less_than_minimum(runtmp):\n    # check that watch properly outputs warnings on small num\n    c = runtmp\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, c.output(\"1.sig\"))\n\n    c.run_sourmash(\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\")\n\n    c.run_sourmash(\"watch\", \"--ksize\", \"21\", \"-n\", \"25\", \"--dna\", \"zzz\", testdata0)\n\n    assert \"WARNING: num value should be >= 50. Continuing anyway.\" in c.last_result.err\n\n\ndef test_watch_check_num_bounds_more_than_maximum(runtmp):\n    # check that watch properly outputs warnings on large num\n    c = runtmp\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, c.output(\"1.sig\"))\n\n    c.run_sourmash(\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\")\n\n    c.run_sourmash(\"watch\", \"--ksize\", \"21\", \"-n\", \"100000\", \"--dna\", \"zzz\", testdata0)\n\n    assert (\n        \"WARNING: num value should be <= 50000. Continuing anyway.\" in c.last_result.err\n    )\n\n\ndef test_watch(runtmp):\n    # check basic watch functionality\n    c = runtmp\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, c.output(\"1.sig\"))\n\n    c.run_sourmash(\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\")\n\n    c.run_sourmash(\"watch\", \"--ksize\", \"21\", \"--dna\", \"zzz\", testdata0)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"FOUND: genome-s10, at 1.000\" in c.last_result.out\n\n\ndef test_watch_deduce_ksize(runtmp):\n    # check that watch guesses ksize automatically from database\n    c = runtmp\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=29,num=500\", \"-o\", \"1.sig\", testdata0)\n\n    c.run_sourmash(\"index\", \"--dna\", \"-k\", \"29\", \"zzz\", \"1.sig\")\n\n    c.run_sourmash(\"watch\", \"--dna\", \"zzz\", testdata0)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"Computing signature for k=29\" in c.last_result.err\n    assert \"genome-s10.fa.gz, at 1.000\" in c.last_result.out\n\n\ndef test_watch_coverage(runtmp):\n    # check output details/coverage of found\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\"]\n    runtmp.sourmash(*args)\n\n    with open(runtmp.output(\"query.fa\"), \"w\") as fp:\n        record = list(screed.open(testdata0))[0]\n        for start in range(0, len(record), 100):\n            fp.write(f\">{start}\\n{record.sequence[start : start + 500]}\\n\")\n\n    args = [\"watch\", \"--ksize\", \"21\", \"--dna\", \"zzz\", \"query.fa\"]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"FOUND: genome-s10, at 1.000\" in runtmp.last_result.out\n\n\ndef test_watch_output_sig(runtmp):\n    # test watch --output\n    testdata0 = utils.get_test_data(\"genome-s10.fa.gz\")\n    testdata1 = utils.get_test_data(\"genome-s10.fa.gz.sig\")\n    shutil.copyfile(testdata1, runtmp.output(\"1.sig\"))\n\n    args = [\"index\", \"--dna\", \"-k\", \"21\", \"zzz\", \"1.sig\"]\n    runtmp.sourmash(*args)\n\n    with open(runtmp.output(\"query.fa\"), \"w\") as fp:\n        record = list(screed.open(testdata0))[0]\n        for start in range(0, len(record), 100):\n            fp.write(f\">{start}\\n{record.sequence[start : start + 500]}\\n\")\n\n    args = [\n        \"watch\",\n        \"--ksize\",\n        \"21\",\n        \"--dna\",\n        \"zzz\",\n        \"query.fa\",\n        \"-o\",\n        \"out.sig\",\n        \"--name\",\n        \"xyzfoo\",\n    ]\n    runtmp.sourmash(*args)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    out_sig = runtmp.output(\"out.sig\")\n    assert os.path.exists(out_sig)\n\n    siglist = list(sourmash.load_file_as_signatures(out_sig))\n    assert len(siglist) == 1\n    assert siglist[0].filename == \"stdin\"\n    assert siglist[0].name == \"xyzfoo\"\n\n\ndef test_storage_convert(runtmp):\n    testdata = utils.get_test_data(\"v2.sbt.json\")\n    shutil.copyfile(testdata, runtmp.output(\"v2.sbt.json\"))\n    shutil.copytree(\n        os.path.join(os.path.dirname(testdata), \".sbt.v2\"), runtmp.output(\".sbt.v2\")\n    )\n    testsbt = runtmp.output(\"v2.sbt.json\")\n\n    original = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    args = [\"storage\", \"convert\", \"-b\", \"ipfs\", testsbt]\n    try:\n        runtmp.sourmash(*args)\n    except SourmashCommandFailed:\n        pass\n\n    if runtmp.last_result.status:\n        if \"ipfshttpclient.ConnectionError\" in runtmp.last_result.err:\n            raise pytest.xfail(\"ipfs probably not running\")\n        if \"No module named 'ipfshttpclient'\" in runtmp.last_result.err:\n            raise pytest.xfail(\"ipfshttpclient module not installed\")\n\n    print(\"NO FAIL; KEEP ON GOING!\")\n\n    ipfs = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    assert len(original) == len(ipfs)\n    assert all(\n        n1[1].name == n2[1].name for (n1, n2) in zip(sorted(original), sorted(ipfs))\n    )\n\n    args = [\n        \"storage\",\n        \"convert\",\n        \"-b\",\n        \"\"\"'ZipStorage(\"{}\")'\"\"\".format(runtmp.output(\"v2.sbt.zip\")),\n        testsbt,\n    ]\n    runtmp.sourmash(*args)\n\n    tar = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    assert len(original) == len(tar)\n    assert all(\n        n1[1].name == n2[1].name for (n1, n2) in zip(sorted(original), sorted(tar))\n    )\n\n    print(\"it all worked!!\")\n\n\ndef test_storage_convert_identity(runtmp):\n    testdata = utils.get_test_data(\"v2.sbt.json\")\n    shutil.copyfile(testdata, runtmp.output(\"v2.sbt.json\"))\n    shutil.copytree(\n        os.path.join(os.path.dirname(testdata), \".sbt.v2\"), runtmp.output(\".sbt.v2\")\n    )\n    testsbt = runtmp.output(\"v2.sbt.json\")\n\n    original = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    args = [\"storage\", \"convert\", \"-b\", \"fsstorage\", testsbt]\n    runtmp.sourmash(*args)\n\n    identity = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    assert len(original) == len(identity)\n    assert all(\n        n1[1].name == n2[1].name for (n1, n2) in zip(sorted(original), sorted(identity))\n    )\n\n\ndef test_storage_convert_fsstorage_newpath(runtmp):\n    testdata = utils.get_test_data(\"v2.sbt.json\")\n    shutil.copyfile(testdata, runtmp.output(\"v2.sbt.json\"))\n    shutil.copytree(\n        os.path.join(os.path.dirname(testdata), \".sbt.v2\"), runtmp.output(\".sbt.v2\")\n    )\n    testsbt = runtmp.output(\"v2.sbt.json\")\n\n    original = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    args = [\n        \"storage\",\n        \"convert\",\n        \"-b\",\n        \"fsstorage({})\".format(runtmp.output(\"v3\")),\n        testsbt,\n    ]\n    runtmp.sourmash(*args)\n\n    identity = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    assert len(original) == len(identity)\n    assert all(\n        n1[1].name == n2[1].name for (n1, n2) in zip(sorted(original), sorted(identity))\n    )\n\n\ndef test_migrate(runtmp):\n    testdata = utils.get_test_data(\"v3.sbt.json\")\n    shutil.copyfile(testdata, runtmp.output(\"v3.sbt.json\"))\n    shutil.copytree(\n        os.path.join(os.path.dirname(testdata), \".sbt.v3\"), runtmp.output(\".sbt.v3\")\n    )\n    testsbt = runtmp.output(\"v3.sbt.json\")\n\n    original = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    runtmp.sourmash(\"migrate\", testsbt)\n\n    identity = SBT.load(testsbt, leaf_loader=SigLeaf.load)\n\n    assert len(original) == len(identity)\n    assert all(\n        n1[1].name == n2[1].name for (n1, n2) in zip(sorted(original), sorted(identity))\n    )\n\n    assert \"this is an old index version\" not in runtmp.last_result.err\n    assert all(\n        \"min_n_below\" in node.metadata for node in identity if isinstance(node, Node)\n    )\n\n\ndef test_license_cc0(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=31\", testdata1)\n\n    sigfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n    assert sig.license == \"CC0\"\n\n\ndef test_license_non_cc0(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\", \"translate\", \"-p\", \"k=31\", \"--license\", \"GPL\", testdata1\n        )\n\n    assert runtmp.last_result.status != 0\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"sourmash only supports CC0\" in runtmp.last_result.err\n\n\ndef test_license_load_non_cc0():\n    sigfile = utils.get_test_data(\"bad-license.sig\")\n\n    try:\n        next(load_signatures_from_json(sigfile, do_raise=True))\n    except Exception as e:\n        assert \"sourmash only supports CC0-licensed signatures\" in str(e)\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_zipfile(c):\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n\n    c.run_sourmash(\"index\", \"-k\", \"31\", \"zzz.sbt.zip\", *testdata_sigs)\n\n    outfile = c.output(\"zzz.sbt.zip\")\n    assert os.path.exists(outfile)\n\n    print(c)\n    assert c.last_result.status == 0\n    assert \"Finished saving SBT index, available at\" in c.last_result.err\n\n    # look internally at the zip file\n    with zipfile.ZipFile(outfile) as zf:\n        content = zf.namelist()\n        assert len(content) == 26\n        assert len([c for c in content if \"internal\" in c]) == 11\n        assert \".sbt.zzz/\" in content\n        sbts = [c for c in content if c.endswith(\".sbt.json\")]\n        assert len(sbts) == 1\n        assert sbts[0] == \"zzz.sbt.json\"\n\n\n@utils.in_tempdir\ndef test_do_sourmash_index_zipfile_append(c):\n    raise pytest.skip(\"multithreaded capture of warnings isn't working, for now\")\n    testdata_glob = utils.get_test_data(\"gather/GCF*.sig\")\n    testdata_sigs = glob.glob(testdata_glob)\n    half_point = int(len(testdata_sigs) / 2)\n    first_half = testdata_sigs[:half_point]\n    second_half = testdata_sigs[half_point:]\n\n    print(first_half)\n    print(second_half)\n\n    # should be no overlap\n    assert not set(first_half).intersection(set(second_half))\n\n    with warnings.catch_warnings(record=True) as record:\n        c.run_sourmash(\"index\", \"-k\", \"31\", \"zzz.sbt.zip\", *first_half)\n    # UserWarning is raised when there are duplicated entries in the zipfile\n    # @CTB failing on python 3.13.2 on linux??\n    print(\"XXXX\", record)\n    for r in record:\n        print(r)\n    assert not record, record\n\n    outfile = c.output(\"zzz.sbt.zip\")\n    assert os.path.exists(outfile)\n\n    print(c)\n    assert c.last_result.status == 0\n    assert \"Finished saving SBT index, available at\" in c.last_result.err\n\n    with warnings.catch_warnings(record=True) as record:\n        c.run_sourmash(\"index\", \"--append\", \"-k\", \"31\", \"zzz.sbt.zip\", *second_half)\n    # UserWarning is raised when there are duplicated entries in the zipfile\n    print(record)\n    # assert not record, record\n\n    print(c)\n    assert c.last_result.status == 0\n    assert \"Finished saving SBT index, available at\" in c.last_result.err\n\n    # look internally at the zip file\n    with zipfile.ZipFile(outfile) as zf:\n        content = zf.namelist()\n        print(content)\n        assert len(content) == 26\n        assert len([c for c in content if \"internal\" in c]) == 11\n        assert \".sbt.zzz/\" in content\n        sbts = [c for c in content if c.endswith(\".sbt.json\")]\n        assert len(sbts) == 1\n        assert sbts[0] == \"zzz.sbt.json\"\n\n\ndef test_index_with_picklist(runtmp):\n    # test 'sourmash index' with picklists\n    gcf_sig_dir = utils.get_test_data(\"gather/\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    output_db = runtmp.output(\"thermo.sbt.zip\")\n\n    runtmp.sourmash(\n        \"index\", output_db, gcf_sig_dir, \"-k\", \"31\", \"--picklist\", f\"{picklist}:md5:md5\"\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n\n    # these are the different ksizes\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    # verify:\n    siglist = list(sourmash.load_file_as_signatures(output_db))\n    assert len(siglist) == 3\n    for ss in siglist:\n        assert \"Thermotoga\" in ss.name\n\n\ndef test_index_with_picklist_exclude(runtmp):\n    # test 'sourmash index' with picklists - exclude\n    gcf_sig_dir = utils.get_test_data(\"gather/\")\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n\n    output_db = runtmp.output(\"thermo-exclude.sbt.zip\")\n\n    runtmp.sourmash(\n        \"index\",\n        output_db,\n        gcf_sig_dir,\n        \"-k\",\n        \"31\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5:exclude\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 9 matches by excluding 9 distinct values\" in err\n\n    # verify:\n    siglist = list(sourmash.load_file_as_signatures(output_db))\n    assert len(siglist) == 9\n    for ss in siglist:\n        assert \"Thermotoga\" not in ss.name\n\n\ndef test_index_matches_search_with_picklist(runtmp):\n    # test 'sourmash index' with picklists\n    gcf_sig_dir = utils.get_test_data(\"gather/\")\n    glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    output_db = runtmp.output(\"thermo.sbt.zip\")\n\n    runtmp.sourmash(\"index\", output_db, gcf_sig_dir, \"-k\", \"21\")\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # verify:\n    siglist = list(sourmash.load_file_as_signatures(output_db))\n    assert len(siglist) > 3  # all signatures included...\n\n    n_thermo = 0\n    for ss in siglist:\n        if \"Thermotoga\" in ss.name:\n            n_thermo += 1\n\n    assert n_thermo == 3\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        output_db,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 3 matches to 9 distinct values\" in err\n    # these are the different ksizes\n    assert \"WARNING: 6 missing picklist values.\" in err\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"3 matches\" in out\n    assert \"13.1%       NC_000853.1 Thermotoga\" in out\n    assert \"13.0%       NC_009486.1 Thermotoga\" in out\n    assert \"12.8%       NC_011978.1 Thermotoga\" in out\n\n\ndef test_index_matches_search_with_picklist_exclude(runtmp):\n    # test 'sourmash index' with picklists - exclude\n    gcf_sig_dir = utils.get_test_data(\"gather/\")\n    glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    picklist = utils.get_test_data(\"gather/thermotoga-picklist.csv\")\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n\n    output_db = runtmp.output(\"thermo-exclude.sbt.zip\")\n\n    runtmp.sourmash(\"index\", output_db, gcf_sig_dir, \"-k\", \"21\")\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # verify:\n    siglist = list(sourmash.load_file_as_signatures(output_db))\n    assert len(siglist) > 3  # all signatures included...\n\n    n_thermo = 0\n    for ss in siglist:\n        if \"Thermotoga\" in ss.name:\n            n_thermo += 1\n\n    assert n_thermo == 3\n\n    runtmp.sourmash(\n        \"search\",\n        metag_sig,\n        output_db,\n        \"--containment\",\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{picklist}:md5:md5:exclude\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"for given picklist, found 10 matches by excluding 9 distinct values\" in err\n    ### NTP: FIX REPORTING\n    assert \"WARNING: -1 missing picklist values\"\n\n    out = runtmp.last_result.out\n    print(out)\n    assert \"10 matches above threshold 0.080; showing first 3:\" in out\n    assert \"100.0%       -\" in out\n    assert \"33.2%       NC_003198.1 Salmonella\" in out\n    assert \"33.1%       NC_003197.2 Salmonella\" in out\n\n\ndef test_gather_with_prefetch_picklist(runtmp, linear_gather):\n    # test 'gather' using a picklist taken from 'sourmash prefetch' output\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    prefetch_csv = runtmp.output(\"prefetch-out.csv\")\n\n    runtmp.sourmash(\"prefetch\", metag_sig, *gcf_sigs, \"-k\", \"21\", \"-o\", prefetch_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 12 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 1466 were found in matches above threshold.\"\n        in err\n    )\n\n    # now, do a gather with the results\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        linear_gather,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{prefetch_csv}:match_md5:md5short\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n\ndef test_gather_with_prefetch_picklist_2_prefetch(runtmp, linear_gather):\n    # test 'gather' using a picklist taken from 'sourmash prefetch' output\n    # using ::prefetch\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    prefetch_csv = runtmp.output(\"prefetch-out.csv\")\n\n    runtmp.sourmash(\"prefetch\", metag_sig, *gcf_sigs, \"-k\", \"21\", \"-o\", prefetch_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"total of 12 matching signatures.\" in err\n    assert (\n        \"of 1466 distinct query hashes, 1466 were found in matches above threshold.\"\n        in err\n    )\n\n    # now, do a gather with the results\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        linear_gather,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{prefetch_csv}::prefetch\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n\ndef test_gather_with_prefetch_picklist_3_gather(runtmp, linear_gather):\n    # test 'gather' using a picklist taken from 'sourmash gather' output,\n    # using ::gather.\n    # (this doesn't really do anything useful, but it's an ok test :)\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    gather_csv = runtmp.output(\"gather-out.csv\")\n\n    runtmp.sourmash(\"gather\", metag_sig, *gcf_sigs, \"-k\", \"21\", \"-o\", gather_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n    # now, do another gather with the results\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        linear_gather,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{gather_csv}::gather\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n\ndef test_gather_with_prefetch_picklist_3_gather_badcol(runtmp):\n    # test 'gather' using a picklist taken from 'sourmash gather' output,\n    # using ::gather.\n    # (this doesn't really do anything useful, but it's an ok test :)\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    gather_csv = runtmp.output(\"gather-out.csv\")\n\n    runtmp.sourmash(\"gather\", metag_sig, *gcf_sigs, \"-k\", \"21\", \"-o\", gather_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n    # now, do another gather with the results, but with a bad picklist\n    # parameter\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"gather\",\n            metag_sig,\n            *gcf_sigs,\n            \"-k\",\n            \"21\",\n            \"--picklist\",\n            f\"{gather_csv}:FOO:gather\",\n        )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"ERROR: could not load picklist.\" in err\n    assert \"no column name allowed for coltype 'gather'\" in err\n\n\ndef test_gather_with_prefetch_picklist_4_manifest(runtmp, linear_gather):\n    # test 'gather' using a picklist taken from 'sourmash sig manifest'\n    # output, using ::manifest.\n    # (this doesn't really do anything useful, but it's an ok test :)\n    gather_dir = utils.get_test_data(\"gather/\")\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    manifest_csv = runtmp.output(\"manifest.csv\")\n\n    runtmp.sourmash(\"sig\", \"manifest\", gather_dir, \"-o\", manifest_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    # now, do a gather on the manifest\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        gather_dir,\n        linear_gather,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{manifest_csv}::manifest\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 1 matches total;\" in out\n    assert \"the recovered matches hit 100.0% of the query\" in out\n\n    # the query sig itself is in there, so :shrug: that matches at 100%\n    assert \"14.7 Mbp     100.0%  100.0%    -\" in out\n\n\ndef test_gather_with_prefetch_picklist_4_manifest_excl(runtmp, linear_gather):\n    # test 'gather' using a picklist taken from 'sourmash sig manifest'\n    # output, using ::manifest.\n    # (this doesn't really do anything useful, but it's an ok test :)\n    gather_dir = utils.get_test_data(\"gather/\")\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    manifest_csv = runtmp.output(\"manifest.csv\")\n\n    runtmp.sourmash(\"sig\", \"manifest\", gather_dir, \"-o\", manifest_csv)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    # now, do a gather on the manifest\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        gather_dir,\n        linear_gather,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{manifest_csv}::manifest:exclude\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    # excluded everything, so nothing to match!\n    assert \"No matches found for --threshold-bp at 50.0 kbp.\" in runtmp.last_result.err\n\n\ndef test_gather_with_prefetch_picklist_5_search(runtmp):\n    # test 'gather' using a picklist taken from 'sourmash prefetch' output\n    # using ::prefetch\n    gcf_sigs = glob.glob(utils.get_test_data(\"gather/GCF*.sig\"))\n    metag_sig = utils.get_test_data(\"gather/combined.sig\")\n    search_csv = runtmp.output(\"search-out.csv\")\n\n    runtmp.sourmash(\n        \"search\", \"--containment\", metag_sig, *gcf_sigs, \"-k\", \"21\", \"-o\", search_csv\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"12 matches above threshold 0.080; showing first 3:\" in out\n    assert \" 33.2%       NC_003198.1 Salmonella enterica subsp.\" in out\n\n    # now, do a gather with the results\n    runtmp.sourmash(\n        \"gather\",\n        metag_sig,\n        *gcf_sigs,\n        \"-k\",\n        \"21\",\n        \"--picklist\",\n        f\"{search_csv}::search\",\n    )\n\n    err = runtmp.last_result.err\n    print(err)\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"found 11 matches total;\" in out\n    assert \"the recovered matches hit 99.9% of the query\" in out\n\n    assert \"4.9 Mbp       33.2%  100.0%    NC_003198.1 \" in out\n    assert \"1.9 Mbp       13.1%  100.0%    NC_000853.1 \" in out\n\n\ndef test_gather_scaled_1(runtmp, linear_gather, prefetch_gather):\n    # test gather on a sig indexed with scaled=1\n    inp = utils.get_test_data(\"short.fa\")\n    outp = runtmp.output(\"out.sig\")\n\n    # prepare a signature with a scaled of 1\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"scaled=1,k=31\", inp, \"-o\", outp)\n\n    # run with a low threshold\n    runtmp.sourmash(\"gather\", outp, outp, \"--threshold-bp\", \"0\")\n\n    print(runtmp.last_result.out)\n    print(\"---\")\n    print(runtmp.last_result.err)\n\n    assert \"1.0 kbp      100.0%  100.0%\" in runtmp.last_result.out\n    assert \"found 1 matches total;\" in runtmp.last_result.out\n\n\ndef test_standalone_manifest_search(runtmp):\n    # test loading/searching a manifest file from the command line.\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    dirname = runtmp.output(\"somedir\")\n    os.mkdir(dirname)\n    subdir = runtmp.output(\"somedir/subdir\")\n    os.mkdir(subdir)\n    shutil.copyfile(sig47, os.path.join(dirname, \"47.fa.sig\"))\n    shutil.copyfile(sig63, os.path.join(subdir, \"63.fa.sig\"))\n\n    # for now, the output manifest must be within top level dir for\n    # CLI stuff to work properly.\n    mf = os.path.join(dirname, \"mf.csv\")\n\n    # build manifest...\n    runtmp.sourmash(\"sig\", \"manifest\", dirname, \"-o\", mf)\n\n    # ...and now use for a search!\n    runtmp.sourmash(\"search\", sig47, mf)\n\n    out = runtmp.last_result.out\n    print(out)\n    print(runtmp.last_result.err)\n\n    assert \"100.0%       NC_009665.1 Shewanella baltica OS185, complete genome\" in out\n\n\ndef test_standalone_manifest_search_fail(runtmp):\n    # test loading/searching a manifest file from the command line; should\n    # fail if manifest is not located within tld.\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    dirname = runtmp.output(\"somedir\")\n    os.mkdir(dirname)\n    subdir = runtmp.output(\"somedir/subdir\")\n    os.mkdir(subdir)\n    shutil.copyfile(sig47, os.path.join(dirname, \"47.fa.sig\"))\n    shutil.copyfile(sig63, os.path.join(subdir, \"63.fa.sig\"))\n\n    # for now, the output manifest must be within top level dir for\n    # CLI stuff to work properly. here we intentionally break this,\n    # for testing purposes.\n    mf = runtmp.output(\"mf.csv\")\n\n    # build manifest...\n    runtmp.sourmash(\"sig\", \"manifest\", dirname, \"-o\", mf)\n\n    # ...and now use for a search!\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"search\", sig47, mf)\n\n\ndef test_search_ani_jaccard(runtmp):\n    c = runtmp\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig4763 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\"search\", sig47, sig4763, \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names = SearchResult.search_write_cols\n\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6564798376870403\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_filename\"].endswith(\"47.fa\")\n        assert (\n            row[\"query_name\"] == \"NC_009665.1 Shewanella baltica OS185, complete genome\"\n        )\n        assert row[\"query_md5\"] == \"09a08691\"\n        assert row[\"ani\"] == \"0.992530907924384\"\n\n\ndef test_search_ani_jaccard_error_too_high(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=1\", testdata1, testdata2)\n\n    c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names = SearchResult.search_write_cols\n\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.9288577154308617\n        assert row[\"filename\"].endswith(\"short2.fa.sig\")\n        assert row[\"md5\"] == \"bf752903d635b1eb83c53fe4aae951db\"\n        assert row[\"query_filename\"].endswith(\"short.fa\")\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"9191284a\"\n        # assert row['ani'] == \"0.9987884602947684\"\n        assert row[\"ani\"] == \"\"\n\n    assert (\n        \"WARNING: Jaccard estimation for at least one of these comparisons is likely inaccurate. Could not estimate ANI for these comparisons.\"\n        in c.last_result.err\n    )\n\n\ndef test_searchabund_no_ani(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=10,abund\", testdata1, testdata2)\n\n    c.run_sourmash(\"search\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxx.csv\")\n    search_result_names = SearchResult.search_write_cols\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.8224046424612483\n        assert row[\"md5\"] == \"c9d5a795eeaaf58e286fb299133e1938\"\n        assert row[\"filename\"].endswith(\"short2.fa.sig\")\n        assert row[\"query_filename\"].endswith(\"short.fa\")\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"b5cc464c\"\n        assert row[\"ani\"] == \"\"  # do we want empty column to appear??\n\n\ndef test_search_ani_containment(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"2+63.fa.sig\")\n    testdata2 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\"search\", \"--containment\", testdata1, testdata2, \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names = SearchResult.search_write_cols\n\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6597808288197506\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"832a45e8\"\n        assert row[\"ani\"] == \"0.9866751346467802\"\n\n    # search other direction\n    c.run_sourmash(\"search\", \"--containment\", testdata2, testdata1, \"-o\", \"xxxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6642150646715699\n        assert row[\"filename\"].endswith(\"2+63.fa.sig\")\n        assert row[\"md5\"] == \"832a45e85bdca6eaef5d73047e3e6321\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"491c0a81\"\n        assert row[\"ani\"] == \"0.9868883523107224\"\n\n\ndef test_search_ani_containment_asymmetry(runtmp):\n    # test contained_by asymmetries, viz #2215\n    query_sig = utils.get_test_data(\"47.fa.sig\")\n    merged_sig = utils.get_test_data(\"47-63-merge.sig\")\n\n    runtmp.sourmash(\n        \"search\", query_sig, merged_sig, \"-o\", \"query-in-merged.csv\", \"--containment\"\n    )\n    runtmp.sourmash(\n        \"search\", merged_sig, query_sig, \"-o\", \"merged-in-query.csv\", \"--containment\"\n    )\n\n    with sourmash_args.FileInputCSV(runtmp.output(\"query-in-merged.csv\")) as r:\n        query_in_merged = list(r)[0]\n\n    with sourmash_args.FileInputCSV(runtmp.output(\"merged-in-query.csv\")) as r:\n        merged_in_query = list(r)[0]\n\n    assert query_in_merged[\"ani\"] == \"1.0\"\n    assert merged_in_query[\"ani\"] == \"0.9865155060423993\"\n\n\ndef test_search_ani_containment_fail(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=10\", testdata1, testdata2)\n\n    c.run_sourmash(\n        \"search\", \"--containment\", \"short.fa.sig\", \"short2.fa.sig\", \"-o\", \"xxx.csv\"\n    )\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names = SearchResult.search_write_cols\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert round(float(row[\"similarity\"]), 3) == 0.967\n        assert row[\"ani\"] == \"0.998906999319701\"\n    # With PR #2268, this error message should not appear\n    # assert \"WARNING: size estimation for at least one of these sketches may be inaccurate. ANI values will not be reported for these comparisons.\" in c.last_result.err\n\n\ndef test_search_ani_containment_estimate_ci(runtmp):\n    # test ANI confidence intervals, based on (asymmetric) containment\n\n    c = runtmp\n    testdata1 = utils.get_test_data(\"2+63.fa.sig\")\n    testdata2 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\n        \"search\",\n        \"--containment\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"xxx.csv\",\n        \"--estimate-ani-ci\",\n    )\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names_ci = SearchResult.search_write_cols_ci\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names_ci == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6597808288197506\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"832a45e8\"\n        assert row[\"ani\"] == \"0.9866751346467802\"\n        assert row[\"ani_low\"] == \"0.9861576758035308\"  # \"0.9861559138341189\"\n        assert row[\"ani_high\"] == \"0.9871770716451368\"  # \"0.9871787293232042\"\n\n    # search other direction\n    c.run_sourmash(\n        \"search\",\n        \"--containment\",\n        testdata2,\n        testdata1,\n        \"-o\",\n        \"xxxx.csv\",\n        \"--estimate-ani-ci\",\n    )\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names_ci == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6642150646715699\n        assert row[\"filename\"].endswith(\"2+63.fa.sig\")\n        assert row[\"md5\"] == \"832a45e85bdca6eaef5d73047e3e6321\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"491c0a81\"\n        assert row[\"ani\"] == \"0.9868883523107224\"\n        assert row[\"ani_low\"] == \"0.986374049720872\"  # \"0.9863757952722036\"\n        assert row[\"ani_high\"] == \"0.9873870188726516\"  # \"0.9873853776786775\"\n\n\ndef test_search_ani_max_containment(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"2+63.fa.sig\")\n    testdata2 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\"search\", \"--max-containment\", testdata1, testdata2, \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxx.csv\")\n    search_result_names = SearchResult.search_write_cols\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6642150646715699\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"832a45e8\"\n        assert row[\"ani\"] == \"0.9868883523107224\"\n\n\ndef test_search_ani_max_containment_estimate_ci(runtmp):\n    # test ANI confidence intervals, based on (symmetric) max-containment\n\n    c = runtmp\n    testdata1 = utils.get_test_data(\"2+63.fa.sig\")\n    testdata2 = utils.get_test_data(\"47+63.fa.sig\")\n\n    c.run_sourmash(\n        \"search\",\n        \"--max-containment\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"xxx.csv\",\n        \"--estimate-ani-ci\",\n    )\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    csv_file = c.output(\"xxx.csv\")\n    search_result_names_ci = SearchResult.search_write_cols_ci\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names_ci == list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6642150646715699\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_name\"] == \"\"\n        assert row[\"query_md5\"] == \"832a45e8\"\n        assert row[\"ani\"] == \"0.9868883523107224\"\n        assert row[\"ani_low\"] == \"0.986374049720872\"\n        assert row[\"ani_high\"] == \"0.9873870188726516\"\n\n\ndef test_search_jaccard_ani_downsample(runtmp):\n    c = runtmp\n\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig4763 = utils.get_test_data(\"47+63.fa.sig\")\n    ss47 = load_one_signature(sig47)\n    ss4763 = load_one_signature(sig4763)\n    print(f\"SCALED: sig1: {ss47.minhash.scaled}, sig2: {ss4763.minhash.scaled}\")\n\n    c.run_sourmash(\"search\", sig47, sig4763, \"-o\", \"xxx.csv\")\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    search_result_names = SearchResult.search_write_cols\n    search_result_names_ci = SearchResult.search_write_cols_ci\n\n    csv_file = c.output(\"xxx.csv\")\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert search_result_names == list(row.keys())\n        assert search_result_names_ci != list(row.keys())\n        assert float(row[\"similarity\"]) == 0.6564798376870403\n        assert row[\"filename\"].endswith(\"47+63.fa.sig\")\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"query_filename\"].endswith(\"47.fa\")\n        assert (\n            row[\"query_name\"] == \"NC_009665.1 Shewanella baltica OS185, complete genome\"\n        )\n        assert row[\"query_md5\"] == \"09a08691\"\n        assert row[\"ani\"] == \"0.992530907924384\"\n\n    # downsample one and check similarity and ANI\n    ds_sig47 = c.output(\"ds_sig47.sig\")\n    c.run_sourmash(\"sig\", \"downsample\", sig47, \"--scaled\", \"2000\", \"-o\", ds_sig47)\n    c.run_sourmash(\"search\", ds_sig47, sig4763, \"-o\", \"xxx.csv\")\n    #\n    csv_file = c.output(\"xxx.csv\")\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert round(float(row[\"similarity\"]), 3) == round(0.6634517766497462, 3)\n        assert round(float(row[\"ani\"]), 3) == 0.993\n\n    # downsample manually and assert same ANI\n    ss47_ds = load_one_signature(ds_sig47)\n    print(\"SCALED:\", ss47_ds.minhash.scaled, ss4763.minhash.scaled)\n    ani_info = ss47_ds.jaccard_ani(ss4763, downsample=True)\n    print(ani_info)\n    assert round(ani_info.ani, 3) == 0.993\n    assert (1 - round(ani_info.dist, 3)) == 0.993\n\n\ndef test_gather_ani_csv(runtmp, linear_gather, prefetch_gather):\n    testdata1 = utils.get_test_data(\"63.fa.sig\")\n    testdata2 = utils.get_test_data(\"47+63.fa.sig\")\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", testdata2)\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        testdata1,\n        \"zzz\",\n        \"-o\",\n        \"foo.csv\",\n        \"--threshold-bp=1\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    csv_file = runtmp.output(\"foo.csv\")\n    gather_result_names = GatherResult.gather_write_cols\n    gather_result_names_ci = GatherResult.gather_write_cols_ci\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert gather_result_names == list(row.keys())\n        assert gather_result_names_ci != list(row.keys())\n        assert float(row[\"intersect_bp\"]) == 5238000.0\n        assert float(row[\"unique_intersect_bp\"]) == 5238000.0\n        assert float(row[\"remaining_bp\"]) == 0.0\n        assert float(row[\"f_orig_query\"]) == 1.0\n        assert float(row[\"f_unique_to_query\"]) == 1.0\n        assert float(row[\"f_match\"]) == 0.6642150646715699\n        assert row[\"filename\"] == \"zzz\"\n        assert row[\"md5\"] == \"491c0a81b2cfb0188c0d3b46837c2f42\"\n        assert row[\"gather_result_rank\"] == \"0\"\n        assert row[\"query_md5\"] == \"38729c63\"\n        assert row[\"query_bp\"] == \"5238000\"\n        assert row[\"query_containment_ani\"] == \"1.0\"\n        assert round(float(row[\"match_containment_ani\"]), 3) == 0.987\n        assert round(float(row[\"average_containment_ani\"]), 3) == 0.993\n        assert round(float(row[\"max_containment_ani\"]), 3) == 1.0\n        assert row[\"potential_false_negative\"] == \"False\"\n\n\ndef test_gather_ani_csv_estimate_ci(runtmp, linear_gather, prefetch_gather):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"scaled=10\", \"--name-from-first\", testdata1, testdata2\n    )\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"scaled=10\",\n        \"-o\",\n        \"query.fa.sig\",\n        \"--name-from-first\",\n        testdata2,\n    )\n\n    runtmp.sourmash(\"index\", \"-k\", \"31\", \"zzz\", \"short.fa.sig\", \"short2.fa.sig\")\n\n    assert os.path.exists(runtmp.output(\"zzz.sbt.zip\"))\n\n    runtmp.sourmash(\n        \"gather\",\n        \"query.fa.sig\",\n        \"zzz\",\n        \"-o\",\n        \"foo.csv\",\n        \"--threshold-bp=1\",\n        \"--estimate-ani-ci\",\n        linear_gather,\n        prefetch_gather,\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    csv_file = runtmp.output(\"foo.csv\")\n\n    gather_result_names = GatherResult.gather_write_cols_ci\n\n    with open(csv_file) as fp:\n        reader = csv.DictReader(fp)\n        row = next(reader)\n        print(row)\n        assert gather_result_names == list(row.keys())\n        assert float(row[\"intersect_bp\"]) == 910\n        assert float(row[\"unique_intersect_bp\"]) == 910\n        assert float(row[\"remaining_bp\"]) == 0\n        assert float(row[\"f_orig_query\"]) == 1.0\n        assert float(row[\"f_unique_to_query\"]) == 1.0\n        assert float(row[\"f_match\"]) == 1.0\n        assert row[\"filename\"] == \"zzz\"\n        assert row[\"name\"] == \"tr1 4\"\n        assert row[\"md5\"] == \"c9d5a795eeaaf58e286fb299133e1938\"\n        assert row[\"gather_result_rank\"] == \"0\"\n        assert row[\"query_filename\"].endswith(\"short2.fa\")\n        assert row[\"query_name\"] == \"tr1 4\"\n        assert row[\"query_md5\"] == \"c9d5a795\"\n        assert row[\"query_bp\"] == \"910\"\n        assert row[\"query_containment_ani\"] == \"1.0\"\n        assert row[\"query_containment_ani_low\"] == \"1.0\"\n        assert row[\"query_containment_ani_high\"] == \"1.0\"\n        assert row[\"match_containment_ani\"] == \"1.0\"\n        assert row[\"match_containment_ani_low\"] == \"1.0\"\n        assert row[\"match_containment_ani_high\"] == \"1.0\"\n        assert row[\"average_containment_ani\"] == \"1.0\"\n        assert row[\"max_containment_ani\"] == \"1.0\"\n        assert row[\"potential_false_negative\"] == \"False\"\n\n\ndef test_compare_containment_ani(runtmp):\n    # test compare --containment --ani\n    c = runtmp\n\n    sigfiles = [\"2.fa.sig\", \"2+63.fa.sig\", \"47.fa.sig\", \"63.fa.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--containment\",\n        \"-k\",\n        \"31\",\n        \"--ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 3)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = ss_j.containment_ani(ss_i).ani\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 3)\n                else:\n                    containment_ani = 0.0\n                mat_val = round(mat[i][j], 3)\n\n                assert containment_ani == mat_val  # , (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n    assert (\n        \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_containment_ani_asymmetry(runtmp):\n    # very specifically test asymmetry of ANI in containment matrices ;)\n    c = runtmp\n\n    import numpy\n\n    sigfiles = [\"47.fa.sig\", \"47-63-merge.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--containment\",\n        \"-k\",\n        \"31\",\n        \"--ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output of compare --containment --estimate-ani\n    with open(c.output(\"output.csv\")) as fp:\n        r = iter(csv.reader(fp))\n        headers = next(r)\n\n        mat = numpy.zeros((len(headers), len(headers)))\n        for i, row in enumerate(r):\n            for j, val in enumerate(row):\n                mat[i][j] = float(val)\n\n        print(mat)\n\n    # load in all the input signatures\n    idx_to_sig = {}\n    for idx, filename in enumerate(testdata_sigs):\n        ss = load_one_signature(filename, ksize=31)\n        idx_to_sig[idx] = ss\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 6)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = ss_j.containment_ani(ss_i).ani\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 6)\n                else:\n                    containment_ani = 0.0\n                mat_val = round(mat[i][j], 6)\n\n                assert containment_ani == mat_val  # , (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n\n\ndef test_compare_jaccard_ani(runtmp):\n    c = runtmp\n\n    sigfiles = [\"47.fa.sig\", \"47-63-merge.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--containment\",\n        \"-k\",\n        \"31\",\n        \"--ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 6)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = ss_j.containment_ani(ss_i).ani\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 6)\n                else:\n                    containment_ani = 0.0\n                mat_val = round(mat[i][j], 6)\n\n                assert containment_ani == mat_val  # , (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n\n\ndef test_compare_jaccard_protein_parallel_ani_bug(runtmp):\n    # this checks a bug that occurred with serialization of protein minhash\n    # in parallel situations. See #2262.\n    c = runtmp\n\n    sigfile = utils.get_test_data(\"prot/protein.zip\")\n\n    c.run_sourmash(\"compare\", \"--ani\", \"-p\", \"2\", \"--csv\", \"output.csv\", sigfile)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n\n\ndef test_compare_containment_ani_asymmetry_distance(runtmp):\n    # very specifically test asymmetry of ANI in containment matrices ;)\n    # ...calculated with --distance\n    c = runtmp\n\n    sigfiles = [\"47.fa.sig\", \"47-63-merge.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--containment\",\n        \"-k\",\n        \"31\",\n        \"--distance-matrix\",\n        \"--ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 6)\n            print(mat_val)\n            if i == j:\n                assert 0 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = 1 - ss_j.containment_ani(ss_i).ani\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 6)\n                else:\n                    containment_ani = 1\n                mat_val = round(mat[i][j], 6)\n\n                assert containment_ani == mat_val  # , (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n\n\ndef test_compare_jaccard_ani(runtmp):\n    c = runtmp\n\n    sigfiles = [\"2.fa.sig\", \"2+63.fa.sig\", \"47.fa.sig\", \"63.fa.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\", \"-k\", \"31\", \"--estimate-ani\", \"--csv\", \"output.csv\", *testdata_sigs\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit calculations against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 3)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                jaccard_ani = ss_j.jaccard_ani(ss_i).ani\n                if jaccard_ani is not None:\n                    jaccard_ani = round(jaccard_ani, 3)\n                else:\n                    jaccard_ani = 0.0\n                print(jaccard_ani)\n\n                assert jaccard_ani == mat_val  # , (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n    assert (\n        \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_jaccard_ani_jaccard_error_too_high(runtmp):\n    c = runtmp\n\n    testdata1 = utils.get_test_data(\"short.fa\")\n    sig1 = c.output(\"short.fa.sig\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    sig2 = c.output(\"short2.fa.sig\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=1\", \"-o\", sig1, testdata1)\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,scaled=1\", \"-o\", sig2, testdata2)\n    testdata_sigs = [sig1, sig2]\n\n    c.run_sourmash(\n        \"compare\",\n        \"-k\",\n        \"31\",\n        \"--estimate-ani\",\n        \"--csv\",\n        \"output.csv\",\n        \"short.fa.sig\",\n        \"short2.fa.sig\",\n    )\n    print(c.last_result.status, c.last_result.out, c.last_result.err)\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 3)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                jaccard_ani = ss_j.jaccard_ani(ss_i).ani\n                if jaccard_ani is not None:\n                    jaccard_ani = round(jaccard_ani, 3)\n                else:\n                    jaccard_ani = 0.0\n                print(jaccard_ani)\n\n                assert jaccard_ani == mat_val  # , (i, j)\n\n    assert (\n        \"WARNING: Jaccard estimation for at least one of these comparisons is likely inaccurate. Could not estimate ANI for these comparisons.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_max_containment_ani(runtmp):\n    c = runtmp\n\n    sigfiles = [\"2.fa.sig\", \"2+63.fa.sig\", \"47.fa.sig\", \"63.fa.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--max-containment\",\n        \"-k\",\n        \"31\",\n        \"--estimate-ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 3)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = ss_j.max_containment_ani(ss_i).ani\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 3)\n                else:\n                    containment_ani = 0.0\n\n                assert containment_ani == mat_val, (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n    assert (\n        \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_avg_containment_ani(runtmp):\n    # test compare --avg-containment --ani\n    c = runtmp\n\n    sigfiles = [\"2.fa.sig\", \"2+63.fa.sig\", \"47.fa.sig\", \"63.fa.sig\"]\n    testdata_sigs = [utils.get_test_data(c) for c in sigfiles]\n\n    c.run_sourmash(\n        \"compare\",\n        \"--avg-containment\",\n        \"-k\",\n        \"31\",\n        \"--estimate-ani\",\n        \"--csv\",\n        \"output.csv\",\n        *testdata_sigs,\n    )\n\n    # load the matrix output\n    mat, idx_to_sig = _load_compare_matrix_and_sigs(\n        c.output(\"output.csv\"), testdata_sigs\n    )\n\n    # check explicit avg containment against output of compare\n    for i in range(len(idx_to_sig)):\n        ss_i = idx_to_sig[i]\n        for j in range(len(idx_to_sig)):\n            mat_val = round(mat[i][j], 3)\n            print(mat_val)\n            if i == j:\n                assert 1 == mat_val\n            else:\n                ss_j = idx_to_sig[j]\n                containment_ani = ss_j.avg_containment_ani(ss_i)\n                if containment_ani is not None:\n                    containment_ani = round(containment_ani, 3)\n                else:\n                    containment_ani = 0.0\n\n                assert containment_ani == mat_val, (i, j)\n\n    print(c.last_result.err)\n    print(c.last_result.out)\n    assert (\n        \"WARNING: Some of these sketches may have no hashes in common based on chance alone (false negatives). Consider decreasing your scaled value to prevent this.\"\n        in c.last_result.err\n    )\n\n\ndef test_compare_ANI_require_scaled(runtmp):\n    # check that compare with containment requires scaled sketches\n    c = runtmp\n\n    s47 = utils.get_test_data(\"num/47.fa.sig\")\n    s63 = utils.get_test_data(\"num/63.fa.sig\")\n\n    # containment and estimate ANI will give this error\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compare\",\n            \"--containment\",\n            \"--estimate-ani\",\n            \"-k\",\n            \"31\",\n            s47,\n            s63,\n            fail_ok=True,\n        )\n    assert (\n        \"must use scaled signatures with --containment, --max-containment, and --avg-containment\"\n        in c.last_result.err\n    )\n    assert c.last_result.status != 0\n\n    # jaccard + estimate ANI will give this error\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"compare\", \"--estimate-ani\", \"-k\", \"31\", s47, s63, fail_ok=True)\n\n    assert \"must use scaled signatures with --estimate-ani\" in c.last_result.err\n    assert c.last_result.status != 0\n"
  },
  {
    "path": "tests/test_sourmash_args.py",
    "content": "\"\"\"\nTests for functions in sourmash_args module.\n\"\"\"\n\nimport sys\nimport os\nimport pytest\nimport gzip\nimport zipfile\nimport io\nimport contextlib\nimport csv\nimport argparse\nimport shutil\nimport json\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash import sourmash_args, manifest\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.index import LinearIndex\nfrom sourmash.cli.utils import add_ksize_arg\n\nfrom sourmash.signature import load_signatures_from_json, save_signatures_to_json\n\n\ndef test_save_signatures_api_none():\n    # save to sigfile\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    with sourmash_args.SaveSignaturesToLocation(None) as save_sig:\n        print(repr(save_sig))\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    # nothing to test - no output!\n\n\ndef test_save_signatures_to_location_1_sig(runtmp):\n    # save to sigfile.sig\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.sig\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_stdout():\n    # save to stdout\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    output_capture = io.StringIO()\n    with contextlib.redirect_stdout(output_capture):\n        with sourmash_args.SaveSignaturesToLocation(\"-\") as save_sig:\n            save_sig.add(ss2)\n            save_sig.add(ss47)\n\n    output = output_capture.getvalue()\n\n    saved = list(load_signatures_from_json(output))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_sig_is_default(runtmp):\n    # save to sigfile.txt\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.txt\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    saved = list(load_signatures_from_json(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_sig_gz(runtmp):\n    # save to sigfile.gz\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.sig.gz\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    # can we open as a .gz file?\n    with gzip.open(outloc, \"r\") as fp:\n        print(save_sig)\n        fp.read()\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_zip(runtmp):\n    # save to sigfile.zip\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.zip\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    # can we open as a .zip file?\n    with zipfile.ZipFile(outloc, \"r\") as zf:\n        assert list(zf.infolist())\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_zip_bad(runtmp):\n    # try saving to bad sigfile.zip\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.zip\")\n\n    # create bad zip:\n    with open(outloc, \"w\"):\n        pass\n\n    # now check for error\n    with pytest.raises(ValueError) as exc:\n        with sourmash_args.SaveSignaturesToLocation(outloc):\n            pass\n\n    assert \"cannot be opened as a zip file\" in str(exc)\n\n\ndef test_save_signatures_to_location_1_zip_dup(runtmp):\n    # save to sigfile.zip\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"foo.zip\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n        # here we have to change the names so the sig content is different;\n        # exact duplicates will not be saved, otherwise.\n        ss2 = ss2.to_mutable()\n        ss2.name = \"different name for ss2\"\n        save_sig.add(ss2)\n\n        ss47 = ss47.to_mutable()\n        ss47.name = \"different name for ss47\"\n        save_sig.add(ss47)\n\n    # can we open as a .zip file?\n    with zipfile.ZipFile(outloc, \"r\") as zf:\n        assert list(zf.infolist())\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 4\n\n\ndef test_save_signatures_to_location_2_zip_add(runtmp):\n    # create sigfile.zip; then, add a new signature.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    # add only ss2\n    outloc = runtmp.output(\"foo.zip\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n\n    # can we open as a .zip file?\n    with zipfile.ZipFile(outloc, \"r\") as zf:\n        assert list(zf.infolist())\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert len(saved) == 1\n\n    # now, re-open and add ss47.\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss47)\n\n    # updated file should contain both.\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    print(saved)\n    assert ss47 in saved\n    assert ss2 in saved\n\n\ndef test_save_signatures_to_location_2_zip_add_dup(runtmp):\n    # create sigfile.zip; then, add a new signature, plus a ~duplicate.\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    # add only ss2\n    outloc = runtmp.output(\"foo.zip\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n\n    # can we open as a .zip file?\n    with zipfile.ZipFile(outloc, \"r\") as zf:\n        assert list(zf.infolist())\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert len(saved) == 1\n\n    # now, re-open and add ss47, plus a slightly renamed ss2.\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss47)\n\n        # add ss2; here we have to change the names so the sig content is\n        # different exact duplicates will not be saved, otherwise.\n        import copy\n\n        ss2copy = ss2.to_mutable()\n        ss2copy.name = \"different name for ss2\"\n        save_sig.add(ss2copy)\n\n    # updated file should contain all three.\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    print(len(saved), saved)\n    assert ss47 in saved\n    assert ss2 in saved\n    assert ss2copy in saved\n\n\ndef test_save_signatures_to_location_3_zip_add_fail(runtmp):\n    # create sigfile.zip using zipfile, then try to add to it (& fail)\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    load_one_signature(sig47, ksize=31)\n\n    # add only ss2, using zipfile API\n    outloc = runtmp.output(\"foo.zip\")\n    with zipfile.ZipFile(outloc, \"x\") as zf:\n        with zf.open(\"xyz.sig\", \"w\") as fp:\n            save_signatures_to_json([ss2], fp=fp, compression=1)\n\n    # verify it can be loaded, yada yada\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    print(len(saved), saved)\n    assert ss2 in saved\n\n    # now, try to open existing file with SaveSignaturesToLocation...\n    with pytest.raises(ValueError) as exc:\n        with sourmash_args.SaveSignaturesToLocation(outloc):\n            pass\n\n    assert \"Cannot add to existing zipfile\" in str(exc)\n\n\ndef test_save_signatures_to_location_3_zip_add_with_manifest(runtmp):\n    # create sigfile.zip using zipfile, then try to add to it (& fail)\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    # add only ss2, using zipfile API; add manifest manually.\n    outloc = runtmp.output(\"foo.zip\")\n    with zipfile.ZipFile(outloc, \"x\") as zf:\n        with zf.open(\"xyz.sig\", \"w\") as fp:\n            save_signatures_to_json([ss2], fp=fp, compression=1)\n\n        # make a manifest row...\n        row = manifest.CollectionManifest.make_manifest_row(\n            ss2, \"xyz.sig\", include_signature=False\n        )\n\n        # construct & save manifest\n        mf = manifest.CollectionManifest([row])\n        mf_name = \"SOURMASH-MANIFEST.csv\"\n\n        manifest_fp = io.StringIO()\n        mf.write_to_csv(manifest_fp, write_header=True)\n        manifest_data = manifest_fp.getvalue().encode(\"utf-8\")\n\n        with zf.open(mf_name, \"w\") as fp:\n            fp.write(manifest_data)\n\n        # fini! made our artisanal hand-crafted zipfile. Now...\n\n    # verify it can be loaded, yada yada\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    print(len(saved), saved)\n    assert ss2 in saved\n\n    # now, try to open existing file with SaveSignaturesToLocation...\n    # ...should succeed!\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss47)\n\n    # updated file should contain both\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    print(len(saved), saved)\n    assert ss47 in saved\n    assert ss2 in saved\n\n\ndef test_save_signatures_to_location_1_dirout(runtmp):\n    # save to sigout/ (directory)\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"sigout/\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    assert os.path.isdir(outloc)\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 2\n\n\ndef test_save_signatures_to_location_1_dirout_bug_2751(runtmp):\n    # check for 2x compressed sig files\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"sigout/\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    assert os.path.isdir(outloc)\n    print(os.listdir(outloc))\n\n    outloc2 = runtmp.output(\"sigout/09a08691ce52952152f0e866a59f6261.sig.gz\")\n    with gzip.open(outloc2, \"r\") as fp:\n        data = fp.read()\n        print(data)\n        _ = json.loads(data)\n\n\ndef test_save_signatures_to_location_1_dirout_duplicate(runtmp):\n    # save to sigout/ (directory)\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    outloc = runtmp.output(\"sigout/\")\n    with sourmash_args.SaveSignaturesToLocation(outloc) as save_sig:\n        print(save_sig)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n        save_sig.add(ss2)\n        save_sig.add(ss47)\n\n    assert os.path.isdir(outloc)\n\n    saved = list(sourmash.load_file_as_signatures(outloc))\n    assert ss2 in saved\n    assert ss47 in saved\n    assert len(saved) == 4\n\n\ndef test_load_empty_zipfile(runtmp):\n    outloc = runtmp.output(\"empty.zip\")\n    with sourmash_args.SaveSignaturesToLocation(outloc):\n        pass\n\n    sigiter = sourmash.load_file_as_signatures(outloc)\n    assert list(sigiter) == []\n\n\ndef test_load_many_sigs_empty_file(runtmp):\n    # make sure load_many_signatures behaves properly on empty file\n    outloc = runtmp.output(\"empty.sig\")\n    with open(outloc, \"w\"):\n        pass\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    with contextlib.redirect_stderr(io.StringIO()) as errfp:\n        with pytest.raises(SystemExit):\n            for ss, sigloc in sourmash_args.load_many_signatures([outloc], progress):\n                pass\n\n    err = errfp.getvalue()\n    print(err)\n    assert f\"ERROR: Error while reading signatures from '{outloc}'.\" in err\n    assert \"(continuing)\" not in err\n\n\ndef test_load_many_sigs_empty_file_force(runtmp):\n    # make sure load_many_signatures behaves properly on empty file w/force\n    outloc = runtmp.output(\"empty.sig\")\n    with open(outloc, \"w\"):\n        pass\n\n    progress = sourmash_args.SignatureLoadingProgress()\n\n    with contextlib.redirect_stderr(io.StringIO()) as errfp:\n        for ss, sigloc in sourmash_args.load_many_signatures(\n            [outloc], progress, force=True\n        ):\n            pass\n\n    err = errfp.getvalue()\n    print(err)\n    assert f\"ERROR: Error while reading signatures from '{outloc}'.\" in err\n    assert \"(continuing)\" in err\n\n\ndef test_get_manifest_1():\n    # basic get_manifest retrieves a manifest\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    idx = sourmash.load_file_as_index(sig47)\n\n    manifest = sourmash_args.get_manifest(idx)\n    assert len(manifest) == 1\n\n\ndef test_get_manifest_2_cannot_build():\n    # test what happens when get_manifest cannot build manifest\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47)\n\n    idx = LinearIndex([ss47])\n\n    with pytest.raises(SystemExit):\n        sourmash_args.get_manifest(idx)\n\n\ndef test_get_manifest_2_cannot_buildno_require():\n    # test what happens when get_manifest cannot build manifest\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47)\n\n    idx = LinearIndex([ss47])\n\n    m = sourmash_args.get_manifest(idx, require=False)\n\n    assert m is None\n\n\ndef test_get_manifest_3_build():\n    # check that manifest is building\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47)\n\n    class FakeIndex(LinearIndex):\n        was_called = 0\n\n        def _signatures_with_internal(self):\n            self.was_called = 1\n            return [(ss47, \"fakeiloc\")]\n\n    idx = FakeIndex([sig47])\n\n    assert not idx.was_called\n    m = sourmash_args.get_manifest(idx)\n    assert idx.was_called\n\n    print(m)\n    assert len(m) == 1\n    assert m.rows[0][\"internal_location\"] == \"fakeiloc\"\n\n\ndef test_get_manifest_3_build_2():\n    # check that manifest is building, but only when asked\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    ss47 = load_one_signature(sig47)\n\n    class FakeIndex(LinearIndex):\n        manifest = None\n        was_called = 0\n\n        def _signatures_with_internal(self):\n            self.was_called = 1\n            return [(ss47, \"fakeiloc\")]\n\n    idx = FakeIndex([sig47])\n\n    assert not idx.was_called\n    m = sourmash_args.get_manifest(idx)\n    assert idx.was_called\n\n    # now set and ask again, should not be called\n    idx.manifest = m\n    idx.was_called = 0\n\n    m2 = sourmash_args.get_manifest(idx)\n    assert not idx.was_called\n    assert m == m2\n\n    # now, force rebuild\n    m3 = sourmash_args.get_manifest(idx, rebuild=True)\n    assert idx.was_called\n    assert m == m3\n\n\nclass FakeArgs:\n    picklist = None\n    include_db_pattern = None\n    exclude_db_pattern = None\n\n\ndef test_pattern_0():\n    # test neither --include nor --exclude\n    args = FakeArgs()\n    args.picklist = None\n    args.include_db_pattern = None\n    args.exclude_db_pattern = None\n\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    assert pattern_search is None\n\n\ndef test_pattern_1():\n    # test just --include-pattern handling\n    args = FakeArgs()\n    args.picklist = None\n    args.include_db_pattern = \"foo\"\n    args.exclude_db_pattern = None\n\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    assert pattern_search([\"foo\", \"bar\", \"baz\"])\n    assert not pattern_search([\"bar\", \"bif\"])\n\n\ndef test_pattern_2():\n    # test just --exclude-pattern handling\n    args = FakeArgs()\n    args.picklist = None\n    args.exclude_db_pattern = \"foo\"\n    args.include_db_pattern = None\n\n    pattern_search = sourmash_args.load_include_exclude_db_patterns(args)\n    assert not pattern_search([\"foo\", \"bar\", \"baz\"])\n    assert pattern_search([\"bar\", \"baz\", \"bif\"])\n\n\ndef test_pattern_3():\n    # test with --picklist and --exclude: should fail\n    args = FakeArgs()\n    args.picklist = True\n    args.exclude_db_pattern = \"foo\"\n    args.include_db_pattern = None\n\n    with pytest.raises(SystemExit):\n        sourmash_args.load_include_exclude_db_patterns(args)\n\n\ndef test_pattern_4():\n    # test with --picklist and --include: should fail\n    args = FakeArgs()\n    args.picklist = True\n    args.include_db_pattern = \"foo\"\n    args.exclude_db_pattern = None\n\n    with pytest.raises(SystemExit):\n        sourmash_args.load_include_exclude_db_patterns(args)\n\n\ndef test_pattern_5():\n    # test with --include and --exclude: should fail\n    args = FakeArgs()\n    args.picklist = None\n    args.exclude_db_pattern = \"foo\"\n    args.include_db_pattern = \"bar\"\n\n    with pytest.raises(SystemExit):\n        sourmash_args.load_include_exclude_db_patterns(args)\n\n\ndef test_fileinput_csv_1_plain():\n    # test basic CSV input\n\n    testfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    with sourmash_args.FileInputCSV(testfile) as r:\n        rows = list(r)\n        assert len(rows) == 6\n\n\ndef test_fileinput_csv_1_no_such_file(runtmp):\n    # test fail to load file\n\n    noexistfile = runtmp.output(\"does-not-exist.csv\")\n\n    with pytest.raises(FileNotFoundError):\n        with sourmash_args.FileInputCSV(noexistfile):\n            pass\n\n\ndef test_fileinput_csv_2_gz(runtmp):\n    # test basic CSV input from gz file\n\n    testfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    gzfile = runtmp.output(\"test.csv.gz\")\n\n    with gzip.open(gzfile, \"wt\") as outfp:\n        with open(testfile, newline=\"\") as infp:\n            outfp.write(infp.read())\n\n    with sourmash_args.FileInputCSV(gzfile) as r:\n        rows = list(r)\n        assert len(rows) == 6\n\n\ndef test_fileinput_csv_2_gz_not_csv(runtmp):\n    # test basic CSV input from gz file that's not CSV - works\n\n    gzfile = runtmp.output(\"test.csv.gz\")\n\n    with gzip.open(gzfile, \"wt\") as outfp:\n        outfp.write(\"hello world!\")\n\n    with sourmash_args.FileInputCSV(gzfile) as r:\n        assert r.fieldnames == [\"hello world!\"]\n\n\ndef test_fileinput_csv_2_gz_bad_version_header(runtmp):\n    # test basic CSV input from gz file with bad version header\n    # currently this works; not clear to me how it should fail :grin:\n\n    gzfile = runtmp.output(\"test.csv.gz\")\n\n    with gzip.open(gzfile, \"wt\") as outfp:\n        outfp.write(\"# excelsior\\nhello world!\")\n\n    with sourmash_args.FileInputCSV(gzfile) as r:\n        assert r.fieldnames == [\"hello world!\"]\n        print(r.version_info)\n        assert r.version_info == [\"excelsior\"]\n\n\ndef test_fileinput_csv_2_zip(runtmp):\n    # test CSV input from zip file, with component filename\n\n    testfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    zf_file = runtmp.output(\"test.zip\")\n\n    with zipfile.ZipFile(zf_file, \"w\") as outzip:\n        with open(testfile, \"rb\") as infp:\n            with outzip.open(\"XYZ.csv\", \"w\") as outfp:\n                outfp.write(infp.read())\n\n    with sourmash_args.FileInputCSV(zf_file, default_csv_name=\"XYZ.csv\") as r:\n        rows = list(r)\n        assert len(rows) == 6\n        print(rows)\n\n\ndef test_fileinput_csv_3_load_manifest():\n    # test loading a manifest from a zipfile collection, using\n    # FileInputCSV.\n    testfile = utils.get_test_data(\"prot/all.zip\")\n\n    with sourmash_args.FileInputCSV(\n        testfile, default_csv_name=\"SOURMASH-MANIFEST.csv\"\n    ) as r:\n        rows = list(r)\n        assert len(rows) == 8\n\n        assert r.version_info == [\"SOURMASH-MANIFEST-VERSION\", \"1.0\"]\n\n\ndef test_fileinput_csv_3_load_manifest_no_default():\n    # test loading a manifest from a zipfile collection, using\n    # FileInputCSV, but with no default_csv_name - should fail\n    testfile = utils.get_test_data(\"prot/all.zip\")\n\n    with pytest.raises(csv.Error):\n        with sourmash_args.FileInputCSV(testfile) as r:\n            print(r.fieldnames)\n\n\ndef test_fileinput_csv_3_load_manifest_zipfile_obj():\n    # test loading a manifest from an open zipfile obj, using\n    # FileInputCSV.\n    testfile = utils.get_test_data(\"prot/all.zip\")\n\n    with zipfile.ZipFile(testfile, \"r\") as zf:\n        with sourmash_args.FileInputCSV(\n            testfile, default_csv_name=\"SOURMASH-MANIFEST.csv\", zipfile_obj=zf\n        ) as r:\n            rows = list(r)\n            assert len(rows) == 8\n\n            assert r.version_info == [\"SOURMASH-MANIFEST-VERSION\", \"1.0\"]\n\n\ndef test_fileinput_csv_3_load_manifest_zipfile_obj_no_defualt():\n    # test loading a manifest from an open zipfile obj, using\n    # FileInputCSV, but with no default csv name => should fail.\n    testfile = utils.get_test_data(\"prot/all.zip\")\n\n    with zipfile.ZipFile(testfile, \"r\") as zf:\n        with pytest.raises(ValueError):\n            with sourmash_args.FileInputCSV(testfile, zipfile_obj=zf):\n                pass\n\n\ndef test_fileoutput_csv_1(runtmp):\n    # test basic behavior\n    outfile = runtmp.output(\"xxx.csv\")\n\n    with sourmash_args.FileOutputCSV(outfile) as fp:\n        w = csv.writer(fp)\n        w.writerow([\"a\", \"b\", \"c\"])\n        w.writerow([\"x\", \"y\", \"z\"])\n\n    with open(outfile, newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1\n        row = rows[0]\n        assert row[\"a\"] == \"x\"\n        assert row[\"b\"] == \"y\"\n        assert row[\"c\"] == \"z\"\n\n\ndef test_fileoutput_csv_1_gz(runtmp):\n    # test basic behavior => gz\n    outfile = runtmp.output(\"xxx.csv.gz\")\n\n    with sourmash_args.FileOutputCSV(outfile) as fp:\n        w = csv.writer(fp)\n        w.writerow([\"a\", \"b\", \"c\"])\n        w.writerow([\"x\", \"y\", \"z\"])\n\n    with gzip.open(outfile, \"rt\") as fp:\n        r = csv.DictReader(fp)\n        rows = list(r)\n        assert len(rows) == 1\n        row = rows[0]\n        assert row[\"a\"] == \"x\"\n        assert row[\"b\"] == \"y\"\n        assert row[\"c\"] == \"z\"\n\n\ndef test_fileoutput_csv_2_stdout():\n    # test '-' and 'None' go to sys.stdout\n\n    with sourmash_args.FileOutputCSV(\"-\") as fp:\n        assert fp == sys.stdout\n\n    with sourmash_args.FileOutputCSV(None) as fp:\n        assert fp == sys.stdout\n\n\ndef test_add_ksize_arg_no_default():\n    # test behavior of cli.utils.add_ksize_arg\n    p = argparse.ArgumentParser()\n    add_ksize_arg(p)\n    args = p.parse_args()\n    assert args.ksize is None\n\n\ndef test_add_ksize_arg_no_default_specify():\n    # test behavior of cli.utils.add_ksize_arg\n    p = argparse.ArgumentParser()\n    add_ksize_arg(p)\n    args = p.parse_args([\"-k\", \"21\"])\n    assert args.ksize == 21\n\n\ndef test_add_ksize_arg_default_31():\n    # test behavior of cli.utils.add_ksize_arg\n    p = argparse.ArgumentParser()\n    add_ksize_arg(p, default=31)\n    args = p.parse_args()\n    assert args.ksize == 31\n\n\ndef test_add_ksize_arg_default_31_specify():\n    # test behavior of cli.utils.add_ksize_arg\n    p = argparse.ArgumentParser()\n    add_ksize_arg(p, default=31)\n    args = p.parse_args([\"-k\", \"21\"])\n    assert args.ksize == 21\n\n\ndef test_bug_2370(runtmp):\n    # bug - manifest loading code does not catch gzip.BadGzipFile\n    sigfile = utils.get_test_data(\"63.fa.sig\")\n\n    # copy sigfile over to a .gz file without compressing it -\n    shutil.copyfile(sigfile, runtmp.output(\"not_really_gzipped.gz\"))\n\n    # try running sourmash_args.load_file_as_index\n    # runtmp.sourmash('sig', 'describe', runtmp.output('not_really_gzipped.gz'))\n    sourmash_args.load_file_as_index(runtmp.output(\"not_really_gzipped.gz\"))\n\n\ndef test_load_one_signature_1(runtmp):\n    # test the sourmash_args.load_one_signature function\n    sigfile = utils.get_test_data(\"63.fa.sig.zip\")\n\n    ss = sourmash_args.load_one_signature(sigfile, ksize=31)\n    assert ss.name.startswith(\"NC_011663.1 \")\n\n\ndef test_load_one_signature_2_fail(runtmp):\n    # test the sourmash_args.load_one_signature function on failure - no sig\n    sigfile = utils.get_test_data(\"63.fa.sig.zip\")\n\n    with pytest.raises(ValueError) as exc:\n        sourmash_args.load_one_signature(sigfile, ksize=21)\n\n    assert \"expected exactly one.\" in str(exc)\n\n\ndef test_load_one_signature_3_fail(runtmp):\n    # test the sourmash_args.load_one_signature function on failure - many sigs\n    sigfile = utils.get_test_data(\"prot/all.zip\")\n\n    with pytest.raises(ValueError) as exc:\n        sourmash_args.load_one_signature(sigfile)\n\n    assert \"more than one signature\" in str(exc)\n"
  },
  {
    "path": "tests/test_sourmash_compute.py",
    "content": "\"\"\"\nTests for sourmash compute command-line functionality.\n\"\"\"\n\nimport os\nimport gzip\nimport shutil\nimport screed\nimport glob\nimport json\nimport csv\nimport pytest\n\nimport sourmash_tst_utils as utils\n\nimport sourmash\nfrom sourmash import MinHash\nfrom sourmash.sbt import SBT, Node\nfrom sourmash.sbtmh import SigLeaf, load_sbt_index\nfrom sourmash.command_compute import ComputeParameters\nfrom sourmash.cli.compute import subparser\nfrom sourmash.cli import SourmashParser\n\nfrom sourmash import signature\nfrom sourmash import VERSION\nfrom sourmash_tst_utils import SourmashCommandFailed\n\nfrom sourmash.signature import load_signatures_from_json\n\n\ndef test_do_sourmash_compute():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\", [\"compute\", \"-k\", \"31\", testdata1], in_directory=location\n        )\n\n        sigfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(sigfile)\n\n        sig = next(load_signatures_from_json(sigfile))\n        assert str(sig).endswith(\"short.fa\")\n\n\ndef test_do_sourmash_compute_check_num_bounds_negative(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = c.output(\"short.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compute\",\n            \"-k\",\n            \"31\",\n            \"--num-hashes\",\n            \"-5\",\n            \"-o\",\n            sigfile,\n            \"--merge\",\n            '\"name\"',\n            testdata1,\n            testdata2,\n            testdata3,\n        )\n\n    assert \"ERROR: num value must be positive\" in c.last_result.err\n\n\ndef test_do_sourmash_compute_check_num_bounds_less_than_minimum(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = c.output(\"short.fa.sig\")\n\n    c.run_sourmash(\n        \"compute\",\n        \"-k\",\n        \"31\",\n        \"--num-hashes\",\n        \"25\",\n        \"-o\",\n        sigfile,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    assert \"WARNING: num value should be >= 50. Continuing anyway.\" in c.last_result.err\n\n\ndef test_do_sourmash_compute_check_num_bounds_more_than_maximum(runtmp):\n    c = runtmp\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = c.output(\"short.fa.sig\")\n\n    c.run_sourmash(\n        \"compute\",\n        \"-k\",\n        \"31\",\n        \"--num-hashes\",\n        \"100000\",\n        \"-o\",\n        sigfile,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    assert (\n        \"WARNING: num value should be <= 50000. Continuing anyway.\" in c.last_result.err\n    )\n\n\n@utils.in_tempdir\ndef test_do_sourmash_compute_outdir(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    status, out, err = utils.runscript(\n        \"sourmash\", [\"compute\", \"-k\", \"31\", testdata1, \"--outdir\", c.location]\n    )\n\n    sigfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\ndef test_do_sourmash_compute_output_valid_file():\n    \"\"\"Trigger bug #123\"\"\"\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        testdata2 = utils.get_test_data(\"short2.fa\")\n        testdata3 = utils.get_test_data(\"short3.fa\")\n        sigfile = os.path.join(location, \"short.fa.sig\")\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"-o\", sigfile, testdata1, testdata2, testdata3],\n            in_directory=location,\n        )\n\n        assert os.path.exists(sigfile)\n        assert not out  # stdout should be empty\n\n        # is it valid json?\n        with open(sigfile) as f:\n            data = json.load(f)\n\n        filesigs = [sig[\"filename\"] for sig in data]\n        assert all(\n            testdata in filesigs for testdata in (testdata1, testdata2, testdata3)\n        )\n\n\ndef test_do_sourmash_compute_output_stdout_valid():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        testdata2 = utils.get_test_data(\"short2.fa\")\n        testdata3 = utils.get_test_data(\"short3.fa\")\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"-o\", \"-\", testdata1, testdata2, testdata3],\n            in_directory=location,\n        )\n\n        # is it valid json?\n        data = json.loads(out)\n\n        filesigs = [sig[\"filename\"] for sig in data]\n        assert all(\n            testdata in filesigs for testdata in (testdata1, testdata2, testdata3)\n        )\n\n\n@utils.in_tempdir\ndef test_do_sourmash_compute_output_and_name_valid_file(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = c.output(\"short.fa.sig\")\n\n    c.run_sourmash(\n        \"compute\",\n        \"-k\",\n        \"31\",\n        \"-o\",\n        sigfile,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    assert os.path.exists(sigfile)\n    assert (\n        \"calculated 1 signature for 4 sequences taken from 3 files\" in c.last_result.err\n    )\n\n    # is it valid json?\n    with open(sigfile) as f:\n        data = json.load(f)\n\n    assert len(data) == 1\n\n    sigfile_merged = c.output(\"short.all.fa.sig\")\n    c.run_sourmash(\n        \"compute\",\n        \"-k\",\n        \"31\",\n        \"-o\",\n        sigfile_merged,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    with open(sigfile_merged) as f:\n        data_merged = json.load(f)\n\n    assert data[0][\"signatures\"][0][\"mins\"] == data_merged[0][\"signatures\"][0][\"mins\"]\n\n\n@utils.in_tempdir\ndef test_do_sourmash_compute_output_and_name_valid_file_outdir(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = os.path.join(c.location, \"short.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"compute\",\n            \"-k\",\n            \"31\",\n            \"-o\",\n            sigfile,\n            \"--merge\",\n            '\"name\"',\n            testdata1,\n            testdata2,\n            testdata3,\n            \"--outdir\",\n            c.location,\n        )\n\n    errmsg = c.last_result.err\n    assert \"ERROR: --output-dir doesn't make sense with -o/--output\" in errmsg\n\n\ndef test_do_sourmash_compute_singleton():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--singleton\", testdata1],\n            in_directory=location,\n        )\n\n        sigfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(sigfile)\n\n        sig = next(load_signatures_from_json(sigfile))\n        assert sig.name.endswith(\"shortName\")\n\n\ndef test_do_sourmash_compute_name():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--merge\", \"foo\", testdata1, \"-o\", \"foo.sig\"],\n            in_directory=location,\n        )\n\n        sigfile = os.path.join(location, \"foo.sig\")\n        assert os.path.exists(sigfile)\n\n        sig = next(load_signatures_from_json(sigfile))\n        assert sig.name == \"foo\"\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--name\", \"foo\", testdata1, \"-o\", \"foo2.sig\"],\n            in_directory=location,\n        )\n\n        sigfile2 = os.path.join(location, \"foo2.sig\")\n        assert os.path.exists(sigfile2)\n\n        sig2 = next(load_signatures_from_json(sigfile))\n        assert sig2.name == \"foo\"\n        assert sig.name == sig2.name\n\n\ndef test_do_sourmash_compute_name_fail_no_output():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--merge\", \"foo\", testdata1],\n            in_directory=location,\n            fail_ok=True,\n        )\n        assert status == -1\n\n\ndef test_do_sourmash_compute_merge_fail_no_output():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--merge\", \"foo\", testdata1],\n            in_directory=location,\n            fail_ok=True,\n        )\n        assert status == -1\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--name\", \"foo\", testdata1],\n            in_directory=location,\n            fail_ok=True,\n        )\n        assert status == -1\n\n\ndef test_do_sourmash_compute_name_from_first():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short3.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"31\", \"--name-from-first\", testdata1],\n            in_directory=location,\n        )\n\n        sigfile = os.path.join(location, \"short3.fa.sig\")\n        assert os.path.exists(sigfile)\n\n        sig = next(load_signatures_from_json(sigfile))\n        assert sig.name == \"firstname\"\n\n\ndef test_do_sourmash_compute_multik():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\", [\"compute\", \"-k\", \"21,31\", testdata1], in_directory=location\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 21 in ksizes\n        assert 31 in ksizes\n        assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_multik_with_protein():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--protein\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 4\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 21 in ksizes\n            assert 30 in ksizes\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert len(ksizes) == 4\n\n\ndef test_do_sourmash_compute_multik_with_dayhoff():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--dayhoff\", \"--no-dna\", testdata1],\n            in_directory=location,\n        )\n        assert (\n            \"Computing only Dayhoff-encoded protein (and not nucleotide) \"\n            \"signatures.\" in err\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 2\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert all(x.minhash.dayhoff for x in siglist)\n            assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_multik_with_dayhoff_and_dna():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--dayhoff\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 4\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 21 in ksizes\n            assert 30 in ksizes\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert sum(x.minhash.moltype == \"DNA\" for x in siglist) == 2\n            assert sum(x.minhash.moltype == \"dayhoff\" for x in siglist) == 2\n            assert len(ksizes) == 4\n\n\ndef test_do_sourmash_compute_multik_with_hp():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--hp\", \"--no-dna\", testdata1],\n            in_directory=location,\n        )\n        assert (\n            \"Computing only hp-encoded protein (and not nucleotide) signatures.\" in err\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 2\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert all(x.minhash.hp for x in siglist)\n            assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_multik_with_hp_and_dna():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--hp\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 4\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert 21 in ksizes\n            assert 30 in ksizes\n            assert len(ksizes) == 4\n\n\ndef test_do_sourmash_compute_multik_with_dayhoff_dna_protein():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--dayhoff\", \"--protein\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 6\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 21 in ksizes\n            assert 30 in ksizes\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert sum(x.minhash.moltype == \"DNA\" for x in siglist) == 2\n            assert sum(x.minhash.moltype == \"dayhoff\" for x in siglist) == 2\n            assert sum(x.minhash.moltype == \"protein\" for x in siglist) == 2\n            assert len(ksizes) == 4\n\n\ndef test_do_sourmash_compute_multik_with_dayhoff_hp_dna_protein():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--dayhoff\", \"--hp\", \"--protein\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 8\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert 21 in ksizes\n            assert 30 in ksizes\n            assert sum(x.minhash.moltype == \"DNA\" for x in siglist) == 2\n            assert sum(x.minhash.moltype == \"dayhoff\" for x in siglist) == 2\n            assert sum(x.minhash.moltype == \"hp\" for x in siglist) == 2\n            # 2 = dayhoff, 2 = hp = 4 protein\n            assert sum(x.minhash.moltype == \"protein\" for x in siglist) == 2\n            assert len(ksizes) == 4\n\n\ndef test_do_sourmash_compute_multik_with_nothing():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--no-protein\", \"--no-dna\", testdata1],\n            in_directory=location,\n            fail_ok=True,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert not os.path.exists(outfile)\n\n\ndef test_do_sourmash_compute_multik_protein_bad_ksize():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"20,32\", \"--protein\", \"--no-dna\", testdata1],\n            in_directory=location,\n            fail_ok=True,\n        )\n        outfile = os.path.join(location, \"short.fa.sig\")\n        assert not os.path.exists(outfile)\n        assert \"protein ksizes must be divisible by 3\" in err\n\n\n@utils.in_tempdir\ndef test_do_sourmash_compute_multik_only_protein(c):\n    # check sourmash compute with only protein, no nucl\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"compute\", \"-k\", \"21,30\", \"--protein\", \"--no-dna\", testdata1)\n    outfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n        assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_multik_protein_input_bad_ksize():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short-protein.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\n                \"compute\",\n                \"-k\",\n                \"20,32\",\n                \"--protein\",\n                \"--no-dna\",\n                \"--input-is-protein\",\n                testdata1,\n            ],\n            in_directory=location,\n            fail_ok=True,\n        )\n        os.path.join(location, \"short-protein.fa.sig\")\n        assert status != 0\n        assert \"protein ksizes must be divisible by 3\" in err\n\n\n@utils.in_tempdir\ndef test_do_sourmash_compute_multik_only_protein_no_rna(c):\n    # test --no-rna as well (otherwise identical to previous test)\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    c.run_sourmash(\"compute\", \"-k\", \"21,30\", \"--protein\", \"--no-rna\", testdata1)\n    outfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n        assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_protein_bad_sequences():\n    \"\"\"Proper error handling when Ns in dna sequence\"\"\"\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.bad.fa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--protein\", \"--no-dna\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"short.bad.fa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 2\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert len(ksizes) == 2\n\n\ndef test_do_sourmash_compute_multik_input_is_protein():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"ecoli.faa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,30\", \"--input-is-protein\", testdata1],\n            in_directory=location,\n        )\n        outfile = os.path.join(location, \"ecoli.faa.sig\")\n        assert os.path.exists(outfile)\n\n        with open(outfile) as fp:\n            sigdata = fp.read()\n            siglist = list(load_signatures_from_json(sigdata))\n            assert len(siglist) == 2\n            ksizes = set([x.minhash.ksize for x in siglist])\n            assert 7 in ksizes\n            assert 10 in ksizes\n            assert len(ksizes) == 2\n\n            moltype = set([x.minhash.moltype == \"protein\" for x in siglist])\n            assert len(moltype) == 1\n            assert True in moltype\n\n\ndef test_do_sourmash_compute_multik_outfile():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 21 in ksizes\n        assert 31 in ksizes\n\n\ndef test_do_sourmash_compute_with_scaled_1():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"1\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n\n        scaled_vals = [x.minhash.scaled for x in siglist]\n        assert len(scaled_vals) == 2\n        assert set(scaled_vals) == {1}\n\n\ndef test_do_sourmash_compute_with_scaled_2():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"2\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n\n        max_hashes = [x.minhash._max_hash for x in siglist]\n        assert len(max_hashes) == 2\n        assert set(max_hashes) == set([int(2**64 / 2.0)])\n\n\ndef test_do_sourmash_compute_with_scaled():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"100\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n\n        max_hashes = [x.minhash._max_hash for x in siglist]\n        assert len(max_hashes) == 2\n        assert set(max_hashes) == set([int(2**64 / 100.0)])\n\n\ndef test_do_sourmash_compute_with_bad_scaled():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"-1\", testdata1, \"-o\", outfile],\n            in_directory=location,\n            fail_ok=True,\n        )\n\n        assert status != 0\n        assert \"--scaled value must be >= 1\" in err\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"1000.5\", testdata1, \"-o\", outfile],\n            in_directory=location,\n            fail_ok=True,\n        )\n\n        assert status != 0\n        assert \"--scaled value must be integer value\" in err\n\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--scaled\", \"1e9\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n\n        assert status == 0\n        assert \"WARNING: scaled value is nonsensical!?\" in err\n\n\ndef test_do_sourmash_compute_with_seed():\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"short.fa\")\n        outfile = os.path.join(location, \"FOO.xxx\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21,31\", \"--seed\", \"43\", testdata1, \"-o\", outfile],\n            in_directory=location,\n        )\n        assert os.path.exists(outfile)\n\n        siglist = list(load_signatures_from_json(outfile))\n        assert len(siglist) == 2\n\n        seeds = [x.minhash.seed for x in siglist]\n        assert len(seeds) == 2\n        assert set(seeds) == set([43])\n\n\ndef test_do_sourmash_check_protein_comparisons():\n    # this test checks 2 x 2 protein comparisons with E. coli genes.\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"ecoli.faa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21\", \"--input-is-protein\", \"--singleton\", testdata1],\n            in_directory=location,\n        )\n        sig1 = os.path.join(location, \"ecoli.faa.sig\")\n        assert os.path.exists(sig1)\n\n        testdata2 = utils.get_test_data(\"ecoli.genes.fna\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21\", \"--protein\", \"--no-dna\", \"--singleton\", testdata2],\n            in_directory=location,\n        )\n        sig2 = os.path.join(location, \"ecoli.genes.fna.sig\")\n        assert os.path.exists(sig2)\n\n        # I'm not sure why load_signatures_from_json is randomizing order, but ok.\n        x = list(load_signatures_from_json(sig1))\n        sig1_aa, sig2_aa = sorted(x, key=lambda x: x.name)\n\n        x = list(load_signatures_from_json(sig2))\n        sig1_trans, sig2_trans = sorted(x, key=lambda x: x.name)\n\n        name1 = sig1_aa.name.split()[0]\n        assert name1 == \"NP_414543.1\"\n        name2 = sig2_aa.name.split()[0]\n        assert name2 == \"NP_414544.1\"\n        name3 = sig1_trans.name.split()[0]\n        assert name3 == \"gi|556503834:2801-3733\"\n        name4 = sig2_trans.name.split()[0]\n        assert name4 == \"gi|556503834:337-2799\"\n\n        print(name1, name3, round(sig1_aa.similarity(sig1_trans), 3))\n        print(name2, name3, round(sig2_aa.similarity(sig1_trans), 3))\n        print(name1, name4, round(sig1_aa.similarity(sig2_trans), 3))\n        print(name2, name4, round(sig2_aa.similarity(sig2_trans), 3))\n\n        assert round(sig1_aa.similarity(sig1_trans), 3) == 0.0\n        assert round(sig2_aa.similarity(sig1_trans), 3) == 0.166\n        assert round(sig1_aa.similarity(sig2_trans), 3) == 0.174\n        assert round(sig2_aa.similarity(sig2_trans), 3) == 0.0\n\n\n@utils.in_tempdir\ndef test_do_sourmash_check_knowngood_dna_comparisons(c):\n    # this test checks against a known good signature calculated\n    # by utils/compute-dna-mh-another-way.py\n    testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n    c.run_sourmash(\"compute\", \"-k\", \"21\", \"--singleton\", \"--dna\", testdata1)\n    sig1 = c.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1, sig2 = sorted(x, key=lambda x: x.name)\n    print(sig1.name)\n    print(sig2.name)\n\n    knowngood = utils.get_test_data(\"benchmark.dna.sig\")\n    good = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig2.similarity(good) == 1.0\n\n\n@utils.in_tempdir\ndef test_do_sourmash_check_knowngood_dna_comparisons_use_rna(c):\n    # check the --rna flag; otherwise identical to previous test.\n    testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n    c.run_sourmash(\"compute\", \"-k\", \"21\", \"--singleton\", \"--rna\", testdata1)\n    sig1 = c.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1, sig2 = sorted(x, key=lambda x: x.name)\n\n    knowngood = utils.get_test_data(\"benchmark.dna.sig\")\n    good = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig2.similarity(good) == 1.0\n\n\ndef test_do_sourmash_check_knowngood_input_protein_comparisons():\n    # this test checks against a known good signature calculated\n    # by utils/compute-input-prot-another-way.py\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"ecoli.faa\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21\", \"--input-is-protein\", \"--singleton\", testdata1],\n            in_directory=location,\n        )\n        sig1 = os.path.join(location, \"ecoli.faa.sig\")\n        assert os.path.exists(sig1)\n\n        x = list(load_signatures_from_json(sig1))\n        sig1_aa, sig2_aa = sorted(x, key=lambda x: x.name)\n\n        knowngood = utils.get_test_data(\"benchmark.input_prot.sig\")\n        good_aa = list(load_signatures_from_json(knowngood))[0]\n\n        assert sig1_aa.similarity(good_aa) == 1.0\n\n\ndef test_do_sourmash_check_knowngood_protein_comparisons():\n    # this test checks against a known good signature calculated\n    # by utils/compute-prot-mh-another-way.py\n    with utils.TempDirectory() as location:\n        testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n        status, out, err = utils.runscript(\n            \"sourmash\",\n            [\"compute\", \"-k\", \"21\", \"--singleton\", \"--protein\", \"--no-dna\", testdata1],\n            in_directory=location,\n        )\n        sig1 = os.path.join(location, \"ecoli.genes.fna.sig\")\n        assert os.path.exists(sig1)\n\n        x = list(load_signatures_from_json(sig1))\n        sig1_trans, sig2_trans = sorted(x, key=lambda x: x.name)\n\n        knowngood = utils.get_test_data(\"benchmark.prot.sig\")\n        good_trans = list(load_signatures_from_json(knowngood))[0]\n\n        assert sig2_trans.similarity(good_trans) == 1.0\n\n\ndef test_compute_parameters():\n    args_list = [\n        \"compute\",\n        \"-k\",\n        \"21,31\",\n        \"--singleton\",\n        \"--protein\",\n        \"--no-dna\",\n        \"input_file\",\n    ]\n\n    parser = SourmashParser(prog=\"sourmash\")\n    subp = parser.add_subparsers(title=\"instruction\", dest=\"cmd\", metavar=\"cmd\")\n    subparser(subp)\n\n    args = parser.parse_args(args_list)\n\n    params = ComputeParameters.from_args(args)\n\n    assert params.ksizes == [21, 31]\n    assert params.protein == True\n    assert params.dna == False\n    assert params.seed == 42\n    assert params.dayhoff == False\n    assert params.hp == False\n    assert params.num_hashes == 500\n    assert params.scaled == 0\n    assert params.track_abundance == False\n"
  },
  {
    "path": "tests/test_sourmash_sketch.py",
    "content": "\"\"\"\nTests for sourmash sketch command-line functionality.\n\"\"\"\n\nimport os\nimport gzip\nimport shutil\nimport screed\nimport glob\nimport json\nimport csv\nimport pytest\n\nimport sourmash_tst_utils as utils\nimport sourmash\nfrom sourmash import MinHash\nfrom sourmash.sbt import SBT, Node\nfrom sourmash.sbtmh import SigLeaf, load_sbt_index\nfrom sourmash.command_sketch import ComputeParameters\nfrom sourmash.cli import SourmashParser\nfrom sourmash import manifest\n\nfrom sourmash import signature\nfrom sourmash import VERSION\n\n###\n\nfrom sourmash.command_sketch import _signatures_for_sketch_factory\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.signature import load_signatures_from_json\n\n\ndef test_do_sourmash_sketch_check_scaled_bounds_negative(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"scaled=-5\", testdata1)\n    assert \"ERROR: scaled value must be positive\" in runtmp.last_result.err\n\n\ndef test_do_sourmash_sketch_check_scaled_bounds_less_than_minimum(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"scaled=50\", testdata1)\n    assert (\n        \"WARNING: scaled value should be >= 100. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sketch_check_scaled_bounds_more_than_maximum(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"scaled=1000000000\", testdata1)\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sketch_check_num_bounds_negative(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"num=-5\", testdata1)\n    assert \"ERROR: num value must be positive\" in runtmp.last_result.err\n\n\ndef test_do_sourmash_sketch_check_num_bounds_less_than_minimum(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"num=25\", testdata1)\n    assert (\n        \"WARNING: num value should be >= 50. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sourmash_sketch_check_num_bounds_more_than_maximum(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"num=100000\", testdata1)\n    assert (\n        \"WARNING: num value should be <= 50000. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_empty_factory():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([], None)\n\n\ndef test_no_default_moltype_factory_nonempty():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=31\"], None)\n\n\ndef test_factory_no_default_moltype_dna():\n    factory = _signatures_for_sketch_factory([\"dna\"], None)\n    params_list = list(factory.get_compute_params())\n    assert len(params_list) == 1\n\n    params = params_list[0]\n    assert params.dna\n\n\ndef test_factory_no_default_moltype_protein():\n    factory = _signatures_for_sketch_factory([\"protein\"], None)\n    params_list = list(factory.get_compute_params())\n    assert len(params_list) == 1\n\n    params = params_list[0]\n    assert params.protein\n\n\ndef test_factory_dna_nosplit():\n    factory = _signatures_for_sketch_factory([\"k=31,k=51\"], \"dna\")\n    params_list = list(factory.get_compute_params(split_ksizes=False))\n    assert len(params_list) == 1\n\n    params = params_list[0]\n    assert params.ksizes == [31, 51]\n\n\ndef test_factory_dna_split():\n    factory = _signatures_for_sketch_factory([\"k=31,k=51\"], \"dna\")\n    params_list = list(factory.get_compute_params(split_ksizes=True))\n    assert len(params_list) == 2\n\n    params = params_list[0]\n    assert params.ksizes == [31]\n    params = params_list[1]\n    assert params.ksizes == [51]\n\n\ndef test_factory_protein_nosplit():\n    factory = _signatures_for_sketch_factory([\"k=10,k=9\"], \"protein\")\n    params_list = list(factory.get_compute_params(split_ksizes=False))\n    assert len(params_list) == 1\n\n    params = params_list[0]\n    assert params.ksizes == [30, 27]\n\n\ndef test_factory_protein_split():\n    factory = _signatures_for_sketch_factory([\"k=10,k=9\"], \"protein\")\n    params_list = list(factory.get_compute_params(split_ksizes=True))\n    assert len(params_list) == 2\n\n    params = params_list[0]\n    assert params.ksizes == [30]\n    params = params_list[1]\n    assert params.ksizes == [27]\n\n\ndef test_factory_dna_equal():\n    factory1 = _signatures_for_sketch_factory([\"dna\"], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([], \"dna\")\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 == params2\n    assert repr(params1) == repr(params2)\n\n\ndef test_factory_protein_equal():\n    factory1 = _signatures_for_sketch_factory([\"protein\"], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([], \"protein\")\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 == params2\n    assert repr(params1) == repr(params2)\n\n\ndef test_factory_dna_multi_ksize_eq():\n    factory1 = _signatures_for_sketch_factory([\"k=21,k=31,dna\"], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([\"k=21,k=31\"], \"dna\")\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 == params2\n    assert repr(params1) == repr(params2)\n\n\ndef test_factory_protein_multi_ksize_eq():\n    factory1 = _signatures_for_sketch_factory([\"k=10,k=11,protein\"], None)\n    params_list1 = list(factory1.get_compute_params())\n    assert len(params_list1) == 1\n    params1 = params_list1[0]\n\n    factory2 = _signatures_for_sketch_factory([\"k=10,k=11\"], \"protein\")\n    params_list2 = list(factory2.get_compute_params())\n    assert len(params_list2) == 1\n    params2 = params_list2[0]\n\n    assert params1 == params2\n    assert repr(params1) == repr(params2)\n\n\ndef test_dna_defaults():\n    factory = _signatures_for_sketch_factory([], \"dna\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [31]\n    assert params.num_hashes == 0\n    assert params.scaled == 1000\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert not params.protein\n\n    siglist = factory()\n    sig = siglist[0]\n    sig.minhash\n\n\ndef test_dna_multiple_ksize():\n    factory = _signatures_for_sketch_factory([\"k=21,k=31,k=51\"], \"dna\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [21, 31, 51]\n    assert params.num_hashes == 0\n    assert params.scaled == 1000\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert not params.protein\n\n    from sourmash.save_load import _get_signatures_from_rust\n\n    siglist = factory()\n    ksizes = set()\n    for ss in _get_signatures_from_rust(siglist):\n        ksizes.add(ss.minhash.ksize)\n\n    assert ksizes == {21, 31, 51}\n\n\ndef test_dna_override_1():\n    factory = _signatures_for_sketch_factory([\"k=21,scaled=2000,abund\"], \"dna\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [21]\n    assert params.num_hashes == 0\n    assert params.scaled == 2000\n    assert params.track_abundance\n    assert params.seed == 42\n    assert params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert not params.protein\n\n\ndef test_scaled_param_requires_equal():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,scaled\"], \"dna\")\n\n\ndef test_k_param_requires_equal():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k\"], \"dna\")\n\n\ndef test_k_param_requires_equal_2():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=\"], \"dna\")\n\n\ndef test_seed_param_requires_equal():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"seed=\"], \"dna\")\n\n\ndef test_num_param_requires_equal():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"num=\"], \"dna\")\n\n\ndef test_dna_override_bad_1():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,scaledFOO=2000,abund\"], \"dna\")\n\n\ndef test_dna_override_bad_2():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,protein\"], \"dna\")\n\n\ndef test_protein_defaults():\n    factory = _signatures_for_sketch_factory([], \"protein\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [30]  # x3 for now\n    assert params.num_hashes == 0\n    assert params.scaled == 200\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert params.protein\n\n\ndef test_protein_override_bad_2():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,dna\"], \"protein\")\n\n\ndef test_protein_override_bad_rust_foo():\n    # mimic 'sourmash sketch protein -p dna'\n    factory = _signatures_for_sketch_factory([], \"protein\")\n\n    # reach in and avoid error checking to construct a bad params_list.\n    factory.params_list = [(\"dna\", {})]\n\n    # now, get sigs...\n    siglist = factory()\n    assert len(siglist) == 1\n    sig = siglist[0]\n    print(sig.minhash.ksize)\n\n    # try adding something\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    with screed.open(testdata1) as f:\n        record = next(iter(f))\n\n    with pytest.raises(ValueError) as exc:\n        sig.add_protein(record.sequence)\n\n    assert \"invalid DNA character in input k-mer: MRVLKFGGTS\" in str(exc)\n\n\ndef test_dayhoff_defaults():\n    factory = _signatures_for_sketch_factory([], \"dayhoff\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [48]  # x3 for now\n    assert params.num_hashes == 0\n    assert params.scaled == 200\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert params.dayhoff\n    assert not params.hp\n    assert not params.protein\n\n\ndef test_dayhoff_override_bad_2():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,dna\"], \"dayhoff\")\n\n\ndef test_hp_defaults():\n    factory = _signatures_for_sketch_factory([], \"hp\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    assert params.ksizes == [126]  # x3 for now\n    assert params.num_hashes == 0\n    assert params.scaled == 200\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert not params.dayhoff\n    assert params.hp\n    assert not params.protein\n\n\ndef test_hp_override_bad_2():\n    with pytest.raises(ValueError):\n        _signatures_for_sketch_factory([\"k=21,dna\"], \"hp\")\n\n\ndef test_multiple_moltypes():\n    params_foo = [\n        \"k=20,num=500,protein\",\n        \"k=19,num=400,dayhoff,abund\",\n        \"k=30,scaled=200,hp\",\n        \"k=30,scaled=200,seed=58\",\n    ]\n    factory = _signatures_for_sketch_factory(params_foo, \"protein\")\n    params_list = list(factory.get_compute_params())\n\n    assert len(params_list) == 4\n\n    params = params_list[0]\n    assert params.ksizes == [60]  # x3, for now.\n    assert params.num_hashes == 500\n    assert params.scaled == 0\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert params.protein\n\n    params = params_list[1]\n    assert params.ksizes == [57]  # x3, for now.\n    assert params.num_hashes == 400\n    assert params.scaled == 0\n    assert params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert params.dayhoff\n    assert not params.hp\n    assert not params.protein\n\n    params = params_list[2]\n    assert params.ksizes == [90]  # x3, for now.\n    assert params.num_hashes == 0\n    assert params.scaled == 200\n    assert not params.track_abundance\n    assert params.seed == 42\n    assert not params.dna\n    assert not params.dayhoff\n    assert params.hp\n    assert not params.protein\n\n    params = params_list[3]\n    assert params.ksizes == [90]  # x3, for now.\n    assert params.num_hashes == 0\n    assert params.scaled == 200\n    assert not params.track_abundance\n    assert params.seed == 58\n    assert not params.dna\n    assert not params.dayhoff\n    assert not params.hp\n    assert params.protein\n\n\n@pytest.mark.parametrize(\n    \"input_param_str, expected_output\",\n    [\n        (\"protein\", \"protein,k=10,scaled=200\"),\n        (\"dna\", \"dna,k=31,scaled=1000\"),\n        (\"hp\", \"hp,k=42,scaled=200\"),\n        (\"dayhoff\", \"dayhoff,k=16,scaled=200\"),\n        (\"dna,seed=52\", \"dna,k=31,scaled=1000,seed=52\"),\n        (\"dna,num=500\", \"dna,k=31,num=500\"),\n        (\"scaled=1100,dna\", \"dna,k=31,scaled=1100\"),\n        (\"dna,abund\", \"dna,k=31,scaled=1000,abund\"),\n        (\"skipm1n3\", \"skipm1n3,k=21,scaled=1000\"),\n        (\"skipm2n3\", \"skipm2n3,k=21,scaled=1000\"),\n    ],\n)\ndef test_compute_parameters_to_param_str(input_param_str, expected_output):\n    factory = _signatures_for_sketch_factory([input_param_str], None)\n    params_list = list(factory.get_compute_params())\n    assert len(params_list) == 1\n    params = params_list[0]\n\n    actual_output_str = params.to_param_str()\n\n    assert actual_output_str == expected_output, (actual_output_str, expected_output)\n\n\ndef test_manifest_row_to_compute_parameters_1():\n    # test ComputeParameters.from_manifest_row with moltype 'DNA'\n    row = dict(moltype=\"DNA\", ksize=21, num=0, scaled=1000, with_abundance=1)\n    p = ComputeParameters.from_manifest_row(row)\n    assert p.dna\n    assert not p.protein\n    assert not p.dayhoff\n    assert not p.hp\n    assert p.moltype == \"DNA\"\n    assert p.num_hashes == 0\n    assert p.scaled == 1000\n    assert p.ksizes == [21]\n    assert p.track_abundance\n    assert p.seed == 42\n\n\ndef test_manifest_row_to_compute_parameters_2():\n    # test ComputeParameters.from_manifest_row with moltype 'protein'\n    row = dict(moltype=\"protein\", ksize=10, num=0, scaled=200, with_abundance=1)\n    p = ComputeParameters.from_manifest_row(row)\n    assert not p.dna\n    assert p.protein\n    assert p.moltype == \"protein\"\n    assert not p.dayhoff\n    assert not p.hp\n    assert p.num_hashes == 0\n    assert p.scaled == 200\n    assert p.ksizes == [30]\n    assert p.track_abundance\n    assert p.seed == 42\n\n\ndef test_manifest_row_to_compute_parameters_3():\n    # test ComputeParameters.from_manifest_row with moltype 'dayhoff'\n    row = dict(moltype=\"dayhoff\", ksize=12, num=0, scaled=200, with_abundance=0)\n    p = ComputeParameters.from_manifest_row(row)\n    assert not p.dna\n    assert not p.protein\n    assert p.dayhoff\n    assert p.moltype == \"dayhoff\"\n    assert not p.hp\n    assert p.num_hashes == 0\n    assert p.scaled == 200\n    assert p.ksizes == [36]\n    assert not p.track_abundance\n    assert p.seed == 42\n\n\ndef test_manifest_row_to_compute_parameters_4():\n    # test ComputeParameters.from_manifest_row with moltype 'hp'\n    row = dict(moltype=\"hp\", ksize=32, num=0, scaled=200, with_abundance=0)\n    p = ComputeParameters.from_manifest_row(row)\n    assert not p.dna\n    assert not p.protein\n    assert not p.dayhoff\n    assert p.hp\n    assert p.moltype == \"hp\"\n    assert p.num_hashes == 0\n    assert p.scaled == 200\n    assert p.ksizes == [96]\n    assert not p.track_abundance\n    assert p.seed == 42\n\n\ndef test_bad_compute_parameters():\n    p = ComputeParameters(\n        ksizes=[31],\n        seed=42,\n        dna=0,\n        protein=0,\n        dayhoff=0,\n        hp=0,\n        num_hashes=0,\n        track_abundance=True,\n        scaled=1000,\n    )\n    with pytest.raises(AssertionError):\n        p.moltype\n\n\n### command line tests\n\n\n@utils.in_thisdir\ndef test_do_sourmash_sketchdna_empty(c):\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sketch\", \"dna\")\n    assert (\n        \"error: no input filenames provided! nothing to do - exiting.\"\n        in c.last_result.err\n    )\n\n\n@utils.in_thisdir\ndef test_do_sourmash_sketchprotein_empty(c):\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sketch\", \"protein\")\n    assert (\n        \"error: no input filenames provided! nothing to do - exiting.\"\n        in c.last_result.err\n    )\n\n\n@utils.in_thisdir\ndef test_do_sourmash_sketchtranslate_empty(c):\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\"sketch\", \"translate\")\n    assert (\n        \"error: no input filenames provided! nothing to do - exiting.\"\n        in c.last_result.err\n    )\n\n\ndef test_do_sourmash_sketchdna(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", testdata1)\n\n    sigfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\ndef test_do_sourmash_sketchdna_check_sequence_succeed(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", testdata1, \"--check-sequence\")\n\n    sigfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\ndef test_do_sourmash_sketchdna_check_sequence_fail(runtmp):\n    testdata1 = utils.get_test_data(\"shewanella.faa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", testdata1, \"--check-sequence\")\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"ERROR when reading from \" in err\n    assert (\n        \"invalid DNA character in input k-mer: MCGIVGAVAQRDVAEILVEGLRRLEYRGYDS\" in err\n    )\n\n\ndef test_do_sourmash_sketchdna_check_sequence_fail_singleton(runtmp):\n    testdata1 = utils.get_test_data(\"shewanella.faa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", testdata1, \"--check-sequence\", \"--singleton\")\n\n    err = runtmp.last_result.err\n    print(err)\n    assert \"ERROR when reading from \" in err\n    assert (\n        \"invalid DNA character in input k-mer: MCGIVGAVAQRDVAEILVEGLRRLEYRGYDS\" in err\n    )\n\n\ndef test_do_sourmash_sketchdna_from_file(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    file_list = runtmp.output(\"filelist.txt\")\n    with open(file_list, \"w\") as fp:\n        print(testdata1, file=fp)\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"--from-file\", file_list)\n\n    sigfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_noinput(c):\n    data = \"\"\n\n    cmd = [\"sketch\", \"dna\", \"-\", \"-o\", c.output(\"xxx.sig\")]\n    c.run_sourmash(*cmd, stdin_data=data)\n\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    sigfile = c.output(\"xxx.sig\")\n    assert not os.path.exists(sigfile)\n    assert \"no sequences found\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_noinput_singleton(c):\n    data = \"\"\n\n    cmd = [\"sketch\", \"dna\", \"-\", \"-o\", c.output(\"xxx.sig\"), \"--singleton\"]\n    c.run_sourmash(*cmd, stdin_data=data)\n\n    sigfile = c.output(\"xxx.sig\")\n    assert not os.path.exists(sigfile)\n    assert \"no sequences found\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_noinput_merge(c):\n    data = \"\"\n\n    cmd = [\"sketch\", \"dna\", \"-\", \"-o\", c.output(\"xxx.sig\"), \"--merge\", \"name\"]\n    c.run_sourmash(*cmd, stdin_data=data)\n\n    sigfile = c.output(\"xxx.sig\")\n    assert not os.path.exists(sigfile)\n    assert \"no sequences found\" in c.last_result.err\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_outdir(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    status, out, err = utils.runscript(\n        \"sourmash\", [\"sketch\", \"dna\", testdata1, \"--outdir\", c.location]\n    )\n\n    sigfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_output_dir(c):\n    # test via --output-dir not --outdir\n    testdata1 = utils.get_test_data(\"short.fa\")\n    status, out, err = utils.runscript(\n        \"sourmash\", [\"sketch\", \"dna\", testdata1, \"--output-dir\", c.location]\n    )\n\n    sigfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"short.fa\")\n\n\ndef test_do_sourmash_sketchdna_output_valid_file(runtmp):\n    \"\"\"Trigger bug #123\"\"\"\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = runtmp.output(\"short.fa.sig\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-o\", sigfile, testdata1, testdata2, testdata3)\n\n    assert os.path.exists(sigfile)\n    assert not runtmp.last_result.out  # stdout should be empty\n\n    # is it valid json?\n    with open(sigfile) as f:\n        data = json.load(f)\n\n    filesigs = [sig[\"filename\"] for sig in data]\n    assert all(testdata in filesigs for testdata in (testdata1, testdata2, testdata3))\n\n\ndef test_do_sourmash_sketchdna_output_zipfile(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    outfile = runtmp.output(\"shorts.zip\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-o\", outfile, testdata1, testdata2, testdata3)\n\n    assert os.path.exists(outfile)\n    assert not runtmp.last_result.out  # stdout should be empty\n\n    sigs = list(sourmash.load_file_as_signatures(outfile))\n    assert len(sigs) == 3\n\n\ndef test_do_sourmash_sketchdna_output_stdout_valid(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-o\", \"-\", testdata1, testdata2, testdata3)\n\n    # is it valid json?\n    data = json.loads(runtmp.last_result.out)\n\n    filesigs = [sig[\"filename\"] for sig in data]\n    assert all(testdata in filesigs for testdata in (testdata1, testdata2, testdata3))\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_output_and_name_valid_file(c):\n    # test --merge of multiple input files\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = c.output(\"short.fa.sig\")\n\n    c.run_sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"num=500\",\n        \"-o\",\n        sigfile,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    assert os.path.exists(sigfile)\n    assert (\n        \"calculated 1 signature for 4 sequences taken from 3 files\" in c.last_result.err\n    )\n\n    # is it valid json?\n    with open(sigfile) as f:\n        data = json.load(f)\n\n    assert len(data) == 1\n\n    sigfile_merged = c.output(\"short.all.fa.sig\")\n    c.run_sourmash(\n        \"sketch\",\n        \"dna\",\n        \"-p\",\n        \"num=500\",\n        \"-o\",\n        sigfile_merged,\n        \"--merge\",\n        '\"name\"',\n        testdata1,\n        testdata2,\n        testdata3,\n    )\n\n    with open(sigfile_merged) as f:\n        data_merged = json.load(f)\n\n    assert data[0][\"signatures\"][0][\"mins\"] == data_merged[0][\"signatures\"][0][\"mins\"]\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketchdna_output_and_name_valid_file_outdir(c):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    testdata2 = utils.get_test_data(\"short2.fa\")\n    testdata3 = utils.get_test_data(\"short3.fa\")\n    sigfile = os.path.join(c.location, \"short.fa.sig\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"sketch\",\n            \"dna\",\n            \"-o\",\n            sigfile,\n            \"--merge\",\n            '\"name\"',\n            testdata1,\n            testdata2,\n            testdata3,\n            \"--outdir\",\n            c.location,\n        )\n\n    errmsg = c.last_result.err\n    assert \"ERROR: --output-dir doesn't make sense with -o/--output\" in errmsg\n\n\ndef test_do_sourmash_sketchdna_singleton(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"--singleton\", testdata1)\n\n    sigfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert str(sig).endswith(\"shortName\")\n\n\ndef test_do_sourmash_sketchdna_name(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"--merge\", \"foo\", testdata1, \"-o\", \"foo.sig\")\n\n    sigfile = runtmp.output(\"foo.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert sig.name == \"foo\"\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"--name\", \"foo\", testdata1, \"-o\", \"foo2.sig\")\n\n    sigfile2 = runtmp.output(\"foo2.sig\")\n    assert os.path.exists(sigfile2)\n\n    sig2 = next(load_signatures_from_json(sigfile))\n    assert sig2.name == \"foo\"\n    assert sig.name == sig2.name\n\n\ndef test_do_sourmash_sketchdna_name_fail_no_output(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", \"--merge\", \"foo\", testdata1)\n\n    assert runtmp.last_result.status == -1\n\n\ndef test_do_sourmash_sketchdna_fail_no_output(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", \"--merge\", \"foo\", testdata1)\n\n    assert runtmp.last_result.status == -1\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", \"--name\", \"foo\", testdata1)\n\n    assert runtmp.last_result.status == -1\n\n\ndef test_do_sourmash_sketchdna_name_from_first(runtmp):\n    testdata1 = utils.get_test_data(\"short3.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"--name-from-first\", testdata1)\n\n    sigfile = runtmp.output(\"short3.fa.sig\")\n    assert os.path.exists(sigfile)\n\n    sig = next(load_signatures_from_json(sigfile))\n    assert sig.name == \"firstname\"\n\n\ndef test_do_sourmash_sketchdna_multik(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,k=21\", testdata1)\n\n    outfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n    ksizes = set([x.minhash.ksize for x in siglist])\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_do_sourmash_sketchdna_multik_output(runtmp, sig_save_extension):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(f\"out.{sig_save_extension}\")\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=31,k=21\", testdata1, \"-o\", outfile)\n\n    print(\"saved to file/path with extension:\", outfile)\n    assert os.path.exists(outfile)\n\n    siglist = list(sourmash.load_file_as_signatures(outfile))\n    assert len(siglist) == 2\n    ksizes = set([x.minhash.ksize for x in siglist])\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_do_sketch_dna_override_protein_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=7,num=500,protein\", testdata1)\n\n    assert runtmp.last_result.status != 0\n    assert (\n        \"Error creating signatures: Incompatible sketch type\" in runtmp.last_result.err\n    )\n\n\ndef test_do_sketch_protein_override_dna_fail(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,num=500,dna\", testdata1)\n\n    assert runtmp.last_result.status != 0\n    assert (\n        \"Error creating signatures: Incompatible sketch type\" in runtmp.last_result.err\n    )\n\n\ndef test_do_sketch_translate_multik_with_protein(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", testdata1)\n\n    outfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n\ndef test_do_sketch_translate_multik_with_protein_from_file(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n\n    file_list = runtmp.output(\"filelist.txt\")\n    with open(file_list, \"w\") as fp:\n        print(testdata1, file=fp)\n\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", \"--from-file\", file_list\n    )\n\n    outfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n\ndef test_do_sketch_translate_multik_with_dayhoff(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", \"--dayhoff\", testdata1\n    )\n\n    outfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n        assert all(x.minhash.dayhoff for x in siglist)\n\n\ndef test_do_sketch_translate_multik_with_hp(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", \"--hp\", testdata1)\n\n    outfile = runtmp.output(\"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n        assert all(x.minhash.hp for x in siglist)\n\n\n@utils.in_tempdir\ndef test_do_sourmash_sketch_translate_multik_only_protein(c):\n    # check sourmash sketch_translate with only protein, no nucl\n    testdata1 = utils.get_test_data(\"short.fa\")\n    c.run_sourmash(\"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", testdata1)\n    outfile = os.path.join(c.location, \"short.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n\ndef test_do_sourmash_sketch_translate_bad_sequences(runtmp):\n    \"\"\"Proper error handling when Ns in dna sequence\"\"\"\n    testdata1 = utils.get_test_data(\"short.bad.fa\")\n    runtmp.sourmash(\"sketch\", \"translate\", \"-p\", \"k=7,k=10,num=500\", testdata1)\n\n    outfile = runtmp.output(\"short.bad.fa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n\ndef test_do_sketch_protein_multik_input(runtmp):\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,k=10,num=500\", testdata1)\n\n    outfile = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n        moltype = set([x.minhash.moltype == \"protein\" for x in siglist])\n        assert len(moltype) == 1\n        assert True in moltype\n\n\ndef test_do_sketch_protein_multik_input_from_file(runtmp):\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n\n    file_list = runtmp.output(\"filelist.txt\")\n    with open(file_list, \"w\") as fp:\n        print(testdata1, file=fp)\n\n    runtmp.sourmash(\n        \"sketch\", \"protein\", \"-p\", \"k=7,k=10,num=500\", \"--from-file\", file_list\n    )\n\n    outfile = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(outfile)\n\n    with open(outfile) as fp:\n        sigdata = fp.read()\n        siglist = list(load_signatures_from_json(sigdata))\n        assert len(siglist) == 2\n        ksizes = set([x.minhash.ksize for x in siglist])\n        assert 7 in ksizes\n        assert 10 in ksizes\n\n        moltype = set([x.minhash.moltype == \"protein\" for x in siglist])\n        assert len(moltype) == 1\n        assert True in moltype\n\n\ndef test_do_sourmash_sketchdna_multik_outfile(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    runtmp.sourmash(\"sketch\", \"dna\", \"-p\", \"k=21,k=31\", testdata1, \"-o\", outfile)\n\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n    ksizes = set([x.minhash.ksize for x in siglist])\n    assert 21 in ksizes\n    assert 31 in ksizes\n\n\ndef test_do_sourmash_sketchdna_with_scaled_1(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=1\", testdata1, \"-o\", outfile\n    )\n\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n\n    scaled_vals = [x.minhash.scaled for x in siglist]\n    assert len(scaled_vals) == 2\n    assert set(scaled_vals) == {1}\n\n\ndef test_do_sourmash_sketchdna_with_scaled_2(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=2\", testdata1, \"-o\", outfile\n    )\n\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n\n    max_hashes = [x.minhash._max_hash for x in siglist]\n    assert len(max_hashes) == 2\n    assert set(max_hashes) == set([int(2**64 / 2.0)])\n\n\ndef test_do_sourmash_sketchdna_with_scaled(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=100\", testdata1, \"-o\", outfile\n    )\n\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n\n    max_hashes = [x.minhash._max_hash for x in siglist]\n    assert len(max_hashes) == 2\n    assert set(max_hashes) == set([int(2**64 / 100.0)])\n\n\ndef test_do_sourmash_sketchdna_with_bad_scaled(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=-1\", testdata1, \"-o\", outfile\n        )\n\n    assert runtmp.last_result.status != 0\n    print(runtmp.last_result.err)\n    assert \"ERROR: scaled value must be positive\" in runtmp.last_result.err\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=1000.5\", testdata1, \"-o\", outfile\n        )\n\n    assert runtmp.last_result.status != 0\n    assert \"cannot parse scaled='1000.5' as an integer\" in runtmp.last_result.err\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=21,k=31,scaled=1000000000\", testdata1, \"-o\", outfile\n    )\n\n    assert runtmp.last_result.status == 0\n    print(\"XXX\")\n    print(runtmp.last_result.err)\n    assert (\n        \"WARNING: scaled value should be <= 1e6. Continuing anyway.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_do_sketch_with_seed(runtmp):\n    testdata1 = utils.get_test_data(\"short.fa\")\n    outfile = runtmp.output(\"FOO.xxx\")\n\n    runtmp.sourmash(\n        \"sketch\", \"dna\", \"-p\", \"k=21,k=31,seed=43\", testdata1, \"-o\", outfile\n    )\n\n    assert os.path.exists(outfile)\n\n    siglist = list(load_signatures_from_json(outfile))\n    assert len(siglist) == 2\n\n    seeds = [x.minhash.seed for x in siglist]\n    assert len(seeds) == 2\n    assert set(seeds) == set([43])\n\n\ndef test_do_sourmash_check_protein_comparisons(runtmp):\n    # this test checks 2 x 2 protein comparisons with E. coli genes.\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,num=500\", \"--singleton\", testdata1)\n\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n\n    testdata2 = utils.get_test_data(\"ecoli.genes.fna\")\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,num=500\", \"--singleton\", testdata2\n    )\n\n    sig2 = runtmp.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig2)\n\n    # I'm not sure why load_signatures_from_json is randomizing order, but ok.\n    x = list(load_signatures_from_json(sig1))\n    sig1_aa, sig2_aa = sorted(x, key=lambda x: x.name)\n\n    x = list(load_signatures_from_json(sig2))\n    sig1_trans, sig2_trans = sorted(x, key=lambda x: x.name)\n\n    name1 = sig1_aa.name.split()[0]\n    assert name1 == \"NP_414543.1\"\n    name2 = sig2_aa.name.split()[0]\n    assert name2 == \"NP_414544.1\"\n    name3 = sig1_trans.name.split()[0]\n    assert name3 == \"gi|556503834:2801-3733\"\n    name4 = sig2_trans.name.split()[0]\n    assert name4 == \"gi|556503834:337-2799\"\n\n    print(name1, name3, round(sig1_aa.similarity(sig1_trans), 3))\n    print(name2, name3, round(sig2_aa.similarity(sig1_trans), 3))\n    print(name1, name4, round(sig1_aa.similarity(sig2_trans), 3))\n    print(name2, name4, round(sig2_aa.similarity(sig2_trans), 3))\n\n    assert round(sig1_aa.similarity(sig1_trans), 3) == 0.0\n    assert round(sig2_aa.similarity(sig1_trans), 3) == 0.166\n    assert round(sig1_aa.similarity(sig2_trans), 3) == 0.174\n    assert round(sig2_aa.similarity(sig2_trans), 3) == 0.0\n\n\n@utils.in_tempdir\ndef test_do_sourmash_check_knowngood_dna_comparisons(c):\n    # this test checks against a known good signature calculated\n    # by utils/compute-dna-mh-another-way.py\n    testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n    c.run_sourmash(\"sketch\", \"dna\", \"-p\", \"k=21,num=500\", \"--singleton\", testdata1)\n    sig1 = c.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1, sig2 = sorted(x, key=lambda x: x.name)\n\n    print(sig1.name)\n    print(sig2.name)\n\n    knowngood = utils.get_test_data(\"benchmark.dna.sig\")\n    good = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig2.similarity(good) == 1.0\n\n\n@utils.in_tempdir\ndef test_do_sourmash_check_knowngood_dna_comparisons_use_rna(c):\n    # check the rna ; otherwise identical to previous test.\n    testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n    c.run_sourmash(\"sketch\", \"rna\", \"-p\", \"k=21,num=500\", \"--singleton\", testdata1)\n    sig1 = c.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1, sig2 = sorted(x, key=lambda x: x.name)\n\n    knowngood = utils.get_test_data(\"benchmark.dna.sig\")\n    good = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig2.similarity(good) == 1.0\n\n\ndef test_do_sourmash_check_knowngood_input_protein_comparisons(runtmp):\n    # this test checks against a known good signature calculated\n    # by utils/compute-input-prot-another-way.py\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,num=500\", \"--singleton\", testdata1)\n\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1_aa, sig2_aa = sorted(x, key=lambda x: x.name)\n\n    knowngood = utils.get_test_data(\"benchmark.input_prot.sig\")\n    good_aa = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig1_aa.similarity(good_aa) == 1.0\n\n\ndef test_do_sourmash_check_knowngood_protein_comparisons(runtmp):\n    # this test checks against a known good signature calculated\n    # by utils/compute-prot-mh-another-way.py\n    testdata1 = utils.get_test_data(\"ecoli.genes.fna\")\n\n    runtmp.sourmash(\n        \"sketch\", \"translate\", \"-p\", \"k=7,num=500\", \"--singleton\", testdata1\n    )\n\n    sig1 = runtmp.output(\"ecoli.genes.fna.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    sig1_trans, sig2_trans = sorted(x, key=lambda x: x.name)\n\n    knowngood = utils.get_test_data(\"benchmark.prot.sig\")\n    good_trans = list(load_signatures_from_json(knowngood))[0]\n\n    assert sig2_trans.similarity(good_trans) == 1.0\n\n\ndef test_do_sourmash_singleton_multiple_files_no_out_specified(runtmp):\n    # this test checks that --singleton -o works\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    testdata2 = utils.get_test_data(\"shewanella.faa\")\n\n    runtmp.sourmash(\n        \"sketch\", \"protein\", \"-p\", \"k=7\", \"--singleton\", testdata1, testdata2\n    )\n\n    print(runtmp.last_result.err)\n    assert (\n        \"saved 2 signature(s) to 'ecoli.faa.sig'. Note: signature license is CC0.\"\n        in runtmp.last_result.err\n    )\n    assert (\n        \"saved 2 signature(s) to 'shewanella.faa.sig'. Note: signature license is CC0.\"\n        in runtmp.last_result.err\n    )\n    assert \"calculated 2 signatures for 2 sequences in\" in runtmp.last_result.err\n\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n    sig2 = runtmp.output(\"shewanella.faa.sig\")\n    assert os.path.exists(sig2)\n\n    x = list(load_signatures_from_json(sig1))\n    for ss in x:\n        print(ss.name)\n\n    y = list(load_signatures_from_json(sig2))\n    for ss in y:\n        print(ss.name)\n\n    assert len(x) == 2\n    assert len(y) == 2\n\n    idents = [ss.name.split()[0] for ss in x]\n    print(idents)\n    assert set([\"NP_414543.1\", \"NP_414544.1\"]) == set(idents)\n\n    idents = [ss.name.split()[0] for ss in y]\n    print(idents)\n    assert set([\"WP_006079348.1\", \"WP_006079351.1\"]) == set(idents)\n\n\ndef test_do_sourmash_singleton_multiple_files_output(runtmp):\n    # this test checks that --singleton -o works\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    testdata2 = utils.get_test_data(\"shewanella.faa\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"protein\",\n        \"-p\",\n        \"k=7\",\n        \"--singleton\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"output.sig\",\n    )\n\n    print(runtmp.last_result.err)\n    assert (\n        \"saved 4 signature(s) to 'output.sig'. Note: signature license is CC0.\"\n        in runtmp.last_result.err\n    )\n    assert \"calculated 2 signatures for 2 sequences in\" in runtmp.last_result.err\n    assert \"calculated 4 signatures for 2 sequences in\" not in runtmp.last_result.err\n\n    sig1 = runtmp.output(\"output.sig\")\n    assert os.path.exists(sig1)\n\n    x = list(load_signatures_from_json(sig1))\n    for ss in x:\n        print(ss.name)\n\n    assert len(x) == 4\n\n    idents = [ss.name.split()[0] for ss in x]\n    print(idents)\n    assert set(\n        [\"NP_414543.1\", \"NP_414544.1\", \"WP_006079348.1\", \"WP_006079351.1\"]\n    ) == set(idents)\n\n\ndef test_do_sourmash_singleton_multiple_files_output_zip(runtmp):\n    # this test checks that --singleton -o works\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    testdata2 = utils.get_test_data(\"shewanella.faa\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"protein\",\n        \"-p\",\n        \"k=7\",\n        \"--singleton\",\n        testdata1,\n        testdata2,\n        \"-o\",\n        \"output.zip\",\n    )\n\n    print(runtmp.last_result.err)\n    assert (\n        \"saved 4 signature(s) to 'output.zip'. Note: signature license is CC0.\"\n        in runtmp.last_result.err\n    )\n\n    sig1 = runtmp.output(\"output.zip\")\n    assert os.path.exists(sig1)\n\n    x = list(sourmash.load_file_as_signatures(sig1))\n    for ss in x:\n        print(ss.name)\n\n    assert len(x) == 4\n\n    idents = [ss.name.split()[0] for ss in x]\n    print(idents)\n    assert set(\n        [\"NP_414543.1\", \"NP_414544.1\", \"WP_006079348.1\", \"WP_006079351.1\"]\n    ) == set(idents)\n\n\ndef test_protein_with_stop_codons(runtmp):\n    # compare protein seq with/without stop codons, via cli and also python\n    # apis\n\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    with screed.open(testdata1) as f:\n        ecoli_seq = [record.sequence for record in f]\n\n    # first, via CLI w/o stop codons\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1\", testdata1)\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n\n    x = load_one_signature(sig1)\n    cli_mh1 = x.minhash\n\n    # second, via CLI w/stop codons\n    ecoli_stop = runtmp.output(\"ecoli.stop.faa\")\n    with open(ecoli_stop, \"w\") as fp:\n        for seq in ecoli_seq:\n            fp.write(f\">seq\\n{seq}*\\n\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1\", ecoli_stop)\n    sig2 = runtmp.output(\"ecoli.stop.faa.sig\")\n    assert os.path.exists(sig2)\n\n    x = load_one_signature(sig2)\n    cli_mh2 = x.minhash\n\n    # now calculate sketch with MinHash...\n    py_mh1 = MinHash(n=0, ksize=7, is_protein=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh1.add_protein(seq)\n\n    # now calculate sketch with MinHash and stop codons...\n    py_mh2 = MinHash(n=0, ksize=7, is_protein=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh2.add_protein(seq + \"*\")\n\n    # and, last, calculate hashes separately with seq_to_hashes\n    h_mh1 = MinHash(n=0, ksize=7, is_protein=True, scaled=1)\n    h_mh2 = MinHash(n=0, ksize=7, is_protein=True, scaled=1)\n\n    for seq in ecoli_seq:\n        h = h_mh1.seq_to_hashes(seq, is_protein=1)\n        h_mh1.add_many(h)\n\n        h = h_mh2.seq_to_hashes(seq + \"*\", is_protein=1)\n        h_mh2.add_many(h)\n\n    # check!\n    assert cli_mh1 == py_mh1\n    assert cli_mh2 == py_mh2\n\n    assert cli_mh1 == h_mh1\n    assert cli_mh2 == h_mh2\n\n    assert cli_mh1.contained_by(cli_mh2) == 1.0\n    assert py_mh1.contained_by(cli_mh2) == 1.0\n    assert h_mh1.contained_by(h_mh2) == 1.0\n\n    assert cli_mh2.contained_by(cli_mh1) < 1\n    assert py_mh2.contained_by(cli_mh1) < 1\n    assert h_mh2.contained_by(h_mh1) < 1\n\n\ndef test_hp_with_stop_codons(runtmp):\n    # compare hp seq with/without stop codons, via cli and also python\n    # apis\n\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    with screed.open(testdata1) as f:\n        ecoli_seq = [record.sequence for record in f]\n\n    # first, via CLI w/o stop codons\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1,hp\", testdata1)\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n\n    x = load_one_signature(sig1)\n    cli_mh1 = x.minhash\n\n    # second, via CLI w/stop codons\n    ecoli_stop = runtmp.output(\"ecoli.stop.faa\")\n    with open(ecoli_stop, \"w\") as fp:\n        for seq in ecoli_seq:\n            fp.write(f\">seq\\n{seq}*\\n\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1,hp\", ecoli_stop)\n    sig2 = runtmp.output(\"ecoli.stop.faa.sig\")\n    assert os.path.exists(sig2)\n\n    x = load_one_signature(sig2)\n    cli_mh2 = x.minhash\n\n    # now calculate sketch with MinHash...\n    py_mh1 = MinHash(n=0, ksize=7, hp=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh1.add_protein(seq)\n\n    # now calculate sketch with MinHash and stop codons...\n    py_mh2 = MinHash(n=0, ksize=7, hp=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh2.add_protein(seq + \"*\")\n\n    # and, last, calculate hashes separately with seq_to_hashes\n    h_mh1 = MinHash(n=0, ksize=7, hp=True, scaled=1)\n    h_mh2 = MinHash(n=0, ksize=7, hp=True, scaled=1)\n\n    for seq in ecoli_seq:\n        h = h_mh1.seq_to_hashes(seq, is_protein=1)\n        h_mh1.add_many(h)\n\n        h = h_mh2.seq_to_hashes(seq + \"*\", is_protein=1)\n        h_mh2.add_many(h)\n\n    # check!\n    assert cli_mh1 == py_mh1\n    assert cli_mh2 == py_mh2\n\n    assert cli_mh1 == h_mh1\n    assert cli_mh2 == h_mh2\n\n    assert cli_mh1.contained_by(cli_mh2) == 1.0\n    assert py_mh1.contained_by(cli_mh2) == 1.0\n    assert h_mh1.contained_by(h_mh2) == 1.0\n\n    assert cli_mh2.contained_by(cli_mh1) < 1\n    assert py_mh2.contained_by(cli_mh1) < 1\n    assert h_mh2.contained_by(h_mh1) < 1\n\n\ndef test_dayhoff_with_stop_codons(runtmp):\n    # compare dayhoff seq with/without stop codons, via cli and also python\n    # apis\n\n    testdata1 = utils.get_test_data(\"ecoli.faa\")\n    with screed.open(testdata1) as f:\n        ecoli_seq = [record.sequence for record in f]\n\n    # first, via CLI w/o stop codons\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1,dayhoff\", testdata1)\n    sig1 = runtmp.output(\"ecoli.faa.sig\")\n    assert os.path.exists(sig1)\n\n    x = load_one_signature(sig1)\n    cli_mh1 = x.minhash\n\n    # second, via CLI w/stop codons\n    ecoli_stop = runtmp.output(\"ecoli.stop.faa\")\n    with open(ecoli_stop, \"w\") as fp:\n        for seq in ecoli_seq:\n            fp.write(f\">seq\\n{seq}*\\n\")\n\n    runtmp.sourmash(\"sketch\", \"protein\", \"-p\", \"k=7,scaled=1,dayhoff\", ecoli_stop)\n    sig2 = runtmp.output(\"ecoli.stop.faa.sig\")\n    assert os.path.exists(sig2)\n\n    x = load_one_signature(sig2)\n    cli_mh2 = x.minhash\n\n    # now calculate sketch with MinHash...\n    py_mh1 = MinHash(n=0, ksize=7, dayhoff=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh1.add_protein(seq)\n\n    # now calculate sketch with MinHash and stop codons...\n    py_mh2 = MinHash(n=0, ksize=7, dayhoff=True, scaled=1)\n    for seq in ecoli_seq:\n        py_mh2.add_protein(seq + \"*\")\n\n    # and, last, calculate hashes separately with seq_to_hashes\n    h_mh1 = MinHash(n=0, ksize=7, dayhoff=True, scaled=1)\n    h_mh2 = MinHash(n=0, ksize=7, dayhoff=True, scaled=1)\n\n    for seq in ecoli_seq:\n        h = h_mh1.seq_to_hashes(seq, is_protein=1)\n        h_mh1.add_many(h)\n\n        h = h_mh2.seq_to_hashes(seq + \"*\", is_protein=1)\n        h_mh2.add_many(h)\n\n    # check!\n    assert cli_mh1 == py_mh1\n    assert cli_mh2 == py_mh2\n\n    assert cli_mh1 == h_mh1\n    assert cli_mh2 == h_mh2\n\n    assert cli_mh1.contained_by(cli_mh2) == 1.0\n    assert py_mh1.contained_by(cli_mh2) == 1.0\n    assert h_mh1.contained_by(h_mh2) == 1.0\n\n    assert cli_mh2.contained_by(cli_mh1) < 1\n    assert py_mh2.contained_by(cli_mh1) < 1\n    assert h_mh2.contained_by(h_mh1) < 1\n\n\n### test sourmash sketch fromfile\n\n\ndef test_fromfile_dna(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.name == \"GCA_903797575 Salmonella enterica\"\n    assert ss.minhash.moltype == \"DNA\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_dna(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.name == \"GCA_903797575 Salmonella enterica\"\n    assert ss.minhash.moltype == \"DNA\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_skipm1n3(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"skipm1n3\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.name == \"GCA_903797575 Salmonella enterica\"\n    assert ss.minhash.moltype == \"skipm1n3\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_skipm2n3(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"skipm2n3\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.name == \"GCA_903797575 Salmonella enterica\"\n    assert ss.minhash.moltype == \"skipm2n3\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_dna_empty(runtmp):\n    # test what happens on empty files.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    # zero out the file\n    with gzip.open(\n        runtmp.output(\"sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz\"),\n        \"w\",\n    ):\n        pass\n\n    # now what happens?\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n        )\n\n    print(runtmp.last_result.out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"ERROR: no sequences found in \" in err\n\n\ndef test_fromfile_dna_check_sequence_succeed(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n        \"--check-sequence\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 1\n    ss = siglist[0]\n    assert ss.name == \"GCA_903797575 Salmonella enterica\"\n    assert ss.minhash.moltype == \"DNA\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_dna_check_sequence_fail(runtmp):\n    # does it run? yes, hopefully.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella-badseq.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n            \"--check-sequence\",\n        )\n\n    print(runtmp.last_result.out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"ERROR when reading from \" in err\n    assert (\n        \"invalid DNA character in input k-mer: MTNILKLFSRKAGEPLDSLAVKSVRQHLSGD\" in err\n    )\n\n\ndef test_fromfile_dna_and_protein(runtmp):\n    # does it run and produce DNA _and_ protein signatures?\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"protein\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 2\n\n    prot_sig = [ss for ss in siglist if ss.minhash.moltype == \"protein\"]\n    assert len(prot_sig) == 1\n    prot_sig = prot_sig[0]\n    assert prot_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    dna_sig = [ss for ss in siglist if ss.minhash.moltype == \"DNA\"]\n    assert len(dna_sig) == 1\n    dna_sig = dna_sig[0]\n    assert dna_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    assert \"** 2 total requested; output 2, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_dna_and_protein_and_hp_and_dayhoff(runtmp):\n    # does it run and produce DNA _and_ protein signatures?\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"dna,k=25\",\n        \"-p\",\n        \"protein\",\n        \"-p\",\n        \"hp\",\n        \"-p\",\n        \"dayhoff\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 5\n\n    prot_sig = [ss for ss in siglist if ss.minhash.moltype == \"protein\"]\n    assert len(prot_sig) == 1\n    prot_sig = prot_sig[0]\n    assert prot_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    prot_sig = [ss for ss in siglist if ss.minhash.moltype == \"hp\"]\n    assert len(prot_sig) == 1\n    prot_sig = prot_sig[0]\n    assert prot_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    prot_sig = [ss for ss in siglist if ss.minhash.moltype == \"dayhoff\"]\n    assert len(prot_sig) == 1\n    prot_sig = prot_sig[0]\n    assert prot_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    dna_sig = [ss for ss in siglist if ss.minhash.moltype == \"DNA\"]\n    assert len(dna_sig) == 2\n    dna_sig = dna_sig[0]\n    assert dna_sig.name == \"GCA_903797575 Salmonella enterica\"\n\n    assert \"** 5 total requested; output 5, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_dna_and_protein_noname(runtmp):\n    # nothing in the name column\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella-noname.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n            \"-p\",\n            \"protein\",\n        )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n    assert \"ERROR: 1 entries have blank 'name's? Exiting!\" in err\n\n\ndef test_fromfile_dna_and_protein_dup_name(runtmp):\n    # duplicate names\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n            \"-p\",\n            \"protein\",\n        )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n    assert \"GCA_903797575 Salmonella enterica\" not in err\n    assert \"ERROR: 1 entries have duplicate 'name' records. Exiting!\" in err\n\n\ndef test_fromfile_dna_and_protein_dup_name_report(runtmp):\n    # duplicate names\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"--report-duplicated\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n            \"-p\",\n            \"protein\",\n        )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n    assert \"GCA_903797575 Salmonella enterica\" in err\n    assert \"ERROR: 1 entries have duplicate 'name' records. Exiting!\" in err\n\n\ndef test_fromfile_dna_and_protein_missing(runtmp):\n    # test what happens when missing protein.\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella-missing.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"protein\",\n        )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert (\n        \"WARNING: fromfile entry 'GCA_903797575 Salmonella enterica' is missing a proteome\"\n        in err\n    )\n    assert \"** ERROR: we cannot build some of the requested signatures.\" in err\n    assert \"** 1 total signatures (for 1 names) cannot be built.\" in err\n\n\ndef test_fromfile_dna_and_protein_missing_ignore(runtmp):\n    # test what happens when missing protein + --ignore-missing\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella-missing.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"protein\",\n        \"--ignore-missing\",\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert (\n        \"WARNING: fromfile entry 'GCA_903797575 Salmonella enterica' is missing a proteome\"\n        in err\n    )\n\n    assert \"** ERROR: we cannot build some of the requested signatures.\" in err\n    assert \"** 1 total signatures (for 1 names) cannot be built.\" in err\n\n    assert \"** (continuing past this error because --ignore-missing was set)\" in err\n    assert \"** 1 new signatures to build from 0 files;\" in err\n\n\ndef test_fromfile_no_overwrite(runtmp):\n    # test --force-output-already-exists\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n\n    # now run again; will fail since already exists\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"protein\",\n        )\n\n    err = runtmp.last_result.err\n\n    assert \"ERROR: output location 'out.zip' already exists!\" in err\n    assert \"Use --force-output-already-exists if you want to overwrite/append.\" in err\n\n\ndef test_fromfile_force_overwrite(runtmp):\n    # test --force-output-already-exists\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"dna\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n\n    # now run again, with --force\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-o\",\n        \"out.zip\",\n        \"-p\",\n        \"protein\",\n        \"--force-output\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.zip\"))\n    idx = sourmash.load_file_as_index(runtmp.output(\"out.zip\"))\n    siglist = list(idx.signatures())\n\n    assert len(siglist) == 2\n    names = list(set([ss.name for ss in siglist]))\n    assert names[0] == \"GCA_903797575 Salmonella enterica\"\n    assert \"** 1 total requested; output 1, skipped 0\" in runtmp.last_result.err\n\n\ndef test_fromfile_need_params(runtmp):\n    # check that we need a -p\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\n            \"sketch\", \"fromfile\", \"sketch_fromfile/salmonella.csv\", \"-o\", \"out.zip\"\n        )\n\n    print(str(exc))\n    assert (\n        \"Error creating signatures: No default moltype and none specified in param string\"\n        in str(exc)\n    )\n\n\ndef test_fromfile_seed_not_allowed(runtmp):\n    # check that we cannot adjust 'seed'\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna,seed=43\",\n        )\n    print(str(exc))\n\n    assert \"ERROR: cannot set 'seed' in 'sketch fromfile'\" in str(exc)\n\n\ndef test_fromfile_license_not_allowed(runtmp):\n    # check that license is CC0\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.sourmash(\n            \"sketch\",\n            \"fromfile\",\n            \"sketch_fromfile/salmonella.csv\",\n            \"-o\",\n            \"out.zip\",\n            \"-p\",\n            \"dna\",\n            \"--license\",\n            \"BSD\",\n        )\n\n    print(str(exc))\n    assert \"sourmash only supports CC0-licensed signatures\" in str(exc)\n\n\ndef test_fromfile_dna_and_protein_csv_output(runtmp):\n    # does it run and produce DNA _and_ protein signatures?\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"--output-csv\",\n        \"out.csv\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"protein\",\n    )\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert os.path.exists(runtmp.output(\"out.csv\"))\n\n    with open(runtmp.output(\"out.csv\"), newline=\"\") as fp:\n        r = csv.DictReader(fp)\n        # filename,sketchtype,output_index,name,param_strs\n\n        x = []\n        for row in r:\n            x.append(row)\n\n        x.sort(key=lambda x: x[\"filename\"])\n\n        assert len(x) == 2\n        assert x[0][\"sketchtype\"] == \"dna\"\n        assert x[0][\"param_strs\"] == \"-p dna,k=31,scaled=1000\"\n        assert (\n            x[0][\"filename\"]\n            == \"sketch_fromfile/GCA_903797575.1_PARATYPHIC668_genomic.fna.gz\"\n        )\n\n        assert x[1][\"sketchtype\"] == \"protein\"\n        assert x[1][\"param_strs\"] == \"-p protein,k=10,scaled=200\"\n        assert (\n            x[1][\"filename\"]\n            == \"sketch_fromfile/GCA_903797575.1_PARATYPHIC668_protein.faa.gz\"\n        )\n\n        # same name...\n        assert x[0][\"name\"] == x[1][\"name\"] == \"GCA_903797575 Salmonella enterica\"\n        # ...different output index.\n        assert x[1][\"output_index\"] != x[0][\"output_index\"]\n\n\ndef test_fromfile_dna_and_protein_already_exists(runtmp):\n    # does it properly ignore existing (--already-done) sigs?\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    already_done = utils.get_test_data(\"sketch_fromfile/salmonella-dna-protein.zip\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"protein\",\n        \"--already-done\",\n        already_done,\n        \"--output-manifest\",\n        \"matching.csv\",\n    )\n\n    print(runtmp.last_result.out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"Loaded 1 pre-existing names from manifest(s)\" in err\n    assert \"Read 1 rows, requesting that 2 signatures be built.\" in err\n    assert \"** 0 new signatures to build from 0 files;\" in err\n    assert \"** Nothing to build. Exiting!\" in err\n\n    assert (\n        \"output 2 already-done signatures to 'matching.csv' in manifest format.\" in err\n    )\n    mf = manifest.CollectionManifest.load_from_filename(runtmp.output(\"matching.csv\"))\n    assert len(mf) == 2\n\n\ndef test_fromfile_dna_and_protein_partly_already_exists(runtmp):\n    # does it properly ignore existing (--already-done) sigs?\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    already_done = utils.get_test_data(\"sketch_fromfile/salmonella-dna-protein.zip\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella-mult.csv\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"protein\",\n        \"--already-done\",\n        already_done,\n    )\n\n    print(runtmp.last_result.out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"Loaded 1 pre-existing names from manifest(s)\" in err\n    assert \"Read 2 rows, requesting that 4 signatures be built.\" in err\n    assert \"** 2 new signatures to build from 2 files;\" in err\n    assert \"** 2 already exist, so skipping those.\" in err\n    assert \"** 4 total requested; output 2, skipped 2\" in err\n\n\ndef test_fromfile_dna_and_protein_already_exists_noname(runtmp):\n    # check that no name in already_exists is handled\n    test_inp = utils.get_test_data(\"sketch_fromfile\")\n    already_done = utils.get_test_data(\"sketch_fromfile/salmonella-dna-protein.zip\")\n    shutil.copytree(test_inp, runtmp.output(\"sketch_fromfile\"))\n\n    # run rename to get rid of names\n    runtmp.sourmash(\"sig\", \"rename\", already_done, \"\", \"-o\", \"already-done.zip\")\n\n    runtmp.sourmash(\n        \"sketch\",\n        \"fromfile\",\n        \"sketch_fromfile/salmonella.csv\",\n        \"-p\",\n        \"dna\",\n        \"-p\",\n        \"protein\",\n        \"--already-done\",\n        \"already-done.zip\",\n    )\n\n    print(runtmp.last_result.out)\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"Loaded 0 pre-existing names from manifest(s)\" in err\n    assert \"Read 1 rows, requesting that 2 signatures be built.\" in err\n    assert \"** 2 new signatures to build from 2 files;\" in err\n    assert \"** 2 total requested; output 2, skipped 0\" in err\n"
  },
  {
    "path": "tests/test_sqlite_index.py",
    "content": "\"Tests for SqliteIndex, SqliteCollectionManifest, and LCA_SqliteDatabase\"\n\nimport os\nimport pytest\nimport shutil\nimport sqlite3\n\nimport sourmash\nfrom sourmash.exceptions import IndexNotSupported\nfrom sourmash.index.sqlite_index import (\n    SqliteIndex,\n    load_sqlite_index,\n    SqliteCollectionManifest,\n    LCA_SqliteDatabase,\n)\n\nfrom sourmash.index import StandaloneManifestIndex\nfrom sourmash import SourmashSignature\nfrom sourmash.sourmash_args import load_one_signature\nfrom sourmash.picklist import SignaturePicklist, PickStyle\nfrom sourmash.manifest import CollectionManifest\nfrom sourmash.tax.tax_utils import MultiLineageDB\n\nimport sourmash_tst_utils as utils\nfrom sourmash_tst_utils import SourmashCommandFailed\nfrom sourmash import sqlite_utils\n\n\ndef test_sqlite_index_prefetch_empty():\n    # check that an exception is raised upon for an empty database\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    ss2 = load_one_signature(sig2, ksize=31)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    # since this is a generator, we need to actually ask for a value to\n    # get exception raised.\n    g = sqlidx.prefetch(ss2, threshold_bp=0)\n    with pytest.raises(ValueError) as e:\n        next(g)\n\n    assert \"no signatures to search\" in str(e.value)\n\n\ndef test_sqlite_index_bad_version(runtmp):\n    # create a sqlite database with a bad index version in the\n    # sourmash_internal table, see what happens :)\n\n    dbfile = runtmp.output(\"xyz.sqldb\")\n    conn = sqlite3.connect(dbfile)\n    c = conn.cursor()\n\n    SqliteIndex._create_tables(c)\n\n    # 0.9 doesn't exist/is bad version\n    c.execute(\n        \"UPDATE sourmash_internal SET value=? WHERE key=?\", (\"0.9\", \"SqliteIndex\")\n    )\n\n    conn.commit()\n\n    with pytest.raises(IndexNotSupported):\n        sourmash.load_file_as_index(dbfile)\n\n\ndef test_sqlite_index_bad_version_unique(runtmp):\n    # try to insert duplicate sqlite index info into sourmash_internal; fail\n\n    dbfile = runtmp.output(\"xyz.sqldb\")\n    conn = sqlite3.connect(dbfile)\n    c = conn.cursor()\n\n    SqliteIndex._create_tables(c)\n\n    # can't insert duplicate key\n    with pytest.raises(sqlite3.IntegrityError):\n        c.execute(\n            \"INSERT INTO sourmash_internal (value, key) VALUES (?, ?)\",\n            (\"1.1\", \"SqliteIndex\"),\n        )\n\n\ndef test_index_search_subj_scaled_is_lower():\n    # check that subject sketches are appropriately downsampled\n    sigfile = utils.get_test_data(\n        \"scaled100/GCF_000005845.2_ASM584v2_genomic.fna.gz.sig.gz\"\n    )\n    ss = load_one_signature(sigfile)\n\n    # double check :)\n    assert ss.minhash.scaled == 100\n\n    # build a new query that has a scaled of 1000\n    qs = SourmashSignature(ss.minhash.downsample(scaled=1000))\n\n    # create Index to search\n    sqlidx = SqliteIndex.create(\":memory:\")\n    sqlidx.insert(ss)\n\n    # search!\n    results = list(sqlidx.search(qs, threshold=0))\n    assert len(results) == 1\n    # original signature (not downsampled) is returned\n    assert results[0].signature == ss\n\n\ndef test_sqlite_index_save_load(runtmp):\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    sig47 = utils.get_test_data(\"47.fa.sig\")\n    sig63 = utils.get_test_data(\"63.fa.sig\")\n\n    ss2 = load_one_signature(sig2, ksize=31)\n    ss47 = load_one_signature(sig47)\n    ss63 = load_one_signature(sig63)\n\n    filename = runtmp.output(\"foo\")\n    sqlidx = SqliteIndex.create(filename)\n    sqlidx.insert(ss2)\n    sqlidx.insert(ss47)\n    sqlidx.insert(ss63)\n\n    sqlidx.close()\n\n    sqlidx2 = SqliteIndex.load(filename)\n\n    # now, search for sig2\n    sr = sqlidx2.search(ss2, threshold=1.0)\n    print([s[1].name for s in sr])\n    assert len(sr) == 1\n    assert sr[0][1] == ss2\n\n\ndef test_sqlite_index_multik_select():\n    # this loads three ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n    for ss in siglist:\n        sqlidx.insert(ss)\n\n    # select most specifically\n    sqlidx2 = sqlidx.select(ksize=31, moltype=\"DNA\")\n    assert len(sqlidx2) == 1\n\n    # all are DNA:\n    sqlidx2 = sqlidx.select(moltype=\"DNA\")\n    assert len(sqlidx2) == 3\n\n\ndef test_sqlite_index_num_select():\n    # this will fail on 'num' select, which is not allowed\n    sqlidx = SqliteIndex.create(\":memory:\")\n    with pytest.raises(ValueError):\n        sqlidx.select(num=100)\n\n\ndef test_sqlite_index_abund_select():\n    # this will fail on 'track_abundance' select, which is not allowed\n    sqlidx = SqliteIndex.create(\":memory:\")\n    with pytest.raises(ValueError):\n        sqlidx.select(track_abundance=True)\n\n\ndef test_sqlite_index_insert_num_fail():\n    # cannot insert 'num' signatures\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    sig47 = utils.get_test_data(\"num/47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n    assert ss47.minhash.num != 0\n\n    with pytest.raises(ValueError) as exc:\n        sqlidx.insert(ss47)\n\n    assert \"cannot store 'num' signatures in SqliteIndex\" in str(exc)\n\n\ndef test_sqlite_index_insert_abund_fail():\n    # cannot insert 'num' signatures\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    sig47 = utils.get_test_data(\"track_abund/47.fa.sig\")\n    ss47 = load_one_signature(sig47, ksize=31)\n\n    with pytest.raises(ValueError) as exc:\n        sqlidx.insert(ss47)\n\n    assert \"cannot store signatures with abundance in SqliteIndex\" in str(exc)\n\n\ndef test_sqlite_index_moltype_multi_fail():\n    # check that we cannot store sigs with multiple scaled values.\n\n    # this loads multiple ksizes (19, 31) and moltypes (DNA, protein, hp, etc)\n    filename = utils.get_test_data(\"prot/all.zip\")\n    siglist = sourmash.load_file_as_signatures(filename)\n    siglist = list(siglist)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    sqlidx.insert(siglist[0])\n    assert sqlidx.scaled == 100\n\n    with pytest.raises(ValueError) as exc:\n        for ss in siglist:\n            sqlidx.insert(ss)\n\n    assert \"this database can only store scaled values=100\" in str(exc)\n\n\ndef test_sqlite_index_picklist_select():\n    # test select with a picklist\n\n    # this loads three ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n    for ss in siglist:\n        sqlidx.insert(ss)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\")\n    picklist.init([\"f3a90d4e\"])\n\n    # select on picklist\n    sqlidx2 = sqlidx.select(picklist=picklist)\n    assert len(sqlidx2) == 1\n    ss = list(sqlidx2.signatures())[0]\n    assert ss.minhash.ksize == 31\n    assert ss.md5sum().startswith(\"f3a90d4e55\")\n\n\ndef test_sqlite_index_picklist_select_exclude():\n    # test select with a picklist, but exclude\n\n    # this loads three ksizes, 21/31/51\n    sig2 = utils.get_test_data(\"2.fa.sig\")\n    siglist = sourmash.load_file_as_signatures(sig2)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n    for ss in siglist:\n        sqlidx.insert(ss)\n\n    # construct a picklist...\n    picklist = SignaturePicklist(\"md5prefix8\", pickstyle=PickStyle.EXCLUDE)\n    picklist.init([\"f3a90d4e\"])\n\n    # select on picklist\n    sqlidx2 = sqlidx.select(picklist=picklist)\n    assert len(sqlidx2) == 2\n    md5s = set()\n    ksizes = set()\n    for ss in list(sqlidx2.signatures()):\n        md5s.add(ss.md5sum())\n        ksizes.add(ss.minhash.ksize)\n    assert md5s == set(\n        [\"f372e47893edd349e5956f8b0d8dcbf7\", \"43f3b48e59443092850964d355a20ac0\"]\n    )\n    assert ksizes == set([21, 51])\n\n\ndef test_sqlite_jaccard_ordering():\n    # this tests a tricky situation where for three sketches A, B, C,\n    # |A intersect B| is greater than |A intersect C|\n    # _but_\n    # |A jaccard B| is less than |A intersect B|\n    a = sourmash.MinHash(ksize=31, n=0, scaled=2)\n    b = a.copy_and_clear()\n    c = a.copy_and_clear()\n\n    a.add_many([1, 2, 3, 4])\n    b.add_many([1, 2, 3] + list(range(10, 30)))\n    c.add_many([1, 5])\n\n    def _intersect(x, y):\n        return x.intersection_and_union_size(y)[0]\n\n    print(\"a intersect b:\", _intersect(a, b))\n    print(\"a intersect c:\", _intersect(a, c))\n    print(\"a jaccard b:\", a.jaccard(b))\n    print(\"a jaccard c:\", a.jaccard(c))\n    assert _intersect(a, b) > _intersect(a, c)\n    assert a.jaccard(b) < a.jaccard(c)\n\n    # thresholds to use:\n    assert a.jaccard(b) < 0.15\n    assert a.jaccard(c) > 0.15\n\n    # now - make signatures, try out :)\n    ss_a = sourmash.SourmashSignature(a, name=\"A\")\n    ss_b = sourmash.SourmashSignature(b, name=\"B\")\n    ss_c = sourmash.SourmashSignature(c, name=\"C\")\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n    sqlidx.insert(ss_a)\n    sqlidx.insert(ss_b)\n    sqlidx.insert(ss_c)\n\n    sr = sqlidx.search(ss_a, threshold=0.15)\n    print(sr)\n    assert len(sr) == 2\n    assert sr[0].signature == ss_a\n    assert sr[0].score == 1.0\n    assert sr[1].signature == ss_c\n    assert sr[1].score == 0.2\n\n\ndef test_sqlite_index_scaled1():\n    # check on scaled=1 storage.\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    mh1 = sourmash.MinHash(0, 31, scaled=1)\n    mh1.add_hash(2**64 - 1)\n    mh1.add_hash(2**64 - 2)\n    mh1.add_hash(2**64 - 3)\n    ss1 = sourmash.SourmashSignature(mh1, name=\"ss 1\")\n\n    mh2 = sourmash.MinHash(0, 31, scaled=1)\n    mh2.add_hash(2**64 - 1)\n    mh2.add_hash(2**64 - 2)\n    mh2.add_hash(2**64 - 3)\n    mh2.add_hash(0)\n    mh2.add_hash(1)\n    mh2.add_hash(2)\n    ss2 = sourmash.SourmashSignature(mh2, name=\"ss 2\")\n\n    sqlidx.insert(ss1)\n    sqlidx.insert(ss2)\n\n    # check jaccard search\n    results = list(sqlidx.search(ss1, threshold=0))\n    print(results)\n    assert len(results) == 2\n    assert results[0].signature == ss1\n    assert results[0].score == 1.0\n    assert results[1].signature == ss2\n    assert results[1].score == 0.5\n\n    results = list(sqlidx.search(ss1, threshold=0, do_containment=True))\n    print(results)\n    assert results[0].signature == ss1\n    assert results[0].score == 1.0\n    assert results[1].signature == ss2\n    assert results[1].score == 1.0\n\n    # minhashes retrieved successfully?\n    assert len(results[0].signature.minhash) == 3\n    assert len(results[1].signature.minhash) == 6\n\n\ndef test_sqlite_index_load_existing():\n    # try loading an existing sqlite index\n    filename = utils.get_test_data(\"sqlite/index.sqldb\")\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, SqliteIndex)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n\ndef test_sqlite_index_create_load_existing(runtmp):\n    # try creating then loading an existing sqlite index; create from CLI\n    filename = runtmp.output(\"idx.sqldb\")\n    sig1 = utils.get_test_data(\"47.fa.sig\")\n    sig2 = utils.get_test_data(\"63.fa.sig\")\n\n    runtmp.sourmash(\"sig\", \"cat\", sig1, sig2, \"-o\", filename)\n\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, SqliteIndex)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n\ndef test_sqlite_index_create_load_insert_existing(runtmp):\n    # try creating, loading, inserting into an existing sqlite index\n    filename = runtmp.output(\"idx.sqldb\")\n    sig1 = utils.get_test_data(\"47.fa.sig\")\n    sig2 = utils.get_test_data(\"63.fa.sig\")\n    sig3 = utils.get_test_data(\"2.fa.sig\")\n\n    runtmp.sourmash(\"sig\", \"cat\", sig1, sig2, \"-o\", filename)\n\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, SqliteIndex)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n    ss3 = load_one_signature(sig3, ksize=31)\n    sqlidx.insert(ss3)\n    sqlidx.commit()\n\n    runtmp.sourmash(\"sig\", \"describe\", filename)\n    print(runtmp.last_result.out)\n    assert \"md5: f3a90d4e5528864a5bcc8434b0d0c3b1\" in runtmp.last_result.out\n\n\ndef test_sqlite_index_create_load_insert_existing_cli(runtmp):\n    # try creating, loading, inserting into an existing sqlite index from cli\n    # (aka \"append\" to existing database)\n    filename = runtmp.output(\"idx.sqldb\")\n    sig1 = utils.get_test_data(\"47.fa.sig\")\n    sig2 = utils.get_test_data(\"63.fa.sig\")\n    sig3 = utils.get_test_data(\"2.fa.sig\")\n\n    runtmp.sourmash(\"sig\", \"cat\", sig1, sig2, \"-o\", filename)\n\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, SqliteIndex)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n    # add a third\n    runtmp.sourmash(\"sig\", \"cat\", sig3, \"-o\", filename, \"-k\", \"31\")\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 3\n\n\ndef test_sqlite_manifest_bad_version(runtmp):\n    # create a sqlite database with a bad manifest version in the\n    # sourmash_internal table, see what happens :)\n\n    dbfile = runtmp.output(\"xyz.sqlmf\")\n    conn = sqlite3.connect(dbfile)\n    c = conn.cursor()\n\n    SqliteCollectionManifest._create_tables(c)\n\n    # 0.9 doesn't exist/bad version\n    c.execute(\n        \"UPDATE sourmash_internal SET value=? WHERE key=?\", (\"0.9\", \"SqliteManifest\")\n    )\n\n    conn.commit()\n\n    with pytest.raises(IndexNotSupported):\n        CollectionManifest.load_from_filename(dbfile)\n\n\ndef test_sqlite_manifest_bad_version_unique(runtmp):\n    # try to insert duplicate sqlite manifest info into sourmash_internal; fail\n\n    dbfile = runtmp.output(\"xyz.sqldb\")\n    conn = sqlite3.connect(dbfile)\n    c = conn.cursor()\n\n    SqliteCollectionManifest._create_tables(c)\n\n    # can't insert duplicate key\n    with pytest.raises(sqlite3.IntegrityError):\n        c.execute(\n            \"INSERT INTO sourmash_internal (value, key) VALUES (?, ?)\",\n            (\"1.1\", \"SqliteManifest\"),\n        )\n\n\ndef test_sqlite_manifest_basic():\n    # test some features of the SQLite-based manifest.\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    sqlidx = SqliteIndex.create(\":memory:\")\n\n    # empty manifest tests\n    manifest = sqlidx.manifest\n    assert not manifest\n    assert len(manifest) == 0\n\n    sqlidx.insert(sig47)\n    sqlidx.insert(sig63)\n\n    # ok, more full manifest tests!\n    assert manifest\n    assert len(manifest) == 2\n\n    assert sig47 in manifest\n    assert sig2 not in manifest\n\n    # check that we can get a \"standard\" manifest out\n    standard_mf = CollectionManifest.load_from_manifest(sqlidx.manifest)\n    assert len(standard_mf) == 2\n\n    picklist = manifest.to_picklist()\n    assert sig47 in picklist\n    assert sig2 not in picklist\n\n\ndef test_sqlite_manifest_round_trip():\n    # check that we can go from regular mf -> sqlite mf -> regular again.\n    sig2 = load_one_signature(utils.get_test_data(\"2.fa.sig\"), ksize=31)\n    sig47 = load_one_signature(utils.get_test_data(\"47.fa.sig\"), ksize=31)\n    sig63 = load_one_signature(utils.get_test_data(\"63.fa.sig\"), ksize=31)\n\n    rows = []\n    rows.append(\n        CollectionManifest.make_manifest_row(sig47, None, include_signature=False)\n    )\n    rows.append(\n        CollectionManifest.make_manifest_row(sig63, None, include_signature=False)\n    )\n    nosql_mf = CollectionManifest(rows)\n\n    sqlite_mf = SqliteCollectionManifest.load_from_manifest(nosql_mf)\n\n    # test roundtrip\n    round_mf = CollectionManifest.load_from_manifest(sqlite_mf)\n\n    assert len(round_mf) == 2\n    print(round_mf.rows, nosql_mf.rows)\n    assert round_mf == nosql_mf\n\n    for mf in (nosql_mf, sqlite_mf, round_mf):\n        picklist = mf.to_picklist()\n        assert sig47 in picklist\n        assert sig2 not in picklist\n\n\ndef test_sqlite_manifest_create(runtmp):\n    # test creation and summarization of a manifest of prot.zip\n    zipfile = utils.get_test_data(\"prot/all.zip\")\n\n    # create manifest\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", zipfile, \"-o\", \"mf.sqlmf\")\n\n    sqlmf = runtmp.output(\"mf.sqlmf\")\n    assert os.path.exists(sqlmf)\n\n    # verify it's loadable as the right type\n    idx = load_sqlite_index(sqlmf)\n    assert isinstance(idx, StandaloneManifestIndex)\n\n    # summarize\n    runtmp.sourmash(\"sig\", \"fileinfo\", \"mf.sqlmf\")\n\n    out = runtmp.last_result.out\n    print(out)\n\n    assert \"2 sketches with dayhoff, k=19, scaled=100          7945 total hashes\" in out\n    assert \"2 sketches with hp, k=19, scaled=100               5184 total hashes\" in out\n    assert \"2 sketches with protein, k=19, scaled=100          8214 total hashes\" in out\n    assert \"1 sketches with DNA, k=31, scaled=1000             5238 total hashes\" in out\n\n    assert \"path filetype: StandaloneManifestIndex\" in out\n    assert \"location: mf.sqlmf\" in out\n    assert \"is database? yes\" in out\n    assert \"has manifest? yes\" in out\n    assert \"num signatures: 7\" in out\n\n\ndef test_sqlite_manifest_create_noload_sigs(runtmp):\n    # sigs should not be loadable from manifest this way...\n    zipfile = utils.get_test_data(\"prot/all.zip\")\n\n    # create manifest\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", zipfile, \"-o\", \"mf.sqlmf\")\n\n    # 'describe' should not be able to load the sqlmf b/c prefix is wrong\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"describe\", \"mf.sqlmf\")\n\n\ndef test_sqlite_manifest_create_yesload_sigs(runtmp):\n    # should be able to load after copying files\n    zipfile = utils.get_test_data(\"prot/all.zip\")\n    shutil.copytree(utils.get_test_data(\"prot\"), runtmp.output(\"prot\"))\n\n    # create manifest\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", zipfile, \"-o\", \"prot/mf.sqlmf\")\n\n    # 'describe' should now be able to load the sqlmf, which is cool\n    runtmp.sourmash(\"sig\", \"describe\", \"prot/mf.sqlmf\")\n    print(runtmp.last_result.out)\n\n\ndef test_sqlite_manifest_num(runtmp):\n    # should be able to produce sql manifests with 'num' sketches in them\n    numsig = utils.get_test_data(\"num/47.fa.sig\")\n\n    # create mf\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", numsig, \"-o\", \"mf.sqlmf\")\n\n    # do summarize:\n    runtmp.sourmash(\"sig\", \"summarize\", \"mf.sqlmf\")\n    out = runtmp.last_result.out\n\n    print(out)\n\n    assert \"1 sketches with DNA, k=21, num=500                 500 total hashes\" in out\n    assert \"1 sketches with DNA, k=31, num=500                 500 total hashes\" in out\n    assert \"1 sketches with DNA, k=51, num=500                 500 total hashes\" in out\n\n\ndef test_sqlite_manifest_num_select(runtmp):\n    # should be able to _select_ sql manifests with 'num' sketches in them\n    numsig = utils.get_test_data(\"num/47.fa.sig\")\n\n    # create mf\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", numsig, \"-o\", \"mf.sqlmf\")\n\n    # load as index\n    idx = sourmash.load_file_as_index(runtmp.output(\"mf.sqlmf\"))\n\n    # select\n    print(list(idx.manifest.rows))\n    idx = idx.select(num=500)\n    print(list(idx.manifest.rows))\n    assert len(idx) == 3\n\n\ndef test_sqlite_manifest_locations(runtmp):\n    # check what locations returns... may return too many, that's ok.\n    prot = utils.get_test_data(\"prot\")\n\n    runtmp.sourmash(\"sig\", \"manifest\", \"-F\", \"sql\", prot, \"-o\", \"mf.sqlmf\")\n\n    # load as index\n    idx = sourmash.load_file_as_index(runtmp.output(\"mf.sqlmf\"))\n\n    picklist = SignaturePicklist(\"identprefix\")\n    picklist.pickset = set([\"GCA_001593925\"])\n    idx = idx.select(picklist=picklist)\n\n    sql_locations = set(idx.manifest.locations())\n    row_locations = set(row[\"internal_location\"] for row in idx.manifest.rows)\n\n    assert sql_locations.issuperset(row_locations)\n\n    assert \"dna-sig.sig.gz\" in sql_locations  # this is unnecessary...\n    assert \"dna-sig.sig.gz\" not in row_locations  # ...this is correct :)\n\n\ndef test_sqlite_manifest_create_insert(runtmp):\n    # try out creating a sqlite manifest and then running cli on it\n\n    mfname = runtmp.output(\"some.sqlmf\")\n    mf = SqliteCollectionManifest.create(mfname)\n\n    sigfile = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sigfile)\n\n    mf._insert_row(mf.conn.cursor(), mf.make_manifest_row(ss, \"some.sig\"))\n    mf.conn.commit()\n\n    # copy sig in since we want it to resolve...\n    shutil.copyfile(sigfile, runtmp.output(\"some.sig\"))\n\n    # 'describe' should work here, to resolve actual sigs.\n    runtmp.sourmash(\"sig\", \"describe\", mfname)\n    print(runtmp.last_result.out)\n    assert \"md5: 09a08691ce52952152f0e866a59f6261\" in runtmp.last_result.out\n\n\ndef test_sqlite_manifest_create_insert_2(runtmp):\n    # try out creating a sqlite manifest from cli and then _insert_row into it\n\n    # copy sig in since we want it to resolve...\n    sigfile = utils.get_test_data(\"47.fa.sig\")\n    shutil.copyfile(sigfile, runtmp.output(\"some.sig\"))\n\n    runtmp.sourmash(\"sig\", \"manifest\", \"some.sig\", \"-F\", \"sql\", \"-o\", \"some.sqlmf\")\n    mfname = runtmp.output(\"some.sqlmf\")\n\n    mf = CollectionManifest.load_from_filename(mfname)\n    ss = load_one_signature(runtmp.output(\"some.sig\"))\n    mf._insert_row(mf.conn.cursor(), mf.make_manifest_row(ss, \"some.sig\"))\n    mf.conn.commit()\n\n    # 'describe' should work here, to resolve actual sigs.\n    runtmp.sourmash(\"sig\", \"describe\", mfname)\n    print(runtmp.last_result.out)\n    assert \"md5: 09a08691ce52952152f0e866a59f6261\" in runtmp.last_result.out\n\n\ndef test_sqlite_manifest_existing(runtmp):\n    # try out an existing sqlite manifest\n\n    prefix = runtmp.output(\"protdir\")\n    mf = runtmp.output(\"protdir/prot.sqlmf\")\n    shutil.copytree(utils.get_test_data(\"prot\"), prefix)\n    shutil.copyfile(utils.get_test_data(\"sqlite/prot.sqlmf\"), mf)\n\n    runtmp.sourmash(\"sig\", \"describe\", mf)\n    print(runtmp.last_result.out)\n\n\ndef test_sqlite_manifest_existing_insert(runtmp):\n    # try out an existing sqlite manifest - insert into it\n\n    prefix = runtmp.output(\"protdir\")\n    shutil.copytree(utils.get_test_data(\"prot\"), prefix)\n\n    mfname = runtmp.output(\"protdir/prot.sqlmf\")\n    shutil.copyfile(utils.get_test_data(\"sqlite/prot.sqlmf\"), mfname)\n    mf = CollectionManifest.load_from_filename(mfname)\n    assert isinstance(mf, SqliteCollectionManifest)\n\n    sigfile = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sigfile)\n\n    mf._insert_row(mf.conn.cursor(), mf.make_manifest_row(ss, \"some.sig\"))\n    mf.conn.commit()\n\n    # copy sig in since we want it to resolve...\n    shutil.copyfile(sigfile, runtmp.output(\"protdir/some.sig\"))\n\n    # 'describe' should work here.\n    runtmp.sourmash(\"sig\", \"describe\", mfname)\n    print(runtmp.last_result.out)\n\n\ndef test_sqlite_manifest_existing_mf_only(runtmp):\n    # try out an existing sqlite manifest, but without underlying files -> fail\n\n    mf = runtmp.output(\"prot.sqlmf\")\n    shutil.copyfile(utils.get_test_data(\"sqlite/prot.sqlmf\"), mf)\n\n    # 'fileinfo' should work...\n    runtmp.sourmash(\"sig\", \"fileinfo\", mf)\n    print(runtmp.last_result.out)\n    assert \"num signatures: 7\" in runtmp.last_result.out\n\n    # ...but 'describe' should fail, since it needs actual sigs.\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"describe\", mf)\n\n    print(runtmp.last_result.err)\n    assert \"ERROR: Error while reading signatures from\" in runtmp.last_result.err\n\n\ndef test_sqlite_manifest_existing_mfonly_insert(runtmp):\n    # try out an existing sqlite manifest - insert into it, but fail describe\n\n    mfname = runtmp.output(\"prot.sqlmf\")\n    shutil.copyfile(utils.get_test_data(\"sqlite/prot.sqlmf\"), mfname)\n    mf = CollectionManifest.load_from_filename(mfname)\n    assert isinstance(mf, SqliteCollectionManifest)\n\n    sigfile = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sigfile)\n\n    mf._insert_row(mf.conn.cursor(), mf.make_manifest_row(ss, sigfile))\n    mf.conn.commit()\n\n    # 'fileinfo' should work...\n    runtmp.sourmash(\"sig\", \"fileinfo\", mfname)\n    print(runtmp.last_result.out)\n    assert \"num signatures: 8\" in runtmp.last_result.out\n\n    # ...but 'describe' should fail, since it needs actual sigs.\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"sig\", \"describe\", mfname)\n\n\ndef test_sqlite_manifest_load_existing_index():\n    # try loading an existing sqlite index as a manifest\n    filename = utils.get_test_data(\"sqlite/index.sqldb\")\n    mf = CollectionManifest.load_from_filename(filename)\n    assert isinstance(mf, SqliteCollectionManifest)\n\n    assert len(mf) == 2\n\n\ndef test_sqlite_manifest_load_existing_index_insert_fail():\n    # try loading an existing sqlite index as a manifest; insert should fail\n    filename = utils.get_test_data(\"sqlite/index.sqldb\")\n    mf = CollectionManifest.load_from_filename(filename)\n    assert isinstance(mf, SqliteCollectionManifest)\n\n    assert len(mf) == 2\n\n    # try insert - should fail\n    sigfile = utils.get_test_data(\"47.fa.sig\")\n    ss = load_one_signature(sigfile)\n\n    with pytest.raises(Exception) as exc:\n        mf._insert_row(mf.conn.cursor(), mf.make_manifest_row(ss, sigfile))\n\n    assert \"must use SqliteIndex.insert to add to this manifest\" in str(exc)\n\n\ndef test_sqlite_manifest_create_load_empty(runtmp):\n    # try creating an empty manifest, then loading\n    mfname = runtmp.output(\"some.sqlmf\")\n    mf = SqliteCollectionManifest.create(mfname)\n    mf.close()\n\n    mf2 = load_sqlite_index(mfname)\n    assert len(mf2) == 0\n\n\ndef test_sqlite_lca_db_load_existing():\n    # try loading an existing sqlite index\n    filename = utils.get_test_data(\"sqlite/lca.sqldb\")\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, LCA_SqliteDatabase)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n\ndef test_sqlite_lca_db_select():\n    # try loading an existing sqlite index\n    filename = utils.get_test_data(\"sqlite/lca.sqldb\")\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, LCA_SqliteDatabase)\n\n    sqlidx2 = sqlidx.select(ksize=31)\n    list(sqlidx2.hashvals)  # only on LCA_SqliteDatabase\n    assert isinstance(sqlidx2, LCA_SqliteDatabase)\n\n\ndef test_sqlite_lca_db_create_load_existing(runtmp):\n    # try creating (from CLI) then loading (from API) an LCA db\n    filename = runtmp.output(\"lca.sqldb\")\n    sig1 = utils.get_test_data(\"lca/TARA_ASE_MAG_00031.sig\")\n    sig2 = utils.get_test_data(\"lca/TARA_PSW_MAG_00136.sig\")\n\n    runtmp.sourmash(\"sig\", \"flatten\", sig1, sig2, \"-o\", filename, \"-k\", \"31\")\n\n    # load tax\n    tax_csv = utils.get_test_data(\"sqlite/delmont-6.csv\")\n    runtmp.sourmash(\"tax\", \"prepare\", \"-t\", tax_csv, \"-o\", filename, \"-F\", \"sql\")\n\n    sqlidx = sourmash.load_file_as_index(filename)\n    assert isinstance(sqlidx, LCA_SqliteDatabase)\n\n    siglist = list(sqlidx.signatures())\n    assert len(siglist) == 2\n\n\ndef test_sqlite_lca_db_load_empty(runtmp):\n    # try creating then loading an _empty_ LCA_SqliteDatabase\n\n    dbname = runtmp.output(\"empty.sqldb\")\n\n    # create empty SqliteIndex...\n    runtmp.sourmash(\"sig\", \"cat\", \"-o\", dbname)\n    assert os.path.exists(dbname)\n\n    # ...and create empty sourmash_taxonomy tables in there...\n    empty_tax = utils.get_test_data(\"scaled/empty-lineage.csv\")\n    runtmp.sourmash(\"tax\", \"prepare\", \"-F\", \"sql\", \"-t\", empty_tax, \"-o\", dbname)\n\n    runtmp.sourmash(\"sig\", \"describe\", dbname)\n    assert \"loaded 0 signatures\" in runtmp.last_result.err\n\n\ndef test_sqlite_lca_db_create_readonly(runtmp):\n    # try running 'prepare' on a read-only sqlite db, check error message.\n\n    dbname = runtmp.output(\"empty.sqldb\")\n\n    # create empty SqliteIndex...\n    runtmp.sourmash(\"sig\", \"cat\", \"-o\", dbname)\n    assert os.path.exists(dbname)\n\n    # make it read only...\n    from stat import S_IREAD, S_IRGRP, S_IROTH\n\n    os.chmod(dbname, S_IREAD | S_IRGRP | S_IROTH)\n\n    # ...and try creating empty sourmash_taxonomy tables in there...\n    empty_tax = utils.get_test_data(\"scaled/empty-lineage.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"tax\", \"prepare\", \"-F\", \"sql\", \"-t\", empty_tax, \"-o\", dbname)\n\n    err = runtmp.last_result.err\n    print(err)\n\n    assert \"taxonomy table already exists in\" not in err\n    assert \"attempt to write a readonly database\" in err\n\n\ndef test_sqlite_lca_db_try_load_sqlite_index():\n    # try loading a SqliteIndex with no tax tables from .load classmethod\n    dbname = utils.get_test_data(\"sqlite/index.sqldb\")\n\n    with pytest.raises(ValueError) as exc:\n        LCA_SqliteDatabase.load(dbname)\n\n    assert \"not a taxonomy database\" in str(exc)\n\n\ndef test_sqlite_lca_db_supply_lineage_db():\n    # try creating an LCA_SqliteDatabase object with a separate lineage DB.\n    dbname = utils.get_test_data(\"sqlite/index.sqldb\")\n\n    tax_csv = utils.get_test_data(\"sqlite/shewanella-lineage.csv\")\n    lineage_db = MultiLineageDB.load([tax_csv])\n\n    db = LCA_SqliteDatabase(dbname, lineage_db=lineage_db)\n\n    hashval = next(iter(db.hashvals))\n    lineages = db.get_lineage_assignments(hashval)\n    print(lineages)\n    assert lineages[0][0].rank == \"superkingdom\"\n    assert lineages[0][0].name == \"d__Bacteria\"\n    assert lineages[0][-1].rank == \"species\"\n    assert lineages[0][-1].name == \"s__Shewanella baltica\"\n    assert lineages[1][0].rank == \"superkingdom\"\n    assert lineages[1][0].name == \"d__Bacteria\"\n    assert lineages[0][-1].rank == \"species\"\n    assert lineages[0][-1].name == \"s__Shewanella baltica\"\n\n\ndef test_bad_sqlite_internal_version():\n    # check get_sourmash_internal\n    dbname = utils.get_test_data(\"sqlite/index.sqldb\")\n\n    conn = sqlite_utils.open_sqlite_db(dbname)\n    c = conn.cursor()\n    with pytest.raises(Exception):\n        sqlite_utils.add_sourmash_internal(c, \"SqliteIndex\", \"0.9\")\n"
  },
  {
    "path": "tests/test_tax.py",
    "content": "\"\"\"\nTests for the 'sourmash tax' command line and high level API.\n\"\"\"\n\nimport os\nimport csv\nimport pytest\nimport gzip\nfrom collections import Counter\nfrom pathlib import Path\n\nimport sourmash\nimport sourmash_tst_utils as utils\nfrom sourmash.tax import tax_utils\nfrom sourmash.lca import lca_utils\nfrom sourmash_tst_utils import SourmashCommandFailed\n\nfrom sourmash import sqlite_utils\nfrom sourmash.exceptions import IndexNotSupported\nfrom sourmash import sourmash_args\n\n\n## command line tests\ndef test_run_sourmash_tax():\n    status, out, err = utils.runscript(\"sourmash\", [\"tax\"], fail_ok=True)\n    assert status != 0  # no args provided, ok ;)\n\n\ndef test_metagenome_stdout_0(runtmp, cli_v4_and_v5):\n    # test basic metagenome; force output is csv_summary with v5\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.116,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.088,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.028,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test1.sig,0.016,138000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.028,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test1.sig,0.016,138000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_stdout_0_default_v4(runtmp, cli_v4_only):\n    # test basic metagenome; output is csv_summary in v4.\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--use-abund\",\n        version=cli_v4_only,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_stdout_0_db(runtmp, cli_v4_and_v5):\n    # test basic metagenome with sqlite database;\n    # force output to csv_summary with v5\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.db\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.116,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.088,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.028,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test1.sig,0.016,138000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.028,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test1.sig,0.016,138000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_summary_csv_out_v4(runtmp, cli_v4_only):\n    # test summary_csv output format; default with v4\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".summarized.csv\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        version=cli_v4_only,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    sum_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    assert f\"saving 'csv_summary' output to '{csvout}'\" in runtmp.last_result.err\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test1,superkingdom,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[2]\n    )\n    assert (\n        \"test1,phylum,0.11607499002792182,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[3]\n    )\n    assert (\n        \"test1,phylum,0.08815317112086159,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[4]\n    )\n    assert (\n        \"test1,phylum,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[5]\n    )\n    assert (\n        \"test1,class,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[6]\n    )\n    assert (\n        \"test1,class,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[7]\n    )\n    assert (\n        \"test1,class,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[8]\n    )\n    assert (\n        \"test1,order,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[9]\n    )\n    assert (\n        \"test1,order,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[10]\n    )\n    assert (\n        \"test1,order,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[11]\n    )\n    assert (\n        \"test1,family,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[12]\n    )\n    assert (\n        \"test1,family,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[13]\n    )\n    assert (\n        \"test1,family,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[14]\n    )\n    assert (\n        \"test1,genus,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test1.sig,0.05701254275940707,444000\"\n        in sum_gather_results[15]\n    )\n    assert (\n        \"test1,genus,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[16]\n    )\n    assert (\n        \"test1,genus,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[17]\n    )\n    assert (\n        \"test1,genus,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[18]\n    )\n    assert (\n        \"test1,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.05701254275940707,444000\"\n        in sum_gather_results[19]\n    )\n    assert (\n        \"test1,species,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[20]\n    )\n    assert (\n        \"test1,species,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[21]\n    )\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[22]\n    )\n\n\ndef test_metagenome_summary_csv_out_v5(runtmp, cli_v5_only):\n    # test CSV summary format for v5: use abundances in output\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".summarized.csv\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"csv_summary\",\n        version=cli_v5_only,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    sum_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    assert f\"saving 'csv_summary' output to '{csvout}'\" in runtmp.last_result.err\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test1,superkingdom,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[2]\n    )\n    assert (\n        \"test1,phylum,0.11607499002792182,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[3]\n    )\n    assert (\n        \"test1,phylum,0.08815317112086159,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[4]\n    )\n    assert (\n        \"test1,phylum,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[5]\n    )\n    assert (\n        \"test1,class,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[6]\n    )\n    assert (\n        \"test1,class,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[7]\n    )\n    assert (\n        \"test1,class,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[8]\n    )\n    assert (\n        \"test1,order,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[9]\n    )\n    assert (\n        \"test1,order,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[10]\n    )\n    assert (\n        \"test1,order,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[11]\n    )\n    assert (\n        \"test1,family,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[12]\n    )\n    assert (\n        \"test1,family,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[13]\n    )\n    assert (\n        \"test1,family,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[14]\n    )\n    assert (\n        \"test1,genus,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test1.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[15]\n    )\n    assert (\n        \"test1,genus,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test1.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[16]\n    )\n    assert (\n        \"test1,genus,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[17]\n    )\n    assert (\n        \"test1,genus,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[18]\n    )\n    assert (\n        \"test1,species,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test1.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[19]\n    )\n    assert (\n        \"test1,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[20]\n    )\n    assert (\n        \"test1,species,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[21]\n    )\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[22]\n    )\n\n\ndef test_metagenome_summary_csv_out_abund(runtmp):\n    # test CSV summary format with --use-abund\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".summarized.csv\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"csv_summary\",\n        \"--use-abund\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    sum_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    assert f\"saving 'csv_summary' output to '{csvout}'\" in runtmp.last_result.err\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test1,superkingdom,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[2]\n    )\n    assert (\n        \"test1,phylum,0.11607499002792182,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[3]\n    )\n    assert (\n        \"test1,phylum,0.08815317112086159,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[4]\n    )\n    assert (\n        \"test1,phylum,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[5]\n    )\n    assert (\n        \"test1,class,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[6]\n    )\n    assert (\n        \"test1,class,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[7]\n    )\n    assert (\n        \"test1,class,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[8]\n    )\n    assert (\n        \"test1,order,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[9]\n    )\n    assert (\n        \"test1,order,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[10]\n    )\n    assert (\n        \"test1,order,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[11]\n    )\n    assert (\n        \"test1,family,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.07265026877341586,582000\"\n        in sum_gather_results[12]\n    )\n    assert (\n        \"test1,family,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test1.sig,0.05815279361459521,442000\"\n        in sum_gather_results[13]\n    )\n    assert (\n        \"test1,family,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[14]\n    )\n    assert (\n        \"test1,genus,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test1.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[15]\n    )\n    assert (\n        \"test1,genus,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test1.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[16]\n    )\n    assert (\n        \"test1,genus,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[17]\n    )\n    assert (\n        \"test1,genus,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[18]\n    )\n    assert (\n        \"test1,species,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test1.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[19]\n    )\n    assert (\n        \"test1,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[20]\n    )\n    assert (\n        \"test1,species,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test1.sig,0.015637726014008795,138000\"\n        in sum_gather_results[21]\n    )\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,md5,test1.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[22]\n    )\n\n\ndef test_metagenome_summary_csv_out_empty_gather_force(runtmp, cli_v4_and_v5):\n    # test multiple -g, empty -g file, and --force. v5: force csv_summary.\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".summarized.csv\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    gather_empty = runtmp.output(\"g.csv\")\n    with open(gather_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", gather_empty)\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"-g\",\n        gather_empty,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-f\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    sum_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    assert f\"saving 'csv_summary' output to '{csvout}'\" in runtmp.last_result.err\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000\"\n        in sum_gather_results[1]\n    )\n\n\ndef test_metagenome_kreport_out(runtmp):\n    # test 'kreport' kraken output format\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"kreport\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    kreport_results = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    assert f\"saving 'kreport' output to '{csvout}'\" in runtmp.last_result.err\n    print(kreport_results)\n    assert [\"13.08\", \"1605999\", \"0\", \"D\", \"\", \"d__Bacteria\"] == kreport_results[0]\n    assert [\n        \"86.92\",\n        \"10672000\",\n        \"10672000\",\n        \"U\",\n        \"\",\n        \"unclassified\",\n    ] == kreport_results[1]\n    assert [\"7.27\", \"892000\", \"0\", \"P\", \"\", \"p__Bacteroidota\"] == kreport_results[2]\n    assert [\"5.82\", \"714000\", \"0\", \"P\", \"\", \"p__Proteobacteria\"] == kreport_results[3]\n    assert [\"7.27\", \"892000\", \"0\", \"C\", \"\", \"c__Bacteroidia\"] == kreport_results[4]\n    assert [\n        \"5.82\",\n        \"714000\",\n        \"0\",\n        \"C\",\n        \"\",\n        \"c__Gammaproteobacteria\",\n    ] == kreport_results[5]\n    assert [\"7.27\", \"892000\", \"0\", \"O\", \"\", \"o__Bacteroidales\"] == kreport_results[6]\n    assert [\"5.82\", \"714000\", \"0\", \"O\", \"\", \"o__Enterobacterales\"] == kreport_results[7]\n    assert [\"7.27\", \"892000\", \"0\", \"F\", \"\", \"f__Bacteroidaceae\"] == kreport_results[8]\n    assert [\"5.82\", \"714000\", \"0\", \"F\", \"\", \"f__Enterobacteriaceae\"] == kreport_results[\n        9\n    ]\n    assert [\"5.70\", \"700000\", \"0\", \"G\", \"\", \"g__Prevotella\"] == kreport_results[10]\n    assert [\"5.82\", \"714000\", \"0\", \"G\", \"\", \"g__Escherichia\"] == kreport_results[11]\n    assert [\"1.56\", \"192000\", \"0\", \"G\", \"\", \"g__Phocaeicola\"] == kreport_results[12]\n    assert [\n        \"5.70\",\n        \"700000\",\n        \"700000\",\n        \"S\",\n        \"\",\n        \"s__Prevotella copri\",\n    ] == kreport_results[13]\n    assert [\n        \"5.82\",\n        \"714000\",\n        \"714000\",\n        \"S\",\n        \"\",\n        \"s__Escherichia coli\",\n    ] == kreport_results[14]\n    assert [\n        \"1.56\",\n        \"192000\",\n        \"192000\",\n        \"S\",\n        \"\",\n        \"s__Phocaeicola vulgatus\",\n    ] == kreport_results[15]\n\n\ndef test_metagenome_kreport_ncbi_taxid_out(runtmp):\n    # test NCBI taxid output from kreport\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.ncbi-taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"kreport\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    kreport_results = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    assert f\"saving 'kreport' output to '{csvout}'\" in runtmp.last_result.err\n    print(kreport_results)\n    assert [\"13.08\", \"1605999\", \"0\", \"D\", \"2\", \"Bacteria\"] == kreport_results[0]\n    assert [\n        \"86.92\",\n        \"10672000\",\n        \"10672000\",\n        \"U\",\n        \"\",\n        \"unclassified\",\n    ] == kreport_results[1]\n    assert [\"7.27\", \"892000\", \"0\", \"P\", \"976\", \"Bacteroidota\"] == kreport_results[2]\n    assert [\"5.82\", \"714000\", \"0\", \"P\", \"1224\", \"Pseudomonadota\"] == kreport_results[3]\n    assert [\"7.27\", \"892000\", \"0\", \"C\", \"200643\", \"Bacteroidia\"] == kreport_results[4]\n    assert [\n        \"5.82\",\n        \"714000\",\n        \"0\",\n        \"C\",\n        \"1236\",\n        \"Gammaproteobacteria\",\n    ] == kreport_results[5]\n    assert [\"7.27\", \"892000\", \"0\", \"O\", \"171549\", \"Bacteroidales\"] == kreport_results[6]\n    assert [\"5.82\", \"714000\", \"0\", \"O\", \"91347\", \"Enterobacterales\"] == kreport_results[\n        7\n    ]\n    assert [\"5.70\", \"700000\", \"0\", \"F\", \"171552\", \"Prevotellaceae\"] == kreport_results[\n        8\n    ]\n    assert [\"5.82\", \"714000\", \"0\", \"F\", \"543\", \"Enterobacteriaceae\"] == kreport_results[\n        9\n    ]\n    assert [\"1.56\", \"192000\", \"0\", \"F\", \"815\", \"Bacteroidaceae\"] == kreport_results[10]\n    assert [\"5.70\", \"700000\", \"0\", \"G\", \"838\", \"Prevotella\"] == kreport_results[11]\n    assert [\"5.82\", \"714000\", \"0\", \"G\", \"561\", \"Escherichia\"] == kreport_results[12]\n    assert [\"1.56\", \"192000\", \"0\", \"G\", \"909656\", \"Phocaeicola\"] == kreport_results[13]\n    assert [\n        \"5.70\",\n        \"700000\",\n        \"700000\",\n        \"S\",\n        \"165179\",\n        \"Prevotella copri\",\n    ] == kreport_results[14]\n    assert [\n        \"5.82\",\n        \"714000\",\n        \"714000\",\n        \"S\",\n        \"562\",\n        \"Escherichia coli\",\n    ] == kreport_results[15]\n    assert [\n        \"1.56\",\n        \"192000\",\n        \"192000\",\n        \"S\",\n        \"821\",\n        \"Phocaeicola vulgatus\",\n    ] == kreport_results[16]\n\n\ndef test_metagenome_kreport_out_lemonade_v4(runtmp, cli_v4_only):\n    # test 'kreport' kraken output format against lemonade output;\n    # no abundances provided => warning is printed in v4.\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"kreport\",\n        version=cli_v4_only,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"** WARNING: no abundances found in gather results.\" in runtmp.last_result.err\n    )\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    kreport_results = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    assert f\"saving 'kreport' output to '{csvout}'\" in runtmp.last_result.err\n    print(kreport_results)\n    assert [\"5.35\", \"116000\", \"0\", \"D\", \"\", \"d__Bacteria\"] == kreport_results[0]\n    assert [\"94.65\", \"2054000\", \"2054000\", \"U\", \"\", \"unclassified\"] == kreport_results[\n        1\n    ]\n    assert [\"5.35\", \"116000\", \"0\", \"P\", \"\", \"p__Bacteroidota\"] == kreport_results[2]\n    assert [\"5.35\", \"116000\", \"0\", \"C\", \"\", \"c__Chlorobia\"] == kreport_results[3]\n    assert [\"5.35\", \"116000\", \"0\", \"O\", \"\", \"o__Chlorobiales\"] == kreport_results[4]\n    assert [\"5.35\", \"116000\", \"0\", \"F\", \"\", \"f__Chlorobiaceae\"] == kreport_results[5]\n    assert [\"5.35\", \"116000\", \"0\", \"G\", \"\", \"g__Prosthecochloris\"] == kreport_results[6]\n    assert [\n        \"5.35\",\n        \"116000\",\n        \"116000\",\n        \"S\",\n        \"\",\n        \"s__Prosthecochloris vibrioformis\",\n    ] == kreport_results[7]\n\n\ndef test_metagenome_kreport_out_lemonade_ignore_abund(runtmp):\n    # test 'kreport' kraken output format against lemonade output;\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"kreport\",\n        \"--no-abundances\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # no warning message!\n    assert (\n        \"** WARNING: no abundances found in gather results.\"\n        not in runtmp.last_result.err\n    )\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    kreport_results = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    assert f\"saving 'kreport' output to '{csvout}'\" in runtmp.last_result.err\n    print(kreport_results)\n    assert [\"5.35\", \"116000\", \"0\", \"D\", \"\", \"d__Bacteria\"] == kreport_results[0]\n    assert [\"94.65\", \"2054000\", \"2054000\", \"U\", \"\", \"unclassified\"] == kreport_results[\n        1\n    ]\n    assert [\"5.35\", \"116000\", \"0\", \"P\", \"\", \"p__Bacteroidota\"] == kreport_results[2]\n    assert [\"5.35\", \"116000\", \"0\", \"C\", \"\", \"c__Chlorobia\"] == kreport_results[3]\n    assert [\"5.35\", \"116000\", \"0\", \"O\", \"\", \"o__Chlorobiales\"] == kreport_results[4]\n    assert [\"5.35\", \"116000\", \"0\", \"F\", \"\", \"f__Chlorobiaceae\"] == kreport_results[5]\n    assert [\"5.35\", \"116000\", \"0\", \"G\", \"\", \"g__Prosthecochloris\"] == kreport_results[6]\n    assert [\n        \"5.35\",\n        \"116000\",\n        \"116000\",\n        \"S\",\n        \"\",\n        \"s__Prosthecochloris vibrioformis\",\n    ] == kreport_results[7]\n\n\ndef test_metagenome_kreport_out_lemonade_no_abund_error_v5(runtmp, cli_v5_only):\n    # error in v5 if no abundances provided\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-dir\",\n            outdir,\n            \"-F\",\n            \"kreport\",\n            version=cli_v5_only,\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"ERROR: no abundances found in gather results.\" in runtmp.last_result.err\n\n\ndef test_metagenome_kreport_out_lemonade_no_abund_use_abund(runtmp):\n    # error if --use-abund is provided but no abundances\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-dir\",\n            outdir,\n            \"-F\",\n            \"kreport\",\n            \"--use-abund\",\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert \"ERROR: no abundances found in gather results.\" in runtmp.last_result.err\n\n\ndef test_metagenome_kreport_out_fail(runtmp):\n    # kreport cannot be generated with gather results from < v4.5.0\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".kreport.txt\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-dir\",\n            outdir,\n            \"-F\",\n            \"kreport\",\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert (\n        \"ERROR: cannot produce 'kreport' format from gather results before sourmash v4.5.0\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_metagenome_bioboxes_stdout(runtmp):\n    # test CAMI bioboxes format output\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.ncbi-taxonomy.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"bioboxes\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n    assert \"# Taxonomic Profiling Output\" in runtmp.last_result.out\n    assert \"@SampleID:test1\" in runtmp.last_result.out\n    assert \"@Version:0.10.0\" in runtmp.last_result.out\n    assert (\n        \"@Ranks:superkingdom|phylum|class|order|family|genus|species|strain\"\n        in runtmp.last_result.out\n    )\n    assert \"@__program__:sourmash\" in runtmp.last_result.out\n    assert \"2\tsuperkingdom\t2\tBacteria\t13.08\" in runtmp.last_result.out\n    assert (\n        \"976\tphylum\t2|976\tBacteria|Bacteroidota\t7.27\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"1224\tphylum\t2|1224\tBacteria|Pseudomonadota\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"200643\tclass\t2|976|200643\tBacteria|Bacteroidota|Bacteroidia\t7.27\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"1236\tclass\t2|1224|1236\tBacteria|Pseudomonadota|Gammaproteobacteria\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"171549\torder\t2|976|200643|171549\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales\t7.27\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"91347\torder\t2|1224|1236|91347\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"171552\tfamily\t2|976|200643|171549|171552\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae\t5.70\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"543\tfamily\t2|1224|1236|91347|543\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"815\tfamily\t2|976|200643|171549|815\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae\t1.56\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"838\tgenus\t2|976|200643|171549|171552|838\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae|Prevotella\t5.70\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"561\tgenus\t2|1224|1236|91347|543|561\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae|Escherichia\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"909656\tgenus\t2|976|200643|171549|815|909656\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola\t1.56\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"165179\tspecies\t2|976|200643|171549|171552|838|165179\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae|Prevotella|Prevotella copri\t5.70\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"562\tspecies\t2|1224|1236|91347|543|561|562\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae|Escherichia|Escherichia coli\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"821\tspecies\t2|976|200643|171549|815|909656|821\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola|Phocaeicola vulgatus\t1.56\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_metagenome_bioboxes_outfile(runtmp):\n    # test CAMI bioboxes format output\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.ncbi-taxonomy.csv\")\n    csv_base = \"out\"\n    sum_csv = csv_base + \".bioboxes.profile\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"bioboxes\",\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n    bb_results = [x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()]\n    assert f\"saving 'bioboxes' output to '{csvout}'\" in runtmp.last_result.err\n    print(bb_results)\n    assert [\"# Taxonomic Profiling Output\"] == bb_results[0]\n    assert [\"@SampleID:test1\"] == bb_results[1]\n    assert [\"2\", \"superkingdom\", \"2\", \"Bacteria\", \"13.08\"] == bb_results[6]\n    assert [\n        \"838\",\n        \"genus\",\n        \"2|976|200643|171549|171552|838\",\n        \"Bacteria|Bacteroidota|Bacteroidia|Bacteroidales|Prevotellaceae|Prevotella\",\n        \"5.70\",\n    ] == bb_results[16]\n\n\ndef test_metagenome_bioboxes_stdout_missing_ranktaxinfo(runtmp):\n    # test CAMI bioboxes format output\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.ncbi-taxonomy.csv\")\n    tax_mod = runtmp.output(\"missingtaxranks.taxonomy.csv\")\n\n    # modify the taxonomy CSV to remove some ranks\n    #    GCF_001881345.1,562,Bacteria,Pseudomonadota,Gammaproteobacteria,Enterobacterales,Enterobacteriaceae,Escherichia,Escherichia coli,,2|1224|1236|91347|543|561|562|\n    # GCF_009494285.1,165179,Bacteria,Bacteroidota,Bacteroidia,Bacteroidales,Prevotellaceae,Prevotella,Prevotella copri,,2|976|200643|171549|171552|838|165179|\n    with open(tax) as fp:\n        csv_reader = csv.DictReader(fp)\n        with open(tax_mod, \"w\") as fp_out:\n            csv_writer = csv.DictWriter(\n                fp_out, fieldnames=csv_reader.fieldnames, delimiter=\",\"\n            )\n            csv_writer.writeheader()\n            # now remove genus from Escherichia order from Prevotella\n            for row in csv_reader:\n                if row[\"taxid\"] == \"562\":\n                    row[\"genus\"] = \"\"\n                    row[\"taxpath\"] = \"2|1224|1236|91347|543||562\"\n                elif row[\"taxid\"] == \"165179\":\n                    row[\"order\"] = \"\"\n                    row[\"taxpath\"] = \"2|976|200643||171552|838|165179\"\n                csv_writer.writerow(row)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax_mod,\n        \"-F\",\n        \"bioboxes\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n    assert \"# Taxonomic Profiling Output\" in runtmp.last_result.out\n    assert \"@SampleID:test1\" in runtmp.last_result.out\n    assert \"@Version:0.10.0\" in runtmp.last_result.out\n    assert (\n        \"@Ranks:superkingdom|phylum|class|order|family|genus|species|strain\"\n        in runtmp.last_result.out\n    )\n    assert \"@__program__:sourmash\" in runtmp.last_result.out\n    assert \"2\tsuperkingdom\t2\tBacteria\t13.08\" in runtmp.last_result.out\n    assert (\n        \"976\tphylum\t2|976\tBacteria|Bacteroidota\t7.27\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"1224\tphylum\t2|1224\tBacteria|Pseudomonadota\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"200643\tclass\t2|976|200643\tBacteria|Bacteroidota|Bacteroidia\t7.27\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"1236\tclass\t2|1224|1236\tBacteria|Pseudomonadota|Gammaproteobacteria\t5.82\"\n        in runtmp.last_result.out\n    )\n    # this one is NOT in the output, because Bacteroidales order is missing from tax\n    assert (\n        \"171549\torder\t2|976|200643|171549\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales\t7.27\"\n        not in runtmp.last_result.out\n    )\n    assert (\n        \"91347\torder\t2|1224|1236|91347\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"171552\tfamily\t2|976|200643||171552\tBacteria|Bacteroidota|Bacteroidia||Prevotellaceae\t5.70\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"543\tfamily\t2|1224|1236|91347|543\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"815\tfamily\t2|976|200643|171549|815\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae\t1.56\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"838\tgenus\t2|976|200643||171552|838\tBacteria|Bacteroidota|Bacteroidia||Prevotellaceae|Prevotella\t5.70\"\n        in runtmp.last_result.out\n    )\n    # this one is NOT in the output, because Escherichia genus is missing from tax\n    assert (\n        \"561\tgenus\t2|1224|1236|91347|543|561\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae|Escherichia\t5.82\"\n        not in runtmp.last_result.out\n    )\n    assert (\n        \"909656\tgenus\t2|976|200643|171549|815|909656\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola\t1.56\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"165179\tspecies\t2|976|200643||171552|838|165179\tBacteria|Bacteroidota|Bacteroidia||Prevotellaceae|Prevotella|Prevotella copri\t5.70\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"562\tspecies\t2|1224|1236|91347|543||562\tBacteria|Pseudomonadota|Gammaproteobacteria|Enterobacterales|Enterobacteriaceae||Escherichia coli\t5.82\"\n        in runtmp.last_result.out\n    )\n    assert (\n        \"821\tspecies\t2|976|200643|171549|815|909656|821\tBacteria|Bacteroidota|Bacteroidia|Bacteroidales|Bacteroidaceae|Phocaeicola|Phocaeicola vulgatus\t1.56\"\n        in runtmp.last_result.out\n    )\n\n\ndef test_metagenome_krona_tsv_out(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    kr_csv = csv_base + \".krona.tsv\"\n    csvout = runtmp.output(kr_csv)\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-format\",\n        \"krona\",\n        \"--rank\",\n        \"genus\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n    assert f\"saving 'krona' output to '{csvout}'\" in runtmp.last_result.err\n\n    gn_krona_results = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    print(\"species krona results: \\n\", gn_krona_results)\n    assert [\n        \"fraction\",\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n    ] == gn_krona_results[0]\n    assert [\n        \"0.0885520542481053\",\n        \"d__Bacteria\",\n        \"p__Bacteroidota\",\n        \"c__Bacteroidia\",\n        \"o__Bacteroidales\",\n        \"f__Bacteroidaceae\",\n        \"g__Prevotella\",\n    ] == gn_krona_results[1]\n    assert [\n        \"0.08815317112086159\",\n        \"d__Bacteria\",\n        \"p__Proteobacteria\",\n        \"c__Gammaproteobacteria\",\n        \"o__Enterobacterales\",\n        \"f__Enterobacteriaceae\",\n        \"g__Escherichia\",\n    ] == gn_krona_results[2]\n    assert [\n        \"0.027522935779816515\",\n        \"d__Bacteria\",\n        \"p__Bacteroidota\",\n        \"c__Bacteroidia\",\n        \"o__Bacteroidales\",\n        \"f__Bacteroidaceae\",\n        \"g__Phocaeicola\",\n    ] == gn_krona_results[3]\n    assert [\n        \"0.7957718388512166\",\n        \"unclassified\",\n        \"unclassified\",\n        \"unclassified\",\n        \"unclassified\",\n        \"unclassified\",\n        \"unclassified\",\n    ] == gn_krona_results[4]\n\n\ndef test_metagenome_lineage_summary_out(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    lin_csv = csv_base + \".lineage_summary.tsv\"\n    csvout = runtmp.output(lin_csv)\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-format\",\n        \"lineage_summary\",\n        \"--rank\",\n        \"genus\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n    assert f\"saving 'lineage_summary' output to '{csvout}'\" in runtmp.last_result.err\n\n    gn_lineage_summary = [\n        x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()\n    ]\n    print(\"species lineage summary results: \\n\", gn_lineage_summary)\n    assert [\"lineage\", \"test1\"] == gn_lineage_summary[0]\n    assert [\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola\",\n        \"0.027522935779816515\",\n    ] == gn_lineage_summary[1]\n    assert [\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella\",\n        \"0.0885520542481053\",\n    ] == gn_lineage_summary[2]\n    assert [\n        \"d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia\",\n        \"0.08815317112086159\",\n    ] == gn_lineage_summary[3]\n    assert [\"unclassified\", \"0.7957718388512166\"] == gn_lineage_summary[4]\n\n\ndef test_metagenome_human_format_out(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    csvout = runtmp.output(csv_base + \".human.txt\")\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--output-format\",\n        \"human\",\n        \"--rank\",\n        \"genus\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n    assert f\"saving 'human' output to '{csvout}'\" in runtmp.last_result.err\n\n    with open(csvout) as fp:\n        outp = fp.readlines()\n\n    assert len(outp) == 6\n    outp = [x.strip() for x in outp]\n    print(outp)\n\n    assert outp[0] == \"sample name    proportion   cANI   lineage\"\n    assert outp[1] == \"-----------    ----------   ----   -------\"\n    assert outp[2] == \"test1             86.9%     -      unclassified\"\n    assert (\n        outp[3]\n        == \"test1              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia\"\n    )\n    assert (\n        outp[4]\n        == \"test1              5.7%     92.5%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella\"\n    )\n    assert (\n        outp[5]\n        == \"test1              1.6%     89.1%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola\"\n    )\n\n\ndef test_metagenome_human_format_out_default_v5(runtmp, cli_v4_and_v5):\n    # 'human' is default output format for v5\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    csvout = runtmp.output(csv_base + \".human.txt\")\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    format_args = []\n    if cli_v4_and_v5 != \"v5\":\n        format_args = [\"-F\", \"human\"]\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--rank\",\n        \"genus\",\n        \"--output-dir\",\n        outdir,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n    assert f\"saving 'human' output to '{csvout}'\" in runtmp.last_result.err\n\n    with open(csvout) as fp:\n        outp = fp.readlines()\n\n    assert len(outp) == 6\n    outp = [x.strip() for x in outp]\n    print(outp)\n\n    assert outp[0] == \"sample name    proportion   cANI   lineage\"\n    assert outp[1] == \"-----------    ----------   ----   -------\"\n    assert outp[2] == \"test1             86.9%     -      unclassified\"\n    assert (\n        outp[3]\n        == \"test1              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia\"\n    )\n    assert (\n        outp[4]\n        == \"test1              5.7%     92.5%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella\"\n    )\n    assert (\n        outp[5]\n        == \"test1              1.6%     89.1%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola\"\n    )\n\n\ndef test_metagenome_human_format_out_default_v5_simple(runtmp, cli_v5_only):\n    # 'human' is default output format for v5, simple/explicit version\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    csvout = runtmp.output(csv_base + \".human.txt\")\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        csv_base,\n        \"--rank\",\n        \"genus\",\n        \"--output-dir\",\n        outdir,\n        version=cli_v5_only,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n    assert f\"saving 'human' output to '{csvout}'\" in runtmp.last_result.err\n\n    with open(csvout) as fp:\n        outp = fp.readlines()\n\n    assert len(outp) == 6\n    outp = [x.strip() for x in outp]\n    print(outp)\n\n    assert outp[0] == \"sample name    proportion   cANI   lineage\"\n    assert outp[1] == \"-----------    ----------   ----   -------\"\n    assert outp[2] == \"test1             86.9%     -      unclassified\"\n    assert (\n        outp[3]\n        == \"test1              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia\"\n    )\n\n\ndef test_metagenome_no_taxonomy_fail(runtmp):\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"tax\", \"metagenome\", \"-g\", g_csv)\n    assert \"error: the following arguments are required: -t/--taxonomy-csv\" in str(\n        exc.value\n    )\n\n\ndef test_metagenome_no_rank_lineage_summary(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-format\",\n            \"lineage_summary\",\n        )\n    print(str(exc.value))\n    assert (\n        \"Rank (--rank) is required for krona, lineage_summary output formats.\"\n        in str(exc.value)\n    )\n\n\ndef test_metagenome_no_rank_krona(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-format\",\n            \"krona\",\n        )\n    print(str(exc.value))\n    assert (\n        \"Rank (--rank) is required for krona, lineage_summary output formats.\"\n        in str(exc.value)\n    )\n\n\ndef test_metagenome_bad_rank_krona(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-format\",\n            \"krona\",\n            \"--rank\",\n            \"NotARank\",\n        )\n    print(str(exc.value))\n    assert (\n        \"Invalid '--rank'/'--position' input: 'NotARank'. Please choose: 'strain', 'species', 'genus', 'family', 'order', 'class', 'phylum', 'superkingdom'\"\n        in runtmp.last_result.err\n    )\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-format\",\n            \"krona\",\n            \"--rank\",\n            \"5\",\n        )\n    print(str(exc.value))\n    assert (\n        \"Invalid '--rank'/'--position' input: '5'. Please choose: 'strain', 'species', 'genus', 'family', 'order', 'class', 'phylum', 'superkingdom'\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_metagenome_ictv(runtmp):\n    # test basic metagenome\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n\n    c.run_sourmash(\"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--ictv\")\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    print(c.last_result.out)\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,realm,0.204,Riboviria,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,realm,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,kingdom,0.204,Riboviria;;Orthornavirae,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,kingdom,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.204,Riboviria;;Orthornavirae;;Negarnaviricota,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,subphylum,0.204,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,subphylum,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.204,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.204,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,order,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.204,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,family,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.204,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus,md5,test1.sig,0.131,1024000,0.950,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,genus,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.088,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bundibugyoense,md5,test1.sig,0.058,442000,0.925,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.078,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus taiense,md5,test1.sig,0.050,390000,0.921,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.028,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bombaliense,md5,test1.sig,0.016,138000,0.891,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.011,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus restonense,md5,test1.sig,0.007,54000,0.864,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,species,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,name,0.088,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bundibugyoense;Bundibugyo virus,md5,test1.sig,0.058,442000,0.925,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,name,0.078,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus taiense;Taï Forest virus,md5,test1.sig,0.050,390000,0.921,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,name,0.028,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bombaliense;Bombali virus,md5,test1.sig,0.016,138000,0.891,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,name,0.011,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus restonense;Reston virus,md5,test1.sig,0.007,54000,0.864,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,name,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_no_rank_krona(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-o\",\n            csv_base,\n            \"--output-format\",\n            \"krona\",\n        )\n    assert \"ERROR: Rank (--rank) is required for krona output formats\" in str(exc.value)\n\n\ndef test_metagenome_rank_not_available(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--rank\", \"strain\"\n        )\n\n    print(str(exc.value))\n\n    assert c.last_result.status == -1\n    assert (\n        \"No taxonomic information provided for rank strain: cannot summarize at this rank\"\n        in str(exc.value)\n    )\n\n\ndef test_metagenome_duplicated_taxonomy_fail(runtmp):\n    c = runtmp\n    # write temp taxonomy with duplicates\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1] + \"FOO\")  # add first tax_assign again\n        dup.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", duplicated_csv\n        )\n\n    assert \"cannot read taxonomy\" in str(exc.value)\n    assert \"multiple lineages for identifier GCF_001881345\" in str(exc.value)\n\n\ndef test_metagenome_duplicated_taxonomy_force(runtmp, cli_v4_and_v5):\n    c = runtmp\n    # write temp taxonomy with duplicates.\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1])  # add first tax_assign again\n        dup.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        duplicated_csv,\n        \"--force\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    # same as stdout test - just check the first few lines\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.116,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.088,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.796,unclassified,md5,test1.sig,0.869,3990000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_missing_taxonomy(runtmp, cli_v4_and_v5):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        subset.write(\"\\n\".join(tax[:4]))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        subset_csv,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_003471795\"\n        in c.last_result.err\n    )\n\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.193,d__Bacteria,md5,test1.sig,0.124,970000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.807,unclassified,md5,test1.sig,0.876,4044000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.105,d__Bacteria;p__Bacteroidota,md5,test1.sig,0.066,528000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.088,d__Bacteria;p__Proteobacteria,md5,test1.sig,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,phylum,0.807,unclassified,md5,test1.sig,0.876,4044000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,class,0.105,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test1.sig,0.066,528000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_missing_fail_taxonomy(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        subset.write(\"\\n\".join(tax[:4]))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            subset_csv,\n            \"--fail-on-missing-taxonomy\",\n        )\n\n    print(str(exc.value))\n\n    assert \"ident 'GCF_003471795' is not in the taxonomy database.\" in str(exc.value)\n    assert \"Failing, as requested via --fail-on-missing-taxonomy\" in str(exc.value)\n    assert c.last_result.status == -1\n\n\ndef test_metagenome_multiple_taxonomy_files_missing(runtmp, cli_v4_and_v5):\n    c = runtmp\n    # write temp taxonomy with duplicates\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # gather against mult databases\n    g_csv = utils.get_test_data(\"tax/test1_x_gtdbrs202_genbank_euks.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--force\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"of 6 gather results, lineage assignments for 2 results were missed\"\n        in c.last_result.err\n    )\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.204,d__Bacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.796,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.116,d__Bacteria;p__Bacteroidota,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.088,d__Bacteria;p__Proteobacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.796,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.869,3990000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.088,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.796,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.869,3990000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_multiple_taxonomy_files(runtmp, cli_v4_and_v5):\n    c = runtmp\n    # write temp taxonomy with duplicates\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    protozoa_genbank = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n    bacteria_refseq = utils.get_test_data(\"tax/bacteria_refseq_lineage.csv\")\n\n    # gather against mult databases\n    g_csv = utils.get_test_data(\"tax/test1_x_gtdbrs202_genbank_euks.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        protozoa_genbank,\n        bacteria_refseq,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.204,Bacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.051,Eukaryota,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.116,Bacteria;Bacteroidetes,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.088,Bacteria;Proteobacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.051,Eukaryota;Apicomplexa,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.116,Bacteria;Bacteroidetes;Bacteroidia,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_multiple_taxonomy_files_multiple_taxonomy_args(runtmp):\n    c = runtmp\n    # pass in mult tax files using mult tax arguments\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    protozoa_genbank = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n    bacteria_refseq = utils.get_test_data(\"tax/bacteria_refseq_lineage.csv\")\n\n    # gather against mult databases\n    g_csv = utils.get_test_data(\"tax/test1_x_gtdbrs202_genbank_euks.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-t\",\n        protozoa_genbank,\n        \"-t\",\n        bacteria_refseq,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.204,Bacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.051,Eukaryota,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.116,Bacteria;Bacteroidetes,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.088,Bacteria;Proteobacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.051,Eukaryota;Apicomplexa,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.116,Bacteria;Bacteroidetes;Bacteroidia,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_multiple_taxonomy_files_multiple_taxonomy_args_empty_force(\n    runtmp, cli_v4_and_v5\n):\n    # pass in mult tax files using mult tax arguments, with one empty,\n    # and use --force\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    protozoa_genbank = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n    bacteria_refseq = utils.get_test_data(\"tax/bacteria_refseq_lineage.csv\")\n\n    tax_empty = runtmp.output(\"t.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    # gather against mult databases\n    g_csv = utils.get_test_data(\"tax/test1_x_gtdbrs202_genbank_euks.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-t\",\n        protozoa_genbank,\n        \"-t\",\n        bacteria_refseq,\n        \"-t\",\n        tax_empty,\n        \"--force\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.204,Bacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.131,1024000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.051,Eukaryota,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,superkingdom,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.116,Bacteria;Bacteroidetes,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.088,Bacteria;Proteobacteria,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.058,442000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.051,Eukaryota;Apicomplexa,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.245,258000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,phylum,0.744,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.624,3732000\"\n        in c.last_result.out\n    )\n    assert (\n        \"multtest,class,0.116,Bacteria;Bacteroidetes;Bacteroidia,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.073,582000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_empty_gather_results(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # creates empty gather result\n    g_csv = runtmp.output(\"g.csv\")\n    with open(g_csv, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", g_csv)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax)\n\n    assert f\"Cannot read gather results from '{g_csv}'. Is file empty?\" in str(\n        exc.value\n    )\n    assert runtmp.last_result.status == -1\n\n\ndef test_metagenome_bad_gather_header(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    # creates bad gather result\n    bad_g = [\n        x.replace(\"query_bp\", \"nope\") + \"\\n\"\n        for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(bad_g_csv, \"w\") as fp:\n        fp.writelines(bad_g)\n    print(\"bad_gather_results: \\n\", bad_g)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"metagenome\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax)\n\n    print(str(exc.value))\n    assert \"is missing columns needed for taxonomic summarization.\" in str(exc.value)\n    assert runtmp.last_result.status == -1\n\n\ndef test_metagenome_empty_tax_lineage_input(runtmp):\n    # test an empty tax CSV\n    tax_empty = runtmp.output(\"t.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax_empty\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status != 0\n    assert \"cannot read taxonomy assignments from\" in str(exc.value)\n\n\ndef test_metagenome_empty_tax_lineage_input_force(runtmp):\n    # test an empty tax CSV with --force\n    tax_empty = runtmp.output(\"t.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax_empty, \"--force\"\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status != 0\n    assert \"ERROR: No taxonomic assignments loaded\" in str(exc.value)\n\n\ndef test_metagenome_perfect_match_warning(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    perfect_g_csv = runtmp.output(\"g.csv\")\n\n    # create a perfect gather result\n    with open(g_csv) as fp:\n        r = csv.DictReader(fp, delimiter=\",\")\n        header = r.fieldnames\n        print(header)\n        with open(perfect_g_csv, \"w\") as out_fp:\n            w = csv.DictWriter(out_fp, header)\n            w.writeheader()\n            for n, row in enumerate(r):\n                if n == 0:\n                    # make a perfect match\n                    row[\"f_unique_to_query\"] = 1.0\n                else:\n                    # set the rest to 0\n                    row[\"f_unique_to_query\"] = 0.0\n                w.writerow(row)\n                print(row)\n\n    runtmp.run_sourmash(\"tax\", \"metagenome\", \"-g\", perfect_g_csv, \"--taxonomy-csv\", tax)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert (\n        \"WARNING: 100% match! Is query 'test1' identical to its database match, 'GCF_001881345'?\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_metagenome_over100percent_error(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    perfect_g_csv = runtmp.output(\"g.csv\")\n\n    # create a perfect gather result\n    with open(g_csv) as fp:\n        r = csv.DictReader(fp, delimiter=\",\")\n        header = r.fieldnames\n        print(header)\n        with open(perfect_g_csv, \"w\") as out_fp:\n            w = csv.DictWriter(out_fp, header)\n            w.writeheader()\n            for n, row in enumerate(r):\n                if n == 0:\n                    row[\"f_unique_to_query\"] = 1.0\n                # let the rest stay as they are (should be > 100% match now)\n                w.writerow(row)\n                print(row)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", perfect_g_csv, \"--taxonomy-csv\", tax\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == -1\n    assert (\n        \"fraction is > 100% of the query! This should not be possible.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_metagenome_gather_duplicate_query(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # different filename, contents identical to test1\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        fp.write(Path(g_res).read_text())\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_res,\n            g_res2,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n        )\n\n    assert c.last_result.status == -1\n    print(str(exc.value))\n    assert (\n        \"Gather query test1 was found in more than one CSV. Cannot load from \"\n        in str(exc.value)\n    )\n\n\ndef test_metagenome_gather_duplicate_query_force(runtmp):\n    # do not load same query from multiple files.\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # different filename, contents identical to test1\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        fp.write(Path(g_res).read_text())\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_res,\n            g_res2,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"--force\",\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n\n    assert \"Gather query test1 was found in more than one CSV.\" in c.last_result.err\n    assert \"Cannot force past duplicated gather query. Exiting.\" in c.last_result.err\n\n\ndef test_metagenome_two_queries_human_output(runtmp):\n    # do not load same query from multiple files.\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-F\",\n        \"human\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"test1             86.9%     -      unclassified\" in c.last_result.out\n    assert (\n        \"test1              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in c.last_result.out\n    )\n    assert \"test2             86.9%     -      unclassified\" in c.last_result.out\n    assert (\n        \"test2              5.8%     92.5%  d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in c.last_result.out\n    )\n    assert \"test2              5.7%     92.5%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n    assert \"test2              1.6%     89.1%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\"\n\n\ndef test_metagenome_two_queries_csv_summary_output(runtmp, cli_v4_only):\n    # remove single-query outputs when working with multiple queries\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    csv_summary_out = runtmp.output(\"tst.summarized.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-F\",\n        \"csv_summary\",\n        \"--rank\",\n        \"phylum\",\n        \"-o\",\n        \"tst\",\n        version=cli_v4_only,\n    )\n\n    assert os.path.exists(csv_summary_out)\n\n    assert c.last_result.status == 0\n    assert \"loaded results for 2 queries from 2 gather CSVs\" in c.last_result.err\n    assert (\n        f\"saving 'csv_summary' output to '{os.path.basename(csv_summary_out)}'\"\n        in runtmp.last_result.err\n    )\n    sum_gather_results = [\n        x.rstrip() for x in Path(csv_summary_out).read_text().splitlines()\n    ]\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    # check both queries exist in csv_summary results; check several\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test2,superkingdom,0.2042281611487834,d__Bacteria,md5,test2.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[23]\n    )\n    assert (\n        \"test2,phylum,0.11607499002792182,d__Bacteria;p__Bacteroidota,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[25]\n    )\n    assert (\n        \"test2,phylum,0.08815317112086159,d__Bacteria;p__Proteobacteria,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[26]\n    )\n    assert (\n        \"test2,phylum,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[27]\n    )\n    assert (\n        \"test2,class,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[28]\n    )\n    assert (\n        \"test2,class,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[29]\n    )\n    assert (\n        \"test2,class,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[30]\n    )\n    assert (\n        \"test2,order,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[31]\n    )\n    assert (\n        \"test2,order,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[32]\n    )\n    assert (\n        \"test2,order,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[33]\n    )\n    assert (\n        \"test2,family,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[34]\n    )\n    assert (\n        \"test2,family,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[35]\n    )\n    assert (\n        \"test2,family,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[36]\n    )\n    assert (\n        \"test2,genus,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test2.sig,0.05701254275940707,444000\"\n        in sum_gather_results[37]\n    )\n    assert (\n        \"test2,genus,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[38]\n    )\n    assert (\n        \"test2,genus,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test2.sig,0.015637726014008795,138000\"\n        in sum_gather_results[39]\n    )\n    assert (\n        \"test2,genus,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[40]\n    )\n    assert (\n        \"test2,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test2.sig,0.05701254275940707,444000\"\n        in sum_gather_results[41]\n    )\n    assert (\n        \"test2,species,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[42]\n    )\n    assert (\n        \"test2,species,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test2.sig,0.015637726014008795,138000\"\n        in sum_gather_results[43]\n    )\n\n\ndef test_metagenome_two_queries_csv_summary_output_v5(runtmp, cli_v5_only):\n    # remove single-query outputs when working with multiple queries\n    # with v5, => abund.\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    csv_summary_out = runtmp.output(\"tst.summarized.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-F\",\n        \"csv_summary\",\n        \"--rank\",\n        \"phylum\",\n        \"-o\",\n        \"tst\",\n        version=cli_v5_only,\n    )\n\n    assert os.path.exists(csv_summary_out)\n\n    assert c.last_result.status == 0\n    assert \"loaded results for 2 queries from 2 gather CSVs\" in c.last_result.err\n    assert (\n        f\"saving 'csv_summary' output to '{os.path.basename(csv_summary_out)}'\"\n        in runtmp.last_result.err\n    )\n    sum_gather_results = [\n        x.rstrip() for x in Path(csv_summary_out).read_text().splitlines()\n    ]\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    # check both queries exist in csv_summary results; check several\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test2,superkingdom,0.2042281611487834,d__Bacteria,md5,test2.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[23]\n    )\n    assert (\n        \"test2,phylum,0.11607499002792182,d__Bacteria;p__Bacteroidota,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[25]\n    )\n    assert (\n        \"test2,phylum,0.08815317112086159,d__Bacteria;p__Proteobacteria,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[26]\n    )\n    assert (\n        \"test2,phylum,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[27]\n    )\n    assert (\n        \"test2,class,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[28]\n    )\n    assert (\n        \"test2,class,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[29]\n    )\n    assert (\n        \"test2,class,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[30]\n    )\n    assert (\n        \"test2,order,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[31]\n    )\n    assert (\n        \"test2,order,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[32]\n    )\n    assert (\n        \"test2,order,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[33]\n    )\n    assert (\n        \"test2,family,0.11607499002792182,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test2.sig,0.07265026877341586,582000\"\n        in sum_gather_results[34]\n    )\n    assert (\n        \"test2,family,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae,md5,test2.sig,0.05815279361459521,442000\"\n        in sum_gather_results[35]\n    )\n    assert (\n        \"test2,family,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[36]\n    )\n    assert (\n        \"test2,genus,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia,md5,test2.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[37]\n    )\n    assert (\n        \"test2,genus,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella,md5,test2.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[38]\n    )\n    assert (\n        \"test2,genus,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola,md5,test2.sig,0.015637726014008795,138000\"\n        in sum_gather_results[39]\n    )\n    assert (\n        \"test2,genus,0.7957718388512166,unclassified,md5,test2.sig,0.8691969376119889,3990000\"\n        in sum_gather_results[40]\n    )\n    assert (\n        \"test2,species,0.08815317112086159,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli,md5,test2.sig,0.05815279361459521,442000,0.9246458342627294,0\"\n        in sum_gather_results[41]\n    )\n    assert (\n        \"test2,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test2.sig,0.05701254275940707,444000,0.9247805047263588,0\"\n        in sum_gather_results[42]\n    )\n    assert (\n        \"test2,species,0.027522935779816515,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus,md5,test2.sig,0.015637726014008795,138000\"\n        in sum_gather_results[43]\n    )\n\n\ndef test_metagenome_two_queries_with_single_query_output_formats_fail(runtmp):\n    # fail on multiple queries with single query output formats\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    runtmp.output(\"tst.summarized.csv\")\n    bioboxes_out = runtmp.output(\"tst.bioboxes.out\")\n    kreport_out = runtmp.output(\"tst.kreport.txt\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"--gather-csv\",\n            g_res,\n            g_res2,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"-F\",\n            \"bioboxes\",\n            \"kreport\",\n            \"--rank\",\n            \"phylum\",\n            \"-o\",\n            \"tst\",\n        )\n    print(str(exc.value))\n\n    assert not os.path.exists(bioboxes_out)\n    assert not os.path.exists(kreport_out)\n\n    assert c.last_result.status == -1\n    assert \"loaded results for 2 queries from 2 gather CSVs\" in c.last_result.err\n    assert (\n        \"WARNING: found results for multiple gather queries. Can only output multi-query result formats: skipping bioboxes, kreport\"\n        in c.last_result.err\n    )\n    assert \"ERROR: No output formats remaining.\" in c.last_result.err\n\n\ndef test_metagenome_two_queries_skip_single_query_output_formats(runtmp):\n    # remove single-query outputs when working with multiple queries\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    csv_summary_out = runtmp.output(\"tst.summarized.csv\")\n    kreport_out = runtmp.output(\"tst.kreport.txt\")\n    bioboxes_out = runtmp.output(\"tst.bioboxes.txt\")\n    lineage_summary_out = runtmp.output(\"tst.lineage_summary.tsv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-F\",\n        \"csv_summary\",\n        \"bioboxes\",\n        \"kreport\",\n        \"lineage_summary\",\n        \"--rank\",\n        \"phylum\",\n        \"-o\",\n        \"tst\",\n    )\n\n    assert not os.path.exists(kreport_out)\n    assert not os.path.exists(bioboxes_out)\n    assert os.path.exists(csv_summary_out)\n    assert os.path.exists(lineage_summary_out)\n\n    assert c.last_result.status == 0\n    assert \"loaded results for 2 queries from 2 gather CSVs\" in c.last_result.err\n    assert (\n        \"WARNING: found results for multiple gather queries. Can only output multi-query result formats: skipping bioboxes, kreport\"\n        in c.last_result.err\n    )\n\n    assert (\n        f\"saving 'csv_summary' output to '{os.path.basename(csv_summary_out)}'\"\n        in runtmp.last_result.err\n    )\n    sum_gather_results = [\n        x.rstrip() for x in Path(csv_summary_out).read_text().splitlines()\n    ]\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in sum_gather_results[0]\n    )\n    # check both queries exist in csv_summary results\n    assert (\n        \"test1,superkingdom,0.2042281611487834,d__Bacteria,md5,test1.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test2,superkingdom,0.2042281611487834,d__Bacteria,md5,test2.sig,0.13080306238801107,1024000,0.9500482567175479,0\"\n        in sum_gather_results[23]\n    )\n\n\ndef test_metagenome_two_queries_krona(runtmp):\n    # for now, we enable multi-query krona. Is this desired?\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make a second query with same output\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        for line in Path(g_res).read_text().splitlines():\n            line = line.replace(\"test1\", \"test2\") + \"\\n\"\n            fp.write(line)\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"-F\",\n        \"krona\",\n        \"--rank\",\n        \"superkingdom\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"WARNING: results from more than one query found. Krona summarization not recommended.\"\n        in c.last_result.err\n    )\n    assert (\n        \"Percentage assignment will be normalized by the number of queries to maintain range 0-100%\"\n        in c.last_result.err\n    )\n    assert \"fraction\tsuperkingdom\" in c.last_result.out\n    assert \"0.2042281611487834\td__Bacteria\" in c.last_result.out\n    assert \"0.7957718388512166\tunclassified\" in c.last_result.out\n\n\ndef test_metagenome_gather_duplicate_filename(runtmp, cli_v4_and_v5):\n    # test that a duplicate filename is properly flagged, when passed in\n    # twice to a single -g argument.\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        g_res,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\"\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_gather_duplicate_filename_2(runtmp, cli_v4_and_v5):\n    # test that a duplicate filename is properly flagged, with -g a -g b\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--gather-csv\",\n        g_res,\n        \"-g\",\n        g_res,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\"\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_gather_duplicate_filename_from_file(runtmp, cli_v4_and_v5):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n        f_csv.write(f\"{g_res}\\n\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\"\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,superkingdom,0.204,d__Bacteria,md5,test1.sig,0.131,1024000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_empty_gather_results(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # creates empty gather result\n    g_csv = runtmp.output(\"g.csv\")\n    with open(g_csv, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", g_csv)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax)\n\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.err)\n    print(runtmp.last_result.out)\n    assert f\"Cannot read gather results from '{g_csv}'. Is file empty?\" in str(\n        exc.value\n    )\n\n\ndef test_genome_bad_gather_header(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    # creates bad gather result\n    bad_g = [\n        x.replace(\"f_unique_to_query\", \"nope\") + \"\\n\"\n        for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(bad_g_csv, \"w\") as fp:\n        fp.writelines(bad_g)\n    print(\"bad_gather_results: \\n\", bad_g)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"genome\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax)\n\n    assert \"is missing columns needed for taxonomic summarization.\" in str(exc.value)\n    assert runtmp.last_result.status == -1\n\n\ndef test_genome_empty_tax_lineage_input(runtmp):\n    # test an empty tax csv\n    tax_empty = runtmp.output(\"t.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax_empty)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status != 0\n    assert \"cannot read taxonomy assignments from\" in str(exc.value)\n\n\ndef test_genome_rank_stdout_0(runtmp):\n    # test basic genome\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_rank_stdout_0_db(runtmp):\n    # test basic genome with sqlite database\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.db\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n    # too stringent of containment threshold:\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"1.0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"test1,below_threshold,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000,\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_rank_csv_0(runtmp):\n    # test basic genome - output csv\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    cl_csv = csv_base + \".classifications.csv\"\n    csvout = runtmp.output(cl_csv)\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"-o\",\n        csv_base,\n        \"--containment-threshold\",\n        \"0\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert f\"saving 'classification' output to '{csvout}'\" in runtmp.last_result.err\n    assert c.last_result.status == 0\n    cl_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in cl_results[0]\n    )\n    assert (\n        \"test1,match,species,0.0885520542481053,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.05701254275940707,444000\"\n        in cl_results[1]\n    )\n\n\ndef test_genome_rank_krona(runtmp):\n    # test basic genome - output csv\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    cl_csv = csv_base + \".krona.tsv\"\n    csvout = runtmp.output(cl_csv)\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"-o\",\n        csv_base,\n        \"--containment-threshold\",\n        \"0\",\n        \"--output-format\",\n        \"krona\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert f\"saving 'krona' output to '{csvout}'\" in runtmp.last_result.err\n    assert c.last_result.status == 0\n    kr_results = [x.rstrip().split(\"\\t\") for x in Path(csvout).read_text().splitlines()]\n    print(kr_results)\n    assert [\n        \"fraction\",\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n    ] == kr_results[0]\n    assert [\n        \"0.0885520542481053\",\n        \"d__Bacteria\",\n        \"p__Bacteroidota\",\n        \"c__Bacteroidia\",\n        \"o__Bacteroidales\",\n        \"f__Bacteroidaceae\",\n        \"g__Prevotella\",\n        \"s__Prevotella copri\",\n    ] == kr_results[1]\n\n\ndef test_genome_rank_human_output(runtmp):\n    # test basic genome - output csv\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    csvout = runtmp.output(csv_base + \".human.txt\")\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"-o\",\n        csv_base,\n        \"--containment-threshold\",\n        \"0\",\n        \"--output-format\",\n        \"human\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert f\"saving 'human' output to '{csvout}'\" in runtmp.last_result.err\n    assert c.last_result.status == 0\n\n    with open(csvout) as fp:\n        outp = fp.readlines()\n        print(outp)\n\n    assert len(outp) == 3\n    outp = [x.strip() for x in outp]\n\n    assert outp[0] == \"sample name    status    proportion   cANI   lineage\"\n    assert outp[1] == \"-----------    ------    ----------   ----   -------\"\n    assert (\n        outp[2]\n        == \"test1             match     5.7%     92.5%  d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n    )\n\n\ndef test_genome_rank_lineage_csv_output(runtmp):\n    # test basic genome - output csv\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csv_base = \"out\"\n    csvout = runtmp.output(csv_base + \".lineage.csv\")\n    outdir = os.path.dirname(csvout)\n    print(\"csvout: \", csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--rank\",\n        \"species\",\n        \"-o\",\n        csv_base,\n        \"--containment-threshold\",\n        \"0\",\n        \"--output-format\",\n        \"lineage_csv\",\n        \"--output-dir\",\n        outdir,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert f\"saving 'lineage_csv' output to '{csvout}'\" in runtmp.last_result.err\n    assert c.last_result.status == 0\n    with open(csvout) as fp:\n        outp = fp.readlines()\n\n    assert len(outp) == 2\n    outp = [x.strip() for x in outp]\n\n    assert outp[0] == \"ident,superkingdom,phylum,class,order,family,genus,species\"\n    assert (\n        outp[1]\n        == \"test1,d__Bacteria,p__Bacteroidota,c__Bacteroidia,o__Bacteroidales,f__Bacteroidaceae,g__Prevotella,s__Prevotella copri\"\n    )\n\n\ndef test_genome_gather_from_file_rank(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_two_files(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make test2 results (identical to test1 except query_name and filename)\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    test2_results = [\n        x.replace(\"test1\", \"test2\") + \"\\n\" for x in Path(g_res).read_text().splitlines()\n    ]\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(test2_results)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test2,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test2.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_two_files_empty_force(runtmp):\n    # make test2 results (identical to test1 except query_name and filename)\n    # add an empty file too, with --force -> should work\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    g_empty_csv = runtmp.output(\"g_empty.csv\")\n    with open(g_empty_csv, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", g_empty_csv)\n\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    test2_results = [\n        x.replace(\"test1\", \"test2\") + \"\\n\" for x in Path(g_res).read_text().splitlines()\n    ]\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(test2_results)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        g_res2,\n        \"-g\",\n        g_empty_csv,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n        \"--force\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test2,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test2.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_two_files_one_classif_fail(runtmp):\n    # if one query cant be classified still get classif for second\n    # no --force = fail but still write file\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make test2 results (identical to test1 except query_name and filename)\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    test2_results = [\n        x.replace(\"test1\", \"test2\") + \"\\n\" for x in Path(g_res).read_text().splitlines()\n    ]\n    test2_results[1] = test2_results[1].replace(\n        \"0.08815317112086159\", \"1.1\"\n    )  # make test2 f_unique_to_query sum to >1\n    for line in test2_results:\n        print(line)\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(test2_results)\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_res,\n            g_res2,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"--rank\",\n            \"species\",\n            \"--containment-threshold\",\n            \"0\",\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert \"test2\" not in c.last_result.out\n    assert (\n        \"ERROR: Summarized fraction is > 100% of the query! This should not be possible. Please check that your input files come directly from a single gather run per query.\"\n        in c.last_result.err\n    )\n\n\ndef test_genome_gather_two_files_one_classif(runtmp):\n    # if one query cant be classified, still get classif for second\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # make test2 results (identical to test1 except query_name and filename)\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    test2_results = [\n        x.replace(\"test1\", \"test2\") + \"\\n\" for x in Path(g_res).read_text().splitlines()\n    ]\n    test2_results[1] = test2_results[1].replace(\n        \"0.08815317112086159\", \"1.1\"\n    )  # make test2 f_unique_to_query sum to >1\n    for line in test2_results:\n        print(line)\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(test2_results)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n        \"--force\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert \"test2\" not in c.last_result.out\n    assert (\n        \"ERROR: Summarized fraction is > 100% of the query! This should not be possible. Please check that your input files come directly from a single gather run per query.\"\n        in c.last_result.err\n    )\n\n\ndef test_genome_gather_duplicate_filename(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--gather-csv\",\n        g_res,\n        \"-g\",\n        g_res,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\"\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_from_file_duplicate_filename(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n        f_csv.write(f\"{g_res}\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\"\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_from_file_duplicate_query(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # different filename, contents identical to test1\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        fp.write(Path(g_res).read_text())\n\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n        f_csv.write(f\"{g_res2}\\n\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"--from-file\",\n            g_from_file,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"--rank\",\n            \"species\",\n            \"--containment-threshold\",\n            \"0\",\n        )\n    assert c.last_result.status == -1\n    print(str(exc.value))\n    assert (\n        \"Gather query test1 was found in more than one CSV. Cannot load from \"\n        in str(exc.value)\n    )\n\n\ndef test_genome_gather_from_file_duplicate_query_force(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # different filename, contents identical to test1\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    with open(g_res2, \"w\") as fp:\n        fp.write(Path(g_res).read_text())\n\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n        f_csv.write(f\"{g_res2}\\n\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"--from-file\",\n            g_from_file,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"--rank\",\n            \"species\",\n            \"--containment-threshold\",\n            \"0\",\n            \"--force\",\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n\n    assert \"Gather query test1 was found in more than one CSV.\" in c.last_result.err\n    assert \"Cannot force past duplicated gather query. Exiting.\" in c.last_result.err\n\n\ndef test_genome_gather_cli_and_from_file(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n\n    # make test2 results (identical to test1 except query_name)\n    g_res2 = runtmp.output(\"test2.gather.csv\")\n    test2_results = [\n        x.replace(\"test1\", \"test2\") + \"\\n\" for x in Path(g_res).read_text().splitlines()\n    ]\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(test2_results)\n\n    # write test2 csv to a text file for input\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res2}\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n    assert (\n        \"test2,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test2.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_cli_and_from_file_duplicate_filename(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n\n    # also write test1 csv to a text file for input\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert f\"ignoring duplicated reference to file: {g_res}\" in c.last_result.err\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_from_file_below_threshold(runtmp):\n    # What do we want the results from this to be? I think I initially thought we shouldn't report anything,\n    # but wouldn't a \"below_threshold\" + superkingdom result (here, 0.204) be helpful information?\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--containment-threshold\",\n        \"1\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"query_name,status,rank,fraction,lineage\" in c.last_result.out\n    assert \"test1,below_threshold,superkingdom,0.204,\" in c.last_result.out\n\n\ndef test_genome_gather_two_queries(runtmp):\n    \"\"\"\n    This checks for initial bug where classification\n    would only happen for one genome per rank when\n    doing --containment-threshold classification\n    \"\"\"\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n\n    # split 47+63 into two fake queries: q47, q63\n    g_res2 = runtmp.output(\"two-queries.gather.csv\")\n    q2_results = [x + \"\\n\" for x in Path(g_res).read_text().splitlines()]\n    # rename queries\n    q2_results[1] = q2_results[1].replace(\"47+63\", \"q47\")\n    q2_results[2] = q2_results[2].replace(\"47+63\", \"q63\")\n    with open(g_res2, \"w\") as fp:\n        for line in q2_results:\n            print(line)\n            fp.write(line)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--containment-threshold\",\n        \"0\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"query_name,status,rank,fraction,lineage\" in c.last_result.out\n    assert (\n        \"q63,match,species,0.336,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Shewanellaceae;g__Shewanella;s__Shewanella baltica,491c0a81,\"\n        in c.last_result.out\n    )\n    assert (\n        \"q47,match,species,0.664,d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Shewanellaceae;g__Shewanella;s__Shewanella baltica,\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_ictv(runtmp, cli_v4_and_v5):\n    \"\"\"\n    test genome classification with ictv taxonomy\n    \"\"\"\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--containment-threshold\",\n        \"0\",\n        \"--ictv\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"query_name,status,rank,fraction,lineage\" in c.last_result.out\n    assert (\n        \"47+63,match,name,0.664,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus sudanense;Sudan virus,491c0a81,,0.664,5238000,0.987\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_ictv_twoqueries(runtmp):\n    \"\"\"\n    test genome classification with ictv taxonomy\n    \"\"\"\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n    g_res = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n\n    # split 47+63 into two fake queries: q47, q63\n    g_res2 = runtmp.output(\"two-queries.gather.csv\")\n    q2_results = [x + \"\\n\" for x in Path(g_res).read_text().splitlines()]\n    # rename queries\n    q2_results[1] = q2_results[1].replace(\"47+63\", \"q47\")\n    q2_results[2] = q2_results[2].replace(\"47+63\", \"q63\")\n    with open(g_res2, \"w\") as fp:\n        for line in q2_results:\n            print(line)\n            fp.write(line)\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_res2,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--containment-threshold\",\n        \"0\",\n        \"--ictv\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    print(c.last_result.out)\n    assert \"query_name,status,rank,fraction,lineage\" in c.last_result.out\n    assert (\n        \"q47,match,name,0.664,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus sudanense;Sudan virus,491c0a81,,0.664,5238000,0.987\"\n        in c.last_result.out\n    )\n    assert (\n        \"q63,match,name,0.336,Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus zairense;Ebola virus,491c0a81,,0.336,2648000,0.965\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_gather_ictv_fail(runtmp):\n    \"\"\"\n    test genome classification with ictv taxonomy\n    \"\"\"\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n    tax2_csv = runtmp.output(\"ictv-taxfail\")\n    # copy taxonomy csv to new file, but remove one of the columns\n    with open(taxonomy_csv) as inF:\n        with open(tax2_csv, \"w\") as outF:\n            for line in inF.readlines():\n                line = line.rsplit(\",\", 1)[0]\n                outF.write(f\"{line}\\n\")\n\n    g_res = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_res,\n            \"--taxonomy-csv\",\n            tax2_csv,\n            \"--containment-threshold\",\n            \"0\",\n            \"--ictv\",\n        )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    print(c.last_result.out)\n    assert \"Not all taxonomy ranks present\" in str(exc.value)\n\n\ndef test_genome_rank_duplicated_taxonomy_fail(runtmp):\n    c = runtmp\n    # write temp taxonomy with duplicates\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1] + \"FOO\")  # add first tax_assign again\n        dup.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            duplicated_csv,\n            \"--rank\",\n            \"species\",\n        )\n    assert \"cannot read taxonomy assignments\" in str(exc.value)\n    assert \"multiple lineages for identifier GCF_001881345\" in str(exc.value)\n\n\ndef test_genome_rank_duplicated_taxonomy_fail_lineages(runtmp):\n    # write temp taxonomy with duplicates => lineages-style file\n    c = runtmp\n\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxdb = tax_utils.LineageDB.load(taxonomy_csv)\n\n    for k, v in taxdb.items():\n        print(k, v)\n\n    lineage_csv = runtmp.output(\"lin.csv\")\n    with open(lineage_csv, \"w\", newline=\"\") as fp:\n        w = csv.writer(fp)\n        w.writerow([\"name\", \"lineage\"])\n        for k, v in taxdb.items():\n            linstr = lca_utils.display_lineage(v)\n            w.writerow([k, linstr])\n\n            # duplicate each row, changing something (truncate species, here)\n            v = v[:-1]\n            linstr = lca_utils.display_lineage(v)\n            w.writerow([k, linstr])\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"tax\", \"summarize\", lineage_csv)\n        print(c.last_result.out)\n        print(c.last_result.err)\n\n    assert \"cannot read taxonomy assignments\" in str(exc.value)\n    assert \"multiple lineages for identifier GCF_001881345\" in str(exc.value)\n\n\ndef test_genome_rank_duplicated_taxonomy_force(runtmp):\n    # write temp taxonomy with duplicates\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1])  # add first tax_assign again\n        dup.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        duplicated_csv,\n        \"--rank\",\n        \"species\",\n        \"--force\",\n        \"--containment-threshold\",\n        \"0\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_missing_taxonomy_ignore_threshold(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        subset_csv,\n        \"--containment-threshold\",\n        \"0\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_missing_taxonomy_recover_with_second_tax_file(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        subset_csv,\n        \"-t\",\n        taxonomy_csv,\n        \"--containment-threshold\",\n        \"0\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        not in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_missing_taxonomy_ignore_rank(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", subset_csv, \"--rank\", \"species\"\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,below_threshold,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_multiple_taxonomy_files(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # using mult -t args\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", subset_csv, \"-t\", taxonomy_csv\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        not in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000,\"\n        in c.last_result.out\n    )\n    # using single -t arg\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", subset_csv, taxonomy_csv\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        not in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000,\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_multiple_taxonomy_files_empty_force(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry, as well as an empty file,\n    # and use force\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    empty_tax = runtmp.output(\"tax_empty.txt\")\n    with open(empty_tax, \"w\") as fp:\n        fp.write(\"\")\n\n    # using mult -t args\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        subset_csv,\n        \"-t\",\n        taxonomy_csv,\n        \"-t\",\n        empty_tax,\n        \"--force\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"The following are missing from the taxonomy information: GCF_001881345\"\n        not in c.last_result.err\n    )\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000,\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_missing_taxonomy_fail_threshold(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            subset_csv,\n            \"--fail-on-missing-taxonomy\",\n            \"--containment-threshold\",\n            \"0\",\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert \"ident 'GCF_001881345' is not in the taxonomy database.\" in str(exc.value)\n    assert \"Failing, as requested via --fail-on-missing-taxonomy\" in str(exc.value)\n    assert c.last_result.status == -1\n\n\ndef test_genome_missing_taxonomy_fail_rank(runtmp):\n    c = runtmp\n    # write temp taxonomy with missing entry\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    subset_csv = runtmp.output(\"subset_taxonomy.csv\")\n    with open(subset_csv, \"w\") as subset:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax = [tax[0]] + tax[2:]  # remove the best match (1st tax entry)\n        subset.write(\"\\n\".join(tax))\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            subset_csv,\n            \"--fail-on-missing-taxonomy\",\n            \"--rank\",\n            \"species\",\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert \"ident 'GCF_001881345' is not in the taxonomy database.\" in str(exc.value)\n    assert \"Failing, as requested via --fail-on-missing-taxonomy\" in str(exc.value)\n    assert c.last_result.status == -1\n\n\ndef test_genome_rank_not_available(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--rank\",\n            \"strain\",\n            \"--containment-threshold\",\n            \"0\",\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert (\n        \"No taxonomic information provided for rank strain: cannot classify at this rank\"\n        in str(exc.value)\n    )\n\n\ndef test_genome_empty_gather_results_with_header_single(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    gather_results = [x for x in Path(g_csv).read_text().splitlines()]\n    empty_gather_with_header = runtmp.output(\"g_header.csv\")\n    # write temp empty gather results (header only)\n    with open(empty_gather_with_header, \"w\") as fp:\n        fp.write(gather_results[0])\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            empty_gather_with_header,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert f\"No gather results loaded from {empty_gather_with_header}.\" in str(\n        exc.value\n    )\n    assert \"Exiting.\" in str(exc.value)\n\n\ndef test_genome_empty_gather_results_single(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # write temp empty gather results\n    empty_tax = runtmp.output(\"tax_header.csv\")\n    with open(empty_tax, \"w\") as fp:\n        fp.write(\"\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"tax\", \"genome\", \"-g\", empty_tax, \"--taxonomy-csv\", taxonomy_csv)\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert f\"Cannot read gather results from '{empty_tax}'. Is file empty?\" in str(\n        exc.value\n    )\n    assert \"Exiting.\" in c.last_result.err\n\n\ndef test_genome_empty_gather_results_single_force(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # write temp empty gather results (header only)\n    empty_tax = runtmp.output(\"tax_header.csv\")\n    with open(empty_tax, \"w\") as fp:\n        fp.write(\"\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\", \"genome\", \"-g\", empty_tax, \"--taxonomy-csv\", taxonomy_csv, \"--force\"\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert (\n        \"--force is set. Attempting to continue to next set of gather results.\"\n        in str(exc.value)\n    )\n    assert \"No results for classification. Exiting.\" in str(exc.value)\n\n\ndef test_genome_empty_gather_results_with_empty_csv_force(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # write temp empty gather results\n    empty_tax = runtmp.output(\"tax_empty.txt\")\n    with open(empty_tax, \"w\") as fp:\n        fp.write(\"\")\n\n    g_from_file = runtmp.output(\"tmp-from-csv.csv\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{empty_tax}\\n\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            empty_tax,\n            \"--from-file\",\n            g_from_file,\n            \"--taxonomy-csv\",\n            taxonomy_csv,\n            \"--rank\",\n            \"species\",\n            \"--force\",\n        )\n\n    print(str(exc.value))\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == -1\n    assert (\n        \"--force is set. Attempting to continue to next set of gather results.\"\n        in str(exc.value)\n    )\n    assert \"No results for classification. Exiting.\" in str(exc.value)\n\n\ndef test_genome_empty_gather_results_with_csv_force(runtmp):\n    c = runtmp\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    g_res = utils.get_test_data(\"tax/test1.gather.csv\")\n    g_from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(g_from_file, \"w\") as f_csv:\n        f_csv.write(f\"{g_res}\\n\")\n\n    # write temp empty gather results\n    empty_tax = runtmp.output(\"tax_empty.csv\")\n    with open(empty_tax, \"w\") as fp:\n        fp.write(\"\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        empty_tax,\n        \"--from-file\",\n        g_from_file,\n        \"--taxonomy-csv\",\n        taxonomy_csv,\n        \"--rank\",\n        \"species\",\n        \"--containment-threshold\",\n        \"0\",\n        \"--force\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"--force is set. Attempting to continue to next set of gather results.\"\n        in c.last_result.err\n    )\n    assert \"loaded results for 1 queries from 1 gather CSVs\" in c.last_result.err\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_containment_threshold_bounds(runtmp):\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    below_threshold = \"-1\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            tax,\n            \"--taxonomy-csv\",\n            tax,\n            \"--containment-threshold\",\n            below_threshold,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Argument must be >0 and <1\" in str(exc.value)\n\n    above_threshold = \"1.1\"\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--containment-threshold\",\n            above_threshold,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Argument must be >0 and <1\" in str(exc.value)\n\n\ndef test_genome_containment_threshold_type(runtmp):\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    not_a_float = \"str\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--containment-threshold\",\n            not_a_float,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Must be a floating point number\" in str(exc.value)\n\n\ndef test_genome_over100percent_error(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    perfect_g_csv = runtmp.output(\"g.csv\")\n\n    # create an impossible gather result\n    with open(g_csv) as fp:\n        r = csv.DictReader(fp, delimiter=\",\")\n        header = r.fieldnames\n        print(header)\n        with open(perfect_g_csv, \"w\") as out_fp:\n            w = csv.DictWriter(out_fp, header)\n            w.writeheader()\n            for n, row in enumerate(r):\n                if n == 0:\n                    row[\"f_unique_to_query\"] = 1.1\n                w.writerow(row)\n                print(row)\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"tax\", \"genome\", \"-g\", perfect_g_csv, \"--taxonomy-csv\", tax)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == -1\n    assert (\n        \"fraction is > 100% of the query! This should not be possible.\"\n        in runtmp.last_result.err\n    )\n\n\ndef test_genome_ani_threshold_input_errors(runtmp):\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather_old.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    below_threshold = \"-1\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            tax,\n            \"--taxonomy-csv\",\n            tax,\n            \"--ani-threshold\",\n            below_threshold,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Argument must be >0 and <1\" in str(exc.value)\n\n    above_threshold = \"1.1\"\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--ani-threshold\",\n            above_threshold,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Argument must be >0 and <1\" in str(exc.value)\n\n    not_a_float = \"str\"\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--ani-threshold\",\n            not_a_float,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert \"ERROR: Must be a floating point number\" in str(exc.value)\n\n\ndef test_genome_ani_threshold(runtmp):\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--ani-threshold\", \"0.93\"\n    )  # note: I think this was previously a bug, if 0.95 produced the result below...\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,family,0.116,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae,md5,test1.sig,0.073,582000,0.93\"\n        in c.last_result.out\n    )\n\n    # more lax threshold\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--ani-threshold\", \"0.9\"\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"test1,match,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000\"\n        in c.last_result.out\n    )\n\n    # too stringent of threshold (using rank)\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--ani-threshold\",\n        \"1.0\",\n        \"--rank\",\n        \"species\",\n    )\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    assert (\n        \"test1,below_threshold,species,0.089,d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri,md5,test1.sig,0.057,444000,0.92\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_ani_oldgather(runtmp):\n    # now fail if using gather <4.4\n    c = runtmp\n    g_csv = utils.get_test_data(\"tax/test1.gather_old.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        c.run_sourmash(\"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax)\n    assert (\n        \"is missing columns needed for taxonomic summarization. Please run gather with sourmash >= 4.4.\"\n        in str(exc.value)\n    )\n    assert c.last_result.status == -1\n\n\ndef test_genome_ani_lemonade_classify(runtmp):\n    # test a complete MAG classification with lemonade MAG from STAMPS 2022\n    # (real data!)\n    c = runtmp\n\n    ## first run gather\n    genome = utils.get_test_data(\"tax/lemonade-MAG3.sig.gz\")\n    matches = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.zip\")\n\n    c.run_sourmash(\"gather\", genome, matches, \"--threshold-bp=5000\", \"-o\", \"gather.csv\")\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    this_gather_file = c.output(\"gather.csv\")\n    this_gather = Path(this_gather_file).read_text().splitlines()\n\n    assert len(this_gather) == 4\n\n    ## now run 'tax genome' with human output\n    taxonomy_file = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        this_gather_file,\n        \"-t\",\n        taxonomy_file,\n        \"--ani\",\n        \"0.8\",\n        \"-F\",\n        \"human\",\n    )\n\n    output = c.last_result.out\n    assert (\n        \"MAG3_1            match     5.3%     91.0%  d__Bacteria;p__Bacteroidota;c__Chlorobia;o__Chlorobiales;f__Chlorobiaceae;g__Prosthecochloris;s__Prosthecochloris vibrioformis\"\n        in output\n    )\n\n    # aaand classify to lineage_csv\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        this_gather_file,\n        \"-t\",\n        taxonomy_file,\n        \"--ani\",\n        \"0.8\",\n        \"-F\",\n        \"lineage_csv\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    output = c.last_result.out\n    assert \"ident,superkingdom,phylum,class,order,family,genus,species\" in output\n    assert (\n        \"MAG3_1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,g__Prosthecochloris,s__Prosthecochloris vibrioformis\"\n        in output\n    )\n\n\ndef test_genome_ani_lemonade_classify_estimate_ani_ci(runtmp):\n    # test a complete MAG classification with lemonade MAG from STAMPS 2022\n    # (real data!)\n    c = runtmp\n\n    ## first run gather\n    genome = utils.get_test_data(\"tax/lemonade-MAG3.sig.gz\")\n    matches = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.zip\")\n\n    c.run_sourmash(\n        \"gather\",\n        genome,\n        matches,\n        \"--threshold-bp=5000\",\n        \"-o\",\n        \"gather.csv\",\n        \"--estimate-ani\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    this_gather_file = c.output(\"gather.csv\")\n    this_gather = Path(this_gather_file).read_text().splitlines()\n\n    assert len(this_gather) == 4\n\n    ## now run 'tax genome' with human output\n    taxonomy_file = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        this_gather_file,\n        \"-t\",\n        taxonomy_file,\n        \"--ani\",\n        \"0.8\",\n        \"-F\",\n        \"human\",\n    )\n\n    output = c.last_result.out\n    assert (\n        \"MAG3_1            match     5.3%     91.0%  d__Bacteria;p__Bacteroidota;c__Chlorobia;o__Chlorobiales;f__Chlorobiaceae;g__Prosthecochloris;s__Prosthecochloris vibrioformis\"\n        in output\n    )\n\n    # aaand classify to lineage_csv\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        this_gather_file,\n        \"-t\",\n        taxonomy_file,\n        \"--ani\",\n        \"0.8\",\n        \"-F\",\n        \"lineage_csv\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n    output = c.last_result.out\n    assert \"ident,superkingdom,phylum,class,order,family,genus,species\" in output\n    assert (\n        \"MAG3_1,d__Bacteria,p__Bacteroidota,c__Chlorobia,o__Chlorobiales,f__Chlorobiaceae,g__Prosthecochloris,s__Prosthecochloris vibrioformis\"\n        in output\n    )\n\n\ndef test_metagenome_no_gather_csv(runtmp):\n    # test tax metagenome with no -g\n    taxonomy_file = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"tax\", \"metagenome\", \"-t\", taxonomy_file)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_genome_no_gather_csv(runtmp):\n    # test tax genome with no -g\n    taxonomy_file = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"tax\", \"genome\", \"-t\", taxonomy_file)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_annotate_no_gather_csv(runtmp):\n    # test tax annotate with no -g\n    taxonomy_file = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-t\", taxonomy_file)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_genome_LIN(runtmp):\n    # test basic genome with LIN taxonomy\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--ani-threshold\",\n        \"0.93\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,below_threshold,0,0.089,1,md5,test1.sig,0.057,444000,0.925\"\n        in c.last_result.out\n    )\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--ani-threshold\",\n        \"0.924\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,19,0.088,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.058,442000,0.925\"\n        in c.last_result.out\n    )\n\n    c.run_sourmash(\n        \"tax\", \"genome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--lins\", \"--rank\", \"4\"\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,below_threshold,4,0.088,0;0;0;0;0,md5,test1.sig,0.058,442000,0.925\"\n        in c.last_result.out\n    )\n\n\ndef test_genome_LIN_lingroups(runtmp):\n    # test basic genome with LIN taxonomy\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n        out.write(\"0;0;0,lg1\\n\")\n        out.write(\"1;0;0,lg2\\n\")\n        out.write(\"2;0;0,lg3\\n\")\n        out.write(\"1;0;1,lg3\\n\")\n        # write a 19 so we can check the end\n        out.write(\"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,lg4\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--lingroup\",\n        lg_file,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,below_threshold,2,0.088,0;0;0,md5,test1.sig,0.058,442000,0.925\"\n        in c.last_result.out\n    )\n\n    c.run_sourmash(\n        \"tax\",\n        \"genome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--lingroup\",\n        lg_file,\n        \"--ani-threshold\",\n        \"0.924\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,status,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,match,19,0.088,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.058,442000,0.925\"\n        in c.last_result.out\n    )\n\n\ndef test_annotate_0(runtmp):\n    # test annotate basics\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    c.run_sourmash(\n        \"tax\", \"annotate\", \"--gather-csv\", g_csv, \"--taxonomy-csv\", tax, \"-o\", out_dir\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    lin_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(lin_gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in lin_gather_results[0]\n    assert (\n        \"d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in lin_gather_results[1]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[2]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\"\n        in lin_gather_results[3]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[4]\n    )\n\n\ndef test_annotate_gzipped_gather(runtmp):\n    # test annotate basics\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    # rewrite gather_csv as gzipped csv\n    gz_gather = runtmp.output(\"test1.gather.csv.gz\")\n    with open(g_csv, \"rb\") as f_in, gzip.open(gz_gather, \"wb\") as f_out:\n        f_out.writelines(f_in)\n\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"--gather-csv\",\n        gz_gather,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        out_dir,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    lin_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(lin_gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in lin_gather_results[0]\n    assert (\n        \"d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in lin_gather_results[1]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[2]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\"\n        in lin_gather_results[3]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[4]\n    )\n\n\ndef test_annotate_0_ictv(runtmp):\n    # test annotate basics\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        out_dir,\n        \"--ictv\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in gather_results[0]\n    assert (\n        \"Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bundibugyoense;Bundibugyo virus\"\n        in gather_results[1]\n    )\n    assert (\n        \"Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus taiense;Taï Forest virus\"\n        in gather_results[2]\n    )\n    assert (\n        \"Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus bombaliense;Bombali virus\"\n        in gather_results[3]\n    )\n    assert (\n        \"Riboviria;;Orthornavirae;;Negarnaviricota;Haploviricotina;Monjiviricetes;;Mononegavirales;;Filoviridae;;Orthoebolavirus;;Orthoebolavirus restonense;Reston virus\"\n        in gather_results[4]\n    )\n\n\ndef test_annotate_0_LIN(runtmp):\n    # test annotate basics\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    c.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"--gather-csv\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        out_dir,\n        \"--lins\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    lin_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(lin_gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in lin_gather_results[0]\n    assert \"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\" in lin_gather_results[1]\n    assert \"1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\" in lin_gather_results[2]\n    assert \"2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\" in lin_gather_results[3]\n    assert \"1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\" in lin_gather_results[4]\n\n\ndef test_annotate_gather_argparse(runtmp):\n    # test annotate with two gather CSVs, second one empty, and --force.\n    # this tests argparse handling w/extend.\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    g_empty_csv = runtmp.output(\"g_empty.csv\")\n    with open(g_empty_csv, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", g_empty_csv)\n\n    c.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"--gather-csv\",\n        g_csv,\n        \"-g\",\n        g_empty_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-o\",\n        out_dir,\n        \"--force\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    lin_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(lin_gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in lin_gather_results[0]\n    assert (\n        \"d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in lin_gather_results[1]\n    )\n\n\ndef test_annotate_0_db(runtmp):\n    # test annotate with sqlite db\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.db\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    c.run_sourmash(\n        \"tax\", \"annotate\", \"--gather-csv\", g_csv, \"--taxonomy-csv\", tax, \"-o\", out_dir\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n\n    lin_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(\"\\n\".join(lin_gather_results))\n    assert f\"saving 'annotate' output to '{csvout}'\" in runtmp.last_result.err\n\n    assert \"lineage\" in lin_gather_results[0]\n    assert (\n        \"d__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacterales;f__Enterobacteriaceae;g__Escherichia;s__Escherichia coli\"\n        in lin_gather_results[1]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[2]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Phocaeicola;s__Phocaeicola vulgatus\"\n        in lin_gather_results[3]\n    )\n    assert (\n        \"d__Bacteria;p__Bacteroidota;c__Bacteroidia;o__Bacteroidales;f__Bacteroidaceae;g__Prevotella;s__Prevotella copri\"\n        in lin_gather_results[4]\n    )\n\n\ndef test_annotate_empty_gather_results(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    # creates empty gather result\n    g_csv = runtmp.output(\"g.csv\")\n    with open(g_csv, \"w\") as fp:\n        fp.write(\"\")\n    print(\"g_csv: \", g_csv)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", g_csv, \"--taxonomy-csv\", tax)\n\n    assert f\"Cannot read from '{g_csv}'. Is file empty?\" in str(exc.value)\n    assert runtmp.last_result.status == -1\n\n\ndef test_annotate_prefetch_or_other_header(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    alt_csv = runtmp.output(\"g.csv\")\n    for alt_col in [\"match_name\", \"ident\", \"accession\"]:\n        # modify 'name' to other acceptable id_columns result\n        alt_g = [\n            x.replace(\"name\", alt_col) + \"\\n\"\n            for x in Path(g_csv).read_text().splitlines()\n        ]\n        with open(alt_csv, \"w\") as fp:\n            fp.writelines(alt_g)\n\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", alt_csv, \"--taxonomy-csv\", tax)\n\n        assert runtmp.last_result.status == 0\n        print(runtmp.last_result.out)\n        print(runtmp.last_result.err)\n        assert (\n            f\"Starting annotation on '{alt_csv}'. Using ID column: '{alt_col}'\"\n            in runtmp.last_result.err\n        )\n        assert f\"Annotated 4 of 4 total rows from '{alt_csv}'\" in runtmp.last_result.err\n\n\ndef test_annotate_bad_header(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    # creates bad gather result\n    bad_g = [\n        x.replace(\"name\", \"nope\") + \"\\n\" for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(bad_g_csv, \"w\") as fp:\n        fp.writelines(bad_g)\n    # print(\"bad_gather_results: \\n\", bad_g)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax)\n\n    assert (\n        f\"ERROR: Cannot find taxonomic identifier column in '{bad_g_csv}'. Tried: name, match_name, ident, accession\"\n        in str(exc.value)\n    )\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_annotate_no_tax_matches(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    # mess up tax idents\n    bad_g = [\n        x.replace(\"GCF_\", \"GGG_\") + \"\\n\" for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(bad_g_csv, \"w\") as fp:\n        fp.writelines(bad_g)\n    # print(\"bad_gather_results: \\n\", bad_g)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax)\n\n    assert f\"ERROR: Could not annotate any rows from '{bad_g_csv}'\" in str(exc.value)\n    assert runtmp.last_result.status == -1\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    runtmp.run_sourmash(\n        \"tax\", \"annotate\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax, \"--force\"\n    )\n\n    assert runtmp.last_result.status == 0\n    assert f\"Could not annotate any rows from '{bad_g_csv}'\" in runtmp.last_result.err\n    assert (\n        \"--force is set. Attempting to continue to next file.\" in runtmp.last_result.err\n    )\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_annotate_missed_tax_matches(runtmp):\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    with open(g_csv) as gather_lines, open(bad_g_csv, \"w\") as fp:\n        for n, line in enumerate(gather_lines):\n            if n > 2:\n                # mess up tax idents of lines 3, 4\n                line = line.replace(\"GCF_\", \"GGG_\")\n            fp.write(line)\n    # print(\"bad_gather_results: \\n\", bad_g)\n\n    runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", bad_g_csv, \"--taxonomy-csv\", tax)\n\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert f\"Annotated 2 of 4 total rows from '{bad_g_csv}'.\" in runtmp.last_result.err\n\n\ndef test_annotate_empty_tax_lineage_input(runtmp):\n    tax_empty = runtmp.output(\"t.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\"tax\", \"annotate\", \"-g\", g_csv, \"--taxonomy-csv\", tax_empty)\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status != 0\n    assert \"cannot read taxonomy assignments from\" in str(exc.value)\n\n\ndef test_annotate_empty_tax_lineage_input_recover_with_second_taxfile(runtmp):\n    tax_empty = runtmp.output(\"t.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"-g\",\n        g_csv,\n        \"-t\",\n        tax_empty,\n        \"--taxonomy-csv\",\n        tax,\n        \"--force\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n\ndef test_annotate_empty_tax_lineage_input_recover_with_second_taxfile_2(runtmp):\n    # test with empty tax second, to check on argparse handling\n    tax_empty = runtmp.output(\"t.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"annotate\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-t\",\n        tax_empty,\n        \"--force\",\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n\n\ndef test_tax_prepare_1_csv_to_csv(runtmp, keep_identifiers, keep_versions):\n    # CSV -> CSV; same assignments\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxout = runtmp.output(\"out.csv\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_1_combine_csv(runtmp):\n    # multiple CSVs to a single combined CSV\n    tax1 = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax2 = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.sourmash(\"tax\", \"prepare\", \"-t\", tax1, tax2, \"-F\", \"csv\", \"-o\", taxout)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert not out\n    assert \"...loaded 8 entries\" in err\n\n    out = Path(taxout).read_text().splitlines()\n    assert len(out) == 9\n\n\ndef test_tax_prepare_1_csv_to_csv_empty_ranks(runtmp, keep_identifiers, keep_versions):\n    # CSV -> CSV; same assignments, even when trailing ranks are empty\n    tax = utils.get_test_data(\"tax/test-empty-ranks.taxonomy.csv\")\n    taxout = runtmp.output(\"out.csv\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_1_csv_to_csv_empty_file(runtmp, keep_identifiers, keep_versions):\n    # CSV -> CSV with an empty input file and --force\n    # tests argparse extend\n    tax = utils.get_test_data(\"tax/test-empty-ranks.taxonomy.csv\")\n    tax_empty = runtmp.output(\"t.csv\")\n    taxout = runtmp.output(\"out.csv\")\n\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"prepare\",\n        \"-t\",\n        tax,\n        \"-t\",\n        tax_empty,\n        \"-o\",\n        taxout,\n        \"-F\",\n        \"csv\",\n        *args,\n        \"--force\",\n    )\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_1_csv_to_csv_empty_ranks_2(\n    runtmp, keep_identifiers, keep_versions\n):\n    # CSV -> CSV; same assignments for situations with empty internal ranks\n    tax = utils.get_test_data(\"tax/test-empty-ranks-2.taxonomy.csv\")\n    taxout = runtmp.output(\"out.csv\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_1_csv_to_csv_empty_ranks_3(\n    runtmp, keep_identifiers, keep_versions\n):\n    # CSV -> CSV; same assignments for situations with empty internal ranks\n    tax = utils.get_test_data(\"tax/test-empty-ranks-3.taxonomy.csv\")\n    taxout = runtmp.output(\"out.csv\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"csv\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_2_csv_to_sql(runtmp, keep_identifiers, keep_versions):\n    # CSV -> SQL; same assignments?\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxout = runtmp.output(\"out.db\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n    # cannot overwrite -\n    with pytest.raises(SourmashCommandFailed) as exc:\n        runtmp.run_sourmash(\n            \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args\n        )\n    assert \"taxonomy table already exists\" in str(exc.value)\n\n\ndef test_tax_prepare_2_csv_to_sql_empty_ranks(runtmp, keep_identifiers, keep_versions):\n    # CSV -> SQL with some empty ranks in the taxonomy file\n    tax = utils.get_test_data(\"tax/test-empty-ranks.taxonomy.csv\")\n    taxout = runtmp.output(\"out.db\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_3_db_to_csv(runtmp):\n    # SQL -> CSV; same assignments\n    taxcsv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxdb = utils.get_test_data(\"tax/test.taxonomy.db\")\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxdb, \"-o\", taxout, \"-F\", \"csv\")\n    assert os.path.exists(taxout)\n    with open(taxout) as fp:\n        print(fp.read())\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [taxcsv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n    db3 = tax_utils.MultiLineageDB.load(\n        [taxdb], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    assert set(db1) == set(db2)\n    assert set(db1) == set(db3)\n\n\ndef test_tax_prepare_3_db_to_csv_gz(runtmp):\n    # SQL -> CSV; same assignments\n    taxcsv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxdb = utils.get_test_data(\"tax/test.taxonomy.db\")\n    taxout = runtmp.output(\"out.csv.gz\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxdb, \"-o\", taxout, \"-F\", \"csv\")\n    assert os.path.exists(taxout)\n    with gzip.open(taxout, \"rt\") as fp:\n        print(fp.read())\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [taxcsv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n    db3 = tax_utils.MultiLineageDB.load(\n        [taxdb], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    assert set(db1) == set(db2)\n    assert set(db1) == set(db3)\n\n\ndef test_tax_prepare_2_csv_to_sql_empty_ranks_2(\n    runtmp, keep_identifiers, keep_versions\n):\n    # CSV -> SQL with some empty internal ranks in the taxonomy file\n    tax = utils.get_test_data(\"tax/test-empty-ranks-2.taxonomy.csv\")\n    taxout = runtmp.output(\"out.db\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_2_csv_to_sql_empty_ranks_3(\n    runtmp, keep_identifiers, keep_versions\n):\n    # CSV -> SQL with some empty internal ranks in the taxonomy file\n    tax = utils.get_test_data(\"tax/test-empty-ranks-3.taxonomy.csv\")\n    taxout = runtmp.output(\"out.db\")\n\n    args = []\n    if keep_identifiers:\n        args.append(\"--keep-full-identifiers\")\n    if keep_versions:\n        args.append(\"--keep-identifier-versions\")\n\n    # this is an error - can't strip versions if not splitting identifiers\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(SourmashCommandFailed):\n            runtmp.run_sourmash(\n                \"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args\n            )\n        return\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", tax, \"-o\", taxout, \"-F\", \"sql\", *args)\n    assert os.path.exists(taxout)\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [tax],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n\n    assert set(db1) == set(db2)\n\n\ndef test_tax_prepare_3_db_to_csv_empty_ranks(runtmp):\n    # SQL -> CSV; same assignments, with empty ranks\n    taxcsv = utils.get_test_data(\"tax/test-empty-ranks.taxonomy.csv\")\n    taxdb = utils.get_test_data(\"tax/test-empty-ranks.taxonomy.db\")\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxdb, \"-o\", taxout, \"-F\", \"csv\")\n    assert os.path.exists(taxout)\n    with open(taxout) as fp:\n        print(fp.read())\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [taxcsv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n    db3 = tax_utils.MultiLineageDB.load(\n        [taxdb], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    assert set(db1) == set(db2)\n    assert set(db1) == set(db3)\n\n\ndef test_tax_prepare_3_db_to_csv_empty_ranks_2(runtmp):\n    # SQL -> CSV; same assignments, with empty ranks\n    taxcsv = utils.get_test_data(\"tax/test-empty-ranks-2.taxonomy.csv\")\n    taxdb = utils.get_test_data(\"tax/test-empty-ranks-2.taxonomy.db\")\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxdb, \"-o\", taxout, \"-F\", \"csv\")\n    assert os.path.exists(taxout)\n    with open(taxout) as fp:\n        print(fp.read())\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [taxcsv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n    db3 = tax_utils.MultiLineageDB.load(\n        [taxdb], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    assert set(db1) == set(db2)\n    assert set(db1) == set(db3)\n\n\ndef test_tax_prepare_3_db_to_csv_empty_ranks_3(runtmp):\n    # SQL -> CSV; same assignments, with empty ranks\n    taxcsv = utils.get_test_data(\"tax/test-empty-ranks-3.taxonomy.csv\")\n    taxdb = utils.get_test_data(\"tax/test-empty-ranks-3.taxonomy.db\")\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxdb, \"-o\", taxout, \"-F\", \"csv\")\n    assert os.path.exists(taxout)\n    with open(taxout) as fp:\n        print(fp.read())\n\n    db1 = tax_utils.MultiLineageDB.load(\n        [taxcsv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n\n    db2 = tax_utils.MultiLineageDB.load([taxout])\n    db3 = tax_utils.MultiLineageDB.load(\n        [taxdb], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    assert set(db1) == set(db2)\n    assert set(db1) == set(db3)\n\n\ndef test_tax_prepare_sqlite_lineage_version(runtmp):\n    # test bad sourmash_internals version for SqliteLineage\n    taxcsv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxout = runtmp.output(\"out.db\")\n\n    runtmp.run_sourmash(\"tax\", \"prepare\", \"-t\", taxcsv, \"-o\", taxout, \"-F\", \"sql\")\n    assert os.path.exists(taxout)\n\n    # set bad version\n    conn = sqlite_utils.open_sqlite_db(taxout)\n    c = conn.cursor()\n    c.execute(\"UPDATE sourmash_internal SET value='0.9' WHERE key='SqliteLineage'\")\n\n    conn.commit()\n    conn.close()\n\n    with pytest.raises(IndexNotSupported):\n        tax_utils.MultiLineageDB.load([taxout])\n\n\ndef test_tax_prepare_sqlite_no_lineage():\n    # no lineage table at all\n    sqldb = utils.get_test_data(\"sqlite/index.sqldb\")\n\n    with pytest.raises(ValueError):\n        tax_utils.MultiLineageDB.load([sqldb])\n\n\ndef test_tax_grep_exists(runtmp):\n    # test that 'tax grep' exists\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"tax\", \"grep\")\n\n    err = runtmp.last_result.err\n    assert \"usage:\" in err\n\n\ndef test_tax_grep_search_shew(runtmp):\n    # test 'tax grep Shew'\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Shew\", \"-t\", taxfile)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert lines[1][0] == \"GCF_000017325.1\"\n    assert lines[2][0] == \"GCF_000021665.1\"\n    assert len(lines) == 3\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 2 matches; saved identifiers to picklist\" in err\n\n\ndef test_tax_grep_search_shew_out(runtmp):\n    # test 'tax grep Shew', save result to a file\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Shew\", \"-t\", taxfile, \"-o\", \"pick.csv\")\n\n    err = runtmp.last_result.err\n\n    out = Path(runtmp.output(\"pick.csv\")).read_text()\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert lines[1][0] == \"GCF_000017325.1\"\n    assert lines[2][0] == \"GCF_000021665.1\"\n    assert len(lines) == 3\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 2 matches; saved identifiers to picklist\" in err\n\n\ndef test_tax_grep_search_shew_sqldb_out(runtmp):\n    # test 'tax grep Shew' on a sqldb, save result to a file\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.db\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Shew\", \"-t\", taxfile, \"-o\", \"pick.csv\")\n\n    err = runtmp.last_result.err\n\n    out = Path(runtmp.output(\"pick.csv\")).read_text()\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert lines[1][0] == \"GCF_000017325\"\n    assert lines[2][0] == \"GCF_000021665\"\n    assert len(lines) == 3\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 2 matches; saved identifiers to picklist\" in err\n\n\ndef test_tax_grep_search_shew_lowercase(runtmp):\n    # test 'tax grep shew' (lowercase), save result to a file\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"shew\", \"-t\", taxfile, \"-o\", \"pick.csv\")\n\n    err = runtmp.last_result.err\n    assert \"searching 1 taxonomy files for 'shew'\" in err\n    assert \"found 0 matches; saved identifiers to picklist\" in err\n\n    runtmp.sourmash(\"tax\", \"grep\", \"-i\", \"shew\", \"-t\", taxfile, \"-o\", \"pick.csv\")\n\n    err = runtmp.last_result.err\n    assert \"searching 1 taxonomy files for 'shew'\" in err\n    assert \"found 2 matches; saved identifiers to picklist\" in err\n\n    out = Path(runtmp.output(\"pick.csv\")).read_text()\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert lines[1][0] == \"GCF_000017325.1\"\n    assert lines[2][0] == \"GCF_000021665.1\"\n    assert len(lines) == 3\n\n\ndef test_tax_grep_search_shew_out_use_picklist(runtmp):\n    # test 'tax grep Shew', output to a picklist, use picklist\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    dbfile = utils.get_test_data(\"tax/gtdb-tax-grep.sigs.zip\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Shew\", \"-t\", taxfile, \"-o\", \"pick.csv\")\n\n    runtmp.sourmash(\n        \"sig\", \"cat\", dbfile, \"--picklist\", \"pick.csv:ident:ident\", \"-o\", \"pick-out.zip\"\n    )\n\n    all_sigs = sourmash.load_file_as_index(dbfile)\n    assert len(all_sigs) == 3\n\n    pick_sigs = sourmash.load_file_as_index(runtmp.output(\"pick-out.zip\"))\n    assert len(pick_sigs) == 2\n\n    names = [ss.name.split()[0] for ss in pick_sigs.signatures()]\n    assert len(names) == 2\n    assert \"GCF_000017325.1\" in names\n    assert \"GCF_000021665.1\" in names\n\n\ndef test_tax_grep_search_shew_invert(runtmp):\n    # test 'tax grep -v Shew'\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"-v\", \"Shew\", \"-t\", taxfile)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert (\n        \"-v/--invert-match specified; returning only lineages that do not match.\" in err\n    )\n\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert lines[1][0] == \"GCF_001881345.1\"\n    assert lines[2][0] == \"GCF_003471795.1\"\n    assert len(lines) == 5\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 4 matches; saved identifiers to picklist\" in err\n\n    all_names = set([x[0] for x in lines])\n    assert \"GCF_000017325.1\" not in all_names\n    assert \"GCF_000021665.1\" not in all_names\n\n\ndef test_tax_grep_search_shew_invert_select_phylum(runtmp):\n    # test 'tax grep -v Shew -r phylum'\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"-v\", \"Shew\", \"-t\", taxfile, \"-r\", \"phylum\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert (\n        \"-v/--invert-match specified; returning only lineages that do not match.\" in err\n    )\n    assert \"limiting matches to phylum\"\n\n    lines = [x.strip() for x in out.splitlines()]\n    lines = [x.split(\",\") for x in lines]\n    assert lines[0][0] == \"ident\"\n    assert len(lines) == 7\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 6 matches; saved identifiers to picklist\" in err\n\n    all_names = set([x[0] for x in lines])\n    assert \"GCF_000017325.1\" in all_names\n    assert \"GCF_000021665.1\" in all_names\n\n\ndef test_tax_grep_search_shew_invert_select_bad_rank(runtmp):\n    # test 'tax grep -v Shew -r badrank' - should fail\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"tax\", \"grep\", \"-v\", \"Shew\", \"-t\", taxfile, \"-r\", \"badrank\")\n\n    err = runtmp.last_result.err\n\n    print(err)\n    assert \"error: argument -r/--rank: invalid choice:\" in err\n\n\ndef test_tax_grep_search_shew_count(runtmp):\n    # test 'tax grep Shew --count'\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Shew\", \"-t\", taxfile, \"-c\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert not out.strip()\n\n    assert \"searching 1 taxonomy files for 'Shew'\" in err\n    assert \"found 2 matches; saved identifiers to picklist\" not in err\n\n\ndef test_tax_grep_multiple_csv(runtmp):\n    # grep on multiple CSVs\n    tax1 = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax2 = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Toxo|Gamma\", \"-t\", tax1, tax2, \"-o\", taxout)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert not out\n    assert \"found 4 matches\" in err\n\n    lines = Path(taxout).read_text().splitlines()\n    assert len(lines) == 5\n\n    names = set([x.split(\",\")[0] for x in lines])\n    assert \"GCA_000256725\" in names\n    assert \"GCF_000017325.1\" in names\n    assert \"GCF_000021665.1\" in names\n    assert \"GCF_001881345.1\" in names\n\n\ndef test_tax_grep_multiple_csv_empty_force(runtmp):\n    # grep on multiple CSVs, one empty, with --force\n    tax1 = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax2 = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n    tax_empty = runtmp.output(\"t.csv\")\n\n    taxout = runtmp.output(\"out.csv\")\n    with open(tax_empty, \"w\") as fp:\n        fp.write(\"\")\n    print(\"t_csv: \", tax_empty)\n\n    runtmp.sourmash(\n        \"tax\",\n        \"grep\",\n        \"Toxo|Gamma\",\n        \"-t\",\n        tax1,\n        tax2,\n        \"-t\",\n        tax_empty,\n        \"-o\",\n        taxout,\n        \"--force\",\n    )\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert not out\n    assert \"found 4 matches\" in err\n\n    lines = Path(taxout).read_text().splitlines()\n    assert len(lines) == 5\n\n    names = set([x.split(\",\")[0] for x in lines])\n    assert \"GCA_000256725\" in names\n    assert \"GCF_000017325.1\" in names\n    assert \"GCF_000021665.1\" in names\n    assert \"GCF_001881345.1\" in names\n\n\ndef test_tax_grep_duplicate_csv(runtmp):\n    # grep on duplicates => should collapse to uniques on identifiers\n    tax1 = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    taxout = runtmp.output(\"out.csv\")\n\n    runtmp.sourmash(\"tax\", \"grep\", \"Gamma\", \"-t\", tax1, tax1, \"-o\", taxout)\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert not out\n    assert \"found 3 matches\" in err\n\n    lines = Path(taxout).read_text().splitlines()\n    assert len(lines) == 4\n\n    names = set([x.split(\",\")[0] for x in lines])\n    assert \"GCF_000017325.1\" in names\n    assert \"GCF_000021665.1\" in names\n    assert \"GCF_001881345.1\" in names\n\n\ndef test_tax_summarize(runtmp):\n    # test basic operation with summarize\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"summarize\", taxfile)\n\n    out = runtmp.last_result.out\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"rank superkingdom:        1 distinct taxonomic lineages\" in out\n    assert \"rank phylum:              2 distinct taxonomic lineages\" in out\n    assert \"rank class:               2 distinct taxonomic lineages\" in out\n    assert \"rank order:               2 distinct taxonomic lineages\" in out\n    assert \"rank family:              3 distinct taxonomic lineages\" in out\n    assert \"rank genus:               4 distinct taxonomic lineages\" in out\n    assert \"rank species:             4 distinct taxonomic lineages\" in out\n\n\ndef test_tax_summarize_multiple(runtmp):\n    # test basic operation with summarize on multiple files\n    tax1 = utils.get_test_data(\"tax/bacteria_refseq_lineage.csv\")\n    tax2 = utils.get_test_data(\"tax/protozoa_genbank_lineage.csv\")\n\n    runtmp.sourmash(\"tax\", \"summarize\", tax1, tax2)\n\n    out = runtmp.last_result.out\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"rank superkingdom:        2 distinct taxonomic lineages\" in out\n    assert \"rank phylum:              3 distinct taxonomic lineages\" in out\n    assert \"rank class:               4 distinct taxonomic lineages\" in out\n    assert \"rank order:               4 distinct taxonomic lineages\" in out\n    assert \"rank family:              5 distinct taxonomic lineages\" in out\n    assert \"rank genus:               5 distinct taxonomic lineages\" in out\n    assert \"rank species:             5 distinct taxonomic lineages\" in out\n\n\ndef test_tax_summarize_empty_line(runtmp):\n    # test basic operation with summarize on a file w/empty line\n    taxfile = utils.get_test_data(\"tax/test-empty-line.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"summarize\", taxfile)\n\n    out = runtmp.last_result.out\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"rank superkingdom:        1 distinct taxonomic lineages\" in out\n    assert \"rank phylum:              2 distinct taxonomic lineages\" in out\n    assert \"rank class:               2 distinct taxonomic lineages\" in out\n    assert \"rank order:               2 distinct taxonomic lineages\" in out\n    assert \"rank family:              3 distinct taxonomic lineages\" in out\n    assert \"rank genus:               4 distinct taxonomic lineages\" in out\n    assert \"rank species:             4 distinct taxonomic lineages\" in out\n\n\ndef test_tax_summarize_empty(runtmp):\n    # test failure on empty file\n    taxfile = runtmp.output(\"no-exist\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"tax\", \"summarize\", taxfile)\n\n    err = runtmp.last_result.err\n    assert \"ERROR while loading taxonomies\" in err\n\n\ndef test_tax_summarize_csv(runtmp):\n    # test basic operation w/csv output\n    taxfile = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"summarize\", taxfile, \"-o\", \"ranks.csv\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"saved 18 lineage counts to 'ranks.csv'\" in err\n\n    csv_out = runtmp.output(\"ranks.csv\")\n\n    with sourmash_args.FileInputCSV(csv_out) as r:\n        # count number across ranks as a cheap consistency check\n        c = Counter()\n        for row in r:\n            val = row[\"lineage_count\"]\n            c[val] += 1\n\n        assert c[\"3\"] == 7\n        assert c[\"2\"] == 5\n        assert c[\"1\"] == 5\n\n\ndef test_tax_summarize_on_annotate(runtmp):\n    # test summarize on output of annotate basics\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    csvout = runtmp.output(\"test1.gather.with-lineages.csv\")\n    out_dir = os.path.dirname(csvout)\n\n    runtmp.run_sourmash(\n        \"tax\", \"annotate\", \"--gather-csv\", g_csv, \"--taxonomy-csv\", tax, \"-o\", out_dir\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    assert runtmp.last_result.status == 0\n    assert os.path.exists(csvout)\n\n    # so far so good - now see if we can run summarize!\n\n    runtmp.run_sourmash(\"tax\", \"summarize\", csvout)\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert \"number of distinct taxonomic lineages: 4\" in out\n    assert \"rank superkingdom:        1 distinct taxonomic lineages\" in out\n    assert \"rank phylum:              2 distinct taxonomic lineages\" in out\n    assert \"rank class:               2 distinct taxonomic lineages\" in out\n    assert \"rank order:               2 distinct taxonomic lineages\" in out\n    assert \"rank family:              2 distinct taxonomic lineages\" in out\n    assert \"rank genus:               3 distinct taxonomic lineages\" in out\n    assert \"rank species:             3 distinct taxonomic lineages\" in out\n\n\ndef test_tax_summarize_strain_csv(runtmp):\n    # test basic operation w/csv output on taxonomy with strains\n    taxfile = utils.get_test_data(\"tax/test-strain.taxonomy.csv\")\n\n    runtmp.sourmash(\"tax\", \"summarize\", taxfile, \"-o\", \"ranks.csv\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"saved 24 lineage counts to 'ranks.csv'\" in err\n\n    csv_out = runtmp.output(\"ranks.csv\")\n\n    with sourmash_args.FileInputCSV(csv_out) as r:\n        # count number across ranks as a cheap consistency check\n        c = Counter()\n        for row in r:\n            print(row)\n            val = row[\"lineage_count\"]\n            c[val] += 1\n\n        print(list(c.most_common()))\n\n        assert c[\"3\"] == 7\n        assert c[\"2\"] == 5\n        assert c[\"6\"] == 1\n        assert c[\"1\"] == 11\n\n\ndef test_tax_summarize_strain_csv_with_lineages(runtmp):\n    # test basic operation w/csv output on lineages-style file w/strain csv\n    taxfile = utils.get_test_data(\"tax/test-strain.taxonomy.csv\")\n    lineage_csv = runtmp.output(\"lin-with-strains.csv\")\n\n    taxdb = tax_utils.LineageDB.load(taxfile)\n    with open(lineage_csv, \"w\", newline=\"\") as fp:\n        w = csv.writer(fp)\n        w.writerow([\"name\", \"lineage\"])\n        for k, v in taxdb.items():\n            linstr = lca_utils.display_lineage(v)\n            w.writerow([k, linstr])\n\n    runtmp.sourmash(\"tax\", \"summarize\", lineage_csv, \"-o\", \"ranks.csv\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"saved 24 lineage counts to\" in err\n\n    csv_out = runtmp.output(\"ranks.csv\")\n\n    with sourmash_args.FileInputCSV(csv_out) as r:\n        # count number across ranks as a cheap consistency check\n        c = Counter()\n        for row in r:\n            print(row)\n            val = row[\"lineage_count\"]\n            c[val] += 1\n\n        print(list(c.most_common()))\n\n        assert c[\"3\"] == 7\n        assert c[\"2\"] == 5\n        assert c[\"6\"] == 1\n        assert c[\"1\"] == 11\n\n\ndef test_tax_summarize_ictv(runtmp):\n    # test basic operation w/csv output on lineages-style file w/strain csv\n    taxfile = utils.get_test_data(\"tax/test.ictv-taxonomy.csv\")\n    lineage_csv = runtmp.output(\"ictv-lins.csv\")\n\n    taxdb = tax_utils.LineageDB.load(taxfile)\n    with open(lineage_csv, \"w\", newline=\"\") as fp:\n        w = csv.writer(fp)\n        w.writerow([\"name\", \"lineage\"])\n        for k, v in taxdb.items():\n            linstr = lca_utils.display_lineage(v)\n            w.writerow([k, linstr])\n\n    runtmp.sourmash(\"tax\", \"summarize\", lineage_csv, \"-o\", \"ranks.csv\", \"--ictv\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    assert \"number of distinct taxonomic lineages: 7\" in out\n    assert \"saved 14 lineage counts to\" in err\n\n    csv_out = runtmp.output(\"ranks.csv\")\n\n    with sourmash_args.FileInputCSV(csv_out) as r:\n        # count number across ranks as a cheap consistency check\n        c = Counter()\n        for row in r:\n            print(row)\n            val = row[\"lineage_count\"]\n            c[val] += 1\n\n        print(list(c.most_common()))\n        print(c)\n        assert c[\"1\"] == 8\n        assert c[\"7\"] == 5\n        assert c[\"6\"] == 1\n\n\ndef test_tax_summarize_LINS(runtmp):\n    # test basic operation w/LINs\n    taxfile = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n    lineage_csv = runtmp.output(\"annotated-lin.csv\")\n\n    taxdb = tax_utils.LineageDB.load(taxfile, lins=True)\n    with open(lineage_csv, \"w\", newline=\"\") as fp:\n        w = csv.writer(fp)\n        w.writerow([\"name\", \"lineage\"])\n        for k, v in taxdb.items():\n            lin = tax_utils.LINLineageInfo(lineage=v)\n            linstr = lin.display_lineage(truncate_empty=False)\n            print(linstr)\n            w.writerow([k, linstr])\n\n    runtmp.sourmash(\"tax\", \"summarize\", lineage_csv, \"-o\", \"ranks.csv\", \"--lins\")\n\n    out = runtmp.last_result.out\n    err = runtmp.last_result.err\n\n    print(out)\n    print(err)\n\n    assert \"number of distinct taxonomic lineages: 6\" in out\n    assert \"saved 91 lineage counts to\" in err\n\n    csv_out = runtmp.output(\"ranks.csv\")\n\n    with sourmash_args.FileInputCSV(csv_out) as r:\n        # count number across ranks as a cheap consistency check\n        c = Counter()\n        for row in r:\n            print(row)\n            val = row[\"lineage_count\"]\n            c[val] += 1\n\n        print(list(c.most_common()))\n\n        assert c[\"1\"] == 77\n        assert c[\"2\"] == 1\n        assert c[\"3\"] == 11\n        assert c[\"4\"] == 2\n\n\ndef test_metagenome_LIN(runtmp, cli_v4_and_v5):\n    # test basic metagenome with LIN taxonomy\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    format_args = []\n    if cli_v4_and_v5 == \"v5\":\n        format_args = [\"-F\", \"csv_summary\"]\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        *format_args,\n        version=cli_v4_and_v5,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank\"\n        in c.last_result.out\n    )\n    # 0th rank/position\n    assert \"test1,0,0.089,1,md5,test1.sig,0.057,444000,0.925,0\" in c.last_result.out\n    assert \"test1,0,0.088,0,md5,test1.sig,0.058,442000,0.925,0\" in c.last_result.out\n    assert \"test1,0,0.028,2,md5,test1.sig,0.016,138000,0.891,0\" in c.last_result.out\n    assert (\n        \"test1,0,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\" in c.last_result.out\n    )\n    # 1st rank/position\n    assert \"test1,1,0.089,1;0,md5,test1.sig,0.057,444000,0.925,0\" in c.last_result.out\n    assert \"test1,1,0.088,0;0,md5,test1.sig,0.058,442000,0.925,0\" in c.last_result.out\n    assert \"test1,1,0.028,2;0,md5,test1.sig,0.016,138000,0.891,0\" in c.last_result.out\n    assert (\n        \"test1,1,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\" in c.last_result.out\n    )\n    # 2nd rank/position\n    assert \"test1,2,0.088,0;0;0,md5,test1.sig,0.058,442000,0.925,0\" in c.last_result.out\n    assert \"test1,2,0.078,1;0;0,md5,test1.sig,0.050,390000,0.921,0\" in c.last_result.out\n    assert \"test1,2,0.028,2;0;0,md5,test1.sig,0.016,138000,0.891,0\" in c.last_result.out\n    assert \"test1,2,0.011,1;0;1,md5,test1.sig,0.007,54000,0.864,0\" in c.last_result.out\n    assert (\n        \"test1,2,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\" in c.last_result.out\n    )\n    # 19th rank/position\n    assert (\n        \"test1,19,0.088,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.058,442000,0.925,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,19,0.078,1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.050,390000,0.921,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,19,0.028,2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.016,138000,0.891,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,19,0.011,1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,md5,test1.sig,0.007,54000,0.864,0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1,19,0.796,unclassified,md5,test1.sig,0.869,3990000,,0\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_LIN_lingroups(runtmp):\n    # test lingroups output\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n        out.write(\"0;0;0,lg1\\n\")\n        out.write(\"1;0;0,lg2\\n\")\n        out.write(\"2;0;0,lg3\\n\")\n        out.write(\"1;0;1,lg3\\n\")\n        # write a 19 so we can check the end\n        out.write(\"1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,lg4\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--lingroup\",\n        lg_file,\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"Read 5 lingroup rows and found 5 distinct lingroup prefixes.\"\n        in c.last_result.err\n    )\n    assert \"name\tlin\tpercent_containment\tnum_bp_contained\" in c.last_result.out\n    assert \"lg1\t0;0;0\t5.82\t714000\" in c.last_result.out\n    assert \"lg2\t1;0;0\t5.05\t620000\" in c.last_result.out\n    assert \"lg3\t2;0;0\t1.56\t192000\" in c.last_result.out\n    assert \"lg3\t1;0;1\t0.65\t80000\" in c.last_result.out\n    assert (\n        \"lg4\t1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\t0.65\t80000\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_LIN_lingroups_summary(runtmp):\n    # test lingroups summary file. Can no longer output stdout, b/c will produce 2 files\n    c = runtmp\n    csv_base = \"out\"\n    sum_csv = csv_base + \".summarized.csv\"\n    csvout = runtmp.output(sum_csv)\n    outdir = os.path.dirname(csvout)\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n        out.write(\"0;0;0,lg1\\n\")\n        out.write(\"1;0;0,lg2\\n\")\n        out.write(\"2;0;0,lg3\\n\")\n        out.write(\"1;0;1,lg4\\n\")\n        # write a 19 so we can check the end\n        out.write(\"1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,lg5\\n\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"--lingroup\",\n        lg_file,\n        \"-o\",\n        csv_base,\n        \"--output-dir\",\n        outdir,\n        \"-F\",\n        \"csv_summary\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert (\n        \"Read 5 lingroup rows and found 5 distinct lingroup prefixes.\"\n        in c.last_result.err\n    )\n    assert os.path.exists(csvout)\n    sum_gather_results = [x.rstrip() for x in Path(csvout).read_text().splitlines()]\n    print(sum_gather_results)\n    assert f\"saving 'csv_summary' output to '{csvout}'\" in runtmp.last_result.err\n    assert (\n        \"query_name,rank,fraction,lineage,query_md5,query_filename,f_weighted_at_rank,bp_match_at_rank,query_ani_at_rank,total_weighted_hashes,lingroup\"\n        in sum_gather_results[0]\n    )\n    assert (\n        \"test1,2,0.08815317112086159,0;0;0,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.05815279361459521,442000,0.9246458342627294,6139,lg1\"\n        in sum_gather_results[1]\n    )\n    assert (\n        \"test1,2,0.07778220981252493,1;0;0,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.050496823586903404,390000,0.920920083987624,6139,lg2\"\n        in sum_gather_results[2]\n    )\n    assert (\n        \"test1,2,0.027522935779816515,2;0;0,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.015637726014008795,138000,0.8905689983332759,6139,lg3\"\n        in sum_gather_results[3]\n    )\n    assert (\n        \"test1,2,0.010769844435580374,1;0;1,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.006515719172503665,54000,0.8640181883213995,6139,lg4\"\n        in sum_gather_results[4]\n    )\n    assert (\n        \"test1,2,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139,\"\n        in sum_gather_results[5]\n    )\n    assert (\n        \"test1,19,0.010769844435580374,1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.006515719172503665,54000,0.8640181883213995,6139,lg5\"\n        in sum_gather_results[6]\n    )\n    assert (\n        \"test1,19,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139,\"\n        in sum_gather_results[7]\n    )\n\n\ndef test_metagenome_LIN_human_summary_no_lin_position(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"--lins\", \"-F\", \"human\"\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"sample name    proportion   cANI   lineage\" in c.last_result.out\n    assert \"-----------    ----------   ----   -------\" in c.last_result.out\n    assert \"test1             86.9%     -      unclassified\" in c.last_result.out\n    assert (\n        \"test1              5.8%     92.5%  0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1              5.0%     92.1%  1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1              1.6%     89.1%  2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\"\n        in c.last_result.out\n    )\n    assert (\n        \"test1              0.7%     86.4%  1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_LIN_human_summary_lin_position_5(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"-F\",\n        \"human\",\n        \"--lin-position\",\n        \"5\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"sample name    proportion   cANI   lineage\" in c.last_result.out\n    assert \"-----------    ----------   ----   -------\" in c.last_result.out\n    assert \"test1             86.9%     -      unclassified\" in c.last_result.out\n    assert \"test1              5.8%     92.5%  0;0;0;0;0;0\" in c.last_result.out\n    assert \"test1              5.0%     92.1%  1;0;0;0;0;0\" in c.last_result.out\n    assert \"test1              1.6%     89.1%  2;0;0;0;0;0\" in c.last_result.out\n    assert \"test1              0.7%     86.4%  1;0;1;0;0;0\" in c.last_result.out\n\n\ndef test_metagenome_LIN_krona_lin_position_5(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    c.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"--lins\",\n        \"-F\",\n        \"krona\",\n        \"--lin-position\",\n        \"5\",\n    )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status == 0\n    assert \"fraction\t0\t1\t2\t3\t4\t5\" in c.last_result.out\n    assert \"0.08815317112086159\t0\t0\t0\t0\t0\t0\" in c.last_result.out\n    assert \"0.07778220981252493\t1\t0\t0\t0\t0\t0\" in c.last_result.out\n    assert \"0.027522935779816515\t2\t0\t0\t0\t0\t0\" in c.last_result.out\n    assert \"0.010769844435580374\t1\t0\t1\t0\t0\t0\" in c.last_result.out\n    assert (\n        \"0.7957718388512166\tunclassified\tunclassified\tunclassified\tunclassified\tunclassified\tunclassified\"\n        in c.last_result.out\n    )\n\n\ndef test_metagenome_LIN_krona_bad_rank(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lins\",\n            \"-F\",\n            \"krona\",\n            \"--lin-position\",\n            \"strain\",\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert (\n        \"Invalid '--rank'/'--position' input: 'strain'. '--lins' is specified. Rank must be an integer corresponding to a LIN position.\"\n        in c.last_result.err\n    )\n\n\ndef test_metagenome_LIN_lingroups_empty_lg_file(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lins\",\n            \"--lingroup\",\n            lg_file,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert (\n        f\"Cannot read lingroups from '{lg_file}'. Is file empty?\" in c.last_result.err\n    )\n\n\ndef test_metagenome_LIN_lingroups_bad_cli_inputs(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lins\",\n            \"-F\",\n            \"lingroup\",\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert (\n        \"Must provide lingroup csv via '--lingroup' in order to output a lingroup report.\"\n        in c.last_result.err\n    )\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\", \"metagenome\", \"-g\", g_csv, \"--taxonomy-csv\", tax, \"-F\", \"lingroup\"\n        )\n    print(c.last_result.err)\n    assert c.last_result.status != 0\n    assert (\n        \"Must enable LIN taxonomy via '--lins' in order to use lingroups.\"\n        in c.last_result.err\n    )\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lingroup\",\n            lg_file,\n        )\n    print(c.last_result.err)\n    assert c.last_result.status != 0\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lins\",\n            \"-F\",\n            \"bioboxes\",\n        )\n    print(c.last_result.err)\n    assert c.last_result.status != 0\n    assert (\n        \"ERROR: The following outputs are incompatible with '--lins': : bioboxes, kreport\"\n        in c.last_result.err\n    )\n\n\ndef test_metagenome_mult_outputs_stdout_fail(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-F\",\n            \"kreport\",\n            \"csv_summary\",\n        )\n\n    print(c.last_result.err)\n    assert c.last_result.status != 0\n    assert (\n        \"Writing to stdout is incompatible with multiple output formats ['kreport', 'csv_summary']\"\n        in c.last_result.err\n    )\n\n\ndef test_genome_mult_outputs_stdout_fail(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"genome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-F\",\n            \"lineage_csv\",\n            \"csv_summary\",\n        )\n\n    print(c.last_result.err)\n    assert c.last_result.status != 0\n    assert (\n        \"Writing to stdout is incompatible with multiple output formats ['lineage_csv', 'csv_summary']\"\n        in c.last_result.err\n    )\n\n\ndef test_metagenome_LIN_lingroups_lg_only_header(runtmp):\n    c = runtmp\n\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n\n    with pytest.raises(SourmashCommandFailed):\n        c.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"--lins\",\n            \"--lingroup\",\n            lg_file,\n        )\n\n    print(c.last_result.status)\n    print(c.last_result.out)\n    print(c.last_result.err)\n\n    assert c.last_result.status != 0\n    assert f\"No lingroups loaded from {lg_file}\" in c.last_result.err\n\n\ndef test_metagenome_abund_reporting_default(runtmp, cli_v4_and_v5):\n    # test default abundance behavior across versions\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        version=cli_v4_and_v5,\n    )\n\n    human_out = runtmp.output(\"xxx.human.txt\")\n    assert os.path.exists(human_out)\n    human_txt = open(human_out).read()\n\n    krona_out = runtmp.output(\"xxx.krona.tsv\")\n    assert os.path.exists(krona_out)\n    krona_txt = open(krona_out).read()\n\n    linsum_out = runtmp.output(\"xxx.lineage_summary.tsv\")\n    assert os.path.exists(linsum_out)\n    linsum_txt = open(linsum_out).read()\n\n    kreport_out = runtmp.output(\"xxx.kreport.txt\")\n    assert os.path.exists(kreport_out)\n    kreport_txt = open(kreport_out).read()\n\n    csvsum_out = runtmp.output(\"xxx.summarized.csv\")\n    assert os.path.exists(csvsum_out)\n    csvsum_txt = open(csvsum_out).read()\n\n    # abund used by default in both v4 and v5:\n    assert \"test1             86.9%     -      unclassified\" in human_txt\n    assert \"86.92\\t10672000\\t10672000\\tU\\t\\tunclassified\" in kreport_txt\n\n    # both flat and abund reported in v4 and v5:\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139\"\n        in csvsum_txt\n    )\n\n    if cli_v4_and_v5 == \"(default)\":\n        # abund not used by default in v4:\n        assert \"0.7957718388512166\\tunclassified\" in krona_txt\n        assert \"unclassified\\t0.795\" in linsum_txt\n\n        # warning printed in v4\n        assert \"WARNING: abundances\" in runtmp.last_result.err\n    elif cli_v4_and_v5 == \"v4\":\n        # abund not used by default in v4:\n        assert \"0.7957718388512166\\tunclassified\" in krona_txt\n        assert \"unclassified\\t0.795\" in linsum_txt\n\n        # warning printed\n        assert \"WARNING: abundances\" in runtmp.last_result.err\n    elif cli_v4_and_v5 == \"v5\":\n        # abund used by default in v5:\n        assert \"0.8691969376119889\\tunclassified\" in krona_txt\n        assert \"unclassified\\t0.869\" in linsum_txt\n\n        # no warning printed\n        assert \"WARNING: abundances\" not in runtmp.last_result.err\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n\ndef test_metagenome_abund_reporting_no_abund_fail_v4(runtmp, cli_v4_only):\n    # test abundance behavior with defaults and no abundances; behavior varies\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        version=cli_v4_only,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"WARNING: no abundances found in gather results.\" in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_no_abund_fail_v5(runtmp, cli_v5_only):\n    # test abundance behavior with defaults and no abundances; behavior varies\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-F\",\n            \"human\",\n            \"-F\",\n            \"csv_summary\",\n            \"-F\",\n            \"lineage_summary\",\n            \"-F\",\n            \"krona\",\n            \"-F\",\n            \"kreport\",\n            \"-r\",\n            \"species\",\n            \"-o\",\n            runtmp.output(\"xxx\"),\n            version=cli_v5_only,\n        )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n    assert \"ERROR: no abundances found in gather results.\" in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_use_abund(runtmp, cli_v4_and_v5):\n    # test abundance behavior across versions with --use-abund\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        \"--use-abund\",\n        version=cli_v4_and_v5,\n    )\n\n    human_out = runtmp.output(\"xxx.human.txt\")\n    assert os.path.exists(human_out)\n    human_txt = open(human_out).read()\n\n    krona_out = runtmp.output(\"xxx.krona.tsv\")\n    assert os.path.exists(krona_out)\n    krona_txt = open(krona_out).read()\n\n    linsum_out = runtmp.output(\"xxx.lineage_summary.tsv\")\n    assert os.path.exists(linsum_out)\n    linsum_txt = open(linsum_out).read()\n\n    kreport_out = runtmp.output(\"xxx.kreport.txt\")\n    assert os.path.exists(kreport_out)\n    kreport_txt = open(kreport_out).read()\n\n    csvsum_out = runtmp.output(\"xxx.summarized.csv\")\n    assert os.path.exists(csvsum_out)\n    csvsum_txt = open(csvsum_out).read()\n\n    # abund used by default in both v4 and v5:\n    assert \"test1             86.9%     -      unclassified\" in human_txt\n    assert \"86.92\\t10672000\\t10672000\\tU\\t\\tunclassified\" in kreport_txt\n\n    # both flat and abund reported in v4 and v5:\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139\"\n        in csvsum_txt\n    )\n\n    # abund used with --use-abund:\n    assert \"0.8691969376119889\\tunclassified\" in krona_txt\n    assert \"unclassified\\t0.869\" in linsum_txt\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # no warning printed\n    assert \"WARNING: abundances\" not in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_ignore_abund(runtmp, cli_v4_and_v5):\n    # test abundance behavior across versions with --ignore-abund\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        \"--ignore-abund\",\n        version=cli_v4_and_v5,\n    )\n\n    human_out = runtmp.output(\"xxx.human.txt\")\n    assert os.path.exists(human_out)\n    human_txt = open(human_out).read()\n\n    krona_out = runtmp.output(\"xxx.krona.tsv\")\n    assert os.path.exists(krona_out)\n    krona_txt = open(krona_out).read()\n\n    linsum_out = runtmp.output(\"xxx.lineage_summary.tsv\")\n    assert os.path.exists(linsum_out)\n    linsum_txt = open(linsum_out).read()\n\n    kreport_out = runtmp.output(\"xxx.kreport.txt\")\n    assert os.path.exists(kreport_out)\n    kreport_txt = open(kreport_out).read()\n\n    csvsum_out = runtmp.output(\"xxx.summarized.csv\")\n    assert os.path.exists(csvsum_out)\n    csvsum_txt = open(csvsum_out).read()\n\n    # abund ignored with --ignore-abund:\n    assert \"test1             79.6%     -      unclassified\" in human_txt\n    assert \"79.58\\t3990000\\t3990000\\tU\\t\\tunclassified\" in kreport_txt\n    assert \"0.7957718388512166\\tunclassified\" in krona_txt\n    assert \"unclassified\\t0.795\" in linsum_txt\n\n    # both flat and abund reported in v4 and v5:\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139\"\n        in csvsum_txt\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # no warning printed\n    assert \"WARNING: abundances\" not in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_use_abund_fail(runtmp, cli_v4_and_v5):\n    # test abundance behavior with --use-abund and no abundances; should fail.\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.run_sourmash(\n            \"tax\",\n            \"metagenome\",\n            \"-g\",\n            g_csv,\n            \"--taxonomy-csv\",\n            tax,\n            \"-F\",\n            \"human\",\n            \"-F\",\n            \"csv_summary\",\n            \"-F\",\n            \"lineage_summary\",\n            \"-F\",\n            \"krona\",\n            \"-F\",\n            \"kreport\",\n            \"-r\",\n            \"species\",\n            \"-o\",\n            runtmp.output(\"xxx\"),\n            \"--use-abund\",\n            version=cli_v4_and_v5,\n        )\n\n    assert \"ERROR: no abundances found in gather results.\" in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_ignore_abund(runtmp, cli_v4_and_v5):\n    # test abundance behavior across versions with --ignore-abund\n    g_csv = utils.get_test_data(\"tax/test1.gather.v450.csv\")\n    tax = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        \"--ignore-abund\",\n        version=cli_v4_and_v5,\n    )\n\n    human_out = runtmp.output(\"xxx.human.txt\")\n    assert os.path.exists(human_out)\n    human_txt = open(human_out).read()\n\n    krona_out = runtmp.output(\"xxx.krona.tsv\")\n    assert os.path.exists(krona_out)\n    krona_txt = open(krona_out).read()\n\n    linsum_out = runtmp.output(\"xxx.lineage_summary.tsv\")\n    assert os.path.exists(linsum_out)\n    linsum_txt = open(linsum_out).read()\n\n    kreport_out = runtmp.output(\"xxx.kreport.txt\")\n    assert os.path.exists(kreport_out)\n    kreport_txt = open(kreport_out).read()\n\n    csvsum_out = runtmp.output(\"xxx.summarized.csv\")\n    assert os.path.exists(csvsum_out)\n    csvsum_txt = open(csvsum_out).read()\n\n    # abund ignored with --ignore-abund:\n    assert \"test1             79.6%     -      unclassified\" in human_txt\n    assert \"79.58\\t3990000\\t3990000\\tU\\t\\tunclassified\" in kreport_txt\n    assert \"0.7957718388512166\\tunclassified\" in krona_txt\n    assert \"unclassified\\t0.795\" in linsum_txt\n\n    # both flat and abund reported in v4 and v5:\n    assert (\n        \"test1,species,0.7957718388512166,unclassified,9687eeed,outputs/abundtrim/HSMA33MX.abundtrim.fq.gz,0.8691969376119889,3990000,,6139\"\n        in csvsum_txt\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    # no warning printed\n    assert \"WARNING: abundances\" not in runtmp.last_result.err\n\n\ndef test_metagenome_abund_reporting_ignore_abund_pass(runtmp, cli_v4_and_v5):\n    # test abundance behavior with --use-abund and no abundances; should pass.\n    g_csv = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.csv\")\n    tax = utils.get_test_data(\"tax/lemonade-MAG3.x.gtdb.matches.tax.csv\")\n\n    runtmp.run_sourmash(\n        \"tax\",\n        \"metagenome\",\n        \"-g\",\n        g_csv,\n        \"--taxonomy-csv\",\n        tax,\n        \"-F\",\n        \"human\",\n        \"-F\",\n        \"csv_summary\",\n        \"-F\",\n        \"lineage_summary\",\n        \"-F\",\n        \"krona\",\n        \"-F\",\n        \"kreport\",\n        \"-r\",\n        \"species\",\n        \"-o\",\n        runtmp.output(\"xxx\"),\n        \"--ignore-abund\",\n        version=cli_v4_and_v5,\n    )\n\n    print(runtmp.last_result.status)\n    print(runtmp.last_result.out)\n    print(runtmp.last_result.err)\n\n    human_out = runtmp.output(\"xxx.human.txt\")\n    assert os.path.exists(human_out)\n\n    krona_out = runtmp.output(\"xxx.krona.tsv\")\n    assert os.path.exists(krona_out)\n\n    linsum_out = runtmp.output(\"xxx.lineage_summary.tsv\")\n    assert os.path.exists(linsum_out)\n\n    kreport_out = runtmp.output(\"xxx.kreport.txt\")\n    assert os.path.exists(kreport_out)\n\n    csvsum_out = runtmp.output(\"xxx.summarized.csv\")\n    assert os.path.exists(csvsum_out)\n"
  },
  {
    "path": "tests/test_tax_utils.py",
    "content": "\"\"\"\nTests for functions in taxonomy submodule.\n\"\"\"\n\nimport pytest\nfrom pytest import approx\nimport os\nfrom os.path import basename\nimport gzip\nfrom pathlib import Path\n\nimport sourmash_tst_utils as utils\n\nfrom sourmash.tax.tax_utils import (\n    ascending_taxlist,\n    get_ident,\n    load_gather_results,\n    collect_gather_csvs,\n    check_and_load_gather_csvs,\n    LineagePair,\n    QueryInfo,\n    GatherRow,\n    TaxResult,\n    QueryTaxResult,\n    SummarizedGatherResult,\n    ClassificationResult,\n    AnnotateTaxResult,\n    BaseLineageInfo,\n    RankLineageInfo,\n    LINLineageInfo,\n    ICTVRankLineageInfo,\n    aggregate_by_lineage_at_rank,\n    format_for_krona,\n    write_krona,\n    write_lineage_sample_frac,\n    read_lingroups,\n    LineageTree,\n    LineageDB,\n    LineageDB_Sqlite,\n    MultiLineageDB,\n    filter_row,\n    NCBI_RANKS,\n    ICTV_RANKS,\n)\n\n\n# utility functions for testing\ndef make_mini_taxonomy(tax_info, LIN=False):\n    # pass in list of tuples: (name, lineage)\n    taxD = {}\n    for name, lin in tax_info:\n        if LIN:\n            lineage = LINLineageInfo(lineage_str=lin)\n        else:\n            lineage = RankLineageInfo(lineage_str=lin)\n        taxD[name] = lineage.filled_lineage\n    return taxD\n\n\ndef make_mini_taxonomy_with_taxids(tax_info, LIN=False):\n    taxD = {}\n    for name, lin, taxids in tax_info:\n        if LIN:\n            lineage = LINLineageInfo(lineage_str=lin)\n        else:\n            ranks = RankLineageInfo.ranks\n            txs = taxids.split(\";\")\n            lns = lin.split(\";\")\n            lineage_tups = []\n            for n, taxname in enumerate(lns):\n                rk = ranks[n]\n                tx = txs[n]\n                this_lineage = LineagePair(rk, name=taxname, taxid=tx)\n                lineage_tups.append(this_lineage)\n            lineage = RankLineageInfo(lineage=lineage_tups)\n        taxD[name] = lineage.filled_lineage\n    return taxD\n\n\ndef make_GatherRow(gather_dict=None, exclude_cols=[]):\n    \"\"\"Load artificial gather row (dict) into GatherRow class\"\"\"\n    # default contains just the essential cols\n    gatherD = {\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"query_fn\",\n        \"name\": \"gA\",\n        \"f_unique_weighted\": 0.2,\n        \"f_unique_to_query\": 0.1,\n        \"query_bp\": 100,\n        \"unique_intersect_bp\": 20,\n        \"remaining_bp\": 1,\n        \"ksize\": 31,\n        \"scaled\": 1,\n    }\n    if gather_dict is not None:\n        gatherD.update(gather_dict)\n    for col in exclude_cols:\n        gatherD.pop(col)\n    fgatherD = filter_row(gatherD, GatherRow)\n    gatherRaw = GatherRow(**fgatherD)\n    return gatherRaw\n\n\ndef make_TaxResult(\n    gather_dict=None,\n    taxD=None,\n    keep_full_ident=False,\n    keep_ident_version=False,\n    skip_idents=None,\n    LIN=False,\n):\n    \"\"\"Make TaxResult from artificial gather row (dict)\"\"\"\n    gRow = make_GatherRow(gather_dict)\n    taxres = TaxResult(\n        raw=gRow,\n        keep_full_identifiers=keep_full_ident,\n        keep_identifier_versions=keep_ident_version,\n        lins=LIN,\n    )\n    if taxD is not None:\n        taxres.get_match_lineage(tax_assignments=taxD, skip_idents=skip_idents)\n    return taxres\n\n\ndef make_QueryTaxResults(\n    gather_info,\n    taxD=None,\n    single_query=False,\n    keep_full_ident=False,\n    keep_ident_version=False,\n    skip_idents=None,\n    summarize=False,\n    classify=False,\n    classify_rank=None,\n    c_thresh=0.1,\n    ani_thresh=None,\n    LIN=False,\n):\n    \"\"\"Make QueryTaxResult(s) from artificial gather information, formatted as list of gather rows (dicts)\"\"\"\n    gather_results = {}\n    this_querytaxres = None\n    for gather_infoD in gather_info:\n        taxres = make_TaxResult(\n            gather_infoD,\n            taxD=taxD,\n            keep_full_ident=keep_full_ident,\n            keep_ident_version=keep_ident_version,\n            skip_idents=skip_idents,\n            LIN=LIN,\n        )\n        query_name = taxres.query_name\n        # add to matching QueryTaxResult or create new one\n        if not this_querytaxres or not this_querytaxres.is_compatible(taxres):\n            # get existing or initialize new\n            this_querytaxres = gather_results.get(\n                query_name, QueryTaxResult(taxres.query_info, lins=LIN)\n            )\n        this_querytaxres.add_taxresult(taxres)\n        #        print('missed_ident?', taxres.missed_ident)\n        gather_results[query_name] = this_querytaxres\n    if summarize:\n        for query_name, qres in gather_results.items():\n            qres.build_summarized_result()\n    if classify:\n        for query_name, qres in gather_results.items():\n            qres.build_classification_result(\n                rank=classify_rank,\n                containment_threshold=c_thresh,\n                ani_threshold=ani_thresh,\n            )\n    # for convenience: If working with single query, just return that QueryTaxResult.\n    if single_query:\n        if len(gather_results.keys()) > 1:\n            raise ValueError(\"You passed in results for more than one query\")\n        else:\n            return next(iter(gather_results.values()))\n    return gather_results\n\n\n## tests\ndef test_ascending_taxlist_1():\n    assert list(ascending_taxlist()) == [\n        \"strain\",\n        \"species\",\n        \"genus\",\n        \"family\",\n        \"order\",\n        \"class\",\n        \"phylum\",\n        \"superkingdom\",\n    ]\n\n\ndef test_ascending_taxlist_2():\n    assert list(ascending_taxlist(include_strain=False)) == [\n        \"species\",\n        \"genus\",\n        \"family\",\n        \"order\",\n        \"class\",\n        \"phylum\",\n        \"superkingdom\",\n    ]\n\n\ndef test_QueryInfo_basic():\n    \"basic functionality of QueryInfo dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    assert qInf.query_name == \"q1\"\n    assert isinstance(qInf.query_n_hashes, int)\n    assert isinstance(qInf.ksize, int)\n    assert isinstance(qInf.scaled, int)\n    assert qInf.total_weighted_hashes == 200\n    assert qInf.total_weighted_bp == 2000\n\n\ndef test_QueryInfo_no_hash_info():\n    \"QueryInfo dataclass for older gather results without query_n_hashes or total_weighted_hashes\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        ksize=31,\n        scaled=10,\n    )\n    assert qInf.query_name == \"q1\"\n    assert qInf.query_n_hashes == 0\n    assert qInf.total_weighted_hashes == 0\n    assert qInf.total_weighted_bp == 0\n\n\ndef test_QueryInfo_missing():\n    \"check that required args\"\n    with pytest.raises(TypeError) as exc:\n        QueryInfo(\n            query_name=\"q1\",\n            query_filename=\"f1\",\n            query_bp=\"100\",\n            query_n_hashes=\"10\",\n            ksize=31,\n            scaled=10,\n            total_weighted_hashes=200,\n        )\n    print(str(exc))\n    assert \"missing 1 required positional argument: 'query_md5'\" in str(exc)\n\n\ndef test_SummarizedGatherResult():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    print(sgr)\n    assert sgr.rank == \"phylum\"\n    sumD = sgr.as_summary_dict(query_info=qInf)\n    print(sumD)\n    assert sumD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.2\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"0.3\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": None,\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n    hD = sgr.as_human_friendly_dict(query_info=qInf)\n    print(hD)\n    assert hD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.200\",\n        \"fraction_p\": \"20.0%\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"30.0%\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": \"-    \",\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n    krD = sgr.as_kreport_dict(query_info=qInf)\n    print(krD)\n    assert krD == {\n        \"ncbi_taxid\": None,\n        \"sci_name\": \"b\",\n        \"rank_code\": \"P\",\n        \"num_bp_assigned\": \"0\",\n        \"percent_containment\": \"30.00\",\n        \"num_bp_contained\": \"600\",\n    }\n    lD = sgr.as_lineage_dict(ranks=RankLineageInfo().ranks, query_info=qInf)\n    print(lD)\n    assert lD == {\n        \"ident\": \"q1\",\n        \"superkingdom\": \"a\",\n        \"phylum\": \"b\",\n        \"class\": \"\",\n        \"order\": \"\",\n        \"family\": \"\",\n        \"genus\": \"\",\n        \"species\": \"\",\n        \"strain\": \"\",\n    }\n    cami = sgr.as_cami_bioboxes()\n    print(cami)\n    assert cami == [None, \"phylum\", None, \"a|b\", \"30.00\"]\n\n\ndef test_SummarizedGatherResult_withtaxids():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    lin = [\n        LineagePair(rank=\"superkingdom\", name=\"a\", taxid=\"1\"),\n        LineagePair(rank=\"phylum\", name=\"b\", taxid=2),\n    ]\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage=lin),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    print(sgr)\n    assert sgr.rank == \"phylum\"\n    sumD = sgr.as_summary_dict(query_info=qInf)\n    print(sumD)\n    assert sumD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.2\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"0.3\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": None,\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n    hD = sgr.as_human_friendly_dict(query_info=qInf)\n    print(hD)\n    assert hD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.200\",\n        \"fraction_p\": \"20.0%\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"30.0%\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": \"-    \",\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n    krD = sgr.as_kreport_dict(query_info=qInf)\n    print(krD)\n    assert krD == {\n        \"ncbi_taxid\": \"2\",\n        \"sci_name\": \"b\",\n        \"rank_code\": \"P\",\n        \"num_bp_assigned\": \"0\",\n        \"percent_containment\": \"30.00\",\n        \"num_bp_contained\": \"600\",\n    }\n    lD = sgr.as_lineage_dict(ranks=RankLineageInfo().ranks, query_info=qInf)\n    print(lD)\n    assert lD == {\n        \"ident\": \"q1\",\n        \"superkingdom\": \"a\",\n        \"phylum\": \"b\",\n        \"class\": \"\",\n        \"order\": \"\",\n        \"family\": \"\",\n        \"genus\": \"\",\n        \"species\": \"\",\n        \"strain\": \"\",\n    }\n    cami = sgr.as_cami_bioboxes()\n    print(cami)\n    assert cami == [\"2\", \"phylum\", \"1|2\", \"a|b\", \"30.00\"]\n\n\ndef test_SummarizedGatherResult_LINs():\n    \"SummarizedGatherResult with LINs\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=LINLineageInfo(lineage_str=\"0;0;1\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n\n    lgD = sgr.as_lingroup_dict(query_info=qInf, lg_name=\"lg_name\")\n    print(lgD)\n    assert lgD == {\n        \"name\": \"lg_name\",\n        \"lin\": \"0;0;1\",\n        \"percent_containment\": \"30.00\",\n        \"num_bp_contained\": \"600\",\n    }\n    lgD = sgr.as_lingroup_dict(query_info=qInf, lg_name=\"lg_name\")\n    print(lgD)\n    assert lgD == {\n        \"name\": \"lg_name\",\n        \"lin\": \"0;0;1\",\n        \"percent_containment\": \"30.00\",\n        \"num_bp_contained\": \"600\",\n    }\n    with pytest.raises(ValueError) as exc:\n        sgr.as_kreport_dict(query_info=qInf)\n    print(str(exc))\n    assert \"Cannot produce 'kreport' with LIN taxonomy.\" in str(exc)\n    with pytest.raises(ValueError) as exc:\n        sgr.as_cami_bioboxes()\n    print(str(exc))\n    assert \"Cannot produce 'bioboxes' with LIN taxonomy.\" in str(exc)\n\n\ndef test_SummarizedGatherResult_set_query_ani():\n    \"Check ANI estimation within SummarizedGatherResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    sgr.set_query_ani(query_info=qInf)\n    print(sgr.query_ani_at_rank)\n    assert sgr.query_ani_at_rank == approx(0.949, rel=1e-3)\n    # ANI can be calculated with query_bp OR query_n_hashes. Remove each and check the results are identical\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=0,\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    sgr.set_query_ani(query_info=qInf)\n    print(sgr.query_ani_at_rank)\n    assert sgr.query_ani_at_rank == approx(0.949, rel=1e-3)\n    # try without query_bp\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=0,\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    sgr.set_query_ani(query_info=qInf)\n    print(sgr.query_ani_at_rank)\n    assert sgr.query_ani_at_rank == approx(0.949, rel=1e-3)\n\n\ndef test_SummarizedGatherResult_greater_than_1():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    # fraction > 1\n    with pytest.raises(ValueError) as exc:\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.3,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=1.2,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert \"> 100% of the query!\" in str(exc)\n    # f_weighted > 1\n    with pytest.raises(ValueError) as exc:\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=1.2,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0.3,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert \"> 100% of the query!\" in str(exc)\n\n\ndef test_SummarizedGatherResult_0_fraction():\n    with pytest.raises(ValueError) as exc:\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=-0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0.3,\n            bp_match_at_rank=30,\n        )\n    err_msg = \"Summarized fraction is <=0% of the query! This should not occur.\"\n    assert err_msg in str(exc)\n    # assert cr.status == 'nomatch'\n\n    with pytest.raises(ValueError) as exc:\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert err_msg in str(exc)\n\n\ndef test_SummarizedGatherResult_species_kreport():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"species\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b;c;d;e;f;g\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n    )\n    print(sgr)\n    assert sgr.rank == \"species\"\n    krD = sgr.as_kreport_dict(query_info=qInf)\n    print(krD)\n    assert krD == {\n        \"ncbi_taxid\": None,\n        \"sci_name\": \"g\",\n        \"rank_code\": \"S\",\n        \"num_bp_assigned\": \"600\",\n        \"percent_containment\": \"30.00\",\n        \"num_bp_contained\": \"600\",\n    }\n\n\ndef test_SummarizedGatherResult_summary_dict_limit_float():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    sgr = SummarizedGatherResult(\n        rank=\"phylum\",\n        fraction=0.123456,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.345678,\n        bp_match_at_rank=30,\n    )\n    print(sgr)\n    assert sgr.rank == \"phylum\"\n    sumD = sgr.as_summary_dict(query_info=qInf)\n    print(sumD)\n    assert sumD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.123456\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"0.345678\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": None,\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n\n    sumD = sgr.as_summary_dict(query_info=qInf, limit_float=True)\n    print(sumD)\n    assert sumD == {\n        \"rank\": \"phylum\",\n        \"fraction\": \"0.123\",\n        \"lineage\": \"a;b\",\n        \"f_weighted_at_rank\": \"0.346\",\n        \"bp_match_at_rank\": \"30\",\n        \"query_ani_at_rank\": None,\n        \"query_name\": \"q1\",\n        \"query_md5\": \"md5\",\n        \"query_filename\": \"f1\",\n        \"total_weighted_hashes\": \"200\",\n    }\n\n\ndef test_ClassificationResult():\n    \"basic functionality of ClassificationResult dataclass\"\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    cr = ClassificationResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n        query_ani_at_rank=0.97,\n    )\n    cr.set_status(query_info=qInf, containment_threshold=0.1)\n    assert cr.status == \"match\"\n    print(cr.query_ani_at_rank)\n    assert cr.query_ani_at_rank == approx(0.949, rel=1e-3)\n    cr.set_status(query_info=qInf, containment_threshold=0.35)\n    assert cr.status == \"below_threshold\"\n    lD = cr.as_lineage_dict(ranks=RankLineageInfo().ranks, query_info=qInf)\n    print(lD)\n    assert lD == {\n        \"ident\": \"q1\",\n        \"superkingdom\": \"a\",\n        \"phylum\": \"b\",\n        \"class\": \"\",\n        \"order\": \"\",\n        \"family\": \"\",\n        \"genus\": \"\",\n        \"species\": \"\",\n        \"strain\": \"\",\n    }\n\n\ndef test_ClassificationResult_greater_than_1():\n    \"basic functionality of SummarizedGatherResult dataclass\"\n    # fraction > 1\n    with pytest.raises(ValueError) as exc:\n        ClassificationResult(\n            rank=\"phylum\",\n            fraction=0.3,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=1.2,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert \"> 100% of the query!\" in str(exc)\n    # f_weighted > 1\n    with pytest.raises(ValueError) as exc:\n        ClassificationResult(\n            rank=\"phylum\",\n            fraction=1.2,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0.3,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert \"> 100% of the query!\" in str(exc)\n\n\ndef test_ClassificationResult_0_fraction():\n    with pytest.raises(ValueError) as exc:\n        ClassificationResult(\n            rank=\"phylum\",\n            fraction=-0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0.3,\n            bp_match_at_rank=30,\n        )\n    err_msg = \"Summarized fraction is <=0% of the query! This should not occur.\"\n    assert err_msg in str(exc)\n    # assert cr.status == 'nomatch'\n\n    with pytest.raises(ValueError) as exc:\n        ClassificationResult(\n            rank=\"phylum\",\n            fraction=0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0,\n            bp_match_at_rank=30,\n        )\n    print(str(exc))\n    assert err_msg in str(exc)\n\n\ndef test_ClassificationResult_build_krona_result():\n    QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    cr = ClassificationResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n        query_ani_at_rank=0.97,\n    )\n    # cr.set_status(query_info=qInf, rank='phylum')\n    kr, ukr = cr.build_krona_result(rank=\"phylum\")\n    print(kr)\n    assert kr == (0.2, \"a\", \"b\")\n    print(ukr)\n    assert ukr == (0.8, \"unclassified\", \"unclassified\")\n\n\ndef test_ClassificationResult_build_krona_result_no_rank():\n    qInf = QueryInfo(\n        query_name=\"q1\",\n        query_md5=\"md5\",\n        query_filename=\"f1\",\n        query_bp=\"100\",\n        query_n_hashes=\"10\",\n        ksize=\"31\",\n        scaled=\"10\",\n        total_weighted_hashes=\"200\",\n    )\n    cr = ClassificationResult(\n        rank=\"phylum\",\n        fraction=0.2,\n        lineage=RankLineageInfo(lineage_str=\"a;b\"),\n        f_weighted_at_rank=0.3,\n        bp_match_at_rank=30,\n        query_ani_at_rank=0.97,\n    )\n    cr.set_status(query_info=qInf, containment_threshold=0.1)\n\n\ndef test_GatherRow_old_gather():\n    # gather does not contain query_name column\n    gA = {\"name\": \"gA.1 name\"}\n    with pytest.raises(TypeError) as exc:\n        make_GatherRow(gA, exclude_cols=[\"query_bp\"])\n    print(str(exc))\n    assert \"__init__() missing 1 required positional argument: 'query_bp'\" in str(exc)\n\n\ndef test_GatherRow_match_name_not_name():\n    # gather contains match_name but not name column\n    gA = {\"match_name\": \"gA.1 name\"}\n    grow = make_GatherRow(gA, exclude_cols=[\"name\"])\n    print(grow)\n    assert grow.name == \"gA.1 name\"\n\n\ndef test_GatherRow_extra_cols():\n    # gather contains extra columns\n    gA = {\"not-a-col\": \"nope\"}\n    grow = make_GatherRow(gA)\n    assert isinstance(grow, GatherRow)\n\n\ndef test_get_ident_default():\n    ident = \"GCF_001881345.1\"\n    n_id = get_ident(ident)\n    assert n_id == \"GCF_001881345\"\n\n\ndef test_TaxResult_get_ident_default():\n    gA = {\"name\": \"GCF_001881345.1\"}  # gather result with match name as GCF_001881345.1\n    taxres = make_TaxResult(gA)\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345\"\n\n\ndef test_AnnotateTaxResult_get_ident_default():\n    gA = {\"name\": \"GCF_001881345.1\"}  # gather result with match name as GCF_001881345.1\n    taxres = AnnotateTaxResult(raw=gA)\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345\"\n\n\ndef test_AnnotateTaxResult_get_ident_idcol():\n    gA = {\n        \"name\": \"n1\",\n        \"match_name\": \"n2\",\n        \"ident\": \"n3\",\n        \"accession\": \"n4\",\n    }  # gather result with match name as GCF_001881345.1\n    taxres = AnnotateTaxResult(raw=gA)\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"n1\"\n    taxres = AnnotateTaxResult(raw=gA, id_col=\"match_name\")\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"n2\"\n    taxres = AnnotateTaxResult(raw=gA, id_col=\"ident\")\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"n3\"\n    taxres = AnnotateTaxResult(raw=gA, id_col=\"accession\")\n    print(taxres.match_ident)\n    assert taxres.match_ident == \"n4\"\n\n\ndef test_AnnotateTaxResult_get_ident_idcol_fail():\n    gA = {\n        \"name\": \"n1\",\n        \"match_name\": \"n2\",\n        \"ident\": \"n3\",\n        \"accession\": \"n4\",\n    }  # gather result with match name as GCF_001881345.1\n    with pytest.raises(ValueError) as exc:\n        AnnotateTaxResult(raw=gA, id_col=\"NotACol\")\n    print(str(exc))\n    assert \"ID column 'NotACol' not found.\" in str(exc)\n\n\ndef test_get_ident_split_but_keep_version():\n    ident = \"GCF_001881345.1 secondname\"\n    n_id = get_ident(ident, keep_identifier_versions=True)\n    assert n_id == \"GCF_001881345.1\"\n\n\ndef test_TaxResult_get_ident_split_but_keep_version():\n    gA = {\"name\": \"GCF_001881345.1 secondname\"}\n    taxres = make_TaxResult(gA, keep_ident_version=True)\n    print(\"raw ident: \", taxres.raw.name)\n    print(\"keep_full?: \", taxres.keep_full_identifiers)\n    print(\"keep_version?: \", taxres.keep_identifier_versions)\n    print(\"final ident: \", taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345.1\"\n\n\ndef test_AnnotateTaxResult_get_ident_split_but_keep_version():\n    gA = {\"name\": \"GCF_001881345.1 secondname\"}\n    taxres = AnnotateTaxResult(gA, keep_identifier_versions=True)\n    print(\"raw ident: \", taxres.raw[\"name\"])\n    print(\"keep_full?: \", taxres.keep_full_identifiers)\n    print(\"keep_version?: \", taxres.keep_identifier_versions)\n    print(\"final ident: \", taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345.1\"\n\n\ndef test_get_ident_no_split():\n    ident = \"GCF_001881345.1 secondname\"\n    n_id = get_ident(ident, keep_full_identifiers=True)\n    assert n_id == \"GCF_001881345.1 secondname\"\n\n\ndef test_TaxResult_get_ident_keep_full():\n    gA = {\"name\": \"GCF_001881345.1 secondname\"}\n    taxres = make_TaxResult(gA, keep_full_ident=True)\n    print(\"raw ident: \", taxres.raw.name)\n    print(\"keep_full?: \", taxres.keep_full_identifiers)\n    print(\"keep_version?: \", taxres.keep_identifier_versions)\n    print(\"final ident: \", taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345.1 secondname\"\n\n\ndef test_AnnotateTaxResult_get_ident_keep_full():\n    gA = {\"name\": \"GCF_001881345.1 secondname\"}\n    taxres = AnnotateTaxResult(gA, keep_full_identifiers=True)\n    print(\"raw ident: \", taxres.raw[\"name\"])\n    print(\"keep_full?: \", taxres.keep_full_identifiers)\n    print(\"keep_version?: \", taxres.keep_identifier_versions)\n    print(\"final ident: \", taxres.match_ident)\n    assert taxres.match_ident == \"GCF_001881345.1 secondname\"\n\n\ndef test_collect_gather_csvs(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    from_file = runtmp.output(\"tmp-from-file.txt\")\n    with open(from_file, \"w\") as fp:\n        fp.write(f\"{g_csv}\\n\")\n\n    gather_files = collect_gather_csvs([g_csv], from_file=from_file)\n    print(\"gather_files: \", gather_files)\n    assert len(gather_files) == 1\n    assert basename(gather_files[0]) == \"test1.gather.csv\"\n\n\ndef test_check_and_load_gather_csvs_empty(runtmp):\n    g_res = runtmp.output(\"empty.gather.csv\")\n    with open(g_res, \"w\") as fp:\n        fp.write(\"\")\n    csvs = [g_res]\n    # load taxonomy csv\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load([taxonomy_csv], keep_full_identifiers=1)\n\n    print(tax_assign)\n    # check gather results and missing ids\n    with pytest.raises(Exception) as exc:\n        check_and_load_gather_csvs(csvs, tax_assign)\n    assert \"Cannot read gather results from\" in str(exc.value)\n\n\ndef test_check_and_load_gather_csvs_with_empty_force(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    #  make gather results with taxonomy name not in tax_assign\n    g_res2 = runtmp.output(\"gA.gather.csv\")\n    g_results = [\n        x.replace(\"GCF_001881345.1\", \"gA\") + \"\\n\"\n        for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(g_results)\n    # make empty gather results\n    g_res3 = runtmp.output(\"empty.gather.csv\")\n    with open(g_res3, \"w\") as fp:\n        fp.write(\"\")\n\n    csvs = [g_res2, g_res3]\n\n    # load taxonomy csv\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    print(tax_assign)\n    # check gather results and missing ids\n    gather_results = check_and_load_gather_csvs(csvs, tax_assign, force=True)\n    assert len(gather_results) == 1\n    q_res = gather_results[0]\n    assert len(q_res.raw_taxresults) == 4\n    assert q_res.n_missed == 1\n    assert \"gA\" in q_res.missed_idents\n    assert q_res.n_skipped == 0\n\n\ndef test_check_and_load_gather_lineage_csvs_empty(runtmp):\n    # try loading an empty annotated gather file\n    g_res = runtmp.output(\"empty.gather-tax.csv\")\n    with open(g_res, \"w\") as fp:\n        fp.write(\"\")\n\n    with pytest.raises(ValueError) as exc:\n        LineageDB.load_from_gather_with_lineages(g_res)\n    assert \"cannot read taxonomy assignments\" in str(exc.value)\n\n\ndef test_check_and_load_gather_lineage_csvs_bad_header(runtmp):\n    # test on file with wrong headers\n    g_res = runtmp.output(\"empty.gather-tax.csv\")\n    with open(g_res, \"w\", newline=\"\") as fp:\n        fp.write(\"x,y,z\")\n\n    with pytest.raises(ValueError) as exc:\n        LineageDB.load_from_gather_with_lineages(g_res)\n    assert (\n        \"Expected headers 'name'/'match_name' and 'lineage' not found. Is this a with-lineages file?\"\n        in str(exc.value)\n    )\n\n\ndef test_check_and_load_gather_lineage_csvs_dne(runtmp):\n    # test loading with-lineage file that does not exist\n    g_res = runtmp.output(\"empty.gather-tax.csv\")\n\n    with pytest.raises(ValueError) as exc:\n        LineageDB.load_from_gather_with_lineages(g_res)\n    assert \"does not exist\" in str(exc.value)\n\n\ndef test_check_and_load_gather_lineage_csvs_isdir(runtmp):\n    # test loading a with-lineage file that is actually a directory\n    g_res = runtmp.output(\"empty.gather-tax.csv\")\n    os.mkdir(g_res)\n\n    with pytest.raises(ValueError) as exc:\n        LineageDB.load_from_gather_with_lineages(g_res)\n    assert \"is a directory\" in str(exc.value)\n\n\ndef test_check_and_load_gather_lineage_csvs_name(runtmp):\n    # test loading a with-lineage file that has 'name', not 'match_name'\n    g_res = utils.get_test_data(\"tax/test1.gather.with-lineages.csv\")\n\n    lins = LineageDB.load_from_gather_with_lineages(g_res)\n    assert len(lins) == 4\n\n\ndef test_check_and_load_gather_lineage_csvs_match_name(runtmp):\n    # test loading a with-lineage file that has 'match_name' instead of 'name'\n    g_res = utils.get_test_data(\"tax/test1.gather.with-lineages.csv\")\n    out_lins = runtmp.output(\"match-name.lineages.csv\")\n    with open(g_res) as f_in:\n        first_line = f_in.readline().replace(\"name\", \"match_name\")\n        with open(out_lins, \"w\") as f_out:\n            f_out.write(first_line)\n            for line in f_in:\n                f_out.write(line)\n\n    lins = LineageDB.load_from_gather_with_lineages(out_lins)\n    assert len(lins) == 4\n\n\ndef test_check_and_load_gather_csvs_fail_on_missing(runtmp):\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    # make gather results with taxonomy name not in tax_assign\n    g_res2 = runtmp.output(\"gA.gather.csv\")\n    g_results = [\n        x.replace(\"GCF_001881345.1\", \"gA\") + \"\\n\"\n        for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(g_res2, \"w\") as fp:\n        fp.writelines(g_results)\n\n    csvs = [g_res2]\n\n    # load taxonomy csv\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load([taxonomy_csv], keep_full_identifiers=1)\n    print(tax_assign)\n    # check gather results and missing ids\n    with pytest.raises(ValueError) as exc:\n        check_and_load_gather_csvs(\n            csvs, tax_assign, fail_on_missing_taxonomy=True, force=True\n        )\n    assert \"Failing, as requested via --fail-on-missing-taxonomy\" in str(exc)\n\n\ndef test_load_gather_results():\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    gather_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    gather_results, header = load_gather_results(gather_csv, tax_assignments=tax_assign)\n    assert len(gather_results) == 1\n    for query_name, res in gather_results.items():\n        assert query_name == \"test1\"\n        assert len(res.raw_taxresults) == 4\n\n\ndef test_load_gather_results_gzipped(runtmp):\n    gather_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    gather_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    # rewrite gather_csv as gzipped csv\n    gz_gather = runtmp.output(\"g.csv.gz\")\n    with open(gather_csv, \"rb\") as f_in, gzip.open(gz_gather, \"wb\") as f_out:\n        f_out.writelines(f_in)\n    # gather_results, header, seen_queries = load_gather_results(gz_gather)\n    gather_results, header = load_gather_results(gz_gather, tax_assignments=tax_assign)\n    assert len(gather_results) == 1\n    for query_name, res in gather_results.items():\n        assert query_name == \"test1\"\n        assert len(res.raw_taxresults) == 4\n\n\ndef test_load_gather_results_bad_header(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    g_csv = utils.get_test_data(\"tax/test1.gather.csv\")\n\n    bad_g_csv = runtmp.output(\"g.csv\")\n\n    # creates bad gather result\n    bad_g = [\n        x.replace(\"f_unique_to_query\", \"nope\") + \"\\n\"\n        for x in Path(g_csv).read_text().splitlines()\n    ]\n    with open(bad_g_csv, \"w\") as fp:\n        fp.writelines(bad_g)\n    print(\"bad_gather_results: \\n\", bad_g)\n\n    with pytest.raises(ValueError) as exc:\n        gather_results, header = load_gather_results(\n            bad_g_csv, tax_assignments=tax_assign\n        )\n    assert (\n        f\"'{bad_g_csv}' is missing columns needed for taxonomic summarization\"\n        in str(exc.value)\n    )\n\n\ndef test_load_gather_results_empty(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    empty_csv = runtmp.output(\"g.csv\")\n\n    # creates empty gather result\n    with open(empty_csv, \"w\") as fp:\n        fp.write(\"\")\n\n    with pytest.raises(ValueError) as exc:\n        gather_results, header = load_gather_results(\n            empty_csv, tax_assignments=tax_assign\n        )\n    assert f\"Cannot read gather results from '{empty_csv}'. Is file empty?\" in str(\n        exc.value\n    )\n\n\ndef test_load_taxonomy_csv():\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load([taxonomy_csv])\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345.1\",\n        \"GCF_009494285.1\",\n        \"GCF_013368705.1\",\n        \"GCF_003471795.1\",\n        \"GCF_000017325.1\",\n        \"GCF_000021665.1\",\n    ]\n    assert len(tax_assign) == 6  # should have read 6 rows\n\n\ndef test_load_taxonomy_csv_LIN():\n    taxonomy_csv = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n    tax_assign = MultiLineageDB.load([taxonomy_csv], lins=True)\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345.1\",\n        \"GCF_009494285.1\",\n        \"GCF_013368705.1\",\n        \"GCF_003471795.1\",\n        \"GCF_000017325.1\",\n        \"GCF_000021665.1\",\n    ]\n    # assert list(tax_assign.keys()) == [\"GCF_000010525.1\", \"GCF_000007365.1\", \"GCF_000007725.1\", \"GCF_000009605.1\", \"GCF_000021065.1\", \"GCF_000021085.1\"]\n    assert len(tax_assign) == 6  # should have read 6 rows\n    print(tax_assign.available_ranks)\n    assert tax_assign.available_ranks == {str(x) for x in range(0, 20)}\n\n\ndef test_load_taxonomy_csv_LIN_fail():\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    with pytest.raises(ValueError) as exc:\n        MultiLineageDB.load([taxonomy_csv], lins=True)\n    assert (\n        f\"'lin' column not found: cannot read LIN taxonomy assignments from {taxonomy_csv}.\"\n        in str(exc.value)\n    )\n\n\ndef test_load_taxonomy_csv_LIN_mismatch_in_taxfile(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.LIN-taxonomy.csv\")\n    mimatchLIN_csv = runtmp.output(\"mmLIN-taxonomy.csv\")\n    with open(mimatchLIN_csv, \"w\") as mm:\n        tax21 = []\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        for n, taxline in enumerate(tax):\n            if n == 2:  # add ;0 to a LIN\n                taxlist = taxline.split(\",\")\n                taxlist[1] += \";0\"  # add 21st position to LIN\n                tax21.append(\",\".join(taxlist))\n            else:\n                tax21.append(taxline)\n        mm.write(\"\\n\".join(tax21))\n    with pytest.raises(ValueError) as exc:\n        MultiLineageDB.load([mimatchLIN_csv], lins=True)\n    assert (\n        \"For taxonomic summarization, all LIN assignments must use the same number of LIN positions.\"\n        in str(exc.value)\n    )\n\n\ndef test_load_taxonomy_csv_gzip(runtmp):\n    # test loading a gzipped taxonomy csv file\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_gz = runtmp.output(\"tax.csv.gz\")\n\n    with gzip.open(tax_gz, \"wt\") as outfp:\n        with open(taxonomy_csv) as infp:\n            data = infp.read()\n        outfp.write(data)\n\n    tax_assign = MultiLineageDB.load([tax_gz])\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345.1\",\n        \"GCF_009494285.1\",\n        \"GCF_013368705.1\",\n        \"GCF_003471795.1\",\n        \"GCF_000017325.1\",\n        \"GCF_000021665.1\",\n    ]\n    assert len(tax_assign) == 6  # should have read 6 rows\n\n\ndef test_load_taxonomy_csv_split_id():\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    tax_assign = MultiLineageDB.load(\n        [taxonomy_csv], keep_full_identifiers=0, keep_identifier_versions=False\n    )\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345\",\n        \"GCF_009494285\",\n        \"GCF_013368705\",\n        \"GCF_003471795\",\n        \"GCF_000017325\",\n        \"GCF_000021665\",\n    ]\n    assert len(tax_assign) == 6  # should have read 6 rows\n\n\ndef test_load_taxonomy_csv_with_ncbi_id(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    upd_csv = runtmp.output(\"updated_taxonomy.csv\")\n    with open(upd_csv, \"w\") as new_tax:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        ncbi_id = \"ncbi_id after_space\"\n        fake_lin = [ncbi_id] + [\"sk\", \"phy\", \"cls\", \"ord\", \"fam\", \"gen\", \"sp\"]\n        ncbi_tax = \",\".join(fake_lin)\n        tax.append(ncbi_tax)\n        new_tax.write(\"\\n\".join(tax))\n\n    tax_assign = MultiLineageDB.load([upd_csv], keep_full_identifiers=True)\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345.1\",\n        \"GCF_009494285.1\",\n        \"GCF_013368705.1\",\n        \"GCF_003471795.1\",\n        \"GCF_000017325.1\",\n        \"GCF_000021665.1\",\n        \"ncbi_id after_space\",\n    ]\n    assert len(tax_assign) == 7  # should have read 7 rows\n\n\ndef test_load_taxonomy_csv_split_id_ncbi(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    upd_csv = runtmp.output(\"updated_taxonomy.csv\")\n    with open(upd_csv, \"w\") as new_tax:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        ncbi_id = \"ncbi_id after_space\"\n        fake_lin = [ncbi_id] + [\"sk\", \"phy\", \"cls\", \"ord\", \"fam\", \"gen\", \"sp\"]\n        ncbi_tax = \",\".join(fake_lin)\n        tax.append(ncbi_tax)\n        new_tax.write(\"\\n\".join(tax))\n\n    tax_assign = MultiLineageDB.load(\n        [upd_csv], keep_full_identifiers=False, keep_identifier_versions=False\n    )\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345\",\n        \"GCF_009494285\",\n        \"GCF_013368705\",\n        \"GCF_003471795\",\n        \"GCF_000017325\",\n        \"GCF_000021665\",\n        \"ncbi_id\",\n    ]\n    assert len(tax_assign) == 7  # should have read 7 rows\n\n    # check for non-sensical args.\n    with pytest.raises(ValueError):\n        tax_assign = MultiLineageDB.load(\n            [upd_csv], keep_full_identifiers=1, keep_identifier_versions=False\n        )\n\n\ndef test_load_taxonomy_csv_duplicate(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1] + \"FOO\")  # add first tax_assign again\n        print(tax[-1])\n        dup.write(\"\\n\".join(tax))\n\n    with pytest.raises(Exception) as exc:\n        MultiLineageDB.load([duplicated_csv])\n\n    assert \"cannot read taxonomy assignments\" in str(exc.value)\n    assert \"multiple lineages for identifier GCF_001881345.1\" in str(exc.value)\n\n\ndef test_load_taxonomy_csv_duplicate_force(runtmp):\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    duplicated_csv = runtmp.output(\"duplicated_taxonomy.csv\")\n    with open(duplicated_csv, \"w\") as dup:\n        tax = [x.rstrip() for x in Path(taxonomy_csv).read_text().splitlines()]\n        tax.append(tax[1])  # add first tax_assign again\n        dup.write(\"\\n\".join(tax))\n\n    # now force\n    tax_assign = MultiLineageDB.load([duplicated_csv], force=True)\n\n    print(\"taxonomy assignments: \\n\", tax_assign)\n    assert list(tax_assign.keys()) == [\n        \"GCF_001881345.1\",\n        \"GCF_009494285.1\",\n        \"GCF_013368705.1\",\n        \"GCF_003471795.1\",\n        \"GCF_000017325.1\",\n        \"GCF_000021665.1\",\n    ]\n\n\ndef test_format_for_krona_summarization():\n    \"\"\"test format for krona\"\"\"\n    # make gather results\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.2,\n            \"f_unique_to_query\": 0.2,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, summarize=True, single_query=True\n    )\n    kres, header = format_for_krona([q_res], \"superkingdom\", use_abund=False)\n    assert header == [\"fraction\", \"superkingdom\"]\n    print(\"krona_res: \", kres)\n    assert kres == [(0.5, \"a\"), (0.5, \"unclassified\")]\n    kres, header = format_for_krona([q_res], \"phylum\")\n    assert header == [\"fraction\", \"superkingdom\", \"phylum\"]\n    assert kres == [\n        (0.3, \"a\", \"c\"),\n        (0.2, \"a\", \"b\"),\n        (0.5, \"unclassified\", \"unclassified\"),\n    ]\n\n\ndef test_format_for_krona_classification():\n    \"\"\"test format for krona\"\"\"\n    # make gather results\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.2,\n            \"f_unique_to_query\": 0.2,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, classify=True, single_query=True\n    )\n    kres, header = format_for_krona([q_res], \"superkingdom\", classification=True)\n    assert header == [\"fraction\", \"superkingdom\"]\n    print(\"krona_res: \", kres)\n    assert kres == [(0.5, \"a\")]  # , (0.5, 'unclassified')]\n    kres, header = format_for_krona([q_res], \"phylum\", classification=True)\n    assert header == [\"fraction\", \"superkingdom\", \"phylum\"]\n    assert kres == [(0.3, \"a\", \"c\")]  # , (0.7, 'unclassified', 'unclassified')]\n\n\ndef test_format_for_krona_improper_rank():\n    \"\"\"test format for krona\"\"\"\n    # make gather results\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.2,\n            \"f_unique_to_query\": 0.2,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, summarize=True, single_query=True\n    )\n    with pytest.raises(ValueError) as exc:\n        format_for_krona([q_res], \"NotARank\")\n    print(str(exc))\n    assert \"Rank 'NotARank' not present in summarized ranks.\" in str(exc)\n\n\ndef test_format_for_krona_summarization_two_queries():\n    \"\"\"test format for krona with multiple queries (normalize by n_queries)\"\"\"\n    # make gather results\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.2,\n            \"f_unique_to_query\": 0.2,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n        {\n            \"query_name\": \"queryB\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.5,\n            \"f_unique_to_query\": 0.5,\n            \"unique_intersect_bp\": 50,\n        },\n    ]\n    gres = make_QueryTaxResults(gather_info=gather_results, taxD=taxD, summarize=True)\n    kres, header = format_for_krona(\n        list(gres.values()),\n        \"superkingdom\",\n    )\n    assert header == [\"fraction\", \"superkingdom\"]\n    print(\"krona_res: \", kres)\n    assert kres == [(0.5, \"a\"), (0.5, \"unclassified\")]\n    kres, header = format_for_krona(list(gres.values()), \"phylum\")\n    assert header == [\"fraction\", \"superkingdom\", \"phylum\"]\n    assert kres == [\n        (0.4, \"a\", \"c\"),\n        (0.1, \"a\", \"b\"),\n        (0.5, \"unclassified\", \"unclassified\"),\n    ]\n\n\ndef test_write_krona(runtmp):\n    \"\"\"test two matches, equal f_unique_to_query\"\"\"\n    krona_results = [(0.5, \"a\", \"b\", \"c\"), (0.5, \"a\", \"b\", \"d\")]\n    header = [\"fraction\", \"superkingdom\", \"phylum\", \"class\"]\n    outk = runtmp.output(\"outkrona.tsv\")\n    with open(outk, \"w\") as out_fp:\n        write_krona(header, krona_results, out_fp)\n\n    kr = [x.strip().split(\"\\t\") for x in Path(outk).read_text().splitlines()]\n    print(\"krona_results_from_file: \\n\", kr)\n    assert kr[0] == [\"fraction\", \"superkingdom\", \"phylum\", \"class\"]\n    assert kr[1] == [\"0.5\", \"a\", \"b\", \"c\"]\n    assert kr[2] == [\"0.5\", \"a\", \"b\", \"d\"]\n\n\ndef test_write_lineage_sample_frac(runtmp):\n    outfrac = runtmp.output(\"outfrac.csv\")\n    sample_names = [\"sample1\", \"sample2\"]\n    sk_linD = {\"a\": {\"sample1\": \"0.500\", \"sample2\": \"0.700\"}}\n    with open(outfrac, \"w\") as out_fp:\n        write_lineage_sample_frac(sample_names, sk_linD, out_fp)\n\n    frac_lines = [x.strip().split(\"\\t\") for x in Path(outfrac).read_text().splitlines()]\n    print(\"csv_lines: \", frac_lines)\n    assert frac_lines == [[\"lineage\", \"sample1\", \"sample2\"], [\"a\", \"0.500\", \"0.700\"]]\n\n    phy_linD = {\"a;b\": {\"sample1\": \"0.500\"}, \"a;c\": {\"sample2\": \"0.700\"}}\n    with open(outfrac, \"w\") as out_fp:\n        write_lineage_sample_frac(sample_names, phy_linD, out_fp)\n\n    frac_lines = [x.strip().split(\"\\t\") for x in Path(outfrac).read_text().splitlines()]\n    print(\"csv_lines: \", frac_lines)\n    assert frac_lines == [\n        [\"lineage\", \"sample1\", \"sample2\"],\n        [\"a;b\", \"0.500\", \"0\"],\n        [\"a;c\", \"0\", \"0.700\"],\n    ]\n\n\ndef test_write_lineage_sample_frac_format_lineage(runtmp):\n    outfrac = runtmp.output(\"outfrac.csv\")\n    sample_names = [\"sample1\", \"sample2\"]\n    sk_lineage = \"a\"\n    print(sk_lineage)\n    sk_linD = {sk_lineage: {\"sample1\": \"0.500\", \"sample2\": \"0.700\"}}\n    with open(outfrac, \"w\") as out_fp:\n        write_lineage_sample_frac(sample_names, sk_linD, out_fp)\n\n    frac_lines = [x.strip().split(\"\\t\") for x in Path(outfrac).read_text().splitlines()]\n    print(\"csv_lines: \", frac_lines)\n    assert frac_lines == [[\"lineage\", \"sample1\", \"sample2\"], [\"a\", \"0.500\", \"0.700\"]]\n\n    phy_lineage = \"a;b\"\n    print(phy_lineage)\n    phy2_lineage = \"a;c\"\n    print(phy2_lineage)\n    phy_linD = {phy_lineage: {\"sample1\": \"0.500\"}, phy2_lineage: {\"sample2\": \"0.700\"}}\n    with open(outfrac, \"w\") as out_fp:\n        write_lineage_sample_frac(sample_names, phy_linD, out_fp)\n\n    frac_lines = [x.strip().split(\"\\t\") for x in Path(outfrac).read_text().splitlines()]\n    print(\"csv_lines: \", frac_lines)\n    assert frac_lines == [\n        [\"lineage\", \"sample1\", \"sample2\"],\n        [\"a;b\", \"0.500\", \"0\"],\n        [\"a;c\", \"0\", \"0.700\"],\n    ]\n\n\ndef test_tax_multi_load_files(runtmp):\n    # test loading various good and bad files\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxonomy_csv2 = utils.get_test_data(\"tax/test-strain.taxonomy.csv\")\n    badcsv = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n\n    db = MultiLineageDB.load([taxonomy_csv])\n    assert len(db) == 6\n    assert \"strain\" not in db.available_ranks\n\n    db = MultiLineageDB.load([taxonomy_csv2])\n    assert len(db) == 6\n    assert \"strain\" in db.available_ranks\n    assert db[\"GCF_001881345.1\"][0].rank == \"superkingdom\"\n\n    # load a string rather than a list\n    with pytest.raises(TypeError):\n        MultiLineageDB.load(badcsv)\n\n    # load a bad CSV\n    with pytest.raises(ValueError):\n        MultiLineageDB.load([badcsv])\n\n    # load a directory\n    with pytest.raises(ValueError):\n        MultiLineageDB.load([runtmp.output(\"\")])\n\n    # file does not exist\n    with pytest.raises(ValueError):\n        MultiLineageDB.load([runtmp.output(\"no-such-file\")])\n\n\ndef test_tax_sql_load_new_file(runtmp):\n    # test loading a newer-format sql file with sourmash_internals table\n    taxonomy_db = utils.get_test_data(\"sqlite/test.taxonomy.db\")\n\n    db = MultiLineageDB.load([taxonomy_db])\n    print(list(db.keys()))\n    assert len(db) == 6\n    assert \"strain\" not in db.available_ranks\n    assert db[\"GCF_001881345\"][0].rank == \"superkingdom\"\n\n\ndef test_tax_multi_load_files_shadowed(runtmp):\n    # test loading various good and bad files\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxonomy_csv2 = utils.get_test_data(\"tax/test-strain.taxonomy.csv\")\n    taxonomy_db = utils.get_test_data(\"tax/test.taxonomy.db\")\n\n    db = MultiLineageDB.load(\n        [taxonomy_csv, taxonomy_csv2, taxonomy_db],\n        keep_full_identifiers=False,\n        keep_identifier_versions=False,\n    )\n    assert len(db.shadowed_identifiers()) == 6\n\n    # we should have everything including strain\n    assert set(RankLineageInfo().taxlist) == set(db.available_ranks)\n\n    db = MultiLineageDB.load(\n        [taxonomy_csv, taxonomy_db],\n        keep_full_identifiers=False,\n        keep_identifier_versions=False,\n    )\n    assert len(db.shadowed_identifiers()) == 6\n    assert set(RankLineageInfo().taxlist[:-1]) == set(db.available_ranks)\n\n\ndef test_tax_multi_save_files(runtmp, keep_identifiers, keep_versions):\n    # test save\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    if keep_identifiers and not keep_versions:\n        with pytest.raises(ValueError):\n            db = MultiLineageDB.load(\n                [taxonomy_csv],\n                keep_full_identifiers=keep_identifiers,\n                keep_identifier_versions=keep_versions,\n            )\n        return\n\n    db = MultiLineageDB.load(\n        [taxonomy_csv],\n        keep_full_identifiers=keep_identifiers,\n        keep_identifier_versions=keep_versions,\n    )\n\n    out_db = runtmp.output(\"out.db\")\n    out_csv = runtmp.output(\"out.csv\")\n    out2_csv = runtmp.output(\"out2.csv\")\n\n    # can't save to fp with sql\n    with open(out_csv, \"w\") as fp:\n        with pytest.raises(ValueError):\n            db.save(fp, \"sql\")\n\n    # these should all work...\n    with open(out_csv, \"w\") as fp:\n        db.save(fp, \"csv\")\n\n    db.save(out2_csv, \"csv\")\n    db.save(out_db, \"sql\")\n\n    # ...and be equal\n    db1 = db.load([out_db])\n    db2 = db.load([out_csv])\n    db3 = db.load([out2_csv])\n\n    def strip_strain(it):\n        for k, v in it:\n            if v[-1].rank == \"strain\":\n                v = v[:-1]\n            yield k, v\n\n    import pprint\n\n    db_items = list(strip_strain(db.items()))\n    db1_items = list(strip_strain(db1.items()))\n    db2_items = list(strip_strain(db2.items()))\n    db3_items = list(strip_strain(db3.items()))\n    pprint.pprint(db_items)\n    print(\"XXX\")\n    pprint.pprint(list(db1_items))\n    print(\"XXX\")\n    pprint.pprint(list(db2_items))\n\n    assert set(db_items) == set(db1_items)\n    assert set(db_items) == set(db2_items)\n    assert set(db_items) == set(db3_items)\n\n\ndef test_lineage_db_csv_load(runtmp):\n    # test LineageDB.load\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n    taxonomy_csv2 = utils.get_test_data(\"tax/test-strain.taxonomy.csv\")\n    badcsv = utils.get_test_data(\"tax/47+63_x_gtdb-rs202.gather.csv\")\n    badcsv2 = utils.get_test_data(\"tax/test-missing-ranks.taxonomy.csv\")\n\n    db = LineageDB.load(taxonomy_csv)\n    assert len(db) == 6\n    assert \"strain\" not in db.available_ranks\n\n    db = LineageDB.load(taxonomy_csv2)\n    assert len(db) == 6\n    assert \"strain\" in db.available_ranks\n\n    # load the wrong kind of csv\n    with pytest.raises(ValueError):\n        LineageDB.load(badcsv)\n\n    # load a bad CSV\n    with pytest.raises(ValueError):\n        LineageDB.load(badcsv2)\n\n    # load a directory\n    with pytest.raises(ValueError):\n        LineageDB.load(runtmp.output(\"\"))\n\n    # file does not exist\n    with pytest.raises(ValueError):\n        LineageDB.load(runtmp.output(\"no-such-file\"))\n\n    # construct a CSV with bad headers\n    with open(runtmp.output(\"xxx.csv\"), \"w\", newline=\"\") as fp:\n        fp.write(\"x,y,z\\n\")\n    with pytest.raises(ValueError):\n        LineageDB.load(runtmp.output(\"xxx.csv\"))\n\n\ndef test_lineage_db_sql_load(runtmp):\n    # test LineageDB_sqlite.load\n    taxonomy_db = utils.get_test_data(\"tax/test.taxonomy.db\")\n    taxonomy_csv = utils.get_test_data(\"tax/test.taxonomy.csv\")\n\n    db = LineageDB_Sqlite.load(taxonomy_db)\n    assert bool(db)\n    assert len(db) == 6\n    db.available_ranks\n    assert \"strain\" not in db.available_ranks\n    assert db[\"GCF_001881345\"][0].rank == \"superkingdom\"\n    with pytest.raises(KeyError):\n        db[\"foo\"]\n\n    # load any kind of CSV\n    with pytest.raises(ValueError):\n        LineageDB_Sqlite.load(taxonomy_csv)\n\n    # load a directory\n    with pytest.raises(ValueError):\n        LineageDB_Sqlite.load(runtmp.output(\"\"))\n\n    # file does not exist\n    with pytest.raises(ValueError):\n        LineageDB_Sqlite.load(runtmp.output(\"no-such-file\"))\n\n\ndef test_LineagePair():\n    lin = LineagePair(rank=\"rank1\", name=\"name1\")\n    print(lin)\n    assert lin.rank == \"rank1\"\n    assert lin.name == \"name1\"\n    assert lin.taxid is None\n\n\ndef test_LineagePair_1():\n    lin = LineagePair(rank=\"rank1\", name=\"name1\", taxid=1)\n    assert lin.rank == \"rank1\"\n    assert lin.name == \"name1\"\n    assert lin.taxid == 1\n    print(lin)\n\n\ndef test_BaseLineageInfo_init_empty():\n    ranks = [\"A\", \"B\", \"C\"]\n    taxinf = BaseLineageInfo(ranks=ranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\n        \"\",\n        \"\",\n        \"\",\n    ]  # this is a bit odd, but it's what preserves empty ranks...\n    print(taxinf.filled_lineage)\n    assert taxinf.filled_lineage == ()\n    assert taxinf.lowest_lineage_name is None\n    assert taxinf.lowest_lineage_taxid is None\n    assert taxinf.filled_ranks == ()\n    assert taxinf.name_at_rank(\"A\") is None\n    assert taxinf.lowest_rank is None\n    assert taxinf.display_lineage() == \"\"\n    assert taxinf.display_lineage(null_as_unclassified=True) == \"unclassified\"\n\n\ndef test_BaseLineageInfo_init_lineage_str():\n    x = \"a;b;c\"\n    ranks = [\"A\", \"B\", \"C\"]\n    taxinf = BaseLineageInfo(lineage_str=x, ranks=ranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"c\"]\n    print(taxinf.filled_lineage)\n    assert taxinf.filled_lineage == (\n        LineagePair(rank=\"A\", name=\"a\", taxid=None),\n        LineagePair(rank=\"B\", name=\"b\", taxid=None),\n        LineagePair(rank=\"C\", name=\"c\", taxid=None),\n    )\n    assert taxinf.lowest_lineage_name == \"c\"\n    assert taxinf.lowest_rank == \"C\"\n    assert taxinf.name_at_rank(\"A\") == \"a\"\n\n\ndef test_BaseLineageInfo_init_lineage_str_comma_sep():\n    x = \"a,b,c\"\n    ranks = [\"A\", \"B\", \"C\"]\n    taxinf = BaseLineageInfo(lineage_str=x, ranks=ranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"c\"]\n    print(taxinf.filled_lineage)\n    assert taxinf.lowest_lineage_name == \"c\"\n\n\ndef test_BaseLineageInfo_init_lineage_tups():\n    ranks = [\"A\", \"B\", \"C\"]\n    lin_tups = (LineagePair(rank=\"A\", name=\"a\"), LineagePair(rank=\"C\", name=\"b\"))\n    taxinf = BaseLineageInfo(lineage=lin_tups, ranks=ranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"\", \"b\"]\n\n\ndef test_BaseLineageInfo_init_lca_lineage_tups():\n    ranks = [\"A\", \"B\", \"C\"]\n    lin_tups = (LineagePair(rank=\"A\", name=\"a\"), LineagePair(rank=\"C\", name=\"b\"))\n    taxinf = BaseLineageInfo(lineage=lin_tups, ranks=ranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"\", \"b\"]\n\n\ndef test_BaseLineageInfo_init_no_ranks():\n    x = \"a;b;c\"\n    lin_tups = (\n        LineagePair(rank=\"rank2\", name=\"name1\"),\n        LineagePair(rank=\"rank1\", name=\"name1\"),\n    )\n    with pytest.raises(TypeError) as exc:\n        BaseLineageInfo(lineage_str=x)\n    print(exc)\n    assert \"__init__() missing 1 required positional argument: 'ranks'\" in str(exc)\n    with pytest.raises(TypeError) as exc:\n        BaseLineageInfo(lineage=lin_tups)\n    print(exc)\n    assert \"__init__() missing 1 required positional argument: 'ranks'\" in str(exc)\n\n\ndef test_BaseLineageInfo_init_with_wrong_ranks():\n    ranks = [\"A\", \"B\", \"C\"]\n    lin_tups = [LineagePair(rank=\"rank1\", name=\"name1\")]\n    with pytest.raises(ValueError) as exc:\n        BaseLineageInfo(lineage=lin_tups, ranks=ranks)\n    print(str(exc))\n    assert \"Rank 'rank1' not present in A, B, C\" in str(exc)\n\n\ndef test_BaseLineageInfo_init_not_lineagepair():\n    ranks = [\"A\", \"B\", \"C\"]\n    lin_tups = ((\"rank1\", \"name1\"),)\n    with pytest.raises(ValueError) as exc:\n        BaseLineageInfo(lineage=lin_tups, ranks=ranks)\n    print(str(exc))\n    assert \"is not tax_utils LineagePair\" in str(exc)\n\n\ndef test_RankLineageInfo_taxlist():\n    taxinf = RankLineageInfo()\n    taxranks = (\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n        \"strain\",\n    )\n    assert taxinf.taxlist == taxranks\n    assert taxinf.ascending_taxlist == taxranks[::-1]\n\n\ndef test_RankLineageInfo_init_lineage_str():\n    x = \"a;b;c\"\n    taxinf = RankLineageInfo(lineage_str=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"c\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_LINLineageInfo_init_empty():\n    taxinf = LINLineageInfo()\n    assert taxinf.n_lin_positions == 0\n    assert taxinf.zip_lineage() == []\n    assert taxinf.display_lineage() == \"\"\n    assert taxinf.filled_ranks == ()\n    assert taxinf.n_filled_pos == 0\n\n\ndef test_LINLineageInfo_init_n_pos():\n    n_pos = 5\n    taxinf = LINLineageInfo(n_lin_positions=n_pos)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.n_lin_positions == 5\n    assert taxinf.zip_lineage() == [\"\", \"\", \"\", \"\", \"\"]\n    assert taxinf.filled_ranks == ()\n    assert taxinf.n_filled_pos == 0\n\n\ndef test_LINLineageInfo_init_n_pos_and_lineage_str():\n    x = \"0;0;1\"\n    n_pos = 5\n    taxinf = LINLineageInfo(lineage_str=x, n_lin_positions=n_pos)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.n_lin_positions == 5\n    assert taxinf.zip_lineage() == [\"0\", \"0\", \"1\", \"\", \"\"]\n    assert taxinf.filled_ranks == (\"0\", \"1\", \"2\")\n    assert taxinf.n_filled_pos == 3\n\n\ndef test_LINLineageInfo_init_n_pos_and_lineage_str_fail():\n    x = \"0;0;1\"\n    n_pos = 2\n    with pytest.raises(ValueError) as exc:\n        LINLineageInfo(lineage_str=x, n_lin_positions=n_pos)\n    print(str(exc))\n    assert (\n        \"Provided 'n_lin_positions' has fewer positions than provided 'lineage_str'.\"\n        in str(exc)\n    )\n\n\ndef test_LINLineageInfo_init_lineage_str_only():\n    x = \"0,0,1\"\n    taxinf = LINLineageInfo(lineage_str=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.n_lin_positions == 3\n    assert taxinf.zip_lineage() == [\"0\", \"0\", \"1\"]\n    assert taxinf.filled_ranks == (\"0\", \"1\", \"2\")\n    assert taxinf.n_filled_pos == 3\n\n\ndef test_LINLineageInfo_init_not_lineagepair():\n    lin_tups = ((\"rank1\", \"name1\"),)\n    with pytest.raises(ValueError) as exc:\n        LINLineageInfo(lineage=lin_tups)\n    print(str(exc))\n    assert \"is not tax_utils LineagePair\" in str(exc)\n\n\ndef test_LINLineageInfo_init_lineagepair():\n    lin_tups = (\n        LineagePair(\"rank1\", \"name1\"),\n        LineagePair(\"rank2\", None),\n    )\n    taxinf = LINLineageInfo(lineage=lin_tups)\n    print(taxinf.lineage)\n    assert taxinf.n_lin_positions == 2\n    assert taxinf.zip_lineage() == [\"name1\", \"\"]\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"name1\"]\n    assert taxinf.filled_ranks == (\"rank1\",)\n    assert taxinf.ranks == (\"rank1\", \"rank2\")\n    assert taxinf.n_filled_pos == 1\n\n\ndef test_lca_LINLineageInfo_diff_n_pos():\n    x = \"0;0;1\"\n    y = \"0\"\n    lin1 = LINLineageInfo(lineage_str=x)\n    lin2 = LINLineageInfo(lineage_str=y)\n    assert lin1.is_compatible(lin2)\n    assert lin2.is_compatible(lin1)\n    lca_from_lin1 = lin1.find_lca(lin2)\n    lca_from_lin2 = lin2.find_lca(lin1)\n    assert lca_from_lin1 == lca_from_lin2\n    assert lca_from_lin1.display_lineage(truncate_empty=True) == \"0\"\n\n\ndef test_lca_LINLineageInfo_no_lca():\n    x = \"0;0;1\"\n    y = \"12;0;1\"\n    lin1 = LINLineageInfo(lineage_str=x)\n    lin2 = LINLineageInfo(lineage_str=y)\n    assert lin1.is_compatible(lin2)\n    assert lin2.is_compatible(lin1)\n    lca_from_lin1 = lin1.find_lca(lin2)\n    lca_from_lin2 = lin2.find_lca(lin1)\n    assert lca_from_lin1 == lca_from_lin2 is None\n\n\ndef test_lca_RankLineageInfo_no_lca():\n    x = \"a;b;c\"\n    y = \"d;e;f;g\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    assert lin1.is_compatible(lin2)\n    assert lin2.is_compatible(lin1)\n    lca_from_lin1 = lin1.find_lca(lin2)\n    lca_from_lin2 = lin2.find_lca(lin1)\n    assert lca_from_lin1 == lca_from_lin2 is None\n\n\ndef test_ICTVLineageInfo_ranks_input_ignored():\n    # check that ranks cannot be changed\n    taxinfo = ICTVRankLineageInfo(ranks=[\"one\", \"two\"])\n    assert taxinfo.taxlist == ICTV_RANKS\n\n\ndef test_ICTVLineageInfo_lineagedict_input():\n    # check that ranks cannot be changed\n    dummy_names = [f\"name{i}\" for i in range(1, len(ICTV_RANKS) + 1)]\n    input_lindict = dict(zip(ICTV_RANKS, dummy_names))\n    taxinfo = ICTVRankLineageInfo(lineage_dict=input_lindict)\n    print(taxinfo.display_lineage())\n    assert taxinfo.display_lineage() == \";\".join(dummy_names)\n    assert taxinfo.taxlist == ICTV_RANKS\n\n\ndef test_incompatibility_LINLineageInfo_RankLineageInfo():\n    x = \"a;b;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = LINLineageInfo(lineage_str=x)\n    assert not lin1.is_compatible(lin2)\n    assert not lin2.is_compatible(lin1)\n\n\ndef test_RankLineageInfo_init_lineage_str_with_ranks_as_list():\n    x = \"a;b;c\"\n    taxranks = [\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n    ]\n    taxinf = RankLineageInfo(lineage_str=x, ranks=taxranks)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"c\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_tups():\n    x = (\n        LineagePair(rank=\"superkingdom\", name=\"a\"),\n        LineagePair(rank=\"phylum\", name=\"b\"),\n    )\n    taxinf = RankLineageInfo(lineage=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_fail():\n    ranks = [\"A\", \"B\", \"C\"]\n    lin_tups = (LineagePair(rank=\"A\", name=\"a\"), LineagePair(rank=\"C\", name=\"b\"))\n    with pytest.raises(ValueError) as exc:\n        RankLineageInfo(ranks=ranks, lineage_dict=lin_tups)\n    print(str(exc))\n\n    assert \"is not dictionary\" in str(exc)\n\n\ndef test_RankLineageInfo_init_lineage_dict():\n    x = {\"rank1\": \"name1\", \"rank2\": \"name2\"}\n    taxinf = RankLineageInfo(lineage_dict=x, ranks=[\"rank1\", \"rank2\"])\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    assert taxinf.zip_lineage() == [\"name1\", \"name2\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_default_ranks():\n    x = {\"superkingdom\": \"a\", \"phylum\": \"b\"}\n    taxinf = RankLineageInfo(lineage_dict=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_withtaxpath():\n    x = {\"rank1\": \"name1\", \"rank2\": \"name2\", \"taxpath\": \"1|2\"}\n    taxinf = RankLineageInfo(lineage_dict=x, ranks=[\"rank1\", \"rank2\"])\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    print(\"zipped taxids: \", taxinf.zip_taxid())\n    assert taxinf.zip_lineage() == [\"name1\", \"name2\"]\n    assert taxinf.zip_taxid() == [\"1\", \"2\"]\n    assert taxinf.lowest_lineage_taxid == \"2\"\n    assert taxinf.lowest_lineage_name == \"name2\"\n\n\ndef test_RankLineageInfo_init_lineage_str_lineage_dict_test_eq():\n    x = \"a;b;c\"\n    ranks = [\"A\", \"B\", \"C\"]\n    rankD = {\"A\": \"a\", \"B\": \"b\", \"C\": \"c\"}\n    lin1 = RankLineageInfo(lineage_str=x, ranks=ranks)\n    lin2 = RankLineageInfo(lineage_dict=rankD, ranks=ranks)\n    assert lin1 == lin2\n\n\ndef test_RankLineageInfo_init_lineage_dict_missing_rank():\n    x = {\"superkingdom\": \"name1\", \"class\": \"name2\"}\n    taxinf = RankLineageInfo(lineage_dict=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    assert taxinf.zip_lineage() == [\"name1\", \"\", \"name2\", \"\", \"\", \"\", \"\", \"\"]\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"name1\", \"\", \"name2\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_missing_rank_with_taxpath():\n    x = {\"superkingdom\": \"name1\", \"class\": \"name2\", \"taxpath\": \"1||2\"}\n    taxinf = RankLineageInfo(lineage_dict=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    assert taxinf.zip_lineage() == [\"name1\", \"\", \"name2\", \"\", \"\", \"\", \"\", \"\"]\n    assert taxinf.zip_taxid() == [\"1\", \"\", \"2\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_name_taxpath_mismatch():\n    # If there's no name, we don't report the taxpath, because lineage is not \"filled\".\n    # Is this desired behavior?\n    x = {\"superkingdom\": \"name1\", \"taxpath\": \"1||2\"}\n    taxinf = RankLineageInfo(lineage_dict=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    assert taxinf.zip_lineage() == [\"name1\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"]\n    assert taxinf.zip_taxid() == [\"1\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_name_taxpath_missing_taxids():\n    # If there's no name, we don't report the taxpath, because lineage is not \"filled\".\n    # Is this desired behavior?\n    x = {\"superkingdom\": \"name1\", \"phylum\": \"name2\", \"class\": \"name3\", \"taxpath\": \"|2\"}\n    taxinf = RankLineageInfo(lineage_dict=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"lineage: \", taxinf.lineage)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    print(\"zipped taxids: \", taxinf.zip_taxid())\n    assert taxinf.zip_lineage() == [\"name1\", \"name2\", \"name3\", \"\", \"\", \"\", \"\", \"\"]\n    assert taxinf.zip_taxid() == [\"\", \"2\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_dict_taxpath_too_long():\n    x = {\"superkingdom\": \"name1\", \"class\": \"name2\", \"taxpath\": \"1||2||||||||||\"}\n    with pytest.raises(ValueError) as exc:\n        RankLineageInfo(lineage_dict=x)\n    print(str(exc))\n    assert \"Number of NCBI taxids (13) exceeds number of ranks (8)\" in str(exc)\n\n\ndef test_RankLineageInfo_init_lineage_str_lineage_dict_test_eq():\n    x = \"a;b;c\"\n    rankD = {\"superkingdom\": \"a\", \"phylum\": \"b\", \"class\": \"c\"}\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_dict=rankD)\n    print(\"lin1: \", lin1)\n    print(\"lin2: \", lin2)\n    assert lin1 == lin2\n\n\ndef test_RankLineageInfo_init_lineage_str_1_truncate():\n    x = \"a;b;c\"\n    taxinf = RankLineageInfo(lineage_str=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"a\", \"b\", \"c\"]\n\n\ndef test_RankLineageInfo_init_lineage_str_2():\n    x = \"a;b;;c\"\n    taxinf = RankLineageInfo(lineage_str=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"\", \"c\", \"\", \"\", \"\", \"\"]\n\n\ndef test_RankLineageInfo_init_lineage_str_2_truncate():\n    x = \"a;b;;c\"\n    taxinf = RankLineageInfo(lineage_str=x)\n    print(taxinf.lineage)\n    print(taxinf.lineage_str)\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"a\", \"b\", \"\", \"c\"]\n\n\ndef test_RankLineageInfo_init_lineage_with_incorrect_rank():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(\"NotARank\", \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    with pytest.raises(ValueError) as exc:\n        RankLineageInfo(lineage=x)\n    print(str(exc))\n    assert \"Rank 'NotARank' not present in \" in str(exc)\n\n\ndef test_zip_lineage_1():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    taxinf = RankLineageInfo(lineage=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"zipped lineage: \", taxinf.zip_lineage())\n    assert taxinf.zip_lineage() == [\"a\", \"b\", \"\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_zip_lineage_2():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    taxinf = RankLineageInfo(lineage=x)\n    print(\"ranks: \", taxinf.ranks)\n    print(\"zipped lineage: \", taxinf.zip_lineage(truncate_empty=True))\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"a\", \"b\"]\n\n\ndef test_zip_lineage_3():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    taxinf = RankLineageInfo(lineage=x)\n    assert taxinf.zip_lineage() == [\"a\", \"\", \"c\", \"\", \"\", \"\", \"\", \"\"]\n\n\ndef test_zip_lineage_3_truncate():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    taxinf = RankLineageInfo(lineage=x)\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"a\", \"\", \"c\"]\n\n\ndef test_zip_lineage_4():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"class\", \"c\")]\n    taxinf = RankLineageInfo(lineage=x)\n    assert taxinf.zip_lineage(truncate_empty=True) == [\"a\", \"\", \"c\"]\n\n\ndef test_display_lineage_1():\n    x = [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")]\n    taxinf = RankLineageInfo(lineage=x)\n    assert taxinf.display_lineage() == \"a;b\"\n\n\ndef test_display_lineage_2():\n    x = [\n        LineagePair(\"superkingdom\", \"a\"),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"c\"),\n    ]\n    taxinf = RankLineageInfo(lineage=x)\n    assert taxinf.display_lineage() == \"a;;c\"\n\n\ndef test_display_taxid_1():\n    x = [LineagePair(\"superkingdom\", \"a\", 1), LineagePair(\"phylum\", \"b\", 2)]\n    taxinf = RankLineageInfo(lineage=x)\n    print(taxinf)\n    assert taxinf.display_taxid() == \"1;2\"\n\n\ndef test_display_taxid_2():\n    x = [\n        LineagePair(\"superkingdom\", \"name1\", 1),\n        LineagePair(None, \"\"),\n        LineagePair(\"class\", \"name2\", 2),\n    ]\n    taxinf = RankLineageInfo(lineage=x)\n    print(taxinf)\n    assert taxinf.display_taxid() == \"1;;2\"\n\n\ndef test_is_lineage_match_1():\n    # basic behavior: match at order and above, but not at family or below.\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__e\")\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin1.lineage)\n    assert lin1.is_compatible(lin2)\n    assert lin1.is_lineage_match(lin2, \"superkingdom\")\n    assert lin2.is_lineage_match(lin1, \"superkingdom\")\n    assert lin1.is_lineage_match(lin2, \"phylum\")\n    assert lin2.is_lineage_match(lin1, \"phylum\")\n    assert lin1.is_lineage_match(lin2, \"class\")\n    assert lin2.is_lineage_match(lin1, \"class\")\n    assert lin1.is_lineage_match(lin2, \"order\")\n    assert lin2.is_lineage_match(lin1, \"order\")\n\n    assert not lin1.is_lineage_match(lin2, \"family\")\n    assert not lin2.is_lineage_match(lin1, \"family\")\n    assert not lin1.is_lineage_match(lin2, \"genus\")\n    assert not lin2.is_lineage_match(lin1, \"genus\")\n    assert not lin1.is_lineage_match(lin2, \"species\")\n    assert not lin2.is_lineage_match(lin1, \"species\")\n\n    lca_from_lin1 = lin1.find_lca(lin2)\n    print(lca_from_lin1.display_lineage())\n    lca_from_lin2 = lin2.find_lca(lin1)\n    assert lca_from_lin1 == lca_from_lin2\n    assert lca_from_lin1.display_lineage() == \"d__a;p__b;c__c;o__d\"\n\n\ndef test_is_lineage_match_2():\n    # match at family, and above, levels; no genus or species to match\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    assert lin1.is_compatible(lin2)\n    assert lin1.is_lineage_match(lin2, \"superkingdom\")\n    assert lin2.is_lineage_match(lin1, \"superkingdom\")\n    assert lin1.is_lineage_match(lin2, \"phylum\")\n    assert lin2.is_lineage_match(lin1, \"phylum\")\n    assert lin1.is_lineage_match(lin2, \"class\")\n    assert lin2.is_lineage_match(lin1, \"class\")\n    assert lin1.is_lineage_match(lin2, \"order\")\n    assert lin2.is_lineage_match(lin1, \"order\")\n    assert lin1.is_lineage_match(lin2, \"family\")\n    assert lin2.is_lineage_match(lin1, \"family\")\n\n    assert not lin1.is_lineage_match(lin2, \"genus\")\n    assert not lin2.is_lineage_match(lin1, \"genus\")\n    assert not lin1.is_lineage_match(lin2, \"species\")\n    assert not lin2.is_lineage_match(lin1, \"species\")\n\n    lca_from_lin1 = lin1.find_lca(lin2)\n    print(lca_from_lin1.display_lineage())\n    lca_from_lin2 = lin2.find_lca(lin1)\n    assert lca_from_lin1 == lca_from_lin2\n    assert lca_from_lin1.display_lineage() == \"d__a;p__b;c__c;o__d;f__f\"\n\n\ndef test_is_lineage_match_3():\n    # one lineage is empty\n    lin1 = RankLineageInfo()\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n\n    assert lin1.is_compatible(lin2)\n    assert not lin1.is_lineage_match(lin2, \"superkingdom\")\n    assert not lin2.is_lineage_match(lin1, \"superkingdom\")\n    assert not lin1.is_lineage_match(lin2, \"phylum\")\n    assert not lin2.is_lineage_match(lin1, \"phylum\")\n    assert not lin1.is_lineage_match(lin2, \"class\")\n    assert not lin2.is_lineage_match(lin1, \"class\")\n    assert not lin1.is_lineage_match(lin2, \"order\")\n    assert not lin2.is_lineage_match(lin1, \"order\")\n    assert not lin1.is_lineage_match(lin2, \"family\")\n    assert not lin2.is_lineage_match(lin1, \"family\")\n    assert not lin1.is_lineage_match(lin2, \"genus\")\n    assert not lin2.is_lineage_match(lin1, \"genus\")\n    assert not lin1.is_lineage_match(lin2, \"species\")\n    assert not lin2.is_lineage_match(lin1, \"species\")\n\n\ndef test_is_lineage_match_incorrect_ranks():\n    # test comparison with incompatible ranks\n    taxranks = (\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n        \"strain\",\n    )\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__e\", ranks=taxranks[::-1])\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin1.lineage)\n    assert not lin1.is_compatible(lin2)\n    with pytest.raises(ValueError) as exc:\n        lin1.is_lineage_match(lin2, \"superkingdom\")\n    print(str(exc))\n    assert \"Cannot compare lineages from taxonomies with different ranks.\" in str(exc)\n\n\ndef test_is_lineage_match_improper_rank():\n    # test comparison with incompatible ranks\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__e\")\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin1.lineage)\n    assert lin1.is_compatible(lin2)\n    with pytest.raises(ValueError) as exc:\n        lin1.is_lineage_match(lin2, \"NotARank\")\n    print(str(exc))\n    assert \"Desired Rank 'NotARank' not available for this lineage\" in str(exc)\n\n\ndef test_pop_to_rank_1():\n    # basic behavior - pop to order?\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d\")\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n\n    print(lin1)\n    popped = lin2.pop_to_rank(\"order\")\n    print(popped)\n    assert popped == lin1\n\n\ndef test_pop_to_rank_2():\n    # what if we're already above rank?\n    lin2 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin2.pop_to_rank(\"species\"))\n    assert lin2.pop_to_rank(\"species\") == lin2\n\n\ndef test_pop_to_rank_rank_not_avail():\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    with pytest.raises(ValueError) as exc:\n        lin1.pop_to_rank(\"NotARank\")\n    print(str(exc))\n    assert \"Desired Rank 'NotARank' not available for this lineage\" in str(exc)\n\n\ndef test_lineage_at_rank_norank():\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    with pytest.raises(TypeError) as exc:\n        lin1.lineage_at_rank()\n    print(str(exc))\n    assert \"lineage_at_rank() missing 1 required positional argument: 'rank'\" in str(\n        exc\n    )\n\n\ndef test_lineage_at_rank_rank_not_avail():\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    with pytest.raises(ValueError) as exc:\n        lin1.lineage_at_rank(\"NotARank\")\n    print(str(exc))\n    assert \"Desired Rank 'NotARank' not available for this lineage\" in str(exc)\n\n\ndef test_lineage_at_rank_1():\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin1.lineage_at_rank(\"superkingdom\"))\n\n    assert lin1.lineage_at_rank(\"superkingdom\") == (\n        LineagePair(rank=\"superkingdom\", name=\"d__a\", taxid=None),\n    )\n    print(lin1.lineage_at_rank(\"class\"))\n    assert lin1.lineage_at_rank(\"class\") == (\n        LineagePair(rank=\"superkingdom\", name=\"d__a\", taxid=None),\n        LineagePair(rank=\"phylum\", name=\"p__b\", taxid=None),\n        LineagePair(rank=\"class\", name=\"c__c\", taxid=None),\n    )\n\n\ndef test_lineage_at_rank_below_rank():\n    lin1 = RankLineageInfo(lineage_str=\"d__a;p__b;c__c;o__d;f__f\")\n    print(lin1.lineage_at_rank(\"superkingdom\"))\n    # if rank is not provided, we only return the filled lineage, to follow original pop_to_rank behavior.\n\n    print(lin1.lineage_at_rank(\"genus\"))\n    assert lin1.lineage_at_rank(\"genus\") == (\n        LineagePair(rank=\"superkingdom\", name=\"d__a\", taxid=None),\n        LineagePair(rank=\"phylum\", name=\"p__b\", taxid=None),\n        LineagePair(rank=\"class\", name=\"c__c\", taxid=None),\n        LineagePair(rank=\"order\", name=\"o__d\", taxid=None),\n        LineagePair(rank=\"family\", name=\"f__f\", taxid=None),\n    )\n\n\ndef test_TaxResult_get_match_lineage_1():\n    gA_tax = (\"gA\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n\n    gA = {\"name\": \"gA.1 name\"}\n    taxres = make_TaxResult(gA)\n    taxres.get_match_lineage(tax_assignments=taxD)\n    assert taxres.lineageInfo.display_lineage() == \"a;b;c\"\n\n\ndef test_AnnotateTaxResult_get_match_lineage_1():\n    gA_tax = (\"gA\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n\n    gA = {\"name\": \"gA.1 name\"}\n    taxres = AnnotateTaxResult(gA)\n    taxres.get_match_lineage(tax_assignments=taxD)\n    assert taxres.lineageInfo.display_lineage() == \"a;b;c\"\n    assert taxres.row_with_lineages() == {\"name\": \"gA.1 name\", \"lineage\": \"a;b;c\"}\n\n\ndef test_TaxResult_get_match_lineage_skip_ident():\n    gA_tax = (\"gA\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n\n    gA = {\"name\": \"gA.1 name\"}\n    taxres = make_TaxResult(gA)\n    taxres.get_match_lineage(tax_assignments=taxD, skip_idents=[\"gA\"])\n    print(\"skipped_ident?: \", taxres.skipped_ident)\n    print(\"missed_ident?: \", taxres.missed_ident)\n    assert taxres.skipped_ident == True\n    assert taxres.lineageInfo == RankLineageInfo()\n    assert taxres.lineageInfo.display_lineage() == \"\"\n    assert (\n        taxres.lineageInfo.display_lineage(null_as_unclassified=True) == \"unclassified\"\n    )\n\n\ndef test_TaxResult_get_match_lineage_missed_ident_fail_on_missing():\n    gA_tax = (\"gA.1\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n\n    gA = {\"name\": \"gA.1 name\"}\n    taxres = make_TaxResult(gA)\n    taxres.get_match_lineage(tax_assignments=taxD, skip_idents=[\"gB\"])\n    print(\"skipped_ident?: \", taxres.skipped_ident)\n    print(\"missed_ident?: \", taxres.missed_ident)\n    assert taxres.skipped_ident == False\n    assert taxres.missed_ident == True\n    assert taxres.lineageInfo == RankLineageInfo()\n    assert taxres.lineageInfo.display_lineage() == \"\"\n    assert (\n        taxres.lineageInfo.display_lineage(null_as_unclassified=True) == \"unclassified\"\n    )\n\n\ndef test_TaxResult_get_match_lineage_missed_ident_fail_on_missing():\n    gA_tax = (\"gA.1\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n\n    gA = {\"name\": \"gA.1 name\"}\n    taxres = make_TaxResult(gA)\n    with pytest.raises(ValueError) as exc:\n        taxres.get_match_lineage(\n            tax_assignments=taxD, skip_idents=[\"gB\"], fail_on_missing_taxonomy=True\n        )\n    print(str(exc))\n    assert \"Error: ident 'gA' is not in the taxonomy database.\" in str(exc)\n\n\ndef test_QueryTaxResult():\n    \"basic functionality: initialize and add a taxresult\"\n    tax_info = [(\"gA\", \"a;b;c\")]\n    taxD = make_mini_taxonomy(tax_info=tax_info)\n    taxres = make_TaxResult(taxD=taxD)\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    assert q_res.ranks == []\n    assert q_res.ascending_ranks == []\n    q_res.add_taxresult(taxres)\n    # check that new querytaxres is compatible with taxres\n    assert q_res.is_compatible(taxres)\n    # check that a few thngs were set properly and/or are not yet set.\n    assert q_res.query_name == \"q1\"\n    assert q_res.query_info.query_bp == 100\n    assert len(q_res.raw_taxresults) == 1\n    assert q_res.skipped_idents == set()\n    assert q_res.missed_idents == set()\n    assert q_res.summarized_lineage_results == {}\n    taxranks = (\n        \"superkingdom\",\n        \"phylum\",\n        \"class\",\n        \"order\",\n        \"family\",\n        \"genus\",\n        \"species\",\n        \"strain\",\n    )\n    assert q_res.ranks == taxranks\n    assert q_res.ascending_ranks == taxranks[::-1]\n\n\ndef test_QueryTaxResult_add_incompatible():\n    \"initialize and try to add incompatible taxresult\"\n    tax_info = [(\"gA\", \"a;b;c\")]\n    taxD = make_mini_taxonomy(tax_info=tax_info)\n    taxres = make_TaxResult(taxD=taxD)\n    taxres2 = make_TaxResult({\"query_name\": \"q2\"}, taxD=taxD)\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    # check that new querytaxres is compatible with taxres and not taxres2\n    assert q_res.is_compatible(taxres)\n    assert not q_res.is_compatible(taxres2)\n    q_res.add_taxresult(taxres)\n    with pytest.raises(ValueError) as exc:\n        q_res.add_taxresult(taxres2)\n    print(str(exc))\n    assert \"Error: Cannot add TaxResult: query information does not match.\" in str(exc)\n\n\ndef test_QueryTaxResult_add_without_tax_info():\n    \"initialize and add a taxresult with missed ident\"\n    taxres = make_TaxResult()  # do not add taxonomic info\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    print(\"attempted to add lineage info?: \", taxres.match_lineage_attempted)\n    with pytest.raises(ValueError) as exc:\n        q_res.add_taxresult(taxres)\n    print(str(exc))\n    assert (\n        \"Error: Cannot add TaxResult. Please use get_match_lineage() to add taxonomic lineage information first.\"\n        in str(exc)\n    )\n\n\ndef test_QueryTaxResult_add_skipped_ident():\n    \"initialize and add a taxresult with skipped ident\"\n    gA_tax = (\"gA\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n    taxres = make_TaxResult(taxD=taxD, skip_idents=[\"gA\"])\n    #    taxres.get_match_lineage(tax_assignments=taxD, skip_idents=['gA'])\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    q_res.add_taxresult(taxres)\n    assert len(q_res.skipped_idents) == 1\n    assert len(q_res.raw_taxresults) == 1\n    assert q_res.missed_idents == set()\n    assert q_res.summarized_lineage_results == {}\n\n\ndef test_QueryTaxResult_add_missed_ident():\n    \"initialize and add a taxresult with missed ident\"\n    gA_tax = (\"gB\", \"a;b;c\")\n    taxD = make_mini_taxonomy([gA_tax])\n    taxres = make_TaxResult(taxD=taxD)\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    # add taxonomic info to taxres\n    q_res.add_taxresult(taxres)\n    assert len(q_res.missed_idents) == 1\n    assert len(q_res.raw_taxresults) == 1\n    assert q_res.skipped_idents == set()\n    assert q_res.summarized_lineage_results == {}\n\n\ndef test_QueryTaxResult_track_missed_and_skipped():\n    \"make sure missed and skipped idents are being tracked\"\n    # make taxonomy\n    tax_info = [(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")]\n    taxD = make_mini_taxonomy(tax_info=tax_info)\n    # make results\n    taxres = make_TaxResult()\n    taxres2 = make_TaxResult({\"name\": \"gB\"})  # skipped\n    taxres3 = make_TaxResult({\"name\": \"gB\"})  # skipped\n    taxres4 = make_TaxResult({\"name\": \"gC\"})  # skipped\n    taxres5 = make_TaxResult({\"name\": \"gD\"})  # missed\n    taxres6 = make_TaxResult({\"name\": \"gE\"})  # missed\n    # initialize\n    q_res = QueryTaxResult(taxres.query_info)\n    # add taxonomic info to taxres, add to q_res\n    for n, tr in enumerate([taxres, taxres2, taxres3, taxres4, taxres5, taxres6]):\n        tr.get_match_lineage(tax_assignments=taxD, skip_idents=[\"gB\", \"gC\"])\n        print(\"num: \", n)\n        print(\"skipped?: \", tr.skipped_ident)\n        print(\"missed?: \", tr.missed_ident)\n        q_res.add_taxresult(tr)\n    assert len(q_res.raw_taxresults) == 6\n    print(q_res.n_skipped)\n    print(q_res.n_missed)\n    assert q_res.n_missed == 2\n    assert q_res.n_skipped == 3\n    assert \"gB\" in q_res.skipped_idents\n    assert len(q_res.skipped_idents) == 2\n    assert \"gD\" in q_res.missed_idents\n    assert q_res.summarized_lineage_results == {}\n\n\ndef test_QueryTaxResult_track_missed_and_skipped_using_fn():\n    \"make sure missed and skipped idents are being tracked. Same as above but use helper fn.\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\"name\": \"gB\"},\n        {\"name\": \"gB\"},\n        {\"name\": \"gC\"},\n        {\"name\": \"gD\"},\n        {\"name\": \"gE\"},\n    ]\n    gres = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, skip_idents=[\"gB\", \"gC\"]\n    )\n    # should have 6 results for default query 'q1'\n    print(gres.keys())\n    q_res = next(iter(gres.values()))\n    assert len(q_res.raw_taxresults) == 6\n    print(q_res.n_skipped)\n    print(q_res.n_missed)\n    assert q_res.n_missed == 2\n    assert q_res.n_skipped == 3\n    assert \"gB\" in q_res.skipped_idents\n    assert len(q_res.skipped_idents) == 2\n    assert \"gD\" in q_res.missed_idents\n    assert q_res.summarized_lineage_results == {}\n\n\ndef test_QueryTaxResult_summarize_up_ranks_1():\n    \"basic functionality: summarize up ranks\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    gres = make_QueryTaxResults(gather_info=gather_results, taxD=taxD)\n    assert len(gres.keys()) == 1\n    q_res = next(iter(gres.values()))\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    assert len(q_res.raw_taxresults) == 2\n    # print(q_res.sum_uniq_weighted.values())\n    # print(q_res.sum_uniq_weighted['superkingdom'])\n    assert list(q_res.sum_uniq_weighted.keys()) == [\"class\", \"phylum\", \"superkingdom\"]\n    assert q_res.sum_uniq_weighted[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.4)\n    }\n    assert q_res.sum_uniq_to_query[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_bp[\"superkingdom\"] == {RankLineageInfo(lineage_str=\"a\"): 40}\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.4)\n    }\n    assert q_res.sum_uniq_to_query[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_bp[\"phylum\"] == {RankLineageInfo(lineage_str=\"a;b\"): 40}\n    assert q_res.sum_uniq_weighted[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.2),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.2),\n    }\n    assert q_res.sum_uniq_to_query[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.1),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.1),\n    }\n    assert q_res.sum_uniq_bp[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): 20,\n        RankLineageInfo(lineage_str=\"a;b;d\"): 20,\n    }\n\n\ndef test_QueryTaxResult_summarize_up_ranks_2():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.1,\n            \"f_unique_to_query\": 0.05,\n            \"unique_intersect_bp\": 10,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    assert len(q_res.raw_taxresults) == 2\n    print(q_res.sum_uniq_weighted.values())\n    print(q_res.sum_uniq_weighted[\"superkingdom\"])\n    assert q_res.sum_uniq_weighted[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.3)\n    }\n    assert q_res.sum_uniq_to_query[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.15)\n    }\n    assert q_res.sum_uniq_bp[\"superkingdom\"] == {RankLineageInfo(lineage_str=\"a\"): 30}\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.3)\n    }\n    assert q_res.sum_uniq_to_query[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.15)\n    }\n    assert q_res.sum_uniq_bp[\"phylum\"] == {RankLineageInfo(lineage_str=\"a;b\"): 30}\n    assert q_res.sum_uniq_weighted[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.2),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.1),\n    }\n    assert q_res.sum_uniq_to_query[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.1),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.05),\n    }\n    assert q_res.sum_uniq_bp[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): 20,\n        RankLineageInfo(lineage_str=\"a;b;d\"): 10,\n    }\n\n\ndef test_QueryTaxResult_summarize_up_ranks_missing_lineage():\n    \"basic functionality: summarize up ranks\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    gres = make_QueryTaxResults(gather_info=gather_results, taxD=taxD)\n    assert len(gres.keys()) == 1\n    q_res = next(iter(gres.values()))\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    assert len(q_res.raw_taxresults) == 2\n    # print(q_res.sum_uniq_weighted.values())\n    print(q_res.sum_uniq_weighted[\"superkingdom\"])\n    assert q_res.sum_uniq_weighted[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"superkingdom\"] == {RankLineageInfo(lineage_str=\"a\"): 20}\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"phylum\"] == {RankLineageInfo(lineage_str=\"a;b\"): 20}\n    assert q_res.sum_uniq_weighted[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"class\"] == {RankLineageInfo(lineage_str=\"a;b;c\"): 20}\n\n\ndef test_QueryTaxResult_summarize_up_ranks_skipped_lineage():\n    \"basic functionality: summarize up ranks\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    gres = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, skip_idents=[\"gB\"]\n    )\n    assert len(gres.keys()) == 1\n    q_res = next(iter(gres.values()))\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    assert len(q_res.raw_taxresults) == 2\n    assert list(q_res.sum_uniq_weighted.keys()) == [\"class\", \"phylum\", \"superkingdom\"]\n    # print(q_res.sum_uniq_weighted.values())\n    print(q_res.sum_uniq_weighted[\"superkingdom\"])\n    assert q_res.sum_uniq_weighted[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"superkingdom\"] == {RankLineageInfo(lineage_str=\"a\"): 20}\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"phylum\"] == {RankLineageInfo(lineage_str=\"a;b\"): 20}\n    assert q_res.sum_uniq_weighted[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.2)\n    }\n    assert q_res.sum_uniq_to_query[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.1)\n    }\n    assert q_res.sum_uniq_bp[\"class\"] == {RankLineageInfo(lineage_str=\"a;b;c\"): 20}\n\n\ndef test_QueryTaxResult_summarize_up_ranks_perfect_match():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{\"f_unique_to_query\": 1.0}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    assert len(q_res.raw_taxresults) == 1\n    print(q_res.sum_uniq_weighted.values())\n    print(q_res.sum_uniq_to_query[\"superkingdom\"])\n    assert list(q_res.sum_uniq_to_query[\"superkingdom\"].values()) == [1.0]\n    assert \"gA\" in q_res.perfect_match\n\n\ndef test_QueryTaxResult_summarize_up_ranks_already_summarized():\n    \"summarize up ranks: error, already summarized\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{\"f_unique_to_query\": 1.0}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    with pytest.raises(ValueError) as exc:\n        q_res.summarize_up_ranks()\n    print(str(exc))\n    assert \"Error: already summarized\" in str(exc)\n\n\ndef test_QueryTaxResult_summarize_up_ranks_already_summarized_force():\n    \"summarize up ranks: already summarized but force\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.1,\n            \"f_unique_to_query\": 0.05,\n            \"unique_intersect_bp\": 10,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    q_res.summarize_up_ranks()\n    q_res.summarize_up_ranks(force_resummarize=True)\n    assert list(q_res.sum_uniq_weighted.keys()) == [\"class\", \"phylum\", \"superkingdom\"]\n\n    # check that all results are still good\n    assert len(q_res.raw_taxresults) == 2\n    assert q_res.sum_uniq_weighted[\"superkingdom\"] == {\n        RankLineageInfo(lineage_str=\"a\"): approx(0.3)\n    }\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.3)\n    }\n    assert q_res.sum_uniq_to_query[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.15)\n    }\n    assert q_res.sum_uniq_bp[\"phylum\"] == {RankLineageInfo(lineage_str=\"a;b\"): 30}\n    assert q_res.sum_uniq_to_query[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.1),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.05),\n    }\n    assert q_res.sum_uniq_weighted[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): approx(0.2),\n        RankLineageInfo(lineage_str=\"a;b;d\"): approx(0.1),\n    }\n    assert q_res.sum_uniq_bp[\"class\"] == {\n        RankLineageInfo(lineage_str=\"a;b;c\"): 20,\n        RankLineageInfo(lineage_str=\"a;b;d\"): 10,\n    }\n\n\ndef test_QueryTaxResult_summarize_up_ranks_single_rank():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.1,\n            \"f_unique_to_query\": 0.05,\n            \"unique_intersect_bp\": 10,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    q_res.summarize_up_ranks(single_rank=\"phylum\")\n    assert len(q_res.raw_taxresults) == 2\n    assert list(q_res.sum_uniq_weighted.keys()) == [\"phylum\"]\n    print(q_res.sum_uniq_weighted.keys())\n    print(q_res.sum_uniq_weighted.values())\n    print(q_res.sum_uniq_weighted[\"phylum\"])\n    assert q_res.sum_uniq_weighted[\"phylum\"] == {\n        RankLineageInfo(lineage_str=\"a;b\"): approx(0.3)\n    }\n    assert list(q_res.sum_uniq_to_query[\"phylum\"].values()) == [approx(0.15)]\n    assert list(q_res.sum_uniq_bp[\"phylum\"].values()) == [30]\n    assert q_res.summarized_ranks == [\"phylum\"]\n\n\ndef test_QueryTaxResult_summarize_up_ranks_single_rank_not_available():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.1,\n            \"f_unique_to_query\": 0.05,\n            \"unique_intersect_bp\": 10,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    with pytest.raises(ValueError) as exc:\n        q_res.summarize_up_ranks(single_rank=\"NotARank\")\n    print(str(exc))\n    assert (\n        \"Error: rank 'NotARank' not in available ranks (strain, species, genus, family, order, class, phylum, superkingdom)\"\n        in str(exc)\n    )\n\n\ndef test_QueryTaxResult_summarize_up_ranks_single_rank_not_filled():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [\n        {},\n        {\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.1,\n            \"f_unique_to_query\": 0.05,\n            \"unique_intersect_bp\": 10,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    with pytest.raises(ValueError) as exc:\n        q_res.summarize_up_ranks(single_rank=\"species\")\n    print(str(exc))\n    assert \"Error: rank 'species' was not available for any matching lineages.\" in str(\n        exc\n    )\n\n\ndef test_QueryTaxResult_build_summarized_result_1():\n    \"basic functionality: build summarized_result\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.build_summarized_result()\n    print(q_res.summarized_lineage_results.keys())\n    sk = [\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.2,\n            f_weighted_at_rank=0.4,\n            lineage=RankLineageInfo(lineage_str=\"a\"),\n            bp_match_at_rank=40,\n            query_ani_at_rank=approx(0.95, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.8,\n            f_weighted_at_rank=0.6,\n            lineage=RankLineageInfo(),\n            bp_match_at_rank=60,\n            query_ani_at_rank=None,\n        ),\n    ]\n    print(q_res.summarized_lineage_results[\"superkingdom\"])\n    assert q_res.summarized_lineage_results[\"superkingdom\"] == sk\n    print(q_res.summarized_lineage_results[\"phylum\"])\n    phy = [\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.2,\n            f_weighted_at_rank=0.4,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            bp_match_at_rank=40,\n            query_ani_at_rank=approx(0.95, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.8,\n            f_weighted_at_rank=0.6,\n            lineage=RankLineageInfo(),\n            bp_match_at_rank=60,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"phylum\"] == phy\n    print(q_res.summarized_lineage_results[\"class\"])\n    cl = [\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.1,\n            f_weighted_at_rank=0.2,\n            lineage=RankLineageInfo(lineage_str=\"a;b;c\"),\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.93, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.1,\n            f_weighted_at_rank=0.2,\n            lineage=RankLineageInfo(lineage_str=\"a;b;d\"),\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.93, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.8,\n            f_weighted_at_rank=0.6,\n            lineage=RankLineageInfo(),\n            bp_match_at_rank=60,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"class\"] == cl\n\n    assert q_res.total_f_weighted[\"phylum\"] == approx(0.4)\n    assert q_res.total_f_classified[\"class\"] == approx(0.2)\n    assert q_res.total_bp_classified[\"superkingdom\"] == 40\n\n\ndef test_QueryTaxResult_build_summarized_result_2():\n    \"\"\"test two queries, build summarized result for each\"\"\"\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n    # make gather results\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.5,\n            \"f_unique_to_query\": 0.5,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.4,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n        {\n            \"query_name\": \"queryB\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    gres = make_QueryTaxResults(gather_info=gather_results, taxD=taxD)\n\n    for query_name, q_res in gres.items():\n        q_res.build_summarized_result()  # summarize and build result\n        sk = q_res.summarized_lineage_results[\"superkingdom\"]\n        phy = q_res.summarized_lineage_results[\"phylum\"]\n        assert len(sk) == 2\n        assert sk[0].lineage == RankLineageInfo(lineage_str=\"a\")\n        print(phy)\n        if query_name == \"queryA\":\n            # check superkingdom results\n            assert sk[0].fraction == approx(0.8)\n            assert sk[0].f_weighted_at_rank == approx(0.9)\n            assert sk[0].bp_match_at_rank == 80\n            assert sk[1].fraction == approx(0.2)\n            assert sk[1].f_weighted_at_rank == approx(0.1)\n            assert sk[1].bp_match_at_rank == 20\n            assert sk[1].lineage == RankLineageInfo()\n            # check phylum results\n            assert len(phy) == 3\n            assert phy[0].fraction == approx(0.5)\n            assert phy[0].f_weighted_at_rank == approx(0.5)\n            assert phy[0].bp_match_at_rank == 50\n            assert phy[0].lineage == RankLineageInfo(lineage_str=\"a;b\")\n            assert phy[1].fraction == approx(0.3)\n            assert phy[1].f_weighted_at_rank == approx(0.4)\n            assert phy[1].bp_match_at_rank == 30\n            assert phy[1].lineage == RankLineageInfo(lineage_str=\"a;c\")\n            assert phy[2].fraction == approx(0.2)\n            assert phy[2].f_weighted_at_rank == approx(0.1)\n            assert phy[2].bp_match_at_rank == 20\n            assert phy[2].lineage == RankLineageInfo()\n        if query_name == \"queryB\":\n            # check superkingdom results\n            assert sk[0].fraction == approx(0.3)\n            assert sk[0].f_weighted_at_rank == approx(0.3)\n            assert sk[0].bp_match_at_rank == 30\n            assert sk[1].fraction == approx(0.7)\n            assert sk[1].f_weighted_at_rank == approx(0.7)\n            assert sk[1].bp_match_at_rank == 70\n            assert sk[1].lineage == RankLineageInfo()\n            # check phylum results\n            assert len(phy) == 2\n            assert phy[0].fraction == approx(0.3)\n            assert phy[0].f_weighted_at_rank == approx(0.3)\n            assert phy[0].bp_match_at_rank == 30\n            assert phy[0].lineage == RankLineageInfo(lineage_str=\"a;c\")\n            assert phy[1].fraction == approx(0.7)\n            assert phy[1].f_weighted_at_rank == approx(0.7)\n            assert phy[1].bp_match_at_rank == 70\n            assert phy[1].lineage == RankLineageInfo()\n\n\ndef test_QueryTaxResult_build_summarized_result_missing_lineage():\n    \"build summarized_result with missing lineage\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.build_summarized_result()\n    print(q_res.summarized_lineage_results.keys())\n    print(q_res.summarized_lineage_results[\"superkingdom\"])\n\n    sk = [\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.1,\n            f_weighted_at_rank=0.2,\n            lineage=RankLineageInfo(lineage_str=\"a\"),\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"superkingdom\"] == sk\n    print(q_res.summarized_lineage_results[\"phylum\"])\n    phy = [\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.1,\n            f_weighted_at_rank=0.2,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"phylum\"] == phy\n    print(q_res.summarized_lineage_results[\"class\"])\n    cl = [\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b;c\"),\n            f_weighted_at_rank=0.2,\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"class\"] == cl\n\n    assert q_res.total_f_weighted[\"phylum\"] == approx(0.2)\n    assert q_res.total_f_classified[\"class\"] == approx(0.1)\n    assert q_res.total_bp_classified[\"superkingdom\"] == 20\n\n\ndef test_QueryTaxResult_build_summarized_result_skipped_lineage():\n    \"build summarized_result with skipped lineage\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, skip_idents=[\"gB\"]\n    )\n    q_res.build_summarized_result()\n    print(q_res.summarized_lineage_results.keys())\n    print(q_res.summarized_lineage_results[\"superkingdom\"])\n\n    sk = [\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.1,\n            f_weighted_at_rank=0.2,\n            lineage=RankLineageInfo(lineage_str=\"a\"),\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"superkingdom\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"superkingdom\"] == sk\n    print(q_res.summarized_lineage_results[\"phylum\"])\n    phy = [\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b\"),\n            f_weighted_at_rank=0.2,\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"phylum\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"phylum\"] == phy\n    print(q_res.summarized_lineage_results[\"class\"])\n    cl = [\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.1,\n            lineage=RankLineageInfo(lineage_str=\"a;b;c\"),\n            f_weighted_at_rank=0.2,\n            bp_match_at_rank=20,\n            query_ani_at_rank=approx(0.928, rel=1e-2),\n        ),\n        SummarizedGatherResult(\n            rank=\"class\",\n            fraction=0.9,\n            lineage=RankLineageInfo(),\n            f_weighted_at_rank=0.8,\n            bp_match_at_rank=80,\n            query_ani_at_rank=None,\n        ),\n    ]\n    assert q_res.summarized_lineage_results[\"class\"] == cl\n\n    assert q_res.total_f_weighted[\"phylum\"] == approx(0.2)\n    assert q_res.total_f_classified[\"class\"] == approx(0.1)\n    assert q_res.total_bp_classified[\"superkingdom\"] == 20\n\n\ndef test_QueryTaxResult_build_summarized_result_over100percent():\n    \"summarize up ranks: different values\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\", \"f_unique_to_query\": 0.95}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    # now summarize up the ranks\n    assert len(q_res.raw_taxresults) == 2\n    with pytest.raises(ValueError) as exc:\n        q_res.build_summarized_result()\n    print(str(exc))\n    assert (\n        \"Summarized fraction is > 100% of the query! This should not be possible\"\n        in str(exc)\n    )\n\n\ndef test_build_summarized_result_rank_fail_not_available_resummarize():\n    \"build classification result\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.summarize_up_ranks(\"superkingdom\")\n    with pytest.raises(ValueError) as exc:\n        q_res.build_summarized_result(single_rank=\"order\")\n    print(str(exc))\n    assert \"Error: rank 'order' not in summarized rank(s), superkingdom\" in str(exc)\n\n\ndef test_aggregate_by_lineage_at_rank_noabund():\n    \"\"\"test aggregate by lineage at rank\"\"\"\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n    # make gather results\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.5,\n            \"f_unique_to_query\": 0.4,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    summarized, all_queries = aggregate_by_lineage_at_rank(\n        [q_res], rank=\"phylum\", by_query=False, use_abund=False\n    )\n    print(summarized)\n    assert summarized == {\"a;b\": 0.4, \"a;c\": 0.3, \"unclassified\": approx(0.3, rel=1e-2)}\n    assert all_queries == [\"queryA\"]\n\n\ndef test_aggregate_by_lineage_at_rank_abund():\n    \"\"\"test aggregate by lineage at rank\"\"\"\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n    # make gather results\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.5,\n            \"f_unique_to_query\": 0.4,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    summarized, all_queries = aggregate_by_lineage_at_rank(\n        [q_res], rank=\"phylum\", by_query=False, use_abund=True\n    )\n    print(summarized)\n    assert summarized == {\"a;b\": 0.5, \"a;c\": 0.3, \"unclassified\": approx(0.2, rel=1e-2)}\n    assert all_queries == [\"queryA\"]\n\n\ndef test_aggregate_by_lineage_at_rank_not_available():\n    \"\"\"test aggregate by lineage at rank\"\"\"\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n    # make gather results\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.5,\n            \"f_unique_to_query\": 0.4,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    with pytest.raises(ValueError) as exc:\n        aggregate_by_lineage_at_rank([q_res], rank=\"species\", by_query=False)\n    print(str(exc))\n    assert \"Error: rank 'species' not available for aggregation.\" in str(exc)\n\n\ndef test_aggregate_by_lineage_at_rank_by_query():\n    \"\"\"test two queries, aggregate by lineage at rank by query\"\"\"\n    # make mini taxonomy\n    gA_tax = (\"gA\", \"a;b\")\n    gB_tax = (\"gB\", \"a;c\")\n    taxD = make_mini_taxonomy([gA_tax, gB_tax])\n    # make gather results\n    gather_results = [\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gA\",\n            \"f_unique_weighted\": 0.2,\n            \"f_unique_to_query\": 0.2,\n            \"unique_intersect_bp\": 50,\n        },\n        {\n            \"query_name\": \"queryA\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.3,\n            \"f_unique_to_query\": 0.3,\n            \"unique_intersect_bp\": 30,\n        },\n        {\n            \"query_name\": \"queryB\",\n            \"name\": \"gB\",\n            \"f_unique_weighted\": 0.4,\n            \"f_unique_to_query\": 0.4,\n            \"unique_intersect_bp\": 30,\n        },\n    ]\n    gres = make_QueryTaxResults(gather_info=gather_results, taxD=taxD, summarize=True)\n    # check by query\n    summarized, all_queries = aggregate_by_lineage_at_rank(\n        gres.values(), rank=\"superkingdom\", by_query=True\n    )\n    print(summarized)\n    assert summarized == {\n        \"a\": {\"queryA\": 0.5, \"queryB\": 0.4},\n        \"unclassified\": {\"queryA\": 0.5, \"queryB\": 0.6},\n    }\n    # assert summarized == {'a': {'queryA': approx(0.1, rel=1e-2), 'queryB': 0.7}}\n    assert all_queries == [\"queryA\", \"queryB\"]\n    summarized, all_queries = aggregate_by_lineage_at_rank(\n        gres.values(), rank=\"phylum\", by_query=True\n    )\n    print(summarized)\n    assert summarized == {\n        \"a;c\": {\"queryA\": 0.3, \"queryB\": 0.4},\n        \"a;b\": {\"queryA\": 0.2},\n        \"unclassified\": {\"queryA\": 0.5, \"queryB\": 0.6},\n    }\n\n\ndef test_build_classification_result_containment_threshold_fail():\n    \"classification result: improper containment threshold\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(containment_threshold=1.2)\n    print(str(exc))\n    assert \"Containment threshold must be between 0 and 1 (input value: 1.2).\" in str(\n        exc\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(containment_threshold=-0.1)\n    print(str(exc))\n    assert \"Containment threshold must be between 0 and 1 (input value: -0.1).\" in str(\n        exc\n    )\n\n\ndef test_build_classification_result_containment_threshold():\n    \"basic functionality: build classification result using containment threshold\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n\n    q_res.build_classification_result(containment_threshold=0.1)\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n    q_res.build_classification_result(containment_threshold=0.2)\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"phylum\"\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.4\n    assert q_res.classification_result.fraction == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 40\n    assert q_res.classification_result.query_ani_at_rank == approx(0.95, rel=1e-2)\n\n    q_res.build_classification_result(containment_threshold=1.0)\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"below_threshold\"\n    assert q_res.classification_result.rank == \"superkingdom\"\n    assert q_res.classification_result.fraction == 0.2\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.4\n    assert q_res.classification_result.bp_match_at_rank == 40\n    assert q_res.classification_result.query_ani_at_rank == approx(0.95, rel=1e-2)\n\n\ndef test_build_classification_result_ani_threshold():\n    \"basic functionality: build classification result\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n\n    q_res.build_classification_result(ani_threshold=0.92)\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n    q_res.build_classification_result(ani_threshold=0.94)  # should classify at phylum\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"phylum\"\n    assert q_res.classification_result.fraction == 0.2\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.4\n    assert q_res.classification_result.bp_match_at_rank == 40\n    assert q_res.classification_result.query_ani_at_rank == approx(0.95, rel=1e-2)\n\n    # superk result, but doesn't meet ANI threshold\n    q_res.build_classification_result(ani_threshold=0.96)\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"below_threshold\"\n    assert q_res.classification_result.rank == \"superkingdom\"\n    assert q_res.classification_result.fraction == 0.2\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.4\n    assert q_res.classification_result.bp_match_at_rank == 40\n    assert q_res.classification_result.query_ani_at_rank == approx(0.95, rel=1e-2)\n\n\ndef test_build_classification_result_ani_threshold_fail():\n    \"classification result: improper ANI threshold\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(ani_threshold=1.2)\n    print(str(exc))\n    assert \"ANI threshold must be between 0 and 1 (input value: 1.2).\" in str(exc)\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(ani_threshold=-0.1)\n    print(str(exc))\n    assert \"ANI threshold must be between 0 and 1 (input value: -0.1).\" in str(exc)\n\n\ndef test_build_classification_result_rank_fail_not_filled():\n    \"classification result: rank not available (wasn't filled in tax lineage matches)\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(rank=\"order\")\n    print(str(exc))\n    assert \"Error: rank 'order' was not available for any matching lineages.\" in str(\n        exc\n    )\n\n\ndef test_build_classification_result_rank_fail_not_available_resummarize():\n    \"classification result: rank not available (wasn't summarized)\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.summarize_up_ranks(\"superkingdom\")\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(rank=\"order\")\n    print(str(exc))\n    assert \"Error: rank 'order' not in summarized rank(s), superkingdom\" in str(exc)\n\n\ndef test_build_classification_result_rank_fail_not_available():\n    \"classification result: rank not available\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.build_classification_result(rank=\"NotARank\")\n    print(str(exc))\n    assert (\n        \"Error: rank 'NotARank' not in available ranks (strain, species, genus, family, order, class, phylum, superkingdom)\"\n        in str(exc)\n    )\n\n\ndef test_build_classification_result_rank_containment_threshold():\n    \"classification result - rank and containment threshold (default)\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n\n    q_res.build_classification_result(rank=\"class\")\n    print(\"classif: \", q_res.classification_result)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n    q_res.build_classification_result(rank=\"class\", containment_threshold=0.4)\n    assert q_res.classification_result.status == \"below_threshold\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n\ndef test_build_classification_result_rank_ani_threshold():\n    \"classification result with rank and ANI threshold\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n\n    q_res.build_classification_result(rank=\"class\", ani_threshold=0.92)\n    assert q_res.classification_result.status == \"match\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n    q_res.build_classification_result(rank=\"class\", ani_threshold=0.95)\n    assert q_res.classification_result.status == \"below_threshold\"\n    assert q_res.classification_result.rank == \"class\"\n    assert q_res.classification_result.fraction == 0.1\n    assert q_res.classification_result.lineage == RankLineageInfo(lineage_str=\"a;b;c\")\n    assert q_res.classification_result.f_weighted_at_rank == 0.2\n    assert q_res.classification_result.bp_match_at_rank == 20\n    assert q_res.classification_result.query_ani_at_rank == approx(0.928, rel=1e-2)\n\n\ndef test_krona_classified():\n    \"basic functionality: build classification result using containment threshold\"\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.build_classification_result()\n    assert q_res.krona_classified is None\n    q_res.build_classification_result(rank=\"phylum\")  # , force_resummarize=True)\n    print(q_res.krona_classified)\n    assert q_res.krona_classified == (0.2, \"a\", \"b\")\n    assert q_res.krona_unclassified == (0.8, \"unclassified\", \"unclassified\")\n    q_res.build_classification_result(rank=\"superkingdom\")\n    print(q_res.krona_classified)\n    assert q_res.krona_classified == (0.2, \"a\")\n    assert q_res.krona_unclassified == (0.8, \"unclassified\")\n    # make sure this goes back to None if we reclassify without rank\n    q_res.build_classification_result()\n    assert q_res.krona_classified is None\n    assert q_res.krona_unclassified is None\n    assert q_res.krona_header == []\n\n\ndef test_make_krona_header_basic():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    phy_header = [\"fraction\", \"superkingdom\", \"phylum\"]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.build_classification_result(rank=\"phylum\")\n    print(q_res.krona_classified)\n    print(q_res.krona_header)\n    assert q_res.krona_header == phy_header\n    hd = q_res.make_krona_header(\"phylum\")\n    print(\"header: \", hd)\n    assert hd == phy_header\n\n\ndef test_make_krona_header_basic_1():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    class_header = [\"fraction\", \"superkingdom\", \"phylum\", \"class\"]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True\n    )\n    q_res.build_classification_result(rank=\"class\")\n    assert q_res.krona_header == class_header\n    hd = q_res.make_krona_header(min_rank=\"class\")\n    print(\"header: \", hd)\n    assert hd == class_header\n\n\ndef test_make_krona_header_fail():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.make_krona_header(\"order\")\n    assert \"Rank 'order' not present in summarized ranks.\" in str(exc.value)\n    with pytest.raises(ValueError) as exc:\n        q_res.make_krona_header(\"NotARank\")\n    assert \"Rank 'NotARank' not present in summarized ranks.\" in str(exc.value)\n\n\ndef test_make_human_summary():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    hs = q_res.make_human_summary(display_rank=\"superkingdom\")\n    print(hs)\n    assert hs == [\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.800\",\n            \"fraction_p\": \"80.0%\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"60.0%\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": \"-    \",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.200\",\n            \"fraction_p\": \"20.0%\",\n            \"lineage\": \"a\",\n            \"f_weighted_at_rank\": \"40.0%\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"94.9%\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n    ]\n\n\ndef test_make_human_summary_2():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    hs = q_res.make_human_summary(display_rank=\"phylum\")\n    print(hs)\n    assert hs == [\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.800\",\n            \"fraction_p\": \"80.0%\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"60.0%\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": \"-    \",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.200\",\n            \"fraction_p\": \"20.0%\",\n            \"lineage\": \"a;b\",\n            \"f_weighted_at_rank\": \"40.0%\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"94.9%\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n    ]\n\n\ndef test_make_human_summary_classification():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results,\n        taxD=taxD,\n        single_query=True,\n        classify=True,\n        classify_rank=\"superkingdom\",\n    )\n    hs = q_res.make_human_summary(display_rank=\"superkingdom\", classification=True)\n    print(hs)\n    assert hs == [\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.200\",\n            \"fraction_p\": \"20.0%\",\n            \"lineage\": \"a\",\n            \"f_weighted_at_rank\": \"40.0%\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"94.9%\",\n            \"status\": \"match\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        }\n    ]\n\n\ndef test_make_human_summary_classification_2():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results,\n        taxD=taxD,\n        single_query=True,\n        classify=True,\n        classify_rank=\"phylum\",\n    )\n    hs = q_res.make_human_summary(display_rank=\"phylum\", classification=True)\n    print(hs)\n    assert hs == [\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.200\",\n            \"fraction_p\": \"20.0%\",\n            \"lineage\": \"a;b\",\n            \"f_weighted_at_rank\": \"40.0%\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"94.9%\",\n            \"status\": \"match\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        }\n    ]\n\n\ndef test_make_full_summary():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    header, fs = q_res.make_full_summary()\n    assert header == [\n        \"query_name\",\n        \"rank\",\n        \"fraction\",\n        \"lineage\",\n        \"query_md5\",\n        \"query_filename\",\n        \"f_weighted_at_rank\",\n        \"bp_match_at_rank\",\n        \"query_ani_at_rank\",\n        \"total_weighted_hashes\",\n    ]\n    print(fs)\n    assert fs == [\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.2\",\n            \"lineage\": \"a\",\n            \"f_weighted_at_rank\": \"0.4\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": approx(0.949, rel=1e-3),\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.8\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.6\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.2\",\n            \"lineage\": \"a;b\",\n            \"f_weighted_at_rank\": \"0.4\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": approx(0.949, rel=1e-3),\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.8\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.6\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.1\",\n            \"lineage\": \"a;b;c\",\n            \"f_weighted_at_rank\": \"0.2\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": approx(0.928, rel=1e-3),\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.1\",\n            \"lineage\": \"a;b;d\",\n            \"f_weighted_at_rank\": \"0.2\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": approx(0.928, rel=1e-3),\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.8\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.6\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n    ]\n\n    header, fs = q_res.make_full_summary(limit_float=True)\n    assert header == [\n        \"query_name\",\n        \"rank\",\n        \"fraction\",\n        \"lineage\",\n        \"query_md5\",\n        \"query_filename\",\n        \"f_weighted_at_rank\",\n        \"bp_match_at_rank\",\n        \"query_ani_at_rank\",\n        \"total_weighted_hashes\",\n    ]\n    print(fs)\n    assert fs == [\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.200\",\n            \"lineage\": \"a\",\n            \"f_weighted_at_rank\": \"0.400\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"0.949\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"superkingdom\",\n            \"fraction\": \"0.800\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.600\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.200\",\n            \"lineage\": \"a;b\",\n            \"f_weighted_at_rank\": \"0.400\",\n            \"bp_match_at_rank\": \"40\",\n            \"query_ani_at_rank\": \"0.949\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"phylum\",\n            \"fraction\": \"0.800\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.600\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.100\",\n            \"lineage\": \"a;b;c\",\n            \"f_weighted_at_rank\": \"0.200\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": \"0.928\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.100\",\n            \"lineage\": \"a;b;d\",\n            \"f_weighted_at_rank\": \"0.200\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": \"0.928\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.800\",\n            \"lineage\": \"unclassified\",\n            \"f_weighted_at_rank\": \"0.600\",\n            \"bp_match_at_rank\": \"60\",\n            \"query_ani_at_rank\": None,\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n            \"total_weighted_hashes\": \"0\",\n        },\n    ]\n\n\ndef test_make_full_summary_summarization_fail():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=False\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.make_full_summary()\n    print(str(exc))\n    assert \"not summarized yet\" in str(exc)\n\n\ndef test_make_full_summary_classification():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, classify=True\n    )\n    header, fs = q_res.make_full_summary(classification=True)\n    assert header == [\n        \"query_name\",\n        \"status\",\n        \"rank\",\n        \"fraction\",\n        \"lineage\",\n        \"query_md5\",\n        \"query_filename\",\n        \"f_weighted_at_rank\",\n        \"bp_match_at_rank\",\n        \"query_ani_at_rank\",\n    ]\n    print(fs)\n    assert fs == [\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.1\",\n            \"lineage\": \"a;b;c\",\n            \"f_weighted_at_rank\": \"0.2\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": approx(0.928, rel=1e-3),\n            \"status\": \"match\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n        }\n    ]\n\n\ndef test_make_full_summary_classification_limit_float():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, classify=True\n    )\n    header, fs = q_res.make_full_summary(classification=True, limit_float=True)\n    assert header == [\n        \"query_name\",\n        \"status\",\n        \"rank\",\n        \"fraction\",\n        \"lineage\",\n        \"query_md5\",\n        \"query_filename\",\n        \"f_weighted_at_rank\",\n        \"bp_match_at_rank\",\n        \"query_ani_at_rank\",\n    ]\n    print(fs)\n    assert fs == [\n        {\n            \"rank\": \"class\",\n            \"fraction\": \"0.100\",\n            \"lineage\": \"a;b;c\",\n            \"f_weighted_at_rank\": \"0.200\",\n            \"bp_match_at_rank\": \"20\",\n            \"query_ani_at_rank\": \"0.928\",\n            \"status\": \"match\",\n            \"query_name\": \"q1\",\n            \"query_md5\": \"md5\",\n            \"query_filename\": \"query_fn\",\n        }\n    ]\n\n\ndef test_make_full_summary_classification_fail():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.make_full_summary(classification=True)\n    print(str(exc))\n    assert \"not classified yet\" in str(exc)\n\n\ndef test_make_kreport_results():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;c;d;e;f;g\")])\n    # need to go down to species to check that `num_bp_assigned` is happening correctly\n    gather_results = [\n        {\"total_weighted_hashes\": 100},\n        {\"name\": \"gB\", \"total_weighted_hashes\": 100},\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    header, krepD = q_res.make_kreport_results()\n    print(krepD)\n    assert krepD == [\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"D\",\n            \"sci_name\": \"a\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"60\",\n            \"percent_containment\": \"60.00\",\n            \"num_bp_contained\": \"60\",\n            \"sci_name\": \"unclassified\",\n            \"rank_code\": \"U\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"P\",\n            \"sci_name\": \"b\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"C\",\n            \"sci_name\": \"c\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"O\",\n            \"sci_name\": \"d\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"F\",\n            \"sci_name\": \"e\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"G\",\n            \"sci_name\": \"f\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"20\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"S\",\n            \"sci_name\": \"g\",\n            \"ncbi_taxid\": None,\n        },\n    ]\n\n\ndef test_make_kreport_results_with_taxids():\n    taxD = make_mini_taxonomy_with_taxids(\n        [(\"gA\", \"a;b;c\", \"1;2;3\"), (\"gB\", \"a;b;c;d;e;f;g\", \"1;2;3;4;5;6;7\")]\n    )\n    print(taxD)\n    # need to go down to species to check that `num_bp_assigned` is happening correctly\n    gather_results = [\n        {\"total_weighted_hashes\": 100},\n        {\"name\": \"gB\", \"total_weighted_hashes\": 100},\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    header, krepD = q_res.make_kreport_results()\n    print(krepD)\n    assert krepD == [\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"D\",\n            \"sci_name\": \"a\",\n            \"ncbi_taxid\": \"1\",\n        },\n        {\n            \"num_bp_assigned\": \"60\",\n            \"percent_containment\": \"60.00\",\n            \"num_bp_contained\": \"60\",\n            \"sci_name\": \"unclassified\",\n            \"rank_code\": \"U\",\n            \"ncbi_taxid\": None,\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"P\",\n            \"sci_name\": \"b\",\n            \"ncbi_taxid\": \"2\",\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"40.00\",\n            \"num_bp_contained\": \"40\",\n            \"rank_code\": \"C\",\n            \"sci_name\": \"c\",\n            \"ncbi_taxid\": \"3\",\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"O\",\n            \"sci_name\": \"d\",\n            \"ncbi_taxid\": \"4\",\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"F\",\n            \"sci_name\": \"e\",\n            \"ncbi_taxid\": \"5\",\n        },\n        {\n            \"num_bp_assigned\": \"0\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"G\",\n            \"sci_name\": \"f\",\n            \"ncbi_taxid\": \"6\",\n        },\n        {\n            \"num_bp_assigned\": \"20\",\n            \"percent_containment\": \"20.00\",\n            \"num_bp_contained\": \"20\",\n            \"rank_code\": \"S\",\n            \"sci_name\": \"g\",\n            \"ncbi_taxid\": \"7\",\n        },\n    ]\n\n\ndef test_make_kreport_results_fail():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=False\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.make_kreport_results()\n    print(str(exc))\n    assert \"not summarized yet\" in str(exc)\n\n\ndef test_make_kreport_results_fail_pre_v450():\n    taxD = make_mini_taxonomy([(\"gA\", \"a;b;c\"), (\"gB\", \"a;b;d\")])\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    with pytest.raises(ValueError) as exc:\n        q_res.make_kreport_results()\n    print(str(exc))\n    assert (\n        \"cannot produce 'kreport' format from gather results before sourmash v4.5.0\"\n        in str(exc)\n    )\n\n\ndef test_make_cami_results_with_taxids():\n    taxD = make_mini_taxonomy_with_taxids(\n        [(\"gA\", \"a;b;c\", \"1;2;3\"), (\"gB\", \"a;b;c;d;e;f;g\", \"1;2;3;4;5;6;7\")]\n    )\n    print(taxD)\n    # need to go down to species to check that `num_bp_assigned` is happening correctly\n    gather_results = [\n        {\"total_weighted_hashes\": 100},\n        {\"name\": \"gB\", \"total_weighted_hashes\": 100},\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    header, camires = q_res.make_cami_bioboxes()\n    print(camires)\n    assert camires == [\n        [\"1\", \"superkingdom\", \"1\", \"a\", \"40.00\"],\n        [\"2\", \"phylum\", \"1|2\", \"a|b\", \"40.00\"],\n        [\"3\", \"class\", \"1|2|3\", \"a|b|c\", \"40.00\"],\n        [\"4\", \"order\", \"1|2|3|4\", \"a|b|c|d\", \"20.00\"],\n        [\"5\", \"family\", \"1|2|3|4|5\", \"a|b|c|d|e\", \"20.00\"],\n        [\"6\", \"genus\", \"1|2|3|4|5|6\", \"a|b|c|d|e|f\", \"20.00\"],\n        [\"7\", \"species\", \"1|2|3|4|5|6|7\", \"a|b|c|d|e|f|g\", \"20.00\"],\n    ]\n\n\ndef test_make_cami_results_with_taxids_missing_ranks():\n    taxD = make_mini_taxonomy_with_taxids(\n        [(\"gA\", \"a;b;c\", \"1;2;3\"), (\"gB\", \"a;b;c;d;;f;\", \"1;2;3;4;;6;\")]\n    )\n    print(taxD)\n    # need to go down to species to check that `num_bp_assigned` is happening correctly\n    gather_results = [\n        {\"total_weighted_hashes\": 100},\n        {\"name\": \"gB\", \"total_weighted_hashes\": 100},\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results, taxD=taxD, single_query=True, summarize=True\n    )\n    header, camires = q_res.make_cami_bioboxes()\n    print(camires)\n    assert camires == [\n        [\"1\", \"superkingdom\", \"1\", \"a\", \"40.00\"],\n        [\"2\", \"phylum\", \"1|2\", \"a|b\", \"40.00\"],\n        [\"3\", \"class\", \"1|2|3\", \"a|b|c\", \"40.00\"],\n        [\"4\", \"order\", \"1|2|3|4\", \"a|b|c|d\", \"20.00\"],\n        [\"\", \"family\", None, \"a|b|c|d|\", \"20.00\"],\n        [\"6\", \"genus\", \"1|2|3|4||6\", \"a|b|c|d||f\", \"20.00\"],\n        [\"\", \"species\", None, \"a|b|c|d||f|\", \"20.00\"],\n    ]\n\n\ndef test_make_lingroup_results():\n    taxD = make_mini_taxonomy(\n        [(\"gA\", \"1;0;0\"), (\"gB\", \"1;0;1\"), (\"gC\", \"1;1;0\")], LIN=True\n    )\n    print(taxD)\n    lingroupD = {\"1\": \"lg1\", \"1;0\": \"lg2\", \"1;1\": \"lg3\"}\n    print(lingroupD)\n    gather_results = [\n        {\"total_weighted_hashes\": 100},\n        {\"name\": \"gB\", \"total_weighted_hashes\": 100},\n        {\"name\": \"gC\", \"total_weighted_hashes\": 100},\n    ]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results,\n        taxD=taxD,\n        single_query=True,\n        summarize=True,\n        LIN=True,\n    )\n    print(q_res.summarized_lineage_results)\n\n    header, lgD = q_res.make_lingroup_results(LINgroupsD=lingroupD)\n    print(header)\n    assert header == [\"name\", \"lin\", \"percent_containment\", \"num_bp_contained\"]\n    # order may change, just check that each lg entry is present in list of results\n    lg1 = {\n        \"percent_containment\": \"60.00\",\n        \"num_bp_contained\": \"60\",\n        \"lin\": \"1\",\n        \"name\": \"lg1\",\n    }\n    lg2 = {\n        \"percent_containment\": \"40.00\",\n        \"num_bp_contained\": \"40\",\n        \"lin\": \"1;0\",\n        \"name\": \"lg2\",\n    }\n    lg3 = {\n        \"percent_containment\": \"20.00\",\n        \"num_bp_contained\": \"20\",\n        \"lin\": \"1;1\",\n        \"name\": \"lg3\",\n    }\n    assert lg1 in lgD\n    assert lg2 in lgD\n    assert lg3 in lgD\n\n\ndef test_make_lingroup_results_fail_pre_v450():\n    taxD = make_mini_taxonomy(\n        [(\"gA\", \"1;0;0\"), (\"gB\", \"1;0;1\"), (\"gC\", \"1;1;0\")], LIN=True\n    )\n    gather_results = [{}, {\"name\": \"gB\"}]\n    q_res = make_QueryTaxResults(\n        gather_info=gather_results,\n        taxD=taxD,\n        single_query=True,\n        summarize=True,\n        LIN=True,\n    )\n    lingroupD = {\"1\": \"lg1\", \"1;0\": \"lg2\", \"1;1\": \"lg3\"}\n    with pytest.raises(ValueError) as exc:\n        q_res.make_lingroup_results(lingroupD)\n    print(str(exc))\n    assert (\n        \"cannot produce 'lingroup' format from gather results before sourmash v4.5.0\"\n        in str(exc)\n    )\n\n\ndef test_read_lingroups(runtmp):\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n        out.write(\"1,lg1\\n\")\n        out.write(\"1;0,lg2\\n\")\n        out.write(\"1;1,lg3\\n\")\n    lgD = read_lingroups(lg_file)\n\n    assert lgD == {\"1\": \"lg1\", \"1;0\": \"lg2\", \"1;1\": \"lg3\"}\n\n\ndef test_read_lingroups_empty_file(runtmp):\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"\")\n    with pytest.raises(ValueError) as exc:\n        read_lingroups(lg_file)\n    print(str(exc))\n    assert f\"Cannot read lingroups from '{lg_file}'. Is file empty?\" in str(exc)\n\n\ndef test_read_lingroups_only_header(runtmp):\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"lin,name\\n\")\n    with pytest.raises(ValueError) as exc:\n        read_lingroups(lg_file)\n    print(str(exc))\n    assert f\"No lingroups loaded from {lg_file}\" in str(exc)\n\n\ndef test_read_lingroups_bad_header(runtmp):\n    lg_file = runtmp.output(\"test.lg.csv\")\n    with open(lg_file, \"w\") as out:\n        out.write(\"LINgroup_pfx,LINgroup_nm\\n\")\n    with pytest.raises(ValueError) as exc:\n        read_lingroups(lg_file)\n    print(str(exc))\n    assert f\"'{lg_file}' must contain the following columns: 'name', 'lin'.\" in str(exc)\n\n\ndef test_LineageTree_init():\n    x = \"a;b\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    print(lin1)\n    tree = LineageTree([lin1])\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {LineagePair(\"phylum\", \"b\"): {}}\n    }\n\n\ndef test_LineageTree_init_mult():\n    x = \"a;b\"\n    y = \"a;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    print(lin1)\n    from sourmash.tax.tax_utils import LineageTree\n\n    tree = LineageTree([lin1, lin2])\n    assert tree.tree == {\n        LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None): {\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None): {},\n            LineagePair(rank=\"phylum\", name=\"c\", taxid=None): {},\n        }\n    }\n\n\ndef test_LineageTree_init_and_add_lineage():\n    x = \"a;b\"\n    y = \"a;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    print(lin1)\n    from sourmash.tax.tax_utils import LineageTree\n\n    tree = LineageTree([lin1])\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {LineagePair(\"phylum\", \"b\"): {}}\n    }\n    tree.add_lineage(lin2)\n    assert tree.tree == {\n        LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None): {\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None): {},\n            LineagePair(rank=\"phylum\", name=\"c\", taxid=None): {},\n        }\n    }\n\n\ndef test_LineageTree_init_and_add_lineages():\n    x = \"a;b\"\n    y = \"a;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    print(lin1)\n    from sourmash.tax.tax_utils import LineageTree\n\n    tree = LineageTree([lin1])\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {LineagePair(\"phylum\", \"b\"): {}}\n    }\n    tree.add_lineages([lin2])\n    assert tree.tree == {\n        LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None): {\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None): {},\n            LineagePair(rank=\"phylum\", name=\"c\", taxid=None): {},\n        }\n    }\n\n\ndef test_build_tree_RankLineageInfo():\n    x = \"a;b\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    print(lin1)\n    tree = LineageTree([lin1])\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {LineagePair(\"phylum\", \"b\"): {}}\n    }\n\n\ndef test_build_tree_LINLineageInfo():\n    x = \"0;3\"\n    lin1 = LINLineageInfo(lineage_str=x)\n    print(lin1)\n    tree = LineageTree([lin1])\n    assert tree.tree == {LineagePair(\"0\", \"0\"): {LineagePair(\"1\", \"3\"): {}}}\n\n\ndef test_build_tree_2():\n    x = \"a;b\"\n    y = \"a;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    print(lin1)\n    print(lin2)\n    tree = LineageTree([lin1, lin2])\n\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {\n            LineagePair(\"phylum\", \"b\"): {},\n            LineagePair(\"phylum\", \"c\"): {},\n        }\n    }\n\n\ndef test_build_tree_2_LineagePairs():\n    # build tree from LineagePairs\n    tree = LineageTree(\n        [\n            [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"b\")],\n            [LineagePair(\"superkingdom\", \"a\"), LineagePair(\"phylum\", \"c\")],\n        ]\n    )\n\n    assert tree.tree == {\n        LineagePair(\"superkingdom\", \"a\"): {\n            LineagePair(\"phylum\", \"b\"): {},\n            LineagePair(\"phylum\", \"c\"): {},\n        }\n    }\n\n\ndef test_build_tree_3():\n    # empty phylum name\n    x = \"a;\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    tree = LineageTree([lin1])\n    assert tree.tree == {LineagePair(\"superkingdom\", \"a\"): {}}\n\n\ndef test_build_tree_3_LineagePairs():\n    # empty phylum name: LineagePair input\n    lin1 = (\n        LineagePair(\"superkingdom\", \"a\", \"3\"),\n        LineagePair(\"phylum\", \"\", \"\"),\n    )\n    tree = LineageTree([lin1])\n    assert tree.tree == {LineagePair(\"superkingdom\", \"a\", \"3\"): {}}\n\n\ndef test_build_tree_5():\n    with pytest.raises(ValueError):\n        LineageTree([])\n\n\ndef test_build_tree_5b():\n    with pytest.raises(ValueError):\n        LineageTree(\"\")\n\n\ndef test_build_tree_iterable():\n    with pytest.raises(ValueError) as exc:\n        LineageTree(RankLineageInfo())\n    assert (\n        \"Must pass in an iterable containing LineagePair or LineageInfo objects\"\n        in str(exc)\n    )\n\n\ndef test_find_lca():\n    x = \"a;b\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    tree = LineageTree([lin1])\n    lca = tree.find_lca()\n\n    assert lca == (\n        (\n            LineagePair(\"superkingdom\", \"a\"),\n            LineagePair(\"phylum\", \"b\"),\n        ),\n        0,\n    )\n\n\ndef test_find_lca_LineagePairs():\n    tree = LineageTree([[LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2\")]])\n    lca = tree.find_lca()\n\n    assert lca == (\n        (\n            LineagePair(\"rank1\", \"name1\"),\n            LineagePair(\"rank2\", \"name2\"),\n        ),\n        0,\n    )\n\n\ndef test_find_lca_2():\n    x = \"a;b\"\n    y = \"a;c\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n\n    tree = LineageTree([lin1, lin2])\n    lca = tree.find_lca()\n\n    assert lca == ((LineagePair(\"superkingdom\", \"a\"),), 2)\n\n\ndef test_find_lca_LIN():\n    x = \"5;6\"\n    y = \"5;10\"\n    lin1 = LINLineageInfo(lineage_str=x)\n    lin2 = LINLineageInfo(lineage_str=y)\n\n    tree = LineageTree([lin1, lin2])\n    lca = tree.find_lca()\n\n    assert lca == ((LineagePair(\"0\", \"5\"),), 2)\n    print(lca)\n\n\ndef test_find_lca_2_LineagePairs():\n    tree = LineageTree(\n        [\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2a\")],\n            [LineagePair(\"rank1\", \"name1\"), LineagePair(\"rank2\", \"name2b\")],\n        ]\n    )\n    lca = tree.find_lca()\n\n    assert lca == ((LineagePair(\"rank1\", \"name1\"),), 2)\n\n\ndef test_find_lca_3():\n    lin1 = RankLineageInfo(lineage_str=\"a;b;c\")\n    lin2 = RankLineageInfo(lineage_str=\"a;b\")\n\n    tree = LineageTree([lin1, lin2])\n    lca, reason = tree.find_lca()\n    assert lca == lin1.filled_lineage  # find most specific leaf node\n    print(lca)\n\n\ndef test_build_tree_with_initial():\n    x = \"a;b;c\"\n    y = \"a;b;d\"\n    z = \"a;e\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    lin3 = RankLineageInfo(lineage_str=z)\n\n    tree = LineageTree([lin1, lin2])\n    lca = tree.find_lca()\n\n    print(lca)\n    assert lca == (\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n        ),\n        2,\n    )\n    tree.add_lineages([lin3])\n    lca2 = tree.find_lca()\n    print(lca2)\n    assert lca2 == ((LineagePair(\"superkingdom\", \"a\"),), 2)\n\n\ndef test_LineageTree_find_ordered_paths():\n    x = \"a;b;c\"\n    y = \"a;b;d\"\n    z = \"a;e\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    lin3 = RankLineageInfo(lineage_str=z)\n\n    tree = LineageTree([lin1, lin2, lin3])\n    paths = tree.ordered_paths()\n\n    print(paths)\n    assert paths == [\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"e\", taxid=None),\n        ),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n            LineagePair(rank=\"class\", name=\"c\", taxid=None),\n        ),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n            LineagePair(rank=\"class\", name=\"d\", taxid=None),\n        ),\n    ]\n\n\ndef test_LineageTree_find_ordered_paths_include_internal():\n    x = \"a;b;c\"\n    y = \"a;b;d\"\n    z = \"a;e\"\n    lin1 = RankLineageInfo(lineage_str=x)\n    lin2 = RankLineageInfo(lineage_str=y)\n    lin3 = RankLineageInfo(lineage_str=z)\n\n    tree = LineageTree([lin1, lin2, lin3])\n    paths = tree.ordered_paths(include_internal=True)\n\n    print(paths)\n\n    assert paths == [\n        (LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"e\", taxid=None),\n        ),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n        ),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n            LineagePair(rank=\"class\", name=\"c\", taxid=None),\n        ),\n        (\n            LineagePair(rank=\"superkingdom\", name=\"a\", taxid=None),\n            LineagePair(rank=\"phylum\", name=\"b\", taxid=None),\n            LineagePair(rank=\"class\", name=\"d\", taxid=None),\n        ),\n    ]\n"
  },
  {
    "path": "tests/test_test_framework.py",
    "content": "import pytest\nimport sourmash_tst_utils as utils\nfrom sourmash_tst_utils import SourmashCommandFailed\n\n\ndef test_failed_sourmash_exception(runtmp):\n    with pytest.raises(SourmashCommandFailed):\n        runtmp.sourmash(\"\")\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nisolated_build = true\nskip_missing_interpreters = true\nenv_list =\n    py312,\n    py313,\n    py311,\n    coverage,\n    docs,\n    package_description\n    fix_lint,\n    hypothesis,\n    khmer,\n    khmer_master\nmin_version = 3.27\n\n[testenv]\ndescription = run the tests with pytest under {basepython}\ndeps =\n    pip>=19.3.1\nextras =\n    storage\n    test\ncommands =\n    pytest \\\n      --cov \"{envsitepackagesdir}/sourmash\" \\\n      --cov-config \"{toxinidir}/tox.ini\" \\\n      --cov-report= \\\n      --junitxml {toxworkdir}/junit.{envname}.xml \\\n      {posargs:doc tests}\npackage = wheel\npass_env =\n    TOXENV\n    CURL_CA_BUNDLE\n    http_proxy\n    https_proxy\n    no_proxy\n    REQUESTS_CA_BUNDLE\n    SSL_CERT_FILE\n    PYTEST_*\n    PIP_CACHE_DIR\n    CI\n    PYTHONDEVMODE\n    PYTHONTRACEMALLOC\n    LIBCLANG_PATH\n    BINDGEN_EXTRA_CLANG_ARGS\n    NIX_LD\nset_env =\n    PIP_DISABLE_VERSION_CHECK = 1\n    COVERAGE_FILE = {env:COVERAGE_FILE:{toxworkdir}/.coverage.{envname}}\n    VIRTUALENV_NO_DOWNLOAD = 1\n    PIP_EXTRA_INDEX_URL = https://antocuni.github.io/pypy-wheels/manylinux2010\nwheel_build_env = .pkg\n\n[testenv:.pkg]\npass_env =\n    LIBCLANG_PATH\n    BINDGEN_EXTRA_CLANG_ARGS\n    NIX_*\n\n[testenv:pypy3]\ndeps =\n    pip>=19.3.1\n    psutil<=5.6.7\n\n[testenv:hypothesis]\ncommands =\n    pytest \\\n      --cov \"{envsitepackagesdir}/sourmash\" \\\n      --cov-config \"{toxinidir}/tox.ini\" \\\n      --cov-report= \\\n      --junitxml {toxworkdir}/junit.{envname}.xml \\\n      --run-hypothesis \\\n      --hypothesis-show-statistics \\\n      --hypothesis-profile ci \\\n      {posargs:doc tests}\n\n[testenv:khmer]\nbasepython = python3.11\ndeps =\n    khmer\ncommands =\n    pytest \\\n      --cov \"{envsitepackagesdir}/sourmash\" \\\n      --cov-config \"{toxinidir}/tox.ini\" \\\n      --cov-report= \\\n      --junitxml {toxworkdir}/junit.{envname}.xml \\\n      -k test_nodegraph \\\n      {posargs:doc tests}\n\n[testenv:khmer_master]\nbasepython = python3.11\ndeps =\n    git+https://github.com/dib-lab/khmer.git\\#egg\ncommands =\n    pytest \\\n      --cov \"{envsitepackagesdir}/sourmash\" \\\n      --cov-config \"{toxinidir}/tox.ini\" \\\n      --cov-report= \\\n      --junitxml {toxworkdir}/junit.{envname}.xml \\\n      -k test_nodegraph \\\n      {posargs:doc tests}\n\n[testenv:asv]\ndescription = run asv for benchmarking (compare current commit with latest)\ndeps =\n    asv==0.6.2\n    virtualenv\nchangedir = {toxinidir}\ncommands =\n    asv machine --yes\n    asv continuous latest HEAD {posargs}\n\n[testenv:docs]\ndescription = invoke sphinx-build to build the HTML docs\nbasepython = python3.11\nextras =\n    doc\ncommands =\n    sphinx-build -d \"{toxworkdir}/docs_doctree\" doc \"{toxworkdir}/docs_out\" --color -bhtml {posargs}\n    python -c 'import pathlib; print(\"documentation available under file://\\{0\\}\".format(pathlib.Path(r\"{toxworkdir}\") / \"docs_out\" / \"index.html\"))'\nallowlist_externals = pandoc\nchange_dir = {toxinidir}\npass_env =\n    HOME\n    LC_ALL\n    LOCALE_*\n\n[testenv:package_description]\ndescription = check that the long description is valid\nbasepython = python3.11\nskip_install = true\ndeps =\n    pip>=19.1\n    readme-renderer[md]>=24\n    twine>=1.12.1\nextras =\ncommands =\n    pip wheel -w {envtmpdir}/build --no-deps .\n    twine check {envtmpdir}/build/*\nchange_dir = {toxinidir}\n\n[testenv:mypy]\ndescription = run mypy checker\nbasepython = python3.11\ndeps =\n    mypy\ncommands =\n    mypy src/sourmash\npass_env = {[testenv]pass_env}\n    PROGRAMDATA\n\n[testenv:fix_lint]\ndescription = format the code base to adhere to our styles, and complain about what we cannot do automatically\nbasepython = python3.11\nskip_install = true\ndeps =\n    pre-commit>=2\nextras =\n    lint\ncommands =\n    pre-commit run --all-files --show-diff-on-failure {posargs}\n    python -c 'import pathlib; print(\"hint: run \\{\\} install to add checks as pre-commit hook\".format(pathlib.Path(r\"{envdir}\") / \"bin\" / \"pre-commit\"))'\npass_env = {[testenv]pass_env}\n    PROGRAMDATA\n    PRE_COMMIT_HOME\n\n[testenv:coverage]\ndescription = [run locally after tests]: combine coverage data and create report;\n    generates a diff coverage against origin/latest (can be changed by setting DIFF_AGAINST env var)\nskip_install = true\ndeps =\n    {[testenv]deps}\n    coverage>=5.0.1\n    diff_cover\nparallel_show_output = true\ncommands =\n    coverage combine\n    coverage report -i -m\n    coverage xml -i -o {toxworkdir}/coverage.xml\n    coverage html -i -d {toxworkdir}/htmlcov\n    diff-cover --compare-branch {env:DIFF_AGAINST:origin/latest} {toxworkdir}/coverage.xml\ndepends = py313, py312, py311, pypy3\npass_env = {[testenv]pass_env}\n    DIFF_AGAINST\nset_env = COVERAGE_FILE={toxworkdir}/.coverage\n\n[testenv:X]\ndescription = print the positional arguments passed in with echo\ncommands =\n    echo {posargs}\n\n[testenv:dev]\ndescription = dev environment with all deps at {envdir}\nusedevelop = true\ndeps =\n    {[testenv]deps}\nextras =\n    doc\n    storage\n    test\ncommands =\n    python -m pip list --format=columns\n    python -c \"print(r'{envpython}')\"\n\n[coverage:run]\nbranch = true\nparallel = true\n\n[coverage:report]\nskip_covered = True\nshow_missing = True\nexclude_lines =\n    \\#\\s*pragma: no cover\n    ^\\s*raise AssertionError\\b\n    ^\\s*raise NotImplementedError\\b\n    ^\\s*return NotImplemented\\b\n    ^\\s*raise$\n    ^if __name__ == ['\"]__main__['\"]:$\n\n[coverage:paths]\nsource = src/sourmash/\n    tests/\n    */.tox/*/lib/python*/site-packages/sourmash\n    */.tox/pypy*/site-packages/sourmash\n    */.tox\\*\\Lib\\site-packages\\sourmash\n    */src/sourmash\n    *\\src\\sourmash\n    */tests\n    *\\tests\n\n[gh-actions]\npython =\n    3.11: py311, docs, package_description, coverage\n    3.12: py312, coverage\n    3.13: py313, coverage\n\n[flake8]\nmax-complexity = 22\nmax-line-length = 99\nignore = E203, W503, C901, E402, B011\n\n[pep8]\nmax-line-length = 99\n"
  },
  {
    "path": "utils/.gitignore",
    "content": "ftp_list-strongyl.txt\nftp_list.csv\nftp_list.csv.bak\nsra_result.csv\n"
  },
  {
    "path": "utils/README.md",
    "content": "# Misc utility scripts\n\n## Misc scripts\n\n* trim-noV.sh - a script to do trimming of short reads. requires khmer >= 2.0.\n\n## Debugging and testing scripts\n\n* check-tree.py - exhaustively confirm the results of a search on an SBT.\n* compute-dna-mh-another-way.py - a separate implementation of MinHash signature calculation for DNA.\n* compute-input-prot-another-way.py - a separate implementation of MinHash signature calculation for proteins.\n* compute-prot-mh-another-way.py - a separate implementation of MinHash signature computing for 6-frame translations of DNA into amino acid space.\n\nCTB 1/2019\n\n## Formula implementations\n\n* cardinality_estimate_confidence.py - a function that will tell you if the sketch size is too small to trust the estimate `sketch_size * scale` as an estimate of the number of distinct k-mers.\n\nDMK 5/2022\n"
  },
  {
    "path": "utils/cardinality_estimate_confidence.py",
    "content": "# This is a simple function designed to raise a warning whenever the sketch size is too small\n# for the set being estimated. See the discussion in issue #1798\nimport numpy as np\n\n\ndef set_size_chernoff(set_size, scale, relative_error=0.05):\n    \"\"\"\n    Computes the probability that the estimate: sketch_size * scaled deviates from the true\n    set_size by more than relative_error. This relies on the fact that the sketch_size\n    is binomially distributed with parameters sketch_size and 1/scale. The two-sided Chernoff\n    bounds are used.\n    @param set_size: The number of distinct k-mers in the given set\n    @param relative_error: the desired relative error (defaults to 5%)\n    @return: float (the upper bound probability)\n    \"\"\"\n    upper_bound = 1 - 2 * np.exp(-(relative_error**2) * set_size / (scale * 3))\n    return upper_bound\n\n\ndef get_set_size(scale, num_sketches):\n    \"\"\"\n    This returns the expected number of distinct k-mers from the scale size and number of sketches.\n    @param scale: the scale factor used\n    @param num_sketches: the actual size of the FracMinHash sketch\n    @return: int (the expected number of distinct k-mers in the original set of k-mers)\n    \"\"\"\n    #  TODO: replace with HLL when that gets implemented\n    return int(np.floor(scale * num_sketches))\n\n\ndef set_size_estimate_is_accurate(\n    scale, num_sketches, relative_error=0.05, confidence=0.95\n):\n    set_size = get_set_size(scale, num_sketches)\n    probability = set_size_chernoff(set_size, scale, relative_error)\n    if probability >= confidence:\n        return True\n    else:\n        return False\n\n\ndef test_set_size_chernoff():\n    eps = 10 ** (-6)\n    rel_error = 0.01\n    set_size = 1000000\n    s = 1 / 0.1  # I'm used to using a scale value between 0 and 1\n    value_from_mathematica = 0.928652\n    assert (\n        np.abs(set_size_chernoff(set_size, s, rel_error) - value_from_mathematica) < eps\n    )\n\n    rel_error = 0.05\n    set_size = 10000\n    s = 1\n    value_from_mathematica = 0.999519\n    assert (\n        np.abs(set_size_chernoff(set_size, s, rel_error) - value_from_mathematica) < eps\n    )\n\n    rel_error = 0.001\n    set_size = 10\n    s = 1 / 0.01\n    value_from_mathematica = -1\n    assert (\n        np.abs(set_size_chernoff(set_size, s, rel_error) - value_from_mathematica) < eps\n    )\n\n\ndef test_set_size_estimate_is_accurate():\n    10 ** (-6)\n    rel_error = 0.05\n    set_size = 1000000\n    s = 1 / 0.1  # I'm used to using a scale value between 0 and 1\n    num_sketches = set_size / s  # idealized case\n    confidence = 0.95\n    assert (\n        set_size_estimate_is_accurate(\n            scale=s,\n            num_sketches=num_sketches,\n            relative_error=rel_error,\n            confidence=confidence,\n        )\n        is True\n    )\n    confidence = set_size_chernoff(set_size=set_size, scale=s, relative_error=rel_error)\n    assert (\n        set_size_estimate_is_accurate(\n            scale=s,\n            num_sketches=num_sketches,\n            relative_error=rel_error,\n            confidence=confidence,\n        )\n        is True\n    )\n    # Horrible values\n    assert (\n        set_size_estimate_is_accurate(\n            scale=10000, num_sketches=num_sketches, relative_error=0, confidence=1\n        )\n        is False\n    )\n    # Less horrible, but still bad values\n    confidence = set_size_chernoff(set_size=set_size, scale=s, relative_error=rel_error)\n    assert (\n        set_size_estimate_is_accurate(\n            scale=s,\n            num_sketches=num_sketches,\n            relative_error=rel_error,\n            confidence=confidence * 2,\n        )\n        is False\n    )\n    # one where the confidence is negative\n    rel_error = 0.001\n    set_size = 10\n    s = 100\n    num_sketches = set_size / s\n    assert (\n        set_size_estimate_is_accurate(\n            scale=s,\n            num_sketches=num_sketches,\n            relative_error=rel_error,\n            confidence=confidence,\n        )\n        is False\n    )\n    assert (\n        set_size_estimate_is_accurate(\n            scale=s, num_sketches=0, relative_error=rel_error, confidence=confidence\n        )\n        is False\n    )\n\n\ndef run_tests():\n    test_set_size_chernoff()\n    test_set_size_estimate_is_accurate()\n\n\nif __name__ == \"__main__\":\n    print(\"Running tests\")\n    run_tests()\n    print(\"Tests completed successfully\")\n"
  },
  {
    "path": "utils/check-tree.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nCheck SBT search by taking every leaf node in a tree and checking to make\nsure we can find it.\n\"\"\"\n\nimport argparse\nimport sourmash\nfrom sourmash.sbtmh import search_minhashes\n\nTHRESHOLD = 0.08\n\n\ndef main():\n    p = argparse.ArgumentParser()\n    p.add_argument(\"sbt\")\n    args = p.parse_args()\n\n    db = sourmash.sbtmh.load_sbt_index(args.sbt)\n    threshold = THRESHOLD\n\n    for leaf in db.leaves():\n        query = leaf.data\n        matches = db.find(search_minhashes, query, threshold)\n        matches = list([x.data for x in matches])\n        if query not in matches:\n            print(query)\n            assert 0\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "utils/compute-dna-mh-another-way.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nUse the MurmurHash library mmh3 and separate Python code to calculate\na MinHash signature for input DNA sequence, as a way to do an\nexternal check on our C++ implementation.\n\nThe output of this is used in test_sourmash.py to verify our C++ code.\n\"\"\"\n\n__complementTranslation = {\"A\": \"T\", \"C\": \"G\", \"G\": \"C\", \"T\": \"A\", \"N\": \"N\"}\n\n\ndef complement(s):\n    \"\"\"\n    Return complement of 's'.\n    \"\"\"\n    c = \"\".join(__complementTranslation[n] for n in s)\n    return c\n\n\ndef reverse(s):\n    \"\"\"\n    Return reverse of 's'.\n    \"\"\"\n    r = \"\".join(reversed(s))\n    return r\n\n\ndef kmers(seq, k):\n    for start in range(len(seq) - k + 1):\n        yield seq[start : start + k]\n\n\n###\n\nK = 21\n\nimport sys\nimport screed\nimport mmh3\nimport sourmash\n\nprint(\"imported sourmash:\", sourmash, file=sys.stderr)\nimport sourmash.signature\n\nrecord = next(iter(screed.open(sys.argv[1])))\nprint(\"loaded\", record.name, file=sys.stderr)\nrevcomp = reverse(complement(record.sequence))\n\nmh = sourmash.MinHash(ksize=K, n=500, is_protein=False)\n\n#\n# compute the actual hashes to insert by breaking down the sequence\n# into k-mers and applying MurmurHash to each one; here, the only\n# interesting thing that is done by add_hash is to keep only the\n# (numerically) lowest n=500 hashes.\n#\n# this method of hash computation is exactly how sourmash does it\n# internally, and should be approximately the same as what mash does.\n#\n\nfor fwd_kmer in kmers(record.sequence, K):\n    rev_kmer = reverse(complement(fwd_kmer))\n    if fwd_kmer < rev_kmer:\n        kmer = fwd_kmer\n    else:\n        kmer = rev_kmer\n\n    hash = mmh3.hash64(kmer, seed=42)[0]\n\n    # convert to unsigned int if negative\n    if hash < 0:\n        hash += 2**64\n\n    mh.add_hash(hash)\n\ns = sourmash.signature.SourmashSignature(\"\", mh, name=record.name)\nprint(sourmash.signature.save_signatures([s]))\n"
  },
  {
    "path": "utils/compute-input-prot-another-way.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nUse the MurmurHash library mmh3 and separate Python code to calculate\na MinHash signature for input protein sequence, as a way to do an\nexternal check on our C++ implementation.\n\nThe output of this is used in test_sourmash.py to verify our C++ code.\n\"\"\"\n\ndna_to_aa = {\n    \"TTT\": \"F\",\n    \"TTC\": \"F\",\n    \"TTA\": \"L\",\n    \"TTG\": \"L\",\n    \"TCT\": \"S\",\n    \"TCC\": \"S\",\n    \"TCA\": \"S\",\n    \"TCG\": \"S\",\n    \"TAT\": \"Y\",\n    \"TAC\": \"Y\",\n    \"TAA\": \"*\",\n    \"TAG\": \"*\",\n    \"TGA\": \"*\",\n    \"TGT\": \"C\",\n    \"TGC\": \"C\",\n    \"TGG\": \"W\",\n    \"CTT\": \"L\",\n    \"CTC\": \"L\",\n    \"CTA\": \"L\",\n    \"CTG\": \"L\",\n    \"CCT\": \"P\",\n    \"CCC\": \"P\",\n    \"CCA\": \"P\",\n    \"CCG\": \"P\",\n    \"CAT\": \"H\",\n    \"CAC\": \"H\",\n    \"CAA\": \"Q\",\n    \"CAG\": \"Q\",\n    \"CGT\": \"R\",\n    \"CGC\": \"R\",\n    \"CGA\": \"R\",\n    \"CGG\": \"R\",\n    \"ATT\": \"I\",\n    \"ATC\": \"I\",\n    \"ATA\": \"I\",\n    \"ATG\": \"M\",\n    \"ACT\": \"T\",\n    \"ACC\": \"T\",\n    \"ACA\": \"T\",\n    \"ACG\": \"T\",\n    \"AAT\": \"N\",\n    \"AAC\": \"N\",\n    \"AAA\": \"K\",\n    \"AAG\": \"K\",\n    \"AGT\": \"S\",\n    \"AGC\": \"S\",\n    \"AGA\": \"R\",\n    \"AGG\": \"R\",\n    \"GTT\": \"V\",\n    \"GTC\": \"V\",\n    \"GTA\": \"V\",\n    \"GTG\": \"V\",\n    \"GCT\": \"A\",\n    \"GCC\": \"A\",\n    \"GCA\": \"A\",\n    \"GCG\": \"A\",\n    \"GAT\": \"D\",\n    \"GAC\": \"D\",\n    \"GAA\": \"E\",\n    \"GAG\": \"E\",\n    \"GGT\": \"G\",\n    \"GGC\": \"G\",\n    \"GGA\": \"G\",\n    \"GGG\": \"G\",\n}\n\n\n__complementTranslation = {\"A\": \"T\", \"C\": \"G\", \"G\": \"C\", \"T\": \"A\", \"N\": \"N\"}\n\n\ndef complement(s):\n    \"\"\"\n    Return complement of 's'.\n    \"\"\"\n    c = \"\".join(__complementTranslation[n] for n in s)\n    return c\n\n\ndef reverse(s):\n    \"\"\"\n    Return reverse of 's'.\n    \"\"\"\n    r = \"\".join(reversed(s))\n    return r\n\n\ndef peptides(seq, start):\n    for i in range(start, len(seq), 3):\n        yield dna_to_aa.get(seq[i : i + 3], \"X\")\n\n\ndef translate(seq):\n    for i in range(3):\n        pep = peptides(seq, i)\n        yield \"\".join(pep)\n\n    revcomp = reverse(complement(seq))\n    for i in range(3):\n        pep = peptides(revcomp, i)\n        yield \"\".join(pep)\n\n\ndef kmers(seq, k):\n    for start in range(len(seq) - k + 1):\n        yield seq[start : start + k]\n\n\n###\n\nK = 21\n\nimport sys\nimport screed\nimport mmh3\nimport sourmash\n\nprint(\"imported sourmash:\", sourmash, file=sys.stderr)\nimport sourmash.signature\n\nrecord = next(iter(screed.open(sys.argv[1])))\nprint(\"loaded\", record.name, file=sys.stderr)\n\nmh = sourmash.MinHash(ksize=K, n=500, is_protein=True)\nprot_ksize = int(K / 3)\n\nfor kmer in kmers(record.sequence, prot_ksize):\n    hash = mmh3.hash64(kmer, seed=42)[0]\n\n    # convert to unsigned int if negative\n    if hash < 0:\n        hash += 2**64\n\n    mh.add_hash(hash)\n\ns = sourmash.signature.SourmashSignature(\"\", mh, name=record.name)\nprint(sourmash.signature.save_signatures([s]))\n"
  },
  {
    "path": "utils/compute-prot-mh-another-way.py",
    "content": "#! /usr/bin/env python\n\"\"\"\nUse the MurmurHash library mmh3 and separate Python code to calculate\na MinHash signature for translated protein sequence, as a way to do an\nexternal check on our C++ implementation.\n\nThe output of this is used in test_sourmash.py to verify our C++ code.\n\"\"\"\n\ndna_to_aa = {\n    \"TTT\": \"F\",\n    \"TTC\": \"F\",\n    \"TTA\": \"L\",\n    \"TTG\": \"L\",\n    \"TCT\": \"S\",\n    \"TCC\": \"S\",\n    \"TCA\": \"S\",\n    \"TCG\": \"S\",\n    \"TAT\": \"Y\",\n    \"TAC\": \"Y\",\n    \"TAA\": \"*\",\n    \"TAG\": \"*\",\n    \"TGA\": \"*\",\n    \"TGT\": \"C\",\n    \"TGC\": \"C\",\n    \"TGG\": \"W\",\n    \"CTT\": \"L\",\n    \"CTC\": \"L\",\n    \"CTA\": \"L\",\n    \"CTG\": \"L\",\n    \"CCT\": \"P\",\n    \"CCC\": \"P\",\n    \"CCA\": \"P\",\n    \"CCG\": \"P\",\n    \"CAT\": \"H\",\n    \"CAC\": \"H\",\n    \"CAA\": \"Q\",\n    \"CAG\": \"Q\",\n    \"CGT\": \"R\",\n    \"CGC\": \"R\",\n    \"CGA\": \"R\",\n    \"CGG\": \"R\",\n    \"ATT\": \"I\",\n    \"ATC\": \"I\",\n    \"ATA\": \"I\",\n    \"ATG\": \"M\",\n    \"ACT\": \"T\",\n    \"ACC\": \"T\",\n    \"ACA\": \"T\",\n    \"ACG\": \"T\",\n    \"AAT\": \"N\",\n    \"AAC\": \"N\",\n    \"AAA\": \"K\",\n    \"AAG\": \"K\",\n    \"AGT\": \"S\",\n    \"AGC\": \"S\",\n    \"AGA\": \"R\",\n    \"AGG\": \"R\",\n    \"GTT\": \"V\",\n    \"GTC\": \"V\",\n    \"GTA\": \"V\",\n    \"GTG\": \"V\",\n    \"GCT\": \"A\",\n    \"GCC\": \"A\",\n    \"GCA\": \"A\",\n    \"GCG\": \"A\",\n    \"GAT\": \"D\",\n    \"GAC\": \"D\",\n    \"GAA\": \"E\",\n    \"GAG\": \"E\",\n    \"GGT\": \"G\",\n    \"GGC\": \"G\",\n    \"GGA\": \"G\",\n    \"GGG\": \"G\",\n}\n\n\n__complementTranslation = {\"A\": \"T\", \"C\": \"G\", \"G\": \"C\", \"T\": \"A\", \"N\": \"N\"}\n\n\ndef complement(s):\n    \"\"\"\n    Return complement of 's'.\n    \"\"\"\n    c = \"\".join(__complementTranslation[n] for n in s)\n    return c\n\n\ndef reverse(s):\n    \"\"\"\n    Return reverse of 's'.\n    \"\"\"\n    r = \"\".join(reversed(s))\n    return r\n\n\ndef peptides(seq, start):\n    for i in range(start, len(seq), 3):\n        yield dna_to_aa.get(seq[i : i + 3], \"X\")\n\n\ndef translate(seq):\n    for i in range(3):\n        pep = peptides(seq, i)\n        yield \"\".join(pep)\n\n    revcomp = reverse(complement(seq))\n    for i in range(3):\n        pep = peptides(revcomp, i)\n        yield \"\".join(pep)\n\n\ndef kmers(seq, k):\n    for start in range(len(seq) - k + 1):\n        yield seq[start : start + k]\n\n\n###\n\nK = 21\n\nimport sys\nimport screed\nimport mmh3\nimport sourmash\n\nprint(\"imported sourmash:\", sourmash, file=sys.stderr)\nimport sourmash.signature\n\nrecord = next(iter(screed.open(sys.argv[1])))\nprint(\"loaded\", record.name, file=sys.stderr)\n\nmh = sourmash.MinHash(ksize=K, n=500, is_protein=True)\nprot_ksize = int(K / 3)\n\nfor trans in translate(record.sequence):\n    for kmer in kmers(trans, prot_ksize):\n        hash = mmh3.hash64(kmer, seed=42)[0]\n\n        # convert to unsigned int if negative\n        if hash < 0:\n            hash += 2**64\n\n        mh.add_hash(hash)\n\ns = sourmash.signature.SourmashSignature(\"\", mh, name=record.name)\nprint(sourmash.signature.save_signatures([s]))\n"
  },
  {
    "path": "utils/toml-to-zenodo-json.py",
    "content": "#! /usr/bin/env python\nimport sys\nimport argparse\nimport tomllib\nimport pprint\nimport json\n\n\ndef main():\n    p = argparse.ArgumentParser()\n    p.add_argument(\"toml_file\")\n    p.add_argument(\"-o\", \"--output-json\", required=True)\n    args = p.parse_args()\n\n    with open(args.toml_file, \"rb\") as fp:\n        d = tomllib.load(fp)\n\n    # pprint.pprint(d)\n    out_d = {}\n\n    creators = []\n    for author_d in d[\"project\"][\"authors\"]:\n        creators.append(author_d)\n\n    out_d[\"creators\"] = creators\n\n    with open(args.output_json, \"w\") as fp:\n        json.dump(out_d, fp)\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "utils/trim-noV.sh",
    "content": "for i in *.fastq.gz; do\ntrim-low-abund.py -C 4 -Z 20 -M 1e9 -k 21 $i --gzip -o $i.trimnoV.fq.gz;\ndone\n"
  }
]